advent-of-code

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

commit 799984e56e279d06e9d184b1c336c49ee8ee823a
parent 5f6a3409d8bb742b4a42f79f7ba1885372ddb96e
Author: finwo <finwo@pm.me>
Date:   Mon, 26 Dec 2022 14:37:02 +0100

2022/25 solution

Diffstat:
A2022/day-25/example | 13+++++++++++++
A2022/day-25/index.js | 55+++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 68 insertions(+), 0 deletions(-)

diff --git a/2022/day-25/example b/2022/day-25/example @@ -0,0 +1,13 @@ +1=-0-2 +12111 +2=0= +21 +2=01 +111 +20012 +112 +1=-1= +1-12 +12 +1= +122 diff --git a/2022/day-25/index.js b/2022/day-25/index.js @@ -0,0 +1,55 @@ +const fs = require('fs'); + +// const lines = fs.readFileSync('example', 'utf-8') +const lines = fs.readFileSync('input', 'utf-8') + .split('\n') + .filter(l => l); + +function decode(snafu) { + let result = 0; + for(const c of snafu.split('')) { + result *= 5; + switch(c) { + case '2': result += 2; break; + case '1': result += 1; break; + case '0': result += 0; break; + case '-': result -= 1; break; + case '=': result -= 2; break; + } + } + return result; +} + +function encode(num) { + let i=1, result = '0'; + while(i<num) { i*=5; result += '0'; } + + for(let i=0; i<result.length; i++) { + // Find character closest to target + let opts = [ + { v: decode(result.substr(0,i) + '2' + result.substr(i+1)), c: '2' }, + { v: decode(result.substr(0,i) + '1' + result.substr(i+1)), c: '1' }, + { v: decode(result.substr(0,i) + '0' + result.substr(i+1)), c: '0' }, + { v: decode(result.substr(0,i) + '-' + result.substr(i+1)), c: '-' }, + { v: decode(result.substr(0,i) + '=' + result.substr(i+1)), c: '=' }, + ]; + let d = Infinity; + for(const opt of opts) { + const D = Math.abs(opt.v - num); + if (D >= d) continue; + d = D; + result = result.substr(0,i) + opt.c + result.substr(i+1); + } + } + + return result.replace(/^0+/,''); + console.log({ result, i }); +} + +const numbers = lines.map(decode); + +const sum = numbers.reduce((r,a)=>r+a,0); +const step1 = encode(sum); + + +console.log({ lines, numbers, sum, step1 });