您的任务是编写一个程序,该程序以尽可能多的语言执行,并使用尽可能少的字符。为了避免简单的解决方案,该程序必须打印其运行语言的名称。
计分
您的程序必须至少支持5种语言。程序的分数为:
(number of languages)1.5 / (length of program)
最高分数获胜,不早于第一个有效答案后的10天。
n * n / length
您的任务是编写一个程序,该程序以尽可能多的语言执行,并使用尽可能少的字符。为了避免简单的解决方案,该程序必须打印其运行语言的名称。
您的程序必须至少支持5种语言。程序的分数为:
(number of languages)1.5 / (length of program)
最高分数获胜,不早于第一个有效答案后的10天。
n * n / length
Answers:
得分〜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
用Ruby,60
Perl编写,并且print$=?...
是几乎肯定Bash中的错误。Perl / Ruby / Bash测试可以将见解减少7个,现在可以将其放入单个eval语句中。
如果规则可以忍受更多的弯曲,我将介绍这8种语言,43个字符的解决方案(得分0.5262)
print("phperluarscriptrubypythoncatebg13");
的量,输出包括所述解释器的名称php
,perl
,lua
,rscript
,ruby
,python
,cat
,和rot13
。
print("phperluarscriptrubypythontibasicatebg13");
Disp
或Output(
或text(
令牌,没有print(
命令。并且将字符串作为其他实值表达式的一部分包含在内会导致ERR:INVALID SYNTAX
,而不是字符串的显示(甚至不作为返回值)。(也没有;
; TI-Basic使用:
)
echo Bash
用ps -ocomm= -p$$
?这将输出至少bash,zsh,ksh,csh和tcsh(可能还有其他)的shell名称。
得分大约是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
)
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!
SmallTalk,C,C ++,Objective-C,Objective-C ++,BASH,BF,Ruby;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***
吗?
if [ 1 = 2 ]
而不是if [ 1 == 2 ]
,因为没有hashbang的脚本是由sh而不是bash执行的。sh可能是bash,也可能不是bash,在Debian上是破折号。
#if x
echo "bash"
exit
#endif
#include <stdio.h>
int main(){puts(
#ifdef __OBJC__
"obj-"
#endif
"c"
#ifdef __cplusplus
"++"
#endif
);}
重命名文件并运行/编译为:
(其中cc是clang-421.10.42)
不知道这是否值得-sed部分嵌入在shebang行中,这可以说是绕开限制的一种方法。这也意味着它应作为可执行文件而不是直接与一起运行sed
。
我很幸运,所有其他语言(sans Befunge)都自动忽略了shebang行(尽管如果Ruby的shebang行中不包含字符串'ruby',显然Ruby拒绝运行该文件)。
#!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
(<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
touch tmpfile
或: > tmpfile
代替cat /dev/null > tmpfile
。
import sys
print('Python '+'.'.join(map(str,sys.version_info[:-2])))
从技术上讲是有效的,如果您认为所有python版本都是不同的语言。目前有116个python版本,我相信它的得分约为18.37291。
(我也明白,如果这不是一个有效的答案,那只是为了好玩)
(<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
这是一种廉价的语言选择,但是这里有:
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)
a="undefined";if(typeof arguments!=a)...else if(typeof WScript!=a...
哦,你也可以尝试打高尔夫球吧....
{
/ }
/ ;
...的想法是使用a
,以避免重复使用"undefined"
,你也可以做b=alert
,然后b("this is also still just javascript")
。反正The golden rule of CoffeeScript is: "It's just JavaScript"
(从coffeescript.org),你也可以使用一些jQuery的添加第六种语言....
[].map
代替Array.prototype.map
吗?
这最初是对此的答案。
;\\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
public class...
都会引起编译器问题。
::¤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`1
Golf-Basic撤消的语句,显示消息并转发到Label 1,并立即终止。这与GTB相似,显示字符方便~
。顺便说一句,将不显示任何字符串Ans
。如果后面没有显示命令,Ans
则将输出(此处不是这种情况)。
Quomplex在一开始就被吸引了,因为它的复杂语法不允许跳过太多内容。它所做的只是将其添加"Quomplex"
到输出中,然后用于程序的精通...
精通编程语法
:"'*[]'"
纯真天才。Quomplex忽略:
并接受"'
和'"
作为字符串,使它输出堆栈并在无限的while循环([]
)中灭亡。同时,Golf-Basic和TI-Basic将整体"'*[]'"
视为字符串,因为'
它是数学运算符,而不是字符串运算符。
:
表示批处理文件中的标签,而不是注释。的确,它不会自行执行任何操作。
::
(尽管仍然是标签)。我宁愿使用它REM
,也不愿使用它,尤其是因为TI-Basic需要它。
这个答案最初是基于Peter Olson的答案,但减去了CoffeeScript(因为空白的重要语言在打高尔夫球时可能会很恐怖)。
我还添加了Node,ES6和ES2016,并对代码进行了一些修改,几乎是原始分数的三倍。
$=this,y="EcmaScript ",x=$.module?"Node":$.uneval?"Mozilla JavaScript":"".padStart?y+2016:$.Map?y+6:[].map?y+5:y+3,($.WScript||$.alert)(x)
#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,破折号,bash,zsh,ksh,csh, tcsh,rk和SIL。
print()
针对Perl,Python,PHP,Processing和R 的解决方案会被认为是微不足道的还是可以接受的?