だんぺんぶこみっく

2007-05-2620070526

[]日記 03:40 日記 - だんぺんぶこみっく を含むブックマーク はてなブックマーク - 日記 - だんぺんぶこみっく

3:00~3:30

 起床

 メール・web

3:30~4:00

を書いた

4:00~8:30

 webとかtvとか

8:30~13:30

 (半分)仕事。原稿作成

13:30~15:00

 仕事続き。その後,お昼(即席ラーメン)

15:00~19:00

 ゲーム

[][]FizzBuzzとかいうプログラムが「剰余禁止」だなんてどこに書いてあんだこのやろう 03:40 FizzBuzzとかいうプログラムが「剰余禁止」だなんてどこに書いてあんだこのやろう - だんぺんぶこみっく を含むブックマーク はてなブックマーク - FizzBuzzとかいうプログラムが「剰余禁止」だなんてどこに書いてあんだこのやろう - だんぺんぶこみっく

 はてブで一時期人気だったこの記事(わしは人気の記事はあえて見ない場合がおおいので無視してたけど),スラド日本の 終わってるITスキルトップ10を読んでたら載ってたので見た。で,

それで、そういった類の開発者を見分けるための質問を作り始め、私が「Fizz-Buzz問題」と呼んでいる問題のクラスを考え出した。これはイギリスの学校の子供たちがよくやっている遊び(というかやらされている遊び)にちなんで名付けた。Fizz-Buzz問題の例はこんな感じだ。

1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。

ちゃんとしたプログラマであれば、これを実行するプログラムを2分とかからずに紙に書き出せるはずだ。怖い事実を聞きたい? コンピュータサイエンス学科卒業生の過半数にはそれができないのだ。自称上級プログラマが答えを書くのに10-15分もかかっているのを見たこともある。

http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm

とのことだったので,

#include<stdio.h>
int main()
{
  int i;
  for( i=1;  i<=100;  i++ ) {
    if( i % 3 == 0 ) {
      if( i % 5 == 0 ) {
        printf( "FizzBuzz\n" );
      }
      else {
        printf( "Fizz\n" );
      }
    }
    else if( i % 5 == 0 )
      printf( "Buzz\n" );
    else
      printf( "%3d\n", i );
  }
}

とかいうのを考えた(たしかに2分もかからなかったが)。

 しかし,はてブコメントや当該スラド記事を見ると

m-naze programming どうでもいいが…,個人的にはFizzBuzz問題に剰余を使うような人は願い下げだ

とか

FizzBuzzは「剰余を使わない」という条件があるので・・・

Pythonだとワンライナーで

for x in ['FizzBuzz' if x==x/15*15 else 'Fizz' if x==x/3*3 else 'Buzz' if x==x/5 else x for x in range(1,101)]:print x

ですかね

http://slashdot.jp/it/article.pl?sid=07/05/24/2257258&from=rss

なんて書き込みがあったのだが,なんで剰余使用しちゃいかんのだ,これ,え (-_- #)

(他にやり方があるのかもしれんが,そんな「エレガントな」やり方とかを考える時間があったら,普通に剰余使って書いた方が早いだろ,と思うのだが)

あと上記引用のPythonのプログラム,実質的に剰余使ってるのと変わりないじゃん

[][]FizzBuzzとかいうプログラムを剰余をつかわずにかくとこうなる 03:53 FizzBuzzとかいうプログラムを剰余をつかわずにかくとこうなる - だんぺんぶこみっく を含むブックマーク はてなブックマーク - FizzBuzzとかいうプログラムを剰余をつかわずにかくとこうなる - だんぺんぶこみっく

#include<stdio.h>
int main()
{
  int i;
  for( i=1;  i<=100;  i++ ) {
    if( i==15 || i==30 || i==45 || i==60 || i==75 || i==90 ) {
      printf( "FizzBuzz\n" );
    else if(
             i== 3 || i== 6 || i== 9 || i==12 || i==18 || i==21 || i==24
             i==27 || i==33 || i==36 || i==39 || i==42 || i==48 || i==51
             i==54 || i==57 || i==63 || i==66 || i==69 || i==72 || i==78
             i==81 || i==84 || i==87 || i==93 || i==96 || i==99
           ) {
        printf( "Fizz\n" );
    }
    else if(
             i== 5 || i==10 || i==20 || i==25 || i==35 || i==40 || i==50
             i==55 || i==65 || i==70 || i==80 || i==85 || i==95
           ) {
      printf( "Buzz\n" );
    else
      printf( "%3d\n", i );
  }
}

(注:ネタなので念のため)

[] 06:58 20070526 - だんぺんぶこみっく を含むブックマーク

上の記事のやつをもうすこし別の考え方でやる(これは実際に書いて確かめた)

use strict;
use warnings;

#長さ101(にする)配列
my @ar = (0);

#@arの値によって表示する文字
my @tex = ( '', 'Fizz', 'Buzz', 'FizzBuzz' );

for( my $i=1;  $i<=100;  $i++ ) {
  $ar[$i] = 0;
}

for( my $i3=3;  $i3<=100; $i3+=3 ) {
  $ar[$i3] += 1;
}

for( my $i5=5;  $i5<=100; $i5+=5 ) {
  $ar[$i5] += 2;
}

for( my $x=1; $x<=100; $x++ ) {
  if( $ar[$x] == 0 ) {
    print "$x\n";
  }
  else {
    print "$tex[$ar[$x]]\n";
  }
}
トラックバック - http://fragments.g.hatena.ne.jp/TakahashiMasaki/20070526