| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- namespace D16._1
- {
- public class Computer
- {
- public ProcessUnit CPU { get; private set; }
- public Computer() => CPU = new ProcessUnit();
- public class ProcessUnit
- {
- public delegate void OpCode(ushort a, ushort b, ushort c);
- public Register[] Registers = new Register[4] { 0, 0, 0, 0 };
- public OpCode[] OpCodes;
- public void SetRegisters(ushort[] registers)
- {
- for (var i = 0; i < Registers.Length; ++i)
- Registers[i] = registers[i];
- }
- public ProcessUnit()
- {
- OpCodes = new OpCode[]
- {
- (a, b, c) => { Registers[c] = Registers[a] + Registers[b]; },
- (a, b, c) => { Registers[c] = Registers[a] + b; },
- (a, b, c) => { Registers[c] = Registers[a] * Registers[b]; },
- (a, b, c) => { Registers[c] = Registers[a] * b; },
- (a, b, c) => { Registers[c] = Registers[a] & Registers[b]; },
- (a, b, c) => { Registers[c] = Registers[a] & b; },
- (a, b, c) => { Registers[c] = Registers[a] | Registers[b]; },
- (a, b, c) => { Registers[c] = Registers[a] | b; },
- (a, b, c) => { Registers[c] = Registers[a]; },
- (a, b, c) => { Registers[c] = a; },
- (a, b, c) => { Registers[c] = a > Registers[b] ? 1 : 0; },
- (a, b, c) => { Registers[c] = Registers[a] > b ? 1 : 0; },
- (a, b, c) => { Registers[c] = Registers[a] > Registers[b] ? 1 : 0; },
- (a, b, c) => { Registers[c] = a == Registers[b] ? 1 : 0; },
- (a, b, c) => { Registers[c] = Registers[a] == b ? 1 : 0; },
- (a, b, c) => { Registers[c] = Registers[a] == Registers[b] ? 1 : 0; },
- };
- }
- public class Register
- {
- ushort Value { get; set; }
- public static implicit operator Register(ushort a) => new Register { Value = a };
- public static implicit operator ushort(Register a) => a.Value;
- public static implicit operator Register(int a) => new Register { Value = (ushort)a };
- public static bool operator >(Register a, Register b) => a.Value > b.Value;
- public static bool operator <(Register a, Register b) => a.Value < b.Value;
- public static bool operator ==(Register a, Register b) => a.Value == b.Value;
- public static bool operator !=(Register a, Register b) => a.Value != b.Value;
- public override bool Equals(object obj)
- {
- var register = obj as Register;
- return register != null &&
- Value == register.Value;
- }
- public override int GetHashCode() => HashCode.Combine(Value);
- }
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- if (args.Length < 1) return;
- if (File.Exists(args[0]) == false) return;
- var file = File.OpenText(args[0]);
- var pc = new Computer();
- var result = 0;
- bool prevIsBlank = false;
- do
- {
- var line = file.ReadLine();
- if (line == null) break;
- if (line == string.Empty || line.StartsWith("//"))
- {
- if (prevIsBlank) break;
- prevIsBlank = true;
- continue;
- }
- else prevIsBlank = false;
- string before = line;
- string op = file.ReadLine();
- string after = file.ReadLine();
- var regBefore = before.Substring(9, before.Length - 10).Split(", ").Select(s => ushort.Parse(s)).ToArray();
- var regAfter = after.Substring(9, after.Length - 10).Split(", ").Select(s => ushort.Parse(s)).ToArray();
- var opParams = op.Split(" ").Select(s => ushort.Parse(s)).ToArray();
- var count = 0;
- foreach (var opc in pc.CPU.OpCodes)
- {
- pc.CPU.SetRegisters(regBefore);
- opc(opParams[1], opParams[2], opParams[3]);
- var regresult = pc.CPU.Registers;
- bool isSame = regresult[opParams[3]] == regAfter[opParams[3]];
- if (isSame) count++;
- }
- if (count >= 3) result++;
- } while (true);
-
- Console.WriteLine($"The result is : {result}");
- }
- }
- }
|