public void Day3Method1() { var size = (int)Math.Sqrt(int.MaxValue); var origo = size / 2; var array1 = new BitArray(size * size); var array2 = new BitArray(size * size); // var path1 = TestInput3.Split(',').ToList(); var path1 = Day3Input1.Split(',').ToList(); int x = origo, y = origo; foreach (var leg1 in path1) { switch (leg1[0]) { case 'R': var upper = x + int.Parse(leg1.Substring(1)); for (; x <= upper; x++) { array1.Set(x + y * size, true); } x--; break; case 'L': var lower = x - int.Parse(leg1.Substring(1)); for (; x >= lower; x--) { array1.Set(x + y * size, true); } x++; break; case 'U': var upperY = y + int.Parse(leg1.Substring(1)); for (; y <= upperY; y++) { array1.Set(x + y * size, true); } y--; break; case 'D': var lowerY = y - int.Parse(leg1.Substring(1)); for (; y >= lowerY; y--) { array1.Set(x + y * size, true); } y++; break; } } // var path2 = TestInput4.Split(',').ToList(); var path2 = Day3Input2.Split(',').ToList(); x = origo; y = origo; foreach (var leg2 in path2) { switch (leg2[0]) { case 'R': var upper = x + int.Parse(leg2.Substring(1)); for (; x <= upper; x++) { array2.Set(x + y * size, true); } x--; break; case 'L': var lower = x - int.Parse(leg2.Substring(1)); for (; x >= lower; x--) { array2.Set(x + y * size, true); } x++; break; case 'U': var uppery = y + int.Parse(leg2.Substring(1)); for (; y <= uppery; y++) { array2.Set(x + y * size, true); } y--; break; case 'D': var lowery = y - int.Parse(leg2.Substring(1)); for (; y >= lowery; y--) { array2.Set(x + y * size, true); } y++; break; } } var crossings = array1.And(array2); var result = new List <int>(); for (int i = 0; i < crossings.Count; i++) { if (crossings[i]) { result.Add(Math.Abs(i % size - origo) + Math.Abs(i / size - origo)); } } TestContext.WriteLine(result.OrderBy(i => i).Skip(1).First().ToString()); }
public void Day3Method1C() { // var path1 = TestInput3.Split(',').ToList(); var path1 = Day3Input1.Split(',').ToList(); var coords1 = new HashSet <(int, int)>(); int x = 0, y = 0; foreach (var leg1 in path1) { switch (leg1[0]) { case 'R': var upperx = x + int.Parse(leg1.Substring(1)); for (; x <= upperx; x++) { coords1.Add((x, y)); } x--; break; case 'L': var lowerx = x - int.Parse(leg1.Substring(1)); for (; x >= lowerx; x--) { coords1.Add((x, y)); } x++; break; case 'U': var uppery = y + int.Parse(leg1.Substring(1)); for (; y <= uppery; y++) { coords1.Add((x, y)); } y--; break; case 'D': var lowery = y - int.Parse(leg1.Substring(1)); for (; y >= lowery; y--) { coords1.Add((x, y)); } y++; break; } } // var path2 = TestInput4.Split(',').ToList(); var path2 = Day3Input2.Split(',').ToList(); x = 0; y = 0; var coords2 = new HashSet <(int, int)>(); foreach (var leg2 in path2) { switch (leg2[0]) { case 'R': var upperx = x + int.Parse(leg2.Substring(1)); for (; x <= upperx; x++) { coords2.Add((x, y)); } x--; break; case 'L': var lowerx = x - int.Parse(leg2.Substring(1)); for (; x >= lowerx; x--) { coords2.Add((x, y)); } x++; break; case 'U': var uppery = y + int.Parse(leg2.Substring(1)); for (; y <= uppery; y++) { coords2.Add((x, y)); } y--; break; case 'D': var lowery = y - int.Parse(leg2.Substring(1)); for (; y >= lowery; y--) { coords2.Add((x, y)); } y++; break; } } coords1.IntersectWith(coords2); var result = coords1.Select(i => Math.Abs(i.Item1) + Math.Abs(i.Item2)); TestContext.WriteLine(result.Where(i => i != 0).Min().ToString()); }
public void Day3Method1A() { const int i1 = 20000; var array1 = new int[i1, i1]; var array2 = new int[i1, i1]; // var path1 = TestInput1.Split(',').ToList(); var path1 = Day3Input1.Split(',').ToList(); const int origo = 10000; int x = origo, y = origo; foreach (var leg1 in path1) { switch (leg1[0]) { case 'R': var upperx = x + int.Parse(leg1.Substring(1)); for (; x <= upperx; x++) { array1[x, y] = 1; } x--; break; case 'L': var lowerx = x - int.Parse(leg1.Substring(1)); for (; x >= lowerx; x--) { array1[x, y] = 1; } x++; break; case 'U': var uppery = y + int.Parse(leg1.Substring(1)); for (; y <= uppery; y++) { array1[x, y] = 1; } y--; break; case 'D': var lowery = y - int.Parse(leg1.Substring(1)); for (; y >= lowery; y--) { array1[x, y] = 1; } y++; break; } } // var path2 = TestInput2.Split(',').ToList(); var path2 = Day3Input2.Split(',').ToList(); x = origo; y = origo; foreach (var leg2 in path2) { switch (leg2[0]) { case 'R': var upperx = x + int.Parse(leg2.Substring(1)); for (; x <= upperx; x++) { array2[x, y] = 1; } x--; break; case 'L': var lowerx = x - int.Parse(leg2.Substring(1)); for (; x >= lowerx; x--) { array2[x, y] = 1; } x++; break; case 'U': var uppery = y + int.Parse(leg2.Substring(1)); for (; y <= uppery; y++) { array2[x, y] = 1; } y--; break; case 'D': var lowery = y - int.Parse(leg2.Substring(1)); for (; y >= lowery; y--) { array2[x, y] = 1; } y++; break; } } var result = new List <int>(); for (var j = 0; j < i1; j++) { for (int i = 0; i < i1; i++) { if (array1[i, j] == 1 && array2[i, j] == 1) { result.Add(Math.Abs(i - origo) + Math.Abs(j - origo)); } } } TestContext.WriteLine(result.Except(new[] { 0 }).Min().ToString()); }
public void Day3Method2() { // var path1 = TestInput3.Split(',').ToList(); var path1 = Day3Input1.Split(',').ToList(); var coords1 = new Dictionary <(int, int), int>(); int x = 0, y = 0; int step = 0; foreach (var leg1 in path1) { switch (leg1[0]) { case 'R': var upperx = x + int.Parse(leg1.Substring(1)); for (; x <= upperx; x++) { if (coords1.ContainsKey((x, y)) == false) { coords1.Add((x, y), step); } step++; } x--; break; case 'L': var lowerx = x - int.Parse(leg1.Substring(1)); for (; x >= lowerx; x--) { if (coords1.ContainsKey((x, y)) == false) { coords1.Add((x, y), step); } step++; } x++; break; case 'U': var uppery = y + int.Parse(leg1.Substring(1)); for (; y <= uppery; y++) { if (coords1.ContainsKey((x, y)) == false) { coords1.Add((x, y), step); } step++; } y--; break; case 'D': var lowery = y - int.Parse(leg1.Substring(1)); for (; y >= lowery; y--) { if (coords1.ContainsKey((x, y)) == false) { coords1.Add((x, y), step); } step++; } y++; break; } step--; } // var path2 = TestInput4.Split(',').ToList(); var path2 = Day3Input2.Split(',').ToList(); x = 0; y = 0; step = 0; var coords2 = new Dictionary <(int, int), int>(); foreach (var leg2 in path2) { switch (leg2[0]) { case 'R': var upperx = x + int.Parse(leg2.Substring(1)); for (; x <= upperx; x++) { if (coords2.ContainsKey((x, y)) == false) { coords2.Add((x, y), step); } step++; } x--; break; case 'L': var lowerx = x - int.Parse(leg2.Substring(1)); for (; x >= lowerx; x--) { if (coords2.ContainsKey((x, y)) == false) { coords2.Add((x, y), step); } step++; } x++; break; case 'U': var uppery = y + int.Parse(leg2.Substring(1)); for (; y <= uppery; y++) { if (coords2.ContainsKey((x, y)) == false) { coords2.Add((x, y), step); } step++; } y--; break; case 'D': var lowery = y - int.Parse(leg2.Substring(1)); for (; y >= lowery; y--) { if (coords2.ContainsKey((x, y)) == false) { coords2.Add((x, y), step); } step++; } y++; break; } step--; } var intesections = coords1.Keys.Intersect(coords2.Keys); var result = intesections.Select(i => coords1[i] + coords2[i]); TestContext.WriteLine(result.Where(i => i != 0).Min().ToString()); }