Quine ที่เพิ่มขึ้น


23

งานของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นที่ส่งออกอักขระตัวแรกของซอร์สโค้ดของมันแล้วตัวที่สองจากนั้นก็ตัวที่สาม ... ในแต่ละครั้งที่มันถูกเรียกใช้

ตัวอย่างเช่นหากโปรแกรมของคุณเป็นfooภาษาbarในไฟล์baz.barคุณควรจะได้ผลลัพธ์ที่คล้ายกับนี้:

λ bar baz.bar
f
λ bar baz.bar
o
λ bar baz.bar
o

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

นี่คือรหัสกอล์ฟดังนั้นโปรแกรมที่สั้นที่สุดในหน่วยไบต์ชนะ


1
ถ้าเราสามารถแก้ไขซอร์สโค้ดของไฟล์ได้นั่นหมายความว่าเราสามารถอ่านมันได้หรือไม่?
FlipTack

1
@ Flp.Tkc เป็นคำถามที่ดี ฉันไม่รู้จริงๆ ฉันไม่ต้องการให้คุณสร้างควินินโดยการอ่านซอร์ส แต่ฉันก็โอเคถ้าคุณอ่านซอร์สสำหรับการแก้ไขไฟล์เท่านั้น
Conor O'Brien

คำตอบ:


6

เยลลี่ 12 ไบต์

“;⁾vṾ®ȯ©Ḣ”vṾ

นี่คือลิงก์ niladic ลองออนไลน์! (รวมรหัสเพื่อโทรไปยังลิงค์สิบสองครั้ง)

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

“;⁾vṾ®ȯ©Ḣ”vṾ  Niladic link.

“;⁾vṾ®ȯ©Ḣ”    Set the left argument and the return value to s =: ';⁾vṾ®ȯ©Ḣ'.
           Ṿ  Uneval; yield r =: '“;⁾vṾ®ȯ©Ḣ”', a string representation of s.
          v   Eval; execute s as a Jelly program with argument r.

 ⁾vV          Yield 'vṾ'.
;             Concatenate r and 'vṾ', yielding q =: '“;⁾vṾ®ȯ©Ḣ”vṾ'.
    ®ȯ        Take the flat logical OR of the register (initially 0) and q.
              This replaces 0 with q in the first run, but it will yield the
              content of the register in subsequent runs.
      ©       Copy the result to the register.
       Ḣ      Head; pop and yield the first character of the register.
              This modifies the string in the register, so it holds one fewer
              character after each call.

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


ฉันไม่รู้ว่า Jelly ดังนั้นส่วนท้ายของรองเท้าทำอะไรได้อย่างแม่นยำ ทำไมต้อง ^ 17
Conor O'Brien

โทรไปที่ลิงก์ด้านบน ( ¢) ฟังก์ชั่นระบุตัวตน ( ¹ไม่จำเป็นจริง ๆ หลังจากการโทรครั้งแรก) ตั้งค่าส่งคืนเป็น linefeed ( พิมพ์ค่าส่งคืนก่อนหน้าโดยนัย) ซ้ำ ¹และเป็นทั้งตัวยก แต่พวกมันไม่เกี่ยวข้องกัน ฉันได้แทนที่พวกเขาด้วยความสับสนน้อยลง¢;¢;¢;¢;¢;¢;¢;¢;¢;¢;¢;¢(โทร, เชื่อมต่อ, ทำซ้ำ)
เดนนิส

12

Javascript - 26 ไบต์

นิยามf()ที่ส่งคืนอักขระซอร์สโค้ดตามตัวอักษร

n=0;f=x=>("n=0;f="+f)[n++]

ส่งกลับไม่ได้กำหนดหลังจากที่มันหมดตัวอักษร

n=0;f=x=>("n=0;f="+f)[n++]
for(i=0;i<30;i++){console.log(f())} //test harness


หากฉันไม่เข้าใจผิดคุณจะต้องรวมการเรียกฟังก์ชันเป็นส่วนหนึ่งของรหัส
Mama Fun Roll

@MamaFunRoll ลิงก์ไปยังโพสต์เมตาที่เกี่ยวข้อง?
Downgoat

ฉันรู้ว่าไม่มี: P อย่างไรก็ตามฉันคิดเสมอว่าฟังก์ชั่นการเรียกตัวเองเป็นส่วนหนึ่งของควิน; อาจจะมีบางสิ่งที่ฉันขาดหายไป?
Mama Fun Roll

@MamaFunRoll ข้อมูลจำเพาะอนุญาตเฉพาะฟังก์ชั่นดังนั้นจึงไม่จำเป็นต้องโทร มันคงไม่สมเหตุสมผลสำหรับความท้าทายของฝุ่นละอองนี้
เดนนิส

เอาล่ะแค่ทำให้แน่ใจ
Mama Fun Roll

2

แบบสแต็กไม่ใช่แบบ 34 ไบต์

[tostr ':!' + execCounter # out]:!

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

ลองที่นี่!


2

Pip , 31 ไบต์

{Y"{Y (yRsRPy++v)}"(yRsRPy++v)}

ฟังก์ชั่นที่ไม่ระบุชื่อ ทดสอบบน TIO!

คำอธิบาย

เริ่มด้วย Pip quine มาตรฐานนี้:

Y"Y yRsRPy"yRsRPy
Y"Y yRsRPy"        Yank that string into y
           yRsRPy  In y, replace the space with repr(y)

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

Pip มีการจัดทำดัชนีตามวัฏจักรดังนั้นเมื่อฟังก์ชันพิมพ์อักขระตัวสุดท้ายแล้วมันจะเริ่มต้นใหม่ที่จุดเริ่มต้น


1

Python 90 ไบต์

ส่วนขยายของ Python Quine มาตรฐาน (ยินดีต้อนรับเคล็ดลับการเล่นกอล์ฟ):

def f(n=0,s='def f(n=0,s=%r):\n while 1:yield(s%%s)[n];n+=1'):
 while 1:yield(s%s)[n];n+=1

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

สำหรับการทดสอบให้เพิ่มสคริปต์นี้ต่อท้ายโปรแกรม:

source = ''
try:
    # Call generator, add characters to the string
    for char in f():
        source += char
except IndexError:
    # Generator has reached end of source code
    pass

print(source)

หรือลองออนไลน์!


1

*> <> , 13 21 ไบต์

" r:2+a1Fi1+:1F1+[ro;

สร้างไฟล์ที่ชื่อ\nเพื่อติดตามดัชนี

นี่อาจจะสามารถเล่นกอล์ฟได้มากกว่านี้ แต่ไม่มีอะไรโดดออกมาทันทีที่ฉัน ...

เอาท์พุต

$ starfish incrementalquine.sf 
"$ starfish incrementalquine.sf 
 $ starfish incrementalquine.sf 
r$ starfish incrementalquine.sf 
:$ starfish incrementalquine.sf 
2$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
a$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
F$ starfish incrementalquine.sf 
i$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
:$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
F$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
[$ starfish incrementalquine.sf 
r$ starfish incrementalquine.sf 
o$ starfish incrementalquine.sf 
;$ starfish incrementalquine.sf

คำอธิบาย

" r:2+                 build the quine
      a1F              open file named "\n"
         i1+:          read input, increment by 1, duplicate
             1F        save incremented input to file
               1+[     increment input, copy that many values to a new stack
                  ro   output the character at the beginning of the new stack
                    ;  end

โกง Quine ที่เพิ่มขึ้น

a1Fi1+:0go1F;

คำอธิบาย

a1F            open file named "\n"
   i1+         read input and add 1 to it
      :0g      push the value at (input,0) to the stack
         o     output the value
          1F   save the incremented input to the file
            ;  exit

ฮ่าฮ่าฉันไม่รู้ว่าคุณสามารถตั้งชื่อไฟล์ "\ n" ได้ แม้ว่าเทคนิคนี้จะอ่านซอร์สโค้ดโดยgคำสั่ง
Conor O'Brien

@ ConorO'Brien อายุติธรรมพอ อืม ...
redstarcoder

*> <> มีการทำดัชนีสแต็กบ้างไหม? หรือการทำซ้ำคำสั่ง? จากนั้นคุณสามารถใช้กรอบมาตรฐาน quine "your code goes here;สำหรับ> <> จากนั้นเข้าถึงสมาชิกลำดับที่ n ในสแต็ก
Conor O'Brien

@ ConorO'Brien ใช่ Teal Pelican แสดงให้ฉันเห็นตัวแปร quine นี้ในคำตอบการโกง quine อื่น ๆ ของฉัน :)
redstarcoder

1
@redstarcoder ฉันได้ทำงานมากขึ้นใน quines (YAY!) และฉันคิดออกเคล็ดลับดีถ้าคุณแทนที่ r สำหรับ # คุณสามารถ: 1- ที่ชอบ; #; หรือ [+ 1F1: + 1iF1a-1: "ฉันไม่สามารถทดสอบได้ในขณะนี้ แต่ฉันเชื่อว่ามันตัด 1 ไบต์จากรหัสของคุณ> <> quines สามารถทำได้เช่น #o <-1:" etc: D
นกกระทุงนกเป็ดน้ำ

1

Mathematica, 91 ไบต์

ความคิดเห็นยินดีต้อนรับมาก; ฉันยังคงเรียนรู้เชือกเกี่ยวกับสิ่งที่เป็น quines ที่เหมาะสม

(If[!NumberQ[q], q = 0]; StringTake[ToString[#0]<>FromCharacterCode[{91, 93}], {++q}]) & []

กำหนดฟังก์ชั่นที่เรียกซ้ำ ๆ โดยไม่มีข้อโต้แย้ง หลังจากการโทรที่ 91 จะเกิดข้อผิดพลาดครั้งใหญ่และส่งคืนค่าที่ไม่ได้ประเมิน

มีสองประเด็นที่ต้องเอาชนะ: อันดับแรกฉันต้องการใช้StringTake[ToString[#0]<>"[]"]แต่ToString[]ดูเหมือนว่าจะลบเครื่องหมายคำพูด ดังนั้นผมจึงต้องเปลี่ยนจาก"[]" FromCharacterCode[{91, 93}]ประการที่สองตัวแปร Mathematica เริ่มต้นโดยไม่กำหนดค่าเริ่มต้นดังนั้นฉันไม่สามารถโทรหา++qก่อนqได้ นี่คือสาเหตุที่If[!NumberQ[q], q = 0]ต้องการเริ่มต้น

Coda ที่ไม่เกี่ยวข้อง: ในขณะที่มองขึ้นไปNumberQฉันได้เรียนรู้ว่า Mathematica มีฟังก์ชั่นที่เรียกว่าTrueQ... ซึ่งใช่ส่งกลับTrueถ้าการโต้แย้งเป็นTrueและFalseถ้าการโต้แย้งเป็นFalse! (ยูทิลิตี้คือมันจะส่งกลับFalseข้อโต้แย้งอื่น ๆ ทั้งหมดเช่นกัน)


1

Microscript II, 40 33 ไบต์

รหัสบล็อกตัวอักษรเทียบเท่ากับภาษาของฟังก์ชั่นที่ใกล้เคียงที่สุด:

{ss1K+>K>s#<v{o}sl*v!(123v)lKp<o}

หลังจากทำงานแล้วจะทำให้ตัวเองกลับมาทำงานxได้ง่ายขึ้นอีกครั้ง


0

Bash (และ zsh, ksh), 39- ไบต์

a=`<$0`;pwd>>0;echo ${a:`wc -l<0`-1:1}

มันจะพิมพ์อะไรหลังจากเมื่อโปรแกรมถูกพิมพ์ออกมา

ตรวจสอบให้แน่ใจว่า0ไม่มีอยู่ในไดเรกทอรีปัจจุบันและเรียกใช้:

bash iquine.bash

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