원숭이 섬 : 네비게이터의 머리


12

경고 : 이 도전에는 The Monkey of Secret의 스포일러가 포함되어 있습니다.

게임이 끝날 무렵, 당신은 마술처럼 보존 된 네비게이터의 카타콤을 이끌고 있습니다.

여기에 이미지 설명을 입력하십시오

안구 목걸이가 필요하지만 머리는 당신에게주는 것을 꺼려합니다. 그것을 얻는 한 가지 방법은 계속 구걸하는 것입니다.

Guybrush : 목걸이 좀 갖다 주 시겠어요?
헤드 : 아니요, 그러나 정중하게 요청 해 주셔서 감사합니다.
Guybrush : 오, pleeeeease?
머리 : 당신이 원하는 모든 것을 구걸 할 수 있지만 가질 수는 없습니다.
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

@Optimizer 죄송합니다. 죄송합니다. 이것에 JS를 사용하려면 노드를 사용해야한다고 생각합니다.
Martin Ender

노드에도 전역 변수를 가질 수 있습니다. wrt 노드를 제안하고 있습니까? 노드를 종료하고 대화 순서를 계속할 수 있어야합니까?
Optimizer

@Optimizer 예. 전체 프로그램을 작성해야하며, node please.js5 개의 다른 출력 을 생성하여 5 번 호출 할 수 있습니다 .
Martin Ender

내 프로그램이 시작하기 위해 외부 파일에 의존 할 수 있습니까? 나는 내 점수에 바이트 수를 포함시킬 것이다
Claudiu

답변:


9

파이썬, 224 + 97 + 1 = 322 자

우리 모두를 시작하는 가장 간단한 해결책. 18 바이트를 줄여주는 gnibbler에게 감사드립니다!

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

공통 리스프 (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 이미지를 덤프하여 현재 상태를 저장합니다.
  • 원형 목록은 모든 라인이 표시 한 후 나에게 대화를 다시 시작 (필요는 없습니다 만, 적어도이에 오류가없는하자 formatnil).
  • 리더 매크로를 사용하면 동일한 줄을 재사용 할 수 있습니다.

이것은 가장 짧은 제출은 아니지만 문제에 대한 좋은 접근 방식이라고 생각했습니다.

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"라는 텍스트 파일을 사용합니다. 처음에는 0을 포함해야하며 진행률을 저장하는 데 사용됩니다.

프로그램은 진행 상황에 따라 문자열 배열에서 관련 요소를 뽑아 내고 마지막에 진행 상황을 씁니다. 일부 라인은 길이를 단축하기 위해 재사용 되었기 때문에 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());}}

1
PPCG에 오신 것을 환영합니다! 몇 가지 골프 팁 : 삼항 연산자를 약간 단순화 할 수 있다고 생각합니다. 적어도 a<1?1:a<8?3:9C #이 정수형 정수를 지원하면 적어도 a?a<8?3:9:1. 그러나 정수 나누기를 사용 (a+5)/6*2하고 머리의 마지막 문자열을 수행 하고 이동하여 첫 번째 빈 문자열을 대체 할 수 있습니다 (색인 5). 그리고 같은 것들을 시도하십시오 using s=System.String;. (아 그리고 네임 스페이스를 생략하거나 네임 스페이스 SystemSystem사용하여 모든 사용 을 피할 수도 있습니다 .)
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

펄-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.