→をクリックすると非真理設定が非表示になります。ページを再読み込みすると戻ります。
前回書いた
nll melfert kRz f5+8@ f3 nta 1 f3 fi f3 0 xylo malkRz molniv xx kRz 0 f1 kRz polto xx nll polto kRz f3 f0 ata f1 f0 dtosna 1 f0 kRz f0 f2 dRo 2 f2 ata f5+12@ f2 fi f2@ f5+4@ clo malkRz mol xx fi f2@ f5+4@ xylo malkRz xyloler xx kRz leloler xx nll xyloler kRz f0 f1 ata 1 f1 fi f3 f1 xylo malkRz molniv xx kRz polto xx nll leloler kRz f0 f3 nta 1 f3 fi f3 f1 xylo malkRz molniv xx kRz polto xx nll molniv kRz 0 f0 kRz f5@ xx nll mol kRz 1 f0 kRz f5@ xx
はこれで一応完成はしていますが、まだ改良の余地があります。というのも、polto
で始まる断片とxyloler
で始まる断片を入れ替えてやることにより、
nll melfert kRz f5+8@ f3 nta 1 f3 fi f3 0 xylo malkRz molniv xx kRz 0 f1 kRz polto xx nll xyloler kRz f0 f1 ata 1 f1 fi f3 f1 xylo malkRz molniv xx kRz polto xx nll polto kRz f3 f0 ata f1 f0 dtosna 1 f0 kRz f0 f2 dRo 2 f2 ata f5+12@ f2 fi f2@ f5+4@ clo malkRz mol xx fi f2@ f5+4@ xylo malkRz xyloler xx kRz leloler xx nll leloler kRz f0 f3 nta 1 f3 fi f3 f1 xylo malkRz molniv xx kRz polto xx nll molniv kRz 0 f0 kRz f5@ xx nll mol kRz 1 f0 kRz f5@ xx
というように、「次の命令へ飛ぶ」という箇所が2つ作れるからです。2003lkは何もしなくても次の命令に飛んでくれるので、これは省略できて
nll melfert kRz f5+8@ f3 nta 1 f3 fi f3 0 xylo malkRz molniv xx kRz 0 f1 kRz polto xx nll xyloler kRz f0 f1 ata 1 f1 fi f3 f1 xylo malkRz molniv xx nll polto kRz f3 f0 ata f1 f0 dtosna 1 f0 kRz f0 f2 dRo 2 f2 ata f5+12@ f2 fi f2@ f5+4@ clo malkRz mol xx fi f2@ f5+4@ xylo malkRz xyloler xx kRz f0 f3 nta 1 f3 fi f3 f1 xylo malkRz molniv xx kRz polto xx nll molniv kRz 0 f0 kRz f5@ xx nll mol kRz 1 f0 kRz f5@ xx
と書けます。さらに、最後のmolnivの直前のfiの条件を反転してやることで、
nll melfert kRz f5+8@ f3 nta 1 f3 fi f3 0 xylo malkRz molniv xx kRz 0 f1 kRz polto xx nll xyloler kRz f0 f1 ata 1 f1 fi f3 f1 xylo malkRz molniv xx nll polto kRz f3 f0 ata f1 f0 dtosna 1 f0 kRz f0 f2 dRo 2 f2 ata f5+12@ f2 fi f2@ f5+4@ clo malkRz mol xx fi f2@ f5+4@ xylo malkRz xyloler xx kRz f0 f3 nta 1 f3 fi f3 f1 xolo malkRz polto xx kRz molniv xx nll molniv kRz 0 f0 kRz f5@ xx nll mol kRz 1 f0 kRz f5@ xx
となり、さらに1命令削ることができます。
最後に、
fi f2@ f5+4@ clo malkRz mol xx fi f2@ f5+4@ xylo malkRz xyloler xx
の箇所に着目してみましょう。ここは探索の過程で何回も通る箇所ですが、今回の条件では与えられる名簿に重複がないという条件があるので、「f2@は目的の値と等しい」となる確率は、「f2@は目的の値より小さい」となる確率より低いわけです。ということは、
fi f2@ f5+4@ xylo malkRz xyloler xx fi f2@ f5+4@ clo malkRz mol xx
と書いてやれば、より確率の高い「f2@は目的の値より小さい」を先に判定できるので、この判定に合致した際に実行される命令数が2個減ります。代わりに「等しい」ときに実行される命令数が2個増えますが、「等しい」は多くて1回しか満たされない以上、トータルでは得をするというわけです。
以上をまとめて、こうなります。
nll melfert kRz f5+8@ f3 nta 1 f3 fi f3 0 xylo malkRz molniv xx kRz 0 f1 kRz polto xx nll xyloler kRz f0 f1 ata 1 f1 fi f3 f1 xylo malkRz molniv xx nll polto kRz f3 f0 ata f1 f0 dtosna 1 f0 kRz f0 f2 dRo 2 f2 ata f5+12@ f2 fi f2@ f5+4@ xylo malkRz xyloler xx fi f2@ f5+4@ clo malkRz mol xx kRz f0 f3 nta 1 f3 fi f3 f1 xolo malkRz polto xx nll molniv kRz 0 f0 kRz f5@ xx nll mol kRz 1 f0 kRz f5@ xx
正直入門の段階でここまで命令数を減らすことに躍起になる必要はありませんが、このような手法が存在するということだけでも把握していただければ幸いです。