Pindahkan panah di sepanjang kontur

28

Kotak pasir

Diberikan satu set kontur 2d tertutup yang tidak tumpang tindih (dipisahkan oleh setidaknya satu ruang bahkan pada diagonal) dengan panah yang berorientasi secara konsisten dalam arah searah jarum jam atau berlawanan arah jarum jam (masing-masing kontur memiliki arahnya sendiri) dan angka positif n, pindahkan panah nlangkah-langkah di sepanjang kontur dalam arah masing-masing. Panah diwakili oleh > v < ^masing-masing untuk arah kanan, bawah, kiri dan atas. Di sana karakter lainnya adalah -(horizontal), |(vertikal) dan +(sudut). Saat panah berada di sudut, ia tetap mengikuti arahnya saat ini dan mengubahnya hanya setelah belokan diambil.

Akan selalu ada segmen lurus (atau spasi) antara dua sudut (seperti +-+untuk horizontal dan serupa untuk vertikal) - dengan kata lain Ubelokan tajam dilarang. Segmen antara sudut vertikal atau horizontal dan tikungan di sudut selalu 90 derajat.

Memasukkan:

  • bilangan bulat positif - n- jumlah langkah
  • representasi ASCII dari kontur - dapat berupa string multiline, daftar string, daftar karakter, dan sebagainya.

Keluaran:

Kontur yang sama dengan semua panah menggeser nlangkah dalam arah keseluruhan setiap kontur.

Kasus uji:

1.

Memasukkan:

n = 1

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

Keluaran:

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

2.

Memasukkan:

n = 2

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

Keluaran:

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

3.

Memasukkan:

n = 3

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

Keluaran:

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

4.

Memasukkan:

n = 1

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

Keluaran:

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

5.

Memasukkan

n = 4

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

Keluaran:

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

6.

Memasukkan:

n = 1

^->
^ v
<<v

Keluaran:

^>+
^ v
<<v

Tulis fungsi atau program yang menyelesaikan tugas di atas. Kode terpendek dalam byte di setiap bahasa menang. Jangan berkecil hati dengan bahasa golf. Penjelasan algoritma dan kode sangat dihargai.

Galen Ivanov
sumber
Bisakah dua kontur menyentuh sudut mereka pada diagonal, atau kontur menyentuh sendiri seperti itu?
xnor
4
"Diberikan satu set kontur 2d tertutup non-tumpang tindih ... dengan panah yang berorientasi secara konsisten dalam searah jarum jam atau berlawanan arah jarum jam" terdengar bagi saya seperti setiap kontur berorientasi pada arah yang sama, sedangkan dari kasus uji, tampaknya panah hanya konsisten dalam kontur.
xnor
3
@ xnor Terima kasih atas komentar Anda! - Tidak, kontur tidak diperbolehkan saling menyentuh satu sama lain secara diagonal. - Setiap kontur memiliki arahan sendiri. Saya akan memperbarui deskripsi.
Galen Ivanov
2
Apakah input tanpa ruang di antara dinding mungkin? Misalnya: Coba online! . Saya tahu Anda mengatakan "dipisahkan oleh setidaknya satu ruang" tetapi saya tidak jelas apakah itu hanya diterapkan pada loop independen atau apakah itu diterapkan pada satu loop juga.
Jonah
1
@Jonah Tidak, itu tidak mungkin: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

Jawaban:

14

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

(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

Cobalah online!

Bagaimana?

Anda dapat mengikuti tautan ini untuk melihat versi sumber yang diformat.

Pembungkus

gn-1n=0

Perbarui metode

Kami tidak dapat memindahkan setiap panah satu per satu dengan aman karena kami akan menanggung risiko menimpa panah yang tidak diperbarui dengan yang diperbarui. Sebagai gantinya, kami terlebih dahulu menghapus semua panah dan menghitung posisi baru mereka. Kami menerapkan posisi baru di kedua kalinya.

n

n

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

n

Posisi baru diterapkan hanya dengan melakukan eval(n).

Petunjuk arah

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

Sudut

hddxor1dxor3

+-|d

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

Versi animasi

Arnauld
sumber
Terima kasih atas penjelasannya!
Galen Ivanov
8

K (ngn / k) , 183 161 157 byte

{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]}/

Cobalah online!

{ }/ketika dipanggil dengan arg kiri int, ini akan menerapkan fungsi dalam { }n kali ke arg kanan

A:"^>v<" panah

D,:-D:(-1 0;!2) Ya, ∆x untuk 4 arah mata angin

s:(#x;#*x) bentuk input: tinggi, lebar

c:~^x countours - boolean matrix menunjukkan di mana non-spasi berada

r:" -+|"c*+/'3'0,c,0buat ulang matriks karakter dengan countour tetapi tanpa panah, dengan menghitung self + atas + bawah untuk setiap sel cdan mengganti 1-> -, 2-> +, 3->|

t:A?,/xjenis panah: 0 1 2 3 untuk ^>v<, semua sel lain direpresentasikan sebagai 0N(nol)

p:+s\&~^t koordinat panah

$[#p ;;:r] jika tidak ada panah, kembali r

q:+p+/:D@4!(t^0N)+/:0 1 3 semua 3 posisi baru yang mungkin untuk setiap panah - jika terus maju, jika belok kiri, dan jika belok kanan

q:q@'*'&'~^x ./:/:q untuk setiap panah pilih opsi pertama yang mendarat di countour

@[,/r;s/+q;:;A@D?q-p]ratakan rdan letakkan panah di posisi baru dan dengan arah baru

s# membentuk kembali ke bentuk aslinya

ngn
sumber
2
Kamu cepat! Saya harap Anda akan menjelaskan kode setelah selesai bermain golf.
Galen Ivanov
Terima kasih atas penjelasannya!
Galen Ivanov
4

Arang , 105 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Termasuk 22 byte yang digunakan untuk menghindari memerlukan format input yang rumit. Penjelasan:

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

Masukkan kontur dan jumlah langkah dengan nyaman.

≔>^<vζ

Karakter arah digunakan beberapa kali sehingga string di-cache di sini. Indeks karakter arah dalam string ini dikenal sebagai arahnya.

Pθ

Cetak kontur asli tanpa menggerakkan kursor.

Fθ

Ulangi karakter dalam kontur.

¿№ζι«

Jika karakter saat ini adalah karakter arah ...

⊞υ⟦⌕ζιⅉⅈ⟧

... lalu simpan arah dan posisi dalam daftar ...

§+|-↨EKV›κ ²

... dan ganti karakter dengan karakter garis yang sesuai.

»ι

Kalau tidak, output karakter dan beralih ke karakter berikutnya.

Fυ«

Ulangi posisi yang disimpan.

J⊟ι⊟ι

Lompat ke posisi yang disimpan.

≔⊟ιι

Ekstrak arah yang disimpan.

FIη«

Ulangi jumlah langkah yang sesuai.

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

Temukan arah langkah selanjutnya, yang merupakan arah mana pun yang tidak terbalik atau kosong.

M✳⊗ι

Ambil langkah ke arah itu. (Indeks arah arang untuk Moveperintah adalah dua kali nilai arah saya.)

»§ζι

Cetak karakter arah yang sesuai.

Neil
sumber
Terima kasih atas penjelasannya!
Galen Ivanov
2

APL (Dyalog Unicode) , 111 byte SBCS

{A[Dq-p]@q' |+-'[c×3+/0,c,0]⊣q←⊃¨(⍸c' '≠⍵)∘∩¨↓⍉D[4|0 1 3∘.+4~⍨,t]+⍤1p←⍸4>t←⍵⍳⍨A'v>^<'D9 11∘○¨0j1*⍳4}⍣⎕⊢⎕

Cobalah online!

mirip dengan jawaban k saya

ngn
sumber