Skip to content

Instantly share code, notes, and snippets.

@jkingry
Last active August 29, 2015 13:57
Show Gist options
  • Save jkingry/9643522 to your computer and use it in GitHub Desktop.
Save jkingry/9643522 to your computer and use it in GitHub Desktop.
NCAA Tournament Bracket Picker - 2014
namespace Madness
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
internal interface IResult
{
Team Result(bool output);
}
internal class Team : IResult
{
public string Name;
public int Wins, Loses;
public Team(string name, int win, int lose)
{
this.Name = name;
this.Wins = win;
this.Loses = lose;
}
public Team Result(bool output)
{
return this;
}
}
internal class Game : IResult
{
private static readonly ThreadLocal<Random> RNG = new ThreadLocal<Random>(() => new Random());
public readonly string Name = string.Empty;
private readonly IResult a;
private readonly IResult b;
public Game(IResult a, IResult b)
{
this.a = a;
this.b = b;
}
public Game(string name, IResult a, IResult b)
{
this.Name = name;
this.a = a;
this.b = b;
}
public Team Result(bool output)
{
var ateam = this.a.Result(output);
var bteam = this.b.Result(output);
var awin = ateam.Wins / (1.0 * (ateam.Wins + ateam.Loses));
var bwin = bteam.Wins / (1.0 * (bteam.Wins + bteam.Loses));
var avbwin = ateam.Wins / (1.0 * (ateam.Wins + bteam.Wins + ateam.Loses + bteam.Loses));
var res = RNG.Value.NextDouble();
var winner = res < avbwin ? ateam : bteam;
if (output)
{
Console.WriteLine(
"{0} - {1}({4:N0}%) vs {2}({5:N0}%) = ({7:N0}% {1}) => ({6:N0}) {3} wins",
this.Name,
ateam.Name,
bteam.Name,
winner.Name,
awin * 100,
bwin * 100,
res * 100,
avbwin * 100);
}
return winner;
}
}
internal class Program
{
private static void Main(string[] args)
{
var winner = new Game(
"NATIONAL CHAMPIONSHIP",
new Game(
"National Semifinals",
new Game(
"Regional Finals",
new Game(
"Regional Semifinals",
new Game(
"Third Round",
new Game(new Team("Florida", 32, 9), new Team("Albany", 18, 14)),
//, new Team("Mount St. Mary's", 16, 16))),
new Game(new Team("Colorado", 23, 11), new Team("Pittsburgh", 25, 9))),
new Game(
"Third Round",
new Game(new Team("VCU", 32, 9), new Team("St. Austin", 31, 2)),
new Game(new Team("UCLA", 26, 8), new Team("Tulsa", 21, 12)))),
new Game(
"Regional Semifinals",
new Game(
"Third Round",
new Game(new Team("Ohio State", 25, 9), new Team("Dayton", 23, 10)),
new Game(new Team("Syracuse", 27, 5), new Team("Western Michigan", 23, 9))),
new Game(
"Third Round",
new Game(new Team("New Mexico", 27, 6), new Team("Standford", 21, 12)),
new Game(new Team("Kansas", 24, 9), new Team("Eastern Kentucky", 24, 9))))),
new Game(
"Regional Finals",
new Game(
"Regional Semifinals",
new Game(
"Third Round",
new Game(new Team("Virginia", 28, 6), new Team("Costal Carolina", 21, 12)),
new Game(new Team("Memphis", 23, 9), new Team("George Washington", 24, 8))),
new Game(
"Third Round",
new Game(new Team("Cincinnati", 27, 6), new Team("Harvard", 26, 4)),
new Game(new Team("Michigan State", 26, 8), new Team("Delaware", 25, 9)))),
new Game(
"Regional Semifinals",
new Game(
"Third Round",
new Game(new Team("North Carolina", 23, 9), new Team("Providence", 23, 11)),
new Game(new Team("Iowa State", 26, 7), new Team("North Crolina Central", 28, 5))),
new Game(
"Third Round",
new Game(new Team("Connecticut", 26, 8), new Team("Saint Joseph's", 24, 9)),
new Game(new Team("Villanova", 28, 4), new Team("Milwaukee", 21, 13)))))),
new Game(
"National Semifinals",
new Game(
"Regional Finals",
new Game(
"Regional Semifinals",
new Game(
"Third Round",
new Game(new Team("Arizona", 30, 4), new Team("Waber State", 19, 11)),
new Game(new Team("Ganzaga", 28, 6), new Team("Oklahoma State", 21, 12))),
new Game(
"Third Round",
new Game(new Team("Oklahoma", 23, 9), new Team("North Dakota State", 25, 6)),
new Game(new Team("San Diego State", 29, 4), new Team("New Mexico State", 26, 9)))),
new Game(
"Regional Semifinals",
new Game(
"Third Round",
new Game(new Team("Baylor", 24, 11), new Team("Nebraska", 19, 12)),
new Game(new Team("Craighton", 26, 7), new Team("Louisiana-Lafayette", 23, 11))),
new Game(
"Third Round",
new Game(new Team("Oregon", 23, 9), new Team("BYU", 23, 11)),
new Game(new Team("Wisconsin", 26, 7), new Team("American", 20, 12))))),
new Game(
"Regional Finals",
new Game(
"Regional Semifinals",
new Game(
"Third Round",
new Game(new Team("Wichita State", 34, 0), new Game(new Team("Cal Poly", 13, 19), new Team("Texas Southern", 19, 14))),
new Game(new Team("Kentucky", 24, 10), new Team("Kansas State", 20, 12))),
new Game(
"Third Round",
new Game(new Team("Saint Louis", 26, 6), new Team("NC State", 21, 13)),
new Game(new Team("Louisville", 29, 5), new Team("Manhattan", 25, 7)))),
new Game(
"Regional Semifinals",
new Game(
"Third Round",
new Game(new Team("Massachusetts", 24, 8), new Game(new Team("Iowa", 20, 12), new Team("Tennessee", 21, 12))),
new Game(new Team("Duke", 26, 8), new Team("Mercer", 26, 8))),
new Game(
"Third Round",
new Game(new Team("Texas", 23, 10), new Team("Arizona State", 21, 11)),
new Game(new Team("Michigan", 26, 8), new Team("Wafford", 20, 12)))))));
var finalResults = new Dictionary<Team, int>();
if (args.Length == 0)
{
Console.WriteLine(winner.Result(true).Name);
return;
}
var count = Int32.Parse(args[0]);
Parallel.For(
0,
count,
() => new Dictionary<Team, int>(),
(_, loop, results) =>
{
var team = winner.Result(false);
if (!results.ContainsKey(team))
{
results[team] = 0;
}
results[team] += 1;
return results;
},
results =>
{
foreach (var entry in results)
{
if (!finalResults.ContainsKey(entry.Key))
{
finalResults.Add(entry.Key, entry.Value);
continue;
}
finalResults[entry.Key] += entry.Value;
}
});
var entries = from entry in finalResults orderby entry.Value descending select entry;
var max = finalResults.Values.Max();
var top = args.Length == 1 ? 10 : Int32.Parse(args[1]);
foreach (var e in entries.Take(top))
{
var p = (e.Value * 100.0) / count;
var marks = (int)(40.0 * e.Value / max);
Console.WriteLine("{0,25} ({1}/{2:N1}%) {3}", e.Key.Name, e.Value, p, string.Join("", Enumerable.Range(0, marks).Select(_ => "#")));
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment