Monkey Island: The Head of the Navigator

12

Ostrzeżenie: to wyzwanie zawiera łagodne spoilery do gry The Secret of Monkey Island.

Pod koniec gry prowadzony jest przez katakumby magicznie zachowana głowa nawigatora:

wprowadź opis zdjęcia tutaj

Potrzebujesz jego gałki ocznej, ale Głowa niechętnie ci go daje. Jednym ze sposobów na to jest po prostu żebranie:

Guybrush: Czy mogę prosić o ten naszyjnik?
Głowa: Nie, ale dziękuję za tak grzeczne pytanie.
Guybrush: Oh daj spokój, proszę?
Głowa: Możesz błagać, ile chcesz, ale nie możesz tego mieć.
Guybrush: Całkiem proszę?
Głowa: Możesz błagać, ile chcesz, ale nie możesz tego mieć.
Guybrush: Całkiem PROSTY proszę?
Głowa: Możesz błagać, ile chcesz, ale nie możesz tego mieć.
Guybrush: Całkiem proszę z cukrem na wierzchu?
Głowa: Och, w porządku, ty duże dziecko. Możesz to mieć. Hej, co dobrego jest naszyjnikiem, jeśli nie masz ramion?

Wyzwanie

Napisz pełny program, który wydrukuje powyższe okno dialogowe. Problem polega na tym, że za każdym razem, gdy program jest wywoływany, powinien wypisywać tylko dwie linie (jedną prośbę Guybrusha i odpowiedź Głowy). Np. Jeśli twoje zgłoszenie jest napisane w Pythonie, użycie powinno wyglądać następująco:

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

Wywołanie programu więcej niż 5 razy może spowodować niezdefiniowane zachowanie, więc możesz albo zapętlić, drukować dwa ostatnie wiersze, albo program może nawet zostać zepsuty po piątym wywołaniu.

Możesz pisać do pliku w katalogu roboczym lub modyfikować kod źródłowy samego programu, aby śledzić wywołania. W tym drugim przypadku program nie może zależeć od własnej nazwy pliku. (W pierwszym przypadku możesz założyć, że nazwa pliku twojego programu nie będzie kolidować z nazwami plików, od których zależy Twój program).

Nie wolno zakładać środowiska podobnego do REPL lub przechowywania danych w pamięci RAM między wywołaniami. Np. Jeśli odpowiadasz w Mathematica, musisz założyć, że opuściłem jądro między wywołaniami.

To jest kod golfowy, wygrywa najkrótsza odpowiedź (w bajtach). Jeśli twój program zależy od dodatkowych plików, które istnieją przed pierwszym wywołaniem , dodaj jego nazwę i zawartość do liczby bajtów.

Martin Ender
źródło
Więc nie warto dodawać wartości do zmiennych globalnych, a następnie ponownie wykorzystywać w JS?
Optymalizator
@Optimizer Nie, przepraszam. Myślę, że jeśli chcesz użyć JS do tego, musisz użyć węzła.
Martin Ender
Możemy również mieć zmienne globalne w węźle. Czy sugerujesz, aby węzeł wrt, powinniśmy móc wyjść z węzła i nadal kontynuować sekwencję dialogu?
Optymalizator
@Optimizer Tak. Powinieneś napisać pełny program, który mogę wywołać 5 razy, node please.jsuzyskując 5 różnych wyników.
Martin Ender
Czy mój program może zacząć od zewnętrznego pliku? Uwzględnię liczbę bajtów w moim wyniku
Claudiu

Odpowiedzi:

9

Python, 224 + 97 + 1 = 322 znaków

Najprostsze rozwiązanie, które nas wszystkich uruchomi. Dzięki gnibbler za pomoc w goleniu 18 bajtów!

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

Wymaga, aby plik zbył obecny w tym samym katalogu (+1 dla nazwy pliku, +224 dla rozmiaru pliku):

$ 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

Możesz wygenerować zza pomocą:

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

Wynik:

$ 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
źródło
1
Użyj innego separatora pomiędzy parami linii, więc na przykład masz line1\nline2|line3\nline4|line5\nline6|line7\nline8|line9\nline10Teraz możesz podzielić |i po prostuprint D[n]
gnibbler
@gnibbler: Dobrze zauważony panie!
Claudiu
5

Common Lisp (SBCL): 659 znaków

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

Objaśnienia

  • Zrzucam obraz seplenu po każdym wywołaniu, co zapisuje aktualny stan.
  • Lista okrągły pozwól mi ponownie uruchomić dialog po zostały wyświetlone wszystkie linie (nie jest to wymagane, ale przynajmniej nie błąd na formatz nil).
  • Makra czytników pozwalają mi na ponowne użycie niektórych identycznych linii.

To nie będzie najkrótsze zgłoszenie, ale pomyślałem, że to miłe podejście do problemu.

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

Kolejne inwokacje

$./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]
rdzeń rdzeniowy
źródło
3

C # - 593 + 1 + 1 znaków (595)

Edycje: Zaktualizowano z sugestiami Martina i różnymi innymi optymalizacjami

Pierwszy +1 to nazwa pliku. Drugi +1 to zawartość tego pliku. Bez usunięcia wszystkich spacji i podziałów linii, aby można je było przeczytać:

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

Wyjaśnienie

Polega na pliku tekstowym o nazwie „x” znajdującym się w katalogu. Powinien początkowo zawierać zero i służy do przechowywania postępów.

Program pobiera odpowiedni element z tablicy ciągów zgodnie z postępem i zapisuje postęp na końcu. Niektóre linie zostały ponownie użyte w celu skrócenia długości, stąd logika wyboru indeksu do wyboru h+b[(a+5)/6*2+1]odpowiedzi.

Wynik

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>

Mój pierwszy golf golfowy, prawdopodobnie nie najkrótszy z możliwych w C #, ale hej - Monkey Island, nie mogłem się oprzeć!

Kod pozbawiony:

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
źródło
1
Witamy w PPCG! Kilka wskazówek golfowych: Myślę, że można nieco uprościć tego trójskładnikowego operatora. Przynajmniej a<1?1:a<8?3:9jeśli C # obsługuje prawdziwe liczby całkowite, to również a?a<8?3:9:1. Ale prawdopodobnie możesz nawet użyć podziału na liczby całkowite i zrobić (a+5)/6*2i przesunąć ostatni ciąg głowy, aby zastąpić pierwszy pusty (indeks 5). I spróbuj takich rzeczy jak using s=System.String;. (Aha, być może uda ci się pominąć przestrzeń nazw, a nawet użyć przestrzeni nazw, Systemaby uniknąć Systemużycia).
Martin Ender
Więc mogę. Cała ta nauka kodowania w celu utrzymania jest naprawdę niekorzystna dla mnie;)
Gareth
3

JS, 488 473

Odświeżenie 5 razy strony zawierającej ten kod powoduje wyświetlenie 5 różnych okien dialogowych.

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

Próbny:

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

Xem
źródło
2

Perl - 356 bajtów

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

Podejście samomodyfikujące, z podmianami wspólnych ciągów.

Przykładowe użycie:

$ 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
źródło