#!/usr/bin/perl use warnings; use strict; { my @round_aoh; my @players = qw/John Jane Bill Suzi Bret Erin Eric Teri/; my $rounds = @players - 1; for my $round ( 1..$rounds ) { for my $player ( @players ) { next if $round_aoh[$round]{$player}; $round_aoh[$round]{$player} = 'pending'; my ($opponent) = grep {unmatched( $player, $_, \@round_aoh)} grep {not $round_aoh[$round]{$_}} @players; $round_aoh[$round]{$player } = $opponent; $round_aoh[$round]{$opponent} = $player; } } # Now, show what we did. for my $round ( 1..$rounds ) { print "Round $round\n"; for my $player ( keys %{$round_aoh[$round]} ) { # crude hack to skip dupes: A vs B : B vs A next unless $player gt $round_aoh[$round]{$player}; print " $player vs $round_aoh[$round]{$player}\n"; } } } sub unmatched { my ($player, $opponent, $round_arefoh) = @_; for my $round ( 1..@$round_arefoh) { if (defined $round_arefoh->[$round]{$player} and $round_arefoh->[$round]{$player} eq $opponent) { return 0; } } return 1; }