Campo Minado é um jogo de quebra-cabeça onde as minas estão escondidas em torno de um tabuleiro de peças indefinidas com o objetivo de identificar a localização de todas as minas. Clicar em uma mina perde o jogo, mas clicar em qualquer outra peça revela um número de 0 a 8, o que significa quantas minas a cercam diretamente.
Dado um número, você deve exibir uma combinação * aleatória possível de ladrilhos vazios e minas ao redor. Isso deve estar na forma de uma matriz 3x3. O bloco central deve ser o número de minas tomadas como entrada.
* Deve ter uma chance diferente de zero para que todas as combinações ocorram.
Exemplos
_ = blank square
X = mine
0
___
_0_
___
1
_X_
_1_
___
1
___
_1_
X__
___
_1_
__X
4
_X_
X4X
_X_
4
X_X
_4_
X_X
4
___
X4X
X_X
8
XXX
X8X
XXX
Entrada
- O número de minas ao redor do ladrilho central (0-8)
Saída
- Qualquer forma razoável de saída que exibe a matriz 3x3 de blocos
Outras regras
- Cada combinação não precisa ter uma chance igual de acontecer. Só deve haver uma chance diferente de zero de cada combinação ao executar seu programa.
- Podem ser escolhidos 2 caracteres para a mina e o ladrilho vazio.
- Isso é código de golfe, o programa com menos bytes vence.
code-golf
random
minesweeper
aoemica
fonte
fonte
1
e0
?Respostas:
Geléia , 9 bytes
Experimente online!
vazio =
1
meu =
0
Observe que
1
e0
são números inteiros.Outra observação: isso é um pouco semelhante à resposta de 10 bytes de Jonathan Allan, mas não é realmente influenciada por ela, e o mecanismo, se você prestar muita atenção, é realmente mais diferente do que à primeira vista.
fonte
APL (Dyalog Unicode) ,
2815 bytes-13 bytes graças a ngn!
Explicação:
{...}
Uma função direta (D-Fn),⍵
é o seu argumento correto.8?8
negocie 8 números aleatórios da lista 1..8:⍵≥
o argumento é maior ou igual a cada um deles?⍵,
Anexe o argumento à lista booleana:5⌽
gire a lista 5 posições para a esquerda, para que o argumento esteja no centro:3 3⍴
remodelar a lista para uma matriz 3x3:Experimente online!
J , 15 bytes
Também muitos bytes graças ao ngn!
Experimente online!
fonte
(8↑1⍴⍨⍵)[8?8]
->⍵>8?8
(assumindo⎕io←0
)3 3⍴1↓,⍵,2 4⍴
->3 3⍴5⌽⍵,
JavaScript (ES6), 67 bytes
Versão mais curta sugerida por @tsh
Slots vazios são
0
, minas são1
.Experimente online!
Versão original de tentativa e erro, 78 bytes
Slots vazios são
_
, minas são7
.Experimente online!
Comentado
fonte
Gelatina ,
1310 bytesA lista de listas retornada tem o número inteiro exibido no centro, cercado por 0s e 1s, representando minas e espaços em branco, respectivamente.
Experimente online! (rodapé bastante imprime a matriz)
Quão?
fonte
ŒH
também funciona no lugar des4
.Pitão,
1614 bytesEconomizou 2 bytes graças a isaacg.
Usa espaços para pontos seguros e cotações para minas.
Experimente aqui
Explicação
fonte
.[d8
em vez de>8+*8d
Oracle 18 SQL, 230 bytes
Não é uma língua de golfe, mas ...
O valor de entrada está em uma tabela
n
com colunan
:Experimente online - faça login em https://livesql.oracle.com e cole-o em uma planilha.
Saída:
Para obter todas as combinações possíveis (183 bytes):
Saída:
fonte
Japonês, 13 bytes
Tente
Explicação
fonte
QBasic 1.1 ,
206186 bytes-20 graças ao DLosc (truque de golfe recém-publicado).
Vazio =
0
Meu =
1
Observe que
0
e1
são números inteiros, mas estou usando STDOUT de qualquer maneira, então ...A saída aparece assim:
Onde AH são 0/1 e x é a entrada.
fonte
Carvão , 19 bytes
Experimente online! Link é a versão detalhada do código. Usa
0
para uma mina,1
para um espaço vazio. Explicação:Peek
retorna uma matriz de seqüências de caracteres, queSum
simplesmente concatena, e é por isso que precisamos converter o número inteiro primeiro. (Sum(Sum(PeekAll()))
também funciona.)Sum
retornaNone
para uma matriz vazia (primeiro loop), portanto, a única comparação segura éNot(Equals(...))
.Random
sempre retorna0
, embora sua documentação diga o contrário.Solução alternativa, eram 19 bytes, agora 17 bytes após uma correção de bug do Charcoal:
Experimente online! Link é a versão detalhada do código. Usa
0
para uma mina,1
para um espaço vazio. Explicação:Imprima a entrada original.
Imprima uma
9
para a esquerda. Isso move o cursor de volta sobre a entrada original e também força pelo menos uma iteração do loop while (caso contrário, uma entrada de8
não faria nada).Repita enquanto a diferença entre a soma de todos os dígitos na tela e 8 for diferente de zero:
Substitua cada um dos caracteres ao redor aleatoriamente por
0
ou1
.fonte
R ,
67 63 6259 bytesExperimente online!
Usos
1
e0
. Construa umn* 1 +(8-n)* 0
vetor, embaralhe-o, acrescenten
, construa a matriz maior mostrada abaixo (ondea...i
estão os elementos do vetor original) e extrai a sub-matriz adequada mostrada em maiúscula:fonte
matrix((c(sample(rep(1:0,c(n<-scan(),8-n))),n))[c(1:4,9:5)],3)
Python 2 , 93 bytes
Experimente online!
0
para vazio;1
para uma mina; en
para si mesmo.fonte
iter
é inteligente!Anexo , 51 bytes
Experimente online!
Explicação
Igual a resposta J / APL de Galen , a técnica básica é gerar uma matriz de 1s e 0s com o número correto de minas, inserindo a entrada anexando-a ao final, girando a matriz de modo que a entrada fique no centro e depois remodelando em uma matriz 3x3.
Parte 1: gerando a matriz binária
Existem várias maneiras de fazer isso, mas eu deparei principalmente com dois tipos: força bruta e seleção.
O método primário de força bruta se parece com isso:
Isso gera matrizes aleatórias de 8 dígitos binários (
Random[8&2]
) enquanto suas somas não são iguais à entrada{Sum@_/=_2}&_
. Isso é um pouco detalhado, pois as seguintes partes enfatizadas do código existem "apenas para fazê-lo funcionar":E eu descartei a ideia.
A seleção é mais interessante. O conceito principal é usar o
BaseBelow[b, n]
builtin, que gera uma lista de todos osb
números inteiros base da larguran
(como matrizes de dígitos), de0
atéb^n-1
. Por exemplo,BaseBelow[3, 2]
gera todos os números inteiros ternários de largura 2:Nós usamos especificamente
BaseBelow[2, 8]
para todos os números inteiros binários de largura 8. Eles representam todos os campos minados possíveis de todos os comprimentos. Este é o primeiro passo.O segundo passo é selecionar todas essas matrizes apenas
N
1s, ondeN
está a entrada. Minha primeira idéia foi traduzir essa declaração em inglês diretamente no Attache:No entanto, isso não apenas resultou em 1 byte mais do que a abordagem mencionada, como também é altamente repetitivo - e ainda nem foi randomizado! Claro, eu provavelmente poderia economizar 1 byte reorganizando como
BaseBelow
é chamado, mas simplesmente não vale a pena usar a abordagem.Então, decidi matar dois coelhos com uma cajadada e usar uma
Shuffle
abordagem baseada. A seguir, são apresentados todos os campos minados válidosN
em ordem aleatória:Então, tudo o que precisa ser feito é selecionar o primeiro. Mas posso fazer melhor - certamente seria melhor simplesmente
Sample
a matriz filtrada? Essa abordagem acaba sendo algo assim:Eu tive que reverter o
BaseBelow&8!2
golfe porque\
a precedência é muito alta. Caso contrário, satisfeito, passei a cortar um byte disso:(Descobri outra maneira de chamar sucintamente uma função diádica aqui:
x&f@y
é uma expressão de alta precedência que é avaliada comof[x, y]
).No entanto, apesar disso, eu me lembrei que, o tempo todo, um alias para
2&BaseBelow
existido:BinBelow
. Então eu usei isso:Isso gera o campo minado desejado. Estou convencido de que isso é quase ideal.
Parte 2: formando a matriz
Como dito anteriormente, a técnica de formação que usei é semelhante à resposta J / APL, portanto não entrarei em muitos detalhes. Suponha que
MINEFIELD
é o resultado da última seção. A função então se torna:MINEFIELD'_
concatena o campo minado com a entrada original_
, dando-nos algo como isto:Em seguida,
Rotate[MINEFIELD'_,4]
gire esta lista4
vezes para a esquerda, colocando o centro:A última etapa está sendo usada
[3,3]&
para remodelar a lista em uma matriz 3x3:fonte
Java 10,
165157141 bytesAs peças vazias são
_
(qualquer caractere com um valor unicode acima de 58 é bom) e as minas são0
.Experimente online.
Explicação:
fonte
PowerShell , 77 bytes
Experimente online!
fonte
PHP ,
135134123117 117122121 bytesFazer um loop sobre str para imprimir economiza 1 byte
str_split e implode para inserir o número do centro economiza 11 bytes
Não é mais necessário atribuir a string a $ s, economizando 6 bytesSim, você . Caso contrário, a corda é embaralhada após cada eco ...
A remoção de espaço em branco após o eco economiza 1 byte
Substituir "\ n" por uma quebra de linha real economiza 1 byte
Experimente online!
fonte
Alice , 24 bytes
Experimente online!
Os slots vazios são
9
e as minas são0
.Também fiz um programa de 27 bytes
1
para minas e0
slots vazios:Experimente online!
fonte
PowerShell ,
9186 bytes-5 bytes graças ao mazzy
Experimente online!
Baralha aleatoriamente uma cadeia de caracteres gerada que varia de
________
aXXXXXXXX
(substituindo da esquerda). Em seguida, ele corta várias vezes, inserindo$n
no meio, para criar a sequência de saída. Esta última parte provavelmente pode ser bastante otimizada, pois cada índice custa no mínimo 5 bytes.fonte
Rubi , 59 bytes
Retorna uma lista de strings (uma para cada linha).
Experimente online!
fonte
C (gcc) , 81 bytes
Experimente online!
fonte
Perl 5
-pa
,105101 bytesExperimente online!
fonte
05AB1E , 12 bytes
Usa
0
para minas, espaços para quadrados em branco. Produz uma lista de linhas, que é bastante impressa nos TIOs abaixo, juntando-se ao delimitador de nova linha (»
).Experimente online ou verifique mais alguns casos de teste de uma só vez .
Explicação:
Alternativa de 12 bytes :
Usa
1
para minas,0
para quadrados em branco. Produz uma matriz de dígitos, que é bastante impressa nos TIOs abaixo, juntando cada linha e, em seguida, essas linhas com delimitador de nova linha (J»
).Experimente online ou verifique mais alguns casos de teste de uma só vez .
Explicação:
fonte