注意!

ここでは乱数を用いることでコードを縮めるテクニックを紹介します。
あなごるでは一回でもSuccessすれば記録として認められてしまうので非常に効果的ですが、大量のSubmitはサーバの負担になるので自重しましょう。
また、乱数を用いた時は名前に(rand)を付けることを推奨します。(この点はあくまでnotの個人的意見であり、暗黙のルールではありません。)
これ以下の話は完全に環境依存です。あなごる以外の環境では別の方法を使うことになると思います。

何を乱数として用いるか

Cゴルフではmainの第二引数を乱数として用います。(第三引数以降でもOK)
mainの第二引数は本来ポインタです。なので0や1では初期化されておらず、どこかのアドレスを示す数値になっています。この数値は-16n-12の形になっているので
main(a,b){b%=9u;...
のようにしてやれば範囲が0〜8の乱数として扱えます。9uのuはunsignedのuです。ここで気をつけなければいけないのは偶数で剰余を取った場合、偶数しか返ってこないということです。なので欲しい数字が0〜7の範囲だとしても9uで剰余を取る必要があります。

逆にそれを利用することを考える

ゴルフでは上手くいかないことがあった場合、それを逆手にとることを常に考えるべきです。ここでも「偶数で剰余を取ると偶数しか返ってこない」というのを逆に利用することができます。例えば欲しい数値が6,8,14であった場合、
main(a,b){b%=15u;...
main(a,b){b%=18u;...
上のコードは1/15^3の確率、下のコードは1/9^3の確率となり、通る可能性が高くなります。サーバへの負担も減ります。16uで剰余を取ってしまうと4しか返ってこなくなるので18uで剰余を取っています。

欲しい数値が3,11,27であった場合はどうでしょうか。このときは
main(a,b){b=~b%40;...
としてやれば1/5^3の確率で通るコードとなります。もともとbの値は-16n-12であったのでビット反転させることで16n+11となり、40での剰余を取ると3,11,19,27,35のどれかが返ってきます。

そういえばuっているの?

unsignedのuをつけないと、負の数になってしまいます。もし負の数でも問題ないのであればuを省略して1バイト稼ぐことができます。見落としがちなところなので注意しましょう。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

メンバーのみ編集できます