เกาะลิง: หัวหน้านักเดินเรือ


12

คำเตือน:ความท้าทายนี้มีสปอยเลอร์อ่อน ๆ สำหรับความลับของเกาะลิง

ในตอนท้ายของเกมคุณจะถูกนำผ่านสุสานโดยหัวหน้านักเดินเรือที่ได้รับการเก็บรักษาไว้อย่างน่าอัศจรรย์:

ป้อนคำอธิบายรูปภาพที่นี่

คุณต้องการสร้อยคอลูกตา แต่หัวหน้าไม่เต็มใจที่จะมอบให้กับคุณ วิธีหนึ่งที่จะได้รับมันเป็นเพียงการขอทาน:

Guybrush:ฉันขอสร้อยคออันนั้นได้ไหม
หัวหน้า:ไม่ แต่ขอบคุณที่ถามอย่างสุภาพ
กีย์บุช:โอ้มาแล้วยินดีไหม?
หัวหน้า:คุณสามารถขอทุกสิ่งที่คุณต้องการ แต่คุณไม่มีมัน
Guybrush: ได้ไหม
หัวหน้า:คุณสามารถขอทุกสิ่งที่คุณต้องการ แต่คุณไม่มีมัน
Guybrush:พริตตี้สวยได้ไหม
หัวหน้า:คุณสามารถขอทุกสิ่งที่คุณต้องการ แต่คุณไม่มีมัน
กีย์บุช: ได้โปรดน้ำตาลใส่ด้านบน?
หัวหน้า:โอใช่คุณเป็นเด็กตัวใหญ่ คุณสามารถมีมัน เฮ้อะไรเป็นสร้อยคอถ้าคุณไม่มีไหล่?

ความท้าทาย

เขียนโปรแกรมเต็มรูปแบบซึ่งพิมพ์บทสนทนาข้างต้น จับคือทุกครั้งที่โปรแกรมถูกเรียกว่าควรพิมพ์สองบรรทัดเท่านั้น (หนึ่งคำขอร้องโดย Guybrush และการตอบสนองของหัวหน้า) เช่นถ้าการส่งของคุณเขียนเป็น 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 หรือข้อมูลใด ๆ ที่เก็บอยู่ใน RAM ระหว่างการเรียกใช้ เช่นถ้าคุณตอบใน Mathematica คุณต้องสมมติว่าฉันออกจากเคอร์เนลระหว่างการขอร้อง

นี่คือรหัสกอล์ฟคำตอบที่สั้นที่สุด (เป็นไบต์) ชนะ หากโปรแกรมของคุณขึ้นอยู่กับไฟล์เพิ่มเติมใด ๆ ที่มีอยู่ก่อนการเรียกใช้ครั้งแรกให้เพิ่มชื่อและเนื้อหาลงในจำนวนไบต์ของคุณ


ดังนั้นไม่มีการใส่ค่าให้กับตัวแปรทั่วโลกแล้วนำมาใช้ใหม่ใน JS?
เครื่องมือเพิ่มประสิทธิภาพ

@Optimizer Nope ขอโทษ ฉันคิดว่าถ้าคุณต้องการใช้ JS สำหรับอันนี้คุณจะต้องใช้โหนด
Martin Ender

เราสามารถมีตัวแปรโกลบอลในโหนดได้เช่นกัน คุณกำลังแนะนำโหนด wrt นั้นเราควรจะสามารถออกจากโหนดและยังคงดำเนินการตามลำดับการสนทนาได้หรือไม่
เครื่องมือเพิ่มประสิทธิภาพ

@Optimizer ใช่ คุณควรเขียนโปรแกรมเต็มรูปแบบซึ่งฉันสามารถเรียกใช้ 5 ครั้งด้วยnode please.jsผลผลิตที่แตกต่างกัน 5
Martin Ender

โปรแกรมของฉันสามารถใช้ไฟล์ภายนอกเพื่อเริ่มต้นได้หรือไม่ ฉันจะรวมจำนวนไบต์ในคะแนนของฉัน
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: คุณเห็นดี!
Claudiu

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)
  • มาโครผู้อ่านอนุญาตให้ฉันนำบรรทัดที่เหมือนกันบางเส้นมาใช้ซ้ำ

นี่จะไม่ใช่การส่งที่สั้นที่สุด แต่ฉันคิดว่านี่เป็นวิธีการแก้ปัญหาที่ดี

ขอร้อง 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]

การร้องขอครั้งต่อไป

$./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)

การแก้ไข: อัปเดตพร้อมคำแนะนำจาก Martin และการเพิ่มประสิทธิภาพอื่น ๆ อีกมากมาย

+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 # สนับสนุนจำนวนเต็ม truthy a?a<8?3:9:1แล้วยัง แต่คุณสามารถใช้ประโยชน์จากการหารจำนวนเต็มและทำ(a+5)/6*2และย้ายสตริงสุดท้ายของส่วนหัวเพื่อแทนที่อันว่างเปล่าอันแรก (ดัชนี 5) using s=System.String;และลองสิ่งที่ชอบ (โอ้และคุณอาจไม่สามารถใช้ namespace หรือใช้ namespace Systemเพื่อหลีกเลี่ยงSystemการใช้งานทั้งหมด)
Martin Ender

ดังนั้นฉันสามารถ. การเรียนรู้เกี่ยวกับรหัสสำหรับการบำรุงรักษาทั้งหมดนี้ทำให้ฉันเสียเปรียบที่นี่จริง ๆ )
Gareth

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?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.