언어 이름을 인쇄하는 폴리 글 로트 작성


65

당신의 작업은 가능한 한 적은 문자로 가능한 한 많은 언어로 실행되는 프로그램을 작성하는 것입니다. 사소한 해결책을 피하려면 프로그램이 실행 된 언어의 이름을 인쇄해야합니다.

채점

프로그램은 5 개 이상의 언어로 작동해야합니다. 프로그램 점수는 다음과 같습니다.

(number of languages)1.5 / (length of program)

첫 번째 유효한 답변 후 10 일 이내에 최고 점수를 얻습니다.


print()Perl, Python, PHP, Processing 및 R에 사용하는 것과 같은 솔루션을 사용하는 것이 사소한 것으로 간주됩니까?
Rob

3
A에 문제가 없습니다. 언어별로 인쇄 입력을 전환하는 것이 어려울 수 있습니다.
mjgpy3

나는 언어의 수에 더 높은 가중치를 주어야했다. 정확히 5를 선택하는 것이 가장 최적 인 것으로 보인다. 나는 점수가 있다면 승자 항목에왔다 얼마나 많은 언어 궁금n * n / length
VSZ

나도 제안하려고 했어요. 제공된 답변을 바탕으로 귀하의 질문을 올바르게 해석했다고 생각하지 않습니다.
Rob

답변:


39

Bash, C, C ++, Obj-C, Obj-C ++, Perl, PHP, Ruby, 183 자

점수 ~ 0.1236

C 및 C와 유사한 코드의 경우 @ baby-rabbit에 대한 부채가 있습니다. 다른 언어는 많은 언어가 eval유효하지 않은 구문을 받아 들일 수있는 문장을 가지고 있다는 인식에서 영감을 얻었습니다 .

언어 이름을 표준 출력으로 출력합니다. 때때로 표준 오류에 대해 많은 오류 메시지가 생성되므로 2>/dev/null실행할 때 오류 메시지를 표시하지 마십시오.

#if 0
'PHP<?/*';eval "print\$=?'Perl':'Ruby';echo Bash";exit
__END__
#endif
#include <stdio.h>
main(){puts(
#ifdef __OBJC__
"obj-"
#endif
"C"
#ifdef __cplusplus
"++"
#endif
);}//*/?>'

PHP 솔루션 출력 'PHP'(작은 따옴표 포함)은 규칙을 약간 구부릴 수 있습니다.

마지막 편집 : 통찰력에서 12 개 문자 면도 $=있다 false, 루비 60펄, 그리고 print$=?...거의 확실 배쉬에서 오류가 발생합니다. Perl / Ruby / Bash 테스트에 대한 통찰력을 7 개 더 향상시켜 이제 단일 평가 문으로 넘어갈 수 있습니다.

규칙이 더 많은 굽힘을 견딜 수 있다면이 8 언어, 43 문자 솔루션 (점수 0.5262)을 제시합니다.

print("phperluarscriptrubypythoncatebg13");

하는 출력을위한 통역자의 이름이 포함되어 php, perl, lua, rscript, ruby, python, cat, 및 rot13.


1
TI-Basic은 마지막 것을 지원합니다. 그냥 6 문자를 추가하고 얻을print("phperluarscriptrubypythontibasicatebg13");
Timtech

1
@Timtech 아니, TI-기본은 사용 Disp하거나 Output(또는 text(토큰에는 존재하지 print(명령. 그렇지 않으면 실제 표현식의 일부로 문자열을 포함하면 문자열이 ERR:INVALID SYNTAX아닌 (반환 값이 아닌) 결과가됩니다. (또한, ;TI-Basic 용도 는 없습니다 :)
AJMansfield

@AJMansfield 너무 사실, 어떻게 잊을 수 있습니까?
Timtech

12
당신은 대체 할 수 echo Bash와 함께 ps -ocomm= -p$$? 이것은 적어도 bash, zsh, ksh, csh 및 tcsh에 대한 쉘 이름을 출력합니다.
Digital Trauma

19

C, C ++, BF, BASH 및 루비; 280 자

점수는 약 0.040입니다

#include "stdio.h"
#define s "C"
#ifdef __cplusplus
#define s "C++"
#endif
#ifndef s
#"+++++++++[>++++++++++>+++++++++<<-]>>-.<++++.>-.++++++++.<----.>---.<+++++++.>---.++++++++.<<++++++++++.[-]"
if [ 1 == 2 ];then
puts "Ruby"
exit
fi
echo "BASH"
exit
end
#endif
main(){puts(s);}

Linux 시스템을 사용하고 있습니다.

코드는 다음 명령으로 실행 또는 컴파일됩니다 (파일 이름은 test.c).

씨:

gcc test.c

로 실행하면 ./a.out출력은C

C ++ :

c++ test.c

로 실행하면 ./a.out출력은C++

세게 때리다:

./test.c

출력 : BASH

루비:

ruby test.c

출력 : Ruby

BrainF *** :

다음을 사용하여 확인했습니다.

출력 : brainfuck

JS 디버거를 사용하는 경우 처음 두 빼기 부호를 제거해야합니다. 문자열 리터럴에서 더하기 부호를 오프셋하기 위해 포함되었습니다 "C++". 이것은 매우 재미있는 프로젝트였습니다. 더 많은 언어를 추가하고 있습니다.

더 명확하게하기 위해 여기 내 통역사 / 컴파일러 사양이 있습니다.

  • gcc 버전 4.6.3

  • 루비 1.9.3p194 (2012-04-20 개정 35410) [x86_64-linux]

  • GNU bash, 버전 4.2.24 (1)-릴리스 (x86_64-pc-linux-gnu)

사이드 노트

@ baby-rabbit의 트릭을 사용하여 7 가지 언어 (objective-C 및 objective-c ++ 추가)로 실행 가능하도록 코드를 확장 할 수있었습니다. 이것은 일부를 복사 한 이후 내 해결책이 아니지만 그것을 보여 줄 것이라고 생각했습니다.

9.12 업데이트 gnu-smalltalk로 실행되는 SmallTalk가 추가되었습니다!

스몰 토크, C, C ++, 오브젝티브 -C, 오브젝티브 -C ++, BASH, BF, 루비; 384 자 (점수 : 0.059)

#if (a)
##(true) ifTrue: ['SmallTalk' printNl]
##(ObjectMemory quit)
#"+++++++++++[>++++++++++>+++++++++<<-]>>-.<++++.>-.++++++++.<----.>---.<+++++++.>---.++++++++.<<++++++++++.[-]"
if [ 1 == 2 ];then
puts 'Ruby'
exit
fi
echo 'BASH'
exit
end
=begin
#endif
#include "stdio.h"
main(){puts(
#ifdef __OBJC__
"Objective-"
#endif
"C"
#ifdef __cplusplus
"++"
#endif
);}
#ifdef b
=end
#endif

위의 코드에서 objective-c, obj-c ++, c 및 c ++에 대한 언어의 이름을 생성하려면 파일 이름을 바꿔야합니다.


출력하면 더 짧 brainf***습니까?
mob

그렇습니다, 나는 믿습니다.
mjgpy3

hashbang이없는 스크립트는 bash가 아니라 sh에 의해 실행되므로 if [ 1 = 2 ]대신 대신 사용해야합니다 if [ 1 == 2 ]. sh는 bash 일 수도 있고 아닐 수도 있습니다. 데비안에서는 대시입니다.
nyuszika7h

12

bash, c, c ++, obj-c, obj-c ++; 134 자; 점수 = 0.083

#if x
echo "bash"
exit
#endif
#include <stdio.h>
int main(){puts(
#ifdef __OBJC__
"obj-"
#endif
"c"
#ifdef __cplusplus
"++"
#endif
);}

파일 이름을 바꾸고 다음과 같이 실행 / 컴파일하십시오 :

  • sh file.sh
  • cc file.c
  • cc 파일 .cpp
  • cc 파일 .m
  • cc 파일 .mm

(cc는 clang-421.10.42입니다)


다른 많은 찬란한 답변이 귀하의 답변에서 영감을 얻었으므로 +1입니다.
Kevin

11

Lua, Ruby, VimL, ​​Sed, Befunge (129 자, ~ 0.087 포인트)

sed-part는 shebang 라인에 내장되어 있으며 제한을 극복하기위한 해킹 일 것입니다. 또한 실행 파일로 직접 실행하지 말고 실행 파일로 실행해야합니다 sed.

다른 모든 언어 (Sans Befunge)는 자동으로 shebang 라인을 무시합니다 (루비에 문자열 'ruby'가 포함되어 있지 않은 shebang 라인이 있으면 파일 실행을 거부하는 것 같습니다).

#!sed sanava;s/.*/sed/;q;ruby
--"".to_i#>"egnufeB">:#,_@
if 0
then
if IO
then
puts"Ruby"
else
print"Lua"
end
else
echo"VimL"
end

샘플 사용법 :

% lua tmp/glot.poly
Lua
% ruby tmp/glot.poly
Ruby
% ./tmp/glot.poly
sed
% cfunge tmp/glot.poly       # Requires Befunge-98
Befunge

:source tmp/glot.poly        # from vim
VimL                         # displayed as message

5
와우, C를 포함하지 않는 솔루션
vsz

8

BF, Bash, Batch, C, vi (163 자; 점수 06 .0686)

( <ESC>ASCII 코드 27을 나타냅니다.)

rem (){ ((0));};true /*
rem ;goto(){ rem;}
rem ivi<ESC>ZZ'++++++++[>NUL ++++++++<NUL -]>NUL ++.++++.*/;main(){puts("C");}/*'
goto a
echo Bash
exit
:a
echo Batch
rem */

COMMAND.COM의 MS-DOS 6.22 버전을 배치 파일로 테스트했습니다. 기본적으로 해당 인터프리터는 소스 코드 행을 출력과 혼합합니다. 이를 방지하려면 echo off배치 파일을 실행 하기 전에 실행하십시오.

Vim을 사용하여 테스트 한 vi 코드를 실행하려면 다음 명령을 사용하십시오.

cat /dev/null > tmpfile && vi -s polyglot.sh tmpfile > /dev/null 2>&1 && cat tmpfile

1
대신 touch tmpfile또는 : > tmpfile대신 사용할 수 있습니다 cat /dev/null > tmpfile.
nyuszika7 시간

5

bash, zsh, ksh, csh, tcsh, 15 자, 점수 0.745

이것은 모두 관련 언어이기 때문에 약간의 확장이지만 차이점이 있습니다.

ps -ocomm= -p$$

대시는 어떻습니까?
Elliot A.

4

모든 Python 릴리스, 18.37291 점

import sys
print('Python '+'.'.join(map(str,sys.version_info[:-2])))

모든 파이썬 버전을 다른 언어로 간주하면 기술적으로 유효합니다. 현재 116 개의 파이썬 버전이 있으며, 약 18.37291의 점수를 얻습니다.

(또한 이것이 올바른 답변으로 간주되지 않는 경우 이해하기 만합니다.)


당신은 여전히 ​​재미있게 내 +1을 얻습니다.
vsz

완전한 버전 번호를 인쇄 할 수 있습니까? (이것은 4 바이트로 축소되고 가능한 파이썬 버전을 확장합니다.)
_

이것도 괜찮습니까? tio.run/##K6gsycjPM/7/…
A _

3

Bash, C, Gawk, Perl, vi (145 자; 점수. .077)

( <BS>ASCII 코드 (8)의 약자 <ESC>ASCII 코드 (27)를위한 스탠드)

#define echo//<BS><BS><BS>vi<ESC>ZZ
#define BEGIN A()
#define B\
{
echo Bash ;exit;
#define C\
}
BEGIN {printf(A=="A"?"Perl":"Gawk");exit;}
main(){puts("C");}

Vim을 사용하여 테스트 한 vi 코드를 실행하려면 다음 명령을 사용하십시오.

cat /dev/null > tmpfile && vi -s polyglot.sh tmpfile > /dev/null 2>&1 && cat tmpfile

3

이것은 저렴한 언어 선택이지만 다음과 같습니다.

CoffeeScript, JScript, Mozilla Javascript (≈ JavaScript 1.3), ECMAScript Edition 5, ECMAScript Edition 3, 223 자, 점수 ≈ 0.0501)

a="undefined"
x="ECMAScript 3"
if(Array.prototype.map)
 x="ECMAScript 5"
if(typeof CoffeeScript!=a)
 x="CoffeeScript"
if(typeof uneval!=a)
 x="Mozilla JavaScript"
if(typeof WScript!=a)
 WScript.echo("JScript")
else alert(x)

5
JavaScript, JavaScript, JavaScript (≈ JavaScript), JavaScript, JavaScript, 263 자 (점수 ≈ 0). 당신은 또한 그것을 더 짧게 만들 수 a="undefined";if(typeof arguments!=a)...else if(typeof WScript!=a...있고 당신은 또한 골프를 시도해 볼 수 있습니다 ....
Math chiller

@tryingToGetProgrammingStraight 모든 것을 한 줄에 넣는 것은 CoffeeScript (Javascript와는 별도의 언어)의 유효한 구문이 아닙니다. 다른 것들은 논쟁의 여지가 있지만, 언어가 얼마나 달라야하는지 명시되어 있지 않기 때문에 구현마다 다른 특정 행동이 있기 때문에 그것들을 별개로 취급 할 수 있다고 생각합니다.
피터 올슨

나는 또한 캔트 여러 줄의 코멘트를 작성, 당신이 밖으로 떠나는 사용하는 것 같다 유일한 골프는 {/ }/ ;... 아이디어는 사용하는 a재사용 방지하기 위해 "undefined"당신은 또한 할 수있는, b=alert다음과 b("this is also still just javascript"). 어쨌든 The golden rule of CoffeeScript is: "It's just JavaScript"( coffeescript.org에서 ) jquery를 사용하여 여섯 번째 언어를 추가 할 수도 있습니다.
Math chiller

1
@tryingToGetProgrammingStraight jQuery는 언어가 아닌 라이브러리이기 때문에 jQuery를 추가하는 것은 터무니 없다. CoffeeScript는 분명히 ECMAScript와 같은 언어가 아닙니다. 언어의 정의는 유한 알파벳에 대한 유한 문자열 집합입니다. 유효한 CoffeeScript 프로그램을 나타내는 문자열 세트는 유효한 ECMAScript를 나타내는 문자열 세트와 다릅니다.
피터 올슨

1
[].map대신에 할 수 있습니까 Array.prototype.map?
ETHproductions

3

자바, 리스프, 공백, 인터 칼, PHP, Befunge-98; 점수 = .0189

이것은 원래에 대한 답변이었다 .

 ;\\0"egnufeB">:#,_@SSSTTTSTTTL
;TL
;SSSSSTTSTSSSL
;TL
;SSSSSTTSTSSTL
;TL
;SSSSSTSTSTSSL
;TL
;SSSSSTTSSTSTL
;TL
;SSSSSTSTSSTTL
;TL
;SSSSSTTTSSSSL
;TL
;SSSSSTTSSSSTL
;TL
;SSSSSTTSSSTTL
;TL
;SSSSSTTSSTSTL
;SSL
;L
;L
;L
;public class H{ public static void main(String []a){System.out.println("JAVA");}}
;/*
(print "LISP")
;*/
;//<?php
; echo "PHP"
;//?>
;/*
#|
DO ,1 <- #8
DO ,1 SUB #1 <- #110
DO ,1 SUB #2 <- #32
DO ,1 SUB #3 <- #72
DO ,1 SUB #4 <- #136
DO ,1 SUB #5 <- #88
DO ,1 SUB #6 <- #136
PLEASE DO ,1 SUB #7 <- #64
DO ,1 SUB #8 <- #80
PLEASE READ OUT ,1
PLEASE NOTE |#
;*/
;// PLEASE GIVE UP

Java에서는 작동하지 않습니다. 때까지 모든 줄 public class...은 컴파일러 문제를 일으킬 것입니다.
Ypnypn

흥미 롭다 ... 나는 이것을 컴파일러에서 테스트 해 본 기억이있다. 또는 아마도 나의 기억이 실패한다.
Juan Sebastian Lozano

@Ypnypn "T"는 탭이고 "S"는 공백이며 "L"은 공백의 줄 바꿈이므로 컴파일러 오류가 발생하지 않습니다.
후안 세바스티안 로자노

오; 말이 되네요
Ypnypn

3

Windows Batch, TI-Basic, Golf-Basic 84 , QuomplexGTB 5 * 2 / 93 = 0.11

::¤Quomplex¤:"'*[]'":~"GTB":g;1:d`"GOLF-BASIC 84":g`1:"TI-BASIC":Lbl 1:End
echo Windows Batch

작동 원리

::주석이 시작 되기 때문에 Windows Batch가 가장 쉬웠습니다 . 구현이 상당히 간단합니다.

TI-Basic은 소문자 나 백틱을 지원하지 않으므로 d`"GOLF-BASIC 84":g`1Golf-Basic에서 설명하는 메시지 를 생략 하고 메시지를 표시하고 레이블 1로 전달 하는 문을 건너 뜁니다 . 이것은 편리한 표시 문자 인 GTB와 유사합니다 ~. 그건 그렇고, 표시가없는 문자열이에 삽입됩니다 Ans. 뒤에 표시 명령이 없으면 Ans출력됩니다 (여기서는 해당되지 않음).

Quomplex는 복잡한 구문으로 많은 것을 건너 뛸 수 없기 때문에 처음에는 몰두했습니다. 그것은 "Quomplex"출력에 추가 한 다음 프로그램의 숙달을 위해 추가됩니다 ...

프로그래밍 구문의 숙달

:"'*[]'"

순수한 천재. Quomplex는 무시 :하고 소요 "''"출력에두고 스택을 문자열로하면서 루프 (무한에 소멸 []). 한편 Golf-Basic과 TI-Basic 은 문자열 연산자가 아닌 수학 연산자 "'*[]'"이기 때문에 전체 를 문자열로 사용합니다 '.


엄밀히 말하면, :주석이 아닌 배치 파일의 레이블을 나타냅니다. 그러나 자체적으로 아무것도 실행하지 않는다는 것은 사실입니다.
Mark

@Mark True, 그러나입니다 ::(여전히 레이블입니다). REMTI-Basic에서 필요 하기 때문에보다 사용하고 싶습니다 .
Timtech

맞아-난 그냥 농민이었고 또한 배치 파일을 처음 사용하는 경우 +1입니다. :-)
Mark

2

JScript, EcmaScript Edition 3, 5, 6, 2016, 노드, Mozilla JavaScript (점수 342 0.1342)

이 답변은 원래 Peter Olson의 답변을 기반으로하지만 CoffeeScript를 뺀 것입니다 (공백에 중요한 언어는 골프에 끔찍할 수 있음).

또한 Node , ES6ES2016 을 추가하고 코드를 약간 골프화하여 원래 점수를 거의 세 배로 늘 렸습니다.

$=this,y="EcmaScript ",x=$.module?"Node":$.uneval?"Mozilla JavaScript":"".padStart?y+2016:$.Map?y+6:[].map?y+5:y+3,($.WScript||$.alert)(x)

2

16 개 언어, 348 바이트, 점수 : 0.183908046

#include <stdio.h>
#if 0
#replace "C(gcc)" "C(ecpp)"
#replace "C++(gcc)" "C++(ecpp)"
#endif
#ifdef __clang__
#define d 2
#elif __TINYC__
#define d 4
#else
#define d 0
#endif // rk:start print: "rk" \
ps -ocomm= -p$$; exit;
int x=sizeof('a')%2+d;char*arr[]={"C(gcc)","C++(gcc)","C(clang)","C++(clang)","C(tcc)"};int main(){puts(arr[x]);}

C (gcc), C ++ (gcc), C (ecpp), C ++ (ecpp), C (clang), C ++ (clang), C (tcc), sh, dash, bash, zsh, ksh, csh, tcsh, rk 및 SIL.


0

JScript, EcmaScript Edition 3, 5, 6, 2016, 2017, Node, Mozilla JavaScript (점수 = .174193548387), CoffeeScript (공백에 중요한 언어는 골프에 끔찍할 수 있음)

$=this,y="EcmaScript ",($.WScript||alert)(x=Object.values?y+2017:$.module?"Node":$.uneval?"Mozilla JavaScript":[].includes?y+2016:$.Map?y+6:[].map?y+5:y+3)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.