Example #1
0
        private static void Part2(string value)
        {
            /*
             * Now, the jumps are even stranger: after each jump, if the offset
             * was three or more, instead decrease it by 1. Otherwise, increase
             * it by 1 as before.
             *
             * Using this rule with the above example, the process now takes
             * 10 steps, and the offset values after finding the exit are
             * left as 2 3 2 3 -1.
             *
             * How many steps does it now take to reach the exit?
             */
            var args = new TraverseArgs()
            {
                Max = 3
            };

            var output = new NullOutput();

            Test.Verify <string, TraverseArgs, int>(output, Traverse, Input.Part2TestInput, args, Input.Part2Test1Answer);
            var result = Traverse(Input.Value, args);

            Write.ColorLine($"Result: {result}", ConsoleColor.Cyan);
            Console.WriteLine();
        }
Example #2
0
        static void Part2(string input)
        {
            /*
             * Now, instead of considering the next digit, it wants you to consider the digit halfway
             * around the circular list. That is, if your list contains 10 items, only include a digit
             * in your sum if the digit 10/2 = 5 steps forward matches it.
             * Fortunately, your list has an even number of elements.
             *
             * For example:
             *
             * - 1212 produces 6: the list contains 4 items, and all four digits match the digit 2 items ahead.
             * - 1221 produces 0, because every comparison is between a 1 and a 2.
             * - 123425 produces 4, because both 2s match each other, but no other digit has a match.
             * - 123123 produces 12.
             * - 12131415 produces 4.
             */
            Write.ColorLine("Part 2", ConsoleColor.Yellow);
            var output = new NullOutput();

            Test.Verify <string, int>(output, SolvePart2, "1212", 6);
            Test.Verify <string, int>(output, SolvePart2, "1221", 0);
            Test.Verify <string, int>(output, SolvePart2, "123425", 4);
            Test.Verify <string, int>(output, SolvePart2, "123123", 12);
            Test.Verify <string, int>(output, SolvePart2, "12131415", 4);

            var answer = SolvePart2(input);

            Write.ColorLine($"Solution: {answer}", ConsoleColor.Cyan);
        }
Example #3
0
 public void BeginDay(int day)
 {
     Write.ColorLine(string.Empty, ConsoleColor.Blue, ConsoleColor.Gray, true /*fillLine*/);
     Write.ColorLine($"Day {day}", ConsoleColor.Blue, ConsoleColor.Gray, true /*fillLine*/);
     Write.ColorLine(string.Empty, ConsoleColor.Blue, ConsoleColor.Gray, true /*fillLine*/);
     Console.WriteLine();
 }
Example #4
0
 public void EndDay()
 {
     Console.WriteLine();
     Write.ColorLine(string.Empty, ConsoleColor.DarkGreen, ConsoleColor.Gray, true /*fillLine*/);
     Write.ColorLine("Press any key to exit", ConsoleColor.DarkGreen, ConsoleColor.Gray, true /*fillLine*/);
     Write.ColorLine(string.Empty, ConsoleColor.DarkGreen, ConsoleColor.Gray, true /*fillLine*/);
     Console.ReadKey(true /*intercept*/);
 }
Example #5
0
        private static void Part1()
        {
            /*
             * The message includes a list of the offsets for each jump. Jumps are
             * relative: -1 moves to the previous instruction, and 2 skips the next
             * one. Start at the first instruction in the list. The goal is to
             * follow the jumps until one leads outside the list.
             *
             * In addition, these instructions are a little strange; after each jump,
             * the offset of that instruction increases by 1. So, if you come across
             * an offset of 3, you would move three instructions forward, but change
             * it to a 4 for the next time it is encountered.
             *
             * For example, consider the following list of jump offsets:
             *      0
             *      3
             *      0
             *      1
             *      -3
             *
             * Positive jumps ("forward") move downward; negative jumps move upward.
             * For legibility in this example, these offset values will be written all
             * on one line, with the current instruction marked in parentheses. The
             * following steps would be taken before an exit is found:
             *
             *      (0)  3   0   1   -3  - before we have taken any steps.
             *
             *      (1)  3   0   1   -3  - jump with offset 0 (that is, don't jump at all).
             *                             Fortunately, the instruction is then incremented
             *                             to 1.
             *
             *      2   (3)  0   1   -3  - step forward because of the instruction we just
             *                             modified. The first instruction is incremented
             *                                                 again, now to 2.
             *
             *      2    4   0   1  (-3) - jump all the way to the end; leave a 4 behind.
             *
             *      2   (4)  0   1   -2  - go back to where we just were; increment -3 to -2.
             *
             *      2    5   0   1   -2  - jump 4 steps forward, escaping the maze.
             *
             * In this example, the exit is reached in 5 steps.
             *
             * How many steps does it take to reach the exit?
             */

            var args   = new TraverseArgs();
            var output = new NullOutput();

            Test.Verify <string, TraverseArgs, int>(output, Traverse, Input.Part1Test1Input, args, Input.Part1Test1Answer);
            var result = Traverse(Input.Value, args);

            Write.ColorLine($"Result: {result}", ConsoleColor.Cyan);
            Console.WriteLine();
        }
Example #6
0
        static void Main(string[] args)
        {
            Write.ColorLine("Day 5: Part 1", ConsoleColor.Cyan);
            Console.WriteLine("-------", ConsoleColor.Cyan);
            Part1();
            Console.WriteLine();

            Write.ColorLine("Day 5: Part 2", ConsoleColor.Cyan);
            Console.WriteLine("-------", ConsoleColor.Cyan);
            Part2(Input.Value);
            Console.ReadLine();
        }
Example #7
0
        public void EndTest(bool success, object result, object expected)
        {
            if (success)
            {
                Write.ColorLine("Success", ConsoleColor.Green);
            }
            else
            {
                Write.ColorLine("Failed", ConsoleColor.Red);
            }

            Console.WriteLine($"Result: {result}; Expected: {expected}");
        }
Example #8
0
        static void Part1(string input)
        {
            Write.ColorLine("Part 1", ConsoleColor.Yellow);

            var output = new NullOutput();

            Test.Verify(output, SolveCaptcha, "1122", 3);
            Test.Verify(output, SolveCaptcha, "1111", 4);
            Test.Verify(output, SolveCaptcha, "1234", 0);
            Test.Verify(output, SolveCaptcha, "91212129", 9);
            Console.WriteLine();

            var answer = SolveCaptcha(input);

            Write.ColorLine($"Solution: {answer}", ConsoleColor.Cyan);
        }
Example #9
0
 public void BeginPart(int part)
 {
     Write.ColorLine($"Part {part}", ConsoleColor.Cyan);
 }