폴리 글 로트 조각 인쇄


22

일반적으로 폴리 글 로트는 각 언어가 다른 언어에 대해 존재하는 코드의 일부를 문자열 리터럴로 묶거나 주석 구문 또는 기타 유사한 트릭을 사용하여 무시할 수있는 방식으로 구성됩니다.

각 언어의 출력이 해당 출력을 생성하는 폴리 글롯의 코드 인 폴리 글롯을 작성하는 것이 목표입니다. 특히, 출력은 삭제만으로 폴리 글롯 코드로 구성되어야하며 주어진 언어에서 퀴네 여야합니다.

규칙

  • 적절한 quines가 허용되지 않습니다 (어떤 소스 코드를 읽고, STDOUT가 옵션이 아닌 경우에는 복용 입력, 출력은 STDOUT 또는 가장 가까운 대안 일 수 없습니다해야하며, 프로그램은 암시 적으로 인쇄 단지 리터럴보다 더 많은 구성되어야합니다).
  • 언어마다 다른 인코딩을 사용할 수 있으므로 원시 바이트가 중요합니다. 예를 들어, 언어 A가 UTF-8을 사용하고 언어 B가 CP437을 사용하는 경우 (16 진) 코드 C3 88 46 47ÈFG언어 A 및 ├êFG언어 B에 대한 코드 입니다 .
  • 모든 출력은 고유 바이트 여야합니다 (다시 원시 바이트 비교). 이렇게하면 부 언어 버전을 제한하려고 할 때의 복잡성을 피할 수 있습니다. 두 언어가 코드의 동일한 부분을 사용하여 동일한 작업을 수행하는 경우 두 언어를 모두 주장 할 수 없습니다.
    • A와 B의 두 언어 XY가 모두 유효한 출력이지만 YZB에서도 유효한 XY경우 A에 YZ대한 출력과 B에 대한 출력으로 선택할 수 있으므로 점수에서 두 언어를 모두 청구 할 수 있습니다 ( 그러나 XY위의 규칙으로 인해 두 언어를 모두 주장 할 수는 없습니다 .)
  • 모든 출력은 가능한 짧아야합니다. 예를 들어, 코드가 print('foo')#somethingPython 3 인 경우 (출력이 정확하지 않다는 사실을 무시하고) 출력해야하는 코드는 print('foo')이고 print('foo')#허용되지 않습니다. 올바른 출력을 생성하는 동일한 (최소) 길이의 여러 문자열이있는 경우 그 중 하나를 선택할 수 있습니다.
  • 제출물은 2 개 이상의 언어로 된 폴리 글 로트 여야합니다.
  • 에 의해 점수가 제공됩니다 (number of programming languages with distinct outputs)**3/(total byte size of polyglot). 가장 높은 점수가 이깁니다. 두 제출물이 동일한 점수를 얻은 경우 해당 점수에 도달 한 제출물이 먼저 이깁니다.

2
두 번째에서 마지막까지의 규칙은 다른 가능한 삭제 세트로 결과 퀴니를 더 이상 골프를 칠 수 없다는 것을 증명 해야하는 것처럼 들립니다. 의도적인가요?
Martin Ender


명령이 8 비트가 아닌 언어의 경우 "삭제"를 어떻게 정의합니까? 한 번에 명령 또는 한 번에 바이트를 소스에서 삭제합니까?

@MartinEnder 선의로 가정 할 수 있습니다. 누군가가 폴리 글롯으로부터 형성 될 수있는 더 짧은 퀴인을 발견하지 않으면, 그 대답은 유효한 것으로 신뢰됩니다.
Mego

@ ais523 모든 것은 바이트 수준에서 이루어집니다.
Mego

답변:


11

GolfScript + CJam + Fission 2 + Jelly , 4 개 언어, 24 바이트, 2.667 점

16 진 덤프부터 시작하겠습니다 :

00000000:  3322 3024 700a 2721 2b4f 5222 0a3c 3024 700a 6523 7fff cccc

GolfScript, CJam 및 Fission 2의 경우 ISO 8859-1과 같은 일부 ASCII 호환 단일 바이트 인코딩으로 해석합니다 (언어는 ASCII 문자의 연산자 만 정의하므로 정확한 인코딩은 중요하지 않습니다).

3"0$p
'!+OR"
<0$p
e#<DEL>ÿÌÌ

<DEL>제어 문자는 어디에 있습니까 0x7f?

Jelly에서는이 코드가 Jelly 자신의 코드 페이지에있는 것으로 가정합니다.

3"0$p½'!+OR"½<0$p½e#¶”ṘṘ

GolfScript

e마지막 줄에 알 수없는 변수이며 #, 라인의 나머지 밖으로 의견이 인쇄 그래서

"0$p"
0$p

후행 줄 바꿈. 표준 quine의 GolfScript / CJam 폴리 글 로트 버전입니다.

".p"
.p

폴리 글롯을 사용해보십시오. | quine을보십시오.

CJam

여기, e#마지막 줄을 주석 처리합니다. 거의 똑같이

"0$p"
0$p

후행 줄 바꿈 없이 .

폴리 글롯 사용해보기 | quine을보십시오.

분열

분열은 두 번째 줄보고 있다 , 표준 분열 quine 그것을 인쇄 그래서

'!+OR"

TIO는 파일을 UTF-8로 Fission에 파일을 전송하지만 Fission은 소스를 바이트 단위로 읽으므로 마지막 줄이 너무 길어지기 때문에 폴리 글롯에 대한 온라인 링크를 제공 할 수 없습니다. 그러나 ISO 8859-1로 인코딩 된 파일 (마지막 줄의 길이가 두 번째 줄과 동일)을 사용하여 로컬로 테스트하여 이것이 작동하는지 확인했습니다.

quine을보십시오.

젤리

필로우는 젤리의 줄 바꿈에 대한 별명이므로 소스는 다음과 같습니다.

3"0$p½'!+OR"½<0$p½e#
”ṘṘ

Jelly 프로그램의 마지막 행을 제외한 모든 행은 "도우미 링크"(즉, 함수)이며, 구문 적으로 유효한 경우 호출되지 않는 한 무시할 수 있습니다. 이것이 실제로 3CJam 및 GolfScript 프로그램에서 처음 나오는 이유입니다. 그렇지 않으면 "Jelly에서 구문 분석 할 수 없기 때문 입니다.

그렇지 않으면, 함수가 호출되지 않기 때문에 프로그램은 표준 Jelly quine 인 두 번째 행에만 해당합니다.

폴리 글롯을 사용해보십시오. | quine을보십시오.


9

> <> + Python, 2 개 언어, 51 46 바이트, 점수 ~ = 0.16 0.17

아직 답변이 없으므로 간단한 답변부터 시작하겠습니다.

#.09;!?lo}*2+2f"
_='_=%r;print _%%_';print _%_

> <>Python 을 사용해보십시오.

> <>의 경우 첫 번째 줄은 quine입니다 (# 반영, "는 전체 줄을 스택에 넣은 다음 34 (charcode for")를 누르고 모든 것을 인쇄합니다), 실행은 결코 이동하지 않으므로 나머지는 코드.

파이썬의 경우 첫 번째 줄은 주석이고 두 번째 줄은 퀴인입니다 (파이썬의 두 가지 인수와 동일한 문자열로 문자열 대체를 사용하는 표준 접근법).


1
> <> 답변에 약간의 적응은 약간의 바이트를 절약 할 수 있습니다 :-# "~ r10gol?!; 60. |!
Teal pelican

@Tealpelican 사용을 상기시켜 주셔서 감사합니다 .! 문자열을 역으로 유지하고 (바이트를 절약하기 g때문에) "소스 코드를 읽는 것으로 해석 될 수 있기 때문에" 사용을 피하기를 원하지만이 접근 방식을 사용하여 quine을 조정 했습니다.
Leo

g를 사용하지 않는 것은 꽤 공정한 점입니다. 보고 약간 생각하면 스택에서 # (아스키 35)를 사용하여 "좋아; # .09;!? lo} -1"
Teal pelican

7

JavaScript + Python 2 + Japt, 3 개 언어, 132 바이트, 점수 ~ = 0.205

A="`i96d)p2`i96d)p2";1//2;A=1
S="S=%s;console.log(S,uneval(S))";A//2;S="S=%r;print S%%S";"""
console.log(S,uneval(S))//""";print S%S

이것은 인쇄

S="S=%s;console.log(S,uneval(S))";console.log(S,uneval(S))

JavaScript (Firefox에서만)에서

S='S=%r;print S%%S';print S%S

파이썬 2에서

`i96d)p2`i96d)p2

Japt. ( 온라인 테스트! )

자바 스크립트

이것은 JavaScript가 보는 것입니다.

A="`i96d)p2`i96d)p2";1
S="S=%s;console.log(S,uneval(S))";A
console.log(S,uneval(S))

첫 번째 줄은 A사용되지 않기 때문에 아무 문제 가 없습니다. 제 2 라인 세트 S문자열 S=%s;console.log(S,uneval(S))과 교환 후 제 지문 그것 %suneval의 혼성 표현 S(단지 S인용 래핑). 결과는 JavaScript에서 엉망입니다.

파이썬

이것은 기본적으로 파이썬이 보는 것입니다.

A="`i96d)p2`i96d)p2";1//2;A=1
S="S=%s;console.log(S,uneval(S))";A//2;S="S=%r;print S%%S"
print S%S

첫 번째 라인은 거의 작동하지 않습니다. 유일한 중요한 부분은 A=1끝에 있습니다. 두 번째 줄 A의 정수 나누기 A//2가 오류를 발생시키지 않도록 숫자로 바뀝니다 .

두 번째 줄은 Sstring으로 설정 되는 것을 제외하고는 거의 같은 방식 S=%r;print S%%S입니다. 세 번째 줄은 S%r원시 표현으로 교체 한 후 인쇄합니다 S( S작은 따옴표로 묶음). 결과는 Python 2에서 quine입니다.

apt

이것은 Japt 인터프리터가 보는 JavaScript 코드입니다.

A="`i96d)p2`i96d)p2";1//2;A=1
S="S=%s;console.log(S,uneval(S))";A//2;S="S=%r;print S%%S";"","\nconsole.log(S,uneval(S))//","";.p("r".i("n".t(),S%S))

보시다시피, 대부분의 JavaScript 응답과 동일하지만 한 가지 예외가 있습니다. 마지막 두 줄이 결합됩니다. 결과적으로 이것은 인터프리터가 실제로 보는 것입니다.

A="`i96d)p2`i96d)p2";1
S="S=%s;console.log(S,uneval(S))";A

첫 번째 줄 A은 Japt quine으로 설정 되고 두 번째 줄 S은 JS quine의 일부로 설정 됩니다. 그러나 Japt에서는 마지막 표현식 만 출력으로 전송됩니다. 이것은 A이므로 출력은 `i96d)p2`i96d)p2입니다.


무엇입니까 uneval? 나를 위해 작동하지 않습니다
Cyoce


3

줄프 +> <>, 점수 = 2 ** 3 / 15 = 0.533 ....

"r0:g>o<
"Q«Q«

이것에 다른 언어를 추가하기 위해 노력하고 있습니다.


2

> <>, Python 2 및 3, 3 개 언어, 107 바이트, 점수 = 27/107 ~ = 0.252

#o<}-1:"
a=1/1is 1;b="(_%(_,b))"[a:-a|9];_='a=1/1is 1;b="(_%%(_,b))"[a:-a|9];_=%r;print %s';print (_%(_,b))

온라인으로 사용해보십시오 : Python 2 , Python 3 , > <>

Python 3 출력은 정확히 두 번째 줄이며 Python 2 출력은 이 quine 입니다. > <> 출력이 첫 번째 라인입니다.

설명

이 프로그램은 고전적인 Python 2 quine을 기반으로합니다.

_='_=%r;print _%%_';print _%_

먼저 파이썬 2와 파이썬 3 모두와 호환되도록 print명령문을 함수 호출로 변경하고 나중에 더 편리하게 사용할 공간을 추가했습니다.

_='_=%r;print (_%%_)';print (_%_)

다음으로 Python 2와 Python 3을 구별 할 수있는 방법이 필요했습니다. 가장 간단한 방법 중 하나는 /Python 2에서는 정수 나누기이지만 Python 3에서는 float 나누기 라는 사실을 이용하는 것입니다. 따라서 다음 코드 True는 Python에서 평가됩니다 . 2이지만 False파이썬 3에서는 :

1/1is 1

출력을 두 언어로 구별하기 위해 print호출 에서 첫 번째와 마지막 괄호를 선택적으로 제거해야했습니다 (그래서 공백이 필요하지 않은 이유 print는 Python 2에서 유효한 명령문 이 아닙니다 ) . 따라서 퀴니 하네스를 다음과 같이 수정해야했습니다.

a=1/1is 1;b="(_%(_,b))"[a:-a|9];_='a=1/1is 1;b="(_%%(_,b))"[a:-a|9];_=%r;print %s';print (_%(_,b))

그 표현의 a:-a|9평가 0:9파이썬 2와 1:-1파이썬 3에 따라서, b이다 "(_%(_,b))"파이썬 3에서,하지만 파이썬 2에서 첫 번째와 마지막 문자가 떠나 버려집니다 _%(_,b). 그리고 그 수정으로, 폴리 글롯은이 도전에 유효했습니다.

Teal pelican이 제안한 것처럼 Python에서 한 줄 주석 #o<}-1:"#시작 한다는 사실 덕분에 > <> quine을 상당히 쉽게 추가 할 수 있습니다 . 단순히 그것을 추가하고 줄 바꿈을하면 다른 언어가 추가되고 점수가 거의 10 배 증가합니다.


1

Python 2 + Retina, 2 개 언어, 55 바이트, 점수 = 2 ^ 3 / 55 ≈ 0.145

둘 다 유효한 ASCII를 유지 하는 $n대신 사용 했습니다 .

S='S=%r;print S%%S';print S%S#|
#$n\(*S1`$n\(*S1`
#\`#

파이썬 , 레티 나

파이썬 :

S='S=%r;print S%%S';print S%S

망막:


\(*S1`
\(*S1`

0

> <> + Pyke + Python 2, 81 바이트, 점수 = 3 ** 3 / 81 ~ 0.333

"""r00gol?!;60.
a=%r;print a%%a"""#);"34.Cp\D\Es"DEp00/
a=__doc__[-15:]
print a%a

나는 모든 언어로 다른 것을 시도했습니다.

> <> 참조 :

"""r00gol?!;60.

이것은 처음에 삼중 따옴표로 묶인 문자열을 사용하도록 표준> <> quine을 약간 수정 한 것입니다. 이를 통해 파이썬의 끝 삼중 따옴표가 다른 줄에있을 수 있습니다.

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

파이크는 본다 :

"34.Cp\D\Es"DEp00/

나는 Pyke에서 quine을 만들지 않았으므로 하나를 생각해야했습니다. 나는 전통적인 quining 기술을 사용하여 문자열을 만든 다음 입력으로 자체 문자열을 평가했습니다. 시각적 영향없이 작동하려면 경고를 비활성화해야합니다. 생성 단계에서 0으로 나누기 오류와 함께 오류가 발생합니다.

여기 사용해보십시오! 또는 단지 quine 부분입니다.

파이썬은 본다 :

모든. 파이썬은 모든 코드를 사용하여 quine을 생성합니다. docstring에 quine 부분을 포함하기로 결정했습니다 (결국 바이트를 절약 할 수는 있지만 멋지다고 생각합니다). 표준 quining 기술의 수정입니다.

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

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