本帖最后由 523066680 于 2017-4-10 19:47 编辑
题目好,长见识(不好意思占楼了 - my @list = qw/
- 1509231988042396?9
- 3700001989091894?0
- 4313021981042877?1
- 5301021920050801?X
- 6110251990062874?0/;
-
- my @num = qw(7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2);
- my %map;
- my $n = 0;
- grep { $map{ $_ } = $n++ } qw(1 0 X 9 8 7 6 5 4 3 2);
-
- grep { print func($_) , "\n" } @list;
-
- sub func
- {
- my $s = shift;
- my $sum = 0;
- my $last = $map{ substr($s, -1, 1) };
- my $code;
-
- grep { $sum += substr($s, $_, 1) * $num[$_] } ( 0 .. 15 );
- grep { $code = $_ if ( ($_ * 2 + $sum) % 11 == $last) } ( 0..9 );
-
- $s =~s/\?/$code/;
- return $s;
- }
复制代码 根据 happy 的提醒,加一个补充,通过判断和计算求出缺失的数字而非遍历- my @list = qw/
- 1509231988042396?9
- 3700001989091894?0
- 4313021981042877?1
- 5301021920050801?X
- 6110251990062874?0/;
-
- my $n = 0;
- my %map;
- my @num = qw(7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2);
- grep { $map{ $_ } = $n++ } qw(1 0 X 9 8 7 6 5 4 3 2);
- grep { print func($_) , "\n" } @list;
-
- sub func
- {
- my $s = shift;
- my $sum = 0;
- my $last = $map{ substr($s, -1, 1) };
- my $code;
-
- grep { $sum += substr($s, $_, 1) * $num[$_] } ( 0 .. 15 );
- $test = $sum % 11;
- $code = ( $last - $test ) / 2;
- $code += 11/2 if ( $code < 0 );
- $code += 11/2 if ( int($code) != $code );
-
- $s =~s/\?/$code/;
- return $s;
- }
复制代码
|