Minesweeper adalah permainan puzzle yang populer di mana Anda harus menemukan ubin mana yang merupakan "ranjau" tanpa mengklik ubin itu. Setiap ubin adalah tambang (diwakili oleh *
) atau petunjuk, yaitu angka dari 0 hingga 8 yang mewakili berapa banyak dari 8 ubin tetangga yang merupakan tambang. Tugas Anda hari ini adalah mengambil papan berisi ranjau dan mengisi semua petunjuk. Misalnya, lihat papan 5x4 berikut, dengan 5 tambang:
*
* *
*
*
Setelah mengisi petunjuk, papan akan terlihat seperti ini:
2*211
*33*1
12*32
0112*
Detail
Anda harus menulis program lengkap atau fungsi yang menggunakan kisi-kisi karakter yang hanya berisi spasi dan tanda bintang dan menampilkan kotak lain di mana setiap ruang diganti dengan jumlah tambang yang berdekatan (tanda bintang). Semua ini adalah format yang dapat diterima untuk kisi Anda:
Sebuah string dengan baris baru di dalamnya
Daftar karakter 2D / string karakter tunggal
Daftar string
Anda dapat menganggap kisi-kisi tersebut setidaknya 1x1, meskipun dimungkinkan untuk menjadi semua tambang atau semua ruang.
Kotak input akan selalu diisi dengan jumlah ruang yang sesuai. Seperti biasa, ini adalah kode-golf , sehingga celah standar berlaku dan jawaban terpendek dalam byte menang!
Contoh IO
Agar Anda bisa melihat spasi, saya akan menunjukkan semua sampel IO dengan tanda kurung di sekitarnya.
Input:
[ * ]
[* ]
[ ]
[ ]
[ ** ]
[ * * ]
Output:
[1101*1]
[*10111]
[110000]
[012210]
[12**21]
[1*33*1]
Input:
[****]
[****]
Output:
[****]
[****]
Input:
[ ]
[ ]
[ ]
[ ]
Output:
[000]
[000]
[000]
[000]
Input:
[* ]
[** ]
[ ]
[ *]
Ouput:
[*310]
[**10]
[2221]
[001*]
Input:
[** ]
[* *]
[ * ]
[ ]
[* ]
[**** ]
Output:
[**1011]
[*4211*]
[12*111]
[121100]
[*43210]
[****10]
Input:
[ * ]
[ * ]
[ * ]
[** *** ]
[ *** ]
[ ]
[ ** ]
[ * * ]
[* ** ]
[ ** ]
Output:
[00001*1111]
[00002221*1]
[22102*4321]
[**102***31]
[221013***1]
[0000013542]
[0112111**1]
[12*2*12442]
[*212112**2]
[1100002**2]
sumber
Jawaban:
MATL ,
1817 byteTerima kasih kepada @ mbomb007 untuk koreksi pada input test case 6
Input adalah array char 2D, dalam format
Cobalah online!
Uji kasus: 1 , 2 , 3 , 4 , 5 , 6 .
Penjelasan
sumber
JavaScript (ES6),
11496 byteSunting: Disimpan 18 byte berkat sebuah ide oleh @ETHproductions.
sumber
a=>a.map((s,i)=>s.replace(/ /g,(_,j)=>a.slice(i-!!i,i+2).reduce((t,s)=>t+(q=i=>s[i+j]>' ')(-1)+q(0)+q(1),0)))
R,
127112 byteterima kasih kepada @gtwebb dan @ sebastian-c untuk peningkatan.
Poin penting:
Matriks adalah vektor dalam R. Anda tidak perlu pengindeksan 2-D untuk mengeluarkan elemen.
seq(M)
akan mengembalikan urutan "panjang" yang sama (baris x kolom) sebagaiM
.Anda tidak dapat mencampur indeks ekstraksi positif dan negatif dalam R.
M[-3]
adalah kode R yang sah, tetapi bukan yang diinginkan.Input dalam bentuk matriks R. Beberapa contoh:
sumber
T
alih-alihTRUE
. Saya berhasil menggeser beberapa kawat gigi dari salah satu fungsi if juga:f=function(M){a=nrow(M);b=ncol(M);for(i in seq(M))if(M[i]!="*")M[i]=sum(M[pmax(i+c(-1,1,-a+-1:1,a+-1:1),0)]=="*",na.rm=T);M}
b=ncol(M)
dan kemudian tidak menggunakannya sehingga Anda bisa menyingkirkan itu.M->{a=nrow(M);p=M=='*';M[]=ifelse(p,'*',sapply(seq(M),i->sum(p[pmax(i+c(-1,1,-a+-1:1,a+-1:1),0)],na.rm=T)))}
- namun, ini sedikit curang karena memerlukan<-
lambda yang telah didefinisikan ulang , lihat klmr / fungsional / lambdaJava, 190 byte
Sunting:
Snipet
Tidak Disatukan:
Ide itu.
sumber
x,y,i,j
c[i][j]==32
dan seterusnya dan baru saja mengubahnya di bagian Ungolfed0000*1\n*10011\n110000\n000000\n00**10\n0*22*1
. Bisakah Anda menambahkan tautan tes ideone.com? SUNTING: Juga, kecuali saya sendiri melakukan kesalahan, output kode golf Anda:ssss0s\n0sssss\nssssss\nssssss\nss00ss\ns0ss0s
untuk test case pertama (sudah diganti semua*
dengan nol ..): SJavaScript (ES6), 107
Input / output sebagai array string
perhatikan ketika fungsi s dipanggil dengan elemen daftar l di luar batas, parameternya
a
adalahundefined
danc+a
akan menghasilkan" undefined"
berkat aturan konversi unik dari javascriptLebih mudah dibaca
sumber
Python 2, 138 byte
Menentukan fungsi
f
yang menerima string input sepertidan mencetak string ke STDOUT:
sumber
enumerate(s,2)
), dan ganti semua kemunculani + 2
dengani
dani - 1
dengani - 3
. Itu akan memangkas beberapa byte.JavaScript (ES6)
186182177161152 byteMemperbarui
Kode di atas untuk
" *"
pengembalian"2*"
. Ini diperbaiki dalam skrip berikut.168167 byteCoba di sini.
sumber
t+=(a[x+i%3-1]||[])[y+i/3-1|0]==k
harus bekerja dengan cara yang sama dan menyelamatkan Andatry
/catch
bagian.(a[x+i%3-1]||1)[y+i/3-1|0]
.Haskell, 115 byte
Menentukan fungsi
f
pada daftar stringsumber
Python 2, 192 byte
-3 byte berkat Tembaga, -10 byte jika memodifikasi input grid diperbolehkan, lain -11 byte dengan menghilangkan
continue
dan -12 byte untuk menghilangkan variabel counterMenggunakan daftar daftar karakter
L
dan membuat versi empukK
, jadi tidak ada masalah di batas. Lekukan adalahPemakaian:
sumber
if'*'==L[y][x]:
untuk menyimpan byte.r=range;
pada baris yang sama dengann,S,s
, Anda dapat menyimpan lima karakter dengan mengganti panggilanrange(...)
denganr(...)
.ange
jadi 8 byte, tetapi saya harus menambahkan,r
dan,range
yang juga 8 byte sehingga tidak ada yang didapat.range
.Ruby, 112
Mengambil dan mengembalikan string. String harus dipisahkan baris dan baris dihentikan.
dalam program uji
sumber
TSQL
292291 byteGolf:
Tidak Disatukan:
Biola
sumber
;
di bagian depan kode Anda? Tampaknya Anda telah menghitungnya.Racket 415 byte
Tidak Disatukan:
Pengujian (daftar sebagai string tunggal dengan nomor kolom yang ditentukan; juga akan bekerja dengan spasi):
Keluaran:
sumber
PHP,
145133132127 bytemengambil input sebagai string tunggal, dipisahkan oleh baris baru. Jalankan dengan
-r
.kerusakan
sumber
"!">$n=$s[$p]
bukannya" "==$n=$s[$p]
menyimpan satu ByteTurtlèd , 99 byte
(ups aku selalu lupa tautannya: |)
Mengambil input dengan tanda kurung di sekitar setiap baris
Turtlèd tidak dapat mengambil input multi-baris, jadi setelah baris terakhir, tulis
|
ke ujung inputPerhatikan tanda kurung yang tidak cocok adalah karena tanda kurung terbuka menguraikan karakter berikutnya sebagai bagian dari perintah braket
Cobalah online!
Cara kerjanya (deskripsi umum):
Sampai
|
dimasukkan, ia menulis input pada setiap baris, dengan tanda kurung untuk membantu mengenali ujung setiap baris. Setelah itu terjadi, ia kembali ke atas input. Ini melewati setiap karakter dalam input. Jika itu adalah ruang, itu akan terlihat di sekitar ruang, menambahkan satu ke konter untuk setiap bom yang ditemukannya. setelah setiap baris, itu menghapus tanda kurung. Ketika sampai ke baris terakhir, dengan | di dalamnya, ia berhenti, dan menghapus |. kisi-kisi dicetak secara implisit.sumber
C,
152150147145 byteInput dalam bentuk array karakter dua dimensi, diikuti oleh jumlah baris dan kolom. Hasilnya akan dikembalikan di tempat.
(Sebagian besar) Tidak Disatukan:
Pendekatannya lurus ke depan - lilitkan setiap posisi, lilitkan tetangganya, dan tambahkan semua tanda bintang. Ada dua trik tingkat bit:
Ketika kami memutuskan apakah sebuah sel adalah tanda bintang atau tidak, kami hanya dapat memeriksa apakah bit tempat-delapan diatur, karena jumlah di dalam sel harus kurang dari 8 (nilai sel maksimum).
Kita dapat mengubah karakter spasi menjadi karakter nol dengan OR-ing 16.
Sunting: Memotong dua byte dengan menggunakan
/
menggantikan>=
.Sunting: Lima byte lagi dengan membalik arah loop.
sumber
C #, 341 Bytes
Implementasi naif yang pasti dapat dipersingkat.
sumber
Python 2, 183 byte
sumber