FizzBuzz問題の解説と感想


昨日の記事でJ言語でFizzBuzzをやりました。はっきり言って難しかった。配列で考えること自体は慣れの問題だと思うのですが、ボックスがやっかい。じつはずいぶん試行錯誤をしました。

   1;2;'Fizz';4;'Buzz';6;7
 +-+-+----+-+----+-+-+
 |1|2|Fizz|4|Buzz|6|7|
 +-+-+----+-+----+-+-+

というようにセミコロンでつないでいけばボックスになるのですが、数列の後ろに'Fizz','Buzz','FizzBuzz'の箱を3つ続けるのがなかなかできませんでした。

   ]a=:<"0(1+i.7)
 +-+-+-+-+-+-+-+
 |1|2|3|4|5|6|7|
 +-+-+-+-+-+-+-+
   ]a=:a,'Fizz';'Buzz';'FizzBuzz'
 +-+-+-+-+-+-+-+----+----+--------+
 |1|2|3|4|5|6|7|Fizz|Buzz|FizzBuzz|
 +-+-+-+-+-+-+-+----+----+--------+

というように、一旦aに代入してからカンマでつなげましたが、これがふつうのやりかたかどうかはしりません。(追記:(<"0 (1+i.7)),('Fizz';'Buzz';'FizzBuzz')で出来ました。)
取り出すのは{(左ブレイス)は知っていた。
次に配列の作成ですが、3で割ったあまりは|(パイプ、たてぼう)で、それが0(ゼロ)のときにフラグを立てるというのが知りませんでした。

   0 E. 3|a
 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 ...

#(シャープ)は二項動詞としてはコピーですので、配列aと組み合わせると、位置が取り出せます。ホントは位置ではなく、その場所にある数字です。

   ]fizz=:101 (((0 E. 3|a) # a) - 1)} a 
   ]buzz=:102 (((0 E. 5|a) # a) - 1) } fizz
   ]fizzbuzz=:103 (((0 E. 15|a) #a) - 1) } buzz
   10 10$result=:(fizzbuzz - 1) { boxall

}(右ブレイス)は不思議な動詞で、左側に引数を2つ取って、ある数字を配列の指定した場所に代入します。
最後にボックスから{(左ブレイス)で取り出して出来上がり。


宿題:ボックスについてもっと勉強する。(0 E. 3|a)はこれがふつうかわからないので覚えておく。数値のボックスの後ろに文字列のボックスをつなげたのはよいアイデアだが、課題の⌈数が変化したときに作り直す必要がある。つまりあまりかっこよい解決方法ではない。これも覚えておく。今回の解法をひとつの動詞(関数)にできるか考える。最後の4行を配列とボックスを使わずすべてボックスでできないか。数字の位置と数字を合わせるために1を引いたりしているがこの辺をもっとエレガントにできないか。


以上