commit e7d27a87e980ff7cda7665f5465b74cec156b0b2
parent 91c9b62b74133b2f30c75bb3ee41198bfa15b785
Author: finwo <finwo@pm.me>
Date: Thu, 22 Dec 2022 18:53:52 +0100
2022/21 solution
Diffstat:
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": {