Merge branch '2021-10'

main
Yanick Champoux 2021-12-10 13:39:23 -05:00
commit e2e4870ccd
10 changed files with 166 additions and 54 deletions

46
2021/10/part1.mjs Normal file
View File

@ -0,0 +1,46 @@
import fs from "fs-extra";
import fp from "lodash/fp.js";
import _ from "lodash";
export const processInput = (file) => fs.readFile(file,'utf8').then(
content => content.split("\n").filter(x=>x).map(
line => line.split('')
)
);
export const closing = {
'{':'}',
'<': ">",
'(': ')',
'[': ']',
};
function firstIllegalCharacter(line) {
const stack = [];
for ( const c of line ) {
if( closing[c] ) {
stack.push(closing[c]);
} else {
if(c !== stack.pop()) return c;
}
}
return '';
}
export function solution(lines) {
const points = {
')': 3,
']': 57,
'}': 1197,
'>': 25137,
}
return _.sum(
lines.map( firstIllegalCharacter ).map(
c => points[c] || 0
)
)
}

42
2021/10/part2.mjs Normal file
View File

@ -0,0 +1,42 @@
import fs from "fs-extra";
import fp from "lodash/fp.js";
import _ from "lodash";
import * as p1 from "./part1.mjs";
function completionString(line) {
const stack = [];
for (const c of line) {
if (p1.closing[c]) {
stack.unshift(p1.closing[c]);
} else if (c !== stack.shift()) {
return;
}
}
return stack;
}
export function linesScore(lines) {
lines = lines.map(completionString).filter((x) => x);
const points = {
")": 1,
"]": 2,
"}": 3,
">": 4,
};
const lineScore = (line) => line.reduce((a, b) => 5 * a + points[b], 0);
return lines.map(lineScore);
}
export function solution(lines) {
const scores = linesScore(lines);
scores.sort((a, b) => (a < b ? -1 : 1));
return scores[(scores.length - 1) / 2];
}

10
2021/10/sample Normal file
View File

@ -0,0 +1,10 @@
[({(<(())[]>[[{[]{<()<>>
[(()[<>])]({[<{<<[]>>(
{([(<{}[<>[]}>{[]{[(<()>
(((({<>}<{<{<>}{[]{[]{}
[[<[([]))<([[{}[[()]]]
[{[{({}]{}}([{[{{{}}([]
{<[[]]>}<{[{[{[]{()[[[]
[<(<(<(<{}))><([]([]()
<{([([[(<>()){}]>(<<{{
<{([{{}}[<[[[<>{}]]]>[]]

23
2021/10/test.mjs Normal file
View File

@ -0,0 +1,23 @@
// https://adventofcode.com/2021/day/10
import tap from "tap";
import fs from "fs-extra";
import * as p1 from "./part1.mjs";
import * as p2 from "./part2.mjs";
const sample = p1.processInput('sample');
const input = p1.processInput('input');
tap.test("part1", async (t) => {
t.equal(p1.solution(await sample), 26397);
t.equal(p1.solution(await input), 311949);
});
tap.test("part2", async (t) => {
t.match(p2.linesScore(await sample), [
288957, 5566, 1480781, 995444, 294
]);
t.equal(p2.solution(await sample), 288957);
t.equal(p2.solution(await input), 3042730309);
});

View File

@ -0,0 +1,11 @@
---
to: '<%= day %>/part1.mjs'
---
import fs from "fs-extra";
import fp from "lodash/fp.js";
import _ from "lodash";
export const processInput = (input) => input;
export function solution(input) {
}

View File

@ -1,15 +0,0 @@
---
to: '<%= day %>/part1.pm'
---
package part1;
use 5.34.0;
use warnings;
use experimental 'signatures';
use List::AllUtils qw/ /;
sub solution() {
}
1;

View File

@ -0,0 +1,11 @@
---
to: '<%= day %>/part2.mjs'
---
import fs from "fs-extra";
import fp from "lodash/fp.js";
import _ from "lodash";
import * as p1 from './part1.mjs';
export function solution(input) {
}

View File

@ -1,19 +0,0 @@
---
to: '<%= day %>/part2.pm'
---
package part2;
use 5.20.0;
use warnings;
use experimental 'signatures';
use List::AllUtils qw/ /;
require './part1.pm';
use experimental qw/ signatures postderef /;
sub solution() {
}
1;

View File

@ -0,0 +1,23 @@
---
to: '<%= day %>/test.mjs'
---
// https://adventofcode.com/2021/day/<%= day %>
import tap from "tap";
import fs from "fs-extra";
import * as p1 from "./part1.mjs";
import * as p2 from "./part2.mjs";
const sample = p1.processInput('sample');
const input = p1.processInput('input');
tap.test("part1", async (t) => {
t.equal(p1.solution(await sample), 0);
// t.equal(p1.solution(await input), 0);
});
tap.test("part2", async (t) => {
// t.equal(p2.solution(await sample), 0);
// t.equal(p2.solution(await input), 0);
});

View File

@ -1,20 +0,0 @@
---
to: '<%= day %>/test.t'
---
use 5.34.0;
use Test2::V0;
use Path::Tiny;
require './part1.pm';
require './part2.pm';
subtest part1 => sub {
my $todo = todo 'TODO';
is part1::solution( ) => 'TODO';
};
subtest part2 => sub {
my $todo = todo 'TODO';
is part2::solution( ) => 'TODO';
};