Example #1
0
        private static void Part1()
        {
            var shop = new ItemsShop();
            var weapons = shop.Weapons;
            var armors = shop.Armors;
            var rings = shop.Rings;

            armors.Add(Item.CreateEmpty(ItemType.Armor));
            rings.Add(Item.CreateEmpty(ItemType.Ring));
            rings.Add(Item.CreateEmpty(ItemType.Ring));

            const int myHitpoints = 100;
            int enemyHitpoints;
            int enemyDamage;
            int enemyArmor;
            ParseEnemy(out enemyHitpoints, out enemyDamage, out enemyArmor);

            var minMoneyToWin = int.MaxValue;

            for (var r1 = 0; r1 < rings.Count; r1++)
            {
                for (var r2 = 0; r2 < r1; r2++)
                {
                    foreach (var weapon in weapons)
                    {
                        foreach (var armor in armors)
                        {
                            var items = new List<Item> {weapon, armor, shop.Rings[r1], shop.Rings[r2]};

                            var myDamage = items.Sum(x => x.Damage);
                            var myArmor = items.Sum(x => x.Armor);
                            var me = new Character(myHitpoints, myDamage, myArmor);
                            var enemy = new Character(enemyHitpoints, enemyDamage, enemyArmor);

                            if (Battle(me, enemy))
                            {
                                var cost = items.Sum(x => x.Price);
                                if (cost < minMoneyToWin)
                                {
                                    minMoneyToWin = cost;
                                }
                            }
                        }
                    }
                }
            }

            Console.WriteLine(minMoneyToWin);
        }
Example #2
0
 private static bool Battle(Character me, Character enemy)
 {
     var myRoundsToDeath = (me.Hitpoints - 1)/Math.Max(enemy.Damage - me.Armor, 1);
     var enemyRoundsToDeath = (enemy.Hitpoints - 1)/Math.Max(me.Damage - enemy.Armor, 1);
     return myRoundsToDeath >= enemyRoundsToDeath;
 }