2009-10-01から1ヶ月間の記事一覧

Haskellでfizzbuzz

動いて妙にうれしい。 main = putStrLn $ unwords $ map fizzbuzz [1..100] fizzbuzz :: Integer -> String fizzbuzz n | divides 3 && divides 5 = "fizzbuzz" | divides 3 = "fizz" | divides 5 = "buzz" | otherwise = show n where divides p = mod n p …

ふつうのHaskell本読了

「ふつうのHaskellプログラミング」(青木峰郎著)を一通り読んだ。関数、型クラスあたりの話が非常におもしろい。Haskellの関数って引数が2つ以上あるように見えても、それは実は引数を1つ取って関数を返す高階関数なんだという話とか、関数定義のところで…

Haskellを少しやってみる

何となくHaskellを少しやってみようかと思った。「ふつうのHaskellプログラミング」(青木峰郎著)を頭から3分の1ほど読んだ。ビックリするぐらいRubyと似てる。モナドとか言わなければ、あまり違和感がないかも。リストを切り刻む関数のhead、tailはLispのc…

プライム、プライム、プライム

数万語あるスペル辞書から「amble、blame、mabel、mable」のようなアナグラムになっている単語を拾い出すというプログラムをHaskellでもやってみようと頑張ってみた。前にRubyで書いていたし、比較的簡単にかけそうな気がしたのだけど、コンパイルエラーが出…

この木なんの木

理系関連のトピックに関して、Wikipediaには初学者向けに優れた記述が多いように感じているけど、その中でも特にコンピュータサイエンスに関しては英語、日本語ともにコンパクトで読みやすい解説が多いように思う。Wikipediaで木構造について色々と読み漁っ…

Rubyでバイナリ・ヒープを書いてみた

各ノードの子が常に親より大きくなる(あるいは小さくなる)バイナリ・ヒープを作ってみた。ヒープはソートに使われるほかにも、順序付きキュー(pre-ordered queue)など結構重要な応用があるらしい。順序のあるキューを配列で実現する場合、3つのアプロー…

ヒープのsiftdownリファクタリング

MyHeapのsiftdownでコードの重複と分岐の分かりづらさが気になったので書き換えてみた。 def siftdown(n) if n * 2 > @n then return elsif n * 2 == @n then if @q[n] > @q[n * 2] then @q[n], @q[n * 2] = @q[n * 2], @q[n] end elsif n * 2 + 1 <= @n the…

動的計画法で部屋の割り当て

「Rubyによる情報科学入門」(久野靖著)にあった動的計画法をやってみた。またしてもコードがRubyらしくない気がしたので、書き換えてみた。動的計画法は、ある条件を満たす解を見つけるのに、その解だけを求めるのじゃなくて、初期状態から順次計算してい…

アルゴリズムの理解と実装って結構別かも

「珠玉のプログラミング」を何章か続けて読んだ。前半1/3ぐらい読み終わったところで、あれ、この本てプログラマとしての正しい心構えや日々の良い行いについて具体例を示しつつ解説する本だったのかな、と、よく分からなくなってきた。別にそんなのどうでも…

ペナントパズルをRubyで解く

箱入り娘とほぼ同類のスライドパズルとして、ペナントパズルというものがあるらしいとWikipediaで知った。左上の2x2のピースを右下にまで持ってくるというもので、箱入り娘の解法のために作ったRubyスクリプトの初期条件とゴール判定の位置だけを変えてやっ…

箱入り娘パズルをRubyで解く

「Rubyによる情報科学入門」(久野靖著)の第10章にあった箱入り娘パズルをやってみた。スライドパズルの一種。掲載されているコードをそのまま打ち込むのも芸がないし、例によって、久野先生のコードが、どうもCっぽく見えることもあって、自分で書き直して…

イテレータでFizzBuzz

FizzBuzzを書くのに、オープンクラスで書き換えるべきなのはFixnum#to_sじゃなくて、Range#eachじゃないかと思ってやってみた。 class Range def fizzer self.each do |n| f = (n % 3) == 0 ? "Fizz" : "" f += (n % 5) == 0 ? "Buzz" : "" f = n if f.empty…