Острів мавп: голова навігатора


12

Попередження: Цей виклик містить кілька м'яких спойлерів для «Таємниці острова мавп».

Наприкінці гри вас через катакомби веде магічно збережена голова навігатора:

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

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

Гайбруш: Чи можу я отримати це намисто?
Керівник: Ні, але дякую за те, що ви просили так ввічливо.
Гайбруш: Ой давай, олійник?
Керівник: Ви можете просити все, що завгодно, але цього не можете.
Гайбруш: Досить, будь ласка?
Керівник: Ви можете просити все, що завгодно, але цього не можете.
Гайбруш: Досить ПРЕТТИ, будь ласка?
Керівник: Ви можете просити все, що завгодно, але цього не можете.
Гайбруш: Досить, будь ласка, з цукром зверху?
Керівник: О, добре, велика дитино. Ви можете це мати. Гей, яка користь це намисто, якщо у тебе немає плечей?

Змагання

Напишіть повну програму, яка друкує діалог, описаний вище Привід полягає в тому, що кожного разу, коли програма називається, вона повинна надрукувати лише два рядки (по одному з проханням Гайбруша та відповіді керівника). Наприклад, якщо ваше повідомлення написано на 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?
Оптимізатор

@Optimizer Ні, вибач. Я думаю, що якщо ви хочете використовувати JS для цього, вам доведеться використовувати вузол.
Мартін Ендер

У нас також можуть бути глобальні змінні. Ви припускаєте, що wrt-вузол, ми повинні мати можливість вийти з вузла і продовжувати продовжувати діалог?
Оптимізатор

@Optimizer Так. Ви повинні написати повну програму, яку я можу викликати 5 разів, node please.jsотримуючи 5 різних результатів.
Мартін Ендер

Чи може моя програма залежати від зовнішнього файлу для запуску? Я включу його кількість байтів у свій рахунок
Клавдіу,

Відповіді:


9

Пітон, 224 + 97 + 1 = 322 символи

Найпростіше рішення, щоб почати нас усіх. Дякуємо гніблеру за те, що допомогли мені відголити 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

Звичайний Лісп (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).
  • Макроси читання дозволяють мені повторно використовувати деякі однакові лінії.

Це буде не найкоротше подання, але я вважав, що це приємний підхід до проблеми.

Викликання фіртки

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

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 #, але ей - Острів Мавп, не втримався!

Позбавлений код:

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
Ласкаво просимо до 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


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?
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.