クォートセーフクイン


17

あなたのタスクは簡単です。入力も出力もしない(または返す)ソースコードを取得するプログラム(または関数)を作成します。キャッチは、プログラムが"quotes"(Unicode文字34)でラップされている場合、(引用符で囲まれた)ソースコードを再度出力する必要があることです。

クインの標準ルールが適用されます。これはなので、最短のプログラム(バイト単位)が勝ちます。


8
@ATacoは創造的に考えます。通常、引用符で囲まれたコードは実行されませんが、プログラム全体が引用符で囲まれている場合、それらのセクション実行されます。
パベル

1
うーん、良い点。
アタコ

これは、BFをサポートする実装で動作する可能性があり!ます...
Esolanging Fruit

1
使用する必要があります"か?一部の言語は、2つまたは3つの引用符文字をサポートしています。
ニール

1
@tkellehe Meta:適切なクインとは何ですか?あなたの1バイトのクインを理解している限り、それは最も投票数の多い投稿で策定されたコード/データ要件に違反しています。
ライコニ

回答:


4

Noodel9 7 バイト

このバージョンは他のバージョンと同じように機能しますが、Noodelにはコードのブロックを一度実行する方法があることを忘れて、言語を作成しました...

Ḷ1ḥ-Ð1ḥ@€

ḷḥ-Ðḥ@ḅ

それを試してみてください:)


使い方

ḷḥ-Ðḥ@ḅ # Single statement that builds itself as a string.
ḷ       # Loop the following block of code unconditionally.
 ḥ-     # Push the string literal of the token preceding this one which pushes "ḷ" onto the stack.
   Ð    # Push the stack as an array to stdout (since is an array it is done by reference).
    ḥ@  # Push the string literal for this block of code which pushes "ḥ-Ðḥ@ḅ" onto the stack.
      ḅ # Break out of the given loop. (The stack is now ["ḷ", "ḥ-Ðḥ@ḅ"]).

        # The top of the stack is popped off and displayed which modifies the array to produce {["ḷ"], "ḥ-Ðḥ@ḅ"} in stdout.

引用の安全性

Noodelには、私がprintablesと呼んでいるもの専用の文字セットがある"ため、プログラムの前後に文字を配置することができます。これらは、単独で配置されるとすぐに文字列リテラルとして解析され、画面に何かを簡単に印刷できます。したがって、ほとんどの言語とは異なり、Noodelは、印刷に適していると見なされる通常のASCIIセットを、直接の文字列リテラル(スペースとラインフィードを除く)として見ています。

"ḷḥ-Ðḥ@ḅ"

"         # Pushes on the string literal "\"" onto the stack.

 ḷḥ-Ðḥ@ḅ  # Same execution as before, simply builds the Quine for this loop.
 ḷ        # Loop the following block of code unconditionally.
  ḥ-      # Push the string literal of the token preceding this one which pushes "ḷ" onto the stack.
    Ð     # Push the stack as an array to stdout (since is an array it is done by reference).
     ḥ@   # Push the string literal for this block of code which pushes "ḥ-Ðḥ@ḅ" onto the stack.
       ḅ  # Break out of the given loop. (The stack is now ["\"", "ḷ", "ḥ-Ðḥ@ḅ"]).

        " # Pushes on the string literal "\"" onto the stack.

          # The top of the stack is popped off and displayed which modifies the array to produce {["\"", "ḷ", "ḥ-Ðḥ@ḅ"], "\""} in stdout.

"それを試してみてください:)"


切れ端

<div id="noodel" code='ḷḥ-Ðḥ@ḅ' input="" cols="10" rows="1"></div>
<script src="https://tkellehe.github.io/noodel/noodel-latest.js"></script>
<script src="https://tkellehe.github.io/noodel/ppcg.min.js"></script>


<div id="noodel" code='"ḷḥ-Ðḥ@ḅ"' input="" cols="10" rows="1"></div>
<script src="https://tkellehe.github.io/noodel/noodel-latest.js"></script>
<script src="https://tkellehe.github.io/noodel/ppcg.min.js"></script>


を使用することeは有効ではないと思います。質問は、バイト34としてエンコードされた文字を求めるが、あなたが使用するエンコーディングUnicode文字34どんなにために、一つだけありません。"
デニス・

@Dennis、あなたが言っていることは、ユニコード文字34への参照は、誰もが同じものを使用していることを確認するためだけのものだと推測しています"か?(申し訳ありませんが、あなたの言っていることを理解しようとしているだけです)また、使用について言及している回答のテキストをすべて削除する必要がありますeか?
-tkellehe

1
はい、数千のエンコーディングがありますが、Unicode文字セットは1つだけです。動作するので"、議論を削除し、単に使用します"
デニス

11

Pythonの2 3、181の 152 130 124 122バイト

""" """>" "or exec("oct=0");p='"""" """>" "or exec("oct=0");p=%r;a=oct==0;print(p[a:~a]%%p)#".';a=oct==0;print(p[a:~a]%p)#

オンラインでお試しください!TIOには、クインの有効性を自動的にテストするヘッダーとフッターが付属しています。それらをクリアして、クインを実行することができます。

このコードは、Pythonで三重引用符で囲まれた文字列を使用して機能します。""" """はに等しく' '"""" """に等しい'" '

コードはを使用しますがexec、データをコードとして実行する「非クイニー」方法ではなく、式の内部から変数を設定するためだけに使用します。exec適切にも、データに符号化されています。

最初のステートメントは、文字列を(場合によっては先頭に引用符を付けて)と比較し、それに応じ" "て変数を設定しますoct。(変数は短い組み込み関数である可能性があります。)

その後、コードの残りの部分は、%r文字列の書式設定を使用して従来のPythonクインを実装し、oct変更されていない場合に余分な引用符を削除する追加のコードを使用します。

「チート」を使用する代替バージョンexecは、126バイトで繰り返されるコードが少なくなります。

""" """>" "and exec("oct=0");s='"""" """>" "and exec("oct=0");s=%r;p=%r;exec(p)#".';p='a=oct!=0;print(s[a:~a]%(s,p))';exec(p)#

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


7

StandardML182 176 108バイト

";str(chr 34)^it;(print(it^it);fn x=>print(x^it^x^it))";str(chr 34)^it;(print(it^it);fn x=>print(x^it^x^it))

引用されていないバージョン:codinggroundで試してください。
引用バージョン:codinggroundで試してください。

出力は次のようになります。

> val it = "{some string}" : string
> val it = "{some string}" : string
{output to stdout}> val it = fn : string -> unit

コードは宣言ごとに解釈され(それぞれ;が宣言を終了する)、各宣言の値と型を表示するためです。


バックグラウンド

SMLには、次の形式のクインがあります<code>"<code in quotes>"

str(chr 34);(fn x=>print(x^it^x^it))"str(chr 34);(fn x=>print(x^it^x^it))" 

そして、フォーム内の1つ"<code in quotes>"<code>

";str(chr 34)^it;print(it^it)";str(chr 34)^it;print(it^it)

どちらも、<code>-partに引用符が含まれていないため、何もエスケープする必要なく引用できるため、クイン"を出力するために必要なのはによって与えられstr(chr 34)ます。

またit、宣言で明示的な識別子が指定されていない場合に使用される暗黙的な識別子に大きく依存しています。

最初クワインでstr(chr 34);バインドit含む文字列に"fn x=>一つの引数を取る無名関数を開始しx、その後、連結x^it^x^itし、得られた文字列を出力します。この匿名関数は、プログラムコードを含む文字列に直接適用されるため、連結によってがx^it^x^it得られ<code>"<code>"ます。

2番目のクインは、に";str(chr 34)^it;print(it^it)";バインドされた文字列としてのプログラムコードだけで始まりitます。次にstr(chr 34)^it;、引用符を文字列の先頭に連結します。明示的な識別子が指定されていないため、結果の文字列"<code>はにバインドされitます。最後にprint(it^it)、文字列とそれ自体を連結し、出力します"<code>"<code>


説明

編集: 108バイトバージョンでは最新ではありませんが、この説明を読んだ後でも理解できるかもしれません。

クォートセーフクインは、上記のアプローチの両方を組み合わせており、それ自体が形式"<code>"<code>です。これを再度引用符で囲むとyields ""<code>"<code>"になるので、空の文字列を取得し、次に他の形式のクインを取得します。

つまり、プログラムは"<code>識別子によってフォーム内の独自のソースを与えられるかit、またはit単に引数として"独自のソース<code>を与えられるため、そのような引数を処理する関数でなければなりません。

(if size it>1then(print(it^it);fn _=>())else fn x=>print(it^it^x^it^x^it))

我々は、その場合に識別するために、我々は、の大きさかどうかをチェックit次いで1より大きい場合ではないit"、我々は、第二の場合であるので、else-part戻る匿名関数fn x=>print(it^it^x^it^x^it)の文字列としてソースが続くので、次に呼び出され。it^it^プログラムの開始時に空の文字列に必要な先頭に注意してください。

size itが1より大きい場合、then-partにあり、実行するだけprint(it^it)ですよね?ない非常に、私はSMLが強く型付けされたことを伝えることを怠っているためその条件ということを意味if <cond> then <exp_1> else <exp_2>する必要があります常に再び表現することを意味し、同じタイプの持ち<exp_1><exp_2>必要性は同じ型を持つことを。elseパーツのタイプはすでにわかっています。文字列を受け取って呼び出す匿名関数printはtype string -> <return type of print>print持ち、type を持っていますstring -> unit(他の言語unitと似てvoidいる)ため、結果の型は再びstring -> unitです。

したがって、thenパーツがprint(it^it)type のみである場合、unitタイプ不一致エラーが発生します。じゃあどうfn _=>print(it^it)?(_自分自身でこの無名関数は種類がある使用されていない引数のワイルドカードである)ので、強制私たちの条件付きのコンテキストで、任意のタイプの略で、これはうまくいくタイプ。(type変数はtypeでインスタンス化されます。)ただし、この場合、匿名関数は呼び出されないため、何も出力しません!-part に進むと、コード全体がであるため、-partは関数に評価されますが、その後に何も来ないため、呼び出されません。'a -> unit'astring -> unit'astringthen"<code>"<code><code>

代わりに、我々は、フォーム有するsequentialisation使用する任意のタイプおよび種類を有することができる全体sequentialisationの種類を提供します。機能的な観点から、to の値は単純に破棄されますが、SMLは命令型の構造もサポートするため、式に副作用が生じる可能性があります。つまり、-part として、最初に印刷してから正しい型の関数を返します。(<exp_1>; ...; <exp_n>)<exp_1><exp_n-1><exp_n><exp_1><exp_n-1>(print(it^it);print)thenprint


7

V27、23のバイト

éPñi"éP241"qpá"lxx|xÿ

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

これにはいくつかの印刷できない文字が含まれているため、読みやすいバージョンを次に示します。

éPñi"éP<C-v>241<esc>"qpá"lxx|xÿ

ここにhexdumpがあります:

00000000: e950 f169 22e9 5016 3234 311b 2271 70e1  .P.i".P.241."qp.
00000010: 226c 7878 7c78 ff                        "lxx|x.

したがって、最初にすべきことは、最初の文字が引用符であるかどうかを判断することです。éP「P」文字を挿入し"éPますが、NOOPです。その後、標準の拡張可能なクインにわずかな変更を加えます。

ñi<C-v>241<esc>"qpÿ

ただし、少し異なる方法で行います。まず、開始「éP」テキストを挿入する必要があります。だから

ñ                        " Start recording into register 'q'
 i                       " Enter insert mode
  "éP<C-v>241<esc>       " Enter the following text: '"éPñ'
                  "qp    " Paste the text in register 'q'
                     á"  " Append a '"'

ここで分岐が発生します。現在バッファにあるテキストは

"éPñi"éP<C-v>241<esc>"qpá"P
Cursor is here ----------^

引用符で囲まない限り、その場合、「P」は挿入されず、バッファーは次のようになります。

"éPñi"éP<C-v>241<esc>"qpá"
Cursor is here ----------^

まだ記録しているので、ここで好きなことを行うことができ、"qp発生するとバッファに追加されます。したがって、ここから引用符を条件付きで削除するのは非常に簡単です。

l           " Move one character to the right. If there is no character to the right, 
            " then this is effectively a "break" statement, stopping playback of the recording
 xx         " Delete two characters (the '"P')
   |        " Move to the first character on this line
    x       " Delete one character
     ÿ      " End the program

3

JavaScript(ES6)、239 237バイト

Set=``;eval(";a='Set=``;eval(~;a=1;S=String.fromCharCode;q=S(34);r=Set&&q;s=S(39);alert(r+a.replace(/[^ -}]/g,q).replace(1,s+a+s)+r);~)';S=String.fromCharCode;q=S(34);r=Set&&q;s=S(39);alert(r+a.replace(/[^ -}]/g,q).replace(1,s+a+s)+r);")

新しいバージョン(たとえば、新しいブラウザタブ)で各バージョンを試してください

これを簡素化する方法が少なくとも1つ必要です...


1
[x = "replace"]のような置換に配列を使用できると思います。しかし、物事を壊すかもしれません、私はクインとあまり経験がありません...-
ルーク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.