Published
Edited
Dec 8, 2019
2 forks
1 star
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
md`The largest thrust signal is **${answer(puzzleInput)}**.`
Insert cell
answer = function (prog) {
let phases = 0, phaseArray, out=[];
let phaseMax = Number.parseInt('44444', 5);
let maxSignal = -1e99, endSignal;
for (phases = 0; phases <= phaseMax; phases++) {
phaseArray = phases.toString(5).padStart(5, 0).split('').map(Number);
if ( phaseArray.some( (v,i,a) => a.slice(i+1).includes(v)) ) continue
endSignal = signal(prog, phaseArray).slice(-1)[0];
maxSignal = Math.max(maxSignal, endSignal.value);
//out.push(phaseArray.join(',')+":"+endSignal.value);
}
return maxSignal
}
Insert cell
test1='3,15,3,16,1002,16,10,16,1,16,15,15,4,15,99,0,0'
Insert cell
signal(test1,[4,3,2,1,0])
Insert cell
test2 = '3,23,3,24,1002,24,10,24,1002,23,-1,23,101,5,23,23,1,24,23,23,4,23,99,0,0'
Insert cell
signal(test2,[0,1,2,3,4])
Insert cell
answer(test2)
Insert cell
signal = function (acs = puzzleInput, phases = [0,1,2,3,4]) {
let ampN = phases.length, amp, out, logs=[];
let program = acs.split(',');
let input = input1;
for (amp = 0; amp < ampN; amp++) {
out = intcomp(program, phases[amp], input);
input = out.value;
logs.push(out);
}
return logs
}
Insert cell
function intcomp (program, phase, input = 0, pc = 0) {
let outputLog = [];
let inputs = [input];
if (pc == 0) inputs.push(phase); // better have explicit init option
let mem = program.map(Number);
let op, opcode, modes, x, p1, p2, p3, output, i, step, ampOut, wait = false;
for (i = pc; i < program.length; i += step) {
op = mem[i].toString().padStart(6, 0);
output = i.toString().padStart(4, 0) + ": " + op + " ";
opcode = op.slice(-2);
modes = op.slice(0, -2).split('').reverse();
if ( !modes.every( m => m == '0' || m == '1' ) )
{
outputLog.push (output + 'unknown mode: ' + modes);
break;
}
if (opcode == '99') break
p1 = modes[0] == '0' ? mem[mem[i+1]] : mem[i+1];
p2 = modes[1] == '0' ? mem[mem[i+2]] : mem[i+2];
p3 = modes[2] == '1' ? mem[mem[i+3]] : mem[i+3];
step = 4;
switch (opcode) {
case '01':
mem[p3] = p1 + p2;
output += [p1, p2, p3, mem[p3]].join();
break;
case '02':
mem[p3] = p1 * p2;
output += [p1, p2, p3, mem[p3]].join();
break;
case '03': //input
if (inputs.length == 0) { wait = true; break }; //wait for next input
step = 2;
mem[mem[i+1]] = inputs.pop();
output += 'input ' + mem[mem[i+1]]; // ignore mode
break;
case '04': //output
step = 2;
output += (p1 != 0 ? "### " : "ok! ") + 'output: ' + p1;
ampOut = p1;
break;
case '05':
step = 3;
if (p1 != 0) { i = p2 - step; }
output += 'jumpT ' + (i + step);
break;
case '06':
step = 3;
if (p1 == 0) { i = p2 - step; }
output += 'jumpF ' + (i + step);
break;
case '07':
x = 0;
if (p1 < p2) { x = 1 }
mem[p3] = x;
output += 'less ' + x;
break;
case '08':
x = 0;
if (p1 == p2) { x = 1 }
mem[p3] = x;
output += 'eq ' + x;
break;
default:
output += 'unknown opcode: ' + opcode;
break;
}
if (wait) break;
outputLog.push(output);
}
return {log: outputLog, value: ampOut, opcode: opcode, mem: mem, pc: i}
}
Insert cell
Insert cell
Insert cell
answer2 = function (prog) {
let phases = 0, phaseArray, out=[];
let phaseMax = Number.parseInt('44444', 5);
let maxSignal = -1e99, endSignal;
for (phases = 0; phases <= phaseMax; phases++) {
phaseArray = phases.toString(5).padStart(5, 0).split('').map( v => Number(v) + 5 );
if ( phaseArray.some( (v,i,a) => a.slice(i+1).includes(v)) ) continue
endSignal = signal2(prog, phaseArray).slice(-1)[0];
maxSignal = Math.max(maxSignal, endSignal.value);
// maxSignal//out.push(phaseArray.join(',')+":"+endSignal.value);
}
return maxSignal
}
Insert cell
signal2 = function (acs = puzzleInput, phases = [0,1,2,3,4]) {
let ampN = phases.length, amp, out, logs=[];
let program = Array(ampN).fill(acs.split(','));
let pc = Array(ampN).fill(0);
let input = input1;
let loops = 10000;
while (loops--) {
for (amp = 0; amp < ampN; amp++) {
out = intcomp(program[amp], phases[amp], input, pc[amp]);
input = out.value;
program[amp] = out.mem;
pc[amp] = out.pc;
logs.push(out);
}
if (out.opcode == '99') { return logs }
}
return 'no halt after 10000 loops'
}
Insert cell
test3='3,26,1001,26,-4,26,3,27,1002,27,2,27,1,27,26,27,4,27,1001,28,-1,28,1005,28,6,99,0,0,5'
Insert cell
signal2(test3,[9,8,7,6,5])
Insert cell
answer2(test3)

Insert cell
test4 = '3,52,1001,52,-5,52,3,53,1,52,56,54,1007,54,5,55,1005,55,26,1001,54,-5,54,1105,1,12,1,53,54,53,1008,54,0,55,1001,55,1,55,2,53,55,53,4,53,1001,56,-1,56,1005,56,6,99,0,0,0,0,10'
Insert cell
answer2(test4)
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more