Esistono algoritmi di cifre di controllo popolari come Luhn e poi ce ne sono di buoni , ad esempio l'algoritmo Damm. L'unica ragione possibile dietro la popolarità di algoritmi come Luhn è che esistono implementazioni codificate di golf. Ciò significa che come comunità abbiamo il potere di cambiare il mondo fornendo implementazioni golfizzate di algoritmi migliori.
Quindi questa sfida è cambiare il mondo scrivendo una funzione o un programma completo nella tua lingua preferita che calcola una cifra di controllo usando l' algoritmo Damm . La risposta con il minor numero di caratteri (non byte) verrà scelta come vincente in poche settimane. Si noti che tutte le funzioni di aiuto e la dichiarazione della tabella delle operazioni devono essere incluse nel conteggio dei caratteri. In caso di pareggio verrà scelta la risposta più popolare.
Questo algoritmo ruota attorno a una tabella operativa che deve essere un quasigroup debolmente totalmente anti-simmetrico dell'ordine 10. La tabella operativa che può essere trovata nell'articolo di Wikipedia sull'algoritmo Damm è quella che deve essere usata in questa sfida. Per completezza, lo riprodurrò di seguito:
| 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
In breve (per i dettagli vedi l' articolo di Wikipedia ) l'algoritmo funziona come segue:
- Si inizia con un elenco di cifre da elaborare e una cifra intermedia impostata su 0.
- Per ogni cifra nell'elenco si calcola una nuova cifra provvisoria utilizzando la cifra come indice di colonna e la precedente cifra provvisoria come indice di riga.
- L'ultima cifra provvisoria è la cifra di controllo. Se si sta convalidando un numero che ha già una cifra di controllo aggiunta, la cifra intermedia finale è 0 se il numero è valido.
Il programma o la funzione deve accettare una stringa che può contenere qualsiasi carattere tranne null, ma dovrebbe riguardare solo le cifre nella stringa. Deve stampare (se un programma) o restituire (se una funzione) la stringa originale con la cifra di controllo calcolata allegata. Se si sceglie di scrivere un programma, il programma può accettare l'input come argomento o come input standard. Se la stringa di input è vuota o non contiene cifre, è necessario restituire o aggiungere uno zero.
Qualche esempio:
Input | Output
------------+-------------
42 | 427
427 | 4270
2 to 2 | 2 to 29
23 42 76- | 23 42 76-5
- | -0