ช่องว่างและ 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