Isi petunjuk Minesweeper

54

Minesweeper adalah permainan puzzle yang populer di mana Anda harus menemukan ubin mana yang merupakan "ranjau" tanpa mengklik ubin itu. Setiap ubin adalah tambang (diwakili oleh *) atau petunjuk, yaitu angka dari 0 hingga 8 yang mewakili berapa banyak dari 8 ubin tetangga yang merupakan tambang. Tugas Anda hari ini adalah mengambil papan berisi ranjau dan mengisi semua petunjuk. Misalnya, lihat papan 5x4 berikut, dengan 5 tambang:

 *  
*  * 
  *  
    *

Setelah mengisi petunjuk, papan akan terlihat seperti ini:

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

Detail

Anda harus menulis program lengkap atau fungsi yang menggunakan kisi-kisi karakter yang hanya berisi spasi dan tanda bintang dan menampilkan kotak lain di mana setiap ruang diganti dengan jumlah tambang yang berdekatan (tanda bintang). Semua ini adalah format yang dapat diterima untuk kisi Anda:

  • Sebuah string dengan baris baru di dalamnya

  • Daftar karakter 2D / string karakter tunggal

  • Daftar string

Anda dapat menganggap kisi-kisi tersebut setidaknya 1x1, meskipun dimungkinkan untuk menjadi semua tambang atau semua ruang.

Kotak input akan selalu diisi dengan jumlah ruang yang sesuai. Seperti biasa, ini adalah , sehingga celah standar berlaku dan jawaban terpendek dalam byte menang!

Contoh IO

Agar Anda bisa melihat spasi, saya akan menunjukkan semua sampel IO dengan tanda kurung di sekitarnya.

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]
DJMcMayhem
sumber
2
FYI, saya membuat semua sampel IO dengan tangan, jadi mungkin ada beberapa kesalahan kecil di sana. Beri tahu saya jika ada sesuatu yang tidak beres dan saya akan mencoba memperbaikinya ASAP.
DJMcMayhem
Terkait.
xnor
1
Bisakah kotak menjadi non-kotak?
Ton Hospel
Bisakah tambang diwakili oleh karakter lain?
Akangka
@ChristianIrwan Tidak, tambang akan selalu menjadi tanda bintang.
DJMcMayhem

Jawaban:

21

MATL , 18 17 byte

Terima kasih kepada @ mbomb007 untuk koreksi pada input test case 6

32>t3Y6Z+-6b(48+c

Input adalah array char 2D, dalam format

[' *   '; '*  * '; '  *  '; '    *']

Cobalah online!

Uji kasus: 1 , 2 , 3 , 4 , 5 , 6 .

Penjelasan

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
Luis Mendo
sumber
1
Wow. Itu mengesankan.
BladorthinTheGrey
2
Mendapatkan test case 6 akan membuat saya kesal bermain game yang sebenarnya.
Magic Octopus Mm
Mengapa? Test case 6 tampaknya yang paling realistis.
WBT
@carusocomputing Mendapatkan test case 2 akan membuat saya jengkel lebih banyak. : P
DJMcMayhem
10

JavaScript (ES6), 114 96 byte

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

Sunting: Disimpan 18 byte berkat sebuah ide oleh @ETHproductions.

Neil
sumber
Saya pikir Anda dapat menyimpan banyak dengan mendefinisikan fungsi untuk memeriksa apakah indeks non-ruang: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)))
ETHproduksi
@ ETHproductions Saya mengambil ide Anda sampai ekstrem ... Saya biasanya tidak bisa menulis parameter fungsi!
Neil
7

R, 127 112 byte

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}

terima kasih kepada @gtwebb dan @ sebastian-c untuk peningkatan.

Poin penting:

Matriks adalah vektor dalam R. Anda tidak perlu pengindeksan 2-D untuk mengeluarkan elemen.

seq(M) akan mengembalikan urutan "panjang" yang sama (baris x kolom) sebagai M .

Anda tidak dapat mencampur indeks ekstraksi positif dan negatif dalam R. M[-3] adalah kode R yang sah, tetapi bukan yang diinginkan.

Input dalam bentuk matriks R. Beberapa contoh:

> 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" 
> 
JDL
sumber
1
Anda dapat memotong beberapa karakter dengan menggunakan Talih-alih TRUE. Saya berhasil menggeser beberapa kawat gigi dari salah satu fungsi if juga: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
Anda menentukan b=ncol(M)dan kemudian tidak menggunakannya sehingga Anda bisa menyingkirkan itu.
gtwebb
Saya dapat mencukur empat karakter (dan vectorise): 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)))}- namun, ini sedikit curang karena memerlukan <-lambda yang telah didefinisikan ulang , lihat klmr / fungsional / lambda
Konrad Rudolph
@Konrad ide yang menarik, tapi aku akan menyimpannya ke pangkalan R terima kasih!
JDL
6

Java, 190 byte

Sunting:

  • Off -6 byte. Terima kasih kepada @Frozn
  • -1 byte mati. Terima kasih untuk diriku sendiri :)
  • -1 byte mati. Juga menemukan beberapa kesalahan. Terima kasih kepada @Kevin Cruijssen

Snipet

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

Tidak Disatukan:

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

Ide itu.

Roman Gräf
sumber
Anda dapat membandingkan nilai char terhadap nilai ASCII yang seharusnya lebih pendek dalam kebanyakan kasus. Anda juga dapat menggabungkan deklarasix,y,i,j
Frozn
Saya sudah melakukannya c[i][j]==32dan seterusnya dan baru saja mengubahnya di bagian Ungolfed
Roman Gräf
Dan saya lebih pendek dari Phyton. Paling sedikit!
Roman Gräf
Apakah Anda yakin kode ungolfed Anda sudah benar? Untuk kasus tes pertama itu output: 0000*1\n*10011\n110000\n000000\n00**10\n0*22*1. Bisakah Anda menambahkan tautan tes ideone.com? SUNTING: Juga, kecuali saya sendiri melakukan kesalahan, output kode golf Anda: ssss0s\n0sssss\nssssss\nssssss\nss00ss\ns0ss0suntuk test case pertama (sudah diganti semua *dengan nol ..): S
Kevin Cruijssen
Diedit. Saya akan menambahkan tautan tes segera setelah internet pior saya mengizinkannya.
Roman Gräf
5

JavaScript (ES6), 107

Input / output sebagai array string

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

perhatikan ketika fungsi s dipanggil dengan elemen daftar l di luar batas, parameternya aadalah undefineddan c+aakan menghasilkan " undefined"berkat aturan konversi unik dari javascript

Lebih mudah dibaca

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
        )
      )
  )
edc65
sumber
5

Python 2, 138 byte

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

Menentukan fungsi fyang menerima string input seperti

"  *\n** \n*  \n"

dan mencetak string ke STDOUT:

23*
**2
*31
Lynn
sumber
1
Buat penghitungan mulai dari 2 ( enumerate(s,2)), dan ganti semua kemunculan i + 2dengan idan i - 1dengan i - 3. Itu akan memangkas beberapa byte.
Roberto Bonvallet
5

JavaScript (ES6) 186 182 177 161 152 byte

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}

Memperbarui

Kode di atas untuk " *"pengembalian "2*". Ini diperbaiki dalam skrip berikut.

168 167 byte

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}

Coba di sini.

sbisit
sumber
1
Saya pikir t+=(a[x+i%3-1]||[])[y+i/3-1|0]==kharus bekerja dengan cara yang sama dan menyelamatkan Anda try/ catchbagian.
Arnauld
1
@Arnauld. Sebenarnya, membaca properti dengan nomor literal tidak akan menghasilkan kesalahan, jadi bisa juga ditingkatkan (a[x+i%3-1]||1)[y+i/3-1|0].
sbisit
4

Haskell, 115 byte

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]

Menentukan fungsi fpada daftar string

dianne
sumber
3

Python 2, 192 byte

-3 byte berkat Tembaga, -10 byte jika memodifikasi input grid diperbolehkan, lain -11 byte dengan menghilangkan continuedan -12 byte untuk menghilangkan variabel counter

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

Menggunakan daftar daftar karakter Ldan membuat versi empuk K, jadi tidak ada masalah di batas. Lekukan adalah

  1. Ruang
  2. Tab
  3. Tab + Spasi
  4. Tab + Tab

Pemakaian:

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
Karl Napf
sumber
1
Beberapa golf minor: Anda dapat menempatkan tiga tugas variabel pertama Anda pada baris yang sama dipisahkan dengan titik koma dan kehilangan lekukan. Juga, gunakan if'*'==L[y][x]:untuk menyimpan byte.
Tembaga
Jika Anda menetapkan r=range;pada baris yang sama dengan n,S,s, Anda dapat menyimpan lima karakter dengan mengganti panggilanrange(...) dengan r(...).
alexwlchan
@alexwlchan melakukan ini menghemat 2 * angejadi 8 byte, tetapi saya harus menambahkan,r dan ,rangeyang juga 8 byte sehingga tidak ada yang didapat.
Karl Napf
@ KarlNapf Gah, Anda benar - saya lupa tentang range.
alexwlchan
3

Ruby, 112

Mengambil dan mengembalikan string. String harus dipisahkan baris dan baris dihentikan.

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

dalam program uji

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[
" *   
*  * 
  *  
    *
"]
Level River St
sumber
3

TSQL 292 291 byte

Golf:

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 @

Tidak Disatukan:

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 @

Biola

t-clausen.dk
sumber
Apakah kode ;di bagian depan kode Anda? Tampaknya Anda telah menghitungnya.
Erik the Outgolfer
@EriktheGolfer Ya, di mana ada skrip sebelum DENGAN. Kompiler akan memberikan kesalahan jika dihapus. Dimungkinkan untuk menguji ide-ide di biola
t-clausen.dk
Maksud saya, haruskah itu dalam hitungan byte dari sumber umum? Karena sepertinya itu harus menjadi bagian dari pernyataan "STDIN Awal" sebagai gantinya.
Erik the Outgolfer
@EriktheGolfer Saya tidak begitu tahu, saya kira itu bisa menjadi bagian dari deklarasi. Dapat juga mengecualikan master .. jika ada master USE di awal skrip. Tapi itu memberikan pesan yang mengganggu di biola.
t-clausen.dk
Saya mencoba meletakkan titik koma di baris sebelumnya, dan berhasil. Saya menganggap baris terakhir adalah yang terpenting.
Erik the Outgolfer
2

Racket 415 byte

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

Tidak Disatukan:

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

Pengujian (daftar sebagai string tunggal dengan nomor kolom yang ditentukan; juga akan bekerja dengan spasi):

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

Keluaran:

1101*1
*10111
110000
012210
12**21
1*33*1
juga
sumber
2

PHP, 145 133 132 127 byte

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

mengambil input sebagai string tunggal, dipisahkan oleh baris baru. Jalankan dengan-r .

kerusakan

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];
Titus
sumber
"!">$n=$s[$p]bukannya " "==$n=$s[$p]menyimpan satu Byte
Jörg Hülsermann
@ JörgHülsermann Itu akan menghancurkan linebreak.
Titus
@ JörgHülsermann ... tetapi triknya berfungsi untuk perbandingan asterisk (dalam versi baru)
Titus
2

Turtlèd , 99 byte

(ups aku selalu lupa tautannya: |)

Mengambil input dengan tanda kurung di sekitar setiap baris

Turtlèd tidak dapat mengambil input multi-baris, jadi setelah baris terakhir, tulis | ke ujung input

Perhatikan tanda kurung yang tidak cocok adalah karena tanda kurung terbuka menguraikan karakter berikutnya sebagai bagian dari perintah braket

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

Cobalah online!

Cara kerjanya (deskripsi umum):

Sampai |dimasukkan, ia menulis input pada setiap baris, dengan tanda kurung untuk membantu mengenali ujung setiap baris. Setelah itu terjadi, ia kembali ke atas input. Ini melewati setiap karakter dalam input. Jika itu adalah ruang, itu akan terlihat di sekitar ruang, menambahkan satu ke konter untuk setiap bom yang ditemukannya. setelah setiap baris, itu menghapus tanda kurung. Ketika sampai ke baris terakhir, dengan | di dalamnya, ia berhenti, dan menghapus |. kisi-kisi dicetak secara implisit.

Lemon dirusak
sumber
0

C, 152 150 147 145 byte

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

Input dalam bentuk array karakter dua dimensi, diikuti oleh jumlah baris dan kolom. Hasilnya akan dikembalikan di tempat.

(Sebagian besar) Tidak Disatukan:

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

Pendekatannya lurus ke depan - lilitkan setiap posisi, lilitkan tetangganya, dan tambahkan semua tanda bintang. Ada dua trik tingkat bit:

  • Ketika kami memutuskan apakah sebuah sel adalah tanda bintang atau tidak, kami hanya dapat memeriksa apakah bit tempat-delapan diatur, karena jumlah di dalam sel harus kurang dari 8 (nilai sel maksimum).

  • Kita dapat mengubah karakter spasi menjadi karakter nol dengan OR-ing 16.

Sunting: Memotong dua byte dengan menggunakan /menggantikan>= .

Sunting: Lima byte lagi dengan membalik arah loop.

Chris Bouchard
sumber
0

C #, 341 Bytes

Implementasi naif yang pasti dapat dipersingkat.

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;};
TheLethalCoder
sumber
0

Python 2, 183 byte

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]
Skyler
sumber