Advertisement
Guest User

Advent of Code Day 21: RPG Simulator 20XX

a guest
Dec 21st, 2015
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.43 KB | None | 0 0
  1. // Advent of Code
  2. // Day 21: RPG Simulator 20XX
  3.  
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7.  
  8. namespace AdventOfCode
  9. {
  10.     public class AdventOfCode21
  11.     {
  12.         public static void Main(string[] args)
  13.         {
  14.             Item[] weapons = new Item[]
  15.             {
  16.                 new Item("Dagger", 8, 4, 0),
  17.                 new Item("Shortsword", 10, 5, 0),
  18.                 new Item("Warhammer", 25, 6, 0),
  19.                 new Item("Longsword", 40, 7, 0),
  20.                 new Item("Greataxe", 74, 8, 0)
  21.             };
  22.  
  23.             Item[] armor = new Item[]
  24.             {
  25.                 new Item("Leather", 13, 0, 1),
  26.                 new Item("Chainmail", 31, 0, 2),
  27.                 new Item("Splintmail", 53, 0, 3),
  28.                 new Item("Bandedmail", 75, 0, 4),
  29.                 new Item("Platemail", 102, 0, 5)
  30.             };
  31.  
  32.             Item[] rings = new Item[]
  33.             {
  34.                 new Item("Damage +1", 25, 1, 0),
  35.                 new Item("Damage +2", 50, 2, 0),
  36.                 new Item("Damage +3", 100, 3, 0),
  37.                 new Item("Defense +1", 20, 0, 1),
  38.                 new Item("Defense +2", 40, 0, 2),
  39.                 new Item("Defense +3", 80, 0, 3)
  40.             };
  41.  
  42.             List<Player> wins = new List<Player>();
  43.             List<Player> losses = new List<Player>();
  44.  
  45.             for (int i=0; i < weapons.Length; i++)
  46.             {
  47.                 for (int j = -1; j < armor.Length; j++)
  48.                 {
  49.                     for (int k = -1; k < rings.Length; k++)
  50.                     {
  51.                         for (int l = -1; l <= k; l++)
  52.                         {
  53.                             if (k >= 0 && k == l) { continue; }
  54.  
  55.                             Player boss = new Player(104) { Damage = 8, Armor = 1 };
  56.                             Player player = new Player(100);
  57.                             player.Equip(weapons[i]);
  58.                             if (j >= 0) { player.Equip(armor[j]); }
  59.                             if (k >= 0) { player.Equip(rings[k]); }
  60.                             if (l >= 0) { player.Equip(rings[l]); }
  61.                            
  62.                             if (Shots(player, boss) >= Shots(boss, player))
  63.                             {
  64.                                 wins.Add(player);
  65.                             }
  66.                             else
  67.                             {
  68.                                 losses.Add(player);
  69.                             }
  70.                         }
  71.                     }
  72.                 }
  73.             }
  74.  
  75.             Player minWinner = wins.OrderBy(p => p.Spent).First();
  76.             Console.WriteLine("Min winner: " + minWinner.Spent + " (" + String.Join(", ", minWinner.Arsenal.Select(i => i.Name)) + ")");
  77.  
  78.             Player maxLoser = losses.OrderBy(p => p.Spent).Last();
  79.             Console.WriteLine("Max loser: " + maxLoser.Spent + " (" + String.Join(", ", maxLoser.Arsenal.Select(i => i.Name)) + ")");
  80.  
  81.             Console.ReadKey();
  82.         }
  83.  
  84.         private static int Shots(Player a, Player b)
  85.         {
  86.             int shotDamage = Math.Max(b.Damage - a.Armor, 1);
  87.             int shots = a.HitPoints / shotDamage;
  88.             int rem = a.HitPoints % shotDamage;
  89.             return shots + (rem > 0 ? 1 : 0);
  90.         }
  91.  
  92.         private class Player
  93.         {
  94.             public int HitPoints { get; set; }
  95.             public int Damage { get; set; }
  96.             public int Armor { get; set; }
  97.             public int Spent { get; private set; }
  98.             public List<Item> Arsenal { get; private set; }
  99.  
  100.             public Player(int hitPoints)
  101.             {
  102.                 this.HitPoints = hitPoints;
  103.                 Arsenal = new List<Item>();
  104.             }
  105.  
  106.             public void Equip(Item item)
  107.             {
  108.                 this.Damage += item.Damage;
  109.                 this.Armor += item.Armor;
  110.                 this.Spent += item.Cost;
  111.                 this.Arsenal.Add(item);
  112.             }
  113.         }
  114.  
  115.         private class Item
  116.         {
  117.             public string Name { get; }
  118.             public int Cost { get; }
  119.             public int Damage { get; }
  120.             public int Armor { get; }
  121.  
  122.             public Item(string name, int cost, int damage, int armor)
  123.             {
  124.                 this.Name = name;
  125.                 this.Cost = cost;
  126.                 this.Damage = damage;
  127.                 this.Armor = armor;
  128.             }
  129.         }
  130.     }
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement