d3: add (a little bit more) concise solution
parent
8645ee05f2
commit
7a938f2272
|
@ -3,8 +3,9 @@
|
||||||
# Runs deno at src/d3_deno.ts with arguments ["example.txt"]
|
# Runs deno at src/d3_deno.ts with arguments ["example.txt"]
|
||||||
echo "example.txt"
|
echo "example.txt"
|
||||||
deno run --allow-read "${PWD}/src/d3_deno.ts" "${PWD}/data/example.txt"
|
deno run --allow-read "${PWD}/src/d3_deno.ts" "${PWD}/data/example.txt"
|
||||||
|
deno run --allow-read "${PWD}/src/d3_deno_concise.ts" "${PWD}/data/example.txt"
|
||||||
|
|
||||||
echo "submission.txt"
|
echo "submission.txt"
|
||||||
deno run --allow-read "${PWD}/src/d3_deno.ts" "${PWD}/data/submission.txt"
|
deno run --allow-read "${PWD}/src/d3_deno.ts" "${PWD}/data/submission.txt"
|
||||||
|
deno run --allow-read "${PWD}/src/d3_deno_concise.ts" "${PWD}/data/submission.txt"
|
||||||
|
|
||||||
|
|
|
@ -12,12 +12,6 @@ function priority(chr: string) {
|
||||||
: (ord(chr) - ord('A') + 27);
|
: (ord(chr) - ord('A') + 27);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Deno.args.length < 1) {
|
|
||||||
throw Error(
|
|
||||||
'd3_deno.ts expects a single argument that points to AOC\'s day 3 input file',
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
async function main(fileLoc: string) {
|
async function main(fileLoc: string) {
|
||||||
// part 1
|
// part 1
|
||||||
const text = await Deno.readTextFile(fileLoc);
|
const text = await Deno.readTextFile(fileLoc);
|
||||||
|
@ -71,6 +65,12 @@ async function main(fileLoc: string) {
|
||||||
console.log('part 2:', badges.reduce((a,b)=>a+b));
|
console.log('part 2:', badges.reduce((a,b)=>a+b));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Deno.args.length < 1) {
|
||||||
|
throw Error(
|
||||||
|
'd3_deno.ts expects a single argument that points to AOC\'s day 3 input file',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
const fileLoc = Deno.args[0];
|
const fileLoc = Deno.args[0];
|
||||||
await main(fileLoc);
|
await main(fileLoc);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
// Usable by Windows and UNIX
|
||||||
|
const LINE_SPLIT = (/\r?\n/);
|
||||||
|
|
||||||
|
async function main(fileLoc: string) {
|
||||||
|
const input = await Deno.readTextFile(fileLoc);
|
||||||
|
const ord = (s: string) => s.charCodeAt(0);
|
||||||
|
const prioritized = input.split(LINE_SPLIT).map((line) => line.trim())
|
||||||
|
.filter((line) => line.length != 0)
|
||||||
|
.map((line) =>
|
||||||
|
[...line].map((e) => e.charCodeAt(0))
|
||||||
|
.map((e) =>
|
||||||
|
e - ((ord('a') <= e && e <= ord('z'))
|
||||||
|
? (ord('a') - 1)
|
||||||
|
: (ord('A') - 27))
|
||||||
|
)
|
||||||
|
);
|
||||||
|
const retain = <T>(a: T[], b: T[]) => {
|
||||||
|
const bSet = new Set(b);
|
||||||
|
return a.filter((e) => bSet.has(e));
|
||||||
|
};
|
||||||
|
const halves = <T>(a: T[]) =>
|
||||||
|
[a.slice(0, a.length / 2), a.slice(a.length / 2, a.length)] as const;
|
||||||
|
console.log(
|
||||||
|
'part 1',
|
||||||
|
prioritized
|
||||||
|
.map((sack) => retain(...halves(sack))[0]).reduce((a, b) => a + b),
|
||||||
|
);
|
||||||
|
const arrayGroupBy = <T, F>(a: T[], groupFn: (elem: T, idx: number) => F) =>
|
||||||
|
a.reduce((ret, e, idx) => {
|
||||||
|
const identity = groupFn(e, idx);
|
||||||
|
if (!ret.groupMap.has(identity)) {
|
||||||
|
ret.groupMap.set(identity, ret.groupKeys.length);
|
||||||
|
ret.groupKeys.push(identity);
|
||||||
|
ret.groups.push([identity, []]);
|
||||||
|
}
|
||||||
|
ret.groups[ret.groupMap.get(identity)!][1].push(e);
|
||||||
|
return ret;
|
||||||
|
}, {
|
||||||
|
groupKeys: new Array<F>(),
|
||||||
|
groupMap: new Map<F, number>(),
|
||||||
|
groups: new Array<[F, T[]]>(),
|
||||||
|
}).groups;
|
||||||
|
|
||||||
|
console.log(
|
||||||
|
'part 2',
|
||||||
|
arrayGroupBy(prioritized, (_, idx) => Math.floor(idx / 3))
|
||||||
|
.map(([_idx, sacks]) => sacks)
|
||||||
|
.map((groupOf3) => groupOf3.reduce((a, b) => retain(a, b))[0])
|
||||||
|
.reduce((a, b) => a + b),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Deno.args.length < 1) {
|
||||||
|
throw Error(
|
||||||
|
'd3_deno.ts expects a single argument that points to AOC\'s day 3 input file',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const fileLoc = Deno.args[0];
|
||||||
|
await main(fileLoc);
|
Loading…
Reference in New Issue