コード例 #1
0
ファイル: Day3.cs プロジェクト: anap01/AoC2019
        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());
        }
コード例 #2
0
ファイル: Day3.cs プロジェクト: anap01/AoC2019
        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());
        }
コード例 #3
0
ファイル: Day3.cs プロジェクト: anap01/AoC2019
        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());
        }
コード例 #4
0
ファイル: Day3.cs プロジェクト: anap01/AoC2019
        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());
        }