Program.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. namespace D16._1
  6. {
  7. public class Computer
  8. {
  9. public ProcessUnit CPU { get; private set; }
  10. public Computer() => CPU = new ProcessUnit();
  11. public class ProcessUnit
  12. {
  13. public delegate void OpCode(ushort a, ushort b, ushort c);
  14. public Register[] Registers = new Register[4] { 0, 0, 0, 0 };
  15. public OpCode[] OpCodes;
  16. public void SetRegisters(ushort[] registers)
  17. {
  18. for (var i = 0; i < Registers.Length; ++i)
  19. Registers[i] = registers[i];
  20. }
  21. public ProcessUnit()
  22. {
  23. OpCodes = new OpCode[]
  24. {
  25. (a, b, c) => { Registers[c] = Registers[a] + Registers[b]; },
  26. (a, b, c) => { Registers[c] = Registers[a] + b; },
  27. (a, b, c) => { Registers[c] = Registers[a] * Registers[b]; },
  28. (a, b, c) => { Registers[c] = Registers[a] * b; },
  29. (a, b, c) => { Registers[c] = Registers[a] & Registers[b]; },
  30. (a, b, c) => { Registers[c] = Registers[a] & b; },
  31. (a, b, c) => { Registers[c] = Registers[a] | Registers[b]; },
  32. (a, b, c) => { Registers[c] = Registers[a] | b; },
  33. (a, b, c) => { Registers[c] = Registers[a]; },
  34. (a, b, c) => { Registers[c] = a; },
  35. (a, b, c) => { Registers[c] = a > Registers[b] ? 1 : 0; },
  36. (a, b, c) => { Registers[c] = Registers[a] > b ? 1 : 0; },
  37. (a, b, c) => { Registers[c] = Registers[a] > Registers[b] ? 1 : 0; },
  38. (a, b, c) => { Registers[c] = a == Registers[b] ? 1 : 0; },
  39. (a, b, c) => { Registers[c] = Registers[a] == b ? 1 : 0; },
  40. (a, b, c) => { Registers[c] = Registers[a] == Registers[b] ? 1 : 0; },
  41. };
  42. }
  43. public class Register
  44. {
  45. ushort Value { get; set; }
  46. public static implicit operator Register(ushort a) => new Register { Value = a };
  47. public static implicit operator ushort(Register a) => a.Value;
  48. public static implicit operator Register(int a) => new Register { Value = (ushort)a };
  49. public static bool operator >(Register a, Register b) => a.Value > b.Value;
  50. public static bool operator <(Register a, Register b) => a.Value < b.Value;
  51. public static bool operator ==(Register a, Register b) => a.Value == b.Value;
  52. public static bool operator !=(Register a, Register b) => a.Value != b.Value;
  53. public override bool Equals(object obj)
  54. {
  55. var register = obj as Register;
  56. return register != null &&
  57. Value == register.Value;
  58. }
  59. public override int GetHashCode() => HashCode.Combine(Value);
  60. }
  61. }
  62. }
  63. class Program
  64. {
  65. static void Main(string[] args)
  66. {
  67. if (args.Length < 1) return;
  68. if (File.Exists(args[0]) == false) return;
  69. var file = File.OpenText(args[0]);
  70. var pc = new Computer();
  71. var result = new Dictionary<int, int>();
  72. bool prevIsBlank = false;
  73. int sample = 0;
  74. do
  75. {
  76. var line = file.ReadLine();
  77. if (line == null) break;
  78. if (line == string.Empty || line.StartsWith("//"))
  79. {
  80. if (prevIsBlank) break;
  81. prevIsBlank = true;
  82. continue;
  83. }
  84. else prevIsBlank = false;
  85. result.Add(sample, 0);
  86. string before = line;
  87. string op = file.ReadLine();
  88. string after = file.ReadLine();
  89. var regBefore = before.Substring(9, before.Length - 10).Split(", ").Select(s => ushort.Parse(s)).ToArray();
  90. var regAfter = after.Substring(9, after.Length - 10).Split(", ").Select(s => ushort.Parse(s)).ToArray();
  91. var opParams = op.Split(" ").Select(s => ushort.Parse(s)).ToArray();
  92. foreach (var opc in pc.CPU.OpCodes)
  93. {
  94. pc.CPU.SetRegisters(regBefore);
  95. opc(opParams[1], opParams[2], opParams[3]);
  96. var regresult = pc.CPU.Registers;
  97. bool isSame = regresult[opParams[3]] == regAfter[opParams[3]];
  98. if (isSame) result[sample]++;
  99. }
  100. sample++;
  101. } while (true);
  102. var resultCount = result.Count(r => r.Value >= 3);
  103. Console.WriteLine($"The result is : {resultCount}");
  104. }
  105. }
  106. }