Khoảng thời gian dài nhất lặp đi lặp lại


10

Như chúng ta đã biết, quine là một chương trình xuất ra mã nguồn của chính nó. Tuy nhiên, cũng có thể viết một chương trình tạo ra một chương trình khác, chương trình khác, đưa ra chương trình đầu tiên một lần nữa. Ví dụ, chương trình Python 2

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

khi chạy, sẽ xuất văn bản sau:

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

Khi chạy dưới dạng chương trình Python, điều này sẽ xuất lại mã gốc. Điều này được gọi là một quine lặp . Bởi vì bạn phải chạy nó hai lần để lấy lại mã gốc, chúng tôi nói rằng nó có giai đoạn 2 . Nhưng tất nhiên, thời gian cao hơn nhiều là có thể.

Thách thức của bạn là viết một câu hỏi lặp đi lặp lại với khoảng thời gian dài nhất có thể, bằng 100 byte hoặc ít hơn , bằng ngôn ngữ bạn chọn. (Lưu ý rằng ví dụ của tôi ở trên không phù hợp với thông số kỹ thuật này, vì nó là 119 byte, bao gồm cả dòng mới.)

Xin lưu ý các quy tắc và làm rõ sau đây:

  • Các quy tắc quine thông thường được áp dụng, tức là chương trình của bạn không thể sử dụng các tính năng ngôn ngữ cho phép nó truy cập trực tiếp vào mã nguồn của chính nó.
  • Các đầu ra được lặp đi lặp lại cuối cùng phải quay lại chính xác mã ban đầu của bạn và bạn phải bao gồm một minh chứng hoặc bằng chứng rằng nó sẽ.
  • Bạn cũng phải bao gồm một lời giải thích về lý do tại sao chu kỳ miễn là bạn nói nó là. Điều này không nhất thiết phải ở cấp độ của một bằng chứng toán học, nhưng nó phải có sức thuyết phục đối với người quen thuộc với ngôn ngữ của bạn. (Quy tắc này có ở đây vì tôi mong đợi một số câu trả lời liên quan đến những con số rất lớn.)
  • Thật tốt khi nói điều gì đó như "ít nhất 1.000.000 lần lặp" thay vì đưa ra con số chính xác, miễn là bạn có thể chứng minh rằng nó ít nhất là lâu như vậy. Trong trường hợp này, điểm của bạn sẽ là 1.000.000. Nếu không, điểm số của bạn là khoảng thời gian của bạn.
  • Giới hạn 100 byte chỉ áp dụng cho chương trình ban đầu của bạn - các chương trình mà nó tạo ra có thể dài hơn, mặc dù tất nhiên cuối cùng họ sẽ phải quay lại xuống 100 byte để xuất mã gốc của bạn.
  • Bạn có thể giả sử máy của bạn có RAM vô hạn và thời gian chạy vô hạn, nhưng bạn không thể giả sử các loại dữ liệu chính xác không giới hạn (như số nguyên) nếu ngôn ngữ của bạn không có chúng. Bạn có thể cho rằng không có giới hạn về độ dài đầu vào mà trình phân tích cú pháp của bạn có thể xử lý.
  • Điểm cao nhất sẽ thắng.

Xin lưu ý: có một thách thức hiện tại được gọi là Quit Whining; Bắt đầu Quining cũng liên quan đến lặp đi lặp lại. Tuy nhiên, ngoài việc dựa trên cùng một khái niệm, đây là những loại thử thách hoàn toàn khác nhau. Một cái khác là mã golf thẳng, trong khi cái này là (cố ý!) Thực sự là một vấn đề hải ly bận rộn trong ngụy trang. Các kỹ thuật cần thiết để tạo ra một câu trả lời tốt cho câu hỏi này có thể rất khác so với những gì cần thiết để trả lời câu hỏi khác, và điều này rất nhiều bởi thiết kế.


1
@LeakyNun Tôi không biết đó là bạn hay một mod đã xóa câu trả lời của bạn, nhưng có lẽ nếu tôi giải thích điều gì sai với nó, bạn sẽ hiểu tại sao đây không phải là bản sao. Câu hỏi này chỉ định giới hạn 100 byte cho độ dài nguồn, vì vậy bạn thực sự không thể "cao như bạn muốn" bằng phương pháp đó. Đó là toàn bộ vấn đề của câu hỏi này. Để trả lời, những gì bạn sẽ phải làm là đăng phiên bản dài nhất phù hợp với 100 ký tự và cho biết thời gian của nó là bao nhiêu. Những gì bạn đăng sẽ là một nỗ lực đầu tiên tốt nhưng rất khó có thể là người chiến thắng.
Nathaniel

1
@Dave thách thức chính xác là về việc chỉ định một số lượng lớn trong một số lượng nhỏ byte, vâng. Đó là toàn bộ nguyên tắc xung quanh nó được thiết kế. Câu hỏi đặt ra là 3 ^^ ^ 3 là số cao nhất bạn có thể chỉ định bằng 100 byte trong ngôn ngữ của mình hay có số nào lớn hơn không? Đó là những gì thử thách này là về. Đó là cốt lõi của nó. Đó là những gì tôi muốn thấy mọi người làm. Đó là siêu, siêu bực bội khi đóng nó dựa trên sự giống nhau hời hợt với một thách thức không có gì của cấu trúc này.
Nathaniel

1
@Dave (nhận xét thứ hai) nhưng nếu bạn thông minh, bạn không cần bị giới hạn bởi độ chính xác của máy. Tôi mong đợi các câu trả lời cạnh tranh sẽ có một khoảng thời gian dài hơn 2 ^ (2 ^ 64).
Nathaniel

3
Vì vậy, bạn có muốn nó được đóng lại dưới dạng bản sao của codegolf.stackexchange.com/q/18028/194 không?
Peter Taylor

1
@PeterTaylor đó là một chủ đề gần gũi hơn nhiều, nhưng nó vẫn là một thách thức rất khác - in một số khá khác so với làm một việc gì đó nhiều lần. Tất nhiên tôi muốn nó không bị đóng cửa chút nào.
Nathaniel

Câu trả lời:


10

PHP, kỳ 2.100.000.000

Ai có thể nghĩ rằng điều này là có thể trong PHP?! :-)

Đây thực sự là câu hỏi đầu tiên của tôi và nó dài 99 byte:

<?$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);

Mặc dù PHP hỗ trợ số lượng lớn hơn 2 * 10^8bằng cách chuyển từ integersang double, gia số không còn hoạt động (dẫn đến một vòng lặp vô hạn) và tôi không tìm thấy giải pháp nào phù hợp với 100 byte. Chưa.

Bằng chứng khá đơn giản, vì nó chỉ tính trên mỗi lần lặp cho đến khi đạt đến điểm đặt lại ở mức 2,1 tỷ.

Tín dụng cho dave , người đã đăng cách tiếp cận bằng mã giả trong các bình luận và cho Bob Twells , từ đó tôi đã sao chép mã cho một câu hỏi tối thiểu về PHP.

Chương trình thử nghiệm (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;
    }
}

Chà, ít nhất tôi là người đầu tiên trả lời.


1
Lưu ý phụ: Đây là theo thứ tự ~ 10 ^ 9.322219295.
LegionMammal978

8

Toán học, kỳ 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!]]

Lưu ý rằng điểm số được mô tả trong ký hiệu Hyper-E . Lặp lại thay thế cuối cùng Nest[#!,9,9^9^99!]với các phần mở rộng thập phân của Nest[#!,9,9^9^99!]- 1, Nest[#!,9,9^9^99!]- 2, Nest[#!,9,9^9^99!]- 3, ..., 3, 2, 1 và quay lại Nest[#!,9,9^9^99!].


giai thừa sẽ phát triển nhanh hơn?
Maltysen

1
Tôi không biết Mathicala, nhưng đây không phải là vi phạm các quy tắc đối với một câu hỏi - đọc mã nguồn của chính nó? ToString[#0, InputForm]
daniero

vì vậy, chỉ cần 9 !!!! không làm việc idk cuz tôi không có toán học rpi của tôi với tôi ngay bây giờ.
Maltysen

@Maltysen Điều đó tính toán nhân tử kép của giai thừa kép của chín, hoặc (9 !!) !! 2.116870635 · 10¹²⁰²
LegionMammal978

@daniero Ý tôi là, ý tưởng này tương tự như một chiếc CJam tiêu chuẩn {"_~"}_~, vì vậy tôi đoán rằng nó phải hợp lệ ...
LegionMammal978

5

R, khoảng thời gian ngẫu nhiên với kỳ vọng 2 ^ 19936-0,5

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

Trình tạo số ngẫu nhiên mặc định của R có chu kỳ 2 ^ 19937-1 và phân phối theo 623 chiều liên tiếp. Do đó, một nơi nào đó (nhưng chỉ một lần) trong thời kỳ của nó sẽ là một vectơ dài 623. Khi chúng tôi đến đó (và được căn chỉnh với phần bắt đầu của chuỗi), tổng của 623 số U [0,1] ngẫu nhiên tiếp theo sẽ bằng không và chúng tôi trở lại chương trình ban đầu của mình.

Lưu ý rằng chương trình sẽ có xác suất rất cao đi qua cùng một trạng thái khác không vài lần trước khi trở về không. Ví dụ, tổng số 311,5 là có khả năng nhất và có rất nhiều cách có thể xảy ra, nhưng RNG cho phép khoảng thời gian 0 dài hơn khoảng thời gian cho 311,5.


Không chắc chắn số điểm bạn muốn chỉ định mục này: P
JDL

1
Theo các quy tắc: "Sẽ tốt khi nói điều gì đó như" ít nhất 1.000.000 lần lặp "thay vì đưa ra con số chính xác" Vì vậy, theo tôi, đó là "ít nhất 1 lần lặp lại" bởi vì nếu chúng ta gặp may mắn ngay lần thử đầu tiên ...;)
YetiCGN

Không giống như nhiều sơ hở tiêu chuẩn như trên Tôi có thể tạo ra một số đầu vào ngẫu nhiên, câu trả lời là có, đây là một bằng chứng thực sự gọn gàng cho thấy câu trả lời chính xác chắc chắn sẽ xảy ra và một ước tính rất tốt được đưa ra. Đẹp!
Andreï Kostyrka

1
Khi chương trình trở về trạng thái cơ bản một lần, thì nó sẽ có khoảng thời gian không ngẫu nhiên chính xác là 2 ^ 19937-1.
JDL

Đầu ra của điều này không phù hợp với chương trình thực tế (thiếu một chút khoảng trắng). Ngoài ra, trạng thái sẽ không được bảo toàn giữa các cuộc gọi chương trình, vì vậy khoảng thời gian sẽ không phải là một con số chính xác, cũng sẽ không nhất quán
Jo King

1

JavaScript, giai đoạn 9,007,199,254,700,000

Sẽ không chiến thắng, nhưng thật vui khi làm việc với JavaScript về thử thách này:

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

Theo chu kỳ sau:

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

Lưu ý: Bạn có thể làm cho nó ngắn hơn 18 byte, trong khi chỉ xóa ~ 0,08% số điểm, như vậy:

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

1

C, kỳ 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);}

Dựa trên câu trả lời PHP (rõ ràng). Sẽ cập nhật với lời giải thích khi tôi có thời gian.


1

C (gcc) , 66 byte, giai đoạn 2 ^ 64

f(s){printf(s="f(s){printf(s=%c%s%1$c,34,s,%lu+1L);}",34,s,0+1L);}

Hãy thử trực tuyến!

2 ^ 64 số có sẵn trong một unsigned longsố nguyên. Do đó, khoảng thời gian 2 ^ 64.


1

Con trăn 2

9((99↑↑(9((99↑↑(9((99↑↑(9↑↑5-1))9)-1))9)-1))9)+1

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

Hãy thử trực tuyến!

Trong mã, các b=0thay đổi b=1sau đó b=2và cứ thế cho đến khi nó đạt đến b=decimal expansion of the periodrồi đặt lạib=0


1
9**9**9**9**9**9**9**9**9**9**9**9**9**9**9**9**9**9cao hơn nhiều so 9**9**99**99**99**99**99**99**99**99**99**99**99**99. Điều đó nói rằng, bạn có thể làm một cái gì đó như eval('9**9'*eval('9**9'*eval('9**9'*9**9**9**9**9)))cho số lượng lớn hơn nhiều.
Bong bóng

Peroid có nghĩa là gì?
SS Anne

@SSAnne nó được viết bằng ký hiệu mũi tên lên của Knuth
Mukundan

1
@Mukundan Tôi nghĩ bạn có thể có nghĩa là thời gian nhưng tôi không chắc chắn. Tôi hiểu tetination là gì.
SS Anne

@SSAnne xin lỗi, đây là một lỗi đánh máy, cảm ơn vì đã chỉ ra
Mukundan

0

Gol> <> , 70 byte, thời gian 325883196621297064957600206175719056476804879488288708188003274919860959534770101079512433396348062803055739640225395758790852315876868469390603793729639715908136196505908165227136154287969475839017544811926036808089596209081885772040898530121921794489026069641113281250

Thông thái khác được gọi là thực sự lớn (3.25E270)

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

Đây thực sự là phiên bản thay đổi của câu trả lời tôi đặt trên trình lặp 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

Hy vọng tôi đã ghi điểm đúng, và không có lỗi. Không có cách thực sự để tính giá trị này, đó là lý thuyết. Nhưng bạn ơi, đó là một con số khổng lồ !!!

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.