数学セミナーの code golf 問題

This entry was posted by on Monday, 10 September, 2007

に書いてたやつね。竹内郁雄先生が『数学セミナー』誌上の「エレガントな解答をもとむ」で出題した問題。どうでもいいけど解答は提出しわすれてしまった。B5の紙に印刷しなきゃいかん、という時点で相当に萎えてしまった。

さて、この問題ではa-zという26種類の変数があり、各変数には初期でそれぞれ非負整数が入っている。また以下のような命令が用意されていて、変数の値を操作できる。

>
  • 変数の値を0にする。変数名に0を前置する。たとえば `0a’ なら「aを0にする」の意味。 >
  • 変数をインクリメントする。変数名に+を前置する。たとえば`+a’なら「aに1を加える」の意味。 >
  • 2つの変数の間で値をコピーする。コピー先の変数名の前にコピー元の変数名を置く。たとえば `ab’ なら「aの値をbにコピー」 >
  • 変数の値だけ繰り返す。変数名を書いて、そのあとに丸括弧で繰り返す処理内容を囲む。たとえば `yz x(+z)’ とすれば x と y の合計が z に入ることになる。 >
  • 変数の値が0でない間だけ繰り返す。変数名を書いて、そのあとに角括弧で繰り返す処理内容を囲む。たとえば `xz x[0x 0z +z]‘ とすると、 x が 0 なら z も 0、そうでなければ z は 1 となる。
  • 問題は「xとyのうち小さい方の値をzにコピーする」プログラムを書くことであるが、問題にはまだ続きがある。プログラムにはコストが設定されているのだ。上の3つは1両、下の2つは3両というコストがかかる。これはプログラムのコストなので、実行回数とは関係ない。 yz x(+z) のコストはコピーが1回、インクリメントが1回、繰り返しが1回出現しているからトータルコストは5両になる。

    加えて、プログラムの実行終了後に目的となる z 以外に値の変化している変数が1つあるごとに1両、コストが増える。また、 x と y の値はもとの値のままでなければならない。

    さあどうしますか、という問題である。

    ちなみにわたしの解答は xvyw0zxcc[0cvawba[b[+c+z0b]0a]0a0bv(b[0b+a]+b)av0a0bw(b[0b+a]+b)aw]で、これは49両のコスト。

    Comments are closed.