Questo è il primo di una serie di sfide Island Golf. Prossima sfida
Data un'isola nell'arte ASCII, crea un percorso ottimale per circumnavigarla.
Ingresso
Il tuo input sarà una griglia rettangolare composta da due caratteri, che rappresentano terra e acqua. Negli esempi seguenti, la terra è #
e l'acqua è .
, ma puoi sostituire due caratteri distinti che desideri.
...........
...##......
..#####....
..#######..
.#########.
...#######.
...#####.#.
....####...
...........
Ci sarà sempre almeno una tessera terra. Le tessere terra saranno tutte contigue (cioè c'è solo un'isola). Le tessere dell'acqua saranno anche contigue (cioè non ci sono laghi). Il bordo esterno della griglia sarà costituito da piastrelle d'acqua. Le tessere terra non saranno collegate in diagonale: cioè non vedrai mai qualcosa di simile
....
.#..
..#.
....
Produzione
Il codice deve generare la stessa griglia, con una circumnavigazione più breve disegnata su di essa. Negli esempi seguenti, viene tracciato il percorso di circumnavigazione o
, ma puoi sostituire qualsiasi personaggio purché sia distinto dai tuoi personaggi di terra e acqua.
Una circumnavigazione è una semplice curva chiusa, disegnata interamente su tessere d'acqua, che circonda completamente tutte le tessere di terra sulla griglia. Sono consentite connessioni diagonali . Ad esempio, questa è una circumnavigazione dell'isola sopra (ma non una più breve):
.ooooo.....
o..##.oo...
o.#####.o..
o.#######o.
o#########o
ooo#######o
..o#####.#o
..oo####..o
....oooooo.
La lunghezza di una circumnavigazione viene calcolata come segue: per ogni coppia di tessere adiacenti sul percorso, se sono collegate in orizzontale o in verticale, aggiungi 1; se sono collegati in diagonale, aggiungi √2. La lunghezza del percorso sopra è 22 + 7√2 (≈ 31.9).
Una circumnavigazione più breve è una circumnavigazione con la lunghezza più breve possibile. Il programma dovrebbe generare un percorso qualsiasi che soddisfi questa condizione. Per la maggior parte delle isole, ci saranno più soluzioni possibili. Ecco una soluzione per l'isola sopra, con lunghezza 10 + 13√2 (≈ 28,4):
...oo......
..o##oo....
.o#####oo..
.o#######o.
o#########o
.o.#######o
..o#####.#o
...o####.o.
....ooooo..
Dettagli
La tua soluzione può essere un programma completo o una funzione . Qualsiasi metodo di input e output predefinito è accettabile.
L'input e l'output possono essere una stringa multilinea o un elenco di stringhe. Se la tua lingua ha un tipo di carattere distinto dalle stringhe a carattere singolo, puoi sostituire "elenco di caratteri" con "stringa" nella frase precedente. Se la tua lingua deve inserire l'altezza e / o la larghezza della griglia, puoi farlo. L'output potrebbe (facoltativamente) avere una sola riga finale nuova. Come accennato in precedenza, è possibile utilizzare tre caratteri distinti al posto di #.o
(specificare nella presentazione quali caratteri si stanno utilizzando).
Casi test
A. Isole con circumnavigazioni più brevi uniche:
...
.#.
...
.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. Esempio di isola con molteplici possibili soluzioni:
........
....##..
...####.
..###...
.#####..
.#####..
..##....
........
Possibili uscite:
....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 di prova di grandi dimensioni come sostanza
Questo è code-golf : vince il codice più corto in ogni lingua.