/
Cubics_Assault_Solution.cs
82 lines (70 loc) · 2.53 KB
/
Cubics_Assault_Solution.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
namespace ExamProblems
{
using System;
using System.Collections.Generic;
using System.Linq;
enum Meteors
{
Green,
Red,
Black
}
class CubicAssault
{
static void Main(string[] args)
{
var regionsData = new Dictionary<string, Dictionary<Meteors, long>>();
string input;
while ((input = Console.ReadLine()) != "Count em all")
{
var parameters = input.Split(new[] { " -> " }, StringSplitOptions.RemoveEmptyEntries);
var region = parameters[0];
var type = (Meteors)Enum.Parse(typeof(Meteors), parameters[1]);
var amount = int.Parse(parameters[2]);
if (!regionsData.ContainsKey(region))
{
regionsData.Add(region, new Dictionary<Meteors, long>());
foreach (Meteors meteor in Enum.GetValues(typeof(Meteors)))
{
regionsData[region].Add(meteor, 0);
}
}
regionsData[region][type] += amount;
foreach (Meteors meteor in Enum.GetValues(typeof(Meteors)))
{
while (meteor != Meteors.Black && regionsData[region][meteor] >= 1000000)
{
regionsData[region][meteor] -= 1000000;
var nextType = NextMeteor(meteor);
regionsData[region][nextType] += 1;
}
}
}
foreach (var region in
regionsData.OrderByDescending(pair => pair.Value[Meteors.Black])
.ThenBy(pair => pair.Key.Length)
.ThenBy(pair => pair.Key))
{
Console.WriteLine(region.Key);
foreach (var meteor in
region.Value.OrderByDescending(meteor => meteor.Value)
.ThenBy(meteor => meteor.Key.ToString()))
{
Console.WriteLine($"-> {meteor.Key} : {meteor.Value}");
}
}
}
public static Meteors NextMeteor(Meteors meteor)
{
switch (meteor)
{
case Meteors.Green:
return Meteors.Red;
case Meteors.Red:
return Meteors.Black;
default:
throw new ArgumentOutOfRangeException(nameof(meteor), meteor, null);
}
}
}
}