From b0f61a78e17192809ee9da1283426b36fe0e0c53 Mon Sep 17 00:00:00 2001 From: Arranun Date: Thu, 5 Dec 2019 20:56:16 +0100 Subject: [PATCH] Temporary state for review --- day5.hs | 89 ++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 62 insertions(+), 27 deletions(-) diff --git a/day5.hs b/day5.hs index e3c6f92..d54e5ea 100644 --- a/day5.hs +++ b/day5.hs @@ -1,4 +1,5 @@ import Data.List.Split +import Data.Char as Char main = do let state = [3,0,4,0,99] @@ -32,36 +33,70 @@ compute (op:x:y:z:_) state index input output= operation :: [Int] -> [Int] -> Int -> [Int] -> [Int] -> [Int] operation (99:_) state index input output = - output -operation (1:x:y:z:_) state index input output = - operation (drop newindex state) newstate newindex input output - where - sum = (state !! x) + (state !! y) - split = splitAt z state - newstate = (fst split) ++ [sum] ++ (drop 1(snd split)) - newindex = index + 4 -operation (2:x:y:z:_) state index input output = - operation (drop newindex state) newstate newindex input output - where - sum = (state !! x) * (state !! y) - split = splitAt z state - newstate = (fst split) ++ [sum] ++ (drop 1 (snd split)) - newindex = index + 4 -operation (3:z:_) state index input output= - operation (drop newindex state) newstate newindex newinput output - where - split = splitAt z state - newstate = insert state (head input) z - newinput = drop 1 input - newindex = index + 2 -operation (4:z:_) state index input output= - operation (drop newindex state) state newindex input newoutput - where - newoutput = output ++ [(state !! z)] - newindex = index + 2 + output +operation (op:x:y:z:_) state index input output + | last (digits op) == 1 = + operation (drop newindex state) newstate newindex input output + where + newindex = index + 4 + newstate = add (fillup (revertdigs op) 5) x y z state + | last (digits op) == 2 = + operation (drop newindex state) newstate newindex input output + where + newindex = index + 4 + newstate = mult (fillup (revertdigs op) 5) x y z state + | last (digits op) == 3 = + operation (drop newindex state) newstate newindex newinput output + where + newindex = index + 2 + newstate = input (fillup (revertdigs op) 3) x (head input) state + newinput = drop 1 input + | last (digits op) == 4 = + operation (drop newindex state) state newindex input newoutput + where + newindex = index + 2 + newoutput = log (fillup (revertdigs op) 3) ouput x state + newinput = drop 1 input + + +add :: [Int] -> Int -> Int -> Int -> [Int] -> [Int] +add (op1:op2:m1:m2:m3) p1 p2 p3 state = + insert state sum index + where + sum = (getValue m1 p1 ) + (getValue m2 p2) + index = getValue m3 p3 + +mult :: [Int] -> Int -> Int -> Int -> [Int] -> [Int] +mult (op1:op2:m1:m2:m3) p1 p2 p3 state = + insert state sum index + where + sum = (getValue m1 p1 ) * (getValue m2 p2) + index = getValue m3 p3 + +input :: [Int] -> Int -> Int -> [Int] -> [Int] +input(op1:op2:m1) p1 input state = + insert state input (getValue m1 p1) + +log :: [Int] -> [Int] -> Int -> [Int] -> [Int] +log (op1:op2:m1) output p1 state = + output ++ [(state !! (getValue m1 p1))] insert :: [Int] -> Int -> Int -> [Int] insert xs value index = do let split = splitAt index xs (fst split)++ [value] ++ (drop 1 (snd split)) +digits :: Int -> [Int] +digits = map Char.digitToInt . show + +revertdigs :: Int -> [Int] +digs 0 = [] +digs x = x `mod` 10 : digs (x `div` 10) + +fillup :: [Int] -> Int -> [Int] +fillup array x = x ++ (replicate (x - (length array)) 0) + +getValue :: Int -> Int -> [Int] -> Int +getValue 0 index array = array !! index +getValue 1 index array = index +