Rank Team LI AT IS FA BG TS ST GP SS PV SI LM CO BL MG JA WY FN ES JF ---- ------------- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + Nebraska 1 2 5 4 1 2 3 2 1 5 3 2 1 2 4 5 2 3 1 3 + Florida_State 2 4 1 2 2 1 2 3 4 6 8 1 2 1 1 2 4 2 3 2 + Arizona_State 19 24 24 25 19 15 13 - - 19 25 - 13 - - # - 22 21 # + N._Carolina 23 - 18 24 24 - 17 20 - 25 - 13 - - 15 # - 23 - # + Washington - 15 - 16 21 - - - 19 - - - 25 17 - # 8 - 25 #
Rank Team LI AT IS FA BG TS ST GP SS PV SI LM CO BL MG JA WY FN ES ---- ------------- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- @ Florida_State 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 @ Virginia 3 5 4 2 4 2 3 3 2 2 2 4 3 2 3 3 3 2 2 @ N._Carolina 2 6 3 5 3 4 2 2 4 3 4 2 4 3 4 2 2 4 3 @ Clemson 4 2 2 4 2 3 4 5 3 5 3 3 2 5 2 6 5 5 4 @ Georgia_Tech 6 3 5 3 5 5 6 4 6 4 5 7 6 4 5 4 4 6 5 @ Maryland 5 4 7 6 6 6 5 6 5 6 6 6 5 6 6 5 7 3 6 @ N.C._State 7 7 6 7 7 7 7 7 7 7 7 5 7 7 8 7 6 7 7 @ Duke 8 8 8 8 8 8 8 9 8 8 8 8 8 8 7 8 8 8 8 @ Wake_Forest 9 9 9 9 9 9 9 8 9 9 9 9 9 9 9 9 9 9 9
This Perl program accepts the above data format, and adds up the totals. Then it sorts each "bunch" of teams by total score and prints the results. (The program is broken up into subroutines a little oddly, but that is so that a few changes to subroutines result in a program which generates the HTML tables for the preseason consensus.)
#!/usr/bin/perl ################################################################# # preseason.text - output preseason data sorted in a text format. ################################################################# &parse_preseason( STDIN ); ######################################################################### # Constants ######################################################################### # These constants impact the National Top 25 scoring #$mentionedBonus = 0; $mentionedBonus = 5; #$adjustForShortLists = 0; $adjustForShortLists = 1; ################################################################# # OTHER - non-preseason lines ################################################################# sub do_other() { local $arrayRef = shift; foreach $line ( @$arrayRef ) { print $line; } } ################################################################# # CONFERENCE - conference member lines ################################################################# sub do_conference() { local $ar = shift; &do_sort_out( [ @$ar ] ); } ################################################################# # NATIONAL - national rank lines ################################################################# sub do_national() { local $ar = shift; &do_sort_out( [ @$ar ] ); } ################################################################# # do_sort_out() prints out a sorted list of data ################################################################# sub do_sort_out() { local $arrayRef = shift; $lastTotal = 0; $tieCount = 0; $tie = 0; for ( $i=0 ; $i<@$arrayRef ; ++$i ) { $tie = ($$arrayRef[$i][3] == $lastTotal); if ( ! $tie ) { $tie = (($i + 1) < @$arrayRef) && ($$arrayRef[$i + 1][3] == $$arrayRef[$i][3]); if ( $tie ) { $lastTotal = $$arrayRef[$i][3]; $tieCount = $i + 1; } } $l = $$arrayRef[$i][0]; chomp $l; $l =~ s|^....||; printf "%3d%s%s %3d\n", ($tie ? $tieCount : ($i + 1)), ($tie ? "t" : " "), $l, $$arrayRef[$i][3]; } } ######################################################################### # parse_preseason() is the main entry point. # Three call-back hooks are required: # do_national() [Array of Array(4): 0=$_, 1=team, 2=[scores], 3=total # do_conference() [Array of Array(4): 0=$_, 1=team, 2=[scores], 3=total # do_other() [Array of String ($_)] ######################################################################### sub parse_preseason() { $inputHandle = shift; $_ = <$inputHandle>; while ( ! eof($inputHandle) ) { &dispatch(); } &dispatch() if $_ ne ""; } ######################################################################### # dispatch() is called with a line in $_, it decides what to do. ######################################################################### sub dispatch() { return &parse_conference() if ( m|^\@| ); return &parse_national() if ( m|^\+| ); return &parse_other(); } ######################################################################### # parse_national() is called to parse national rankings. It collects # them up until something else is reached. ######################################################################### sub parse_national() { local @data = (); &parse_group( \&nat_score, "+", \@data ); @sortedArray = sort { if ($a->[3] == $b->[3]) { $a->[1] cmp $b->[1] } else { $b->[3] <=> $a->[3] }} @data; &do_national( [ @sortedArray ] ); } ######################################################################### # parse_conference() is called to parse conference rankings. It collects # them up until something else is reached. ######################################################################### sub parse_conference() { local @data = (); &parse_group( \&conf_score, "\@", \@data ); @sortedArray = sort { if ($a->[3] == $b->[3]) { $a->[1] cmp $b->[1] } else { $a->[3] <=> $b->[3] }} @data; &do_conference( [ @sortedArray ] ); } ######################################################################### # do_other() is a simple routine called to for all other cosmetic lines # in the file. It collects them up until something else is reached. ######################################################################### sub parse_other() { @others = (); do { push others, $_; $_ = ""; } while (( $_ = <$inputHandle> ) && ( ! m|^\@| ) && ( ! m|^\+| )); &do_other( [ @others ] ); } ############################################################################# # parse_group() parses a group of teams. It is called with three # arguments: (1) name of scoring method, (2) first character to expect # on line, (3) array reference for results, (4) rank (used after season # is over). ############################################################################# sub parse_group() { local ( $meth, $firstChar, $results ) = ( @_ ); local $fc = quotemeta $firstChar; do { local @answer = (); #[0] $_ (the actual line of input) push @answer, $_; # Elide the rank (if any) and save it for later. s|\{(.*)\}||; $rank = $1; #[1] team name s|^$fc||; chomp; local $team = &peel_team($_); push @answer, $team; #[2] scores array local $t = quotemeta $team; s|$t||; @scores = split; push @answer, [ @scores ]; #[3] total score $total = 0; foreach $score ( @scores ) { $total += &$meth( $score ); } push @answer, $total; #[4] rank push @answer, $rank; # Add to list push @$results, [ @answer ]; $_ = ""; } while (( $_ = <$inputHandle> ) && ( m|^$fc| )); } ############################################################################# # conf_score() returns the conference score of a given value. ############################################################################# sub conf_score() { return shift; } ############################################################################# # nat_score() returns the national score of a given value. ############################################################################# sub nat_score() { local $str = shift; return ( $adjustForShortLists ? 5 : 0 ) if ($str eq "%"); return ( $adjustForShortLists ? 10 : 0 ) if ($str eq "@"); return ( $adjustForShortLists ? 15 : 0 ) if ($str eq "#"); return ( 26 + $mentionedBonus - $str ) if ( $str != 0 ); return 0; } ############################################################################# # peel_team() peels team name off a line (take out special 'unranked' # symbols by themselves, numbers. ############################################################################# sub peel_team() { local $t = shift; $t =~ s| [#@%-]||g; $t =~ s| [0-9]+||g; $t =~ s|^ *([^ ][ A-Za-z.&+;-]*[^ ]) *$|$1|; return $t } #############################################################################