From 4b36c6b6040696440855aabfea60330a46b40967 Mon Sep 17 00:00:00 2001 From: "Valeriano A.R" Date: Fri, 7 Dec 2018 01:02:32 +0100 Subject: [PATCH] Code for Day06 part 1 --- .../AdventOfCode2018.Tests.csproj | 1 + AdventOfCode2018.Tests/ChronoPoint_Tests.cs | 65 ++++++++++++++ AdventOfCode2018/Day06.cs | 90 ++++++++++++++++++- 3 files changed, 154 insertions(+), 2 deletions(-) create mode 100644 AdventOfCode2018.Tests/ChronoPoint_Tests.cs diff --git a/AdventOfCode2018.Tests/AdventOfCode2018.Tests.csproj b/AdventOfCode2018.Tests/AdventOfCode2018.Tests.csproj index 27be6ca..e5bf186 100644 --- a/AdventOfCode2018.Tests/AdventOfCode2018.Tests.csproj +++ b/AdventOfCode2018.Tests/AdventOfCode2018.Tests.csproj @@ -56,6 +56,7 @@ + diff --git a/AdventOfCode2018.Tests/ChronoPoint_Tests.cs b/AdventOfCode2018.Tests/ChronoPoint_Tests.cs new file mode 100644 index 0000000..10fd38b --- /dev/null +++ b/AdventOfCode2018.Tests/ChronoPoint_Tests.cs @@ -0,0 +1,65 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace AdventOfCode2018.Tests +{ + [TestClass()] + public class ChronoPoint_Tests + { + #region FromString + + [TestMethod()] + public void FromString__Test1() + { + ChronoPoint point = ChronoPoint.FromString("1, 1"); + + Assert.AreEqual(1, point.X); + Assert.AreEqual(1, point.Y); + } + + [TestMethod()] + public void FromString__Test2() + { + ChronoPoint point = ChronoPoint.FromString("1, 6"); + + Assert.AreEqual(1, point.X); + Assert.AreEqual(6, point.Y); + } + + [TestMethod()] + public void FromString__Test3() + { + ChronoPoint point = ChronoPoint.FromString("8, 9"); + + Assert.AreEqual(8, point.X); + Assert.AreEqual(9, point.Y); + } + + #endregion FromString + + #region ManhattanDistance + + [TestMethod()] + public void ManhattanDistance__Test1() + { + ChronoPoint p0 = ChronoPoint.FromString("8, 9"); + ChronoPoint p1 = ChronoPoint.FromString("1, 6"); + + int distance = ChronoPoint.ManhattanDistance(p0, p1); + + Assert.AreEqual(10, distance); + } + + [TestMethod()] + public void ManhattanDistance__Test2() + { + ChronoPoint p0 = ChronoPoint.FromString("1, 1"); + ChronoPoint p1 = ChronoPoint.FromString("1, 6"); + + int distance = ChronoPoint.ManhattanDistance(p0, p1); + + Assert.AreEqual(5, distance); + } + + #endregion ManhattanDistance + } +} \ No newline at end of file diff --git a/AdventOfCode2018/Day06.cs b/AdventOfCode2018/Day06.cs index ffacc84..ec17555 100644 --- a/AdventOfCode2018/Day06.cs +++ b/AdventOfCode2018/Day06.cs @@ -1,4 +1,8 @@ -namespace AdventOfCode2018 +using System; +using System.Collections.Generic; +using System.Linq; + +namespace AdventOfCode2018 { /* --- Day 6: Chronal Coordinates --- @@ -59,7 +63,64 @@ { public string ResolvePart1(string[] inputs) { - return null; + List points = inputs + .Where(input => string.IsNullOrEmpty(input) == false) + .Select(input => ChronoPoint.FromString(input)) + .ToList(); + Dictionary pointsAreas = new Dictionary(); + for (int i = 0; i < points.Count; i++) + { + pointsAreas.Add(i, 0); + } + + int minX = points.Min(p => p.X) - 1; + int maxX = points.Max(p => p.X) + 1; + int minY = points.Min(p => p.Y) - 1; + int maxY = points.Max(p => p.Y) + 1; + + ChronoPoint samplingPoint = new ChronoPoint(); + for(int i=minX; i <= maxX; i++) + { + for(int j = minY; j <= maxY; j++) + { + samplingPoint.X = i; + samplingPoint.Y = j; + bool isEdge = i == minX || i == maxX || j == minY || j == maxY; + + int idxMin = -1; + int distanceMin = int.MaxValue; + for (int idx = 0; idx < points.Count; idx++) + { + int distance = ChronoPoint.ManhattanDistance(samplingPoint, points[idx]); + if (distance == distanceMin) + { + idxMin = -1; + } + else if (distance < distanceMin) + { + distanceMin = distance; + idxMin = idx; + } + } + if (idxMin < 0) { continue; } + + if (isEdge) + { + pointsAreas[idxMin] = -1; + } + else + { + int previousArea = pointsAreas[idxMin]; + if (previousArea >= 0) + { + pointsAreas[idxMin] = previousArea + 1; + } + } + } + } + + int maxArea = pointsAreas.Max(p => p.Value); + return maxArea.ToString(); } public string ResolvePart2(string[] inputs) @@ -67,4 +128,29 @@ return null; } } + + public class ChronoPoint + { + public int X { get; set; } + public int Y { get; set; } + + public static ChronoPoint FromString(string strPoint) + { + if (string.IsNullOrEmpty(strPoint)) { return null; } + string[] parts = strPoint.Split(new string[] { ", ", }, StringSplitOptions.RemoveEmptyEntries); + if (parts.Length < 2) { return null; } + ChronoPoint point = new ChronoPoint + { + X = Convert.ToInt32(parts[0]), + Y = Convert.ToInt32(parts[1]), + }; + return point; + } + + public static int ManhattanDistance(ChronoPoint p0, ChronoPoint p1) + { + int distance = Math.Abs(p1.X - p0.X) + Math.Abs(p1.Y - p0.Y); + return distance; + } + } }