Monkey Island: la cabeza del navegante

12

Advertencia: Este desafío contiene algunos spoilers leves para The Secret of Monkey Island.

Hacia el final del juego, una cabeza de navegante mágicamente preservada te guía a través de las catacumbas:

ingrese la descripción de la imagen aquí

Necesitas su collar de globo ocular, pero la Cabeza es reacia a dártelo. Una forma de conseguirlo es simplemente seguir rogando:

Guybrush: mayo por favor tener ese collar?
Jefe: No, pero gracias por preguntar tan cortésmente.
Guybrush: Oh, vamos, ¿por favor?
Cabeza: Puedes rogar todo lo que quieras, pero no puedes tenerlo.
Guybrush: ¿ Bastante por favor?
Cabeza: Puedes rogar todo lo que quieras, pero no puedes tenerlo.
Guybrush: bastante BONITO por favor?
Cabeza: Puedes rogar todo lo que quieras, pero no puedes tenerlo.
Guybrush: ¿ Bastante por favor con azúcar encima?
Cabeza: Oh, está bien, bebé grande. Tu puedes tenerlo. Oye, ¿de qué sirve un collar si no tienes hombros?

El reto

Escriba un programa completo que imprima el diálogo anterior. El problema es que cada vez que se llama al programa, solo debe imprimir dos líneas (una suplica de Guybrush y la respuesta del Jefe). Por ejemplo, si su envío está escrito en Python, el uso debería verse así:

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

Invocar el programa más de 5 veces puede dar lugar a un comportamiento indefinido, por lo que puede realizar un bucle, seguir imprimiendo las dos últimas líneas o incluso el programa podría romperse después de la quinta invocación.

Puede escribir en un archivo en el directorio de trabajo, o puede modificar el código fuente del programa en sí para realizar un seguimiento de las invocaciones. En el último caso, su programa no debe depender de su propio nombre de archivo. (En el primer caso, puede suponer que el nombre de archivo de su programa no entrará en conflicto con ningún nombre de archivo del que dependa su programa).

No debe asumir un entorno similar a REPL o que ningún dato se mantenga en RAM entre invocaciones. Por ejemplo, si responde en Mathematica, debe asumir que dejé el núcleo entre invocaciones.

Este es el código de golf, gana la respuesta más corta (en bytes). Si su programa depende de que existan archivos adicionales antes de la primera invocación , agregue su nombre y contenido a su recuento de bytes.

Martin Ender
fuente
Entonces, ¿no poner valor a las variables globales y luego reutilizar en JS?
Optimizador
@Optimizer No, lo siento. Creo que si quieres usar JS para este, tendrás que usar node.
Martin Ender
Podemos tener variables globales en el nodo también. ¿Está sugiriendo ese nodo wrt, deberíamos poder salir del nodo y continuar en la secuencia de diálogo?
Optimizador
@Optimizer Sí. Debería escribir un programa completo, que puedo invocar 5 veces con node please.js5 salidas diferentes.
Martin Ender
¿Puede mi programa depender de un archivo externo para comenzar? Incluiré su conteo de bytes en mi puntaje
Claudiu

Respuestas:

9

Python, 224 + 97 + 1 = 322 caracteres

La solución más sencilla para comenzar a todos. ¡Gracias a gnibbler por ayudarme a reducir 18 bytes!

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

Requiere que el archivo zesté presente en el mismo directorio (+1 para nombre de archivo, +224 para tamaño de archivo):

$ 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

Puede generar zcon lo siguiente:

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

Salida:

$ 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
Claudiu
fuente
1
Use un delimitador diferente para los pares de líneas, por ejemplo, line1\nline2|line3\nline4|line5\nline6|line7\nline8|line9\nline10ahora puede dividir |y simplementeprint D[n]
gnibbler
@gnibbler: ¡Señor bien visto!
Claudiu
5

Lisp común (SBCL): 659 caracteres

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

Explicaciones

  • Volcado la imagen lisp después de cada invocación, que guarda el estado actual.
  • La lista circular me permite reiniciar el diálogo después de que se hayan mostrado todas las líneas (no es obligatorio, pero al menos no se activa formatcon nil).
  • Las macros de lector me permiten reutilizar algunas líneas idénticas.

Esta no será la presentación más corta, pero pensé que era un buen enfoque para el problema.

Primera invocación

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

Invocaciones posteriores

$./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]
volcado de memoria
fuente
3

C # - 593 + 1 + 1 caracteres (595)

Ediciones: actualizado con sugerencias de Martin y varias otras optimizaciones

Primero +1 es un nombre de archivo. El segundo +1 es el contenido de ese archivo. Sin todos los espacios y saltos de línea eliminados para que pueda leerlo:

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

Explicación

Se basa en un archivo de texto llamado "x" para estar presente en el directorio. Inicialmente debe contener un cero y se utiliza para almacenar el progreso.

El programa extrae elementos relevantes de la matriz de cadenas de acuerdo con el progreso y escribe el progreso al final. Algunas líneas se reutilizan para acortar la longitud, por lo tanto, la lógica de selección de índice para la selección h+b[(a+5)/6*2+1]de respuestas.

Salida

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>

Mi primer código de golf, probablemente no sea el más corto posible en C #, pero bueno, ¡Monkey Island no pudo resistirse!

Código eliminado

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());}}
Gareth
fuente
1
Bienvenido a PPCG! Algunos consejos de golf: creo que puede simplificar un poco ese operador ternario. Al menos a<1?1:a<8?3:9, si C # admite enteros verdaderos, entonces también a?a<8?3:9:1. Pero probablemente incluso pueda utilizar la división de enteros y hacer (a+5)/6*2y mover la cadena final de la cabeza para reemplazar la primera vacía (índice 5). Y prueba cosas como using s=System.String;. (Ah, y es posible que pueda omitir el espacio de nombres, o incluso usar el espacio Systemde nombres para evitar Systemtodo el uso.)
Martin Ender
Así que puedo. Todo este aprendizaje para codificar la mantenibilidad realmente me pone en desventaja aquí;)
Gareth
3

JS, 488 473

Refrescando 5 veces la página que contiene este código muestra los 5 cuadros de diálogo diferentes.

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

Manifestación:

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

xem
fuente
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

Un enfoque de auto-modificación, con sustituciones de cadenas comunes.

Uso de muestra:

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