結城浩のHaskell日記 RSSフィード

2012-05-30

内包定義と条件によるフィルタリング 内包定義と条件によるフィルタリング - 結城浩のHaskell日記 を含むブックマーク

書籍『すごい Haskell たのしく学ぼう!』を読みながら勉強しています。何だかもうすっかり忘れてしまっていますね…。

第1章に出てきた直角三角形の問題(を少し変更したもの)を解きました。

辺の長さが10以下の整数になる直角三角形を求めよ。

C:\> ghci
GHCi, version 7.0.4: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package ffi-1.0 ... linking ... done.
Prelude> let as = [1..10]
Prelude> let bs = [1..10]
Prelude> let cs = [1..10]
Prelude> let p = [ (a,b,c) | a <- as, b <- bs, c <- cs, a * a + b * b == c * c ]
Prelude> p
[(3,4,5),(4,3,5),(6,8,10),(8,6,10)]
Prelude> :q
Leaving GHCi.

あらら、これだと同じ三角形が混ざってしまう。しかも、二乗はa * aじゃなくてa^2でいいのか…。

再挑戦。

C:\> ghci
GHCi, version 7.0.4: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package ffi-1.0 ... linking ... done.
Prelude> let as = [1..10]
Prelude> let bs = [1..10]
Prelude> let cs = [1..10]
Prelude> let p = [ (a,b,c) | a <- as, b <- bs, c <- cs, a^2 + b^2 == c^2, a <= b ]
Prelude> p
[(3,4,5),(6,8,10)]
Prelude> :q
Leaving GHCi.

できたできた。(^_^)

トラックバック - http://haskell.g.hatena.ne.jp/hyuki/20120530