/
adventOfCode2019_02.nim
77 lines (62 loc) · 2.04 KB
/
adventOfCode2019_02.nim
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import parsecsv
from streams import newFileStream
import strutils
type
tMemory = array[100000, int64]
proc memoryFromInput(aInput: string = "input"): tMemory =
var lFileStream = aInput.newFileStream(fmRead)
if lFileStream == nil:
quit("cannot open the file" & aInput)
var lCsvParser: CsvParser
lCsvParser.open(lFileStream, aInput)
var lIndex = 0
while lCsvParser.readRow:
# echo "new row: "
for val in lCsvParser.row.items:
result[lIndex] = val.parseBiggestInt
lIndex += 1
# echo "##", val, "##"
close(lCsvParser)
proc runProgram(aMemory: var tMemory): int64 =
var lInstructionPointer = 0
while true:
let lCurrentValue = aMemory[lInstructionPointer]
case lCurrentValue
of 1:
let lA = aMemory[lInstructionPointer + 1]
let lB = aMemory[lInstructionPointer + 2]
let lC = aMemory[lInstructionPointer + 3]
aMemory[lC] = (aMemory[lA] + aMemory[lB])
lInstructionPointer += 4
of 2:
let lA = aMemory[lInstructionPointer + 1]
let lB = aMemory[lInstructionPointer + 2]
let lC = aMemory[lInstructionPointer + 3]
aMemory[lC] = (aMemory[lA] * aMemory[lB])
lInstructionPointer += 4
else:
break
return aMemory[0]
proc partOne =
# var gMemory = memoryFromInput("testInput_00")
var lMemory: tMemory = memoryFromInput()
lMemory[1] = 12
lMemory[2] = 2
echo "partOne $1"%[$runProgram(lMemory)]
proc partTwo =
var lInput: tMemory = memoryFromInput()
var lNoun: int64 = 0
while (lNoun < 100):
var lVerb: int64 = 0
while (lVerb < 100):
var lMemory = lInput
lMemory[1] = lNoun
lMemory[2] = lVerb
if (19690720 == runProgram(lMemory)):
let lResult = (100 * lNoun + lVerb)
echo "partTwo $1"%[$lResult]
return
lVerb += 1
lNoun += 1
partOne() #4023471
partTwo() #8051