Książki „Wybierz własną przygodę” to forma interaktywnej literatury, w której czytelnik musi podejmować decyzje wpływające na wynik opowieści. W niektórych momentach historii czytelnik ma wiele opcji do wyboru, z których każda wysyła czytelnika na inną stronę w książce.
Na przykład w otoczeniu fantasy może być konieczne podjęcie decyzji na stronie 14, czy zapuścić się do tajemniczej jaskini, „skacząc” na stronę 22, lub eksplorować pobliski las, skacząc na stronę 8. Te „skoki” można wyrazić jako pary numerów stron, takie jak:
14 22
14 8
W większości przypadków historia ma wiele zakończeń, ale tylko kilka dobrych. Celem jest nawigacja w historii, aby osiągnąć dobre zakończenie.
Zadanie:
Biorąc pod uwagę listę „skoków” do danej książki, Twoim zadaniem jest określenie trasy, która doprowadzi do określonego zakończenia. Ponieważ jest to dość łatwe, prawdziwym wyzwaniem jest zrobienie tego w jak najmniejszej liczbie postaci.
To jest kod golfowy .
Przykładowe dane wejściowe (gdzie 1 to początek, a 100 to cel):
1 10
10 5
10 13
5 12
5 19
13 15
12 20
15 100
Przykładowe dane wyjściowe:
1 10 13 15 100
Przykładowe dane wejściowe:
15 2
1 4
2 12
1 9
3 1
1 15
9 3
12 64
4 10
2 6
80 100
5 10
6 24
12 80
6 150
120 9
150 120
Przykładowe dane wyjściowe:
1 15 2 12 80 100
Uwagi:
- Lista skoków zostanie wprowadzona przez użytkownika albo z pliku, albo ze standardowego wejścia. Możesz wybrać najbardziej dogodną.
- Dane wejściowe będą zawierać 1 skok na linię, z punktem początkowym i docelowym oddzielonymi pojedynczą spacją.
- Nie ma gwarancji, że wiersze na wejściu będą w określonej kolejności.
- Pomyślna ścieżka rozpocznie się na stronie 1 i zakończy na stronie 100.
- Możesz założyć, że do celu jest co najmniej 1 ścieżka. Nie musisz znaleźć wszystkich ścieżek ani znaleźć najkrótszej. Znajdź przynajmniej jeden.
- Najmniejszy numer strony to 1. Nie ma limitu największego numeru strony. (Możesz założyć, że będzie pasować do zakresu int.)
- Pętle mogą istnieć. Na przykład lista może zawierać skoki ze strony 5 na 10, 10 na 19 i 19 na 5.
- Mogą istnieć ślepe zaułki. Oznacza to, że na stronie docelowej może nie być nigdzie skakać.
- I odwrotnie, mogą istnieć nieosiągalne strony. Oznacza to, że strona początkowa może nie być celem żadnych skoków.
- Nie wszystkie numery stron od 1 do 100 są gwarantowane.
- Dane wyjściowe powinny składać się z prawidłowej trasy numerów stron, zaczynając od 1 i kończąc na 100, oddzielone spacjami.
Pamiętaj, to jest golf golfowy, więc wygrywa najkrótsze rozwiązanie!
EDYCJA: Dodano kolejną próbkę do testowania.
źródło
Odpowiedzi:
Golfscript,
5857 znakówOstrzeżenie : jest to bardzo nieefektywne. Działa poprzez wielokrotne kwadratowanie macierzy przylegania, a następnie szukanie trasy; jeśli
E
na wykresie znajdują się krawędzie, znajdzie każdą ścieżkę o długości do 2 E (a krótszą - wiele razy). Powinien dać ci wynik dla pierwszego przypadku testowego w rozsądnym czasie, ale jeśli chcesz wypróbować drugi, upewnij się, że masz kilka koncertów wolnej pamięci i idź na długi spacer.Jeśli szukasz rozsądnie wydajnego rozwiązania, oferuję 67 znaków:
źródło
cat input | ruby1.9 golfscript.rb peter.gs
i wszystko, co się stało, to mój MacBook stał się naprawdę gorący. Jak mam to uruchomić?Python,
232213157143135 135znaków (najkrótsza ścieżka)Ta implementacja może obsłużyć wszystkie opisane przypadki krawędzi (pętle, ślepe zaułki, strony osierocone itp.) I gwarantuje, że znajdzie najkrótszą drogę do zakończenia. Opiera się na algorytmie najkrótszej ścieżki Djikstry.
źródło
JavaScript: 189 znaków
Jest to rekurencyjne rozwiązanie, które znajduje najkrótszą drogę przez przygodę.
Gra w golfa:
Aby przetestować ( OSTRZEŻENIE: nieskończona pętla pod kątem złych danych wejściowych! ):
Skopiuj jeden z poniższych ciągów wejściowych (lub użyj podobnego formatu, aby wybrać własny, wybierz własną przygodę):
1 10\n10 5\n10 13\n5 12\n5 19\n13 15\n12 20\n15 100
15 2\n1 4\n2 12\n1 9\n3 1\n1 15\n9 3\n12 64\n4 10\n2 6\n80 100\n5 10\n6 24\n12 80\n6 150\n120 9\n150 120
Wklej to do monitu o skrzypce testowe .
Sformatowany i skomentowany kod:
Aby przetestować ( OSTRZEŻENIE: nieskończona pętla pod kątem złych danych wejściowych! ):
Skopiuj jeden z poniższych ciągów wejściowych (lub użyj podobnego formatu, aby wybrać własny, wybierz własną przygodę):
1 10\n10 5\n10 13\n5 12\n5 19\n13 15\n12 20\n15 100
15 2\n1 4\n2 12\n1 9\n3 1\n1 15\n9 3\n12 64\n4 10\n2 6\n80 100\n5 10\n6 24\n12 80\n6 150\n120 9\n150 120
Wklej to do monitu o skrzypce testowe .
źródło
var
słowa kluczowego mają zasięg globalny :)Ruby 1.9, 98
Nie golfowany:
źródło
Perl, 88 znaków
w zasadzie perlizowana wersja hasła Clueless; przed meczem i po meczu są fajne :)
źródło
Python -
239237236niestety to rekurencyjne rozwiązanie jest podatne na pętle w „historii” ...
Zastosowanie : cat ./test0 | ./sol.py Dane wyjściowe dla przypadku testowego 1:
Dane wyjściowe dla przypadku testowego 2:
źródło
Scala 2,9,
260256254252248247241239234227225212205 znakówNie golfowany:
Stosowanie:
Kompiluj
scalac filename
i uruchamiaj zscala C
. Dane wejściowe są pobierane za pośrednictwemSTDIN
.Aby uruchomić na ideone.com, zmień
object C extends App
naobject Main extends Application
na Scala 2.8.źródło
PHP,
166146138 znakówNie golfowany:
Stosowanie :
źródło
STDIN
zamiast argumentów.Umieściłem je wszystkie w tablicy 2d i przeszukałem wszystkie elementy z wieloma pętlami, jeśli mogą one dotrzeć do ostatniego elementu, wówczas zebrałbym powiązane elementy, aby uzyskać kolejną tablicę wyników, a z wyników wybrałbym tablicę, która jest mniejsza .
EDYCJA => JAVA: Użyłem również funkcji rekurencyjnej, poniżej pełny kod;
źródło