Viết khoảng thời gian dài nhất lặp đi lặp lại giới hạn bởi 500 byte


16

Công việc của bạn là tạo ra khoảng thời gian lặp dài nhất , trong đó độ dài của mỗi chương trình trong chuỗi được giới hạn bởi 500 byte.

Đó là, nếu bạn lặp lại các bước sau:

  1. Bắt đầu với chương trình ban đầu của bạn
  2. Chạy chương trình hiện tại
  3. Quay trở lại bước 2

Cuối cùng bạn sẽ quay lại chương trình ban đầu của bạn. Số lượng chương trình trong chu kỳ là điểm số của bạn, mà bạn đang cố gắng tối đa hóa.

Không có chương trình nào có thể gây ra bất kỳ lỗi nào. Mỗi chương trình cũng phải được chạy theo cùng một cách (ví dụ: không có phiên bản, cách triển khai, tùy chọn trình biên dịch, nền tảng, v.v.) khác nhau (EDIT: Có, bất kỳ trạng thái bên ngoài nào như trình tạo số ngẫu nhiên giả được đưa vào cuối cùng câu lệnh. Trạng thái bên ngoài phải được "đặt lại" sau mỗi lần chạy. Nếu bạn sử dụng các số ngẫu nhiên thực sự, trường hợp xấu nhất được giả định.)

Điều tách biệt thách thức này với quine lặp lại trong khoảng thời gian dài nhất (ngoài 100 so với 500) là mọi chương trình trong chu trình cũng phải từ 500 byte trở xuống. Điều này có nghĩa là chu kỳ dài nhất có thể là (256 ^ 501 - 1) / 255 trở xuống. Tất nhiên đó là một con số lớn, nhưng không lớn về mặt tính toán cần bao nhiêu mã. Vì vậy, thách thức là về việc sử dụng càng nhiều khả năng (256 ^ 501 - 1) / 255 càng tốt, chứ không phải là một thử thách hải ly bận rộn.

Các chương trình không được phép truy cập mã nguồn của chính nó. Tuy nhiên, một chương trình trống được cho phép nếu bạn muốn (miễn là bạn tuân theo các quy tắc khác).

Vì việc kiểm tra các chương trình theo cách thủ công sẽ khó khăn, bạn có thể tìm ra điểm số bằng các phương pháp lý thuyết. Bạn phải bao gồm một lời giải thích về điểm số và tính chính xác với chương trình của bạn. Nếu bạn không thể tìm ra điểm số, thay vào đó, bạn có thể sử dụng giới hạn dưới của số lượng chương trình trong chu kỳ làm điểm số defacto. Bạn được phép cập nhật thông tin này khi bạn tìm thấy giới hạn dưới tốt hơn hoặc nếu bạn tìm thấy điểm thực tế chính xác.

Đây là , vì vậy điểm số cao nhất sẽ thắng!

EDIT: Bạn nên viết điểm của bạn trong ký hiệu khoa học, để câu trả lời dễ so sánh hơn. Hoàn toàn tốt khi có các hình thức khác của điểm số, đặc biệt là nếu chúng rõ ràng hơn được kết nối với chương trình của bạn. Ngoài ra, độc giả được khuyến khích chỉnh sửa các câu trả lời trước để tuân thủ điều này.


2
"chu kỳ dài nhất có thể là (256 ^ 501 - 1) / 255 hoặc ít hơn" --- điều này không nhất thiết đúng, chương trình có thể đi qua cùng một trạng thái nhiều lần trước khi quay lại bản gốc nếu nó thao tác với một đối tượng bên ngoài ( chẳng hạn như trạng thái RNG hoặc hạt giống)
JDL

2
@JDL nên trái với quy tắc, IMHO - nếu nó lưu trữ trạng thái ở nơi khác ngoài mã nguồn, thì đó không phải là một câu hỏi lặp đi lặp lại thích hợp.
Nathaniel

1
@Nathaniel Tôi sẽ không phân loại nó là trạng thái lưu trữ ở nơi khác, nó chỉ đơn giản là sử dụng các điểm nhập là một phần hợp lệ của ngôn ngữ lập trình mà nó triển khai. mã nguồn riêng của nó.
JDL

1
@JDL không, đó là những thứ khác nhau. Bất kỳ chương trình nào trong bất kỳ ngôn ngữ nào rõ ràng đều phải dựa vào những thứ được triển khai bên ngoài mã nguồn, nhưng trạng thái lưu trữ bên ngoài mã nguồn là khác nhau. Điều đó có nghĩa là đầu ra của chương trình không phải là một hàm xác định của mã nguồn của nó, mà thay vào đó phụ thuộc vào một số bối cảnh bên ngoài khác đã được thay đổi bởi các lần chạy trước. Điều đó không nên được cho phép trong một thách thức quine, IMHO và tuyên bố của OP về độ dài chu kỳ tối đa cho thấy rằng nó đã được dự định không được phép ở đây.
Nathaniel

3
@JDL như tôi chắc chắn bạn biết, trong một ngôn ngữ xác định, con trỏ lệnh chỉ lưu trữ trạng thái trong khi thực hiện chương trình, chứ không phải giữa các lệnh của nó. Ví dụ 5 trạng thái của bạn là không thể nếu đầu ra của chương trình là một hàm xác định của nguồn.
Nathaniel

Câu trả lời:


12

Perl 6 , 1263988,86×10835 lần lặp

$!=Q~~;<say "\$!=Q~{chrs(my@a=[R,] polymod :126[$!.ords]+1: 126 xx*)x?(@a-399)}~;<$_>~~.EVAL">~~.EVAL

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

Điều này lặp lại thông qua tất cả các kết hợp có thể có của 126 byte đầu tiên có độ dài 398 trở xuống (không bao gồm các chuỗi có byte NUL hàng đầu). Nếu bạn muốn thấy rằng nó thực sự trở lại lần lặp đầu tiên, bạn có thể giảm độ dài xuống 1 bằng cách thay đổi giới hạn như vậy .

Giải trình:

Mỗi lần lặp tăng chuỗi, được lưu trữ ở dạng cơ sở 126, và sau đó chuyển đổi nó trở lại cơ sở 126. Nó thực hiện điều này cho đến khi nó đạt đến một chuỗi có độ dài 399, và sau đó đặt lại chuỗi trở lại trống. Nếu bạn gặp khó khăn trong việc khái niệm số, thay vào đó hãy tưởng tượng nó bằng mười byte. Bắt đầu từ 0, tăng tối đa 4 chữ số 1000và đặt lại. Đây là 104-1 lần lặp (bao gồm 0hoặc chuỗi trống trong trường hợp chương trình của tôi).

$!=Q~~;         # Start with an empty string
< ... >~~.EVAL  # Set a string to $_ and EVAL it
  say "\$!=Q~{...}~;<$_>~~.EVAL"   # Print the program with the string replaced by
                       :126[$!.ords]   # The string converted from base 126
                                    +1 # Incremented
          [R,] polymod                : 126 xx*  # Back to base 126
chrs(                                )  # Back to a string
     my@a=                            x?(@a-399)  # Only if it isn't 399 characters

1
Ồ, bạn đã làm điều đó rất nhanh, tôi gần như đã hoàn thành với tôi, nhưng có lẽ tôi sẽ hoàn thành nó vào ngày mai (tôi sẽ ở Gol> <>)
KrystosTheOverlord

Tính toán này cho thấy rằng bạn vượt qua ước tính điểm số của bạn. Tử số là có bao nhiêu chuỗi có chiều dài 397 đang sử dụng 126 ký hiệu. (Tôi đã phải phân phối phân số thành tổng vì wolfram alpha có hành động kỳ lạ.)
PyRulez

@PyRulez Tôi nghĩ số của tôi là chính xác, vì về cơ bản, nó lặp lại một số cơ sở 126 lên tới 399 chữ số ... Tôi nghĩ rằng lời giải thích của tôi đã bị tắt
Jo King

@JoKing ah vâng, tôi nghĩ rằng lời giải thích là vấn đề. Bạn đã thay đổi 397 thành 398, điều này khiến cho điểm của bạn không còn được đánh giá quá cao. Bạn có thể đánh giá thấp nó (vì bạn chỉ bao gồm các chuỗi có độ dài chính xác 398 trong điểm số), nhưng điều đó tốt.
PyRulez

2

Bùa runic , 64654 106 ; 122 387 -1 2.638 × 10 807 lần lặp

"3X4+kSq'ƃZ,r{1?{1[:1Z%1+:a=+:d=+:3X4+=+:6X2+=+:'€(c*?~1-1kq}͍f1+0Bl1=6*?S1-Skql͗2=4*?{͍]}B͍l1=6*?kS1-Sq]}@

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

Thông báo: Hiển thị không chính xác, nó phải là `` (0x80).

Thay vì ngăn xếp, hãy sử dụng một chuỗi và các toán tử ngăn xếp được sửa đổi ͍để sửa đổi một chuỗi thay vì ngăn xếp (xem bản sửa đổi trước). Như vậy, mỗi char được giới hạn ở 1 byte (phạm vi 0-127, trừ các ký tự có vấn đề), nhưng với số lượng nhiều hơn 3 lần (do có ít xử lý soạn thảo hơn do không phải bỏ qua các ký tự kết hợp Unicode, như cũng như một số tiết kiệm byte khác) nó đạt được số lần lặp cao hơn.

Nếu mã hóa như một endian lớn thực sự được cho phép (nghĩa là có các giá trị byte trên 127 mà không xen kẽ các 0x00byte), điều này có thể đạt được các bước lặp 251 387 -1 ≈ 4.717 × 10 928 . Tuy nhiên, mã hóa tiếng Latin của TIO ngăn chặn điều này như được ghi nhận bởi Erik the Outgolfer trong câu trả lời Python 2 của anh ấy. Tôi sẽ cần phải kiểm tra nếu nó hoạt động tại địa phương trước khi yêu cầu điểm số này.

Có thể thay thế f1+0Bbằng '0B(có một dấu vết 0x16ở đó), nhưng nó đang chống lại tôi (mọi thứ không muốn phân nhánh / bỏ qua / trả lại chính xác), vì vậy tôi để nó một mình. Điều này sẽ nâng cấu trúc endian lớn từ 387 lên 388.


1

DOS COM, 49 byte, giai đoạn 2 ^ 3608

00000000  be 31 01 89 f7 b9 f4 02  f9 ac 14 00 aa 39 ce 72  |.1...........9.r|
00000010  f8 31 c9 b4 3c ba 2b 01  cd 21 89 c3 b4 40 b9 f4  |.1..<.+..!...@..|
00000020  01 ba 00 01 cd 21 b4 3e  cd 21 c3 71 2e 63 6f 6d  |.....!.>.!.q.com|
00000030  00                                                |.|

Lắp ráp ban đầu để tạo:

 BITS 16
 ORG 0100h
   mov si, l
   mov di, si
   mov cx, 500 + 0100h
   stc
n: lodsb
   adc al, 0
   stosb
   cmp si, cx
   jb n
   xor cx, cx
   mov ah, 3ch
   mov dx, f
   int 21h
   mov bx, ax
   mov ah, 40h
   mov cx, 500
   mov dx, 0100h
   int 21h
   mov ah, 3eh
   int 21h
   ret
f: db "q.com", 0
l: db 0

Viên ngọc nhỏ này viết giai đoạn tiếp theo cho q.com chứ không phải đầu ra tiêu chuẩn vì null và các thứ khác mà thiết bị đầu cuối không thể xử lý. Kỹ thuật quine gốc tương đương với việc xâu chuỗi và phòng tải trọng được sử dụng làm bộ đếm 3608 bit. Do cách thức hoạt động của DOS, trạng thái ban đầu của bộ đếm chứa các mảnh vụn từ bất cứ thứ gì có trong bộ nhớ trước khi thực hiện lần đầu tiên.

Đầu vào 49 byte ban đầu là không thể truy cập được, vì vậy nếu bạn muốn chấm điểm này là 500 byte thì hãy tiếp tục.


1

C # (Trình biên dịch tương tác Visual C #) , cờ: /u:System.Numerics.BigInteger/r:System.Numerics

Điểm: 10 332

Cảm ơn JoKing, người đã tăng điểm của tôi từ 10 255 * 2 - 1 đến bây giờ!

var i=Parse("0");var s="var i=Parse({0}{2}{0});var s={0}{1}{0};Write(s,(char)34,s,(++i).ToString().Length<333?i:0);";Write(s,(char)34,s,(++i).ToString().Length<333?i:0);

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

Giải trình

Tăng một BigInteger mỗi lần lặp, cho đến khi chiều dài của nó trở nên quá lớn, trong trường hợp đó, chúng tôi ngay lập tức trở lại câu hỏi ban đầu.

//The BigInteger that will be incremented
var i=Parse("0");
//The string that encodes the quine
var s="var i=Parse({0}{2}{0});var s={0}{1}{0};Write(s,(char)34,s,(++i).ToString().Length<333?i:0);";
//Print out the string, with every {0} replaced with quotes and the {1} replaced with the original string
Write(s,(char)34,s,
//And the {2} is replaced to the BigInteger+1 if the BigInteger wouldn't be too long, else 0
(++i).ToString().Length<333?i:0);

1

252219

#coding=L1
s=""""""
for i in range(220-len(s.lstrip("ÿ")))[:219]:s=s[:i]+chr(ord(s[i])%255-~(s[i]in"!$&"))+s[i+1:]
S='#coding=L1\ns="""%s"""\nfor i in range(220-len(s.lstrip("\xff")))[:219]:s=s[:i]+chr(ord(s[i])%%%%255-~(s[i]in"!$&"))+s[i+1:]\nS=%%r;print S%%%%s%%%%S';print S%s%S

Lưu ý rằng có một dòng mới. Nó có thể bị xóa ở trên nếu cú ​​pháp tô sáng bắt buộc.

Thật không may, bạn không thể thực hiện chương trình này trong TIO, vì nó được mã hóa bằng tiếng Latin-1.

Ở trên, schứa 219 0x01 byte. Sau khi chương trình chạy, nguồn của nó được in, ngoại trừ một điểm khác biệt: sđã được tăng lên như một số cuối lớn cơ sở-252, do đó, ký tự ngoài cùng bên trái của nó đã được "tăng" lên 0x02. Các byte 0x00, 0x22, 0x25 và 0x5C đều được tránh, do đó, nếu bất kỳ ký tự nào của chuỗi trở thành một trong số đó sau khi tăng, chính ký tự đó lại được tăng lên.

  • 0x00 (null): Tệp nguồn Python không thể chứa các ký tự null.
  • 0x22 ( "): Có nguy cơ ba byte 0x22 hình thành liên tiếp, nghĩa là """, hoặc ký tự cuối cùng của chuỗi trở thành ", do đó, chuỗi sẽ bị đóng sớm.
  • 0x25 ( %): printf giống như định dạng chuỗi được sử dụng trước khi hoàn thành bộ xương Quine, do đó, một %không liền kề với nhau %trong ssẽ gây ra rắc rối. Thật không may, không thể sắp xếp lại định dạng để tránh cảnh báo này.
  • 0x5C ( \): Có khả năng \được sử dụng làm dấu thoát trong chuỗi, thay vì nguyên văn, vì vậy điều đó tránh được.

Do đó, có thể sử dụng được 252 trong số 256 byte. Nếu schứa 219 0xFF ( ÿ) byte, đơn giản là nó được hoàn nguyên thành 219 0x01 byte, do đó hoàn thành chu trình.

252219

252219= =8067118401622543607173815381864126969021321378412714150085501148172081568355283332551767558738710128769977220628694979838777041634307806010130530425186639676411301297481084651095555215700418444195782383034012179076800437053057865822925332314964890255712033189246517587305368018828780253681790919529233811261863254200047209434722654033940967285125259644222866217484539773117504430425112387404662629146065990912717243577635914872465557587868027070692451120531744950544969860952702932354413767504109600742385916705785109741289800204288


1

2512262.1×10542

  • 251 39 loại bỏ sự phụ thuộc vàoText
  • 251 122 golfed chức năng incrementing
  • Chuỗi kết hợp tiền tố và hậu tố 251 128
  • Đã xóa bỏ 188 188 phụ thuộc vàoGast.GenLibTest

Được trình bày ở định dạng xxd do không thể in / UTF-8 không hợp lệ:

00000000: 6d6f 6475 6c65 2071 3b69 6d70 6f72 7420  module q;import 
00000010: 5374 6445 6e76 3b53 7461 7274 3d28 7325  StdEnv;Start=(s%
00000020: 2830 2c34 3129 2c3f 5b27 0101 0101 0101  (0,41),?['......
00000030: 0101 0101 0101 0101 0101 0101 0101 0101  ................
00000040: 0101 0101 0101 0101 0101 0101 0101 0101  ................
00000050: 0101 0101 0101 0101 0101 0101 0101 0101  ................
00000060: 0101 0101 0101 0101 0101 0101 0101 0101  ................
00000070: 0101 0101 0101 0101 0101 0101 0101 0101  ................
00000080: 0101 0101 0101 0101 0101 0101 0101 0101  ................
00000090: 0101 0101 0101 0101 0101 0101 0101 0101  ................
000000a0: 0101 0101 0101 0101 0101 0101 0101 0101  ................
000000b0: 0101 0101 0101 0101 0101 0101 0101 0101  ................
000000c0: 0101 0101 0101 0101 0101 0101 0101 0101  ................
000000d0: 0101 0101 0101 0101 0101 0101 0101 0101  ................
000000e0: 0101 0101 0101 0101 0101 0101 0101 0101  ................
000000f0: 0101 0101 0101 0101 0101 0101 0101 0101  ................
00000100: 0101 0101 0101 0101 0101 0101 275d 2c73  ............'],s
00000110: 2528 3432 2c39 3939 292c 712c 732c 7129  %(42,999),q,s,q)
00000120: 3b71 3d69 6e63 2721 273b 3f5b 683a 745d  ;q=inc'!';?[h:t]
00000130: 2363 3d68 2b69 6628 616e 7928 283d 3d29  #c=h+if(any((==)
00000140: 6829 5b27 ff09 0c26 5b27 5d29 2702 2727  h)['...&['])'.''
00000150: 0127 3d5b 633a 6966 2863 3e68 2969 643f  .'=[c:if(c>h)id?
00000160: 745d 3b3f 653d 653b 733d 226d 6f64 756c  t];?e=e;s="modul
00000170: 6520 713b 696d 706f 7274 2053 7464 456e  e q;import StdEn
00000180: 763b 5374 6172 743d 2873 2528 302c 3431  v;Start=(s%(0,41
00000190: 292c 3f5b 2727 5d2c 7325 2834 322c 3939  ),?[''],s%(42,99
000001a0: 3929 2c71 2c73 2c71 293b 713d 696e 6327  9),q,s,q);q=inc'
000001b0: 2127 3b3f 5b68 3a74 5d23 633d 682b 6966  !';?[h:t]#c=h+if
000001c0: 2861 6e79 2828 3d3d 2968 295b 27ff 090c  (any((==)h)['...
000001d0: 265b 275d 2927 0227 2701 273d 5b63 3a69  &['])'.''.'=[c:i
000001e0: 6628 633e 6829 6964 3f74 5d3b 3f65 3d65  f(c>h)id?t];?e=e
000001f0: 3b73 3d22                                ;s="

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

Increments một chuỗi 226-byte thông qua tất cả các giá trị byte trừ \0, \n, \r, '\.

Lý do chúng tôi tránh các nhân vật này là:

  • \0 làm cho trình biên dịch tức giận
  • \n\r không thể xuất hiện trong danh sách
  • ' sẽ kết thúc danh sách
  • \ có thể gây ra vấn đề nếu nó xuất hiện trước một nhân vật có thể thoát được

Khi chuỗi là tất cả \377, nó sẽ bao quanh tất cả các \001s, đưa ra chương trình gốc.


Đầu ra (ít nhất là trên TIO) là ký tự có giá trị thứ tự 128, nhưng bao gồm hai byte C2 80. Đây có giống như hành vi trên máy cục bộ của bạn không?
Jo King

1
@JoKing Ồ, không, tôi nhận được một byte trên máy của mình. TIO mangle đầu ra khi nó không hợp lệ UTF-8 (và các tệp đầu vào cũng vậy).
Οurous

1
@JoKing Tôi đã thay đổi câu trả lời sang định dạng mới để có thể thấy hành vi chính xác trên TIO.
urur

0

Gol> <> , 70 byte, lặp lại 39039000

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

Wow, nó thấp hơn nhiều so với tôi nghĩ nó sẽ là ... Bước tiếp theo! Làm cho nó có nhiều lần lặp hơn !!!

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


nó dường như không xóa bất cứ thứ gì khi nó đạt tới 500, chỉ cần thêm một byte NUL
Jo King

Điều này thậm chí có hoạt động không? Tôi không thể làm cho "tăng char cuối cùng" hoạt động
ASCII - chỉ

@ ASCII-only Bây giờ điều này hoạt động, xin lỗi về trước đây, tôi đã làm hỏng một phần trong khi sửa chữa toàn bộ. Nó hoạt động ngay bây giờ, xin lỗi vì sự bất tiện !!!
KrystosTheOverlord

@JoKing byte NUL là quá trình xóa, bây giờ chương trình sẽ xóa cho đến khi gần hết, sau đó xóa NUL và tăng char cuối cùng, nếu là ~, thì nó sẽ được chuyển đổi thành '#', quay lại để bình thường!!!
KrystosTheOverlord
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.