« Haskell で素数列 : 1000000 個目の素数が 3.5 秒で表示されました。 | トップページ | Project Euler : Problem 18 »

2010年4月 3日 (土)

Project Euler : Problem 17

 問題はこちらをご覧ください。

 

 以前、「Ruby」で解いたときと同じ方針で、数字の読みを文字列で返す関数を作ってみました。

import Maybe (fromMaybe) nums1, nums2 :: [(Int, String)] nums1 = zip [0 .. 19] ["", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"] nums2 = zip [2 .. 9] ["twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"] numToStr :: Int -> String numToStr n | n == 1000 = "one thousand" | n >= 100 = let (q, r) = quotRem n 100 in toStr q nums1 ++ " hundred" ++ lower r " and " | n >= 20 = let (q, r) = quotRem n 10 in toStr q nums2 ++ lower r "-" | otherwise = toStr n nums1 where toStr n assocs = fromMaybe "" (lookup n assocs) lower r a = if lower' == "" then "" else a ++ lower' where lower' = numToStr r problem017 :: Int problem017 = length chars where chars = foldr remove (concat nums) [' ', '-'] nums = map numToStr [1 .. 1000] remove x ys = [y | y <- ys, y /= x] main = print problem017

« Haskell で素数列 : 1000000 個目の素数が 3.5 秒で表示されました。 | トップページ | Project Euler : Problem 18 »

Haskell」カテゴリの記事

Project Euler」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/112020/47984018

この記事へのトラックバック一覧です: Project Euler : Problem 17:

« Haskell で素数列 : 1000000 個目の素数が 3.5 秒で表示されました。 | トップページ | Project Euler : Problem 18 »

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            
フォト

最近のトラックバック

無料ブログはココログ