지뢰 찾기 단서 채우기 또는 함수를 작성해야합니다. 다음 중 원하는 형식을

지뢰 찾기 는 타일을 클릭하지 않고 어떤 타일이 “광산”인지 알아 내야하는 인기있는 퍼즐 게임입니다. 각 타일은 광산 (으로 표시 *) 또는 단서, 즉 8 개의 인접 타일 중 몇 개가 광산인지를 나타내는 0에서 8까지의 숫자입니다. 오늘 당신의 임무는 광산을 포함하는 보드를 가지고 모든 단서를 채우는 것입니다. 예를 들어, 5 개의 지뢰가있는 다음 5×4 보드를보십시오.

 *
*  *
  *
    *

단서를 채운 후 보드는 다음과 같습니다.

2*211
*33*1
12*32
0112*

세부

공백과 별표 만 포함 된 문자 격자를 취하고 각 공백이 인접한 광산 수 (별표)로 대체되는 다른 격자를 출력하는 전체 프로그램 또는 함수를 작성해야합니다. 다음 중 원하는 형식을 그리드에 사용할 수 있습니다.

  • 줄 바꿈이있는 문자열

  • 문자 / 단일 문자열의 2D 목록

  • 문자열 목록

그리드가 1×1 이상 이라고 가정 할 수 있지만 모든 광산 또는 모든 공간 일 수 있습니다.

입력 그리드는 항상 적절한 수의 공백으로 채워집니다. 평소와 같이 이것은 이므로 표준 허점이 적용되고 바이트 단위의 최단 답변이 승리합니다!

샘플 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됩니다 undefinedc+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}

여기에서 시도하십시오.