dat10
parent
96cf504c7a
commit
b7367da63b
@ -0,0 +1,146 @@
|
|||||||
|
addx 15
|
||||||
|
addx -11
|
||||||
|
addx 6
|
||||||
|
addx -3
|
||||||
|
addx 5
|
||||||
|
addx -1
|
||||||
|
addx -8
|
||||||
|
addx 13
|
||||||
|
addx 4
|
||||||
|
noop
|
||||||
|
addx -1
|
||||||
|
addx 5
|
||||||
|
addx -1
|
||||||
|
addx 5
|
||||||
|
addx -1
|
||||||
|
addx 5
|
||||||
|
addx -1
|
||||||
|
addx 5
|
||||||
|
addx -1
|
||||||
|
addx -35
|
||||||
|
addx 1
|
||||||
|
addx 24
|
||||||
|
addx -19
|
||||||
|
addx 1
|
||||||
|
addx 16
|
||||||
|
addx -11
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 21
|
||||||
|
addx -15
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx -3
|
||||||
|
addx 9
|
||||||
|
addx 1
|
||||||
|
addx -3
|
||||||
|
addx 8
|
||||||
|
addx 1
|
||||||
|
addx 5
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx -36
|
||||||
|
noop
|
||||||
|
addx 1
|
||||||
|
addx 7
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 2
|
||||||
|
addx 6
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 7
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
addx -13
|
||||||
|
addx 13
|
||||||
|
addx 7
|
||||||
|
noop
|
||||||
|
addx 1
|
||||||
|
addx -33
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 2
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 8
|
||||||
|
noop
|
||||||
|
addx -1
|
||||||
|
addx 2
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
addx 17
|
||||||
|
addx -9
|
||||||
|
addx 1
|
||||||
|
addx 1
|
||||||
|
addx -3
|
||||||
|
addx 11
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx -13
|
||||||
|
addx -19
|
||||||
|
addx 1
|
||||||
|
addx 3
|
||||||
|
addx 26
|
||||||
|
addx -30
|
||||||
|
addx 12
|
||||||
|
addx -1
|
||||||
|
addx 3
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx -9
|
||||||
|
addx 18
|
||||||
|
addx 1
|
||||||
|
addx 2
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 9
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx -1
|
||||||
|
addx 2
|
||||||
|
addx -37
|
||||||
|
addx 1
|
||||||
|
addx 3
|
||||||
|
noop
|
||||||
|
addx 15
|
||||||
|
addx -21
|
||||||
|
addx 22
|
||||||
|
addx -6
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
addx 2
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
addx -10
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 20
|
||||||
|
addx 1
|
||||||
|
addx 2
|
||||||
|
addx 2
|
||||||
|
addx -6
|
||||||
|
addx -11
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
@ -0,0 +1,145 @@
|
|||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 5
|
||||||
|
addx 21
|
||||||
|
addx -16
|
||||||
|
noop
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 4
|
||||||
|
addx 1
|
||||||
|
addx 4
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
addx 4
|
||||||
|
addx -9
|
||||||
|
noop
|
||||||
|
addx 19
|
||||||
|
addx -5
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 5
|
||||||
|
addx 1
|
||||||
|
addx -38
|
||||||
|
addx 5
|
||||||
|
addx -2
|
||||||
|
addx 2
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 7
|
||||||
|
addx 9
|
||||||
|
addx 20
|
||||||
|
addx -3
|
||||||
|
addx -18
|
||||||
|
addx 2
|
||||||
|
addx 5
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx -2
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 7
|
||||||
|
addx 3
|
||||||
|
addx -2
|
||||||
|
addx 2
|
||||||
|
addx -28
|
||||||
|
addx -7
|
||||||
|
addx 5
|
||||||
|
noop
|
||||||
|
addx 2
|
||||||
|
addx 32
|
||||||
|
addx -27
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 7
|
||||||
|
noop
|
||||||
|
addx 22
|
||||||
|
addx -19
|
||||||
|
noop
|
||||||
|
addx 5
|
||||||
|
noop
|
||||||
|
addx -7
|
||||||
|
addx 17
|
||||||
|
addx -7
|
||||||
|
noop
|
||||||
|
addx -20
|
||||||
|
addx 27
|
||||||
|
noop
|
||||||
|
addx -16
|
||||||
|
addx -20
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
addx 3
|
||||||
|
addx 15
|
||||||
|
addx -8
|
||||||
|
addx -2
|
||||||
|
addx -6
|
||||||
|
addx 14
|
||||||
|
addx 4
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx -17
|
||||||
|
addx 22
|
||||||
|
noop
|
||||||
|
addx 5
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 2
|
||||||
|
noop
|
||||||
|
addx 3
|
||||||
|
addx -32
|
||||||
|
addx -5
|
||||||
|
noop
|
||||||
|
addx 4
|
||||||
|
addx 3
|
||||||
|
addx -2
|
||||||
|
addx 34
|
||||||
|
addx -27
|
||||||
|
addx 5
|
||||||
|
addx 16
|
||||||
|
addx -18
|
||||||
|
addx 7
|
||||||
|
noop
|
||||||
|
addx -2
|
||||||
|
addx -1
|
||||||
|
addx 8
|
||||||
|
addx 14
|
||||||
|
addx -9
|
||||||
|
noop
|
||||||
|
addx -15
|
||||||
|
addx 16
|
||||||
|
addx 2
|
||||||
|
addx -35
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 3
|
||||||
|
addx 4
|
||||||
|
noop
|
||||||
|
addx 1
|
||||||
|
addx 4
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
addx 4
|
||||||
|
addx 2
|
||||||
|
addx 3
|
||||||
|
addx -5
|
||||||
|
addx 19
|
||||||
|
addx -9
|
||||||
|
addx 2
|
||||||
|
addx 4
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 3
|
||||||
|
addx 2
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
@ -0,0 +1,58 @@
|
|||||||
|
module Day10Lib
|
||||||
|
( --
|
||||||
|
processInput1,
|
||||||
|
processInput2,
|
||||||
|
)
|
||||||
|
where
|
||||||
|
|
||||||
|
import Data.List
|
||||||
|
import Data.List.Split
|
||||||
|
import Debug.Trace
|
||||||
|
|
||||||
|
newtype CPU = CPU (Int, Int) deriving (Show, Eq)
|
||||||
|
|
||||||
|
data Instruction = AddX Int | Noop deriving (Show, Eq)
|
||||||
|
|
||||||
|
processInstruction :: Instruction -> CPU -> CPU
|
||||||
|
processInstruction (AddX n) (CPU (a, c)) = CPU (a + n, c + 2)
|
||||||
|
processInstruction Noop (CPU (a, c)) = CPU (a, c + 1)
|
||||||
|
|
||||||
|
parseInstruction :: String -> Instruction
|
||||||
|
parseInstruction ins = case words ins of
|
||||||
|
["addx", ns] -> AddX (read ns)
|
||||||
|
["noop"] -> Noop
|
||||||
|
_ -> error $ "illegal instruction: " ++ ins
|
||||||
|
|
||||||
|
every :: Int -> [a] -> [a]
|
||||||
|
every n xs = case drop (n - 1) xs of
|
||||||
|
y : ys -> y : every n ys
|
||||||
|
[] -> []
|
||||||
|
|
||||||
|
-- ####################
|
||||||
|
|
||||||
|
processLine :: (CPU, [Int]) -> String -> (CPU, [Int])
|
||||||
|
processLine (cpu@(CPU (a, _)), hist) inss =
|
||||||
|
let ins = parseInstruction inss
|
||||||
|
newcpu = processInstruction ins cpu
|
||||||
|
in (newcpu, hist ++ replicate (if ins == Noop then 1 else 2) a)
|
||||||
|
|
||||||
|
-- ####################
|
||||||
|
|
||||||
|
processInput1 :: String -> Int
|
||||||
|
processInput1 =
|
||||||
|
sum
|
||||||
|
. zipWith (*) [20, 60 ..]
|
||||||
|
. every 40
|
||||||
|
. (++) (replicate 20 0)
|
||||||
|
. snd
|
||||||
|
. foldl processLine (CPU (1, 0), [])
|
||||||
|
. lines
|
||||||
|
|
||||||
|
processInput2 :: String -> String
|
||||||
|
processInput2 =
|
||||||
|
intercalate "\n"
|
||||||
|
. map (zipWith (\x y -> if abs ((y + 1) - x) <= 1 then '#' else '.') [1 ..])
|
||||||
|
. chunksOf 40
|
||||||
|
. snd
|
||||||
|
. foldl processLine (CPU (1, 0), [])
|
||||||
|
. lines
|
@ -0,0 +1,55 @@
|
|||||||
|
import Day10Lib (processInput1, processInput2)
|
||||||
|
import System.IO
|
||||||
|
import Test.HUnit
|
||||||
|
|
||||||
|
testCases1 =
|
||||||
|
[ ("data/input100.txt", 13140),
|
||||||
|
("data/input101.txt", 17020)
|
||||||
|
]
|
||||||
|
|
||||||
|
testCase1 (file, result) = do
|
||||||
|
withFile
|
||||||
|
file
|
||||||
|
ReadMode
|
||||||
|
( \handle -> do
|
||||||
|
contents <- hGetContents handle
|
||||||
|
assertEqual "input test" result $ processInput1 contents
|
||||||
|
)
|
||||||
|
|
||||||
|
testCases2 =
|
||||||
|
[ ( "data/input100.txt",
|
||||||
|
"##..##..##..##..##..##..##..##..##..##..\n\
|
||||||
|
\###...###...###...###...###...###...###.\n\
|
||||||
|
\####....####....####....####....####....\n\
|
||||||
|
\#####.....#####.....#####.....#####.....\n\
|
||||||
|
\######......######......######......####\n\
|
||||||
|
\#######.......#######.......#######....."
|
||||||
|
),
|
||||||
|
( "data/input101.txt",
|
||||||
|
"###..#....####.####.####.#.....##..####.\n\
|
||||||
|
\#..#.#....#.......#.#....#....#..#.#....\n\
|
||||||
|
\#..#.#....###....#..###..#....#....###..\n\
|
||||||
|
\###..#....#.....#...#....#....#.##.#....\n\
|
||||||
|
\#.#..#....#....#....#....#....#..#.#....\n\
|
||||||
|
\#..#.####.####.####.#....####..###.####." -- RLEZFLGE
|
||||||
|
)
|
||||||
|
]
|
||||||
|
|
||||||
|
testCase2 (file, result) = do
|
||||||
|
withFile
|
||||||
|
file
|
||||||
|
ReadMode
|
||||||
|
( \handle -> do
|
||||||
|
contents <- hGetContents handle
|
||||||
|
assertEqual ("input test: " ++ file) result $ processInput2 contents
|
||||||
|
)
|
||||||
|
|
||||||
|
tests =
|
||||||
|
TestList $
|
||||||
|
[TestCase (testCase1 c) | c <- testCases1]
|
||||||
|
++ [TestCase (testCase2 c) | c <- testCases2]
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = do
|
||||||
|
runTestTT tests
|
||||||
|
return ()
|
Loading…
Reference in New Issue