Glærferyn 6 سال پیش
والد
کامیت
62631dccc2
5فایلهای تغییر یافته به همراه246 افزوده شده و 0 حذف شده
  1. 6 0
      Adv2018.sln
  2. 9 0
      D19.1/D19.1.csproj
  3. 186 0
      D19.1/Program.cs
  4. 8 0
      D19.1/Properties/launchSettings.json
  5. 37 0
      D19.1/input.txt

+ 6 - 0
Adv2018.sln

@@ -77,6 +77,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "D18.1", "D18.1\D18.1.csproj
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "D18.2", "D18.2\D18.2.csproj", "{8197F29E-B659-487A-B91B-DE58E19A4365}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "D19.1", "D19.1\D19.1.csproj", "{C144EBD4-9A70-4272-A006-A1E8F207315A}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -231,6 +233,10 @@ Global
 		{8197F29E-B659-487A-B91B-DE58E19A4365}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{8197F29E-B659-487A-B91B-DE58E19A4365}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{8197F29E-B659-487A-B91B-DE58E19A4365}.Release|Any CPU.Build.0 = Release|Any CPU
+		{C144EBD4-9A70-4272-A006-A1E8F207315A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{C144EBD4-9A70-4272-A006-A1E8F207315A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{C144EBD4-9A70-4272-A006-A1E8F207315A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{C144EBD4-9A70-4272-A006-A1E8F207315A}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE

+ 9 - 0
D19.1/D19.1.csproj

@@ -0,0 +1,9 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <OutputType>Exe</OutputType>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
+    <RootNamespace>D19._1</RootNamespace>
+  </PropertyGroup>
+
+</Project>

+ 186 - 0
D19.1/Program.cs

@@ -0,0 +1,186 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+
+namespace D19._1
+{
+    public class Computer
+    {
+        protected ProcessUnit CPU { get; private set; }
+
+        uint Ip = 0;
+        List<(uint op, uint[] param)> Program;
+
+        Parser InstrParser = new Parser();
+
+        public Computer() => CPU = new ProcessUnit();
+
+        public bool ExecInstruction()
+        {
+            CPU.Registers[CPU.IpRegister] = Ip;
+
+            var instr = Program[(int)Ip];
+            CPU.OpCodes[instr.op](instr.param[0], instr.param[1], instr.param[2]);
+
+            Ip = CPU.Registers[CPU.IpRegister];
+            Ip++;
+            return Ip < Program.Count;
+        }
+
+        public void LoadProgram(StreamReader program)
+        {
+            (uint ip, List<(uint, uint[])> p) = InstrParser.Parse(program);
+            Program = p;
+            CPU.IpRegister = ip;
+        }
+
+        public void DumpRegisters()
+        {
+            Console.WriteLine($"[ { string.Join(", ", CPU.Registers.Select(r => r.Value)) } ]");
+        }
+
+        protected internal class Parser
+        {
+            Dictionary<string, uint> OpCodes = new Dictionary<string, uint>
+            {
+                { "addr", 0 },
+                { "addi", 1 },
+                { "mulr", 2 },
+                { "muli", 3 },
+                { "banr", 4 },
+                { "bani", 5 },
+                { "borr", 6 },
+                { "bori", 7 },
+                { "setr", 8 },
+                { "seti", 9 },
+                { "gtir", 10 },
+                { "gtri", 11 },
+                { "gtrr", 12 },
+                { "eqir", 13 },
+                { "eqri", 14 },
+                { "eqrr", 15 },
+            };
+
+            protected internal (uint, List<(uint, uint[])>) Parse(StreamReader file)
+            {
+                var result = new List<(uint, uint[])>();
+                uint ip = 0;
+                do
+                {
+                    var line = file.ReadLine();
+                    if (line == null) break;
+
+                    if (line == string.Empty) continue;
+                    if (line.StartsWith("#ip "))
+                    {
+                        ip = uint.Parse(line.Substring(4));
+                        continue;
+                    }
+
+                    result.Add(ParseLine(line));
+                } while (true);
+
+                return (ip, result);
+            }
+
+            protected (uint, uint[]) ParseLine(string line)
+            {
+                var all = line.Split(" ");
+
+                var opcode = all[0];
+                var opParams = all.Skip(1).Select(s => uint.Parse(s)).ToArray();
+
+                var op = OpCodes[opcode];
+
+                return (op, opParams);
+            }
+        }
+
+        public class ProcessUnit
+        {
+            public uint IpRegister { get; internal protected set; }
+            public delegate void OpCode(uint a, uint b, uint c);
+
+            public Register[] Registers = new Register[6] { 0, 0, 0, 0, 0, 0 };
+
+            public OpCode[] OpCodes;
+
+            public void SetRegisters(uint[] 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
+            {
+                public uint Value { get; private set; }
+
+                public Register() { }
+                public Register(uint value) => Value = value;
+
+                public static implicit operator Register(uint a) => new Register { Value = a };
+                public static implicit operator uint(Register a) => a.Value;
+                public static implicit operator Register(int a) => new Register { Value = (uint)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 is null == false &&
+                           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 pc = new Computer();
+            var file = File.OpenText(args[0]);
+            pc.LoadProgram(file);
+            file.Close();
+
+            pc.DumpRegisters();
+            Console.WriteLine("==== EXECUTING PROGRAM ===");
+
+            while (pc.ExecInstruction());
+
+            Console.WriteLine("====== PROGRAM ENDED =====");
+            pc.DumpRegisters();
+        }
+    }
+}

+ 8 - 0
D19.1/Properties/launchSettings.json

@@ -0,0 +1,8 @@
+{
+  "profiles": {
+    "D19.1": {
+      "commandName": "Project",
+      "commandLineArgs": "\"..\\..\\..\\..\\D19.1\\input.txt\" "
+    }
+  }
+}

+ 37 - 0
D19.1/input.txt

@@ -0,0 +1,37 @@
+#ip 3
+addi 3 16 3
+seti 1 0 4
+seti 1 7 2
+mulr 4 2 1
+eqrr 1 5 1
+addr 1 3 3
+addi 3 1 3
+addr 4 0 0
+addi 2 1 2
+gtrr 2 5 1
+addr 3 1 3
+seti 2 6 3
+addi 4 1 4
+gtrr 4 5 1
+addr 1 3 3
+seti 1 3 3
+mulr 3 3 3
+addi 5 2 5
+mulr 5 5 5
+mulr 3 5 5
+muli 5 11 5
+addi 1 6 1
+mulr 1 3 1
+addi 1 13 1
+addr 5 1 5
+addr 3 0 3
+seti 0 6 3
+setr 3 1 1
+mulr 1 3 1
+addr 3 1 1
+mulr 3 1 1
+muli 1 14 1
+mulr 1 3 1
+addr 5 1 5
+seti 0 0 0
+seti 0 3 3