pengantar
Setelah seharian minum dan menonton piala dunia, Anda duduk untuk bermain game ramah boggle. Kemarahan meningkat ketika Anda dituduh membuang waktu semua orang dengan kata-kata yang tidak masuk akal yang bahkan tidak ada di papan tulis! Anda mungkin melihat ganda, tetapi pasti Anda berpikir jernih untuk menulis sebuah program yang akan memverifikasi bahwa kata-kata Anda ada di papan tulis.
Tugas Anda
Tulis program, skrip, atau fungsi yang menggunakan papan ganti dan kata sebagai input, dan mengembalikan True jika kata itu ada di papan tulis dan Salah jika kata itu tidak ada.
Input akan berupa enam \n
baris terbatas. Lima baris pertama akan terdiri dari papan boggle 5x5 dan masing-masing akan berisi lima huruf kapital. Baris keenam akan berisi kata-dalam-pertanyaan, juga dalam semua huruf kapital.
Masukan sampel:
AJNES
TNFTR
LSAIL
UDNEX
EQGMM
DAFTER
Outputnya bisa berupa apa saja yang secara jelas menandakan Benar atau Salah dalam bahasa pemrograman pilihan Anda dan mematuhi konvensi standar nol, nol, dan kosong yang menandakan False.
Contoh output untuk input di atas:
1
Pedoman I / O
- Input dapat dibaca dari stdin, dan jawab output ke stdout.
Atau
- Input mungkin berupa argumen string tunggal ke suatu fungsi, dan jawabannya adalah nilai balik dari fungsi itu.
Aturan Pertarungan
- Sebuah kata 'on the board' jika Anda dapat membuat kata melalui jalur ubin yang berturut-turut, berdekatan, dan tidak berulang di papan tulis.
- Ubin dianggap berdekatan dengan delapan ubin yang mengelilinginya (jalur diagonal diizinkan). Ubin di tepi papan berdekatan dengan hanya lima ubin. Ubin di sudut berdekatan dengan hanya tiga.
- Huruf berurutan dalam kata harus bersebelahan,
i
huruf ke dalam kata harus bersebelahan dengan hurufi-1
th dani+1
th. - Sebuah huruf mungkin muncul dalam sebuah kata lebih dari satu kali, tetapi Anda tidak dapat menggunakan kotak yang sama pada papan boggle lebih dari sekali per kata.
- Situs boggle online wordsplay.net mungkin berguna jika Anda belum pernah bermain boggle sebelumnya, tetapi ingin merasakan aturan ini.
Tidak seperti boggle biasa:
- Anda TIDAK perlu khawatir tentang kata yang menjadi kata bahasa Inggris yang valid.
- Tidak akan ada
Qu
ubin tunggal. - Kata-dalam-pertanyaan bisa panjang> 0
Contoh
Di papan tulis
AJNES
TNFTR
LSAIL
UDNEX
EQGMM
Kata-kata ini harus mengembalikan True: FATE, DATING, STANDS, LIFTS.
Kata-kata ini seharusnya menghasilkan False: SADDEN, SULTANS, EXIST, SUEDE, QUEST
Ini adalah tantangan kode-golf, jadi kode terpendek menang!
Jawaban:
GolfScript, 74 karakter
Masukan harus diberikan pada STDIN. Mencetak jumlah jalur yang valid di papan tulis, yaitu
0
untuk tidak ada dan angka positif (benar) lain.Anda dapat menguji contoh secara online .
Kode dengan beberapa komentar:
sumber
Javascript (E6) 137
160 175 190Kurang dari 2 * Golfscript. Kemenangan moral ...
Edit reorganisasi kode golf. Lagi dan lagi
Ungolfed Versi terakhir, agak sulit untuk diikuti
Versi Ungolfed First, harus lebih jelas
Pemakaian
Uji
Keluaran:
sumber
F=a=>(b=a.split('\n'),w=b.pop(Q=(p,n)=>((R|=!w[n])||(b[p]=0)||[1,5,6,7,-1,-5,-6,-7].map(q=>b[q+=p]==w[n]&&Q(q,n+1,b[q]=w[n])))),[Q(~~p,1)for(p in b=[...b.join(R=0)])if(b[p]==w[0])],R)
w = a.pop()
) atauw = b.pop()
(ungolfed, baris 2)? (mungkin yang terakhir, saya kira)a=a.pop()
bukannyab=a.pop()
...Python,
207 204203Mengganti
... (b[i]==w[0])*any ...
dengan... b[i]==w[0]and any ...
memberikan kinerja yang jauh lebih baik dengan biaya 2 karakter.sumber
0<=i<25and
J - 75 char
Eugh, yang ini terlihat jahat. Dan bahkan tidak mengikat dengan Golfscript! Ini adalah fungsi yang mengambil string sebagai satu-satunya argumen. Anda dapat menggunakan pembatas satu karakter apa saja selama ditemukan di akhir setiap baris, termasuk yang terakhir.
Penjelasan berikut. Perhatikan bahwa fungsi dapat dibagi menjadi 5 bagian tingkat atas yang berbeda, masing-masing dipisahkan oleh
@
, jadi kami akan memperlakukan masing-masing bagian secara terpisah, dari kanan ke kiri.(<;._2)
- Ini membagi garis pada baris baru / karakter pemisah. Ini menggunakan karakter di akhir string sebagai karakter yang akan dibagi. Kami memasukkan semuanya ke dalam kotak (<
) karena jika tidak, kami akan mendapatkan beberapa masalah padding ketika J mengembalikan hasilnya.(((<@#:i.)5 5)<@#~&,"2{:=/&:>}:)
- Untuk setiap huruf dalam kata yang akan diperiksa, buat daftar indeks di papan Boggle tempat seseorang dapat menemukan surat itu.{:
adalah bagian split terakhir (kata untuk memeriksa) dan}:
adalah segalanya tetapi yang terakhir (papan Boggle).&:>
membuka kotak yang kami buat sebelumnya, dengan produk sampingan yang berguna berubah}:
menjadi array karakter 2D.=/
kemudian buat salinan papan Boggle ini untuk setiap huruf dalam kata, dan ubah posisi menjadi boolean tergantung pada apakah huruf di papan cocok dengan huruf dalam kata.((<@#:i.)5 5)
adalah cara singkat untuk mengekspresikan array indeks 5x5.x#:y
dikonversiy
menjadi arrayx
representasi dasar . (Yah, hampir. Kebenarannya lebih kompleks, tetapi ini bekerja untuk tujuan kita.)<@#~&,"2
- Untuk matriks boolean yang dihasilkan setiap huruf, kumpulkan semua indeks yang sesuai yang benar bersama-sama."2
membuat semuanya bekerja pada hasil yang benar,#~&,
melakukan pemilihan, dan<@
mengumpulkan setiap hasil ke dalam kotak untuk mempersiapkan langkah selanjutnya.{
- Kata kerja ini, digunakan secara monadik, disebut Katalog, dan dibutuhkan daftar kotak sebagai argumen. Ini menggabungkan bagian dalam setiap kotak dengan segala cara yang mungkin. Jadi mis. Katalog pada beberapa kotak yang berisi string "AB" dan "abc" akan memberikan hasil "Aa", "Ab", "Ac", "Ba", "Bb", "Bc".Menjalankan ini pada daftar indeks kotak kami yang ada membuat setiap kemungkinan kombinasi indeks. Ini bisa menjadi set besar jika ada kata yang panjang dan ada banyak huruf yang diulang, tetapi juga kosong jika ada huruf yang tidak ada di papan tulis. Kami juga mencatat bahwa kami menggunakan kembali ubin di beberapa jalur ini: kami akan menjelaskannya nanti.
([:*/"1^:2(2(=*)@-/\>@~.)S:1)
- Di sini kita memeriksa setiap jalur untuk melihat apakah itu valid.(...)S:1
berlaku(...)
untuk setiap jalur dan mengumpulkan hasilnya ke daftar datar. Ini sangat penting karena hasilnya{
adalah array multi-dimensi, dan kami tidak peduli dengan struktur array itu, hanya isinya di setiap kotak.2(=*)@-/\>
memberikan 1 jika setiap koordinat dari setiap indeks paling banyak berjarak satu dari yang mengikutinya, dan 0 sebaliknya. The2
dan/\
yang bertanggung jawab untuk melakukan ini berpasangan.*/"1^:2
logis-ANDs ini semua bersama-sama di akhir. Itu[:
adalah hal struktural dalam J, jangan khawatir tentang hal itu.Menambahkan
@~.
ke>
sebenarnya adalah cara cerdas untuk mengecualikan jalur dengan entri berulang.~.
mengambil item unik dari daftar, jadi daftar ini dipersingkat jika berpotongan sendiri, dan daftar yang lebih pendek secara otomatis diisi dengan 0 ketika mereka disatukan, seperti cara hasilnya digabungkan saat keluarS:
. Ini pada akhirnya lebih pendek daripada secara eksplisit mengecualikan jalur berpotongan sendiri.+/
- Akhirnya, kita cukup menambahkan semuanya bersama di akhir. Hasilnya adalah jumlah jalur yang valid yang membuat kata di papan tulis, dengan 0 yang berarti tidak ada jalur, artinya kata ini tidak ada di papan tulis. Untuk biaya satu karakter, kita dapat menulis+./
(logis-ORing semuanya bersama-sama), yang secara eksplisit akan memberikan boolean 1 atau 0.Berikut ini beberapa contoh run. Anda bisa mendapatkan juru J di jsoftware.com atau mencobanya online di tryj.tk .
sumber
Prolog - 315
Saya pikir Prolog mungkin bahasa yang bagus untuk yang satu ini, dengan dukungan backtracking bawaan, tapi saya kira itu lebih cacat dengan membutuhkan variabel untuk hampir setiap nilai yang dihitung.
Diuji dengan GNU Prolog; harus sesuai dengan ISO Prolog.
Tidak Disatukan:
sumber