Minesweeper sedang bekerja

18

Semua orang tahu game kapal penyapu ranjau tua yang dikirimkan dengan Windows XP. Ini adalah kotak sederhana dengan matriks sel 9x9 yang berisi angka (menunjukkan berapa banyak ranjau yang berdekatan) atau tambang.

masukkan deskripsi gambar di sini

Tantangannya adalah untuk menghasilkan grid 9x9 acak dengan 10 bom yang diberikan seed integer (hingga int mesin / bahasa terbesar Anda) dengan poin brownies jika Anda menerapkan PRNG sendiri

contoh output: sel berisi angka 0-8 atau * untuk tambang

*101*1000
110111000
123210000
1***10000
123210011
00000002*
00000114*
000112*3*
0001*2121

Kode terpendek dalam byte menang .. aturan standar dll, dll.

Harun
sumber
3
Anda harus menunjukkan apa artinya angka-angka :)
Nathan Merrill
4
Microsoft Minesweeper adalah permainan yang jauh lebih tua dari XP dan permainan seperti kapal penyapu ranjau kembali ke setidaknya 60-an.
AdmBorkBork
11
Juga, saya tidak punya waktu untuk bermain Minesweeper saat bekerja - saya terlalu sibuk di PPCG. ;-)
AdmBorkBork
1
Apa yang dianggap sebagai PRNG, tepatnya? Berapa banyak konfigurasi yang berbeda yang harus dapat dihasilkan? Bisakah kita tidak menggunakan seed dan hanya menghasilkan konfigurasi yang berbeda setiap kali, jika bahasa kita memiliki PRNG yang secara otomatis diinisialisasi ke seed "acak"?
Luis Mendo
1
@TimmyD Tapi versi XP adalah versi pertama yang memiliki kisi 9x9. Apa pun yang lebih lama menggunakan kisi 8x8 untuk Pemula. #outnerded;)
mbomb007

Jawaban:

3

Dyalog APL, 40 byte

⎕rl←1⋄(1,¨a)⍕¨{⍉3+/0,⍵,0}⍣2⊢a←9 9⍴9≥?⍨81

(mengasumsikan ⎕io←0)

yang 1di ⎕rl←1adalah benih

dari kanan ke kiri:

?⍨81sama dengan 81?81- permutasi acak

9≥ menghasilkan bitmask yang mengandung sepuluh 1s pada posisi acak, sisanya adalah 0s

a←9 9⍴ membentuk kembali ke kotak 9-oleh-9 dan menyebutnya "a"

{ }⍣2 lakukan hal berikut dua kali:

⍉3+/0,⍵,0 jumlah jendela geser 3 kolom (asumsikan 0s di luar), lalu transpos

(1,¨a)⍕¨adalah format (konversikan ke string) masing-masing. Argumen kiri untuk menentukan jumlah karakter dan karakter fraksional dalam hasil. Jika tidak dapat memformat sesuai dengan spesifikasi itu output a *- kebetulan beruntung untuk masalah ini. aakan menjadi 1 di mana ranjau sedang - mencoba memasukkan bagian utuh dan fraksional menjadi arang tunggal tidak mungkin, sehingga akan muncul sebagai *s.

ngn
sumber
Bisakah Anda menjelaskan ⎕io←0asumsi itu? Saya tidak terbiasa dengan Dyalog APL ...
Aaron
1
Indeks array di Dyalog berbasis 1 secara default. Pengaturan ⎕io(" Indeks Asal ") ke 0 menjadikannya berbasis 0 dan mengubah beberapa primitif sesuai, misalnya ⍳3akan 0 1 2, tidak 1 2 3. Itu bisa dilakukan secara terprogram ( ⎕io←0) atau dari preferensi di GUI. Memiliki pilihan ini adalah kesalahan 50 tahun yang masih membelah komunitas APL kecil saat ini.
ngn
5

MATLAB, 94 93 byte

rng(input(''));x(9,9)=~1;x(randperm(81,10))=1;y=[conv2(+x,ones(3),'s')+48 ''];y(x)=42;disp(y)

Contoh run (baris pertama setelah kode adalah input yang diketik oleh pengguna):

>> rng(input(''));x(9,9)=~1;x(randperm(81,10))=1;y=[conv2(+x,ones(3),'s')+48 ''];y(x)=42;disp(y)
99
*10001*2*
220001232
*201111*1
*312*1111
12*211000
011211000
0001*1000
000112110
000001*10

Penjelasan

rng(input(''));

mengambil bilangan bulat dan menggunakannya sebagai benih. (Ini berfungsi dalam versi MATLAB modern. Versi lama mungkin memerlukan sintaks yang berbeda.)

x(9,9)=~1;

menugaskan logis 0, atau false(diperoleh dengan meniadakan secara logis 1) ke entri (9,9)matriks x. Sisa dari entri secara otomatis diinisialisasi ke logis 0juga.

x(randperm(81,10))=1; 

menugaskan 1(secara otomatis dilemparkan ke logis 1, atau true) untuk 10dari 81entri x, dipilih secara acak tanpa penggantian. Entri-entri ini adalah yang mengandung bom.

conv2(+x,ones(3),'s')

adalah singkatan dari conv2(+x,ones(3),'same'). Ini menggabungkan matriks x(yang perlu dilemparkan ke double, menggunakan +) dengan lingkungan 3 × 3 yang berisi 1. Ini menghitung berapa banyak bom yang berdekatan dengan setiap entri. Untuk entri yang berisi bom itu termasuk bom itu, tetapi nilainya di sana akan ditimpa nanti.

y=[...+48 ''];

menambahkan 48 ke nilai, untuk mengkonversi dari angka ke kode ASCII. Menggabungkan dengan matriks kosong melemparkan kode ASCII ini ke karakter.

y(x)=42;

menugaskan 42 (kode ASCII untuk '*') ke posisi bom. Posisi-posisi ini diberikan oleh x, yang di sini digunakan sebagai indeks logis.

disp(y)

menampilkan hasilnya.

Luis Mendo
sumber
4

Javascript (ES6), 204 atau 198 byte

PRNG Khusus (204 byte)

s=>(p=-1,S=n=>(x=p%9-(n+=p)%9)*x-64&&b[n]=='*',T=n=>S(n)+S(-n),b=[...'*00000000'.repeat(9)]).sort(_=>(s=(22695477*s+1)>>>0)&1||-1).map(c=>(p++,c=='0'?T(1)+T(8)+T(9)+T(10):c)).join``.match(/.{9}/g).join`
`

Kode ini menggunakan generator kongruensial linier dengan pengganda 22695477dan selisih 1(ini adalah implementasi Borland C / C ++).

Karena efisiensi PRNG yang buruk selama fase pemanasannya, saya harus meletakkan satu bom per baris (bukan 10 di awal atau 10 di akhir array yang tidak diacak). Jadi, hanya ada 9 bom. Saya mungkin mencoba memperbaikinya nanti.

Juga, harus ada cara yang lebih sederhana / lebih pendek untuk memproses cek 'out of board' (x=p%9-(n+=p)%9)*x-64tapi saya tidak bisa mengetahuinya sekarang.

Menggunakan Math.random () (198 byte)

s=>(p=-1,S=n=>(x=p%9-(n+=p)%9)*x-64&&b[n]=='*',T=n=>S(n)+S(-n),b=[...'**********'+'0'.repeat(71)]).sort(_=>Math.random()-.5).map(c=>(p++,c=='0'?T(1)+T(8)+T(9)+T(10):c)).join``.match(/.{9}/g).join`
`

Ini termasuk 10 tambang seperti yang diminta.

Demo

let f =
_=>(p=-1,S=n=>(x=p%9-(n+=p)%9)*x-64&&b[n]=='*',T=n=>S(n)+S(-n),b=[...'**********'+'0'.repeat(71)]).sort(_=>Math.random()-.5).map(c=>(p++,c=='0'?T(1)+T(8)+T(9)+T(10):c)).join``.match(/.{9}/g).join`
`
console.log(f())

Arnauld
sumber
'**********'+'0'sama dengan '**********'+0; yang menyimpan dua byte pada versi 198-byte.
Paul Schmitz
@ PaulSchmitz - Sayangnya ini '0'seharusnya diulang dan 0.repeat()tidak akan berhasil.
Arnauld
Ups, saya pikir itu akan dieksekusi seperti ...('**********'+0).repeat(71). Maaf.
Paul Schmitz
3

Python 2, 269 266 264 byte

from random import*
seed(input())
z=1,0,-1
n=range(9)
m=[[0]*9 for _ in n]
for x,y in sample([[x,y]for x in n for y in n],10):
 m[x][y]=-9
 for a in z:
  for b in z:
    if 0<=x+a<9>0<=y+b<9:m[x+a][y+b]+=1 # it gets displayed as 4 spaces, but the beginning of this line is a single tab
print("\n".join("".join([`c`,'*'][c<0]for c in l)for l in m))

Cobalah di ideone.com

Disimpan 2 byte berkat Aaron.

Kemungkinan besar masih bisa bermain golf.

Penjelasan

randomdiimpor untuk menggunakan seedseed PRNG dan samplememilih sepuluh lokasi bom secara acak. madalah matriks 9 x 9 yang menyimpan papan. Untuk masing-masing lokasi bom, entri terkait di mdisetel ke -9dan semua entri tetangga bertambah. Cara ini pada makhirnya berisi jumlah bom yang berdekatan untuk sel-sel non-bom dan angka negatif untuk sel-sel bom. Final printcetakan seluruh papan dengan iterasi melalui semua jalur ldi mdan semua sel cdi l.

LevitatingLion
sumber
Untuk apa sebenarnya 'acak' itu digunakan, tepatnya?
clismique
@ Qwerp-Derp mungkin untuk menabur generator angka acak yang secara tidak langsung digunakan olehsample()
Patrick Roberts
simpan 2 byte dengan mencampur indentasi tab di dalam for a in z:blok (hanya python 2.x)
Aaron
3

R, 187 Bytes

set.seed();x=1:121;y=x[!(x%%11 %in% 0:1|(x-1)%/%11 %in% c(0,10))];z=sample(y,10);x=x*0;for(t in z){p=t+c(-10:-12,-1,1,10:12);x[p]=x[p]+1};x[z]=9;m=data.frame(matrix(x[y],9));m[m==9]='*';m

Cobalah di Ideone

Penjelasan:

set.seed() ambil biji cst.

x adalah indeks untuk matriks 11 * 11

y adalah indeks dari matriks 9 * 9 dalam matriks 11 * 11

z adalah indeks bom

x=x*0 inisialisasi nilai matriks

Loop menambahkan 1 ke x dalam kasus bom yang berdekatan.

YCR
sumber
1
Saya pikir Anda harus mengambil argumen untuk set.seed () sebagai input.
BLT
2

JavaScript ES6, 244 byte

f=(a=[...Array(11)].map(_=>Array(11).fill(0)),n=10,r=_=>Math.random()*9|0,x=r(),y=r())=>a[x+1][y+1]>8||[0,1,2].map(i=>[0,1,2].map(j=>a[x+i][y+j]++),a[x+1][y+1]=9)&&--n?f(a,n):a.slice(1,-1).map(a=>a.slice(1,-1).map(n=>n<9?n:`*`).join``).join`
`
;o.textContent=f()
<pre id=o>

Neil
sumber
Anda mungkin ingin menguraikan bagian mana yang merupakan kode Anda.
NoOneIsHere
@NoOneIsHere 244 byte pertama, semoga ;-) Baris pertama harus 242 byte, kemudian ada baris baru dan `karakter.
Neil
1

Ruby , 181 194 183 +1 + 1 = 184 byte

Lupa benar-benar mengatur benih, wah. Menggunakan-n bendera.

Cobalah online!

srand$_.to_i
a=[0]*81
[*0..80].sample(10).map{|i|w=i%9;h=i/9;a[i]=-99
(r=-1..1).map{|x|x+=w
x<0||x>8?0:r.map{|y|y+=h
y<0||y>8?0:a[9*y+x]+=1}}}
puts a.map{|c|c<0??*:c}.join.scan /.{9}/
Nilai Tinta
sumber
0

Python 2 , 172 byte

from random import*
seed(input())
r=range
b=set(sample(r(81),10))
for j in r(9):print''.join([[`len({x-10,x-9,x-8,x-1,x+1,x+8,x+9,x+10}&b)`,'*'][x in b]for x in r(j,81,9)])

Cobalah online!

tsh
sumber