Fizz-Buzz問題

どうしてプログラマに・・・プログラムが書けないのか?

Fizz-Buzz問題の例はこんな感じだ。 1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。 ちゃんとしたプログラマであれば、これを実行するプログラムを2分とかからずに紙に書き出せるはずだ。怖い事実を聞きたい? コンピュータサイエンス学科卒業生の過半数にはそれができないのだ。自称上級プログラマが答えを書くのに10-15分もかかっているのを見たこともある。

記事の内容はともかく思わず反応。

ってことでまずは何も考えずぼーっと書いてみた

use Perl6::Say;

for my $i (1..100) {
    if ( $i % 3 == 0 && $i % 5 == 0 ) {
        say 'FizzBuzz';
    }
    elsif ( $i % 3 == 0 ) {
        say 'Fizz';
    }
    elsif ( $i % 5 == 0 ) {
        say 'Buzz';
    }
    else {
        say $i;
    }
}

1分くらい。よかった一応僕はプログラマであることが証明された・・・のか?

でもっと短くならんかなぁと考えてみたらこうなった。

for my $i (1..100) {
    my $str;
    $str  = 'Fizz' if $i % 3 == 0;
    $str .= 'Buzz' if $i % 5 == 0;
    say $str || $i;
}

んでさらに短くならんかなぁと考えてみたらこうなった。

say for map { $_ % 3 ? ($_ % 5 ? $_ : 'Buzz') : $_ % 5 ? 'Fizz' : 'FizzBuzz' } (1..100);

もはや可読性なんざぁーどーでもイイぜーっ!オレはワンライナー野郎だーーーっ!(うそです)

さてさてプログラマの皆様もさらに面白く、より短いコードを書いてみてはいかがでしょうか?

追記:おまけ

package FizzBuzz;
use Tie::Hash;
use base qw/Tie::StdHash/;
sub TIEHASH  {
    bless {
        15 => 'FizzBuzz',
        5  => 'Buzz',
        3  => 'Fizz',
    }, $_[0];
}
sub FETCH {
    my $self = shift;
    my $i    = shift;
    for my $div (sort { $b <=> $a } keys %$self ) {
        return $self->{$div} if $i % $div == 0;
    }
    return $i;
}

1;

use FizzBuzz;
use Perl6::Say;

tie my %fizzbuzz , 'FizzBuzz';
say $fizzbuzz{$_} for 1..100;