days 20-24 (day 24 excluded for input confidentiality)
This commit is contained in:
parent
26f16c9297
commit
5de9ac11ea
5 changed files with 256 additions and 1 deletions
74
22/solution.hs
Normal file
74
22/solution.hs
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
import Data.List
|
||||
import Data.Bits
|
||||
import Data.Maybe
|
||||
import Data.Function.Memoize
|
||||
import Debug.Trace
|
||||
import Control.Parallel.Strategies
|
||||
|
||||
traceOut :: Show a => a -> a
|
||||
traceOut x = (traceShow x x)
|
||||
|
||||
addFirst :: [[a]] -> a -> [[a]]
|
||||
addFirst [] x = [[x]]
|
||||
addFirst (y:ys) x = ([x] ++ y) : ys
|
||||
|
||||
split :: [Char] -> String -> [String]
|
||||
split _ [] = []
|
||||
split delims (x:xs)
|
||||
| elem x delims = [[]] ++ split delims xs
|
||||
| otherwise = addFirst (split delims xs) x
|
||||
|
||||
splitInput :: String -> [Integer]
|
||||
splitInput = map read . split "\n"
|
||||
|
||||
evolve :: Integer -> Integer
|
||||
evolve x = c
|
||||
where a = ((x*64) `xor` x) `mod` 16777216
|
||||
b = ((a `div` 32) `xor` a) `mod` 16777216
|
||||
c = ((b*2048) `xor` b) `mod` 16777216
|
||||
|
||||
memoEvolve = memoize evolve
|
||||
|
||||
firstNumbers :: Int -> Integer -> [Integer]
|
||||
firstNumbers 0 _ = []
|
||||
firstNumbers n x = x : (firstNumbers (n-1) (memoEvolve x))
|
||||
|
||||
prices :: Integer -> [Integer]
|
||||
prices = map (`mod` 10) . firstNumbers 2000
|
||||
|
||||
patterns :: Num a => [a] -> [(a, (a, a, a, a))]
|
||||
patterns (a:b:c:d:e:xs) = (e, (b-a, c-b, d-c, e-d)) : (patterns (b:c:d:e:xs))
|
||||
patterns _ = []
|
||||
|
||||
sellPrice :: Eq a => (a, a, a, a) -> [(b, (a, a, a, a))] -> Maybe b
|
||||
sellPrice _ [] = Nothing
|
||||
sellPrice pattern ((a, x):xs)
|
||||
| pattern == x = Just a
|
||||
| otherwise = sellPrice pattern xs
|
||||
|
||||
solve1 :: [Integer] -> Integer
|
||||
solve1 = sum . withStrategy (parListChunk 64 rdeepseq) . map (last . firstNumbers 2000)
|
||||
|
||||
mapPar :: NFData b => Int -> (a -> b) -> [a] -> [b]
|
||||
mapPar n f xs = (map f xs) `using` parListChunk n rdeepseq
|
||||
|
||||
solve2 :: [Integer] -> Integer
|
||||
solve2 inits = foldl (\a b -> if a > b then a else b) 0 $ mapPar 64 (\p -> sum $ mapPar 128 (\h -> case (sellPrice p h) of
|
||||
Nothing -> 0
|
||||
Just x -> x
|
||||
) hists) ps
|
||||
where hists = map (patterns . prices) inits
|
||||
|
||||
test = \x -> (x <= 9) && (-9 <= x)
|
||||
|
||||
ps = [(a, b, c, d) | a <- xs, b <- xs, c <- xs, d <- xs, test (a+b), test (b+c), test (c+d), test (a+d), test (a+b+c), test (b+c+d), test (a+b+c+d)]
|
||||
where xs = [-9..9]
|
||||
|
||||
main :: IO()
|
||||
main = do
|
||||
fileinp <- readFile "input.txt"
|
||||
let parsed = splitInput fileinp
|
||||
let solved1 = solve1 parsed
|
||||
let solved2 = solve2 parsed
|
||||
print solved1
|
||||
print solved2
|
||||
Loading…
Add table
Add a link
Reference in a new issue