สร้างโปรแกรมในขนาดที่เพิ่มขึ้น


21

ในการท้าทายนี้คุณจะเขียนโปรแกรมที่แสดงผลโปรแกรมซึ่งมีความยาวเป็นสองเท่าของโปรแกรมต้นฉบับ โปรแกรมที่ส่งออกควรส่งออกโปรแกรมใหม่ที่โปรแกรมมีความยาวเป็นสองเท่า

ตัวอย่าง

หากโปรแกรมของฉันคือa:

< a
> aa

< aa
> aaaa

< aaaa
> aaaaaaaa

กฎระเบียบ

  • ไม่มีควินในตัว
  • โปรแกรมต้นฉบับจะต้องมีอย่างน้อยหนึ่งไบต์
  • ในทางทฤษฎีลำดับควรทำงานอย่างไม่มีที่สิ้นสุด
  • โปรแกรมของคุณไม่ได้รับอนุญาตให้อ่านจากสิ่งใด (ไฟล์, stdio)

คะแนนของคุณคือขนาดของโปรแกรมต้นฉบับ


วิธีการเกี่ยวกับการเข้าถึงไฟล์โดยการอ่านตัวเอง / การเข้าถึงสถานที่ที่มีรหัส?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴที่ไม่ได้รับอนุญาตเพราะจะเป็นการละเมิดกฎที่ฉันเชื่อ
Downgoat

2
@ Doᴡɴɢᴏᴀᴛกฎ quine ได้รับการแนะนำโดยแท็ก wiki แต่ไม่ใช้โดยอัตโนมัติ
Martin Ender

1
ที่เกี่ยวข้อง: codegolf.stackexchange.com/questions/21831/ …
PyRulez

คำตอบ:


12

CJam, 10 ไบต์

{"_~"+_}_~

ทดสอบที่นี่

คำอธิบาย

{"_~" e# Generalised quine framework, leaves the block and the string "_~"
      e# on the stack. 
+     e# Prepend the block to the string.
_     e# Duplicate the resulting array.
}_~

GolfScript ยังไม่ตาย! Ilmari มีคำตอบสำหรับคำถามที่คล้ายกันซึ่งทำได้ในขนาด 10 ไบต์
Justin

8

JavaScript, 62 61 37 ไบต์


ขอบคุณ @ Doᴡɴɢᴏᴀᴛสำหรับความช่วยเหลือ!


ต้นฉบับ [37 ไบต์]:

f=_=>'f='+'_'.repeat((10+f).length)+f

เด็ก [74 ไบต์]:

f=______________________________________=>'f='+'_'.repeat((10+f).length)+f

หลาน [148 ไบต์]:

f=________________________________________________________________________________________________________________=>'f='+'_'.repeat((10+f).length)+f


ทางเลือก (พร้อมการพิมพ์ไปยังคอนโซลและเป็นโปรแกรมแบบเต็ม):

ดั้งเดิม [61 ไบต์]:

f=_=>console.log(`f=${'_'.repeat((0+f).length+5)+f};f()`);f()

เด็ก [122 ไบต์]:

f=______________________________________________________________=>console.log(`f=${'_'.repeat((0+f).length+5)+f};f()`);f()

หลาน [244 ไบต์]:

f=________________________________________________________________________________________________________________________________________________________________________________________=>console.log(`f=${'_'.repeat((0+f).length+5)+f};f()`);f()



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

1.   f=_=>   กำหนดฟังก์ชัน f เป็นconsole.log(...)

2.   ;f()   เรียกใช้ฟังก์ชัน f

3.   (ในฟังก์ชั่น f)  

  • console.log(...)   พิมพ์ต่อไปนี้:

    • f=   ข้อความตัวอักษร "f ="
    • ${'_'.repeat((0+f).length+5)   "_" ซ้ำสำหรับความยาวของ f เปลี่ยนเป็นบัญชีสำหรับอักขระที่ไม่รวมอยู่ในการทำให้เป็นสตริงของ f
    • +f}   การทำให้เป็นสตริงของฟังก์ชัน f
    • ;f()   ข้อความตัวอักษร "; f ()"

หมายเหตุ

  • console.logเป็นสิ่งจำเป็นแทนalertเพราะalertดูเหมือนจะเล่นได้ไม่ดีกับสตริงที่ยาวมาก ๆ (อย่างน้อยในการกำหนดค่าเครื่อง / เบราว์เซอร์ของฉัน)
  • _'s จะแทรกเข้าไปในชื่อของ (ไม่ได้ใช้) พารามิเตอร์ของฟังก์ชัน f, เพื่อให้แน่ใจว่าพวกเขาจะรวมอยู่ใน stringification ของ f
  • การปรับปรุงหลัก (นอกเหนือจากการกำจัดconsole.log) ของวิธีแก้ปัญหาแรกในช่วงที่สอง: การเพิ่ม10ฟังก์ชั่นแทนที่จะ0ส่งไปยังสตริงทำให้มันยาวขึ้นหนึ่งไบต์โดยไม่ต้องเพิ่ม 1 ลงไปอีกหลังจากนั้นจึงประหยัดไบต์

0+fควรใช้เพื่อส่งฟังก์ชันให้กับสตริง
Downgoat

48 bytes:(f=_=>`(f=${'_'.repeat((0+f).length+5)+f})()`)()
Downgoat

@ Doᴡɴɢᴏᴀᴛลืมว่าผลตอบแทนมักจะยอมรับได้ จะอัปเดต
jrich

@ Doᴡɴɢᴏᴀᴛที่จริงแล้วเนื่องจากการเขียนคำตอบเนื่องจากฟังก์ชั่นเป็นที่ยอมรับกันโดยทั่วไปแล้วการแก้ปัญหาจำเป็นต้องเรียกฟังก์ชั่นนี้หรือไม่?
jrich

แน่นอนคุณสามารถทำได้
Downgoat

6

Minkolang 0.15 , 19 14 ไบต์

"66*2-rIDdr$O.

เดิม , เด็ก , หลาน

คำอธิบาย

"66*2-      $O.    Standard quine formulation

      r            Reverse stack
       I           Push length of stack
        D          Pop n and duplicate top of stack n times
         d         Duplicate top of stack
          r        Reverse stack

สิ่งที่บิตในระหว่างrs ทำซ้ำช่วงเวลาสิ้นสุดมีเวลาเพียงพอที่จะทำตามเกณฑ์สองเท่า .เป็นตัวอักษร "โปรแกรมหยุด" ดังนั้นช่วงเวลาต่างๆในตอนท้ายก็ไม่ได้ทำอะไรนอกจากอยู่ที่นั่น



2

Python 3, 51 ไบต์

x=r"print('x=r\"'+x+'\"'+';exec(x*2)');";exec(x*2)

รวมถึงการขึ้นบรรทัดใหม่

ผลลัพธ์ใด:

x=r"print('x=r\"'+x+'\"'+';exec(x*2)');";exec(x*2)
x=r"print('x=r\"'+x+'\"'+';exec(x*2)');";exec(x*2)

2

GolfScript ขนาด 11 ไบต์

{: ".~"]}.~

ลองออนไลน์!

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

{: ".~"]}.~

{       }    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 the entire stack in an array.

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

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

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

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

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

และอื่น ๆ

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

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

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

    สำหรับสำเนาของซอร์สโค้ดเดียวตอนนี้สแต็กจะมี

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

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

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

      {: ".~"]}.~
      

      ไปที่ STDOUT และดึงสำเนาสแต็กจากด้านบนของสแต็ก

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

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

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

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

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

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

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

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

      {: ".~"]}.~
      

      ถึง STDOUT


1

𝔼𝕊𝕄𝕚𝕟, 26 ตัวอักษร / 36 ไบต์

⟮ô`\u27ee⦃ᶈ0}\u27ef
`ď2)⟯

Try it here (Firefox only).

โปรดทราบว่ามีบรรทัดใหม่ต่อท้าย

คำอธิบาย

ควินมาตรฐาน: ⟮ⒸⅩ222+ᶈ0

แก้ไข:

  • ใช้ ôฟังก์ชั่นเพื่อส่งออกผลการทดสอบทั้งหมดแทนผลลัพธ์ล่าสุด (เช่นเดียวกับการใช้เอาต์พุตโดยนัย)
  • ใช้ \u27ee⦃ᶈ0}\u27ef\nและปิดบล็อกคัดลอกเพื่อป้องกันความขัดแย้งกับบล็อกสำเนาในภายหลัง
  • ใช้ď2เพื่อทำซ้ำสตริงสองครั้ง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.