Minesweeper ist ein beliebtes Computerspiel, bei dem Sie wahrscheinlich viel Zeit damit verschwendet haben, die Zellen, die Minen sind, in einem rechteckigen Raster anzuzeigen, basierend auf Hinweisen darauf, wie viele benachbarte Minen jede Nicht-Minenzelle hat. Und falls Sie es noch nicht gespielt haben, tun Sie dies hier .
Eine raffinierte mathematische Tatsache über ein Minesweeper-Gitter (auch bekannt als Board) ist, dass:
Ein Brett und sein Komplement haben die gleiche Gesamtzahl an Minen . ( Beweis )
Das heißt, wenn Sie ein vollständig aufgedecktes Minesweeper-Gitter haben, entspricht die Summe aller Zahlen auf diesem Gitter, dh die Minensumme , der Minensumme des Komplements des Gitters, das das Gitter ist, in dem jede Mine ersetzt wurde mit einer Nichtmine und jede Nichtmine durch eine Mine ersetzt.
Zum Beispiel für das Minesweeper-Gitter
**1..
34321
*2**1
Die Minensumme beträgt 1 + 3 + 4 + 3 + 2 + 1 + 2 + 1 = 17.
Die Ergänzung des Gitters ist
24***
*****
3*44*
das hat mir insgesamt 2 + 4 + 3 + 4 + 4 = 17 wieder.
Schreiben Sie ein Programm, das ein beliebiges Minesweeper-Gitter in Textform aufnimmt, wobei *
eine Mine und 1
durch 8
die Anzahl der Minen neben einer Nicht-Minenzelle dargestellt wird. Sie können .
oder 0
oder
(Leerzeichen) verwenden, um Zellen ohne Minennachbarn Ihrer Wahl darzustellen. Sie können davon ausgehen, dass das Eingaberaster korrekt markiert ist, dh, jede Nicht-Minenzelle gibt genau die Gesamtzahl der Minen an, die orthogonal oder diagonal unmittelbar daneben liegen.
Ihr Programm braucht die Ergänzung des Gitters im gleichen Format drucken (mit dem gleichen .
, 0
oder
wie Sie in der Eingabe erwartet).
Der kürzeste Code in Bytes gewinnt.
- Anstelle eines Programms können Sie eine Funktion schreiben, die das Eingaberaster als Zeichenfolge verwendet und das Komplement-Raster ausgibt oder zurückgibt.
- Ein abschließender Zeilenumbruch in der Eingabe oder Ausgabe ist in Ordnung, es sollten jedoch keine anderen Zeichen als die das Raster bildenden vorhanden sein.
- Sie können davon ausgehen, dass ein 1 × 1-Raster die kleinste Eingabe ist.
Testfälle
Alle Ein- und Ausgänge könnten getauscht werden, da das Komplement des Komplements das ursprüngliche Gitter ist. Die Gitter können auch für weitere Testfälle gedreht werden.
Eingang:
111
1*1
111
Ausgabe:
***
*8*
***
Eingang:
.
Ausgabe:
*
Eingang:
*11*1.1**1...1***1.....1*****1..........
Ausgabe:
1**2***11*****1.1*******1...1***********
Eingabe: ( Cut The Knot-Beispiel )
**212*32
333*33**
1*22*333
222222*1
*33*2232
2**22*2*
Ausgabe:
24***4**
***7**64
*8**7***
******8*
4**7****
*33**5*3
quelle
?
) in der Zeile nach der letzten Zeile der Karte akzeptabel, oder kann ich die Anzahl der Eingabezeilen über die Befehlszeile eingeben?Antworten:
Pyth,
3938 BytesProbieren Sie es online aus: Demonstration
Der Hauptalgorithmus ist wirklich einfach. Ich iteriere einfach über jede Zelle, nehme das umgebende 3x3-Kästchen (oder kleiner, wenn sich die Zelle am Rand befindet) und drucke einen Stern oder die Anzahl der Nicht-Sterne in diesem Kästchen.
Erläuterung:
quelle
CJam,
5857 BytesDie Eingabe sollte nicht mit einem Zeilenvorschub enden. Die Ausgabe enthält
0
für Zellen ohne Minen in der Nähe.Probieren Sie es online im CJam-Interpreter aus .
Idee
Wir beginnen mit dem Auffüllen der Eingabematrix mit einer Zeile und einer Spalte von Sternchen.
Zur Eingabe
das führt zu
Jetzt generieren wir alle möglichen Änderungen, die sich aus dem Drehen der Zeilen und Spalten 0, -1 oder 1 Einheiten nach oben / links ergeben:
Wir verwerfen die "Auffüllorte" von jeder Umdrehung, dh
und bilden Sie eine einzelne Matrix, indem Sie die entsprechenden Zeichen jeder Umdrehung verketten:
Das erste Zeichen jeder Position ist das ursprüngliche Zeichen.
Wenn es sich nicht um ein Sternchen handelt, muss es durch ein Sternchen ersetzt werden.
Wenn es sich um ein Sternchen handelt, entspricht die Anzahl der Nicht-Sternchen in dieser Zeichenfolge der Anzahl der benachbarten Minen.
Wie es funktioniert
quelle
Rubin, 119
Ungolfed im Testprogramm:
quelle
Oktave, 76
Erläuterung
Konvertieren Sie die Eingabezeichenfolge mit
strsplit
und in eine Zeichenfolgenmatrixcell2mat
.Holen Sie sich die logische Matrix, die enthält,
1
wo es keine*
in der ursprünglichen Matrix gibt.Nehmen Sie seine Faltung mit einer 3x3-Matrix von Einsen.
Maskiere es mit der inversen logischen Matrix und setze sie
*
an die Stelle der Maske.Hinweis: Zellen ohne Minennachbarn werden als dargestellt
0
.Ausführung
quelle