通常のクインでもあるエラー(または警告)クイン[クローズ]


9

(古い質問に対するこのコメントに触発されました。)

バックグラウンド

エラーQUINE(も「Kimian QUINE」として知られている)がコンパイルされ、プログラムまたは実行され、同じプログラム自体にテキスト、および何もを持っているエラーメッセージを出力するようにコンパイラ/インタプリタ/ランタイムが発生します。この課題のために、警告も含めて「エラー」を広く定義しています。

仕事

この課題では、エラークインであるを探しています。プログラムを実行すると、プログラムはそれ自体のソースコードを通常どおり(つまり、エラー/警告メッセージとしてではなく)印刷する必要があります。これは適切なクインでなければなりません(つまり、プログラムの一部は出力の別の部分をエンコードする必要があります)。また、プログラムをコンパイルして実行すると、必要がありますまた、プログラムのソースコードを起こさない-と何も-実装によってエラーや警告メッセージとして印刷します。(これは、プログラムの正常な実行を妨げる言語では、コンパイル時エラーを使用できないことを意味することに注意してください。)つまり、プログラムのソースコードは、各メソッドを介して2回出力されます。

明確化

  • ほとんどの場合、エラー/警告メッセージであるかどうかは明らかです。ここでは2つを区別していません。あいまいな場合は、エラー/警告メッセージを、実装によって出力される任意のテキストとして定義します。1。コマンドの実行以外の結果(または言語で最も近い同等のもの)。または2.出力として生成されたコマンドへの入力の一部ではなかった。
  • クインのエラー/警告部分は適切なクインである必要はありません(ほとんどの場合、ほとんどのエラーメッセージと警告メッセージにはかなりの量の固定テキストが含まれているため、偶然です)。
  • プログラムが複数のエラー/警告を出力することは許容されます。これらは一緒に連結されたときにプログラムのソースを形成します。ソースに表示されないエラー/警告を出力することはできません。
  • 多くの課題とは異なり、コンパイラに与えられたスイッチとプログラムのファイル名は、この課題に非常に関連している可能性があります。それ以外の場合はチャレンジできない可能性があるため、ここで柔軟に対応しますが、通常とは異なる方法で実装を実行する場合は、PPCGルールがそのためにバイトペナルティを課すことに注意してください(追加の文字数に等しい)プログラムを実行するには、最短の「通常の」方法でコマンドラインに追加する必要があるため、投稿でペナルティのサイズを指定する必要があります。(たとえば、使用しているインタープリターがファイルからプログラムを読み取り、ファイル名に特定の制限がない場合、プログラムを実行する最も短い通常の方法は、1文字のファイル名を持つファイルからです。したがって、
  • 使用するコンパイラ/インタプリタのバージョンが適切である可能性があるため、提出の一部として、プログラムが動作する特定のコンパイラまたはインタプリタ、および必要なバージョンを明記してください。(たとえば、Cの提出では、ヘッダーに「C(gcc 6.2.0)」と記載される場合があります。)
  • このタスクはすべての言語で実行できるとは限らないことに注意してください。現在の言語では、最も簡単な方法は、テキストの一部をカスタマイズできるエラーまたは警告メッセージを見つけることです(メッセージで引用される名前を変更することにより、ファイル名は一般的な選択肢です)ここでは、1つだけではありません)。テキストが修正されたエラーおよび警告メッセージのみを使用してこれを行う方法を誰かが見つけた場合、私は特に感心します(そして驚かれます)。

勝利条件

これは課題であるため、エントリのバイト数が少ない方が良いと見なされます。そのため、プログラムがまったく機能していない場合は、プログラムを最適化して、バイト数を可能な限り少なくする必要があります。(ただし、特に短い言語のエントリがある場合は、特に別の言語の場合は、落胆しないでください。ここで本当に探しているのは、プログラムの背後にある特定のアルゴリズムまたはアイデアをできるだけ短くすることですが、複数の異なる言語のソリューション、または異なる原理に依存するソリューションは常に価値があります。)


2
チャットで言ったように、最初の箇条書きは不明確だと思います。ほとんどの場合、エラー/警告メッセージが何であるか、またはそうでないかは明らかですが、ディスカッションと言語弁護士の出発点として機能します。
Dennis

@Dennis:私は原則として状況は良くないことに同意しますが、一方でそれを改善する具体的な方法を考えることはできません。明らかにエラーメッセージであるものの例外を削除すると、一部の言語では非常に意図しない状況が発生する可能性が高く、修復よりも多くの損害が発生する可能性があります。あなたが質問を改善できると思うなら、私はそれが編集されていることに異議はありません(そして、私はPPCGの質問がとにかく「所有権」を持つべきだとは思いませんが、それは別の問題です)

現状では、問題は不明確で客観的な妥当性基準が欠けていると思います。私の提案した変更が事態をさらに悪化させる可能性があることに同意します。考えられるアクションの1つは、チャレンジを保留して、サンドボックスに再投稿することです。
Dennis

1
とりあえず、チャレンジを保留にしました。サンドボックスへの再投稿を再検討してください。それは非常に興味深いアイデアであり、無駄にしてしまうのは残念です。
Dennis

1
サンドボックスの投稿はこちらです。(私はそれを質問に編集することを検討していましたが、それは投稿を再オープンキューに入れます。問題が解決された場合、再オープンが困難になるため、非常に逆効果になります。)

回答:


9

JavaScript(Firefox 50)、153バイト

Error: "Error: 1.replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x.slice(7)})".replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x.slice(7)})

説明

ここでのアイデアは、私がまだ見つけた最も簡単に変更可能なJS quineから始めることでした。

".replace(/.+/,x=>alert(uneval(x)+x))".replace(/.+/,x=>alert(uneval(x)+x))

throwキーワードは、それが同様に独自のコードを投げるようにする簡単な方法です:

".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})

ただし、若干の問題があります。Firefoxはスローされたメッセージの前にを付加しますError:。幸い、Error: mycodeJavaScriptは実際に有効です!(これについて詳しくは、MDNアクセスしてください。)

Error: ".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})Error: ".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})

エラーが発生しました:

".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})Error: ".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})Error: 

引用符がコードの先頭にuneval(x)+xないため、正しい結果が得られません。これを修正する最良の方法は、ネストされた文字列の代わりにプレースホルダーを追加することです。

Error: "Error: 1.replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x})".replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x})

ええと、今Error:、エラーメッセージに余分があります。文字列をスライスして修正しましょう:

Error: "Error: 1.replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x.slice(7)})".replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x.slice(7)})

そして最後に、出力とエラーメッセージはどちらもコードと同じです!Stack Snippetを追加しますが、どのブラウザのスニペットでも機能しないようです。


5

Python 2、217 80 51バイト

末尾の改行が必要です。

s='s=%r;print s%%s;exit(s%%s)';print s%s;exit(s%s)

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

私はシンプルなクインから始めました:

s='s=%r;print s%%s';print s%s

次にraise、最後にをスローするように追加しましたIOError

s='s=%r;print s%%s;raise IOError(s%%s)';print s%s;raise IOError(s%s)

残念ながら、トレースバックは問題を引き起こしていました(完全に取り除くことができませんでした)IOError: <code here>。トレースバックを削除しても、例外の名前は常にのように前面に表示されていました。

次に、この役立つSOの回答を見つけて、目的に合わせて修正しました。

その後、自分のクラスの作成をスキップしてを使用できるためsys.exit、コードを大幅に短縮できることがわかりました。


1
それはありませんので、私は挑戦仕様におけるエラーの定義と、この準拠しないと思うのコマンドを実行する以外の何かの結果としても、それは出力として、それを生成し、コマンドへの入力の一部ではありませんでした。そうは言っても、exitここではプレーンがうまく機能します。必要はありませんsys
Dennis

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