Luhnなどの一般的なチェックディジットアルゴリズムがあり、次にDammアルゴリズムなどの良いものがあります。Luhnなどのアルゴリズムの人気の背後にある唯一の考えられる理由は、それらのコードゴルフ実装が存在することです。これは、より良いアルゴリズムのゴルフ実装を提供することにより、コミュニティとしての世界を変える力を持っていることを意味します。
したがって、この課題は、Dammアルゴリズムを使用してチェックディジットを計算する関数または選択した言語で完全なプログラムを作成することにより、世界を変えることです。数が最も少ないの答え文字(バイトではない)は、数週間のうちに勝者として選択されます。すべての補助機能と操作テーブルの宣言を文字カウントに含める必要があることに注意してください。同点の場合、最も人気のある回答が選択されます。
このアルゴリズムは、順序10の弱く完全に反対称な準グループでなければならない操作テーブルを中心に展開します。ダムアルゴリズムに関するWikipediaの記事にある操作テーブルは、この課題で使用されるものです。完全を期すために、以下に再現します。
| 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