bastien.monsarrat 7 éve
szülő
commit
cda90278f4
5 módosított fájl, 209 hozzáadás és 1 törlés
  1. 6 0
      Adv2018.sln
  2. 1 1
      D13.1/input.txt
  3. 10 0
      D13.2/D13.2.csproj
  4. 184 0
      D13.2/Program.cs
  5. 8 0
      D13.2/Properties/launchSettings.json

+ 6 - 0
Adv2018.sln

@@ -55,6 +55,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "D12.2", "D12.2\D12.2.csproj
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "D13.1", "D13.1\D13.1.csproj", "{3CF576D2-C0DA-4781-917C-010792190952}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "D13.2", "D13.2\D13.2.csproj", "{50E6029A-7019-44A3-B790-D2F556A0FF2E}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -165,6 +167,10 @@ Global
 		{3CF576D2-C0DA-4781-917C-010792190952}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{3CF576D2-C0DA-4781-917C-010792190952}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{3CF576D2-C0DA-4781-917C-010792190952}.Release|Any CPU.Build.0 = Release|Any CPU
+		{50E6029A-7019-44A3-B790-D2F556A0FF2E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{50E6029A-7019-44A3-B790-D2F556A0FF2E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{50E6029A-7019-44A3-B790-D2F556A0FF2E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{50E6029A-7019-44A3-B790-D2F556A0FF2E}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE

+ 1 - 1
D13.1/input.txt

@@ -147,4 +147,4 @@
  |   \--------------------------------------------+------------------++----------------------------/   |                                |             
  |                                                |                  \+------------------------------>-+--------------------------------/             
  \------------------------------------------------+-------------------/                                |                                              
-                                                  \----------------------------------------------------/                                              
+                                                  \----------------------------------------------------/                                              

+ 10 - 0
D13.2/D13.2.csproj

@@ -0,0 +1,10 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <OutputType>Exe</OutputType>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
+    <RootNamespace>D13._2</RootNamespace>
+    <LangVersion>7.3</LangVersion>
+  </PropertyGroup>
+
+</Project>

+ 184 - 0
D13.2/Program.cs

@@ -0,0 +1,184 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+
+namespace D13._2
+{
+    class Track : Dictionary<(int x, int y), char> { };
+    class Carts : List<(int x, int y, int vx, int vy, int t)> { };
+
+    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 track = new Track();
+            var carts = new Carts();
+
+            FillTrack(file, track, carts);
+
+            int? last = null;
+            while (last == null)
+            {
+                carts.Sort((a, b) => a.x.CompareTo(b.x));
+                carts.Sort((a, b) => a.y.CompareTo(b.y));
+
+                tick(track, carts);
+
+                last = lastCart(carts);
+            }
+            tick(track, carts);
+
+            var l = carts[last.Value];
+            Console.WriteLine($"The answer is \"{l.x},{l.y}\" ({l.vx},{l.vy})");
+        }
+
+        private static void FillTrack(StreamReader file, Track track, Carts carts)
+        {
+            int y = 0;
+            do
+            {
+                var line = file.ReadLine();
+                if (line == null) break;
+
+                for (int x = 0; x < line.Length; ++x)
+                {
+                    char c = line[x];
+                    if (c == ' ') continue;
+
+                    if (isCart(c))
+                    {
+                        carts.Add(getCart(c, x, y));
+                        c = c == '>' || c == '<' ? '-' : '|';
+                    }
+
+                    track[(x, y)] = c;
+                }
+
+                y++;
+
+            } while (true);
+        }
+
+        private static void tick(Track track, Carts carts)
+        {
+            for (var i = 0; i < carts.Count; ++i)
+            {
+                var cart = carts[i];
+                if (cart == default) continue;
+
+                cart.x += cart.vx;
+                cart.y += cart.vy;
+
+                if (inter(carts, cart, i)) continue;
+
+                var c = track[(cart.x, cart.y)];
+
+                var ncart = getCart(c, cart);
+                carts[i] = ncart;
+            }
+        }
+
+        static int? lastCart(Carts carts)
+        {
+            int count = 0;
+            int? cart = null;
+
+            for (var i = 0; i < carts.Count; ++i)
+            {
+                if (carts[i] == default) continue;
+
+                cart = i;
+                count++;
+            }
+            return count == 1 ? cart : null;
+        }
+
+        static bool inter(Carts carts, (int x, int y, int vx, int vy, int t) cj, int skip)
+        {
+            for (var i = 0; i < carts.Count; ++i)
+            {
+                if (i == skip) continue;
+
+                var ci = carts[i];
+                if (ci == default) continue;
+
+                if (ci.x == cj.x && ci.y == cj.y)
+                {
+                    carts[i] = default;
+                    carts[skip] = default;
+                    return true;
+                }
+            }
+
+            return false;
+        }
+
+        static bool isCart(char c)
+        {
+            return c == '>' || c == '<' || c == '^' || c == 'v';
+        }
+
+        static (int x, int y, int vx, int vy, int t) getCart(char c, int x, int y)
+        {
+            switch (c)
+            {
+                case '>': return (x, y, +1, +0, 0);
+                case '<': return (x, y, -1, +0, 0);
+                case '^': return (x, y, +0, -1, 0);
+                case 'v': return (x, y, +0, +1, 0);
+            }
+            return default;
+        }
+
+        static (int x, int y, int vx, int vy, int t) getCart(char c, (int x, int y, int vx, int vy, int t) cart)
+        {
+            if (c == '|' || c == '-') return cart;
+            if (c == '+' && cart.t == 1)
+            {
+                cart.t++;
+                return cart;
+            }
+
+            switch (cart)
+            {
+                case var t when t.vx == 1 && t.vy == 0:
+
+                    if (c == '/') return (cart.x, cart.y, +0, -1, cart.t);
+                    if (c == '\\') return (cart.x, cart.y, +0, +1, cart.t);
+                    if (c == '+' && cart.t == 0) return (cart.x, cart.y, +0, -1, 1);
+                    if (c == '+' && cart.t == 2) return (cart.x, cart.y, +0, +1, 0);
+                    return default;
+
+                case var t when t.vx == -1 && t.vy == 0:
+
+                    if (c == '/') return (cart.x, cart.y, +0, +1, cart.t);
+                    if (c == '\\') return (cart.x, cart.y, +0, -1, cart.t);
+                    if (c == '+' && cart.t == 0) return (cart.x, cart.y, +0, +1, 1);
+                    if (c == '+' && cart.t == 2) return (cart.x, cart.y, +0, -1, 0);
+                    return default;
+
+                case var t when t.vx == 0 && t.vy == 1:
+
+                    if (c == '/') return (cart.x, cart.y, -1, +0, cart.t);
+                    if (c == '\\') return (cart.x, cart.y, +1, +0, cart.t);
+                    if (c == '+' && cart.t == 0) return (cart.x, cart.y, +1, +0, 1);
+                    if (c == '+' && cart.t == 2) return (cart.x, cart.y, -1, +0, 0);
+                    return default;
+
+                case var t when t.vx == 0 && t.vy == -1:
+
+                    if (c == '/') return (cart.x, cart.y, +1, +0, cart.t);
+                    if (c == '\\') return (cart.x, cart.y, -1, +0, cart.t);
+                    if (c == '+' && cart.t == 0) return (cart.x, cart.y, -1, +0, 1);
+                    if (c == '+' && cart.t == 2) return (cart.x, cart.y, +1, +0, 0);
+                    return default;
+            }
+            return default;
+        }
+    }
+}

+ 8 - 0
D13.2/Properties/launchSettings.json

@@ -0,0 +1,8 @@
+{
+  "profiles": {
+    "D13.2": {
+      "commandName": "Project",
+      "commandLineArgs": "\"D:\\adv\\Adv2018\\D13.1\\input.txt\" "
+    }
+  }
+}