# 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](https://adventofcode.com/2022/day/25)).
The file [AOC-22-25.md](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` |
[ℤ]: https://en.wikipedia.org/wiki/Integer
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 `1`s 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` |