index.js (1483B)
1 const fs = require('fs'); 2 3 // const lines = fs.readFileSync('example', 'utf-8') 4 const lines = fs.readFileSync('input', 'utf-8') 5 .split('\n') 6 .filter(l => l); 7 8 function decode(snafu) { 9 let result = 0; 10 for(const c of snafu.split('')) { 11 result *= 5; 12 switch(c) { 13 case '2': result += 2; break; 14 case '1': result += 1; break; 15 case '0': result += 0; break; 16 case '-': result -= 1; break; 17 case '=': result -= 2; break; 18 } 19 } 20 return result; 21 } 22 23 function encode(num) { 24 let i=1, result = '0'; 25 while(i<num) { i*=5; result += '0'; } 26 27 for(let i=0; i<result.length; i++) { 28 // Find character closest to target 29 let opts = [ 30 { v: decode(result.substr(0,i) + '2' + result.substr(i+1)), c: '2' }, 31 { v: decode(result.substr(0,i) + '1' + result.substr(i+1)), c: '1' }, 32 { v: decode(result.substr(0,i) + '0' + result.substr(i+1)), c: '0' }, 33 { v: decode(result.substr(0,i) + '-' + result.substr(i+1)), c: '-' }, 34 { v: decode(result.substr(0,i) + '=' + result.substr(i+1)), c: '=' }, 35 ]; 36 let d = Infinity; 37 for(const opt of opts) { 38 const D = Math.abs(opt.v - num); 39 if (D >= d) continue; 40 d = D; 41 result = result.substr(0,i) + opt.c + result.substr(i+1); 42 } 43 } 44 45 return result.replace(/^0+/,''); 46 console.log({ result, i }); 47 } 48 49 const numbers = lines.map(decode); 50 51 const sum = numbers.reduce((r,a)=>r+a,0); 52 const step1 = encode(sum); 53 54 55 console.log({ lines, numbers, sum, step1 });