给定一个巴比伦数字的ASCII表示作为输入,输出该数字的西方阿拉伯数字。
巴比伦人是怎么计算的?有趣的是,他们使用了一个Base 60系统和一个基本10系统的一个元素。让我们首先考虑系统的单元列:
巴比伦人只有三个符号:T (或者,如果你能呈现它:),代表1;< (或者,如果你能呈现它:),代表10;\ (或者,如果你呈现它:)代表零。
注:从技术上讲,\ (或)不是零(因为巴比伦人没有‘零’的概念)。‘'Zero’是后来发明的,因此\是后来添加的占位符符号,以防止歧义。然而,就这个挑战而言,将\视为零就足够了
因此,在每一列中,您只需将符号的值相加,例如:
<<< = 30
<<<在每一列中,永远不会有超过五个<或超过九个T。\将始终单独出现在列中。
现在,我们需要将其扩展到添加更多的列。这与任何其他基数60完全一样,其中最右边列的值乘以$60^0,左边的值乘以$60^1,左边的值乘以$60^2,诸如此类。然后,将每个值相加,得到数字的值。
列将用空格分隔,以防止歧义。
下面是一些例子:
<< 规则您可以自由地接受ASCII输入(T<\)或Unicode输入()输入的数字总是在$10^7以下。在每一列中,<s总是位于Ts的左边。\总是单独出现在列中赢以字节为单位的最短代码获胜。
发布于 2018-08-13 10:33:55
将输入作为ASCII字符的数组。
a=>a.map(c=>k+=c<1?k*59:c<'?'?10:c<{},k=0)|k巴比伦数字系统可以被看作是一种四指令语言,用一个寄存器工作--让我们称它为累加器。
从\$k=0\$开始,输入数组中的每个字符\$c\$ a\\$修改累加器\$k\$如下:
space:乘以\$k\ \$60\$ (实现为:添加\$59k\\到\$k\\$)<:将$10\$添加到\$k\$T:增量\$k\$\:什么都不做;这是这种语言的NOP指令(实现为: add \$0\$ to \$k\$)发布于 2018-08-13 10:11:51
-3字节,感谢nwellnhof
{:60[.words>>.&{sum .ords X%151 X%27}]}使用楔形文字。
{ } # Anonymous code block
.words # Split input on spaces
>>.&{ } # Convert each value to
sum # The sum of:
.ords # The codepoints
X%151 X%27 # Converted to 0,1 and 10 through modulo
:60[ ] # Convert the list of values to base 60https://codegolf.stackexchange.com/questions/170544
复制相似问题