랜덤 퀸


15

무작위로 자체 생성 할 수있는 프로그램을 작성하십시오.

소스 코드에 사용 된 토큰을 기반으로해야합니다 . 프로그램의 소스 코드가 50 개의 고유 토큰으로 구성되고 60 개의 토큰 길이 인 경우 프로그램은 각 토큰이 50 개의 고유 토큰 중 하나에서 임의로 선택되는 60 개의 토큰을 출력해야합니다.

예를 들어,이 프로그램은 50 ^ 60의 확률로 자신을 재생산 할 수 있습니다.

토큰이란 무엇입니까? 언어에 따라 다릅니다. 예를 들어 식별자 ( foo_bar), 키워드 ( while) 및 숫자 ( 42)는 대부분의 언어에서 토큰으로 계산됩니다. 공백은 대부분의 언어에서 계산되지 않습니다.

추가 규칙 :

  • 출력에는 프로그램 소스 코드에서 찾은 토큰 만 포함되며, 적절한 구분 기호로 구분됩니다.
  • 출력은 토큰으로 계산 된 프로그램의 소스 코드와 길이가 같아야합니다.
  • 하나의 프로그래밍 언어 만 사용할 수 있습니다
  • 소스 코드에는 최소 3 개의 고유 토큰이 있어야합니다
  • 소스 코드에서 주석 제외
  • 프로그램은 U ^ L 중 하나만 재생산해야합니다.

득점 : 가장 좋은 기회를 가진 프로그램이 승리합니다.


@MathieuRodic : 프로그램이 반복하지 않고 토큰을 가져 오는 것으로 가정합니다.
user2357112는 Monica

@MathieuRodic : 문구를 바꾸겠습니다. 소스에서 사용되는 U 토큰 세트에서 반복하여 L 토큰을 그리는 대신 프로그램이 무작위로 해당 토큰의 다중 세트를 스크램블한다고 가정합니다.
user2357112는 Monica

@ user2357112 : 알겠습니다. 내 실수는이 문제를 교체하지 않고 무승부로 간주하는 것이 었습니다.
Mathieu Rodic

1
규칙 # 1과 # 5는 저에게 모순되는 것처럼 보입니다.
Cruncher

4
내장 된 임의 함수가 TRNG라고 가정 할 수 있습니까? 일반적인 구현에는 모든 출력을 생성하기에 너무 작은 시드가 있으므로 실제로 자체 재생하지 못할 수 있습니다.
코드 InChaos

답변:


11

파이썬 2, 3 ^ -3 = 0.037

exec남용은 토큰 수를 줄이는 데 매우 편리합니다. 이제 소스 파일을 읽지 않도록 업데이트되었습니다!

exec '' """
s = '''{a}
s = {b}
s = s.format(a='"'*3, b="'"*3+s+"'"*3)
import random
tokens = ['exec', "''", s]
print random.choice(tokens), random.choice(tokens), random.choice(tokens),
{a}'''
s = s.format(a='"'*3, b="'"*3+s+"'"*3)
import random
tokens = ['exec', "''", s]
print random.choice(tokens), random.choice(tokens), random.choice(tokens),
"""

''사이에 여분 exec의 큰 따옴표로 묶인 문자열은 토큰 수를 필요한 최소값 3으로 채우는 것입니다. 암시 적 문자열 리터럴 연결로 인해 두 번째 문자열로 병합됩니다.

원본 소스 파일 버전 :

exec '''
# String literals are one token!
import random
import tokenize

with open(__file__) as f:
    tokens = [x[1] for x in tokenize.generate_tokens(f.readline)][:-1]

''' '''
# Splitting the string into two strings pads the token count to the minimum of 3.

print random.choice(tokens), random.choice(tokens), random.choice(tokens),
'''

엄밀히 말하면, 파이썬 문법은 소스 파일의 끝에 ENDMARKER 토큰을 배치하며 무작위로 ENDMARKER가있는 소스 파일을 생성 할 수 없습니다. 존재하지 않는 척합니다.


@Cruncher 그것은 확률이다. 3 ^ -3 == 1 / 3 ^ 3
Austin Henley

2
규칙의 화려한 해킹에 +1. J에서 동일한 아이디어가 구현되었습니다 ".]';(?3 3 3){]`".;~({:,],{:,],6#{:)'';(?3 3 3){]`".;~({:,],{:,],6#{:)'''''''.
algorithmshark

5

자바 스크립트, 102 개 토큰, 33 개 고유, 7.73 × 10-154

이것은 진정한 소멸입니다. 파일을 읽거나 사용하지 않습니다eval 않거나Function.toString

meta = "meta = ; out = '' ; tokens = meta . split ( '\\u0020' ) ; tokens . push ( '\"' + meta + '\"' ) ; length = tokens . length ; tmp = length ; unique = { } ; while ( tmp -- ) unique [ tokens [ tmp ] ] = unique ; unique = Object . keys ( unique ) ; tmp = unique . length ; while ( length -- ) out += tokens [ ~~ ( Math . random ( ) * tmp ) ] + '\\u0020' ; console . log ( out )"; 
out = '';
tokens = meta.split('\u0020');
tokens.push('"' + meta + '"');
//console.log(tokens);
length = tokens.length;
tmp = length;
unique = { };
while(tmp--) unique[tokens[tmp]] = unique;
unique = Object.keys(unique);
//console.log(unique);
tmp = unique.length;
while(length--)
    out += unique[~~(Math.random() * tmp)] + '\u0020';
console.log(out)

4

파이썬 : P (1 시험에서 프로그램 생성) = 3.0317 * 10 ^ -123

고유 토큰 34 개, 총 토큰 80 개 각 줄 끝에 공백이 있습니다.

import tokenize , random 
tokens = [ x [ 1 ] for x in tokenize . generate_tokens ( open ( __file__ , 'r' ) . readline ) ] [ : -1 ] 
s = '' 
for x in tokens : s += random . choice ( list ( set ( tokens ) ) ) ; s += [ ' ' , '' ] [ s [ -1 ] == '\n' ] 
print s 

샘플 출력 :

' ' random len set 'r' , for ( list , import ] ] tokens : random [ for '\n' import readline readline 'r' tokens [ len 'r' import '' choice '' '' for in ( readline ( = open readline , list 1 list s += for s 1 , '' : 1 += list len - __file__ ; open __file__ print . - ] 'r' for import [ print . , 

; . [ [ print print __file__ generate_tokens ] ; open ] , readline 

user2357112의 다른 Python 솔루션 덕분에 마지막 토큰을 버리고 __file__이전에 무지했던 사용을 상기시켜줍니다 .


3

11 17의 J-1 = 1.978 x 10-18

;(?11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11){~.;:(,,,{:,{:)';(?11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11){~.;:(,,,{:,{:)'''

J에는 이러한 종류의 작업을 수행 할 수있는 편리한 도구가 많이 있습니다.

  • 우선, 공백으로 구분 된 숫자 문자열은 하나의 토큰 입니다. 그것은 그 숫자들의 1 차원 배열을 의미합니다. 이것이 J의 어휘 분석기가 작동하는 방식입니다. 그건 그렇고, 11누군가 호기심이 있다면 그것은 17 입니다.

  • (,,,{:,{:)'QUINE'''J의 일반적인 퀴크 트릭으로 가능한 한 적은 수의 토큰을 사용합니다. Tail을{: 의미 하므로 문자열을 자체에 추가 한 다음 마지막 문자의 사본 두 개를 끝에 추가합니다. 마지막 문자는 작은 따옴표 (J는 Pascal 스타일 문자열을 사용)이므로 결과는 입니다.QUINE'QUINE'''

  • ;:토크 나이저이며 입력 코드를 J 코드 인 것처럼 나누고 상자 목록을 반환합니다. 이 결과의 길이는 17입니다.

  • ~.이 배열의 모든 고유 요소를 취합니다. 이 결과의 길이는 11입니다.

  • ?Roll 이라고 합니다. 인수의 각 정수에 대해 0보다 크거나 같은 임의의 양수를 선택합니다. 따라서 J는 0에서 10까지 17 개의 숫자를 생성합니다.

  • { 랜덤 인덱스를 사용하여 박스 내 고유 토큰 목록에서 항목을 선택합니다.

  • ; 이 모든 상자를 열고 결과를 함께 실행합니다.

다음은 몇 가지 예입니다. 들여 쓰기 된 줄은 입력 프롬프트이고 왼쪽과 같은 줄은 인터프리터의 출력입니다.

   ;(?11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11){~.;:(,,,{:,{:)';(?11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11){~.;:(,,,{:,{:)'''
~.~.(?;;:11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11';(?11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11){~.;:(,,,{:,{:)'''(){11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11){(;:;
   ;(?11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11){~.;:(,,,{:,{:)';(?11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11){~.;:(,,,{:,{:)'''
{';(?11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11){~.;:(,,,{:,{:)''',?{:;:{:';(?11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11){~.;:(,,,{:,{:)'''11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11{:{;(;:{:,~.

2

추신

이것은 재미 있었다

/cvx /cvx cvx /exec /exec cvx /dup /rand /mod /get /== /array /astore /realtime
/srand /repeat 6 17 54 17 /array cvx exec /astore cvx exec 54 /dup cvx /rand
cvx 17 /mod cvx /get cvx /== cvx 6 /array cvx exec /astore cvx exec cvx /realtime
cvx exec /srand cvx exec /repeat cvx exec

3.6e-67 확률로 약 1 개의 17 개의 고유 토큰과 54 개의 토큰이 있습니다.


2

공백, 3 ^ -205 3 ^ -189 3 ^ -181 3 ^ -132 ~ = 10 ^ -63

이것은 임의의 문자로 시드 될 때 1 ^ 3 ^ 132의 확률로 자신을 재생할 수있는 확률 (3 개의 개별 토큰, 132 회 반복)을 갖는 공백 프로그램입니다. 실행할 때 최소 132 개의 임의의 문자를 시드해야합니다 (공백에 시드 할 내장 임의 또는 날짜 함수가 없음).some_whitespace_interpreter my_quine.ws <some_random_source >quine_output.ws . 프로그램이 더 이상 골프를 칠 수 있다면 점수는 향상 될 것입니다. 그러나 이것은 최초의 "실제"공백 프로그램이므로, 저의 빈약 한 양의 골프로 남겨 두겠습니다.

일반 공백 코드 또는 실행 여부를 확인하십시오 . (시도하려면 "편집"을 클릭하고 <pre> 태그 안에 내용을 복사하십시오. Unix 스타일 EOL의 경우 132 자 여야합니다)

    

























어떤 명령이 무엇인지 주석이 달린 코드 (기술적으로 주석이 재생되지 않기 때문에 quine이 아님) :

스택 push_number + 0 끝
스택 푸시 _ 번호 + 100 끝
힙 저장소 스택 push_number + 1 end
스택 푸시 _ 번호 + 10000 끝
힙 저장소 스택 push_number + 1 0 end
스택 push_number + 1,010 끝
힙 저장소 스택 push_number + 100000000 끝
흐름
make_label loop_begin  
스택 push_number + 1 1 끝
IO  
문자 스택 읽기 push_number + 1 1 end
힙 검색 스택 push_number + 1 1 end
산술 모듈로 힙 검색 IO  
인쇄 문자 스택 push_number + 1 end
산술 빼기 스택 복제
 흐름
jump_if_zero end_prog
흐름
jump_to 
loop_begin  
흐름
make_label end_prog
흐름
end_program

시드가 방금 같으면 (문자가 토큰으로 변환되도록 모드 3으로 간주 됨) 성공합니다.

CCCCACCCBCCBABBCCCCBACCCBCCCCCABBCCCCBCACCCBCBCABBCCCCBCCCCCBBAACCBACCCBBABABCCCCBBABBBCCCBBABCBBBBBBACACCCCCBABCCBCACABBAACABAACCAAAA

이 루비 프로그램과 거의 비슷한 꽤 간단한 프로그램입니다.

i = 131
while true
    print '\t \n'[STDIN.getc.ord % 3]
    i = i - 1
    break if i < 0
end

1

펄, 27 토큰, P = 1.4779 × 10 -34

@ARGV=$0;print$W[rand@W]for@W=split/(\W)/,readline

마지막 편집 : 토큰을 저장하는 @ARGV=$0대신 사용하십시오 open*ARGV,$0.

  • 고유 토큰 15 개
  • 4 개 토큰 표시의 2 배 ( =, /, @, $)
  • 1 개의 토큰이 4 번 나타납니다 ( W)

그래서 나는 그것이 확률 (pow (2,2 * 4) * pow (4,4)) / pow (27,27), 약 1.48E-34를 만든다고 생각합니다.

소스 코드 ARGV가라는 파일에 있으면이 26 토큰 솔루션을 P = ~ 2.193 x 10 -31로 사용할 수 있습니다 .

@ARGV=ARGV;print$ARGV[rand@ARGV]for@ARGV=split/(\W)/,readline

실제로, P = (4 * 2! + 4!) / 27!약 1.7632684538487448 x 10 ^ -26
Mathieu Rodic

0

펄 6 ,1 = 0.037037 ...

(이것은 코드 골프가 아니라는 것을 알고 있지만 ...)

q[say |roll <<~~"q[$_]".EVAL>>: 3]~~.EVAL

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

첫 번째 토큰이 평가되는 문자열 리터럴 인 Python 응답과 거의 동일합니다. 토큰은

q[say |roll <<~~"q[$_]".EVAL>>: 3]   String literal
~~                                   Smartmatch operator
.EVAL                                Function call

설명:

q[say |roll <<~~"q[$_]".EVAL>>: 3]         # Push as string literal
                                  ~~       # Smartmatch by setting $_ to the string literal
                                    .EVAL  # Eval the string
            <<~~"q[$_]".EVAL>>             # From the list of tokens
       roll                   : 3          # Pick 3 times with replacement
  say |                                    # Join and print
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.