지뢰 찾기 는 타일을 클릭하지 않고 어떤 타일이 “광산”인지 알아 내야하는 인기있는 퍼즐 게임입니다. 각 타일은 광산 (으로 표시 *
) 또는 단서, 즉 8 개의 인접 타일 중 몇 개가 광산인지를 나타내는 0에서 8까지의 숫자입니다. 오늘 당신의 임무는 광산을 포함하는 보드를 가지고 모든 단서를 채우는 것입니다. 예를 들어, 5 개의 지뢰가있는 다음 5×4 보드를보십시오.
*
* *
*
*
단서를 채운 후 보드는 다음과 같습니다.
2*211
*33*1
12*32
0112*
세부
공백과 별표 만 포함 된 문자 격자를 취하고 각 공백이 인접한 광산 수 (별표)로 대체되는 다른 격자를 출력하는 전체 프로그램 또는 함수를 작성해야합니다. 다음 중 원하는 형식을 그리드에 사용할 수 있습니다.
-
줄 바꿈이있는 문자열
-
문자 / 단일 문자열의 2D 목록
-
문자열 목록
그리드가 1×1 이상 이라고 가정 할 수 있지만 모든 광산 또는 모든 공간 일 수 있습니다.
입력 그리드는 항상 적절한 수의 공백으로 채워집니다. 평소와 같이 이것은 code-golf 이므로 표준 허점이 적용되고 바이트 단위의 최단 답변이 승리합니다!
샘플 IO
공백을 볼 수 있도록 모든 샘플 IO를 괄호로 묶습니다.
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]
답변
MATL , 18 17 바이트
테스트 케이스 6의 입력을 수정 한 @ mbomb007 덕분에
32>t3Y6Z+-6b(48+c
입력은 형식으로 2D 문자 배열입니다.
[' * '; '* * '; ' * '; ' *']
시험 예 : 1 ,
2 , 3 , 4 , 5 , 6 .
설명
32> % Input 2D char array implicitly. Transform it into a 2D logical
% array with asterisk replaced by true and space by false
t % Duplicate
3Y6 % Push [1 1 1; 1 0 1; 1 1 1]. This defines the neighbourhood
Z+ % 2D convolution, keeping size. Gives the number of neighbouring
% mines for each position
-6 % Push -6
b % Bubble up in stack
( % Assign -6 to the entries indicated by the logical array, i.e.
% to the positions that originally contained asterisks
48+ % Add 48. This transforms each number of neighbouring mines
% into its ASCII code, and -6 into 42 (ASCII code of asterisk)
c % Convert to char. Display implicitly
답변
자바 스크립트 (ES6), 114 96 바이트
a=>a.map((s,i)=>s.replace(/ /g,(_,j)=>g(k=>(s=a[i+k])?g(k=>s[j+k]>' '):0)),g=f=>f(-1)+f(0)+f(1))
편집 : @ETHproductions의 아이디어 덕분에 18 바이트를 절약했습니다.
답변
R, 127112 바이트
function(M){a=nrow(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}
개선을위한 @gtwebb와 @ sebastian-c에게 감사합니다.
주목할만한 점 :
행렬은 R의 벡터입니다. 요소를 추출하기 위해 2 차원 색인이 필요하지 않습니다.
seq(M)
와 같은 “길이”(행 x 열)의 시퀀스를 반환합니다 M
.
M[-3]
R 에서 양수와 음수 추출 지수를 혼합 할 수는 없습니다. 적절한 R 코드이지만 원하는 것은 아닙니다.
입력은 R 행렬의 형태입니다. 몇 가지 예 :
> M <- matrix("",5,5)
> M[3,3] <- "*"
> f(M)
[,1] [,2] [,3] [,4] [,5]
[1,] "0" "0" "0" "0" "0"
[2,] "0" "1" "1" "1" "0"
[3,] "0" "1" "*" "1" "0"
[4,] "0" "1" "1" "1" "0"
[5,] "0" "0" "0" "0" "0"
> M[2,2] <- "*"
> f(M)
[,1] [,2] [,3] [,4] [,5]
[1,] "1" "1" "1" "0" "0"
[2,] "1" "*" "2" "1" "0"
[3,] "1" "2" "*" "1" "0"
[4,] "0" "1" "1" "1" "0"
[5,] "0" "0" "0" "0" "0"
> M[3,2] <- "*"
> f(M)
[,1] [,2] [,3] [,4] [,5]
[1,] "1" "1" "1" "0" "0"
[2,] "2" "*" "3" "1" "0"
[3,] "2" "*" "*" "1" "0"
[4,] "1" "2" "2" "1" "0"
[5,] "0" "0" "0" "0" "0"
>
답변
자바, 190 바이트
편집하다:
- -6 바이트 꺼짐 @Frozn에게 감사합니다
- -1 바이트 오프 나에게 감사합니다 🙂
- -1 바이트 오프 또한 몇 가지 실수를 발견했습니다. @Kevin Cruijssen에게 감사합니다
스 니펫
c->{for(int x,y,j,i=-1;++i<c.length;)for(j=-1;++j<c[0].length;){if(c[i][j]<33){c[i][j]=48;for(x=i-2;++x<i+2;)for(y=j-2;++y<j+2;)try{if(c[x][y]==43)c[i][j]++;}catch(Exception e){}}}return c;}
언 골프 드 :
public class Main{
public static char[][] minesweeper(char[][] woclues){
for(int i = 0; i < woclues.length ; i++){
for(int j = 0; j < woclues[0].length ; j++){
if( woclues[i][j] == ' '){
woclues[i][j] = '0';
for(int x = i - 1; x < i + 2 ; x++){
for(int y = j - 1; y < j + 2 ; y++){
try{
if(woclues[x][y] == '*'){
woclues[i][j]++;
}
}catch( ArrayIndexOutOfBoundsException e){}
}
}
}
}
}
return woclues;
}
public static void main(String[]args){
char[][] in = new char[args.length][args[0].length()];
for(int i = 0; i < args.length;i++){
in[i]=args[i].toCharArray();
}
for(char[] c:minesweeper(in)){
System.out.println(new String(c));
}
}
}
답변
자바 스크립트 (ES6), 107
문자열 배열로 입력 / 출력
f=l=>l.map((r,i)=>r.replace(/ /g,(c,j)=>(s=r=>(c+r).substr(j,3).split`*`.length,s(l[i-1])+s(l[i+1])+s(r)-3)))
주의 기능 (S)가 경계 밖으로리스트 L의 요소를 호출 할 때 매개 변수가 a
됩니다 undefined
및 c+a
발생합니다 " undefined"
자바 스크립트의 기발한 변환 규칙 덕분에
더 읽기
l=>
l.map(
(r,i) =>
r.replace(/ /g, (c,j) =>
(
s = a => (c+a).substr(j,3).split`*`.length,
s(l[i-1])+s(l[i+1])+s(r)-3
)
)
)
답변
파이썬 2, 138 바이트
def f(s):w=s.find('\n')+1;print''.join([c,`(s[i-(i>0):i+2]+(w*' '+s)[i-1:i+2]+s[i-1+w:i+2+w]).count('*')`][c==' ']for i,c in enumerate(s))
다음 f
과 같은 입력 문자열을 허용하는 함수 를 정의합니다.
" *\n** \n* \n"
STDOUT에 문자열을 인쇄합니다.
23*
**2
*31
답변
자바 스크립트 (ES6) 186 182 177 161 152 바이트
f=a=>{for(s='',y=a[0].length;y--;)for(s=`
`+s,x=a.length;x--;)(k=>{for(t=0,i=9;i--;)t+=(a[x+i%3-1]||[])[y+i/3-1|0]==k;s=(a[x][y]<k?t:k)+s})`*`;return s}
최신 정보
위의 코드는 " *"
returns "2*"
입니다. 이것은 다음 스크립트에서 수정되었습니다.
168 167 바이트
f=a=>{for(s='',y=a[0].length;y--;)for(s=`
`+s,x=a.length;x--;)a[x][y]=='*'?s='*'+s:(k=>{for(t=0,j=3;j--;)for(i=3;i--;)t+=(a[x+i-1]||1)[y+j-1]=='*';s=t+s})`*`;return s}