Você deve escrever um programa ou função.
A entrada é um 'mapa' de números. Você pode escolher o mapa como uma sequência com novos caracteres de linha ( \n
) ou uma matriz 2D de sequências.
Todos os mapas têm 5 caracteres por 5 caracteres, e os caracteres sempre são dígitos maiores que 0 ou espaços.
Aqui está um exemplo de mapa:
12 45
11233
233
1
2 899
Sua tarefa é encontrar os componentes conectados no mapa. Um componente válido é uma série de pelo menos três dígitos idênticos conectados horizontal e / ou verticalmente ( não na diagonal ) ( não espaços ). Você precisará substituir os caracteres dos componentes conectados válidos por x
s e imprimir ou retornar esse resultado.
Portanto, a saída para o exemplo acima seria:
x2 45
xx2xx
2xx
1
2 899
Aqui está outro caso de teste (graças a Martin Ender):
Input:
2 3
4
1 5
111 6
11 7
Output:
2 3
4
x 5
xxx 6
xx 7
Este é o código de golfe, então o código mais curto em bytes ganha!
fonte
Respostas:
JavaScript (ES6),
171161139137136133132 bytesEsta é uma tradução da minha resposta do Python. E / S como matrizes de caracteres.
Pena que não há maneira eficiente de fazer
sum
...fonte
Python 3,
238237200199192181 bytesDefine uma função
f(a)
que recebe a entrada como uma matriz de caracteres e retorna a mesma matriz modificada. ( Matrizes de caracteres são aceitáveis como seqüências de caracteres por padrão. )Ungolfed com explicação
O código modificado é recursivo, mas funciona da mesma maneira.
fonte
Ruby, 304 bytes
exemplo de uso:
o código reutiliza o método 'blot' para calcular o comprimento do caminho.
variáveis / métodos:
Tente uma explicação mais detalhada:
faça uma cópia da string de entrada, que usamos para encontrar o comprimento do caminho a partir de qualquer ponto no mapa.
defina uma função anônima 'ps' (comprimento do caminho) (lambda) que leva o índice do mapa i como argumento. retorna o comprimento do caminho a partir desse ponto. isso é feito chamando o método 'b' (blot) para inserir x em uma cópia do mapa original e, em seguida, contando o número de x na string retornada.
a parte a seguir itera sobre cada caractere no mapa (índice i, caractere s [i]). chama a função 'b' (borrão) na posição do mapa i se o comprimento do caminho da posição i for maior que 2 e se não for um caractere de espaço ou nova linha.
a função b (blot) pega a sequência do mapa e um índice como argumento. inicializa @v (matriz visitada) e chama a função auxiliar b2.
a função b2 pega a sequência do mapa, a posição do mapa (i) e um caractere no caminho atual (c). ele se chama recursivamente para substituir seções conectadas de dígitos pelo caractere 'x'. retorna a sequência de entrada (para que a função ps possa chamar scan () no valor retornado).
esta instrução if está verificando se a posição do mapa (i) fornecida está dentro dos limites da string (0 ... s.size) e se o caractere em s [i] é o mesmo que o caractere inicial. também @v [i] está marcado para evitar recursões infinitas.
este é o bit que substitui o caractere no índice (i) pelo caractere 'x'. também marca esse índice como visitado.
é aqui que o b2 se chama recursivamente procurando o caminho. i + 1 é um caractere à direita, i-1 é um caractere à esquerda, i + 6 é uma linha abaixo (5 dígitos + 1 nova linha = 6 caracteres), i-6 é uma linha acima.
fonte
C (Ansi),
243233179188 bytesGolfe:
Com anotações:
}
Entrada:
Espera uma nova linha no início e no final da string.
Exemplo de entrada:
Saída de exemplo:
Atualizar
Fazer a grade fixa me permitiu cortar quase 60 bytes.
fonte
Mathematica, 180 bytes
Explicação:
Função pura que aceita uma
5x5
matriz.
é o caractere de uso privado de 3 bytes queU+F3C7
representa o operador de transposição do postfix\[Transpose]
.(f=Flatten@#;p=Partition)
: Nivela a lista de entrada e a armazenaf
. Definep = Partition
e retorna.g=p[r,5]
: A matriz{{1,2,3,4,5}, ..., {21,22,23,24,25}}
(isso ocorre porquer
é definido comoRange@25
).Join[g=p[r,5],g]
: a lista de linhas e colunas deg
.p[#,2,1]&
: Função pura que divide a lista#
em sublistas de comprimento2
com sobreposição1
; ou seja, a lista de pares adjacentes em#
.##&@@p[#,2,1]&
: O mesmo que acima, exceto que retorna aSequence
.##&@@p[#,2,1]&/@Join[g=p[r,5],g]
: Mapeia a função anterior das linhas e colunas deg
para obter uma lista de todas as entradas adjacentes emg
. Meu intestino diz que há uma maneira mais curta de fazer isso.r~Graph~Cases[...]
: Gráfico cujos vértices são os números inteiros1, ..., 25
e cujas arestas são as arestas entre entradas adjacentes nasg
quais têm as mesmas entradas correspondentes na matriz de entrada (diferente de" "
){a_,b_}/;(A=f[[a]])==f[[b]]&&A!=" "
: Padrão que corresponde a{a,b}
tal quef[[a]] == f[[b]]
(mesmo valor na matriz de entrada) e que não é igual a" "
. DefinaA = f[[a]]
para salvar o1
byte....:>a<->b
: Substitua todas as correspondências por uma borda não direcionada de a a b.VertexComponent
: Retorna o componente conectado do segundo argumento (um vértice) no primeiro argumento (um gráfico).Tr[1^VertexComponent[...]]
: O tamanho do componente conectado. Salva1
byte deLength@VertexComponent[...]
.If[Tr[...]<3,f[[#]],"x"]&
: Função pura que leva uma entrada#
nog
. Se o tamanho do componente conectado for menor que3
, substitua-o pela entrada correspondente na entrada. Caso contrário, substitua-o por"x"
.(f=Flatten@#;p=Partition)[...,5]
: E, finalmente, remodelar o resultado para ser uma5x5
matriz.fonte
Clojure, 188 bytes
Isso é bastante esmagador: D
Chamado assim (é necessário um vetor 1D de caracteres):
Com preguiça de desenredá-lo, mas basicamente
for[m(range 30)]
visita cada índice e, para cada índice, o interiorlet[n(for[p[-1 -6 1 6]...(+ m p))]
faz uma lista de 0 a 4 elementos que lista os locais que tinham o mesmo valor (1 - 9) que o local do meio. Se mais de um vizinho corresponder à parte intermediária, significa que todos eles formarão um cluster; portanto, esses locais serão adicionados ao conjunto usado em(if((set(flatten(...)))i)
. Se o índicei
for encontrado no conjunto, ele\x
será emitido e o valor original, caso contrário. Isso:when( ... )
é bem interessante ...fonte