Created
December 3, 2019 18:41
-
-
Save DevinClark/a89c39c1632c32ae06dfdaf6c6672860 to your computer and use it in GitHub Desktop.
Advent of Code
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const { deepStrictEqual } = require('assert'); | |
const fs = require('fs'); | |
const ADDITION = 1; | |
const MULTIPLCATION = 2; | |
const EOF = 99; | |
const DEBUG = false; | |
function executeProgram(input) { | |
const program = input.split(',').map((v) => parseInt(v)); | |
var pointer = 0; | |
DEBUG && console.log('program', program); | |
while(pointer < program.length) { | |
const pointerValue = program[pointer]; | |
let outputPointer = program[pointer + 3]; | |
switch(pointerValue) { | |
case ADDITION: | |
program[outputPointer] = add(program, pointer); | |
pointer += 4; | |
break; | |
case MULTIPLCATION: | |
program[outputPointer] = multiply(program, pointer); | |
pointer += 4; | |
break; | |
case EOF: | |
return program.join(','); | |
default: | |
throw new Error('Unknown instruction. ' + pointerValue); | |
} | |
} | |
return input; | |
} | |
function add(program, pointer) { | |
DEBUG && console.log('add', program, pointer); | |
let aPointer = program[pointer + 1]; | |
let bPointer = program[pointer + 2]; | |
DEBUG && console.log(program[aPointer], ' + ', program[bPointer]); | |
return program[aPointer] + program[bPointer]; | |
} | |
function multiply(program, pointer) { | |
DEBUG && console.log('multiply', program, pointer); | |
let aPointer = program[pointer + 1]; | |
let bPointer = program[pointer + 2]; | |
DEBUG && console.log(program[aPointer], ' * ', program[bPointer]); | |
return program[aPointer] * program[bPointer]; | |
} | |
console.log('executeProgram Tests'); | |
deepStrictEqual(executeProgram('1,0,0,0,99'), '2,0,0,0,99'); | |
deepStrictEqual(executeProgram('2,3,0,3,99'), '2,3,0,6,99'); | |
deepStrictEqual(executeProgram('2,4,4,5,99,0'), '2,4,4,5,99,9801'); | |
deepStrictEqual(executeProgram('1,1,1,4,99,5,6,0,99'), '30,1,1,4,2,5,6,0,99'); | |
deepStrictEqual(executeProgram('1,9,10,3,2,3,11,0,99,30,40,50'), '3500,9,10,70,2,3,11,0,99,30,40,50'); | |
// Part 2 | |
const input = fs.readFileSync('./input.txt', 'utf8'); | |
function findCorrectProgram() { | |
for (var noun = 0; noun <= 99; noun++) { | |
for(var verb = 0; verb <= 99; verb++) { | |
var p = input.split(','); | |
p[1] = noun; | |
p[2] = verb; | |
var output = executeProgram(p.join(',')).split(','); | |
if (output[0] === '19690720') { | |
console.log(100 * noun + verb); | |
console.log('Matched Program', output.join(',')); | |
} | |
} | |
} | |
} | |
findCorrectProgram(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment