ตีกอล์ฟให้คุณเป็นดับเบิ้ลควินที่ดีกว่า


18

ราตรีสวัสดิ์ท่านสุภาพบุรุษและสุภาพสตรี

คืนนี้ - เรามีรหัสท้าทาย การแข่งขันที่จะถูกกำหนดไม่ได้อยู่ในจำนวนคะแนน (a la Asteroids) แต่เพียงว่าคุณจะสามารถทำมันให้เสร็จ (a la Zelda) ได้หรือไม่ และเพื่อการเปรียบเทียบจำนวนไบต์ (เอ่อ ... แต่คุณบอกว่า ... )

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

คะแนนของคุณคือขนาดของซอร์สโค้ดของคุณเป็นไบต์

เนื่องจากความท้าทายนี้เกี่ยวข้องกับ WhiteSpace โปรดหลีกเลี่ยงคำตอบของคุณเพื่อให้ชัดเจน - ควรอยู่ในรูปแบบ C คะแนนของคุณเป็นแหล่งต้นฉบับเป็นไบต์ไม่ใช่เวอร์ชันที่ใช้ Escape

โชคดี.


1
การถ่ายโอนข้อมูล hex xxdจะทำอย่างไร
Ilmari Karonen

ใช่. ฉันจะยอมรับมัน
lochok

คำตอบ:


19

ช่องว่างและ Perl, 992 975 ตัวอักษร

สวัสดีตอนเย็นท่านสุภาพสตรีและท่านสุภาพบุรุษ

เริ่มจากนี่คือการส่งของฉันเข้ารหัสใน base64 ซึ่งฉันรู้สึกว่าเป็นวิธีที่ดีที่สุดในการสื่อสารกับโปรแกรม Whitespace ขนาดใหญ่ (คุณไม่ต้องการใช้การเข้ารหัสที่ปล่อยให้ช่องว่างตามที่เป็นจริงดังนั้นจึงไม่มีประเด็นในการเลือกสิ่งที่ "อ่าน" ได้มากขึ้น)

c2F5PDwgeDI7c2F5PDwwLDAgIApzYXk8PCB4MjtzYXk8PDAsMCAgCgoJCQogICAJCSAgCSAgCSAJ
CSAgCSAgCQkgCSAJIAkJCQkJICAJCSAJCQkgCQkJCQkgCSAJIAkJIAkgCSAgIAkJCQkJICAgCQkg
IAkgCQkgCSAJCSAJICAgIAkJCQkgCSAgCSAJCSAJICAgIAkgCQkgICAJICAgICAgCQkJIAkJCQkJ
IAkJCSAJCQkJICAgICAJCQkgCSAgICAgIAkJCQkJICAgICAgCQkgICAJCSAgICAJCQkJCQkJCSAg
CSAJIAkgICAJCQkgICAJCQkJCSAgCQkJCSAJICAgIAkgCQkJCQkgCSAgICAgCSAgCSAJICAgICAg
CSAgICAJICAgICAJCSAgIAkJCSAJIAkJCQkJCSAJCSAJIAkgICAgICAgCQkgIAkgICAgICAgICAg
IAkJICAgCSAJCQkgCSAgICAgCQkJCQkJIAkgICAgCQkJCSAJCQkJICAJCQkgICAJCQkgCSAgCSAg
IAkJCQkgIAkJIAkJCSAgIAkJCSAJCQkgCQkJICAJCSAJICAJIAkJCSAJIAkgCQkgICAgIAkgCSAJ
ICAJICAJIAkJICAgICAJIAkgICAgCQkJCSAgCSAJCSAJIAkJIAkgIAkgCSAJCSAJCSAJCSAJCQkg
CQkJICAgIAkJCSAgCSAgCQogICAJICAgICAJCQkJCSAJCSAJIAkgCSAJICAJCQkgICAJICAgCSAg
ICAJCSAJICAgICAgICAgCSAgIAkJCQkgCQkgICAgCQkgCSAJICAJCQkgCQkJCSAJCQkgICAJICAg
IAkgCSAJCQkgIAkJCQkgCSAJCSAJIAkgCQkJCSAJICAJIAkJIAkgICAJCiAKICAKICAgIAogCSAg
CQoKICAJCiAKICAgIAkJCQkgCSAKCSAJCQkKICAgICAJCQkJIAkgCgkgCSAgCiAgIAkJCgkgIAoK
CQkJCiAKCgoJIAkKICAgCSAgIAkgIAoKIAkKIAkgIAkKCiAJIAogICAJIAoKIAkKCiAJIAoKIAkK
CQogCSAgIAkgCgogCQoKCgoKICAgCiAgIAogCiAKIAkKCiAJCgogICAgCiAKIAoJIAogCiAgICAJ
IAoJIAkJIAoJICAgCSAKCSAJIAogCSAgCgogIAogCiAgICAJCQoJIAkJICAJCSAJCQkKCSAgCiAg
CQkJICAgCgkgCQkgICAJICAgICAKCSAgIAkKICAgICAJCQoJIAkgIAogICAJCQoJICAKCgkJCiAK
CgoJCjAK

นี่คือข้อความที่ตัดตอนมาซึ่งเน้นส่วนที่มองเห็นได้ทั้งหมดของแหล่งที่มา ใช้เพื่อระบุแท็บและเพื่อระบุบรรทัดใหม่

say<< x2;say<<0,0  ↲
say<< x2;say<<0,0  ↲
↲
⇥⇥↲
   ⇥⇥  ⇥ [... etcetera ... skipping rest of a really long line ...]↲
   ⇥⇥⇥ ⇥⇥[... etcetera ... shorter but still quite a long line ...]↲
 ↲
  ↲
    ↲
 ⇥  ⇥↲
[... etcetera ... whole lotta whitespace in here ...]
⇥⇥↲
 ↲
↲
↲
⇥↲
0↲

Perl เป็นตัวเลือกที่เป็นธรรมชาติสำหรับภาษาที่สองในการท้าทายนี้ซึ่งเป็นหนึ่งในภาษาที่มีวัตถุประสงค์ทั่วไปที่ดีที่สุดสำหรับการเขียนคำศัพท์สั้น ๆ Perl quine ที่สั้นที่สุดของฉันคือ 19 ไบต์:

say<< x2
say<< x2
 

- และคุณสามารถดูว่ามันเป็นเมล็ดพันธุ์สำหรับครึ่ง Perl ของควินคู่ เมื่อเปรียบเทียบกับ Whitespace ที่ดีที่สุดของฉันมีความยาว 541 ไบต์ (แม้ว่าจะมีขนาดสั้นกว่านี้ - 445 ไบต์เป็นสิ่งที่ดีที่สุดที่ฉันเคยเห็น)

จากมุมมองของล่ามภาษาเพิร์ลบรรทัดแรกของไฟล์ต้นฉบับของ quine สองชุดจะมีคำสั่งสองคำที่ประกอบกันเป็นโปรแกรมที่เหมาะสมเนื่องจากเนื้อหาที่เหลืออยู่เป็นสองสตริงที่ยกมา สตริงแรกคือบรรทัดซ้ำของ Perl และคั่นด้วยบรรทัดที่สามว่าง สตริงที่สองคือ whitespace ทั้งหมดและรันจากบรรทัดที่สี่ของซอร์สไปจนถึง0ตัวคั่นที่ด้านล่างของไฟล์

เมื่อนำมาเป็นโปรแกรมช่องว่างสี่บรรทัดแรกมีสามคำสั่งที่ไร้ประโยชน์เป็นส่วนใหญ่ (เอฟเฟ็กต์ของพวกเขาคือการผลักสองค่าศูนย์ลงบนสแต็กจากนั้นทิ้งค่าที่สอง) พวกมันจะถูกรวมไว้เพื่อให้ผ่านบรรทัดใหม่ที่โปรแกรม Perl ต้องการอย่างปลอดภัย - โปรแกรมจริงเริ่มหลังจากนั้น แทนที่จะอ้างถึงแหล่งที่อ่านไม่ได้อีกต่อไปนี่คือการถอดความคำแนะนำที่ประกอบขึ้นเป็นโปรแกรม Whitespace ในรูปแบบแอสเซมบลี:

# Representation of "say<< ;say<<0,0  \n" in base 122 as ASCII chars.
PERLCODE = 44892457841068708924520433691075560592081

# Represention of the whitespace program, following the "push PERLCODE"
# instruction, in base 3 (see comments on wsout).
WSCODE = 9823454421986355730445143846606456399449033186160554878002671428613111806443504867738858766142050504887335990409088441824104338753030405625930185

# Set up the stack and the heap. The first three instructions are not
# particularly useful; they're just there to skip past the newlines in
# the Perl code. (Though the initial zero on the stack does get used
# at the very end.)

        push    0
        push    0
        jneg    wsout

        push    WSCODE
        push    PERLCODE
        dup
        dup
        push    0
        copy    1

# Output the first four lines of the file.

perl:   dup
        mod     122
        putchar
        div     122
        dup
        jnzero  perl
        pop
        jzero   perl
        push    68              # represents "jneg wsout"
        call    wsout

# Output the rest of the file.

        copy    1
        call    pushout
        push    2
        call    wsout
        call    pushout
        call    wsout
        putnum
        push    2
        call    wsout
        exit

# pushout: Output a Whitespace push instruction, using the number on
# the top of the stack as the instruction's argument. (Recursion is
# used to output the bits MSB-first.)

pushout:
        push    0
        dup
        call    wsout
        call    wsout
bits:   dup
        jzero   bitend
        dup
        mod     2
        swap
        div     2
        call    bits
bitend: call    wsout
        ret

# wsout: Output a sequence of whitespace characters as represented by
# the number on the top of the stack. The number is read in base 3,
# LSB-first, with 0 = SPC, 1 = TAB, 2 = NL. Calling wsout with a value
# of zero will output a single space.

wsout:
        dup
        mod     3
        mul     -23             # some ugly math that transforms
        mod     -24             # (0, 1, 2) into (32, 9, 10)
        add     32
        putchar
        div     3
        dup
        jnzero  wsout
        pop
        ret

ตัวเลขยักษ์ที่อยู่ด้านบนคือสิ่งที่เราผู้ใช้ Whitespace ต้องใช้แทนการใช้สตริงที่แท้จริง ไม่ต้องพยายามเรียกใช้งานบนล่าม Whitespace ที่ไม่มีการรองรับบิกนัมอย่างเหมาะสม

สุดท้ายนี่คือโปรแกรมอีกครั้ง แต่คราวนี้มีการหลบหนีแบบ C เนื่องจากได้รับการร้องขอเป็นพิเศษ:

say<< x2;say<<0,0  \nsay<< x2;say<<0,0  \n\n\t\t\n   \t\t  \t  \t \t\t  \t  \t\t \t \t \t\t\t\t\t  \t\t \t\t\t \t\t\t\t\t \t \t \t\t \t \t   \t\t\t\t\t   \t\t  \t \t\t \t \t\t \t    \t\t\t\t \t  \t \t\t \t    \t \t\t   \t      \t\t\t \t\t\t\t\t \t\t\t \t\t\t\t     \t\t\t \t      \t\t\t\t\t      \t\t   \t\t    \t\t\t\t\t\t\t\t  \t \t \t   \t\t\t   \t\t\t\t\t  \t\t\t\t \t    \t \t\t\t\t\t \t     \t  \t \t      \t    \t     \t\t   \t\t\t \t \t\t\t\t\t\t \t\t \t \t       \t\t  \t           \t\t   \t \t\t\t \t     \t\t\t\t\t\t \t    \t\t\t\t \t\t\t\t  \t\t\t   \t\t\t \t  \t   \t\t\t\t  \t\t \t\t\t   \t\t\t \t\t\t \t\t\t  \t\t \t  \t \t\t\t \t \t \t\t     \t \t \t  \t  \t \t\t     \t \t    \t\t\t\t  \t \t\t \t \t\t \t  \t \t \t\t \t\t \t\t \t\t\t \t\t\t    \t\t\t  \t  \t\n   \t     \t\t\t\t\t \t\t \t \t \t \t  \t\t\t   \t   \t    \t\t \t         \t   \t\t\t\t \t\t    \t\t \t \t  \t\t\t \t\t\t\t \t\t\t   \t    \t \t \t\t\t  \t\t\t\t \t \t\t \t \t \t\t\t\t \t  \t \t\t \t   \t\n \n  \n    \n \t  \t\n\n  \t\n \n    \t\t\t\t \t \n\t \t\t\t\n     \t\t\t\t \t \n\t \t  \n   \t\t\n\t  \n\n\t\t\t\n \n\n\n\t \t\n   \t   \t  \n\n \t\n \t  \t\n\n \t \n   \t \n\n \t\n\n \t \n\n \t\n\t\n \t   \t \n\n \t\n\n\n\n\n   \n   \n \n \n \t\n\n \t\n\n    \n \n \n\t \n \n    \t \n\t \t\t \n\t   \t \n\t \t \n \t  \n\n  \n \n    \t\t\n\t \t\t  \t\t \t\t\t\n\t  \n  \t\t\t   \n\t \t\t   \t     \n\t   \t\n     \t\t\n\t \t  \n   \t\t\n\t  \n\n\t\t\n \n\n\n\t\n0\n

2
ว้าว! ฉันคิดว่า brainfuck จะเป็นทางออกแรก
บูธตาม

1
ฉันคิดเกี่ยวกับเรื่องนี้ แต่ปัญหาคือ Brainfuck Quines นั้นยาวกว่า Whitespace ระหว่างสองคนนั้นผลลัพธ์จะออกมายิ่งใหญ่
breadbox
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.