Um concurso simples, inspirado nesta pergunta do stackoverflow :
Você recebe uma imagem de uma superfície fotografada por um satélite. A imagem é um bitmap em que a água é marcada por '
.
' e a terra é marcada por '*
'. Grupos de adjacentes*
formam uma ilha. (Dois '*
' são adjacentes se forem vizinhos horizontais, verticais ou diagonais). Sua tarefa é imprimir o número de ilhas no bitmap.
Um single *
também conta como uma ilha.
Entrada de amostra:
.........**
**......***
...........
...*.......
*........*.
*.........*
Saída de amostra:
5
O vencedor é a entrada com o menor número de bytes no código.
*
ilha*
s independentes também são ilhas.Respostas:
Mathematica
188 185 170 115 130 130 4648 caracteresExplicação
Nas versões anteriores, fiz um gráfico de posições com uma distância de 1 no tabuleiro de xadrez.
GraphComponents
depois revelou o número de ilhas, uma por componente.A presente versão usa
MorphologicalComponents
para encontrar e numerar clusters de unidades no array - regiões onde1
são fisicamente contíguas. Como os gráficos são desnecessários, isso resulta em uma enorme economia de código.Código
Exemplo
5
Como funciona
Os dados são inseridos como uma matriz; no Mathematica, esta é uma lista de listas.
Na matriz de entrada, os dados são convertidos em
1
's0
' pela substituiçãoonde
/.
é uma forma infixReplaceAll
seguida por regras de substituição. Isso basicamente converte a matriz em uma imagem em preto e branco. Tudo o que precisamos fazer é aplicar a funçãoImage
,.Os quadrados brancos correspondem às células com o valor 1.
A figura abaixo mostra alguns passos que a abordagem usa. A matriz de entrada contém apenas
1
's e0
' s. A matriz de saída rotula cada cluster morfológico com um número. (Coloquei as matrizes de entrada e saídaMatrixForm
para destacar sua estrutura bidimensional.)MorphologicalComponents
substitui1
s por um número inteiro correspondente ao número do cluster de cada célula.Max
retorna o maior número de cluster.Exibindo as Ilhas
Colorize
colorirá cada ilha exclusivamente.fonte
MorphologicalComponents
quer umImage
, mas mesmo na v9 não deveria serMax@MorphologicalComponents[d/.{"."->0,"*"->1}]
? Ou seja, a substituição é feita primeiro?Max
desapareceria antes da substituição, não seria?Max@MorphologicalComponents@d/.{"."->0,"*"->1}
não funciona, o que faz sentidoMax@MorphologicalComponents[d /. {"." -> 0, "*" -> 1}]
, então você tem mais um caractere.Ruby 1.9 (
134121113110)Pega o mapa em stdin ou o nome do arquivo do mapa como o primeiro argumento da linha de comando e imprime o número de ilhas em stdout. Usando um preenchimento recursivo básico. Melhorias bem-vindas como sempre!
Semelhante à coloração de David, você também pode exibir as diferentes ilhas alterando
$_[i]=?.
para$_[i]=c.to_s
ep c
paraputs$_
, o que forneceria algo assim:(pelo menos até você ficar sem dígitos!)
Alguns casos de teste:
5
9
1
2
3
fonte
C, 169 caracteres
Lê o mapa de stdin. Não teve sorte em melhorar a função recursiva de preenchimento de inundação,
r(j)
embora pareça que poderia ser.fonte
Python 2,
223203 bytesObrigado a Step Hen e Arnold Palmer por cortar 20 caracteres de espaços e parênteses desnecessários!
Eu pensei que o uso da compreensão da lista poderia diminuir o número de bytes, mas não forneceu nenhuma melhoria significativa.
Experimente aqui.
Continuo tentando recortá-lo na lista n (vizinhos), mas não obtive sucesso. Talvez alguém tenha algumas idéias para essa seção.
fonte
(s.index(l),i)
efor
,enumerate(l)
eif
,-v[0])<2
eand
,p=0:
ep
, ebool(x&n[p])
eelse
. Você também tem mais parênteses do que o necessário na sua declaração impressa, já que possui 2 grupos ao redorset
. Edit: Beat by StepHen porque fazer coisas no celular não é o ideal.Perl 5 , 100 bytes
98 bytes de código + 2 bytes para
-p0
sinalizadores.Experimente online!
Uma adaptação (ou melhor, uma simplificação) da minha resposta ao desafio Quantos buracos? . Você pode encontrar explicações sobre como esse código funciona nessa outra resposta (é um pouco longo para explicar, então prefiro não redigitar todas as explicações).
fonte
Python 2, 233 bytes
Muito tempo, em comparação com outras respostas. Porto da minha resposta a esta pergunta .
Experimente online
fonte
JavaScript, 158 bytes
Resposta ES6 não-competitiva (desafio de pós-datas de idiomas) para 132 bytes:
Porto da minha resposta para Quantos Buracos? (sim, eu estou pulando na onda, agora que eu vi duas outras pessoas portando suas respostas).
fonte
Python 2 , 225 bytes
Experimente online!
fonte