Tantangan
Kode terpendek berdasarkan jumlah karakter untuk memasukkan representasi 2D dari sebuah papan, dan menampilkan 'benar' atau 'salah' sesuai dengan input .
Papan terbuat dari 4 jenis ubin:
# - A solid wall
x - The target the laser has to hit
/ or \ - Mirrors pointing to a direction (depends on laser direction)
v, ^, > or < - The laser pointing to a direction (down, up, right and left respectively)
Hanya ada satu laser dan hanya satu target . Dinding harus membentuk persegi panjang yang solid dengan berbagai ukuran, tempat laser dan target diletakkan di dalamnya. Dinding di dalam 'ruang' dimungkinkan.
Sinar laser memotret dan bergerak dari asalnya ke arah yang ditunjuknya. Jika sinar laser mengenai dinding, itu berhenti. Jika sinar laser mengenai cermin, memantul 90 derajat ke arah yang ditunjuk cermin. Cermin memiliki dua sisi, yang berarti kedua belah pihak 'reflektif' dan dapat memantulkan sinar dengan dua cara. Jika sinar laser mengenai laser ( ^v><
) itu sendiri, itu diperlakukan sebagai dinding (sinar laser menghancurkan beamer dan sehingga tidak akan pernah mengenai target).
Uji kasus
Memasukkan: ########### # / \ # # # # \ x # #> / # ########### Keluaran: benar Memasukkan: ########### # vx # # / # # / # # \ # ########### Keluaran: Salah Memasukkan: ############## # # # #> # # # # # # # x # # # # ############## Keluaran: Salah Memasukkan: ########### # / \ / \ / \ # # \\ // \\ # # // \ / \ / \\ # # \ / \ / \ / x ^ # ########### Keluaran: benar
Hitungan kode termasuk input / output (yaitu program lengkap).
sumber
Jawaban:
Perl,
166160 karakterPerl,
251248246222214208203201193190180176173170166 -> 160 karakter.Solution memiliki 166 pukulan ketika kontes ini berakhir, tetapi A. Rex telah menemukan beberapa cara untuk mengurangi 6 karakter lagi:
Baris pertama memuat input ke
%t
, tabel papan tempat$t{99*i+j}
memegang karakter di baris i , kolom j . Kemudian,itu mencari elemen
%t
untuk karakter yang cocok> ^ <
atauv
, dan secara bersamaan menetapkan$d
nilai antara 0 dan 3 yang menunjukkan arah awal sinar laser.Di awal setiap iterasi di loop utama, kami memperbarui
$d
jika balok saat ini di cermin. XOR'ing oleh 3 memberikan perilaku yang benar untuk\
cermin dan XOR'ing oleh 1 memberikan perilaku yang benar untuk/
cermin.Selanjutnya, posisi saat
$r
ini diperbarui sesuai dengan arah saat ini.Kami menetapkan karakter pada posisi saat ini
$_
untuk memanfaatkan operator pertandingan yang sesuai.Lanjutkan jika kita berada di ruang kosong atau karakter cermin. Kalau tidak, kita mengakhiri
true
jika kita berada di target ($_ =~ /x/
) danfalse
sebaliknya.Batasan: mungkin tidak berfungsi pada masalah dengan lebih dari 99 kolom. Batasan ini dapat dihapus dengan mengorbankan 3 karakter lagi,
sumber
s!.!$t{$s++}=$&!ge,$s=$r+=99for<>;
, ubah%d=split//,.." to
% d = .. = ~ /./ g, and change
grep {..}% t` kegrep..,%t
Perl, 177 Karakter
Linebreak pertama dapat dihapus; dua lainnya wajib.
Penjelasan:
Jika sinar yang bergerak ke kanan berjalan ke {ruang kosong, cermin sudut atas, cermin sudut bawah} ia menjadi {balok bergerak kanan, balok bergerak atas, balok bergerak bawah}. Inisialisasi
$/
sepanjang jalan - untungnya "6" bukan input char yang valid.Baca papan tulis
$_
.$s
adalah simbol dari apa pun yang balok duduk di atas sekarang. Karena penghasil laser harus diperlakukan seperti dinding, setel ini sebagai dinding untuk memulai.Jika sinar laser menunjuk dengan cara apa pun kecuali benar, putar simbolnya, lalu putar seluruh papan pada tempatnya (juga putar simbol untuk cermin). Ini adalah rotasi kiri 90 derajat, dicapai secara efektif dengan membalikkan baris sambil mentransposisi baris dan kolom, dalam sedikit lebih buruk
s///e
dengan efek samping. Dalam kode golf, tr ditulis dalam bentuky'''
yang memungkinkan saya untuk melewatkan backslashing satu backslash.Hentikan dengan pesan yang tepat jika kita mengenai target atau tembok.
Jika ada ruang kosong di depan laser, bergerak maju. Jika ada cermin di depan laser, maju dan putar bilah. Dalam kedua kasus tersebut, masukkan "simbol yang disimpan" kembali ke lokasi balok lama, dan masukkan benda yang baru saja kita timpa ke dalam simbol yang disimpan.
Ulangi sampai penghentian.
{...;redo}
adalah dua karakter kurang darifor(;;){...}
dan tiga kurang dariwhile(1){...}
.sumber
C89 (209 karakter)
Penjelasan
Monstrositas ini mungkin akan sulit diikuti jika Anda tidak mengerti C. Hanya peringatan.
Makro kecil ini memeriksa apakah karakter saat ini (
*p
) sama dengan apa pun yanga
ada dalam bentuk karakter (*#a
). Jika sama, atur vektor gerakan keb
(m=b
), tandai karakter ini sebagai dinding (*p=1
), dan atur titik awal ke lokasi saat ini (q=p
). Makro ini termasuk bagian "lain".Nyatakan beberapa variabel. *
q
adalah lokasi cahaya saat ini. *G
adalah papan permainan sebagai larik 1D. *p
adalah lokasi baca saat ini ketika mengisiG
. *w
adalah lebar papan.Jelas
main
.m
adalah variabel yang menyimpan vektor gerakan. (Ini adalah parameter untukmain
sebagai optimasi.)Ulangi semua karakter, isi
G
menggunakanp
. LewatiG[0]
sebagai pengoptimalan (tidak perlu membuang karakterp
lagi di bagian ketigafor
).Gunakan makro yang disebutkan di atas untuk mendefinisikan lazer, jika mungkin.
-1
dan1
sesuai dengan kiri dan kanan, masing-masing, dan-w
dan kew
atas dan ke bawah.Jika karakter saat ini adalah penanda garis akhir (ASCII 10), setel lebar jika belum ditetapkan. Dilompati yang
G[0]
memungkinkan kita untuk menulisw=p-G
bukanw=p-G+1
. Juga, ini selesai dari?:
rantai dariM
's.Pindahkan cahaya oleh vektor gerakan.
Refleksikan vektor gerakan.
Jika ini adalah tembok atau
x
, berhenti dengan pesan yang sesuai (m=0
mengakhiri loop). Kalau tidak, jangan lakukan apa pun (noop;m=m
)sumber
g.c:3: declaration expected
:(puts
Deklarasi Menghapus membantu, tetapi tidak cukup untuk membawanya di bawah 170. 209 cukup bagus, jadi saya pikir saya akan membiarkannya begitu. Terima kasih atas bantuannya, kawan. Saya sangat menghargai itu. =] (Apa pun untuk melengserkan para penyihir Perl!)Saya berani bertaruh orang telah menunggu yang satu ini untuk waktu yang lama. (Apa maksudmu, tantangannya sudah berakhir dan tidak ada yang peduli lagi?)
Lihatlah ... Saya di sini menyajikan solusi
Befunge-93!
Beratnya adalah pada 973 charaters kekalahan (atau 688 jika Anda cukup amal untuk mengabaikan spasi putih, yang hanya digunakan untuk memformat dan tidak melakukan apa pun dalam kode aktual).
Peringatan : Saya menulis juru bahasa Befunge-93 saya sendiri di Perl beberapa waktu yang lalu, dan sayangnya ini semua yang saya punya waktu untuk mengujinya. Saya cukup yakin dengan kebenarannya secara umum, tetapi mungkin memiliki batasan aneh sehubungan dengan EOF: Karena
<>
operator Perl mengembalikan undef di akhir file, ini diproses sebagai 0 dalam konteks numerik. Untuk implementasi berbasis C di mana EOF memiliki nilai yang berbeda (-1 say), kode ini mungkin tidak berfungsi.Penjelasan
Jika Anda tidak terbiasa dengan sintaks dan operasi Befunge, periksa di sini .
Befunge adalah bahasa berbasis tumpukan, tetapi ada perintah yang memungkinkan seseorang untuk menulis karakter ke kode Befunge. Saya memanfaatkan itu di dua tempat. Pertama, saya menyalin seluruh input ke papan Befunge, tetapi terletak beberapa baris di bawah kode tertulis yang sebenarnya. (Tentu saja, ini tidak pernah benar-benar terlihat ketika kode berjalan.)
Tempat lain di dekat kiri atas:
Dalam hal ini, area yang saya soroti di atas adalah tempat saya menyimpan beberapa koordinat. Kolom pertama di baris tengah ada tempat saya menyimpan koordinat x untuk "posisi kursor" saat ini; kolom kedua adalah tempat saya menyimpan koordinat y; dua kolom berikutnya adalah untuk menyimpan koordinat x dan y dari sumber sinar laser ketika ditemukan; dan kolom terakhir (dengan karakter 'a' di dalamnya) akhirnya ditimpa untuk memuat arah balok saat ini, yang jelas berubah ketika jalur balok dilacak.
Program dimulai dengan menempatkan (0,27) sebagai posisi kursor awal. Kemudian input dibaca satu karakter pada satu waktu dan ditempatkan di posisi kursor; baris baru hanya menyebabkan koordinat y meningkat dan koordinat x kembali ke 0, sama seperti pengembalian kereta nyata. Akhirnya undef dibaca oleh interpreter dan nilai 0 karakter digunakan untuk menandai akhir input dan beralih ke langkah iterasi laser. Ketika karakter laser [<> ^ v] dibaca, itu juga disalin ke repositori memori (di atas karakter 'a') dan koordinatnya disalin ke kolom tepat di sebelah kiri.
Hasil akhir dari semua ini adalah bahwa seluruh file pada dasarnya disalin ke dalam kode Befunge, sedikit cara di bawah kode aktual yang dilalui.
Setelah itu, lokasi berkas disalin kembali ke lokasi kursor, dan iterasi berikut dilakukan:
Jika ada cukup permintaan untuk itu, saya akan mencoba menunjukkan dengan tepat di mana dalam kode semua ini tercapai.
sumber
F #, 36 baris, sangat mudah dibaca
Oke, hanya untuk mendapatkan jawaban di luar sana:
Sampel:
sumber
Golfscript - 83 chars (mashup of my and strager's)
Baris baru ada di sini untuk pembungkus
Golfscript - 107 karakter
Baris baru hanya ada untuk kejelasan
Bagaimana itu bekerja.
Baris pertama menentukan lokasi dan arah awal.
Langkah kedua melalui memutar setiap kali laser menyentuh cermin.
sumber
353 karakter di Ruby:314277 karakter sekarang!OK, 256 karakter di Ruby dan sekarang saya selesai. Angka bulat yang bagus untuk berhenti. :)247 karakter. Saya tidak bisa berhenti.223203201 karakter di RubyDengan spasi putih:
Sedikit refactored:
sumber
ch
keC
atau lainnya surat 1 char menyimpan 2 karakter!i++
(bukannyai+=1
)?Python
294277253240232 karakter termasuk baris baru:(karakter pertama dalam baris 4 dan 5 adalah tab, bukan spasi)
Saya lupa Python bahkan memiliki titik koma opsional.
Bagaimana itu bekerja
Gagasan kunci di balik kode ini adalah menggunakan bilangan kompleks untuk mewakili posisi dan arah. Baris adalah sumbu imajiner, meningkat ke bawah. Kolom adalah sumbu nyata, meningkat ke kanan.
l='>v<^';
daftar simbol laser. Urutan dipilih sehingga indeks karakter arah laser sesuai dengan kekuatan sqrt (-1)x={'/':'^<v>','\\':'v>^<',' ':l};
tabel transformasi menentukan bagaimana arah berubah ketika balok meninggalkan ubin yang berbeda. Ubin adalah kuncinya, dan arah baru adalah nilainya.b=[1];
memegang papan. Elemen pertama adalah 1 (dievaluasi sebagai benar) sehingga loop sementara akan berjalan setidaknya sekali.r=p=0
r
adalah nomor baris input saat ini,p
adalah posisi saat ini dari sinar laser.while b[-1]:
berhenti memuat data papan ketika raw_input mengembalikan string kosongb+=[raw_input()];r+=1
tambahkan baris input berikutnya ke papan tulis dan tambahkan penghitung barisfor g in l:
tebak setiap arah laser secara bergantianc=b[r].find(g)
atur kolom ke lokasi laser atau -1 jika tidak di garis (atau menunjuk ke arah yang berbeda)if-1<c:p=c+1j*r;d=g
jika kami menemukan laser, maka atur posisip
dan arah saat inid
.d
adalah salah satu karakter dil
Setelah memuat papan ke dalam
b
, posisip
dan arah saatd
ini telah diatur ke orang-orang dari sumber laser.while' '<d:
space memiliki nilai ASCII lebih rendah daripada simbol arah mana pun, jadi kami menggunakannya sebagai flag berhenti.z=l.find(d);
indeks arahan arah saat ini dil
string.z
terbiasa nanti untuk menentukan arah balok baru menggunakanx
tabel, dan untuk meningkatkan posisi.p+=1j**z;
increment posisi menggunakan kekuatan i. Misalnya,l.find('<')==2
-> i ^ 2 = -1, yang akan bergerak ke kiri satu kolom.c=b[int(p.imag)][int(p.real)];
baca char di posisi saat inid=x.get(c,' '*4)[z]
mencari arah baru untuk balok di tabel transformasi. Jika karakter saat ini tidak ada di tabel, maka seteld
ke spasi.print'#'<c
cetak false jika kita berhenti pada apa pun selain target.sumber
p+=1j**z
: Itu manis.Ini
yaituadalah port langsung dari solusi Brian untuk C # 3, minus interaksi konsol. Ini bukan entri dalam tantangan karena ini bukan program yang lengkap, saya hanya ingin tahu bagaimana beberapa konstruksi F # yang digunakannya dapat diwakili dalam C #.Sunting: Setelah beberapa percobaan, kode pencarian ini agak bertele-tele:
telah diganti dengan beberapa LINQ yang lebih ringkas untuk kode Objek:
sumber
F #, 255 karakter (dan masih bisa dibaca!):
Ok, setelah istirahat malam, saya banyak meningkatkan ini:
Mari kita bicarakan satu per satu.
Pertama, slurp semua input ke dalam array satu dimensi yang besar (array 2D bisa berakibat buruk untuk kode golf; cukup gunakan array 1D dan tambahkan / kurangi lebar satu baris ke indeks untuk bergerak ke atas / ke bawah baris).
Selanjutnya kita menghitung 'w', lebar jalur input, dan 'c', posisi awal, dengan mengindeks ke dalam array kita.
Sekarang mari kita mendefinisikan fungsi 'next' 'n', yang mengambil posisi saat ini 'c' dan arah 'd' yaitu 0,1,2,3 untuk naik, kiri, kanan, bawah.
Indeks-epsilon 'e' dan apa-arah-baru-jika-kita-tekan-a-garis miring 'dihitung' oleh tabel. Misalnya, jika arah saat ini 'd' adalah 0 (atas), maka elemen pertama dari tabel mengatakan "-w, 2" yang berarti kita mengurangi indeks dengan w, dan jika kita menekan garis miring arah yang baru adalah 2 (Baik).
Sekarang kita kembali ke fungsi berikutnya 'n' dengan (1) indeks berikutnya ("c + e" - current plus epsilon), dan (2) arah baru, yang kita hitung dengan melihat ke depan untuk melihat apa yang ada dalam array di sel selanjutnya. Jika char lookahead adalah garis miring, arah baru adalah 's'. Jika backslash, arah baru adalah 3-s (pilihan kami untuk encoding 0123 berhasil). Jika ini ruang, kita terus berjalan ke arah yang sama 'd'. Dan jika itu karakter lain 'c', maka permainan berakhir, mencetak 'benar' jika karakter itu 'x' dan salah jika sebaliknya.
Untuk memulai, kita memanggil fungsi rekursif 'n' dengan posisi awal 'c' dan arah awal (yang melakukan pengkodean awal arah ke 0123).
Saya pikir saya mungkin masih bisa mencukur beberapa karakter lagi, tapi saya cukup senang dengan itu seperti ini (dan 255 adalah angka yang bagus).
sumber
Beratnya pada 18203 karakter adalah solusi Python yang dapat:
Masih perlu dirapikan agak dan saya tidak tahu apakah fisika 2D menentukan bahwa balok tidak dapat melintasi sendiri ...
Skrip bash untuk memamerkan pelaporan kesalahan warna:
Unittests yang digunakan dalam pembangunan:
sumber
Ruby, 176 karakter
Saya menggunakan mesin negara sederhana (seperti kebanyakan poster), tidak ada yang mewah. Saya terus mengurangi menggunakan setiap trik yang bisa saya pikirkan. Bitor XOR yang digunakan untuk mengubah arah (disimpan sebagai integer dalam variabel
c
) adalah peningkatan besar atas kondisi yang saya miliki di versi sebelumnya.Saya curiga bahwa kode itu bertambah
x
dany
bisa dibuat lebih pendek. Berikut adalah bagian dari kode yang melakukan penambahan:Sunting : Saya dapat mempersingkat sedikit di atas:
Arah laser saat
c
ini disimpan sebagai berikut:Kode ini bergantung pada fakta ini untuk ditambahkan
x
dany
dengan jumlah yang benar (0, 1, atau -1). Saya mencoba mengatur ulang nomor mana yang dipetakan ke setiap arah, mencari pengaturan yang akan membiarkan saya melakukan manipulasi bitwise untuk meningkatkan nilai, karena saya memiliki perasaan yang mengganggu bahwa itu akan lebih pendek daripada versi aritmatika.sumber
C # 3.0
259 karakter
Sedikit lebih mudah dibaca:
Limbah utama dari karakter tampaknya adalah menemukan lebar peta dan posisi sumber laser. Adakah cara untuk mempersingkat ini?
sumber
while(1)
C + ASCII, 197 karakter:
Solusi C ini mengasumsikan rangkaian karakter ASCII, memungkinkan kita untuk menggunakan trik cermin XOR. Ini juga sangat rapuh - semua jalur input harus sama panjang, misalnya.
Itu pecah di bawah tanda 200 karakter - tapi ya, masih belum mengalahkan solusi Perl!
sumber
Golfscript (83 karakter)
Halo, Gnibbler!
sumber
Python - 152
Membaca input dari file yang disebut "L"
Untuk membaca dari stdin ganti baris pertama dengan ini
Jika Anda membutuhkan huruf kecil benar / salah ubah baris terakhir menjadi
sumber
True
ketrue
danFalse
kefalse
? ;-)D<5
" menjadi "cetak D <5"? Atau ada sesuatu yang saya lewatkan?JavaScript - 265 Karakter
Pembaruan IV - Mustahil ini akan menjadi putaran terakhir pembaruan, berhasil menyelamatkan beberapa karakter dengan beralih ke loop do-while dan menulis ulang persamaan gerakan.
Pembaruan III - Berkat saran oleh strager dalam hal menghapus Math.abs () dan menempatkan variabel dalam ruang nama global, yang digabungkan dengan beberapa penataan ulang variabel penugasan membuat kode hingga 282 karakter.
Pembaruan II - Beberapa pembaruan lagi pada kode untuk menghapus penggunaan! = -1 serta beberapa variabel yang lebih baik untuk operasi yang lebih lama.
Pembaruan - Ketika melewati dan membuat beberapa perubahan dengan membuat referensi ke fungsi indexOf (terima kasih LiraNuna!) Dan menghapus tanda kurung yang tidak diperlukan.
Ini adalah pertama kalinya saya melakukan kode golf jadi saya tidak yakin seberapa baik ini, umpan balik akan dihargai.
Versi yang sepenuhnya diperkecil:
Versi asli dengan komentar:
Halaman web untuk diuji dengan:
sumber
index != -1
denganindex > 0
tolong! (Mudah-mudahan tidak ada yang meletakkan lazer di sudut kiri atas sehingga0
tidak akan dikembalikan. =]) Anda dapat rantaivar
pernyataan atau menyingkirkan semuanya (meletakkan variabel di namespace global). Saya pikirMath.abs(m)==1
bisa diganti denganm==-1|m==1
. Dapatmovement = ...; location += movement
dioptimalkanlocation += movement =
?function(a){return g.indexOf(a)}
dapat diganti denganfunction(a)g.indexOf(a)
dalam versi JavaScript terbaru.House of Mirrors
Bukan entri yang sebenarnya untuk tantangan, tetapi saya menulis permainan berdasarkan konsep ini (tidak terlalu lama kembali).
Itu ditulis dalam Scala, open-source dan tersedia di sini :
Itu sedikit lebih banyak; berurusan dengan warna dan berbagai jenis cermin dan perangkat, tetapi versi 0,00001 melakukan apa yang diminta oleh tantangan ini. Saya telah kehilangan versi itu dan itu tidak pernah dioptimalkan untuk jumlah karakter.
sumber
c (K&R) 339 karakter yang diperlukan setelah lebih banyak saran dari strager.
Fisikawan dalam saya mencatat bahwa operasi propagasi dan refleksi invarian pembalikan waktu, jadi versi ini, melempar sinar dari target dan memeriksa untuk melihat apakah tiba di penghasil laser.
Sisa implementasi sangat lurus ke depan dan diambil kurang lebih persis dari upaya saya sebelumnya yang maju.
Terkompresi:
Tidak terkompresi (ish):
Tidak ada validasi input, dan input buruk dapat mengirimkannya ke infinite loop. Bekerja dengan baik dengan input tidak lebih besar dari 99 kali 99. Membutuhkan kompiler yang akan menghubungkan perpustakaan standar tanpa menyertakan header apa pun. Dan saya pikir saya sudah selesai, strager telah saya kalahkan dengan peregangan yang cukup, bahkan dengan bantuannya.
Saya agak berharap seseorang akan menunjukkan cara yang lebih halus untuk menyelesaikan tugas. Tidak ada yang salah dengan ini, tetapi ini bukan sihir yang dalam.
sumber
=0
global karena mereka diinisialisasi ke 0 secara default. Ganti konstanta karakter dengan padanannya dalam desimal. Gunakan>0
sebagai ganti!=EOF
untuk mengecek terhadap EOF (dan\0
). Anda mungkin dapat#define
menghapus beberapa kodecase
seperti yang saya lakukan dengan kodeif
. Tidak perlu untuk tambahan\n
dalamputs
karenaputs
harus mencetak baris baru.for(;;)
lebih pendek dariwhile(1)
. Semoga ini membantu. =]"There is no input validation"
- Seharusnya tidak ada. Untuk memudahkan pegolf, input diasumsikan selalu 'bersih' kecuali ditentukan lain.Ruby - 146 Chars
sumber
PostScript , 359 byte
Upaya pertama, banyak ruang untuk perbaikan ...
sumber
Haskell,
395391383361339 karakter (dioptimalkan)Masih menggunakan mesin keadaan umum, bukan apa pun yang pintar:
Versi yang dapat dibaca:
sumber
Saya percaya pada Penggunaan Kembali Kode, saya akan menggunakan salah satu kode Anda sebagai API :).
32 karakter \ o / ... wohoooo
sumber
C ++: 388 karakter
( 318 tanpa header)
Bagaimana itu bekerja:
Pertama, semua baris dibaca, kemudian, laser ditemukan. Berikut ini akan dievaluasi
0
selama tidak ada panah laser yang ditemukan, dan waktu yang sama akan ditetapkan kex
posisi horizontal.Kemudian kita melihat ke arah mana kita menemukan dan menyimpannya
i
. Nilaii
genap atas / kiri ("menurun") dan nilai ganjil adalah bawah / kanan ("meningkat"). Menurut gagasan itu,d
("arah") danr
("orientasi") ditetapkan. Kami mengindeks array pointerz
dengan orientasi dan menambahkan arah ke integer yang kami dapatkan. Arah berubah hanya jika kita memukul garis miring, sementara itu tetap sama ketika kita memukul garis miring. Tentu saja, ketika kita menabrak cermin, maka kita selalu mengubah orientasi (r = !r
).sumber
Karakter Groovy @ 279
sumber
C #
1020 karakter.1088 karakter (input ditambahkan dari konsol).925 karakter (variabel refactored).875 karakter (dihapus initializer Kamus berlebihan; diubah ke Biner & operator)
Membuat titik untuk tidak melihat orang lain sebelum memposting. Saya yakin itu bisa sedikit sedikit LINQ. Dan seluruh metode FindLaser dalam versi yang dapat dibaca tampaknya sangat mencurigakan bagi saya. Tapi, itu berhasil dan sudah terlambat :)
Perhatikan bahwa kelas yang dapat dibaca mencakup metode tambahan yang mencetak Arena saat ini saat laser bergerak.
Versi yang Dapat Dibaca (bukan versi golf final, tetapi premis yang sama):
sumber
Perl 219
Versi perl saya memiliki panjang
392342 karakter (saya harus menangani kasus balok yang mengenai laser):Perbarui , terima kasih Hobbs untuk mengingatkan saya
tr//
, sekarang 250 karakter:Perbarui , hapus
m
dalamm//
, ubah duawhile
loop yang dibawa sedikit tabungan; sekarang hanya ada satu ruang yang dibutuhkan.(
L:it;goto L
panjangnya sama dengando{it;redo}
):Saya mencukur beberapa, tetapi
hampir tidakhanya bersaing dengan beberapa dari ini, meskipun terlambat.Itu terlihat sedikit lebih baik sebagai:
Yah ... Sejujurnya ini harus cukup jelas jika Anda mengerti bahwa
@b
ini adalah array array karakter di setiap baris, dan dapat membaca regexp dantr
pernyataan sederhana .sumber
$_=$s;tr/^v<>/<>^v/
dan$_=$s;tr/v^<>/<>^v/
masing - masing. Juga, Anda tidak perlum
masukm//
.$_=$s;tr/v^></<>^v/;
if m/.../
yang dapatif/.../
menyimpan dua karakter dalam satu pop.y///
alih-alihtr///
menyimpan dua karakter.F # - 454 (atau sekitar itu)
Agak terlambat ke permainan, tetapi tidak bisa menahan memposting upaya 2d saya.
Pembaruan sedikit dimodifikasi. Sekarang berhenti dengan benar jika pemancar dipukul. Jepit ide Brian untuk IndexOfAny (memalukan kalau kalimat itu sangat bertele-tele) Saya belum benar-benar berhasil mencari cara agar ReadToEnd kembali dari Konsol, jadi saya mengambil sedikit kepercayaan itu ...
Saya senang dengan jawaban ini, seolah-olah cukup pendek, masih cukup mudah dibaca.
sumber