using System;
using System.Collections .Generic ;
using System.Linq ;
public class Test
{
public static void Main( )
{
var fixture = ComputeFixtures( new List< string> { "A" , "B" , "C" , "D" , "E" , "F" , "G" , "H" , "I" , "J" , "K" , "L" } ) ;
fixture.ForEach ( Console.WriteLine ) ;
}
public static List< Round> ComputeFixtures( List< string> listTeam)
{
var result = new List< Round> ( ) ;
var numberOfRounds = ( listTeam.Count - 1 ) ;
var numberOfMatchesInARound = listTeam.Count / 2 ;
var teams = new List< string> ( ) ;
teams.AddRange ( listTeam.Skip ( numberOfMatchesInARound) .Take ( numberOfMatchesInARound) ) ;
teams.AddRange ( listTeam.Skip ( 1 ) .Take ( numberOfMatchesInARound - 1 ) .ToArray ( ) .Reverse ( ) ) ;
var numberOfTeams = teams.Count ;
for ( var roundNumber = 0 ; roundNumber < numberOfRounds; roundNumber++ )
{
var round = new Round( ) ;
var teamIdx = roundNumber % numberOfTeams;
round.Matches .Add ( new Match( teams[ teamIdx] , listTeam[ 0 ] ) ) ;
for ( var idx = 1 ; idx < numberOfMatchesInARound; idx++ )
{
var firstTeamIndex = ( roundNumber + idx) % numberOfTeams;
var secondTeamIndex = ( roundNumber + numberOfTeams - idx) % numberOfTeams;
round.Matches .Add ( new Match( teams[ firstTeamIndex] , teams[ secondTeamIndex] ) ) ;
}
result.Add ( round) ;
}
return result;
}
}
public class Match
{
public string Team1 { get; set; }
public string Team2 { get; set; }
public Match( string team1, string team2)
{
Team1 = team1;
Team2 = team2;
}
public override string ToString( )
{
return string.Format ( "{0} vs {1}" , Team1, Team2) ;
}
}
public class Round
{
public List< Match> Matches { get; private set; }
public Round( )
{
Matches = new List< Match> ( ) ;
}
public override string ToString( )
{
return String.Join ( Environment.NewLine ,
Matches.Select ( m => m.ToString ( ) ) .ToArray ( ) )
+ Environment.NewLine ;
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CgpwdWJsaWMgY2xhc3MgVGVzdAp7CglwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCgl7CgkJdmFyIGZpeHR1cmUgPSBDb21wdXRlRml4dHVyZXMobmV3IExpc3Q8c3RyaW5nPiB7IkEiLCAiQiIsICJDIiwgIkQiLCAiRSIsICJGIiwgIkciLCAiSCIsICJJIiwgIkoiLCAiSyIsICJMIn0pOwoKCQlmaXh0dXJlLkZvckVhY2goQ29uc29sZS5Xcml0ZUxpbmUpOwkJCgl9CgoJcHVibGljIHN0YXRpYyBMaXN0PFJvdW5kPiBDb21wdXRlRml4dHVyZXMoTGlzdDxzdHJpbmc+IGxpc3RUZWFtKQoJewoJCXZhciByZXN1bHQgPSBuZXcgTGlzdDxSb3VuZD4oKTsKCgkJdmFyIG51bWJlck9mUm91bmRzID0gKGxpc3RUZWFtLkNvdW50IC0gMSk7CgkJdmFyIG51bWJlck9mTWF0Y2hlc0luQVJvdW5kID0gbGlzdFRlYW0uQ291bnQgLyAyOwoKCQl2YXIgdGVhbXMgPSBuZXcgTGlzdDxzdHJpbmc+KCk7CgoJCXRlYW1zLkFkZFJhbmdlKGxpc3RUZWFtLlNraXAobnVtYmVyT2ZNYXRjaGVzSW5BUm91bmQpLlRha2UobnVtYmVyT2ZNYXRjaGVzSW5BUm91bmQpKTsKCQl0ZWFtcy5BZGRSYW5nZShsaXN0VGVhbS5Ta2lwKDEpLlRha2UobnVtYmVyT2ZNYXRjaGVzSW5BUm91bmQgLSAxKS5Ub0FycmF5KCkuUmV2ZXJzZSgpKTsKCgkJdmFyIG51bWJlck9mVGVhbXMgPSB0ZWFtcy5Db3VudDsKCgkJZm9yICh2YXIgcm91bmROdW1iZXIgPSAwOyByb3VuZE51bWJlciA8IG51bWJlck9mUm91bmRzOyByb3VuZE51bWJlcisrKQoJCXsKCQkJdmFyIHJvdW5kID0gbmV3IFJvdW5kKCk7CgkJCXZhciB0ZWFtSWR4ID0gcm91bmROdW1iZXIgJSBudW1iZXJPZlRlYW1zOwoKCQkJcm91bmQuTWF0Y2hlcy5BZGQobmV3IE1hdGNoKHRlYW1zW3RlYW1JZHhdLCBsaXN0VGVhbVswXSkpOwoKCQkJZm9yICh2YXIgaWR4ID0gMTsgaWR4IDwgbnVtYmVyT2ZNYXRjaGVzSW5BUm91bmQ7IGlkeCsrKQoJCQl7CgkJCQl2YXIgZmlyc3RUZWFtSW5kZXggPSAocm91bmROdW1iZXIgKyBpZHgpICUgbnVtYmVyT2ZUZWFtczsKCQkJCXZhciBzZWNvbmRUZWFtSW5kZXggPSAocm91bmROdW1iZXIgKyBudW1iZXJPZlRlYW1zIC0gaWR4KSAlIG51bWJlck9mVGVhbXM7CgoJCQkJcm91bmQuTWF0Y2hlcy5BZGQobmV3IE1hdGNoKHRlYW1zW2ZpcnN0VGVhbUluZGV4XSwgdGVhbXNbc2Vjb25kVGVhbUluZGV4XSkpOwoJCQl9CgoJCQlyZXN1bHQuQWRkKHJvdW5kKTsKCQl9CgoJCXJldHVybiByZXN1bHQ7Cgl9Cn0KCnB1YmxpYyBjbGFzcyBNYXRjaAp7CglwdWJsaWMgc3RyaW5nIFRlYW0xIHsgZ2V0OyBzZXQ7IH0KCXB1YmxpYyBzdHJpbmcgVGVhbTIgeyBnZXQ7IHNldDsgfQoKCXB1YmxpYyBNYXRjaChzdHJpbmcgdGVhbTEsIHN0cmluZyB0ZWFtMikKCXsKCQlUZWFtMSA9IHRlYW0xOwoJCVRlYW0yID0gdGVhbTI7Cgl9CgoJcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCgl7CgkJcmV0dXJuIHN0cmluZy5Gb3JtYXQoInswfSB2cyB7MX0iLCBUZWFtMSwgVGVhbTIpOwoJfQp9CgpwdWJsaWMgY2xhc3MgUm91bmQKewoJcHVibGljIExpc3Q8TWF0Y2g+IE1hdGNoZXMgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CgoJcHVibGljIFJvdW5kKCkKCXsKCQlNYXRjaGVzID0gbmV3IExpc3Q8TWF0Y2g+KCk7Cgl9CgkJCQoJcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCgl7CgkJcmV0dXJuIFN0cmluZy5Kb2luKEVudmlyb25tZW50Lk5ld0xpbmUsIAoJCQlNYXRjaGVzLlNlbGVjdChtID0+IG0uVG9TdHJpbmcoKSkuVG9BcnJheSgpKQoJCQkrIEVudmlyb25tZW50Lk5ld0xpbmU7Cgl9Cn0=