Istnieją popularne algorytmy kontrolne, takie jak Luhn, a następnie są dobre , na przykład algorytm Damm. Jedynym możliwym powodem popularności algorytmów, takich jak Luhn, jest ich implementacja w golfa. Oznacza to, że jako społeczność możemy zmieniać świat, oferując golfowe implementacje lepszych algorytmów.
Dlatego wyzwaniem jest zmiana świata poprzez napisanie funkcji lub kompletnego programu w wybranym języku, który oblicza cyfrę kontrolną za pomocą algorytmu Damm . Odpowiedź z najmniejszą liczbą znaków (nie bajtów) zostanie wybrana jako zwycięzca za kilka tygodni. Zauważ, że wszystkie funkcje pomocnicze i deklaracja tabeli operacji muszą być uwzględnione w liczbie znaków. W przypadku remisu zostanie wybrana najpopularniejsza odpowiedź.
Ten algorytm obraca się wokół tabeli operacyjnej, która musi być słabo całkowicie antysymetryczną quasiggrupą rzędu 10. Tabela operacyjna, którą można znaleźć w artykule Wikipedii na temat algorytmu Damm, jest tym, którego należy użyć w tym wyzwaniu. Dla kompletności odtworzę go poniżej:
| 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
W skrócie (szczegóły w artykule na Wikipedii ) algorytm działa w następujący sposób:
- Zaczynasz od listy cyfr do przetworzenia i cyfry pośredniej ustawionej na 0.
- Dla każdej cyfry na liście obliczasz nową cyfrę pośrednią, używając cyfry jako indeksu kolumny i poprzedniej cyfry pośredniej jako indeksu wiersza.
- Ostatnią cyfrą pośrednią jest cyfra kontrolna. Jeśli sprawdzasz poprawność numeru, który ma już dodaną cyfrę kontrolną, ostatnia cyfra tymczasowa wynosi 0, jeśli numer jest prawidłowy.
Twój program lub funkcja musi zaakceptować ciąg znaków, który może zawierać dowolne znaki oprócz null, ale powinien dotyczyć tylko cyfr w ciągu. Musi albo wydrukować (jeśli program) lub zwrócić (jeśli funkcja) oryginalny ciąg z dołączoną obliczoną cyfrą kontrolną. Jeśli zdecydujesz się napisać program, program może zaakceptować dane wejściowe jako argument lub jako dane standardowe. Jeśli ciąg wejściowy jest pusty lub nie zawiera żadnych cyfr, musisz zwrócić lub dołączyć zero.
Kilka przykładów:
Input | Output
------------+-------------
42 | 427
427 | 4270
2 to 2 | 2 to 29
23 42 76- | 23 42 76-5
- | -0