Latar Belakang
Dalam permainan Bejeweled dan sejenisnya, pemain harus menukar dua permata yang berdekatan (tidak ada diagonal) dalam kotak permata 8x8 untuk mencocokkan tiga warna yang sama secara berurutan. Permata dapat dicocokkan secara horizontal atau vertikal. Gameplay berlanjut sampai tidak ada gerakan yang dapat dibuat menghasilkan tiga berturut-turut, di mana permainan berakhir.
Tugas
Tujuannya adalah untuk menulis program yang menentukan apakah permainan Bejeweled belum berakhir. Dengan kata lain, itu harus memeriksa untuk melihat apakah ada langkah yang mungkin membuat setidaknya tiga berturut-turut. Mungkin ada lebih dari tiga permata berturut-turut dan itu masih merupakan langkah yang valid.
Memasukkan
Program Anda harus menerima melalui input standar representasi 8x8 dari grid Bejeweled. Masing-masing dari tujuh warna permata akan diwakili oleh digit dari 1 hingga 7. Setiap baris akan berisi satu baris, dan 8 baris, masing-masing terdiri dari 8 digit, akan dimasukkan. Lihat contohnya. Anda dapat mengasumsikan bahwa input akan selalu mengikuti format ini, dan tidak akan pernah mengandung tiga berturut-turut.
Keluaran
Program kemudian harus menampilkan (ke keluaran standar) yes
atau no
tergantung pada apakah ada atau tidak ada satu langkah yang valid yang akan menghasilkan tiga atau lebih permata berturut-turut. Program Anda tidak boleh mengeluarkan apa pun selain satu instance dari salah satu yes
atau no
.
Aturan
Program Anda tidak boleh menggunakan file eksternal atau sumber daya apa pun, argumen baris perintah, atau memerlukan nama file tertentu. Program dengan jumlah byte terkecil dalam kode sumbernya akan menang.
Contohnya
Memasukkan:
12314131
13224145
54762673
61716653
61341144
23453774
27645426
75575656
Keluaran: yes
Memasukkan:
35261546
76421754
15743271
62135642
35617653
64565476
54427254
15635465
Keluaran: no
Lihat jawaban MT0 di bawah ini untuk kasus uji tambahan.
Jawaban:
Solusi Asli: JavaScript -
261255228227179153 KarakterDengan asumsi bahwa string untuk menguji ada dalam variabel
s
(untuk membuatnya berfungsif
kemudian tambahkanf=s=>
ke awal kode atau, jika tidak, untuk mengambil input dari prompt lalu gantis
denganprompt()
).Outputnya ke konsol.
3 rd Solusi: JavaScript (ECMAScript 6) - 178 Karakter
Aku mengambil 2 nd solusi, di bawah ini, (yang menggunakan ekspresi reguler untuk memeriksa karakter dalam konfigurasi tertentu) dan ulang itu hanya memeriksa string untuk karakter identik dalam konfigurasi yang sama tanpa menggunakan ekspresi reguler.
String Base-36
"2313ab1b8a2a78188h9haj9j8iaiir9r"
memberikan pasangan offset untuk diperiksa - yaitu pasangan23
hasil di cek jika saya th karakter identik dengan (i + 2) th karakter dan (i + 3) th karakter (setara dengan ekspresi reguler(.).\1\1
- dengan beberapa pemeriksaan tambahan untuk memastikan bahwa karakter yang tidak identik bukanlah baris baru).2 nd Solusi: JavaScript (ECMAScript 6) - 204 Karakter
Buat beberapa ekspresi reguler (lihat di bawah untuk detail lebih lanjut) menggunakan pasangan nilai yang diambil dari string Base-18
10907160789879h8
dan lakukanOR
semua pengujian. Untuk menguranginya lebih lanjut, Anda dapat mencatat bahwa ekspresi reguler datang berpasangan di mana satu adalah "kebalikan" dari yang lain (mengabaikan Ekspresi Reguler untuk 3-in-a-line secara horizontal dan vertikal sebagai OP menyatakan mereka tidak akan pernah hadir - jika Anda ingin menambahkan tes-tes itu kembali ke append0088
ke string Base-18).Penjelasan
Mulai dengan 16 ekspresi reguler yang mencakup semua kemungkinan konfigurasi gerakan yang valid:
( Catatan: regex untuk 3-in-a-row secara horizontal (0 th ) dan vertikal (bagian dari 9 th ) tidak relevan karena OP menyatakan bahwa input yang cocok dengan input ini tidak akan pernah ada. )
Menguji masing-masing terhadap input akan menentukan apakah langkah yang valid dari konfigurasi itu dapat ditemukan.
Namun, ekspresi reguler dapat digabungkan untuk memberikan 6 ini:
Ini kemudian dapat digabungkan menjadi satu ekspresi reguler:
Yang hanya perlu diuji terhadap input.
Uji Kasus
Beberapa kasus uji yang mungkin berguna bagi orang lain (tidak sesuai dengan format input dengan hanya menggunakan angka 1-7 tapi itu mudah diperbaiki dan hanya berupa grid 8x4 - karena itu adalah persyaratan minimum untuk pengujian semua input yang valid ).
Dalam format peta dari string input yang mana dari 16 ekspresi reguler di atasnya yang cocok.
Edit 1
Ganti
\d
s dengan.
- menyimpan 6 karakter.Edit 2
Ganti
(?:.|\n)
dengan[\s\S]
dan hilangkan kelompok yang tidak menangkap tambahan dan perbarui kembali referensi (seperti yang disarankan oleh m-buettner ) dan tambahkan dalam output ya / tidak.Edit 3
Edit 4
Menambahkan solusi lain (lebih pendek) dan dua lagi test case yang tidak cocok.
Edit 5
Edit 6
sumber
?'yes':'no'
dalam jumlah karakter Anda untuk keadilan, karena itu dalam persyaratan dan semua orang menggunakannya..
cocok dengan karakter apa pun termasuk baris baru? Dengan Perl, regexp gabungan hanyalah 129 byte string (yang, karena malas, saya kompilasi dengan Regexp :: Assemble ), sehingga keseluruhan program Perl sekitar 150 byte..{8}|.{9}
dengan.{8,9}
dan.{7}|.{8}
dengan.{7,8}
Python 383
Hanya satu baris * * Python!
* Yah, dengan titik koma, tapi itu masih non-sepele dalam python (python one-liners menyenangkan! )
sumber
Node.js - Solusi naif - 905 byte
Yah, belum ada jawaban jadi saya akan memposting solusi yang benar-benar naif di Node.js
Itu melewati setiap gerakan yang mungkin dan kemudian menguji papan yang dihasilkan untuk melihat apakah ada 3 berturut-turut.
Golfed (dengan kompiler penutupan google) (beberapa hal hacky di sana seperti! 0 dan! 1; Saya bahkan tidak yakin apa yang dilakukannya dengan swap XOR saya)
Perhatikan bahwa saya menulis ini semua di ponsel saya dan tidak punya waktu untuk mengujinya atau apa pun. Komentari jika Anda melihat bug, saya akan memeriksanya sendiri nanti.
Versi dapat dibaca manusia pra-golf
sumber
Perl,
11496959392878685 byteTermasuk + untuk
-a0p
Jalankan dengan input pada STDIN:
bejeweled.pl
:Ini menggabungkan solusi regex horisontal arah tunggal dengan rotasi
Penjelasan:
Dalam solusi ini saya akan berulang kali memutar dan melakukan 4 tes berikut:
Di mana
\C
"karakter apa saja" (tidak seperti.
ini termasuk baris baru). Kecuali itu\C
sudah usang dan mengarah ke peringatan, jadi saya gunakan\H
(ruang non-horisontal) yang cukup baik untuk menangkap semua angka dan baris baru.Setelah 4 rotasi ini akan melakukan semua 16 tes yang diperlukan
sumber
Python3, 314B
Ubah 8, 5 pada saluran 6, dan 8 pada saluran 9 untuk menangani ukuran input besar yang sewenang-wenang; juga tidak peduli apa nilai masing-masing, sehingga Anda bisa memberinya makan:
dan itu akan kembali
yes
.Anotasi
sumber
GNU sed 255 + 2 = 257B
Saya pikir ini tidak akan sebagus python tetapi sekarang: - / Saya sudah tanpa akses internet hari ini jadi saya sibuk sendiri dengan menyelesaikan ini sed :). Perlu dipanggil dengan flag -r,
sed -rf command.sed < input
jadi saya menambahkan 2 pada skor saya.Bagaimana itu bekerja:
sumber
Ruby, 201 byte
Saya kecewa tidak melihat solusi untuk tantangan besar ini yang tidak menggunakan regex atau brute force (meskipun itu hebat), jadi saya menulis satu. Dibutuhkan input pada STDIN.
Algoritma aritmatika inti bitwise diturunkan dari jawaban fantastis ini pada Game Development Stack Exchange oleh @leander.
Ruby lambda, 181 byte
Ini dia sebagai lambda yang mengambil string dan kembali
true
ataufalse
:Lihat di repl.it: https://repl.it/ColJ/2
Tidak dikelompokkan & penjelasan
Kode ini berulang di atas angka "1" hingga "9." Setiap iterasi memiliki dua langkah terpisah:
Langkah pertama adalah transformasi papan, yang bisa Anda lihat di
s.scan(n)
blok dalam kode yang tidak ditandai. Ini mengubah papan menjadi array 8 bilangan bulat, satu untuk setiap baris, dengan memperlakukan angka yang cocok sebagai 1 dan semua yang lain sebagai 0 dalam string biner. Misalnya, ambil barisnya12231123
. Pada iterasi pertama, ini akan menjadi string biner10001100
(semua 1s menjadi — eh, tetap — 1s dan semua digit lainnya menjadi 0s), yang merupakan angka desimal 140. Pada iterasi kedua baris yang sama menjadi01100010
(semua 2s menjadi 2s dan semua digit lainnya menjadi 0s), atau desimal 98.Secara bersamaan melakukan transformasi kedua, yang sama dengan yang pertama tetapi dengan papan diputar 90 derajat. Ini memungkinkan kami menggunakan logika yang sama untuk membuat kecocokan horizontal dengan pencocokan vertikal. Untuk kesederhanaan, itu menggabungkan dua papan menjadi satu panjang dengan nol di awal, tengah (untuk memisahkan dua papan), dan ujung untuk bantalan.
Langkah kedua adalah mencari kemungkinan kecocokan, yang dapat Anda lihat di
each_cons(3).any?
blok. Baris yang diubah (yang sekarang bilangan bulat 8-bit) diperiksa dalam kelompok (tumpang tindih) yang terdiri dari tiga baris ( x , y , z ) menggunakan aritmatika bitwise. Setiap kelompok diperiksa untuk melihat apakah kecocokan dapat dilakukan dalam baris y , baik dengan menggeser sepotong demi sepotong y atau dengan memindahkan sepotong menjadi y dari x atau z . Karena tidak ada "baris" sebelum dan sesudah baris papan asli dan yang diputar, kita tidak perlu memeriksa apakah kita berada di baris pertama atau terakhir dari papan.Jika tidak ada kecocokan yang ditemukan, itu berlanjut ke iterasi berikutnya.
sumber