Minesweeper tại nơi làm việc


18

Mọi người đều biết trò chơi quét mìn cũ được phát hành cùng với Windows XP. Đó là một lưới đơn giản với ma trận các ô có kích thước 9x9 chứa một số (cho biết có bao nhiêu mỏ nằm cạnh nó) hoặc một mỏ.

nhập mô tả hình ảnh ở đây

Thách thức là tạo ra một lưới 9x9 ngẫu nhiên với 10 quả bom được cung cấp bất kỳ hạt giống số nguyên nào (tối đa cho dù int lớn nhất của máy / ngôn ngữ của bạn) với các điểm brownie nếu bạn tự thực hiện PRNG

đầu ra ví dụ: các ô chứa các chữ số 0-8 hoặc * cho các mỏ

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

Mã ngắn nhất trong byte thắng .. quy tắc chuẩn, v.v.


3
Bạn nên cho biết ý nghĩa của các con số :)
Nathan Merrill

4
Microsoft Minesweeper là một trò chơi cũ hơn rất nhiều so với XP và các trò chơi giống như người quét mìn có từ ít nhất là những năm 60.
admBorkBork

11
Ngoài ra, tôi không có thời gian để chơi Minesweeper khi làm việc - Tôi quá bận rộn với PPCG. ;-)
admBorkBork

1
Chính xác thì cái gì được tính là PRNG? Nó có thể tạo ra bao nhiêu cấu hình khác nhau? Chúng ta không thể sử dụng hạt giống và chỉ tạo một cấu hình khác nhau mỗi lần, nếu ngôn ngữ của chúng ta có PRNG được tự động khởi tạo thành hạt giống "ngẫu nhiên"?
Luis Mendo

1
@TimmyD Nhưng phiên bản của XP là phiên bản đầu tiên có lưới 9x9. Bất cứ điều gì cũ hơn sử dụng lưới 8x8 cho Người mới bắt đầu. #outnerded;)
mbomb007

Câu trả lời:


3

APL Dyalog, 40 byte

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

(giả định ⎕io←0)

các 1trong ⎕rl←1là hạt giống

từ phải qua trái:

?⍨81giống như 81?81- một hoán vị ngẫu nhiên

9≥ kết quả trong một bitmask chứa mười 1 giây tại các vị trí ngẫu nhiên, phần còn lại là 0 giây

a←9 9⍴ định hình lại hình vuông 9-9 và gọi nó là "a"

{ }⍣2 làm hai lần sau:

⍉3+/0,⍵,0 tổng cửa sổ trượt của 3 cột (giả sử 0s bên ngoài), sau đó hoán vị

(1,¨a)⍕¨là định dạng (chuyển đổi thành chuỗi) mỗi. Đối số bên trái để chỉ định tổng số ký tự và ký tự phân đoạn trong kết quả. Nếu không thể định dạng theo thông số kỹ thuật đó, nó sẽ tạo ra một *- sự trùng hợp may mắn cho vấn đề này. asẽ là 1 trong đó các mỏ đang - cố gắng lắp toàn bộ và một phần phân số vào một char duy nhất là không thể, vì vậy chúng sẽ xuất hiện dưới dạng *s.


Bạn có thể giải thích ⎕io←0giả định? Tôi không quen thuộc với Dyalog APL ...
Aaron

1
Các chỉ số mảng trong Dyalog theo 1 mặc định. Việc đặt ⎕io(" Nguồn gốc chỉ mục ") thành 0 làm cho chúng dựa trên 0 và thay đổi một số nguyên thủy tương ứng, ví dụ như ⍳3sẽ 0 1 2không 1 2 3. Điều đó có thể được thực hiện bằng lập trình ( ⎕io←0) hoặc từ các tùy chọn trong GUI. Có sự lựa chọn này là một sai lầm 50 năm vẫn chia rẽ cộng đồng APL nhỏ bé ngày nay.
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)

Chạy ví dụ (dòng đầu tiên sau mã là đầu vào được nhập bởi người dùng):

>> 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

Giải trình

rng(input(''));

lấy một số nguyên và sử dụng nó như là hạt giống. (Điều này hoạt động trong các phiên bản MATLAB hiện đại. Các phiên bản cũ có thể cần một cú pháp khác.)

x(9,9)=~1;

gán logic 0, hoặc false(thu được bằng cách phủ định logic 1) cho mục nhập (9,9)của ma trận x. Phần còn lại của các mục cũng được tự động khởi tạo thành logic 0.

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

gán 1(tự động chuyển thành logic 1, hoặc true) cho 10các 81mục của x, được chọn ngẫu nhiên mà không thay thế. Những mục này là những cái có chứa bom.

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

là tên viết tắt của conv2(+x,ones(3),'same'). Nó kết hợp ma trận x(cần được truyền tới double, sử dụng +) với vùng lân cận 3 × 3 chứa 1. Điều này đếm có bao nhiêu quả bom liền kề với mỗi mục. Đối với các mục có chứa một quả bom, nó bao gồm quả bom đó, nhưng giá trị sẽ được ghi đè lên sau đó.

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

thêm 48 vào giá trị, để chuyển đổi từ số sang mã ASCII. Ghép nối với ma trận trống sẽ chuyển các mã ASCII này thành ký tự.

y(x)=42;

gán 42 (mã ASCII cho '*') cho các vị trí của bom. Các vị trí này được đưa ra bởi x, ở đây được sử dụng như là một chỉ số hợp lý.

disp(y)

hiển thị kết quả.


4

Javascript (ES6), 204 hoặc 198 byte

PRNG tùy chỉnh (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`
`

Mã này đang sử dụng một trình tạo cộng hưởng tuyến tính với cấp số nhân 22695477và số gia 1(đây là triển khai Borland C / C ++).

Do hiệu quả kém của PRNG trong giai đoạn khởi động, tôi đã phải đặt một quả bom mỗi hàng (thay vì 10 ở đầu hoặc 10 ở cuối mảng không bị xáo trộn). Vì vậy, chỉ có 9 quả bom. Tôi có thể cố gắng khắc phục điều đó sau.

Ngoài ra, phải có cách đơn giản hơn / ngắn hơn để xử lý kiểm tra 'ngoài hội đồng' (x=p%9-(n+=p)%9)*x-64nhưng tôi không thể tìm ra ngay bây giờ.

Sử dụng 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`
`

Cái này bao gồm 10 mỏ theo yêu cầu.

Bản giới thiệu

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())


'**********'+'0'bằng '**********'+0; lưu hai byte trên phiên bản 198 byte.
Paul Schmitz

@PaulSchmitz - Thật không may, điều này '0'được cho là lặp đi lặp lại và 0.repeat()sẽ không hoạt động.
Arnauld

Rất tiếc, tôi mặc dù nó sẽ được thực hiện như thế nào ...('**********'+0).repeat(71). Lấy làm tiếc.
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))

Dùng thử trên ideone.com

Lưu được 2 byte nhờ Aaron.

Nhiều khả năng vẫn là golf.

Giải trình

randomđược nhập khẩu để sử dụng seedđể gieo hạt PRNG và samplechọn ngẫu nhiên mười vị trí đặt bom. mlà một ma trận 9 x 9 lưu bảng. Đối với mỗi vị trí đặt bom, mục nhập tương ứng mđược đặt thành -9và tất cả các mục nhập lân cận sẽ được tăng lên. Cách này mkết thúc chứa số lượng bom liền kề cho các ô không bom và số âm cho các ô bom. Cuối cùng printin toàn bộ bảng bằng cách lặp qua tất cả các dòng ltrong mvà tất cả các ô ctrong l.


Chính xác thì 'ngẫu nhiên' được sử dụng để làm gì?
clismique

@ Qwerp-Derp có thể tạo hạt giống cho trình tạo số ngẫu nhiên được sử dụng gián tiếp bởisample()
Patrick Roberts

lưu 2 byte bằng cách trộn các thụt tab trong for a in z:khối (chỉ python 2.x)
Aaron

3

R, 187 byte

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

Hãy thử nó trên Ideone

Giải trình:

set.seed() lấy một hạt giống cst.

x là chỉ số cho ma trận 11 * 11

y là chỉ số của ma trận 9 * 9 trong ma trận 11 * 11

z là chỉ số của bom

x=x*0 khởi tạo giá trị ma trận

Vòng lặp thêm 1 đến x trong trường hợp bom liền kề.


1
Tôi nghĩ bạn phải lấy đối số để set.seed () làm đầu vào.
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>


Bạn có thể muốn giải thích phần nào là mã của bạn.
NoOneIsHãy

@NoOneIsHere 244 byte đầu tiên, hy vọng ;-) Dòng đầu tiên phải dài 242 byte, sau đó có dòng mới và `ký tự.
Neil

1

Ruby , 181 194 183 + 1 = 184 byte

Quên để thực sự thiết lập hạt giống, rất tiếc. Sử dụng -ncờ.

Hãy thử trực tuyến!

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}/

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)])

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.