|
|
|
@ -1,13 +1,13 @@ |
|
|
|
module Main where |
|
|
|
module Main where |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import Debug.Trace |
|
|
|
import System.Environment (getArgs) |
|
|
|
import System.Environment (getArgs) |
|
|
|
|
|
|
|
|
|
|
|
main :: IO () |
|
|
|
main :: IO () |
|
|
|
main = do |
|
|
|
main = do |
|
|
|
input <- readFile . head =<< getArgs |
|
|
|
input <- readFile . head =<< getArgs |
|
|
|
print $ part1 input |
|
|
|
print $ part1 input |
|
|
|
|
|
|
|
print $ part2 input |
|
|
|
-- print $ part2 input |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
part1 :: String -> Int |
|
|
|
part1 :: String -> Int |
|
|
|
part1 = sum . filter invalid . concat . map ids . map parse . splitOn ',' |
|
|
|
part1 = sum . filter invalid . concat . map ids . map parse . splitOn ',' |
|
|
|
@ -36,4 +36,21 @@ invalid i = |
|
|
|
half = take (len `div` 2) s |
|
|
|
half = take (len `div` 2) s |
|
|
|
in s == half ++ half |
|
|
|
in s == half ++ half |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
part2 :: String -> Int |
|
|
|
|
|
|
|
part2 = sum . filter invalid2 . concat . map ids . map parse . splitOn ',' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
invalid2 :: Int -> Bool |
|
|
|
|
|
|
|
invalid2 i = |
|
|
|
|
|
|
|
let s = show i |
|
|
|
|
|
|
|
len = length s |
|
|
|
|
|
|
|
facs = factors len |
|
|
|
|
|
|
|
in or [(repeatN (len `div` n) $ take n s) == s | n <- facs] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- needs to get the primes instead of all factors |
|
|
|
|
|
|
|
factors :: Int -> [Int] |
|
|
|
|
|
|
|
factors i = filter ((== 0) . (mod i)) [1 .. i `div` 2] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
repeatN :: Int -> [a] -> [a] |
|
|
|
|
|
|
|
repeatN i = concat . replicate i |
|
|
|
|
|
|
|
|
|
|
|
testInput = "11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124" |
|
|
|
testInput = "11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124" |
|
|
|
|