制限されたポリグロット


20

ポリグロットは、複数のプログラミング言語で同時に有効なプログラムです。このようなポリグロットのほとんどは、ある言語の特定の構成要素が別の言語のコメントとして解釈されるように記述されています(たとえば#define、Cでは複数のスクリプト言語でコメントとして解釈されます)。

コメントが含まれていないが、空白文字以外の文字を削除するとすぐに変更される自明でないポリグロットを作成できるかどうかを知りたいので、そのようなプログラムを考え出すように挑戦します。

具体的なルールは次のとおりです。

  1. (出力)。プログラムは、各言語のコンソールで出力を生成する必要があります。つまり、プログラムは何も出力せずに単純に終了することはできません。
  2. (分散)。標準のポリグロット定義を緩和するため、プログラムの出力は言語によって異なる場合があります。
  3. (エラー)。プログラムは、どの言語でもエラー(大まかに定義)を生成してはなりません。ほとんどの言語では、これはコンパイラーやインタープリターからゼロ以外の終了コードを返すものとして定義されています。
  4. (制限)。コードから空白文字以外の文字を1つ削除すると、プログラムはすべての言語で動作を変更します。プログラムは、その言語に対して無効になるか、生成される出力を変更することにより、「変更」される場合があります。
  5. これはコードの挑戦です。勝者は、ほとんどのプログラミング言語で有効なプログラムです。プログラムの長さを短くするために、関係が切断されます。

制限ルールは、いくつかの文字の削除には適用されません。つまり、複数の文字を同時に削除しても、言語の1つが変更されない場合は問題ありません。

空白以外の文字を削除してもWhitespaceプログラムの動作は変わらないため、制限規則は言語の1つとしてWhitespaceを使用できないことを意味することに注意してください。

Python 2およびPython 3の言語で、上記のすべての制限を満たすプログラムの簡単な例を次に示します。

print("Hello World!")

の文字を削除するprintと、両方の言語でNameError; がスローされます。括弧または引用符を削除するとがスローされSyntaxError、文字列文字を削除すると両方の言語の出力が変更されます。(これprint("hello", "world")はより微妙ですが、上記の規則の下ではまだ有効なプログラムです)。

Python 2とPython 3は非常に似ているため、この例は少し不自由です。そのため、同じ言語(特にPython 2とPython 3)の異なるバージョンのみを使用する他のソリューションは受け入れません。


@IngoBürk:このルールは、何らかの方法で他の言語も空白のみである場合を除き、空白を含む機能的なポリグロットを記述できないようにします。
nneonneo 14

1
あなたの例FWIWは、print("Hello World!")また、有効なRubyのコードです
クリスティアンLupascu

[多言語]に対する単純な答え(私のもののような)が非常に多くの言語を持つことができるのは少し面倒です。
ジャスティン14

5
無数の言語の変形や類似の構文を持つ言語を避けるために、プログラムが異なる出力を生成する場合にのみ、2つの言語を異なるものとしてカウントすることを要求する方が興味深いでしょう。
ジル「SO-悪であるのをやめる」14

回答:


13

Bash + GolfScript + CJam

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

出力

バッシュ:

[]
p~

GolfScript:

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

CJam:

echo{ cat<&3;}-1echop

あり\x7fCJamの出力が終了しました。


...待ってください。これは3つの言語すべてでどのように機能しますか?
nneonneo 14

@nneonneo使用されていないすべてのコードを他の言語で単に印刷します。
jimmy23013 14

8

Bash + Befunge

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

befungeで 'hello'を出力します。


1
すべてのキャラクター(スペースを除く)がBefungeで何かをしていることを証明できます。Bashの場合はできません。これは印象的です。
ジャスティン14年

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のクインを特に防ぐエソランがあることを知っています(ああ、待ってください、それはHomespringです)。信じてる何かを出力します。
ジャスティン14

ありがとう!悲しいことに、私は納得できませんか?Linuxで実行するには...
デニス14

1
必要なのはモノ用の追加パッケージだけでした。What?\n?ところで、プログラムはを出力します。
デニス14

1
また、(つまり、プログラミング言語の場合)GNUのメイクに動作します:make: *** No targets. Stop.
jimmy23013

1
@ user23013:そうです。メイクの終了コードが2であるので、その場合には、有効なエントリはありません
デニス・

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

Octaveでは、出力します ans = 10

MatlabおよびScilabでは、を出力しますans = 10

Numeric Toplineでは、を出力します0

Fueueを適切に理解していれば、改行を出力してからcatプログラムとして機能します。

で、出力します

What?
?

1
またCJamで働く
8月

5
インタラクティブな通訳は重要ではないと思います。
nneonneo 14

2
これは...言語の多くの罰金を実行されますが、その多くに出力を提供していません
ジャスティン

1
これは、HTMLbcMatlab、およびScilabでも有効です。に変更72すると10数値トップラインに印刷さ0れます。
デニス14

HTMLは、単純な算術演算やループの手段がないため、メタディスカッションによるとプログラミング言語ではありません。
インゴバーク14

3

この答えは完全に正しくないようです。
部分的に修正し、数日で他の部分を改善します。

C ++およびJavascript

アイデアは次のとおりです。

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:ブラウザーコンソールにコードをコピーするだけ

そして、それを満足させるための一連の修正

(制限)。コードから単一の非空白文字を削除すると、プログラムは言語ごとに動作を変更します。プログラムは、その言語に対して無効になるか、生成される出力を変更することにより、「変更」される場合があります。

JavaScript側から:

変更intmainまたはputs宣言されていない変数の読み取りとクラッシュします。しかしboolHi from C++!安全に変更することができます。それを修正しましょう:

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

文字列が等しい場合、の存在をチェックし、そうでない場合はboolundeclaredでクラッシュしnopeます。

現在、2つのセミコロンを削除できます。最初のものは簡単に修正されます-前に改行を削除するだけintです:

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

2番目はbefore }なので、両方の言語で有効で、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 ++側から:

2つの問題があります:eval任意の名前を付けることができ、すべてのjsコードを変更できます。

数日後に修正を試みます。


2

CJam + Golfscript

さて、これはやや退屈ですが、それは始まりです。

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 ++の両方で同じ出力を生成します。


あなたは削除することができます0C.のために
デニス・

@Dennis C89にはありません。
ジル「SO-悪であるのをやめる」14

@Gilles:メイン関数が値を指定しないリターンを実行する場合、ホスト環境に返される終了ステータスは未定義です。C89ドラフト-2.1.2.2ホスト環境)それはプログラムを無効にせず、出力を変更しないので、この質問の目的のために、それを0削除することができます。
デニス14

@Dennisこの質問の規則に従って、不特定の終了コードはプログラムを無効にするものとみなします。そうでない場合は、このプログラムがgcc -ansix86(または他の多くのアーキテクチャ:など)でゼロ以外の終了コードを返すC89実装を作成しputsます。main関数から戻る)。
ジル「SO-悪であるのをやめる」14

@Gilles:ルール3の私の解釈では、コンパイラはプログラムではなく0を返す必要があります。
デニス14


1

Perl + Ruby + Python

PHPで実行する場合、セミコロンが必要だと思います-R

print "Hello World!"

これはPythonでも機能します。
14

1
Luaでも動作します。
トレブシェット

1

Bash + sh + zsh + ksh、4バイト:

echo

本当にシンプルで、すべてのルールを満たします:

  1. 各言語で改行を出力します。
  2. 現在、出力は言語間でまったく異なりませ
  3. どの言語でもエラーは発生しません...
  4. ... いずれかの文字が削除/変更される場合を除きます。

0

Bash + sh + zsh + ksh + Windows Batch、4バイト:

echo

本当にシンプルで、すべてのルールを満たします:

各言語で変化しない改行を出力します(ただし、ECHO is on使用する言語でWindowsバッチを出力します)。文字が削除または変更された場合を除き、エラーは発生しません。


1
あなたの答えはこれとほとんど同じように見えます:codegolf.stackexchange.com/a/100654/65326
Uriel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.