[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 523066680 于 2017-4-10 19:47 编辑

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

评分人数

TOP

本帖最后由 523066680 于 2017-4-10 18:48 编辑

回复 4# happy886rr


    想过, SUM1 + 2*n = LastNumber,通过 SUM1的余数 和 LastNumber映射的余数进行计算,可以得到 n ,不过我猜我用的方案可能不够直接,
需要做 if 判断, 所以还是先粗暴循环了(一般都是先贴,后面再改 )

TOP

返回列表