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)

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)