示例#1
0
        public static void Problem1()
        {
            var input = FileReader.ReadLines("Inputs\\day7.txt");

            var inside = new Dictionary <string, List <string> >();

            foreach (var line in input)
            {
                var parts   = line.Split(' ');
                var outside = parts[0] + " " + parts[1];
                if (parts[4] != "no")
                {
                    for (int i = 1; 4 * i < parts.Length; i++)
                    {
                        var name = parts[i * 4 + 1] + " " + parts[i * 4 + 2];
                        if (!inside.ContainsKey(name))
                        {
                            inside[name] = new List <string>();
                        }
                        inside[name].Add(outside);
                    }
                }
            }

            HashSet <string> items = new HashSet <string>();
            Queue <string>   q     = new Queue <string>();

            q.Enqueue("shiny gold");
            while (q.Count > 0)
            {
                var item = q.Dequeue();
                if (inside.ContainsKey(item))
                {
                    foreach (var i in inside[item])
                    {
                        if (!items.Contains(i))
                        {
                            items.Add(i);
                            q.Enqueue(i);
                        }
                    }
                }
            }
            Console.WriteLine($"Part 1: {items.Count}");
        }
示例#2
0
        public static void Problems()
        {
            var input = FileReader.ReadLines("Inputs\\day6.txt");

            input.Add("");

            int            result1 = 0;
            HashSet <char> values  = new HashSet <char>();

            int result2  = 0;
            var values2  = new int[26];
            int expected = 0;

            foreach (var line in input)
            {
                if (line != "")
                {
                    expected++;
                    foreach (var c in line)
                    {
                        values.Add(c);
                        values2[c - 'a']++;
                    }
                }
                else
                {
                    result1 += values.Count;
                    foreach (var value in values2)
                    {
                        if (value == expected)
                        {
                            result2++;
                        }
                    }

                    values = new HashSet <char>();

                    expected = 0;
                    values2  = new int[26];
                }
            }

            Console.WriteLine($"Part 1: {result1}");
            Console.WriteLine($"Part 2: {result2}");
        }
示例#3
0
        public static void Problems()
        {
            var input = FileReader.ReadLines("Inputs\\day14.txt");

            var mask = "";
            Dictionary <long, long> memory1 = new Dictionary <long, long>();
            Dictionary <long, long> memory2 = new Dictionary <long, long>();

            foreach (var line in input)
            {
                var parts = line.Split(' ');
                if (parts[0] == "mask")
                {
                    mask = parts[2];
                }
                else
                {
                    var i = Convert.ToInt64(parts[0][4..^ 1]);
示例#4
0
        public static void Problem1()
        {
            var inputs = FileReader.ReadLines("Inputs\\day3.txt");
            int result = 0;
            int column = 3;

            for (int i = 1; i < inputs.Count; i++)
            {
                var line = inputs[i];
                var c    = line[column];
                if (c == '#')
                {
                    result++;
                }
                column += 3;
                column %= line.Length;
            }
            Console.WriteLine(result);
        }
示例#5
0
        public static void Problem1()
        {
            var input = FileReader.ReadLines("Inputs\\day1.txt");

            HashSet <long> nums = new HashSet <long>();

            long result = -1;

            for (int i = 0; i < input.Count - 1 && result == -1; i++)
            {
                var x = Convert.ToInt64(input[i]);
                if (nums.Contains(2020 - x))
                {
                    result = (2020 - x) * x;
                }
                else
                {
                    nums.Add(x);
                }
            }
            Console.WriteLine(result);
        }
示例#6
0
        public static void Problems()
        {
            var input = FileReader.ReadLines("Inputs\\day17.txt");

            PuzzleData data1 = new PuzzleData
            {
                xMax = input[0].Length - 1,
                yMax = input.Count - 1
            };

            //get starting values from puzzle input
            for (int x = 0; x < input[0].Length; x++)
            {
                for (int y = 0; y < input.Count; y++)
                {
                    if (input[y][x] == '#')
                    {
                        data1.Active.Add((x, y, 0, 0));
                    }
                }
            }

            PuzzleData data2 = new PuzzleData
            {
                xMax   = input[0].Length - 1,
                yMax   = input.Count - 1,
                Active = new HashSet <(int x, int y, int z, int w)>(data1.Active)
            };

            for (int i = 1; i <= 6; i++)
            {
                data1 = GetNext(data1);
                data2 = GetNext(data2, true);
            }

            Console.WriteLine($"Part 1: {data1.Active.Count}");
            Console.WriteLine($"Part 2: {data2.Active.Count}");
        }
示例#7
0
        public static void Problems()
        {
            var input = FileReader.ReadLines("Inputs\\day8.txt");

            var(_, value1) = Test(input);
            Console.WriteLine($"Part 1: {value1}");

            for (int i = 0; i < input.Count; i++)
            {
                var instruction = input[i].Split(' ')[0];
                if (instruction == "jmp" || instruction == "nop")
                {
                    var input2 = new List <string>(input);
                    input2[i] = instruction == "jmp" ? input[i].Replace("jmp", "nop") : input[i].Replace("nop", "jmp");
                    var(completed2, value2) = Test(input2);
                    if (completed2)
                    {
                        Console.WriteLine($"Part 2: {value2}");
                        break;
                    }
                }
            }
        }
示例#8
0
        public static void Problem2()
        {
            var inputs = FileReader.ReadLines("Inputs\\day2.txt");
            int valid  = 0;

            foreach (var input in inputs)
            {
                var parts   = input.Split(" ");
                var indexes = parts[0].Split("-");


                int indexA = Convert.ToInt32(indexes[0]);
                int indexB = Convert.ToInt32(indexes[1]);

                char letterNeeded = parts[1][0];

                //per puzzle instructions, indexes are 1-based
                if (parts[2][indexA - 1] == letterNeeded ^ parts[2][indexB - 1] == letterNeeded)
                {
                    valid++;
                }
            }
            Console.WriteLine(valid);
        }
示例#9
0
        public static void Problems()
        {
            var input = FileReader.ReadLines("Inputs\\day21.txt");

            //day 21 puzzle -
            //puzzle input is a list of made-up nonsense words ("ingredients")
            //along with a list of "allergens" for each list of ingredients

            //go through list and figure out which ingredients cannot possibly be an allergen (part 1)

            //note: per puzzle rules, if the allergen is listed, the made-up ingredient that
            //matches it will always appear in that same line, but an ingredient
            //that is an allergen may or may not have the allergen listed in that line

            Dictionary <string, HashSet <string> > allergens = new Dictionary <string, HashSet <string> >();
            Dictionary <string, int> ingredientCount         = new Dictionary <string, int>();

            foreach (var line in input)
            {
                var lineIngredients = line.Substring(0, line.IndexOf("(")).Split(' ');
                var lineAllergens   = line.Substring(line.IndexOf("contains") + 9).Replace(",", "")[0..^ 1].Split(' ');
                foreach (var ingredient in lineIngredients)
                {
                    if (!ingredientCount.ContainsKey(ingredient))
                    {
                        ingredientCount[ingredient] = 0;
                    }
                    ingredientCount[ingredient]++;
                }

                foreach (var allergen in lineAllergens)
                {
                    if (!allergens.ContainsKey(allergen))
                    {
                        allergens[allergen] = new HashSet <string>(lineIngredients);
                    }
                    else
                    {
                        //remove any items from previous set that are not in current list
                        allergens[allergen].IntersectWith(lineIngredients);
                    }
                }
            }

            HashSet <string> possibleAllergenIngredients = new HashSet <string>();

            foreach (var allergen in allergens.Keys)
            {
                possibleAllergenIngredients.UnionWith(allergens[allergen]);
            }


            long result1 = 0;

            foreach (var ingredient in ingredientCount.Keys)
            {
                if (!possibleAllergenIngredients.Contains(ingredient))
                {
                    result1 += ingredientCount[ingredient];
                }
            }

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

            //part 2:

            Isolate(allergens);

            List <string> allergenList = new List <string>(allergens.Keys);

            allergenList.Sort();

            string result2 = "";

            foreach (var ingredient in allergens[allergenList[0]])
            {
                result2 += ingredient;
            }
            for (int i = 1; i < allergenList.Count; i++)
            {
                foreach (var ingredient in allergens[allergenList[i]])
                {
                    result2 += "," + ingredient;
                }
            }

            Console.WriteLine($"Part 2: {result2}");
        }
示例#10
0
        public static void Problems()
        {
            var input = FileReader.ReadLines("Inputs\\day18.txt");

            long result1 = 0;

            for (int i = 0; i < input.Count; i++)
            {
                long value     = 0;
                char operation = '+';
                Stack <(long value, char operation)> stack = new Stack <(long value, char operation)>();
                foreach (var c in input[i])
                {
                    switch (c)
                    {
                    case '*':
                    case '+':
                        operation = c;
                        break;

                    case '(':
                        stack.Push((value, operation));
                        value     = 0;
                        operation = '+';
                        break;

                    case ')':
                        var temp = stack.Pop();
                        if (temp.operation == '+')
                        {
                            value += temp.value;
                        }
                        if (temp.operation == '*')
                        {
                            value *= temp.value;
                        }
                        break;

                    case ' ':
                        break;

                    default:
                        if (operation == '+')
                        {
                            value += c - '0';
                        }
                        if (operation == '*')
                        {
                            value *= c - '0';
                        }
                        break;
                    }
                }

                result1 += value;
            }


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

            long result2 = 0;
            long result3 = 0;

            //both of the methods below correctly solve part 2
            //I kept both versions of my solution to compare their performance

            Stopwatch stopwatch2 = new Stopwatch();

            stopwatch2.Start();
            for (int i = 0; i < input.Count; i++)
            {
                result2 += Part2(input[i]);
            }
            stopwatch2.Stop();

            Stopwatch stopwatch3 = new Stopwatch();

            stopwatch3.Start();
            for (int i = 0; i < input.Count; i++)
            {
                result3 += Part2_Stack(input[i]);
            }
            stopwatch3.Stop();



            Console.WriteLine($"Part 2: {result2} completed in {stopwatch2.ElapsedMilliseconds} ms");
            Console.WriteLine($"Part 2 (using stack): {result3} completed in {stopwatch3.ElapsedMilliseconds} ms");
        }
示例#11
0
        public static void Problem2()
        {
            var inputs = FileReader.ReadLines("Inputs\\day3.txt");

            long result0 = 0;             //right 1, down 1
            long result1 = 0;             //right 3, down 1
            long result2 = 0;             //right 5, down 1
            long result3 = 0;             //right 7, down 1
            long result4 = 0;             //right 1, down 2

            int column0 = 1;
            int column1 = 3;
            int column2 = 5;
            int column3 = 7;
            int column4 = 1;

            for (int i = 1; i < inputs.Count; i++)
            {
                var line = inputs[i];


                if (line[column0] == '#')
                {
                    result0++;
                }
                column0 += 1;
                column0 %= line.Length;

                if (line[column1] == '#')
                {
                    result1++;
                }
                column1 += 3;
                column1 %= line.Length;

                if (line[column2] == '#')
                {
                    result2++;
                }
                column2 += 5;
                column2 %= line.Length;

                if (line[column3] == '#')
                {
                    result3++;
                }
                column3 += 7;
                column3 %= line.Length;

                if (i % 2 == 0)
                {
                    if (line[column4] == '#')
                    {
                        result4++;
                    }
                    column4 += 1;
                    column4 %= line.Length;
                }
            }
            Console.WriteLine(result0 * result1 * result2 * result3 * result4);
        }
示例#12
0
        public static void Problems()
        {
            var input = FileReader.ReadLines("Inputs\\day12.txt");

            (int x, int y)currentPosition = (0, 0);
            int direction = 90;

            foreach (var line in input)
            {
                var steps = Convert.ToInt32(line.Substring(1));
                switch (line[0])
                {
                case 'N':
                    currentPosition.y += steps;
                    break;

                case 'S':
                    currentPosition.y -= steps;
                    break;

                case 'E':
                    currentPosition.x += steps;
                    break;

                case 'W':
                    currentPosition.x -= steps;
                    break;

                case 'L':
                    direction += 360 - steps;
                    direction %= 360;
                    break;

                case 'R':
                    direction += steps;
                    direction %= 360;
                    break;

                case 'F':
                    var move = GetDirection(direction);
                    currentPosition.x += move.x * steps;
                    currentPosition.y += move.y * steps;
                    break;
                }
            }

            var part1 = Math.Abs(currentPosition.x) + Math.Abs(currentPosition.y);

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


            currentPosition     = (0, 0);
            (int x, int y)point = (10, 1);

            foreach (var line in input)
            {
                var steps = Convert.ToInt32(line.Substring(1));
                switch (line[0])
                {
                case 'N':
                    point.y += steps;
                    break;

                case 'S':
                    point.y -= steps;
                    break;

                case 'E':
                    point.x += steps;
                    break;

                case 'W':
                    point.x -= steps;
                    break;

                case 'L':
                    point = Rotate('L', steps, point);
                    break;

                case 'R':
                    point = Rotate('R', steps, point);
                    break;

                case 'F':
                    currentPosition.x += point.x * steps;
                    currentPosition.y += point.y * steps;
                    break;
                }
            }
            var part2 = Math.Abs(currentPosition.x) + Math.Abs(currentPosition.y);

            Console.WriteLine($"Part 2: {part2}");
        }
示例#13
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}");
        }
示例#14
0
        public static void Problems()
        {
            //both parts of day 4 need similar logic, so added part 2 logic to the part 1 method instead of creating 2 methods

            var inputs = FileReader.ReadLines("Inputs\\day4.txt");

            inputs.Add("");             //add a blank line at the end to make processing loop correctly process the last entry

            long result1 = 0;
            long result2 = 0;

            //test for all 7 required pieces for part 1
            bool b  = false;
            bool i  = false;
            bool e  = false;
            bool h  = false;
            bool hc = false;
            bool ec = false;
            bool p  = false;

            //test for all 7 required pieces for part 2
            bool b2  = false;
            bool i2  = false;
            bool e2  = false;
            bool h2  = false;
            bool hc2 = false;
            bool ec2 = false;
            bool p2  = false;

            foreach (var line in inputs)
            {
                if (line.Trim() != "")
                {
                    var fields = line.Split(' ');
                    foreach (var field in fields)
                    {
                        var fieldType  = field.Split(':')[0];
                        var fieldValue = field.Split(':')[1].Trim();
                        int value;
                        switch (fieldType)
                        {
                        case "byr":
                            b = true;
                            if (fieldValue.Length == 4 && int.TryParse(fieldValue, out value) && value >= 1920 && value <= 2002)
                            {
                                b2 = true;
                            }
                            break;

                        case "iyr":
                            i = true;
                            if (fieldValue.Length == 4 && int.TryParse(fieldValue, out value) && value >= 2010 && value <= 2020)
                            {
                                i2 = true;
                            }
                            break;

                        case "eyr":
                            e = true;
                            if (fieldValue.Length == 4 && int.TryParse(fieldValue, out value) && value >= 2020 && value <= 2030)
                            {
                                e2 = true;
                            }
                            break;

                        case "hgt":
                            h = true;
                            var hNum = fieldValue.Substring(0, fieldValue.Length - 2);
                            if (fieldValue.EndsWith("cm"))
                            {
                                if (int.TryParse(hNum, out value) && value >= 150 && value <= 193)
                                {
                                    h2 = true;
                                }
                            }
                            else if (fieldValue.EndsWith("in"))
                            {
                                if (int.TryParse(hNum, out value) && value >= 59 && value <= 76)
                                {
                                    h2 = true;
                                }
                            }
                            break;

                        case "hcl":
                            hc = true;

                            if (fieldValue.Length == 7 && fieldValue[0] == '#')
                            {
                                bool valid = true;
                                for (int j = 1; j < 7; j++)
                                {
                                    if (!((fieldValue[j] - '0' >= 0 && fieldValue[j] - '0' <= 9) || (fieldValue[j] - 'a' >= 0 && fieldValue[j] - 'a' <= 6)))
                                    {
                                        valid = false;
                                    }
                                }
                                if (valid)
                                {
                                    hc2 = true;
                                }
                            }
                            break;

                        case "ecl":
                            ec = true;
                            if (fieldValue == "amb" || fieldValue == "blu" || fieldValue == "brn" || fieldValue == "gry" || fieldValue == "grn" || fieldValue == "hzl" || fieldValue == "oth")
                            {
                                ec2 = true;
                            }
                            break;

                        case "pid":
                            p = true;
                            if (fieldValue.Length == 9 && int.TryParse(fieldValue, out _))
                            {
                                p2 = true;
                            }
                            break;

                        default:
                            break;
                        }
                    }
                }
                else
                {
                    if (b && i && e && h && hc && ec && p)
                    {
                        result1++;
                    }
                    if (b2 && i2 && e2 && h2 && hc2 && ec2 && p2)
                    {
                        result2++;
                    }

                    b  = false;
                    i  = false;
                    e  = false;
                    h  = false;
                    hc = false;
                    ec = false;
                    p  = false;

                    b2  = false;
                    i2  = false;
                    e2  = false;
                    h2  = false;
                    hc2 = false;
                    ec2 = false;
                    p2  = false;
                }
            }

            Console.WriteLine($"Part 1: {result1}");
            Console.WriteLine($"Part 2: {result2}");
        }
示例#15
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}");
        }