Baru-baru ini ada beberapa tantangan ular peliharaan ASCII (mis. Sini )
0 0
0 0 0 000
00 0 00 000 0 0
000 0 0 0 00
0 000
Tantangan ini adalah mengambil ular peliharaan horizontal yang dihasilkan secara acak (tinggi lima garis, panjang 30), dan memverifikasi bahwa:
- Setiap kolom hanya memiliki satu
0
- Masing
0
- masing "terhubung" ke0
sebelum dan sesudahnya (diberi jarak hanya 0 atau 1 baris secara vertikal)
Hasil akhir dapat berupa true
atau 1
jika ular itu valid, atau false
atau 0
jika ular itu tidak valid
Edit — Klarifikasi
Asumsikan input:
- Apakah sebuah string
- Hanya mengandung '', '0', dan '\ n'
- Memiliki tepat 30 karakter setiap baris
- Memiliki persis 5 baris
Yaitu memverifikasi apakah ular terhubung, dan bahwa tidak ada karakter liar. Tidak perlu memvalidasi "kanvas" tempat ular itu dicetak.
code-golf
ascii-art
decision-problem
Mirror318
sumber
sumber
truthy/falsey
bukantrue/false
?Jawaban:
JavaScript (ES2018),
6254 byteInput adalah string tunggal:
Bendera
s
berarti titik yang cocok dengan apa pun (termasuk '\ n'). Fitur ini saat ini didukung oleh Chrome 63+, Opera 50+, Safari 11.1+, berdasarkan tabel kompatibel . Anda dapat menguji fungsi ini dengan browser yang didukung ini. Anda akan mendapatkan pengecualian saat memuat halaman jika browser Anda tidak mendukung fitur ini.Bagaimana itu bekerja:
0
:/( .{30}){4} /
0
dalam satu kolom:/0.{30}(.{31})*0/
0
tidak terhubung ke tetangganya:/0.{60}(.{31})*0/
,/0.{62}(.{31})*0/
Gabungkan semua regex ini, dan Anda akhirnya akan mendapatkan yang ini.
Tampilkan cuplikan kode
Berkat Martin Ender menunjukkan bahwa melakukan satu
!
operator dapat menghemat 8 byte.sumber
SnakeEx , 51 byte
Ini jelas bahasa yang tepat untuk tugas itu. : ^ D
Cocokkan seluruh input jika itu adalah ular yang valid; gagal mencocokkan jika tidak. Coba di sini!
Penjelasan
SnakeEx adalah bahasa pencocokan pola 2-D . Suatu program terdiri dari daftar definisi untuk "ular," yang merangkak di sekitar karakter pencocokan input, mengubah arah, dan memunculkan ular lain. Dalam program kami, kami mendefinisikan dua ular,
s
danc
.Kami akan mulai dengan
c
karena lebih sederhana. Definisinya adalah0 *$
, yang seharusnya cukup mudah dibaca jika Anda tahu regex: match0
, diikuti oleh nol atau lebih banyak ruang, diikuti oleh tepi grid. Tangkapan utama di sini: pencocokan ini dapat dilanjutkan ke segala arah. Kita akan menggunakanc
ke atas dan ke bawah dari ular, untuk memverifikasi bahwa tidak ada tambahan0
di setiap kolom.Sekarang untuk ular utama
s
,. Itu mengambil bentuk(...)%{30}
, yang berarti "cocokkan dengan isi kurung 30 kali" - satu kali untuk masing-masing0
ular. Sejauh ini baik. Apa yang ada di dalam tanda kurung?Ini memunculkan
c
ular baru , belok kiri 90 derajat. Arahnya relatif terhadap arahs
ular, sehingga ular baru itu bergerak ke arah atas kotak (ular utama bergerak ke arah kanan). Thec
cek ular bahwa sel grid saat ini adalah0
dan bahwa setiap sel di atas itu adalah spasi. Jika gagal, seluruh pertandingan gagal. Jika berhasil, kami melanjutkanyang melakukan hal yang sama, hanya berbelok ke kanan (menuju bagian bawah kotak).
Perhatikan bahwa spawn ini tidak mempengaruhi posisi pointer pertandingan di ular utama. Mereka agak mirip lookaheads di regex. (Mungkin di sini kita dapat memanggil mereka "lookbesides"?) Jadi setelah memverifikasi bahwa kita menunjuk ke
0
dan kolom lainnya hanya berisi spasi, kita harus benar-benar mencocokkan0
:Sekarang pointer pertandingan ada pada karakter di sebelah kanan
0
. Kita perlu memeriksa tiga opsi berbeda: sudut ular turun, sudut ular naik, atau ular lurus. Untuk ini, kita dapat menggunakan ekspresi ATAU:Di dalam OR kami, kami memiliki tiga kemungkinan:
Belok kanan, cocok dengan spasi, dan belok kiri lagi (sudut ular turun).
Belok kiri, cocokkan spasi, dan belok kanan lagi (sudut ular naik).
Cocokkan dengan nol atau satu garis bawah. Karena tidak ada garis bawah pada input, ini akan selalu menjadi pertandingan kosong (ular lurus).
Setelah mencocokkan salah satu dari tiga opsi di atas, pointer pencocokan harus menunjuk ke
0
dalam kolom berikutnya, siap untuk mencocokkan lagi dengan tanda kurung.sumber
CJam ,
3534 byteCobalah online! Input adalah array array karakter persegi panjang. Asumsikan input hanya berisi
dan
0
.Penjelasan:
sumber
05AB1E , 18 byte
Cobalah online!
Penjelasan
sumber
Sekam , 12 byte
Bergantung pada klarifikasi aturan, mungkin 11 byte atau 13 byte .
Cobalah online!
Input adalah daftar baris yang hanya berisi spasi dan 0s; jika satu string diperlukan, tambahkan dulu
¶
ke program untuk dipecah menjadi beberapa baris. TIO Link sudah melakukan ini untuk kejelasan. Output adalah 0 atau 1; jika ada nilai-nilai palsu dan kebenaran baik-baik saja, itu±
bisa dihilangkan.Penjelasan
Idenya adalah untuk menggunakan
×≈
untuk menjamin bahwa (a) semua kolom mengandung tepat satu 0, dan (b) posisi mereka berbeda paling banyak satu. Sebagai contoh, perhatikan input 8-kolomPertama,
mηfT
mengubahnya menjadi daftar daftar indeksLalu
Ẋ×≈
berikanMasing
1
- masing sesuai dengan sepasang indeks yang berbeda paling banyak 1, dan masing0
- masing sesuai dengan pasangan yang tidak. Setiap hasil sama dengan[1]
tepat ketika kedua daftar memiliki satu indeks, dan indeks berbeda paling banyak 1.sumber
Python 2 , 71 byte
Cobalah online!
Mengambil input sebagai string multiline. Test case dari Bubbler .
Kolom pertama diekstraksi sebagai
s[::31]
dan yang kedua sebagais[1::31]
, dan mereka diperiksa validitasnya. Kami berulangs
menghapus karakter pertama, menyebabkan pasangan kolom berturut-turut diperiksa.Cek untuk dua kolom menggunakan perbandingan rantai Python untuk
in
menggabungkan beberapa pemeriksaan:'0'in s[::31]
memeriksa apakah kolom pertama memiliki paling tidak satu0
s[::31]in' %s '%s[1::31]
memeriksa apakah kolom pertama adalah substring dari sandwich kolom kedua di antara dua spasi, yang memastikan posisi0
telah bergeser paling banyak satu ruang' %s '%s[1::31]in'%6s'%0*2
memeriksa apakah kolom kedua berisi paling banyak satu0
.Penutupan
*f(s[1:])
juga memaksa kasus rekursif menjadi benar.sumber
C (gcc) ,
246245232215212 byteCobalah online!
Saya pikir saya akan menggunakan bahasa favorit saya untuk ini (meskipun seperti yang saya lihat dari banyak entri lain yang lebih kecil, mungkin jauh dari ideal untuk tantangan semacam ini) dan C apa yang bisa saya kelola. Pendekatan program terhadap masalah ini relatif mudah, hanya dengan banyak byte penny-pinching; ia mengambil ular pada stdin dan memberikan hasilnya dalam nilai pengembalian main (dengan demikian kode keluar;
seperti yang diminta dalam masalah 0 menunjukkan ular tidak valid dan 1 valid meskipun untuk kode keluar itu anehsebagai tipikal untuk kode keluar 0 adalah ular yang valid dan 1 adalah ular yang tidak valid). Dengan makro yang diperluas dan beberapa ruang kosong yang bagus, tampilannya lebih mirip sebagai berikut:Baris input dibaca ke baris pertama buffer, lima berikutnya untuk melacak tempat yang diharapkan (baca: harus) memiliki nol di baris setelah setiap baris saat ini, dan yang terakhir adalah untuk melacak apakah nol telah memiliki telah dibaca di kolom yang diberikan, di setiap baris. Program memproses setiap baris secara bergantian.
Ini sama sekali tidak kuat (
gets()
hanya permulaan) dan input harus berisi semua ruang yang relevan (tidak ada spasi spasi kiri misalnya), dan gcc memuntahkan peringatan dan catatan tentang fungsionalitas stdlib kiri secara implisit dinyatakan dan seterusnya, tetapi, C la vie.Ini juga mengasumsikan bahwa kepala ular tidak harus berada di baris tengah, dan bahwa ular yang valid harus memiliki setidaknya satu nol di setiap baris (yaitu tidak ada baris semua spasi di 5 baris input). Jika yang terakhir itu bukan persyaratan, itu bisa dibuat sedikit lebih pendek - semuanya harus dilakukan
k
danl
dalam program ini dapat dihapus atau diganti dengan lebih sedikit byte kode dalam kasus itu.Terima kasih kepada user202729 untuk kira-kira. 26 byte disimpan.
sumber
#define F
dan)
untuk -1 byte.\n
(10),<space>
(32) dan0
(48) Anda dapat memeriksa==48
dengan>47
(-1 byte). / Anda dapat menghapus={0}
kapan menginisialisasib
jika variabel global. Demikian pula membuatk
global dani
(untyped ->int
) parametermain
(di tempatargc
yang mana1
).i
sepertiargc
jenius). Draf pertama ini lebih dari 400 byte; Butuh waktu cukup lama hanya untuk menyeretnya ke tujuan pribadi saya 300 dan kemudian 256 sehingga mungkin ada lebih banyak cara untuk melangsingkannya yang telah saya lewatkan.k
,,j
danl
semua global untuk menghemat memilikiint
deklarasi terpisah , kemudian menyadari default akan membiarkan saya pergi dengan meninggalkan jenis sepenuhnya. Terima kasih lagi!MATL ,
1817 byteInput adalah array char 2D. Karakter non-spasi dapat digunakan untuk ular.
Cobalah online!
Penjelasan
sumber
un30=
untuk memeriksa bahwa semua indeks kolom berbeda, dan tidak satu pun dari 30 kolom kosong. Mungkin saya bisa mengujinya lebih langsung, tetapi saya tidak tahu caranyaTergelincir , 28 byte
Uji di sini.
sumber
Jelly , 19 byte
Cobalah online!
-2 byte terima kasih kepada Tn. Xcoder
Penjelasan
Input adalah sebagai daftar string
sumber
Jelly , (14? *) 13 byte
Tautan monadik yang mengambil daftar lima string *, masing-masing dengan panjang 30 terdiri dari spasi dan karakter lain (mis.
0
S), dan mengembalikan integer (1 jika ular seperti yang didefinisikan, 0 sebaliknya)* Jika input harus berupa string tunggal (daftar karakter) maka tambahkan a
Ỵ
untuk memisahkan string pada umpan baris.Cobalah online!
Bagaimana?
sumber
Stax , 20 byte CP437
24 byte saat dibuka
Jalankan dan debug online!
Mungkin bukan yang golf terbaik tapi saya pikir metode ini baru dan menarik.
Penjelasan
sumber
J ,
38, 3730 byte-8 Bytes berkat FrownyFrog
Cobalah online!
sumber
[:(-:*)2-/\
, periksa apakah semua perbedaan adalah ,1, 0 atau 1.[:(#@{.=[:(-:*)2-/\])@:I.'0'=|:
[:($e.~[:(-:*)2-/\])@:I.'0'=|:
Jelly , 16 byte
Cobalah online!
Mengasumsikan bahwa string input akan selalu hanya berisi spasi dan nol saja. Mengambil input sebagai daftar string (masing-masing mewakili garis), dan menghasilkan 1 jika benar, 0 sebaliknya.
Penjelasan
sumber
Python 2 , 141 byte
Cobalah online!
Input adalah kotak karakter.
sumber
Python 2 dan Python 3 ,
122120119 byteCobalah online!
Format input adalah satu string dengan panjang 154 (5 x 30 karakter, 4 baris baru):
Jika kepala tidak harus menjadi baris tengah
Persyaratan tengah-baris-kepala berada di tantangan asli, tetapi saya menemukan bahwa itu tidak terjadi di sini (setidaknya tidak disebutkan secara eksplisit).
Python 2 dan Python 3 ,
124123 byteCobalah online!
Edit:
==
) menjadi ketidaksetaraan untuk setiap kode.all()
trik menjadi tidak berarti di Py3, sehingga menggabungkan kedua versi.sumber
Excel (VBA), 68 byte
Menggunakan Jendela Segera,
Cell[A6]
sebagai output.sumber
Siput , 18 byte
Cobalah online!
sumber
Grime ,
302623 byteTerima kasih kepada Zgarb karena telah menyimpan 7 byte dan menunjukkan bug.
Cobalah online!
sumber
Ruby , 93 byte
Cobalah online!
sumber
JavaScript (Node.js) ,
128126 byteDiedit setelah klarifikasi input yang menyatakan bahwa input adalah "string".
Cobalah online!
sumber
Python 3 ,
197185 bytePada command prompt do
verify.py<snake.txt
atau bash docat snake.txt | python verify.py
. Dimanasnake.txt
file berisi ular untuk diverifikasi.Jika ular itu benar, tidak akan ada output. Jika tidak benar, Python akan meningkatkan kesalahan indeks.
sumber