オートサイクラークイン


11

馬を作るが、ひねりを加えた。

ステートメント

馬はそのコードを印刷しますが、最初の文字を最後に置きます。
(逆に行うこともできますが、そのメモを回答に含めてください)
出力はソリューションでもあるプログラムでなければなりません。

例:コードがであったと仮定するとfoobar、実行すると、oobarf別の有効なプログラムが返されます。

foobar -> oobarf
oobarf -> obarfo
obarfo -> barfoo
barfoo -> arfoob
arfoob -> rfooba
rfooba -> foobar

ルール

  • あなたのコード、明らかに盗まれている誰かのコードのある世代の出力であってなりません
  • コードは2文字を超える必要があります(短いコードは面白くないです)
  • コードには少なくとも2つの異なる文字が含まれている必要があります(例:+++無効)

得点

最短コードの勝利に挑戦。



3
@DomHastingsそれを投稿するのに何ヶ月もありました。
mbomb007

2
@ IQuick143 2文字以上は、あなたが述べた理由のための良い要件だと思います
-dylnan

5
、この「回転QUINE」などの数は?; p
ケビンクルーイッセン

3
@ mbomb007これが可能であることは挑戦の一部であること言語を見つける
IQuick 143

回答:


19

Befunge-98(PyFunge)、2600バイト

ab*1'3:*2+*0pnd3*:::::::::::::::1'3:*3+*0p1'3:*5+*0p1'3:*d+*0p1'3:*f+*0p1'3:*fa++*0p1'3:*fd++*0p1'4'3*f-*0p1'4'3*7-*0p1'4'3*5-*0p6:*:*4-1p6:*:*4+1p6:*:*8+1p6:*:*a+1p6:*:*8+2p6:*:*f1++2p6:*:*f3++2pn75*1-:1'3:*4+*0p6:*:*f2++2pnaa*:::::::::::::::::1'3:*6+*0p1'3:*7+*0p1'3:*f1++*0p1'3:*f2++*0p1'3:*fe++*0p1'3:*ff++*0p1'4'3*e-*0p1'4'3*d-*0p1'4'3*4-*0p1'4'3*3-*0p6:*:*3-1p6:*:*2-1p6:*:*b+1p6:*:*c+1p6:*:*9+2p6:*:*a+2p6:*:*f4++2p6:*:*f5++2pn67*::::::::::1'3:*8+*0p1'3:*a+*0p1'3:*f4++*0p1'3:*f5++*0p1'4'3*f-5-*0p1'4'3*c-*0p1'4'3*2-*0p6:*:*1-1p6:*:*d+1p6:*:*b+2p6:*:*f6++2pna5*::1'3:*9+*0p1'3:*f3++*0p6:*:*1pn68*:::::1'3:*b+*0p1'3:*f8++*0p1'4'3*f-2-*0p1'4'3*9-*0p1'4'3*1+*0p6:*:*f7++2pne8*:::::::1'3:*c+*0p1'3:*f9++*0p1'4'3*f-1-*0p1'4'3*8-*0p1'4'3*2+*0p6:*:*f2++1p6:*:*f+2p6:*:*f8++2pnf4*:1'3:*e+*0p1'4'3*3+*2pn77*::::1'3:*f6++*0p1'4'3*f-4-*0p6:*:*f1++1p6:*:*c+2p6:*:*e+2pnb4*1-::1'3:*f7++*0p6:*:*f+1p6:*:*d+2pnf4*1-::1'3:*fb++*0p6:*:*7+2p1'3:*1+*2pnf4*2-1'3:*fc++*0pn95*:::1'4'3*f-3-*0p1'4'3*a-*0p1'4'3**0p6:*:*1+1pn87*1'4'3*b-*0pnac*2-:1'4'3*6-*0p1'4'3*3+*0pnf4*3-1'4'3*1-*0pn88*2-6:*:*5-1pnc9*1-6:*:*2+1pnb4*:6:*:*3+1p6:*:*6+1pn88*6:*:*9+1pnd4*1-6:*:*e+1pnc8*2-:1'3:**1p1'3:**2pnd7*2+6:*:*4+2pn75*6:*:*6+2pn>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ab*1'3:*2+*0pnd3*:::::::::::::::1'3:*3+*0p1'3:*5+*0p1'3:*d+*0p1'3:*f+*0p1'3:*fa++*0p1'3:*fd++*0p1'4'3*f-*0p1'4'3*7-*0p1'4'3*5-*0p6:*:*4-1p6:*:*4+1p6:*:*8+1p6:*:*a+1p6:*:*8+2p6:*:*f1++2p6:*:*f3++2pn75*1-:1'3:*4+*0p6:*:*f2++2pnaa*:::::::::::::::::1'3:*6+*0p1'3:*7+*0p1'3:*f1++*0p1'3:*f2++*0p1'3:*fe++*0p1'3:*ff++*0p1'4'3*e-*0p1'4'3*d-*0p1'4'3*4-*0p1'4'3*3-*0p6:*:*3-1p6:*:*2-1p6:*:*b+1p6:*:*c+1p6:*:*9+2p6:*:*a+2p6:*:*f4++2p6:*:*f5++2pn67*::::::::::1'3:*8+*0p1'3:*a+*0p1'3:*f4++*0p1'3:*f5++*0p1'4'3*f-5-*0p1'4'3*c-*0p1'4'3*2-*0p6:*:*1-1p6:*:*d+1p6:*:*b+2p6:*:*f6++2pna5*::1'3:*9+*0p1'3:*f3++*0p6:*:*1pn68*:::::1'3:*b+*0p1'3:*f8++*0p1'4'3*f-2-*0p1'4'3*9-*0p1'4'3*1+*0p6:*:*f7++2pne8*:::::::1'3:*c+*0p1'3:*f9++*0p1'4'3*f-1-*0p1'4'3*8-*0p1'4'3*2+*0p6:*:*f2++1p6:*:*f+2p6:*:*f8++2pnf4*:1'3:*e+*0p1'4'3*3+*2pn77*::::1'3:*f6++*0p1'4'3*f-4-*0p6:*:*f1++1p6:*:*c+2p6:*:*e+2pnb4*1-::1'3:*f7++*0p6:*:*f+1p6:*:*d+2pnf4*1-::1'3:*fb++*0p6:*:*7+2p1'3:*1+*2pnf4*2-1'3:*fc++*0pn95*:::1'4'3*f-3-*0p1'4'3*a-*0p1'4'3**0p6:*:*1+1pn87*1'4'3*b-*0pnac*2-:1'4'3*6-*0p1'4'3*3+*0pnf4*3-1'4'3*1-*0pn88*2-6:*:*5-1pnc9*1-6:*:*2+1pnb4*:6:*:*3+1p6:*:*6+1pn88*6:*:*9+1pnd4*1-6:*:*e+1pnc8*2-:1'3:**1p1'3:**2pnd7*2+6:*:*4+2pn75*6:*:*6+2pn>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

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

これはこれが地獄祭でした。

仕組み:
プログラムは、プログラムBをそれ自体の周りにアセンブルするputステートメントの束であり、2回シフトされたソースバイトの半分を出力します。
プログラムは実際には1300バイトのプログラムの2つのコピーであるため、1300バイトのプログラム全体が常に全体として実行されることが保証されます。

より良い説明:
すべてのBefunge-98 QUINEシンボル、このようなAが含まれている必要@q,
問題:それらのシンボルのどれもespecialy以来、良い開始点ではない@qすぐにプログラムを終了します。
解決策:ソースコードからこれらの文字を取り除きます

問題:どうやって?
解決策p(put)コマンドを使用してソースコードを変更し、1バイトシフトされたソースコードの内容を印刷する必要な文字を含め、不正なコマンドを使用しないようにしgます。

問題:(これらが終了するときにため息)
putコマンドはn x y、文字、x-coord、y-coordを決定する3つの値をポップしますが、これらの値の初期化が半分に分割されると、最初のソースコードに不良文字が書き込まれ、役に立たなくなりますクイニング用。
解決策:(最後の約束)
ソースコードのコピーを2 つ使用します。後者が「正しいもの」であるため、半分に分割されたputステートメント(pコマンド+定数初期化子)が誤って修正されます実行されません。これは、各ステートメントのコピーを2つ持つことで修正されます。これが機能するために最後に必要なことは、どのようにしてソースコード全体を半分にするかです。

回答
彼らが言う画像は1000語に相当します。 それから彼らはPietを作りました。

これは、文字列バイトの2つのコピーがシフトされた理由の視覚的な証拠です==バイトシフトされた文字列の2つのコピー。つまり、コードの半分を取得し、バイトシフトしてから2回印刷できます(または、コードの半分を取得し、バイトシフトして、印刷し、[実際に発生すること]を繰り返します)

これの実装方法:0123456789abcdefがソースであると仮定します

Befunge擬似コード:

0123456789abcv;;"123456789abcdef" < go this way <--
             >PS'0,   repeat 2x   ^

PSはPrint Stackを意味します(実際の命令ではありません)。ソースコードの半分を逆方向にスタックにプッシュしてからスタック""を印刷し、次に'最初0に移動した最初の文字をフェッチ(コマンド)し、'最後に印刷してバイトシフトを引き起こし、サイクルを繰り返します。もう一度、2番目のコピーを印刷します。対処する技術の1つは、ソース内のシンボルです。これは、ソースコードの実行中に記述すると問題を引き起こす可能性があります。これを回避するには、外部で処理するputステートメントを追加します。

これにより、コードは次のようになります。 コード

説明
緑のハイライト:ソースに文字を追加するコード
グレー文字(視界不良の可能性があります):緑のコードによって追加されるコード
赤のハイライト:ソースコードの後半の最初の文字を青の領域に移動するコード。
青のハイライト:赤のハイライトを参照
オレンジのハイライト:@黄色の領域に(終了)コマンドを入力して、2バイトシフトされたコピーを書き込んだ後に終了することを確認するコード。

矢印を使用すると、コードフローがどのように進むかが明確になるはずです。

ここで最後の難しい部分があり
ます。赤ちゃんのソースコードはどこから来たのでしょうか?

短い答え:C#Magic
長い答え:C#コードでコンパイルされた手作業で作成された100以上のBefungeコードスニペット。私は手動で約100個の定数初期化子(特定の数をスタックするプッシュコード)を手動で作成し、カスタムC#プログラムを使用してそれを1300バイトのBefunge出力にコンパイルし、それを2回コピーして最後に作成しましたプログラム。

あなたはまだここにいるの?読んでくれてありがとう!(または、少なくとも最後までスクロールする)
私の悪いジョークは楽しくて迷惑ではなかったと思います。

注:このコード内のputステートメントは、不正なgコマンドを作成しません。

編集:開発者ツールを使用してTIOで次のJavascriptコードを使用してコードを検証しました

setInterval(()=>{document.getElementById("code").value = 
document.getElementById("output").value; 
document.getElementById("run").click();}, 2000);

完全な説明を本当に楽しみにしていますが、これはかなりの成果のようであり、確かに報奨に値します!
ナサニエル

1
@ナサニエルあなたがそれを好き願って完全な説明があります!:D
IQuick 143

1
p誤った引数の処理に関する部分は天才です。
leo3065

@ leo3065ありがとう:)
IQuick 143

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