#!/usr/bin/perl #program will generate all unique combinations of 4 from a pool of players #without repeating any pair of players use strict; use Math::Combinatorics; my $count; my %seen; sub trackSeen{ my @players = @{$_[0]}; #For each set of 4 players the following positions are ones we do not want to see again my @pairs = ($players[0].$players[1], #0,1 $players[0].$players[2], #0,2 $players[0].$players[3], #0,3 $players[1].$players[2], #1,2 $players[1].$players[3], #1,3 $players[2].$players[3] #2,3 ); foreach my $pair (@pairs){ $seen{$pair} = 1; } } sub notSeen{ my @players = @{$_[0]}; my @pairs = ($players[0].$players[1], #0,1 $players[0].$players[2], #0,2 $players[0].$players[3], #0,3 $players[1].$players[2], #1,2 $players[1].$players[3], #1,3 $players[2].$players[3] #2,3 ); foreach my $pair (@pairs){ if (scalar grep /$pair/, keys(%seen) ){ return 0; } } return 1; } my @n = 'A'..'X'; my $comboObj = Math::Combinatorics->new(count => 4, data => [@n]); print "combinations of 4 from: " . join(" ", @n)."\n"; print "-----------------------------" . ("----" x scalar(@n))."\n"; while ( my @combo = $comboObj->next_combination){ if ( notSeen(\@combo) == 1) { print join(', ', @combo) . "\n"; $count++; trackSeen(\@combo); } } print "$count combinations\n";