Остров обезьян: голова навигатора

12

Предупреждение: это испытание содержит несколько легких спойлеров для The Secret of Monkey Island.

К концу игры вас через катакомбы ведет волшебная голова навигатора:

введите описание изображения здесь

Вам нужно его ожерелье из глазного яблока, но Глава не хочет его отдавать. Один из способов получить это просто продолжать просить:

Гайбраш: можно мне это ожерелье?
Руководитель: Нет, но спасибо, что так вежливо спросили.
Гайбраш: О, давай, пожалуйста?
Голова: Вы можете просить все, что хотите, но у вас не может быть этого.
Гайбраш: Довольно, пожалуйста?
Голова: Вы можете просить все, что хотите, но у вас не может быть этого.
Гайбраш: Довольно мило, пожалуйста?
Голова: Вы можете просить все, что хотите, но у вас не может быть этого.
Гайбраш: Довольно, пожалуйста, с сахаром сверху?
Голова: О хорошо, большой ребенок. Ты можешь иметь это. Эй, что хорошего в ожерелье, если у тебя нет плеч?

Соревнование

Напишите полную программу, которая печатает вышеприведенный диалог. Суть в том, что каждый раз, когда программа вызывается, она должна печатать только две строки (одна просьба Гайбраша и ответ руководителя). Например, если ваша заявка написана на Python, использование должно выглядеть следующим образом:

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

Вызов программы более 5 раз может привести к неопределенному поведению, так что вы можете либо зацикливаться, продолжать печатать последние две строки, либо программа может даже не работать после 5-го вызова.

Вы можете записать в файл в рабочем каталоге или изменить исходный код самой программы, чтобы отслеживать вызовы. В последнем случае ваша программа не должна зависеть от собственного имени файла. (В первом случае вы можете предположить, что имя файла вашей программы не будет конфликтовать с именами файлов, от которых зависит ваша программа.)

Вы не должны предполагать среду, подобную REPL, или что любые данные хранятся в оперативной памяти между вызовами. Например, если вы отвечаете в Mathematica, вы должны предположить, что я покидаю ядро ​​между вызовами.

Это код гольф, самый короткий ответ (в байтах) выигрывает. Если ваша программа зависит от каких-либо дополнительных файлов, существовавших до первого вызова , добавьте ее имя и содержимое в счетчик байтов.

Мартин Эндер
источник
Так нет ли значения глобальных переменных и повторного использования в JS?
Оптимизатор
@ Оптимизатор Нет, прости. Я думаю, что если вы хотите использовать JS для этого, вам придется использовать узел.
Мартин Эндер
Мы также можем иметь глобальные переменные в узле. Вы предлагаете, чтобы по отношению к узлу мы могли выйти из узла и продолжить последовательность диалогов?
Оптимизатор
@ Оптимизатор Да. Вы должны написать полную программу, которую я могу вызвать 5 раз с node please.js5 разными выходами.
Мартин Эндер
Может ли моя программа зависеть от внешнего файла для запуска? Я включу его количество байтов в свой счет
Claudiu

Ответы:

9

Python, 224 + 97 + 1 = 322 символа

Самое простое решение, чтобы начать всех нас. Спасибо gnibbler за помощь в сборе 18 байт!

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

Требует, чтобы файл zприсутствовал в том же каталоге (+1 для имени файла, +224 для размера файла):

$ 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

Вы можете создать zс помощью следующего:

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

Выход:

$ 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
Используйте другой разделитель для пар линий, например, у вас есть line1\nline2|line3\nline4|line5\nline6|line7\nline8|line9\nline10Теперь вы можете разделить на |и простоprint D[n]
gnibbler
@gnibbler: Хорошо заметили, сэр!
Клавдиу
5

Common Lisp (SBCL): 659 символов

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

Пояснения

  • Я сбрасываю изображение lisp после каждого вызова, который сохраняет текущее состояние.
  • Циклический список , дайте мне перезапустить диалог после того, как были показаны уже все линии (не обязательно, но , по крайней мере , это не ошибка на formatс nil).
  • Макросы Reader позволяют мне использовать несколько одинаковых строк.

Это будет не самое короткое представление, но я подумал, что это хороший подход к проблеме.

Вызов Фирты

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

Последующие вызовы

$./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
источник
3

C # - 593 + 1 + 1 символов (595)

Изменения: дополнено предложениями Мартина и различными другими оптимизациями

Первый +1 это имя файла. Второй +1 - содержимое этого файла. Без удаления пробелов и разрывов строк, чтобы вы могли прочитать это:

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

объяснение

Полагается на текстовый файл с именем "x", который будет присутствовать в каталоге. Первоначально должен содержать ноль и используется для хранения прогресса.

Программа извлекает соответствующий элемент из массива строк в соответствии с прогрессом и записывает прогресс в конце. Некоторые строки используются повторно для сокращения длины, следовательно, логика выбора индекса h+b[(a+5)/6*2+1]для выбора ответа.

Выход

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>

Мой первый гольф-код, вероятно, не самый короткий в C #, но эй - Monkey Island, не удержался!

Раздетый код:

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
источник
1
Добро пожаловать в PPCG! Несколько советов по игре в гольф: я думаю, вы можете немного упростить этого троичного оператора. По крайней мере a<1?1:a<8?3:9, если C # поддерживает истинные целые числа, то тоже a?a<8?3:9:1. Но вы, возможно, даже можете использовать целочисленное деление, а также сделать (a+5)/6*2и переместить последнюю строку заголовка, чтобы заменить первую пустую (индекс 5). И попробуйте такие вещи, как using s=System.String;. (О, и вы могли бы опустить пространство имен или даже использовать пространство имен, Systemчтобы избежать Systemво всем использовании.)
Martin Ender
Таким образом я могу. Все это обучение программированию для удобства сопровождения действительно ставит меня в невыгодное положение;)
Гарет
3

JS, 488 473

При обновлении 5 раз страница, содержащая этот код, отображает 5 различных диалогов.

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

Демо-версия:

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

XEM
источник
2

Perl - 356 байт

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

Самомодифицирующийся подход с заменами общих строк.

Пример использования:

$ 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?
Примо
источник