- 论坛徽章:
- 6
|
本帖最后由 stanley_tam 于 2013-10-12 11:10 编辑
偶试试{:3_195:}- #!perl
- use strict;
- use v5.10;
- use Readonly;
- use English;
- ##############################################################################
- # claim subs and vars
- ##############################################################################
- Readonly::Hash our %numeric_value_of => (
- A => 0,
- B => 1,
- C => 2,
- D => 3,
- );
- sub main;
- sub get_input;
- sub my_split;
- sub calc;
- sub format_write;
- ##############################################################################
- # main
- ##############################################################################
- main();
- ##############################################################################
- # subs
- ##############################################################################
- sub main {
- my ($string_from_input, $K) = get_input();
- my @letter_groups = my_split($string_from_input, $K);
- my %occurrences_of = ();
- my %values_of = ();
- # get occurrences
- $occurrences_of{$_}++ for @letter_groups;
- # sort by occurrences value
- my @sorted_keys = sort {
- $occurrences_of{$b} <=> $occurrences_of{$a}
- } keys %occurrences_of;
- # calculate values for letter
- $values_of{$_} = calc($_) for keys %occurrences_of;
- # output
- say 'Output: ';
- say 'Letters Occurrences Values';
- for my $key (@sorted_keys){
- format_write($key, $occurrences_of{$key}, $values_of{$key});
- }
- }
- sub get_input {
- my $string_from_input = q{};
- my $K = 0;
- while ($string_from_input !~ m{^ [ABCD]+ $}mx) {
- print 'String: ';
- chomp ($string_from_input = <STDIN>);
- }
- while ($K !~ m{^ [1-9] \d*$}mx) {
- print 'K: ';
- chomp ($K = <STDIN>);
- }
- while ($K > length $string_from_input) {
- print 'K: ';
- chomp ($K = <STDIN>);
- }
- return $string_from_input, $K;
- }
- sub my_split {
- my ($string_from_input, $K) = @_;
- my @letter_groups = $string_from_input =~ m{ (:? \w{$K}) }gx;
- push @letter_groups, $POSTMATCH if $POSTMATCH;
- return @letter_groups;
- }
- sub calc {
- my $string = shift;
- my $result = 0;
- my @values = reverse map {$numeric_value_of{$_}} split //, $string;
- for my $i (0 .. $#values){
- my $value = $values[$i];
- $result += $value * 4 ** $i;
- }
- return $result;
- }
- sub format_write {
- my ($letter, $occurrence, $value) = @_;
- format WRITELETTER =
- @<<<<<<<< @|||| @>>>>>>
- $letter, $occurrence, $value
- .
- $FORMAT_NAME = 'WRITELETTER';
- write;
- }
- __END__
复制代码 |
|