Created
October 9, 2017 19:39
-
-
Save brandonagr/5b5e29d85471bb69beb7c4500d5740d7 to your computer and use it in GitHub Desktop.
EslGroupingSim
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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