O cenário
Eu dirijo ao longo de uma estrada com meu carro e começa a chover. As gotas de chuva estão caindo na minha janela aleatoriamente e agora eu me pergunto: qual é a maior área molhada conectada?
A tarefa
Para facilitar, a janela é dividida em uma matriz de 10 * 10 quadrados. Seu trabalho é encontrar a maior área de gota d'água na janela.
Entrada
Existem duas entradas possíveis, você pode usar uma matriz bidimensional ou uma matriz unidimensional. Você pode escolher entre quaisquer entradas como stdin, etc ...
Exemplo:
// 2-dimensional:
[[0,1,0,0,0,0,1,0,0,0],
[0,1,1,0,0,0,0,1,1,0],
[0,1,1,0,0,0,0,1,0,0],
[0,1,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,1,0],
[0,0,0,1,1,0,0,0,1,0],
[0,0,0,1,1,0,0,0,1,0],
[0,0,0,0,0,1,1,0,1,0],
[0,0,0,0,0,1,1,0,1,0],
[0,0,0,0,0,0,0,0,0,0]]
// 1-dimensional
[0,1,0,0,0,0,1,0,0,0,
0,1,1,0,0,0,0,1,1,0,
0,1,1,0,0,0,0,1,0,0,
0,1,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,1,0,
0,0,0,1,1,0,0,0,1,0,
0,0,0,1,1,0,0,0,1,0,
0,0,0,0,0,1,1,0,1,0,
0,0,0,0,0,1,1,0,1,0,
0,0,0,0,0,0,0,0,0,0]
Resultado
Seu código deve especificar o tamanho da maior área conectada e as coordenadas xey das gotas d'água que pertencem a essa área no formato
"Tamanho: Coordenadas Z: (X1, Y1) (X2, Y2) .. "
Exemplo para a entrada anterior:
Size: 6 Coordinates: (1,0) (1,1) (2,1) (1,2) (2,2) (1,3)
A ordem das coordenadas não importa.
Regras
- Gotas d'água são conectadas, se elas se tocam ortogonalmente
- Conexões diagonais não contam
- Pode haver muitas áreas e seu código precisa encontrar a maior
- Um campo vazio é representado como "0" e um campo úmido como "1"
- Poste sua solução com uma breve explicação e a saída da entrada anterior
- O código mais curto nos próximos 7 dias vencerá
- Se houver duas áreas com o mesmo tamanho, você pode escolher uma
Respostas:
Ruby, 171 caracteres
Entrada via parâmetro de linha de comando como matriz unidimensional.
Saída para a entrada de amostra:
Size: 6 Coordinates: (1,0) (1,1) (1,2) (1,3) (2,2) (2,1)
Esta resposta usa uma abordagem simples de preenchimento, construindo uma lista de coordenadas para cada cluster de gota de chuva. A maior parte do código é realmente usada para verificação de limites e E / S.
fonte
Python - 192
Entrada (colar antes do código):
Obrigado Hobbies de Calvin pelas edições sugeridas!
fonte
map(f,range(100))
vez de[f(i)for i in range(100)]
salvar 8 caracteres. Também acredito que suas coordenadas são (y, x) não (x, y).C # -
548523522511503476(menos de 500 ... sim)
Tenho certeza de que há muito espaço para melhorias.
A maneira como inseri os dados foi inicializar uma matriz. Eu não incluí essa matriz na pontuação (se você acha que isso é trapaça, posso mudar o código, mas ele adicionará relativamente código porque o C # não é bom para analisar matrizes)
Teste-o em http://ideone.com/UCVCPM
Nota: A versão atual não funciona em ideone porque não gosta
using l=System.Collections...
; portanto, a versão em ideone está um pouco desatualizada (e mais longa)Como funciona
Basicamente, verifica se existe um
1
. Se encontrar um, ele usa o algoritmo de preenchimento Flood para substituir todos os adjacentes1
s' com0
e adiciona as coordenadas substituídos a uma lista temporária. Depois, compara a lista superior (m
) com a lista temporária (t
) e definem
comot
set
contém mais elementos.fonte
Mathematica - 180 bytes
Esta função utiliza uma matriz bidimensional.
Golfe
Bonita
Exemplo
A saída é um pouco anômala. O Mathematica começa a indexação em 1 em vez de 0 e usa
{}
para indicar a posição. Adicione 2 bytes (-1
) se as posições precisarem ser indexadas em 0. Adicione muitos bytes se eles precisarem usar em()
vez de{}
:(Explicação
f
é uma função dex
. Ele definec
como uma transformação dex
, onde cada (i, j) agora é igual a um número inteiro correspondente a qual componente conectado ele pertence. Envolve o trabalho principal:Em seguida,
m
calcula quantos elementos existem em cada componente, os classifica por esse número e obtém o último resultado (ou seja, com mais elementos). A última linha imprime a contagem e as posições dentroc
do índice contido emm
.fonte
Haskell, 246
Entrada
Duas dimensões e cole antes do código como
g
, por exemplo:Ungolfed
fonte
Função C # 374byte
Esta é uma versão fortemente modificada da minha resposta para Você está na sala maior? . Ele pega uma matriz unidimensional de entradas e retorna uma sequência no estilo necessário. Ele funciona construindo conjuntos disjuntos a partir da entrada (primeiro loop), calculando o tamanho de cada conjunto e localizando o maior conjunto (segundo loop) e, em seguida, anexando quaisquer células desse conjunto a uma sequência de saída (terceiro loop) que é retornada .
Menos golfe (e com código de teste):
fonte
JavaScript (EcmaScript 6)
183189Uma função com entrada de matriz e valor de retorno de sequência. Se for necessária uma saída real (não está clara para mim), adicione 7 bytes para 'alert ()'.
Saída de teste
Mais legível
Explicação
Obtenha uma matriz de dimensão única e um parâmetro opcional com o tamanho de uma linha. A função também funciona com diferentes dimensões da matriz, mesmo x! = Y.
Pseudo-código:
fonte
JavaScript, 273
Função pega array e retorna string. Minha primeira tentativa foi de ~ 500 caracteres e não usou o Flood Fill. Este faz. Estou aprendendo JavaScript para que todas as sugestões sejam apreciadas.
Essa função percorre a matriz de entrada e, para cada 1 encontrado, começa lá e altera todos os conectados de 1s para 0 usando a função Preenchimento. Ao fazer isso, ele lembra o blob com mais 1s. A função Preenchimento altera a posição atual para 0 e, em seguida, chama-se na posição acima, à direita, abaixo e à esquerda.
Teste aqui: http://goo.gl/9Hz5OH
Código legível
fonte
Scala, 420
Oi, minha entrada leva uma matriz 2D como a
List[List[Int]]
, retorna umString
Explicação
Dada uma janela como a
List[List[Int]]
, primeiro encontramos cada "1" e salvamos as coordenadas em uma lista. Em seguida, transformamos essa lista em umaMap
das coordenadas de cada "1" para uma lista das coordenadas de cada "1" adjacente. Em seguida, use o mapa de adjacência para vincular transitivamente os sub-blobs em blobs e, finalmente, retornamos o maior blob (e ignoramos os blobs duplicados, pois a ordem das coordenadas retornadas não importa).Mais legível
A crítica é muito apreciada.
fonte