제한된 폴리 글롯


20

폴리 글 로트는 여러 프로그래밍 언어에서 동시에 유효한 프로그램입니다. 이러한 폴리 글 로트 대부분은 한 언어의 특정 구문이 다른 언어의 주석으로 해석되는 방식으로 작성됩니다 (예 : #defineC에서 여러 스크립팅 언어의 주석으로 해석 됨).

주석이 포함되지 않은 사소한 폴리 글 로트를 만들 수 있는지 여부가 궁금하지만 공백이 아닌 문자를 제거하면 즉시 변경되므로 이러한 프로그램을 제안해야합니다.

구체적인 규칙은 다음과 같습니다.

  1. (산출). 프로그램은 콘솔에서 각 언어로 출력해야합니다. 즉, 프로그램은 아무 것도 인쇄하지 않고 단순히 종료 할 수 없습니다.
  2. (변화). 표준 폴리 글 로트 정의가 완화됨에 따라 프로그램의 출력은 언어마다 다를 수 있습니다.
  3. (오류). 귀하의 프로그램은 귀하의 언어 하에서 어떠한 오류 (광의로 정의 된)를 생성해서는 안됩니다. 대부분의 언어에서 이는 컴파일러 및 / 또는 인터프리터에서 0이 아닌 종료 코드를 반환하는 것으로 정의됩니다.
  4. (제한). 코드에서 단일 공백이 아닌 문자의 제거는 아래의 동작을 변경하는 프로그램 야기한다 모든 당신의 언어 중 하나를. 프로그램은 해당 언어에 대해 유효하지 않거나 생성 된 출력을 변경하여 "변경"할 수 있습니다.
  5. 이것은 코드 도전 이다. 승자는 대부분의 프로그래밍 언어에서 유효한 프로그램입니다. 프로그램 길이가 짧아지면 타이가 끊어집니다.

제한 규칙은 여러 문자를 제거 할 때는 적용되지 않습니다. 즉, 여러 문자를 동시에 제거해도 언어 중 하나가 변경되지 않는 것이 좋습니다.

공백이 아닌 문자를 제거해도 공백 프로그램의 동작이 변경되지 않으므로 제한 규칙에서 공백을 언어 중 하나로 사용할 수 없음을 의미합니다.

다음은 Python 2 및 Python 3 언어에 대한 위의 모든 제한 사항을 충족시키는 프로그램의 간단한 예입니다.

print("Hello World!")

문자를 제거 print하면 두 언어 모두에서 NameError; 대괄호 또는 따옴표를 SyntaxError제거하면을 발생시키고 문자열 문자를 제거하면 두 언어로 출력이 변경됩니다. ( print("hello", "world")위의 규칙에 따라 더 미묘하지만 여전히 유효한 프로그램입니다).

이 예제는 Python 2와 Python 3이 매우 유사하기 때문에 약간 불충분하므로 동일한 언어의 다른 버전 (특히 Python 2 및 Python 3) 만 사용하는 다른 솔루션은 허용하지 않습니다.


@ IngoBürk :이 규칙 은 다른 언어도 공백 전용이 아닌 한 공백을 포함하는 기능적 폴리 글 로트를 작성하지 못하게합니다 .
nneonneo

1
예를 들어, print("Hello World!")유효한 루비 코드입니다
Cristian Lupascu

[polyglot]에 대한 간단한 답변 (내 것과 같은)이 너무 많은 언어를 가질 수 있다는 것은 약간 성가신 일입니다.
저스틴

5
무수한 언어 변형이나 비슷한 구문을 가진 언어를 피하려면 프로그램이 다른 출력을 생성하는 경우에만 두 언어가 다른 것으로 계산하는 것이 더 흥미로울 것입니다.
Gilles 'SO- 악마 그만'

답변:


13

배쉬 + GolfScript + CJam

"echo" []
{ cat<&3;} \
3<""<("echo" 'p'~)

산출

세게 때리다:

[]
p~

GolfScript :

"echo"
echo{ cat<&3;}0

CJam :

echo{ cat<&3;}-1echop

있다 \x7fCJam의 출력의 끝에있다.


... 잠시, 중복되지 않고이 세 가지 언어로 어떻게 작동합니까?
nneonneo

@nneonneo 사용하지 않는 모든 코드를 다른 언어로 인쇄합니다.
jimmy23013

8

배쉬 + Befunge

"echo" $,$,"ol":,,,@

'hello'를 재미있게 인쇄합니다.


1
모든 문자 (공백 제외)가 Befunge에서 무언가를한다는 것을 증명할 수 있습니다. 나는 Bash를 위해 그렇게 할 수 없다. 이것은 인상적입니다.
저스틴

7

bc, GolfScript, Homespring, huh, Octave, Scilab (0 바이트)

규칙 4를 준수하도록 보장합니다. 승자는 아니지만 타이 브레이크에서 잘 할 것입니다.

산출

기원전

Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.

GolfScript


자손

In Homespring, the null program is not a quine.

?

옥타브

GNU Octave, version 3.6.4
Copyright (C) 2013 John W. Eaton and others.
This is free software; see the source code for copying conditions.
There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  For details, type `warranty'.

Octave was configured for "x86_64-redhat-linux-gnu".

Additional information about Octave is available at http://www.octave.org.

Please contribute if you find this software useful.
For more information, visit http://www.octave.org/get-involved.html

Read http://www.octave.org/bugs.html to learn how to submit bug reports.

For information about changes from previous versions, type `news'.

시실 랩

Startup execution:
  loading initial environment

-->

2
나는 이런 종류의 일을 수행하여 길이가 0 인 quine을 방지하는 esolang이 있다는 것을 알고 있습니다 (오, 잠깐, Homespring입니다 ). 저는 믿습니다 응? 무언가를 출력합니다.
저스틴

감사! 슬프게도, 나는 설득 할 수 없습니까? 리눅스에서 실행 ...
데니스

1
필요한 것은 모노를위한 여분의 패키지였습니다. What?\n?그런데 프로그램이 인쇄합니다 .
Dennis

1
GNU Make에서도 작동합니다 (프로그래밍 언어 인 경우).make: *** No targets. Stop.
jimmy23013

1
@ user23013 : 그렇습니다. 이 경우 make의 종료 코드는 2이므로 유효한 항목이 아닙니다.
Dennis

6

GolfScript + PHP + CJam + Mathematica + bc + Pyth + /// + TI-Basic + R + Octave + Matlab + Scilab + Numeric Topline +? 푸에 + 응?

10

Golscript, PHP, CJam, Mathematica, bc, Pyth, /// 및 TI-Basic에서 출력 10합니다.

R에서는 출력 [1] 10

옥타브에서는 출력 ans = 10

Matlab과 Scilab에서는을 출력 ans = 10합니다.

Numeric Topline에서는을 출력 0합니다.

내가 Fueue를 올바르게 이해하면 개행을 출력 한 다음 고양이 프로그램으로 작동합니다.

허에서?

What?
?

1
또한 CJam에서 작동
8월

5
인터랙티브 인터프리터가 중요하다고 생각하지 않습니다.
nneonneo

2
이것은 많은 언어로 잘 작동하지만 많은 언어로 출력을 제공하지는 않습니다.
Justin

1
이것은 HTML , bc , MatlabScilab 에서도 유효합니다 . 로 변경 72하면 숫자 Topline으로10 인쇄 0됩니다 .
Dennis

HTML은 간단한 산술이나 루프 수단이 없기 때문에 메타 토론에 따르면 프로그래밍 언어가 아닙니다.
Ingo Bürk

3

이 답변이 완전히 정확하지 않은 것 같습니다.
나는 부분적으로 그것을 고치고 며칠 안에 다른 부분을 향상시킬 것입니다.

C ++ 및 자바 스크립트

아이디어는 다음과 같습니다.

void eval(bool="main=function(){alert('Hi from Javascript!')};puts=function(){};int=0");
int
main()
{
puts("Hi from C++!");
}

C ++ : http://codepad.org/SK2wbIDL
Javascript : 브라우저 콘솔에 코드를 복사하기 만하면됩니다.

그리고 그것을 만족시키기 위해 일련의 수정

(제한). 코드에서 공백이 아닌 단일 문자를 제거하면 프로그램이 모든 언어에서 동작을 변경해야합니다. 프로그램은 해당 언어에 유효하지 않게되거나 생성 된 출력을 변경하여 "변경"할 수 있습니다.

자바 스크립트 측면에서 :

변경 int, main또는 puts선언되지 않은 변수의 읽기와 충돌합니다. 그러나 bool하고 Hi from C++!안전하게 변경 될 수 있습니다. 고치자 :

puts=function(){}
puts=function(s){s=='Hi from C++!'?bool:nope}

문자열이 같으면의 존재 여부를 확인 bool하고 그렇지 않은 경우 선언되지 않은 상태로 충돌 nope합니다.

이제 제거 할 수있는 후미 세미콜론이 2 개 있습니다. 첫 번째는 쉽게 고정되어 있습니다 int.

void eval(bool="main=function(){alert('Hi from Javascript!')};puts=function(){};int=0");int

두 번째는 이전 }이므로 두 언어 모두에서 유효하며 C ++의 끝에 세미콜론이 필요하지 않거나 js에서 세미콜론을 강제하지 않아도됩니다. 벌금:

while(0);

while본문에 필요하면 js에서 세미콜론을 생략하는 것은 불가능합니다 .

따라서 현재 프로그램은 다음과 같습니다.

void eval(bool="main=function(){alert('Hi from Javascript!')};puts=function(s){s=='Hi from C++!'?bool:nope};int=0");int
main()
{
puts("Hi from C++!");while(0);
}

C ++ 측면에서 :

두 가지 문제 eval가 있습니다. 모든 이름을 가질 수 있으며 모든 js 코드를 변경할 수 있습니다.

며칠 안에 문제를 해결하려고 노력할 것입니다.


2

CJam + 골프 스크립트

좋아, 이것은 다소 지루하지만 시작입니다.

1,

두 언어 모두에서 "0"을 인쇄합니다. 제거 1하면 오류가 발생하여 ,인쇄 "1"이 제거 됩니다.

동일하게 수행 할 수 있습니다 1)또는 1(. 많은 대안이 있습니다.

(예, 이것이 코드 골프가 아니라는 것을 알고 있습니다)


2

C와 C ++

#include <stdio.h>
int main() { puts("Hello!"); return 0; }

C와 C ++ 서로 거의 호환되는 다른 언어입니다 - 당신이 C ++를들을 수있는 것과 달리에서 C. 봐의 슈퍼 아니다 http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B 약간의 차이를 . 위의 예는 관용적 인 C ++은 아니지만 C와 C ++에서 모두 작동하며 동일한 출력을 생성합니다.


0for C를 제거 할 수 있습니다 .
Dennis

@Dennis C89에 없음.
Gilles 'SO- 악마 그만해'

@Gilles : 기본 함수가 값을 지정하지 않은 반환을 실행하면 호스트 환경으로 반환되는 종료 상태는 정의되지 않습니다. ( C89 Draft-2.1.2.2 Hosted environment ) 프로그램을 무효화하지 않거나 출력을 변경하지 않으므로이 질문의 목적 0으로 제거 할 수 있습니다.
Dennis

@Dennis 지정되지 않은 종료 코드는이 질문의 규칙에 따라 프로그램을 유효하지 않은 것으로 간주합니다. 그렇지 않으면이 프로그램이 gcc -ansix86 (또는 다른 많은 아키텍처) 과 같이 0이 아닌 종료 코드를 반환하는 C89 구현을 확인하십시오. 런치 값은 puts런타임이 값을 읽는 레지스터에있게됩니다. main함수 에서 돌아옵니다 ).
Gilles 'SO- 악마 그만'

@Gilles : 규칙 3에 대한 해석은 컴파일러가 프로그램이 아닌 0을 반환해야한다는 것입니다.
Dennis

2

JavaScipt, Lua, R 및 Python 3-24 바이트

다른 언어에서도 작동 할 수 있으므로 후자를 테스트하겠습니다.

alert=print;alert(1)

자바 스크립트는 파이어 폭스의 콘솔과 다른 언어로 테스트되었습니다 여기 , 여기여기에


1

펄 + 루비 + 파이썬

PHP에서 실행하면 세미콜론이 필요하다고 생각 -R합니다.

print "Hello World!"

이것은 파이썬에서도 작동합니다.
8월

1
Lua 와도 작동합니다.
Trebuchette

1

배쉬 + sh + zsh + ksh, 4 바이트 :

echo

매우 간단하고 모든 규칙을 충족합니다.

  1. 각 언어로 줄 바꿈을 출력합니다.
  2. 현재 언어마다 출력이 달라 지지 않습니다 .
  3. 어떤 언어에서도 오류가 발생하지 않습니다 ...
  4. ... 문자가 제거 / 변경되는 경우를 제외하고 .

0

Bash + sh + zsh + ksh + Windows Batch, 4 바이트 :

echo

매우 간단하고 모든 규칙을 충족합니다.

각 언어마다 다르지 않은 줄 바꿈을 출력하지만 ECHO is on문자를 제거하거나 변경할 때를 제외하고는 사용하는 언어로 출력되는 Windows Batch에서 오류가 발생하지 않습니다.


1
귀하의 답변은 다음과 거의 동일합니다 : codegolf.stackexchange.com/a/100654/65326
Uriel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.