Todos conocen el antiguo juego de buscaminas que se incluye con Windows XP. Es una cuadrícula simple con una matriz de celdas de 9x9 que contiene un número (que indica cuántas minas hay adyacentes) o una mina.
El desafío es generar una cuadrícula aleatoria de 9x9 con 10 bombas con cualquier semilla entera (hasta lo que sea el int más grande de su máquina / idioma) con puntos de brownie si implementa el PRNG usted mismo
salida de ejemplo: las celdas contienen números 0-8 o * para minas
*101*1000
110111000
123210000
1***10000
123210011
00000002*
00000114*
000112*3*
0001*2121
El código más corto en bytes gana ... reglas estándar, etc., etc.
code-golf
random
minesweeper
Aaron
fuente
fuente
Respuestas:
Dyalog APL, 40 bytes
⎕rl←1⋄(1,¨a)⍕¨{⍉3+/0,⍵,0}⍣2⊢a←9 9⍴9≥?⍨81
(asume
⎕io←0
)el
1
en⎕rl←1
es la semillade derecha a izquierda:
?⍨81
es lo mismo que81?81
- una permutación aleatoria9≥
da como resultado una máscara de bits que contiene diez 1s en posiciones aleatorias, el resto son 0sa←9 9⍴
remodelar a un cuadrado de 9 por 9 y llamarlo "a"{ }⍣2
haz lo siguiente dos veces:⍉3+/0,⍵,0
ventana deslizante suma de 3 columnas (suponga 0s afuera), luego transponga(1,¨a)⍕¨
es formato (convertir a cadena) cada uno. El argumento izquierdo para⍕
especifica el número total de caracteres y caracteres fraccionarios en el resultado. Si⍕
no puede formatear de acuerdo con esa especificación, genera una*
- una coincidencia afortunada para este problema.a
será 1 donde están las minas; es imposible tratar de encajar una parte entera y fraccional en un solo carbón, por lo que aparecerán como*
s.fuente
⎕io←0
suposición? No estoy familiarizado con Dyalog APL ...⎕io
(el " Origen del índice ") en 0 los hace basados en 0 y cambia algunas primitivas en consecuencia, por ejemplo⍳3
, será0 1 2
, no1 2 3
. Eso se puede hacer mediante programación (⎕io←0
) o desde las preferencias en la GUI. Tener esta opción es un error de 50 años que aún divide la pequeña comunidad APL de hoy.MATLAB,
9493 bytesEjemplo de ejecución (la primera línea después del código es la entrada escrita por el usuario):
Explicación
toma un número entero y lo usa como semilla. (Esto funciona en versiones modernas de MATLAB. Las versiones antiguas pueden necesitar una sintaxis diferente).
asigna lógico
0
ufalse
(obtenido negando lógicamente1
) a la entrada(9,9)
de una matrizx
. El resto de las entradas también se inicializan automáticamente a lógico0
.asigna
1
(automáticamente convertido a lógico1
, otrue
) a10
las81
entradas dex
, elegidas al azar sin reemplazo. Estas entradas son las que contienen bombas.es una abreviatura de
conv2(+x,ones(3),'same')
. Convoluciona la matrizx
(que necesita ser convertidadouble
, usando+
) con una vecindad de 3 × 3 que contiene1
. Esto cuenta cuántas bombas hay adyacentes a cada entrada. Para las entradas que contienen una bomba, incluye esa bomba, pero el valor allí se sobrescribirá más adelante.agrega 48 al valor, para convertir de número a código ASCII. La concatenación con la matriz vacía convierte estos códigos ASCII en caracteres.
asigna 42 (código ASCII para
'*'
) a las posiciones de las bombas. Estas posiciones están dadas porx
, que aquí se usa como un índice lógico.Muestra el resultado.
fuente
Javascript (ES6), 204 o 198 bytes
PRNG personalizado (204 bytes)
Este código está utilizando un generador congruencial lineal con multiplicador
22695477
e incremento1
(esta es la implementación de Borland C / C ++).Debido a la pobre eficiencia del PRNG durante su fase de calentamiento, tuve que colocar una bomba por fila (en lugar de 10 al principio o 10 al final de la matriz sin mezclar). Entonces, solo hay 9 bombas. Puedo tratar de arreglar eso más tarde.
Además, debe haber una forma más simple / más corta de procesar la verificación 'fuera de borda',
(x=p%9-(n+=p)%9)*x-64
pero no puedo resolverlo en este momento.Usando Math.random () (198 bytes)
Este incluye 10 minas según lo solicitado.
Manifestación
fuente
'**********'+'0'
es igual a'**********'+0
; eso ahorra dos bytes en la versión de 198 bytes.'0'
se supone que esto se repite y0.repeat()
no funcionaría...('**********'+0).repeat(71)
. Lo siento.Python 2,
269266264 bytesPruébalo en ideone.com
Guardado 2 bytes gracias a Aaron.
Lo más probable es que sea golfable.
Explicación
random
se importa para usarseed
para sembrar el PRNG ysample
seleccionar diez ubicaciones de bombas al azar.m
es una matriz de 9 x 9 que salva el tablero. Para cada una de las ubicaciones de bombas, la entrada correspondiente enm
se establece en-9
y todas las entradas vecinas se incrementan. Esta formam
termina conteniendo el recuento de bombas adyacentes para las células que no son bombas y un número negativo para las células de la bomba. Las últimasprint
impresiones de todo el tablero por iteración a través de todas las líneasl
enm
y todas las célulasc
enl
.fuente
sample()
for a in z:
bloque (solo python 2.x)R, 187 bytes
Pruébalo en Ideone
Explicación:
set.seed()
tomar una semilla cst.x
es el índice para una matriz 11 * 11y
es el índice de la matriz 9 * 9 en la matriz 11 * 11z
es el índice de la bombax=x*0
inicializar el valor de la matrizEl bucle agrega 1 a x en caso de bomba adyacente.
fuente
JavaScript ES6, 244 bytes
fuente
`
carácter.Rubí ,
181194183 + 1 = 184 bytesSe olvidó de establecer la semilla, whoops. Usa la
-n
bandera.Pruébalo en línea!
fuente
Python 2 , 172 bytes
Pruébalo en línea!
fuente