-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday2.hs
36 lines (23 loc) · 1.38 KB
/
day2.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
--- day 2
intCode :: [Int]
intCode = [1,0,0,3,1,1,2,3,1,3,4,3,1,5,0,3,2,13,1,19,1,9,19,23,2,23,13,27,1,27,9,31,2,31,6,35,1,5,35,39,1,10,39,43,2,43,6,47,1,10,47,51,2,6,51,55,1,5,55,59,1,59,9,63,1,13,63,67,2,6,67,71,1,5,71,75,2,6,75,79,2,79,6,83,1,13,83,87,1,9,87,91,1,9,91,95,1,5,95,99,1,5,99,103,2,13,103,107,1,6,107,111,1,9,111,115,2,6,115,119,1,13,119,123,1,123,6,127,1,127,5,131,2,10,131,135,2,135,10,139,1,13,139,143,1,10,143,147,1,2,147,151,1,6,151,0,99,2,14,0,0]
testCode = [1,0,0,3,99]
testCode2 = [1,9,10,3,2,3,11,0,99,30,40,50]
part1Code = writeTo (writeTo intCode 2 2) 12 1
exec state
| getNextOp state == 1 = exec (add state, incrementIP state)
| getNextOp state == 2 = exec (mult state, incrementIP state)
| getNextOp state == 99 = state
-- Basic ops:
writeTo prog x n = (take n prog) ++ [x] ++ (drop (n+1) prog)
getNextOp (prog, n) = dreff prog n
incrementIP ( _ , n) = n + 4
doubleDreff prog n = prog !! (prog !! n)
dreff prog n = prog !! n
-- math ops:
operationN4 (prog, n) op = writeTo prog ((doubleDreff prog (n+1)) `op` (doubleDreff prog (n+2))) (dreff prog (n+3))
add state = operationN4 state (+)
mult state = operationN4 state (*)
------ Part 2
gravityIntCode noun verb = writeTo (writeTo intCode verb 2) noun 1
getTheJobDone = [(exec (gravityIntCode noun verb, 0)) | noun <- [0..99], verb <- [0..99], (fst (exec (gravityIntCode noun verb, 0))) !! 0 == 19690720]