2016-12-18 Advent of Code in Javascript
Today I’m going for Javascript. Advent of Code, day 9, here I come. I’m going to run the code on the command line using node.
Advent of Code
node
Part 1: Process a string containing instructions such as (AxB) where A and B are integers saying to repeat the next A characters B times. What’s the length of the expanded string? The expansions are not processed. Examples given:
ADVENT → 6
A(1x5)BC → ABBBBBC → 7
(6x1)(1x3)A → (1x3)A → 6
Part 2: Same thing, but now expansions *are* processed.
X(8x2)(3x3)ABCY → XABCABCABCABCABCABCY → 20
Part 1 was more or less simple, but as you can see I needed a lot of console output to get my off-by-one errors under control and it also took me quite some time to find the `6 + "1" → 61` error.
When I saw the input provided I decided not to worry about the “ignore whitespace” section of the puzzle.
process.stdin.setEncoding('utf8');
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
});
const assert = require('assert');
function process_line (line) {
line = line.replace(/\s+/, "");
// console.log("01234567890123456789");
var i = 0;
while (i < line.length) {
if (line[i] === '(') {
// console.log("> i=" + i);
var a = line.indexOf('x', i + 1);
// console.log("> a=" + a);
assert(a > i, 'did not find "x"');
var l = parseInt(line.slice(i+1, a));
// console.log("> l=" + l);
var b = line.indexOf(')', a + 1);
// console.log("> b=" + b);
assert(b > a + 1, 'did not find ")"');
var t = parseInt(line.slice(a+1, b));
// console.log("> t=" + t);
var chunk = line.substr(b + 1, l);
// console.log("> chunk=" + chunk);
line = line.substr(0, i)
+ chunk.repeat(t)
+ line.substr(b + 1 + l);
// console.log("> line=" + line);
i = i - 1 + t * l;
// console.log("> i=" + i);
} else {
i += 1;
}
}
console.log("> " + line + " (" + line.length + ")");
}
function process_input () {
rl.on('line', (input) => process_line(input));
}
process_input();
Part 2 surprised me because the recursive expansions make my previous approach untenable. I waited for a minute or two and aborted it. So now I can’t just build representations of the intermediate strings.
process.stdin.setEncoding('utf8');
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
});
const assert = require('assert');
function process_line (line) {
line = line.replace(/\s+/, "");
// console.log("01234567890123456789");
var i = 0;
var c = 0;
while (i < line.length) {
if (line[i] === '(') {
// console.log("> i=" + i);
var a = line.indexOf('x', i + 1);
// console.log("> a=" + a);
// assert(a > i, 'did not find "x"');
var l = parseInt(line.slice(i+1, a));
// console.log("> l=" + l);
var b = line.indexOf(')', a + 1);
// console.log("> b=" + b);
// assert(b > a + 1, 'did not find ")"');
var t = parseInt(line.slice(a+1, b));
// console.log("> t=" + t);
var chunk = line.substr(b + 1, l);
// console.log("> chunk=" + chunk);
c += t * process_line(chunk);
line = line.substr(b + 1 + l);
// console.log("> line=" + line);
i = 0;
// console.log("> i=" + i);
} else {
i += 1;
c += 1;
}
}
return c;
}
function process_input () {
rl.on('line', (input) => console.log("> " + process_line(input)));
}
process_input();
​#Javascript ​#Advent of Code ​#Programming