Monkey Island: The Head of the Navigator


12

Avvertenza: questa sfida contiene alcuni spoiler delicati per The Secret of Monkey Island.

Verso la fine del gioco, vieni guidato attraverso le catacombe da un capo magicamente conservato di un navigatore:

inserisci qui la descrizione dell'immagine

Hai bisogno della sua collana a bulbo oculare, ma la Testa è riluttante a dartelo. Un modo per ottenerlo è solo per continuare a chiedere l'elemosina:

Guybrush: Per favore, posso avere quella collana?
Testa: No, ma grazie per avermelo chiesto in modo educato.
Guybrush: Oh andiamo, per favore?
Testa: puoi chiedere tutto ciò che vuoi, ma non puoi averlo.
Guybrush: Abbastanza per favore?
Testa: puoi chiedere tutto ciò che vuoi, ma non puoi averlo.
Guybrush: Abbastanza grazioso per favore?
Testa: puoi chiedere tutto ciò che vuoi, ma non puoi averlo.
Guybrush: Abbastanza per favore con lo zucchero in cima?
Testa: Oh, va bene, grande bambino. Puoi averlo. Ehi, a che serve una collana se non hai le spalle?

La sfida

Scrivi un programma completo che stampa il dialogo sopra. Il trucco è che ogni volta che viene chiamato il programma dovrebbe solo stampare due righe (una che supplica Guybrush e la risposta del capo). Ad esempio, se l'invio è scritto in Python, l'utilizzo dovrebbe essere simile al seguente:

$> 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?

Richiamare il programma più di 5 volte può comportare un comportamento indefinito, quindi è possibile eseguire il ciclo continuo, continuare a stampare le ultime due righe o il programma potrebbe anche essere interrotto dopo la 5a chiamata.

È possibile scrivere su un file nella directory di lavoro oppure modificare il codice sorgente del programma stesso per tenere traccia delle invocazioni. In quest'ultimo caso, il programma non deve dipendere dal proprio nome file. (Nel primo caso, puoi presumere che il nome del file del tuo programma non si scontrerà con i nomi dei file da cui dipende il tuo programma.)

Non è necessario presupporre un ambiente simile a REPL o che i dati siano conservati nella RAM tra le chiamate. Ad esempio, se rispondi in Mathematica, devi presumere che io abbia lasciato il kernel tra le invocazioni.

Questo è il codice golf, vince la risposta più breve (in byte). Se il programma dipende da eventuali file aggiuntivi esistenti prima della prima chiamata, aggiungere il nome e il contenuto al conteggio dei byte.


Quindi non dare valore alle variabili globali e poi riutilizzarle in JS?
Ottimizzatore

@Optimizer No, scusa. Penso che se vuoi usare JS per questo, dovrai usare il nodo.
Martin Ender,

Possiamo avere anche variabili globali nel nodo. Stai suggerendo quel nodo wrt, dovremmo essere in grado di uscire dal nodo e continuare ancora nella sequenza di dialogo?
Ottimizzatore

@Optimizer Sì. Dovresti scrivere un programma completo, che posso invocare 5 volte node please.jsproducendo 5 output diversi.
Martin Ender,

Il mio programma può dipendere da un file esterno per iniziare? Includerò il conteggio dei byte nel mio punteggio
Claudiu il

Risposte:


9

Python, 224 + 97 + 1 = 322 caratteri

Una soluzione molto semplice per iniziare tutti noi. Grazie a gnibbler per avermi aiutato a radere 18 byte!

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

Richiede che il file zsia presente nella stessa directory (+1 per il nome file, +224 per la dimensione del file):

$ 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

È possibile generare zcon il seguente:

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

Produzione:

$ 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
Usa un delimitatore diverso per tra le coppie di linee, quindi ad esempio hai line1\nline2|line3\nline4|line5\nline6|line7\nline8|line9\nline10Ora puoi dividere |e soloprint D[n]
gnibbler

@gnibbler: ben individuato signore!
Claudiu,

5

Common Lisp (SBCL): 659 caratteri

(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)

spiegazioni

  • Dump l'immagine lisp dopo ogni invocazione, che salva lo stato corrente.
  • La lista circolare lasciatemi riprendere il dialogo dopo che sono state esposte tutte le linee (non richiesto, ma almeno non di errore a formatcon nil).
  • Le macro di Reader mi consentono di riutilizzare alcune linee identiche.

Questa non sarà la proposta più breve, ma ho pensato che fosse un buon approccio al problema.

Invoca Firt

 $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]

Invocazioni successive

$./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 caratteri (595)

Modifiche: aggiornato con suggerimenti di Martin e varie altre ottimizzazioni

Il primo +1 è un nome file. Il secondo +1 è il contenuto di quel file. Senza tutti gli spazi e le interruzioni di riga rimossi in modo da poterlo leggere:

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());
    }
}

Spiegazione

Si basa su un file di testo chiamato "x" per essere presente nella directory. Dovrebbe contenere inizialmente uno zero e viene utilizzato per memorizzare i progressi.

Il programma estrae l'elemento rilevante dall'array di stringhe in base all'avanzamento e scrive l'avanzamento alla fine. Alcune righe vengono riutilizzate per ridurre la lunghezza, quindi la logica di selezione dell'indice h+b[(a+5)/6*2+1]per la selezione della risposta.

Produzione

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>

Il mio primo codice golf, probabilmente non il più breve possibile in C # ma hey - Monkey Island, non ho resistito!

Codice Stripped:

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
Benvenuti in PPCG! Alcuni consigli sul golf: penso che tu possa semplificare un po 'quell'operatore ternario. Almeno a a<1?1:a<8?3:9, se C # supporta numeri interi veritieri, allora anche a?a<8?3:9:1. Ma probabilmente puoi anche usare la divisione intera e fare (a+5)/6*2e spostare la stringa finale della testa per sostituire la prima vuota (indice 5). E prova cose del genere using s=System.String;. (Oh, e potresti essere in grado di omettere lo spazio dei nomi, o persino usare lo spazio dei nomi Systemper evitare Systemin tutto l'uso.)
Martin Ender,

Così posso. Tutto questo imparare a programmare per manutenibilità mi sta davvero mettendo in una posizione di svantaggio;)
Gareth,

3

JS, 488 473

Aggiornamento 5 volte la pagina contenente questo codice visualizza le 5 diverse finestre di dialogo.

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 byte

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

Un approccio automodificante, con sostituzioni di stringhe comuni.

Esempio di utilizzo:

$ 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?
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.