Merge branch '2021-08'
This commit is contained in:
commit
8531620a5a
34
2021/08/part1.mjs
Normal file
34
2021/08/part1.mjs
Normal file
@ -0,0 +1,34 @@
|
||||
import fs from "fs-extra";
|
||||
import fp from "lodash/fp.js";
|
||||
import _ from "lodash";
|
||||
|
||||
export const digits = {
|
||||
0: 'abcefg', // 6
|
||||
1: 'cf', // 2
|
||||
2: 'acdeg', // 5
|
||||
3: 'acdfg', // 5
|
||||
4: 'bcdf', // 4
|
||||
5: 'abdfg', // 5
|
||||
6: 'abdefg', // 6
|
||||
7: 'acf', // 3
|
||||
8: 'abcdefg',// 7
|
||||
9: 'abcdfg', // 6
|
||||
}
|
||||
|
||||
export const processInput = (lines) => {
|
||||
return lines.split("\n").filter(x=>x).map( line => {
|
||||
let [ input, output ] = line.split(' | ').map(
|
||||
x => x.split(' ').map( x => x.split('').sort() )
|
||||
);
|
||||
|
||||
return {input, output};
|
||||
}
|
||||
)
|
||||
};
|
||||
|
||||
/** @return {number} */
|
||||
export function solution(lines) {
|
||||
return lines.map(fp.get('output')).flat().filter(
|
||||
x => [2,4,3,7].includes(x.length )
|
||||
).length
|
||||
}
|
83
2021/08/part2.mjs
Normal file
83
2021/08/part2.mjs
Normal file
@ -0,0 +1,83 @@
|
||||
import fp from "lodash/fp.js";
|
||||
import _ from "lodash";
|
||||
|
||||
import * as p1 from "./part1.mjs";
|
||||
|
||||
function decodedDigits(mapping) {
|
||||
const s = fp.invert(mapping);
|
||||
|
||||
return _.flow([
|
||||
fp.invert,
|
||||
fp.mapKeys((k) =>
|
||||
k
|
||||
.split("")
|
||||
.map((l) => s[l])
|
||||
.join("")
|
||||
),
|
||||
fp.mapKeys((k) => k.split("").sort().join("")),
|
||||
])(p1.digits);
|
||||
}
|
||||
|
||||
function guess(unknowns, guessed = {}, inputs) {
|
||||
const [next] = Object.keys(unknowns);
|
||||
|
||||
if (!next) return guessed;
|
||||
|
||||
for (const p of unknowns[next]) {
|
||||
let newUnknowns = fp.mapValues(
|
||||
(s) => s.filter((x) => x !== p),
|
||||
fp.omit(next, unknowns)
|
||||
);
|
||||
|
||||
if (Object.values(newUnknowns).some((s) => s.size === 0)) continue;
|
||||
|
||||
const r = guess(newUnknowns, { ...guessed, [next]: p }, inputs);
|
||||
|
||||
if (!r) continue;
|
||||
|
||||
const solution = decodedDigits(r);
|
||||
|
||||
if (inputs.every((i) => solution.hasOwnProperty(i.join(""))))
|
||||
return r;
|
||||
}
|
||||
}
|
||||
|
||||
export function findMapping(input) {
|
||||
const values = "abcdefg".split("");
|
||||
|
||||
let possibility = Object.fromEntries(values.map((v) => [v, values]));
|
||||
|
||||
for (const seq of input) {
|
||||
const p = Object.values(p1.digits)
|
||||
.filter((d) => d.length === seq.length)
|
||||
.join("")
|
||||
.split("");
|
||||
|
||||
for (const l of seq) {
|
||||
possibility[l] = _.intersection(possibility[l], p);
|
||||
}
|
||||
}
|
||||
|
||||
// feel cute, might delete later
|
||||
const one = input.find((i) => i.length === 2);
|
||||
const seven = input.find((i) => i.length === 3);
|
||||
const [a] = seven.filter((x) => !one.includes(x));
|
||||
|
||||
possibility = fp.mapValues(fp.reject("a"), possibility);
|
||||
|
||||
possibility[a] = ["a"];
|
||||
|
||||
return guess(possibility, {}, input);
|
||||
}
|
||||
|
||||
export function decodedOutput({ input, output }) {
|
||||
const mapping = findMapping([...input, ...output]);
|
||||
|
||||
const digits = decodedDigits(mapping);
|
||||
|
||||
return parseInt(output.map((e) => digits[e.join("")]).join(""));
|
||||
}
|
||||
|
||||
export function solution(input) {
|
||||
return _.sum(input.map(decodedOutput));
|
||||
}
|
10
2021/08/sample
Normal file
10
2021/08/sample
Normal file
@ -0,0 +1,10 @@
|
||||
be cfbegad cbdgef fgaecd cgeb fdcge agebfd fecdb fabcd edb | fdgacbe cefdb cefbgd gcbe
|
||||
edbfga begcd cbg gc gcadebf fbgde acbgfd abcde gfcbed gfec | fcgedb cgb dgebacf gc
|
||||
fgaebd cg bdaec gdafb agbcfd gdcbef bgcad gfac gcb cdgabef | cg cg fdcagb cbg
|
||||
fbegcd cbd adcefb dageb afcb bc aefdc ecdab fgdeca fcdbega | efabcd cedba gadfec cb
|
||||
aecbfdg fbg gf bafeg dbefa fcge gcbea fcaegb dgceab fcbdga | gecf egdcabf bgf bfgea
|
||||
fgeab ca afcebg bdacfeg cfaedg gcfdb baec bfadeg bafgc acf | gebdcfa ecba ca fadegcb
|
||||
dbcfg fgd bdegcaf fgec aegbdf ecdfab fbedc dacgb gdcebf gf | cefg dcbef fcge gbcadfe
|
||||
bdfegc cbegaf gecbf dfcage bdacg ed bedf ced adcbefg gebcd | ed bcgafe cdgba cbgef
|
||||
egadfb cdbfeg cegd fecab cgb gbdefca cg fgcdab egfdb bfceg | gbdfcae bgc cg cgb
|
||||
gcafb gcf dcaebfg ecagb gf abcdeg gaef cafbge fdbac fegbdc | fgae cfgab fg bagce
|
1
2021/08/sample0
Normal file
1
2021/08/sample0
Normal file
@ -0,0 +1 @@
|
||||
acedgfb cdfbe gcdfa fbcad dab cefabd cdfgeb eafb cagedb ab | cdfeb fcadb cdfeb cdbaf
|
34
2021/08/test.mjs
Normal file
34
2021/08/test.mjs
Normal file
@ -0,0 +1,34 @@
|
||||
// https://adventofcode.com/2021/day/08
|
||||
|
||||
import tap from "tap";
|
||||
import fs from "fs-extra";
|
||||
|
||||
import * as p1 from "./part1.mjs";
|
||||
import * as p2 from "./part2.mjs";
|
||||
|
||||
const sample0 = fs.readFile("sample0", "utf8").then(p1.processInput);
|
||||
const sample = fs.readFile("sample", "utf8").then(p1.processInput);
|
||||
const input = fs.readFile("input", "utf8").then(p1.processInput);
|
||||
|
||||
tap.test("part1", async (t) => {
|
||||
t.equal(p1.solution(await sample), 26);
|
||||
t.equal(p1.solution(await input), 375);
|
||||
});
|
||||
|
||||
tap.test("part2", async (t) => {
|
||||
const [ s0 ] = await sample0;
|
||||
t.match(
|
||||
p2.findMapping([...s0.input,...s0.output]), {
|
||||
d: 'a',
|
||||
e: 'b',
|
||||
a: 'c',
|
||||
f: 'd',
|
||||
g: 'e',
|
||||
b: 'f',
|
||||
c: 'g',
|
||||
}
|
||||
);
|
||||
t.match(p2.decodedOutput(s0),5353);
|
||||
t.equal(p2.solution(await sample), 61229);
|
||||
t.equal(p2.solution(await input), 1019355);
|
||||
});
|
@ -1 +1 @@
|
||||
Subproject commit a85f4063d48dd84dc366081533e2c17ee479d3d5
|
||||
Subproject commit f9f3e070d56e500e5dae053110de58ddfe332972
|
@ -1 +1 @@
|
||||
Subproject commit 3c925ebeb9f531a1f0040dc2a48fcbb7ffbb9281
|
||||
Subproject commit 441da0a9c244cef1df7efdc34f1e85ff9a11d14e
|
Loading…
Reference in New Issue
Block a user