このコードは、* this *および* that *でエラーが発生しますが、実際にそれらに書き込まれていますか?


25

私はあなたが探している言語ではないこと触発されました!

チャレンジ

2つの異なるプログラミング言語を選択し、次の行をstdout(または同等のもの)に出力するプログラムを作成します。

This program errors out in <the current language> :P

そして、2つの言語のそれぞれで異なる種類のエラーを生成します。

ルール

いくつかのルールは元のチャレンジから取られています。

  • 出力では、言語名は次のとおりです。
    • 記載されている名前TIO、必要に応じてバージョン番号および/または実装名を除いて、(あなたが使用している場合たとえばJavaScript (Node.js)、あなたの言語の一つとして、あなたが使用できるJavaScript言語名のために、ではありませんJSJavascript。)
    • 選択した言語がTIOで利用できない場合は、公式Webサイト(またはGitHubリポジトリ)のフルネーム。
  • どちらのプログラムもユーザーからの入力を受け付けません。
  • コメントはどちらの言語でも使用できます。
  • 同じ言語の2つの異なるバージョンは、異なる言語としてカウントされます。
    • これを行うと、プログラムはメジャーバージョン番号を出力し、2つの異なるマイナーバージョンで実行している場合は、マイナーバージョンも報告する必要があります。
    • ビルド済みのバージョン関数を使用しないでください(これには、実行時にすでに評価された変数が含まれます)。
  • 同じ言語の2つの異なるコマンドラインフラグも、フラグにコードフラグメントが含まれていない限り(C など)、このメタコンセンサスに従って異なる言語としてカウントされ-Dblahblah...ます。
    • これが行われた場合、プログラムは使用されたフラグも出力する必要があります。
  • 2つのエラーは、両方のエラーが同じセマンティクス(「ゼロ除算」、「セグメンテーション違反」、「インデックス範囲外」など)によって生成されない限り、異なると見なされます。
    • 言語のランタイムがエラー後に終了せず、何らかの方法でエラーをユーザーに報告する場合、それは有効なエラーです。
    • 言語がエラーメッセージを識別しないが、エラーを引き起こす原因の既知のリストがある場合、エラーメッセージではなく理由を指定する必要があります。
      例としては><>、エラーメッセージsomething smells fishy...が1つしかありませんが、esolangs wikiページにはエラーの理由のリストがあります。
  • 呼び出しeval()などによって生成されない限り、構文エラーは許可されません。
  • 手動で(throwJS)、raise(Python)、die(Perl)などを使用して何かをスローすることは許可されますが、それらはすべて1種類のエラーと見なされます。
  • 2Dまたはgolflangsの無効なコマンドによるエラーも許可されます(1種類のエラーとして扱われます)。

PythonとRuby

  • Python:This program errors out in Python :P標準出力、未定義識別子
  • Ruby:This program errors out in Ruby :P標準出力に、その後、範囲外のインデックス

C89およびC99

  • C89:This program errors out in C 89 :P標準出力、ゼロ除算
  • C99:This program errors out in C 99 :P標準出力、セグメンテーション違反

バージョン番号は、常に言語名とスペースで区切る必要があることに注意してください。

Python 2.7.9およびPython 2.7.10

  • Python 2.7.9:This program errors out in Python 2.7.9 :Pstdoutに、次にevalの構文エラー
  • Python 2.7.10:This program errors out in Python 2.7.10 :Pstdoutに、次にdictのキーエラー

PerlおよびPerl -n

  • Perl:This program errors out in Perl :P標準出力へ、その後無効な時刻形式
  • Perl -nThis program errors out in Perl -n :P標準出力に、その後、存在しないファイルを開こうとします

勝利条件

これはであるため、バイト単位の最短コードが優先されます。ただし、短いものでなくても、楽しくて面白い答えを投稿することを常にお勧めします。



エラーはプログラムを停止する必要がありますか?
ジョーキング

最初はそう思いました。しかし、「ゼロ除算」のようなものの後に(おそらく未定義の動作で)継続する可能性のある言語があり、プログラムがそのエラーに遭遇したことを認める何らかのメカニズムがあれば、喜んでそれを許可します。
バブラー

私はすでに答えを知っていると思いますが、念のために:文にThis program errors out in ...スペースだけでなくタブ/スペースが混在している可能性がありますか?
ケビンCruijssen

関連(2つの異なる言語で2つの異なるテキストを印刷)。
ケビンクルーッセン

回答:


33

Python 2 / Python 3、60バイト

print("This program errors out in Python %d :P"%(3/2*2))*1;a
  • Python 2 NameError: name 'a' is not defined
  • Python 3を得た unsupported operand type(s) for *: 'NoneType' and 'int'

Python 2:

  • /整数除算で、3/2は1を取得しました。int(3/2 * 2)は2です。
  • 印刷文なので、最初の文のように読んでprint((...)*1)、ここで*1いったん文字列を繰り返すことを意味します。
  • 2番目のステートメントが存在しない変数を参照したため、エラーが発生しました。
  • オンラインでお試しください!

Python 3:

  • 「/」は浮動小数点除算で、3/2は1.5です。int(3/2 * 2)は3です。
  • printは関数なので、最初のステートメントはとして読み込まれ(print(...))*1ます。
  • 関数printが返すNone; 乗算は機能しないNone x intため、「サポートされていないオペランド」と報告されます。
  • オンラインでお試しください!

15

CおよびC ++、114 101バイト

l4m2のおかげで-13バイト!

#include<stdio.h>
main(){auto d=.5;printf("This program errors out in C%s :P",d?"++":"");2[&d]+=1/d;}

C ++のセグメンテーション違反、Cの浮動小数点例外。

autointCでデフォルトになっているため、に(int).5なります0。したがって、それで除算しようとすると、基本的にゼロで除算されます。

C ++では1/d2で、アドレスに追加してdそのアドレスの値を変更しようとすると、セグメンテーション違反がスローされます。

C ++で試してください!
Cで試してみてください!


1
わからないことができますが、あなたは2と0にC / C ++をマッピングすることができれば、あなたが使用することができれば"++"+nnある0C ++用と2Cのために
コナー・オブライエン

2
d?"++":""9文字、"++"+4*d8文字。しかし、C / C ++を逆方向に取得します。ため息。
ヤック

1
int main(){auto d=.5;printf("This program errors out in C%s :P",d?"++":"");2[&d]+=1/d;}(105)理由はわかりませんが
-l4m2

1
また、int省略することができる
l4m2

提案L"⬫"+!dの代わりにd?"++":""
ceilingcat

14

JavaScript + HTML / HTML + JavaScript、160バイト

<!--
document.write`This program errors out in JavaScript + HTML :P`()
--><script>document.write`This program errors out in HTML + JavaScript :P`+X</script>

<!--
document.write`This program errors out in JavaScript + HTML :P`()
--><script>document.write`This program errors out in HTML + JavaScript :P`+X</script>

これで2つの言語がカウントされるかどうかはわかりませんが、おもしろいです。


したがって、前者は未定義の識別子であり、後者は非関数型の関数呼び出しです。技術的には、前者のHTMLと後者のJavaScriptを検討しますが、本当にいいアイデアです。
バブラー

<!-- ... -->単一行のコメントマーカーとしての使用(これは後方互換性の理由で仕様に含まれていることを知っています)
浅本しえる

12

Java 8およびC99、172バイト

//\
interface a{static void main(String[]a){System.out.print("This program errors out in Java 8 :P");a[1]=""/*
main(n){{n=puts("This program errors out in C99 :P")/0/**/;}}

「abc」および「cba」チャレンジに対する私の回答に基づいています。

Java 8で試してください-ArrayIndexOutOfBoundsException:1になります。
Cで試してください- 浮動小数点例外が発生しますゼロ除算は未定義です。

説明:

//\
interface a{static void main(String[]a){System.out.print("This program errors out in Java 8 :P");a[1]=""/*
main(n){{n=puts("This program errors out in C99 :P")/0/**/;}}

上記のJavaで強調表示されたコードを見るとわかるように、最初の行はによるコメント//であり、Cコードはによるコメントであり、次のよう/* ... */になります。

interface a{static void main(String[]a){System.out.print("This program errors out in Java 8 :P");a[1]="";}}

そのため、STDOUTに出力し、2番目のプログラム引数(何も指定されていない場合)にアクセスしようとするため、ArrayIndexOutOfBoundsExceptionが生成されます


//\
interface a{static void main(String[]a){System.out.print("This program errors out in Java 8 :P");a[1]=""/*
main(n){{n=puts("This program errors out in C99 :P")/0/**/;}}

lang-cJavaと同じ強調表示になるため、Cハイライトを正しく有効にする方法がわかりません。しかし//\、次の行(Javaコード)をコメントアウトすると、次の結果になります。

main(n){{n=puts("This program errors out in C99 :P")/0;}}

したがって、STDOUTにプリンスし、ゼロ除算エラーを与えます。


私は考えてそれはC89とC99の両方で動作します。それに私を抱いてはいけません。
SIGSTACKFAULT

//C99とCに添加しました。
betseg

両方のおかげで、に変更しましたC99
ケビンCruijssen

なぜa[1]代わりにa[0]
xehpuk

@xehpuk特に理由はありません。どの桁を使用するかは問題ではなく1、最初からすでに入力していました。使用している可能性09などにも。この投稿について編集するものがある場合は、それ0も同時に変更します。
ケビンクルーッセン

11

Java 8および空白439 431 428 408バイト

                         






























 interface a{static void    main(String[]a){System.out.print("This program errors out"+
" in Java 8 :P");a[0]="";}}













Java 8で試してください-ArrayIndexOutOfBoundsException:0になります。
空白で試してください- ユーザーエラー(Infix Plusを実行できません)が発生します。

説明:

Java 8:

interface a{static void main(String[]a){System.out.print("This program errors out"+
" in Java 8 :P");a[0]="";}}

そのため、STDOUTに出力され、最初のプログラム引数(何も指定されていない場合)にアクセスしようとするため、ArrayIndexOutOfBoundsExceptionが生成されます


空白:

[S S T  T   T   T   T   T   N
_Push_-31_P][S S T  T   T   S T S T N
_Push_-53_:][S S T  T   S S T   T   T   T   N
_Push_-79_space][S S T  T   S T S N
_Push_-10_e][S S T  T   T   S S N
_Push_-12_c][S S T  T   T   T   S N
_Push_-14_a][S S S T    N
_Push_1_p][S S S T  S S N
_Push_4_s][S S T    T   S T S N
_Push_-10_e][S S S T    S T N
_Push_5_t][S S T    T   T   S N
_Push_-6_i][S S T   T   T   T   N
_Push_-7_h][S S T   T   T   S S S N
_Push_-24_W][S T    S S T   S T S N
_Copy_0-based_10th_(-79_space)][S S T   T   N
_Push_-1_n][S S T   T   T   S N
_Push_-6_i][S T S S T   S N
_Copy_0-based_2nd_(-79_space)][S S S T  S T N
_Push_5_t][S S S T  T   S N
_Push_6_u][S S S N
_Push_0_o][S T  S S T   T   N
_Copy_0-based_3rd_(-79_space)][S S S T  S S N
_Push_4_s][S S S T  T   N
_Push_3_r][S S S N
_Push_0_o][S S S T  T   N
_Push_3_r][S N
S _Duplicate_top_(3_r)][S S T   T   S T S N
_Push_-10_e][S T    S S T   T   S N
_Copy_0-based_6th_(-79_space)][S S T    T   S N
_Push_-2_m][S S T   T   T   T   S N
_Push_-14_a][S S S T    T   N
_Push_3_r][S S T    T   S S S N
_Push_-8_g][S S S S (_Note_the_additional_S_here)N
_Push_0_o][S S S T  T   N
_Push_3_r][S S S T  N
_Push_1_p][S T  S S T   T   T   N
_Copy_0-based_7th_(-79_space)][S S S T  S S N
_Push_4_s][S S T    T   T   S N
_Push_-6_i][S S T   T   T   T   N
_Push_-7_h][S S T   T   T   S T T   N
_Push_-27_T][N
S S N
_Create_Label_LOOP][S S S T T   S T T   T   T   N
_Push_111][T    S S S _Add][T   N
S S _Print_as_character][N
S N
N
_Jump_to_Label_LOOP]

強調表示としてのみ追加される文字S(スペース)、T(タブ)、およびN(改行)。
[..._some_action]説明としてのみ追加。

この強調表示されたバージョンを試してください。

ホワイトスペースは、スペース、タブ、改行を除くすべてを無視するスタックベースの言語です。擬似コードの同じプログラムを次に示します。

Push all unicode values of "P: ecapsetihW tuo srorre margorp sihT", minus 111
Start LOOP
  Push 111
  Add the top two stack values together
  Print as character
  Go to the next iteration of the LOOP

すべての値の印刷が完了し、スタックに2つのアイテムが必要な追加TSSS)を実行しようとすると、スタックが空になるとすぐにエラーが発生します。

このJavaプログラム111を使用して定数を生成しました。これは、Whitespaceで行った以前のASCII関連の課題にも使用しました。さらに、スペースをコピーしてバイトを節約しました。

注意すべき重要な点の1つは、JavaプログラムをWhitespaceアンサー内に配置するために使用したトリックです。まず、ホワイトスペースで数値がプッシュされる方法を説明します。

S開始時:スタック操作を有効にします。
S:数値として続くものをプッシュします。
SまたはT:それぞれ正または負。
いくつかのSand / or T、その後に続くN:バイナリとしての数値、ここでT=1およびS=0

ここにいくつかの例があります:

  • 値1をプッシュするとSSSTN
  • 値-1をプッシュするとSSTTN
  • 値111をプッシュすると、になりますSSSTTSTTTTN
  • 値0を押すとすることができSSSSNSSTSNSSSNSSTNSSSSSSSSSSSSN、など(あなたが使用している場合SSSN(またはSSTN)それは私たちがその符号を明記した後、暗黙的に0だから、我々は、バイナリ部分を指定する必要はありません。)

そのSSSNため、値をプッシュするだけで十分です0oこの場合、文字に使用されます)。しかし、このゴルフのホワイトスペースプログラムにJavaプログラムを配置するには、追加のスペースが必要だったので、最初の2つoはでプッシュされますSSSNが、3つ目はでプッシュされるSSSSNため、Javaプログラムの文に十分なスペースがあります。


10

CBM BASICおよび6502マシンコード(C64)、142 144バイト

構文エラーが許可されていないことを認識した後、2バイトを追加する必要がありました....


.prgファイルのHexdump :

01 08 50 08 00 00 8F 5A 49 52 49 41 A9 17 8D 18 D0 A2 30 BD 30 08 20 D2 FF E8
E0 4B D0 F5 A2 30 BD 05 08 20 D2 FF E8 E0 44 D0 F5 A9 0D 20 D2 FF A2 1A 4C 37
A4 22 36 35 30 32 20 4D 41 43 48 49 4E 45 20 43 4F 44 45 20 3A D0 22 20 20 20
20 20 00 8D 08 01 00 97 35 33 32 37 32 2C 32 33 3A 99 22 D4 48 49 53 20 50 52
4F 47 52 41 4D 20 45 52 52 4F 52 53 20 4F 55 54 20 49 4E 20 C3 C2 CD 2D C2 C1
D3 C9 C3 20 3A D0 22 2C 58 AD 50 00 00 00

C64のエディターにリストされているCBM BASICビュー

0 remziriastepgosubinput#new0exp0 dim.clrsavekinput#stepnew0exp<white> dim.clrsavedinput#stepstep
 dim.newl7to"6502 machine code :P"
1 poke53272,23:print"This program errors out in CBM-BASIC :P",x/p

元のリスト

注意:BASICエディターでこのプログラムを正しく入力することは不可能です。このプログラムをBASICエディターで編集しようとしないでください。クラッシュします。それでも、それは実行可能なBASICプログラムです;)


6502マシンコードビュー

         01 08                          ; load address

.C:0801  50 08       BVC $080B          ; jump to real start of mc

         ; line number (00 00), REM (8F) and "ziria"
.C:0803  00 00 8F 5A 49 52 49 41

.C:080b  A9 17       LDA #$17
.C:080d  8D 18 D0    STA $D018          ; set upper/lower font
.C:0810  A2 30       LDX #$30
.C:0812  BD 30 08    LDA $0830,X
.C:0815  20 D2 FF    JSR $FFD2          ; print "This program errors ..."
.C:0818  E8          INX
.C:0819  E0 4B       CPX #$4B
.C:081b  D0 F5       BNE $0812
.C:081d  A2 30       LDX #$30
.C:081f  BD 05 08    LDA $0805,X
.C:0822  20 D2 FF    JSR $FFD2          ; print "6502 machine code :P"
.C:0825  E8          INX
.C:0826  E0 44       CPX #$44
.C:0828  D0 F5       BNE $081F
.C:082a  A9 0D       LDA #$0D
.C:082c  20 D2 FF    JSR $FFD2          ; print a newline
.C:082f  A2 1A       LDX #$1A           ; error code for "can't continue"
.C:0831  4C 37 A4    JMP $A437          ; jump to error handling routine

.C:0834  22 ; '"'

         ; "6502 machine code :P"
.C:0835  36 35 30 32 20 4D 41 43 48 49 4E 45 20 43 4F 44 45 20 3A D0

         ; '"', some spaces, and next BASIC line
.C:0849  22 20 20 20 20 20 00 8D 08 01 00 97 35 33 32 37 32 2C 32 33 3A 99 22

         ; "This program errors out in CBM-BASIC :P"
.C:0860  D4 48 49 53 20 50 52 4F 47 52 41 4D 20 45 52 52 4F 52 53 20 4F 55 54
.C:0877  20 49 4E 20 C3 C2 CD 2D C2 C1 D3 C9 C3 20 3A D0

.C:0887  22 2C 58 AD 50 00 00 00

オンラインデモを入力runして、BASICとしてsys 2049実行し、マシンコードとして実行しlist、BASICコードとして解釈されることを示します。

BASICとして実行するとaが生成さdivision by zero error in 1れ、マシンコードとして実行するとacan't continue error

スクリーンショット


説明:

.prgファイルの最初の2バイトは、リトルエンディアンのロードアドレスです。これは、ここでは$0801(10進数2049)です。これは、C64上のBASICプログラムの開始アドレスです。runBASICインタープリターでこのプログラムを開始sys 2049します2049。一方、addressでマシンコードプログラムを実行するコマンドです。

ご覧のとおり、BASICビューの最初の行は、rem「ガベージ」と必要な出力文字列の一部を含むコメント()です。これは、マシンコードプログラムといくつかのフィラーバイトです。CBM-BASICプログラムにはシングルバイト値として「トークン化」されたコマンドが含まれており、これらの値の一部はマシンコードで使用されるオペコードと同じであるため、「ランダムな」BASICコマンドが表示されます。マシンコードは、コードの2行目にある文字列を再利用して出力します。

基本プログラムの行の最初の2バイトは、次の行へのポインターです$085050 08オーバーフローフラグが設定されていない場合、次の8バイトを飛び越える6502分岐命令であるため、これは慎重に選択されます。これは、マシンコードとして実行されるときに、この「コメント」行の途中でジャンプするために使用されます これ50はここで使用されるオペコードである0850ため、トリックを機能させるには2行目から開始する必要があります。そのため、5 20バイトのシーケンス(スペース文字)がいっぱいになることがあります。マシンコードはROMエラー処理ルーチンに積極的にジャンプして、「続行できません」エラーを返します。

BASICコードは非常に簡単です。「印刷」の2番目の引数として、2つの初期化されていない変数(0CBM BASICの値を持つ)が分割され、「ゼロによる除算」エラーがトリガーされます。


2
あなたは、本当のプログラマーです。どうやってこれを思いついたの?アタリプログラミング?
オリオン

@オリオンのおかげで:)基本的に、私は通常のBASICとして入力された2行目から始め、バイス(エミュレータ)に組み込まれたマシンコードモニタを使用して邪魔にならないように移動し、マシンコードをRAMに直接組み立て、手動でラインポインタを修復しました基本プログラム...
フェリックスパルメン

9

> <>およびFoo、42バイト

#o<"This code errors in "p"Foo"'><>'" :P"/

> <>で試してみてください!

Fooで試してみてください!

"よく文書化されているように、Fooはすべてをに出力し、最後にゼロで除算しようとします。を無視し'><>'ます。

><>「Foo」をスタックにプッシュしますが、を使用してすぐにポップしpます。#o<スタックが空になったときに、スタックにすべてを出力した後、認識している唯一のエラーメッセージが表示され、something smells fishy...


エラーメッセージではなく、エラーの理由が重要です。上のesolangページに><>はエラーの理由のリストがあるので、ではなく、それらのいずれかを指定する必要があると思いますsomething smells fishy...
バブラー

2
@Bubblerこのエラーは、空のスタックからポップすることにより発生します。
エソランジングフルーツ

3
pポップに使用することFooは非常に賢いです!
エソランジングフルーツ

6

CおよびPython、126 116バイト

@Bubblerのおかげで-10バイト!

#1/*
-print("This program errors out in Python :P")
'''*/
main(c){c=puts("This program errors out in C :P")/0;}//'''

Pythonでは、print()はNoneなので、その負の値を取得しようとしても意味がないため、Pythonはエラーをスローします。

Cでは、printf()はintを返すため、ゼロで割ると浮動小数点例外が発生します。

Cで試してみてください!
Pythonで試してみてください!


1
Pythonで-print(...)aを発生させるために使用できTypeError、Cで浮動小数点エラー(ゼロ除算)を自由に作成できます。いくつかの冗長な改行と組み合わせて、ここに116バイト(PythonC)があります。
バブラー

5

Attache + Wolfram Language(Mathematica)、82バイト

s:="Attache"
s=" Mathematica "
Throw[Print["This program errors out in",s,":P"]-0]

Attacheをオンラインでお試しください! Mathematicaをオンラインでお試しください!

これ=は、2つの言語での演算子の意味に基づいています。Attacheでは同等かどうかを比較しますが、Mathematicaでは変数の割り当てを実行します。:=両方の言語で変数の割り当てを行います。

現在、Attacheでは、Print印刷された文字列の配列を返します。また、文字列と整数(つまり、0)では減算ができません。したがって、型エラーがスローされます。Mathematicaでは、をPrint返しNull、Mathematicaはそれ0からうまく減算します。ただし、手動でnullをスローするとThrownocatchエラーが発生します。


注:これはバグがあるため、attacheの現在のバージョンでは機能しません。私はすぐにそれを修正しようとします
コナーオブライエン

5

Python(2)およびQB64、82バイト

1#DEFSTR S
s="QB64"
'';s="Python"
print"This program errors out in "+s+" :P"
CLS-1

Pythonバージョンをテストするには、オンラインで試すことができます!QB64バージョンをテストするには、QB64をダウンロードする必要があります。

Pythonが見るもの

1#DEFSTR S
s="QB64"
'';s="Python"
print"This program errors out in "+s+" :P"
CLS-1

最初の行は1、コメントの前にある単なる式(no-op)です。

2行目sは文字列"QB64"に設定されますが、3行目はすぐにそれを変更し"Python"ます。4行目はそれに応じてメッセージを出力します。

5行目は別の裸の式ですがNameError、未定義のnameのためにaを発生させCLSます。

QB64が見ているもの

1#DEFSTR S
s="QB64"
'';s="Python"
print"This program errors out in "+s+" :P"
CLS-1

最初の行(番号付き1#)は、名前がS(大文字と小文字を区別しない)で始まるすべての変数を文字列変数として定義します。これはs$、Pythonの構文エラーになるを使用する必要がないことを意味します。

2行目sは文字列に設定されます"QB64"'QB64でコメントを開始するため、3行目は何もしません。4行目はそれに応じてメッセージを出力します。

5行目CLSは、引数を指定して(画面をクリア)しようとします-1。しかし、以降はCLS唯一の引数を受け入れる01または2、これはエラーを生成しますIllegal function call。このエラーにより、ユーザーに実行を続行するか中止するかを尋ねるダイアログボックスが作成されます。技術的には、これはエラーが致命的ではないことを意味します(この場合、「継続実行」を選択でき、プログラムはそれ以上問題なく終了します)。しかし、OPはエラーの後も継続できる言語を明示的に許可しているため、QB64の動作は問題ないはずです。


3

Perl 5およびJavaScript(Node.js)、96バイト

eval("printf=console.log");printf("This program errors out in %s :P",("Perl","JavaScript"));$//0

これは(...)、Perl printfの左端の要素を使用するリストであるという事実と、JavaScriptで右端の引数を返すコンマ演算子であるという事実を利用します。

$JavaScriptで定義されていないため、Perlではゼロによる除算エラーが発生し、ReferenceErrorが発生します。

Perlをオンラインでお試しください!

JavaScriptをオンラインでお試しください!


3

OctaveおよびMATLAB、67バイト

v=ver;disp(['This program errors out in ' v(1).Name ' :P']);v(--pi)

オンラインでお試しください!

注:コードは、MATLABがツールボックスなしでインストールされていることを前提としています(または、インストールされているツールボックスの名前は文字AからMで始まっていない)。

使い方:

コードは、を使用してインタープリターとツールボックスのバージョンデータを取得しverます。実行v(1).Nameすると、最初の製品の名前が抽出されます。これにより、上記の注記が当てはまるか、OctaveまたはそのMATLAB前提が返されます。

プログラムはその後で完全に必要な文字列、表示するOctaveMATLABなど、必要なの。

最後に行いますv(--pi)

Octaveでは--、プリデクリメント演算子です。そのため、変数piが存在しない(pi実際には関数であり、変数ではない)ために失敗する事前減少を試みます。

This program errors out in Octave :P
error: in x-- or --x, x must be defined first

MATLABでは、事前減少演算子は存在しません。そのため、ステートメントはv(-(-pi))どちらがちょうどに等しいと解釈されv(pi)ます。ただしpi、整数ではないため、v配列にインデックスを付けるために使用できず、エラーが発生します。

This program errors out in MATLAB :P
Subscript indices must either be real positive integers or logicals.

3

C ++ 14(gcc)/ C ++ 17(gcc)107105バイト

#include<cstdio>
int*p,c=*"??/0"/20;int
main(){*p=printf("This program errors out in C++ 1%d :P",4+c)/c;}

オンラインでお試しください!(C ++ 14)

オンラインでお試しください!(C ++ 17)


(に加えて)グローバル名前空間で<cstdio>宣言printfし、std基本実行文字セットはASCII値を使用すると仮定します。これはLinuxでg ++を使用する場合に両方とも当てはまります。

ここでの基本的な問題は、C ++ 17が言語から3文字表記を削除したことです。

C ++ 14では"??/0"、3文字表記を含み、と同等"\0"です。だから、*"??/0"ゼロであり、cゼロに設定されています。番号4がに引数として渡されprintf、除算によりc未定義の動作が発生します。Linuxでは、これは問題が発生する前に発生*pし、プログラムはを取得しSIGFPEます。

C ++ 17では"??/0"、長さ4の文字列が表示されます。そう*"??/0"です'?'か63、およびc3に設定されている番号7は、引数として渡されprintf、この時分割によってはc有効です。以来p、名前空間のメンバーであり、それはプログラムの開始時にゼロに初期化取得し、ヌルポインタ値を持っているので、*p未定義の動作です。Linuxでは、プログラムはアドレス0のメモリを変更しようとするため、プログラムはを取得しSIGSEGVます。


mainの戻り値の型は省略できるため、-3バイトです。
マックスイェクラコフ

2

Perl 5およびPerl 6、55バイト

say('This program errors out in Perl ',5-~-1,' :P').a/0

Perl 5をオンラインでお試しください!(ゼロによる不正な除算)

Perl 6をオンラインでお試しください!(そのような方法はありません)

プレフィックス~はPerl 6の文字列化であり、本質的に上記のプログラムではノーオペレーションです。Perl 5では、ビット単位ではなく、-1を0に変換します。

. Perl 6ではメソッド呼び出し構文、Perl 5では連結です。


2

C(gcc) / Stax、109バイト

AA=~1;
	char* s;main(){*(int*)(printf("%s C :P",s))=0;}char* s=
"This program errors out in";;;/*dp`UGYC\`Q*/

オンラインでお試しください!(C(gcc))

オンラインでお試しください!(Stax)または実行してデバッグします!(スタックス)

Cのセグフォールト。Staxの無効な操作。コメント以外のすべてが実際にStaxで使用されているのが大好きです。

C

これがCの見方です。最初の行はノーオペレーションです。2行目は、メッセージを表示しprintf、次にセグメンテーション違反が発生します=0

AA=~1;
	char* s;main(){*(int*)(printf("%s C :P\n",s))=0;}char* s=
"This program errors out in";;;/*dp`UGYC\`Q*/

スタックス

Staxプログラムは、空のスタックからポップまたはピークしようとするたびに終了します。これにより、少し複雑になり、空でないスタックを準備する必要があります。AA=~1;Cの有効なステートメントのままでこれを行います。

AA=~1;
AA=       10=10, returns a 1
   ~      Put it on the input stack
    1     Pushes a 1 to main stack (*)
     ;    Peek from the input stack (**)

本当に便利なのは、プログラムを終了せずに実行できる~ように、空でない入力スタックを準備します;。ただし、1メインスタックの2つは後で使用されます。

2行目はタブで始まり、Staxで行コメントを開始します。

"...";;;/*dp`UGYC\`Q*/
"..."                     "This program errors out in"
     ;;;                  Peek the stack three times so that we have enough operands for the next two operations
        /                 Divide, this consumes one element of the main stack
         *                Multiply, this consumes another element
          d               Discard the result, now the TOS is the string
           p              Pop and print without newline
            `UGYC\`       Compressed string literal for " Stax :P"
                   Q      Print and keep the string as TOS
                    *     Duplicate string specific times
                          Since the element under the top of stack is `1` that was prepared in (**), this does nothing
                     /    Invalid operation error

無効な操作は/、文字列に対してTOS(第2オペランド)として、および1(*)からの番号を第1オペランドとして操作しようとしていますが、これは無効です。

2つのオペランドを交換すると、Staxで有効な操作になります。


2

ゼリーM、39バイト

İ=`ị“¢³ƥ“Ȥ¹»;“ :P”“¢ḅñ⁵ẹḞŀẊịñṙȧṄɱ»;ȮṠṛƓ

ゼリーで試してみてください!

Mで試してみてください!

両方の言語は、JellyとMの結果に逆İに適用されます。Mで無限を表す理由はわかりません。Dennisに尋ねてください。0infzoozoo

重要な違いは、Jellyの無限大はそれ自体に等しいが、Mの無限大は等しくないことです。したがって、「それ自体に等しい」モナド=`1、ゼリーと0Mで生成されます。ここから:

İ=`ị“¢³ƥ“Ȥ¹»;“ :P”“¢ḅñ⁵ẹḞŀẊịñṙȧṄɱ»;ȮṠṛƓ
İ=`                                      0 in M, 1 in Jelly
    “¢³ƥ“Ȥ¹»                             Pair of compressed strings: [' M',' Jelly']
   ị                                     Index into this list with 0 or 1
            ;“ :P”                       Concatenate with the string ' :P'
                  “¢ḅñ⁵ẹḞŀẊịñṙȧṄɱ»       Compressed string: 'This program errors in'
                                  ;      Prepend this to ' Jelly/M :P'
                                   Ȯ     Print the string and return it
                                    Ṡ    Sign. M errors with a string as input and terminates
                                         Jelly returns a list of Nones
                                     ṛ   Right argument. This prevents the list of Nones from being printed
                                      Ɠ  Read a single line from input. Since input is not allowed, this produces an EOFError

JellyのエラーはEOFError: EOF when reading a lineです。

MのエラーはTypeError: '>' not supported between instances of 'str' and 'int'です。


1
どのようにして2つのエソランでこれを始めますか?
魔法のタコ

2

Foo / CJam51 50バイト

"This program errors out in ""Foo"/'C'J'a'm" :P"Li

これは、Fooではゼロ除算エラーでNumberFormatException、CJam ではa で終了します。

CJamへ:

  • 文字列リテラル(引用符の間)は、自身をスタックにプッシュします。スタックからのアイテムは、プログラムの終了時にセパレータなしで自動的に印刷されます。
  • /This program errors out in 文字列を部分文字列で分割しようとしFooます。文字列には部分文字列が含まれていないため、元の文字列を含むシングルトン配列が生成され、まったく同じように表示されます。
  • 'xはの文字リテラルでx、1文字の文字列と同じ方法で出力されます。この方法で、Fooによって無視されるCJamのデータをプッシュできます(Fooでループを実行しないようにする方法がわかりません)。
  • Li空の文字列を整数にキャストしようとしますが、失敗します。スタックからすべてが印刷されます。

フーへ:

  • 文字列リテラル(引用符の間)は、それ自体を出力します。
  • /現在のセルを最上位のスタック要素(暗黙的0)で除算しようとします。何らかの理由で、Fooでは0で割るエラーは致命的ではないため、これは単にメッセージを出力します
    Only Chuck Norris can divide by zero.
    STDERRに進み続けます。
  • 認識されない文字('C'J'a'mおよびLi)は無視されます。

2
後者は50バイトではありませんか?
バブラー

@Bubblerそれを編集するのを忘れて、ごめんなさい。
エソランジングフルーツ

7
Fooインタープリターにバグがあると思います。これは明らかにしてエラーする必要がありOnly Jon Skeet can divide by zero. meta.stackexchange.com/a/9138

2

PythonおよびLua111 110 102 98 95 85バイト

x="This program errors out in ",#[[
print(x[0]+"Python :P")
a#]]z=#print(x.."Lua :P")

エラー:Python 3:

Traceback (most recent call last):
  File ".code.tio", line 3, in <module>
    a#]]z=#print(x.."Lua :P")
NameError: name 'a' is not defined

ルア:

lua: .code.tio:3: attempt to get length of a nil value
stack traceback:
    .code.tio:3: in main chunk
    [C]: in ?

明確に区別されます。

複数の違いを悪用する:

  • <var>=<a>,<b>,... Pythonではタプルを作成しますが、Luaでは引数リストを作成し、そこから最初のメンバーのみを取得します。
  • #Pythonではコメントを開始しますが、Luaでは長さ演算子です。タプルをコンマで終了できるようにするためのPythonの追加の小道具。
  • [[...]]Luaの複数行文字列構文です。つまり、Pythonの印刷機能すら見えません。これは、Lua ..がストリング連結ではなくストリング連結に使用するために必要+です。
  • a未定義変数を参照した後のPythonエラー。ルア後z=#print(x.."Lua :P")#print(x.."Lua :P")Lua だけに使用しても機能しません。コードが実行される前にエラーが発生するためです。

編集:

  • "".joinPythonで使用する必要はありません、-1バイト
  • 作りxの言語と場所の両方に文字列Python印刷機能で文字列リテラルでは、-8バイト
  • 使用する#[[]]よりも短くなる#""--[[]]、-4バイト
  • #1テーブルキーとして使用する必要はありません、-3バイト
  • ジョー・キングこれをやっ、-9バイト
  • print(x.."Lua :P")作品の戻り値の長さを明らかにする。-1バイト


2

JavaおよびC#242 235

/**\u002f/*/using System;/**/class G{public static void/**\u002fmain/*/Main/**/(String[]a){String s="This program errors out in ";/**\u002fSystem.out.print(s+"Java :P");/*/Console.Write(s+"C# :P")/**/;s=/**\u002f(1/0)+""/*/a[-1]/**/;}}

JavaとC#の間の異なるエスケープ処理の乱用(Unicodeエスケープは、C#ではなくJavaでコードを解析する前に解析されます)一種のプリプロセッサとして\u0027、それは魔法の仕事です。

編集:@KevinCruijssenのポインターのおかげで8バイトオフゴルフ

編集:ルールの削除


両方Stringを変更することで6バイトをゴルフできますvar(Java 10はこれをサポートします)。(または5に変更String s="...";して、Java 9以前の前でString s="...",x;削除します)。Stringx=
ケビンクルーッセン

1
S-stringの再利用は、java99以前でも機能します。@KevinCruijssen
masterX244

2

AutoHotkeyを / C#、155 133 128 122バイト

構文の強調表示は、私ができるよりもよく説明しています:

C# RuntimeBinderException: '非デリゲート型を呼び出すことはできません'

;dynamic
i="This program errors out in " ;Console.Write(i+"c# :P");i();/*
i:=SubStr(i,2,27)
send %i%AutoHotkey :P
Throw */

AutoHotkeyエラー:例外がスローされました。

;dynamic
i="This program errors out in " ;Console.Write(i+"c# :P");i();/*
i:=SubStr(i,2,27)
send %i%AutoHotkey :P
Throw */

編集:

  1. varを削除しました
  2. ミルクのおかげで-5バイト

2
C#:でスローする少し短い例外を次に示しますi+=i[-1]。System.IndexOutOfRangeException:「インデックスは配列の境界外でした。」
ミルク

2
Microsoft.CSharp.RuntimeBinder.RuntimeBinderExceptionのdynamic代わりに使用しvar、スローするにはまだ少し短くなります: 'Cannot not invoke a non-delegate type' with i()
ミルク

2

PHP 7+ / JavaScript、90 89バイト

これは、非常によく似た構文を持つ2つの言語を使用するため、両方の言語でこのコードを記述できます。

言語の分離は、JavaScriptに存在しないプロパティによって行われます[]。PHPでは(空の配列)は偽の値であると見なされますが、JavaScriptでは真実です(オブジェクトであり、オブジェクトは常に真実であるためnew Boolean(false))。

$X='This program errors out in %s :P';([]?console.log($X,'JavaScript'):printf($X,PHP))();


実行:

次のコードに焦点を当てます([]?console.log($X,'JavaScript'):printf($X,PHP))();

文字列属性は、両方の言語で同じように機能します。

このコードは、「三項演算子」(JavascriptPHP)を使用します。これは、両方の言語でほとんど同じように機能します。

Javascript

Javascriptはconsole.log($X,'JavaScript')ピースを実行し、を返しますundefined

後で、を実行しようとする(...)()と、Uncaught TypeError: (intermediate value)(intermediate value)(intermediate value) is not a function(Google Chromeで)を取得します。

PHP

PHPがprintf($X,PHP)ピースを実行します。

PHPでは、printf関数はoutputの長さを返します

PHPには興味深い機能があります。名前が変数に格納されている(または、PHP7以降では式の結果として)関数を実行できるため、構文エラーを防ぎます。

次に、PHPは、名前が式[]? ... :printf($X,PHP)(数値33)の結果である関数を実行しようとします。
しかし、この興味深い機能には注意点があります。文字列のみを受け入れます(そうです!)。

これが原因となるFatal error: Function name must be a stringため、33ですint


私を1バイト節約してくれた浅本シエルに感謝します!


1
[]'0'JSとPHP よりも短く、評価も異なるので、-1バイトかもしれません。
朝琴シエル

私はその問題、との質問をたくさん持っている[]ニーズが代わりに使用されることを'0''\0''\0'=="0"、及びその使用[]の前にも。しかし、この質問を見つけてくれてありがとう。
イスマエルミゲル

1

Perl 5およびC、95バイト

//;$_='
main(){puts(puts("This program errors out in C :P"));}//';/T.*n /;print$&,"perl :P";die

//; 基本的にperlのNOPであり、Cのコメントです。

したがって、Cプログラムは効果的に:

main(){puts(puts("This program errors out in C :P"));}

必要な文字列を出力し、実行を試みますputs(32)。これはCでは技術的に未定義の動作ですが、TIOおよびアクセスできるすべてのシステムでセグメンテーションフォールトが発生します。

perlプログラムは、Cプログラム全体を文字列として扱い、正規表現/T.*n /を使用して一致させてThis program errors out inから、とを出力しperl :Pます。dieエラーでプログラムがクラッシュしますDied at script_name line 2

エラーとしてそれが気に入らない場合1/0は、同じ長さでIllegal division by zeroエラーでクラッシュします。dieもっと好きです;)

オンラインでお試しください!(C)

オンラインでお試しください!(Perl)


1

VBScript、JScript、72バイト

x="VB"
'';x='J'
WScript.echo("This program errors out in "+x+"Script")
y

VBScriptは「Microsoft VBScriptランタイムエラー:型の不一致: 'y'」を出力し
ますJScriptは「Microsoft JScriptランタイムエラー: 'y'は未定義」を出力します



1

Java(JDK)/ JavaScript(Node.js)、154バイト

class P{P(){var s="This program errors out in ";try{System.out.printf("%sJava :P",s);}finally{if(1!='1'){var a=0/0;}throw new Error(s+"JavaScript :P");}}}

オンラインでお試しください!(Java)

オンラインでお試しください!(JavaScript)

Javaでの出力:

This program errors out in Java :P
Exception in thread "main" java.lang.ArithmeticException: / by zero
    at P.(Main.java:1)

JavaScriptでの出力(stderrへ):

Error: This program errors out in JavaScript :P
    at P (/home/runner/.code.tio:1:185)

これは、JavaScriptの弱いタイピング(1=='1')を利用して言語を検出し、JavaとJavaScriptの同じキーワード(varclass)、および類似のエラーコンストラクター(new Error())を使用してポリグロットを作成します。


1

PowerShell v6およびPowerShell v2、73バイト

"This errors out in PowerShell v$($PSVersionTable.PSVersion) :P"
1-shl1/0

オンラインでお試しください!

-shlv3で導入されたため、v2で解析エラーがスローされます。v3 +は、値を0で除算しようとする前に値を正しくシフトできるため、便利なようにゼロ除算エラーがスローされます。両方のバージョンには、PSVersionフィールドを含む$ PSVersionTableハッシュマップがあります


0

Linux上のC(gcc)/ Mac上のC(gcc)(160)

#include <sys/utsname.h>
main(){struct utsname n;float g;uname(&n);printf("This program errors out in C(gcc) on %s :P\n",n.sysname);g=1/(int)gamma(1);abort();}

Macではテストされていません。基本的に、John Cookは(彼のブログで)POSIXはガンマを定義していないと指摘した。Linuxはガンマ関数のログを使用します(log(gamma(1))は0を返し、浮動小数点例外がトリガーされます)。OSXは、「真の」ガンマ関数を使用します(正式にはPOSIXごとにtgammaと呼ばれます)。これにより1が返され、アボートステートメントがヒットします。異なる浮動小数点エラーをスローするようにしようとしました(たとえば、sqrt(-1)が、エラーをスローする方法とゼロを返す方法を忘れています)


0

Perl、Bash(78バイト)

printf "This program errors out in ";eval 'echo Bash :P'||print"Perl :P
";
a()

Perlでの出力:

This program errors out in Perl :P
Undefined subroutine &main::a called at /tmp/perlbash line 3.

Bashでの出力:

This program errors out in Bash :P
/tmp/perlbash: line 4: syntax error: unexpected end of file

line 43行目が改行で終わっていないにもかかわらず、Bashは実際にエラーを表示していることに注意してください...)



0

C(gcc)およびHaskell、135バイト

char/*x=0-- */*
s="This program errors out in ";
int main(){--s;*s=printf("%sC :P",s+1);}//-}=0;main=mapM print[s++"Haskell :P",tail""]

オンラインで試してください(С)! オンラインで試してみてください(Haskell)!

結果は、コメントを織り交ぜることで達成されます。Cバージョンは基本的に次のとおりです。

char * s = "This program errors out in ";
int main ()
{
   --s;
   *s = printf ("%sC :P", s + 1);
}

(失敗は、文字列の先頭の前に書くことによって達成されます)。

一方、Haskellバージョンは次のようになります。

char /* x = 0 -- a useless operator (/*) taking two arguments
s = "This program errors out in ";
int main () = 0 -- a useless function int taking two arguments
main = mapM print [s ++ "Haskell :P", tail ""]

(失敗は空のリストの末尾を取ることで達成されます)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.