Warnung: Diese Herausforderung enthält einige milde Spoiler für The Secret of Monkey Island.
Gegen Ende des Spiels werden Sie von einem magisch erhaltenen Kopf eines Navigators durch die Katakomben geführt:
Sie brauchen die Augapfelkette, aber der Kopf zögert, sie Ihnen zu geben. Eine Möglichkeit, es zu bekommen, besteht darin, weiter zu betteln:
Guybrush: Darf ich bitte diese Halskette haben?
Leiter: Nein, aber danke, dass Sie so höflich gefragt haben.
Guybrush: Ach komm schon, bitte?
Kopf: Du kannst betteln, was du willst, aber du kannst es nicht haben.
Guybrush: Bitte schön?
Kopf: Du kannst betteln, was du willst, aber du kannst es nicht haben.
Guybrush: Ziemlich hübsch bitte?
Kopf: Du kannst betteln, was du willst, aber du kannst es nicht haben.
Guybrush: Ziemlich bitte mit Zucker oben drauf ?
Kopf: Oh, alles klar, du großes Baby. Du kannst es haben. Hey, was nützt eine Halskette, wenn du keine Schultern hast?
Die Herausforderung
Schreiben Sie ein vollständiges Programm, das den obigen Dialog druckt. Der Haken ist, dass jedes Mal, wenn das Programm aufgerufen wird, nur zwei Zeilen gedruckt werden sollten (eine von Guybrush und die Antwort des Leiters). Wenn Ihre Einreichung beispielsweise in Python geschrieben ist, sollte die Verwendung folgendermaßen aussehen:
$> python please.py
Guybrush: May I please have that necklace?
Head: No, but thanks for asking so politely.
$> python please.py
Guybrush: Oh come on, pleeeeease?
Head: You can beg all you want, but you can't have it.
$> python please.py
Guybrush: Pretty please?
Head: You can beg all you want, but you can't have it.
$> python please.py
Guybrush: Pretty PRETTY please?
Head: You can beg all you want, but you can't have it.
$> python please.py
Guybrush: Pretty please with sugar on top?
Head: Oh, all right, you big baby. You can have it. Hey, what good's a necklace if you don't have shoulders?
Das mehrmalige Aufrufen des Programms kann zu einem undefinierten Verhalten führen. Sie können also entweder eine Schleife ausführen, die letzten beiden Zeilen weiter drucken oder das Programm kann nach dem 5. Aufruf sogar unterbrochen werden.
Sie können in eine Datei im Arbeitsverzeichnis schreiben oder den Quellcode des Programms selbst ändern, um Aufrufe zu verfolgen. Im letzteren Fall darf Ihr Programm nicht von seinem eigenen Dateinamen abhängen. (Im ersteren Fall können Sie davon ausgehen, dass der Dateiname Ihres Programms nicht mit Dateinamen kollidiert, von denen Ihr Programm abhängt.)
Sie dürfen nicht von einer REPL-ähnlichen Umgebung ausgehen oder davon ausgehen, dass zwischen den Aufrufen Daten im RAM gespeichert werden. Wenn Sie beispielsweise in Mathematica antworten, müssen Sie davon ausgehen, dass ich den Kernel zwischen den Aufrufen verlassen habe.
Dies ist Code Golf, die kürzeste Antwort (in Bytes) gewinnt. Wenn Ihr Programm von zusätzlichen Dateien abhängt, die vor dem ersten Aufruf vorhanden sind , fügen Sie den Namen und den Inhalt Ihrer Byteanzahl hinzu.
quelle
node please.js
5 verschiedenen Ausgaben aufrufen kann .Antworten:
Python, 224 + 97 + 1 = 322 Zeichen
Eine sehr einfache Lösung, um uns alle anzufangen. Vielen Dank an gnibbler, der mir geholfen hat, 18 Bytes zu sparen!
Erfordert, dass die Datei
z
im selben Verzeichnis vorhanden ist (+1 für Dateiname, +224 für Dateigröße):Sie können
z
mit folgendem generieren :Ausgabe:
quelle
line1\nline2|line3\nline4|line5\nline6|line7\nline8|line9\nline10
Sie zum Beispiel Jetzt können Sie auf|
und nurprint D[n]
Common Lisp (SBCL): 659 Zeichen
Erklärungen
format
beinil
).Dies wird nicht die kürzeste Einreichung sein, aber ich dachte, dies sei eine gute Herangehensweise an das Problem.
Erster Aufruf
Nachfolgende Aufrufe
quelle
C # - 593 + 1 + 1 Zeichen (595)
Änderungen: Aktualisiert mit Vorschlägen von Martin und verschiedenen anderen Optimierungen
Zuerst ist +1 ein Dateiname. Die zweite +1 ist der Inhalt dieser Datei. Ohne alle Leerzeichen und Zeilenumbrüche zu entfernen, damit Sie es lesen können:
Erläuterung
Verlässt sich auf eine Textdatei mit dem Namen "x", die im Verzeichnis vorhanden ist. Sollte anfangs eine Null enthalten und wird zum Speichern des Fortschritts verwendet.
Das Programm holt das relevante Element entsprechend dem Fortschritt aus dem String-Array und schreibt den Fortschritt am Ende. Einige Zeilen wurden wiederverwendet, um die Länge zu verkürzen, daher Indexauswahllogik
h+b[(a+5)/6*2+1]
für die Antwortauswahl.Ausgabe
Mein erster Code Golf, wahrscheinlich nicht der kürzeste in C #, aber hey - Monkey Island, konnte nicht widerstehen!
Abisolierter Code:
quelle
a<1?1:a<8?3:9
, wenn C # wahrheitsgemäße ganze Zahlen unterstützt, dann aucha?a<8?3:9:1
. Aber Sie können wahrscheinlich sogar die Ganzzahldivision verwenden(a+5)/6*2
und die letzte Zeichenfolge des Kopfes verschieben, um die erste leere zu ersetzen (Index 5). Und probieren Sie Sachen wieusing s=System.String;
. (Oh, und Sie können möglicherweise den Namespace weglassen oder sogar den Namespace verwendenSystem
, umSystem
die Verwendung zu vermeiden .)JS,
488473Beim 5-fachen Aktualisieren der Seite mit diesem Code werden die 5 verschiedenen Dialogfelder angezeigt.
Demo:
http://c99.nl/f/212197.html
quelle
Perl - 356 Bytes
Ein selbstmodifizierender Ansatz mit Substitutionen für gemeinsame Zeichenfolgen.
Beispielnutzung:
quelle