day 10 solution 2
This commit is contained in:
parent
ebcb071e98
commit
6ee22fa9cc
4 changed files with 60 additions and 5 deletions
|
@ -103,3 +103,5 @@ day10 = do
|
||||||
putText "Day 10:"
|
putText "Day 10:"
|
||||||
let sol1 = Day10.solution1 Day10.input
|
let sol1 = Day10.solution1 Day10.input
|
||||||
showSol "Solution 1" (int sol1)
|
showSol "Solution 1" (int sol1)
|
||||||
|
input2 <- Day10.parseInput2
|
||||||
|
showSol "Solution 2" (text (toS (Day10.solution2 input2)))
|
||||||
|
|
1
inputs/day10.txt
Normal file
1
inputs/day10.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
187,254,0,81,169,219,1,190,19,102,255,56,46,32,2,216
|
48
src/Day10.hs
48
src/Day10.hs
|
@ -1,4 +1,5 @@
|
||||||
{-# LANGUAGE NoImplicitPrelude #-}
|
{-# LANGUAGE NoImplicitPrelude #-}
|
||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
{-|
|
{-|
|
||||||
description:
|
description:
|
||||||
|
|
||||||
|
@ -141,8 +142,12 @@ module Day10 where
|
||||||
|
|
||||||
import Protolude
|
import Protolude
|
||||||
|
|
||||||
|
import Data.Char (chr, ord)
|
||||||
|
import Data.List (foldl1')
|
||||||
import qualified Data.Map.Strict as Map
|
import qualified Data.Map.Strict as Map
|
||||||
|
import Numeric (showHex)
|
||||||
import Text.Parsec
|
import Text.Parsec
|
||||||
|
import qualified Data.Text as T
|
||||||
|
|
||||||
testInput :: AppState
|
testInput :: AppState
|
||||||
testInput = mkAppState 5 [3,4,1,5]
|
testInput = mkAppState 5 [3,4,1,5]
|
||||||
|
@ -155,7 +160,7 @@ mkAppState n ls = AppState [0..(n-1)] n ls 0 0
|
||||||
|
|
||||||
data AppState = AppState { lst :: [Int]
|
data AppState = AppState { lst :: [Int]
|
||||||
, lstSize :: Int
|
, lstSize :: Int
|
||||||
, lenghts :: [Int]
|
, lengths :: [Int]
|
||||||
, position :: Int
|
, position :: Int
|
||||||
, skip :: Int
|
, skip :: Int
|
||||||
} deriving (Show)
|
} deriving (Show)
|
||||||
|
@ -180,6 +185,45 @@ merge lst1 lst2 lst1Size lst2Size n =
|
||||||
|
|
||||||
solution1 :: AppState -> Int
|
solution1 :: AppState -> Int
|
||||||
solution1 appState =
|
solution1 appState =
|
||||||
if null (lenghts appState)
|
if null (lengths appState)
|
||||||
then lst appState & take 2 & foldl' (*) 1
|
then lst appState & take 2 & foldl' (*) 1
|
||||||
else solution1 (oneStep appState)
|
else solution1 (oneStep appState)
|
||||||
|
|
||||||
|
|
||||||
|
parseInput2 :: IO Text
|
||||||
|
parseInput2 = T.strip <$> readFile "inputs/day10.txt"
|
||||||
|
|
||||||
|
strToLengths :: Text -> [Int]
|
||||||
|
strToLengths = (++ [17,31,73,47,23]) . map ord . toS
|
||||||
|
|
||||||
|
oneRound :: AppState -> AppState
|
||||||
|
oneRound appState =
|
||||||
|
if null (lengths appState)
|
||||||
|
then appState
|
||||||
|
else oneRound (oneStep appState)
|
||||||
|
|
||||||
|
testInput2 :: Text
|
||||||
|
testInput2 = "1,2,3"
|
||||||
|
|
||||||
|
manyRounds :: AppState -> Int -> [Int] -> AppState
|
||||||
|
manyRounds appState 0 _ = appState
|
||||||
|
manyRounds appState nbRounds ls =
|
||||||
|
manyRounds (oneRound (appState { lengths = ls })) (nbRounds - 1) ls
|
||||||
|
|
||||||
|
chunksOf :: Int -> [a] -> [[a]]
|
||||||
|
chunksOf n [] = []
|
||||||
|
chunksOf n l = take n l:chunksOf n (drop n l)
|
||||||
|
|
||||||
|
solution2 :: Text -> [Char]
|
||||||
|
solution2 input =
|
||||||
|
let ls = strToLengths input
|
||||||
|
initAppState = mkAppState 256 ls
|
||||||
|
finalAppState = manyRounds initAppState 64 ls
|
||||||
|
sparseHash :: [Word8]
|
||||||
|
sparseHash = lst finalAppState & map fromIntegral
|
||||||
|
denseHash = map (foldl1' xor) (chunksOf 16 sparseHash)
|
||||||
|
in concatMap toHex denseHash
|
||||||
|
|
||||||
|
toHex :: Word8 -> [Char]
|
||||||
|
toHex n = let s = n `showHex` "" in
|
||||||
|
if length s < 2 then '0':s else s
|
||||||
|
|
|
@ -84,5 +84,13 @@ main = defaultMain $
|
||||||
, testGroup "Day 10"
|
, testGroup "Day 10"
|
||||||
[ testCase "example 1" $
|
[ testCase "example 1" $
|
||||||
Day10.solution1 Day10.testInput @?= 12
|
Day10.solution1 Day10.testInput @?= 12
|
||||||
|
, testCase "solution 2 empty" $
|
||||||
|
Day10.solution2 "" @?= "a2582a3a0e66e6e86e3812dcb672a272"
|
||||||
|
, testCase "solution 2 AoC 2017" $
|
||||||
|
Day10.solution2 "AoC 2017" @?= "33efeb34ea91902bb2f59c9920caa6cd"
|
||||||
|
, testCase "solution 2 1,2,3" $
|
||||||
|
Day10.solution2 "1,2,3" @?= "3efbe78a8d82f29979031a4aa0b16a9d"
|
||||||
|
, testCase "solution 2 1,2,4" $
|
||||||
|
Day10.solution2 "1,2,4" @?= "63960835bcdc130f0b66d7ff4f6a5a8e"
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
|
|
Loading…
Reference in a new issue