« 2010年10月 | トップページ | 2010年12月 »

2010年11月

2010年11月29日 (月)

Project Euler : Problem 56

 問題はこちらをご覧ください。
 また、自作の "ForEuler module" に関してはこちらをご覧ください。

 

 自然数 ab の桁の和を計算する関数を f(a, b) とすると、

f(a, b) = f(a * 10, b) = f(a * 100, b)
ということが分かります。すなわち、"a" が 10 の倍数の時には計算する必要が無いということです。
 そこで今回は次のようなコードを書いてみました。
import ForEuler problem056 :: Integer problem056 = maximum nums where nums = [f (a ^ b) | a <- [2 .. 99], rem a 10 /= 0, b <- [2 .. 99]] f n = sum $ dexToList n main :: IO () main = print problem056

Project Euler : Problem 55

 問題はこちらをご覧ください。
 また、自作の "ForEuler module" に関してはこちらをご覧ください。

 

 今回は、問題文を素直にコードにしてみました。

import ForEuler isLychrel :: Integer -> Bool isLychrel n | null ans = True | otherwise = False where ans = [x | x <- take 50 $ tail $ iterate reversePlus n, isPalindromic x] reversePlus n = n + (listToDex . reverse . dexToList) n problem055 :: Int problem055 = length $ filter isLychrel [1 .. 10000] main :: IO () main = print problem055
 数を反転するのに (listToDex . reverse . dexToList) という合成関数を使ってみました。

2010年11月 4日 (木)

Project Euler : Problem 53 その2

 問題はこちらをご覧ください。
 また、自作の "ForEuler module" に関してはこちらをご覧ください。

 

 前回 "Problem 53" の記事を投稿した後、同じ問題を解いていらっしゃる他の方々のブログを眺めていたら、なぜか「パスカルの三角形」の単語がちょくちょく出てきました。
 最初は「??」だったのですが、「『組み合わせ』といえば『パスカルの三角形』」ということをやっと思いだしました。(分らない人は "Wikipedia" などで調べて見てください)
 それで、急いで自分なりの「パスカルの三角形バージョン」を作ってみました。

pascal'sTriangle :: [[Integer]] pascal'sTriangle = iterate func [1] where func ns = zipWith (+) (0:ns) ns ++ [1] -- nCr > m となる r の数 count :: [Integer] -> Integer -> Int count ns m = if r == length ns then 0 else length ns - 2 * r where r = length $ takeWhile (<= m) ns problem053 :: Int problem053 = sum $ map (`count` 1000000) $ take 101 pascal'sTriangle main :: IO () main = print problem053

 「パスカルの三角形」を使ってこの問題を解くと、階乗の計算が不要になるのでかなり速く解けますね。

2010年11月 2日 (火)

あなたの「干支」は何ですか?

 いつから「干支(えと)」を聞かれた時に「十二支」だけを答えるようになったんでしょうね。

 そもそも「干支」の漢字の意味は「十干・十二支」のことです。
 「十干」は「甲乙丙丁戊己庚辛壬癸」のことです。「十二支」はご存知の「子丑寅卯辰巳午未申酉戌亥」のことですね。
 さらに「えと」の読み方は「兄弟(えと)」から来ているので、「十干」のことだけを指すはずなのに…。

 ちなみに、なぜ「十干」のことを「兄弟(えと)」と呼ぶかと言うと…
 中国では「五行思想」(木火土金水)に基づいて「十干」を「甲と乙は木、丙と丁は火…」と分類していきました。さらに「甲は木兄(きのえ)、乙は木弟(きのと)、丙は火兄(かのえ)、丁は火弟(かのえ)…」と分けました。この「兄(え)」と「弟(と)」から「兄弟(えと)」になったんですね。

 人に「『えと』は何ですか?」と聞かれた時に、「乙(きのと)です」とか「乙巳(きのとみ)です」と答えたくなるのですが、ぐっと我慢して「巳年です」とだけ答えるようにしています。

« 2010年10月 | トップページ | 2010年12月 »

2016年7月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
フォト

最近のトラックバック

無料ブログはココログ