problem 40
着陸したら全く終わらなかった。
main = print $ p p = map (d.(10^)) [0..6] d x = (g 190000)!!(x-1) g x = foldl f "" [1..x] where f x y = x++(show y)
ちょっとカンニングして以下。
Prelude Data.Char> product [digitToInt $ ([0..] >>= show) !! x | x<- take 7 $ iterate (*10) 1] 210 (0.06 secs, 132123632 bytes)
concatMapの実装がすごいんだろうなー なぜこんなに速いのか理解できない。
problem38
パンデジタル数になるのは 少なくともn<=9
連結される数はn=2のとき、最初が4桁と次が5桁になるので 4999
import Data.List main = print $ maximum $concat $ map g [9..9999] f::Int->Int->Int f x y = read $foldl (++) [] $map show $zipWith (*) [x,x..] [1..y] g x = filter isPandigital $ map (x `f`) [2..9] isPandigital x = "123456789" == ( sort $ show x)
concatしているところと isPandigital がちょっとダサイがまあいいでしょう。
Prelude Main> 932718654 (1.26 secs, 2637538728 bytes)
problem37
primesとtailsを使ったので楽にできた。
Prelude Data.List Data.Numbers.Primes> let f x= all (isPrime.read) $ filter (/=[]) $ tails (show x) ++ (map reverse (tails (reverse (show x)))) in sum $ take 11 [x|x<-primes,x>10,f x] 748317 it :: Integer (4.51 secs, 2714735608 bytes)
probelm36
基数変換がダサい。
Prelude> let d2b x = if (div x 2)/=0 then (d2b (div x 2))++[mod x 2] else [mod x 2] in sum [x|x<-[1..1000000],show x==reverse (show x),d2b x==reverse (d2b x)] 872187 it :: Integer (1.20 secs, 877606456 bytes)
problem35
ローテート関数が見つからなかったので自作
Prelude Data.Numbers.Primes> let g (x,y) = y++x ;f::Int->[Int];f x = map (read.g.(`splitAt` (show x))) [1..((length.show) x)-1] in length [x|x<-[1..1000000],isPrime x,all isPrime $ f x] 55 it :: Int (3.13 secs, 4809034056 bytes)
problem34
なぜ5桁以内かを言えていない。
Prelude List> let f x=foldr (*) 1 [1..x]; g x=x==(sum $ map (f.read.(:[])) $show x) in sum [x|x<-[3..100000],g x] 40730 it :: Integer (5.22 secs, 3383707256 bytes)