Tujuan Anda adalah untuk memeriksa apakah papan Minesweeper yang lengkap valid Ini berarti bahwa setiap angka adalah jumlah yang benar dari ranjau dalam sel yang berdekatan dengannya, termasuk diagonal. Papan tidak membungkus.
Seperti biasa , Anda harus memberikan fungsi atau program, dan kode terpendek dalam byte menang.
Lihat juga tantangan masa lalu untuk menghasilkan , memecahkan , dan sepenuhnya mengimplementasikan Minesweeper.
Memasukkan:
Sebuah string tunggal seperti ini: 02X2 13X2 X211
.
Barisan papan kapal penyapu ranjau diberikan dipisahkan oleh spasi. Jadi, yang di atas mewakili papan 3x4:
02X2
13X2
X211
Setiap sel adalah karakter:
X
untuk tambang, atau nomor yang0
melalui8
.Semua baris memiliki panjang yang sama.
Setidaknya ada 3 baris dan 3 kolom.
Input tidak memulai atau mengakhiri dengan spasi, tetapi Anda dapat memasukkan baris baru di akhir jika Anda mau.
Keluaran:
Kebenaran yang konsisten pada papan yang benar, dan nilai Falsey yang konsisten pada papan yang salah. Konsisten berarti bahwa semua keluaran Kebenaran adalah sama dan semua keluaran Falsey adalah sama.
Uji kasus
Setiap baris adalah test case yang terpisah.
True
:
02X2 13X2 X211
XXXX XXXX XXXX XXXX
XX4X2 5X6X4 XX6XX 4XX54 2X4XX
False
:
02X2 13X2 X212
XXXX XXXX X7XX XXXX
XX5X2 5X6X4 XX6XX 4XX54 2X5XX
sumber
Jawaban:
Python 2,
132 129128Saya menggunakan
enumerate
golf ... dan bahkan digunakanrange
di tempat lain dalam program yang sama. Jelas ada yang salah di sini.Sunting: Iterate over
dict(enumerate(s))
alih-alihenumerate(s)
, jadienumerate
tidak perlu dipanggil dua kali.sumber
~
! Dan kamus membuat pengindeksan di luar batas berfungsi dengan baik.~
operator ironisnya membuat saya memperhatikan bahwa saya menggunakannya dua kali tanpa alasan sama sekali, di mana menggunakannya hanya sekali jelas akan mencapai hal yang sama. Saya pikir bagian kamusnya lucu, terima kasih.Pyth, 43
Coba di sini .
Penjelasan:
Jhxzd
: Ini adalah lokasi ruang pertama di input + 1. (z
di input,d
adalah spasi.) Ini adalah pemisahan di antara sel-sel yang berdekatan secara vertikal di papan tulis.!f
: Ini adalah bukan logis (!
) dari filter (f
), yang akan menjadiTrue
jika dan hanya jika ekspresi itu palsu untuk setiap elemen dari urutan.-@zT
: Ambil karakter di lokasiT
(variabel lambda) dari input, dan hapus tampilan apa pun dari: (Ini akan menjadi kebenaran jika karakter tidak dihapus, dan salah jika itu.+" X"
: Hapus spasi, X, dan`
: Repr darism
: jumlah peta ke/ \X
: hitungan "X" di:+*JNz
: Sepotong input diawali olehJ
karakter dummytd+d2
: Dari d-1 ke d + 2.m+T*kJU3
: Untuk d di [T, T + J, T + 2 * J].Uz
Untuk T inrange(len(input))
.sumber
APL (NARS2000) (74)
Juga berfungsi di Dyalog APL jika
⎕ML
diatur ke3
.Penjelasan:
⊃⍵⊂⍨⍵≠' '
: split⍵
pada spasi dan gunakan daftar untuk membentuk matriks.G←¯1+⎕D⍳
: temukan indeks⎕D
untuk setiap nilai, kurangi 1, dan simpan dalamG
. (⎕D
berisi digit, non-digit apa pun akan berubah menjadi10
).Z←G↑⍨2+⍴G
: tambahkan dua baris dan kolom nol di tepi matriks, untuk menangani sampulnya{
...}¨⍳⍴Z
: untuk setiap posisi diZ
, cari jumlah bom di lingkungan Moore dari posisi itu:G∘.⊖(G←2-⍳3)∘.⌽⊂Z
: putar keZ
kiri, kanan, atas, bawah, kiri-atas, kanan-atas, kiri-bawah, dan kanan-bawah.⍵∘⌷¨
: untuk masing-masing ini, temukan elemen di⍵
dalam masing-masing matriks yang diputar ini+/∊9<
: hitung berapa banyak elemen lebih tinggi dari 9 (ini adalah jumlah bom).(⍴G)↑
: hapus garis nol yang ditambahkan lagi,G=
: periksa apakah setiap elemen dalamG
sama dengan jumlah bom di sekitar posisi itu (ini harus berlaku untuk semua kotak non-bom),(G>9)∨
: dan periksa apakah unsur-unsur diG
lebih tinggi dari9
(ini adalah bom).~0∊
: kembali1
jika matriks yang dihasilkan tidak mengandung nol (= semua kotak adalah bom atau angka yang benar), dan0
jika ada.sumber
C #,
321 320305Upaya pertama bermain golf apa pun, dan saya tahu bahwa C # bukan bahasa yang ideal.
Saya harap menulis contoh metode diperbolehkan, jika tidak tambahkan 7 karakter untuk
static
.Melamun:
Menggunakan Linq menghemat ruang dibandingkan dengan untuk loop, tetapi lebih sulit untuk debug.
Saya belajar beberapa hal seperti mengubah
char => int
dengan mengurangi'0'
.Tampaknya lebih mudah untuk membuat papan dengan spasi sehingga iterasi lebih mudah.
sumber
-'0'
dengan-48
. Bekerja untuk saya dan menyimpan beberapa byte untuk berbagai 'X' dan ''Python 2, 121
Ini sangat terinspirasi oleh jawaban feersum . Urutan hari ini berlebihan: daripada memeriksa ranjau di 9 tetangga sel, periksa setiap sel untuk melihat apakah itu ranjau tetangga.
Kami memeriksa apakah dua sel bertetangga dengan
2>r>-2<c<2
, di manar
danc
apakah perbedaan baris dan kolom sel, setara dengan{r,c}<{-1,0,1}
. Koordinat ini dihitung dari indeks selI
dani
sebagaic=I%n-i%n
danr=I/n-i/n
. Lebih efisien untuk mengindeks langsung ke string dan mengekstrak baris dan kolom daripada mengubahnya menjadi objek 2D seperti daftar daftar. Cek tambang adalahB[i]>'W'
, setara dengan di sini untukB[i]=='X'
.Menggunakan
enumerate
akan menyimpan dua karakter di atas jelekrange(len(B))
kecuali bahwa itu mengembalikan objek iterator yang tidak mendukung dua loop bersarang melewatinya.sumber
~B.find
./
karena putaran negatif juga.Python 2, 140
sumber
JavaScript (ES6),
135133125122Berikan input ke fungsi sebagai string:
Untuk penjelasan, lihat versi lama, di bawah ini. Versi baru menggantikan
for
loop denganevery
panggilan, dan menggunakan variabele="every"
untuk melakukansomeArray[e](...)
alih - alihsomeArray.every(...)
.Juga, penghitung
k
sekarang diindeks1
sehinggak+=...
ekspresi selalu benar, agarevery
loop tetap berjalan. Kami menghilangkan ekstra itu1
dengan mengurangitrue
hasil (yang secara numerik memaksa1
) dikembalikan olehevery
operasi[-1,0,k=1][e](...)
.Versi lama:
Kode dengan spasi dan komentar:
every
Metode array JavaScript mengambil panggilan balik dan menerapkan panggilan balik ke setiap elemen array. Jika ada panggilan balik mengembalikan nilai kesalahan,every
panggilan kembalifalse
.Boolean di JS dipaksa ke 1 atau 0 saat bagian dari tambahan. Untuk setiap ruang di sekitarnya, kami "menambahkan" hasil boolean dari membandingkan nilainya dengan
X
lalu menambahkan nilai itu ke penghitungk
dalam ekspresik += (... == "X")
. Oleh karena itu,k
berisi hitungan jumlah sekitarnyaX
, karenatrue
dianggap sebagai1
danfalse
dihitung sebagai0
.sumber
c=="X"
mencoba!c/1
, yang menghemat sejumlah besar byte rejan! Jika gagal, coba!!c/1
. Alasannya adalah itu'X'/1 => NaN
, danNaN
itu palsu. Anda memeriksa jikac=='X'
, mengapa tidak mencoba memeriksa jika tidakfalse
?(!c)/1
, yang tidak membantu, sayangnya; Saya perlu memiliki tanda kurung untuk!(c/1)
, yang biayanya 2. Juga,0/1
adalah falsey, jadi input yang salah "0X
" akan memiliki hasil yang salahtrue
. Yang terbaik yang bisa saya lakukan sambil tetap menghargai nol adalah menggabungkan dua kondisi menjadi frase yang dinegasikan, seperti!(+c+1&&k-c)
, tapi itu sama panjangnya dengan apa yang sudah saya miliki.!(k-1-c)
menguji kedua kondisi, karena jikak
cocokc
(minus 1 offset), maka negasi membuat0
kebenaran, dan jikac
bukan angka, kita dapatkanNaN
dan negasi jugatrue
.CJam,
70 6563 byteIni bisa bermain golf banyak.
Memberi
1
untuk papan yang valid dan0
untuk papan yang tidak valid.Uji kasus
Memasukkan
Keluaran
Cobalah online di sini
sumber
JavaScript (ES6) 98
Menggunakan beberapa untuk menerapkan fungsi ke setiap karakter string.
Fungsi kembali
The inner cek dibuat menggunakan peta hanya karena itu lebih pendek dari forEach
beberapa mengembalikan true pada nilai kebenaran pertama (dalam hal ini, bukan nol) yang berarti cek gagal. Hasilnya dinegasikan untuk memberikan benar / salah yang lebih dikenali.
Uji di konsol FireFox / FireBug
Keluaran
sumber
R, 156 karakter
Dengan indentasi, spasi dan pemisah baris, untuk keterbacaan:
Contoh:
sumber