馬鹿馬鹿しいゴルフを!


204

選択した言語を使用して、ゴルフAのQUINE

QUINEは全く入力を取らず、その唯一の出力として、自身のソースコードのコピーを生成し、空でないコンピュータプログラムです。

不正行為はありません。つまり、ソースファイルを読み取って印刷することはできません。また、多くの言語では、空のファイルもクインです。これは合法なクインとも見なされません。

エラークインはありません-エラークインには別の課題が既にあります。

ポイント:

  • 最小コード(バイト単位)
  • 最も難読化された/不明瞭なソリューション
  • 難解な/あいまいな言語の使用
  • ゴルフが難しい言語の使用に成功

次のStack Snippetを使用して、各言語の現在のスコアをすばやく表示し、どの言語に既存の回答があり、どの種類のターゲットを倒す必要があるかを知ることができます。


4
「ゴルフはあなたのための馬です」
Mateen Ulhaq

50
@muntooは、「Haskellを学んでください」という劇です。
ラフェケトラー

回答:


106

Hexagony、サイド長さ17 16、816の 705バイト

180963109168843880558244491673953327577233938129339173058720504081484022549811402058271303887670710274969455065557883702369807148960608553223879503892017157337685576056512546932243594316638247597075423507937943819812664454190530214807032600083287129465751195839469777849740055584043374711363571711078781297231590606019313065042667406784753422844".".>.@.#.#.#.#.#.#.#.>.(...........................<.".......".".>./.4.Q.;.+.<.#.>...........................<.".....".".>.#.#.>.N.2.'.\.>.............=.=......._.<.".....".".>.>.;.'.=.:.\.>.......................<."...".".>.\.'.%.'.<.#.>..............._.....<."...".".>.#.#.>.<.#.>...............=.=.<.".".".>.#.\.'.R./.>.................<.".!.........../.>.

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

これは展開されたように見えるものです:

                1 8 0 9 6 3 1 0 9 1 6 8 8 4 3 8
               8 0 5 5 8 2 4 4 4 9 1 6 7 3 9 5 3
              3 2 7 5 7 7 2 3 3 9 3 8 1 2 9 3 3 9
             1 7 3 0 5 8 7 2 0 5 0 4 0 8 1 4 8 4 0
            2 2 5 4 9 8 1 1 4 0 2 0 5 8 2 7 1 3 0 3
           8 8 7 6 7 0 7 1 0 2 7 4 9 6 9 4 5 5 0 6 5
          5 5 7 8 8 3 7 0 2 3 6 9 8 0 7 1 4 8 9 6 0 6
         0 8 5 5 3 2 2 3 8 7 9 5 0 3 8 9 2 0 1 7 1 5 7
        3 3 7 6 8 5 5 7 6 0 5 6 5 1 2 5 4 6 9 3 2 2 4 3
       5 9 4 3 1 6 6 3 8 2 4 7 5 9 7 0 7 5 4 2 3 5 0 7 9
      3 7 9 4 3 8 1 9 8 1 2 6 6 4 4 5 4 1 9 0 5 3 0 2 1 4
     8 0 7 0 3 2 6 0 0 0 8 3 2 8 7 1 2 9 4 6 5 7 5 1 1 9 5
    8 3 9 4 6 9 7 7 7 8 4 9 7 4 0 0 5 5 5 8 4 0 4 3 3 7 4 7
   1 1 3 6 3 5 7 1 7 1 1 0 7 8 7 8 1 2 9 7 2 3 1 5 9 0 6 0 6
  0 1 9 3 1 3 0 6 5 0 4 2 6 6 7 4 0 6 7 8 4 7 5 3 4 2 2 8 4 4
 " . " . > . @ . # . # . # . # . # . # . # . > . ( . . . . . .
  . . . . . . . . . . . . . . . . . . . . . < . " . . . . . .
   . " . " . > . / . 4 . Q . ; . + . < . # . > . . . . . . .
    . . . . . . . . . . . . . . . . . . . . < . " . . . . .
     " . " . > . # . # . > . N . 2 . ' . \ . > . . . . . .
      . . . . . . . = . = . . . . . . . _ . < . " . . . .
       . " . " . > . > . ; . ' . = . : . \ . > . . . . .
        . . . . . . . . . . . . . . . . . . < . " . . .
         " . " . > . \ . ' . % . ' . < . # . > . . . .
          . . . . . . . . . . . _ . . . . . < . " . .
           . " . " . > . # . # . > . < . # . > . . .
            . . . . . . . . . . . . = . = . < . " .
             " . " . > . # . \ . ' . R . / . > . .
              . . . . . . . . . . . . . . . < . "
               . ! . . . . . . . . . . . / . > .
                . . . . . . . . . . . . . . . .

よくああ、これは非常に感情的なジェットコースターだった...私は私がして、「私がしなければ、待って「ハハ、これは狂気である」との間で切り換え回数カウント停止し、これを、それは実際にかなりなんとかなるはずですが」。Hexagonyのレイアウトルールによってコードに課せられた制約は厳しいものでした。

一般的なアプローチを変更することなく、1又は2でサイド長さを短くすることが可能かもしれないが、(持つ細胞のみがタフになるだろう#現在使用されていない、デコーダで利用可能)。現時点では、どのように効率的なアプローチを行うかについてのアイデアもまったくありませんが、確実に存在します。説明とすべてを追加する前に、これから数日間、これについて少し考えて、片側だけでゴルフをしようとするかもしれません。

少なくとも、私はそれが可能であることを証明しました...

私自身の将来の参照のためのいくつかのCJamスクリプト:


51
親愛なるピート、これは何ですか。
コナーオブライエン

2
これを作るのにどれくらい時間がかかりましたか?
アドナン

3
@AandN昨日から一般的な「テンプレート」の概念をいじくり回しています(実際のテストは行われませんでした... 7x7グリッドに何かを入力して、それが機能するかどうかを確認します。) 。私はおそらくそこにすでに半ダースのアプローチを捨てました)。実際のコーディングには今晩かかりました...たぶん3時間でしょう。
マーティンエンダー

10
言葉は、私はステップによって密教IDEのステップとアクションでこれを見ていたときにどのように驚い説明することはできません...これを理解したいことがあり、この六角で印刷された整数に「デコーダ」の部分をコードして誰に!し、その後で/最後の2行目のミラーは、デコーダーに入り、デコーダーコードを出力してクインを完成させます。これには奇跡的な使い方が<あり>、複数行の非常に大きな整数を読み取り、デコーダーを格納する領域を構築しました。「何十ものアプローチ」が考慮されているかを知りたいのですが?
サニーしゃれ

3
説明?---
MD XF

77

MySQL、167文字

SELECT REPLACE(@v:='SELECT REPLACE(@v:=\'2\',1+1,REPLACE(REPLACE(@v,\'\\\\\',\'\\\\\\\\\'),\'\\\'\',\'\\\\\\\'\'));',1+1,REPLACE(REPLACE(@v,'\\','\\\\'),'\'','\\\''));

そのとおり。:-)

私は実際に自分でこれを書いた。それは私のサイトで元々投稿されました


72

GolfScript、2バイト

1

(末尾の改行に注意してください)これは、スタックに数値1をプッシュします。プログラムの最後に、GolfScriptはスタック内のすべての項目を(間にスペースを入れずに)出力し、改行を出力します。

これは実際にコードを実行するため、これは真のクインです(質問にリストされています)。「ソースファイルを読み取って印刷する」だけではありません(PHP送信とは異なります)。


別の例として、印刷するGolfScriptプログラムを次に示します12345678

9,(;
  1. 9:9をスタックにプッシュ
  2. ,:9を引数として使用し、配列[0 1 2 3 4 5 6 7 8]をスタックにプッシュします
  3. (:配列を引数として使用し、配列[1 2 3 4 5 6 7 8]とアイテム0をスタックにプッシュします
  4. ;:スタックの一番上のアイテムを破棄します

スタックには配列が含まれてい[1 2 3 4 5 6 7 8]ます。これは、要素間にスペースなしで標準出力に書き込まれ、その後に改行が続きます。


18
またはPowerShell、またはPHP :-)
ジョーイ

6
時間をさかのぼって、発明者にGolfScriptを発明するアイデアを与えなかったのですか?
Mateen Ulhaq

78
技術的には、1GolfScriptでQUINEではありません:それは出力1\n場所、\n改行を意味します。ただし、2文字のプログラム1\n 簡単です。
イルマリカロネン

17
1文字のプログラム\nもおそらくそうですか?
リン

10
@Pseudonym a quineは文字通り、独自のソースを出力するプログラムです。「構造」にarbitrary意的な制限があるとは思わない。
ヒューゴジンク

71

Brain-Flak9.8e580 1.3e562 9.3e516 12818 11024 4452 4332 4240 4200 4180 3852 3656 3616 3540 2485 + 3 = 2488バイト

観測可能な宇宙に収まりました!

(())(()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(()()()()())(())(())(())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(()()()()())(())(())(())(())(())(())(()())(())(())(())(()())(()()()())(())(()()()()())(()())(()())(()())(()()())(())(()())(())(()()()()())(()())(()()()()())(())(())(())(())(())(()())(())(())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(()())(()())(()())(()())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(()()())(()())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(())(())(()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(()()())(())(()()())(())(())(())(()())(()()())(()())(())(()()()()())(()())(())(()()())(())(()()()()())(())(())(())(()()())(())(())(())(()())(())(()())(()()()())(())(())(()()()()())(()())(()())(())(()()())(())(())(())(())(()()())(()())(())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()())(())(()()()()())(()()()()())(())(()()())(())(())(()())(())(()()()()())(())(()()()()())(())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(()()()()())(())(()()()()())(())(())(())(()())(())(()()()()())(())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()()()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(())(()())(()()()())(())(())(()())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(()())(()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(()()())(())(())(()())(())(())(()()()()())(()()()())(()())(()())(()()())(())(()())(())(()()()()())(()())(()()()()())(())(())(())(()()()())(()()()())(()())([[]]){({}()<(([{}]())<{({}())<>(((((()()()()()){}){}){}())[()])<>{({}())<>{}({}(((()()()){}())){}{})<>{({}())<>({}(((()()()()()){})){}{}())<>{{}<>({}(((()()()()){}){}){})(<>)}}<>(({})[()()])<>}}{}<>({}(<()>)<><{({}<>)<>}<>>){({}<>)<>}{}(<>)<>{({}<>)<>}{}(((((((()()()()()){}){}){}))()))>){({}()<((({}[()])()))>)}{}<>{({}<>)<>}{}>)}{}<>{({}<>)<>}<>

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


説明

このQuineは、難解な言語のほとんどのQuinesと同様に機能します。エンコーダとデコーダの2つの部分があります。エンコーダーは最初は括弧で囲まれ、最後はデコーダーがより複雑な部分です。

プログラムをエンコードする単純な方法は、デコーダー内のすべての文字のASCII値をスタックに入れることです。Brain-Flakは8文字(()<>[]{})しか使用しないため、これはあまり良い考えではありません。そのため、非常に少ない情報をエンコードするためにかなりのバイトを支払うことになります。より賢いアイデアであり、これまで使用されてきたのは、8つのブレースのそれぞれにはるかに小さな数(1〜8)を割り当て、デコーダーでASCII値に変換することです。これは、前の252とは対照的に、文字をエンコードするのに18バイト以下しかかからないので便利です。

ただし、このプログラムはどちらも行いません。Brain-Flakプログラムはすべてバランスが取れており、最大5つの数字を持つ8つのブレースをエンコードするという事実に依存しています。次のようにエンコードします。

(       -> 2
<       -> 3
[       -> 4
{       -> 5
),>,],} -> 1

コンテキストを使用して特定のシナリオで使用する必要がある括弧を決定できるため、すべての閉じ括弧に1が割り当てられます。これは、Brain-Flakプログラムにとって困難な作業のように聞こえるかもしれませんが、実際はそうではありません。たとえば、次のエンコーディングを開き中かっこをデコードし、閉じ中かっこをaに置き換えます.

(.
((..
<([.{...

アルゴリズムが非常に単純であり、左から右に読み、開いているブレースに遭遇するたびに、その閉じブレースを想像上のスタックにプッシュし、遭遇したときに.トップ値をポップして、.。この新しいエンコードにより、エンコーダーで膨大なバイト数が節約されますが、デコーダーではほんの数バイトが失われます。

低レベルの説明

進行中の作業


25
私はあなたがコードゴルフの挑戦に対する最も長い解決策に勝つと思います...
Mego

18
PPCG Nopeの 歴史の中で最大のシングルゴルフを作りましたそれでも9.8e580は印象的です。
デニス

19
観測可能な宇宙に適合するために+1。また、TIO Nexusでは、パーマリンクが答えに収まるはずです。tio.run/nexus/...
デニス

3
...非常に大きなゴルフ...
破壊可能なレモン

3
ほとんどのバイトがカットオフで勝つと思う
クリストファー

68

プレリュード5157 4514 2348 1761 1537 664 569 535 423 241 214 184 178 175 169 148 142 136 133バイト

3バイトを節約してくれたSp3000に感謝します。

これはかなり長いです...(大丈夫、それはまだ長いです...少なくとも、それが最短暴行だ知らBrainfuck今、この挑戦にC#のQUINEを)しかし、それは(私のLuaとジュリアの提出は、実際のちょうど翻訳私は自分自身を発見した最初のQUINEあります(他の言語への標準的なクインテクニック)および私が知る限り、これまでプレリュードでクインを書いた人は誰もいなかったので、私は実際にこれを非常に誇りに思っています。:)

7( -^^^2+8+2-!( 6+ !
  ((#^#(1- )#)8(1-)8)#)4337435843475142584337433447514237963742423434123534455634423547524558455296969647344257)

桁数が多いのはコアコードのエンコードにすぎないため、クインは非常に長いのです。

クインをコード化するケタはこのCJamスクリプトで生成されました

これには、文字を出力する標準準拠のインタープリターが必要です(値を文字コードとして使用)。したがって、Pythonインタープリターを使用している場合は、を設定する必要がありますNUMERIC_OUTPUT = False

説明

まず、プレリュードに関するいくつかの言葉:プレリュードの各行は、独自のスタックを操作する個別の「音声」です。これらのスタックは、無限数の0に初期化されます。プログラムは列ごとに実行され、列内のすべてのコマンドは以前のスタック状態に基づいて「同時に」実行されます。数字は個別にスタックにプッシュされるため、42をプッシュし4、次にをプッシュし2ます。大きな数値を直接プッシュする方法はありません。それらを加算する必要があります。vおよびは、隣接するスタックから値をコピーできます^。かっこでブレインスタイルのループを導入できます。詳細については、見出しのリンクを参照してください。

クインの基本的な考え方は次のとおりです。最初に、クインのコアをエンコードする多数の数字をスタックにプッシュします。次に、コアはそれらの数字を取得し、デコードして自分自身を印刷し、コードに表示されるとおりに数字を印刷します(および末尾の))。

これは、コアを複数の行に分割しなければならなかったという事実により、少し複雑です。もともと私は最初にエンコードを行っていましたが、その後、同じ数のスペースで他の行を埋める必要がありました。これが、初期スコアが非常に大きかった理由です。エンコードを最後に配置しましたが、これは、最初にコアをスキップしてから数字をプッシュし、最初に戻って印刷を行う必要があることを意味します。

エンコーディング

コードには2つの音声しかないため、隣接関係は周期的で^ありv、同義語です。ので、それは良いことだvので、常に使用することによって、それを避けて、はるかに最大の文字コードであり^単純にエンコードすることができます。現在、すべての文字コードは10から94の範囲にあります(両端を含む)。つまり、各文字を正確に2桁の10進数でエンコードできます。ただし、問題が1つあります。一部の文字、特に改行には、10進表現にゼロが含まれています。ゼロはスタックの底から簡単に区別できないため、これは問題です。幸いなことに、それに対する簡単な修正があります。文字コードをでオフセットする2ので、12から96までの範囲があり、2桁の10進数に収まります。プレリュードプログラムに表示できるすべてのキャラクターの中で、0その表現に0(50)がありますが、実際にはまったく必要ありません0。それが私が使用しているエンコーディングで、各桁を個別にプッシュします。

ただし、スタックで作業しているため、表現は逆にプッシュされます。したがって、エンコードの最後を見ると:

...9647344257

ペアに分割して反転し、2を減算してから、文字コードを検索します。

57 42 34 47 96
55 40 32 45 94
 7  (     -  ^

どこ32のスペースに対応しています。コアはまさにこの変換を行い、その後、キャラクターを印刷します。

コア

それでは、これらの数値が実際にどのように処理されるかを見てみましょう。まず、一致する括弧がPreludeの同じ行にある必要はないことに注意することが重要です。列ごとに括弧は1つしか存在できないため、括弧が一緒になっているあいまいさはありません。特に、閉じ括弧の垂直位置は常に無関係です。ループが終了する(または完全にスキップされる)かどうかを確認するためにチェックされるスタックは、常にを持つもの(です。

コードを正確に2回実行する必要があります。1回目はコアをスキップし、最後にすべての数値をプッシュします。2回目はコアを実行します。実際、コアを実行した後、これらの数値をすべてプッシュしますが、ループはその後終了するため、これは無関係です。これにより、次のスケルトンが得られます。

7(
  (                   )43... encoding ...57)

最初7に、最初の声にプッシュします-これを行わない場合、ループに入ることはありません(スケルトンの場合、これがゼロ以外であることだけが重要です...具体的に7は後で見る理由です) 。次に、メインループに入ります。これで、2番目の音声には別のループが含まれます。最初のパスでは、2番目のスタックが空/ 0のみであるため、このループはスキップされます。そのため、エンコードに直接ジャンプし、それらすべての数字をスタックにプッシュします。7私たちが最初にスタックにプッシュがまだあるので、ループを繰り返します。

今回は7、2番目のスタックにもa があるため、2番目の音声でループに入ります。2番目の音声のループは、最後にスタックが再び空になるように設計されているため、1回だけ実行されます。それはなりますまた、最初のスタックを枯渇...だから我々は第2の音声にループを去るとき、我々は再びすべての数字を押して、今7のメインループが終了すると、プログラムが終了するように、第1スタック上には、破棄されています。

次に、実際のコアの最初のループを見てみましょう。(or と同時に物事を行うこと)は非常に興味深いです。ここでループ本体をマークしました=

-^^^2+8+2-!
(#^#(1- )#)
 ==========

つまり、含む列(はループの一部と見なされません(そこにある文字は一度だけ実行され、ループがスキップされた場合でも)。しかし含む列が) あるループの一部と各繰り返しで一度走っています。

だから我々は、単一で始まる-なった、7に最初のスタック上に-7、後にもっとその上で、再び...。実際のループについては...

数字のスタックが空になっていない間、ループは継続します。一度に2桁を処理します。このループの目的は、エンコードをデコードし、文字を出力し、同時に数字のスタックを最初の音声にシフトすることです。したがって、最初にこの部分:

^^^
#^#

最初の列は、1桁を最初の音声に移動します。2列目は10桁を最初の音声にコピーし、1桁を2番目の音声にコピーします。3列目は、そのコピーを最初の音声に戻します。つまり、最初の音声には1桁が2回、その間に10桁があります。2番目の音声には、10桁のコピーがもう1つあります。つまり、スタックの最上部の値を操作して、後で最初のスタックに2つのコピーが残っていることを確認できます。

次に、2つの数字から文字コードを復元します。

2+8+2-!
(1- )#

一番下は、10桁をゼロにデクリメントする小さなループです。反復ごとに、上部に10を追加します。最初2のループはループの一部ではないので、ループ本体は実際+8+2に10を追加し(2前にプッシュしたものを使用)、さらに2をプッシュすることに注意してください。 10の値と別の2。-エンコードのオフセットを考慮してその2を減算し、で文字を出力し!ます。#ちょうど下のループの最後にゼロを破棄します。

このループが完了すると、2番目のスタックは空になり、最初のスタックはすべての数字を逆の順序で(および-7下部に)保持します。残りは非常に簡単です:

( 6+ !
8(1-)8)#

これはコアの2番目のループで、すべての数字を出力します。そのためには、正しい文字コードを取得するために各桁に48が必要です。これを行うに86、時間を実行してそのたびに追加する単純なループを使用します。結果を用いて印刷される!8終了時には、次の反復のためのものです。

では、-7どうでしょう?ええ、48 - 7 = 41これはの文字コードです)。魔法!

最後に、ループが完了したら、8プッシュさ#れたばかりのものを破棄して、2番目の音声の外側のループを確実に残します。すべての数字をもう一度プッシュすると、プログラムは終了します。



19
マーティン、どこかで止めなきゃ。
seequ

3
私はこれが全体で5000バイト以上のゴルフをしていることに加えて、そのうちの3つを節約したことに対するSp3000への謝辞が大好きです。
カミルドラカリ

2
@KamilDrakariしかし、これらは最後の3バイトだったので、かなり大したことです。;)
マーティン・エンダー

57

六角形、辺の長さ11、314バイト

164248894991581511673077637999211259627125600306858995725520485910920851569759793601722945695269172442124287874075294735023125483.....!/:;.........)%'=a':\....................\...................\..................\.................\................\...............\..............\..$@.........\$><>'?2='%.<\:;_;4Q

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


古いバージョン:

六角形、辺の長さ11、330バイト

362003511553420961423766261426252539048636523959468260999944549820033581478284471415809677091006384959302453627348235790194699306179..../:{;+'=1P'%'a{:..\.....................\...................\..................\.................\................\...............\..............\.............\!$><........\..@>{?2'%<......:;;4Q/

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

エンコーダー:オンラインでお試しください!

プログラムはこのPythonコードとほぼ同等です:オンラインで試してみてください!

展開されたコード:

           3 6 2 0 0 3 5 1 1 5 5
          3 4 2 0 9 6 1 4 2 3 7 6
         6 2 6 1 4 2 6 2 5 2 5 3 9
        0 4 8 6 3 6 5 2 3 9 5 9 4 6
       8 2 6 0 9 9 9 9 4 4 5 4 9 8 2
      0 0 3 3 5 8 1 4 7 8 2 8 4 4 7 1
     4 1 5 8 0 9 6 7 7 0 9 1 0 0 6 3 8
    4 9 5 9 3 0 2 4 5 3 6 2 7 3 4 8 2 3
   5 7 9 0 1 9 4 6 9 9 3 0 6 1 7 9 . . .
  . / : { ; + ' = 1 P ' % ' a { : . . \ .
 . . . . . . . . . . . . . . . . . . . . \
  . . . . . . . . . . . . . . . . . . . \ 
   . . . . . . . . . . . . . . . . . . \  
    . . . . . . . . . . . . . . . . . \   
     . . . . . . . . . . . . . . . . \    
      . . . . . . . . . . . . . . . \     
       . . . . . . . . . . . . . . \      
        . . . . . . . . . . . . . \       
         ! $ > < . . . . . . . . \        
          . . @ > { ? 2 ' % < . .         
           . . . . : ; ; 4 Q / .          

2 .秒には1ビットかかります。その他の文字は、1ビットとベース97桁を使用します。

説明

画像をクリックすると大きなサイズになります。各説明部分には、理解を助けるために対応するPythonコードがあります。

データ部

代わりに(といくつかの他の回答に使用される複雑な構造の<"およびいくつかの他のもの)、私はIPが下半分を通過してみましょう。

データ

最初に、IPは多数の番号とノーオペレーション(.)およびミラー(\)を実行します。各桁はメモリ内の数値に追加されるため、最後にメモリ値はプログラムの開始時の数値と等しくなります。

mem = 362003511...99306179

! それを印刷し、

stdout.write(str(mem))

そして$次を飛び越え>ます。

から始まり<ます。メモリの値memが偽である場合(<= 0つまり、条件mem > 0が満たされない場合)、プログラムの印刷が完了し、終了するはずです。IPは上位パスに従います。

出口

(IPが実行させ、世界中で打つ前に、約33のコマンドのために@どこにもそれを置くことは、いくつかの追加のバイトを被るので)プログラムを終了します()

それが正しい場合は、下のパスをたどり、数回リダイレクトされ、さらにコマンドを実行してから別の条件にヒットします。

# Python                    # Hexagony
# go to memory cell (a)     # {
a = 2                       # ?2
# go to memory cell (b)     # '
b = mem % a                 # %

これでメモリは次のようになります。

Mem1

値が真実であれば:

if b > 0:

次のコードが実行されます。

# Python                    # Hexagony
b = ord('Q')                # Q
b = b*10+4                  # 4
# Note: now b == ord('.')+256*3
stdout.write(chr(b%256))    # ;
stdout.write(chr(b%256))    # ;

詳細な説明を参照してくださいQ4MartinEnderのHelloWorldのHexagony答えを。つまり、このコードは.2回印刷されます。

元々、私はこれを.一度印刷するつもりでした。これを思いついて(.2回印刷して)実装すると、約10桁が保存されました。

次に、

b = mem // a                # :

ここに、私が約14桁の節約になったことに気付いた重要な事実があります。開始した場所にいる必要はない。


私が言っていることを理解するために、BFの例えをしましょう。(すでに理解している場合はこれをスキップしてください)

コードを考える

while a != 0:
    b, a = a * 2, 0
    a, b = b, 0
    print(a)

私たちは聞かせてと仮定すると、a現在のセルの値になるとb右のセルの値であることが、BFにこれの直接的な変換は次のとおりです。

[             # while a != 0:
    [->++<]       # b, a = a * 2, 0
    >[-<+>]       # a, b = b, 0
    <.            # print(a)
]

ただし、プログラム中は常に同じ位置にいる必要はありません。a各反復の開始時の値を何にすることもでき、次のコードが得られます。

[             # while a != 0:
    [->++<]       # b, a = a * 2, 0
                  # implicitly let (a) be at the position of (b) now
    .             # print(a)
]

これは数バイト短くなっています。


また、コーナーラッピングの動作は、\そこにミラーを置くことから私を救います-それなしでは、数字を合わせることができません(\それ自体は+2桁.、右側のペアではないため+2桁フラグ)

(詳細:

  • IPは左下隅に入り、左に向かいます
  • 右に曲がりますが、まだ左に向かっています
  • それ\を反映するaに遭遇し、今では右に向かっています
  • それは隅に行き、左下隅に再び歪む


(上のmod 2操作の)値が偽(ゼロ)の場合、次のパスに従います。

# Python                 # Hexagony   # Memory visualization after execution
b = mem // a             # :          # click here
base = ord('a') # 97     # a
y = b % base             # '%
offset = 33              # P1
z = y + offset           # ='+
stdout.write(chr(z))     # ;          # click here
mem = b // base          # {:         # click here

ここではあまり詳しく説明しませんが、オフセットは実際には正確33ではなく、33mod と一致してい256ます。そしてchr暗黙的% 256です。


3
男、それは多くのノーオペレーションです
ジョーキング

26
「私が言っていることを理解するために、[BrainFuck]のアナロジーを考えましょう」と笑いました。PPCGのみ... :)
リン

2
私はそれを
支持

2
新しいスペースを利用して数値を短縮することで310バイト
Jo King

2
さらに多くのスペースを取り出して308バイト
Jo King

46

Vim、11バイト

q"iq"qP<Esc>hqP
  • iq"qP<Esc>:記録外にある必要があるテキストの複製を手動で挿入します。
  • q"およびhqP:名前のない""レジスタに内部を直接記録するため、中央に貼り付けることができます。h必要な唯一の再配置です。マクロ内に配置すると、結果に貼り付けられます。

編集

録音に関する注意q":名前のないレジスター""は面白いものです。テキストはそこに保存されていないため、実際には他のような真のレジスターではありません。実際には、他のレジスタへのポインタです(通常"-、改行なしの削除"0、ヤンク、または"1改行付きの削除)。q"規則に違反します。実際に書き込みます"0。あなたがいる場合""、すでに以外のいくつかのレジスタを指した"0q"上書きされます"0が、まま""変わらず。新しいVimを起動すると、""自動的にを指す"0ので、その場合は問題ありません。

基本的に、Vimは奇妙でバグがあります。


私のためにこの仕事をしない理由を待つ
破壊可能なレモン

@DestructibleWatermelon確かに言うことはできませんが、1つの説明が最もありそうです。おそらく、それを人々に投げ捨てる可能性があるので、それを以前の記事に含めるべきだったでしょう。編集内容を読んでください。
udioica

あなたは、おそらくどのように押しについて何かを置くべきでyランニングを助けることができる前に、または何か
破壊可能なレモン

<Esc>キーを押して表示するのに使用しないのはなぜですか?このUnicodeブロック「Control Pictures」の
-mbomb007

4
@ mbomb007 <Esc>Vimマッピングでは表記法が標準であり(:help <>)、それがvimgolf.comが使用するものです。経験豊富なヴィンゴルファーは、それを読むのに使用されます。ユニコードについては、小さな文字を読むために目を細める必要があり、文字を入力してヘルプファイルを検索する方法がわかりません。
udioica

44

Cubix、20バイト

3434Qu$v@!<"OOw\o;/"

ほぼ \o/ ...

ネット

    3 4
    3 4
Q u $ v @ ! < "
O O w \ o ; / "
    . .
    . .

オンラインで試す

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

その他の注意事項

背景ストーリー

@ ais523によるこの素晴らしい答えを読んで感銘を受けた後、私はさらに馬をゴルフすることについて考え始めました。結局のところ、そこにはかなりの数のノーオペレーションがあり、それはあまり圧縮されていないと感じました。ただし、彼の答え(および私のもの)が使用する手法では、コードが全行にまたがる必要があるため、少なくとも12バイトの節約が必要でした。彼の説明には、本当に考えさせられた発言が1つありました。

この馬をさらにゴルフで下るというテーマでは、[...]立方体の上面を表す他の方法が必要です[...]

それから、突然、立ち上がって飲みに行くために立ち去ったとき、それは私に衝撃を与えました:プログラムが文字コードではなく、上面を表すために数字を使用していたらどうでしょうか?これは、印刷する数字が2桁の場合、特に短くなります。Cubixは3 1バイトの二桁の番号をプッシュするための手順がありますNSそしてQ、押し1032そして34それぞれを、ので、これはかなりgolfyする必要があり、私は思いました。

このアイデアの最初の複雑さは、上面が無用な数字で満たされているため、それ以上使用できないことです。2つ目の問題は、上面のサイズが2乗のキューブサイズであり、偶数サイズにする必要があることです。そうしないと、1つの数値が命令ポインターの開始位置に配置され、スタックが汚染されます。これらの複雑さのために、私のコードはサイズ2のキューブに収まる必要がありました(24バイトのみを含むことができるため、少なくとも21バイトをオフにする必要がありました)。また、上面と底面は使用できないため、有効なバイトは16個しかありませんでした。

だから、私は上面の半分になる番号を選択することから始めました。私はN(10)から始めましたが、すべてを印刷するために取っているアプローチのため、それはまったくうまくいきませんでした。いずれにせよ、私は新たに始めS、何らかの理由で(32)を使用しました。それは適切な馬をもたらした、または私はそう思った。すべてうまくいきましたが、引用符がありませんでした。それから、Q(34)が本当に役立つと思いました。結局、34は二重引用符の文字コードです。これにより、スタックに保持し、貴重なバイトを節約できます(そのとき使用したレイアウトでは2)。IPルートを少し変更した後、残されたのは、空白を埋める練習だけでした。

使い方

コードは5つの部分に分割できます。私はそれらを一つずつ調べていきます。スタックモデルは先入れ先出しなので、中間面を逆の順序でエンコードしていることに注意してください。

ステップ1:上面の印刷

無関係な命令は、no-ops(.)に置き換えられました。IPは、3番目の行を開始し、左端で東を指します。スタックは(明らかに)空です。

    . .
    . .
Q u . . . . . .
O O . . . . . .
    . .
    . .

IPは、4行目の左端の位置で終わり、西を指し、同じ行の右端の位置に折り返します。実行される命令は次のとおりです(制御フロー文字なし)。

QOO
Q   # Push 34 (double quotes) to the stack
 OO # Output twice as number (the top face)

スタックには、ソースの最後の文字を表す34のみが含まれます。

ステップ2:4行目をエンコードする

このビットは、あなたが期待することとほぼ同じです:4行目をエンコードします。IPはその行の末尾の二重引用符から始まり、一致する二重引用符が見つかるまで、着地するすべての文字の文字コードをプッシュしながら西に移動します。この一致する二重引用符は、IPが左端に達すると再び折り返されるため、4行目の最後の文字でもあります。

事実上、IPは1ポジション左に移動し、スタックには文字コードと逆順の4行目の表現が含まれるようになりました。

ステップ3:別の見積もりをプッシュする

別の引用符をプッシュする必要があります。Qプログラムの開始時に右からアプローチすることでリサイクルするよりも良い方法はありますか?これには、IPが3行目をエンコードする引用に直接ぶつかるという追加のボーナスがあります。

これがこのステップのネットバージョンです。無関係な命令は再びノーオペレーションに置き換えられ、実行されるノーオペレーション#は説明のためにハッシュタグ()に置き換えられ、IPは4行目の最後の文字から始まります。

    . .
    . .
Q u $ . . . . .
. . w \ . . / .
    . #
    . #

IPは、最初の命令で3行目で終了します。これは、その行が西を指しているため、その行の終わりにラップしようとしています。以下の指示(制御フローを除く)が実行されます。

$uQ
$u  # Don't do anthing
  Q # Push the double quote

この二重引用符は、3行目の終わりの二重引用符を表します。

ステップ4:3行目をエンコードする

これは手順2とまったく同じように機能するため、説明を参照してください。

ステップ5:スタックを印刷する

スタックには4行目と3行目が逆の順序で含まれているので、今必要なことはすべて印刷します。IPは3行目の最後から2番目の命令から始まり、西に移動します。キューブの関連部分は次のとおりです(ここでも、関連のない部分はノーオペレーションに置き換えられています)。

    . .
    . .
. . . v @ ! < .
. . . \ o ; / .
    . .
    . .

あなたが見た/予想したように、これはループです。本体は次のとおりです。

o;
o  # Print top of stack as character
 ; # Delete top of stack

一番上の項目が0の場合、ループは終了します。これは、スタックが空の場合にのみ発生します。ループが終了すると、@が実行され、プログラムが終了します。


私はこれをさらに
賛成できれ

賞金はいつでも歓迎です;
ルーク

42

Javascript ES6-21バイト

$=_=>`$=${$};$()`;$()

私はこの馬を「The Bling Quine」と呼んでいます。

時々、あなたはスタイルでゴルフを得なければなりません。


!$=_=>`!$=${$}()`()あなたに2つのバイトを保存しますか?
ダウンゴート

Invalid assignment left hand side。それが働いてほしい:(
ママファンロール

1
@TùxCräftîñgは、テンプレートリテラルを囲む括弧を削除すると、などのネイティブプロトタイプ関数でのみ機能しArray.prototype.joinます。
ママファンロール

2
うーん、わかりません。私はこれを1年以上前に書きました(当時は有効であると考えられていました)。ただし、矢印関数を追加alertまたはconsole.logその後に追加し、テンプレート文字列を括弧で囲むと機能します。
ママファンロール

3
また、これをコンソールで実行すると、このサイトの$(jQuery関数)が上書きされ、upvote関数は機能しなくなります。:)
スティーブンパリンカス

41

Brainf * ck(755文字)

これは、Erik Bosman(cs.vu.nlのejbosman)によって開発された手法に基づいています。「ESultanik's Quine!」テキストは、それが馬であるために実際に必要です!

->++>+++>+>+>++>>+>+>+++>>+>+>++>+++>+++>+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>+>++>>>+++>>>>>+++>+>>>>>>>>>>>>>>>>>>>>>>+++>>>>>>>++>+++>+++>+>>+++>>>+++>+>+++>+>++>+++>>>+>+>+>+>++>+++>+>+>>+++>>>>>>>+>+>>>+>+>++>+++>+++>+>>+++>+++>+>+++>+>++>+++>++>>+>+>++>+++>+>+>>+++>>>+++>+>>>++>+++>+++>+>>+++>>>+++>+>+++>+>>+++>>+++>>>+++++++++++++++>+++++++++++++>++++++>+++++++++++++++>++++++++++>+++>+++>++++>++++++++++++++>+++>++++++++++>++++>++++++>++>+++++>+++++++++++++++>++++++++>++++>++++++++++++>+++++++++++++++>>++++>++++++++++++++>+++>+++>++++>++++++>+++>+++++++++>++++>+>++++>++++++++++>++++>++++++++>++>++++++++++>+>+++++++++++++++>+++++++++++++
ESultanik's Quine!
+[[>>+[>]+>+[<]<-]>>[>]<+<+++[<]<<+]>>+[>]+++[++++++++++>++[-<++++++++++++++++>]<.<-<]

13
それは賢いやり方です。
ピーターオルソン

13
どのように機能しますか?
誇りに思ってhaskeller 14

3
@proudhaskeller IIRC、前の部分ESultanik's Quine!は、メモリをスタックエンコーディングとして設定し、ESultanik's Quine!各文字に2バイトのメモリを割り当てます(0x1FからのASCII値オフセット)。コードの最後のビットはメモリをループし、最初++>+++…に各文字のコードをプログラムで再現してから、実際に文字を印刷します。
ESultanik

4
@CatsAreFluffy彼らはそれが馬であるために必要です!それらを削除できることは事実ですが、前述のコードを変更してquineプロパティを維持する必要もあります。
-ESultanik

1
それは本当だ。また、改行も必要です。
電卓

36

Hexagony、辺の長さ15 14 13 12 616の533 456 383バイト

数日間の慎重なゴルフ、ループの再配置、やり直しの後、私はついにサイド12の六角形に到達することができました。

1845711724004994017660745324800783542810548755533855003470320302321248615173041097895645488030498537186418612923408209003405383437728326777573965676397524751468186829816614632962096935858"">./<$;-<.....>,.........==.........<"......."">'....>+'\.>.........==........<"......"">:>)<$=<..>..............$..<"...."">\'Q4;="/@>...............<"....."">P='%<.>.............<"..!'<.\=6,'/>

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

展開:

            1 8 4 5 7 1 1 7 2 4 0 0
           4 9 9 4 0 1 7 6 6 0 7 4 5
          3 2 4 8 0 0 7 8 3 5 4 2 8 1
         0 5 4 8 7 5 5 5 3 3 8 5 5 0 0
        3 4 7 0 3 2 0 3 0 2 3 2 1 2 4 8
       6 1 5 1 7 3 0 4 1 0 9 7 8 9 5 6 4
      5 4 8 8 0 3 0 4 9 8 5 3 7 1 8 6 4 1
     8 6 1 2 9 2 3 4 0 8 2 0 9 0 0 3 4 0 5
    3 8 3 4 3 7 7 2 8 3 2 6 7 7 7 5 7 3 9 6
   5 6 7 6 3 9 7 5 2 4 7 5 1 4 6 8 1 8 6 8 2
  9 8 1 6 6 1 4 6 3 2 9 6 2 0 9 6 9 3 5 8 5 8
 " " > . / < $ ; - < . . . . . > , . . . . . .
  . . . = = . . . . . . . . . < " . . . . . .
   . " " > ' . . . . > + ' \ . > . . . . . .
    . . . = = . . . . . . . . < " . . . . .
     . " " > : > ) < $ = < . . > . . . . .
      . . . . . . . . . $ . . < " . . . .
       " " > \ ' Q 4 ; = " / @ > . . . .
        . . . . . . . . . . . < " . . .
         . . " " > P = ' % < . > . . .
          . . . . . . . . . . < " . .
           ! ' < . \ = 6 , ' / > . .
            . . . . . . . . . . . .

最もゴルフされたHexagonyコードのようには見えませんが、私が使用したエンコーディングのタイプは、no-opのより長い実行に対して最適化されています。

説明

これは、no-ops()を別の方法でエンコードすることにより、以前のHexagonyの答えを打ち負かします.。その答えは.、他のすべてのキャラクターをaにすることでスペースを節約しますが、私はノーオペレーションのをエンコードします。また、ソースをそれほど制限する必要がないことも意味します。

ここでは、ベース80エンコードを使用します。16未満の数字はノーオペレーションの実行を示し、16〜79の数字は32(!)〜95(_)の範囲を表します(今_では、コード笑)。いくつかのPythonic擬似コード:

i = absurdly long number
print(i)
base = 80
n = i%base
while n:
    if n < 16:
        print("."*(16-n))
    else:
        print(ASCII(n+16))
    i = i//base
    n = i%base

数字は六角形の前半にエンコードされ、すべての

" " > 
 " " > 
  ... etc

左側と

 > ,
< "
 >
< "
... etc

右側でポインターをリダイレクトして、数値を1つのセルにエンコードします。これはMartin Enderの回答(感謝)から取ったものです。これは、より効率的な方法を見つけられなかったためです。

次に、以下の下部セクションに入り->ます。

       " " > \ ' Q 4 ; = " / @ > . . . .
        . . . . . . . . . . . < " . . .
         . . " " > P = ' % < . > . . .
          . . . . . . . . . . < " . .
     ->    ! ' < . \ = 6 , ' / > . .

!数値を出力し'、ループを開始する前に適切なメモリセルに移動します。P='%現在の数値を80で@modします-16。結果が0の場合、終了するまで進み、そうでない場合は、値を使用してmod結果の隣にセルを作成します。

   . " " > ' . . . . > + ' \ . > . . . . . .
    . . . = = . . . . . . . . < " . . . . .
     . " " > : > ) < $ = < . . > . . . . .
      . . . . . . . . . $ . . < " . . . .
       " " > \ ' Q 4 ; = " / @ > . . . .
                      /
                     /

セルを(mod値+ -16)に設定します。その値が負の場合、分岐点>+'\で上昇し、そうでなければ下降します。

値が正の場合:

 " " > . / < $ ; - < . . . . . > , . . . . . .
  . . . = = . . . . . . . . . < " . . . . . .
   . " " > ' . . . . > + ' \ . > . . . . . .

ポインタはで終わり;-<、セルを(mod value--16)に設定して印刷します。

値は負です:

   . " " > ' . . . . > + ' \ . > . . . . . .
    . . . = = . . . . . . . . < " . . . . .
     . " " > : > ) < $ = < . . > . . . . .

> ) <ループを開始するセクションに移動します。ここでは分離されています:

     . . > ) < $ = < . .
      . . . . . . . . .
       \ ' Q 4 ; = " /

これは、コードを実行し'Q4;="=.(文字の文字と数字の組み合わせを見つけるプログラムを作成したMartin Enderに感謝します)、開始セルに戻ります。次に)、mod値が正になるまで、mod値のセルをインクリメント()し、再びループします。

それが完了すると、上に移動し、他のセクションと結合します:

 " " > . / < $ ; - < . . .
            \
             \

その後、ポインターは再び大きなループの開始点に戻ります

 " " > . / <--
  . . . = =
   . " " > ' 
    . . . = = 
     . " " > :
      . . . . .
       " " > \ ' . .
        . . . . . . .
         . . " " > P = ' % < . > . . .

これ='=:'により、現在の数値が80で除算され、正しいセルに移動します。

古いバージョン(横の長さ13)

343492224739614249922260393321622160373961419962223434213460086222642247615159528192623434203460066247203920342162343419346017616112622045226041621962343418346002622192616220391962343417346001406218603959366061583947623434"">/':=<$;'<.....>(......................<"......"">....'...>=\..>.....................<"....."">....>)<.-...>...........==......<"...."">.."...'.../>.................<"..."">\Q4;3=/.@.>...............<".."".>c)='%<..>..!'<.\1*='/.\""

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

私は間違いなくこれからもう一辺をゴルフすることができますが、遅くなるので明日までそれを残さなければなりません。私は焦って、明日まで待てないことがわかりました。たぶん、別の側をゴルフすることができますか? :( ああ、ああ、やった!

基本の77エンコードで2、3桁の余分な数字を消しさえしましたが、同じバイトカウントを持っているので、実際には問題ではありません。


13
これは素晴らしいです。このハイブリッドランレングスエンコーディングのアイデアは本当にすてきです。:)私が忘れたら賞金を与えることを思い出させてください。
マーティンエンダー

35

PostScript、20文字

短くて合法。末尾の改行を含む20文字。

(dup == =)
dup == =

33

Cubix、45バイト

.....>...R$R....W..^".<R.!'.\)!'"R@>>o;?/o'u"

ここでこのコードをテストできます

このプログラムを追うのはかなり難しいですが、そうする機会を得るために、Cubixインタープリターが行うように、キューブに展開することから始める必要があります。

      . . .
      . . >
      . . .
R $ R . . . . W . . ^ "
. < R . ! ' . \ ) ! ' "
R @ > > o ; ? / o ' u "
      . . .
      . . .
      . . .

これはBefungeスタイルのクインであり、ラッピングを利用して文字列リテラルを実行可能コードに「ラップアラウンド」するように機能します(1つの"マークのみで、コードは同時に引用の内側と外側の両方にあります。非線形で非平面のプログラム)。2つの二重引用符はそれ自体をエンコードせず、後で算術を使用して計算されるため、これは適切なクインの定義に適合することに注意してください。

ただし、Befungeとは異なり、ここでは1つではなく4つの文字列を使用しています。スタックにプッシュされる方法は次のとおりです。

  1. プログラムは左端の上部から始まり、右に向かっていきます。右に2回(R)回転し、立方体全体を囲む3番目と最後の行に沿って左に移動します。二重引用符はそれ自体と一致するため、3行目全体をスタックにプッシュします。その後、二重引用符の後に実行が継続されます。

  2. このuコマンドは右にUターンするため、次に実行するのは'"中央の行からです。それ"はスタックにプッシュします。ラップアラウンドを続け<、キューブの左側近くを叩いて跳ね返ります。この方向から近づくと"、ではなくプレーンなコマンドが表示される'"ため、2行目全体が3行目と二重引用符の上にあるスタックにプッシュされます。

  3. まず!、スタックにa をプッシュし('!)、インクリメントします())。これにより、ソースコードに二重引用符を必要とせずに二重引用符が生成されます(これにより、文字列が終了します)。ミラー(\)は実行方向を北上に反映します。その後、Wコマンドは左側に移動します。これにより、7番目の列で上向きになります。これはキューブであるため、3番目の行で左に折り返され、3番目の列で下向きになります。をR押して、右に曲がり、一番上の行に沿って左に進みます。次に、プログラムに入っ$Rビアをスキップするため、実行"は行の最後まで折り返され、2番目と3番目と同じ方法で文字列の最初の行をキャプチャします。

  4. この^コマンドは、11番目の列を北方向に送信し、5番目の列は(キューブの折り返しを許可して)南方向に送信します。そこに遭遇する唯一のものは!(ゼロ以外の場合はスキップ、スタックの最上部は実際にゼロ以外)、oコマンドをスキップし、5番目の列を完全に空にします。したがってu、再びUターンするコマンドに戻りますが、今回は最後の列を南向きに残し、4番目の列を北向きに折り返します。ただし、Uターン中に二重引用符を使用するため、文字列の4列目全体を下から上にキャプチャします。プログラム内のほとんどの二重引用符とは異なり、この引用符はそれ自体を閉じません。むしろ、"右上隅ので閉じられています...>.....。つまり、9文字の文字列をキャプチャします。

したがって、スタックレイアウトは上から下になりました。4列目です。一番上の行。"; 中央の行。"; 最終行。これらのそれぞれは、スタックの一番上に最も近い最初の文字でスタックに表されます(Cubixは、Befungeが行うように、この順序の逆に文字列をプッシュしますが、IPが自然な読み取り方向と反対方向に移動するたびに、そのため、事実上2回逆転しました)。スタックの内容は元のプログラムとほぼ同じであることに注意してください(4番目の列とキューブの北/上面には同じ文字が同じ順序で含まれているため、明らかに意図的にそのように設計されています)。

次のステップは、スタックの内容を印刷することです。すべてのプッシュの後、IPは4番目の列で北に向かっているため、>そこにヒットしてタイトループに入ります>>o;?(つまり、「東に曲がり、東に曲がり、キャラクターとして出力、ポップ、正の場合は右に曲がります」)。7行目にはNOPがいっぱいである?ため、最初の行に折り返され>、スタックの内容全体が効果的にプッシュされます(?空のスタックでは何もしません)。プログラム全体をほぼ印刷しました!残念ながら、まだ完了していません。最後に二重引用符がありません。

ループが終了すると、1対のミラーを介して、西に移動する中心線に反射します。(\以前にミラーの「反対側」を使用しましたが、現在は南西側を使用しています。/ミラーは以前に使用されていません。)'!感嘆符を押します(つまり33; ASCIIを使用しています)また、Cubixはスタック上の整数と文字を区別しません)。(便利なことに、これは以前!oコマンドをスキップするために使用されたものと同じです。)一対のRコマンドに遭遇し、それらを使用して「手動」Uターンを行います(Rここの2番目のコマンドは最初に到達するために以前に使用されました行なので、別のRコマンドを並べて表示するのが最も自然に思えました。Wコマンド、左側に回避します。サイドステップは>、2行目のコマンドに直接クラッシュし、実行された場所に正確に戻ります。したがって、私たちは再び左に寄り道しますが、今回は南に向かっているので、実行する次のコマンドは)(感嘆符を二重引用符にインクリメントする)、その後にo(出力する)です。最後に、実行は8行目に沿って2列目に折り返され、そこで@プログラムを終了します。

3行目のアポストロフィについておforび申し上げます。このバージョンのプログラムでは何もしません。それは私が持っていた以前のアイデアの一部でしたが、それは必要ないことが判明しました。ただし、作業クインを取得したら、それをさらに混乱させるのではなく、送信するだけでした。特に削除してもバイトカウントは変更されません。このクインをさらにゴルフダウンするというテーマで、最初の5行だけを使用してこれが3x3で可能だったとしても驚くことはありませんが、それを行うための明確な方法がわかりません。キューブの上面を表す他の方法と一緒にすべての制御フローをさらに緊密に詰め込みます(または、長さが10文字または11文字であっても4列目を引き続き使用できるようにアルゴリズムを変更します) 。


すばらしい仕事です。これは本当に印象的なスコアです。上面のエンコード方法が大好きです。:)
マーティンエンダー

これは信じられないほどです!それが助けになる場合、プッシュする別の方法が"ありQます。
ETHproductions 16

1
うわー!私はキュービックスの馬を見ることはありませんが!
FlipTack 16

3
昨日説明を読む時間がありませんでしたが、今では...ただ... WOW。2つまたは3つのまったく異なる目的に使用されているキャラクターの数は信じられません。これはおそらく私が今まで見た中で最もクールなCubixプログラムです。
ETHproductions 16

良い説明。
ロバートフレイザー

33

Python 2、30バイト

_='_=%r;print _%%_';print _%_

ここから撮影


1
+1、あなたは私の同様の解決策を破ったので、私はそれを削除しました。これはPython 2でのみ機能することに注意してください。
nyuszika7h14年

2
変数名asは奇妙に見え_ますが、任意の文字、つまりsに割り当てると読みやすくなります。s='s=%r;print s%%s';print s%s
Ehtesh Choudhury

5
このソリューションが自分で作成したものでない場合は、コミュニティWikiにする必要があります。また、リンクは無効です。
mbomb007

1
私はパーティーに少し遅れていますが、誰かがこれがどのように機能するか説明できますか?
MadTux

9
これには、有効な末尾の改行が必要です。現状では、ソースコードは出力と一致しません。
デニス

32

Vimは、17、14回のキーストローク

誰かがこれをランダムに支持したので、私はそれが存在することを思い出しました。私はそれを読み直したとき、「ねえ、私はそれよりもうまくやれる!」と思ったので、2バイトゴルフをしました。まだ最短ではありませんが、少なくとも改善されています。


長い間、私はvim quineが可能かどうか疑問に思っていました。一方では、vimが完全にチューリングしているので、それが可能でなければなりません。しかし、非常に長い間vim quineを探した後、私はそれを見つけることができませんでした。私このPPCGチャレンジを見つけましたが、それは閉じられており、文字通りのクインについては正確ではありません。見つけられなかったので、作ることにしました。

私はこの答えを本当に誇りに思っています。 最初

  1. これは私が作った最初の馬であり、

  2. 私の知る限り、これは世界初です VIM-QUINE、これまでに公開されます!私はこれについて間違っている可能性がありますので、もしあなたがそれを知っていたら、私に知らせてください。

したがって、その長い紹介の後、ここにあります:

qqX"qpAq@q<esc>q@q

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

これを<esc>入力すると、キーストロークがとして表示されることに注意してください^[ASCIIでエスケープされる^[表すため、これはまだ正確です。0x1Bでのあり、vimが内部的に<esc>キーを表す方法をです。

また、既存のvimセッションをロードすると、これのテストが失敗する可能性があることに注意してください。詳細な情報が必要な場合は、ここで説明する回答を書きましたが、基本的にはvimを起動する必要があります

vim -u NONE -N -i NONE

または入力しqqq、これを実行する前に。

説明:

qq                  " Start recording into register 'q'
  X                 " Delete one character before the cursor (Once we play this back, it will delete the '@')
   "qp              " Paste register 'q'
      Aq@q<esc>     " Append 'q@q' to this line
               q    " Stop recording
                @q  " Playback register 'q'

ちなみに、この回答はおそらく、PPCGの回答などのほとんどの「q」の世界記録です。


1
2i2i<esc>とても近いです。この作品を作るために私にできることがあるに違いないと感じています。
ツヴァイ

@zwei知っています、痛いです!実際、<Esc>Vでは暗黙的であるため、動作します。残念ながら、改行も追加されるため、まだ投稿していません。
DJMcMayhem

q"iq"qbP<Esc>qbPこれは11です。これをredditに追加した後、ここでvimgolfingを調査し、アカウントを作成することにしました。これは私がそこに投稿した答えです。
udioica

2
@udioica回答として投稿できますか?
DJMcMayhem

28

失われた 120 116 98 96 76 70 66バイト

編集:イェー、100未満

編集:/一番下の行のすべてのsに切り替えて、たくさんのバイトを保存

:2+52*95*2+>::1?:[:[[[[@^%?>([ "
////////////////////////////////

オンラインでお試しください!+検証可能なすべての状態について決定論的

Lostは、開始位置と方向が完全にランダムな2D言語です。これは、正しい命令ポインターを確実に取得するために、すべての段階で多くのエラーチェックが必要であることを意味します。

説明:

/一番下の行のすべてのsは、垂直方向または一番下の行にスポーンするすべてのポインターが正しい方向に到達することを確認するためにあります。そこから、彼らはいくつかの異なる場所に行き着きますが、それらはすべて最終的に

 ^%?>
 ////

これにより、スタック内のすべてのゼロ以外の数字がクリアされます。の([同様に余分な0をクリアした後。

クリアの途中で、にヒットし%、「安全」をオフにします。これにより、プログラムがヒットしたときに終了します@(これがないと、ポインタが@)。

そこから、文字列リテラル(")を最初の行にラップし"、スペース(:2+)を押して文字をプッシュし、次に改行(52*)することで、非常に単純な2D言語のクインを実行します。2行目では、/文字(95*2+)を作成し、それを束(>::1?:[:[[[[)に複製し@ます。最後にで終了し、暗黙的にスタックを印刷します。これ?1は、ポインターが早く入った場合にプロセスが多すぎる0を作成しないようにすることで、後でクリアする必要を省きます。

ここでは、最後の行をすべて同じ文字にすることで20バイトを節約しました@。つまり、複製プロセスから終了までまっすぐ進むことができました。

重複プロセスに関する説明:

[「ドア」として知られるキャラクターです。ポインターがa [またはaの平らな側面に当たると、ポインター]は反射し、そうでなければ通過します。ポインターがドアと対話するたびに、反対のタイプに切り替わります。この知識を使用して、>:[ブロック内で命令が実行される回数の簡単な式を作成できます。

最初の指示を追加します。それぞれについて[、その左側に2倍の量の指示を追加します。例>::::[:[[[では、初期量として5から始めます。最初のドアには4つのデュープ命令があり、4 * 2 = 8を5に追加して13を取得します。他の3つのドアは5つのデュープを左に追加します。したがって、3 *(5 * 2)= 30から13を追加して43を取得しますデュープ命令が実行さ>れ、スタック上に44 があります。同じプロセスを次のような他の指示に適用できます。(を、スタックからスコープに大量のアイテムをプッシュしたり、ここで使用したようにスタックからアイテムをクリアしたりするます。

ここで使用した0の重複を避けるためのトリックは、1?です。文字が0の場合、?1はスキップされません。つまり、残りのデュープに対して1が複製されます。これは作るくらい簡単に、後にスタックをクリアします。


25

これらはSOからの 2つの最短のRubyクインです:

_="_=%p;puts _%%_";puts _%_

そして

puts <<2*2,2
puts <<2*2,2
2

2番目の機能のしくみを聞かないでください...


8
もう一つは、ヒアドキュメントを使用して<<2次の行に文字列を開始し、*2文字列を繰り返し
明唐

なぜ2が必要なのですか?
電卓

1
@CalculatorFelineヒアドキュメント文字列の終端文字です(独自の行に表示する必要があります)。ただし、実際には2である必要はありません:tio.run
マーティン・エンダー

25

核分裂、6バイト

これは現在、これらの回答の中で最も短い「適切な」馬です。

'!+OR"

説明

制御フローは、R右向きの単一の(1,0)アトムから始まります。"印刷モードの切り替えをヒットしてから行を折り返し'!+OR"再度同じ印刷モードを実行してから印刷モードを終了します。

それ"自体が印刷されます。最短の方法'"O'"アトムの質量を文字コードに設定し、文字"O印刷して原子を破壊する)ですが、これを行う"と印刷モードに干渉します。代わりに、我々は原子の値を設定するので、'!(1未満")、次いでインクリメント+し、その後で結果を印刷しますO

代替案

いくつかの選択肢がありますが、それらはより長いですが、それらのテクニックは誰かにそれらを使用してより短いバージョンを見つけるよう促します(または、特定の一般化されたクインでより役に立つかもしれません)。

Jump を使用して8バイト

' |R@JO"

繰り返しますが、コードはから始まりRます。@スワップの質量とエネルギーを与えます(0,1)。したがって、Jは、アトムをにOストレートにジャンプさせ"ます。次に、以前と同様に、すべてが"文字列モードで印刷されます。その後、原子はヒット|して方向を反転し、'"O印刷を通過します"。スペースは少し面倒ですが、そうでないと'アトム|がミラーではなく文字として扱われるため、必要なようです。

2つのアトムを使用した8バイト

"'L;R@JO

これには2つのアトムがあり、左から始まりL、右から始まりRます。左方向のアトムはその値を取得し、それによって'"すぐに印刷されますO(そしてアトムは破棄されます)。右向きのアトムについては、質量とエネルギーを再び交換し、ジャンプしOて残りのコードを印刷モードで印刷します。その後、その値はによって設定されますが'L、アトムはで破棄されるため、それは問題ではありません;


ソースにコード/データの分離がないため、技術的に無効です。
CalculatorFeline

4
@CalculatorFeline '!+はをエンコードし"ます。
マーティンエンダー

私は核分裂に精通していませんが、|R@JO"'うまくいくでしょうか、それともまだそのスペースが必要'ですか?
MildlyMilquetoast

1
@MistahFigginsそう思いますが、もっと重要なことは、'最初に印刷することです。
マーティンエンダー

24

クロスブラウザーJavaScript(41文字)

トップ5のWebブラウザー(IE> = 8、Mozilla Firefox、Google Chrome、Safari、Opera)で動作します。それらのいずれかで開発者のコ​​ンソールに入力してください:

eval(I="'eval(I='+JSON.stringify(I)+')'")

「不正」ではありません。ChrisJester-Youngのシングルバイトクインとは異なり、alert()関数を使用するように簡単に変更できます(14文字のコスト):

alert(eval(I="'alert(eval(I='+JSON.stringify(I)+'))'"))

または、ブックマークレットに変換されます(22文字のコスト):

javascript:eval(I="'javascript:eval(I='+JSON.stringify(I)+')'")

24

C、64 60バイト

main(s){printf(s="main(s){printf(s=%c%s%1$c,34,s);}",34,s);}

これまでのところ、これは最短の既知のCクインです。短いものを見つけた場合は、延長された報奨金があります。

これは、POSIX環境のGCCClang、およびTCCで機能します。それらはすべて、未定義の動作を過度に引き起こします。

楽しみのために、ここに私が知っているすべてのCカインを含むレポがあります。既存のものに新しい創造的なものを追加する別のものを見つけたり、書いたりする場合は、フォーク/ PRを自由に行ってください。

ASCII環境でのみ機能することに注意してください。これEBCDICで機能しますが、それでもPOSIXが必要です。とにかくPOSIX / EBCDIC環境を見つけるのは幸運です:P


使い方:

  1. main(s)main型指定されていない変数を宣言して、引数を悪用しますs。(s実際には型付けされていないことに注意してください。ただし、リストされているコンパイラは必要に応じて自動キャストするため、*である可能性もあります。)
  2. printf(s="..."指定sされた文字列に設定し、最初の引数をに渡しますprintf
  3. sに設定されmain(s){printf(s=%c%s%1$c,34,s);}ます。
  4. %cASCIIに設定されています34"。これにより、クインが可能になります。これsは次のようになります
    main(s){printf(s="%s%1$c,34,s);}
  5. %s設定されているsため、#2に可能である、自分自身。これsは次のようになります
    main(s){printf(s="main(s){printf(s=%c%s%1$c,34,s);}%1$c,34,s);}
  6. %1$cASCII 34に設定され"printf初の**引数。これsは次のようになります
    main(s){printf(s="main(s){printf(s=%c%s%1$c,34,s);}",34,s);}
    。...これはたまたま元のソースコードです。

* @Pavelに感謝
**形式指定子の後の最初の引数-この場合、s。フォーマット指定子を参照することは不可能です。


同じアプローチでこれを短くすることは不可能だと思います。printfの形式指定子にでアクセスできる場合$、これは52バイトで機能します。

main(){printf("main(){printf(%c%0$s%1$c,34);}",34);}

確かに競合するものとして数えるべきではありませんが、1994年の国際難読化Cコードコンテスト1994_smr.cの「ルールの最悪の悪用」の勝者は間違いなく短いです。
レイ

@Ray許可されていません。それはどんな定義によっても適切な馬ではありません。そのプログラムのために静止ルールが変更されました:P
MD XF

私は完全に同意しますが、歴史上の理由だけでなく、誰かが最小の既知の馬について言及するときはいつでも言及する価値があるほど興味深いハックです。
レイ

4
sintではなく、「型なし変数」です。
feersum

2
これらのコンパイラーはすべて、ポインターをintに暗黙的に変換できるようです。s=3に文字列を2回渡す必要があるため、明らかに動作しませんprintf
feersum

24

Java、528バイト:

独自のアプローチによるJavaソリューション:

import java.math.*;class a{public static void main(String[]a){BigInteger b=new BigInteger("90ygts9hiey66o0uh2kqadro71r14x0ucr5v33k1pe27jqk7mywnd5m54uypfrnt6r8aks1g5e080mua80mgw3bybkp904cxfcf4whcz9ckkecz8kr3huuui5gbr27vpsw9vc0m36tadcg7uxsl8p9hfnphqgksttq1wlolm2c3he9fdd25v0gsqfcx9vl4002dil6a00bh7kqn0301cvq3ghdu7fhwf231r43aes2a6018svioyy0lz1gpm3ma5yrspbh2j85dhwdn5sem4d9nyswvx4wmx25ulwnd3drwatvbn6a4jb000gbh8e2lshp",36);int i=0;for(byte c:b.toByteArray()){if(++i==92)System.out.print(b.toString(36));System.out.print((char)c);}}}

読みやすい形式で:

import java.math.*;
class a
{
    public static void main (String [] a)
    {
        BigInteger b=new BigInteger ("90ygts9hiey66o0uh2kqadro71r14x0ucr5v33k1pe27jqk7mywnd5m54uypfrnt6r8aks1g5e080mua80mgw3bybkp904cxfcf4whcz9ckkecz8kr3huuui5gbr27vpsw9vc0m36tadcg7uxsl8p9hfnphqgksttq1wlolm2c3he9fdd25v0gsqfcx9vl4002dil6a00bh7kqn0301cvq3ghdu7fhwf231r43aes2a6018svioyy0lz1gpm3ma5yrspbh2j85dhwdn5sem4d9nyswvx4wmx25ulwnd3drwatvbn6a4jb000gbh8e2lshp", 36); 
        int i=0; 
        for (byte c:b.toByteArray ())
        {
            if (++i==92) 
                System.out.print (b.toString (36)); 
            System.out.print ((char) c);
        }
    }
}

どのように機能しますか?
-Loovjo

1
@Loovjo:コードを2つの部分にカットし、コードを再度表す文字列全体を挿入する他のソリューションと似ていますが、コード全体は単なる文字列ではなく、基数36(アルファベット26文字+ 10桁)。
ユーザー不明

1
あなたが置く場合、これは短縮される可能性がありますif(++i==92)
-tuskiomi

2
@tuskiomi:ありがとう、2文字で短縮
ユーザー不明

1
@userunknown実際、a*配列はJavaで終了しないため、Cです。ゴルフの他の部分:import java.math.*;class a{public static void main(String[]a){BigInteger b=new BigInteger("abc",36);int i=0;for(int c:b.toByteArray())System.out.printf("%s%c",++i==92?b.toString(36):"",c);}}、ここabcで、新しく計算されたマジックナンバーの文字列になります。Javaでは8+それは変更することも可能ですclass a{public static void maininterface a{static void main、そしてJavaでそれを変更することも可能です10 + import java.math.*;BigInteger b=new BigInteger(しますvar b=new java.math.BigInteger(
ケビンクルーッセン

23

鶏肉、7

chicken

いいえ、これは直接エコーされません:)


ダムニット、あなたは私にそれを打ちました:)
タコナット14

エコーされず、文字列chickenです!
エリックアウトゴルファー

コード/データの分離がないため、無効です。
CalculatorFeline

10
@CalculatorFelineルールを読みましたか?
ティムテック

1
@JoKingチャレンジのルールでは、長さゼロと不正行為(独自のソースファイルの読み取り)のみを禁止しているため、これは無効ではないと思います。不適切なクインを禁止する唯一のことは、標準の抜け穴です。ただし、標準の抜け穴は、通常、それらに先行する回答に適用されるとは考えられていません。
pppery

23

網膜20 14 9 7バイト

始める前に、単一のを含むファイルの些細な解決策に言及したいと思います0。その場合、Retinaは0空の入力のs をカウントしようとしますが、その結果も0です。しかし、私はそれを適切な馬とは思わないでしょう。

だからここに適切なものがあります:

>\`
>\`

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

または、の;代わりに使用できます>

説明

プログラムは、2回印刷する単一の置換で構成されます。

最初の行では`、構成が正規表現から分離されているため、正規表現は空です。したがって、空の文字列(つまり、存在しない入力)は、2行目の逐語的に置き換えられます。

結果を2回印刷するには、2つの出力段階にラップします。内側のもの\は末尾の改行で結果を印刷し、外側のものは末尾なしで結果を>印刷します。

Retinaに少し精通している場合、Retinaの暗黙的な出力に何が起こったのか疑問に思うかもしれません。Retinaの暗黙的な出力は、プログラムの最終段階を出力段階にラップすることで機能します。ただし、最終段階が既に出力段階である場合、Retinaはこれを行いません。その理由は、通常のプログラムでは、暗黙的な出力ステージを、フラグ付きの暗黙的な出力ステージを削除する代わりに、\または;単一バイトのような特別なステージに置き換えることができると便利だからです.。残念ながら、この振る舞いにより、クインのために2バイトのコストがかかります。


20

Javascript(36文字)

(function a(){alert("("+a+")()")})()

これは、AFAICT、これまでに投稿された最短のジャバスクリプトです。


1
それは印象的です。あなたはそれが私のためにどのように機能するかを説明する必要があります8- |
-TehShrike

3
@TehShrikeヒント:文字列に強制することで、関数の内容を表示できます。たとえば、関数がある場合a、を呼び出すことでその内容にアクセスできますa.toString
ピーターオルソン

7
しかし、JavaScript実装が関数をa上記で記述した方法とまったく同じ方法で文字列化する場合、これは教訓的です。ただし、このコードの出力は、JavaScriptの実装の手がかりになる可能性があります。
イルマリカロネン

1
これは同じクインで、1バイト短くなっています!function a(){alert("!"+a+"()")}()
イスマエルミゲル

1
(a=()=>alert(($ {a})))()
デニスC

19

GolfScript、8バイト

私はいつも、最も短い(本当の)GolfScriptクインは9バイトだと思っていました。

{'.~'}.~

GolfScriptはデフォルトで末尾の改行を出力するため、末尾の改行が必要な場所。

しかし、私はちょうど8バイトのクインを見つけました。

":n`":n`

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

そのため、GolfScriptは末尾の改行を出力しませんnが、プログラムの最後にコンテンツを出力します。nそもそも改行が含まれているだけです。したがって、アイデアはそれをstring ":n`"で置き換え、それを文字列化して、スタック上のコピーを引用符で印刷し、コピーをn印刷せずに保存することです。

Thomas Kwaが指摘したように、7バイトのCJamクインは8バイトのソリューションにも適応できます。

".p"
.p

繰り返しますが、末尾の改行が必要です。


6
Golfscriptは奇妙です。
電卓

19

ラビリンス124 110 53バイト

9バイトのゴルフをしてくれたSp3000に感謝します。

44660535853919556129637653276602333!
1
:_98
/8 %
@9_.

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

説明

ラビリンス101:

  • Labyrinthは、スタックベースの2D言語です。スタックは底なしでゼロで埋められているため、空のスタックからポップしてもエラーにはなりません。
  • 実行は最初の有効な文字(ここでは左上)から始まります。命令ポインター(IP)が取ることができる2つ以上のパスがある各ジャンクションで、スタックの最上部がチェックされ、次に進むべき場所が決定されます。負は左に、ゼロは前進、正は右に曲がります。
  • ソースコードの数字は、対応する数字をプッシュしません。代わりに、スタックの一番上をポップしてプッシュしn*10 + <digit>ます。これにより、多数を簡単に構築できます。新しい番号を開始するには_、ゼロをプッシュするを使用します。
  • " ノーオペレーションです。

最初に、少し長めですが、少し魔法的ではない、少しシンプルなバージョンについて説明します。

395852936437949826992796242020587432!
"
:_96
/6 %
@9_.

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

主なアイデアは、大きなベースを使用して、ソースの本体を単一の数値にエンコードすることです。その後、ソースコードの残りを印刷するためにデコードされる前に、その番号自体を簡単に印刷して戻すことができます。デコードは単にを繰り返し適用することでdivmod base、を印刷し、ゼロにmodなるdivまで処理を続けます。

を避けること{}で、必要な最高の文字コードは_(95)であり、基数96で十分です(基数を低く保つことで、先頭の数字が短くなります)。エンコードしたいのはこれです:

!
"
:_96
/6 %
@9_.

これらの文字をコードポイントに変換し、結果を基数96の数値として処理します(最下位桁がに対応し!、最上位桁がになり.ます。これは数値を逆アセンブルするためです)。

234785020242697299628949734639258593

これで、コードはかなりクールなトリックから始まります(そう言う場合もあります)。これにより、エンコードを印刷し、ほとんどオーバーヘッドなしでデコード用に別のコピーを保持することができます。このCJamスクリプトで結果を計算したので、実際のコードに移りましょう。ここから始まります:

395852936437949826992796242020587432!
"

IPは左上隅から始まり、東に進みます。これらの数字の上で実行されますが、単にスタックの一番上にその数字を積み上げます。数字自体は完全に無意味です。なぜなら、それは私たちが望むものの逆だからです。IPがをヒットすると!、この番号がスタックからポップされ、印刷されます。出力でエンコードを再現するだけです。

しかし、今ではIPが行き詰まりました。つまり、向きを変えて、西に戻ります(!再度実行することはありません)。今スタックの最上位の数字は、そのように、この時間は、好都合に、IPは、後方から前方に番号を読み出すないソースの残りの部分をコードします。

IPが再び左上隅に当たると、IPは左折できるので行き止まりではありません。これ"は何もしません。ここでは、コードのメインループから番号を分離するために必要です。そういえば:

...
"
:_96
/6 %
@9_.

スタックの最上部がまだゼロでない限り、IPは次のループでこのかなり密なコードを実行します。

"
>>>v
^< v
 ^<<

または直線的にレイアウト:

:_96%._96/

これらの順番が必要な理由は、ラビリンスの制御フローのセマンティクスのためです。現在のセルに少なくとも3つのネイバーがある場合、IPは負のスタック値で左に進み、ゼロで進み、正のスタック値で右になります。壁があるために選択した方向が不可能な場合、IPは代わりに反対方向を取ります(これは、スタックの上部が負になることはありませんが、コードに2つの左折がある理由です)。

ループコード自体は、実際には非常に単純です(これを厳密に圧縮することはそうではなく、Sp3000の主な貢献があります)。

:    # Duplicate the remaining encoding number N.
_96  # Push 96, the base.
%.   # Take modulo and print as a character.
_96  # Push 96 again.
/    # Divide N by 96 to move to the next digit.

一度Nゼロ、制御フローの変更に当たります。これで、IPは/(西側の)後を直進したいと思いますが、そこには壁があります。そのため、代わりに(東)向きを変えると、6再度実行します。これにより、スタックのトップが正になり、IPが右(南)に変わり、を実行し9ます。スタックの一番上はになりましたが69、気になるのはポジティブだということだけです。IPはさらに右折(西)し、@そこに移動してコードを終了します。

全体として、実際には非常に簡単です。

さて、この追加バイトをどのように削るのでしょうか。明らかに、no-opは無駄に思えますが、追加の行が必要です。ループが番号に隣接している場合、IPは番号全体を走査するのではなく、すぐにそこに移動します。そのため、このノーオペレーションで何か有用なことができます。

原則として、これを使用してエンコードに最後の数字を追加できます。エンコードは、本当に...最初の行のすべてである必要はありません!だけでどんなことが保証され、またそこに印刷されます。

ただし、問題があります。これを行うことはできません。

95852936437949826992796242020587432!
3
:_96
/6 %
@9_.

問題は、今私たちが変わってきたということである"3も我々が持っていると思います実際の数を変更します、。そして、その数がで終わらないことを十分に確認してください3。番号は、最初から始まるコードによって完全に決定されるため、それ!についてはあまりできません。

しかし、別の数字を選択できますか?3ソースを正しくエンコードする数値が得られる限り、その場所にあるかどうかはあまり気にしません。さて、残念ながら、10桁のどれも、選択したものと一致する最下位桁のエンコードを生成しません。幸いなことに、残りのコードには多少の余裕があり、バイト数を増やすことなく、さらにいくつかのエンコーディングを試すことができます。私は3つのオプションを見つけました:

  1. 我々は変更することができます@/。その場合、任意の数字を使用1357して、一致するエンコードを取得できます。ただし、これは、プログラムがエラーで終了することを意味します。これは許可されていますが、あまりきれいではないようです。
  2. 「壁」の文字はスペースだけではありません。すべての未使用文字は、特にすべての文字です。大文字を使用する場合、それに対応するためにベースを増やす必要さえありません(これらのコードポイントはの下にあるため_)。26の選択肢により、多くの可能性が与えられます。たとえば、A任意の奇数桁が機能します。これは少し優れていますが、実際のコードで文字を使用することは決してないので、まだそれほどエレガントではないようです。
  3. より大きなベースを使用できます。基数を大幅に増加させない限り、エンコードの10進数の桁数は同じままです(具体的には、104までの任意の基数は問題ありませんが、99を超える基数は実際にはコード自体に追加の文字が必要です)。幸いなことに、ベース98は単一のマッチングソリューションを提供11ます。数字を使用すると、エンコードもで終わります。これは、ベース96、97、98、99の中で唯一のソリューションであるため、これは実際非常に幸運です。そして、それがこの答えの一番上のコードになります。

19

失われた293の 262 249バイト

>:2+52*:6*:(84*+75*):>:::::[[[[[[[:[(52*)>::::[[[[[[:[84*+@>%?!<((((((((((([[[[[[[[[[[[[[ "
\#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\

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

説明

このプロジェクト全体が上下しました。私はそれが不可能だと考え続け、それからうまくいくかもしれないクレイジーなアイデアを思いつきました。

ロストクインはなぜそんなに難しいのですか?

ご存知かもしれませんが、Lostは開始位置と方向が完全にランダムな2Dプログラミング言語です。これにより、放射線耐性のあるコードを書くのと同じくらい困難な、失われたプログラムを書くことができます。考えられるすべての場所と方向を考慮する必要があります。

それは、物事を行うためのいくつかの標準的な方法があると言われています。たとえば、文字列を印刷する標準的な方法は次のとおりです。

>%?"Stringv"(@
^<<<<<<<<<<<<<

これは、ほとんどのIPを取得して開始場所にプルするコレクションストリームを下部に持っています。開始位置に到達したら(左上)、スタック上のすべての値を削除するループでそれらをサニタイズし、ストリングをプッシュして終了する安全性を有効にします。(安全性は、すべてのプログラムが%終了する前にヒットする必要があるLostに固有の概念です。これにより、プログラムが開始時に終了する可能性がなくなります)。今、私の考えは、このフォームを本格的な馬に拡張することです。

最初に行わなければならないことは、ループを少し作り直すことでした。既存のループは文字列形式に固有のものでした。

>%?!<"Stringv"(@
^<<<<<<<<<<<<<<<
^<<<<<<<<<<<<<<<

ストリームを!飛び越えてループを作成する可能性を避けるために、2番目のストリームを追加する必要があります。

次に、これを標準のQuine形式と混合します。LostはKleinに非常に基づいているので、基本的にMartin EnderのためにKlien Quineを借りました。

:2+@>%?!< "
<<<<^<<<<<<
<<<<^<<<<<<

これは非常に便利で、クインの最初の行を印刷します。あとは、ストリームをハードコーディングするだけです。まあ、これは言うよりも簡単です。これを行うには、約4つの異なる方法を試しました。私はちょうど働いたものを説明します。

ここでのアイデアは、ドアを使用して必要な数の矢印を取得することです。ドアは、ヒットするたびに変わる特別なタイプのミラーです。 [左と]右から来るipsを反映します。これらのいずれかの側からIPがヒットすると、スイッチの向きが変わります。これらのドアのラインと静的リフレクターを作成して、繰り返し操作を実行できます。

>:[[[

:3回実行されます。このようにし<て、事前にスタックにプッシュすると、より少ないバイトで多くのスタックを作成できます。これらの2つを各行に1つずつ作成し、その間に改行を配置しますが、2番目の行!は追加した行をカバーするまで行くだけでよく、他のものは空のままにして数バイト節約できます。では、ストリームに垂直矢印を追加する必要があります。ここでキーの最適化が行われます。すべてのipsをプログラムの「開始」に直接リダイレクトする代わりに、代わりに左端にリダイレクトします。必須の動作します(または、少なくとも最終バージョンで動作します)、他のIPをリダイレクトすることもできます。これにより、バイト数が少なくなるだけでなく、この最適化が馬を可能にするものだと思います。

ただし、まだいくつかの問題があります。最も重要なの>は、プッシュされた後、コピーの作成を開始する前に開始されるips です。このようなipはコピー機に入り、0のコピーを作成します。これは、スタッククリアメカニズムがゼロを使用してスタックの最下部を決定し、最下部にゼロの全体を残しているためです。より強力なスタック衛生方法を追加する必要があります。スタックが空かどうかを判断する実際の方法はないため、スタック上のできるだけ多くのアイテムを破棄するように試みる必要があります。ここでは、前述のドア方法を再度使用します。((((((((((([[[[[[[[[[[[[[サニタイザーの直後の最初の行の最後に追加して、ゼロを取り除きます。

ここでもう1つ問題があります。ストリームを左上ipsにリダイレクトし始めたので%、下に移動すると既に安全性がオフになり、途中で終了します。したがって、安全性をオフにする必要があります。これを行う#には、ストリームにa を追加します。これにより、ストリームを流れるIPはオフになりますが、すでにサニタイズされたIPはオフになりません。また#、最初の行にもハードコードする必要があります。

それだけです。うまくいけば、これが今どのように機能するかを理解できます。


:/非常に多くのタイプミスと行方不明のリンク
ASCIIのみの

17

うん1165 879 606 561 540 522 498 + 7 = 505のバイト

-cheatエイリアスの定義を許可するフラグが必要です。

022222120211111102222122021121202222212021112202222110222212202112110222221202122212022222102222212021222120222221022222102222210222221202222110222211022222210222221022222210222212202222221022221102211110222221022221220222212202112120221111022212202211210222212022222102211120222122022111202222120212212021221202222221022111102221210222122022222102222120212212022221102211110222122022221102222120212212022112120221111022212202112120222212=%;0e-=<;0<-=>;:0~--=1;1>=2;0%{{>0<~{~>~<<}>>>]}>]}${<#}%{@}

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

説明

これには2つの部分があります(ほとんどのクインと同様)。データ:

022222120211111102222122021121202222212021112202222110222212202112110222221202122212022222102222212021222120222221022222102222210222221202222110222211022222210222221022222210222212202222221022221102211110222221022221220222212202112120221111022212202211210222212022222102211120222122022111202222120212212021221202222221022111102221210222122022222102222120212212022221102211110222122022221102222120212212022112120221111022212202112120222212

そしてデコーダー:

=%;0e-=<;0<-=>;:0~--=1;1>=2;0%{{>0<~{~>~<<}>>>]}>]}${<#}%{@}

データは、単にデコーダーのバイナリエンコード(またはその逆)です。それぞれ0が新しい文字を開始し、1sと2sはそれぞれ0-と- 1ビットです。

それは注意0しながら、ゼロを押す標準うんコマンドである12、この時点で定義されていません。ただし、実際に使用されるまでand が未定義のままに%なるように、データ部分全体をコマンドに割り当てます。12%

次に、さらにいくつかのコマンドを定義します。

0e-=<;
0<-=>;
:0~--=1;
1>=2;

<スタックの最上部をデクリメントし、>インクリメントします。1(やや直感的ではないが)スタックのトップを2倍にする。2それを倍にしてから増分します。これらの定義のおかげで、0221111実際にはスタック上に48(バイナリでは110000)が残ります。

残りの32バイトは、実際のデコードを2つの部分に分けて行います。まず、データ文字列を再構築する必要があります。

0%                ` Push a zero and then the data.
{                 ` For each value...
  {               `   Until that value is zero...
    >0<~{~>~<<}>  `   divmod 2. The div is the input to the next iteration,
                  `   the mod gives us the next bit.
    >>]           `   Increment twice (gives 2 or 3) and put at the bottom
                  `   of the stack.
  }
  >]              ` Increment the 0 and put it at the bottom as well.
}
$                 ` Reverse the entire stack.
{<#}              ` Decrement and print each number.

最後に、データを再度プッシュし、各値を文字として出力します。

%{@}

将来の参照用に、データをエンコードするCJamスクリプトを次に示します。


17

Fueue、423バイト

Fueueは、実行中のプログラムキューであるキューベースのエゾランです。

)$$4255%%1(~):[)$$24%%0:<[~:)~)]~[$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]](H-):~:[)[):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):]~:](106328966328112328136317639696111819119696281563139628116326221310190661962811611211962861109696289611619628116111612896281115421063633063961111116163963011632811111819159628151213262722151522061361613096119619190661966311961128966130281807072220060611612811961019070723232022060611

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

使い方

この説明手に負えないかもしれません。その一方で、私は人々が従うことを望んでいる方法でそれをはるかに短く説明する方法を知りません。

Fueueチートシート

参照してくださいesolangウィキの記事、このプログラムで使用されていないいくつかの機能を含む詳細については、。

  • 初期プログラムはキューの初期状態であり、次の要素を含めることができます。

    • 整数リテラル(ソースでは負でないものだけが計算できます)、それらを実行すると文字が出力されます。
    • 不活性な角括弧で区切られたネストされたブロック(何らかの機能が作用しない限り、そのまま保存されます)。
    • 関数の引数は、キュー内ですぐに続く要素です。
      • +*/-%:整数演算(-単項%論理否定です)。数引数が与えられない場合は不活性化する。
      • ()<:要素を角かっこに入れ、角かっこをブロックから削除し、最後の要素をブロックに追加します。後者の2つは、ブロックが後に続かない限り不活性です。
      • ~::スワップ、複製。
      • $:コピー(数字+要素を取ります)。数字以外の前に不活性。
      • H:プログラムを停止します。

    []ネストしている間は、()しないでください-後者は単に別個の関数です。

実行トレース構文

Fueueでは、数字の間を除き、空白はオプションです。次の実行トレースでは、特にプログラム構造の提案に使用されます。

  • 関数を実行すると、その関数とその引数はスペースで囲まれた要素から引き離されます。引数の一部が複雑な場合、それらの間にもスペースが存在する場合があります。
  • 多くの実行トレースは、左側で「遅延blob」に分割され、実質的なデータ操作を行う右側の部分から分離されています。次のセクションを参照してください。

中括弧{}(Fueueでは使用されません)は、トレースで数式の整数結果を表すために使用されます。Fueueには負でないリテラルのみがあるため、これには負の数が含まれます。これは-否定関数です。

さまざまなメタ変数名と...値と略語を示すために使用されます。

戦術を遅らせる

直感的に、実行はキューを巡回し、通過するものを部分的に変更します。関数の結果は、次のサイクルまで再度作用することはできません。プログラムのさまざまな部分が相互作用しない限り、効果的に並行して進化します。

その結果、多くのコードは同期、特にプログラムの一部の実行を適切なタイミングまで遅らせることに専念しています。これをゴルフするための多くのオプションがあり、それらは実行サイクルをサイクルごとにトレースすることによってのみ理解できる読めないブロブにそれらの部分を変える傾向があります。

これらの戦術は、以下で常に個別に言及されるとは限りません。

  • )[A]Aサイクルの遅延。(おそらく最も簡単で読みやすい方法です。)
  • ~ef要素eを交換しますf。これにより、要素の実行も遅延します。(おそらく最も読みにくいが、多くの場合、わずかな遅延で最も短い。)
  • $1e単一の要素を遅延させますe
  • -そして、%(後者の数字を遅延させるために有用である01)。
  • 行内の複数の等しい要素を遅延させる場合、:または$単一の要素からそれらを作成するために使用できます。
  • (nn括弧で囲みます。これは、後で都合の良いときに削除できます。これは、数値を最初にブロックに入れずにコピーすることすらできないため、数値計算では特に重要です。

全体の構造

説明の残りの部分は、実行中のプログラムのセクションごとに7つの部分に分かれています。それらの大部分が繰り返されるより大きなサイクルは、「反復」と呼ばれ、キュー全体を通る単一パスの「サイクル」と区別されます。

初期プログラムがそれらの間でどのように分割されるかを以下に示します。

A:  )$$4255%%1(~
B:  ):[)$$24%%0:<[~:)~)]~[$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]]
C:  
D:  (H-
E:  
F:  
G:  ):~:[)[):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):]~:](106328966328112328136317639696111819119696281563139628116326221310190661962811611211962861109696289611619628116111612896281115421063633063961111116163963011632811111819159628151213262722151522061361613096119619190661966311961128966130281807072220060611612811961019070723232022060611

プログラムの最後にある大きな数字は、各ASCII値から30を引いて、文字ごとに2桁で残りを逆に10エンコードします(たとえば、(ます)。

より高いレベルでは、このプログラム(bignumで始まる)のデータは右から左に流れるが、制御は左から右に流れると考えることができます。ただし、低レベルでは、Fueueは常にコードとデータの区別を混乱させます。

  • セクションGは、bignumをASCII数字(0整数としての数字など)にデコードし、48最下位の数字を最初に分割します。15サイクルごとに1桁を生成します。
  • セクションFには、セクションEが消費できるまで、生成された数字ASCII値(それぞれブロック内)が含まれます。
  • セクションEは、生成された数字を一度に2つずつ処理し、フォームのブロックにペアにします [x[y]]、各ペアのエンコードされた文字を出力します。
  • セクションDは、[x[y]]ブロックから徐々に構築された深くネストされたブロックで構成され、いったんすべての数字が含まれると、すべての数字を印刷してからプログラム全体を停止するように実行できます。
  • セクションCはセクションDの構築を処理し、セクションEを再作成します。
  • セクションBは、30サイクルごとにセクションCとそれ自体を再作成します。
  • セクションAは、他のセクションの最後の反復までのサイクルをカウントダウンします。次に、セクションBを中断し、セクションDを実行します。

セクションA

セクションAは、プログラムの終了のスケジューリングを処理します。単一のスワップ関数に削減するには4258サイクルかかります~。これにより、メインループを停止し、代わりにセクションDの実行を開始するセクションBを調整します。

)$ $4255% %1 (~
)$%%%...%% %0 [~]
)$%%%...% %1 [~]
⋮
)$ %0 [~]
) $1[~]
)[~]
~
  • $関数は、次の4255のコピーを作成%しながら、(ラップ~ブラケットです。
  • %次の数値を0との間で切り替えるために、最後のサイクルが使用されます1
  • すべて%のが使い果たされる$1と、[~](実質的にNOP)のコピーが1つ作成され、次のサイクルで)ブラケットが削除されます。

セクションB

セクションBは、30サイクルごとにセクションCの新しい反復だけでなく、それ自体の再生成も処理します。

) : [)$$24%%0:<[~:)~)]~[$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]]
) [)$$24%%0:<[~:)~)]~[$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]]            [BkB]
)$ $24%     %0  :<  [~:)~)]    ~ [$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<] [BkB]
)$ %...%%% %1   < < [~:)~)] [BkB]   [$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]
)$ %...%% %0      < [~:)~)[BkB]] [$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]
)$ %...% %1         [~:)~)[BkB][$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]]
⋮
) $1 [~:)~)[BkB][$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]]
) [~:)~)[BkB][$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]]                    (1)
~:) ~)[BkB]                 [$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]
) : [BkB]                 ) [$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]      (2)
) [BkB] [BkB]               $11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<
  • A :は次の大きなブロックを複製します(1つのコピーはとして省略されます[BkB])最初のコピーからブラケットを除去します。
  • $$24%%0 セクションAと同様のカウントダウンを設定します。
  • これはカウントダウンし、に:<変わり<<~2つのブロックを交換して、新しいセクションCのコードを最後に配置します。
  • 2つの<関数は、最後の2つのブロックを最初のブロックにパックします。これは通常の反復では冗長ですが、~fromセクションAが最後にジョブを実行できるようにします。
  • (1)カウントダウンが終了)すると、外側のブラケットが削除されます。次~:)になる):~)入れ替え)部Cのコードの先頭に。
  • (2)セクションBは初期サイクルに戻りました)が、a はブラケットを削除してセクションCの新しい反復の実行を開始しようとしています。

最後の反復では~、上のセクション(1)にfromセクションAが表示されます。

~ ) [~:)~)[BkB][$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]]                  (1)
[~:)~)[BkB][$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]]              )

~スワップ)から区間Bを防止ブロックを横切って、セクションCには、再度実行されます。

セクションC

セクションCは、新しい数字のペアをセクションDのブロックにマージし、セクションEの新しい反復を作成します。

以下は、数字のASCIIコードを使用xしたy代表的な反復を示しています。非常に最初の反復では、入ってくる「D」および「E」の要素が最初である[H]-以前のセクションEは任意の数字の文字ペアを生成するために実行していないように、代わりに。

C                                               D             E
$11~ )  ~<[[+$4--498+*-:~-10)):])<~]  [)))~]  < [)))~[...]]   [x[y]]
~~~ ~~~ ~~~ ~~) [[+$4--498+*-:~-10)):])<~]  < [)))~] [)))~[...][x[y]]]
~~~ ~~~     )  ~ [[+$4--498+*-:~-10)):])<~] [)))~[)))~[...][x[y]]]]
~~~       ~ )   [)))~[....]]                                  [[+$4--498+*-:~-10)):])<~]
                                              ~~[)))~[....]] )[[+$4--498+*-:~-10)):])<~]
                                                [)))~[....]]  ~[+$4--498+*-:~-10)):])<~
  • これは、この答えのために発見した別の同期方法を使用しています。~行に複数のスワップ関数がある場合、行は各サイクルで約2/3に縮小します(1 ~つが2 つをスワップするため)が、時々、残りの~sが破壊を引き起こすため、後続のもの慎重に操作します。
  • $11~そのような行を生成します。次は、次のブロックで~a <を交換します。<最後の別のセクションは、新しい数字ペアブロック(ASCIIコードとしての数字xとy)をセクションDブロックに追加します。
  • 次のサイクルでは、~行に~~残りがあり~、次を上書きします)。もう1つ<は、セクションDを[)))~]ブロックに追加します。
  • 次に、スワップ~自体は、セクションDブロック全体で、次のブロックを新しいセクションEコードとスワップします。次に、新しい残り物が~a )をスワップし、最後~~~行の最後の1つが)ブラケットを削除したようにセクションEにスワップします。

最後の反復では、セクションA ~)セクションBを横切ってセクションCに入れ替わりました。ただし、セクションCは非常に短命であるため、すでに消えており)、セクションDの先頭で終わります。

セクションD

セクションDは、最後の大きな数字の印刷とプログラムの停止を処理します。プログラムの実行のほとんどで、セクションB〜Gが構築時に協力するのは不活性ブロックです。

    (H -
    [H]-
    ⋮
    [)))~[H-]]                  After one iteration of section C
    ⋮
    [)))~[)))~[H-][49[49]]]]    Second iteration, after E has also run
    ⋮
)   [)))~[...]]     [49[48]]    Final printing starts as ) is swapped in
    ))) ~[...][49[48]]
    )) )[49[48]] [...]
    )) 49 [48][...]             Print first 1
    ) )[48] [...]
    ) 48 [...]                  Print 0
    )[...]                      Recurse to inner block
    ...
    ⋮
    )[H-]                       Innermost block reached
    H -                         Program halts
  • プログラムの最初のサイクルでは(、停止関数Hを括弧で囲みます。A-は、数字のペアの代わりに、最初の反復のダミー要素として使用されます。
  • 組み込まれる最初の実際の数字のペアは[49[49]]11数字の最後に対応します。
  • 非常に最後の桁対[49[48]](に対応する10数字の開始時)は、実際にブロックに組み込まれていないが、これは、違いはありません)[A[B]])[A][B]の両方に旋回、等価ですA[B]

最後の反復の後、)セクションBから右にスワップされたセクションが到着し、セクションDのブロックがブロック解除されます。)))~各サブブロックの先頭には、すべての部品が正しい順序で実行されていることを確認します。最後に、最も内側のブロックにHはプログラムの停止が含まれています。

セクションE

セクションEは、セクションGによって生成されたASCII数字のペアの結合を処理し、両方が対応するエンコードされた文字を出力し、結合されたペアのブロックをセクションCおよびDに左方向に送信します。

繰り返しますが、以下は、数字のASCIIコードを使用xしたy代表的な反復を示しています。

E                                                   F
~ [+$4--498+*-:~-10)):] )              <  ~         [y] [x]
) [+$4--498+*-:~-10)):]                   < [x] [y]
+ $4-  - 498  +*- :~ -10 ) )              : [x[y]]
+---  -{-498} +*- ~~{-10} )       ) [x[y]]  [x[y]]
+--    - 498  +*   -{-10}       ~ ) x  [y]  [x[y]]
+-    -{-498} +               * 10 x  )[y]  [x[y]]
+      - 498                    + {10*x} y  [x[y]]
                         + {-498} {10*x+y}  [x[y]]
{10*x+y-498}  [x[y]]
[x[y]]
  • 着信数字ブロックが交換され、次にyブロックがxブロックに追加され、ペアブロック全体がコピーされます。セクションCおよびDの最後まで1つのコピーが残されます。
  • もう一方のコピーは再びブロック解除され、一連の算術関数が計算され10*x+y-498、エンコードされた文字のASCII値が計算されます。498 = 10*48+48-3048SはASCII符号化を元に戻すxy、一方30のシフト符号化00–9930–129すべての印刷可能なASCII文字を含みます。
  • 結果の数値は実行するために残され、その文字が出力されます。

セクションF

セクションFは、ASCIIコードの数字を含む不活性ブロックで構成されています。セクションEは、Gが生成するのと同じ速度でそれらを消費するため、実行されるプログラムのほとんどについて、ここでは最大で2つです。ただし、最終印刷フェーズでは、いくつかの冗長な0数字がここで収集されます。

[y] [x] ...

セクションG

セクションGは、プログラムの最後に大きな数字を分割し、最下位の数字を最初に分割し、ASCIIコードのブロックを他のセクションに左方向に送信します。

停止チェックがない0ため、セクションDがH関数を使用してプログラム全体を停止するまで、数字が0になったときに実際に数字を生成し続けます。

[BkG] 大きい開始コードブロックのコピーを省略します。これは、新しい反復を開始するための自己複製に使用されます。

最初のサイクルでの初期化:

) :~  : [)[):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):]~:]  ( 106328966328112328136317639696111819119696281563139628116326221310190661962811611211962861109696289611619628116111612896281115421063633063961111116163963011632811111819159628151213262722151522061361613096119619190661966311961128966130281807072220060611612811961019070723232022060611
)  ~ ~ [)[):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):]~:]  [BkG] [10...11]
) [)[):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):]~:]     ~ [BkG] [10...11]
) [):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):]       ~ : [10...11]  [BkG]

典型的な反復Nは、分割する数を示します。

) [):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):]        ~ : [N]  [BkG]
) :~ [)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+ :5 )         : [N]  : [BkG]
)  ~ ~ [)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]  +5 5     ) [N]  [N] [BkG] [BkG]
) [)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]               ~ 10 N  [N] [BkG] [BkG]
) ~:~  ~ ( [:~)*[):~[$1(+48]):~+]-:~~)10)~~]               / N 10  [N] [BkG] [BkG]
)  ~ : [:~)*[):~[$1(+48]):~+]-:~~)10)~~]                 ( {N/10}  [N] [BkG] [BkG]
) [:~)*[):~[$1(+48]):~+]-:~~)10)~~]                    : [{N/10}]  [N] [BkG] [BkG]
:~ )*[):~[$1(+48]):~+]- :~ ~)10 )           ~ ~ [{N/10}]  [{N/10}] [N] [BkG] [BkG]
~~) *[):~[$1(+48]):~+]- ~~10 )             ) [{N/10}]  ~ [{N/10}] [N]  [BkG] [BkG]
)  ~ * [):~[$1(+48]):~+]  -10            ~ ) {N/10}  [N] [{N/10}] [BkG] [BkG]
) [):~[$1(+48]):~+]               * {-10} {N/10}  ) [N]  [{N/10}] [BkG] [BkG]
) :~ [$1(+48]) :~                 + {-10*(N/10)} N  [{N/10}] [BkG] [BkG]
)  ~ ~ [$1(+48]  )                 ~ ~ {N%10}  [{N/10}] [BkG] [BkG]
) [$1(+48]                 ~ ) {N%10}  ~ [{N/10}] [BkG]  [BkG]
$1(                     + 48 {N%10}    ) [BkG]  [{N/10}] [BkG]
                        ( {48+N%10}   BkG [{N/10}] [BkG]            New iteration starts
                        [{48+N%10}]   ....
  • ここでの遅延blobは特に毛深いです。ただし、唯一の新しい遅延トリックは、2サイクルを遅延させる+:5代わりに使用することです。悲しいかな、プログラムのsの1つだけがこれに助けられました。--101010
  • [N]そして[BkG]ブロックは、その後の一つのコピーが、重複しているNことにより、分割され10
  • [{N/10}]が複製されると、さらに算術関数を使用してNasの最後の桁のASCIIコードを計算し48+((-10)*(N/10)+N)ます。このASCIIコードのブロックはセクションFに残されます。
  • [{N/10}]のもう1つのコピーは[BkG]ブロック間で交換され、新しい反復の開始を設定します。

ボーナスクイン(540バイト)

)$$3371%%1[~!~~!)!]):[)$$20%%0[):]~)~~[)$$12%%0[<$$7%~~0):~[+----48+*-~~10))]<]<~!:~)~~[40~[:~))~:~[)~(~~/[+--48):]~10]+30])):]]][)[H]](11(06(06(21(21(25(19(07(07(19(61(96(03(96(96(03(11(03(63(11(28(61(11(06(06(20(18(07(07(18(61(11(28(63(96(11(96(96(61(11(06(06(19(20(07(07(18(61(30(06(06(25(07(96(96(18(11(28(96(61(13(15(15(15(15(22(26(13(12(15(96(96(19(18(11(11(63(30(63(30(96(03(28(96(11(96(96(61(22(18(96(61(28(96(11(11(96(28(96(61(11(96(10(96(96(17(61(13(15(15(22(26(11(28(63(96(19(18(63(13(21(18(63(11(11(28(63(63(63(61(11(61(42(63(63

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

どの方法が最も短いかわからなかったため、最初に文字を(sで区切られた2桁の数字としてエンコードしようとしました。コアコードは少し短くなりますが、50%大きいデータ表現がそれを補います。他のゴルフほどゴルフはしていませんでした。1つの利点があります:bignumをサポートする実装は必要ありません。

その全体的な構造は、メインの構造といくらか似ています。データ表現がセクションFを直接埋めるため、セクションGがありません。ただし、セクションEは同様のdivmod計算を実行して、2桁の数字の桁を再構築する必要があります。


1
説明XD
VFDan

1
)$n[)](遅延カウンタのバイトが短くなります。
jimmy23013

15

ゼリー、3バイト

”ṘṘ

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

検証

$ echo $LANG
en_US
$ xxd -g 1 quine.jelly
0000000: ff cc cc                                         ...
$ ./jelly f quine.jelly | xxd -g 1
0000000: ff cc cc                                         ...

使い方

”ṘṘ    Main link. No input.

”Ṙ     Set the return value to the character 'Ṙ'.
  Ṙ    Print a string representation of the return value.
       This prints: ”Ṙ
       (implicit) Print the return value.
       This prints: Ṙ

これはどのバージョンのインタープリターを使用しますか?テストすると、入力がJellyのコードページにある場合でも、UTF-8で出力されます(エンコードの変更により、それは非類似になります)。

1
出力のエンコーディングは、端末の設定に依存します。UTF-xに設定されている場合、それを使用します。それ以外に設定されている場合、Jellyのコードページを使用します。Linuxでは、LANG=en_USまさにそれを実現します。tio.run/nexus/bash#@@/...
デニス・
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.