Pegue uma região 2D do espaço dividida em elementos quadrados da unidade alinhada ao eixo, com seus centros alinhados em intervalos inteiros. Uma aresta é considerada interna se for compartilhada por dois elementos, caso contrário, é uma aresta externa.
Seu objetivo é encontrar o número mínimo de elementos vizinhos que devem ser atravessados para alcançar uma borda externa a partir do centro de cada elemento, conhecido como traversal distance
, ou distance
abreviado. Você só pode atravessar uma aresta (ou seja, nenhum corte de canto / movimento diagonal). Observe que "elementos externos" (elementos que têm pelo menos uma aresta externa) são considerados necessários para atravessar 0
elementos vizinhos para alcançar uma aresta externa.
Entrada
A entrada é uma lista de coordenadas de pares inteiros não negativos que denotam o (x, y) do centro de todos os elementos. Supõe-se que não há elementos sobrepostos (ou seja, um par x / y identifica exclusivamente um elemento). Você não pode assumir nada sobre a ordem de entrada do elemento.
Você pode transformar a origem da entrada em qualquer local (por exemplo, 0,0 ou 1,1, etc.).
Você pode supor que todos os elementos de entrada estejam conectados ou, em outras palavras, é possível passar de um elemento para outro usando as regras acima. Observe que isso não significa que a região 2D esteja simplesmente conectada; pode ter orifícios dentro dele.
Exemplo: a seguir é uma entrada inválida.
0,0
2,0
verificação de erro não é necessária.
A entrada pode ser de qualquer fonte (arquivo, stdio, parâmetro de função, etc.)
Resultado
A saída deve ser uma lista de coordenadas que identificam cada elemento e a distância inteira correspondente percorrida para chegar a uma aresta. A saída pode estar em qualquer ordem de elemento desejada (por exemplo, você não precisa de elementos de saída na mesma ordem que as entradas).
A saída pode ser para qualquer fonte (arquivo, stdio, valor de retorno da função etc.)
Qualquer saída que corresponda à coordenada do elemento com sua distância externa é boa, por exemplo, todas são boas:
x,y: distance
...
[((x,y), distance), ...]
[(x,y,distance), ...]
Exemplos
As entradas de exemplo de texto estão no formulário x,y
, com um elemento por linha; você pode remodelá-lo em um formato de entrada conveniente (consulte as regras de formato de entrada).
As saídas de exemplo de texto estão no formato x,y: distance
, com um elemento por linha; novamente, você pode remodelá-lo para um formato de saída conveniente (consulte as regras de formato de saída).
As figuras gráficas têm o limite inferior esquerdo como (0,0) e os números dentro representam a distância mínima esperada percorrida para alcançar uma aresta externa. Observe que esses números são apenas para fins de demonstração; seu programa não precisa produzir isso.
Exemplo 1
entrada:
1,0
3,0
0,1
1,2
1,1
2,1
4,3
3,1
2,2
2,3
3,2
3,3
Resultado:
1,0: 0
3,0: 0
0,1: 0
1,2: 0
1,1: 1
2,1: 0
4,3: 0
3,1: 0
2,2: 1
2,3: 0
3,2: 0
3,3: 0
representação gráfica:
Exemplo 2
entrada:
4,0
1,1
3,1
4,1
5,1
6,1
0,2
1,2
2,2
3,2
4,2
5,2
6,2
7,2
1,3
2,3
3,3
4,3
5,3
6,3
7,3
8,3
2,4
3,4
4,4
5,4
6,4
3,5
4,5
5,5
resultado:
4,0: 0
1,1: 0
3,1: 0
4,1: 1
5,1: 0
6,1: 0
0,2: 0
1,2: 1
2,2: 0
3,2: 1
4,2: 2
5,2: 1
6,2: 1
7,2: 0
1,3: 0
2,3: 1
3,3: 2
4,3: 2
5,3: 2
6,3: 1
7,3: 0
8,3: 0
2,4: 0
3,4: 1
4,4: 1
5,4: 1
6,4: 0
3,5: 0
4,5: 0
5,5: 0
representação gráfica:
Exemplo 3
entrada:
4,0
4,1
1,2
3,2
4,2
5,2
6,2
8,2
0,3
1,3
2,3
3,3
4,3
5,3
6,3
7,3
8,3
9,3
1,4
2,4
3,4
4,4
5,4
6,4
7,4
8,4
9,4
2,5
3,5
4,5
5,5
6,5
9,5
10,5
11,5
3,6
4,6
5,6
9,6
10,6
11,6
6,7
7,7
8,7
9,7
10,7
11,7
resultado:
4,0: 0
4,1: 0
1,2: 0
3,2: 0
4,2: 1
5,2: 0
6,2: 0
8,2: 0
0,3: 0
1,3: 1
2,3: 0
3,3: 1
4,3: 2
5,3: 1
6,3: 1
7,3: 0
8,3: 1
9,3: 0
1,4: 0
2,4: 1
3,4: 2
4,4: 2
5,4: 2
6,4: 1
7,4: 0
8,4: 0
9,4: 0
2,5: 0
3,5: 1
4,5: 1
5,5: 1
6,5: 0
9,5: 0
10,5: 0
11,5: 0
3,6: 0
4,6: 0
5,6: 0
9,6: 0
10,6: 1
11,6: 0
6,7: 0
7,7: 0
8,7: 0
9,7: 0
10,7: 0
11,7: 0
representação gráfica:
Pontuação
Isso é código de golfe. O código mais curto em bytes vence. Aplicam-se brechas padrão. Quaisquer embutidos que não sejam aqueles projetados especificamente para resolver esse problema são permitidos.
Respostas:
MATLAB / oitava, 143 bytes
Ungolfed
Explicação
Criar S onte e R matrizes ESULTADO de tamanho apropriado, preenchido com zeros.
Calcule os índices lineares que correspondem aos
xy
pares, com um elemento preenchendo nas bordas.Desenhe a estrutura.
S
é mostrado aqui para o Exemplo 2 :Remova todos os elementos da borda por erosão da imagem
usando o disco do elemento estruturador com raio 1 :
Se o movimento diagonal fosse permitido, usaríamos o retângulo:
Em seguida, incremente o resultado para todos os elementos que não sejam de borda
e faça um loop até que a imagem seja completamente erodida.
Retorne o resultado para cada
xy
par.fonte
Pitão, 26 bytes
Exemplo 2
O formato de saída que usei é:
Ou seja, uma lista contendo o ponto, seguido pela distância do exterior.
O código funciona usando um conjunto alcançado no momento, para cada ponto que filtra a entrada de todos os pontos a uma distância exata 1 desse ponto e verifica se o número de pontos resultante é 4 vezes maior que o número inicial e se repete até que não seja . Quando iniciado em um determinado ponto, isso mostra a que distância esse ponto está do exterior.
fonte
MATL ,
38373633 bytesIsso usa a versão atual (15.0.0) do idioma / compilador.
O formato de entrada é: uma matriz com valores x e uma matriz com valores y . Entrada e saída são baseadas em 1. Portanto, os casos de teste têm as seguintes entradas:
Experimente online!
Explicação
Uma matriz é inicialmente construída com 1 nas posições de entrada e 0 no caso contrário. Em seguida, uma convolução é aplicada com uma máscara "Norte, Leste, Sul, Oeste" (
[0 1 0; 1 0 1; 0 1 0]
), e o resultado em cada posição é comparado com 4. Um resultado de 4 significa que essa posição é cercada por outros pontos e, portanto, tem distância- para exterior pelo menos 1. O resultado (0 ou 1 para cada ponto) é adicionado à matriz original. Essas posições agora contêm 2 (no final do processo, a matriz será decrementada por 1).O processo de convolução é iterado. Para a próxima iteração, a entrada da convolução é a matriz acumulada com limiar com 2; ou seja, valores menores que 2 são definidos como 0. O resultado da convolução indica quais pontos têm distância pelo menos 2 (todos os seus vizinhos têm distância 1).
O número de iterações é escolhido, por conveniência, como o número de colunas da matriz de entrada. Isso é suficiente (na verdade, o número máximo necessário de iterações é metade da dimensão mínima da matriz). As últimas iterações podem ser inúteis, mas não causam danos (elas simplesmente adicionam 0 a todos os pontos).
No final do processo, 1 é subtraído do resultado, porque as posições com valor k têm distância k -1 ao exterior. As coordenadas e os valores de todas as posições são extraídos e exibidos.
fonte
Python 3,
180166160 bytesSabemos que se uma coordenada tem menos de quatro vizinhos, ela deve estar no "exterior". Portanto, podemos retirar repetidamente as células externas e atribuir a elas uma distância igual ao número de iterações / profundidade de recursão nesse caso.
Definitivamente acho que há espaço para melhorias - Qual é a melhor maneira de verificar vizinhos vizinhos?
editar: devo ter permissão para aceitar uma lista de pares como tuplas.
fonte
PHP, 316 bytes
Versão Online
Demolir
Visualize como caracteres Ascii
fonte