CJam、(58 56 54 48 46 x 2)* 48%= 44.16
{`"_~"+{_,94\m2/S*a_+\*
N/23f/Wf%N*}_`'"#)!*}_~
印刷する
{`"_~"+{_,94\m2/S*a_+\*
N/23f/Wf%N*}_`'"#)!*}_~
各行のスペース以外の文字は、2つの相互のクイン間で同じままです。
しかし今、本当に甘い部分:
{`"_~"+{_,94\m2/S*a_+\*{`"_~"+{_,94\m2/S*a_+\*
N/23f/Wf%N*}_`'"#)!*}_~N/23f/Wf%N*}_`'"#)!*}_~
馬です!:)
ここでテストしてください。
使い方
一般的にCJamでのquiningの基本を説明しているので、最初に他の投稿の説明を読むことをお勧めします。
これは少し複雑です。相互クインの場合、他の場合と同様に、各行の前後にスペースを追加し、0を2に交換してブロックの文字列表現を変更し、結果のプログラムがスペースを反対側に配置するようにします。
スペースは相互のクインにまったく影響しないことに注意してください。1つ目はブロック内にあり、実際には使用されていません。2つ目は、コード全体を囲んでいます。
両方を組み合わせるときに通常のクインを取得するには、そのような変更をすべて行わないようにする方法を見つける必要があります。空白とコードの構造は、両方を組み合わせることで、1つのクイン全体をもう1つのクインに挿入することを意味することに注意してください。したがって、変更コード全体をブロックに入れると、実際の内容に応じてそのブロックを実行できます。
だから今、私はこのブロックを持っています...相互のクインのために、実際に実行したいコードだけが含まれています。結合されたクインの場合、それはまたクイン全体をランダムな位置に含みますが、これは意味がありません...しかし、それはブロックなので、自動的に実行されません。そのため、そのブロックの内容に基づいて文字列を変更するかどうかを判断できます。それ_`'"#)!
が目的です。ブロックを複製し、それを文字列に変換し、文字を検索します"
(相互にクインで、ブロックの外側にのみ表示されます)- -1
文字が見つからない場合は検索が返され、そうでない場合は正の整数が返されます-結果をインクリメントします論理的に否定します。したがって、a "
が見つかった場合、これは0
それ以外の場合はを返し1
ます。今やる*
、結果が1の場合はブロックを1回実行し、それ以外の場合は実行しません。
最後に、これは修正コードの仕組みです:
_,94\m2/S*a_+\*N/23f/Wf%N*
_, "Duplicate the quine string and get its length.";
94\m "Subtract from 94.";
2/ "Divide by two.";
S* "Create a string with that many spaces. This will be
an empty string for the first mutual quine, and contain
23 spaces for the second mutual quine.";
a_+ "Create an array that contains this string twice.";
\* "Join the two copies together with the quine string.";
N/ "Split into lines.";
23f/ "Split each line into halves (23 bytes each).";
Wf% "Reverse the two halves of each line.";
N* "Join with a newline.";
バウンティを請求する、(12 x 10)* 48%= 57.6
このコードは、いくつかの変更を加えると、非常に簡単に複数の行に分割できることがわかりました。2文字を追加して、48を連続して取得します。これを8で割ると、6文字のコードと6スペースの8行になります。そのためには、いくつかの数値を変更し、演算子を1つまたは2つ並べ替えて、両方の行に分割されないようにする必要もあります。これにより、サイズが12 x 8の作業バージョンが1つ必要になります。したがって、何もしない2行を追加するだけで(1を押す、1を押す、1を押す、1を押す...)、12 x 10になります。
{`"_~"
+{129X
$,m2/S
*a_+\*
N/6f/1
;1;1;1
;1;1;1
;Wf%N*
}_`'"#
)!*}_~
前のものとして、これは生成します
{`"_~"
+{129X
$,m2/S
*a_+\*
N/6f/1
;1;1;1
;1;1;1
;Wf%N*
}_`'"#
)!*}_~
(補足:中間行で左右を交互に繰り返す必要はありません。最初と最後の行の位置のみが重要です。他のすべての行については、左右を任意に選択できます。)
そして、偶然の一致によって、完全なクインもまだ機能します
{`"_~"{`"_~"
+{129X+{129X
$,m2/S$,m2/S
*a_+\**a_+\*
N/6f/1N/6f/1
;1;1;1;1;1;1
;1;1;1;1;1;1
;Wf%N*;Wf%N*
}_`'"#}_`'"#
)!*}_~)!*}_~
(偶然と言います。内側のコードを実行しないことに注意する部分は、今では他の馬に奇妙に散らばっていますが、それでもうまくいくことがあります。)
そうは言っても、1;
賞金要件を満たすために最初の提出物に44行追加することもできましたが、12 x 10
見た目はすっきりしています。;)
編集:ハハ、「純粋な偶然」と言ったとき、私はこれ以上スポットを当てることができなかったでしょう。最終的なクインが実際にどのように機能するかを調べましたが、それはまったくばかげています。ネストされたブロックは3つあります(実際には4つですが、最も内側のブロックは無関係です)。これらの3つのブロックの最も内側の唯一の重要な部分は、それが含まれていることです"
(元の送信で行ったもの'"
ではなく、最後にこの同じ文字をチェックするために使用されるものです)。したがって、クインの基本構造は次のとおりです。
{`"_~"{`"_~"+{___'"___}_`'"#)!*}_~)!*}_~
それを分析してみましょう:
{`"_~" }_~ "The standard CJam quine.";
{`"_~"+ }_~ "Another CJam quine. Provided it doesn't do
anything in the rest of that block, this
will leave this inner block as a string on
the stack.";
) "Slice the last character off the string.";
! "Negate... this yields 0.";
* "Repeat the string zero times.";
したがって、これは確かに面白い魔法を行いますが、内部ブロックがスタック上に単一の文字列を残すため、)!*
たまたまそれを空の文字列に変えます。唯一の条件は、その後の内側のブロックにあるものが+
スタックに対して他に何もしないということですので、それを見てみましょう。
{___'"___} "Push a block which happens to contain
quotes.";
_`'"#)!* "This is from the original code and just
removes the block if it does contain
quotes.";