Merge branch '2021-10'
This commit is contained in:
commit
e2e4870ccd
46
2021/10/part1.mjs
Normal file
46
2021/10/part1.mjs
Normal 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
42
2021/10/part2.mjs
Normal 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
10
2021/10/sample
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
[({(<(())[]>[[{[]{<()<>>
|
||||||
|
[(()[<>])]({[<{<<[]>>(
|
||||||
|
{([(<{}[<>[]}>{[]{[(<()>
|
||||||
|
(((({<>}<{<{<>}{[]{[]{}
|
||||||
|
[[<[([]))<([[{}[[()]]]
|
||||||
|
[{[{({}]{}}([{[{{{}}([]
|
||||||
|
{<[[]]>}<{[{[{[]{()[[[]
|
||||||
|
[<(<(<(<{}))><([]([]()
|
||||||
|
<{([([[(<>()){}]>(<<{{
|
||||||
|
<{([{{}}[<[[[<>{}]]]>[]]
|
23
2021/10/test.mjs
Normal file
23
2021/10/test.mjs
Normal 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);
|
||||||
|
});
|
11
2021/_templates/day/new/part1.mjs.t
Normal file
11
2021/_templates/day/new/part1.mjs.t
Normal 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) {
|
||||||
|
}
|
@ -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;
|
|
11
2021/_templates/day/new/part2.mjs.t
Normal file
11
2021/_templates/day/new/part2.mjs.t
Normal 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) {
|
||||||
|
}
|
@ -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;
|
|
23
2021/_templates/day/new/test.mjs.t
Normal file
23
2021/_templates/day/new/test.mjs.t
Normal 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);
|
||||||
|
});
|
@ -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';
|
|
||||||
};
|
|
Loading…
Reference in New Issue
Block a user