rounds ← ##.rr players ⍝ Round-robin tournament.
From Jay Foad:
Given an even number of participants, how do we arrange that each plays against
(or dances with) everyone else, exactly once?
See: http://en.wikipedia.org/wiki/Round-robin_tournament
For example, with contestants, Maggie, Milly, Molly and May, there will be three
rounds. The columns of matrices along the first axis show the bouts: in the
first round, Maggie plays May, while Milly plays Molly, and so on ...
'Maggie' 'Milly' 'Molly' 'May'[rr 4]
Maggie Milly
May Molly
Maggie Molly
Milly May
Maggie May
Molly Milly
Technical note:
Note the use of embedded assignments of local names m, v and n:
IO+(⍵÷2)↑[2]m,[0.5]⌽m←0,v⌽1+n n⍴v←⍳n←0⌈⍵-1
¯¯ ¯¯ ¯¯
While embedded assignment has its detractors, there are some advantages. Taking
a trivial (and contrived) example:
{1+x←1+⍵}0 ⍝ successor of successor of ...
2
Firstly, the code reads nicely from left to right: "One more than x where x is
one more than omega". ¯¯¯¯¯¯¯¯¯¯¯¯
Secondly, local assignment is _currently_ marginally faster than, for example,
employing an inner Dfn. Here is a timing comparison of some alternative codings:
cmpx'{1+x←⍵+1}0' '{{1+⍵}1+⍵}0' '(1∘+)∘(1∘+)0' '{1+⍵}∘(1∘+)0' '{1+⍵}∘{1+⍵}0'
{1+x←⍵+1}0 → 2.1E¯6 | 0% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕
{{1+⍵}1+⍵}0 → 2.6E¯6 | +22% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕
(1∘+)∘(1∘+)0 → 2.9E¯6 | +36% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕
{1+⍵}∘(1∘+)0 → 4.1E¯6 | +91% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕
{1+⍵}∘{1+⍵}0 → 4.6E¯6 | +116% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕
(muse:
The code-snippet: 0⌈... is present to allow the degenerate case of a 0-play-
er tournament, which returns an array of shape 0 2 0, indicating 0 rounds
of 0 plays each. In general, an ⍵-player tournament requires ¯1+⍵÷2 rounds,
so it could be argued that the length of the first axis in this case should
be ¯1, which is impossible. The maths says that if no-one shows up to The
Ball, the band should play ¯1 tunes before packing up and going home.
)
Examples:
display rr¨ 0 2 to 8 ⍝ Tournaments for 0 2 .. 8 players.
┌→─────────────────────────────────────┐
│ ┌┌⊖┐ ┌┌→┐ ┌┌→──┐ ┌┌→────┐ ┌┌→──────┐ │
│ ⌽↓0│ ↓↓1│ ↓↓1 2│ ↓↓1 2 3│ ↓↓1 2 3 4│ │
│ ││0│ ││2│ ││4 3│ ││6 5 4│ ││8 7 6 5│ │
│ └└~┘ └└~┘ ││ │ ││ │ ││ │ │
│ ││1 3│ ││1 3 4│ ││1 3 4 5│ │
│ ││2 4│ ││2 6 5│ ││2 8 7 6│ │
│ ││ │ ││ │ ││ │ │
│ ││1 4│ ││1 4 5│ ││1 4 5 6│ │
│ ││3 2│ ││3 2 6│ ││3 2 8 7│ │
│ └└~──┘ ││ │ ││ │ │
│ ││1 5 6│ ││1 5 6 7│ │
│ ││4 3 2│ ││4 3 2 8│ │
│ ││ │ ││ │ │
│ ││1 6 2│ ││1 6 7 8│ │
│ ││5 4 3│ ││5 4 3 2│ │
│ └└~────┘ ││ │ │
│ ││1 7 8 2│ │
│ ││6 5 4 3│ │
│ ││ │ │
│ ││1 8 2 3│ │
│ ││7 6 5 4│ │
│ └└~──────┘ │
└∊─────────────────────────────────────┘
See also: cmat cmpx
Back to: contents
Back to: Workspaces