言語の名前を印刷する多言語を書く


65

あなたの仕事は、できるだけ少ない文字数で、できるだけ多くの言語で実行するプログラムを書くことです。些細な解決策を避けるために、プログラムは実行された言語の名前を印刷する必要があります。

得点

プログラムは少なくとも5つの言語で動作する必要があります。プログラムのスコアは次のとおりです。

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

最初の有効な回答から10日以内に最高のスコアが獲得されます。


print()Perl、Python、PHP、Processing、およびRに使用するようなソリューションを使用することは簡単なことと見なされますか?
ロブ

3
問題はありません。難しさは、言語ごとに印刷の入力を切り替えることです。
mjgpy3

言語の数により高い重みを付けるべきだった...正確に5つを選択するのが最も最適だと思われる。スコアがn * n / length
–vsz

私もそれを提案するつもりでした。提供された回答に基づいて、あなたの質問を適切に解釈したとは思わない。
ロブ

回答:


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$=?...、ほぼ確実にバッシュでエラーです。Perl / Ruby / Bashテストは、洞察からさらに7つ削られ、単一のevalステートメントに入ることができます。

ルールがより多くの曲げに耐えられる場合、この8つの言語、43文字のソリューション(スコア0.5262)を提示します

print("phperluarscriptrubypythoncatebg13");

そのため出力のためのインタプリタの名前を含むphpperlluarscriptrubypythoncat、およびをrot13


1
TI-Basicは最後のものをサポートしています。6文字を追加して取得しますprint("phperluarscriptrubypythontibasicatebg13");
Timtech

1
@Timtechいいえ、TI-BasicはDispor Output(またはtext(トークンを使用しprint(ます。コマンドはありません。そして、それ以外の場合は実数値の式の一部として文字列を含めると、文字列ERR:INVALID SYNTAXの表示ではなくが返されます(戻り値としても)。(また、NOがあり;、TI-基本用途が:
AJMansfield

@AJMansfieldあまりにも本当です、どうすれば忘れられますか?
ティムテック14

12
あなたは置き換えることができecho Bashps -ocomm= -p$$?これにより、少なくともbash、zsh、ksh、csh、tcshなどのシェルの名前が出力されます。
デジタル外傷

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++

BASH:

./test.c

出力: BASH

ルビー:

ruby test.c

出力: Ruby

BrainF ***:

以下を使用して検証済み:

出力: brainfuck

JSデバッガーを使用する場合は、最初の2つのマイナス記号を削除する必要があることに注意してください。文字列リテラルのプラス記号を相殺するために含まれています"C++"。これは非常に楽しいプロジェクトでした。私は言語の追加に取り組んでいます。

さらに明確にするために、インタープリター/コンパイラーの仕様を以下に示します。

  • gccバージョン4.6.3

  • ruby 1.9.3p194(2012-04-20リビジョン35410)[x86_64-linux]

  • GNU bash、バージョン4.2.24(1)-release(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

hashbangのないスクリプトはbashではなくshによって実行されるため、のif [ 1 = 2 ]代わりに使用する必要がありますif [ 1 == 2 ]。shはbashである場合とそうでない場合があり、Debianではダッシュです。
nyuszika7h 14年

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 file.cpp
  • cc file.m
  • cc file.mm

(ccはclang-421.10.42です)


他の多くの賛成の回答があなたからインスピレーションを受けたため、+ 1。
ケビン14年

11

Lua、Ruby、VimL、Sed、Befunge(129文字;〜0.087ポイント)

これが重要かどうかはわかりませんが、sed部分はシェバンラインに埋め込まれていますが、これは間違いなく制限を回避するためのハックです。これはまた、直接実行するのではなく、実行可能ファイルとして実行する必要があることを意味しsedます。

他のすべての言語(Befunge以外)がシェバン行を自動的に無視することは幸運でした(ただし、文字列「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

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

5

bash、zsh、ksh、csh、tcsh、15文字、スコア0.745

これらはすべて関連言語であるため、これは少し長めですが、違いがあります。

ps -ocomm= -p$$

ダッシュはどうですか?
エリオット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 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...ああ、あなたも....それがゴルフを試すことができます
数学チラー

@tryingToGetProgrammingStraightすべてをそのような1行に入れることは、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

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 14年

興味深い...私ははっきり...コンパイラでこれをテストし、それが働いて...または多分私の記憶が私を失敗した覚え
フアン・セバスティアン・ロサノ

@Ypnypn「T」はタブ、「S」はスペース、「L」は空白文字の改行であるため、コンパイラエラーは発生しません。
フアンセバスチャンロザノ

ああ; それは理にかなっている。
Ypnypn 14年

3

Windowsバッチ、TI-Basic、Golf-Basic 84Quomplex、およびGTB 5 * 2/93 = 0.11

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

使い方

::コメントを開始するため、Windowsバッチが最も簡単でした。実装はかなり簡単です。

TI-Basicは小文字またはバックd`"GOLF-BASIC 84":g`1ティックをサポートしていないため、Golf-Basicが評価し、メッセージを表示してラベル1に転送し、すぐに終了するステートメントをスキップします。これは、便利な表示文字であるGTBにも似てい~ます。ところで、表示のない文字列はに入れられAnsます。その後に表示コマンドがないAns場合は、出力されます(ここでは該当しません)。

Quomplexは、その複雑な構文では多くの部分をスキップできないため、最初に組み込まれました。"Quomplex"出力に追加するだけで、プログラムを使いこなすことができます...

プログラミング構文の習得

:"'*[]'"

純粋な天才。Quomplexは無視:し、かかる"''"出力に残して、スタックを文字列として、およびwhileループ(無限に死にます[])。一方、Golf-BasicおよびTI-Basic は、文字列演算子ではなく数学演算子である"'*[]'"ため、全体を文字列として取り'ます。


厳密に言えば、:コメントではなくバッチファイル内のラベルを示します。ただし、それ自体では何も実行しないのは事実です。
マーク14

@Mark True、しかしis ::(まだラベル)。REM特にTI-Basicで必要なので、私はむしろそれを使いたいです。
ティムテック14

正しい-私はただつまらない。また、そもそもバッチファイルを使用する場合は+1。:-)
マーク

2

JScript、EcmaScript Edition 3、5、6、2016、ノード、Mozilla JavaScript(スコア≈0.1342)

この回答はもともとPeter Olsonの回答に基づいていますが、CoffeeScriptを除いています(空白が重要な言語はゴルフには恐ろしいことがあるため)。

また、NodeES6およびES2016を追加し、コードを少しゴルフして、元のスコアをほぼ3倍にしました。

$=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.