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;