Exemple #1
0
        public static void Problems()
        {
            var input = FileReader.ReadLines("Inputs\\day24.txt");

            var tiles = new HashSet <(int x, int y)>();

            foreach (var value in input)
            {
                var location = Move(value);
                if (tiles.Contains(location))
                {
                    tiles.Remove(location);
                }
                else
                {
                    tiles.Add(location);
                }
            }

            Console.WriteLine($"Part 1: {tiles.Count}");

            int xMin = Int32.MaxValue;
            int xMax = Int32.MinValue;
            int yMin = Int32.MaxValue;
            int yMax = Int32.MinValue;

            foreach (var location in tiles)
            {
                xMin = Math.Min(xMin, location.x);
                xMax = Math.Max(xMax, location.x);
                yMin = Math.Min(yMin, location.y);
                yMax = Math.Max(yMax, location.y);
            }

            for (int i = 1; i <= 100; i++)
            {
                xMin--;
                xMax++;
                yMin--;
                yMax++;

                int xMinNext = Int32.MaxValue;
                int xMaxNext = Int32.MinValue;
                int yMinNext = Int32.MaxValue;
                int yMaxNext = Int32.MinValue;


                HashSet <(int x, int y)> next = new HashSet <(int x, int y)>();

                for (int x = xMin; x <= xMax; x++)
                {
                    for (int y = yMin; y <= yMax; y++)
                    {
                        var tileCount = CountTiles((x, y), tiles);
                        if (tileCount == 2 || (tiles.Contains((x, y)) && tileCount == 1))
                        {
                            xMinNext = Math.Min(xMinNext, x);
                            xMaxNext = Math.Max(xMaxNext, x);
                            yMinNext = Math.Min(yMinNext, y);
                            yMaxNext = Math.Max(yMaxNext, y);
                            next.Add((x, y));
                        }
                    }
                }
                tiles = next;
                xMin  = xMinNext;
                xMax  = xMaxNext;
                yMin  = yMinNext;
                yMax  = yMaxNext;
            }

            Console.WriteLine($"Part 2: {tiles.Count}");
        }
Exemple #2
0
        public static void Problems()
        {
            var input = FileReader.ReadLines("Inputs\\day16.txt");

            var fieldList = new Dictionary <string, (long min1, long max1, long min2, long max2)>();

            int rowNumber = 0;

            while (rowNumber < input.Count && !(input[rowNumber] == ""))
            {
                var parts = input[rowNumber].Split(':');
                var temp  = parts[1].Replace("or", "-");
                var r     = temp.ToLongArray('-');
                fieldList.Add(parts[0], (r[0], r[1], r[2], r[3]));
                rowNumber++;
            }
            rowNumber += 2;

            var t = input[rowNumber].ToLongArray();

            rowNumber += 3;
            List <long[]> rows = new List <long[]>();

            while (rowNumber < input.Count)
            {
                rows.Add(input[rowNumber].ToLongArray());
                rowNumber++;
            }

            long          result1 = 0;
            HashSet <int> invalid = new HashSet <int>();

            for (int i = 0; i < rows.Count; i++)
            {
                var values = rows[i];
                foreach (var value in values)
                {
                    bool valid = false;
                    foreach (var r in fieldList.Values)
                    {
                        if ((value <= r.max1 && value >= r.min1) || (value <= r.max2 && value >= r.min2))
                        {
                            valid = true;
                        }
                    }

                    if (!valid)
                    {
                        result1 += value;
                        invalid.Add(i);
                    }
                }
            }

            Console.WriteLine($"Part 1: {result1}");



            Dictionary <int, List <string> > fields = new Dictionary <int, List <string> >();

            for (int field = 0; field < rows[0].Length; field++)
            {
                fields[field] = new List <string>();
                foreach (var n in fieldList.Keys)
                {
                    fields[field].Add(n);
                }
                for (int i = 0; i < rows.Count; i++)
                {
                    if (invalid.Contains(i))
                    {
                        continue;
                    }
                    var temp  = new List <string>();
                    var value = rows[i][field];
                    foreach (var n in fields[field])
                    {
                        var r = fieldList[n];
                        if ((value <= r.max1 && value >= r.min1) || (value <= r.max2 && value >= r.min2))
                        {
                            temp.Add(n);
                        }
                    }
                    fields[field] = temp;
                }
            }

            ReduceList(fields);

            long result2 = 1;

            foreach (var field in fields.Keys)
            {
                if (fields[field][0].StartsWith("departure"))
                {
                    result2 *= t[field];
                }
            }



            Console.WriteLine($"Part 1: {result2}");
        }