Monkey Island: le chef du navigateur

12

Avertissement: ce défi contient des spoilers légers pour The Secret of Monkey Island.

Vers la fin du jeu, vous êtes conduit à travers les catacombes par un chef de navigateur préservé comme par magie:

entrez la description de l'image ici

Vous avez besoin de son collier globe oculaire, mais la tête hésite à vous le donner. Une façon de l'obtenir est de continuer à mendier:

Guybrush: Puis-je s'il vous plaît avoir ce collier?
Chef: Non, mais merci d'avoir demandé si poliment.
Guybrush: Oh allez, pleeeeease?
Chef: Vous pouvez mendier tout ce que vous voulez, mais vous ne pouvez pas l'avoir.
Guybrush: Assez s'il vous plaît?
Chef: Vous pouvez mendier tout ce que vous voulez, mais vous ne pouvez pas l'avoir.
Guybrush: Assez JOLI s'il vous plait?
Chef: Vous pouvez mendier tout ce que vous voulez, mais vous ne pouvez pas l'avoir.
Guybrush: Assez s'il vous plaît avec du sucre sur le dessus?
Tête: Oh, d'accord, gros bébé. Vous pouvez l'avoir. Hé, à quoi ça sert un collier si vous n'avez pas d'épaules?

Le défi

Écrivez un programme complet qui imprime la boîte de dialogue ci-dessus. Le hic, c'est que chaque fois que le programme est appelé, il ne devrait imprimer que deux lignes (une plaidoirie par Guybrush et la réponse du chef). Par exemple, si votre soumission est écrite en Python, l'utilisation devrait ressembler à ceci:

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

Invoquer le programme plus de 5 fois peut entraîner un comportement indéfini, vous pouvez donc soit boucler, continuer à imprimer les deux dernières lignes ou le programme peut même être interrompu après la 5e invocation.

Vous pouvez écrire dans un fichier du répertoire de travail ou modifier le code source du programme lui-même pour suivre les appels. Dans ce dernier cas, votre programme ne doit pas dépendre de son propre nom de fichier. (Dans le premier cas, vous pouvez supposer que le nom de fichier de votre programme n'entrera pas en conflit avec les noms de fichiers dont dépend votre programme.)

Vous ne devez pas supposer un environnement de type REPL ou que des données soient conservées dans la RAM entre les invocations. Par exemple, si vous répondez dans Mathematica, vous devez supposer que je quitte le noyau entre les invocations.

Il s'agit du code golf, la réponse la plus courte (en octets) l'emporte. Si votre programme dépend de l'existence de fichiers supplémentaires avant la première invocation , ajoutez son nom et son contenu à votre nombre d'octets.

Martin Ender
la source
Donc, ne pas mettre de valeur aux variables globales et les réutiliser dans JS?
Optimizer
@Optimizer Non, désolé. Je pense que si vous voulez utiliser JS pour celui-ci, vous devrez utiliser le nœud.
Martin Ender
Nous pouvons également avoir des variables globales dans le nœud. Suggérez-vous que le nœud wrt, nous devrions être en mesure de quitter le nœud et continuer sur la séquence de dialogue?
Optimizer
@Optimizer Oui. Vous devriez écrire un programme complet, que je peux invoquer 5 fois avec node please.js5 sorties différentes.
Martin Ender
Mon programme peut-il dépendre d'un fichier externe pour démarrer? Je vais inclure son nombre d'octets dans mon score
Claudiu

Réponses:

9

Python, 224 + 97 + 1 = 322 caractères

Une solution des plus simples pour tout démarrer. Merci à gnibbler de m'avoir aidé à raser 18 octets!

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

Nécessite que le fichier zsoit présent dans le même répertoire (+1 pour le nom de fichier, +224 pour la taille du fichier):

$ 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

Vous pouvez générer zavec les éléments suivants:

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

Production:

$ 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
la source
1
Utilisez un délimiteur différent entre les paires de lignes, donc par exemple vous avez line1\nline2|line3\nline4|line5\nline6|line7\nline8|line9\nline10maintenant vous pouvez diviser |et justeprint D[n]
gnibbler
@gnibbler: Monsieur bien repéré!
Claudiu
5

Lisp commun (SBCL): 659 caractères

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

Explications

  • Je vide l'image nette après chaque invocation, ce qui enregistre l'état actuel.
  • La liste circulaire me laisser relancer le dialogue après toutes les lignes ont été affichées (non requis, mais au moins il ne pas d' erreur de formatavec nil).
  • Les macros de lecture me permettent de réutiliser des lignes identiques.

Ce ne sera pas la soumission la plus courte, mais je pensais que c'était une bonne approche du problème.

Première invocation

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

Invocations ultérieures

$./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]
coredump
la source
3

C # - 593 + 1 + 1 caractères (595)

Modifications: mis à jour avec les suggestions de Martin et diverses autres optimisations

Le premier +1 est un nom de fichier. Le deuxième +1 correspond au contenu de ce fichier. Sans tous les espaces et les sauts de ligne supprimés, vous pouvez le lire:

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

Explication

S'appuie sur un fichier texte appelé "x" pour être présent dans le répertoire. Doit initialement contenir un zéro et est utilisé pour stocker la progression.

Le programme extrait l'élément pertinent du tableau de chaînes en fonction de la progression et écrit la progression à la fin. Certaines lignes réutilisées pour raccourcir la longueur, d'où la logique de sélection d'index h+b[(a+5)/6*2+1]pour la sélection des réponses.

Production

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>

Mon premier golf de code, probablement pas le plus court possible en C # mais bon - Monkey Island, n'a pas pu résister!

Code supprimé:

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
la source
1
Bienvenue chez PPCG! Quelques conseils de golf: je pense que vous pouvez simplifier un peu cet opérateur ternaire. Au moins a<1?1:a<8?3:9, si C # prend en charge les entiers véridiques, alors aussi a?a<8?3:9:1. Mais vous pouvez probablement même utiliser la division entière et faire (a+5)/6*2et déplacer la dernière chaîne de la tête pour remplacer la première vide (index 5). Et essayez des trucs comme using s=System.String;. (Oh et vous pourriez peut-être omettre l'espace de noms, ou même utiliser l'espace Systemde noms pour éviter Systemdans toutes les utilisations.)
Martin Ender
Donc je peux. Tout cet apprentissage du codage pour la maintenabilité me met vraiment en difficulté ici;)
Gareth
3

JS, 488 473

Actualiser 5 fois la page contenant ce code affiche les 5 différentes boîtes de dialogue.

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

Démo:

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

xem
la source
2

Perl - 356 octets

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

Une approche d'auto-modification, avec des substitutions pour les chaînes communes.

Exemple d'utilisation:

$ 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
la source