编写印刷该语言名称的多语种


65

您的任务是编写一个程序,该程序以尽可能多的语言执行,并使用尽可能少的字符。为了避免简单的解决方案,该程序必须打印其运行语言的名称。

计分

您的程序必须至少支持5种语言。程序的分数为:

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

最高分数获胜,不早于第一个有效答案后的10天。


使用诸如print()针对Perl,Python,PHP,Processing和R 的解决方案会被认为是微不足道的还是可以接受的?
罗布2012年

3
一个看不到问题。困难在于每种语言切换打印输入。
mjgpy3 2012年

我应该对语言的数量给予更大的重视...似乎最好选择5种为最佳。我想知道如果得分是多少,将会在获胜者n * n / length
名单中出现几种

我也建议这样做。根据提供的答案,我认为我没有正确解释您的问题。
罗布(Rob)2012年

Answers:


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用Ruby,60Perl编写,并且print$=?...是几乎肯定Bash中的错误。Perl / Ruby / Bash测试可以将见解减少7个,现在可以将其放入单个eval语句中。

如果规则可以忍受更多的弯曲,我将介绍这8种语言,43个字符的解决方案(得分0.5262)

print("phperluarscriptrubypythoncatebg13");

的量,输出包括所述解释器的名称phpperlluarscriptrubypythoncat,和rot13


1
TI-Basic支持最后一个。只需添加6个字符并获得print("phperluarscriptrubypythontibasicatebg13");
Timtech

1
@Timtech不,TI-Basic使用DispOutput(text(令牌,没有print(命令。并且将字符串作为其他实值表达式​​的一部分包含在内会导致ERR:INVALID SYNTAX,而不是字符串的显示(甚至不作为返回值)。(也没有;; TI-Basic使用:
AJMansfield 2014年

@AJMansfield太对了,我怎么会忘记:?
Timtech,2014年

12
您可以替换echo Bashps -ocomm= -p$$?这将输出至少bash,zsh,ksh,csh和tcsh(可能还有其他)的shell名称。
数字创伤

19

C,C ++,BF,BASH和Ruby; 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

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***吗?
暴徒

是的,我相信。
mjgpy3

您应该使用if [ 1 = 2 ]而不是if [ 1 == 2 ],因为没有hashbang的脚本是由sh而不是bash执行的。sh可能是bash,也可能不是bash,在Debian上是破折号。
nyuszika7h 2014年

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
  • 抄送file.c
  • 抄送file.cpp
  • 抄送文件
  • 抄送文件

(其中cc是clang-421.10.42)


+1,因为许多其他推荐的答案均受您的启发。
凯文(Kevin)

11

Lua,Ruby,VimL,Sed,Befunge(129个字符;〜0.087分)

不知道这是否值得-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

5
哇,不包含C的解决方案
vsz 2012年

8

BF,Bash,Batch,C,vi(163个字符;得分≈.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
nyuszika7h 2013年

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])))

从技术上讲是有效的,如果您认为所有python版本都是不同的语言。目前有116个python版本,我相信它的得分约为18.37291。

(我也明白,如果这不是一个有效的答案,那只是为了好玩)


您仍然只是出于娱乐目的而获得了我的+1。
vsz

打印完整的版本号是否可行?(这减少了4个字节,并扩展了可能的Python版本。)
A _

还可以吗?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版本5,ECMAScript版本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...哦,你也可以尝试打高尔夫球吧....
数学机组

@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的添加第六种语言....
数学冷水机组

1
@tryingToGetProgrammingStraight添加jQuery是荒谬的,因为jQuery是一个库,而不是一种语言。CoffeeScript绝对不是与ECMAScript相同的语言。语言的定义是在有限字母上的一组有限字符串。代表有效CoffeeScript程序的字符串集与代表有效ECMAScript的字符串集不同。
彼得·奥尔森

1
你能[].map代替Array.prototype.map吗?
ETHproductions 2016年

3

Java,Lisp,Whitespace,Intercal,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

有趣的是……我清楚地记得在编译器中对此进行了测试,并且它可以正常工作……或者我的记忆使我无法
胜任

@Ypnypn请记住,“ T”是制表符,“ S”是空格,“ L”是空格换行,这就是为什么它不会引起编译器错误的原因。
Juan Sebastian Lozano 2014年

哦; 那讲得通。
Ypnypn

3

Windows批处理,TI-Basic,Golf-Basic 84QuomplexGTB 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撤消的语句,显示消息并转发到Label 1,并立即终止。这与GTB相似,显示字符方便~。顺便说一句,将不显示任何字符串Ans。如果后面没有显示命令,Ans则将输出(此处不是这种情况)。

Quomplex在一开始就被吸引了,因为它的复杂语法不允许跳过太多内容。它所做的只是将其添加"Quomplex"到输出中,然后用于程序的精通...

精通编程语法

:"'*[]'"

纯真天才。Quomplex忽略:并接受"''"作为字符串,使它输出堆栈并在无限的while循环([])中灭亡。同时,Golf-Basic和TI-Basic将整体"'*[]'"视为字符串,因为'它是数学运算符,而不是字符串运算符。


严格来说,:表示批处理文件中的标签,而不是注释。的确,它不会自行执行任何操作。
2014年

@Mark True,但是是::(尽管仍然是标签)。我宁愿使用它REM,也不愿使用它,尤其是因为TI-Basic需要它。
Timtech

是的-我只是在做书呆子。另外,首先要为+1使用批处理文件。:-)
标记

2

JScript,EcmaScript版本3、5、6、2016,节点,Mozilla JavaScript(得分≈0.1342)

这个答案最初是基于Peter Olson的答案,但减去了CoffeeScript(因为空白的重要语言在打高尔夫球时可能会很恐怖)。

我还添加了NodeES6ES2016,并对代码进行了一些修改,几乎是原始分数的三倍。

$=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,破折号,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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.