Todo mundo conhece o antigo jogo do caça-minas que acompanha o Windows XP. É uma grade simples com uma matriz 9x9 de células contendo um número (indicando quantas minas estão adjacentes a ela) ou uma mina.
O desafio é gerar uma grade 9x9 aleatória com 10 bombas dadas qualquer semente inteira (até o maior int da sua máquina / idioma) com pontos brownie se você implementar o PRNG você mesmo
saída de exemplo: as células contêm números de 0 a 8 ou * para minas
*101*1000
110111000
123210000
1***10000
123210011
00000002*
00000114*
000112*3*
0001*2121
O menor código em bytes vence. Regras padrão etc, etc.
code-golf
random
minesweeper
Aaron
fonte
fonte
Respostas:
Dyalog APL, 40 bytes
⎕rl←1⋄(1,¨a)⍕¨{⍉3+/0,⍵,0}⍣2⊢a←9 9⍴9≥?⍨81
(assume
⎕io←0
)o
1
in⎕rl←1
é a sementeda direita para esquerda:
?⍨81
é o mesmo que81?81
- uma permutação aleatória9≥
resulta em uma máscara de bit contendo dez 1s em posições aleatórias, o restante são 0sa←9 9⍴
remodelar para um quadrado de 9 por 9 e chamá-lo de "a"{ }⍣2
faça o seguinte duas vezes:⍉3+/0,⍵,0
soma da janela deslizante de 3 colunas (assuma 0s fora) e transponha(1,¨a)⍕¨
é o formato (converter em string) cada. O argumento esquerdo para⍕
especifica o número total de caracteres e caracteres fracionários no resultado. Se⍕
não puder formatar de acordo com essa especificação, gera uma*
- uma coincidência de sorte para este problema.a
será 1 onde as minas estão - tentar encaixar uma parte inteira e fracionária em um único caractere é impossível; portanto, essas aparecerão como*
s.fonte
⎕io←0
suposição? Eu não estou familiarizado com Dyalog APL ...⎕io
(o " Índice de Origem ") para 0 torna-base 0 e muda algumas primitivas em conformidade, por exemplo,⍳3
será0 1 2
, não1 2 3
. Isso pode ser feito programaticamente (⎕io←0
) ou a partir das preferências na GUI. Ter essa escolha é um erro de 50 anos que ainda divide a pequena comunidade de APL de hoje.MATLAB,
9493 bytesExemplo de execução (a primeira linha após o código é a entrada digitada pelo usuário):
Explicação
pega um número inteiro e o usa como semente. (Isso funciona nas versões modernas do MATLAB. As versões antigas podem precisar de uma sintaxe diferente.)
atribui lógico
0
, oufalse
(obtido negando logicamente1
) à entrada(9,9)
de uma matrizx
. O restante das entradas também é inicializado automaticamente para lógico0
.atribui
1
(convertido automaticamente para lógico1
outrue
) para10
as81
entradas dex
, escolhidas aleatoriamente sem substituição. Essas entradas são as que contêm bombas.é uma abreviação de
conv2(+x,ones(3),'same')
. Ele envolve a matrizx
(que precisa ser convertida emdouble
, usando+
) com uma vizinhança 3 × 31
. Isso conta quantas bombas estão adjacentes a cada entrada. Para entradas que contêm uma bomba, ela inclui essa bomba, mas o valor será substituído posteriormente.adiciona 48 ao valor, para converter de número em código ASCII. Concatenar com a matriz vazia lança esses códigos ASCII em caracteres.
atribui 42 (código ASCII para
'*'
) às posições das bombas. Essas posições são dadas porx
, que é usada aqui como um índice lógico.exibe o resultado.
fonte
Javascript (ES6), 204 ou 198 bytes
PRNG personalizado (204 bytes)
Este código está usando um gerador congruencial linear com multiplicador
22695477
e incremento1
(esta é a implementação do Borland C / C ++).Devido à baixa eficiência do PRNG durante a fase de aquecimento, tive que colocar uma bomba por linha (em vez de 10 no início ou 10 no final da matriz não embaralhada). Portanto, existem apenas 9 bombas. Eu posso tentar consertar isso mais tarde.
Além disso, deve haver uma maneira mais simples / mais curta de processar a verificação 'fora do quadro',
(x=p%9-(n+=p)%9)*x-64
mas não consigo descobrir agora.Usando Math.random () (198 bytes)
Este inclui 10 minas, conforme solicitado.
Demo
fonte
'**********'+'0'
é igual a'**********'+0
; que salva dois bytes na versão de 198 bytes.'0'
deve ser repetido e0.repeat()
não funcionaria....('**********'+0).repeat(71)
. Desculpe.Python 2,
269266264 bytesExperimente em ideone.com
Economizou 2 bytes graças a Aaron.
Muito provavelmente ainda jogável.
Explicação
random
é importado para usarseed
para propagar o PRNG esample
selecionar dez locais de bomba aleatoriamente.m
é uma matriz 9 x 9, salvando a placa. Para cada local da bomba, a entrada correspondentem
é definida como-9
e todas as entradas vizinhas são incrementadas. Dessa forma,m
acaba contendo a contagem de bombas adjacentes para células que não são de bomba e um número negativo para células de bomba. Os finaisprint
gravuras toda a placa fazendo a iteração através de todas as linhasl
emm
e todas as célulasc
eml
.fonte
sample()
for a in z:
do bloco (somente pitão 2.x)R, 187 bytes
Experimente no Ideone
Explicação:
set.seed()
pegue uma semente cst.x
é o índice para uma matriz 11 * 11y
é o índice da matriz 9 * 9 na matriz 11 * 11z
é o índice da bombax=x*0
inicializar o valor da matrizO loop adiciona 1 a x em caso de bomba adjacente.
fonte
JavaScript ES6, 244 bytes
fonte
`
caractere.Ruby ,
181194183 + 1 = 184 bytesEsqueci de realmente colocar a semente, gritos. Usa a
-n
bandeira.Experimente online!
fonte
Python 2 , 172 bytes
Experimente online!
fonte