Este é o primeiro de uma série de desafios do Island Golf. Próximo desafio
Dada uma ilha na arte ASCII, produza um caminho ideal para contorná-la.
Entrada
Sua entrada será uma grade retangular composta por dois caracteres, representando terra e água. Nos exemplos abaixo, a terra é #
e a água é .
, mas você pode substituir quaisquer dois caracteres distintos que desejar.
...........
...##......
..#####....
..#######..
.#########.
...#######.
...#####.#.
....####...
...........
Sempre haverá pelo menos um terreno. Os ladrilhos terrestres serão todos contíguos (ou seja, há apenas uma ilha). Os ladrilhos de água também serão contíguos (ou seja, não há lagos). A borda externa da grade será todos os ladrilhos de água. Ladrilhos de terra não serão conectados na diagonal: ou seja, você nunca verá algo como
....
.#..
..#.
....
Resultado
Seu código deve gerar a mesma grade, com uma menor circunavegação desenhada nela. Nos exemplos abaixo, o caminho da circunavegação é desenhado o
, mas você pode substituir qualquer caractere, desde que seja distinto dos caracteres terrestres e aquáticos.
Uma circunavegação é uma curva fechada simples, desenhada inteiramente em ladrilhos de água, que circunda totalmente todos os ladrilhos de terra na grade. Conexões diagonais são permitidas. Por exemplo, esta é uma circunavegação da ilha acima (mas não a mais curta):
.ooooo.....
o..##.oo...
o.#####.o..
o.#######o.
o#########o
ooo#######o
..o#####.#o
..oo####..o
....oooooo.
O comprimento de uma circunavegação é calculado da seguinte forma: Para cada par de blocos adjacentes no caminho, se estiverem conectados horizontal ou verticalmente, adicione 1; se eles estiverem conectados na diagonal, adicione √2. O comprimento do caminho acima é 22 + 7√2 (≈ 31.9).
Uma circunavegação mais curta é uma circunavegação com o menor comprimento possível. Seu programa deve gerar qualquer caminho que atenda a essa condição. Para a maioria das ilhas, haverá várias soluções possíveis. Aqui está uma solução para a ilha acima, com comprimento 10 + 13√2 (≈ 28,4):
...oo......
..o##oo....
.o#####oo..
.o#######o.
o#########o
.o.#######o
..o#####.#o
...o####.o.
....ooooo..
Detalhes
Sua solução pode ser um programa completo ou uma função . Qualquer um dos métodos padrão de entrada e saída é aceitável.
Sua entrada e saída podem ser uma cadeia de linhas múltiplas ou uma lista de cadeias. Se o seu idioma tiver um tipo de caractere distinto das seqüências de caracteres simples, você poderá substituir "lista de caracteres" por "sequência" na frase anterior. Se o seu idioma precisar inserir a altura e / ou largura da grade, você poderá fazê-lo. Sua saída pode (opcionalmente) ter uma única nova linha à direita. Como mencionado acima, você pode usar três caracteres distintos no lugar de #.o
(especifique em seu envio quais caracteres você está usando).
Casos de teste
A. Ilhas com menores circunavegações únicas:
...
.#.
...
.o.
o#o
.o.
......
.####.
......
.oooo.
o####o
.oooo.
......
......
..##..
...#..
......
......
......
..oo..
.o##o.
..o#o.
...o..
......
.......
.#####.
...#...
...#...
.#####.
.......
.ooooo.
o#####o
o..#..o
o..#..o
o#####o
.ooooo.
.......
...#...
...#...
.#####.
...#...
...#...
.......
...o...
..o#o..
.o.#.o.
o#####o
.o.#.o.
..o#o..
...o...
.......
.#####.
.##..#.
..#..#.
.......
.ooooo.
o#####o
o##..#o
.o#..#o
..oooo.
B. Exemplo de uma ilha com várias soluções possíveis:
........
....##..
...####.
..###...
.#####..
.#####..
..##....
........
Saídas possíveis:
....oo..
...o##o.
..o####o
.o###.o.
o#####o.
o#####o.
.o##oo..
..oo....
....oo..
...o##o.
..o####o
.o###.o.
o#####o.
o#####o.
.o##.o..
..ooo...
....oo..
...o##o.
..o####o
.o###..o
o#####.o
o#####o.
.o##oo..
..oo....
....oo..
...o##o.
..o####o
.o###..o
o#####.o
o#####o.
.o##.o..
..ooo...
C. Caso de teste grande como um Gist
Este é o código-golfe : o código mais curto em cada idioma vence.