This commit is contained in:
Arranun 2019-12-07 16:44:43 +01:00
parent 576761c82c
commit 8878956046

42
day7.hs
View File

@ -36,10 +36,10 @@ prepareAmps (p1:p2:p3:p4:p5:_) software = do
part2 :: [Amplifier] -> Int
part2 amps = do
let ampA = link (amps!!4) (amps!!0)
let ampB = link (amps!!0) (amps!!1)
let ampC = link (amps!!1) (amps!!2)
let ampD = link (amps!!2) (amps!!3)
let ampE = link (amps!!3) (amps!!4)
let ampB = link (ampA) (amps!!1)
let ampC = link (ampB) (amps!!2)
let ampD = link (ampC) (amps!!3)
let ampE = link (ampD) (amps!!4)
if state ampE == [88]
then head (output (amps!!4))
else part2 [ampA,ampB,ampC,ampD,ampE]
@ -64,40 +64,42 @@ calcthrusters software (p1:p2:p3:p4:p5:_) start = do
operation :: [Int] -> [Int] -> Int -> [Int] -> [Int] -> Amplifier
operation (99:_) state index input output =
Amplifier state index input output
operation (op:x:y:z:_) state index input output
operation (99:_) state i input output =
Amplifier state i input []
operation (op:x:y:z:_) state i input output
| last (digits op) == 1 = do
let newindex = index + 4
let newindex = i + 4
let newstate = add (fillup (revertdigs op) 5) x y z state
operation (drop newindex newstate) newstate newindex input output
| last (digits op) == 2 = do
let newindex = index + 4
let newindex = i + 4
let newstate = mult (fillup (revertdigs op) 5) x y z state
Amplifier state newindex input output
--operation (drop newindex newstate) newstate newindex input output
operation (drop newindex newstate) newstate newindex input output
| last (digits op) == 3 = do
let newindex = index + 2
let newstate = put (fillup (revertdigs op) 3) x (head input) state
let newinput = drop 1 input
operation (drop newindex newstate) newstate newindex newinput output
if length input == 0
then Amplifier state i input output
else do
let newindex = i + 2
let newstate = put (fillup (revertdigs op) 3) x (head input) state
let newinput = drop 1 input
operation (drop newindex newstate) newstate newindex newinput output
| last (digits op) == 4 = do
let newindex = index + 2
let newindex = i + 2
let newoutput = out (fillup (revertdigs op) 3) output x state
let newinput = drop 1 input
operation (drop newindex state) state newindex input newoutput
| (last (digits op) == 5 ) = do
let newindex = jumpif (fillup (revertdigs op) 4) x y index state
let newindex = jumpif (fillup (revertdigs op) 4) x y i state
operation (drop newindex state) state newindex input output
| (last (digits op) == 6 ) = do
let newindex = jumpifnot (fillup (revertdigs op) 4) x y index state
let newindex = jumpifnot (fillup (revertdigs op) 4) x y i state
operation (drop newindex state) state newindex input output
| (last (digits op) == 7 ) = do
let newindex = index + 4
let newindex = i + 4
let newstate = lessthan (fillup (revertdigs op) 5) x y z state
operation (drop newindex newstate) newstate newindex input output
| (last (digits op) == 8 ) = do
let newindex = index + 4
let newindex = i + 4
let newstate = equal (fillup (revertdigs op) 5) x y z state
operation (drop newindex newstate) newstate newindex input output