Minesweeper ist ein beliebtes Puzzlespiel, bei dem Sie herausfinden müssen, welche Kacheln "Minen" sind, ohne auf diese Kacheln zu klicken. Jedes Plättchen ist entweder eine Mine (dargestellt durch *
) oder ein Hinweis, dh eine Zahl von 0 bis 8, die angibt, wie viele der 8 benachbarten Plättchen Minen sind. Ihre Aufgabe heute ist es, eine Tafel mit den Minen zu nehmen und alle Hinweise einzugeben. Schauen Sie sich zum Beispiel das folgende 5x4-Brett mit 5 Minen an:
*
* *
*
*
Nachdem Sie die Hinweise eingegeben haben, sieht das Board folgendermaßen aus:
2*211
*33*1
12*32
0112*
Einzelheiten
Sie müssen entweder ein Vollprogramm oder eine Funktion schreiben, die ein Zeichenraster nur mit Leerzeichen und Sternchen aufnimmt und ein anderes Raster ausgibt, in dem jedes Leerzeichen durch die Anzahl der benachbarten Minen (Sternchen) ersetzt wird. Alle diese Formate sind für Ihre Raster akzeptabel:
Eine Zeichenfolge mit Zeilenumbrüchen
Eine 2D-Liste von Zeichen / Einzelzeichenfolgen
Eine Liste von Zeichenfolgen
Sie können davon ausgehen, dass das Gitter mindestens 1x1 beträgt, es können jedoch auch alle Minen oder alle Felder sein.
Das Eingaberaster wird immer mit der entsprechenden Anzahl von Leerzeichen aufgefüllt. Wie üblich ist dies Codegolf , daher gelten Standardlücken und die kürzeste Antwort in Bytes gewinnt!
Beispiel IO
Damit Sie das Leerzeichen sehen können, zeige ich alle Beispiel-E / A mit eckigen Klammern.
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]
quelle
Antworten:
MATL ,
1817 BytesVielen Dank an @ mbomb007 für eine Korrektur in der Eingabe von Testfall 6
Die Eingabe ist ein 2D-Zeichen-Array im Format
Probieren Sie es online!
Testfälle: 1 , 2 , 3 , 4 , 5 , 6 .
Erläuterung
quelle
JavaScript (ES6),
11496 BytesBearbeiten: 18 Bytes dank einer Idee von @ETHproductions gespeichert.
quelle
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)))
R
127112 Bytesdanke an @gtwebb und @ sebastian-c für die verbesserungen.
Bemerkenswerte Punkte:
Matrizen sind Vektoren in R. Sie benötigen keine 2-D-Indizierung, um Elemente herauszuholen.
seq(M)
gibt eine Sequenz mit der gleichen "Länge" (Zeilen x Spalten) zurück wieM
.Sie können in R keine positiven und negativen Extraktionsindizes mischen. Dies
M[-3]
ist ein legitimer R-Code, aber nicht das, was gewünscht wird.Die Eingabe erfolgt in Form einer R-Matrix. Einige Beispiele:
quelle
T
anstelle von verwendenTRUE
. Ich habe es geschafft, einige Klammern von einer der if-Funktionen zu schieben: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}
b=ncol(M)
und verwenden es dann nicht, damit Sie es loswerden können.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)))}
- dies betrügt jedoch leicht, weil es ein neu definiertes<-
Lambda erfordert , siehe klmr / functional / lambdaJava, 190 Bytes
Bearbeiten:
Snipet
Ungolfed:
Ideone es.
quelle
x,y,i,j
c[i][j]==32
und so weiter und habe sie im Ungolfed-Teil geändert0000*1\n*10011\n110000\n000000\n00**10\n0*22*1
. Könnten Sie vielleicht einen ideone.com-Testlink hinzufügen? EDIT: Ausserdem, wenn ich nicht selbst etwas falsch mache, wird Ihr Golfcode ausgegeben:ssss0s\n0sssss\nssssss\nssssss\nss00ss\ns0ss0s
für den ersten Testfall (der alle*
durch Nullen ersetzt hat ..): SJavaScript (ES6), 107
Eingabe / Ausgabe als Array von Zeichenfolgen
beachten Sie, wenn die Funktion s mit einem Element der Liste l außerhalb der Grenzen genannt wird, der Parameter
a
istundefined
undc+a
wird in Folge" undefined"
dank der schrulligen Konvertierungsregeln von JavaScriptMehr lesbar
quelle
Python 2, 138 Bytes
Definiert eine Funktion
f
, die eine Eingabezeichenfolge wie annimmtund druckt einen String nach STDOUT:
quelle
enumerate(s,2)
) und ersetzen Sie alle Vorkommen voni + 2
miti
undi - 1
miti - 3
. Das spart ein paar Bytes.JavaScript (ES6)
186182177161152 ByteAktualisieren
Der obige Code für
" *"
Rücksendungen"2*"
. Dies wird im folgenden Skript behoben.168167 BytesProbieren Sie es hier aus.
quelle
t+=(a[x+i%3-1]||[])[y+i/3-1|0]==k
sollte auf ähnliche Weise funktionieren und dir dentry
/catch
Teil ersparen .(a[x+i%3-1]||1)[y+i/3-1|0]
.Haskell, 115 Bytes
Definiert eine Funktion
f
für Listen von Zeichenfolgenquelle
Python 2, 192 Bytes
-3 Bytes dank Copper, -10 Bytes, wenn das Eingaberaster geändert werden darf, weitere -11 Bytes durch Entfernen
continue
und weitere -12 Bytes zum Entfernen der ZählervariableVerwendet eine Liste mit Zeichen
L
und erstellt eine gepolsterte VersionK
, also kein Problem an den Grenzen. Einrückung istVerwendungszweck:
quelle
if'*'==L[y][x]:
, um ein Byte zu speichern.r=range;
auf der gleichen Linie wien,S,s
können Sie fünf Zeichen speichern , indem die Anrufe zu ersetzenrange(...)
mitr(...)
.ange
also 8 Bytes, aber ich muss hinzufügen,r
und,range
was ist auch 8 Bytes so nichts verdient.range
.Ruby, 112
Nimmt und gibt einen String zurück. Die Zeichenfolge muss durch Zeilenumbrüche getrennt und durch Zeilenumbrüche abgeschlossen sein.
im Testprogramm
quelle
TSQL
292291 BytesGolf gespielt:
Ungolfed:
Geige
quelle
;
am Anfang Ihres Codes? Es scheint, dass Sie es gezählt haben.Schläger 415 Bytes
Ungolfed:
Testen (Listen als einzelne Zeichenfolge mit angegebener Spaltennummer; funktionieren auch mit Leerzeichen):
Ausgabe:
quelle
PHP,
145133132127 BytesNimmt Eingaben als einzelne Zeichenfolge mit Zeilenumbruch als Trennzeichen an. Laufen Sie mit
-r
.Nervenzusammenbruch
quelle
"!">$n=$s[$p]
statt" "==$n=$s[$p]
spart ein ByteTurtlèd , 99 Bytes
(Hoppla, ich vergesse immer wieder den Link: |)
Übernimmt Eingaben mit Klammern um jede Zeile
Turtlèd kann keine mehrzeiligen Eingaben vornehmen. Schreiben Sie daher nach der letzten Zeile, um
|
das Ende der Eingabe zu signalisierenBeachten Sie, dass die nicht übereinstimmenden Klammern darauf zurückzuführen sind, dass offene Klammern das nächste Zeichen als Teil des Klammerbefehls analysieren
Probieren Sie es online!
Wie es funktioniert (allgemeine Beschreibung):
Bis
|
zur Eingabe wird die Eingabe in jede Zeile mit eckigen Klammern geschrieben, um das Ende jeder Zeile zu erkennen. Nachdem dies geschehen ist, kehrt es zum oberen Rand der Eingabe zurück. Es durchläuft jedes eingegebene Zeichen. Wenn es sich um ein Feld handelt, sieht es sich im Feld um und fügt für jede gefundene Bombe ein Feld hinzu. Nach jeder Zeile werden die Klammern gelöscht. Wenn die letzte Zeile erreicht ist, wird mit | Darin stoppt es und löscht das |. Das Raster wird implizit gedruckt.quelle
C,
152150147145 BytesDie Eingabe erfolgt in Form einer zweidimensionalen Zeichenfolge, gefolgt von der Anzahl der Zeilen und Spalten. Das Ergebnis wird an Ort und Stelle zurückgegeben.
(Meistens) Ungolfed:
Der Ansatz ist unkompliziert: Schleife über jede Position, Schleife über die Nachbarn und addiere alle Sternchen. Es gibt zwei Tricks auf Bitebene:
Wenn wir entscheiden, ob eine Zelle ein Sternchen ist oder nicht, können wir einfach prüfen, ob das Bit mit der achten Stelle gesetzt ist, da die Zahl in der Zelle kleiner als 8 sein muss (der maximale Zellenwert).
Wir können ein Leerzeichen durch ODER-Verknüpfung von 16 in ein Nullzeichen umwandeln.
Edit: Golfed aus zwei Bytes mit
/
anstelle von>=
.Bearbeiten: Weitere fünf Bytes durch Umkehren der Schleifenrichtung.
quelle
C #, 341 Bytes
Eine naive Implementierung, die definitiv verkürzt werden kann.
quelle
Python 2, 183 Bytes
quelle