Monkey Island: Gezgin'in Başkanı


12

Uyarı: Bu meydan okuma Monkey Island Sırrı için bazı hafif spoiler içerir.

Oyunun sonuna doğru, büyülü bir şekilde korunmuş bir navigasyon başkanı tarafından mezar mezarlarından geçiyorsunuz:

resim açıklamasını buraya girin

Göz küresi kolyesine ihtiyacınız var, ancak Kafa size vermek konusunda isteksiz. Bunu almanın bir yolu sadece yalvarmaya devam etmektir:

Guybrush: O kolyeyi alabilir miyim lütfen?
Head: Hayır, ama kibarca sorduğunuz için teşekkürler.
Guybrush: Oh, hadi, lütfen?
Head: İstediğin herşeye yalvarabilirsin, ama sahip olamazsın.
Guybrush: Güzel lütfen?
Head: İstediğin herşeye yalvarabilirsin, ama sahip olamazsın.
Guybrush: Oldukça güzel lütfen?
Head: İstediğin herşeye yalvarabilirsin, ama sahip olamazsın.
Guybrush: Lütfen üstte şeker var mı?
Kafa: Oh, tamam, seni büyük bebek. Alabilirsin. Omuzlarınız yoksa kolye ne işe yarar?

Meydan okuma

Yukarıdaki diyalogu yazdıran tam bir program yazın. Yakalama, program her çağrıldığında sadece iki satır yazdırmasıdır (biri Guybrush tarafından yalpalamak ve Başın tepkisi). Örneğin gönderiminiz Python'da yazılmışsa, kullanım şöyle görünmelidir:

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

Programın 5 kereden fazla başlatılması tanımlanmamış davranışa neden olabilir, böylece ya döngü yapabilir, son iki satırı yazdırmaya devam edebilirsiniz ya da program 5. çağrıdan sonra bozulabilir.

Çalışma dizinindeki bir dosyaya yazabilir veya çağrıları izlemek için programın kaynak kodunu değiştirebilirsiniz. İkinci durumda, programınız kendi dosya adına bağlı olmamalıdır. (Önceki durumda, programınızın dosya adının, programınızın bağlı olduğu herhangi bir dosya adıyla çakışmayacağını varsayabilirsiniz.)

REPL benzeri bir ortam olduğunu veya çağrılar arasında herhangi bir verinin RAM'de tutulduğunu varsaymamalısınız. Mathematica'da cevap verirseniz, çağrılar arasındaki çekirdeği bıraktığımı varsaymalısınız.

Bu kod golf, en kısa cevap (bayt cinsinden) kazanır. Programınız ilk çağırma işleminden önce var olan ek dosyalara bağlıysa , adını ve içeriğini bayt sayınıza ekleyin.


Yani global değişkenlere değer vermek ve sonra JS'de yeniden kullanmak?
Doktor

@Optimizer Hayır, üzgünüm. Bunun için JS kullanmak istiyorsanız, düğümü kullanmanız gerektiğini düşünüyorum.
Martin Ender

Düğümde de global değişkenlere sahip olabiliriz. Wrt düğümünden, düğümden çıkıp diyalog dizisine devam edebilmemizi öneriyor musunuz?
Doktor

@Optimizer Evet. node please.js5 farklı çıktı vererek 5 kez çağırabileceğim bir program yazmalısınız
Martin Ender

Programım başlamak için harici bir dosyaya bağımlı olabilir mi? Bayt sayısını
skoruma

Yanıtlar:


9

Python, 224 + 97 + 1 = 322 karakter

Hepimizi başlatmak için en basit çözüm. Gnibbler'e 18 bayt tıraş etmeme yardımcı olduğu için teşekkürler!

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

Dosyanın zaynı dizinde bulunmasını gerektirir (dosya adı için +1, dosya boyutu için +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

zAşağıdakilerle oluşturabilirsiniz :

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

Çıktı:

$ 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
Satır çiftleri arasında farklı bir sınırlayıcı kullanın, bu nedenle örneğin, line1\nline2|line3\nline4|line5\nline6|line7\nline8|line9\nline10Şimdi bölebilir |ve sadeceprint D[n]
gnibbler

@gnibbler: İyi yakaladım efendim!
Claudiu

5

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

açıklamalar

  • Lisp görüntüsünü mevcut durumdan tasarruf eden her çağırmadan sonra döküyorum.
  • Dairesel liste, tüm satırlar görüntülendikten sonra diyaloğu yeniden başlatmama izin veriyor (zorunlu değil, ancak en azından formatile hata vermiyor nil).
  • Okuyucu makroları bazı özdeş satırları yeniden kullanmama izin veriyor.

Bu en kısa teslim olmayacak, ama bunun soruna güzel bir yaklaşım olduğunu düşündüm.

Firt invokasyonu

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

Sonraki çağrılar

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

Düzenlemeler: Martin'in önerileri ve diğer çeşitli optimizasyonlarla güncellendi

İlk +1 bir dosya adıdır. İkinci +1, bu dosyanın içeriğidir. Tüm boşluklar ve satır kesmeleri kaldırılmadan okuyabilirsiniz:

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

açıklama

Dizinde "x" adlı bir metin dosyasına dayanır. Başlangıçta sıfır içermeli ve ilerlemeyi kaydetmek için kullanılır.

Program, ilerlemeye göre ilgili öğeyi dize dizisinden ayırır ve sonunda ilerlemeyi yazar. Bazı satırlar uzunluğu kısaltmak için yeniden kullanıldığından h+b[(a+5)/6*2+1]cevap seçimi için dizin seçim mantığı .

Çıktı

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>

Benim ilk kod golf, muhtemelen C # mümkün değil en kısa ama hey - Monkey Island, direnemedim!

Sökülen kod:

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'ye Hoşgeldiniz! Birkaç golf ipucu: Üçlü operatörü biraz basitleştirebileceğinizi düşünüyorum. En azından a<1?1:a<8?3:9, C # doğruluk tamsayılarını destekliyorsa, o zaman da a?a<8?3:9:1. Ancak muhtemelen tamsayı bölünmesini kullanabilir (a+5)/6*2ve ilk boş dizinin yerini almak için kafanın son dizesini yapabilir ve taşıyabilirsiniz (dizin 5). Ve böyle şeyler deneyin using s=System.String;. (Ah ve ad alanını atlayabilir, hatta tüm kullanımlardan Systemkaçınmak için ad alanını kullanabilirsiniz System.)
Martin Ender

Bu yüzden yapabilirim. Sürdürülebilirliği kodlamak için tüm bu öğrenme beni gerçekten burada bir dezavantaj koymak;)
Gareth

3

JS 488 473

Bu kodu içeren sayfanın 5 kez yenilenmesi, 5 farklı iletişim kutusunu görüntüler.

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


2

Perl - 356 bayt

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

Ortak dizelerin yerine geçen kendi kendini değiştiren bir yaklaşım.

Örnek Kullanımı:

$ 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?
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.