Lambdaカクテル

ソフトウェア開発者です.玉石混淆です.

FizzBuzzをできるだけ短く書く@119chars

プログラミング課題としてよく取り上げられるFizzBuzzSchemeで書いてやろうという意欲がわいたので書いてみました。

巷にはFizzBuzzを最短実装してやろうという向きがあるようなので、せっかくだし(Gaucheの独自実装を使うか悩んだ)書いてみました。

前座はさておき、こんなコードです。nを渡すと結果を返すlambda形式です。

(lambda (n)
 (case
  (list-ref
   '#0=(Z N N F N B F N N F B N F N N . #0#) n)
   ('N n)
   ('F 'Fizz)
   ('B 'Buzz)
   ('Z 'FizzBuzz)))

枠の都合で改行を入れていますが改行を抜いて正味119文字。なかなかの傑作ですね(自画自賛)。

循環リストから取り出すのでmoduloは使いませんでした。

FizzBuzzの結果は15でループする(eqv? (* 3 5) 15)ので結果リストを先に用意してしまうという手法をとりました。

結果リストにFizz, Buzz, とつらつら書くと微妙にコードが伸びる(ような気がした)ので後から分岐で結果を書き換えています。

どちらにせよnがFizzにもBuzzにも属しない場合はnを返却しないといけないので同じようなものかなと思います。

またGauche実装を使えば"(lambda (n)..."のくだりは"(^n...)に短縮できます。

LISP語族はどうしてもカッコとコッカが必要になるので文字数のオーバーヘッドが増加する。
仕方ないね!

よくある様式どおりに、"1 2 Fizz 4 Buzz..."が欲しい場合はmapを使いましょう。