Special Numeral-Analogue Fuel Units

A Rust crate ~~and utility~~ to deal with conversions of SNAFU values from Advent of Code 2022, Day 25 (here). The file AOC-22-25.md contains the full puzzle in case the website is unavailable.

Example conversions from SNAFU:

rust use snafu_numbers::FromSnafu; assert_eq!(u32::from_snafu("1=-0-2"), 1747); assert_eq!(u32::from_snafu("20012"), 1257); assert_eq!(u32::from_snafu("1="), 3);

... and into SNAFU:

rust use snafu_numbers::IntoSnafu; assert_eq!(1747_u32.into_snafu(), "1=-0-2");

SNAFU numbers

SNAFU numbers are a power-of-5 centric base-10 system written right to left. The zero-th (i.e., right-most) place represents a multiple of 50 = 0, the first represents a multiple 51 = 5, the second place 52 = 25, the third place 53 = 625, etc.

Five different digits are used. Here is a list alongside their decimal integer representation:

| SNAFU digit | Name | Decimal / [ℤ] | |-------------|--------------|---------------| | 2 | two | 2 | | 1 | one | 1 | | 0 | zero | 0 | | - | minus | -1 | | = | double-minus | -2 |

As a result, the individual values in each position n is 2×5n-1, so

| Position | Base | = | - | 0 | 1 | 2 | |----------|------------------------|---------|---------|-----|--------|--------| | 0 | 50 = 1 | -2 | 1 | 0 | 1 | 2 | | 1 | 51 = 5 | -10 | -5 | 0 | 5 | 10 | | 2 | 52 = 25 | -50 | -25 | 0 | 25 | 50 | | 3 | 53 = 125 | -250 | -125 | 0 | 125 | 250 | | 4 | 54 = 625 | -1250 | -625 | 0 | 625 | 1250 | | 5 | 55 = 3125 | -6250 | -3125 | 0 | 3125 | 6250 |

etc.

To quote the rules:

Say you have the SNAFU number 2=-01. That's 2 in the 625s place, = (double-minus) in the 125s place, - (minus) in the 25s place, 0 in the 5s place, and 1 in the 1s place. (2 times 625) plus (-2 times 125) plus (-1 times 25) plus (0 times 5) plus (1 times 1). That's 1250 plus -250 plus -25 plus 0 plus 1. 976!"

Example conversion from decimal to SNAFU

| Decimal | SNAFU | |-------------|-----------------| | 1 | 1 | | 2 | 2 | | 3 | 1= | | 4 | 1- | | 5 | 10 | | 6 | 11 | | 7 | 12 | | 8 | 2= | | 9 | 2- | | 10 | 20 | | 15 | 1=0 | | 20 | 1-0 | | 2022 | 1=11-2 | | 12345 | 1-0---0 | | 314159265 | 1121-1110-1=0 |

Example conversion from SNAFU to decimal

| SNAFU | Decimal | |----------|---------| | 1=-0-2 | 1747 | | 12111 | 906 | | 2=0= | 198 | | 21 | 11 | | 2=01 | 201 | | 111 | 31 | | 20012 | 1257 | | 112 | 32 | | 1=-1= | 353 | | 1-12 | 107 | | 12 | 7 | | 1= | 3 | | 122 | 37 |