You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
43 lines
1.1 KiB
43 lines
1.1 KiB
1 year ago
|
import { readFileSync } from 'node:fs';
|
||
|
|
||
|
const input = readFileSync('input', 'utf-8');
|
||
|
|
||
|
function decToSnafu(num) {
|
||
|
const maxP = Math.floor(Math.log(num * 2) / Math.log(5));
|
||
|
|
||
|
return new Array(maxP + 1)
|
||
|
.fill()
|
||
|
.map((_, i) => i)
|
||
|
.reverse()
|
||
|
.reduce(([snafu, remainder], p) => {
|
||
|
const sign = remainder < 0 ? -1 : 1;
|
||
|
const mult = Math.floor(Math.abs(remainder) / Math.pow(5, p) + 0.5);
|
||
|
|
||
|
const val = sign * Math.pow(5, p) * mult;
|
||
|
const char = ['=', '-', '0', '1', '2'][sign * mult + 2];
|
||
|
|
||
|
return [snafu + char, remainder - val];
|
||
|
}, ['', num])[0];
|
||
|
}
|
||
|
|
||
|
function snafuToDec(snafu) {
|
||
|
return snafu
|
||
|
.split('')
|
||
|
.reverse()
|
||
|
.map((d, p) =>
|
||
|
Math.pow(5, p) *
|
||
|
(['=', '-', '0', '1', '2'].indexOf(d) - 2)
|
||
|
)
|
||
|
.reduce((total, num) => total + num);
|
||
|
}
|
||
|
|
||
|
const total = input
|
||
|
.split('\n')
|
||
|
.filter(line => !!line.trim())
|
||
|
.map(line => snafuToDec(line))
|
||
|
.reduce((total, value) => total + value);
|
||
|
|
||
|
const totalSnafu = decToSnafu(total);
|
||
|
|
||
|
console.log('The sum of all fuel requirements in SNAFU is:', totalSnafu);
|