지뢰 찾기 단서 채우기


54

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

 *  
*  * 
  *  
    *

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

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

세부

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

  • 줄 바꿈이있는 문자열

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

  • 문자열 목록

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

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

샘플 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]

2
참고로, 모든 샘플 IO를 수동으로 만들었으므로 약간의 오류가있을 수 있습니다. 문제가 발생하면 알려 주시면 최대한 빨리 해결해 드리겠습니다.
DJMcMayhem


1
그리드가 사각형이 아닐 수 있습니까?
Ton Hospel

광산은 다른 캐릭터로 표현할 수 있습니까?
Akangka

@ChristianIrwan 아니오, 광산은 항상 별표가 될 것입니다.
DJMcMayhem

답변:


21

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

1
와. 인상적입니다.
BladorthinTheGrey

2
테스트 사례 6을 얻으면 실제 게임을하는 데 화가 나게됩니다.
매직 문어 Urn

왜? 테스트 사례 6이 가장 현실적으로 보입니다.
WBT

@carusocomputing 테스트 사례 2를 얻는 것이 훨씬 더 화나게합니다. : P
DJMcMayhem

10

자바 스크립트 (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 바이트를 절약했습니다.


인덱스가 공백이 아닌지 확인하는 함수를 정의하여 묶음을 절약 할 수 있다고 생각합니다.a=>a.map((s,i)=>s.replace(/ /g,(_,j)=>a.slice(i-!!i,i+2).reduce((t,s)=>t+(q=i=>s[i+j]>' ')(-1)+q(0)+q(1),0)))
ETHproductions

@ ETHproductions 나는 당신의 아이디어를 극단으로 가져갔습니다 ... 나는 보통 함수 매개 변수를 쓰지 않습니다!
Neil

7

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

1
T대신을 사용하여 몇 개의 문자를 잘라낼 수 있습니다 TRUE. if 함수 중 하나에서 괄호를 제거 할 수도있었습니다.f=function(M){a=nrow(M);b=ncol(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}
sebastian-c

1
당신은 그것을 정의 b=ncol(M)하고 사용하지 않으므로 그것을 제거 할 수 있습니다.
gtwebb

나는 네 문자 (및 벡터화)를 면도 할 수 있습니다 M->{a=nrow(M);p=M=='*';M[]=ifelse(p,'*',sapply(seq(M),i->sum(p[pmax(i+c(-1,1,-a+-1:1,a+-1:1),0)],na.rm=T)))}- 그러나,이 약간 사기꾼 그것이 재정이 필요하기 때문에 <-람다를 볼 klmr / 기능 / 람다
콘라드 루돌프

@ Konrad 흥미로운 아이디어이지만 기본 R 덕분에 계속 사용할 것입니다!
JDL

6

자바, 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));
    }
  }
}

무시 했어


대부분의 경우 더 짧은 ASCII 값과 char 값을 비교할 수 있습니다. x,y,i,j
Frozn

나는 이미 c[i][j]==32그렇게하고 그냥 Ungolfed 부분에서 그들을 변경
Roman Gräf

그리고 나는 피톤보다 짧습니다. 적어도!
Roman Gräf

ungolfed 코드가 정확합니까? 첫 번째 테스트 케이스의 경우 다음을 출력 0000*1\n*10011\n110000\n000000\n00**10\n0*22*1합니다.. ideone.com 테스트 링크를 추가 할 수 있습니까? 편집 : 또한, 내가 잘못하고 있지 않은 한, 골프 코드 출력 : ssss0s\n0sssss\nssssss\nssssss\nss00ss\ns0ss0s첫 번째 테스트 사례 (모두 *0으로 대체되었습니다 .) : S
Kevin Cruijssen

편집했습니다. 필자의 인터넷에서 허용되는대로 테스트 링크를 추가하겠습니다.
Roman Gräf

5

자바 스크립트 (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
        )
      )
  )

5

파이썬 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

1
2 (에서 열거 시작합니다 enumerate(s,2)), 그리고 모든 항목을 대체 i + 2ii - 1i - 3. 그것은 몇 바이트를 줄입니다.
Roberto Bonvallet

5

자바 스크립트 (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}

여기에서 시도하십시오.


1
나는 t+=(a[x+i%3-1]||[])[y+i/3-1|0]==k비슷한 방식으로 작동하고 try/ catch부분을 절약해야 한다고 생각 합니다 .
Arnauld

1
@Arnauld. 실제로 리터럴 숫자의 속성을 읽는 경우 오류가 발생하지 않으므로로 향상 될 수 있습니다 (a[x+i%3-1]||1)[y+i/3-1|0].
sbisit

4

하스켈, 115 바이트

z=zip[1..]
x%i=[a|(j,a)<-z x,abs(i-j)<2]
f x=[[head$[c|c>' ']++show(sum[1|'*'<-(%j)=<<x%i])|(j,c)<-z r]|(i,r)<-z x]

f문자열 목록에 함수 를 정의합니다


3

파이썬 2, 192 바이트

Copper 덕분에 -3 바이트, 입력 그리드 수정이 허용되면 -10 바이트, 제거 continue하여 다른 -11 바이트, 카운터 변수 제거를위한 -12 바이트

def f(L):
 n,S,s=len(L[0]),[0,1,2],[' '];P=[s*(n+2)];K=P+[s+x+s for x in L]+P
 for y in range(len(L)):
    for x in range(n):
     if'*'!=L[y][x]:L[y][x]=`sum(K[y+d][x+e]=='*'for d in S for e in S)`

문자 목록을 사용하고 L채워진 버전을 작성 K하므로 경계에 문제가 없습니다. 들여 쓰기

  1. 우주
  2. 탭 + 스페이스
  3. 탭 + 탭

용법:

s=""" *   
*  * 
  *  
    *"""
print s
s=[[c for c in x] for x in s.split('\n')]
f(s)
s='\n'.join([ ''.join(x) for x in s])
print s

1
몇 가지 사소한 골프 : 세미콜론으로 구분 된 같은 줄에 처음 세 개의 변수를 할당하고 들여 쓰기를 잃을 수 있습니다. 또한 if'*'==L[y][x]:바이트를 저장하는 데 사용하십시오 .
구리

r=range;와 같은 줄에 할당 n,S,s하면 통화를 range(...)로 바꾸면 5자를 저장할 수 있습니다 r(...).
alexwlchan

@ alexwlchan이 작업을 수행하면 2 * ange8 바이트가 절약 되지만 추가해야 ,r하며 ,range8 바이트이므로 아무것도 얻지 못합니다.
Karl Napf

@KarlNapf Gah, 당신 말이 맞아요 range.
alexwlchan

3

루비, 112

문자열을 가져 와서 반환합니다. 문자열은 개행 문자로 분리되고 개행 문자로 종료되어야합니다.

->s{w=1+s=~/\n/
s.size.times{|i|s[i]==' '&&(n=0;9.times{|j|(s+$/*w)[i+j%3-1+j/3*w-w]==?*&&n+=1};s[i])=n.to_s}
s}

테스트 프로그램에서

f=->s{
  w=(s=~/\n/)+1                              #Calculate width.
  s.size.times{|i|                           #For each char in s
    s[i]==' '&&(                             #If it is a space
      n=0                                    #set counter n to 0 and visit
      9.times{|j|                            #a 3x3 square of chars.
        (s+$/*w)[i+j%3-1+j/3*w-w]==?*&&n+=1  #If *, increment n.
      }                                      #(Pad s with w newlines to avoid *'s detected by wraparound.)
      s[i]=n.to_s                            #Write n back to s in string format
    )
  }
s}                                           #Return s.

puts f[
" *   
*  * 
  *  
    *
"]

3

TSQL 292 291 바이트

골프 :

DECLARE @ varchar(max)=
' *   
*  * 
  *  
    *';
WITH C as(SELECT x+1i,substring(@,x+1,1)v,x/z r,x%z c FROM master..spt_values CROSS APPLY(SELECT number x,charindex(char(10),@)z)z WHERE type='P'and x<len(@))SELECT @=stuff(@,i,1,z)FROM(SELECT i,(SELECT count(*)FROM C WHERE abs(D.c-c)<2and abs(D.r-r)<2and'*'=v)z FROM C D WHERE''=v)h PRINT @

언 골프 드 :

DECLARE @ varchar(max)=
' *   
*  * 
  *  
    *';
WITH C as
(
  SELECT x+1i,substring(@,x+1,1)v,x/z r,x%z c
  FROM master..spt_values
  CROSS APPLY(SELECT number x,charindex(char(10),@)z)z
  WHERE type='P'and x<len(@)
)
SELECT @=stuff(@,i,1,z)
FROM
(
  SELECT
    i,
    (
      SELECT count(*)
      FROM C
      WHERE 
       abs(D.c-c)<2and abs(D.r-r)<2and'*'=v
    )z
  FROM C D
  WHERE''=v
)h
PRINT @

깡깡이


않는 ;코드의 전면은 계산? 당신이 그것을 계산 한 것 같습니다.
Outgolfer Erik

@EriktheGolfer 예. WITH 이전에 스크립트가있는 경우. 컴파일러를 제거하면 오류가 발생합니다. 바이올린에서 아이디어를 테스트하는 것이 가능합니다
t-clausen.dk

일반 소스의 바이트 수에 있어야합니까? 대신 "초기 STDIN"문의 일부인 것 같습니다.
Outgolfer Erik

@EriktheGolfer 나는 정말로 모른다. 나는 그것이 선언의 일부가 될 수 있다고 생각한다. 스크립트 시작 부분에 USE 마스터가있는 경우 master.를 제외 할 수도 있습니다 . 그러나 그것은 바이올린에 성가신 메시지를줍니다.
t-clausen.dk

세미콜론을 이전 줄에 넣으려고 시도했지만 효과가있었습니다. 마지막 줄이 중요하다고 생각합니다.
Outgolfer Erik

2

라켓 415 바이트

(let*((l(string->list s))(g (λ(r c)(if(or(>= r n)(>= c n)(< r 0)(< c 0))#f(list-ref l(+ c(* n r))))))(ng (λ(r c)(let*((h'(-1 0 1))(k(filter(λ(x)x)
(for*/list((i h)(j h)#:unless(= 0 i j))(g(+ r i)(+ c j))))))(count(λ(x)(equal? x #\*))k))))(k(for*/list((i n)(j n))(ng i j)))
(ol(map(λ(x y)(if(equal? x #\*)"*"(number->string y)))l k)))(for((i(* n n))(j ol))(display j)(when(= 0(modulo(add1 i)n))(displayln ""))))

언 골프 드 :

(define (f s n)
  (let* ((l (string->list s))
         (get                            ; fn to get value at a (row, col)
          (lambda(r c)                   ; #f if invalid row or col
            (if (or (>= r n)
                    (>= c n)
                    (< r 0)
                    (< c 0))
                #f (list-ref l (+ c (* n r))))))

         (neighbors                      ; fn to count neighboring "*"
          (lambda(r c)
            (let* ((h '(-1 0 1))
                   (u (filter
                       (lambda(x) x)
                       (for*/list ((i h)(j h)
                                   #:unless (= 0 i j))
                         (get (+ r i) (+ c j))))))
              (count (lambda(x)(equal? x #\*)) u))))

         (k (for*/list ((i n) (j n))    ; for each row,col count neighboring "*"
              (neighbors i j)))
         (ol(map (lambda(x y)           ; get outlist- replace blanks with neighboring star count
                   (if(equal? x #\*) 
                      "*"
                      (number->string y)))
                 l k)))

    (for ((i (* n n))(j ol))            ; display outlist
      (display j)
      (when (= 0 (modulo (add1 i) n))
        (displayln "")))))

테스트 (열 번호가 지정된 단일 문자열로 나열되며 공백에도 적용됨) :

(f "----*-*-------------------**---*--*-" 6) 

산출:

1101*1
*10111
110000
012210
12**21
1*33*1

2

PHP, 145 133 132 127 바이트

for($s=$argv[1];$s[$p];print$c)if(" "==$c=$s[$p++])for($y=-2;$y++<1;)for($x=$p-3;$x++<$p;)$c+="!"<$s[$x+$y*strpos($s,"\n")+$y];

입력을 단일 문자열로 취하고 개행을 구분합니다. 로 실행하십시오 -r.

고장

for($s=$argv[1];$s[$p]; // loop through all characters (including newlines)
    print$c                     // 3. print result
)
    if(" "==$c=$s[$p++])        // 1. if character is space
        for($y=-2;$y++<1;)      // 2. count surrounding asterisk characters
            for($x=$p-3;$x++<$p;)
                $c+="!"<$s[$x+$y*strpos($s,"\n")+$y];

"!">$n=$s[$p]대신 " "==$n=$s[$p]한 바이트 저장
요 르그 Hülsermann

@ JörgHülsermann 그 줄 바꿈을 파괴합니다.
Titus

@ JörgHülsermann ...하지만 트릭은 별표 비교를 위해 작동합니다 (새 버전에서)
Titus

2

Turtlèd , 99 바이트

(누구 내가 계속 링크를 잊어 버린다 : |)

각 줄을 괄호로 입력합니다

Turtlèd는 멀티 라인 입력을 사용할 수 없으므로 마지막 라인 이후 |입력 신호 끝 부분에 씁니다.

일치하지 않는 대괄호는 열린 대괄호가 대괄호 명령의 일부로 다음 문자를 구문 분석하기 때문입니다.

[|!.([[]r+.][[l]d)][ u]d[|[]r( #012345678#l(*+)u(*+)r(*+)r(*+)d(*+)d(*+)l(*+)l(*+)ur.)]' [[l]' d]' 

온라인으로 사용해보십시오!

작동 방식 (일반 설명) :

|입력 할 때까지 각 행의 입력을 기록하고 각 행의 끝을 인식 할 수 있도록 괄호와 함께 입력합니다. 그런 다음 입력 상단으로 돌아갑니다. 입력 된 각 문자를 통과합니다. 공간 인 경우 공간을 둘러보고 발견 한 폭탄마다 카운터에 하나씩 추가합니다. 각 줄 뒤에는 괄호가 삭제됩니다. 마지막 줄에 도달하면 | 그 안에 중지하고 |를 삭제합니다. 격자는 암시 적으로 인쇄됩니다.


0

C, 152 150 147 145 바이트

i,j,r,c;f(B,R,C)char**B;{for(i=R*C;i--;)for(j=9;j--;){char*b=B[i/C]+i%C;r=i/C+j/3-1;c=i%C+j%3-1;r<0|c<0|r/R|c/C|*b&8||(*b=16|*b+(B[r][c]==42));}}

입력은 2 차원 문자 배열의 형식으로되어 있으며 그 뒤에 행과 열의 수가 있습니다. 결과가 제자리에 반환됩니다.

(대부분) 언 골프 :

i, j, r, c;
f(B, R, C) char **B; {
    for (i = R*C; i--;)
        for (j = 9; j--;) {
            char *b = B[i/C] + i%C;
            r = i/C + j/3 - 1;
            c = i%C + j%3 - 1;
            r < 0 | c < 0 | r / R | c / C | *b & 8 ||
                (*b = 16 | *b + (B[r][c] == 42));
        }
}

이 방법은 간단합니다. 각 위치를 반복하고 인접 항목을 반복하고 모든 별표를 추가합니다. 두 가지 비트 수준 트릭이 있습니다.

  • 셀이 별표인지 아닌지를 결정할 때는 셀의 숫자가 8보다 작아야하기 때문에 8 자리 비트가 설정되어 있는지 확인할 수 있습니다 (최대 셀 값).

  • OR-ing 16으로 공백 문자를 0 문자로 바꿀 수 있습니다.

편집 : 사용하여 두 바이트를 Golfed /대신에 >=.

편집 : 루프 방향을 반대로하여 또 다른 5 바이트.


0

C #, 341 바이트

확실히 단축 될 수있는 순진한 구현.

s=>s=="*"?1:0;s=>{for(int i=0,j,n,l=s.Length,c=s[i].Length;i<l;++i)for(j=0;j<c;++j)if(s[i][j]!="*"){n=0;if(i>0){n+=a(s[i-1][j]);n+=j>0?a(s[i-1][j-1]):0;n+=j+1<c?a(s[i-1][j+1]):0;}n+=a(s[i][j]);n+=j>0?a(s[i][j-1]):0;n+=j+1<c?a(s[i][j+1]):0;if(i+1<l){n+=a(s[i+1][j]);n+=j>0?a(s[i+1][j-1]):0;n+=j+1<c?a(s[i+1][j+1]):0;}s[i][j]=n+"";}return s;};

0

파이썬 2, 183 바이트

def s(m):
 j=m.find('\n')+1;q='q'*j*2;m=list(q+m+q)
 for i in range(len(m)):
  if m[i]==' ':m[i]=`sum([m[k+i]=='*'for k in [-j-1,-j,-j+1,-1,1,j-1,j,j+1]])`
 return''.join(m)[j*2:-j*2]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.