500 바이트로 묶인 퀴네를 반복하는 가장 긴 기간 쓰기


18

작업은 시퀀스에서 각 프로그램의 길이가 500 바이트로 제한되는 quine을 반복 하는 가장 긴 기간을 작성하는 것 입니다.

즉, 다음 단계를 반복하면

  1. 초기 프로그램으로 시작
  2. 현재 프로그램을 실행
  3. 2 단계로 돌아 가기

결국 원래 프로그램으로 돌아갑니다. 사이클의 프로그램 수는 점수이며 최대화하려고합니다.

어떤 프로그램도 오류를 일으킬 수 없습니다. 각 프로그램은 동일한 방식으로 실행되어야합니다 (예 : 다른 버전, 구현, 컴파일러 옵션, 플랫폼 등) (편집 : 예, 의사 난수 생성기의 상태와 같은 외부 상태는 마지막에 포함됨 각 실행 후 외부 상태를 "재설정"해야합니다. 실제 난수를 사용하는 경우 최악의 경우가 가정됩니다.)

이 문제와 퀴인을 반복하는 가장 긴 기간 (100 대 500 제외)과의 차이점 주기의 모든 프로그램도 500 바이트 이하 여야합니다. 이는 가능한 가장 긴주기가 (256 ^ 501-1) / 255 이하임을 의미합니다. 물론 그것은 많은 수이지만 계산하는 데 얼마나 많은 코드가 필요한지는 그다지 크지 않습니다. 따라서 도전은 바쁜 비버 도전이 아니라 가능한 많은 (256 ^ 501-1) / 255 가능성을 사용하는 것입니다.

프로그램은 자체 소스 코드에 액세스 할 수 없습니다. 그러나 원하는 경우 빈 프로그램 허용됩니다 (다른 규칙을 따르는 한).

프로그램을 수동으로 확인하는 것은 어려울 수 있으므로 이론적 인 방법을 사용하여 점수를 알아낼 수 있습니다. 프로그램에 점수와 정확성에 대한 설명을 포함시켜야합니다. 점수를 파악할 수없는 경우 대신 싸이클에있는 프로그램 수의 하한을 사실상의 점수로 사용할 수 있습니다. 더 낮은 하한을 찾거나 정확한 실제 점수를 찾은 경우이를 업데이트 할 수 있습니다.

이것은 이므로 최고 점수가 이깁니다!

편집 : 점수를 과학적 표기법으로 작성하여 답변을보다 쉽게 ​​비교할 수 있도록 작성하는 것이 좋습니다. 다른 형태의 점수도 프로그램에보다 명확하게 연결되어있는 경우에도 매우 좋습니다. 또한 독자는이를 준수하기 위해 이전 답변을 편집하는 것이 좋습니다.


2
"가장 긴주기는 (256 ^ 501-1) / 255 이하"입니다. --- 반드시 그런 것은 아닙니다. 프로그램이 외부 객체를 조작하는 경우 원래 상태로 돌아 가기 전에 동일한 상태를 여러 번 통과 할 수 있습니다 ( RNG 상태 또는 시드와 같은)
JDL

2
규칙에 위배되는 @JDL, IMHO-소스 코드 이외의 상태를 저장하는 경우 적절한 반복 퀴네가 아닙니다.
Nathaniel

1
@Nathaniel 나는 그것을 다른 곳에 저장하는 상태로 분류하지 않고 단순히 구현 된 프로그래밍 언어의 유효한 부분 인 진입 점을 사용하고 있습니다. 프로그래밍 언어에서 다른 함수를 호출하는 것은 외부에있는 상태에 액세스하는 것입니다 자체 소스 코드.
JDL

1
@ JDL 아니오, 그것들은 다릅니다. 어떤 언어로든 모든 프로그램은 분명히 소스 코드 외부에서 구현 된 것에 의존해야하지만 소스 코드 외부에 상태를 저장하는 것은 다릅니다. 이는 프로그램의 출력이 소스 코드의 결정적 기능이 아니라 이전 실행으로 변경된 다른 외부 컨텍스트에 의존한다는 것을 의미합니다. 이는 quine challenge, IMHO에서 허용되지 않아야하며 최대주기 길이에 대한 OP의 설명은 여기서 허용되지 않음을 나타냅니다.
Nathaniel

3
확실히 알고 있듯이 @JDL은 결정적 언어로 명령 포인터는 프로그램 실행 중 상태 만 저장하며 호출 사이에는 저장하지 않습니다. 프로그램의 출력이 해당 소스의 결정적 기능인 경우 5 가지 상태 예제를 사용할 수 없습니다.
Nathaniel

답변:


15

1263988.86×10835

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

온라인으로 사용해보십시오!

이는 길이가 398 인 첫 126 바이트와 그 이하 (가능한 NUL 바이트가있는 문자열 제외)의 모든 가능한 조합을 반복합니다. 실제로 첫 번째 반복으로 돌아가는 것을보고 싶다면 한계를 이렇게 변경하여 길이를 1로 줄일 수 있습니다 .

설명:

0100010410

$!=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
와우, 당신은 정말 빨리, 나는 거의 다
끝났지

이 계산 은 당신 당신의 점수를 추정하는 방법을 제안합니다. 분자는 126 개의 기호를 사용하는 길이가 397 인 문자열 수입니다. (wolfram 알파가 이상하게 행동 한 이래로 분수에 분수를 분배해야했습니다.)
PyRulez

@PyRulez 기본적으로 126 개의 숫자를 399 자리까지 반복하므로 내 번호가 맞다고 생각합니다 . 설명이 잘못되었다고 생각합니다.
Jo King

@ JoKing 아 그래, 나는 설명이 문제라고 생각한다. 397을 398로 변경하여 더 이상 점수를 과대 평가하지 않습니다. 당신은 그것을 과소 평가하고있을 것입니다 (점수에 정확히 398 개의 길이의 문자열 만 포함했기 때문에).
PyRulez

3

룬 마법 , 64654 106 ; 122 387 -1 ≈ 2.638 × 10 807 반복

"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]}@

온라인으로 사용해보십시오!

경고 :이 ( 가) 잘못 표시되면``(0x80)이어야합니다.

스택 대신 문자열과 스택 연산자를 사용하여 스택 대신 문자열 ͍을 수정하십시오 (이전 개정판 참조). 따라서 각 문자는 1 바이트 (0-127 범위에서 문제가되는 문자를 뺀)로 제한되지만 3 배 이상이 있습니다 (유니 코드 결합 문자를 건너 뛸 필요가 없기 때문에 처리 상용구가 적기 때문에) 뿐만 아니라 다른 바이트 절약) 더 많은 반복 횟수를 달성합니다.

실제 빅 엔디안으로 인코딩이 허용되는 경우 (즉, 바이트를 삽입하지 않고 127보다 큰 바이트 값을 가짐 0x00) 251 387 -1 ≈ 4.717 × 10 928 반복을 달성 할 수 있습니다 . 그러나 TIO의 라틴 인코딩은 Python 2 답변에서 Outgolfer Erik이 지적한 것처럼 이것을 방지합니다. 이 점수를 청구하기 전에 로컬에서 작동하는지 확인해야합니다.

대체 할 수 있어야 f1+0B'0B(unprinting 거기에 0x16있다),하지만 난 혼자 남겨 그래서, 저를 (상황이 올바르게 지점 / 스킵 / 반환하고자하지 않았다) 싸우고 있었다. 이것은 빅 엔디안 구조를 387에서 388로 올릴 것입니다.


2

C # (Visual C # Interactive Compiler) , 플래그 : /u:System.Numerics.BigInteger/r:System.Numerics

점수 : 10 332

(10)에서 내 점수를 증가 누가 농담 덕분에 255 해주기 - 1 * 2!

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

온라인으로 사용해보십시오!

설명

길이가 너무 커질 때까지 반복 할 때마다 BigInteger를 증가시킵니다.이 경우에는 즉시 원래 퀴니로 되돌아갑니다.

//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

DOS COM, 49 바이트, 기간 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                                                |.|

만들 원본 어셈블리 :

 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

이 작은 보석은 널과 터미널이 처리 할 수없는 기타 요소로 인해 표준 출력이 아닌 다음 단계를 q.com에 씁니다. 루트 퀴닝 기술은 문자열 동일 하며 페이로드 룸은 3608 비트 카운터로 사용됩니다. DOS가 작동하는 방식으로 인해 카운터의 초기 상태에는 첫 번째 실행 이전에 메모리에 있던 쓰레기가 포함됩니다.

원래 49 바이트 입력은 도달 할 수 없으므로 500 바이트로 점수를 매길 수 있습니다.


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

후행 줄 바꿈이 있습니다. 구문 형광펜이 강제로 들어가면 위에서 제거 될 수 있습니다.

불행히도이 프로그램은 라틴 -1로 인코딩되어 있으므로 TIO에서 실행할 수 없습니다.

위의 s219 0x01 바이트를 포함합니다. 프로그램이 실행 된 후 한 가지 차이점을 제외하고 소스가 인쇄됩니다 s. 기본 252 빅 엔디안 숫자처럼 증가 했으므로 맨 왼쪽 문자가 0x02로 "증가되었습니다". 바이트 0x00, 0x22, 0x25 및 0x5C는 방지되므로 문자열의 문자가 증분 후 문자 중 하나가되면 문자 자체가 다시 증가합니다.

  • 0x00 (널) : Python 소스 파일은 널 문자를 포함 할 수 없습니다.
  • 0x22 ( ") : 행에 3 개의 0x22 바이트, 즉 """문자열의 마지막 문자 가 형성 될 위험이 "있으므로 문자열이 조기에 닫힙니다.
  • 0x25로 ( %) : printf와 같은 문자열 포맷하기, 그래서 quine 골격이 완료되기 전에 사용되는 %서로 인접하지 %s문제가 발생합니다. 불행히도이 경고를 피하기 위해 형식을 다시 정렬 할 수는 없습니다.
  • 0x5C ( \) :가 \그대로 사용되지 않고 문자열에서 이스케이프 표시로 사용될 가능성이 있으므로 피해야합니다.

따라서 256 바이트 중 252 개를 사용할 수 있습니다. 경우 s((219)에 0xFF를 포함 ÿ) 바이트, 그것은 단순히 따라서 사이클을 완료, 219 0x01로 바이트로 복귀합니다.

252219

252219=8067118401622543607173815381864126969021321378412714150085501148172081568355283332551767558738710128769977220628694979838777041634307806013053042518663967641130129748108465109552157004184441957823830340121790768004370530578658229253323149648902557120331892465175873053680188287802536817909195292338112618632542000472094347226540339409672851252596442228662174845397731175044304251123874046626291460659909127172435776359148724655575878680270692451120531744950544969860952702932354413767504109600742385916705785109741289800204288


1

2512262.1×10542

  • 251 39의 의존성을 제거했습니다Text
  • 251 122 golfed 증가 함수
  • 251 128 선택지 접두사 및 접미사 소스 문자열
  • 251 188의 의존성을 제거Gast.GenLibTest

인쇄 할 수없는 / 잘못된 UTF-8로 인해 xxd 형식으로 표시됩니다.

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="

온라인으로 사용해보십시오!

제외한 모든 바이트 값을 통해 226 바이트 문자열 늘려 \0, \n, \r, '\.

이러한 문자를 피하는 이유는 다음과 같습니다.

  • \0 컴파일러를 화나게한다
  • \n그리고 \rcharlists에 나타나지 않습니다
  • ' charlist를 종료합니다
  • \ 이스케이프 가능한 문자 앞에 오는 경우 문제가 발생할 수 있음

문자열이 모두 끝나면 모든 \377것을 감싸고 \001원래 프로그램을 제공합니다.


출력 (적어도 TIO에서)은 서수 값이 128 인 문자이지만 2 바이트로 구성됩니다 C2 80. 로컬 컴퓨터의 동작과 동일합니까?
조 왕

1
@ JoKing 아, 아니, 나는 내 컴퓨터에서 단일 바이트를 얻습니다. TIO는 유효한 UTF-8이 아니거나 입력 파일도 아닌 경우 출력을 맹 글링합니다.
OUurous

1
@ 조킹 나는 TIO에서 올바른 행동을 볼 수 있도록 새로운 형식으로 답변을 변경했습니다.
OUurous


0

Gol> <> , 70 바이트, 39039000 반복

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

와우, 그것은 내가 생각했던 것보다 훨씬 낮습니다 ... 다음 단계! 더 많은 반복을 만들기!

온라인으로 사용해보십시오!


500에 도달하면 아무것도 삭제하지 않고 NUL 바이트
Jo King

이것도 전혀 작동하지 않습니까? "마지막 문자 증가"가 작동하지 않습니다
ASCII 전용

@ ASCII-only 이제 작동합니다. 미안하지만, 전체를 고치는 동안 섹션을 엉망으로 만들었습니다. 지금 작동합니다. 불편을 끼쳐 드려 죄송합니다 !!!
KrystosTheOverlord

@JoKing NUL 바이트는 삭제 프로세스입니다. 이제 프로그램은 거의 사라질 때까지 삭제 한 다음 NUL을 삭제하고 마지막 문자를 증가시킵니다. ~ 인 경우 '#'으로 변환되어 되돌아갑니다. 정상으로 !!!
KrystosTheOverlord

0

×

#coding=L1
c=r"##################################################################################################################################################################################################################################################################################################|";exec(s:='from itertools import*;print("#coding=L1\\nc=r\\"%s|\\";exec(s:=%r)"%([*filter(c[:-1].__lt__,map("".join,combinations_with_replacement(map(chr,range(35,256)),290))),"#"*290][0],s))')

온라인으로 사용해보십시오!

더 작은 버전을 온라인으로 사용해보십시오!

×

c=r"##########################################################################################################################################################################################################################################################################################################################|";exec(s:='from itertools import*;print("c=r\\"%s|\\";exec(s:=%r)"%([*filter(c[:-1].__lt__,map("".join,combinations_with_replacement(map(chr,range(35,128)),314))),"#"*314][0],s))')

아스키 버전

온라인으로 사용해보십시오!

더 작은 버전을 온라인으로 사용해보십시오!

설명

지정된 값 c범위 내에 문자 형성 (아스키 버전 314)의 길이 (290)의 모든 가능한 문자열을 반복 \x23\xff( \x23\x7f아스키 버전)

문자열에 백 슬래시 c가 접두사로 지정된 r문자열은 이스케이프 시퀀스의 시작으로 취급되지 않기 때문에 할당 된 문자열 내에서 백 슬래시를 c문제없이 사용할 수 있습니다.

문자열이 r'\'여전히 문제를 일으키기 때문에에 지정된 문자열 |의 끝에 a 가 추가됩니다 c.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.