Round-robin tournament schedule: Difference between revisions

Content added Content deleted
m (→‎{{header|Perl}}: more general)
Line 169: Line 169:
Round 11: 1 vs 12 2 vs 11 3 vs 10 4 vs 9 5 vs 8 6 vs 7
Round 11: 1 vs 12 2 vs 11 3 vs 10 4 vs 9 5 vs 8 6 vs 7
</pre>
</pre>

=={{header|Phix}}==
Based on the circle with rotor diagrams on the wikipedia page, and implements home/away.
<!--<lang Phix>(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">round_robin</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
<span style="color: #000080;font-style:italic;">--
-- As per the wikipedia page, we do something like this:
--
-- even(n), say 6: in round 1 we have 6 & 1,2,3,4,5 -&gt; {{6,1},{2,5},{3,4}},
-- 2 2,3,4,5,1 -&gt; {{6,2},{3,1},{4,5}},
-- 3 3,4,5,1,2 -&gt; {{6,3},{4,2},{5,1}},
-- 4 4,5,1,2,3 -&gt; {{6,4},{5,3},{1,2}},
-- 5 5,1,2,3,4 -&gt; {{6,5},{1,4},{2,3}}
--
-- for an odd(n), say 5, simply replace all the 6 above with 0 (a bye).
--
-- As per the wikipedia diagram, we pick a rotor (6/0) and arrange the rest
-- in a circle, and as it rotates around the circle we play it against that
-- one then pick off second/last, third/last-but-one, and so forth from the
-- perspective of the rotor. There must obviously be an odd number of teams
-- in the circle itself, otherwise pairing-offs won't meet in the middle.
--
-- However, rather than physically rotate the {1,2,3,4,5}, we'll just say
-- that anything past 5 starts from 1 again (the -= n below), and use the
-- shorthand of l [===length(result)] as our starting position/offset.
--
-- Not shown above, but we'll also use even/odd rules for home/away matches.
--</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">rotor</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">even</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">)?</span><span style="color: #000000;">n</span><span style="color: #0000FF;">:</span><span style="color: #000000;">0</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">l</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> <span style="color: #000080;font-style:italic;">-- length(result), shorthand</span>
<span style="color: #000000;">n</span> <span style="color: #0000FF;">-=</span> <span style="color: #7060A8;">even</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- (circle must be odd)</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">result</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">rownd</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">n</span> <span style="color: #008080;">do</span> <span style="color: #000080;font-style:italic;">-- (since "round" is a bultin)</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">games</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">even</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rownd</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">or</span> <span style="color: #000000;">rotor</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span><span style="color: #0000FF;">?{</span><span style="color: #000000;">rownd</span><span style="color: #0000FF;">,</span><span style="color: #000000;">rotor</span><span style="color: #0000FF;">}:{</span><span style="color: #000000;">rotor</span><span style="color: #0000FF;">,</span><span style="color: #000000;">rownd</span><span style="color: #0000FF;">})}</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">opponent</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">n</span> <span style="color: #000080;font-style:italic;">-- pair rest off from last inwards,</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">m</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span> <span style="color: #008080;">to</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)/</span><span style="color: #000000;">2</span> <span style="color: #008080;">do</span> <span style="color: #000080;font-style:italic;">-- such that m plays current opponent</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">rom</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">m</span><span style="color: #0000FF;">+</span><span style="color: #000000;">l</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- all shifted by</span>
<span style="color: #000000;">rop</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">opponent</span><span style="color: #0000FF;">+</span><span style="color: #000000;">l</span> <span style="color: #000080;font-style:italic;">-- l as an offset</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">rom</span><span style="color: #0000FF;">></span><span style="color: #000000;">n</span> <span style="color: #008080;">then</span> <span style="color: #000000;">rom</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">n</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">rop</span><span style="color: #0000FF;">></span><span style="color: #000000;">n</span> <span style="color: #008080;">then</span> <span style="color: #000000;">rop</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">n</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000000;">games</span> <span style="color: #0000FF;">&=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">odd</span><span style="color: #0000FF;">(</span><span style="color: #000000;">m</span><span style="color: #0000FF;">)?{{</span><span style="color: #000000;">rom</span><span style="color: #0000FF;">,</span><span style="color: #000000;">rop</span><span style="color: #0000FF;">}}:{{</span><span style="color: #000000;">rop</span><span style="color: #0000FF;">,</span><span style="color: #000000;">rom</span><span style="color: #0000FF;">}})</span>
<span style="color: #000000;">opponent</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">1</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #000000;">result</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">result</span><span style="color: #0000FF;">,</span><span style="color: #000000;">games</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">l</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span> <span style="color: #000080;font-style:italic;">-- (obviously "l = length(result)" works fine here too)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">result</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">vs</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">pair</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- (display helper)</span>
<span style="color: #008080;">return</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pair</span><span style="color: #0000FF;">[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">]=</span><span style="color: #000000;">0</span><span style="color: #0000FF;">?</span><span style="color: #008000;">"%2d bye "</span><span style="color: #0000FF;">:</span><span style="color: #008000;">"%2d vs %-2d"</span><span style="color: #0000FF;">),</span><span style="color: #000000;">pair</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">test</span><span style="color: #0000FF;">=</span><span style="color: #000000;">12</span> <span style="color: #008080;">to</span> <span style="color: #000000;">3</span> <span style="color: #008080;">by</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">9</span> <span style="color: #008080;">do</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">round_robin</span><span style="color: #0000FF;">(</span><span style="color: #000000;">test</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\nFor %d teams:\n"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">test</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">r</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Round %2d: %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">r</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">apply</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">[</span><span style="color: #000000;">r</span><span style="color: #0000FF;">],</span><span style="color: #000000;">vs</span><span style="color: #0000FF;">))})</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--</lang>-->
{{out}}
<pre>
For 12 teams:
Round 1: 12 vs 1 11 vs 2 3 vs 10 9 vs 4 5 vs 8 7 vs 6
Round 2: 2 vs 12 1 vs 3 4 vs 11 10 vs 5 6 vs 9 8 vs 7
Round 3: 12 vs 3 2 vs 4 5 vs 1 11 vs 6 7 vs 10 9 vs 8
Round 4: 4 vs 12 3 vs 5 6 vs 2 1 vs 7 8 vs 11 10 vs 9
Round 5: 12 vs 5 4 vs 6 7 vs 3 2 vs 8 9 vs 1 11 vs 10
Round 6: 6 vs 12 5 vs 7 8 vs 4 3 vs 9 10 vs 2 1 vs 11
Round 7: 12 vs 7 6 vs 8 9 vs 5 4 vs 10 11 vs 3 2 vs 1
Round 8: 8 vs 12 7 vs 9 10 vs 6 5 vs 11 1 vs 4 3 vs 2
Round 9: 12 vs 9 8 vs 10 11 vs 7 6 vs 1 2 vs 5 4 vs 3
Round 10: 10 vs 12 9 vs 11 1 vs 8 7 vs 2 3 vs 6 5 vs 4
Round 11: 12 vs 11 10 vs 1 2 vs 9 8 vs 3 4 vs 7 6 vs 5

For 3 teams:
Round 1: 1 bye 3 vs 2
Round 2: 2 bye 1 vs 3
Round 3: 3 bye 2 vs 1
</pre>
While I "optimised away" the need for a physical rotate, obviously not because I was concerned with performance but more in the hope of creating shorter and more elegant code, in the end it made little difference.
Should it be more to your taste, you can remove "l" and replace the inner loop above with:
<!--<lang Phix>(phixonline)-->
<span style="color: #004080;">sequence</span> <span style="color: #000000;">circle</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">tagset</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">rownd</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">n</span> <span style="color: #008080;">do</span> <span style="color: #000080;font-style:italic;">-- (since "round" is a bultin)</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">r</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">circle</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">games</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">even</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rownd</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">or</span> <span style="color: #000000;">rotor</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span><span style="color: #0000FF;">?{</span><span style="color: #000000;">r</span><span style="color: #0000FF;">,</span><span style="color: #000000;">rotor</span><span style="color: #0000FF;">}:{</span><span style="color: #000000;">rotor</span><span style="color: #0000FF;">,</span><span style="color: #000000;">r</span><span style="color: #0000FF;">})}</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">ldx</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">rdx</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">n</span>
<span style="color: #008080;">while</span> <span style="color: #000000;">ldx</span><span style="color: #0000FF;"><</span><span style="color: #000000;">rdx</span> <span style="color: #008080;">do</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">teama</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">circle</span><span style="color: #0000FF;">[</span><span style="color: #000000;">ldx</span><span style="color: #0000FF;">],</span>
<span style="color: #000000;">teamb</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">circle</span><span style="color: #0000FF;">[</span><span style="color: #000000;">rdx</span><span style="color: #0000FF;">]</span>
<span style="color: #000000;">games</span> <span style="color: #0000FF;">&=</span> <span style="color: #0000FF;">{</span><span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">odd</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ldx</span><span style="color: #0000FF;">)?{</span><span style="color: #000000;">teama</span><span style="color: #0000FF;">,</span><span style="color: #000000;">teamb</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">teamb</span><span style="color: #0000FF;">,</span><span style="color: #000000;">teama</span><span style="color: #0000FF;">})}</span>
<span style="color: #000000;">ldx</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
<span style="color: #000000;">rdx</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">1</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
<span style="color: #000000;">result</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">result</span><span style="color: #0000FF;">,</span><span style="color: #000000;">games</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">circle</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">circle</span><span style="color: #0000FF;">[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">..$]&</span><span style="color: #000000;">circle</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #000080;font-style:italic;">-- (physically rotate it)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--</lang>-->


=={{header|Raku}}==
=={{header|Raku}}==