public static class SolutionChecker { public static void Check(IOrderLogProcessor processor) { try { Console.WriteLine(); if (processor == null) { Print("Ошибка: не передан обработчик."); FinishError(); return; } var sw = new Stopwatch(); var first = GetResult(processor.GetLevels(), new List<Tuple<decimal, long>>()); if (first != null) { Print(string.Format("Ошибка: неверный ответ в начальном состоянии.\n{0}", first)); FinishError(); return; } var reference = new a_ii48(); for (var i = 0; i < Data.Orders.Count; i++) { sw.Start(); processor.Update(Data.Orders[i]); sw.Stop(); reference.Update(Data.Orders[i]); var next = GetResult(processor.GetLevels(), reference.GetLevels2()); if (next == null) continue; Print(string.Format("Ошибка: неверный ответ в строке {0}.\n{1}", i + 1, next)); FinishError(); return; } Print("Решение корректное."); } catch (Exception ex) { Console.WriteLine(); Console.WriteLine("Не удалось выполнить проверку решения: " + ex); Console.WriteLine(); } } private static void Print(string mes) { Console.WriteLine(mes); } private static string GetResult(IEnumerable<Tuple<decimal, long>> actual, List<Tuple<decimal, long>> expected) { if (actual == null) return expected.Count != 0 ? "Ожидается непустой ответ." : null; var list = actual.ToList(); list.Sort(); if (list.Count != expected.Count) { return string.Format("Неверное количество цен с активными заявками. Ожидается {0}, получено {1}.", expected.Count, list.Count); } if (list.Count == 0) return null; for (var i = 0; i < list.Count; i++) { var t1 = list[i]; var t2 = expected[i]; if (t1.Item1 != t2.Item1) return string.Format("Неверное значение цены. Ожидается {0}, получено {1}.", t2.Item1, t1.Item1); if (t1.Item2 != t2.Item2) return string.Format("Неверное значение объема. Ожидается {0}, получено {1}.", t2.Item2, t1.Item2); } return null; } private static void FinishError() { Console.WriteLine("Решение не прошло проверку."); } } internal class Data { internal static List<OrderLogEntry> Orders = new List<OrderLogEntry> { new OrderLogEntry("GZZ3", "S", 20131114100002978, "11692141271", false, 14509, 300), new OrderLogEntry("GZZ3", "B", 20131114100002986, "11692141282", false, 14450, 300), new OrderLogEntry("GZZ3", "S", 20131114100002997, "11692141271", true, 14509, 300), new OrderLogEntry("GZZ3", "B", 20131114100002998, "11692141282", true, 14450, 300), new OrderLogEntry("GZZ3", "S", 20131114100003056, "11692141382", false, 14507, 300), new OrderLogEntry("GZZ3", "B", 20131114100003063, "11692141391", false, 14450, 300), new OrderLogEntry("GZZ3", "B", 20131114100003101, "11692141391", true, 14450, 300), new OrderLogEntry("GZZ3", "B", 20131114100003110, "11692141468", false, 14453, 300), new OrderLogEntry("GZZ3", "B", 20131114100003183, "11692141468", true, 14453, 300), new OrderLogEntry("GZZ3", "B", 20131114100003194, "11692141536", false, 14449, 300), new OrderLogEntry("GZZ3", "B", 20131114100003235, "11692141536", true, 14449, 300), new OrderLogEntry("GZZ3", "B", 20131114100003245, "11692141590", false, 14451, 300), new OrderLogEntry("GZZ3", "B", 20131114100003299, "11692141590", true, 14451, 300), new OrderLogEntry("GZZ3", "B", 20131114100003308, "11692141663", false, 14452, 300), new OrderLogEntry("GZZ3", "B", 20131114100003321, "11692141675", false, 14447, 295), new OrderLogEntry("GZZ3", "B", 20131114100003356, "11692141675", false, 14447, 294), new OrderLogEntry("GZZ3", "B", 20131114100003398, "11692141675", true, 14447, 290), new OrderLogEntry("GZZ3", "S", 20131114100003465, "11692141382", true, 14507, 300), new OrderLogEntry("GZZ3", "S", 20131114100003473, "11692141790", false, 14509, 300), new OrderLogEntry("GZZ3", "S", 20131114100003475, "11692141790", true, 14509, 300), new OrderLogEntry("GZZ3", "S", 20131114100003487, "11692141809", false, 14508, 300), new OrderLogEntry("GZZ3", "B", 20131114100003508, "11692141663", true, 14452, 300), new OrderLogEntry("GZZ3", "B", 20131114100003525, "11692141842", false, 14453, 300), new OrderLogEntry("GZZ3", "B", 20131114100003725, "11692141842", true, 14453, 300), new OrderLogEntry("GZZ3", "B", 20131114100003732, "11692142035", false, 14451, 300), new OrderLogEntry("GZZ3", "B", 20131114100003739, "11692142035", true, 14451, 300), new OrderLogEntry("GZZ3", "B", 20131114100003750, "11692142048", false, 14452, 300), new OrderLogEntry("GZZ3", "B", 20131114100003766, "11692142048", true, 14452, 300), new OrderLogEntry("GZZ3", "B", 20131114100003778, "11692142108", false, 14453, 300), new OrderLogEntry("GZZ3", "S", 20131114100003783, "11692141809", true, 14508, 300), new OrderLogEntry("GZZ3", "S", 20131114100003788, "11692142133", false, 14507, 300), new OrderLogEntry("GZZ3", "B", 20131114100003797, "11692142108", true, 14453, 300), new OrderLogEntry("GZZ3", "B", 20131114100003824, "11692142179", false, 14451, 300), new OrderLogEntry("GZZ3", "B", 20131114100003844, "11692142179", true, 14451, 300), new OrderLogEntry("GZZ3", "B", 20131114100003863, "11692142222", false, 14452, 300), new OrderLogEntry("GZZ3", "B", 20131114100003877, "11692142222", true, 14452, 300), new OrderLogEntry("GZZ3", "B", 20131114100003885, "11692142251", false, 14453, 300), new OrderLogEntry("GZZ3", "B", 20131114100003959, "11692142251", true, 14453, 300), new OrderLogEntry("GZZ3", "B", 20131114100003976, "11692142304", false, 14449, 300), new OrderLogEntry("GZZ3", "B", 20131114100004081, "11692142304", true, 14449, 300), new OrderLogEntry("GZZ3", "B", 20131114100004093, "11692142430", false, 14451, 300), new OrderLogEntry("GZZ3", "B", 20131114100004166, "11692142430", true, 14451, 300), new OrderLogEntry("GZZ3", "S", 20131114100004179, "11692142133", true, 14507, 300), new OrderLogEntry("GZZ3", "B", 20131114100004180, "11692142508", false, 14449, 300), new OrderLogEntry("GZZ3", "B", 20131114100004187, "11692142508", true, 14449, 300), new OrderLogEntry("GZZ3", "S", 20131114100004188, "11692142520", false, 14509, 300), new OrderLogEntry("GZZ3", "B", 20131114100004200, "11692142531", false, 14451, 300), new OrderLogEntry("GZZ3", "B", 20131114100004201, "11692142531", true, 14451, 300), new OrderLogEntry("GZZ3", "B", 20131114100004218, "11692142544", false, 14453, 300), new OrderLogEntry("GZZ3", "B", 20131114100004268, "11692142544", true, 14453, 300), new OrderLogEntry("GZZ3", "B", 20131114100004276, "11692142588", false, 14452, 300), new OrderLogEntry("GZZ3", "S", 20131114100004289, "11692142520", true, 14509, 300), new OrderLogEntry("GZZ3", "S", 20131114100004305, "11692142614", false, 14509, 300), new OrderLogEntry("GZZ3", "B", 20131114100004338, "11692142588", true, 14452, 300), new OrderLogEntry("GZZ3", "B", 20131114100004353, "11692142659", false, 14450, 300), new OrderLogEntry("GZZ3", "B", 20131114100004390, "11692142659", true, 14450, 300), new OrderLogEntry("GZZ3", "B", 20131114100004403, "11692142744", false, 14452, 300), new OrderLogEntry("GZZ3", "S", 20131114100004420, "11692142614", true, 14509, 300), new OrderLogEntry("GZZ3", "S", 20131114100004435, "11692142802", false, 14508, 300), new OrderLogEntry("GZZ3", "B", 20131114100004443, "11692142744", true, 14452, 300), new OrderLogEntry("GZZ3", "B", 20131114100004483, "11692142852", false, 14449, 300), new OrderLogEntry("GZZ3", "B", 20131114100004487, "11692142852", true, 14449, 300), new OrderLogEntry("GZZ3", "B", 20131114100004512, "11692142894", false, 14450, 300), new OrderLogEntry("GZZ3", "B", 20131114100004528, "11692142894", true, 14450, 300), new OrderLogEntry("GZZ3", "B", 20131114100004529, "11692142905", false, 14449, 300), new OrderLogEntry("GZZ3", "B", 20131114100004546, "11692142905", false, 14449, 200), new OrderLogEntry("GZZ3", "B", 20131114100004550, "11692142946", false, 14452, 300), new OrderLogEntry("GZZ3", "B", 20131114100004582, "11692142998", false, 14452, 300), new OrderLogEntry("GZZ3", "S", 20131114100004614, "11692142802", true, 14508, 300), new OrderLogEntry("GZZ3", "S", 20131114100004633, "11692143033", false, 14508, 300), new OrderLogEntry("GZZ3", "B", 20131114100004648, "11692142998", true, 14452, 300), new OrderLogEntry("GZZ3", "B", 20131114100004677, "11692143087", false, 14452, 300), new OrderLogEntry("GZZ3", "S", 20131114100004692, "11692143033", true, 14508, 300), new OrderLogEntry("GZZ3", "B", 20131114100004734, "11692143087", true, 14452, 300), new OrderLogEntry("GZZ3", "B", 20131114100004769, "11692143163", false, 14453, 300), new OrderLogEntry("GZZ3", "B", 20131114100004809, "11692143163", true, 14453, 300), new OrderLogEntry("GZZ3", "S", 20131114100004840, "11692143212", false, 14508, 300), new OrderLogEntry("GZZ3", "S", 20131114100004844, "11692143212", true, 14508, 300), new OrderLogEntry("GZZ3", "S", 20131114100004916, "11692143282", false, 14507, 300), new OrderLogEntry("GZZ3", "S", 20131114100004917, "11692143282", true, 14507, 300), new OrderLogEntry("GZZ3", "B", 20131114100004919, "11692143284", false, 14450, 300), new OrderLogEntry("GZZ3", "B", 20131114100004925, "11692143284", true, 14450, 300), new OrderLogEntry("GZZ3", "S", 20131114100004986, "11692143364", false, 14505, 300), new OrderLogEntry("GZZ3", "B", 20131114100004988, "11692143367", false, 14456, 300), new OrderLogEntry("GZZ3", "S", 20131114100004989, "11692143364", true, 14505, 300), new OrderLogEntry("GZZ3", "B", 20131114100004990, "11692143367", true, 14456, 300), new OrderLogEntry("GZZ3", "B", 20131114100005051, "11692143409", false, 14486, 5), new OrderLogEntry("GZZ3", "B", 20131114100005051, "11692143409", false, 14486, 0), new OrderLogEntry("GZZ3", "B", 20131114100005100, "11692143429", false, 14451, 300), new OrderLogEntry("GZZ3", "B", 20131114100005106, "11692143431", false, 14490, 44), new OrderLogEntry("GZZ3", "B", 20131114100005106, "11692143431", false, 14490, 40), new OrderLogEntry("GZZ3", "B", 20131114100005106, "11692143431", false, 14490, 35), new OrderLogEntry("GZZ3", "B", 20131114100005106, "11692143431", false, 14490, 15), new OrderLogEntry("GZZ3", "B", 20131114100005106, "11692143431", false, 14490, 14), new OrderLogEntry("GZZ3", "B", 20131114100005106, "11692143431", false, 14490, 9), new OrderLogEntry("GZZ3", "B", 20131114100005106, "11692143431", false, 14490, 3), new OrderLogEntry("GZZ3", "B", 20131114100005106, "11692143431", false, 14490, 0), new OrderLogEntry("GZZ3", "S", 20131114100005107, "11692143432", false, 14514, 300), new OrderLogEntry("GZZ3", "B", 20131114100005197, "11692143485", false, 14457, 300), new OrderLogEntry("GZZ3", "B", 20131114100005203, "11692143485", true, 14457, 300), new OrderLogEntry("GZZ3", "B", 20131114100005283, "11692143555", false, 14459, 300), new OrderLogEntry("GZZ3", "B", 20131114100005284, "11692143555", true, 14459, 300), new OrderLogEntry("GZZ3", "B", 20131114100005361, "11692143635", false, 14457, 300), new OrderLogEntry("GZZ3", "B", 20131114100005378, "11692143635", true, 14457, 300), new OrderLogEntry("GZZ3", "B", 20131114100005475, "11692143757", false, 14461, 300), new OrderLogEntry("GZZ3", "B", 20131114100005476, "11692143757", true, 14461, 300), new OrderLogEntry("GZZ3", "B", 20131114100005564, "11692143803", false, 14456, 300), new OrderLogEntry("GZZ3", "B", 20131114100005564, "11692143803", true, 14456, 300), new OrderLogEntry("GZZ3", "B", 20131114100005660, "11692143861", false, 14460, 300), new OrderLogEntry("GZZ3", "B", 20131114100005661, "11692143861", true, 14460, 300), new OrderLogEntry("GZZ3", "B", 20131114100005670, "11692143870", false, 14461, 300), new OrderLogEntry("GZZ3", "B", 20131114100005750, "11692143870", true, 14461, 300), new OrderLogEntry("GZZ3", "B", 20131114100005769, "11692144023", false, 14462, 300), new OrderLogEntry("GZZ3", "B", 20131114100005770, "11692144023", true, 14462, 300), new OrderLogEntry("GZZ3", "B", 20131114100005810, "11692144084", false, 14462, 300), new OrderLogEntry("GZZ3", "B", 20131114100005812, "11692144084", true, 14462, 300), new OrderLogEntry("GZZ3", "B", 20131114100005826, "11692144097", false, 14463, 300), new OrderLogEntry("GZZ3", "B", 20131114100005832, "11692144097", true, 14463, 300), new OrderLogEntry("GZZ3", "B", 20131114100005842, "11692144127", false, 14454, 300), new OrderLogEntry("GZZ3", "B", 20131114100005850, "11692144127", true, 14454, 300), new OrderLogEntry("GZZ3", "B", 20131114100005865, "11692144158", false, 14458, 300), new OrderLogEntry("GZZ3", "B", 20131114100005871, "11692144158", true, 14458, 300), new OrderLogEntry("GZZ3", "B", 20131114100005892, "11692144172", false, 14463, 300), new OrderLogEntry("GZZ3", "B", 20131114100005909, "11692144172", true, 14463, 300), new OrderLogEntry("GZZ3", "B", 20131114100005957, "11692144229", false, 14454, 300), new OrderLogEntry("GZZ3", "S", 20131114100005962, "11692143432", true, 14514, 300), new OrderLogEntry("GZZ3", "B", 20131114100005967, "11692144229", true, 14454, 300), }; } internal sealed class a_ii48 : IOrderLogProcessor { private readonly Dictionary<decimal, Dictionary<string, long>> a_ii34; internal Dictionary<decimal, long> a_ii35 { get; private set; } internal a_ii48() { a_ii35 = new Dictionary<decimal, long>(); a_ii34 = new Dictionary<decimal, Dictionary<string, long>>(); } public void Update(OrderLogEntry a_ii36) { var a_ii37 = a_ii36.Price; var a_ii38 = a_ii36.Id; if (a_ii36.Volume == 0 || a_ii36.Deleted) { if (a_ii34.ContainsKey(a_ii37)) { a_ii34[a_ii37].Remove(a_ii38); if (a_ii34[a_ii37].Count == 0) a_ii34.Remove(a_ii37); } } else { if (!a_ii34.ContainsKey(a_ii37)) a_ii34[a_ii37] = new Dictionary<string, long>(); a_ii34[a_ii37][a_ii38] = a_ii36.Volume; } if (a_ii34.ContainsKey(a_ii37)) { var value = a_ii34[a_ii37].Sum(o => o.Value); if (a_ii35.ContainsKey(a_ii37)) a_ii35[a_ii37] = value; else a_ii35.Add(a_ii37, value); } else { a_ii35.Remove(a_ii37); } } public IEnumerable<Tuple<decimal, long>> GetLevels() { return a_ii35.Select(level => Tuple.Create(level.Key, level.Value)); } public List<Tuple<decimal, long>> GetLevels2() { return GetLevels().OrderBy(t => t.Item1).ToList(); } } }