背景
这里的大多数人应该熟悉一些整数基数系统:十进制,二进制,十六进制,八进制。例如,在十六进制系统中,数字abc.de 16表示
a*16^2 + b*16^1 + c*16^0 + d*16^-1 + e*16^-2
但是,也可以使用非整数基数,例如无理数。一旦这样的碱使用黄金比例φ=(1 +√5)/ 2≈1.618 ...。这些定义类似于整数基数。所以一些abc.de φ(其中一个以ê是整数位)将代表
a*φ^2 + b*φ^1 + c*φ^0 + d*φ^-1 + e*φ^-2
请注意,原则上任何数字都可以为负(尽管我们不习惯于此)-我们将以负号表示一个负数~
。对于这个问题,我们限制自己,从数字的目的~9
来9
的,所以我们可以毫不含糊地写(在与之间的波浪线),一个数字作为一个字符串。所以
-2*φ^2 + 9*φ^1 + 0*φ^0 + -4*φ^-1 + 3*φ^-2
将被写为~290.~43
。我们称这样的数字为非凡数字。
索号始终可以以标准形式表示,这意味着该表示仅使用数字1
和0
,而不包含11
任何位置,并带有可选的减号表示整个数字为负。(有趣的是,每个整数都有标准形式的唯一有限表示形式。)
非标准格式的表示始终可以使用以下观察结果转换为标准格式:
- 011 φ = 100 φ(因为φ 2 =φ+ 1)
- 0200 φ = 1001 φ(φ因为2 + 1 /φ=2φ)
- 0〜10 φ =〜101 φ(因为φ - 1 /φ= 1)
此外:
- 如果最高有效位数为
~1
(其余数字为标准格式),则该数字为负数,我们可以通过交换所有1
和~1
,加上减号,然后再次应用上述三个规则,将其转换为标准格式获取标准表格。
这是这样一个规范化的示例(我为正数使用额外的空格,以使每个数字位置保持对齐):
1~3.2~1φ
1~3. 2~1φ Rule:
= 0~2. 3~1φ (3)
= ~1~1. 4~1φ (3)
= ~1 0 0. 4~1φ (3)
= ~1 0 0. 3 0 1φ (3)
= ~1 0 1. 1 0 2φ (2)
= ~1 1 0. 0 0 2φ (1)
= ~1 1 0. 0 1 0 0 1φ (2)
= - 1~1 0. 0~1 0 0~1φ (4)
= - 0 0 1. 0~1 0 0~1φ (3)
= - 0 0 1.~1 0 1 0~1φ (3)
= - 0 0 0. 0 1 1 0~1φ (3)
= - 0 0 0. 0 1 1~1 0 1φ (3)
= - 0 0 0. 0 1 0 0 1 1φ (3)
= - 0 0 0. 0 1 0 1 0 0φ (1)
屈服。-0.0101φ
为了进一步阅读,Wikipedia提供了有关该主题的非常有用的文章。
挑战
因此,或者以其他方式,编写一个程序或函数,给定一个表示一个整数的字符串(如上所述),然后输出其标准格式而没有前导或尾随零的程序或函数。输入不一定包含枢纽点,但将始终包含其左边的数字(所以没有.123
)。输出必须始终包含麻点,并在其左侧至少包含一位数字。
您可以通过STDIN,ARGV或函数参数获取输入,然后返回结果或将其打印到STDOUT。
您可以使用与上述过程不同的算法,只要它在原则上对任意(有效)输入都是正确和准确的-也就是说,可能破坏您的实现的唯一限制应该是技术限制,例如内置大小数据类型或可用的RAM。例如,不允许将输入评估为浮点数,然后贪婪地挑选数字,因为可能会发现输入的浮点错误会导致错误的结果。
这是代码高尔夫球,最短的答案(以字节为单位)获胜。
测试用例
Input Output
1 1.
9 10010.0101
1.618 10000.0000101
1~3.2~1 -0.0101
0.~1021 0. (or -0.)
105.~2 1010.0101
~31~5.~1 -100000.1001