Verhoeff algorithm: Difference between revisions

→‎{{header|Raku}}: Add a Raku example
(→‎{{header|Raku}}: Add a Raku example)
Line 247:
Check digit validation was successful for 1234567890120.
Check digit validation failed for 1234567890129.</pre>
 
=={{header|Raku}}==
Generate the tables rather than hard coding, They're not all that complex.
 
<lang perl6>my @d = [^10] xx 5;
@d[$_][^5].=rotate($_), @d[$_][5..*].=rotate($_) for 1..4;
push @d: [@d[$_].reverse] for flat 1..4, 0;
 
my @i = 0,4,3,2,1,5,6,7,8,9;
 
my %h = flat (0,1,5,8,9,4,2,7,0).rotor(2 =>-1).map({.[0]=>.[1]}), 6=>3, 3=>6;
my @p = [^10],;
@p.push: [@p[*-1].map: {%h{$_}}] for ^7;
 
sub checksum (Int $int where * ≥ 0, :$verbose = True ) {
my @digits = $int.comb;
say "\nCheckdigit calculation for $int:";
say " i ni p(i, ni) c" if $verbose;
my ($i, $p, $c) = 0 xx 3;
say " $i 0 $p $c" if $verbose;
for @digits.reverse {
++$i;
$p = @p[$i % 8][$_];
$c = @d[$c; $p];
say "{$i.fmt('%2d')} $_ $p $c" if $verbose;
}
say "Checkdigit: {@i[$c]}";
}
 
sub validate (Int $int where * ≥ 0, :$verbose = True) {
my @digits = $int.comb;
say "\nValidation calculation for $int:";
say " i ni p(i, ni) c" if $verbose;
my ($i, $p, $c) = 0 xx 3;
for @digits.reverse {
$p = @p[$i % 8][$_];
$c = @d[$c; $p];
say "{$i.fmt('%2d')} $_ $p $c" if $verbose;
++$i;
}
say "Checkdigit: {'in' if $c}correct";
}
 
## TESTING
 
for 236, 2363, 123451, 12345, 123456789012, 1234567890120 -> $int, $check {
checksum $int, :verbose( $int.chars < 8 );
validate $check, :verbose( $int.chars < 8 );
validate +($check.chop ~ 9), :verbose( $int.chars < 8 );</lang>
{{out}}
<pre>Checkdigit calculation for 236:
i ni p(i, ni) c
0 0 0 0
1 6 3 3
2 3 3 1
3 2 1 2
Checkdigit: 3
 
Validation calculation for 2363:
i ni p(i, ni) c
0 3 3 3
1 6 3 1
2 3 3 4
3 2 1 0
Checkdigit: correct
 
Validation calculation for 2369:
i ni p(i, ni) c
0 9 9 9
1 6 3 6
2 3 3 8
3 2 1 7
Checkdigit: incorrect
 
Checkdigit calculation for 123451:
i ni p(i, ni) c
0 0 0 0
1 1 5 5
2 5 9 1
3 4 0 1
4 3 3 4
5 2 8 7
6 1 7 0
Checkdigit: 0
 
Validation calculation for 12345:
i ni p(i, ni) c
0 5 5 5
1 4 2 8
2 3 3 5
3 2 1 9
4 1 4 5
Checkdigit: incorrect
 
Validation calculation for 12349:
i ni p(i, ni) c
0 9 9 9
1 4 2 7
2 3 3 9
3 2 1 8
4 1 4 9
Checkdigit: incorrect
 
Checkdigit calculation for 123456789012:
Checkdigit: 0
 
Validation calculation for 1234567890120:
Checkdigit: correct
 
Validation calculation for 1234567890129:
Checkdigit: incorrect</pre>
 
=={{header|Wren}}==
10,333

edits