UPC: Difference between revisions

Content added Content deleted
m (calculate functions only once)
Line 313: Line 313:
sub decode_UPC {
sub decode_UPC {
my($line) = @_;
my($line) = @_;
my(%pattern_to_digit_1,%pattern_to_digit_2,@digits,$sum);
my(%pattern_to_digit_1,%pattern_to_digit_2,@patterns1,@patterns2,@digits,$sum);


my @patterns1 = (' ## #', ' ## #', ' # ##', ' #### #', ' # ##',
for my $p (' ## #', ' ## #', ' # ##', ' #### #', ' # ##', ' ## #', ' # ####', ' ### ##', ' ## ###', ' # ##') {
push @patterns1, $p;
' ## #', ' # ####', ' ### ##', ' ## ###', ' # ##');
my @patterns2 = @patterns1;
push @patterns2, $p =~ tr/# / #/r;
}
$patterns2[$_] =~ tr/# / #/ for 0..$#patterns2;


$pattern_to_digit_1{$patterns1[$_]} = $_ for 0..$#patterns1;
$pattern_to_digit_1{$patterns1[$_]} = $_ for 0..$#patterns1;
Line 331: Line 331:


my($match1,$match2) = ($+{match1}, $+{match2});
my($match1,$match2) = ($+{match1}, $+{match2});
push @digits, $pattern_to_digit_1{$_} for $match1 =~ /(.......)/g;
push @digits, $pattern_to_digit_1{$_} for $match1 =~ /(.{7})/g;
push @digits, $pattern_to_digit_2{$_} for $match2 =~ /(.......)/g;
push @digits, $pattern_to_digit_2{$_} for $match2 =~ /(.{7})/g;
$sum += (3,1)[$_%2] * $digits[$_] for 0..11;
$sum += (3,1)[$_%2] * $digits[$_] for 0..11;
$sum % 10 ? '' : join '', @digits;
$sum % 10 ? '' : join '', @digits;