의사 Quine Polyglot 언어 감지 카운터


11

Quines는 재미있다. 폴리 글 로트도 재미 있습니다. Polyglot Quines는 존재하지만 막대를 더 높일 수 있습니다.

언어 α, β 및 γ에 유효한 프로그램이 들어있는 파일을 작성하십시오. 파일이 언어 α 또는 β 프로그램으로 파일을 컴파일 된 경우 (아마도 컴파일 후) 프로그램의 출력은이 콘테스트에 유효한 제출물과 동일한 형식이어야합니다. 파일이 언어 γ 프로그램으로 실행되면 숫자가 출력됩니다. 이 숫자의 값은 이진 숫자로 해석되는 프로그램의 이전 실행 체인입니다.

이 설명은 이해하기가 다소 어려울 수 있으므로 여기에 예가 있습니다. Α, Β 및 Γ는 언어 α, β 또는 γ resp로 입력을 실행하는 함수가되게하십시오. 이러한 프로그램의 출력을 반환합니다. 하자 x는 이 대회에 유효한 제출합니다. 그런 다음 언어 β, α, β, α, α, β 및 γ를 통해 x 를 순서대로 처리하는 다음 식은 41 10 = 101001 2 이기 때문에 41이 됩니다.

Γ (Β (Α (Α (Β ( x ( ))))))

체인에서 두 번째 실행이 언어 β의 실행이라고 가정하지 않을 수도 있습니다. 원본 제출이 언어 γ 프로그램으로 직접 실행되는 경우 0을 인쇄합니다.

귀하의 프로그램은 체인에서 최대 16 개의 컴파일에 대해 올바르게 작동해야합니다. 즉, 프로그램이 끝에 인쇄 할 수있는 가장 높은 숫자는 2 15-1입니다 . 물론 프로그램은 더 긴 컴파일 체인을 지원할 수 있습니다.

창의적인 솔루션을 장려하는 인기 콘테스트입니다. 가장 많은 투표 집계가 제출됩니다.


세 가지 언어가 동일 할 수 있습니까 (공감대를 크게 줄이더라도)?
Zgarb

6
@ Zgarb 나는 언어의 일부 (또는 모두)가 동일한 솔루션을보고 싶습니다. 평등 한 언어를 구별하는 방법을 살펴 보겠습니다.
FUZxxl

1
...내가 참조. : DI는이 문제를 너무 빨리 읽습니다.
Zgarb

@ Zgarb 같은 언어의 다른 버전은 어떻습니까? magic += Number(System.env.lang_version[-1])

1
지루한 대신 그리스 문자를 사용하는 +1 a,b,c또는 1,2,3=)
flawr

답변:


13

Python 2, Python 3,> <> (물고기)

#;n0
import sys
x='\\\'\nn#;n0import sysx=v=int(1/2*2)sys.stdout.write(x[4:7]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[7:8]),sys.stdout.write(x[2:3]),sys.stdout.write(x[8:18]),sys.stdout.write(x[2:3]),sys.stdout.write(x[18:20]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[3:4]),sys.stdout.write(x[4:7]),sys.stdout.write(x[7:8]),sys.stdout.write(x[8:18]),sys.stdout.write(x[18:20]),sys.stdout.write(x[20:32]),sys.stdout.write(x[32:851]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[1:2]),sys.stdout.write(x[2:3]),sys.stdout.write(x[20:32]),sys.stdout.write(x[2:3]),sys.stdout.write(x[32:851])n'
v=int(1/2*2)
sys.stdout.write(x[4:7]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[7:8]),sys.stdout.write(x[2:3]),sys.stdout.write(x[8:18]),sys.stdout.write(x[2:3]),sys.stdout.write(x[18:20]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[3:4]),sys.stdout.write(x[4:7]),sys.stdout.write(x[7:8]),sys.stdout.write(x[8:18]),sys.stdout.write(x[18:20]),sys.stdout.write(x[20:32]),sys.stdout.write(x[32:851]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[1:2]),sys.stdout.write(x[2:3]),sys.stdout.write(x[20:32]),sys.stdout.write(x[2:3]),sys.stdout.write(x[32:851])

파이썬 설명

파이썬 2와 파이썬 3 인터프리터 는 파이썬 2가 부동 소수점을 사용하고 파이썬 3이 정수 나누기를 사용하기 때문에 v=int(1/2*2)변수가 다른 값 ( 01)을 얻는 것을 제외하고는 비슷하게 작동 합니다.

모든 실행에서 표현식 +0*2또는 +1*2 첫 번째 행 (이후 #;n)과 x문자열 (마지막 쓰기 명령 후)에 추가합니다. > <> 인터프리터는 첫 번째 추가를 사용하고 파이썬은 두 번째 것을 사용하여 올바른 quine을 만듭니다.

후 코드 B(A(B(B(x)))):

#;n+1*2+0*2+1*2+1*20
import sys
x='\\\'\nn#;n0import sysx=v=int(1/2*2)sys.stdout.write(x[4:7]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[7:8]),sys.stdout.write(x[2:3]),sys.stdout.write(x[8:18]),sys.stdout.write(x[2:3]),sys.stdout.write(x[18:20]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[3:4]),sys.stdout.write(x[4:7]),sys.stdout.write(x[7:8]),sys.stdout.write(x[8:18]),sys.stdout.write(x[18:20]),sys.stdout.write(x[20:32]),sys.stdout.write(x[32:851]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[1:2]),sys.stdout.write(x[2:3]),sys.stdout.write(x[20:32]),sys.stdout.write(x[2:3]),sys.stdout.write(x[32:851])+1*2+0*2+1*2+1*2n'
v=int(1/2*2)
sys.stdout.write(x[4:7]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[7:8]),sys.stdout.write(x[2:3]),sys.stdout.write(x[8:18]),sys.stdout.write(x[2:3]),sys.stdout.write(x[18:20]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[3:4]),sys.stdout.write(x[4:7]),sys.stdout.write(x[7:8]),sys.stdout.write(x[8:18]),sys.stdout.write(x[18:20]),sys.stdout.write(x[20:32]),sys.stdout.write(x[32:851]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[1:2]),sys.stdout.write(x[2:3]),sys.stdout.write(x[20:32]),sys.stdout.write(x[2:3]),sys.stdout.write(x[32:851])

> <> (물고기) 설명

> <> 인터프리터를 실행하면 코드 포인터 #가 첫 번째 줄의 줄 바꿈 에서 다시 튀어 나와 첫 줄 끝에서 시작하여 West 제목이 스택으로 숫자를 푸시하기 시작합니다. 연산자가 ( +또는 *) 오면 스택에서 맨 위 두 요소를 팝하고 결과를 다시 푸시합니다. 이 방법을 사용하면 이전 실행의 base2 표현으로 끝납니다 ( 13이전 예제에서). 이것은 원하는 숫자이므로로 출력하고로 n끝납니다 ;.


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