Ihr Ziel ist es zu überprüfen, ob ein ausgefülltes Minesweeper- Board gültig ist. Dies bedeutet, dass jede Zahl eine korrekte Anzahl von Minen in benachbarten Zellen, einschließlich Diagonalen, darstellt. Das Board wickelt sich nicht um.
Wie üblich sollten Sie eine Funktion oder ein Programm angeben, und der kürzeste Code in Bytes gewinnt.
Sehen Sie sich auch frühere Herausforderungen an , um Minesweeper zu generieren , zu lösen und vollständig zu implementieren .
Eingang:
Eine einzelne Zeichenfolge wie folgt: 02X2 13X2 X211
.
Die Reihen des Minensuchbrettes sind durch Leerzeichen getrennt. Das Obige repräsentiert also das 3x4-Board:
02X2
13X2
X211
Jede Zelle ist ein Zeichen:
X
für eine Mine oder eine Nummer0
durch8
.Alle Zeilen haben die gleiche Länge.
Es gibt mindestens 3 Zeilen und 3 Spalten.
Die Eingabe beginnt oder endet nicht mit einem Leerzeichen. Wenn Sie möchten, können Sie am Ende eine neue Zeile einfügen.
Ausgabe:
Eine konsistente Wahrheit auf korrekten Boards und ein konsistenter Falsey- Wert auf inkorrekten Boards. Konsistent bedeutet, dass alle Wahrheitsausgaben gleich und alle Falseyausgaben gleich sind.
Testfälle
Jede Zeile ist ein eigener Testfall.
True
:
02X2 13X2 X211
XXXX XXXX XXXX XXXX
XX4X2 5X6X4 XX6XX 4XX54 2X4XX
False
:
02X2 13X2 X212
XXXX XXXX X7XX XXXX
XX5X2 5X6X4 XX6XX 4XX54 2X5XX
quelle
Antworten:
Python 2,
132 129128Ich habe
enumerate
in einem Golf verwendet ... und sogarrange
anderswo im selben Programm verwendet. Hier stimmt eindeutig etwas nicht.Edit: Iteriere
dict(enumerate(s))
lieber überenumerate(s)
,enumerate
muss also nicht zweimal aufgerufen werden.quelle
~
! Und von Wörterbüchern, damit die Indexierung außerhalb der Grenzen funktioniert.~
Betreiber hat mich ironischerweise dazu gebracht, dass ich ihn ohne Grund zweimal verwendet habe, wobei eine einmalige Verwendung offensichtlich das Gleiche bewirken würde. Ich fand den Wörterbuchteil lustig, danke.Pyth, 43
Probieren Sie es hier aus .
Erläuterung:
Jhxzd
: Dies ist die Position des ersten Leerzeichens in der Eingabe + 1. (z
in der Eingabed
ist Leerzeichen.) Dies ist die Trennung in der Eingabe zwischen vertikal benachbarten Zellen auf der Platine.!f
: Dies ist das logische Nicht (!
) eines Filters (f
). Dies istTrue
genau dann der Fall, wenn der Ausdruck für jedes Element der Sequenz falsch ist.-@zT
: Nehmen Sie das Zeichen an der PositionT
(die Lambda-Variable) aus der Eingabe und entfernen Sie alle Erscheinungen von: (Dies ist wahr, wenn das Zeichen nicht entfernt wird, und falsch, wenn dies der Fall ist.+" X"
: Entfernen Sie das Leerzeichen, X und`
: Repr vonsm
: Summe der Karte zu/ \X
: Anzahl der "X" in:+*JNz
: Der Abschnitt der Eingabe, demJ
Dummy-Zeichen vorangestellt sindtd+d2
: Von d-1 bis d + 2.m+T*kJU3
: Für d in [T, T + J, T + 2 * J].Uz
Für T inrange(len(input))
.quelle
APL (NARS2000) (74)
Funktioniert auch in Dyalog APL, wenn auf
⎕ML
gesetzt3
.Erläuterung:
⊃⍵⊂⍨⍵≠' '
: Teilen Sie⍵
die Leerzeichen auf und bilden Sie aus den Listen eine Matrix.G←¯1+⎕D⍳
: Finden Sie den Index in⎕D
für jeden Wert, subtrahieren Sie 1 und speichern Sie diesen inG
. (⎕D
Enthält die Ziffern, alle nicht-Ziffern werden zu10
).Z←G↑⍨2+⍴G
: Fügen Sie am Rand der Matrix zwei Zeilen und Spalten mit Nullen hinzu, um den Umlauf zu bewältigen{
...}¨⍳⍴Z
:Z
Finden Sie für jede Position in die Anzahl der Bomben in der Nachbarschaft von Moore dieser Position:G∘.⊖(G←2-⍳3)∘.⌽⊂Z
: NachZ
links, rechts, oben, unten, links oben, rechts oben, links unten und rechts unten drehen .⍵∘⌷¨
: Finden Sie für jedes dieser Elemente das Element⍵
in jeder dieser gedrehten Matrizen+/∊9<
: Zählen Sie, wie viele Elemente höher als 9 sind (dies ist die Anzahl der Bomben).(⍴G)↑
: entferne die hinzugefügten Nullzeilen wieder,G=
: Überprüfen Sie, ob jedes Element in derG
gleichen Anzahl von Bomben ist, die diese Position umgeben (dies sollte für alle Nicht-Bomben-Quadrate gelten).(G>9)∨
: und überprüfe, ob die ElementeG
höher sind als9
(das sind die Bomben).~0∊
:1
Gibt zurück, wenn die resultierende Matrix keine Nullen enthält (= alle Quadrate sind entweder Bomben oder die richtige Zahl), und0
wenn ja.quelle
C #,
321 320305Versuchen Sie zuerst, etwas Golf zu spielen, und ich weiß, dass C # nicht die ideale Sprache ist.
Ich hoffe, dass das Schreiben einer Instanzmethode erlaubt ist, ansonsten fügen Sie weitere 7 Zeichen für hinzu
static
.Abgetrennt aus:
Durch die Verwendung von Linq wird im Vergleich zu for-Schleifen etwas Platz gespart, das Debuggen ist jedoch schwieriger.
Ich habe ein paar Dinge gelernt, wie das Konvertieren
char => int
durch Subtrahieren'0'
.Es schien einfacher, das Board mit Leerzeichen auszustatten, damit es einfacher wäre, darüber zu iterieren.
quelle
-'0'
durch-48
. Funktioniert für mich und speichert ein paar Bytes für verschiedene 'X' und ''Python 2, 121
Dies ist stark von Feersums Antwort inspiriert . Die Tagesordnung ist übertrieben: Anstatt in den 9 Nachbarn der Zelle nach Minen zu suchen, überprüfen Sie jede einzelne Zelle, um festzustellen, ob es sich um eine benachbarte Mine handelt.
Wir prüfen, ob zwei Zellen Nachbarn sind
2>r>-2<c<2
, wobeir
und woc
die Zeilen- und Spaltendifferenzen von Zellen äquivalent sind{r,c}<{-1,0,1}
. Diese Koordinaten werden aus den ZellindizesI
undi
alsc=I%n-i%n
und berechnetr=I/n-i/n
. Es ist effizienter, die Zeichenfolge direkt zu indizieren und Zeilen und Spalten zu extrahieren, als sie in ein 2D-Objekt wie eine Liste von Listen zu konvertieren. Der Minencheck istB[i]>'W'
hier gleichbedeutend mitB[i]=='X'
.Die Verwendung von
enumerate
hätte zwei Zeichen über dem Hässlichen gespeichert, mit derrange(len(B))
Ausnahme, dass ein Iteratorobjekt zurückgegeben wird, das keine zwei verschachtelten Schleifen unterstützt.quelle
~B.find
./
weil es auch Negative nach unten rundet.Python 2, 140
quelle
JavaScript (ES6),
135133125122Geben Sie die Funktion als Zeichenfolge ein:
Eine Erklärung finden Sie in der alten Version weiter unten. Die neue Version ersetzt die
for
Schleifen mitevery
Anrufen und verwendet die Variablee="every"
zu tun ,someArray[e](...)
stattsomeArray.every(...)
.Außerdem ist der Zähler
k
jetzt auf indexiert,1
sodass derk+=...
Ausdruck immer wahr ist, um dieevery
Schleife am Laufen zu halten . Wir eliminieren dieses Extra1
durch Subtrahieren destrue
Ergebnisses (das numerisch erzwungen wird1
), das von derevery
Operation zurückgegeben wird[-1,0,k=1][e](...)
.Alte Version:
Code mit Leerzeichen und Kommentaren:
Die JavaScript-
every
Array-Methode nimmt einen Rückruf entgegen und wendet den Rückruf auf jedes Element des Arrays an. Wenn ein Rückruf einen falschen Wert zurückgibt, wird derevery
Anruf zurückgegebenfalse
.Boolesche Werte in JS werden als Teil einer Addition auf 1 oder 0 gesetzt. Für jeden umgebenden Raum "addieren" wir das boolesche Ergebnis des Vergleichs seines Werts mit
X
und addieren diesen Wert dann zum Zählerk
im Ausdruckk += (... == "X")
. Daherk
enthält eine Zählung der Anzahl der umgebendenX
s, datrue
zählt als1
undfalse
zählt als0
.quelle
c=="X"
versuchen!c/1
, das spart Ihnen eine Menge von ein paar Bytes! Wenn es fehlschlägt, versuchen Sie es!!c/1
. Die Argumentation ist die'X'/1 => NaN
, undNaN
ist falsch. Sie prüfen, obc=='X'
und warum nicht, ob dies nicht derfalse
Fall ist.(!c)/1
, was leider nicht hilft; Ich brauche die Klammern für!(c/1)
, die 2 kosten. Auch0/1
ist falsch, so dass die ungültige Eingabe "0X
" das falsche Ergebnis hättetrue
. Das Beste, was ich tun kann, während ich immer noch Nullen respektiere, ist, die beiden Bedingungen zu einer negierten Phrase zu kombinieren!(+c+1&&k-c)
, aber das ist die gleiche Länge wie das, was ich bereits habe.!(k-1-c)
beide Bedingungen getestet werden, denn wennk
Übereinstimmungenc
(abzüglich des 1-Offsets) vorliegen, ergibt die Negation die0
Wahrheit, und wennc
es sich nicht um eine Zahl handelt, erhalten wirNaN
und die Negation ist auchtrue
.CJam,
70 6563 BytesDies kann viel Golf gespielt werden.
Gibt
1
für eine gültige Karte und0
für eine ungültige Karte.Testfälle
Eingang
Ausgabe
Probieren Sie es hier online aus
quelle
JavaScript (ES6) 98
Verwenden Sie some , um eine Funktion auf jedes Zeichen der Zeichenfolge anzuwenden.
Die Funktion kehrt zurück
Die innere Prüfung erfolgt mit map, nur weil sie kürzer als forEach ist
Einige geben beim ersten Wahrheitswert (in diesem Fall ungleich Null) true zurück, was bedeutet, dass die Prüfung fehlgeschlagen ist. Das Ergebnis wird negiert, um ein besser erkennbares Wahr / Falsch zu erhalten.
Test In FireFox / Firebug - Konsole
Ausgabe
quelle
R 156 Zeichen
Mit Einrückungen, Leerzeichen und Zeilenumbrüchen zur besseren Lesbarkeit:
Beispiele:
quelle