Quine ของคำสั่งซื้อ


10

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

"ภาษาที่แตกต่าง" ที่นี่อาจเป็นรุ่นที่แตกต่างกัน (Py 2 และ Py 3) หรือธงมาตรฐานที่แตกต่างกัน มันเป็นเอาท์พุตที่ต่างกันซึ่งบังคับให้เวอร์ชั่นต่างกัน

ใช้กฎ quine ที่เหมาะสมสำหรับโปรแกรมในแต่ละภาษา คะแนนของคุณจะถูกคำนวณตาม(Language count)^6/(Code length in bytes)ด้วยคะแนนที่สูงขึ้นจะดีกว่า

ตัวอย่าง:

หากรหัสของคุณคือAABและทำงานในสามภาษาที่แตกต่างกันจะกลับABAมาAABและAABจากนั้นคะแนนของมันคือ2^6/3(นับเพียงหนึ่งในสองการAABนับ) ไม่เป็นไรถ้าABAไม่มีความหมาย


1
ภาษาใดที่นับว่าแตกต่างกัน
Laikoni

4
คำจำกัดความของ quine ที่เหมาะสมใดที่ใช้ ( Martin'sหรือais523'sหรืออาจจะมีคำจำกัดความอื่น ๆ ในเมตาดาต้าเธรดเหล่านี้) กฎ quine ที่เหมาะสมใช้กับการตีความของโปรแกรมที่เป็น quines จริงหรือไม่ (สำหรับสิ่งที่คุ้มค่าฉันไม่คิดว่าความท้าทายนี้จะได้รับการปรับปรุงมากนักโดยการบังคับใช้กฎควินินที่เหมาะสม)
Lynn

เพื่ออธิบายให้ชัดเจนทำตามตัวอย่างของคุณ - ถ้ารหัสของฉันAABพิมพ์AABในภาษา -1 และABAในภาษา -2 ฉันถือว่ามันต้องเป็นควินที่เหมาะสมเมื่อดูเป็นโปรแกรมภาษา -1 และไม่มีข้อ จำกัด เพิ่มเติมที่เกี่ยวข้องกับการตีความ โปรแกรมภาษา -2 นั่นถูกต้องใช่ไหม?
ลินน์

1
ความยาวของรหัสนับเป็นอักขระหรือไบต์หรือไม่ เราควรทำอย่างไรกับการเข้ารหัสอักขระที่แตกต่างกัน
dylnan

1
แล้วไบต์กับตัวละครล่ะ?
dylnan

คำตอบ:


10

Befunge-98 , > <> , Gol> <> , เซลล์ , Wumpus , พระคาร์ดินัล , ขี้ผึ้งและอลิซคะแนน: 8 6 /88 = 2,978.909

"65*4+059*$!#.39*0jp2+'Wk,@ ''5&.'\d&o@o&88#+\@ol?!,'.'0.6'!+Ox,++tttt=++%-$#}.6~.F4*`*R

ลองใช้ใน Befunge! ลองใช้ใน> <>! ลองใช้ใน Gol> <>! ลองใช้ฟิชชัน! ลองใช้ใน Wumpus! ลองในพระคาร์ดินัล! ลองใช้ในขี้ผึ้ง! ลองใช้ในอลิซ!

ตรวจสอบ!

ภาษา 2D จำนวนมากมีการตัดตัวอักษรทั้งหมดของสตริง ความแตกต่างในผลลัพธ์คือ:

> <> Gol> <> และ Befunge-98 ทุกพิมพ์ถอยหลังรหัส (ยกเว้น") กับตัวละครทั้งสามที่ผ่านมาในตำแหน่งที่แตกต่างกันR*", O"*และ"R*ตามลำดับ ขี้ผึ้งยังมีรหัสย้อนหลัง แต่ตัวละครสามตัวสุดท้ายจะกระจายในส่วนแรกของการส่งออก อลิซเป็นส่วนใหญ่หลังยกเว้นสำหรับทุกตัวละครหนี ( ', \และ") ย้ายไปด้านหน้าแทน

Wumpus เป็นเพียงควินจริงที่แท้จริงฟิชชันจะใส่"ที่ส่วนท้ายของรหัสแทนที่จะเป็นจุดเริ่มต้นและ Cardinal จะใส่"ระหว่าง0และ5ใกล้กับจุดเริ่มต้น

หลักฐานการเรียงสับเปลี่ยนที่แตกต่างกัน

คำอธิบาย:

Befunge-98:

"  Wrapping string literal pushes all other characters + a space to the stack
 65*4+  Push " to the stack
      059*$!#.39*0j   Push 1,27 to the stack
                   p  Pops the top three values of the stack (27,1,34)
                    2+  Adds 2 to the space to make "
                      'Wk,@  Prints the top 88 characters of the stack and terminates

> <> และ Gol> <>:

พูดตามตรงฉันไม่ได้ทำอะไรที่นี่มาก ความแตกต่างเพียงอย่างเดียวระหว่างการดำเนินการของสองภาษานี้คือ@คำสั่งซึ่งจะหมุนค่าสามอันดับแรกของสแต็กในวิธีต่างๆสำหรับแต่ละภาษา

"  Wrapping string literal pushes all other characters to the stack
 65*4+  Push 34 (") to the stack
      059*$!#.  Jump to cell 45,0
                                   \@  Rotate the top three values of the stack 
                                     ol?!,'.'0.  Output the whole stack, ending in a divide by 0/stack underflow error

ฟิชชั่น:

 "............R  Spawn a pointer going right

 "  Switch to printing mode and print every other character
 "  Switch off printing mode
  6  Teleport to other 6
 "........6'!+O   Print the "

Wumpus:

"  Bouncing string literal
 65*4+  Push a (")
      059*$!#.   Push 0 and jump to cell 0,45
                                        \  Reflect off mirror
                                       +   Add 0 to top of stack
                                 @o&88#    Print the top 88 characters of the stack

พระคาร์ดินัล:

                                 %   Spawn two pointer going left/right (up/down despawn immediately)
                                  -$  Right pointer jumps to cell -1,0
                      x,++tttt=++     Left pointer prints "
"  While right pointer switches to print mode and prints the code

ขี้ผึ้ง:

 "................*`*   Spawn pointers going in every direction
                        Every other * also spawns pointers, but they do nothing
                   `    Turn on print mode for two of the pointers going in different directions
                        This prints everything but the `
          #}.6~.F4*     Print a `

อลิซ:

"  Wrapping string literal pushes all other characters to the stack
   Except 's and mirrors
 65*4+  Push " to the stack
      059*$!#.  Does nothing
              39*0j  Jumps to cell 39,0
                         ''5&.    Push ' and duplicate it 5 times
                              '\  Push \
                                d&o@  Print the whole stack

6

Perl 5 , ทับทิม , JavaScript (Chrome), PHP , Python 2 , งูหลาม 3 , 1206 ไบต์คะแนน 6 6 /1206 = 38.6865671641791

q=1//2;s=+0;s|0;"/.__id__;#";_="""q=1//2;s=+0;s|0;"/.__id__;#";_={0}{1}{0};R=chr((39,34)[1/2>0])*12;Q=chr((39,34)[1/2==0])*3;q={0}{2}{0};print(_.format(Q,_,q[0:-12]+R,"%"))""";R=chr((39,34)[1/2>0])*12;Q=chr((39,34)[1/2==0])*3;q="""|;#<?ob_end_clean();
eval($_='"$t"?0?[$q=37 .chr+113 .chr+38 .chr,$p=(96 .chr+39 .chr)*4,$n=10 .chr,$s=39 .chr*12,$S=34 .chr*3]:eval("printf=console.log;c=String.fromCharCode;$q=c(96);$p=c(37,113,38,39).repeat(4);$n=c(10);$s=c(39).repeat(12);$S=c(34,34,34)"):[]?[$q=q(!g)^PA,$p=HARHARHARHAR^od2od2od2od2,$n=R^X,$s=bbbbbbbbbbbb^EEEEEEEEEEEE,$S=hhh^JJJ]:[$q=O^h,$p=str_repeat(RHa3^w9GS,4),$n=R^X,$s=str_repeat(b^E,12),$S=HHH^jjj];//#');printf($x='q=1//2;s=+0;s|0;"/.__id__;#";_=%7$sq=1//2;s=+0;s|0;"/.__id__;#";_={0}{1}{0};R=chr((39,34)[1/2>0])*12;Q=chr((39,34)[1/2==0])*3;q={0}{2}{0};print(_.format(Q,_,q[0:-12]+R,"%8$s"))%7$s;R=chr((39,34)[1/2>0])*12;Q=chr((39,34)[1/2==0])*3;q=%7$s|;#<?ob_end_clean();%5$seval($_=%3$s%1$s%3$s);printf($x=%3$s%2$s%3$s,$_,$x,$q,$p,$n,$s,$S,"%8$s",![]||([]+[])?$n:"");//#%4$s%6$s%7$s;print(_.format(Q,_,q[0:-12]+R,"%8$s"))%9$s',$_,$x,$q,$p,$n,$s,$S,"%",![]||([]+[])?$n:"");//#`q&%`q&%`q&%`q&%''''''''''''""";print(_.format(Q,_,q[0:-12]+R,"%"))

ตรวจสอบความถูกต้องของ Perl, Ruby, PHP, Python 2 และ Python 3 ออนไลน์!

หมายเหตุ : เรียกใช้โปรแกรมข้างต้นในคอนโซลผู้ตรวจสอบใน Chrome (ซึ่งดูเหมือนว่าจะสนับสนุนข้อโต้แย้งตำแหน่งเพื่อconsole.log ) ส่งคืนโปรแกรมที่ถูกต้อง

คำอธิบาย

สิ่งนี้เปิดออกมานานกว่าที่ฉันคาดไว้มากและฉันก็ทำให้ชีวิตของฉันหนักขึ้นด้วยเช่นกันดังนั้นฉันจึงมีแนวโน้มที่จะแก้ไขมัน ฉันต้องการเพิ่มในภาษาอื่น ๆ อีกด้วย แต่ฉันต้องการค้นหาสิ่งที่ไม่สนใจซิกิล$...

นี้สวยมากเป็นรูปแบบมาตรฐานที่ควินคำนวณของคำพูดที่จะใช้เป็นที่แตกต่างกันเล็ก ๆ น้อย ๆ สำหรับแต่ละภาษาในทับทิม%q&จะใช้ PHP การใช้งาน'จาวาสคริปต์ (Node.js) ทำให้การใช้`และ Perl 5 Utilizes ...q( )เนื่องจากการเปลี่ยนแปลงคำพูดเท่านั้นส่วนที่เหลือของโปรแกรมยังคงสามารถเรียกใช้งานได้และไวยากรณ์ที่ถูกต้องในแต่ละภาษา Python 2 และ 3 ถูกล้อมรอบโปรแกรมก่อนหน้าโดยใช้"""สำหรับ Python 2 และ ''' Python 3

โปรแกรม Perl และ Ruby ที่เป็นผลลัพธ์ไม่ใช่ quines มาตรฐานเพิ่มเติมq/ %qs จะถูกเพิ่มในแต่ละการวนซ้ำ แต่โปรแกรมแรกจะส่งกลับอย่างถูกต้อง

ผลลัพธ์ที่ได้คือ:

  • Perl 5:
    eval($_=q&... q&);printf($x=q&... q&,... );//#'%`'%`'%`'%`''''''''''''"""...
  • Ruby:
    eval($_=%q&... %q&);printf($x=%q&... %q&,... );//#`'`'`'`'''''''''''''"""... ...
  • JavaScript (Chrome):
    eval($_=`... `);printf($x=`... `,...);//#%q&'%q&'%q&'%q&'''''''''''''""" ...
  • PHP:
    eval($_='... ');printf($x='... ',... );//#`q&%`q&%`q&%`q&%''''''''''''"""...
  • Python 2:
    ... _="""... """;... q="""...''''''''''''""";print(_.format(Q,_,q[0:-12]+R,"%"))
  • Python 3:
    ... _='''... ''';... q='''...""""""""""""''';print(_.format(Q,_,q[0:-12]+R,"%"))

ฉันทำงานนี้ซ้ำอีกมากฉันหวังว่าฉันจะไม่พลาดกุญแจอะไรเลยที่นี่ ฉันยังมีวิธีที่จะไปได้ทุกที่ใกล้กับคะแนนของ Jo King ...


2

เจลลี่และM 2 6 /14 = 4.57

1Ɗṙ@“1Ɗṙ@ȮṾ”ȮṾ

ลองในเยลลี่!

ลองใน M!

Ɗṙ@ȮṾ1“Ɗṙ@ȮṾ1” ในเยลลี่

1Ɗṙ@ȮṾ“1Ɗṙ@ȮṾ” ในม


ฉันไม่แน่ใจว่าถ่านจะนับว่าเป็นควินที่เหมาะสม
H.PWiz

@ H.PWiz ฉันกำลังจะเพิ่มความคิดเห็นที่บอกว่า ฉันจะถาม OP
dylnan

@ l4m2 คุณคิดว่าโปรแกรม Charcoal เป็นควินที่เหมาะสมหรือไม่? ฉันจะลบถ้าไม่
dylnan

ฉันเดาว่ามันเหมือนQuineใน PHP?
l4m2


2

งูหลาม 2และงูหลาม 3 2 6 /61 = 1.05

s='s=%r;print(s%%s[::(1/2>0)*2-1])';print(s%s[::(1/2>0)*2-1])

ลองใช้ใน Python 2!

ลองใช้ใน Python 3!

บันทึก 12 ไบต์ด้วย Jo King

Python 2 พิมพ์

s=')]1-2*)0>2/1(::[s%%s(tnirp;r%=s';print(s%s[::(1/2>0)*2-1])

Python 3 พิมพ์

s='s=%r;print(s%%s[::(1/2>0)*2-1])';print(s%s[::(1/2>0)*2-1])

สิ่งนี้ใช้ความจริงที่ว่า 1/2อยู่.5ใน Python 3 และ0Python 2


1

ทุบตี / GolfScript 72 ไบต์คะแนน 2 6 /72 = 8/9 (~ 0.888 ... )

.~0 () 
{ 
    declare "-f" @* ".~0" " ()
 "+@n.;
    echo '.~0;'
}
.~0;

มีช่องว่างต่อท้ายหนึ่งช่องบนสองบรรทัดแรก

ลองออนไลน์ใน Bash
ลองออนไลน์ใน GolfScript

เพียงแค่การปรับเปลี่ยนของ@ jimmy23013 's คำตอบสำหรับการ ' เขียน Polyquine ' ความท้าทาย การปรับเปลี่ยนที่ทำถูกลบช่องว่างต่อท้ายหลังจากบรรทัดที่สามและการเปลี่ยนแปลงไป\n"+@n.;\n "+@n;

Bash จะพิมพ์บรรทัดที่ 1 และ 2 ดังนี้:

.~0 ()    <- Trailing space
{         <- Trailing space

และ GolfScript จะพิมพ์บรรทัดที่ 1 และ 2 ดังนี้:

.~0 ()   <- No trailing space
 {       <- Both leading and trailing space

ต่อไปนี้เป็นโปรแกรมพื้นฐานเอาต์พุต Bash และ GolfScript ตามลำดับด้วยบรรทัดใหม่ที่แทนที่ด้วย\n:

.~0 () \n{ \n    declare "-f" @* ".~0" " ()\n "+@n.;\n    echo '.~0;'\n}\n.~0;
.~0 () \n{ \n    declare "-f" @* ".~0" " ()\n "+@n.;\n    echo '.~0;'\n}\n.~0;
.~0 ()\n { \n    declare "-f" @* ".~0" " ()\n "+@n.;\n    echo '.~0;'\n}\n.~0;

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