Jeder kennt das alte Minensuchspiel, das mit Windows XP geliefert wurde. Es ist ein einfaches Gitter mit einer 9x9-Matrix von Zellen, die entweder eine Zahl (die angibt, wie viele Minen sich daneben befinden) oder eine Mine enthält.
Die Herausforderung besteht darin, ein zufälliges 9x9-Raster mit 10 Bomben zu generieren, wenn Sie einen beliebigen ganzzahligen Startwert (bis zu dem, was der größte Startwert Ihrer Maschine / Sprache ist) mit Brownie-Punkten erhalten, wenn Sie das PRNG selbst implementieren
Beispielausgabe: Zellen enthalten entweder die Ziffern 0-8 oder * für Minen
*101*1000
110111000
123210000
1***10000
123210011
00000002*
00000114*
000112*3*
0001*2121
Kürzester Code in Bytes gewinnt .. Standardregeln etc, etc ..
code-golf
random
minesweeper
Aaron
quelle
quelle
Antworten:
Dyalog APL, 40 Bytes
⎕rl←1⋄(1,¨a)⍕¨{⍉3+/0,⍵,0}⍣2⊢a←9 9⍴9≥?⍨81
(nimmt an
⎕io←0
)das
1
In⎕rl←1
ist der Samevon rechts nach links:
?⍨81
ist das gleiche wie81?81
- eine zufällige Permutation9≥
führt zu einer Bitmaske mit zehn Einsen an zufälligen Positionen, der Rest sind Nullena←9 9⍴
verwandle dich in ein 9-mal-9-Quadrat und nenne es "a"{ }⍣2
mache zweimal folgendes:⍉3+/0,⍵,0
Schiebefenstersumme von 3 Spalten (0s außerhalb annehmen), dann transponieren(1,¨a)⍕¨
ist jeweils das Format (in Zeichenfolge konvertieren). Das linke Argument für⍕
gibt die Gesamtzahl der Zeichen und Bruchzeichen im Ergebnis an. Wenn⍕
es nicht möglich ist, nach dieser Spezifikation zu formatieren, gibt es a aus*
- ein glücklicher Zufall für dieses Problem.a
wird 1 sein, wo die Minen sind - es ist unmöglich, ein ganzes und einen Bruchteil in ein einzelnes Zeichen zu passen, daher werden diese als*
s angezeigt.quelle
⎕io←0
Annahme erklären ? Ich bin nicht vertraut mit Dyalog APL ...⎕io
(der „ Index Origin “) auf 0 macht sie 0-basiert und ändert einige Primitive entsprechend, zum Beispiel⍳3
wird0 1 2
, nicht1 2 3
. Dies kann entweder programmgesteuert (⎕io←0
) oder über die Einstellungen in der Benutzeroberfläche erfolgen. Diese Wahl zu treffen, ist ein 50 Jahre alter Fehler, der die winzige APL-Community von heute immer noch trennt.MATLAB,
9493 BytesBeispiellauf (die erste Zeile nach dem Code ist die vom Benutzer eingegebene Eingabe):
Erläuterung
Nimmt eine ganze Zahl und verwendet sie als Startwert. (Dies funktioniert in modernen MATLAB-Versionen. Alte Versionen benötigen möglicherweise eine andere Syntax.)
ordnet logische
0
oderfalse
(durch logische Negierung erhalten1
zu dem Eintrag)(9,9)
eine Matrixx
. Die restlichen Einträge werden automatisch auch logisch0
initialisiert.ordnet
1
(automatisch umgewandelt in logisch1
odertrue
)10
den81
Einträgen zux
, die nach dem Zufallsprinzip ausgewählt wurden, ohne sie zu ersetzen. Diese Einträge enthalten Bomben.ist eine Abkürzung von
conv2(+x,ones(3),'same')
. Es faltet die Matrixx
(in die gegossendouble
werden muss+
) mit einem 3 × 3-Nachbarschaftsgehalt zusammen1
. Dies zählt, wie viele Bomben sich neben jedem Eintrag befinden. Einträge, die eine Bombe enthalten, enthalten diese Bombe, der Wert wird jedoch später überschrieben.Addiert 48 zum Wert, um von Zahl in ASCII-Code zu konvertieren. Durch die Verkettung mit der leeren Matrix werden diese ASCII-Codes in Zeichen umgewandelt.
weist
'*'
den Positionen der Bomben 42 (ASCII-Code für ) zu. Diese Positionen sind gegeben durchx
, was hier als logischer Index verwendet wird.zeigt das Ergebnis an.
quelle
Javascript (ES6), 204 oder 198 Bytes
Benutzerdefiniertes PRNG (204 Byte)
Dieser Code verwendet einen linearen Kongruenzgenerator mit Multiplikator
22695477
und Inkrement1
(dies ist die Borland C / C ++ - Implementierung).Aufgrund der schlechten Effizienz des PRNG während seiner Aufwärmphase musste ich eine Bombe pro Reihe platzieren (anstelle von 10 am Anfang oder 10 am Ende des nicht gemischten Arrays). Es gibt also nur 9 Bomben. Ich kann versuchen, das später zu beheben.
Außerdem muss es eine einfachere / kürzere Möglichkeit geben, den "Out-of-Board" -Scheck zu verarbeiten,
(x=p%9-(n+=p)%9)*x-64
aber ich kann es gerade nicht herausfinden.Verwenden von Math.random () (198 Bytes)
Dieser beinhaltet 10 Minen wie gewünscht.
Demo
quelle
'**********'+'0'
ist gleich'**********'+0
; das spart zwei bytes bei der 198-byte-version.'0'
soll das wiederholt werden und0.repeat()
würde nicht funktionieren....('**********'+0).repeat(71)
. Es tut uns leid.Python 2,
269266264 BytesProbieren Sie es auf ideone.com
2 Bytes gespart dank Aaron.
Höchstwahrscheinlich noch golffähig.
Erläuterung
random
wird importiert,seed
um das PRNG zu säen undsample
zehn Bombenstandorte zufällig auszuwählen.m
ist eine 9 x 9 Matrix, die das Board speichert. Für jede der Bombenpositionen wird der entsprechende Eintrag in aufm
gesetzt-9
und alle benachbarten Einträge werden inkrementiert. Auf diese Weise erhalten Siem
die Anzahl benachbarter Bomben für Nicht-Bomben-Zellen und eine negative Zahl für Bomben-Zellen. Das endgültigeprint
druckt das ganze Brett durch Iterieren durch alle Linienl
inm
und alle Zellenc
inl
.quelle
sample()
for a in z:
Block (nur Python 2.x)R, 187 Bytes
Probieren Sie es auf Ideone
Erläuterung:
set.seed()
nimm einen samen.x
ist der Index für eine 11 * 11-Matrixy
ist der Index der 9 * 9-Matrix in der 11 * 11-Matrixz
ist der Index der Bombex=x*0
Initialisieren Sie den MatrixwertDie Schleife addiert 1 zu x im Falle einer benachbarten Bombe.
quelle
JavaScript ES6, 244 Bytes
quelle
`
Zeichen.Ruby ,
181194183 + 1 = 184 BytesIch habe vergessen, den Samen tatsächlich zu setzen, hoppla. Verwendet die
-n
Flagge.Probieren Sie es online!
quelle
Python 2 , 172 Bytes
Probieren Sie es online!
quelle