day 10 (ft. readme amendment. thanks day 10)
This commit is contained in:
parent
6a31e36b72
commit
6b1ab660ac
|
@ -0,0 +1,29 @@
|
||||||
|
data Instruction = Add Int | Noop
|
||||||
|
deriving (Eq, Show)
|
||||||
|
|
||||||
|
getCyclesAt = [20, 60 .. 220]
|
||||||
|
|
||||||
|
parseInstruction :: String -> Instruction
|
||||||
|
parseInstruction s = case head split of
|
||||||
|
"addx" -> Add (read $ split !! 1)
|
||||||
|
"noop" -> Noop
|
||||||
|
instr -> error $ "unknown instruction " ++ instr
|
||||||
|
where split = words s
|
||||||
|
|
||||||
|
parse :: String -> [Instruction]
|
||||||
|
parse = map parseInstruction . lines
|
||||||
|
|
||||||
|
executeProgram :: [Instruction] -> [Int]
|
||||||
|
executeProgram = concat . scanl exec [1]
|
||||||
|
where exec :: [Int] -> Instruction -> [Int]
|
||||||
|
exec xs instr = case instr of
|
||||||
|
(Add y) -> [x, x + y]
|
||||||
|
Noop -> [x]
|
||||||
|
where x = last xs
|
||||||
|
|
||||||
|
main = interact $
|
||||||
|
show
|
||||||
|
. sum
|
||||||
|
. (\cycles -> map (\i -> i * cycles !! (i-1)) getCyclesAt)
|
||||||
|
. executeProgram
|
||||||
|
. parse
|
|
@ -0,0 +1,39 @@
|
||||||
|
import GHC.Utils.Misc (chunkList)
|
||||||
|
|
||||||
|
data Instruction = Add Int | Noop
|
||||||
|
deriving (Eq, Show)
|
||||||
|
|
||||||
|
crtWidth = 40
|
||||||
|
crtHeight = 6
|
||||||
|
|
||||||
|
parseInstruction :: String -> Instruction
|
||||||
|
parseInstruction s = case head split of
|
||||||
|
"addx" -> Add (read $ split !! 1)
|
||||||
|
"noop" -> Noop
|
||||||
|
instr -> error $ "unknown instruction " ++ instr
|
||||||
|
where split = words s
|
||||||
|
|
||||||
|
parse :: String -> [Instruction]
|
||||||
|
parse = map parseInstruction . lines
|
||||||
|
|
||||||
|
executeProgram :: [Instruction] -> [Int]
|
||||||
|
executeProgram = concat . scanl exec [1]
|
||||||
|
where exec :: [Int] -> Instruction -> [Int]
|
||||||
|
exec xs instr = case instr of
|
||||||
|
(Add y) -> [x, x + y]
|
||||||
|
Noop -> [x]
|
||||||
|
where x = last xs
|
||||||
|
|
||||||
|
drawScreen :: [Int] -> String
|
||||||
|
drawScreen cycles = unlines $ chunkList crtWidth $ map drawChar [0 .. (crtWidth * crtHeight - 1)]
|
||||||
|
where drawChar :: Int -> Char
|
||||||
|
drawChar i = if xDist <= 1 then '#' else '.'
|
||||||
|
where xScan = i `mod` crtWidth
|
||||||
|
xSprite = cycles !! (i)
|
||||||
|
xDist = abs (xScan - xSprite)
|
||||||
|
|
||||||
|
main = interact $
|
||||||
|
(++ "\ni hope it is understandable for this to be an exception to the \"program must output something that's copypastable into aoc's output field\" rule that i've set for myself. read!!!!\n")
|
||||||
|
. drawScreen
|
||||||
|
. executeProgram
|
||||||
|
. parse
|
|
@ -10,4 +10,4 @@ you shouldn't; but for documentation purposes it's
|
||||||
$ ghc 1-a.hs && cat 1_input | ./1-a
|
$ ghc 1-a.hs && cat 1_input | ./1-a
|
||||||
```
|
```
|
||||||
|
|
||||||
you'll need to retrieve `1_input` from your aoc, but all programs will strictly take in the aoc input and output what can be pasted into the anwser field
|
you'll need to retrieve `1_input` from your aoc, but all programs will strictly take in the aoc input and ~~output what can be pasted into the anwser field~~ (thanks, day 10 part 2!)
|
Loading…
Reference in New Issue