Ilha dos Macacos: O Chefe do Navegador

12

Aviso: Este desafio contém alguns spoilers leves de O Segredo da Ilha dos Macacos.

No final do jogo, você está sendo conduzido pelas catacumbas por uma cabeça de um navegador magicamente preservada:

insira a descrição da imagem aqui

Você precisa do colar do globo ocular, mas a Cabeça reluta em dar a você. Uma maneira de obtê-lo é apenas continuar implorando:

Guybrush: Por favor, posso ter esse colar?
Cabeça: Não, mas obrigado por perguntar tão educadamente.
Guybrush: Oh, vamos lá, pleeeeease?
Cabeça: Você pode implorar o quanto quiser, mas não pode tê-lo.
Guybrush: Muito por favor?
Cabeça: Você pode implorar o quanto quiser, mas não pode tê-lo.
Guybrush: MUITO BONITO, por favor?
Cabeça: Você pode implorar o quanto quiser, mas não pode tê-lo.
Guybrush: Por favor, com açúcar por cima?
Cabeça: Oh, tudo bem, seu bebê grande. Você pode ter isso. Ei, de que serve um colar se você não tem ombros?

O desafio

Escreva um programa completo que imprima o diálogo acima. O problema é que cada vez que o programa é chamado, ele deve imprimir apenas duas linhas (uma suplicando por Guybrush e a resposta do chefe). Por exemplo, se sua submissão for escrita em Python, o uso deve ser assim:

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

A chamada do programa mais de 5 vezes pode resultar em um comportamento indefinido; portanto, você pode fazer um loop, continuar imprimindo as duas últimas linhas ou o programa pode até ser interrompido após a 5ª chamada.

Você pode gravar em um arquivo no diretório de trabalho ou modificar o código fonte do próprio programa para acompanhar as invocações. Neste último caso, seu programa não deve depender de seu próprio nome de arquivo. (No primeiro caso, você pode assumir que o nome do arquivo do seu programa não entrará em conflito com os nomes dos quais o programa depende.)

Você não deve assumir um ambiente semelhante ao REPL ou que quaisquer dados sejam mantidos na RAM entre as invocações. Por exemplo, se você responder no Mathematica, você deve assumir que eu encerrei o kernel entre invocações.

Isso é código de golfe, a resposta mais curta (em bytes) vence. Se o seu programa depender da existência de arquivos adicionais antes da primeira chamada , inclua o nome e o conteúdo na contagem de bytes.

Martin Ender
fonte
Portanto, não há valor para variáveis ​​globais e reutilização em JS?
Optimizer
@Optimizer Não, desculpe. Eu acho que se você quiser usar JS para este, você terá que usar o nó.
Martin Ender
Também podemos ter variáveis ​​globais no nó. Você está sugerindo que o nó wrt deve poder sair do nó e continuar na sequência de diálogo?
Optimizer
@Optimizer Sim. Você deve escrever um programa completo, que eu possa chamar 5 vezes, node please.jsproduzindo 5 saídas diferentes.
Martin Ender
Meu programa pode depender de um arquivo externo para começar? Vou incluir sua contagem de bytes na minha pontuação
Claudiu

Respostas:

9

Python, 224 + 97 + 1 = 322 caracteres

A solução mais simples para começar todos nós. Obrigado ao gnibbler por me ajudar a eliminar 18 bytes!

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

Requer que o arquivo zesteja presente no mesmo diretório (+1 para o nome do arquivo, +224 para o tamanho do arquivo):

$ 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

Você pode gerar zcom o seguinte:

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

Resultado:

$ 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
fonte
1
Use um delimitador diferente para entre os pares de linhas, de modo que, por exemplo, você tem line1\nline2|line3\nline4|line5\nline6|line7\nline8|line9\nline10Agora você pode dividir em |e apenasprint D[n]
gnibbler
@gnibbler: Bem avistado, senhor!
Claudiu
5

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

Explicações

  • Despejo a imagem lisp após cada invocação, o que salva o estado atual.
  • A lista circular deixe-me reiniciar o diálogo depois de todas as linhas de ter sido exibido (não é necessário, mas pelo menos ele não erro em formatcom nil).
  • As macros do leitor permitem reutilizar algumas linhas idênticas.

Esse não será o envio mais curto, mas achei que era uma boa abordagem para o problema.

Invocação de 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]

Invocações subsequentes

$./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
fonte
3

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

Edições: atualizadas com sugestões de Martin e várias outras otimizações

O primeiro +1 é um nome de arquivo. O segundo +1 é o conteúdo desse arquivo. Sem todos os espaços e quebras de linha removidos, você pode lê-lo:

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

Explicação

Confia em um arquivo de texto chamado "x" para estar presente no diretório Inicialmente deve conter um zero e é usado para armazenar o progresso.

O programa retira o elemento relevante da matriz de strings de acordo com o progresso e grava o progresso no final. Algumas linhas foram reutilizadas para diminuir o comprimento, daí a lógica de seleção de índices h+b[(a+5)/6*2+1]para a seleção de respostas.

Resultado

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>

Meu primeiro código de golfe, provavelmente não o mais curto possível em C #, mas ei - Monkey Island, não resisti!

Código retirado:

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
fonte
1
Bem-vindo ao PPCG! Algumas dicas de golfe: acho que você pode simplificar um pouco esse operador ternário. Pelo menos para a<1?1:a<8?3:9, se o C # suportar números inteiros verdadeiros, também a?a<8?3:9:1. Mas você provavelmente pode até fazer uso da divisão inteira e fazer (a+5)/6*2e mover a string final da cabeça para substituir a primeira vazia (índice 5). E tente coisas como using s=System.String;. (Ah, e você pode ser capaz de omitir o namespace, ou até mesmo usar namespace Systempara evitar Systemem todo o usando.)
Martin Ender
Então eu posso. Todo esse aprendizado ao código de manutenção é realmente colocar-me em desvantagem aqui;)
Gareth
3

JS, 488 473

Atualizar 5 vezes a página que contém esse código exibe as 5 caixas 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")

Demo:

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

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

Uma abordagem auto-modificadora, com substituições de strings comuns.

Uso da amostra:

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