Tujuan dari tantangan ini adalah untuk menemukan arah dan area yang dilingkupi oleh sebuah loop.
Memasukkan:
Kotak persegi panjang yang seluruhnya terdiri dari karakter-karakter ini: ^v<>
(Secara opsional, Anda juga dapat diberi dimensi kisi sebelum kisi itu sendiri dalam desimal dengan awalan, akhiran, dan karakter pemisah pilihan Anda.)
Sebuah lingkaran dalam grid adalah satu set karakter tersebut seperti yang satu poin ke yang berikutnya, menunjuk ke depan, akhirnya menunjuk kembali pada karakter pertama. Sebagai contoh:
<>>v> >>v
^^<>v ^ >v
>^<<< ^<<<
>^<v>
Kotak kiri adalah input sampel; grid kanan adalah loop yang terisolasi.
Kotak input tidak akan berisi loop sama sekali atau satu loop; Anda tidak perlu khawatir tentang kasus-kasus di mana kotak berisi lebih dari satu loop.
Keluaran:
Jika grid tidak mengandung loop, output X
.
Jika kisi berisi dua panah yang saling berhadapan, output 0
.
Jika kisi berisi loop berlawanan arah jarum jam, hitung karakter yang tertutup oleh loop, termasuk batas. Keluarkan nomor itu.
Jika kisi berisi loop searah jarum jam, ikuti proses yang sama untuk loop berlawanan arah jarum jam, tetapi hasilkan negatif dari angka itu. Sebagai contoh, kisi masukan di atas akan memiliki output -11
: 10 berasal dari loop itu sendiri, dan 1 dari karakter yang dilingkupi oleh loop.
Ini adalah kode-golf . Kode terpendek menang.
Kasus uji:
<<^
^>v
^v<
Keluaran X
.
<<<<
><<<
>>^>
Keluaran 0
.
<>^^<
>>>v>
<^^>v
<^>>v
>^<<<
Keluaran -15
.
v<<<<
>v>>^
v<^<<
>>>>^
Keluaran 20
.
Jawaban:
C #, 604 byte
Program lengkap, menerima input (tata letak garis-dibatasi, tidak ada dimensi) dari STDIN, output ke STDOUT.
Program ini bekerja dengan membaca terlebih dahulu di tata letak, tidak perlu dikatakan, dan kemudian mengulangi setiap sel. Kami kemudian menjalankan 'ular' dari setiap sel, yang mengikuti panah hingga mengalir dari tepi, atau berjalan ke dirinya sendiri. Jika itu menabrak dirinya sendiri, maka kita tahu kita telah menemukan satu lingkaran (atau salah satu dari hal-hal itu), dan ia juga tahu berapa banyak ular itu di dalam lingkaran itu.
Setelah kami tahu kami memiliki loop, kami tahu sel mana yang ada di loop, dan kami membuat peta dari masing-masing sel (+1, untuk alasan) untuk itu sendiri,
-1
(berarti ada di loop), atauW
(seluruh lebar) jika ada di tepi (atau +1 (yang ada di indeksW
) untuk menyederhanakan satu hal lebih lanjut).Ketika kita melakukan ini, kita juga menemukan arah yang dimiliki oleh elemen 'terakhir' dari loop (yaitu, elemen terakhir dari loop pada baris terakhir yang memiliki elemen dari loop di atasnya). Elemen ini harus berupa "<" atau "^", dan ini menunjukkan kepada kita clockness (CW / CCW) dari loop (diterjemahkan ke -1 / + 1).
Kami kemudian melakukan pass set disjoin, yang menetapkan semua elemen yang berada di luar loop ke
W
set. Kami kemudian kurangi berapa banyak dari ini dariW
untuk mendapatkan nomor yang terkandung di dan di dalam loop. Jika angka ini kurang dari 3, kami menggantinya dengan 0. Kami mengalikannya dengan clockness, menetapkan sebagai hasilnya, dan entah bagaimana melarikan diri dari for loop, di mana hasilnya adalah output.Namun, jika sebagian besar di atas tidak pernah terjadi (karena tidak ada ular yang menemukan dirinya sendiri), maka hasilnya tetap sebagai "X", dan itu dikeluarkan.
sumber