Monkey Island: Der Kopf des Navigators


12

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:

Geben Sie hier die Bildbeschreibung ein

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.


Also keinen Wert für globale Variablen setzen und dann in JS wiederverwenden?
Optimierer

@ Optimizer Nein, sorry. Ich denke, wenn Sie JS für dieses verwenden möchten, müssen Sie Knoten verwenden.
Martin Ender

Wir können auch globale Variablen im Knoten haben. Schlagen Sie vor, dass wir in der Lage sein sollten, den Knoten zu verlassen und trotzdem mit der Dialogsequenz fortzufahren?
Optimierer

@Optimizer Ja. Sie sollten ein vollständiges Programm schreiben, das ich 5 Mal mit node please.js5 verschiedenen Ausgaben aufrufen kann .
Martin Ender

Kann mein Programm zum Starten von einer externen Datei abhängen? Ich werde seine Byteanzahl in meine Punktzahl aufnehmen
Claudiu

Antworten:


9

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!

n=0
print open('z','rb').read().decode('zip').split('|')[n]
open(__file__,'r+').write("n="+`n+1`)

Erfordert, dass die Datei zim selben Verzeichnis vorhanden ist (+1 für Dateiname, +224 für Dateigröße):

$ hexdump z
0000000 9c78 d1ad 6e3d 30c3 050c bde0 78a7 165b
0000010 0723 92c8 48a9 b43a 8209 192c 9b29 0491
0000020 a2ab 9fa1 021a f87a 715a f46c d100 1026
0000030 1efc 1e41 5172 4721 c3b3 1527 607c 4c70
0000040 6191 87e8 0c91 7825 7b6e 2d47 dfef 4c8e
0000050 0edd d25f e540 8b54 8fbe 4bb8 c500 7ade
0000060 288d c418 c4d9 6cae 0f7f 7bab 6832 9be5
0000070 be21 7aa9 537d c2c2 24dd 25a3 c50f e41a
0000080 ca1c 1ff4 a7c9 a439 d5cc 9a4d b207 3fe9
0000090 0e7c 529c 4e79 3afc 7cef bf79 6f5e 672f
00000a0 8b9f 6d1d 8832 5359 1698 2482 92c3 3270
00000b0 43cd 560e 899b a4ad 1ab2 548a aed9 0bf1
00000c0 238f 0697 bd63 168f 36e9 b411 0a1e fef6
00000d0 eee8 1d64 1a28 aec9 10e3 7ff7 3a0b d9ab
00000e0

$ ls -l z
-rw-r--r--+ 1 Laxori mkpasswd 224 2014-09-22 22:35 z

Sie können zmit folgendem generieren :

>>> open('z','wb').write("""eJyt0T1uwzAMBeC9p3hbFiMHyJKpSDq0CYIsGSmbkQSroqGfGgJ6+FpxbPQA0SYQ/B5BHnJRIUez
wycVfGBwTJFh6IeRDCV4bntHLe/fjkzdDl/SQOVUi76PuEsAxd56jSgYxNnErmx/D6t7MmjlmyG+
qXp9U8LC3SSjJQ/FGuQcyvQfyac5pMzVTZoHsuk/fA6cUnlO/DrvfHm/Xm8vZ5+LHW0yiFlTmBaC
JMOScDLNQw5Wm4mtpLIailTZrvELjyOXBmO9jxbpNhG0Hgr2/ujuZB0oGsmu4xD3fws6q9k=""".decode('base64'))

Ausgabe:

$ python monkeyisland.py
Guybrush: May I please have that necklace?
Head: No, but thanks for asking so politely.
$ python monkeyisland.py
Guybrush: Oh come on, pleeeeease?
Head: You can beg all you want, but you can't have it.
$ python monkeyisland.py
Guybrush: Pretty please?
Head: You can beg all you want, but you can't have it.
$ python monkeyisland.py
Guybrush: Pretty PRETTY please?
Head: You can beg all you want, but you can't have it.
$ python monkeyisland.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?
$ python monkeyisland.py
Traceback (most recent call last):
  File "monkeyisland.py", line 2, in <module>
    print open('z','rb').read().decode('zip').split('|')[n]
IndexError: list index out of range

1
Verwenden Sie ein anderes Trennzeichen für zwischen den Zeilenpaaren, so haben line1\nline2|line3\nline4|line5\nline6|line7\nline8|line9\nline10Sie zum Beispiel Jetzt können Sie auf |und nurprint D[n]
Gnibbler

@gnibbler: Gut gesehen, Sir!
Claudiu

5

Common Lisp (SBCL): 659 Zeichen

(defparameter *d*
  '#1=("~A May I please have that necklace?"
       "~A No, but thanks for asking so politely."
       "~A Oh come on, pleeeeease?"
       #2="~A You can beg all you want, but you can't have it."
       "~A Pretty please?"
       #2#
       "~A Pretty PRETTY please?"
       #2#
       "~A Pretty please with sugar on top?"
       "~A Oh, all right, you big baby. You can have it. Hey, what good's a necklace if you don't have shoulders?" . #1#))
(defun d ()
  (format t (pop *d*) "Guybrush:") (terpri)
  (format t (pop *d*) "Head:") (terpri)
  (terpri)
  (finish-output)
  (sb-ext:save-lisp-and-die "please" :toplevel 'd :executable t))
(d)

Erklärungen

  • Ich speichere das Lisp-Image nach jedem Aufruf, wodurch der aktuelle Status gespeichert wird.
  • Mit der kreisförmigen Liste kann ich den Dialog neu starten, nachdem alle Zeilen angezeigt wurden (nicht erforderlich, aber zumindest kein Fehler formatbei nil).
  • Mit Reader-Makros kann ich einige identische Zeilen wiederverwenden.

Dies wird nicht die kürzeste Einreichung sein, aber ich dachte, dies sei eine gute Herangehensweise an das Problem.

Erster Aufruf

 $sbcl --noinform --noprint --load please.lisp
 Guybrush: May I please have that necklace?
 Head: No, but thanks for asking so politely.

 [undoing binding stack and other enclosing state... done]
 [saving current Lisp image into please:
 writing 5856 bytes from the read-only space at 0x0x20000000
 writing 4032 bytes from the static space at 0x0x20100000
 writing 67960832 bytes from the dynamic space at 0x0x1000000000
 done]

Nachfolgende Aufrufe

$./please 
Guybrush: Oh come on, pleeeeease?
Head: You can beg all you want, but you can't have it.

[undoing binding stack and other enclosing state... done]
[saving current Lisp image into please:
writing 5856 bytes from the read-only space at 0x0x20000000
writing 4032 bytes from the static space at 0x0x20100000
writing 68091904 bytes from the dynamic space at 0x0x1000000000
done]

$./please 
Guybrush: Pretty please?
Head: You can beg all you want, but you can't have it.

[undoing binding stack and other enclosing state... done]
[saving current Lisp image into please:
writing 5856 bytes from the read-only space at 0x0x20000000
writing 4032 bytes from the static space at 0x0x20100000
writing 68091904 bytes from the dynamic space at 0x0x1000000000
done]

3

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:

using System.IO;
using s=System.String;
class P
{
    static void Main()
    {
        s g="Guybrush: ",h="Head: ",p=" please",q="Pretty";
        s[]b=new s[]{"May I"+p+" have that necklace","No, but thanks for asking so politely.",
        "Oh come on, pleeeeease","You can beg all you want, but you can't have it.",q+p,
        "Oh, all right, you big baby. You can have it. Hey, what good's a necklace if you don't have shoulders?",
        q+" PRETTY"+p,"",q+p+" with sugar on top"};
        int a=int.Parse(File.ReadAllText("x",System.Text.Encoding.UTF8));
        System.Console.WriteLine(g+b[a]+"?\n"+h+b[(a+5)/6*2+1]);
        File.WriteAllText("x",(a+2).ToString());
    }
}

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

D:\Projects\Junk\MI\bin\Debug>MI
Guybrush: May I please have that necklace?
Head: No, but thanks for asking so politely.

D:\Projects\Junk\MI\bin\Debug>MI
Guybrush: Oh come on, pleeeeease?
Head: You can beg all you want, but you can't have it.

D:\Projects\Junk\MI\bin\Debug>MI
Guybrush: Pretty please?
Head: You can beg all you want, but you can't have it.

D:\Projects\Junk\MI\bin\Debug>MI
Guybrush: Pretty PRETTY please?
Head: You can beg all you want, but you can't have it.

D:\Projects\Junk\MI\bin\Debug>MI
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?

D:\Projects\Junk\MI\bin\Debug>

Mein erster Code Golf, wahrscheinlich nicht der kürzeste in C #, aber hey - Monkey Island, konnte nicht widerstehen!

Abisolierter Code:

using System.IO;using s=System.String;class P{static void Main(){s g="Guybrush: ",h="Head: ",p=" please",q="Pretty";s[]b=new s[]{"May I"+p+" have that necklace","No, but thanks for asking so politely.","Oh come on, pleeeeease","You can beg all you want, but you can't have it.",q+p,"Oh, all right, you big baby. You can have it. Hey, what good's a necklace if you don't have shoulders?",q+" PRETTY"+p,"",q+p+" with sugar on top"};int a=int.Parse(File.ReadAllText("x",System.Text.Encoding.UTF8));System.Console.WriteLine(g+b[a]+"?\n"+h+b[(a+5)/6*2+1]);File.WriteAllText("x",(a+2).ToString());}}

1
Willkommen bei PPCG! Ein paar Golftipps: Ich denke, Sie können diesen ternären Operator ein wenig vereinfachen. Zumindest dann a<1?1:a<8?3:9, wenn C # wahrheitsgemäße ganze Zahlen unterstützt, dann auch a?a<8?3:9:1. Aber Sie können wahrscheinlich sogar die Ganzzahldivision verwenden (a+5)/6*2und die letzte Zeichenfolge des Kopfes verschieben, um die erste leere zu ersetzen (Index 5). Und probieren Sie Sachen wie using s=System.String;. (Oh, und Sie können möglicherweise den Namespace weglassen oder sogar den Namespace verwenden System, um Systemdie Verwendung zu vermeiden .)
Martin Ender

Also kann ich. All dieses Lernen, Code für Wartbarkeit zu programmieren, benachteiligt mich hier wirklich;)
Gareth

3

JS, 488 473

Beim 5-fachen Aktualisieren der Seite mit diesem Code werden die 5 verschiedenen Dialogfelder angezeigt.

l=localStorage;a="<p>Guybrush: ";b=a+"Pretty please";d="<br>Head: ";c=d+"You can beg all you want, but you can't have it.";document.write(a+"May I please have that necklace?"+d+"No, but thanks for asking so politely."+a+"Oh come on, pleeeeease?"+c+b+"?"+c+a+"Pretty PRETTY please?"+c+b+" with sugar on top?"+d+"Oh, all right, you big baby. You can have it. Hey, what good's a necklace if you don't have shoulders?<style>p:not(:nth-child("+(l[0]=~~l[0]+1)+")){display:none")

Demo:

http://c99.nl/f/212197.html


2

Perl - 356 Bytes

2=~//;@d=qw"No6|thanks|for|asking|so|pol8ely. 5|beg72want62can't18.
Oh,7|right,2big|baby.|518.|Hey,|what|good's|a4|if2don't1shoulders?
May|I01that4 Oh|come|on,|pleeeeease 30 3|PRETTY0
30|w8h|sugar|on|top";print"Guybrush: $d[$'+print F$'+sysopen F,$0,1]?
Head: $d[$'/3]"=~s/\d/qw(|please |have| |you| Pretty |necklace You|can
,|but |all it)[$&]/ger=~y/|/ /r

Ein selbstmodifizierender Ansatz mit Substitutionen für gemeinsame Zeichenfolgen.

Beispielnutzung:

$ perl please.pl
Guybrush: May I please have that necklace?
Head: No, but thanks for asking so politely.

$ perl please.pl
Guybrush: Oh come on, pleeeeease?
Head: You can beg all you want, but you can't have it.

$ perl please.pl
Guybrush: Pretty please?
Head: You can beg all you want, but you can't have it.

$ perl please.pl
Guybrush: Pretty PRETTY please?
Head: You can beg all you want, but you can't have it.

$ perl please.pl
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?
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.