Kontur boyunca okları hareket ettir


28

korumalı alan

Sürekli olarak aynı saat yönünde veya saat yönünün tersi yönünde (her kontur kendi yönüne sahip) yönlendirilmiş noklarla ve (her bir kontur kendi yönüne sahip) tutarlı bir üst üste binmeyen kapalı 2d kontür kümesi (çaprazlarda bile en az bir boşlukla ayrılmış) göz önüne alındığında , okları hareket ettirin nKonturlar boyunca ilgili yönde adımlar. Oklar > v < ^sırasıyla sağ, aşağı, sol ve yukarı yönlerde gösterilir. Diğer karakterler -(yatay), |(dikey) ve +(köşe). Bir köşede bir ok varken, geçerli yönünü korur ve sadece dönüş alındıktan sonra değiştirir.

İki köşenin arasında ( +-+yatay ve düşey gibi) her zaman düz bir bölüm (veya boşluk ) olacaktır - başka bir deyişle keskin Udönüşler yasaktır. Köşeler arasındaki bölümler dikey veya yataydır ve bir köşedeki dirsek daima 90 derecedir.

Giriş:

  • pozitif bir tamsayı - n- adım sayısı
  • konturların ASCII gösterimi - çok satırlı bir dize, dizelerin listesi, karakterlerin listesi vb. olabilir.

Çıktı:

Tüm oklarla aynı hatlar n, her bir çizginin genel yönündeki adımları değiştirdi .

Test durumları:

1.

Giriş:

n = 1

 +----->->            
 |       |            
 |       v---+        
 |           |        
 +---<-------+      

Çıktı:

 +------>+
 |       v
 |       +>--+
 |           |
 +--<--------+

2.

Giriş:

n = 2

 +-----+ +---+        
 |     | |   |        
 +-->--+ |   v  
         |   | 
 +--->---+   |        
 |           |         
 +------<<---+       

Çıktı:

 +-----+ +---+
 |     | |   |
 +---->+ |   |
         |   | 
 +----->-+   v
 |           |     
 +----<<-----+        

3.

Giriş:

n = 3

 +---+   +---+   +-------+      
 |   |   |   v   |       |      
 ^   |   |   |   +-<-+   |      
 |   |   ^   |       |   v      
 |   +---+   +-->----+   |      
 |                       |      
 |   +-------+   +---+   |      
 |   |       |   v   |   |      
 +---+       +---+   +---+      

Çıktı:

 +>--+   ^---+   +-------+
 |   |   |   |   ^       |
 |   |   |   |   +---+   |
 |   |   |   |       |   |
 |   +---+   v----->-+   |
 |                       |
 |   +-------+   +---+   v 
 |   |       |   |   |   |
 +---+       +-<-+   +---+  

4.

Giriş:

n = 1

+--+ 
|  |
|  +---+
|      |     
+----+ |
     | |
     +-+ 

Çıktı:

+--+ 
|  |
|  +---+
|      |     
+----+ |
     | |
     +-+ 

5.

Giriş

n = 4

^>>>>
^   v
^   v>>>>
^       v           
<<<<<<<<v

Çıktı:

^>>>>
^   v
^   v>>>>
^       v           
<<<<<<<<v

6.

Giriş:

n = 1

^->
^ v
<<v

Çıktı:

^>+
^ v
<<v

Yukarıdaki görevi çözen bir işlev veya program yazın. Her dilde bayt cinsinden en kısa kod kazanır. Golf dilleri tarafından cesaretlendirilmeyin. Algoritma ve kodun açıklaması son derece takdir edilmektedir.


İki kontur köşelerinde köşegenlere dokunabilir mi yoksa kontur böyle bir dokunuşta mı?
xnor

4
"Konturlu bir üst üste binmeyen 2d kontur kümesi göz önüne alındığında, aynı saat yönünde veya saat yönünün tersine aynı oklarla yönlendirilmiş oklar" bana her kontur aynı yöne yönlendirilmiş gibi geliyor, oysa test durumlarından oklar yalnızca kontur içinde tutarlı olur.
xnor

3
@xnor Yorumlarınız için teşekkür ederiz! - Hayır, kontürlerin diyagonal olarak birbirlerine / kendilerine temas etmesine izin verilmez. - Her konturun kendine ait bir yönü var. Açıklamayı güncelleyeceğim.
Galen Ivanov

2
Duvarlar arasında boşluk kalmadan giriş yapmak mümkün mü? Örn: çevrimiçi deneyin! . "En az bir boşlukla ayrılmış" dediğinizi biliyorum, ancak bunun yalnızca bağımsız döngülere uygulanıp uygulanmadığı ya da tek bir döngüye uygulanıp uygulanmadığı belli değildi.
Jonah

1
@Jonah Hayır, mümkün değil:There will always be a straight segment (or a space) between any two corners (like +-+ for the horizontal and similar for the vertical) - in other words the sharp U turns are forbidden.
Galen Ivanov

Yanıtlar:


14

JavaScript (ES6),  210 ... 182  180 bayt

(m)(n)m

m=>g=n=>n?g(n-1,m=m.map((r,y)=>r.map((c,x)=>(i=0,h=$=>~$?(m[Y=y+($-2)%2]||0)[X=x+~-$%2]>h?"-|+"[n+=`;m[${Y}][${X}]=S[${$}]`,i?2:$&1]:h($^++i):c)((S="<^>v").indexOf(c)))),eval(n)):m

Çevrimiçi deneyin!

Nasıl?

Kaynağın biçimlendirilmiş bir versiyonunu görmek için bu bağlantıyı takip edebilirsiniz .

sarıcı

gn-1n=0

Güncelleme yöntemi

Her oku birer birer güvenli bir şekilde taşıyamıyoruz, çünkü güncellenmemiş oklarla üzerine yazma riskini, güncel olanlarla değiştirebiliriz. Bunun yerine, önce tüm okları kaldırır ve yeni konumlarını hesaplarız. Yeni pozisyonları ikinci kez uyguluyoruz.

n

n

"1;m[0][7]=S[2];m[1][8]=S[3];m[2][9]=S[2];m[4][3]=S[0]"

n

Yeni pozisyonlar sadece yaparak uygulanır eval(n).

Talimatlar

d$

10+23

dxdy

 d | dx = (d - 1) % 2 | dy = (d - 2) % 2
---+------------------+------------------
 0 |        -1        |         0
 1 |         0        |        -1
 2 |        +1        |         0
 3 |         0        |        +1

Köşeler

Tanımlanan yöndeki bir sonraki karakter bir boşluk veya sınırların dışındaysa, bu bir köşede bulunduğumuz anlamına gelir ve 90 ° veya 270 ° dönüş yapmamız gerekir. Bu nedenle yardımcı işlevhddxor1dxor3

+-|d

h$h"$""$""$"

Animasyonlu sürüm


Açıklama için teşekkür ederim!
Galen Ivanov

8

K (ngn / k) , 183 161 157 bayt

{A:"^>v<";D,:-D:(-1 0;!2);s:(#x;#*x);c:~^x;r:" -+|"c*+/'3'0,c,0;$[#p:+s\&~^t:A?,/x;;:r];q:q@'*'&'~^x ./:/:q:+p+/:D@4!(t^0N)+/:0 1 3;s#@[,/r;s/+q;:;A@D?q-p]}/

Çevrimiçi deneyin!

{ }/bir int left argümanıyla çağrıldığında, bu işlev { }n kere sağ argümana uygulanır.

A:"^>v<" oklar

D,:-D:(-1 0;!2) Cardy, 4 kardinal yönü için ∆x

s:(#x;#*x) giriş şekli: yükseklik, genişlik

c:~^x countours - boşluk olmayanların nerede olduğunu gösteren

r:" -+|"c*+/'3'0,c,0Her bir hücre için kendi + üst + alt sayma cve 1-> -, 2-> +, 3-> değiştirerek , karakter matrisini bir countour ile ancak oklar olmadan yeniden oluşturun|

t:A?,/xok türleri: 0 1 2 3 ^>v<, diğer tüm hücreler 0N(boş) olarak temsil edilir.

p:+s\&~^t okların koordinatları

$[#p ;;:r] ok yoksa, geri dön r

q:+p+/:D@4!(t^0N)+/:0 1 3 her ok için 3 olası yeni pozisyon - devam ederse, sola dönerse ve sağa dönerse

q:q@'*'&'~^x ./:/:q Her bir ok için, ülkeye inen ilk seçeneği seçin

@[,/r;s/+q;:;A@D?q-p] düzleştirmek r ve okları yeni konumlarına ve yeni yönlerine yerleştirin

s# orijinal şekle yeniden şekillendirme


2
Hızlısın! Umarım golf bitirdikten sonra kodu açıklarsın.
Galen Ivanov

Açıklama için teşekkür ederim!
Galen Ivanov

4

Kömür , 105 bayt

W¬ΦυΣκ⊞υS≔⊟υη≔⪫υ⸿θ≔⟦⟧υ≔>^<vζPθFθ¿№ζι«⊞υ⟦⌕ζιⅉⅈ⟧§+|-↨EKV›κ ²»ιFυ«J⊟ι⊟ι≔⊟ιιFIη«≔⊟Φ⁴∧﹪⁻⊖ι⊕λ⁴›§KV⁻⁵λ ιM✳⊗黧ζι

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Hantal bir giriş formatı gerektirmesini önlemek için kullanılan 22 bayt içerir. Açıklama:

W¬ΦυΣκ⊞υS≔⊟υη≔⪫υ⸿θ≔⟦⟧υ

Konturları ve adım sayısını rahatça girin.

≔>^<vζ

Yön karakterleri birkaç kez kullanılır, böylece dize burada önbelleğe alınır. Bu dizedeki yön karakterinin dizini, yönü olarak bilinir.

Pθ

İmleci hareket ettirmeden orijinal konturları yazdırın.

Fθ

Konturdaki karakterlerin üzerine gelin.

¿№ζι«

Geçerli karakterler bir yön karakteri ise ...

⊞υ⟦⌕ζιⅉⅈ⟧

... sonra listedeki yönü ve konumu kaydedin ...

§+|-↨EKV›κ ²

... ve karakteri uygun çizgi karakteriyle değiştirin.

»ι

Aksi takdirde, karakter çıktısını alın ve bir sonraki karaktere geçin.

Fυ«

Kaydedilen konumların üzerinden döngü.

J⊟ι⊟ι

Kaydedilen konuma atlayın.

≔⊟ιι

Kaydedilen yönü çıkartın.

FIη«

Uygun adımların üzerinde döngü.

≔⊟Φ⁴∧﹪⁻⊖ι⊕λ⁴›§KV⁻⁵λ ι

Bir sonraki adımın yönünü bulun; bu, ne tersi ne de boş olan bir yöndür.

M✳⊗ι

Bu yönde bir adım atın. ( MoveKomutun kömür yönü endeksleri, yönümün değerinin iki katıdır.)

»§ζι

Uygun yön karakterini yazdırın.


Açıklama için teşekkür ederim!
Galen Ivanov

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.