だんぺんぶこみっく

2007-05-2620070526

[][]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

2007-04-0220070402

[]ハッシュ(Perl) 21:00 ハッシュ(Perl) - だんぺんぶこみっく を含むブックマーク はてなブックマーク - ハッシュ(Perl) - だんぺんぶこみっく

(以下,自分用の思考メモ)

  • Perlのハッシュ≒連想配列らしい(C++とかにあったきもするが,殆どやっていない)
  • ハッシュの前に%をつけなならんのが(ry
  • ようするにjava.util内のコレクションのHashMapのようなものか
  • 以下,前掲書のサンプルプログラムを参考にして今日書いたもの

hash02.pl

use strict;
use warnings;

#ハッシュ
my %h = (
	"阿部高和" => 22,
	"道下正樹" => 20,
	"リチャード=リンチ" => 49,
	"マイケル=ベリーマン" => 47
);
print "追加前\n";
foreach my $k (keys(%h)) {
	my $val = $h{$k};
	print "$k -> $val\n";
}

#追加
$h{"エド=ウッドJr"} = 34;
print "追加後\n";
foreach my $k (keys(%h)) {
	my $val = $h{$k};
	print "$k -> $val\n";
}

(名前はテキトウです)

hash03.pl

use strict;
use warnings;

#同一アイテムの回数をカウントする

#ハッシュ
my %hash;

my $dt = <STDIN>;
chomp($dt);
while($dt ne "end") {
	#わざとこう書いている
	my $x = $hash{$dt};
	$x++;
	$hash{$dt} = $x;

	$dt = <STDIN>;
	chomp($dt);
}

foreach (sort(keys(%hash))) {
	print "$_ -> $hash{$_}\n";
}

(実行結果)

C:\Perl\work>perl  hash03.pl
apple
pineapple
lemon
melon
apple
melon
grape
melon
end
apple -> 2
grape -> 1
lemon -> 1
melon -> 3
pineapple -> 1
トラックバック - http://fragments.g.hatena.ne.jp/TakahashiMasaki/20070402

2007-03-3020070330

[][]いま(嫌々)Perlを勉強中なのですが 17:14 いま(嫌々)Perlを勉強中なのですが - だんぺんぶこみっく を含むブックマーク はてなブックマーク - いま(嫌々)Perlを勉強中なのですが - だんぺんぶこみっく

 ……どうもこの言語の文法とかって自分のいままでの言語遍歴(C->C++(VisualC++MFCも少し)->Java)の各言語の性質と勝手が違うせいか,難しい。

 (ちなみに,仕事のためではなく,今度受けるテクニカルエンジニア(情報セキュリティ)試験のため。)

 教材は昨日購入した「新版 Perl言語プログラミングレッスン入門編」(結城 浩氏著,ソフトバンククリエイティブ)を使用している。この本自体はさすが結城氏のご著書だけあって平易でいいんだけど,言語の文法がどうも。以下,気になる点やら不満やらを,メモとして箇条書き。

 (なお,Javaを勉強したときも結城氏の「Java言語プログラミングレッスン(旧版)」を最初に使っていた。前掲書は現在3章まで読了)

(1)なんで変数名の前に$をつけにゃならんのか

 これはPHP(以前,少し勉強した)にもいえるのだけど,なんで変数名の前に$をつけないといかんのか。押しにくいんですよ。$って(自分は普通の人より手が小さく,指が短いため,$をタイプするために左手の小指で左側shiftを押さえながら,左手の人差し指で「4」のキーを押すのが結構つらかったりする。また,左手でshift+右手で「4」は,普段キーボードの右側に位置している右手を移動する位置が大きいので,これもちょっと時間がかかる)。

 あと,配列の前に@をつけないといけないとかいうらしいのですが,これも…(まだ前掲書の配列の章までいってないが)

(2)なんでelsifなのか

 条件分岐は比較的C等と近い記述で書けるようだけど,if {~} else if {~} …じゃなくて if {~} elsif {~} なのが……(Cなどの記述と違うのでややこしい)。最初,前掲書のサンプルコード見たとき「誤植か」と思ったが,"elsif"が正しいって書いてあって……

(3)演算子

 and, or, not, eq, ne, lt…とかの比較演算子が(ry

(4)文字列連結

 これもPHPにもいえるのだけど,文字列連結の演算子が"+"ではなく"."というのが…(Cなどで,"+"は文字列連結,"."は構造体等のメンバ参照か小数点というふうに認識しきっているせいで困る)

 まえ,PHPでつい,Javaなどのノリで

 $dt = $test + " is a " + $xxx + " .\n"; 

とかいうコードを書いてしまい,なぜ連結できないのかえらい長い間悩んだことがある……

よいと思った点

 よいと思った点も。

 (1)if文の記法 … if文の中身の文が一つだけでも必ず{}で囲うことが必要な点(Cなどでは省略可能,前掲書47ページ)。これはif文などの影響範囲を明示するためのわかりやすい規則だと思う(自分も,Cなどでもかならず書くようにしている)。

 (2)標準入出力が簡単

 1行入力が my $a = <STDIN>; でいいってやつ(これがJavaだと,1行入力するだけで(略))

自分でもプログラムを書いた

 前掲書のサンプルは,(まだ最初の方の章だから)読んだだけで意味がわかるのが多いので,自分でプログラムを書いて動かしてみた(以下)。

use strict;
use warnings;

#入力
my $mess = <STDIN>;

if( index( $mess, "ウホッ" ) == 0 ) {
	print "やらないか\n";
}
if( index( $mess, "アッー!" ) != -1 ) {
	print "しゃぶれよ\n";
}
use strict;
use warnings;

#入力
my $mess = <STDIN>;

if( index( $mess, "ウホッ" ) != -1 ) {
	print "やらないか\n";
}
elsif( index( $mess, "好きです" ) != -1  ) {	#elseifじゃないんかい
	print "うれしいこと言ってくれるじゃないの\n";
}
else {
	print "お前オレのケツの中で(ry\n";
}

 (……って,最初に書いたプログラムがこんなのか)

[]PerlとJavaでそれぞれエコープログラムを書いてみた 17:59 PerlとJavaでそれぞれエコープログラムを書いてみた - だんぺんぶこみっく を含むブックマーク はてなブックマーク - PerlとJavaでそれぞれエコープログラムを書いてみた - だんぺんぶこみっく

 (標準入力から1行入れて,そのまま表示するやつです)

Perl

use strict;
use warnings;
my $x = <STDIN>;
print $x;

Java

import java.io.*;
class Inout {
	public static void main( String[] args ) {
		BufferedReader br = new BufferedReader(
			new InputStreamReader( System.in )
		);
		try {
			System.out.println( br.readLine() );
		}
		catch( Exception e ) {
		}
	}
}

 ……………………………………(-_- ;)

トラックバック - http://fragments.g.hatena.ne.jp/TakahashiMasaki/20070330

2007-03-2020070320

[]自動で俳句をつくるプログラム 23:27 自動で俳句をつくるプログラム - だんぺんぶこみっく を含むブックマーク はてなブックマーク - 自動で俳句をつくるプログラム - だんぺんぶこみっく

 上のを書いた後に突発的に思いついたプログラム

import java.util.Random;

class AutoRandomHaikuGenerator {
	static Random rd = new Random();
	public static void main( String[] args ) {
		char[] ku0 = new char[ 5 ];
		char[] ku1 = new char[ 7 ];
		char[] ku2 = new char[ 5 ];

		make( ku0 );
		make( ku1 );
		make( ku2 );
		System.out.println( ku0 );
		System.out.println( ku1 );
		System.out.println( ku2 );
	}

	private static void make( char[] a ) {
		for( int idx=0;  idx<a.length;  idx++ ) {
			int x = rd.nextInt();
			if( x < 0 )
				x = (-1) * x;
			a[ idx ] = (char)( x % 83 + ('あ'));
		}
	}
}

 自動で俳句を生成する……つっても

C:\work>java AutoRandomHaikuGenerator

げてゐひか

そとまよずぐざ

へっっきふ

とかいう感じの意味のないものですが(これをバッチか何かで自動的に走らせれば1日で2万句も可能だ)

トラックバック - http://fragments.g.hatena.ne.jp/TakahashiMasaki/20070320