advent-of-code

Entries to advent of code, multiple years
git clone git://git.finwo.net/misc/advent-of-code
Log | Files | Refs

commit e7d27a87e980ff7cda7665f5465b74cec156b0b2
parent 91c9b62b74133b2f30c75bb3ee41198bfa15b785
Author: finwo <finwo@pm.me>
Date:   Thu, 22 Dec 2022 18:53:52 +0100

2022/21 solution

Diffstat:
A2022/day-21/index.js | 70++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A2022/day-21/sample | 15+++++++++++++++
M2022/package-lock.json | 14++++++++++++++
M2022/package.json | 1+
4 files changed, 100 insertions(+), 0 deletions(-)

diff --git a/2022/day-21/index.js b/2022/day-21/index.js @@ -0,0 +1,70 @@ +const fs = require('fs'); +const through = require('through2'); +const line_by_line = require('../common/line-for-line'); +const nerdamer = require('nerdamer/all.min'); + +const step1 = {}; +const step2 = { equation: '', subst: {'humn':'x'} }; + +// fs.createReadStream('sample') +fs.createReadStream('input') + .pipe(line_by_line()) + + // Minor parsing + .pipe(through.obj(function(line, enc, cb) { + line = line.toString(); + + const [id, definition] = line.split(':').map(s => s.trim()); + + // Number = assign directly + if (!isNaN(definition)) { + step1[id] = () => parseInt(definition); + if (id !== 'humn') step2.subst[id] = definition; + return cb(); + } + + // Split & track substitution + step2.subst[id] = definition; + let [left, operation, right] = definition.split(' '); + + if (id == 'root') { + step2.equation = `${left} = ${right}`; + } + + step1[id] = () => { + if (!right) return step1[left](); + const l = step1[left](); + const r = step1[right](); + switch(operation) { + case '+': return l + r; + case '-': return l - r; + case '/': return l / r; + case '*': return l * r; + } + }; + + cb(); + })) + + .on('finish', () => { + console.log('loaded'); + + // First do step 1 + const step1_result = step1.root(); + + // Expand step2 equation + let replaced; + do { + replaced = false; + for(const [token,op] of Object.entries(step2.subst)) { + if (~step2.equation.indexOf(token)) { + replaced = true; + step2.equation = step2.equation.replace(`${token}`, `(${op})`); + } + } + } while(replaced); + + const solved = nerdamer.solveEquations(step2.equation, 'x'); + + console.log({ step1: step1_result, step2: solved.toString() }); + }); diff --git a/2022/day-21/sample b/2022/day-21/sample @@ -0,0 +1,15 @@ +root: pppw + sjmn +dbpl: 5 +cczh: sllz + lgvd +zczc: 2 +ptdq: humn - dvpt +dvpt: 3 +lfqf: 4 +humn: 5 +ljgn: 2 +sjmn: drzm * dbpl +sllz: 4 +pppw: cczh / lfqf +lgvd: ljgn * ptdq +drzm: hmdt - zczc +hmdt: 32 diff --git a/2022/package-lock.json b/2022/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "license": "MIT", "dependencies": { + "nerdamer": "^1.1.13", "through2": "^4.0.2" }, "devDependencies": { @@ -88,6 +89,14 @@ "object-assign": "^4.1.0" } }, + "node_modules/nerdamer": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/nerdamer/-/nerdamer-1.1.13.tgz", + "integrity": "sha512-kQGQYd42eQpKDOnU8ZnRKF47c+gK6jVC46eUchrABsovtFruHvsjyjBO32jck8QnpZE5z5R8HQw72hQX9Oq2MQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -232,6 +241,11 @@ "object-assign": "^4.1.0" } }, + "nerdamer": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/nerdamer/-/nerdamer-1.1.13.tgz", + "integrity": "sha512-kQGQYd42eQpKDOnU8ZnRKF47c+gK6jVC46eUchrABsovtFruHvsjyjBO32jck8QnpZE5z5R8HQw72hQX9Oq2MQ==" + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", diff --git a/2022/package.json b/2022/package.json @@ -10,6 +10,7 @@ "author": "", "license": "MIT", "dependencies": { + "nerdamer": "^1.1.13", "through2": "^4.0.2" }, "devDependencies": {