Choose Your Own Adventure-Bücher sind eine Form interaktiver Literatur, bei der der Leser Entscheidungen treffen muss, die sich auf das Ergebnis der Geschichte auswirken. An bestimmten Stellen in der Geschichte stehen dem Leser mehrere Optionen zur Verfügung, von denen jede den Leser auf eine andere Seite im Buch weiterleitet.
In einer Fantasy-Umgebung muss man sich beispielsweise auf Seite 14 entscheiden, ob man sich in eine mysteriöse Höhle wagt, indem man zu Seite 22 "springt" oder den nahe gelegenen Wald erkundet, indem man zu Seite 8 springt. Diese "Sprünge" können ausgedrückt werden als Seitenzahlenpaare, wie folgt:
14 22
14 8
In den meisten Fällen gibt es viele Enden der Geschichte, aber nur wenige gute. Das Ziel ist es, durch die Geschichte zu navigieren, um ein gutes Ende zu erreichen.
Aufgabe:
Mit einer Liste von "Sprüngen" für ein bestimmtes Buch müssen Sie eine Route ermitteln, die zu einem bestimmten Ende führt. Da dies ziemlich einfach ist, besteht die wahre Herausforderung darin, so wenig Zeichen wie möglich zu verwenden.
Das ist Code Golf .
Beispieleingabe (wobei 1 der Anfang und 100 das Ziel ist):
1 10
10 5
10 13
5 12
5 19
13 15
12 20
15 100
Beispielausgabe:
1 10 13 15 100
Beispieleingabe:
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
Beispielausgabe:
1 15 2 12 80 100
Anmerkungen:
- Die Liste der Sprünge wird vom Benutzer entweder aus einer Datei oder von stdin eingegeben. Sie können wählen, was am bequemsten ist.
- Die Eingabe enthält 1 Sprung pro Zeile, wobei Ursprung und Ziel durch ein einzelnes Leerzeichen getrennt sind.
- Es wird nicht garantiert, dass sich die Zeilen in der Eingabe in einer bestimmten Reihenfolge befinden.
- Ein erfolgreicher Pfad beginnt auf Seite 1 und endet auf Seite 100.
- Sie können davon ausgehen, dass mindestens 1 Pfad zum Ziel vorhanden ist. Sie müssen nicht alle Pfade finden und auch nicht die kürzesten. Finde einfach mindestens einen.
- Die kleinste Seitenzahl ist 1. Die größte Seitenzahl ist unbegrenzt. (Sie können davon ausgehen, dass es in den Bereich eines Int. Passt.)
- Möglicherweise sind Schleifen vorhanden. Beispielsweise kann die Liste Sprünge von Seite 5 bis 10, 10 bis 19 und 19 bis 5 aufweisen.
- Es kann Sackgassen geben. Das heißt, auf eine Zielseite kann möglicherweise nirgendwo gesprungen werden.
- Umgekehrt sind möglicherweise nicht erreichbare Seiten vorhanden. Das heißt, eine Ursprungsseite ist möglicherweise nicht das Ziel von Sprüngen.
- Es wird garantiert, dass nicht alle Seitenzahlen zwischen 1 und 100 verwendet werden.
- Ihre Ausgabe sollte aus einer gültigen Route von Seitenzahlen bestehen, die mit 1 beginnen und mit 100 enden, getrennt durch Leerzeichen.
Denken Sie daran, dies ist Codegolf, also gewinnt die kürzeste Lösung!
BEARBEITEN: Ein weiteres Beispiel zum Testen hinzugefügt.
quelle
Antworten:
Golfscript,
5857 ZeichenAchtung : das ist super ineffizient. Es funktioniert, indem die Adjazenzmatrix wiederholt quadriert und dann nach einer Route gesucht wird. Wenn
E
das Diagramm Kanten enthält, werden alle Pfade mit einer Länge von bis zu 2 E gefunden (und die kürzeren werden häufig gefunden). Es sollte Ihnen in angemessener Zeit ein Ergebnis für den ersten Testfall liefern, aber wenn Sie den zweiten Testfall ausprobieren möchten, stellen Sie sicher, dass Sie ein paar Gigs Speicherplatz frei haben und einen langen Spaziergang machen.Wenn Sie eine einigermaßen effiziente Lösung suchen, biete ich bei 67 Zeichen:
quelle
cat input | ruby1.9 golfscript.rb peter.gs
und alles, was passiert ist, war, dass mein MacBook richtig heiß geworden ist. Wie soll ich es ausführen?Python,
232213157143135132 Zeichen (kürzester Weg)Diese Implementierung kann alle beschriebenen Randfälle (Schleifen, Sackgassen, verwaiste Seiten usw.) verarbeiten und garantiert, dass der kürzeste Weg zum Ende gefunden wird. Es basiert auf dem kürzesten Weg-Algorithmus von Djikstra.
quelle
Javascript: 189 Zeichen
Dies ist eine rekursive Lösung, die den kürzesten Weg durch das Abenteuer findet.
Code-Golf:
Zum Testen ( WARNUNG: Endlosschleife für schlechte Eingabe! ):
Kopieren Sie eine der folgenden Eingabezeichenfolgen (oder verwenden Sie ein ähnliches Format, um Ihre eigenen auszuwählen, und wählen Sie Ihr eigenes Abenteuer aus):
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
Paste , die in die Test Geige ‚s prompt.
Formatierter und kommentierter Code:
Zum Testen ( WARNUNG: Endlosschleife für schlechte Eingabe! ):
Kopieren Sie eine der folgenden Eingabezeichenfolgen (oder verwenden Sie ein ähnliches Format, um Ihre eigenen auszuwählen, und wählen Sie Ihr eigenes Abenteuer aus):
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
Paste , die in die Test Geige ‚s prompt.
quelle
var
Schlüsselwort globalen Geltungsbereich haben :)Ruby 1.9, 98
Ungolfed:
quelle
Perl, 88 Zeichen
im Grunde eine perlisierte Version von Clueless 'Eintrag; Vor- und Nachspiele machen Spaß :)
quelle
Python -
239237236Leider ist diese schwanzrekursive Lösung anfällig für Schleifen in der "Geschichte" ...
Verwendung : cat ./test0 | ./sol.py Ausgabe für Testfall 1:
Ausgabe für Testfall 2:
quelle
Scala 2.9,
260256254252248247241239234227225212205 ZeichenUngolfed:
Verwendung:
Kompiliere mit
scalac filename
und starte mitscala C
. Die Eingabe erfolgt überSTDIN
.Wechseln Sie
object C extends App
zur Ausführung auf ideone.com zuobject Main extends Application
Scala 2.8.quelle
PHP,
166146138 ZeichenUngolfed:
Verwendung :
quelle
STDIN
anstatt als Argumente zu senden .Ich würde alle in ein 2D-Array einfügen und alle Elemente mit mehreren Schleifen durchsuchen. Wenn sie das letzte Element erreichen können, würde ich verwandte Elemente in einem anderen Ergebnis-Array sammeln und aus den Ergebnissen ein Array auswählen, das kleiner ist .
BEARBEITEN => JAVA: Ich habe auch rekursive Funktion verwendet, vollständiger Code unten;
quelle