Dada uma matriz retangular não-vazia de números inteiros de 0
para 9
, produza a quantidade de células que são 8
e não têm um vizinho 8
. Vizinho é aqui entendido no sentido de Moore , isto é, incluindo diagonais. Portanto, cada célula tem 8
vizinhos, exceto as células nas bordas da matriz.
Por exemplo, dada a entrada
8 4 5 6 5
9 3 8 4 8
0 8 6 1 5
6 7 9 8 2
8 8 7 4 2
a saída deve ser 3
. As três células qualificadas seriam as seguintes, marcadas com um asterisco (mas apenas a quantidade dessas entradas deve ser impressa):
* 4 5 6 5
9 3 8 4 *
0 8 6 1 5
6 7 9 * 2
8 8 7 4 2
Regras adicionais
Opcionalmente, você pode pegar dois números que definem o tamanho da matriz como entradas adicionais.
A entrada pode ser obtida por qualquer meio razoável . O formato é flexível, como de costume. Por exemplo, pode ser uma matriz de caracteres 2D, ou uma lista de listas de números ou uma lista simples.
Programas ou funções são permitidos, em qualquer linguagem de programação . As brechas padrão são proibidas.
O menor código em bytes vence.
Casos de teste
Entrada:
8 4 5 6 5 9 3 8 4 8 0 8 6 1 5 6 7 9 8 2 8 8 7 4 2
Saída:
3
Entrada
8 8 2 3
Saída:
0
Entrada:
5 3 4 2 5 2
Saída:
0
Entrada:
5 8 3 8
Saída:
2
Entrada:
8 0 8
Saída:
2
.Entrada:
4 2 8 5 2 6 1 8 8 5 5 8
Saída:
1
Entrada:
4 5 4 3 8 1 8 2 8 2 7 7 8 3 9 3 9 8 7 8 5 4 2 8 4 5 0 2 1 8 6 9 1 5 4 3 4 5 6 1
Saída
3
.Entrada:
8
Saída:
1
Entrada:
8 5 8 1 6 8 7 7 9 9 2 8 2 7 8 3 2 8 4 9 7 3 2 7 9 2 9 7 1 9 5 6 6 9 8 7 3 1 5 2 1 9 9 7 1 8 8 2 3 5 6 8 1 4 7 5
Saída:
4
.Entrada:
8 1 8 2 5 7 8 0 1
Saída:
3
.
Entradas no formato MATLAB:
[8 4 5 6 5; 9 3 8 4 8; 0 8 6 1 5; 6 7 9 8 2; 8 8 7 4 2]
[8 8; 2 3]
[5 3 4; 2 5 2]
[5 8 3 8]
[8; 0; 8]
[4 2 8 5; 2 6 1 8; 8 5 5 8]
[4 5 4 3 8 1 8 2; 8 2 7 7 8 3 9 3; 9 8 7 8 5 4 2 8; 4 5 0 2 1 8 6 9; 1 5 4 3 4 5 6 1]
[8]
[8 5 8 1 6 8 7 7; 9 9 2 8 2 7 8 3; 2 8 4 9 7 3 2 7; 9 2 9 7 1 9 5 6; 6 9 8 7 3 1 5 2; 1 9 9 7 1 8 8 2; 3 5 6 8 1 4 7 5]
[8 1 8; 2 5 7; 8 0 1]
Entradas no formato Python:
[[8, 4, 5, 6, 5], [9, 3, 8, 4, 8], [0, 8, 6, 1, 5], [6, 7, 9, 8, 2], [8, 8, 7, 4, 2]]
[[8, 8], [2, 3]]
[[5, 3, 4], [2, 5, 2]]
[[5, 8, 3, 8]]
[[8], [0], [8]]
[[4, 2, 8, 5], [2, 6, 1, 8], [8, 5, 5, 8]]
[[4, 5, 4, 3, 8, 1, 8, 2], [8, 2, 7, 7, 8, 3, 9, 3], [9, 8, 7, 8, 5, 4, 2, 8], [4, 5, 0, 2, 1, 8, 6, 9], [1, 5, 4, 3, 4, 5, 6, 1]]
[[8]]
[[8, 5, 8, 1, 6, 8, 7, 7], [9, 9, 2, 8, 2, 7, 8, 3], [2, 8, 4, 9, 7, 3, 2, 7], [9, 2, 9, 7, 1, 9, 5, 6], [6, 9, 8, 7, 3, 1, 5, 2], [1, 9, 9, 7, 1, 8, 8, 2], [3, 5, 6, 8, 1, 4, 7, 5]]
[[8, 1, 8], [2, 5, 7], [8, 0, 1]]
Saídas:
3, 0, 0, 2, 2, 1, 3, 1, 4, 3
fonte
Respostas:
MATL ,
211710 bytesExperimente online!
Agradecemos a Luis Mendo pela ajuda no bate-papo e por sugerir convolução 2D.
Explicação:
fonte
R ,
117 6359 bytesExperimente online!
dist
calcula distâncias (o padrão é euclidiano) entre as linhas de uma matriz.which
com o segundo argumentoTRUE
retorna as coordenadas em que o predicado é verdadeiro.As coordenadas são vizinhas se a distância entre elas não for maior que a raiz quadrada de 2, mas a interna
<2
for boa o suficiente porque a distância possível salta desqrt(2)
ro2
.fonte
colSums()^2<=2
que funcione.sqrt(2)
saltos possíveis para2
(por exemplosort(c(dist(expand.grid(1:6,1:6))), decreasing = TRUE))
), então estávamos sendo espertos demais por lá.APL (Dyalog Classic) ,
292825 bytesExperimente online!
fonte
1
(exceto não definido explicitamente). Isso faz sentido.Geléia ,
1815 bytesExperimente online!
Como funciona
Solução anterior, 18 bytes
Experimente online!
Queria compartilhar outra abordagem, embora este seja 1 byte mais longo que a solução de Jonathan Allan .
Como funciona
fonte
JavaScript (Node.js) ,
8885 bytesExperimente online!
Obrigado Arnauld por 2 bytes
fonte
J ,
43, 4037 bytes-3 bytes graças ao Bubbler
Experimente online!
Explicação:
A primeira parte do algoritmo garante que podemos aplicar uma janela deslizante 3x3 à entrada. Isso é obtido anexando uma linha de zeros e rotação de 90 graus, repetida 4 vezes.
fonte
@:
e movendo|.
. Observe que@
no lugar de@:
não funciona.Retina 0.8.2 , 84 bytes
Experimente online! Explicação:
Quebra cada linha em não-
8
caracteres, para que todos os8
s tenham pelo menos um caractere de cada lado.Esta é a última etapa, portanto, a contagem de partidas está implícita. O
m
modificador faz com que os caracteres^
e$
correspondam no início ou no final de qualquer linha.Não combine um personagem diretamente após um 8, ou ...
... um personagem abaixo de 8; o
(?(1).)^(?<-1>.)*
corresponde à mesma coluna como¶(.)*
na linha seguinte, mas o.?.?
permite a8
para ser uma esquerda ou à direita do caractere após o.
na linha seguinte.Correspondência
8
s.Não combine um 8 imediatamente antes de um 8, ou ...
... um personagem com um 8 na linha abaixo; novamente,
(?<-2>.)*$(?(2).)
corresponde à mesma coluna que a(.)*¶
da linha anterior, mas.?.?
permite8
que seja 1 à esquerda ou à direita da8
anterior.
na linha anterior.fonte
Geléia , 17 bytes
Experimente online! Ou veja a suíte de testes .
Quão?
fonte
J, 42 bytes
Experimente online!
explicação
A abordagem de alto nível aqui é semelhante à usada na solução clássica de APL para o jogo da vida: https://www.youtube.com/watch?v=a9xAKttWgP4 .
Nessa solução, mudamos nossa matriz nas 8 direções possíveis vizinhas, criando 8 duplicatas da entrada, empilhando-as e adicionando os "planos" juntos para obter a contagem de vizinhos.
Aqui, usamos o truque "multiplicar pelo infinito" para adaptar a solução para esse problema.
fonte
~
e>
Java 8,
181157156 bytes-24 bytes graças a @ OlivierGrégoire .
Toma as dimensões como parâmetros adicionais
R
(quantidade de linhas) eC
(quantidade de colunas).As células são verificadas de maneira semelhante à da resposta do meu simulador de fritadeira .
Experimente online.
Explicação:
fonte
Python 2 , 130 bytes
Experimente online!
fonte
Powershell, 121 bytes
Script de teste com menos golfe:
Saída:
Explicação:
Primeiro, o script calcula o comprimento da primeira string.
Segundo, ele adiciona borda extra às strings.
Realidadeaumentadagosta de:representa a sequência multilinha:
Nota 1: o número de
=
é suficiente para uma sequência de qualquer comprimento.Nota 2: um grande número de
=
não afeta a pesquisa por oito.Em seguida, a expressão regular
(?<=[^8]{3}.{$l}[^8])8(?=[^8].{$l}[^8]{3})
procura o dígito8
com os não-oito anteriores(?<=[^8]{3}.{$l}[^8])
e os seguintes não-oito(?=[^8].{$l}[^8]{3})
:Finalmente, o número de correspondências é retornado como resultado.
fonte
Gelatina , 12 bytes
Experimente online!
Como funciona
fonte
JavaScript (ES6), 106 bytes
Experimente online!
Abordagem bit a bit, 110 bytes
Experimente online!
fonte
[[7]]
Clojure ,
227198 bytesAi. Definitivamente não é o mais curto aqui, por qualquer meio. 54 bytes de parênteses são matadores. Ainda estou relativamente feliz com isso.
-29 bytes , criando uma função auxiliar que gera um intervalo desde que eu fazia isso duas vezes, alterando
reduce
para uma(count (filter
configuração e removendo a macro de segmentação após jogar golfe.Onde
test-cases
está uma matriz contendo todos os "casos de teste Python"Experimente online!
fonte