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"});
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;
}
}