免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4510 | 回复: 2
打印 上一主题 下一主题

perl排序,按照频数由大到小排序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-10-11 20:26 |只看该作者 |倒序浏览
各位大大能不能给我这个统计排序的perl脚本 ?
各位大大好:

一个字符串, 是由字符 A, B, C, D 字符组成的。如:
ABDCDCDC

1: 按照 输入值 K值 进行分割,分割成每 K个字符 一组。如:

K = 1   A B D C D C D C 共8组
K = 2   AB DC DC DC     共4组
K = 3   ABD CDC DC      共3组

2: 统计每组字符的数值:
字符的值 A = 0, B = 1, C = 2, D = 3

每组字符数值计算公式如:
DC  值 3, 2                 => (3 * 4**1) + (2 * 4**0) = 14
ABC 值 0, 1, 2 => (0 * 4**2) + (1 * 4**1) + (2 * 4**0) = 6


3: 结果按照频数由大到小排序, 如:

字符串: ABDCDCDC
K = 2, 共4组字符, AB DC DC DC 输出为:
字符组  频数  每组字符的数值



DC  3   14
AB  1   1


各位大大能不能给我这个统计排序的perl脚本 ?

字符串: ABDCDCDCAABBCDCCABBB
K值: 输入
输出为: ?

论坛徽章:
6
丑牛
日期:2014-03-21 15:42:04子鼠
日期:2014-04-12 11:50:17处女座
日期:2014-09-01 09:25:1115-16赛季CBA联赛之吉林
日期:2015-12-22 14:01:5215-16赛季CBA联赛之广东
日期:2016-03-08 18:49:422016科比退役纪念章
日期:2016-07-06 12:19:55
2 [报告]
发表于 2013-10-12 11:04 |只看该作者
本帖最后由 stanley_tam 于 2013-10-12 11:10 编辑

偶试试{:3_195:}
  1. #!perl
  2. use strict;
  3. use v5.10;
  4. use Readonly;
  5. use English;

  6. ##############################################################################
  7. # claim subs and vars
  8. ##############################################################################
  9. Readonly::Hash our %numeric_value_of => (
  10.     A => 0,
  11.     B => 1,
  12.     C => 2,
  13.     D => 3,
  14. );


  15. sub main;
  16. sub get_input;
  17. sub my_split;
  18. sub calc;
  19. sub format_write;

  20. ##############################################################################
  21. # main
  22. ##############################################################################
  23. main();

  24. ##############################################################################
  25. # subs
  26. ##############################################################################
  27. sub main {
  28.     my ($string_from_input, $K) = get_input();
  29.     my @letter_groups    = my_split($string_from_input, $K);
  30.     my %occurrences_of   = ();
  31.     my %values_of        = ();


  32.     # get occurrences
  33.     $occurrences_of{$_}++ for @letter_groups;

  34.     # sort by occurrences value   
  35.     my @sorted_keys = sort {
  36.         $occurrences_of{$b} <=> $occurrences_of{$a}
  37.         } keys %occurrences_of;

  38.     # calculate values for letter
  39.     $values_of{$_} = calc($_) for keys %occurrences_of;

  40.     # output
  41.     say 'Output: ';
  42.     say 'Letters  Occurrences  Values';
  43.     for my $key (@sorted_keys){
  44.         format_write($key, $occurrences_of{$key}, $values_of{$key});
  45.     }

  46. }


  47. sub get_input {
  48.     my $string_from_input = q{};
  49.     my $K = 0;
  50.     while ($string_from_input !~ m{^ [ABCD]+ $}mx) {
  51.         print 'String: ';
  52.         chomp ($string_from_input = <STDIN>);
  53.     }

  54.     while ($K !~ m{^ [1-9] \d*$}mx) {
  55.         print 'K: ';
  56.         chomp ($K = <STDIN>);
  57.     }

  58.     while ($K > length $string_from_input) {
  59.         print 'K: ';
  60.         chomp ($K = <STDIN>);
  61.     }
  62.     return $string_from_input, $K;
  63. }

  64. sub my_split {
  65.     my ($string_from_input, $K) = @_;
  66.     my @letter_groups = $string_from_input =~ m{ (:? \w{$K}) }gx;
  67.     push @letter_groups, $POSTMATCH if $POSTMATCH;

  68.     return @letter_groups;
  69. }

  70. sub calc {
  71.     my $string = shift;
  72.     my $result = 0;
  73.     my @values = reverse map {$numeric_value_of{$_}} split //, $string;

  74.     for my $i (0 .. $#values){
  75.         my $value = $values[$i];
  76.         $result += $value * 4 ** $i;
  77.     }
  78.     return $result;
  79. }

  80. sub format_write {
  81.     my ($letter, $occurrence, $value) = @_;
  82. format WRITELETTER =
  83. @<<<<<<<<   @||||   @>>>>>>
  84. $letter, $occurrence, $value
  85. .
  86.     $FORMAT_NAME = 'WRITELETTER';
  87.     write;
  88. }

  89. __END__
复制代码

论坛徽章:
0
3 [报告]
发表于 2013-10-13 16:22 |只看该作者
好厉害!谢谢大大了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP