2个版本

0.1.1 2023年7月8日
0.1.0 2023年5月21日

#989 in 数学

EUPL-1.2

32KB
449

特殊的数字-类似燃料单位

A Rust crate 和实用程序,用于处理来自Advent of Code 2022年12月25日(此处)的SNAFU值的转换。如果网站不可用,文件AOC-22-25.md包含完整的谜题。

从SNAFU的示例转换

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

...以及到SNAFU的转换

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

SNAFU数字

SNAFU数字是一种以5为基数的10进制系统,从右到左书写。零位(即最右边)代表5^0 = 0的倍数,第一位代表5^1 = 5的倍数,第二位5^2 = 25,第三位5^3 = 625,依此类推。

使用五种不同的数字。下面是它们的十进制整数表示法列表

SNAFU数字 名称 十进制 /
2 2
1 1
0 0
- -1
= 双负 -2

因此,每个位置上的单个值 n 是 2×5^n-1,所以

位置 基数 = - 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

等等。

引用规则

假设你有一个SNAFU数字 2=-01。这是 2 在625位上,=(双负)在125位上,-(负)在25位上,0 在5位上,1在 1 位上。 (2 times 625) plus (-2 times 125) plus (-1 times 25) plus (0 times 5) plus (1 times 1)。这是 1250 plus -250 plus -25 plus 0 plus 1. 976!"

从十进制到SNAFU的示例转换

十进制 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

从SNAFU到十进制的示例转换

SNAFU 十进制
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

无运行时依赖项