Papan 2D akan berisi objek-objek berikut:
^
,>
,v
, Atau<
: Sebuah laser emitor menghadap ke atas, kanan, bawah, atau kiri masing-masing. Mungkin ada lebih dari satu. Laser akan bergerak dalam garis lurus di ruang kosong (ruang kosong diwakili dengan titik.
). Laser tidak melewati penghasil emisi.*
: Sebuah target. Laser melewati target. Mungkin ada lebih dari satu.
Papan juga dapat berisi benda-benda berikut:
@
: Dinding yang kokoh. Laser tidak akan lewat sini.\
: Reflektor yang condong ke kiri . Mengubah arah laser berdasarkan tabel berikut:Direction laser is travelling Direction of laser after hitting reflector Up Left Right Down Down Right Left Up
Seharusnya cukup intuitif bagaimana cara kerja reflektor. Bayangkan saja mereka sebagai cermin dua sisi yang sebenarnya dan arahnya harus jelas.
/
: Reflektor yang condong ke kanan . Mengubah arah laser berdasarkan tabel berikut:Direction laser is travelling Direction of laser after hitting reflector Up Right Right Up Down Left Left Down
1
,2
,3
...9
: A Portal . Angka tersebut menunjukkan saluran portal - akan ada tepat dua portal dari saluran yang sama (misalnya, tidak akan ada tiga portal1
). Portal mengubah posisi laser ke posisi portal lain dari saluran yang sama. Contohnya:> 1 @ 1 *
Laser akan mengenai target karena ketika mengenai yang pertama
1
, ia akan dipindahkan ke yang kedua1
di sisi yang lain. Laser mempertahankan arah yang sama seperti sebelumnya.Sebuah portal tidak akan memindahkan laser ke portal dari saluran yang berbeda (yaitu
1
tidak akan memindahkan laser ke9
.
Program Anda akan menerima representasi 2D papan sebagai masukan. Papan akan selalu berbentuk persegi panjang. Outputnya harus True
jika semua target memiliki laser yang melewatinya, atau False
sebaliknya.
Berikut ini beberapa kasus uji:
Memasukkan
>....\ ..*... >./../ ..*...
Keluaran
True
Memasukkan
>..........\ 1........../ 2..........1 3..........2 4..........3 5..........4 6..........5 7..........6 8..........7 9..........8 *..........9
Keluaran
True
Memasukkan
>.@............* >..@...........* >...@..........* >....@.........* >.....@........* >...*..@........ >.......@......*
Keluaran
False
Memasukkan
../\. >./**
Keluaran
False
Memasukkan
/.......*.......\/3..... @..............//\.\.... *.............2\.1\/\... \..............///.....< .........*...//\\/.....\ >.............\.1.///.4. 4.......*/...\2\/3/\/..^
Keluaran
True
Memasukkan
vvvvvvvvvvvvvvvvv \\\\\\\\\\\\\\\\\ ///////////////// \\\\\\\\\\\\\\\\\ ///////////////// \\\\\\\\\\\\\\\\\ ///////////////// *****************
Keluaran (catat target di paling kanan)
False
Jawaban:
Python,
310302287278277260Tidak secara radikal berbeda dari posting Python yang ada, tetapi memiliki satu atau dua trik yang perlu diperhatikan, saya pikir.
Ini juga menangani input "non-terminating", sepertiEDIT : Ups! emitor memblokir laser.1>1
.t
mengambil daftar string (jalur input) dan mengembalikan hasil boolean.Berikut adalah gif yang bagus dari kode yang sedang di-golf:
EDIT : Awsome atas izin Will. Will, terima kasih!
sumber
1>1
akan berakhir. Saya belum dapat menemukan sesuatu yang tidak berakhir, meskipun saya belum berusaha keras dan menganggap itu tidak terjadi untuk implementasi saya. Tentu saja saya akan mempertimbangkan kembali jika seseorang dapat menyajikannya..find(d)
mengembalikan -1 jika tidak ditemukan. Jika Anda menghapusif-1<d:
pernyataan dan alih-alih melakukannyaj+=[-1,1,w,-w,-i][d]
di bagian atas loop sementara, -1 yang tidak ditemukan akan berubah menjadi menambahkan elemen terakhir dalam array kej
, yang akan menghasilkanj
0, yang kita tahu adalah@
...?Perl, 647
Ini adalah upaya pertama saya di kode-golf, dan saya agak malu saya bahkan tidak mengalahkan skor C #, tapi saya pikir itu akan menarik (atau menyenangkan, atau hanya masokis) untuk melakukan semuanya sebagai serangkaian penggantian regex. (Saya juga berpikir akan menyenangkan untuk memoles Perl saya, tetapi pada akhirnya saya sangat menyesal tidak menerapkannya dalam Ruby atau Python.)
Saya belum melakukan banyak pengujian, tetapi saya pikir itu harus menangani setiap kasus.
Grid adalah input melalui STDIN. Harus ada setidaknya satu baris baru di input (yaitu satu baris tanpa baris baru tidak akan berfungsi).
Penjelasan: kode secara iteratif memperbarui string grid ketika laser melewatinya.
-
merupakan laser horisontal,|
laser vertikal,+
laser menyeberang,K
sebuah\
cermin dengan laser memantul dari atas,k
sebuah/
cermin dengan laser memantul dari bawah,Z
sebuah\
cermin dengan laser memantul dari bagian bawah, danW
sebuah/
cermin dengan laser memantul atas.%
adalah/
cermin dengan laser di kedua sisi, sementaraX
adalah\
cermin dengan laser di kedua sisi. (Ini peka huruf besar-kecil. Saya mencoba mengambil huruf yang terlihat agak sesuai - misalnya,k
danK
adalah pilihan yang agak jelas - tetapi sayangnya efeknya sebenarnya tidak terlalu membantu. Saya benar-benar harus memasukkan info ini ke dalam tabel, tapi saya kelelahan sekarang.)Menangani portal dengan cara yang sama (yaitu menetapkan setiap digit satu set karakter tambahan berdasarkan kemungkinan posisi input / output laser) akan membutuhkan 144 karakter (termasuk yang asli 9), jadi sebagai gantinya, ketika laser menyentuh portal "input", Saya menambahkan "output" karakter portal ke set karakter yang memancarkan laser ke arah yang tepat. (Ini memang membutuhkan membedakan antara portal input dan output; saya menggunakan huruf
qwertyuio
untuk ini.)Agak un-golf, dengan pernyataan cetak sehingga Anda dapat melihat substitusi terjadi (setiap substitusi mewakili satu "putaran" perkembangan laser), dan dengan
g
bendera ditambahkan ke utamas///
sehingga tidak mengambil begitu banyak iterasi:sumber
Python 338
351Versi saya yang tidak dijinakkan sebenarnya memplot jalur laser di papan, yang cukup:
sumber
C # -
515414400 byteSelesaikan program C #, tidak ada output yang bagus seperti Will. Bekerja dengan mengikuti jalur laser untuk masing-masing yang dipancarkan secara terpisah, dan menyimpan susunan sel mana yang telah kami kunjungi, sehingga kami dapat memeriksa bahwa kami telah mengunjungi semua bintang pada akhirnya. Sunting: melucuti sejumlah besar byte dengan membuat semuanya 1D dan dengan menggunakan char bukannya int untuk menyimpan karakter saat ini
w0lf mengingatkan saya bahwa saya memiliki loop di bawah dimanfaatkan tepat di tengah-tengah kode saya, jadi saya pikir saya lebih baik membuat satu upaya terakhir dan membuatnya bekerja, dan sekarang saya ke jumlah minimum mutlak keriting kawat gigi. Saya tidak akan berpura-pura menyukai runtuhnya yang kedua untuk loop, kodenya mengerikan sekarang, tetapi menyimpan beberapa byte. Dalam prosesnya saya menulis ulang penanganan portal. Saya juga menemukan metode yang lebih pendek untuk melakukan "langkah" dengan bersarang daripada operasi bersyarat agregat.
Kode golf:
Lebih sedikit kode golf:
Kode penanganan portal baru menggunakan fakta bahwa fungsi String.IndexOf dengan senang hati mengembalikan -1 (yaitu char tidak ditemukan) jika Anda memintanya mulai mencari 1 karakter di luar string (melempar pengecualian jika Anda memintanya untuk memulai lebih jauh di luar). Ini adalah berita bagi saya, tetapi sangat nyaman dalam hal ini.
sumber
m+=(d>0?d-2:0)+(d<3?d-1:0)*W;
dan mendorong dalamfor
, seperti ini:for(char c;i-->0;m+=(d>0?d-2:0)+(d<3?d-1:0)*W)
. Dengan cara ini, Anda akan menghemat satu char, karena Anda akan kehilangan titik koma.