Quine ในทุกบรรทัด


30

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

ตัวอย่าง

โปรแกรม:

A

เอาท์พุท:

A
A
A
...

กฎระเบียบ

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

ชื่อดูเหมือนว่ามีเพียงโปรแกรมหนึ่งบรรทัดเท่านั้นที่มีคุณสมบัติใช่หรือไม่
Paŭlo Ebermann

@ PaŭloEbermannจากนั้นอ่านคำอธิบายปัญหา มันเป็นชื่อที่มีไหวพริบเพราะมันคล้องจอง นี่คือตัวอย่างของโปรแกรมหลายสายที่ถูกต้อง: codegolf.stackexchange.com/a/57985/34718 คุณไม่สามารถคาดหวังที่จะรู้ทุกสิ่งเกี่ยวกับความท้าทายโดยการอ่านชื่อเท่านั้น
mbomb007

@ PaŭloEbermannมันเป็นแค่while(1)println(your_code);
Matthew Roh

คำตอบ:


19

ฟิชชัน 7 ไบต์

'!+!NR"

การปรับเปลี่ยนค่อนข้างง่ายของควินหาฟิชชันที่สั้นที่สุดที่ฉันได้พบ : ฉันเพียงแค่ใช้แบบไม่ทำลาย!แทนที่จะOเพิ่มและขึ้นNบรรทัดใหม่

ดังนั้นโดยสรุปนี่คือวิธีการทำงาน: การควบคุมการไหลเริ่มต้นที่Rอะตอมที่มีทิศทางขวา "สลับโหมดสตริงซึ่งหมายความว่าทุกอย่างจนกว่า"จะมีการพิมพ์ถัดไป: ในกรณี'!+!NRนี้ ที่ปล่อยให้"และขึ้นบรรทัดใหม่ที่จะพิมพ์ '!ตั้งค่ามวลของอะตอมเป็น 33 +เพิ่มขึ้นเป็น 34 (รหัสอักขระ") และ!พิมพ์เครื่องหมายคำพูด Nพิมพ์บรรทัดใหม่และRตอนนี้ไม่มีตัวเลือกในกรณีนี้ดังนั้นวนซ้ำ

โซลูชัน 7 ไบต์ต่อไปนี้ยังสามารถใช้งานได้:

"NR'!+!

9

> <> , 16 ไบต์

'ard3*o50l2)?.~~

แบบดั้งเดิม> <> quine ใช้จำนวนมากเกินไปoดังนั้นเราจึงใช้การวนซ้ำสำหรับการพิมพ์ ก่อนที่แต่ละกระโดดเราผลักดัน 5 และ 0 (พิกัดของสถานที่ที่จะข้ามไป) หลังจากที่เรากระโดดทั้งที่มีถ้ามียังคงเป็นสิ่งที่จะพิมพ์หรือปรากฏด้านบนสองค่ากับ.~~

(เปลี่ยนกลับเป็นเวอร์ชัน 16 เนื่องจากฉันลืมกฎสแต็กโอเวอร์โฟลว์)


ทางเลือกคือ"ar00go50l2)?.[ใช่มั้ย
mbomb007

3
@ mbomb007 ฉันเดา แต่ฉันชอบd3*ตั้งแต่gอ่านซอร์สโค้ดของคุณเอง
Sp3000

8

CJam, 13 ไบต์

{_o"_g
"o1}_g

ล่ามออนไลน์ไม่ได้พิมพ์อะไรก่อนที่โปรแกรมจะยุติดังนั้นคุณต้องทดสอบในล่าม Java

คำอธิบาย

ในที่สุด CJan ควินินทั่วไปที่ไม่ได้อยู่_~ข้างใน

{_o"_g
"o1}

สิ่งนี้จะผลักดันบล็อก _gทำซ้ำบล็อกและดำเนินการซ้ำ ๆ ในขณะที่ด้านบนของสแต็คคือความจริง (ยกเลิกเงื่อนไข)

ในขณะนี้ภายในบล็อกสำเนาอื่น ๆ ของบล็อกยังคงอยู่ในกองซ้อน เราทำซ้ำและพิมพ์ด้วย_oแล้วเราพิมพ์_gตามด้วยการขึ้นบรรทัดใหม่ (ที่จำเป็นในการขึ้นบรรทัดใหม่พิเศษระหว่าง quines) "_g\n"oด้วย ในที่สุดเราก็กด a 1ลงบนสแต็กเพื่อวนซ้ำอีกครั้งเนื่องจากโชคไม่ดีที่บล็อกไม่จริง (หรือเป็นเท็จ) ใน CJam


7

Python 2, 39

ไม่ใช่งานที่น่าสนใจมากใน Python เพราะมันเป็นเรื่องเล็กน้อยที่จะเพิ่ม while เข้าไปใน Quine ปกติ

c='while 2:print"c=%r;exec c"%c';exec c

สิ่งนี้จะไม่ระเบิดกองซ้อนหรือไม่
Jesan Fafon

1
@JesanFafon ไม่ถ้าคุณลองคุณจะเห็นว่ามันไม่ ไม่มีการเรียกซ้ำ
feersum

6

Perl 5.10+, 40 37 ไบต์

$_=q{say"\$_=q{$_};eval"while 1};eval

หรือ (เช่น 37 ไบต์)

$_=q{{say"\$_=q{$_};eval";redo}};eval

เรียกใช้การตั้งค่าสถานะ-M5.010หรือ-Eบรรทัดคำสั่งเช่น

$ perl -E '$_=q{say"\$_=q{$_};eval"while 1};eval'
$_=q{say"\$_=q{$_};eval"while 1};eval
$_=q{say"\$_=q{$_};eval"while 1};eval
$_=q{say"\$_=q{$_};eval"while 1};eval
...

ขอบคุณIlmari Karonenสำหรับการกำจัด 3 ไบต์จากโซลูชันดั้งเดิมของฉันซึ่งก็คือ:

eval while$_=q{say"eval while\$_=q{$_}"}

นี่รวมถึงโซลูชั่นที่มีขนาด 37 ไบต์ที่สั้นกว่าข้างต้นล้วน แต่เป็นการเปลี่ยนแปลงอย่างง่ายของควินินต่อไปนี้ซึ่งฉันได้เห็นครั้งแรกในโพสต์อื่นของ Ilmari :

$_=q{say"\$_=q{$_};eval"};eval

เนื่องจากทั้งหมดที่ฉันเพิ่มเข้าไปในโซลูชันดั้งเดิมของฉันเป็นแบบwhileวนซ้ำเขาสมควรได้รับเครดิตส่วนใหญ่จริงๆ :-)


ดีและขอบคุณสำหรับเครดิต :-) quine ดั้งเดิมคือการออกแบบของฉันเองแม้ว่าคนอื่นอาจค้นพบมันได้อย่างอิสระก่อนหน้านี้ BTW $_=q{say"\$_=q{$_};eval"while 1};evalหรือ$_=q{{say"\$_=q{$_};eval";redo}};evalจะสั้นกว่าไม่กี่ไบต์ ( $_=q{say"\$_=q{$_};eval";eval};evalจะสั้นกว่านี้อีก แต่ฉันคิดว่าในที่สุดมันก็จะหมดสแต็ค)
Ilmari Karonen

ฉันหวังว่าคุณจะปรากฏ! ขอบคุณสำหรับวิธีแก้ปัญหาที่สั้นกว่านี้ฉันคิดว่าคุณจะได้รับสิ่งที่ดีกว่า แต่ตอนนี้ฉันรู้สึกปลิวไปเมื่อเห็นมันในคำตอบที่ฉันเชื่อมโยงฉันต้องลองด้วยตัวเอง :) พูดตามตรงฉันยังไม่ได้คิดมากไป แต่คำตอบเพิ่มเติมให้ฉันดูมากกว่านี้ ฉันไม่แน่ใจว่าคุณเกิดจากสิ่งนี้หรือไม่เพราะฉันเห็นว่าคุณให้เครดิตกับควิน Perl ที่ไม่ใช่การโกงที่สั้นที่สุดที่เคย (?!) ในหน้านี้แต่ไม่มีการระบุแหล่งที่มาสำหรับควินินนี้ (ใช้printแทนsay)
ThisSuitIsBlackNot

btw อันสุดท้ายจะ segfault แน่นอนหลังจากที่ทำงานในขณะที่ ขอขอบคุณอีกครั้ง @Ilmari!
ThisSuitIsBlackNot

ที่จริงแล้วฉันเอาสิ่งนั้นกลับมา - ฉันไม่ใช่คนแรกที่คิดค้น quineและแน่นอนว่าฉันเคยเห็นมาก่อน (ฉันโพสต์คนที่ฉันอ้างสิทธิ์เครดิตในหัวข้อเดียวกัน) จึงมีโอกาสมาก ที่ฉันจำได้โดยไม่รู้ตัวจากด้ายนั้นหรือจากที่อื่น
Ilmari Karonen

เอาล่ะฉันไม่ได้ระบุที่มา ไม่ว่าจะเป็นการขอบคุณสำหรับ 3 ไบต์และขอบคุณสำหรับแรงบันดาลใจดั้งเดิม
ThisSuitIsBlackNot

5

การปรับเปลี่ยนสมองด้วยตนเอง *** (SMBF)ขนาด 14 ไบต์

บรรทัดใหม่ที่ต่อท้าย\nจะต้องเป็นตัวอักษร, Unix, ขึ้นบรรทัดใหม่ (รหัส ASCII 10)

[<[<]>[.>]<.]\n

คำอธิบาย:

โค้ดจะย้ายตัวชี้ไปทางซ้ายสุดของซอร์สโค้ดแล้วพิมพ์มันทั้งหมดรวมถึงการขึ้นบรรทัดใหม่ (สองครั้งต่อ b / c ของกฎ) การวนซ้ำดำเนินต่อไป


คุณหมายถึงมันจะต้องเป็น\rอย่างไร
Ismael Miguel

@IsmaelMiguel No. \nเป็นบรรทัดใหม่และเป็นรหัส ASCII 10 ดังนั้นการถ่ายโอนข้อมูลแบบเลขฐานสิบหกของซอร์สโค้ดจะมีค่า0Aสำหรับไบต์นั้น code.cside.com/3rdpage/us/newLine.html
mbomb007

1
@IsmaelMiguel ไม่จริง เมื่อคุณพิมพ์รหัสคุณกดปุ่ม Enter เพื่อขึ้นบรรทัดใหม่ \nโดยทั่วไปจะนับเป็น 2 ตัวอักษรและ 2 ไบต์ในรหัสของคุณ ฉันพิมพ์ด้วยวิธีนี้เพื่อให้สามารถอ่านได้เนื่องจากการจัดรูปแบบทำงานได้ไม่ดีสำหรับการแสดงบรรทัดว่างท้ายรหัสต้นฉบับของฉัน ดังนั้นฉันต้องระบุว่ามันเป็นหนึ่งไบต์ไม่ใช่สอง
mbomb007

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

2
@Dennis อาจเป็นเช่นนั้น แต่ฉันไม่สนใจ ฉันไม่เรียก/ว่า "Solidus" และฉันไม่รู้จักใครที่ทำ "Newline" เริ่มต้นด้วยnและนั่นคือตัวละครที่หลบหนีดังนั้นฉันจึงเรียกมันว่า อยู่ใกล้กับ "ตัวดึงข้อมูลบรรทัด" มากกว่าที่จะเป็น "การคืนสินค้า"
mbomb007

3

PowerShell, 143 ไบต์

$d='$d={0}{1}{0}{2}while(1){3}Write($d -f [char]39,$d,"`n",[char]123,[char]125){4}'
while(1){Write($d -f [char]39,$d,"`n",[char]123,[char]125)}

ตามออก Rosetta รหัส PowerShell ควินผมสวยมั่นใจนี้ไม่ได้เป็นที่สั้นที่สุด การจัดรูปแบบการแทนที่สตริงใน PowerShell นั้นเป็นเรื่องลำบากเพราะตัวคั่นเดียวกันสำหรับตำแหน่งที่จะนำการแทนที่นั้น{}ยังกำหนดขอบเขตของโค้ดบล็อกwhile{}ดังนั้นเราต้องใช้[char]การคัดเลือก


3

อันเดอร์, 25 ไบต์

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

(::a~*S:a~*^
)::a~*S:a~*^

1
@ mbomb007 เอาต์พุตต่อการวนซ้ำเป็นสองบรรทัดของโปรแกรม ฉันทดสอบที่นี่
MickyT

3

Befungeขนาด30 20 ไบต์

<,+55,*2+98_ #!,#:<"

ความแปรปรวนของควินิน befunge ยอดนิยมที่พิมพ์ขึ้นบรรทัดใหม่และปรากฏ -1 ในสแต็กถ้ามันจบบรรทัด
แต่น่าเสียดายที่ Befunge ได้รับ verbose เมื่อทำสิ่งต่าง ๆ ในบรรทัดเดียว ฉันพยายามลบ launchpads ทั้งหมด ( #) ที่ฉันทำได้ แต่บางอันต้องถูกข้ามไปเพื่อข้ามคำสั่งบางอย่าง (เช่น,)

การเปลี่ยนแปลง:

30-20 -> เปลี่ยน quine พื้นฐานเป็นแบบกำหนดเองที่ฉันทำซึ่งใช้อินพุตสตริง ด้วยวิธีนี้การแตกแขนงนั้นง่ายกว่ามาก

เก่า:

:0g,:93*`>0-10 #,+$#: #5 _1+>

ฉันไม่คิดว่ามันดีที่สุด แต่ตอนนี้ก็ยอมรับได้แล้ว


คุณสามารถใช้คำสั่ง get เพื่อคว้าพื้นที่และเพิ่ม 2 ลงไปสำหรับหนึ่งไบต์ที่สั้นกว่า98+2/: <, + 55, + 2g1_ #!, #: <"
MildlyMilquetoast

และผลักดันคำพูดและการขึ้นบรรทัดใหม่ก่อนและย้อนกลับเครื่องพิมพ์-1g0:+5<>:#,_1"
Jo King


2

R, 34 ไบต์

repeat{write(commandArgs()[5],'')}

เพื่อเรียกใช้จากบรรทัดคำสั่งดังต่อไปนี้:

Rscript -e "repeat{write(commandArgs()[5],'')}"

2

> <>, 31 29 ไบต์

ปรับเปลี่ยนที่เรียบง่ายของแบบดั้งเดิม> <> ควิน

"ar00gc0.0+efooooooooooooooo|

หากต้องการเรียกใช้วางที่นี่คลิก 'ส่ง' จากนั้นคลิก 'เริ่ม' (การทำงานที่ไม่มีภาพเคลื่อนไหวจะไม่ทำงาน) รู้สึกอิสระที่จะเพิ่มความเร็วในการดำเนินการ


"ar00gc0.0+feooooooooooooooo|สั้นกว่าสองไบต์
โคล

@ เสาขอบคุณ ฉันคิดเกี่ยวกับกระจก แต่ลืมที่จะเปลี่ยนมันหลังจากได้รับการติดตามด้านในความท้าทายที่แตกต่างกัน
mbomb007


@JoKing แล้วมี> <> ที่สั้นกว่าการแก้ปัญหา
mbomb007


2

GolfScript ขนาด 16 ไบต์

{.".do
":n\p}.do

นี้จบลงด้วยการมองมากเช่นมาร์ตินBüttnerของรายการ CJam คุณสมบัติที่น่าสนใจก็คือว่ามันจะเปิดออกทางที่สั้นที่สุดที่จะผนวกบล็อกเมื่อมันพิมพ์คือการกำหนดให้เทอร์มิบรรทัด".do" n(แน่นอนเรายังต้องรวมบรรทัดใหม่จริงในสายอักขระเพื่อแทนที่ด้วยnปกติ) สตริงเดียวกัน (เป็นความจริงใน GolfScript) ยังถูกทิ้งไว้บนสแต็กเพื่อให้doวงออกมาเพื่อให้แน่ใจว่าวง ทำงานตลอดไป


1

BASH, 76 ไบต์

ไม่สามารถต้านทานได้โดยเฉพาะกับ PowerShell ที่นี่ :)

while true;do
a ()
{
    echo while true\;do
    declare -f a
    echo a\;done
}
a;done

ช่องว่างมีความสำคัญสำหรับสำเนาที่ถูกต้อง


1

Javascript (ES6), 64

for(;;(_=>console.log(`for(;;(_=>${arguments.callee})());`))());

อีกทางเลือกหนึ่ง (เช่น 64)

a="for(;;)console.log(`a=${JSON.stringify(a)};eval(a)`)";eval(a)

ทางเลือกอื่นจะไม่ทำให้เกิดการล้นสแต็คหรือไม่?
Patrick Roberts

ไม่ไม่มีการเรียกซ้ำดังนั้นจึงไม่ควรเพิ่มสิ่งใดบนสแต็ก
DankMemes

เอาล่ะฉันเพิ่งทดสอบทั้งสองอย่างคุณถูกต้องเกี่ยวกับทางเลือกอื่น แต่วิธีแรกของคุณล้มเหลวและฉันคิดว่าทำไม ตามเอกสารประกอบ MDN เกี่ยวกับฟังก์ชั่นลูกศร "ฟังก์ชั่นลูกศรไม่เปิดเผยวัตถุที่ขัดแย้งกับรหัสของพวกเขา" ดังนั้นคุณarguments.calleeไม่ได้อยู่และโยนข้อผิดพลาด
Patrick Roberts

น่าสนใจ สำหรับฉันใน Firefox Developer Edition 42.0a2 (2015-09-13) ทั้งคู่ทำงานได้ ฉันเดาว่าเมื่อมาตรฐานถูกนำมาใช้อย่างสมบูรณ์คนแรกจะหยุดทำงาน
DankMemes

ฉันทดสอบพวกเขาบนโครเมียมล่าสุดตั้งแต่ฉันพยายามตีกอล์ฟวิธีแก้ปัญหาแรกของคุณด้วย!การใส่วงเล็บและใส่ฟังก์ชั่นการทำงานหลังจากการวนรอบเพื่อหลีกเลี่ยงความจำเป็นที่จะต้องใช้เซมิโคลอนลูปซึ่งจะช่วยได้ (ฉันคิดว่า) 4 ไบต์
Patrick Roberts

1

ไมโครสโคปขนาด 22 ไบต์

"f1{CqxCanx"f1{CqxCanx

ขึ้นอยู่กับควินจากบทความ Esolangs "fCqxah"fCqxahนี้: ใช้ประโยชน์จากความจริงที่ว่าภาษาอัตโนมัติผนวกวงเล็บปีกกาปิดตามความจำเป็นโดยไม่ต้องซึ่งจะเป็นสองไบต์อีกต่อไป


1

รุ่นที่ 10 (+4 สำหรับความยาวชื่อไฟล์)

ไม่แน่ใจว่าสิ่งนี้มีคุณสมบัติด้วยเหตุผลสองประการ:

  • ในทางเทคนิคอาจมีหรือไม่มีผลข้างเคียงที่เป็นข้อความจากเชลล์คำสั่ง Windows เนื่องจากขึ้นอยู่กับวิธีการกำหนดค่า
  • โปรแกรมนี้เรียกใช้ตัวเองด้วยชื่อและฉันไม่แน่ใจว่าเป็นสิ่งต้องห้ามตามกฎ (โดยเฉพาะกฎ "ไม่มีการเปิดไฟล์โปรแกรม") มันไม่ได้เปิดตัวเองเพื่อจุดประสงค์ในการอ่านและพิมพ์ข้อความ มันเป็นเพียงแค่เรียกใช้ตัวเองอีกครั้ง นอกจากนี้โครงสร้างระบบไฟล์เป็นส่วนสำคัญของสคริปต์แบทช์โรงเรียนเก่า (บ่อยครั้งที่มีการใช้เพื่อเก็บสถานะโปรแกรม ฯลฯ ) เช่นนี้ฉันไม่แน่ใจว่าสิ่งนี้ละเมิดกฎข้อที่ 5 หรือไม่

รหัส (สำหรับโปรแกรมชื่อ q.bat):

echo on&&q

2
ฉันจะได้รับอนุญาตเพราะมันไม่สั้นและสร้างสรรค์และมีเอกลักษณ์ และมันก็ไม่ได้อ่านซอร์สโค้ด แต่กลับดำเนินการเอง
mbomb007

1
อย่างน้อยที่สุดคุณควรเพิ่มชื่อไฟล์ไปยังจำนวนไบต์
Martin Ender

1
ฉันเชื่อว่าคุณสามารถใช้ได้echo on&&%0แม้ว่าฉันกลัวที่จะลอง
DankMemes

1
อัปเดต: echo on&&%0ไม่ทำงาน %0จะปรากฏเป็นขยายในผลลัพธ์และ windows (7, 32 บิตทำงานใน VM) ยุติสิ่งทั้งหมดได้อย่างรวดเร็ว
DankMemes

1
ฉันคิดว่าคุณสามารถละเว้น.batส่วนได้
SuperJedi224

1

Ceylon , 210 208 ไบต์

แน่นอนว่านี่จะไม่ชนะอะไรเลย ...

shared void u(){value q="\"\"\"";value t="""shared void u(){value q="\"\"\"";value t=""";value b="""while(1<2){print(t+q+t+q+";value b="+q+b+q+";"+b);}}""";while(1<2){print(t+q+t+q+";value b="+q+b+q+";"+b);}}

เดิม:

shared void u(){value q="\"\"\"";value t="""shared void u(){value q="\"\"\"";value t=""";value b="""while(true){print(t+q+t+q+";value b="+q+b+q+";"+b);}}""";while(true){print(t+q+t+q+";value b="+q+b+q+";"+b);}}

ฉันแก้ไขQuineของฉันจากสองวันที่ผ่านมาโดยเพิ่มการwhile(true){...}วนซ้ำดังนั้นฉันมาจาก 185 ไบต์ของ Quine ธรรมดาเป็น 210 (ฉันไม่ต้องการอักขระบรรทัดใหม่ที่ตามมาอีกต่อไป) แต่จากนั้นฉันก็พบว่าการwhile(1<2){...}วนซ้ำนั้นสั้นกว่าสองไบต์:

shared void u(){value q="\"\"\"";value t="""shared void u(){value q="\"\"\"";value t=""";value b="""while(1<2){print(t+q+t+q+";value b="+q+b+q+";"+b);}}""";while(1<2){print(t+q+t+q+";value b="+q+b+q+";"+b);}}

(Ceylon ไม่มีfor(;;)ลูปเหมือน Java และจำเป็นต้องใช้เครื่องมือจัดฟันสำหรับการวนซ้ำนี้)


1

PowerShell, 132 107 ไบต์

$a='$a={0}{1}{0};for(){2}$a-f[char]39,$a,[char]123,[char]125{3}';for(){$a-f[char]39,$a,[char]123,[char]125}

อ้างอิงจาก Rosetta Quine (เหมือนกับ @AdmBorkBork) แม้ว่าจะไม่ได้ใช้การจัดรูปแบบสำหรับการแทนที่สตริง ... อาจเปลี่ยนเป็นลูปสำหรับลูปและการใช้การจัดรูปแบบจะดีที่สุดหรือไม่

ฉันแน่ใจว่า AdmBorkBork กลับมาพวกเขาจะเอาชนะมันได้มาก: P

แก้ไขคิดออกสำหรับห่วงและการเปลี่ยนขอบคุณทุกคนที่บรรพบุรุษของฉัน :)

ความพยายามเก่า:

$a='$a=;for(){$a.substring(0,3)+[char]39+$a+[char]39+$a.substring(3)}';for(){$a.substring(0,3)+[char]39+$a+[char]39+$a.substring(3)}


1

Java 10, 194 ไบต์

interface M{static void main(String[]a){for(var s="interface M{static void main(String[]a){for(var s=%c%s%1$c;;)System.out.println(s.format(s,34,s));}}";;)System.out.println(s.format(s,34,s));}}

คำอธิบาย:

ลองออนไลน์ (หมดเวลาหลังจาก 60 วินาที)

interface M{                    // Class
  static void main(String[]a){  //  Mandatory main-method
    for(var s="interface M{static void main(String[]a){for(var s=%c%s%1$c;;)System.out.println(s.format(s,34,s));}}";
                                //   Unformatted source code
        ;)                      //   Loop indefinitely
       System.out.println(      //    Print with trailing new-line:
         s.format(s,34,s));}}   //     The formatted source code

:

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

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

  • for(;;) ใช้เพื่อวนซ้ำอย่างไม่มีกำหนด
  • System.out.println(...) ใช้เพื่อพิมพ์ด้วยการขึ้นบรรทัดใหม่





1

Brachylogขนาด 16 ไบต์

∋"∋~kgjẉ₁⊥"gjẉ₁⊥

คุณไม่สามารถลองออนไลน์ได้ แต่ฉันได้ตรวจสอบแล้วว่ามันใช้ได้กับการติดตั้งของฉัน

Brachylogขนาด 18 ไบต์

∋"∋~kgjw₁⊥~n"gjw₁⊥

ลองออนไลน์!

ดัดแปลงมาจากเวอร์ชั่นสำรองของควินินนี้ด้วยการแฮกย้อนรอยฉันได้คิดในเรื่องของทุกสิ่ง ใช้เวลาสองไบต์บน~nเพราะ(วิธีปกติสำหรับการพิมพ์ด้วยอักขระขึ้นบรรทัดใหม่) ฮิตปัญหาบางอย่างแปลกกับการเข้ารหัสตัวอักษรบน TIO และขึ้นบรรทัดใหม่ที่เกิดขึ้นจริงใส่เข้าไปในตัวอักษรสตริงที่ได้รับการพิมพ์ผ่านเป็น~k\n

               w      Print
 "∋~kgjw₁⊥~n"         "∋~kgjw₁⊥~n"
∋                     which is an element of
                      the (unused and unconstrained) input
                ₁     formatted
          ~n          (so that the ~n is replaced with a newline)
             gj       with itself
   ~k                 (so that the ~k is replaced with the string in quotes),
                 ⊥    then try again.

เนื่องจากw₁ใช้อินพุตเป็นรายการ[string to be formatted, formatting arguments]ให้ล้อมรอบสตริงในรายการพร้อมกับgเชื่อมต่อกับตัวเองพร้อมกับjอนุญาตให้ฟอร์แมตด้วยตัวเอง และเนื่องจากไม่มีการป้อนค่าให้กับโปรแกรมตัวแปรอินพุตซึ่งมีอยู่โดยปริยายที่จุดเริ่มต้นของโปรแกรมสามารถใช้กับค่าใด ๆ ดังนั้นจึงสามารถถูก จำกัด ให้เป็นหนึ่งในหลาย ๆ รายการซึ่งมี"∋~kgjw₁⊥~n"องค์ประกอบเป็นองค์ประกอบ ชี้ตัวเลือกที่จะย้อนกลับไปเมื่อหลังจากพิมพ์แหล่งที่มาโปรแกรมจะเข้าสู่



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