コード例 #1
0
        int[] ParseLayers(string filename)
        {
            var intermediate = new List <Tuple <int, int> >();

            FileIterator.ForEachLine <string>(filename, line =>
            {
                var spec = line.Split(new char[] { ':', ' ' }, StringSplitOptions.RemoveEmptyEntries);
                if (spec.Length != 2)
                {
                    Oh.ForFucksSake();
                }

                var range = int.Parse(spec[0]);
                var depth = int.Parse(spec[1]);
                intermediate.Add(new Tuple <int, int>(range, depth));
            });

            var r = new int[intermediate.Last().Item1 + 1];

            foreach (var t in intermediate)
            {
                r[t.Item1] = t.Item2;
            }

            return(r);
        }
コード例 #2
0
        void ExecInstruction(VM vm)
        {
            var command = vm.prog[vm.ip].Split(' ');

            switch (command[0])
            {
            case "set":
                set(vm, command);
                break;

            case "sub":
                sub(vm, command);
                break;

            case "mul":
                mul(vm, command);
                break;

            case "jnz":
                jnz(vm, command);
                break;

            default:
                Oh.WhatTheFuck();
                break;
            }
        }
コード例 #3
0
        int CharToInt(char c)
        {
            switch (c)
            {
            case '0':
            case '1':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':
                return(c - '0');

            case 'a':
            case 'b':
            case 'c':
            case 'd':
            case 'e':
            case 'f':
                return(10 + (c - 'a'));
            }

            Oh.ShttingHell();
            return(-1);
        }
コード例 #4
0
ファイル: Day04.cs プロジェクト: elpollouk/Advent2017
            public GuardEvent(string details)
            {
                var matches = details.Match(@"\[(.+)\] (.+)");

                if (matches.Groups.Count != 3)
                {
                    Oh.Bugger();
                }

                Time = DateTime.ParseExact(matches.Groups[1].Value, "yyyy-MM-dd HH:mm", CultureInfo.InvariantCulture);
                var desription = matches.Groups[2].Value;

                if (desription == "falls asleep")
                {
                    Type = GuardEventType.Asleep;
                    Id   = -1;
                }
                else if (desription == "wakes up")
                {
                    Type = GuardEventType.Awake;
                    Id   = -1;
                }
                else
                {
                    Type = GuardEventType.BeginShift;
                    Id   = int.Parse(desription.Match(@"#(\d+)").Groups[1].Value);
                }
            }
コード例 #5
0
        int SkipGarbage(string input, int start)
        {
            var offset = start + 1;

            while (true)
            {
                if (offset == input.Length)
                {
                    Oh.Bollocks();
                }
                switch (input[offset])
                {
                case '>':
                    removeCharacters += (offset - start) - 1;
                    return(offset - start);

                case '!':
                    removeCharacters -= 2;
                    offset           += 2;
                    break;

                default:
                    offset++;
                    break;
                }
            }
        }
コード例 #6
0
ファイル: Day10.cs プロジェクト: elpollouk/Advent2017
        static int CalcJolts(string input)
        {
            var prevJolt = 0;
            var jump1    = 0;
            var jump3    = 1; // Include the final 3 jolt jump up front

            foreach (var jolt in FileIterator.Lines <int>(input).OrderBy((v) => v))
            {
                switch (jolt - prevJolt)
                {
                case 1:
                    jump1++;
                    break;

                case 2:
                    break;

                case 3:
                    jump3++;
                    break;

                default:
                    Oh.Bugger();
                    break;
                }
                prevJolt = jolt;
            }

            return(jump1 * jump3);
        }
コード例 #7
0
            public void Execute(Instruction[] prog, bool part2)
            {
                foreach (var instuction in prog)
                {
                    switch (instuction.Op)
                    {
                    case Operation.Mem:
                        if (part2)
                        {
                            SetMemRecursive(0, 0, instuction.OperandA, instuction.OperandB);
                        }
                        else
                        {
                            var value = instuction.OperandB;
                            value &= AndMask;
                            value |= OrMask;
                            Mem[instuction.OperandA] = value;
                        }
                        break;

                    case Operation.Mask:
                        AndMask = instuction.OperandA;
                        OrMask  = instuction.OperandB;
                        Mask    = instuction.Mask;
                        break;

                    default:
                        Oh.Bugger();
                        break;
                    }
                }
            }
コード例 #8
0
ファイル: Day18.cs プロジェクト: elpollouk/Advent2017
        CellState[,] LoadEnvironment(string inputFile)
        {
            var lines       = FileIterator.LoadLines <string>(inputFile);
            var environment = new CellState[lines[0].Length, lines.Length];

            foreach (var(x, y) in environment.Rectangle())
            {
                switch (lines[y][x])
                {
                case '.':
                    environment[x, y] = CellState.Clear;
                    break;

                case '|':
                    environment[x, y] = CellState.Tree;
                    break;

                case '#':
                    environment[x, y] = CellState.LumberYard;
                    break;

                default:
                    Oh.Bugger();
                    break;
                }
            }

            return(environment);
        }
コード例 #9
0
ファイル: Problem2101.cs プロジェクト: elpollouk/Advent2017
        GridWriter CreateWriter(string pattern)
        {
            return((grid, x, y) =>
            {
                var cX = x;
                var cY = y;
                foreach (var c in pattern)
                {
                    switch (c)
                    {
                    case '.':
                        grid[cX++, cY] = false;
                        break;

                    case '#':
                        grid[cX++, cY] = true;
                        break;

                    case '/':
                        cX = x;
                        cY++;
                        break;

                    default:
                        Oh.Bollocks();
                        break;
                    }
                }
            });
        }
コード例 #10
0
ファイル: Problem2101.cs プロジェクト: elpollouk/Advent2017
        void ParseRule(GridRules rules, string rule)
        {
            var fromTo    = rule.Replace(" => ", "|").Split('|');
            var rotations = CreateRotations(fromTo[0]);
            var writer    = CreateWriter(fromTo[1]);

            foreach (var rotation in rotations)
            {
                if (rules.ContainsKey(rotation))
                {
                    Oh.Bugger();
                }
                rules[rotation] = writer;
            }
        }
コード例 #11
0
ファイル: Day08.cs プロジェクト: elpollouk/Advent2017
        public void Problem1(string input, long expected)
        {
            var vmState = new VmState();
            var prog    = LoadProgram(input);

            try
            {
                ExecuteUntilLoop(vmState, prog);
                Oh.Bugger();
            }
            catch (Utils.VM.Halt)
            {
                vmState.Acc.Should().Be(expected);
            }
        }
コード例 #12
0
        char[] NextPos(string action, char[] current)
        {
            switch (action[0])
            {
            case 's':
                return(Shift(int.Parse(action.Substring(1)), current));

            case 'x':
                return(Exchange(action.Substring(1), current));

            case 'p':
                return(ExchangeByName(action.Substring(1), current));
            }

            Oh.ShttingHell();
            return(null);
        }
コード例 #13
0
        static string Reduce(int[] input)
        {
            if (input.Length != 256)
            {
                Oh.ForFucksSake();
            }
            var reduced = new byte[16];

            for (var i = 0; i < 16; i++)
            {
                for (var j = 0; j < 16; j++)
                {
                    reduced[i] ^= (byte)input[(i * 16) + j];
                }
            }

            return(BitConverter.ToString(reduced).Replace("-", "").ToLower());
        }
コード例 #14
0
ファイル: Problem1901.cs プロジェクト: elpollouk/Advent2017
        string FollowPath(Map map, int entryPoint, out int numSteps)
        {
            var result = "";

            var x  = entryPoint;
            var y  = 0;
            var dX = 0;
            var dY = 1;

            numSteps = 0;

            while (true)
            {
                var c = map.GetCell(x, y);
                switch (c)
                {
                case '|':
                case '-':
                    break;

                case '+':
                    ChangeDirection(map, x, y, ref dX, ref dY);
                    break;

                case ' ':
                    return(result);

                default:
                    if (IsLetter(c))
                    {
                        result += c;
                    }
                    else
                    {
                        Oh.Bollocks();
                    }
                    break;
                }

                x += dX;
                y += dY;
                numSteps++;
            }
        }
コード例 #15
0
ファイル: Day13.cs プロジェクト: elpollouk/Advent2017
            public void Step(char currentLocation)
            {
                switch (currentLocation)
                {
                case '/':
                    if (dX == 0)
                    {
                        TurnRight();
                    }
                    else
                    {
                        TurnLeft();
                    }
                    break;

                case '\\':
                    if (dX == 0)
                    {
                        TurnLeft();
                    }
                    else
                    {
                        TurnRight();
                    }
                    break;

                case '+':
                    UpdateCrossing();
                    break;

                case '.':
                    break;

                default:
                    Oh.ShttingHell();
                    break;
                }

                x += dX;
                y += dY;
            }
コード例 #16
0
ファイル: Problem1901.cs プロジェクト: elpollouk/Advent2017
 void ChangeDirection(Map map, int x, int y, ref int dX, ref int dY)
 {
     if (dX == 0)
     {
         var left  = map.GetCell(x - 1, y);
         var right = map.GetCell(x + 1, y);
         if (left == '-' || IsLetter(left))
         {
             dX = -1;
             dY = 0;
         }
         else if (right == '-' || IsLetter(right))
         {
             dX = 1;
             dY = 0;
         }
         else
         {
             Oh.WhatTheFuck();
         }
     }
     else
     {
         var up   = map.GetCell(x, y - 1);
         var down = map.GetCell(x, y + 1);
         if (up == '|' || IsLetter(up))
         {
             dX = 0;
             dY = -1;
         }
         else if (down == '|' || IsLetter(down))
         {
             dX = 0;
             dY = 1;
         }
         else
         {
             Oh.Bugger();
         }
     }
 }
コード例 #17
0
ファイル: Day03.cs プロジェクト: elpollouk/Advent2017
            public Request(string request)
            {
                var split = request.Split('@', ',', ':', 'x');

                if (split.Length != 5)
                {
                    Oh.Bugger();
                }

                Id  = int.Parse(split[0].Substring(1));
                Pos = new int[]
                {
                    int.Parse(split[1]),
                    int.Parse(split[2])
                };
                Size = new int[]
                {
                    int.Parse(split[3]),
                    int.Parse(split[4])
                };
            }
コード例 #18
0
ファイル: Problem1801.cs プロジェクト: elpollouk/Advent2017
        void ExecInstruction(VM vm)
        {
            var command = vm.prog[vm.ip].Split(' ');

            switch (command[0])
            {
            case "snd":
                snd(vm, command);
                break;

            case "set":
                set(vm, command);
                break;

            case "add":
                add(vm, command);
                break;

            case "mul":
                mul(vm, command);
                break;

            case "mod":
                mod(vm, command);
                break;

            case "rcv":
                rcv(vm, command);
                break;

            case "jgz":
                jgz(vm, command);
                break;

            default:
                Oh.WhatTheFuck();
                break;
            }
        }
コード例 #19
0
ファイル: Day13.cs プロジェクト: elpollouk/Advent2017
            public Cart(int x, int y, char initialDirection)
            {
                this.x = x;
                this.y = y;
                switch (initialDirection)
                {
                case '<':
                    dX = -1;
                    dY = 0;
                    break;

                case '>':
                    dX = 1;
                    dY = 0;
                    break;

                case '^':
                    dX = 0;
                    dY = -1;
                    break;

                case 'v':
                case 'V':
                    dX = 0;
                    dY = 1;
                    break;

                default:
                    Oh.Bugger();
                    break;
                }

                crossingAction = new Action[]
                {
                    TurnLeft,
                    () => { },
                    TurnRight
                };
            }
コード例 #20
0
            public Stroke(string input)
            {
                var match = input.Match(@"(.)=(\d+), .=(\d+)\.\.(\d+)");

                if (match.Groups.Count != 5)
                {
                    Oh.Bugger();
                }

                Horizontal = match.Groups[1].Value == "y";
                if (Horizontal)
                {
                    StartY = int.Parse(match.Groups[2].Value);
                    StartX = int.Parse(match.Groups[3].Value);
                }
                else
                {
                    StartX = int.Parse(match.Groups[2].Value);
                    StartY = int.Parse(match.Groups[3].Value);
                }
                Extent = int.Parse(match.Groups[4].Value);
            }
コード例 #21
0
        Graph <int> BuildGraph(string key)
        {
            var graph = new Graph <int>();

            for (var y = 0; y < GridSize; y++)
            {
                var rowKey = $"{key}-{y}";
                var hash   = Hash(rowKey);
                if (hash.Length != 32)
                {
                    Oh.ShttingHell();
                }

                var x = 0;
                foreach (var ic in hash)
                {
                    var c = CharToInt(ic);
                    for (var bit = 0; bit < 4; bit++)
                    {
                        if ((c & 8) == 8)
                        {
                            var id = GetNodeId(x, y);
                            graph.AddNode(id);

                            var children = GetChildren(x, y, graph);
                            foreach (var linkId in children)
                            {
                                graph.AddTwoWayLink(id, linkId);
                            }
                        }
                        c <<= 1;
                        x++;
                    }
                }
            }

            return(graph);
        }
コード例 #22
0
ファイル: Problem1101.cs プロジェクト: elpollouk/Advent2017
        int Solve(string[] steps)
        {
            var x = 0;
            var y = 0;

            // Follow path
            for (var i = 0; i < steps.Length; i++)
            {
                switch (steps[i])
                {
                case "nw":
                    if ((x & 1) == 0)
                    {
                        y--;
                    }
                    x--;
                    break;

                case "n":
                    y--;
                    break;

                case "ne":
                    if ((x & 1) == 0)
                    {
                        y--;
                    }
                    x++;
                    break;

                case "sw":
                    if ((x & 1) == 1)
                    {
                        y++;
                    }
                    x--;
                    break;

                case "s":
                    y++;
                    break;

                case "se":
                    if ((x & 1) == 1)
                    {
                        y++;
                    }
                    x++;
                    break;

                default:
                    Oh.PissingNora();
                    break;
                }

                if (Math.Abs(maxX) < Math.Abs(x))
                {
                    maxX = x;
                }
                if (Math.Abs(maxY) < Math.Abs(y))
                {
                    maxY = y;
                }
            }

            return(WalkBack(x, y));
        }