พิมพ์ชิ้นพูดได้หลายภาษา


22

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

เป้าหมายของคุณคือเขียนโพลิกล็อตที่เอาต์พุตสำหรับแต่ละภาษาคือรหัสจากโพลิกล็อตที่สร้างเอาต์พุตนั้น โดยเฉพาะอย่างยิ่งการส่งออกจะต้องสร้างจากรหัส polyglot ด้วยการลบเท่านั้นและจะต้องเป็นควินในภาษาที่กำหนด

กฎระเบียบ

  • อนุญาตให้ใช้quines ที่เหมาะสมเท่านั้น(ไม่อ่านซอร์สโค้ดไม่รับอินพุตเอาต์พุตต้องเป็น STDOUT หรือทางเลือกที่ใกล้เคียงที่สุดหาก STDOUT ไม่ใช่ตัวเลือกและโปรแกรมต้องประกอบด้วยมากกว่าตัวอักษรที่พิมพ์โดยปริยาย)
  • เนื่องจากภาษาต่าง ๆ สามารถใช้การเข้ารหัสที่แตกต่างกันไบต์ดิบจึงเป็นสิ่งสำคัญ ตัวอย่างเช่นถ้าภาษา A ใช้ UTF-8 และภาษา B ใช้ CP437 รหัส (ฐานสิบหก) C3 88 46 47จะเป็นÈFGภาษา A และ├êFGสำหรับภาษา B
  • เอาท์พุททั้งหมดจะต้องแตกต่างกัน (อีกครั้งเปรียบเทียบไบต์ดิบ) วิธีนี้จะช่วยลดความยุ่งยากในการพยายาม จำกัด ภาษารองลงมา - หากสองภาษาใช้ส่วนเดียวกันของรหัสเพื่อทำสิ่งเดียวกันคุณไม่สามารถอ้างสิทธิ์ทั้งสองได้
    • หากคุณมีสองภาษา A และ B เช่นนั้นXYเป็นผลลัพธ์ที่ถูกต้องในทั้งสอง แต่YZก็ใช้ได้ใน B คุณอาจเลือกXYเป็นเอาต์พุตสำหรับ A และYZเป็นเอาต์พุตสำหรับ B ดังนั้นคุณสามารถอ้างสิทธิ์ทั้งสองในคะแนนของคุณ ( แต่คุณไม่สามารถอ้างสิทธิ์ได้XYทั้งสองภาษาเนื่องจากกฎข้างต้น)
  • ผลลัพธ์ทั้งหมดจะต้องสั้นที่สุด ตัวอย่างเช่นหากรหัสของคุณคือprint('foo')#somethingสำหรับ Python 3 (ไม่สนใจข้อเท็จจริงที่ว่าเอาต์พุตไม่ถูกต้อง) รหัสที่คุณจะต้องใช้ในการแสดงผลจะเป็นprint('foo')และprint('foo')#จะไม่ได้รับอนุญาต หากมีหลายสตริงที่มีความยาวเท่ากัน (น้อยที่สุด) ที่สร้างเอาต์พุตที่ถูกต้องคุณสามารถเลือกหนึ่งในสตริงเหล่านั้นได้
  • ข้อมูลที่ส่งต้องเป็นรูปหลายภาษาอย่างน้อย 2 ภาษา
  • (number of programming languages with distinct outputs)**3/(total byte size of polyglot)คะแนนของคุณจะได้รับโดย คะแนนสูงสุดชนะ ในกรณีที่การส่งสองครั้งบรรลุคะแนนเท่ากันการส่งที่ถึงคะแนนนั้นก่อนจะเป็นผู้ชนะ

2
กฎข้อที่สองถึงข้อสุดท้ายดูเหมือนว่าเราจำเป็นต้องพิสูจน์ว่าเป็นไปไม่ได้ที่จะเล่นกอล์ฟให้ได้ผลที่ตามมาจากการลบอื่น ๆ ที่เป็นไปได้ มันตั้งใจหรือไม่
Martin Ender


คุณจะกำหนด "การลบ" ในกรณีของภาษาที่คำสั่งมีความยาวไม่เกิน 8 บิตได้อย่างไร คุณลบคำสั่งในเวลาเดียวกันหรือลบทีละครั้งจากแหล่งข้อมูลหรือไม่?

@ มาร์ตินเอนเดอร์ที่ดีสามารถสันนิษฐานได้ ถ้าไม่มีใครพบควินที่สั้นกว่าที่สามารถเกิดขึ้นได้จากหลายภาษาคำตอบที่เชื่อถือได้จะถูกต้อง
Mego

@ ais523 ทุกอย่างเสร็จในระดับไบต์
Mego

คำตอบ:


11

GolfScript + CJam + Fission 2 + Jelly , 4 ภาษา, 24 ไบต์, คะแนน 2.667

เริ่มต้นด้วยการถ่ายโอนข้อมูล hex:

00000000:  3322 3024 700a 2721 2b4f 5222 0a3c 3024 700a 6523 7fff cccc

สำหรับ GolfScript, CJam และ Fission 2 เราตีความสิ่งนี้ในการเข้ารหัสไบต์เดียวที่เข้ากันได้กับ ASCII เช่น ISO 8859-1 (การเข้ารหัสที่แน่นอนไม่สำคัญจริงๆเพราะภาษากำหนดตัวดำเนินการสำหรับอักขระ ASCII เท่านั้น):

3"0$p
'!+OR"
<0$p
e#<DEL>ÿÌÌ

ในกรณีที่เป็นตัวละครที่ควบคุม<DEL>0x7f

ในเยลลี่จะถือว่าอยู่ในหน้ารหัสของเจลลี่ซึ่งมีลักษณะดังนี้:

3"0$p½'!+OR"½<0$p½e#¶”ṘṘ

GolfScript

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

"0$p"
0$p

ด้วยการป้อนบรรทัดต่อท้าย นี่เป็นรุ่นมาตรฐานของ GolfScript / CJam polyglot:

".p"
.p

ลองพูดได้หลายภาษา | ลองควินิน

CJam

ที่นี่e#แสดงความคิดเห็นออกบรรทัดสุดท้ายดังนั้นเกือบจะเหมือนกันพิมพ์นี้

"0$p"
0$p

โดยไม่ต้องป้อนบรรทัดต่อท้าย

ลองพูดได้หลายภาษา | ลองควินิน

การแยก

ฟิชชันเห็นเฉพาะบรรทัดที่สองซึ่งเป็นมาตรฐานฟิชชั่นฟิวชันจึงพิมพ์ออกมา

'!+OR"

ฉันไม่สามารถให้ลิงค์ออนไลน์สำหรับคนพูดได้หลายภาษาที่นี่เพราะ TIO ส่งไฟล์ไปที่ Fission ในรูปแบบ UTF-8 แต่ Fission อ่าน byte ซอร์ส byte byte ซึ่งทำให้บรรทัดสุดท้ายยาวเกินไป อย่างไรก็ตามฉันได้ทำการทดสอบแบบโลคัลด้วยไฟล์ที่เข้ารหัส ISO 8859-1 (ซึ่งบรรทัดสุดท้ายมีความยาวเท่ากับที่สอง) เพื่อยืนยันว่ามันใช้งานได้

ลองควินิน

วุ้น

pilcrow เป็นนามแฝงสำหรับ linefeeds ใน Jelly ดังนั้นแหล่งที่มาจึงเท่ากับ:

3"0$p½'!+OR"½<0$p½e#
”ṘṘ

ทั้งหมดยกเว้นบรรทัดสุดท้ายของโปรแกรม Jelly คือ "ลิงก์ผู้ช่วยเหลือ" (เช่นฟังก์ชั่น) ซึ่งสามารถละเว้นได้หากไม่มีการเรียกใช้หากมีความถูกต้องทางไวยากรณ์ นี่คือเหตุผลที่3มาก่อนในโปรแกรม CJam และ GolfScript เพราะมิฉะนั้น"จะไม่สามารถแยกวิเคราะห์ในเยลลี่

มิฉะนั้นเนื่องจากไม่ได้เรียกใช้ฟังก์ชั่นโปรแกรมจึงเทียบเท่ากับบรรทัดที่สองของมันเท่านั้นซึ่งเป็น Jelly Quine มาตรฐาน

ลองพูดได้หลายภาษา | ลองควินิน


9

> <> + Python, 2 ภาษา, 51 46 ไบต์, คะแนน ~ = 0.16 0.17

เนื่องจากยังไม่มีคำตอบฉันจะเริ่มด้วยคำตอบง่ายๆ

#.09;!?lo}*2+2f"
_='_=%r;print _%%_';print _%_

ลองใช้กับ> <>และPython

สำหรับ> <> บรรทัดแรกคือ quine (# reflect, "วางทั้งบรรทัดบนสแต็กจากนั้นเรากด 34 (charcode สำหรับ") และพิมพ์ทุกอย่าง) การประมวลผลจะไม่ย้ายจากที่อื่นเลยดังนั้นจึงไม่สนใจส่วนที่เหลือของ รหัส.

สำหรับ Python บรรทัดแรกคือข้อคิดเห็นในขณะที่บรรทัดที่สองเป็น quine (วิธีมาตรฐานใน python โดยใช้การแทนที่สตริงด้วยสตริงเดียวกันกับอาร์กิวเมนต์ทั้งสอง)


1
การปรับเล็กน้อยในคำตอบ> <> ช่วยให้คุณประหยัดไบต์: - # "~ r10gol?!; 60. |!
นกกระทุง Teal pelican

@Tealpelican ขอบคุณที่เตือนให้ฉันใช้.! ฉันปรับ quine ของฉันโดยใช้วิธีนี้แม้ว่าฉันต้องการเก็บสตริงในสิ่งที่ตรงกันข้าม (ตั้งแต่นี้บันทึกไบต์) และเพื่อหลีกเลี่ยงการใช้g(เนื่องจากมันสามารถตีความได้ว่า "อ่านซอร์สโค้ด")
Leo

นั่นเป็นจุดที่ค่อนข้างยุติธรรมสำหรับการไม่ใช้ g เมื่อมองและคิดให้ดีคุณสามารถลดได้อีกโดยใช้ # (ascii 35) จากสแต็กเพื่อรับ "like; # .09;!? lo} -1"
Teal pelican

7

JavaScript + Python 2 + Japt, 3 ภาษา, 132 ไบต์, คะแนน ~ = 0.205

A="`i96d)p2`i96d)p2";1//2;A=1
S="S=%s;console.log(S,uneval(S))";A//2;S="S=%r;print S%%S";"""
console.log(S,uneval(S))//""";print S%S

งานพิมพ์นี้

S="S=%s;console.log(S,uneval(S))";console.log(S,uneval(S))

ใน JavaScript (เฉพาะใน Firefox)

S='S=%r;print S%%S';print S%S

ใน Python 2 และ

`i96d)p2`i96d)p2

ใน Japt ( ทดสอบออนไลน์! )

JavaScript

นี่คือสิ่งที่ JavaScript เห็น:

A="`i96d)p2`i96d)p2";1
S="S=%s;console.log(S,uneval(S))";A
console.log(S,uneval(S))

บรรทัดแรกคือไม่มีการเลือกเพราะAไม่ได้ใช้ แต่อย่างใด บรรทัดที่สองตั้งค่าSเป็นสตริงS=%s;console.log(S,uneval(S))และบรรทัดที่สามพิมพ์หลังจากแทนที่%sด้วยการunevalแทนค่า ed S(เพียงแค่Sเครื่องหมายคำพูด) ผลลัพธ์คือ quine ใน JavaScript

หลาม

นี่เป็นสิ่งที่ Python เห็น:

A="`i96d)p2`i96d)p2";1//2;A=1
S="S=%s;console.log(S,uneval(S))";A//2;S="S=%r;print S%%S"
print S%S

บรรทัดแรกนั้นค่อนข้างไม่มีการใช้งาน ส่วนที่สำคัญเพียงอย่างเดียวคือA=1ในตอนท้าย นี่จะเปลี่ยนAเป็นตัวเลขเพื่อให้การหารจำนวนเต็มA//2ในบรรทัดที่สองไม่เกิดข้อผิดพลาด

บรรทัดที่สองเป็นส่วนใหญ่ในลักษณะเดียวกันยกเว้นจะกำหนดสตริงS S=%r;print S%%Sบรรทัดที่สามพิมพ์Sหลังจากแทนที่%rด้วยการเป็นตัวแทนของดิบS(เพียงSห่อด้วยคำพูดเดียว) ผลลัพธ์คือ quine ใน Python 2

Japt

นี่คือรหัส JavaScript ที่ล่าม Japtet เห็น:

A="`i96d)p2`i96d)p2";1//2;A=1
S="S=%s;console.log(S,uneval(S))";A//2;S="S=%r;print S%%S";"","\nconsole.log(S,uneval(S))//","";.p("r".i("n".t(),S%S))

อย่างที่คุณเห็นส่วนใหญ่เป็นคำตอบเดียวกับ JavaScript โดยมีข้อยกเว้นหลักหนึ่งประการ: สองบรรทัดสุดท้ายจะรวมกัน ดังนั้นนี่คือสิ่งที่ล่ามเห็นจริง:

A="`i96d)p2`i96d)p2";1
S="S=%s;console.log(S,uneval(S))";A

บรรทัดแรกกำหนดAให้กับ quine Japt และชุดที่สองSเป็นส่วนหนึ่งของ quine JS อย่างไรก็ตามใน Japtapt เฉพาะนิพจน์สุดท้ายเท่านั้นที่ถูกส่งไปยังเอาต์พุต นี่คือAผลลัพธ์`i96d)p2`i96d)p2ดังนั้น


คือunevalอะไร ใช้งานไม่ได้สำหรับฉัน
Cyoce

@Cyoce developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…ใช้ได้กับ Firefox เท่านั้น
ETHproductions

3

Jolf +> <>, คะแนน = 2 ** 3/15 = 0.533 ....

"r0:g>o<
"Q«Q«

ทำงานเพื่อเพิ่มภาษาอื่นให้กับสิ่งนี้


2

> <>, Python 2 และ 3, 3 ภาษา, 107 ไบต์, คะแนน = 27/107 ~ = 0.252

#o<}-1:"
a=1/1is 1;b="(_%(_,b))"[a:-a|9];_='a=1/1is 1;b="(_%%(_,b))"[a:-a|9];_=%r;print %s';print (_%(_,b))

ลองใช้งานออนไลน์: Python 2 , Python 3 , > <>

เอาต์พุต Python 3 เป็นบรรทัดที่สองที่แน่นอนและเอาต์พุต Python 2 เป็นquineนี้ เอาต์พุต> <> เป็นบรรทัดแรก

คำอธิบาย

โปรแกรมนี้มาจากคลาสสิก Python 2 quine:

_='_=%r;print _%%_';print _%_

ก่อนอื่นเพื่อให้เข้ากันได้กับทั้ง Python 2 และ Python 3 ฉันเปลี่ยนprintคำสั่งเป็น function call และเพิ่มพื้นที่พิเศษซึ่งจะมีประโยชน์ในภายหลัง:

_='_=%r;print (_%%_)';print (_%_)

ต่อไปฉันต้องการวิธีแยก Python 2 จาก Python 3 วิธีที่ง่ายที่สุดวิธีหนึ่งคือใช้ประโยชน์จากความจริงที่/เป็นจำนวนเต็มหารใน Python 2 แต่แบ่งทศนิยมใน Python 3 ดังนั้นรหัสต่อไปนี้ประเมินTrueใน Python 2 แต่Falseใน Python 3:

1/1is 1

เพื่อให้ได้ผลลัพธ์ที่แตกต่างกันระหว่างสองภาษาฉันต้องเลือกลบวงเล็บแรกและวงเล็บสุดท้ายในการprintโทร (นั่นเป็นสาเหตุที่ฉันต้องการพื้นที่ก่อนหน้านี้ - โดยไม่มีที่ว่างมันจะไม่เป็นprintคำสั่งที่ถูกต้องใน Python 2) . ดังนั้นฉันต้องการแก้ไข quine harness เช่น:

a=1/1is 1;b="(_%(_,b))"[a:-a|9];_='a=1/1is 1;b="(_%%(_,b))"[a:-a|9];_=%r;print %s';print (_%(_,b))

นิพจน์นั้นa:-a|9ประเมินเป็น0:9Python 2 และ1:-1Python 3 ดังนั้นจึงbเป็น"(_%(_,b))"ในหลาม 3 แต่ในหลาม 2 _%(_,b)ตัวอักษรตัวแรกและครั้งสุดท้ายที่จะถูกยกเลิกออกจาก และด้วยการดัดแปลงดังกล่าวโพลิกล็อตก็ใช้ได้สำหรับความท้าทายนี้

ตามที่ Teal pelican แนะนำ> <> quine #o<}-1:"สามารถเพิ่มได้ค่อนข้างง่ายขอบคุณความจริงที่#เริ่มต้นความคิดเห็นบรรทัดเดียวใน Python เพียงแค่เตรียมมันและขึ้นบรรทัดใหม่จะเพิ่มภาษาอื่นและเพิ่มคะแนนเกือบสิบเท่า


1

Python 2 + Retina, 2 ภาษา, 55 ไบต์, คะแนน = 2 ^ 3/55 ≈ 0.145

ฉันใช้$nแทนเพื่อให้ทั้งคู่เป็น ASCII ที่ถูกต้อง

S='S=%r;print S%%S';print S%S#|
#$n\(*S1`$n\(*S1`
#\`#

งูหลาม , Retina

งูหลาม:

S='S=%r;print S%%S';print S%S

Retina:


\(*S1`
\(*S1`

0

> <> + Pyke + Python 2, 81 ไบต์, คะแนน = 3 ** 3/81 ~ 0.333

"""r00gol?!;60.
a=%r;print a%%a"""#);"34.Cp\D\Es"DEp00/
a=__doc__[-15:]
print a%a

ฉันพยายามทำสิ่งที่แตกต่างกับทุกภาษา

> <> เห็น:

"""r00gol?!;60.

นี่คือการปรับเปลี่ยนเล็กน้อยของมาตรฐาน> <> quine เพื่อใช้สตริงที่ยกมาสามเท่าที่จุดเริ่มต้น สิ่งนี้ช่วยให้เครื่องหมายคำพูดจบสามสำหรับ Python อยู่ในบรรทัดที่แตกต่างกัน

ลองออนไลน์!

Pyke เห็นว่า:

"34.Cp\D\Es"DEp00/

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

ลองที่นี่! หรือเพียงแค่ส่วนที่ควิน

Python เห็น:

ทั้งหมด. Python ใช้รหัสทั้งหมดในการผลิตควินินของมัน ฉันตัดสินใจที่จะฝังส่วน quine ใน docstring (แต่ท้ายที่สุดแล้วมันจะประหยัด bytes เพื่อลบ แต่ฉันคิดว่ามันเจ๋ง) มันเป็นการดัดแปลงเทคนิค quining มาตรฐาน

ลองออนไลน์!

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