You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
35 lines
1.1 KiB
35 lines
1.1 KiB
import Data.List.Split |
|
|
|
main = do |
|
content <- getList <$> getContents |
|
let input = changeInput content 12 2 |
|
putStrLn (show (compute input input 0)) |
|
putStrLn (show (part2 content)) |
|
|
|
getList :: String -> [Int] |
|
getList = map read . splitOn "," |
|
|
|
changeInput :: [Int] -> Int -> Int -> [Int] |
|
changeInput (begin:_:_:input) input1 input2= [begin] ++ [input1] ++ [input2] ++ input |
|
|
|
func :: [Int] -> Int -> Int -> Int |
|
func xs x y = do |
|
let input = changeInput xs x y |
|
head (compute input input 0) |
|
|
|
compute :: [Int] -> [Int] -> Int -> [Int] |
|
compute (99:_) state index = state |
|
compute (op:x:y:z:_) state index = |
|
compute (drop newindex state) newstate newindex |
|
where |
|
sum = if op == 1 then |
|
(state !! x) + (state !! y) |
|
else |
|
(state !! x) * (state !! y) |
|
split = splitAt z state |
|
newstate = (fst split) ++ [sum] ++ (drop 1 (snd split)) |
|
newindex = index + 4 |
|
|
|
part2 input = [ (i,j) | i <- [1..99], |
|
j <- [1..99], |
|
func input i j == 19690720 ]
|
|
|