public EventStats GetEventStats(int eventID) { var result = new EventStats(); var evnt = new Event(); var allLines = new List <BetLine>(); using (var session = RavenDocStore.Store.OpenSession()) { evnt = session.Load <Event>(eventID); } using (var session = RavenDocStore.Store.OpenSession()) { // raven doesnt support selectmany >:[ allLines = session.Query <Event>() .Take(1000) .ToList() .SelectMany(x => x.BetLines) .ToList(); } foreach (var line in evnt.BetLines) { var myStats = new FighterStat(); var myLines = allLines .Where(x => x.FighterName.ToLower().Replace(".", "").Replace(" ", "") == line.FighterName.ToLower().Replace(".", "").Replace(" ", "")) .ToList(); var favorites = myLines.Where(x => x.Odds < 2.00M); var underdogs = myLines.Where(x => x.Odds >= 2.00M); var favoriteWins = favorites.Where(x => x.Result == Result.Win); var favoriteLosses = favorites.Where(x => x.Result == Result.Lose); var underdogWins = underdogs.Where(x => x.Result == Result.Win); var underdogLosses = underdogs.Where(x => x.Result == Result.Lose); myStats.FighterName = line.FighterName; myStats.WinsAsFavorite = favoriteWins.Count(); myStats.LossesAsFavorite = favoriteLosses.Count(); myStats.WinsAsUnderdog = underdogWins.Count(); myStats.LossesAsUnderdog = underdogLosses.Count(); var allWins = favoriteWins.Concat(underdogWins); var allLosses = favoriteLosses.Concat(underdogLosses); var winPayouts = allWins.Sum(x => x.Odds) - allWins.Count(); var totalLoss = (decimal)allLosses.Count(); myStats.TotalOdds = winPayouts - totalLoss; result.FighterStats.Add(myStats); } return(result); }
public static bool SimulateFight(FighterStat player, FighterStat boss) { while (player.Hp > 0) { // Player's turn boss.Hp -= Math.Max(1, player.Damage - boss.Armor); if (boss.Hp <= 0) { return(true); } // Boss's turn player.Hp -= Math.Max(1, boss.Damage - player.Armor); } return(false); }
public static void Part1(FighterStat boss, List <Item> weapons, List <Item> armor, List <Item> rings) { var emptyItem = new Item(0, 0, 0); var playerStats = new FighterStat { Armor = 0, Damage = 0, Hp = 100 }; // Number of possible setups = 5c1 * 5c1 * 6c1 * 6c2 = 4500 int lowestCost = Int32.MaxValue; for (int w = 0; w < weapons.Count; w++) { var chosenWeapon = weapons[w]; for (int a = -1; a < armor.Count; a++) { var chosenArmor = a == -1 ? emptyItem : armor[a]; for (int r1 = -1; r1 < rings.Count; r1++) { var chosenRing1 = r1 == -1 ? emptyItem : rings[r1]; for (int r2 = -1; r2 != r1 && r2 < rings.Count; r2++) { var chosenRing2 = r2 == -1 ? emptyItem : rings[r2]; playerStats.Armor = chosenArmor.Armor + chosenRing1.Armor + chosenRing2.Armor; playerStats.Damage = chosenWeapon.Damage + chosenRing1.Damage + chosenRing2.Damage; int cost = chosenWeapon.Cost + chosenArmor.Cost + chosenRing1.Cost + chosenRing2.Cost; if (SimulateFight(playerStats.Clone(), boss.Clone())) { lowestCost = Math.Min(cost, lowestCost); } } } } } Console.WriteLine(lowestCost); }
public static void Main() { var input = File.ReadAllText(@"..\..\inputs\21.txt"); var ints = AOC.ParseInts(input); var boss = new FighterStat { Hp = ints[0], Damage = ints[1], Armor = ints[2] }; var weapons = new List <Item> { new Item(8, 4, 0), new Item(10, 5, 0), new Item(25, 6, 0), new Item(40, 7, 0), new Item(74, 8, 0) }; var armor = new List <Item> { new Item(13, 0, 1), new Item(31, 0, 2), new Item(53, 0, 3), new Item(75, 0, 4), new Item(102, 0, 5) }; var rings = new List <Item> { new Item(25, 1, 0), new Item(50, 2, 0), new Item(100, 3, 0), new Item(20, 0, 1), new Item(40, 0, 2), new Item(80, 0, 3) }; Part1(boss, weapons, armor, rings); Part2(boss, weapons, armor, rings); }