Seu objetivo é verificar se uma prancha minada concluída é válida. Isso significa que cada número é uma contagem correta de minas nas células adjacentes a ele, incluindo diagonais. O quadro não se enrola.
Como sempre , você deve fornecer uma função ou programa, e o código mais curto em bytes vence.
Veja também os desafios anteriores para gerar , resolver e implementar totalmente o Campo Minado.
Entrada:
A única string como esta: 02X2 13X2 X211
.
As linhas do tabuleiro de minas são dadas separadas por espaços. Portanto, o acima representa o quadro 3x4:
02X2
13X2
X211
Cada célula é um personagem:
X
para uma mina, ou um número0
através8
.Todas as linhas têm o mesmo comprimento.
Existem pelo menos 3 linhas e 3 colunas.
A entrada não começa ou termina com um espaço, mas você pode incluir uma nova linha no final, se desejar.
Saída:
Um Truthy consistente nas placas corretas e um valor Falsey consistente nas placas incorretas. Consistente significa que todas as saídas Truthy são iguais e todas as saídas Falsey são iguais.
Casos de teste
Cada linha é um caso de teste separado.
True
:
02X2 13X2 X211
XXXX XXXX XXXX XXXX
XX4X2 5X6X4 XX6XX 4XX54 2X4XX
False
:
02X2 13X2 X212
XXXX XXXX X7XX XXXX
XX5X2 5X6X4 XX6XX 4XX54 2X5XX
fonte
Respostas:
Python 2,
132 129128Eu usei
enumerate
no golfe ... e até useirange
em outro lugar no mesmo programa. Claramente algo está errado aqui.Edit: Iterate em
dict(enumerate(s))
vez deenumerate(s)
, portantoenumerate
, não precisa ser chamado duas vezes.fonte
~
! E de dicionários para fazer a indexação fora dos limites funcionar corretamente.~
operador ironicamente me fez notar que eu o estava usando duas vezes sem motivo algum, onde usá-lo apenas uma vez obviamente faria a mesma coisa. Eu pensei que a parte do dicionário era engraçada, obrigado.Pyth, 43
Experimente aqui .
Explicação:
Jhxzd
: Este é o local do primeiro espaço na entrada + 1. (z
na entrada,d
é espaço.) É a separação na entrada entre as células verticalmente adjacentes na placa.!f
: Esse é o não lógico (!
) de um filtro (f
), que seráTrue
se e somente se a expressão for falsa para todos os elementos da sequência.-@zT
: Pegue o caractere no localT
(a variável lambda) da entrada e remova qualquer aparência de: (Isso será verdade se o caractere não for removido e falso se for.+" X"
: Remova o espaço, X e`
: Repr desm
: soma do mapa para/ \X
: contagem de "X" em:+*JNz
: A fatia da entrada prefixada porJ
caracteres fictíciostd+d2
: De d-1 a d + 2.m+T*kJU3
: Para d em [T, T + J, T + 2 * J].Uz
Para T inrange(len(input))
.fonte
APL (NARS2000) (74)
Também funciona no Dyalog APL se
⎕ML
estiver definido como3
.Explicação:
⊃⍵⊂⍨⍵≠' '
: divida⍵
nos espaços e use as listas para formar uma matriz.G←¯1+⎕D⍳
: encontre o índice⎕D
para cada valor, subtraia 1 e armazene-o emG
. (⎕D
contém os dígitos, qualquer não dígito se tornará10
).Z←G↑⍨2+⍴G
: adicione duas linhas e colunas de zeros na borda da matriz para lidar com a envolvente{
...}¨⍳⍴Z
: para cada posiçãoZ
, encontre a quantidade de bombas no bairro Moore dessa posição:G∘.⊖(G←2-⍳3)∘.⌽⊂Z
: gire para aZ
esquerda, direita, cima, baixo, esquerda para cima, direita para cima, esquerda para baixo e direita para baixo.⍵∘⌷¨
: para cada um deles, encontre o elemento⍵
em cada uma dessas matrizes rotacionadas+/∊9<
: conte quantos elementos são maiores que 9 (é a quantidade de bombas).(⍴G)↑
: remova as linhas adicionadas de zeros novamente,G=
: verifique se cada elementoG
é igual à quantidade de bombas em torno dessa posição (isso deve ser verdadeiro para todos os quadrados que não são de bomba),(G>9)∨
: e verifique se os elementos emG
são maiores que9
(estas são as bombas).~0∊
: retorna1
se a matriz resultante não contém zeros (= todos os quadrados são bombas ou o número correto) e,0
se existirem.fonte
C #,
321 320305Primeira tentativa de jogar golfe, e sei que C # não é o idioma ideal.
Espero que seja permitido escrever um método de instância, caso contrário, adicione outros 7 caracteres para
static
.Espaçados:
O uso do Linq economiza espaço em comparação com os loops, mas é mais difícil depurar.
Aprendi algumas coisas como converter
char => int
subtraindo'0'
.Parecia mais simples preencher o quadro com espaços, para iterá-lo seria mais fácil.
fonte
-'0'
por-48
. Funciona para mim e salva alguns bytes para vários 'X' e ''Python 2, 121
Isso é fortemente inspirado pela resposta do feersum . A ordem do dia é exagerada: em vez de procurar minas nos 9 vizinhos da célula, verifique todas as células para ver se é uma mina vizinha.
Verificamos se duas células são vizinhas de
2>r>-2<c<2
, onder
ec
são as diferenças de linha e coluna de células, equivalentes a{r,c}<{-1,0,1}
. Essas coordenadas são calculadas a partir dos índices das célulasI
ei
comoc=I%n-i%n
er=I/n-i/n
. É mais eficiente indexar diretamente na string e extrair linhas e colunas do que convertê-lo em um objeto 2D como uma lista de listas. A verificação da mina éB[i]>'W'
equivalente aquiB[i]=='X'
.O uso
enumerate
salvaria dois caracteres sobre o feio,range(len(B))
exceto que ele retorna um objeto iterador que não suporta dois loops aninhados por ele.fonte
~B.find
./
porque também diminui os negativos.Python 2, 140
fonte
JavaScript (ES6),
135133125122Forneça entrada para a função como uma sequência:
Para uma explicação, consulte a versão antiga, abaixo. A nova versão substitui os
for
loops porevery
chamadas e usa a variávele="every"
emsomeArray[e](...)
vez desomeArray.every(...)
.Além disso, o contador
k
agora é indexado1
para que ak+=...
expressão seja sempre verdadeira, a fim de manter oevery
loop em execução. Eliminamos esse acréscimo1
subtraindo otrue
resultado (que é coercitivo numericamente1
) retornado pelaevery
operação[-1,0,k=1][e](...)
.Versão antiga:
Código com espaços e comentários:
O
every
método da matriz JavaScript recebe um retorno de chamada e aplica o retorno de chamada a todos os elementos da matriz. Se qualquer retorno de chamada retornar um valor falsey, aevery
chamada retornaráfalse
.Os booleanos em JS são coagidos a 1 ou 0 quando parte de uma adição. Para cada espaço circundante, "adicionamos" o resultado booleano da comparação de seu valor
X
e, em seguida, adicionamos esse valor ao contadork
na expressãok += (... == "X")
. Portanto,k
contém uma contagem do número deX
s circundantes , porquetrue
conta como1
efalse
conta como0
.fonte
c=="X"
tentar!c/1
, você economiza uma quantidade enorme de um par de bytes gritantes! Se falhar, tente!!c/1
. O raciocínio é esse'X'/1 => NaN
eNaN
é falso. Você verifica sec=='X'
, por que não tentar verificar se não éfalse
?(!c)/1
, o que não ajuda, infelizmente; Eu precisaria ter os parênteses para!(c/1)
, que custam 2. Além disso,0/1
é falsey, portanto a entrada inválida "0X
" teria o resultado incorretotrue
. O melhor que posso fazer enquanto ainda respeita os zeros é combinar as duas condições em uma frase negada, como!(+c+1&&k-c)
, mas é o mesmo tamanho que eu já tenho.!(k-1-c)
testa ambas as condições, porque sek
correspondec
(menos o deslocamento 1), a negação torna a0
verdade e, sec
não for um número, obtemosNaN
a negação é tambémtrue
.CJam,
70 6563 bytesIsso pode ser muito praticado.
Dá
1
para uma placa válida e0
para uma placa inválida.Casos de teste
Entrada
Saída
Experimente online aqui
fonte
JavaScript (ES6) 98
Usando some para aplicar uma função a cada caractere da string.
A função retorna
A verificação interna é feita usando o mapa apenas porque é mais curto que paraEach
alguns retornos são verdadeiros no primeiro valor de verdade (neste caso, diferente de zero), o que significa uma falha na verificação. O resultado é negado para fornecer um verdadeiro / falso mais reconhecível.
Teste no console do FireFox / FireBug
Saída
fonte
R, 156 caracteres
Com recuos, espaços e quebras de linha, para legibilidade:
Exemplos:
fonte