summaryrefslogtreecommitdiff
path: root/7-2.hs
blob: f191196e6f7ea3326db13cedd7236baadb2f2ed7 (plain)
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
cat :: Int -> Int -> Int
cat x y = x * 10^(floor (logBase 10 (fromIntegral y)) + 1) + y

combine :: [Int] -> [Int]
combine (x:xs) = foldl f [x] xs
  where
    f :: [Int] -> Int -> [Int]
    f ns n = [(+), (*), cat] <*> ns <*> [n]

check :: Int -> [Int] -> Bool
check x xs = elem x (combine xs)

parseLine :: String -> (Int,[Int])
parseLine s = (read $ init x, map read xs)
  where
    (x:xs) = words s

result :: [(Int,[Int])] -> Int
result xs = sum . map fst . filter snd
  $ zip (map fst xs) (map (uncurry check) xs)

main :: IO ()
main = do
  ls <- lines <$> getContents
  print . result . map parseLine $ ls