Preseason Home Up

PreseasonTotal.pl code/data


Format of data file

Lines for National Top 25 teams look like this:


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  #

Lines for Conference standings look like this:


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

The Perl program

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
}

#############################################################################


Preseason Home Up