Pulau Monyet: Kepala Navigator

12

Peringatan: Tantangan ini berisi beberapa spoiler ringan untuk The Secret of Monkey Island.

Menjelang akhir pertandingan, Anda dipimpin melalui katakombe oleh kepala navigator yang dilindungi secara ajaib:

masukkan deskripsi gambar di sini

Anda membutuhkan kalung bola matanya, tetapi Kepala enggan memberikannya kepada Anda. Salah satu cara untuk mendapatkannya adalah dengan terus mengemis:

Guybrush: Boleh saya minta kalung itu?
Kepala: Tidak, tapi terima kasih sudah bertanya dengan sopan.
Guybrush: Oh ayolah, tolong?
Kepala: Anda bisa memohon semua yang Anda inginkan, tetapi Anda tidak bisa memilikinya.
Guybrush: Cukup cantik?
Kepala: Anda bisa memohon semua yang Anda inginkan, tetapi Anda tidak bisa memilikinya.
Guybrush: Cukup CUKUP?
Kepala: Anda bisa memohon semua yang Anda inginkan, tetapi Anda tidak bisa memilikinya.
Guybrush: Cukup tolong dengan gula di atasnya?
Kepala: Oh, baiklah, kamu bayi yang besar. Kamu dapat memilikinya. Hei, apa gunanya kalung jika kau tidak punya bahu?

Tantangan

Tulis program lengkap yang mencetak dialog di atas. Tangkapannya adalah bahwa setiap kali program dipanggil hanya akan mencetak dua baris (satu permintaan oleh Guybrush dan respons Head). Misalnya jika kiriman Anda ditulis dengan Python, penggunaan akan terlihat seperti ini:

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

Menjalankan program lebih dari 5 kali dapat mengakibatkan perilaku yang tidak terdefinisi, sehingga Anda bisa mengulang, tetap mencetak dua baris terakhir atau bahkan program dapat rusak setelah doa kelima.

Anda dapat menulis ke file di direktori kerja, atau Anda dapat memodifikasi kode sumber program itu sendiri untuk melacak doa. Dalam kasus terakhir, program Anda tidak boleh bergantung pada nama filenya sendiri. (Dalam kasus sebelumnya, Anda dapat mengasumsikan bahwa nama file program Anda tidak akan berbenturan dengan nama file yang tergantung pada program Anda.)

Anda tidak boleh menganggap lingkungan seperti REPL atau bahwa data disimpan dalam RAM di antara doa. Misalnya, jika Anda menjawab dalam Mathematica, Anda harus berasumsi bahwa saya keluar dari kernel di antara permintaan.

Ini adalah kode golf, jawaban terpendek (dalam byte) menang. Jika program Anda bergantung pada file tambahan yang ada sebelum doa pertama , tambahkan nama dan kontennya ke jumlah byte Anda.

Martin Ender
sumber
Jadi tidak ada nilai yang dimasukkan ke variabel global dan kemudian menggunakan kembali di JS?
Pengoptimal
@Optimizer Tidak, maaf. Saya pikir jika Anda ingin menggunakan JS untuk yang satu ini, Anda harus menggunakan simpul.
Martin Ender
Kita dapat memiliki variabel global dalam simpul juga. Apakah Anda menyarankan simpul itu, kita harus dapat keluar dari simpul dan masih melanjutkan urutan dialog?
Pengoptimal
@Optimizer Ya. Anda harus menulis program lengkap, yang saya dapat meminta 5 kali dengan node please.jsmenghasilkan 5 output yang berbeda.
Martin Ender
Bisakah program saya bergantung pada file eksternal untuk memulai? Saya akan memasukkan hitungan byte-nya dalam skor saya
Claudiu

Jawaban:

9

Python, 224 + 97 + 1 = 322 karakter

Solusi paling mudah untuk memulai kita semua. Terima kasih kepada gnibbler karena membantu saya mengurangi 18 byte!

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

Memerlukan file zuntuk berada di direktori yang sama (+1 untuk nama file, +224 untuk ukuran file):

$ 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

Anda dapat menghasilkan zdengan yang berikut:

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

Keluaran:

$ 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
sumber
1
Gunakan pembatas yang berbeda untuk di antara pasangan garis, jadi misalnya Anda memiliki line1\nline2|line3\nline4|line5\nline6|line7\nline8|line9\nline10Sekarang Anda dapat membagi |dan hanyaprint D[n]
gnibbler
@gnibbler: Tuan yang terlihat bagus!
Claudiu
5

Common Lisp (SBCL): 659 karakter

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

Penjelasan

  • Saya membuang gambar pelat setelah setiap doa, yang menyimpan keadaan saat ini.
  • Daftar bundar memungkinkan saya memulai kembali dialog setelah semua baris ditampilkan (tidak diperlukan, tetapi setidaknya tidak salah formatdengan nil).
  • Makro pembaca memungkinkan saya menggunakan kembali beberapa baris yang identik.

Ini bukan pengajuan terpendek, tapi saya pikir ini pendekatan yang bagus untuk masalah ini.

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

Doa selanjutnya

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

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

Suntingan: Diperbarui dengan saran dari Martin dan berbagai optimisasi lainnya

+1 pertama adalah nama file. +1 kedua adalah isi file itu. Tanpa semua spasi dan pemisah baris dihapus sehingga Anda dapat membacanya:

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

Penjelasan

Mengandalkan file teks yang disebut "x" untuk hadir dalam direktori. Seharusnya awalnya mengandung nol dan digunakan untuk menyimpan kemajuan.

Program memetik elemen yang relevan dari array string sesuai dengan progres dan menulis progres di akhir. Beberapa baris digunakan kembali untuk mempersingkat panjang, maka logika pemilihan indeks h+b[(a+5)/6*2+1]untuk pemilihan jawaban.

Keluaran

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>

Golf kode pertama saya, mungkin bukan yang sesingkat mungkin di C # tapi hei - Monkey Island, tidak bisa menolak!

Kode yang dilucuti:

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
sumber
1
Selamat datang di PPCG! Beberapa tips bermain golf: Saya pikir Anda bisa menyederhanakan operator ternary itu sedikit. Paling tidak a<1?1:a<8?3:9, jika C # mendukung bilangan bulat yang benar, maka juga a?a<8?3:9:1. Tetapi Anda bahkan mungkin dapat menggunakan pembagian integer dan lakukan (a+5)/6*2dan pindahkan string terakhir dari kepala untuk mengganti yang kosong pertama (indeks 5). Dan coba hal-hal seperti using s=System.String;. (Oh dan Anda mungkin bisa menghilangkan namespace, atau bahkan menggunakan namespace Systemuntuk menghindari Systemsemua menggunakan.)
Martin Ender
Jadi saya bisa. Semua pembelajaran kode untuk pemeliharaan ini benar-benar membuat saya tidak beruntung di sini;)
Gareth
3

JS, 488 473

Refreshing 5 kali halaman yang berisi kode ini menampilkan 5 dialog berbeda.

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
sumber
2

Perl - 356 byte

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

Pendekatan modifikasi diri, dengan penggantian untuk string umum.

Penggunaan sampel:

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