Minesweeper adalah permainan puzzle di mana ranjau tersembunyi di sekitar papan ubin yang tidak mencolok dengan tujuan mengidentifikasi lokasi semua ranjau. Mengklik ranjau kehilangan permainan, tetapi mengeklik ubin lain akan mengungkapkan angka dari 0-8 yang menandakan berapa banyak ranjau yang secara langsung mengelilinginya.
Diberi nomor, Anda harus menampilkan kemungkinan kombinasi * ubin dan tambang kosong di sekitarnya. Ini harus dalam bentuk array 3x3. Ubin tengah harus menjadi jumlah tambang yang diambil sebagai input.
* Harus memiliki peluang nol untuk semua kombinasi terjadi.
Contohnya
_ = blank square
X = mine
0
___
_0_
___
1
_X_
_1_
___
1
___
_1_
X__
___
_1_
__X
4
_X_
X4X
_X_
4
X_X
_4_
X_X
4
___
X4X
X_X
8
XXX
X8X
XXX
Memasukkan
- Jumlah tambang di sekitar ubin tengah (0-8)
Keluaran
- Segala bentuk output yang masuk akal yang menampilkan array ubin 3x3
Aturan lainnya
- Setiap kombinasi tidak harus memiliki peluang yang sama untuk terjadi. Harus ada peluang tidak nol dari setiap kombinasi untuk terjadi saat menjalankan program Anda.
- 2 karakter dapat dipilih untuk tambang dan ubin kosong.
- Ini adalah kode golf, program dengan kemenangan byte paling sedikit.
code-golf
random
minesweeper
aoemica
sumber
sumber
1
dan0
?Jawaban:
Jelly , 9 byte
Cobalah online!
kosong =
1
milikku =
0
Perhatikan itu
1
dan0
bilangan bulat.Catatan lain: ini agak mirip dengan jawaban 10-byte Jonathan Allan, tetapi itu tidak benar-benar dipengaruhi olehnya dengan cara apa pun, dan mekanismenya, jika Anda perhatikan dengan cermat, sebenarnya lebih berbeda dari pada pandangan pertama.
sumber
APL (Dyalog Unicode) ,
2815 byte-13 byte terima kasih kepada ngn!
Penjelasan:
{...}
Fungsi langsung (D-Fn),⍵
adalah argumen yang tepat.8?8
berikan 8 angka acak dari daftar 1..8:⍵≥
Apakah argumennya lebih besar atau sama dengan masing-masing ?:⍵,
tambahkan argumen ke daftar boolean:5⌽
putar daftar 5 posisi ke kiri, sehingga argumennya ada di tengah:3 3⍴
membentuk kembali daftar menjadi matriks 3x3:Cobalah online!
J , 15 byte
Juga banyak byte, terima kasih kepada ngn!
Cobalah online!
sumber
(8↑1⍴⍨⍵)[8?8]
->⍵>8?8
(dengan asumsi⎕io←0
)3 3⍴1↓,⍵,2 4⍴
->3 3⍴5⌽⍵,
JavaScript (ES6), 67 byte
Versi lebih pendek disarankan oleh @tsh
Slot kosong adalah
0
, ranjau1
.Cobalah online!
Versi coba-dan-kesalahan asli, 78 byte
Slot kosong adalah
_
, ranjau7
.Cobalah online!
Berkomentar
sumber
Jelly ,
1310 byteDaftar daftar yang dikembalikan memiliki bilangan bulat yang ditampilkan di tengah dikelilingi oleh 0s dan 1s masing-masing mewakili ranjau dan kosong.
Cobalah online!(footer cukup mencetak array)
Bagaimana?
sumber
ŒH
juga berfungsi sebagai penggantis4
.Pyth,
1614 byteDisimpan 2 byte berkat isaacg.
Menggunakan ruang untuk tempat yang aman dan kutipan untuk tambang.
Coba di sini
Penjelasan
sumber
.[d8
bukannya>8+*8d
Oracle 18 SQL, 230 byte
Bukan bahasa golf tapi ...
Nilai input dalam tabel
n
dengan kolomn
:Cobalah online - masuk https://livesql.oracle.com dan rekatkan ke lembar kerja.
Keluaran:
Untuk mendapatkan semua kemungkinan kombinasi (183 Bytes):
Keluaran:
sumber
Japt, 13 byte
Cobalah
Penjelasan
sumber
QBasic 1.1 ,
206186 bytes-20 Berkat DLosc (trik golf yang baru diposting).
Kosong =
0
Milikku =
1
Perhatikan itu
0
dan1
bilangan bulat, tapi saya tetap menggunakan STDOUT, jadi ...Output muncul seperti ini:
Di mana AH adalah 0/1 dan x adalah input.
sumber
Arang , 19 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penggunaan
0
untuk tambang,1
untuk ruang kosong. Penjelasan:Peek
mengembalikan array string, yangSum
hanya menyatukan, itulah sebabnya kita harus dilemparkan ke integer terlebih dahulu. (Sum(Sum(PeekAll()))
juga berfungsi.)Sum
mengembalikanNone
untuk array kosong (loop pertama), jadi satu-satunya perbandingan yang aman adalahNot(Equals(...))
.Random
selalu kembali0
, meskipun dokumentasinya mengatakan sebaliknya.Solusi alternatif, adalah 19 byte, sekarang 17 byte setelah perbaikan bug Charcoal:
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penggunaan
0
untuk tambang,1
untuk ruang kosong. Penjelasan:Cetak input asli.
Cetak
9
ke kiri. Ini memindahkan kursor kembali ke input asli, dan juga memaksa setidaknya satu iterasi dari loop sementara (jika tidak, input dari8
tidak akan melakukan apa-apa).Ulangi sementara perbedaan antara jumlah semua digit pada kanvas dan 8 adalah nol:
Ganti setiap karakter di sekitarnya secara acak dengan
0
atau1
.sumber
R ,
67 63 6259 byteCobalah online!
Penggunaan
1
dan0
. Bangunn* 1 +(8-n)* 0
vektor, kocok, tambahkann
,a...i
buat matriks yang lebih besar seperti di bawah ini (di mana berarti elemen-elemen dari vektor asli) dan ekstrak sub-matriks yang tepat seperti pada huruf besar:sumber
matrix((c(sample(rep(1:0,c(n<-scan(),8-n))),n))[c(1:4,9:5)],3)
Python 2 , 93 byte
Cobalah online!
0
untuk kosong;1
untuk tambang; dann
untuk diri sendiri.sumber
iter
cerdas!Attache , 51 byte
Cobalah online!
Penjelasan
Mirip dengan jawaban J / APL Galen , teknik dasarnya adalah menghasilkan array 1s dan 0s dengan jumlah tambang yang benar, memasukkan input dengan menambahkannya ke akhir, memutar array sedemikian rupa sehingga input terletak di tengah, lalu membentuk kembali menjadi matriks 3x3.
Bagian 1: menghasilkan array biner
Ada banyak cara untuk melakukan ini, tetapi saya terutama terjadi pada dua jenis: brute force dan seleksi.
Metode brute force primer terlihat seperti ini:
Ini menghasilkan array acak 8 digit biner (
Random[8&2]
) sementara jumlah mereka tidak sama dengan input{Sum@_/=_2}&_
. Ini agak bertele-tele, karena bagian-bagian kode yang ditekankan berikut ini ada "hanya untuk membuatnya bekerja":Dan saya membuang ide itu.
Seleksi lebih menarik. Konsep utamanya adalah menggunakan
BaseBelow[b, n]
builtin, yang menghasilkan daftar semua basis-b
integer lebarn
(sebagai digit array), dari0
hinggab^n-1
. Misalnya,BaseBelow[3, 2]
menghasilkan semua bilangan bulat ternary dengan lebar 2:Kami secara khusus menggunakan
BaseBelow[2, 8]
untuk semua bilangan bulat biner dengan lebar 8. Ini mewakili semua bidang ranjau yang mungkin dari semua panjang. Ini adalah langkah pertama.Langkah kedua adalah memilih semua array dengan hanya
N
1s, di manaN
inputnya. Ide pertama saya adalah menerjemahkan pernyataan bahasa Inggris ini langsung ke dalam Atase:Namun, ini tidak hanya menjadi 1 byte lebih lama dari pendekatan yang disebutkan sebelumnya, tetapi juga sangat berulang — dan bahkan belum diacak !. Tentu, saya mungkin bisa menghemat 1 byte dengan mengatur ulang caranya
BaseBelow
dipanggil, tetapi tidak layak menggunakan pendekatan tersebut.Jadi saya memutuskan untuk membunuh dua burung dengan satu batu dan menggunakan
Shuffle
pendekatan berbasis. Berikut ini memberikan semua panjang ranjau yang validN
dalam urutan acak:Kemudian, semua yang perlu dilakukan adalah memilih yang pertama. Tapi saya bisa melakukan yang lebih baik — tentunya akan lebih baik hanya
Sample
dengan array yang difilter? Pendekatan ini menjadi seperti ini:Saya harus mengembalikan
BaseBelow&8!2
golf karena\
prioritasnya terlalu tinggi. Kalau tidak puas, saya melanjutkan untuk memotong byte dari itu:(Saya menemukan cara lain untuk secara ringkas memanggil fungsi diad di sini:
x&f@y
adalah ekspresi prioritas tinggi yang dievaluasif[x, y]
.)Namun, meskipun ini, saya ingat bahwa, selama ini, alias untuk
2&BaseBelow
ada:BinBelow
. Jadi saya menggunakan itu:Ini menghasilkan ladang ranjau yang diinginkan. Saya yakin ini mendekati optimal.
Bagian 2: Membentuk array
Seperti yang dikatakan sebelumnya, teknik pembentukan yang saya gunakan mirip dengan jawaban J / APL, jadi saya tidak akan membahas terlalu banyak detail. Misalkan
MINEFIELD
adalah hasil dari bagian terakhir. Fungsi itu kemudian menjadi:MINEFIELD'_
menyatukan ladang ranjau dengan input asli_
, memberi kita sesuatu seperti ini:Kemudian,
Rotate[MINEFIELD'_,4]
putar daftar ini4
kali ke kiri, dengan menempatkan tengah:Langkah terakhir adalah menggunakan
[3,3]&
untuk membentuk kembali daftar menjadi matriks 3x3:sumber
Java 10,
165157141 byteUbin kosong adalah
_
(karakter apa pun dengan nilai unicode di atas 58 baik-baik saja) dan tambang adalah0
.Cobalah online.
Penjelasan:
sumber
PowerShell , 77 byte
Cobalah online!
sumber
PHP ,
135134123117122121 byteMelonggarkan str untuk mencetak bukannya menghemat 1 byte
str_split dan implode untuk memasukkan nomor pusat menghemat 11 byte
Tidak perlu menetapkan string ke $ s lagi menghemat 6 byteYa Anda lakukan. Kalau tidak, string dikocok setelah setiap gema ...
Menghapus spasi setelah gema menghemat 1 byte
Mengganti "\ n" dengan jeda baris ctual menghemat 1 byte
Cobalah online!
sumber
Alice , 24 byte
Cobalah online!
Slot kosong adalah
9
, dan ranjau0
.Saya juga membuat program 27-byte
1
untuk tambang dan0
slot kosong:Cobalah online!
sumber
PowerShell ,
9186 byte-5 byte berkat mazzy
Cobalah online!
Mengocok string yang dihasilkan mulai dari
________
keXXXXXXXX
(menggantikan dari kiri). Ini kemudian mengirisnya beberapa kali, memasukkan$n
di tengah, untuk membangun string output. Bagian terakhir ini mungkin dapat sangat dioptimalkan karena setiap indeks biaya minimal 5 byte.sumber
Ruby , 59 byte
Mengembalikan daftar string (satu untuk setiap baris).
Cobalah online!
sumber
C (gcc) , 81 byte
Cobalah online!
sumber
Perl 5
-pa
,105101 byteCobalah online!
sumber
05AB1E , 12 byte
Penggunaan
0
untuk tambang, ruang untuk kotak kosong. Menghasilkan daftar garis, yang cukup dicetak dalam TIO di bawah ini dengan bergabung dengan pembatas baris baru (»
).Cobalah secara online atau verifikasi beberapa kasus uji sekaligus .
Penjelasan:
12 byte alternatif:
Penggunaan
1
untuk tambang,0
untuk kotak kosong. Menghasilkan matriks digit, yang cukup dicetak dalam TIO di bawah ini dengan menggabungkan setiap baris, dan kemudian baris ini dengan pembatas baris baru (J»
).Cobalah secara online atauverifikasi beberapa kasus uji sekaligus .
Penjelasan:
sumber