2021-03
This commit is contained in:
parent
902e83b8ba
commit
5e38f0bae2
25
2021/03/part1.mjs
Normal file
25
2021/03/part1.mjs
Normal file
@ -0,0 +1,25 @@
|
||||
import fs from "fs-extra";
|
||||
import fp from "lodash/fp.js";
|
||||
import _ from "lodash";
|
||||
|
||||
export const processFile = async (f) =>
|
||||
fs
|
||||
.readFile(f, "utf8")
|
||||
.then((x) => x.split("\n").filter((x) => x))
|
||||
.then((lines) =>
|
||||
lines.map((l) => l.split("").map((x) => parseInt(x)))
|
||||
);
|
||||
|
||||
const mostCommon = (numbers) => (_.sum(numbers) * 2 > numbers.length ? 1 : 0);
|
||||
|
||||
export const toDecimal = (numbers) => numbers.reduce((a, x) => a * 2 + x, 0);
|
||||
|
||||
export const solution = (entries) => {
|
||||
const groups = _.zip(...entries).map(mostCommon);
|
||||
|
||||
const gamma = toDecimal(groups);
|
||||
|
||||
const epsilon = toDecimal(groups.map((x) => 1 - x));
|
||||
|
||||
return gamma * epsilon;
|
||||
};
|
27
2021/03/part2.mjs
Normal file
27
2021/03/part2.mjs
Normal file
@ -0,0 +1,27 @@
|
||||
import fp from "lodash/fp.js";
|
||||
import _ from "lodash";
|
||||
import u from "updeep";
|
||||
|
||||
import { toDecimal } from "./part1.mjs";
|
||||
|
||||
function findNumber(entries, index, most) {
|
||||
// which number to filter on
|
||||
const mostSeen =
|
||||
_.sum(entries.map((e) => e[index])) * 2 >= entries.length ? 1 : 0;
|
||||
|
||||
const filter = most ? mostSeen : 1 - mostSeen;
|
||||
|
||||
const filtered = entries.filter((e) => e[index] === filter);
|
||||
|
||||
if (filtered.length === 1) return filtered[0];
|
||||
|
||||
return findNumber(filtered, index + 1, most);
|
||||
}
|
||||
|
||||
export const solution = (entries) => {
|
||||
const oxyGenerator = toDecimal(findNumber(entries, 0, true));
|
||||
|
||||
const scrubber = toDecimal(findNumber(entries, 0, false));
|
||||
|
||||
return oxyGenerator * scrubber;
|
||||
};
|
12
2021/03/sample
Normal file
12
2021/03/sample
Normal file
@ -0,0 +1,12 @@
|
||||
00100
|
||||
11110
|
||||
10110
|
||||
10111
|
||||
10101
|
||||
01111
|
||||
00111
|
||||
11100
|
||||
10000
|
||||
11001
|
||||
00010
|
||||
01010
|
18
2021/03/test.mjs
Normal file
18
2021/03/test.mjs
Normal file
@ -0,0 +1,18 @@
|
||||
import tap from "tap";
|
||||
|
||||
import * as p1 from "./part1.mjs";
|
||||
import * as p2 from "./part2.mjs";
|
||||
|
||||
|
||||
const sample = p1.processFile("sample");
|
||||
const input = p1.processFile("input");
|
||||
|
||||
tap.test("part1", async (t) => {
|
||||
t.equal(p1.solution(await sample), 198);
|
||||
t.equal(p1.solution(await input), 3813416 );
|
||||
});
|
||||
|
||||
tap.test("part2", async (t) => {
|
||||
t.equal(p2.solution(await sample), 230);
|
||||
t.equal(p2.solution(await input), 2990784);
|
||||
});
|
Loading…
Reference in New Issue
Block a user