ควินเติบโตช้า


30

ทำควินน์

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

วิธีนี้ควินควรในหลายชั่วอายุคนออกสำเนาสองฉบับ

ตัวอย่าง: xช่วยให้รหัสของคุณ x + x[:1]เล่นควรเอาท์พุท การรันโปรแกรมผลลัพธ์ควรออกx + x[:2]และอื่น ๆ ...

หากรหัสของคุณทำงานนี้ควรเอาท์พุทfoobar เล่นนี้ควรเอาท์พุทfoobarf foobarfoและต่อ ๆ ไปเรื่อย ๆ ตามรูปแบบนี้:

foobar
foobarf
foobarfo
foobarfoo
foobarfoob
foobarfooba
foobarfoobar
foobarfoobarf

โปรแกรมของคุณจะต้องมีความยาวมากกว่า 2 ไบต์และจะต้องส่งออกอักขระพิเศษหนึ่งตัวของรหัสของตัวเองในแต่ละการวนซ้ำ


3
ฉันสงสัยว่าความท้าทายนี้เป็นไปไม่ได้ในภาษาส่วนใหญ่เนื่องจากการอ่านซอร์สโค้ดถูกห้ามโดยค่าเริ่มต้น
Ørjan Johansen

12
@ ØrjanJohansenและ Dennis ปรากฏตัวขึ้น
Rod

2
@ เร็วดีฉันไม่ได้พูดทั้งหมดเป็นเพียงว่าหลายภาษา / ส่วนใหญ่ไม่มีวิธีที่ชัดเจนในการเพิ่มส่วนของรหัสโดยพลการในลักษณะที่ (1) มันไม่ได้ให้ข้อผิดพลาดทางไวยากรณ์ (2) โปรแกรมสามารถตรวจจับการเปลี่ยนแปลง
Ørjan Johansen

3
ตั้งแต่นี้เป็นควินแปลกมากเป็นช่องโหว่ quine ปกติยังคงไม่อนุญาตหรือไม่
Draconis

คำตอบ:


15

zsh ,110 108 100 ไบต์

a=`<&0`<<''<<<t;b=${a:0:50};printf $b$b${a:0:-50}
a=`<&0`<<''<<<t;b=${a:0:50};printf $b$b${a:0:-50}

ลองออนไลน์!

ดังนั้นจึงเป็นไปได้

คำอธิบาย

a=`<&0`<<''<<<t;       # Set A to everything following this line, until eof or
                       #   an empty line (which never happens before eof) encountered.
                       # A "t" is appended to prevent automatic trimming of newlines.
b=${a:0:50};           # Set B to the first line.
printf $b$b${a:0:-50}  # Print two copies of B and
                       #   A with 50 trailing characters removed.

1
ที่เกี่ยวข้อง: codegolf.stackexchange.com/q/100930/25180
jimmy23013

11

R, 289 ไบต์

s<-c("s<-", "i=get0('i',ifnotfound=0)+1;p=paste0(s,substr(get0('p',ifnotfound=s),1,i),collapse='');cat(s[1]);dput(s);cat(paste0(s[2],substr(p,1,i)))#")
i=get0('i',ifnotfound=0)+1;p=paste0(s,substr(get0('p',ifnotfound=s),1,i),collapse='');cat(s[1]);dput(s);cat(paste0(s[2],substr(p,1,i)))#

ให้เครดิตกับควินนี้เพื่อเป็นแรงบันดาลใจ ทำงานเฉพาะถ้าทำงานในเดียวกันสภาพแวดล้อม R เป็นควินก่อนหน้านี้มีการเรียกใช้


คำอธิบายกำลังจะมาถึง ... ฉันยังไม่ได้ทดสอบมัน 288 ครั้ง แต่ฉันค่อนข้างมั่นใจแล้วว่าถูกต้อง
Giuseppe

มันควรจะเป็น 289 ไบต์เนื่องจาก quine เพิ่มอักขระขึ้นบรรทัดใหม่ที่นั่น แต่อย่างไรก็ตามมันเยี่ยมยอดมากที่คุณได้แก้ไขมัน!
IQuick 143

อาคุณพูดถูกโง่catเพิ่มบรรทัดใหม่
Giuseppe

แต่นี่เป็นโปรแกรมเต็มหรือไม่ รหัสที่สร้างขึ้นเป็นโปรแกรมแบบเต็มหรือไม่
jimmy23013

@ jimmy23013 เท่าที่ฉันสามารถบอกได้คำตอบนี้และรหัสที่สร้างขึ้นเป็นโปรแกรมเต็มรูปแบบ ไม่มีmainโครงสร้างบังคับหรืออื่น ๆ เช่นนั้นในอาร์นอกจากนี้คำถามไม่ได้ขอโปรแกรมแบบเต็มดังนั้นฟังก์ชั่นหรือสิ่งที่คล้ายกันจะทำ
Steadybox

5

อลิซ 29 ไบต์

4P.a+80pa2*&wdt,kd&w74*,.ok@

ลองออนไลน์!

อักขระที่ไม่สามารถพิมพ์ได้คือ 0x18

คำอธิบาย

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

คำตอบนี้ใช้"วิธีการพื้นฐาน แต่แทนที่จะรวม a "ในซอร์สเราเขียนลงในโปรแกรมตอนรันไทม์ ด้วยวิธีนี้จะมีเพียงหนึ่งเดียว"โดยไม่คำนึงว่าโปรแกรมนั้นถูกทำซ้ำบ่อยเพียงใด (เพราะเราจะเขียนลงในพิกัดเดียวเท่านั้นโดยไม่ขึ้นกับขนาดโปรแกรม)

แนวคิดทั่วไปคือการที่เราสร้างการแสดงผลของรหัสที่มาทั้งหมดในสแต็ก แต่เพียงรอบผ่าน 29 ตัวแรกของตัวละคร (เช่นความยาวของโปรแกรม) ด้วยความยาวของวงที่กำหนดโดยขนาดของรหัส ดังนั้นเราสามารถต่อท้ายอักขระโดยพลการ (ยกเว้น linefeeds) หลังจากนั้น@และผลลัพธ์จะเป็นการวนซ้ำของโปรแกรมหลักทุกครั้งที่ตัวละครยาวกว่าแหล่งที่มา

4P   Push 4! = 24. This is the code point of the unprintable, which we're 
     using as a placeholder for the quote.
.a+  Duplicate it and add 10, to get 34 = '"'.
80p  Write '"' to cell (8,0), i.e. where the first unprintable is.
    Placeholder, becomes " by the time we get here, and pushes the code
     points of the entire program to the stack. However, since we're already
     a good bit into the program, the order will be messed up: the bottom
     of the stack starts at the 24 (the unprintable) followed by all 
     characters after it (including those from extraneous repetitions). Then 
     on top we have the characters that come in front of the `"`. 
     So if the initial program has structure AB, then any valid program has
     the form ABC (where C is a cyclic repetition of the initial program),
     and the stack ends up holding BCA. We don't care about C, except to
     determine how big the program is. So the first thing we need to do is
     bring B to the top, so that we've got the initial program on top of
     the stack:
a2*  Push 10*2 = 20.
&w   Run the following section 21 times, which is the length of B.

  dt,  Pull up the value at the bottom of the stack.

k    End of loop.
d&w  Run the following section D+1 times, where D is the length of ABC.

  74*  Push 28, one less than the number of characters in AB.
  ,    Pull up the 29th stack element, which is the next character to print.
  .o   Print a copy of that character.

k    End of loop.
@    Terminate the program.

ทางออกที่ดี ฉันชอบคำอธิบาย
IQuick 143

4

Perl 5 , 83 ไบต์ (รวมถึงบรรทัดใหม่สุดท้าย)

$_=q($/=$;;$_="\$_=q($_);eval
__END__
".<DATA>;print$_,/(.).{82}\z/s);eval
__END__

ลองออนไลน์!

__DATA__โทเค็น ol 'ที่ดีทำให้ง่ายต่อการผนวกสตริงโดยพลการไปยังโปรแกรม Perl ใด ๆ ซึ่งโปรแกรมหลักสามารถเข้าถึงผ่านทาง<DATA>จัดการไฟล์ (และใช้งานจริง__END__ซึ่งทำสิ่งเดียวกันสำหรับความเข้ากันได้ย้อนหลังแทน__DATA__บันทึกสองไบต์พิเศษ) .

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

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


2

Befunge-98 , 30 ไบต์

0>:#;0g:840#;+*#1-#,_$a3*%0g,@

ลองออนไลน์!

ฉันลองใช้ Befunge-98 ซึ่งใช้ quine ที่ยุติสเปซซึ่งนับจำนวนตัวอักษรที่ถูกส่งออกด้วย ไม่ใช้gคำสั่ง


คุณอาจต้องการพูดถึงในบรรทัดแรกว่าไม่ใช่การแข่งขัน / การโกงเพียงเพื่อกีดกันการลงคะแนนใด ๆ ที่อาจได้รับ
quintopia

2

PHP, 146 ไบต์

ob_start(function($s){return($u=substr($s,0,73)).$u.substr($s,0,-72);})?>ob_start(function($s){return($u=substr($s,0,73)).$u.substr($s,0,-72);})?>

มันควรจะทำงานโดยใช้-rในบรรทัดคำสั่ง


ดูเหมือนจะไม่ทำงานเมื่อฉันลองออนไลน์! มันเป็นแค่ควินธรรมดา
Ørjan Johansen

@ php -r 'command'ØrjanJohansenคุณควรเรียกมันด้วย
jimmy23013

Gah ไม่สามารถทำงานได้ TIO ดูเหมือนจะเพิกเฉยต่ออาร์กิวเมนต์ -r
Ørjan Johansen


เอเอชเอ ฉันต้องเข้าใจผิดบางอย่างในตอนนั้น ตอนนี้ฉันจัดการเพื่อให้มันทำงานกับ PHP ในการตั้งค่าภาษาได้เช่นกัน
Ørjan Johansen

2

เวทมนตร์รูน 61 ไบต์

803X4+kw.'.q}͍}͍}͍}͍}͍}͍}͍}͍}͍::l͍5X-:}-$:l͍{-1--@

ลองออนไลน์!

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

ลำดับหมุนในหน่วยความจำแสดงสตริงรอบเพื่อให้803X4+kwปรากฏที่จุดเริ่มต้นแทนการที่สิ้นสุดเนื่องจากตำแหน่งของ"และไม่มีวิธีที่ง่ายในการจัดการการดำเนินการนี้ได้โดยไม่ต้องคำนวณตัวเลขจำนวนมากอึดอัด .

ในขณะที่โปรแกรมดั้งเดิมคือ 61 ไบต์ความยาวสตริงของมันมีเพียง 50 ซึ่งง่ายต่อการสร้าง5Xและมันก็เป็นเรื่องบังเอิญเท่านั้นที่มันไม่จำเป็นต้องถูกตัดออกหลังจากที่มีฟังก์ชั่นที่จำเป็นทั้งหมด (เช่นความยาว 49 โปรแกรมจะง่ายขึ้น เพื่อเข้ารหัสเช่นเดียว50กับหนึ่งไบต์ของ padding กว่าการเข้ารหัสตามตัวอักษร49ในขณะที่51จะถูกเข้ารหัสเป็น5X3+หรือ 53 ต้องมีบัญชีสำหรับไบต์พิเศษของตัวเอง)

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