Article 2389 of comp.lang.perl:
Xref: feenix.metronet.com rec.sport.baseball:5975 comp.lang.perl:2389
Newsgroups: su.sports,rec.sport.baseball,comp.lang.perl
Path: feenix.metronet.com!news.utdallas.edu!wupost!howland.reston.ans.net!agate!headwall.Stanford.EDU!nntp.Stanford.EDU!nntp!stergios
From: [email protected] (Stergios)
Subject: Baseball Division Picker Program
Message-ID: <[email protected]>
Sender: [email protected] (Mr News)
Reply-To: [email protected]
Organization: DSO, Stanford University
Date: 24 Apr 93 11:41:30
Lines: 144



Here's a perl program to pick the division standings for Major League
Baseball.

// sm
// Stergios Marinopoulos   Sat Apr 24 11:38:57 1993
// [email protected]


#!/usr/local/bin/perl

### a perl program to pick the division standings for Major League Baseball

### this program rips right through the al east and al west, but really
### slows down in the national league due to the expansion team odds
### being so high.  You could always reduce the odds to something like
### 1000 to 1, instead of 10,000 to 1.  The real odds were 100M to 1!

### The data used in the following program was Danny Sheirdan's odds
### against winning the AL & NL pennants and World Series as they appeared
### in USA today on Monday April 5 1993.  The odds were listed by league
### and not by division.  I simply broke the list into divisons without
### changing the odds, and almost certainly introducing errors.  The
### expansion team odds where actually 100M to 1.  I reduced them to 10000
### to 1 in the interest of speed.  Reducing them to 1000 to 1 would
### probably be good enough.


### sm
### Stergios Marinopoulos   Sat Apr 24 11:10:50 1993
### [email protected]

$nl = "\n" ;

### define the associative arrays for each division, where the key
### is the team name, and the value is the that team's odds to win the
### pennant in their league.

%alw = ('Chicago',      '4',
       'Minnesota',    '5',
       'Oakland',      '10',
       'Kansas City',  '12',
       'Texas',        '15',
       'Seattle',      '50',
       'California',   '100'
       ) ;

%ale = ('Toronto',      '3',
       'Baltimore',    '5',
       'New York',     '7',
       'Milwaukee',    '15',
       'Cleveland',    '20',
       'Boston',       '25',
       'Detroit',      '75'
       ) ;


%nlw = ('Atlanta',      '2',
       'Cincinnati',   '4',
       'Houston',      '15',
       'San Francisco','20',
       'San Diego',    '25',
       'Los Angeles',  '25',
       'Colorado',     '10000'
       ) ;

%nle = ('Montreal',     '6',
       'New York',     '7',
       'Philadelphia', '8',
       'St. Louis',    '10',
       'Chicago',      '30',
       'Pittsburgh',   '30',
       'Florida',      '10000'
       ) ;


srand(time|$$) ;

## define a list with the names of the divisions
@divNames = ("AL EAST", "AL WEST", "NL EAST", "NL WEST") ;

## define a list with pointers to the division associative arrays
@divPointers = (*ale, *alw, *nle, *nlw) ;


### pick the divison standings

foreach $div (@divNames) {
   local(*division) = shift(@divPointers) ;

   print $nl, $div, $nl ;

   foreach $t (0..6) {
               ## it was easier to fill up the hat each time, rather
               ## than sift out a team that was just picked.
               &fillUpHat ;
               $pick = &pickATeam ;
               printf "%-3d $pick\n", 7 - $t ;

               ## since this team has been picked,remove it division
               undef $division{$pick} ;
   }
}

### that's it. we're out of here.
exit 0 ;

sub fillUpHat {
   # fill up a list ("HAT") with the names of the teams
   # remaining in the division.  Each team's name is entered
   # their "odds" number of times.

   @list = () ;
   foreach $team (keys %division) {
       grep(push(@list, $team), 0..$division{$team}) ;
   }
}

sub pickATeam {
   @wlist = @list ;            # The work list
   @rlist = () ;               # The random list

   ## first randomize the list, i.e. get the air blowing
   ## in the ping pong ball container.

   while (1) {
       $i = int(rand($#wlist)) ;
       push(@rlist, $wlist[$i]) ;
       splice(@wlist, $i, 1) ;
       if($#wlist == 0) {
           push(@rlist, @wlist) ;
           last ;
       }
   }

   ## now pick the team
   $rlist[int(rand($#rlist))] ;
}

--
--------------------------
Stergios Marinopoulos
[email protected]