壊れやすいクイン


30

壊れやすいクイン

壊れやすいクインとは、評価時に単一文字を削除して各サブストリングを作成するというプロパティを満たすクインであり、エラーが発生します。

例えば。プログラムasdfがキネである場合、それが壊れやすいためには、次のプログラムでエラーが発生する必要があります。

sdf
adf
asf
asd

プログラム(およびそのすべての部分文字列)は完全に決定的であり、同じ言語である必要があります。無限ループに陥る(つまり、終了に失敗する)プログラムは、最終的にエラーを生成しなくても、このチャレンジの目的で「エラーを生成する」と見なされます。

通常のクイン制限を含む標準的な抜け穴が適用されます(たとえば、独自のソースコードを読み取れない)。

たとえば、print("foo")脆弱ではありません。これらのサブストリングはすべてエラーにする必要があります。

rint("foo")
pint("foo")
prnt("foo")
prit("foo")
prin("foo")
print"foo")
print(foo")
print("oo")
print("fo")
print("fo")
print("foo)
print("foo"

エラーにならないものは次のとおりです。

print("oo")
print("fo")
print("fo")

だから壊れにくいわけではありません。

クインに関する重要な注意事項

コンセンサスによって、可能なすべての馬はこれを満たさなければなりません:

プログラムの別の部分をエンコードするプログラムのセクションを識別することが可能でなければなりません。(「異なる」とは、2つの部分が異なる位置に表示されることを意味します。)

さらに、クインは直接または間接的に自身のソースにアクセスしてはなりません。

JavaScriptのfunction#toStringは「独自のソースコードを読み取る」と考えているため、許可していません。ただし、私がそれを禁止しなかった場合、JavaScriptの壊れやすいクインを次に示します。

f=(n=b=`f=${f}`)=>(a=(n)==`f=${f}`,n=0,a)&(n!=b)?b:q

テスター

プログラムのソースコードを指定すると、エラーが発生する必要があるすべてのプログラムを生成するプログラムを次に示します。

let f = (s) =>
  [...Array(s.length).keys()].map(i =>
    s.slice(0, i) + s.slice(i + 1)).join("\n");

let update = () => {
  output.innerHTML = "";
  output.appendChild(document.createTextNode(f(input.value)));
};

input.addEventListener("change", update);

update();
#output {
  white-space: pre;
}

#input, #output {
  font-family: Consolas, monospace;
}
<input id="input" value="print('foo')">
<div id="output"></div>


HQ9 +を許可していますか?
オリバーNi


3
これは、言語機能に関する仮定を行っています -すべての言語に「エラー」があるわけではありません。
メゴ

2
エラーの代わりに@Mego無限ループも許可されます。すべてのチューリング完全言語には無限ループがあります。
feersum

1
無関係な@Mego。問題ごとに有限のサブセットのみが適用される場合、なぜ一般的な場合でも面倒を見るのでしょうか?
コナーオブライエン

回答:


6

バーレスク32 28 25バイト

{3SHWD{Je!}.+{Sh}\msh}Je!

ここで試してみてください。

したがって、バーレスクのほとんどの指示は2文字です。そして、マーベラスよりもバーレスクで馬を書くほうがはるかに簡単です。Je!またはCJamでの^^e!手段_~


1
待ってください...これがゴルフされていない場合(そしてここではるかに短い場合)、ゴルフが何であるか想像できません!+1
ダニエル

@Dopapp問題は、バーレスクの指示が多すぎるため、何かを見逃した可能性が高いことです。
jimmy23013

11

Python 3、45バイト

c='print(end="c=%r;exec(c"%c+c[8*4])';exec(c)

Python 3に切り替えて、末尾の改行を簡単に削除できるようにします。

私は1ではなく2つの変数を持つ愚かな構造から始めましたが、1つの変数に切り替えても4バイトしか短くなりませんでした。

-(4 + 3)バイト、デニス。


アサートについて知りませんでした。良い仕事
破壊可能なレモン

2
説明を追加していただければ幸いです。
セージボルシュ

あなたのexec構造と私の%トリックを組み合わせると、c='print(end=len(c)%5*"c=%r;exec(c)"%c)';exec(c)48バイトあります。
デニス

1
c='print(end="c=%r;exec(c"%c+c[8*4])';exec(c)さらに3バイト節約します。
デニス

7

Python、91/92 67バイト

これは楽しかった!

今、私はアサートについて知っています:

s='s=%r;assert len(s)==34;print(s%%s)';assert len(s)==34;print(s%s)

文字列から文字が削除された場合、エラーをアサートします。この機能を知っていたら、もっと早くこれをやったでしょう、と断言します。


2
末尾の改行の質問を忘れました...もしあなたがそれを数えるなら、それは安全に削除できるので私たちの答えは無効です。
-feersum

7

パイソン2、51の 50 46バイト

lambda s='lambda s=%r:s[22:]%%s%%s':s[22:]%s%s

Ideoneで確認します。


関数クインは確かに許可されています。
コナーオブライエン

1
え?関数がクインとして許可されることを聞いたことがありません...この例はありますか?
-feersum

@feersum query javascript quineの結果はいくつかあります。
デニス

@feersumの標準的なMathematicaのクインも関数ベースです(を使用#0)。
マーティンエンダー

2
別の見方をしましたが、ほとんどの JSやMathematicaのクインも実際に関数を呼び出しています。したがって、REPL quinesと呼ぶ方が正しいでしょう。とはいえ、このチャレンジの仕様でConorが提供した例は単なる関数なので、少なくともここでは有効だと思います。
マーティンエンダー

4

C#、145バイト

_=>{var@s="_=>{{var@s={1}{0}{1};for(;79!=s.Length;){{}}System.Console.Write(s,s,'{1}');}};";for(;79!=s.Length;){}System.Console.Write(s,s,'"');};

以前にC#でクインを書いたことはありませんが、ゴルフではスコアが高いほど良いですか?:)

文字が文字列から削除された場合、またはマジックconst 79から数字が削除された場合の無限ループ。他の文字を削除すると、コンパイルエラーが発生します。

ゴルフをしていない:

/* Action<object> Quine = */ _ => // unused parameter
{
    // String of the function (well, mostly).
    // {0} placeholder for s, so the output contains the function and string.
    // {1} placeholder for " since it requires escaping.
    var@s = "_=>{{var@s={1}{0}{1};for(;79!=s.Length;){{}}System.Console.Write(s,s,'{1}');}};";

    // Infinite loop if a char is removed from the above string or if the 7 or 9 is removed.
    for(;79!=s.Length;){}

    // Print the quine.
    System.Console.Write(s,s,'"');
};

3

JavaScript、90バイト

a="a=%s;a[44]!=')'?x:console.log(a,uneval(''+a))";a[44]!=')'?x:console.log(a,uneval(''+a))

Firefoxの48のコンソールで動作し、と他の環境で動作するはずunevalconsole.log。エラーの内訳:

a="                                             "; [  ]!=' '?x:           (a       (''+a))   // SyntaxError
   a=%s;a[44]!=')'?x:console.log(a,uneval(''+a))  a 44    )                                  // ReferenceError from calling `x`
                                                               console.     ,uneval          // ReferenceError from calling `onsole.log`, `auneval`, etc.
                                                                       log                   // TypeError from calling `console.og`, etc.

うわー、不平を知らなかった。また、少なくともいくらか戻ってあなたに会えてうれしいです!:D
コナーオブライエン

@ ConorO'Brien(少なくともいくらか)戻ってきてよかった!私が投稿したカップル より QUINE-yの答えこの技術を使用しています。
ETHproductions

2

Python 2、59バイト

x='x=%r;1/(len(x)==30);print x%%x';1/(len(x)==30);print x%x

これは、ZeroDivisionError0、3、または文字が文字列から削除された場合にスローされます。別の文字を削除すると、NameErrorまたはになりSyntaxErrorます。


2

ナシの木、50バイト

a="print('a='.repr(a).';eval(a)');#f+QF>";eval(a)

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

最短の答えではなく、かなり包括的なものです。このプログラムから文字を削除すると、チェックサムに失敗するため、A Pear Treeインタープリターはそれを実行しようとさえしません。(たとえば、末尾の改行を削除するとエラーが発生します。)これ;#f+QF>は、プログラム全体のCRC-32が0であることを保証するために使用されます(またf+QF>、 ASCIIのままでそれを達成するためのコメント。ここではASCIIを使用することが重要ですrepr

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