ระยะเวลาที่ยาวที่สุดวนซ้ำควินๆ


10

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

x = '''x = {}
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3'''
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3

จะเมื่อส่งออกข้อความต่อไปนี้:

print """x = '''x = {}
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3'''
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3"""

เมื่อรันเป็นโปรแกรม Python จะเป็นการส่งออกรหัสต้นฉบับอีกครั้ง นี้เรียกว่าควิน iterating เพราะคุณต้องใช้มันสองครั้งที่จะได้รับกลับมารหัสเดิมเราบอกว่ามันมีระยะเวลา 2 แต่แน่นอนช่วงเวลาที่สูงขึ้นเป็นไปได้มาก

ความท้าทายของคุณคือการเขียนควินวนซ้ำโดยใช้ระยะเวลานานที่สุดเท่าที่จะทำได้ใน100 ไบต์หรือน้อยกว่าในภาษาที่คุณเลือก (โปรดทราบว่าตัวอย่างของฉันด้านบนไม่ตรงกับข้อกำหนดนี้เนื่องจากมีขนาด 119 ไบต์รวมถึงการขึ้นบรรทัดใหม่)

โปรดทราบกฎและคำชี้แจงต่อไปนี้:

  • ใช้กฎ quine ปกติเช่นโปรแกรมของคุณไม่สามารถใช้คุณสมบัติภาษาที่อนุญาตให้เข้าถึงซอร์สโค้ดของตัวเองได้โดยตรง
  • เอาท์พุทซ้ำแล้วซ้ำอีกจะต้องวนกลับไปที่รหัสเดิมของคุณและคุณจะต้องมีการสาธิตหรือพิสูจน์ว่ามันจะ
  • คุณต้องรวมคำอธิบายว่าทำไมรอบจึงยาวเท่าที่คุณพูด สิ่งนี้ไม่จำเป็นต้องอยู่ในระดับการพิสูจน์ทางคณิตศาสตร์ แต่ควรโน้มน้าวใจคนที่คุ้นเคยกับภาษาของคุณ (กฎนี้อยู่ที่นี่เพราะฉันคาดหวังคำตอบบางคำให้มีจำนวนมากมาก)
  • มันเป็นการดีที่จะพูดอะไรบางอย่างเช่น "การวนซ้ำอย่างน้อย 1,000,000 ครั้ง" แทนที่จะให้จำนวนที่แน่นอนตราบใดที่คุณสามารถพิสูจน์ได้ว่ามันมีความยาวอย่างน้อย ในกรณีนี้คะแนนของคุณจะเป็น 1,000,000 มิฉะนั้นคะแนนของคุณคือระยะเวลาที่ควินินของคุณ
  • ขีด จำกัด 100 ไบต์จะใช้กับโปรแกรมเริ่มต้นของคุณเท่านั้น - โปรแกรมที่เอาต์พุตสามารถมีความยาวได้มากกว่า แต่แน่นอนว่าในที่สุดพวกเขาจะต้องกลับลงมาที่ 100 ไบต์เพื่อเอาท์พุทโค้ดต้นฉบับของคุณ
  • คุณสามารถสมมติว่าเครื่องของคุณมี RAM ที่ไม่มีที่สิ้นสุดและรันไทม์ที่ไม่มีที่สิ้นสุด แต่คุณไม่สามารถสมมติประเภทข้อมูลที่มีความแม่นยำไม่ จำกัด (เช่นจำนวนเต็ม) หากภาษาของคุณไม่มี คุณสามารถสมมติว่าไม่มีการจำกัดความยาวของอินพุต parser ที่คุณสามารถจัดการได้
  • คะแนนสูงสุดชนะ

โปรดทราบ: มีความท้าทายที่เรียกว่าQuit Whining; เริ่ม Quiningที่เกี่ยวข้องกับการวนซ้ำแล้วซ้ำอีก อย่างไรก็ตามนอกเหนือจากการใช้แนวคิดเดียวกันสิ่งเหล่านี้เป็นความท้าทายที่แตกต่างกันโดยสิ้นเชิง ส่วนอีกอันหนึ่งเป็นรหัสกอล์ฟในขณะที่อันนี้ (โดยเจตนา!) เป็นปัญหาของบีเวอร์ที่ยุ่งในการปลอมตัว เทคนิคที่จำเป็นในการสร้างคำตอบที่ดีสำหรับคำถามนี้น่าจะแตกต่างจากสิ่งที่จำเป็นในการตอบคำถามอื่น ๆ และนี่เป็นอย่างมากจากการออกแบบ


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

1
@Dave ความท้าทายเป็นเรื่องเกี่ยวกับการระบุจำนวนมากในจำนวนไบต์น้อยใช่ นั่นคือหลักการทั้งหมดที่ถูกออกแบบมา คำถามคือ 3 ^^^ 3 จำนวนสูงสุดที่คุณสามารถระบุใน 100 ไบต์ในภาษาของคุณหรือมีขนาดใหญ่กว่า? นั่นคือความท้าทายนี้เกี่ยวกับ มันคือแก่นแท้ของมัน มันเป็นสิ่งที่ฉันต้องการเห็นผู้คนทำ มันสุดยอดมากและน่าผิดหวังที่ได้ปิดตัวลงโดยดูคล้ายกับความท้าทายที่ไม่มีอะไรในโครงสร้างนี้
นาธาเนียล

1
@Dave (ความคิดเห็นที่สอง) แต่ถ้าคุณฉลาดคุณไม่จำเป็นต้องถูก จำกัด ด้วยความแม่นยำของเครื่องจักรเลย ฉันคาดหวังคำตอบที่แข่งขันได้จะมีระยะเวลานานกว่า 2 ^ (2 ^ 64)
นาธาเนียล

3
ดังนั้นคุณต้องการให้ปิดเหมือนสำเนาcodegolf.stackexchange.com/q/18028/194หรือไม่
Peter Taylor

1
@PeterTaylor เป็นธีมที่ใกล้เคียงกันมาก แต่ก็ยังคงเป็นความท้าทายที่แตกต่างกันมาก - การพิมพ์ตัวเลขนั้นค่อนข้างแตกต่างจากการทำอะไรหลาย ๆ ครั้ง แน่นอนว่าฉันไม่ชอบที่จะปิดเลย
นาธาเนียล

คำตอบ:


10

PHP, รอบระยะเวลา 2,100,000,000

ใครจะคิดว่าเป็นไปได้ใน PHP? :-)

นี่เป็นจริงครั้งแรกของฉัน quine และมันยาว 99 ไบต์:

<?$i=1;$i*=21e8>$i;printf($a='<?$i=%d;$i*=21e8>$i;printf($a=%c%s%c,++$i,39,$a,39);',++$i,39,$a,39);

แม้ว่า PHP สนับสนุนหมายเลขที่ใหญ่กว่า2 * 10^8โดยการเปลี่ยนจากintegerการdouble, เพิ่มขึ้นไม่ทำงาน (นำไปสู่วง จำกัด ) และฉันไม่ได้พบวิธีอื่นซึ่งควรเป็น 100 ไบต์ ยัง

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

เครดิตdaveที่โพสต์วิธีการในรหัสหลอกในการแสดงความคิดเห็นและให้กับบ๊อบ Twellsจากที่ผมคัดลอกรหัสสำหรับ PHP ควินน้อยที่สุด

โปรแกรมทดสอบ (sloooooow):

<?php
$o = file_get_contents('quine.php');
for ($i = 0; $i < 22e8; $i++) {
    if ($i%2==0) exec('php q > p'); else exec('php p > q');
    $a = file_get_contents(($i%2==0) ? 'p' : 'q');
    echo "\r" . str_pad($i,6,' ') . ":\t$a";
    if ($a == $o) {
        die;
    }
}

อย่างน้อยฉันก็เป็นคนแรกที่ตอบ


1
หมายเหตุ: นี่คือคำสั่งของ ~ 10 ^ 9.322219295
LegionMammal978

8

Mathematica, period E8.5678 # 3 E2.1923 # 4 ~ E6.2695 # 3 # 2

Print[ToString[#0, InputForm], "[", #1 - 1 /. 0 -> "Nest[#!,9,9^9^99!]", "]"] & [Nest[#!,9,9^9^99!]]

โปรดทราบว่าคะแนนจะถูกอธิบายไว้ในHyper-E สัญกรณ์ การวนซ้ำจะแทนที่ค่าสุดท้ายNest[#!,9,9^9^99!]ด้วยการขยายทศนิยมเป็นNest[#!,9,9^9^99!]- 1, Nest[#!,9,9^9^99!]- 2, Nest[#!,9,9^9^99!]- 3, ... , 3, 2, 1 และกลับไปNest[#!,9,9^9^99!]เป็น


แฟ็กทอเรียลจะไม่เติบโตเร็วขึ้นหรือ
Maltysen

1
ฉันไม่รู้จัก Mathematica แต่นี่ไม่ใช่การละเมิดกฎสำหรับการควิน - อ่านซอร์สโค้ดของตัวเองหรือ ToString[#0, InputForm]
daniero

ดังนั้นแค่ 9 !!!! ไม่ทำงานใช่ไหม idk cuz ฉันไม่มี mathematica rpi กับฉันตอนนี้
Maltysen

@ Maltysen ที่คำนวณค่าแฟคทอเรียลสองเท่าของแฟคทอเรียลคู่ของเก้าหรือ (9 !!) !! ≈ 2.116870635 ·10¹²⁰²
LegionMammal978

@daniero ฉันหมายถึงความคิดคล้ายกับ CJam มาตรฐาน{"_~"}_~ดังนั้นฉันเดาว่ามันควรจะถูกต้อง ...
LegionMammal978

5

R ระยะเวลาสุ่มด้วยความคาดหวัง 2 ^ 19936-0.5

f=function(){
    options(scipen=50)
    body(f)[[4]]<<-sum(runif(623))
    0
    cat("f=")
    print(f)
}

ตัวสร้างตัวเลขสุ่มเริ่มต้นของ R มีระยะเวลา 2 ^ 19937-1 และมี equidistribution ในมิติต่อเนื่อง 623 รายการ ดังนั้นบางแห่ง (แต่เพียงครั้งเดียว) ในช่วงเวลานั้นจะเป็นเวกเตอร์ของศูนย์ 623 อัน เมื่อเราไปถึงที่นั่น (และสอดคล้องกับจุดเริ่มต้นของลำดับ) ผลรวมของตัวเลขสุ่ม 623 ถัดไปของ U [0,1] จะเป็นศูนย์และเรากลับไปที่โปรแกรมดั้งเดิมของเรา

โปรดทราบว่าโปรแกรมที่มีความน่าจะเป็นสูงมากจะผ่านสถานะที่ไม่เป็นศูนย์เดียวกันหลาย ๆ ครั้งก่อนกลับสู่ศูนย์ ตัวอย่างเช่นผลรวม 311.5 เป็นไปได้มากที่สุดและมีหลายวิธีที่สามารถเกิดขึ้นได้ แต่ RNG อนุญาตให้ช่วงเวลาเป็น 0 นานกว่าช่วงเวลา 311.5


ไม่แน่ใจว่าคุณต้องการมอบหมายรายการนี้ให้คะแนนใด: P
JDL

1
ตามกฎ: "มันดีที่จะพูดบางอย่างเช่น" อย่างน้อย 1,000,000 ซ้ำ "แทนที่จะให้จำนวนที่แน่นอน" ดังนั้นในความคิดของฉันมัน "อย่างน้อย 1 ซ้ำ" เพราะถ้าเราโชคดี reeeally ในครั้งแรกลอง ... ;)
YetiCGN

แตกต่างจากช่องโหว่มาตรฐานหลายอย่างเช่น“ ฉันอาจสร้างอินพุตสุ่มคำตอบอยู่ตรงนั้น” นี่เป็นข้อพิสูจน์ที่เรียบร้อยจริงๆว่าคำตอบที่แม่นยำนั้นเกิดขึ้นและให้การประมาณที่ดีมาก ดี!
Andreï Kostyrka

1
เมื่อโปรแกรมกลับสู่สถานะพื้นฐานหนึ่งครั้งโปรแกรมจะมีช่วงเวลาที่ไม่สุ่มเท่ากับ 2 ^ 19937-1
JDL

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

1

JavaScript, ระยะเวลา 9,007,199,254,700,000

จะไม่ชนะ แต่มันสนุกมากที่ได้ทำงานร่วมกับ JavaScript ในความท้าทายนี้:

a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),1-1||90071992547e5)

ทำตามรอบต่อไปนี้:

a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),1-1||90071992547e5)
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),9007199254700000-1||90071992547e5)
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),9007199254699999-1||90071992547e5)
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),9007199254699998-1||90071992547e5)
// etc...
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),3-1||90071992547e5)
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),2-1||90071992547e5)
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),1-1||90071992547e5)
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),9007199254700000-1||90071992547e5)
// and so on

หมายเหตุ: คุณสามารถทำให้สั้นลงได้ 18 ไบต์ในขณะที่ลบคะแนนเพียง 0.08% เท่านั้นเช่น:

a="a=%s;console.log(a,uneval(a),%.0f-1||9e15)";console.log(a,uneval(a),1-1||9e15)

1

C งวด 2,100,000,000

unsigned long long i;main(a){i=1;i*=21e8>i;printf(a="ungisned long long i;main(a){i=%d;i*=21e8>i;printf(a=%c%s%2$c,++i,34,a);}",++i,34,a);}

อ้างอิงจากคำตอบ PHP (ชัด) จะอัปเดตพร้อมคำอธิบายเมื่อฉันมีเวลา



1

Python 2

ระยะเวลา: 9((99↑↑(9((99↑↑(9((99↑↑(9↑↑51))9)1))9)1))9)+1

ขอบคุณ @Bubbler สำหรับการเพิ่มระยะเวลาจาก 99(99↑↑12)+1 ถึงตอนนี้

b=0;s="print'b=%d;s=%r;exec s'%(-~b%eval('9**9'*eval('9**9'*eval('9**9'*9**9**9**9**9))),s)";exec s

ลองออนไลน์!

ในรหัสการb=0เปลี่ยนแปลงb=1แล้วb=2เป็นต้นไปจนกว่าจะถึงb=decimal expansion of the periodแล้วรีเซ็ตกลับเป็นb=0


1
9**9**9**9**9**9**9**9**9**9**9**9**9**9**9**9**9**9สูงกว่า9**9**99**99**99**99**99**99**99**99**99**99**99**99มาก ที่กล่าวว่าคุณสามารถทำสิ่งที่ต้องการeval('9**9'*eval('9**9'*eval('9**9'*9**9**9**9**9)))จำนวนมากขึ้น
Bubbler

Peroid หมายถึงอะไร
SS Anne


1
@ Mukundan ฉันคิดว่าคุณอาจหมายถึงช่วงเวลา แต่ฉันไม่แน่ใจ ฉันเข้าใจว่าการเตตไลต์คืออะไร
SS Anne

@SSAnne ขออภัยมันเป็นคำที่พิมพ์ผิดขอบคุณสำหรับการชี้ให้เห็น
Mukundan

0

Gol> <> 70 ไบต์ระยะเวลา 325883196621297064957600206175719056476804879488288708188003274919860959534770101079512433396348062803055739640225395758790852315876868469390603793729639715908136196505908165227136154287969475839017544811926036808089596209081885772040898530121921794489026069641113281250

ฉลาดอื่น ๆ ที่รู้จักกันว่าใหญ่จริงๆ (3.25E270)

":1=l8:*6+=S&Q~:'~'=Q~~'H#'||lPffXfX=?1:1=Q$~$~|:1)lPffXfX(Q?:|r2ssH##

นี่เป็นคำตอบที่ฉันใส่ลงใน iterator ขนาด 500 byte

":1=l8:*6+=S&Q~:'~'=Q~~'H#'||//if last is equal to 1 and length is 71, delete the delete char, if the last char is '~', delete and push 'H#', which will later return to 'H##', completing the cycle!
lPffXfX=?1:1=Q$~$~|          //if length is equal to 15^15^15, then start delete process(append ascii one)
:1)lPffXfX(Q?:|              //if the last character is not 1 (the delete checker), and length is less than 15^15^15, duplicate the last value and append
r2ssH##                      //push the " to the front and output the whole thing

หวังว่าฉันจะได้คะแนนถูกต้องและไม่มีข้อบกพร่อง ไม่มีวิธีจริงในการคำนวณค่านี้จริง ๆ แล้วมันเป็นทฤษฎี แต่มนุษย์นั่นเป็นจำนวนมาก !!!

ลองออนไลน์!

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