advent-of-code

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

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 });