Campo Minado é um jogo de quebra-cabeça popular, onde você deve descobrir quais peças são "minas" sem clicar nessas peças. Cada peça é uma mina (representada por *
) ou uma pista, ou seja, um número de 0 a 8 representando quantas das 8 peças vizinhas são minas. Sua tarefa hoje é pegar uma placa contendo as minas e preencher todas as pistas. Por exemplo, observe a seguinte placa 5x4, com 5 minas:
*
* *
*
*
Depois de preencher as pistas, o quadro ficará assim:
2*211
*33*1
12*32
0112*
Detalhes
Você deve escrever um programa completo ou uma função que capte uma grade de caracteres contendo apenas espaços e asteriscos e produza outra grade em que cada espaço seja substituído pelo número de minas adjacentes (asteriscos). Qualquer um destes são formatos aceitáveis para suas grades:
Uma string com novas linhas
Uma lista 2D de caracteres / cadeias de caracteres únicos
Uma lista de strings
Você pode assumir que a grade será de pelo menos 1x1, embora seja possível que seja todas as minas ou todos os espaços.
A grade de entrada sempre será preenchida com o número apropriado de espaços. Como de costume, esse é um código de golfe , então as brechas padrão se aplicam e a resposta mais curta em bytes vence!
IO de amostra
Para que você possa ver o espaço em branco, mostrarei todas as E / S de amostra com colchetes ao redor.
Input:
[ * ]
[* ]
[ ]
[ ]
[ ** ]
[ * * ]
Output:
[1101*1]
[*10111]
[110000]
[012210]
[12**21]
[1*33*1]
Input:
[****]
[****]
Output:
[****]
[****]
Input:
[ ]
[ ]
[ ]
[ ]
Output:
[000]
[000]
[000]
[000]
Input:
[* ]
[** ]
[ ]
[ *]
Ouput:
[*310]
[**10]
[2221]
[001*]
Input:
[** ]
[* *]
[ * ]
[ ]
[* ]
[**** ]
Output:
[**1011]
[*4211*]
[12*111]
[121100]
[*43210]
[****10]
Input:
[ * ]
[ * ]
[ * ]
[** *** ]
[ *** ]
[ ]
[ ** ]
[ * * ]
[* ** ]
[ ** ]
Output:
[00001*1111]
[00002221*1]
[22102*4321]
[**102***31]
[221013***1]
[0000013542]
[0112111**1]
[12*2*12442]
[*212112**2]
[1100002**2]
fonte
Respostas:
MATL ,
1817 bytesObrigado a @ mbomb007 pela correção na entrada do caso de teste 6
A entrada é uma matriz de caracteres 2D, no formato
Experimente online!
Casos de teste: 1 , 2 , 3 , 4 , 5 , 6 .
Explicação
fonte
JavaScript (ES6),
11496 bytesEditar: salvou 18 bytes graças a uma ideia de @ETHproductions.
fonte
a=>a.map((s,i)=>s.replace(/ /g,(_,j)=>a.slice(i-!!i,i+2).reduce((t,s)=>t+(q=i=>s[i+j]>' ')(-1)+q(0)+q(1),0)))
R,
127112 bytesobrigado a @gtwebb e @ sebastian-c por melhorias.
Pontos notáveis:
Matrizes são vetores em R. Você não precisa de indexação 2D para obter elementos.
seq(M)
retornará uma sequência do mesmo "comprimento" (linhas x colunas) queM
.Você não pode misturar índices de extração positivos e negativos em R.
M[-3]
é o código R legítimo, mas não o que é desejado.A entrada está na forma de uma matriz R. Alguns exemplos:
fonte
T
vez deTRUE
. Eu consegui deslizar algumas chaves fora de uma das funções if também:f=function(M){a=nrow(M);b=ncol(M);for(i in seq(M))if(M[i]!="*")M[i]=sum(M[pmax(i+c(-1,1,-a+-1:1,a+-1:1),0)]=="*",na.rm=T);M}
b=ncol(M)
e, em seguida, não o usa para se livrar disso.M->{a=nrow(M);p=M=='*';M[]=ifelse(p,'*',sapply(seq(M),i->sum(p[pmax(i+c(-1,1,-a+-1:1,a+-1:1),0)],na.rm=T)))}
- no entanto, este fraudes ligeiramente porque requer uma redefinição<-
lambda, consulte klmr / funcional / lambdaJava, 190 bytes
Editar:
Snipet
Ungolfed:
Ideone it.
fonte
x,y,i,j
c[i][j]==32
e assim por diante e apenas mudou-los na parte Ungolfed0000*1\n*10011\n110000\n000000\n00**10\n0*22*1
. Você poderia adicionar um link de teste ideone.com? EDIT: Além disso, a menos que eu estou fazendo algo errado eu, sua saída código golfed:ssss0s\n0sssss\nssssss\nssssss\nss00ss\ns0ss0s
para o primeiro caso de teste (que substituiu todos*
com zeros ..): SJavaScript (ES6), 107
Entrada / saída como uma matriz de strings
note que quando a função s é chamada com um elemento da lista l fora dos limites, o parâmetro
a
éundefined
ec+a
resultará em" undefined"
graças às regras peculiares de conversão do javascriptMais legível
fonte
Python 2, 138 bytes
Define uma função
f
que aceita uma sequência de entrada comoe imprime uma string para STDOUT:
fonte
enumerate(s,2)
) e substitua todas as ocorrências dei + 2
withi
ei - 1
withi - 3
. Isso reduzirá alguns bytes.JavaScript (ES6)
186182177161152 bytesAtualizar
O código acima para
" *"
devoluções"2*"
. Isso foi corrigido no seguinte script.168167 bytesExperimente aqui.
fonte
t+=(a[x+i%3-1]||[])[y+i/3-1|0]==k
deve funcionar de maneira semelhante e salvar a partetry
/catch
.(a[x+i%3-1]||1)[y+i/3-1|0]
.Haskell, 115 bytes
Define uma função
f
nas listas de stringsfonte
Python 2, 192 bytes
-3 bytes graças ao cobre, -10 bytes se a modificação da grade de entrada for permitida, outros -11 bytes se livrando
continue
e outros -12 bytes para eliminar a variável do contadorUsa uma lista de lista de caracteres
L
e cria uma versão acolchoadaK
, para que não haja problemas nos limites. O recuo éUso:
fonte
if'*'==L[y][x]:
para salvar um byte.r=range;
na mesma linha quen,S,s
, poderá salvar cinco caracteres substituindo as chamadasrange(...)
porr(...)
.ange
8 bytes, mas eu tenho que adicionar,r
e,range
que também é 8 bytes para que nada seja ganho.range
.Ruby, 112
Pega e retorna uma string. A sequência deve ser separada por nova linha e encerrada.
no programa de teste
fonte
TSQL
292291 bytesGolfe:
Ungolfed:
Violino
fonte
;
da frente do seu código conta? Parece que você contou isso.Raquete 415 bytes
Ungolfed:
Teste (lista como uma única sequência com o número da coluna especificado; também funcionará com espaços):
Resultado:
fonte
PHP,
145133132127 bytesrecebe entrada como sequência única, nova linha separada. Corra com
-r
.demolir
fonte
"!">$n=$s[$p]
em vez de" "==$n=$s[$p]
salvar um byteTurtlèd , 99 bytes
(gritos, continuo esquecendo o link: |)
Toma entradas com colchetes ao redor de cada linha
Turtlèd não pode receber entrada com várias linhas; portanto, após a última linha, escreva
|
para sinalizar o final da entradaObserve que os colchetes incompatíveis são porque os colchetes abertos analisam o próximo caractere como parte do comando bracket
Experimente online!
Como funciona (descrição geral):
Até que
|
seja digitada, ela grava a entrada em cada linha, entre colchetes, para ajudá-lo a reconhecer o final de cada linha. Depois que isso acontece, ele volta ao topo da entrada. Ele passa por cada caractere na entrada. Se for um espaço, ele olha em volta, adicionando um ao contador para cada bomba que encontrar. após cada linha, ele exclui os colchetes. Quando chega à última linha, com o | nele, ele para e exclui o |. a grade é impressa implicitamente.fonte
C,
152150147145 bytesA entrada está na forma de uma matriz bidimensional de caracteres, seguida pelo número de linhas e colunas. O resultado será retornado no local.
(Principalmente) Ungolfed:
A abordagem é direta - faça um loop sobre cada posição, faça um loop sobre seus vizinhos e some todos os asteriscos. Existem dois truques no nível de bit:
Quando estamos decidindo se uma célula é um asterisco ou não, podemos apenas verificar se o bit de oito lugares está definido, porque o número na célula deve ser menor que 8 (o valor máximo da célula).
Podemos transformar um caractere de espaço em um caractere zero por OR-ing 16.
Edit: Golfed off dois bytes usando
/
no lugar de>=
.Edit: Outros cinco bytes, invertendo a direção dos loops.
fonte
C #, 341 bytes
Uma implementação ingênua que definitivamente pode ser reduzida.
fonte
Python 2, 183 bytes
fonte