2个版本

0.1.1 2021年6月5日
0.1.0 2021年6月5日

#1669 in 编码

MIT 许可证

11KB
198

base95

任意精度下95进制的分数数文本表示,适用于实时协作应用。

文档

示例

use base95::Base95;
use std::str::FromStr;

fn main() {
    let n1 = Base95::mid();
    assert_eq!(n1.to_string(), "O");
    assert_eq!(n1.raw_digits(), vec![47]);

    let n2 = Base95::avg_with_zero(&n1);
    assert_eq!(n2.to_string(), "7");
    assert_eq!(n2.raw_digits(), vec![23]);

    let n3 = Base95::avg_with_one(&n1);
    assert_eq!(n3.to_string(), "g");
    assert_eq!(n3.raw_digits(), vec![71]);

    let n4 = Base95::avg(&n1, &n2);
    assert_eq!(n4.to_string(), "C");
    assert_eq!(n4.raw_digits(), vec![35]);

    let n5 = Base95::from_str("j>Z= 4").unwrap();
    assert_eq!(n5.raw_digits(), vec![74, 30, 58, 29, 0, 20]);
}

lib.rs:

任意精度下95进制的分数数文本表示,适用于实时协作应用。

它可以表示0到1之间的数,不包括0和1。省略了前导的0.

受到这篇文章的极大启发。

为什么是95?

  • UTF-8,最流行的Unicode编码方案,可以原样编码ASCII。 (每个字符1字节)
  • ASCII共有95个可打印字符,从空格到波浪号。

示例

use base95::Base95;
use std::str::FromStr;

let n1 = Base95::mid();
assert_eq!(n1.to_string(), "O");
assert_eq!(n1.raw_digits(), vec![47]);

let n2 = Base95::avg_with_zero(&n1);
assert_eq!(n2.to_string(), "7");
assert_eq!(n2.raw_digits(), vec![23]);

let n3 = Base95::avg_with_one(&n1);
assert_eq!(n3.to_string(), "g");
assert_eq!(n3.raw_digits(), vec![71]);

let n4 = Base95::avg(&n1, &n2);
assert_eq!(n4.to_string(), "C");
assert_eq!(n4.raw_digits(), vec![35]);

let n5 = Base95::from_str("j>Z= 4").unwrap();
assert_eq!(n5.raw_digits(), vec![74, 30, 58, 29, 0, 20]);

为什么avg不精确?

这种表示的主要考虑之一是分数索引的存储效率。因此,更短、稍有不精确的字符串比完美的长字符串更好。

当然,结果是确定的,也就是说,如果输入相同,输出总是相同的。

没有运行时依赖