Problem 43
コンテンツ
The number, 1406357289, is a 0 to 9 pandigital number because it is made up of each of the digits 0 to 9 in some order, but it also has a rather interesting sub-string divisibility property.
Let d1 be the 1st digit, d2 be the 2nd digit, and so on. In this way, we note the following:
d2d3d4=406 is divisible by 2
d3d4d5=063 is divisible by 3
d4d5d6=635 is divisible by 5
d5d6d7=357 is divisible by 7
d6d7d8=572 is divisible by 11
d7d8d9=728 is divisible by 13
d8d9d10=289 is divisible by 17
Find the sum of all 0 to 9 pandigital numbers with this property.
再帰とリストモナドを使って書いてみた。
import Data.List import Data.Char import Control.Monad perm ::Eq a =>[a]->Int->[[a]] perm _ = [[]] perm [] _ = [] perm xs@(_:_) (n+1)=concat[map (h:)$perm(delete h xs)n|h<-xs] pandigital xs _ [] =[xs] pandigital [x,y] (p:ps) ds = do z<- ds guard(divisible p [x,y,z]) ys <- pandigital [y,z] ps $delete z ds return $x:ys where divisible n = (==).flip mod n.read p043 =sum.map read$[d:dds|(d:ds)<-perm digit 3,d/='0', dds<-pandigital ds divisor $digit(d:ds)] where digit ="0123456789" divisor = [2,3,5,7,11,13,17]
作成者 Toru Mano
最終更新時刻 2023-01-01 (c70d5a1)