-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathday2.js
More file actions
135 lines (110 loc) · 3.34 KB
/
day2.js
File metadata and controls
135 lines (110 loc) · 3.34 KB
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
const fs = require('fs');
const { Transform } = require('stream');
const readPuzzleFile = './puzzles/dayTwo/puzzle1.json';
// const readPuzzleFile = './puzzles/dayTwo/puzzle1Sample.json';
const readStream = fs.createReadStream(readPuzzleFile);
let PROGRAM = [];
let NOUN = 0;
let VERB = 0;
let CODE = 19690720;
let OUTPUT = 0;
const MAX_NOUN = 99;
const MAX_VERB = 99;
function performOptCodeAction(data, optCode, position1, position2) {
let action = null;
switch (optCode) {
case 1:
action = optCode1(data[data[position1]], data[data[position2]]);
break;
case 2:
action = optCode2(data[data[position1]], data[data[position2]]);
break;
case 99:
action = haltProgram(data);
break;
default:
console.error('<--------Invalid Code----->');
action = 'error';
}
return action;
}
function optCode1(position1, position2) {
return position1 + position2;
}
function optCode2(position1, position2) {
return position1 * position2;
}
function haltProgram(program) {
return 'stop';
}
//stocks and bonds
//_ l _ _ _ ls
function getOutput() {
let result = (100 * NOUN) + VERB;
return result;
}
function restoreGravityAssistProgram(data, position1, position2, noun, verb, useNounVerb) {
if (useNounVerb) {
data[position1] = noun;
data[position2] = verb;
} else {
data[position1] = 12;
data[position2] = 2;
}
return data;
}
function runProgram(data, index, matchCode = 0) {
let optCodePosition = index;
let inputPosition1 = index + 1;
let inputPosition2 = index + 2;
let outputPosition = index + 3;
let nextIndex = index + 4;
let optCode = data[optCodePosition];
let result = performOptCodeAction(data, optCode, inputPosition1, inputPosition2);
if (result === 'stop' || result === 'error') {
if (matchCode > 0 && matchCode !== data[0]) {
return false;
} else if (matchCode > 0 && matchCode == data[0]) {
OUTPUT = getOutput();
return OUTPUT;
}
} else {
let outputData = data[outputPosition];
data[outputData] = result;
runProgram(data, nextIndex, CODE);
}
}
function initProgram(paramProg, paramCode, noun, verb) {
let data = restoreGravityAssistProgram(paramProg, 1, 2,noun, verb, true);
// console.log('InitProgram');
let result = runProgram(data, 0, paramCode);
return result;
}
const getProgram = new Transform({
transform(chunk, encoding, callback) {
PROGRAM = JSON.parse(chunk.toString());
console.log("GetProgram");
for(let i = 0; i < MAX_NOUN; i++){
for(let j = 0; j < MAX_VERB; j++) {
if(OUTPUT > 0){
console.log('Found the Answer');
console.log('Output:', OUTPUT);
break;
} else {
NOUN = i;
VERB = j;
let data = JSON.parse(JSON.stringify(PROGRAM));
initProgram(data, CODE, i, j);
}
}
if(OUTPUT > 0){
break;
}
}
callback();
}
});
readStream.pipe(getProgram);
// First Puzzle Solution: 2842648
// First puzzle output: 1202
// Second Puzzle output: 9074