Verhoeff algorithm: Difference between revisions
Content added Content deleted
(J) |
No edit summary |
||
Line 1,165: | Line 1,165: | ||
Validation calculation for 1234567890129: |
Validation calculation for 1234567890129: |
||
Checkdigit: incorrect</pre> |
Checkdigit: incorrect</pre> |
||
=={{header|Vlang}}== |
|||
{{trans|Go}} |
|||
<lang go>const d = [ |
|||
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], |
|||
[1, 2, 3, 4, 0, 6, 7, 8, 9, 5], |
|||
[2, 3, 4, 0, 1, 7, 8, 9, 5, 6], |
|||
[3, 4, 0, 1, 2, 8, 9, 5, 6, 7], |
|||
[4, 0, 1, 2, 3, 9, 5, 6, 7, 8], |
|||
[5, 9, 8, 7, 6, 0, 4, 3, 2, 1], |
|||
[6, 5, 9, 8, 7, 1, 0, 4, 3, 2], |
|||
[7, 6, 5, 9, 8, 2, 1, 0, 4, 3], |
|||
[8, 7, 6, 5, 9, 3, 2, 1, 0, 4], |
|||
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0], |
|||
] |
|||
const inv = [0, 4, 3, 2, 1, 5, 6, 7, 8, 9] |
|||
const p = [ |
|||
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], |
|||
[1, 5, 7, 6, 2, 8, 3, 0, 9, 4], |
|||
[5, 8, 0, 3, 7, 9, 6, 1, 4, 2], |
|||
[8, 9, 1, 6, 0, 4, 3, 5, 2, 7], |
|||
[9, 4, 5, 3, 1, 2, 6, 8, 7, 0], |
|||
[4, 2, 8, 6, 5, 7, 3, 9, 0, 1], |
|||
[2, 7, 9, 3, 8, 0, 6, 4, 1, 5], |
|||
[7, 0, 4, 6, 9, 1, 3, 2, 5, 8], |
|||
] |
|||
fn verhoeff(ss string, validate bool, table bool) int { |
|||
mut s:= ss |
|||
if table { |
|||
mut t := "Check digit" |
|||
if validate { |
|||
t = "Validation" |
|||
} |
|||
println("$t calculations for '$s':\n") |
|||
println(" i nᵢ p[i,nᵢ] c") |
|||
println("------------------") |
|||
} |
|||
if !validate { |
|||
s = s + "0" |
|||
} |
|||
mut c := 0 |
|||
le := s.len - 1 |
|||
for i := le; i >= 0; i-- { |
|||
ni := int(s[i] - 48) |
|||
pi := p[(le-i)%8][ni] |
|||
c = d[c][pi] |
|||
if table { |
|||
println("${le-i:2} $ni $pi $c") |
|||
} |
|||
} |
|||
if table && !validate { |
|||
println("\ninv[$c] = ${inv[c]}") |
|||
} |
|||
if !validate { |
|||
return inv[c] |
|||
} |
|||
return int(c == 0) |
|||
} |
|||
fn main() { |
|||
ss := ["236", "12345", "123456789012"] |
|||
ts := [true, true, false, true] |
|||
for i, s in ss { |
|||
c := verhoeff(s, false, ts[i]) |
|||
println("\nThe check digit for '$s' is '$c'\n") |
|||
for sc in [s + c.str(), s + "9"] { |
|||
v := verhoeff(sc, true, ts[i]) |
|||
mut ans := "correct" |
|||
if v==0 { |
|||
ans = "incorrect" |
|||
} |
|||
println("\nThe validation for '$sc' is $ans\n") |
|||
} |
|||
} |
|||
}</lang> |
|||
{{out}} |
|||
<pre> |
|||
Identical to Wren example |
|||
</pre> |
|||
=={{header|Wren}}== |
=={{header|Wren}}== |