1 ควินเฉลี่ยของคุณ


34

1 ขึ้นควินเป็นโปรแกรมที่จะคล้ายกับควินเป็น ข้อแตกต่างที่สำคัญอย่างหนึ่งก็คือแทนที่จะพิมพ์ตัวเองหนึ่งครั้งเมื่อมีการต่อโปรแกรมnสำเนาเข้าด้วยกันผลลัพธ์จะพิมพ์โปรแกรมต้นฉบับn + 1ครั้ง

ตัวอย่าง

หากโปรแกรมของคุณคือAbc123:

Abc123  ->  Abc123Abc123
Abc123Abc123  ->  Abc123Abc123Abc123
Abc123Abc123Abc123  -> Abc123Abc123Abc123Abc123

ท้าทาย

ความท้าทายของคุณคือการสร้างควินิน 1 ตัวที่สั้นที่สุดในทุกภาษา ใช้กฎควินินปกติดังนั้นคุณอาจไม่:

  • ส่งโปรแกรมเปล่า
  • อ่านซอร์สโค้ดโดยตรงหรือโดยอ้อม1
  • ใช้การสร้างแบบอินภายใน

นี่คือ code-golf ดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

1สิ่งนี้ไม่รวมถึงการใช้สตริงหรือโค้ดบล็อกแบบแข็งซึ่งเป็นส่วนหนึ่งของโปรแกรมของคุณ


2
มันใช้ได้ไหมถ้าnถูก จำกัด โดยข้อ จำกัด ชนิดข้อมูล (ขนาดเต็มจำนวนสูงสุด ฯลฯ )?
Luis Mendo

2
@ LuisMendo ฉันคิดว่าไม่เป็นไรตราบใดที่คุณสามารถสนับสนุนจำนวนซ้ำที่เหมาะสม (อาจเป็น 100)
ETHproductions

การอ่านความยาวของซอร์สโค้ดโดยใช้บิวอินควินนิ่งโอเคไหม
Conor O'Brien

2
@ CᴏɴᴏʀO'Bʀɪᴇɴดูเหมือนว่าจะเล็กเกินไปที่จะรับซอร์สโค้ดเองสำหรับฉันเนื่องจากคุณยังคงได้รับข้อมูลเกี่ยวกับซอร์สโค้ด ไม่เลย
ETHproductions

คำตอบ:


13

GolfScript ขนาด 12 ไบต์

{`'.~'+:n}.~

ลองออนไลน์!

คำอธิบาย

นี่เป็นการรวมแนวคิดจาก GolfScript quine มาตรฐาน:

{'.~'}.~

และquine ที่ฉันค้นพบเมื่อเร็ว ๆ นี้ :

":n`":n`

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

{        # Standard quine framework. This pushes the block, duplicates it and runs the
         # second copy, such that it can process the first copy to create a quine.
  `      # Convert the block to its string representation.
  '.~'+  # Append the string '.~' to make a complete quine. This is simply left on the
         # stack to be printed at the end.
  :n     # Store the string in n such that one more copy is printed at the end.
}.~

12

GolfScript ขนาด 12 ไบต์

{: ".~"][}.~

ลองออนไลน์!

วิธีการทำงานของซอร์สโค้ด

{: ".~"][}.~

{        }    Define and push a code block.
          .~  Push a copy and execute it.
 :            Save the code block in the space character.
              Every subsequent space will now execute the code block.
   ".~"       Push that string.
       ]      Wrap everything up to the last [ in an array.
        [     Set a new array marker.

หากมีการใช้งานซอร์สโค้ดด้านบนหนึ่งครั้งสแต็กจะสิ้นสุดเป็น

["" {: ".~"]} ".~"]

โดยที่สตริงว่างที่จุดเริ่มต้นสอดคล้องกับสถานะเริ่มต้นของสแต็ค (อินพุตว่าง)

ซอร์สโค้ดสองชุดจะทำให้สถานะสุดท้ายของ

["" {: ".~"]} ".~"] [{: ".~"]} ".~"]

สามสำเนาเป็นสถานะสุดท้ายของ

["" {: ".~"]} ".~"] [{: ".~"]} ".~"] [{: ".~"]} ".~"]

และอื่น ๆ

จะเกิดอะไรขึ้นต่อไป

หลังจากดำเนินการซอร์สโค้ดแล้วล่ามจะทำสิ่งต่อไปนี้

  1. มันล้อมรอบทั้งกองในอาร์เรย์และผลักอาร์เรย์นั้นบนกอง

    สำหรับซอร์สโค้ดสองชุดตอนนี้สแต็กจะมีอยู่

    ["" {: ".~"][} ".~"] [{: ".~"][} ".~"] [["" {: ".~"][} ".~"] [{: ".~"][} ".~"]]
    
  2. มันดำเนินการputsโดยมีเจตนาที่จะพิมพ์สแต็กที่พันไว้แล้วตามด้วยตัวป้อนบรรทัด

    putsถูกกำหนดเป็น{print n print}ดังนั้นจึงทำสิ่งต่อไปนี้

    1. printพิมพ์สำเนาสแต็กของสแต็กโดยไม่ตรวจสอบ (เช่นโดยไม่แปลงเป็นสตริแทน) สิ่งนี้จะส่ง

      {: ".~"][}.~{: ".~"][}.~
      

      (ซอร์สโค้ด) ถึง STDOUT และดึงสำเนาสแต็กจากด้านบนของสแต็ก

      สแต็กตอนนี้มี

      ["" {: ".~"][} ".~"] [{: ".~"][} ".~"]
      
    2. ดำเนินการบล็อกรหัสที่เรากำหนดไว้ก่อนหน้านี้

      :เริ่มต้นด้วยการบันทึก[{: ".~"][} ".~"]ในอักขระเว้นวรรคจากนั้นจึง".~"ดันตัวเอง]ล้อม".~"ในอาร์เรย์และ[ตั้งค่าตัวทำเครื่องหมายอาร์เรย์ใหม่

    3. n ดันสตริงที่ประกอบด้วยการป้อนบรรทัดเดียว

      สแต็กตอนนี้มี

      ["" {: ".~"][} ".~"] [{: ".~"][} ".~"] [".~"] "\n"
      
    4. ถูกดำเนินการอีกครั้ง อย่างไรก็ตามมันถูกนิยามใหม่เมื่อเราเรียกมันเป็นครั้งแรกและตอนนี้มีอาร์เรย์ไม่ใช่บล็อกโค้ด

      ในความเป็นจริงมันดัน[{: ".~"][} ".~"]ออกจากสแต็กเป็น

      ["" {: ".~"][} ".~"] [{: ".~"][} ".~"] [".~"] "\n" [{: ".~"][} ".~"]
      
    5. ในที่สุดprintพิมพ์รายการสแต็คสูงสุดโดยไม่ตรวจสอบส่ง

      {: ".~"][}.~
      

      เพื่อ STDOUT, 1-upping ซอร์สโค้ด


11

Javascript ES6 (REPL), 55 ไบต์

var a=-~a;$=_=>`var a=-~a;$=${$};$();`.repeat(a+1);$();

บันทึก 2 ไบต์ต้องขอบคุณ @ user81655!

คำอธิบาย

นี่คือกรอบมาตรฐาน quine:

$=_=>`$=${$};$()`;$()

คุณควรจะเห็นกรอบนี้ภายในการส่ง คำอธิบายเพิ่มเติมด้านล่าง


var a=-~a;

นี่คือตัวนับเริ่มต้นที่ 1 โดยทั่วไปแล้วจะบอกเราว่าจะต้องทำควินินและเพิ่มทีละมากในเวลาเดียวกัน

$=_=>`var a=-~a;$=${$};$();`.repeat(a+1);$();

นี่คือส่วนที่ควิน เราทำซ้ำสตริงควินโดยตัวนับ + 1 การเรียกใช้ฟังก์ชันที่ตามมาจะแทนที่เอาต์พุต


นี่อาจเป็นเพียงฉัน แต่ดูเหมือนจะไม่พิมพ์อะไรเลย (ทดสอบโดยใช้ JSFiddle ถ้าเป็นเรื่องสำคัญ?)
jrich

อาคุณควรใช้คอนโซล Firefox (และโหลดซ้ำหลังจากการวิ่งแต่ละครั้งเพื่อรีเซ็ตa)
Mama Fun Roll

ฉันไม่คิดว่าคุณต้องการvar
Cyoce

ไม่ฉันทำเพราะไม่ได้กำหนดไว้ในตอนแรก การใช้ var ช่วยให้เราสามารถทำงานกับมันได้
Mama Fun Roll

7

CJam, 14 ไบต์

{"_~"]-2>_o}_~

ลองออนไลน์!

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

{"_~"]-2>_o}_~

{          }    Define a code block and push it on the stack.
            _~  Push and execute a copy of it.
 "_~"           Push that string.
     ]          Wrap the entire stack in an array.
      -2>       Discard all but the last two elements (block and string).
         _o     Push and print a copy of that array.

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


4

Groovy ขนาด 83 ไบต์

s="s=%c%s%c;f={printf(s,34,s,34,10)};f()%cf()//";f={printf(s,34,s,34,10)};f()
f()//

มีหนึ่งฝังอยู่และไม่มีการขึ้นบรรทัดใหม่ ภาพพิมพ์นี้:

s="s=%c%s%c;f={printf(s,34,s,34,10)};f()%cf()//";f={printf(s,34,s,34,10)};f()
f()//s="s=%c%s%c;f={printf(s,34,s,34,10)};f()%cf()//";f={printf(s,34,s,34,10)};f()
f()//

ฟังก์ชั่นf()พิมพ์สำเนาหนึ่งของควินิน โปรแกรมเริ่มต้นเรียกมันสองครั้ง บรรทัดแรกของรหัสที่ต่อท้ายจะกลายเป็นความคิดเห็นและf()มีการดำเนินการเรียกที่สองเท่านั้น


4

Ruby, 43 ไบต์

1;s="1;s=%p;$><<s%%s*n=2-0";$><<s%s*n=2-0

ด้วยตัวเองนี้พิมพ์ตัวเอง2-0หรือ2เวลา เมื่อตัดการเชื่อมต่อกับสำเนาอื่นของตัวเองคำสั่งพิมพ์สุดท้ายดูเหมือนว่า$><<s%s*n=2-01หมายถึงมันส่งออกตัวเองเพียงครั้งเดียว ( 01เป็นฐานแปด 1) ดังนั้นเฉพาะสำเนาสุดท้ายของสตริงที่พิมพ์สองครั้งเท่านั้นส่วนอื่น ๆ พิมพ์ครั้งเดียว

การกำหนดแบบอินไลน์nเป็นเพียงเพื่อให้ลำดับการดำเนินการทำงานอย่างถูกต้อง สถานะไม่ได้ถูกส่งจากสำเนาหนึ่งไปยังอีกสำเนา


4

NodeJS, 63 61 60 55 ไบต์

สิ่งนี้จะทำงานใน JavaScript (ES6) หากคุณพิจารณาข้อความคอนโซลหลายข้อความเพื่อคั่นด้วยบรรทัดใหม่ (ไม่จำเป็นต้องมี REPL)

บันทึก 2 ไบต์ด้วย @ dev-null

(f=_=>(t=_=>console.log(`(f=${f})()`)||(_=>t))(t()))()

โปรดทราบว่ามีการขึ้นบรรทัดใหม่ในตอนท้ายของรหัส


นี่เป็นสิ่งที่น่าสนใจหนึ่งในรายการโปรดของฉันสำหรับเว็บไซต์นี้จนถึงตอนนี้

ฉันค่อนข้างมั่นใจว่านี่จะไม่สามารถตีกอล์ฟได้มากกว่านี้อีกแล้ว (อาจprintฟังก์ชั่นของ SpiderMonkey ... )

คำอธิบาย

//FIRST ITERATION
            console.log(`(f=${f})()`)                   //logs to the console a quine of the source code using function f's toString()
                                     ||                 //causes the expression to evaluate to the second part, since console.log's return value is falsy
                                       (_=>t)           //a function that returns function t when called
       t=_=>                                            //defines function t to be the code above. When called, t will log a quine and then return a function that returns t.
      (                                      )(t())     //call t twice. (one call is done via the t() as an ignored parameter) This will print the quine twice.
 f=_=>                                                  //define f as the above code.
(                                                  )()  //call function f with no arguments. this results in a function returning t. (the result of calling t once)
                                                        //this newline is to compensate for console.log's behavior of adding a newline to its output
//SECOND ITERATION
(                                                  )    //call the function that returns t that was returned from the first iteration. This expression will result in whatever that function returns, which is t.
 f=_=>(t=_=>console.log(`(f=${f})()`)||(_=>t))(t())     //this part evaluates to a function, which is passed as a parameter to the function that returns t, that ignores its parameter.
                                                    ()  //call whatever the last expression returned, which is the function t, with no parameters. This will print the quine once.
                                                        //this call will result in a function returning t, just like from the first iteration, so we can add on more iterations at will.

ฉันชอบที่มันดูเหมือนว่าจะสวมแว่นกันแดดก่อน (f=_=ฉันอาจจะเหนื่อยไปหน่อย
Ben Leggiero

2

Ruby, 55 ไบต์

n||=2;s="n||=2;s=%p;$><<(s%%s)*n;n=1;";$><<(s%s)*n;n=1;

ไม่มีอะไรน่าสนใจมากที่นี่เป็นเพียงทับทิมธรรมดาที่มีเคาน์เตอร์


2

JavaScript (ES6), 164 ไบต์

console.log((`+String.fromCharCode(96)).repeat(window.a||(a=3,5)).slice(67,-14))
console.log((`+String.fromCharCode(96)).repeat(window.a||(a=3,5)).slice(67,-14))

ใช้งานได้ในหน้าการทดสอบ JS หรือคอนโซลใน Firefox สมมติว่าช่องว่างระหว่างข้อความคอนโซลสองข้อความนับเป็นบรรทัดใหม่


อุปกรณ์ประกอบฉากมากมายสำหรับการทำสิ่งนี้ในภาษาที่ใช้งานทั่วไป!
Ben Leggiero

สั้นลงไปwindow this
Mama Fun Roll



1

Y

ไม่ใช่การแข่งขัน 6 ไบต์

UCn*px

Y เป็น headcannon ที่ฉันมีอยู่พักหนึ่งและนี่เป็นแรงบันดาลใจให้ฉันเขียน มันถูกสร้างขึ้นสำหรับความท้าทายที่การเรียงลำดับเป็นกุญแจสำคัญเช่นนี้ รหัสจะแบ่งออกเป็นลิงค์ตามตัวอักษร "โหนด" ในกรณีนี้รหัสของเราจะใส่ลงในสองโซ่ (เดิม) Cกับโหนดเป็นอยู่

U  C  n* px
1  N    2

Uบันทึกสตริงที่ยอดเยี่ยมคือสตริงที่ขยายลิงก์ Uมันบันทึกจนกว่าจะได้พบกับอีก ถ้า a Uไม่ตรงตามจุดสิ้นสุดของสตริงมันจะล้อมรอบ นอกจากนี้ยังUรวมอยู่ในสตริงโดยค่าเริ่มต้น หลังจากบันทึกสตริงเราจะไปที่โหนดCซึ่งจะย้ายเราไปยังลิงก์ถัดไป

nผลักดันจำนวนโซ่ สำหรับกรณีพื้นฐานของเรานี้ 2 สำหรับลำดับของKโซ่มีK+2โซ่เนื่องจากมีKโหนด *คือการส่งสตริง pพิมพ์สแต็กทั้งหมด (ในกรณีนี้หนึ่งสตริง) และxยกเลิกโปรแกรม

ในข้อความ:

UCn*px
U..... record that string
 C     next link
  n*   repeat that string twice.
    px print and terminate

UCn*pxUCn*pxUCn*px
U.....U            record string
 C                 next link
  n*               repeat that string four times (three Cs)
    px             print and terminate

ลองที่นี่!


ดังนั้นสิ่งที่จะเป็นประโยชน์ในการใช้Uนอกเหนือจาก quining? (ขอแสดงความยินดีกับ 7k, btw)
ETHproductions

@ETHproductions U สามารถใช้ในการจับภาพสตริงที่ขยายลิงก์นอกจากนี้ยังสามารถจับภาพและใช้การแยกลิงก์ไปยังโปรแกรม และขอบคุณ! : D
Conor O'Brien

1

Brachylogขนาด 20 ไบต์

⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅

ลองออนไลน์!

ดัดแปลงจากquine นี้

⊥                       Fail,
 ∨                      or
                w       print
  "⊥∨~kgjw₃w₅"          "⊥∨~kgjw₃w₅"
                 ₃      formatted
              gj        with itself;
                 ₃w₅    print it again at the end of the program if this route succeeds.

เมื่อสิ่งนี้เชื่อมต่อกับตัวเองทุกเส้นทางยกเว้นเส้นทางสุดท้ายล้มเหลวและโปรแกรมจะย้ายไปยังเส้นทางถัดไปโดยดำเนินการแต่ละเส้นทางw₃และย้อนรอยย้อนกลับทุกเส้นทางยกเว้นเส้นทางw₅สุดท้าย

⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅

ลองออนไลน์!

⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅

ลองออนไลน์!

⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅

ลองออนไลน์!

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