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
Odpowiedzi:
Pyth, 49 znaków
Zawiera bóg wie, jakie znaki, więc oto program Python3 do generowania powyższego programu dokładnie na twoim komputerze:
Wyjaśnienie:
źródło
CJam, 54 znaki
Jest tam jedna postać, której nie można wydrukować, więc możesz skorzystać z bezpośredniego linku poniżej.
Sprawdź to tutaj.
Wyjaśnienie
T
Śledzona jest cyfra tymczasowa , którą CJam inicjuje na 0.źródło
Python 3,
149 141138 znakówPrzykłady:
Dzięki @MegaTom i @Sieg za pomoc w usunięciu łącznie 11 znaków
źródło
Ruby, 149 znaków
Testowane na repl.it
źródło
J, 117 bajtów
Zawiera tylko ascii do wydruku. (Trudno mi było pracować z J i Unicode). Generuje tabelę przejścia z indeksów permutacji wierszy.
Stosowanie:
Wypróbuj online tutaj.
źródło
Haskell, 131 znaków
Testowe uruchomienie:
źródło
k, 36 znaków
q, 40 znaków (odpowiednik implementacji k)
źródło