To pierwszy z serii wyzwań Island Golf. Następne wyzwanie
Biorąc pod uwagę wyspę w sztuce ASCII, wygeneruj optymalną ścieżkę do jej opłynięcia.
Wejście
Twój wkład będzie w prostokątną siatkę składającą się z dwóch znaków reprezentujących ląd i wodę. W poniższych przykładach ziemia jest #
i woda jest .
, ale możesz zastąpić dowolne dwa różne znaki, które chcesz.
...........
...##......
..#####....
..#######..
.#########.
...#######.
...#####.#.
....####...
...........
Zawsze będzie co najmniej jeden żeton ziemi. Wszystkie kafelki ziemi będą sąsiadować (tzn. Jest tylko jedna wyspa). Płytki wodne również będą przylegające (tj. Nie będzie żadnych jezior). Zewnętrzna krawędź siatki będzie stanowić płytki wodne. Kafelki lądowe nie zostaną połączone po przekątnej: tzn. Nigdy nie zobaczysz czegoś takiego
....
.#..
..#.
....
Wynik
Twój kod musi generować tę samą siatkę, z narysowanym najkrótszym okrążeniem . W poniższych przykładach narysowano ścieżkę dookoła o
, ale możesz zastąpić dowolną postać, o ile różni się ona od twoich postaci lądowych i wodnych.
Opłynięcie jest prosta krzywa zamknięta, sporządzony wyłącznie na płytki wodnych, które całkowicie otacza wszystkie płytki wylądować na siatce. Połączenia ukośne są dozwolone. Na przykład jest to opłynięcie powyższej wyspy (ale nie najkrótszej):
.ooooo.....
o..##.oo...
o.#####.o..
o.#######o.
o#########o
ooo#######o
..o#####.#o
..oo####..o
....oooooo.
Długość okrążenia oblicza się w następujący sposób: Dla każdej pary sąsiadujących ze sobą płytek na ścieżce, jeśli są one połączone poziomo lub pionowo, dodaj 1; jeśli są połączone po przekątnej, dodaj √2. Długość powyższej ścieżki wynosi 22 + 7√2 (≈ 31,9).
Najkrótsza opłynięcie jest opłynięcie z najkrótszym długości. Twój program powinien wypisać dowolną ścieżkę, która spełnia ten warunek. W przypadku większości wysp istnieje wiele możliwych rozwiązań. Oto jedno rozwiązanie dla powyższej wyspy o długości 10 + 13√2 (≈ 28,4):
...oo......
..o##oo....
.o#####oo..
.o#######o.
o#########o
.o.#######o
..o#####.#o
...o####.o.
....ooooo..
Detale
Twoje rozwiązanie może być pełnym programem lub funkcją . Każda z domyślnych metod wejścia i wyjścia jest akceptowalna.
Dane wejściowe i wyjściowe mogą być ciągiem wieloliniowym lub listą ciągów. Jeśli twój język ma inny typ znaków niż ciągi jednoznakowe, możesz zastąpić „listę znaków” wyrazem „ciąg” w poprzednim zdaniu. Jeśli twój język musi wprowadzić wysokość i / lub szerokość siatki, możesz to zrobić. Twój wynik może (opcjonalnie) mieć jeden końcowy znak nowej linii. Jak wspomniano powyżej, możesz użyć dowolnych trzech różnych znaków zamiast #.o
(w zgłoszeniu określ, których znaków używasz).
Przypadki testowe
A. Wyspy z unikalnymi najkrótszymi opłynięciami:
...
.#.
...
.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. Przykład wyspy z wieloma możliwymi rozwiązaniami:
........
....##..
...####.
..###...
.#####..
.#####..
..##....
........
Możliwe wyniki:
....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. Duży przypadek testowy jako Gist
To jest golf-golf : wygrywa najkrótszy kod w każdym języku.