有流行的校验数字算法,例如Luhn,然后有很好的的,例如Damm算法。诸如Luhn之类的算法流行背后的唯一可能原因是,存在着代码实现它们的实现。这意味着我们作为一个社区有能力通过提供更好算法的高尔夫实现来改变世界。
因此,这个挑战就是通过使用您选择的语言编写一个函数或完整程序来改变世界,该函数或完整程序使用Damm算法来计算校验位。字符数最少(不是字节)的答案将在几周内被选为优胜者。请注意,所有帮助功能和操作表的声明都必须包括在字符计数中。如果是平局,将选择最流行的答案。
该算法围绕一个运算表,该运算表必须是10阶的弱完全反对称准群。可以在Wikipedia中有关Damm算法的文章中找到该运算表,该运算表将用于此挑战中。为了完整起见,我将在下面复制它:
| 0 1 2 3 4 5 6 7 8 9
----+----------------------------------------
0 | 0 3 1 7 5 9 8 6 4 2
1 | 7 0 9 2 1 5 4 8 6 3
2 | 4 2 0 6 8 7 1 3 5 9
3 | 1 7 5 0 9 8 3 4 2 6
4 | 6 1 2 3 0 4 5 9 7 8
5 | 3 6 7 4 2 0 9 5 8 1
6 | 5 8 6 9 7 2 0 1 3 4
7 | 8 9 4 5 3 6 2 0 1 7
8 | 9 4 3 8 6 1 7 2 0 5
9 | 2 5 8 1 4 3 6 7 9 0
简而言之(有关详细信息,请参阅Wikipedia文章),该算法的工作方式如下:
- 您从要处理的数字列表和设置为0的中间数字开始。
- 对于列表中的每个数字,您可以通过使用该数字作为列索引并使用前一个中间数字作为行索引来计算一个新的中间数字。
- 最后的中间数字是校验数字。如果您要验证的数字中已经添加了校验位,则该数字有效时,最终的中间数字为0。
您的程序或函数必须接受可以包含除null以外的任何字符的字符串,但它仅应与字符串中的数字有关。它必须打印(如果是程序)或返回(如果是函数)原始字符串,并附加计算出的校验位。如果选择编写程序,则该程序可以接受输入作为参数或标准输入。如果输入字符串为空或不包含任何数字,则必须返回或附加零。
一些例子:
Input | Output
------------+-------------
42 | 427
427 | 4270
2 to 2 | 2 to 29
23 42 76- | 23 42 76-5
- | -0
我期待看到Piet参赛者夺冠。
—
Alchymist 2015年