Skip to content

Instantly share code, notes, and snippets.

@brandonagr
Created October 9, 2017 19:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save brandonagr/5b5e29d85471bb69beb7c4500d5740d7 to your computer and use it in GitHub Desktop.
Save brandonagr/5b5e29d85471bb69beb7c4500d5740d7 to your computer and use it in GitHub Desktop.
EslGroupingSim
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EslGroupingSim
{
struct Team
{
public string Name;
public int Skill;
public override string ToString()
{
return Name;
}
}
class LeagueRanking
{
public Dictionary<Team, int> TeamPoints = new Dictionary<Team, int>();
public override string ToString()
{
var builder = new StringBuilder();
builder.AppendLine();
int place = 1;
foreach(var team in TeamPoints.OrderByDescending(x => x.Value))
{
builder.AppendLine($"#{place} {team.Key} {team.Value}");
place++;
}
return builder.ToString();
}
}
interface CupGroupingStrat
{
/// <summary>
/// Se
/// </summary>
/// <param name="ranking"></param>
/// <returns></returns>
List<List<Team>> GroupIntoCups(LeagueRanking ranking);
}
class SeperateTopCupGrouping : CupGroupingStrat
{
public List<List<Team>> GroupIntoCups(LeagueRanking ranking)
{
var result = new List<List<Team>>();
int cup = 0;
for (cup = 0; cup < 4; cup++)
{
result.Add(new List<Team>());
}
cup = 0;
foreach(var team in ranking.TeamPoints.OrderByDescending(x => x.Value).Select(x => x.Key))
{
result[cup].Add(team);
cup++;
if (cup == 4)
cup = 0;
}
return result;
}
}
class DeathCupGrouping : CupGroupingStrat
{
public List<List<Team>> GroupIntoCups(LeagueRanking ranking)
{
var result = new List<List<Team>>();
var teams = ranking.TeamPoints.OrderByDescending(x => x.Value).Select(x => x.Key).GetEnumerator();
teams.MoveNext();
for (int cup = 0; cup < 4; cup++)
{
var cupTeams = new List<Team>();
for(int team = 0; team < 8; team++)
{
cupTeams.Add(teams.Current);
teams.MoveNext();
}
result.Add(cupTeams);
}
return result;
}
}
class Program
{
static int[] PointsPerPlace = new int[] { 100, 70, 45, 35, 10, 10, 10, 10 };
static void Main(string[] args)
{
// teams and initial ranking
LeagueRanking ranking = new LeagueRanking();
var rand = new Random();
var initialRanking = Enumerable.Range(1, 32).OrderBy(x => rand.Next()).ToList();
for(int i = 1; i <= 32; i++)
{
var name = new StringBuilder();
int charIndex = i;
while (charIndex > 0)
{
name.Append((char)('A' + ((charIndex % 26)-1)));
charIndex -= 26;
}
var team = new Team { Name = name.ToString(), Skill = 32 - i };
// rank initially with points based on skill
//ranking.TeamPoints.Add(team, PointsPerPlace[(i-1)/4]);
// rank randomly at first
ranking.TeamPoints.Add(team, PointsPerPlace[(initialRanking[i - 1] - 1) / 4]);
}
Console.WriteLine("Week 1 assumed random ranking: {0}", ranking);
var strat = new DeathCupGrouping();
//var strat = new SeperateTopCupGrouping();
for (int week = 2; week <= 14; week++)
{
var cups = strat.GroupIntoCups(ranking);
var nextRanking = new LeagueRanking();
foreach(var cup in cups)
{
// teams in each cup win by skill
var cupResults = cup.OrderByDescending(x => x.Skill).ToList();
for(int cupSeed = 0; cupSeed < 8; cupSeed++)
{
var team = cupResults[cupSeed];
nextRanking.TeamPoints.Add(team, ranking.TeamPoints[team] + PointsPerPlace[cupSeed]);
}
}
ranking = nextRanking;
Console.WriteLine("Week {0} ranking: {1}", week, ranking);
}
Console.ReadLine();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment