Terinspirasi oleh salah satu video Vi Hart (yang merupakan harta karun yang penuh dengan ide tantangan potensial)
Seekor ular terdiri dari segmen dengan panjang yang sama dan koneksi antara masing-masing segmen bisa lurus atau berbelok 90 °.
Kita dapat menyandikan ular seperti itu (hingga rotasi, yang tergantung pada arah awal) dengan menuliskan slither , arah belokan (Lurus / Kiri / Kanan) yang diperlukan. Yang ini, mulai dari kiri atas dan menunjuk ke kanan
-+ +--+ SR RSSR
| +-+ | S RSL S
+--+ --+ LSSL SSR
Akan diwakili oleh meluncur SRSLSSLRLRSSRSRSS
Dan tentu saja ular planar tidak dapat memotong dirinya sendiri (seperti di SSSSLLLSS
), yang akan menghasilkan Game Over pixelated mengerikan.
Tugas Anda adalah menentukan apakah slither valid atau tidak (menghasilkan setidaknya satu persimpangan-sendiri)
Input
Sebuah string yang terbuat dari huruf SLR
dengan 2 < length < 10000
Output
Something Truthy jika itu adalah slither yang valid dan sesuatu Falsey jika tidak.
Uji kasus
__Valid__
SSLSLSRSRSSRSSSLLSSSRRLRSLRLLSSS
SRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRRSRLLRSRRLSLLRRLLSLRR (A hilbert curve)
RLLRSRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRRSRLLRSRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRR
SRRSRSRSSRSSRSSSRSSSRSSSSRSSSSRSSSSSRSSSSSRSSSSSSRSSSSSSRSSSSSS (Spiral)
SSSSSSSSSSLSSSSSSSLSSSSSSSSLSSSSSLSSSSSSLSSSLLRRLLRRLLSLSSSRRSSSSRSSSRSSSSSSRSSSSSRSSSSSSSSRSSSSSSSRSSSSSSSSS (bigger, squigglier spiral)
LRSLLRLSRSLLSRLSLRSLSSSLRRSSLSRRLRSRLRLSLRLLRLRSSLSLRLRSRSSSSSLSRRLSLSSSRRLRLRLRLRRLLSSLSSSRRLRLRLRLRLSLSSSSSSSSSSSSSRLRLLRLRLRLRLRLRLRLSLSSSLSLSLL
__Invalid__
SRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLLLRSRRLLRRSRLLRSRRLSLLRRLLSLRR
SRRLSLLRRLLSLRRSRLLRSRRLLSRSSSRSSSSSSSRSRSSSSSSSRRLLRRSRLLRSRRLSLLRRLLSLRR
SRRSRSRSSRSSRSSSRSSSRSSSSSSSSSSRSSSSRSSSSSRSSSSSRSSSSSSRSSSSSSRSSSSSS
SSSSSSSSSSLSSSSSSSLSSSSSSSSLSSSSSLSSSSSSLSSSLLRRLRLRRLLSLSSSRRSSSSRSSSRSSSSSSRSSSSSRSSSSSSSSRSSSSSSSRSSSSSSSSS
LRSLLRLSRSLLSRLSLRSLSSSLRRSSLSRRLRSRLRLSLRLLRLRSSLSLRLRSRSSSSSLSRRLSLSSSRRLRLRLRLRRLLSSLSSSRRLRLRLRLRLSLSSSSSSSSSSSSSRLRLLRLRLRLRLRLRLRLSLSSSLSLSLLSLRLSLRSLRSLRSLSLSLRSRLSLRSLRLSRSLLLRLRLRRRRSLSLSSLLSLSLSLSSLLSLSLLRLRSLLRSRLSLSSLLLLSSSSSSSSSSSSSSSSSSSSRLRLLRRLRLRLLRLRLRLRLRLSSSSLSLRLLRLSLSSLSLSLSLSLRLLRLSLLLSRSSSSSSSSSSSSSSSRLRLRLLRLRLSLSRSRSSSLSRLRLRLRSLSLSLSRLLSRLSLSLSLSLSSLSLSLLSLSRLLRLRLRLRLRLRLRLRLRLRLSLSRLRLSLLRRLSLLSLSLSLSLSLLSLSLSLRLRLRLRLRLRLRLRLRLRRLRSLSLSLSLSLSLSLSSLSSSSSLSLSSSLSLSLSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
Anda dapat menggambar slithers di sini (R dan L terbalik, tetapi itu tidak mempengaruhi validitas)
sumber
SRRR
pada kertas grafik dengan satu kotak per segmen maka itu akan tumpang tindih dan karena itu tidak validRRR
, akan tetapi, akan menempati tepat 2x2 persegi tanpa tumpang tindih (seperti dalam game klasik)Jawaban:
Pyth,
2220 byteCobalah sendiri atau jalankan testuite .
Perhatikan nilai-nilai ASCII dari SRL, masing-masing 83, 76, 82. Saya menyalahgunakan fakta bahwa:
Dari sini saya hanya menyimpan variabel untuk posisi saat ini dan arah saat ini. Untuk setiap karakter saya kalikan arah saat ini dengan angka kompleks di atas, kemudian tambahkan ke posisi saat ini.
Pada akhirnya saya memeriksa apakah semua posisi yang dikunjungi unik.
sumber
CJam, 30 byte
Penjelasan untuk segera menyusul.
Cobalah online di sini atau jalankan seluruh rangkaian .
sumber
S
, apakah itu berarti ular tersebut telah menempati keduanya (0,0) dan (1,0)?JavaScript (ES6), 84
89Jalankan cuplikan di Firefox untuk menguji.
Beberapa catatan:
undefined
. Pada kunjungan pertama, operator tilde mengubahnya menjadi -1 yang benar. Akhirnya, pada kunjungan kedua perubahan nilai menjadi 0 yang salah danevery
loop berakhir dengan false.sumber
TI-BASIC,
49 56 5351 byteMirip dengan metode orlp, ini membuat daftar semua titik di bidang kompleks yang dikunjungi oleh ular, mulai dari asal. Jika daftar tidak memiliki elemen duplikat, kode mengembalikan nilai positif. Perhatikan bahwa pada untaian lebih dari 999 elemen, kalkulator tidak akan dapat menghasilkan daftar yang cukup panjang, dan akan salah.
SUNTING: Menyelamatkan dua byte dengan mengorbankan keburukan karena tidak ada dua titik kisi pada bidang kompleks yang berjarak sama dari e ^ i.
sumber
TI-BASIC,
6058 byteSunting: Abaikan semua yang di bawah ini: solusi ti-basic yang berfungsi ada di sini , oleh thomas-kwa. Pilih itu!
⁻
adalah[(-)]
kuncinya, dan Ans adalah[2ND]->[(-)]
. Jalankan dengan melampirkan instruksi ular di tanda kutip ([ALPHA]->[+]
) diikuti oleh titik dua kemudian nama program. Misalnya, jika Anda memberi nama program "SNAK", Anda akan menjalankan test case di OP as"SRSLSSLRLRSSRSRSS":prgmSNAKE
.Edit: Gagal aktif
SRRLSLLRRRS
. Saya memiliki versi revisi sebesar 61 byte, tetapi gagal pada kasus uji pertama yang tidak valid:Saya akan mencoba memperbaiki besok.
Perbarui: jadi masalahnya adalah algoritma saya cacat. Jika saya menggunakan For (loop sebagai lawan dari seq ((untuk mencapai hal yang sama)) (kedua algoritma di atas, sebenarnya) dapat digambarkan sebagai ini:
Namun, ini gagal pada slithers yang tidak valid seperti
SRLRLRLRLRRRSS
. Sekarang saya akan mencoba untuk membuat algoritma yang lebih baik ... atau mencuri dari jawaban lain.Saya 90% yakin ini bisa diganti dengan satu
seq(
perintah, sebenarnya, tapi untuk saat ini sekecil yang saya bisa. Jika Anda berniat untuk membangun ini ke 8xp menggunakan Sourcecoder sebagai lawan benar-benar mengetiknya, perhatikan bahwa≠
harus diganti dengan!=
dan⁻1+
bit harus diganti dengan~1+
.sumber
Ruby 87
89Tes online: http://ideone.com/pepeW2
Versi tidak disatukan:
sumber
Golfscript 48
49 50Mengharapkan string ada di tumpukan dan mengembalikan salah satu
0
atau1
.Anda dapat mencobanya secara online dengan tes untuk valid dan tidak valid ular.
Ini pada dasarnya ide yang sama seperti dalam jawaban Ruby saya . Array arah hanya ditangani secara berbeda, karena AFAIK Golfscript tidak memiliki fungsi putar arary. Dalam hal ini, saya membangun array arah yang cukup besar, dengan mengalikannya 10.000 kali dan kemudian memangkas dari elemen awal 0, 1, atau 3, tergantung pada perintah saat ini (S, R, atau L). "Arahan" saat ini untuk pindah selalu menjadi item pertama dalam array.
Ini dia dengan komentar:
Edit:
Disimpan 1 char dengan memodifikasi bagaimana array "arah" dikonsumsi.
Edit:
menghemat 1 char dengan memindahkan selisih 10 bukannya 1 untuk memanfaatkan
?
sintaks (daya).sumber