직장에서 지뢰 찾기


18

누구나 Windows XP와 함께 제공되는 오래된 지뢰 찾기 게임을 알고 있습니다. 숫자 (인쇄가 몇 개나 있는지를 나타냄) 또는 광산을 포함하는 9x9 셀로 구성된 간단한 그리드입니다.

여기에 이미지 설명을 입력하십시오

PRNG를 직접 구현하면 브라우니 포인트가있는 정수 시드 (기계 / 언어의 최대 정수에 관계없이)가 주어진 10 개의 폭탄으로 무작위 9x9 그리드를 생성하는 것이 과제입니다.

출력 예 : 셀에는 숫자 0-8 또는 *가 포함되어 있습니다.

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

바이트 단위의 최단 코드가 승리합니다. 표준 규칙 등


3
숫자가 무엇을 의미하는지 표시해야합니다.
Nathan Merrill

4
Microsoft Minesweeper는 XP보다 훨씬 오래된 버전 이며 지뢰 찾기 같은 게임은 60 년대 이상으로 거슬러 올라갑니다.
AdmBorkBork

11
또한 직장에서 지뢰 찾기를 할 시간이 없습니다. PPCG에 너무 바쁩니다. ;-)
AdmBorkBork

1
정확히 PRNG로 간주되는 것은 무엇입니까? 몇 개의 다른 구성을 생성 할 수 있습니까? 언어 에 "임의의"시드로 자동 초기화 되는 PRNG가있는 경우 시드를 사용할 수 없고 매번 다른 구성을 생성 할 수 있습니까 ?
Luis Mendo

1
@TimmyD 그러나 XP의 버전은 9x9 그리드를 가진 첫 번째 버전입니다. 오래된 것은 초보자를 위해 8x8 그리드를 사용합니다. #outnerded;)
mbomb007

답변:


3

Dyalog APL, 40 바이트

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

(가정 ⎕io←0)

1에서이 ⎕rl←1씨앗입니다

오른쪽에서 왼쪽으로 :

?⍨8181?81-임의 순열 과 동일

9≥ 임의의 위치에서 10 개의 1을 포함하는 비트 마스크를 생성하고 나머지는 0입니다.

a←9 9⍴ 9x9 사각형으로 모양을 바꾸고 "a"라고 부릅니다.

{ }⍣2 다음을 두 번 수행하십시오.

⍉3+/0,⍵,0 3 열의 슬라이딩 윈도우 합계 (0이 외부인 것으로 가정)

(1,¨a)⍕¨각각 형식입니다 (문자열로 변환). 왼쪽 인수 는 결과에서 총 문자 수와 소수 문자 를 지정합니다. 경우 캔은 그 사양에 따라 포맷하지 그것은 출력 *-이 문제에 대한 운이 우연의 일치. a광산이있는 곳은 1이 될 것입니다-전체 및 소수 부분을 단일 문자에 맞추는 것은 불가능하므로 *s로 나타납니다 .


⎕io←0가정 을 설명 할 수 있습니까 ? Dyalog APL에 익숙하지 않습니다 ...
Aaron

1
Dyalog의 배열 인덱스는 기본적으로 1부터 시작합니다. 설정 ⎕io(이하 " 인덱스 기원을 0으로하는")들이 공 기반하게하고, 그에 따라 예를 몇 가지 기본 요소를 변경하는 ⍳30 1 2,하지 1 2 3. 프로그래밍 방식으로 ( ⎕io←0) 또는 GUI의 환경 설정에서 수행 할 수 있습니다 . 이 선택을하는 것은 오늘날의 작은 APL 커뮤니티를 분할하는 50 세의 실수입니다.
ngn

5

MATLAB, 94 93 바이트

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

예제 실행 (코드 다음의 첫 번째 줄은 사용자가 입력 한 입력) :

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

설명

rng(input(''));

정수를 받아서 시드로 사용합니다. (이것은 최신 MATLAB 버전에서 작동합니다. 이전 버전은 다른 구문이 필요할 수 있습니다.)

x(9,9)=~1;

행렬 의 항목 에 논리적 0또는 false(논리적으로 부정하여 얻은) 할당합니다 . 나머지 항목은 자동으로 논리적으로 초기화됩니다 .1(9,9)x0

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

대입 1(autoomatically 논리 캐스트 1또는 true로) 1081의 엔트리 x교체없이 임의로 선택. 이 항목은 폭탄이 포함 된 항목입니다.

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

의 약어입니다 conv2(+x,ones(3),'same'). 포함하는 3x3 이웃과 함께 행렬을 변환합니다 x(을 double사용하여 캐스팅해야 함 +) 1. 이것은 각 엔트리에 인접한 폭탄의 수를 계산합니다. 폭탄이 포함 된 항목에는 해당 폭탄이 포함되지만 나중에 그 값을 덮어 씁니다.

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

숫자를 ASCII 코드로 변환하기 위해 값에 48을 더합니다. 빈 행렬과 연결하면 이러한 ASCII 코드가 문자로 전송됩니다.

y(x)=42;

'*'폭탄의 위치에 42 (ASCII 코드 )를 할당합니다 . 이 위치는로 표시되며 x여기에서 논리 인덱스로 사용됩니다.

disp(y)

결과를 표시합니다.


4

자바 스크립트 (ES6), 204 또는 198 바이트

사용자 정의 PRNG (204 바이트)

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

이 코드는 승수 22695477와 증분을 가진 선형 합동 생성기를 사용 하고 있습니다 1(이것은 Borland C / C ++ 구현입니다).

예열 단계 동안 PRNG의 효율이 나빠서 열당 하나의 폭탄을 배치해야했습니다 (처음에 10 개 또는 셔플되지 않은 어레이의 끝에 10 개 대신). 따라서 폭탄은 9 개뿐입니다. 나중에 수정하려고 할 수 있습니다.

또한 'out of board'체크를 처리하는 더 간단하고 짧은 방법이 있어야하지만 지금은 이해할 (x=p%9-(n+=p)%9)*x-64수 없습니다.

Math.random () 사용 (198 바이트)

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

이것은 요청에 따라 10 개의 광산을 포함합니다.

데모

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'같다 '**********'+0; 198 바이트 버전에서 2 바이트를 절약합니다.
Paul Schmitz

@PaulSchmitz-불행히도 이것은 '0'반복되어 0.repeat()작동하지 않습니다.
Arnauld

죄송하지만 다음과 같이 실행 ...('**********'+0).repeat(71)됩니다. 죄송합니다.
Paul Schmitz

3

파이썬 2, 269 266 264 바이트

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

ideone.com에서 사용해보십시오

Aaron 덕분에 2 바이트를 절약했습니다.

여전히 골프를 할 가능성이 높습니다.

설명

randomseedPRNG를 시드하고 sample폭탄 위치 10 개를 무작위로 선택 하는 데 사용 됩니다. m보드를 절약하는 9 x 9 매트릭스입니다. 각 폭탄 위치마다 해당 항목 m이로 설정 -9되고 모든 인접 항목이 증분됩니다. 이 방법 m은 비 폭탄 셀의 인접 폭탄 수와 폭탄 셀의 음수를 포함합니다. 마지막 print인쇄의 모든 라인을 통해 반복하여 전체 보드 lm모든 세포 c에서 l.


정확히 '무작위'가 정확히 무엇에 사용됩니까?
clismique

@ Qwerp-DERP 아마 간접적으로 난수 발생기를 시드로 사용하기sample()
패트릭 로버츠

for a in z:블록 내부에 탭 들여 쓰기를 혼합하여 2 바이트를 절약하십시오 (파이썬 2.x 만)
Aaron

3

R, 187 바이트

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

Ideone에서 사용해보십시오

설명:

set.seed() cst 씨를 가지고 가십시오.

x 11 * 11 행렬의 인덱스입니다.

y 11 * 11 행렬에서 9 * 9 행렬의 인덱스입니다.

z 폭탄의 색인입니다

x=x*0 행렬 값을 초기화

인접한 폭탄의 경우 루프는 1에 x를 더합니다.


1
set.seed () 인수를 입력으로 사용해야한다고 생각합니다.
BLT

2

자바 스크립트 ES6, 244 바이트

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>


코드가 어느 부분인지 자세히 설명하고 싶을 수도 있습니다.
NoOneIsHere9

@NoOneIsHere 첫 번째 244 바이트, 희망적으로 ;-) 첫 번째 줄의 길이는 242 바이트 여야합니다. 그러면 줄 바꿈과 `문자가 있습니다.
Neil

1

루비 , 181 (194) 183 + 1 = 184 바이트

실제로 씨앗을 설정하는 것을 잊었습니다. -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}/

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.