in reply to Sports Team allocation
0 6 12 18 24 30 36 42
1 7 13 19 25 31 37 43
2 8 14 20 26 32 38 44
3 9 15 21 27 33 39 45
4 10 16 22 28 34 40 46
5 11 17 23 29 35 41 47
Then you can create teams by going around horizontally, vertically,
and diagonally. You just have to skip to a different column or row
whenever to cross an edge. Or, in other words, we're going to tile the
plane with the above matrix, but each time we put down another time,
we shift a bit. We shift a row if a place a tile to the right, and a
column if we place a tile above. We can then start any place and either
go to the right, go down, or go up-right and make a team from each of
the next 6 numbers; repeating that 8 times.
This boils down to the following program:
#!/usr/bin/perl use strict; use warnings 'all'; my @people = (0 .. 47); my @data; my @z = (0, 0, 0); my @inc = (1, 6, 5); my @skew = (0, 1, 0); my @drift = (0, 0, 12); for (my $x = 0; $x < 8; $x ++) { for (my $y = 0; $y < 6; $y ++) { for (my $z = 0; $z < @z; $z ++) { push @{$data [$z] [$x]} => $people [$z [$z]]; $z [$z] += $inc [$z]; $z [$z] += $drift [$z] if 5 == $z [$z] % 6; $z [$z] -= @people - $skew [$z] if $z [$z] >= @people; } } } my $r = 0; foreach my $info (@data) { printf "Round %d\n", ++ $r; my $t = 0; foreach my $team (@$info) { printf "Team %d: ", ++ $t; map {printf "%2d " => $_} @$team; print "\n"; } print "\n"; } __END__ Round 1 Team 1: 0 1 2 3 4 5 Team 2: 6 7 8 9 10 11 Team 3: 12 13 14 15 16 17 Team 4: 18 19 20 21 22 23 Team 5: 24 25 26 27 28 29 Team 6: 30 31 32 33 34 35 Team 7: 36 37 38 39 40 41 Team 8: 42 43 44 45 46 47 Round 2 Team 1: 0 6 12 18 24 30 Team 2: 36 42 1 7 13 19 Team 3: 25 31 37 43 2 8 Team 4: 14 20 26 32 38 44 Team 5: 3 9 15 21 27 33 Team 6: 39 45 4 10 16 22 Team 7: 28 34 40 46 5 11 Team 8: 17 23 29 35 41 47 Round 3 Team 1: 0 17 22 27 32 37 Team 2: 42 11 16 21 26 31 Team 3: 36 5 10 15 20 25 Team 4: 30 47 4 9 14 19 Team 5: 24 41 46 3 8 13 Team 6: 18 35 40 45 2 7 Team 7: 12 29 34 39 44 1 Team 8: 6 23 28 33 38 43
Abigail
|
|---|