รหัส codeee codeee ที่เติบโตด้วยตนเอง


41

เขียนโปรแกรม (หรือฟังก์ชั่น) (ลองเรียกมันว่า P1) ว่าเมื่อเรียกใช้จะส่งออกโปรแกรม P2 อีกภาษาที่เหมือนกันและ 1 ไบต์ยาวกว่า P1 อย่างแน่นอน

โปรแกรม P2 เมื่อทำงานควรส่งออกโปรแกรม P3 ตัวที่ 3 ที่ยาวกว่า 1 ไบต์ 1 ไบต์ P3 จะต้องส่งออกโปรแกรม P4 ที่ยาวกว่าหนึ่งไบต์ P3 และอื่น ๆ เช่นเดียวกันกับ P5, P6, ... , P∞

ห่วงโซ่ของโปรแกรมควรไปเรื่อย ๆ หรือไปยังสถานที่ที่ล่ามไม่สามารถจัดการได้อีกต่อไป (แต่ต้องอยู่ในฐานะโปรแกรมที่ถูกต้องตามหลักเหตุผลในภาษา)

กฎระเบียบ

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

โปรแกรมที่สั้นที่สุด P1 เป็นไบต์ในแต่ละภาษาชนะ!


2
@ Οurousอะไร ??? ฉันไม่ได้เพิ่มแท็กนั้นด้วยตนเอง ...
iBug

6
@iBug ไม่ว่าจะอนุญาตให้ส่งข้อมูลเพื่ออ่านซอร์สโค้ดของตัวเองได้หรือไม่
Martin Ender

3
@iBug แท็ก "quine" ห้ามใช้เป็นค่าเริ่มต้นและมักจะทำให้คำตอบน่าสนใจยิ่งขึ้น มันขึ้นอยู่กับคุณว่า
Martin Ender

1
"puts <<2*2,2\nputs <<2*2,2\n\n2"เติบโต 2 ในแต่ละการทำซ้ำใน Ruby ฉันหาอะไรที่ดีกว่าไม่ได้ : - / ความท้าทายที่น่าสนใจ!
Eric Duminil

คำตอบ:


28

JavaScript (ES6), 14 12 ไบต์

-2 ไบต์ต้องขอบคุณ @Shaggy

f=_=>"f=_"+f

ตัวอย่างการทดสอบ


ใช้เวลาสักครู่ในการมองเห็น ส่อเสียด!
Shaggy

4
ใครช่วยอธิบายหน่อยได้ไหมว่าฉันไม่สามารถห่อศีรษะไว้รอบ ๆ มันเพิ่มขึ้นได้อย่างไร
htmlcoderexe

2
@htmlcoderexe "f=_"เพิ่มส่วนเสริม_ก่อนชื่อพารามิเตอร์ซึ่งทำให้ความยาวเพิ่มขึ้นทุกการวนซ้ำ
เฮอร์แมน L

9

7 , 4 ไบต์ของ ASCII

1603

ลองออนไลน์!

ฉันรู้ว่า 7 ไม่ได้เข้ารหัสตามปกติใน ASCII แต่ครั้งนี้เป็นการเข้ารหัสที่สะดวกมากขึ้นเพื่อให้เราเพิ่ม 1 ไบต์กับการเรียกใช้แต่ละครั้งไม่ใช่ 3 บิต

ฉันก็ไม่แน่ใจเหมือนกันว่าสิ่งนี้นับว่าเป็นการโกงหรือไม่ (มันเป็นเรื่องปกติที่จะไม่ชัดเจนว่าควิน 7 ตัวกำลังโกงหรือไม่เพราะมันเลาะเลียบไปตามแนวชายแดนในหลาย ๆ ด้าน) คุณสามารถสร้างข้อโต้แย้งที่ดีที่0encodes 6แต่โดยทั่วไปแล้วมันไม่ชัดเจนว่าตัวละครที่เกิด "มาจากไหน "ใน 7 เพราะมีพฤติกรรมแปลก ๆ มากมายโดยปริยาย

โปรแกรมนี้จะพิมพ์ตัวเองด้วยการ1ต่อท้ายและจะทำเช่นนั้นแม้ว่าคุณจะต่อท้ายจำนวนของ1มัน นี่คือการติดตามการดีบักความเห็นของ160311:

|| 160311      Initial data ||; initial program 160311
||7 60311      1 command = append 7 to data
|1 0311        6 command = escape from the last | onwards (7 escapes to 1)
|16e77         0311 commands = append 6e77 to data
|16e77 16e77   Implicit (program is empty): copy data past last | to program
|16e777 6e77   1 command = append 7 to data
71603111 e77   6 command = escape from the last | onwards
71603111 e77   e7 command = output in same encoding as the source

(ไม่มี|เหลืออยู่ในโปรแกรมดังนั้นeจะออกจากโปรแกรมทันทีเป็นผลข้างเคียงซึ่งหมายความว่า7s สุดท้ายไม่เคยทำงาน)

ความสับสนขั้นพื้นฐานเกี่ยวกับที่มาของตัวละครทั้งหมดคือคำสั่งส่วนใหญ่ใน 7 เพียงสร้างข้อมูลเมื่อเรียกใช้แล้ว6พยายามสร้างลำดับของคำสั่งที่จะสร้างส่วนข้อมูลที่กำหนด สิ่งนี้มักจะจบลงใกล้กับ แต่ไม่เหมือนกันกับต้นฉบับ (สำหรับจุดประสงค์ในการ quining คุณมักจะเขียนโปรแกรม 7 ในลักษณะที่ผลลัพธ์จะเกือบเหมือนกันโดยปกติจะแตกต่างกันในการนำหน้าหรือตามหลัง7) ดังนั้นตัวอย่างเช่น1ในข้อมูลจะกลายเป็น716ซึ่งเป็นวิธีที่ง่ายที่สุดในการผนวก1กับสตริงข้อมูลปัจจุบัน ตอนแรกเราสร้างมันขึ้นมาด้วย16ลำดับอักขระที่แตกต่างกัน (แต่คล้ายกัน) ซึ่งเป็นการลบอย่างใดอย่างหนึ่ง|ทำเครื่องหมายข้อมูลที่เริ่มต้นด้วย (ฉันเดาว่าอาจเป็นข้อโต้แย้งที่ดีที่สุดว่านี่ไม่ใช่ควิน - ตัวเดียวอย่างเดียวคือเอาต์พุตนั้นแตกต่างจากอินพุต!)


9

Haskell , 74 66 ไบต์

แก้ไข:

  • -2 ไบต์โดย H.PWiz โดยใช้<>แล้ว -6 (10*)<$>โดยการย้าย

ตอนนี้ใช้ตัว<>ดำเนินการฟรีใหม่(การSemigroupคูณต้องใช้ GHC 8.4 เพื่อทำงานโดยไม่ต้องนำเข้า)

main=putStr$fst<>show$(10*)<$>("main=putStr$fst<>show$(10*)<$>",1)

ลองออนไลน์! (กลโกงที่มีการนำเข้าเนื่องจาก TIO ยังไม่มี GHC 8.4 เลย)

มันทำงานอย่างไร

  • main=putStr$ เป็นสำเร็จรูปเพื่อส่งออกค่าสตริงต่อไปนี้
  • fst<>showเป็นฟังก์ชั่นที่รับ tuple และส่งคืนสตริงที่ประกอบด้วยองค์ประกอบแรกของ tuple ที่ต่อกันกับการแสดงสตริงของ tuple กล่าวคือ

    (fst<>show)(s,t) = fst(s,t)<>show(s,t) = s++show(s,t)
  • (10*)<$>คูณองค์ประกอบสุดท้ายของ tuple ต่อไปนี้ด้วย 10 โดยเพิ่มตัวเลข0ลงในการแสดงสตริง


1
คุณสามารถบันทึกอย่างน้อย 2 ไบต์ด้วย(<>)
H.PWiz

@ H.PWiz (10*)<$>ขอบคุณมีบางมากขึ้นโดยการย้าย
Ørjan Johansen





4

brainfuck , 420 ไบต์

->+++>>+++>+>++>+++>+>+>+++>>>>>>>>>>>>>>>>>>>>+>+>++>+++>++>>+++>+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>+>>+++>>+++>>>>>+++>+>>>>>>>>>++>+++>+++>+>>+++>+++>+>++>>+++>+>+++>+>++>+++>>>+>+>++>+++>+>+>>+++>>>>>>>+>+>>>+>+>++>+++>+++>+>>+++>>>+++>+>++>+++>++>>+>+>++>+++>+>+>>+++>>>>>+++>+>>>>>++>+++>+++>+>>+++>>>+++>+>+++>+>>+++>>+++>>++[[>>+[>]++>++[<]<-]>+[>]<+<+++[<]<+]>>->[>]++++>++[[<++++++++++++++++>-]<+++++++++.<]>.

ลองออนไลน์!

นี่คือการปรับเปลี่ยนใน "มาตรฐาน" BrainFuck quineโดย.ที่ส่วนท้ายนั้นจะมีการเพิ่ม.ซ้ำแต่ละครั้ง

ควินนั้นเข้ารหัสอักขระ Brainfuck เป็นสแต็กของเลขฐานสิบหก: โดยเฉพาะเลขฐานสิบหกของc-0x2bซึ่งสะดวกดังต่อไปนี้:

+: 0x00
-: 0x02
[: 0x30
]: 0x32
<: 0x11
>: 0x13
,: 0x01
.: 0x03

การเข้ารหัสครอบคลุมโค้ดสองส่วน: >++[[>>+[>]++>++[<]<-]>+[>]<+<+++[<]<+]>>->[>]++++>++ผลักดันการเข้ารหัสของการเข้ารหัสและ[[<++++++++++++++++>-]<+++++++++.<]เดินสแต็กและพิมพ์ทุกอย่าง


3

สกปรก 9 ไบต์

'"n[!]a!␛

ลองออนไลน์!

'   start and end a string literal
"   push a literal '
n   remove newlines
[!] print the string
a   push the alphabet
!   print the first character
␛   end the program

หากอนุญาตให้อ่านซอร์สโค้ดได้:

สกปรก 8 ไบต์

Q[!]W33!

ลองออนไลน์!

อธิบาย:

Q   push the source code
[!] print each character
W   clear the now-empty stack
33! print an exclaimation mark

อาจถูกต้อง:

สกปรก 4 ไบต์

Q[‼]

ลองออนไลน์!

มันพิมพ์รหัสที่มาพร้อมกับขึ้นบรรทัดใหม่
(และพวงของช่องว่างเนื่องจากข้อผิดพลาดมันทำงานเหมือนกันหากไม่มีพวกเขา)

โปรดทราบว่ามันใช้งานได้กับชุดอักขระดั้งเดิมเท่านั้นและไม่ใช่เมื่อคุณใช้ส่วนหน้า UTF8 - เพื่อลองใช้กับ TIO คุณต้องแทนที่อักขระที่ส่งออกระหว่าง[]s ด้วยซึ่งเทียบเท่ากับ UTF8 สำหรับสิ่งที่พิมพ์ .


1
รุ่น 4 ไบต์ไม่ถูกต้องอย่างแน่นอน
Erik the Outgolfer

3

Java 8, 162 146 ไบต์

v->{String s="v->{String s=%c%s%1$c+1;return s.format(s,34,s).replaceAll(%1$c1+$%1$c,%1$c%1$c);}"+1;return s.format(s,34,s).replaceAll("1+$","");}

ลองออนไลน์
ลองใช้โปรแกรมเอาท์พุทแรก ; ลองใช้โปรแกรมเอาท์พุทที่สอง ; ลองใช้โปรแกรมเอาท์พุทที่สาม

คำอธิบาย:

v->{                       // Method with empty unused parameter and String return-type
  String s="v->{String s=%c%s%1$c+1;return s.format(s,34,s).replaceAll(%1$c1+$%1$c,%1$c%1$c);}"
                           //  The unformatted source code
           +1;             //  Plus a random digit (1 in this case)
  return s.format(s,34,s)  //  Create the quine
          .replaceAll("1+$","");}
                           //  Then remove any trailing 1s

:

  • String sมีรหัสที่มาที่ยังไม่ฟอร์แมต
  • %sจะใช้ในการป้อนข้อมูล String s.format(...)นี้ลงในตัวเองด้วย
  • %c, %1$cและ34จะใช้ในการจัดรูปแบบราคาสองครั้ง
  • s.format(s,34,s) ทำให้มันเข้าด้วยกัน

ส่วนที่ท้าทาย:

  • +1 เพิ่ม 1 ให้กับทั้งโปรแกรมที่ฟอร์แมตและฟอร์แมต
  • .replaceAll("1+$","");}: เนื่องจากเราต้องการเพิ่มจำนวนโปรแกรมทีละหนึ่งแทนสองเราจึงลบ 1s ต่อท้ายก่อนส่งคืน



2

GolfScriptขนาด 9 ไบต์

{'.~1'}.~

ลองออนไลน์!

CJam , 9 ไบต์

{"_~1"}_~

ลองออนไลน์!

ฉันโพสต์คำตอบทั้งสองนี้ในคำตอบเดียวกันเนื่องจากพวกมันต่างกันเล็กน้อยและทำงานด้วยวิธีเดียวกัน พวกเขาทั้งคู่ขึ้นอยู่กับ GolfScript Quine ทั่วไป{'.~'}.~(หรือ{"_~"}_~ใน CJam) ซึ่งมีการอธิบายรายละเอียดเพิ่มเติมเช่นในคำตอบก่อนหน้านี้ของฉัน

ข้อแตกต่างเพียงอย่างเดียวก็คือตัวแปรนี้จะผนวก1ไบต์ต่อท้ายเอาต์พุต เมื่อมันเกิดขึ้นสตริงใด ๆ ของ1s (หรือตัวอักษรจำนวนเต็มอื่น ๆ ที่ไม่มีศูนย์นำหน้า) เป็นควินเล็ก ๆ น้อย ๆ ทั้งใน GolfScript และ CJam ดังนั้นสิ่งที่มีอยู่แล้วในตอนท้ายของรหัสข้างต้นจะถูกคัดลอกคำต่อคำออกไป เนื่องจาก GolfScript (และ CJam) ใช้จำนวนเต็มความยาวโดยพลการสิ่งนี้จะใช้ได้กับโปรแกรมที่มีความยาวตามอำเภอใจอย่างน้อยตราบใดที่คอมพิวเตอร์ที่ใช้รหัสมีหน่วยความจำเพียงพอที่จะเก็บไว้


2

ทูต , 76 72 61 ไบต์

Print!Format[x:="Print!Format[x:=%s,Repr[x+sp]]",Repr[x+sp]]

ลองออนไลน์!

ควินมาตรฐานซึ่งจะเพิ่มช่องว่างที่ส่วนท้ายของxแต่ละรอบซ้ำ

การทำซ้ำสองสามครั้งแรก:

Print!Format[x:="Print!Format[x:=%s,Repr[x+sp]]",Repr[x+sp]]

Print!Format[x:="Print!Format[x:=%s,Repr[x+sp]] ",Repr[x+sp]]

Print!Format[x:="Print!Format[x:=%s,Repr[x+sp]]  ",Repr[x+sp]]

เป็นต้น

ทูต 72 ไบต์

y:=1Print!Format[x:="y:=%sPrint!Format[x:=%s,y*10,Repr!x]",y*10,Repr!x]

ลองออนไลน์!

นี่เป็นเพียงการเปลี่ยนแปลงของ quine รูปแบบมาตรฐานโดยมีตัวแปรyที่ตั้งค่า10*yหลังจากการวนซ้ำแต่ละครั้ง

การทำซ้ำสองสามครั้งแรก:

y:=1Print!Format[x:="y:=%sPrint!Format[x:=%s,y*10,Repr!x]",y*10,Repr!x]

y:=10Print!Format[x:="y:=%sPrint!Format[x:=%s,y*10,Repr!x]",y*10,Repr!x]

y:=100Print!Format[x:="y:=%sPrint!Format[x:=%s,y*10,Repr!x]",y*10,Repr!x]

เป็นต้น



1

Haskell , 88 ไบต์

main=putStr$snd(span(<'m')s)++show s;s='#':"main=putStr$snd(span(<'m')s)++show s;s='#':"

ลองออนไลน์! เติบโตโดยการ#ต่อท้ายสตริงข้อมูล


คุณสามารถบันทึกได้นิดหน่อยโดยการใช้showมากกว่าสตริงและใช้การจับคู่รูปแบบ ลองออนไลน์!
Ørjan Johansen

@ ØrjanJohansenดีมาก! ยกเว้นสำหรับมาตรฐานมาตรฐาน Haskell Quine นี่เป็นแนวทางที่แตกต่างอย่างสิ้นเชิงดังนั้นอย่าลังเลที่จะโพสต์ด้วยตัวคุณเอง
Laikoni

ตกลงถ้าคุณคิดอย่างนั้น
Ørjan Johansen

1

Stax , 20 18 ไบต์

"34s+cTZL"34s+cTZL

เรียกใช้และแก้ไขข้อบกพร่อง

สร้างพื้นที่พิเศษก่อนเครื่องหมายคำพูดที่ 2 ทุกการวนซ้ำ

คำอธิบาย

ใช้โปรแกรม"34s+cTZL "34s+cTZLเพื่ออธิบาย

"34s+cTZL "34s+cTZL
"34s+cTZL "            String literal
           34s+        Prepend a double quote, Now the string is `"34s+cTZL `
               cT      Copy and trim trailing spaces
                 Z     Put a 0 under the top of stack
                       Stack now (from top to bottom): `["34s+cTZL,0,"34s+cTZL ]`
                  L    Collect all elements on stack, from bottom to top
                       Implicit output, 0 is converted to space.


1

Runic Enchantmentsขนาด 6 ไบต์

"'<S@>

ลองออนไลน์!

อันนี้แปลก ทั้งหมดที่ฉันต้องทำคือเอา~จากควินเดิมพบโดยโจกษัตริย์

การวิ่งเพิ่มเติมทุกครั้ง<จะต่อท้ายอีกเช่น:

"'<S@><<<<<<<<<

ทั้งหมดนี้ไม่ทำอะไรเลย

สำเนาโดยตรงของคำตอบนี้กับความท้าทายที่เกี่ยวข้อง มันก็เกิดขึ้นแล้วที่จะเติบโต 1 ไบต์ทุก ๆ การวนซ้ำ (การโต้เถียงที่แข็งแกร่งสำหรับความท้าทายนี้ซ้ำซ้อนของหนึ่งหรือในทางกลับกัน)



0

สงสัย 33 ไบต์

f\ @(-> ol) ["f\ ";f;";f1";#0];f1

ตัวแปรที่น่าสนใจในควินินปกติที่ผนวก 1 หลังการทำซ้ำแต่ละครั้ง

ความคืบหน้า:

f\ @(-> ol) ["f\ ";f;";f1";#0];f1
f\ @(-> ol) ["f\ ";f;";f1";#0];f11
f\ @(-> ol) ["f\ ";f;";f1";#0];f111
...

คำอธิบาย

f\ @                               #. Sets f to a function that does the following:
    (-> ol) [                      #.   Output each:
             "f\ ";                #.     String for declaration of f
                   f;              #.     Formatted representation of f's function
                     ";f1";        #.     String for call of f
                           #0      #.     Argument passed into f
                             ];f1  #. Call f with 1 as the argument

หนึ่งในส่วนที่น่าสนใจของ quine นี้คือวันเดอร์สามารถทำงานกับจำนวนของความแม่นยำโดยพลการดังนั้นความก้าวหน้าจะไม่แตกหลังจากจำนวนหนึ่ง


0

ColdFusion, 277 ไบต์

<cfset u=Chr(34)><cfset q="<cfset u=Chr(34)><cfset q=%s%s%s><cfoutput>%screateObject(%sjava%s,%sjava.lang.String%s).format(q,[u,q,u,Chr(35),u,u,u,u,Chr(35)])%s</cfoutput>
"><cfoutput>#createObject("java","java.lang.String").format(q,[u,q,u,Chr(35),u,u,u,u,Chr(35)])#</cfoutput>

นี่เป็นการปรับเปลี่ยนเล็กน้อยของquine ColdFusion ของฉันซึ่งเพิ่มบรรทัดใหม่ทุกครั้งที่มีการเรียก

ผ่านการทดสอบในท้องถิ่นบน lucee-express-5.2.6.60


0

Windows Batch ขนาด38 36 ไบต์

echo|set/p"=q">q&copy/b/y %0+q %0
::

รหัสนี้สร้างไฟล์ชื่อ "q" ที่มีตัวอักษร 'q' จากนั้นจึงต่อท้ายไฟล์ดังกล่าว โปรดทราบว่า "::" เป็นชื่อแทนสำหรับ "rem" ที่ไม่ต้องการพื้นที่เพิ่มเติม

บันทึก 2 ไบต์ขอบคุณ user3493001


0

Gol> <> , 7 ไบต์

":r2ssH

ลองออนไลน์! ลองออนไลน์ !! ลองออนไลน์ !!!

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


0

T-SQL , 175 ไบต์

DECLARE @ VARCHAR(MAX)='DECLARE @ VARCHAR(MAX)=*SET @=TRIM(REPLACE(@,0x2a,CHAR(39)+@+CHAR(32)+CHAR(39)))PRINT @'SET @=TRIM(REPLACE(@,0x2a,CHAR(39)+@+CHAR(32)+CHAR(39)))PRINT @

ก่อนอื่นฉันเขียน SQL quine จากนั้นฉันแก้ไขมันเพื่อเพิ่มพื้นที่พิเศษ (ได้แรงบันดาลใจจากคำตอบนี้ )



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