From f4553810c143cdecc0becf8e85c5e45ec4d15377 Mon Sep 17 00:00:00 2001 From: Yanick Champoux Date: Tue, 13 Dec 2022 12:58:12 -0500 Subject: [PATCH] part 2 --- 2022/13/part1.js | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 2022/13/part2.js | 13 +++++++++++++ 2022/13/sample | 23 +++++++++++++++++++++++ 2022/13/test.js | 37 +++++++++++++++++++++++++++++++++++++ 4 files changed, 119 insertions(+) create mode 100644 2022/13/part1.js create mode 100644 2022/13/part2.js create mode 100644 2022/13/sample create mode 100644 2022/13/test.js diff --git a/2022/13/part1.js b/2022/13/part1.js new file mode 100644 index 0000000..5289c93 --- /dev/null +++ b/2022/13/part1.js @@ -0,0 +1,46 @@ +import * as R from "remeda"; + +import { readFile } from "../05/part1.js"; + +const readInput = (...args) => + R.pipe( + readFile(...args), + (lines) => lines.split("\n\n"), + R.compact, // remove last line + R.map( + block => block.split("\n").map( line => eval(line) ) + ) + ); + +export const puzzleInput = readInput(import.meta.url, "input"); +export const sample = readInput(import.meta.url, "sample"); + +export function isLessThan(x,y) { + if( [x,y].every(R.isNumber) ) return x < y ? -1 : x == y ? 0 : 1; + + if( [x,y].every(R.isArray) ) { + for ( const [a,b] of R.zip(x,y)) { + const res = isLessThan(a,b); + if(res !== 0) return res; + } + if( x.length === y.length ) return 0 + return x.length < y.length ? -1 : 1; + } + + return isLessThan(...[x,y].map( z => R.isNumber(z)? [z] : z )); +} + +const passthru = (x) => (arg) => { + x(arg); + return arg; +} + +export default R.createPipe( + R.map( ([x,y]) => isLessThan(x,y) ), + (results) => results.map( + (value,index) => ({ value, index: index+1 }) + ), + R.filter( ({ value }) => value !== 1 ), + R.map( R.prop('index') ), + (results) => results.reduce((a,b) => a+b) +); diff --git a/2022/13/part2.js b/2022/13/part2.js new file mode 100644 index 0000000..328da14 --- /dev/null +++ b/2022/13/part2.js @@ -0,0 +1,13 @@ +import * as R from "remeda"; +import { isLessThan } from "./part1"; + +const dividers = [[[2]],[[6]]]; +export default R.createPipe( + R.flatten, + R.concat(dividers), + (packets) => packets.sort(isLessThan), + packets => packets.map( (p,i) => ({ i: i+1, divider: dividers.includes(p) }) ), + R.filter( ({divider}) => divider ), + R.map(R.prop('i')), + (v) => v.reduce((a,b)=>a*b), +); diff --git a/2022/13/sample b/2022/13/sample new file mode 100644 index 0000000..af73fbb --- /dev/null +++ b/2022/13/sample @@ -0,0 +1,23 @@ +[1,1,3,1,1] +[1,1,5,1,1] + +[[1],[2,3,4]] +[[1],4] + +[9] +[[8,7,6]] + +[[4,4],4,4] +[[4,4],4,4,4] + +[7,7,7,7] +[7,7,7] + +[] +[3] + +[[[]]] +[[]] + +[1,[2,[3,[4,[5,6,7]]]],8,9] +[1,[2,[3,[4,[5,6,0]]]],8,9] diff --git a/2022/13/test.js b/2022/13/test.js new file mode 100644 index 0000000..554b8ae --- /dev/null +++ b/2022/13/test.js @@ -0,0 +1,37 @@ +import { test, expect, describe } from "vitest"; + +import { expectSolution } from "../01/main.js"; +import part1, { sample, puzzleInput, isLessThan } from "./part1.js"; +import part2 from "./part2.js"; + +describe("part 1", () => { + test( "readInput", () => { + expect(sample[0][0]).toEqual([1,1,3,1,1]); + + }); + test( "lessThan", () => { + expect( isLessThan(1,2) ).toBe(-1); + expect( isLessThan(2,1) ).toBe(1); + expect( isLessThan(2,2) ).toBe(0); + expect( isLessThan(2,[1]) ).toBe(1); + expect( isLessThan([1],[2]) ).toBe(-1); + }); + test("sample", () => { + expect(part1(sample)).toEqual(13); + }); + test("solution", () => { + const r = part1(puzzleInput); + expect(r).toBeGreaterThan(435); + expect(r).toBeLessThan(10980); + expectSolution(r).toEqual(5806); + }); +}); + +describe("part 2", () => { + test("sample", () => { + expect(part2(sample)).toEqual(140); + }); + test("solution", () => { + expectSolution(part2(puzzleInput)).toEqual(23600); + }); +});