世間ではFizzBuzz問題ではなく世界のナベアツ問題というものが流行っているらしい。多分…一部だけで。
はてなにこんな質問が流れてた。
力試しにナベアツのような判定をするプログラムを作ろうとしたところ、問題が発生しました。
へぇ~プログラムでナベアツをやるのか。ちょっと古い投稿だけど、うちもまねして書いてみる事にした。とりあえず手っ取り早くperlで。
#!/usr/bin/perl
$n = $ARGV[0];
if( $n =~ /^[0-9]+$/ ){
if( ($n % 3) == 0 || &func($n) == 3){print "aho\n";}
}else{
print "But input.\n";
}
sub func{
my $n = $_[0];
my $nx;
do{
$nx=$n % 10;
}while(($nx != 3) && ($n=($n - $nx)/10));
return $nx;
}
アホ判定をひとつのif文にしたかったので、3のつく数字を探す処理は関数にしてみた。do~while文で判定しながら代入しているので、ちょっと可読性が悪いかな。普段はあまりこういう書き方はしない。特に仕事だとあまりプログラム慣れてない人が読むと混乱してしまうし。って個人的には思ってるんだけど、どうなんだろ?
というかdo~while自体あんまり使わないという話も。
次にもうちょっとperlらしく書いてみる。可読性なんぞくそくらえ。
#!/usr/bin/perl
$_= $ARGV[0];
if(/^[0-9]+$/){
print $_%3&&!/3/?'':"aho\n";
}else{
print "But input\n";
}
個人的にはこれが限界。三項演算子のところの判定は逆転の発想で書いているので、ちょうわかりづらい。書いてる自分もこんがらがった。
これ書いた後にもうちょっと調べたら、世界のナベアツ問題にはもうちょっと続きがあったのか。例えば3だけじゃなく、
「3の倍数と3の付く数字だけアホになり、8の倍数だけ気持ち良くなります」
というのも。もうこっちはいいや(笑)
というか8の倍数だけ先行して判定してあとは同じ処理って感じかぁ。
ちょっとした息抜きでした。
作成日:2008/12/02 02:43:12