コード例 #1
0
        public static ulong Solve(string text)
        {
            var memory = new ulong[64 * 1024];

            var reader = new SpanStringReader(text);

            while (!reader.IsEndOfFile())
            {
                var mask = CommonUtil.GetMask(ref reader);
                while (!reader.IsEndOfFile() && !reader.PeekWord().SequenceEqual("mask"))
                {
                    var(address, value) = CommonUtil.GetMemoryLine(ref reader);
                    value           = ApplyMask(value, mask);
                    memory[address] = value;
                }
            }

            var sum = 0UL;

            for (var i = 0; i < memory.Length; ++i)
            {
                sum += memory[i];
            }

            return(sum);
        }
コード例 #2
0
        public static int Solve(string text)
        {
            var buckets = new StackIntBucketSet(stackalloc int[2048]);
            var reader  = new SpanStringReader(text);

            while (!reader.IsEndOfFile())
            {
                buckets.Add(int.Parse(reader.ReadWord(true)));
            }

            var differentials = new StackIntBucketSet(stackalloc int[4]);
            var lastValue     = buckets.HighestValue + 3;
            var i             = 0;

            for (i = lastValue; i >= 0; i--)
            {
                if (buckets.Contains(i))
                {
                    differentials.Add(lastValue - i);
                    lastValue = i;
                }
            }

            differentials.Add(lastValue);
            return(differentials[1] * differentials[3]);
        }
コード例 #3
0
        public static ulong Solve(string text)
        {
            var memory = new Dictionary <ulong, ulong>();

            var reader = new SpanStringReader(text);

            while (!reader.IsEndOfFile())
            {
                var mask = CommonUtil.GetMask(ref reader);
                while (!reader.IsEndOfFile() && !reader.PeekWord().SequenceEqual("mask"))
                {
                    var(address, value) = CommonUtil.GetMemoryLine(ref reader);
                    foreach (var newAddress in ApplyPermutingMask((ulong)address, mask.ToArray()))
                    {
                        memory[newAddress] = value;
                    }
                }
            }

            var sum = 0UL;

            foreach (var value in memory.Values)
            {
                sum += value;
            }

            return(sum);
        }
コード例 #4
0
        public static int Solve(string text)
        {
            var reader = new SpanStringReader(text);

            const int cos90 = 0;
            const int sin90 = 1;

            (int X, int Y)pos      = (0, 0);
            (int X, int Y)waypoint = (10, 1);
            while (!reader.IsEndOfFile())
            {
                var instruction = reader.ReadChar();
                var magnitude   = reader.ReadInt(true);
                switch (instruction)
                {
                case 'N':
                    waypoint = (waypoint.X, waypoint.Y + magnitude);
                    break;

                case 'S':
                    waypoint = (waypoint.X, waypoint.Y - magnitude);
                    break;

                case 'E':
                    waypoint = (waypoint.X + magnitude, waypoint.Y);
                    break;

                case 'W':
                    waypoint = (waypoint.X - magnitude, waypoint.Y);
                    break;

                case 'L':
                {
                    var count = magnitude / 90;
                    for (var i = 0; i < count; ++i)
                    {
                        waypoint = ((waypoint.X * cos90) - (waypoint.Y * sin90), (waypoint.X * sin90) + (waypoint.Y * cos90));
                    }
                }
                break;

                case 'R':
                {
                    var count = magnitude / 90;
                    for (var i = 0; i < count; ++i)
                    {
                        waypoint = ((waypoint.X * -cos90) - (waypoint.Y * -sin90), (waypoint.X * -sin90) + (waypoint.Y * -cos90));
                    }
                }
                break;

                case 'F':
                    pos = (pos.X + (waypoint.X * magnitude), pos.Y + (waypoint.Y * magnitude));
                    break;
                }
            }

            return(Math.Abs(pos.X) + Math.Abs(pos.Y));
        }
コード例 #5
0
        public static (int Address, ulong Value) GetMemoryLine(ref SpanStringReader reader)
        {
            reader.ReadUntil('[', true);
            var address = reader.ReadInt();

            reader.ReadUntil('=', false);
            reader.ReadChar(true);
            var value = (ulong)reader.ReadInt(true);

            return(address, value);
        }
コード例 #6
0
        public static long Solve(string text)
        {
            var buckets = new StackIntBucketSet(stackalloc int[2048]);
            var reader  = new SpanStringReader(text);

            while (!reader.IsEndOfFile())
            {
                buckets.Add(int.Parse(reader.ReadWord(true)));
            }

            var target = buckets.HighestValue;

            buckets.Add(0);
            buckets.Add(target + 3);

            var routesAtNode = new StackLongBucketSet(stackalloc long[target + 5]);

            routesAtNode.Add(0);

            var combinations = 1L;

            for (var i = 0; i <= target; i++)
            {
                if (!buckets.Contains(i))
                {
                    continue;
                }

                var branches            = 0;
                var routesAtCurrentNode = routesAtNode[i];
                if (buckets.Contains(i + 1))
                {
                    routesAtNode.AddMultiple(i + 1, routesAtCurrentNode);
                    branches++;
                }

                if (buckets.Contains(i + 2))
                {
                    routesAtNode.AddMultiple(i + 2, routesAtCurrentNode);
                    branches++;
                }

                if (buckets.Contains(i + 3))
                {
                    routesAtNode.AddMultiple(i + 3, routesAtCurrentNode);
                    branches++;
                }

                combinations += routesAtCurrentNode * (branches - 1);
            }

            return(combinations);
        }
コード例 #7
0
        public static long Solve(string text)
        {
            var backlog = new StackCircularBuffer <long>(stackalloc long[preambleSize]);

            var reader = new SpanStringReader(text);

            for (int i = 0; i < preambleSize; i++)
            {
                backlog.PushBack(long.Parse(reader.ReadWord(true)));
            }

            while (!reader.IsEndOfFile())
            {
                var  num   = long.Parse(reader.ReadWord(true));
                bool found = false;
                for (int i = 0; i < preambleSize; i++)
                {
                    for (int j = 0; j < preambleSize; j++)
                    {
                        if (i != j && backlog[i] + backlog[j] == num)
                        {
                            found = true;
                            break;
                        }
                    }

                    if (found)
                    {
                        break;
                    }
                }

                if (found)
                {
                    backlog.PushBack(num);
                }
                else
                {
                    return(num);
                }
            }

            return(-1);
        }
コード例 #8
0
        public static void Solve(string text, long searchValue)
        {
            var backlog = new List <long>();

            var reader = new SpanStringReader(text);

            while (!reader.IsEndOfFile())
            {
                var num = long.Parse(reader.ReadWord(true));
                backlog.Add(num);
            }

            var backlogCount = backlog.Count;

            for (var i = 0; i < backlogCount; i++)
            {
                if (backlog[i] > searchValue)
                {
                    continue;
                }

                var sum = backlog[i];
                var min = backlog[i];
                var max = backlog[i];
                for (var j = i + 1; j < backlogCount; j++)
                {
                    sum += backlog[j];
                    min  = Math.Min(backlog[j], min);
                    max  = Math.Max(backlog[j], max);
                    if (sum > searchValue)
                    {
                        break;
                    }

                    if (sum == searchValue)
                    {
                        Log.Information("Encryption weakness: {Value}", min + max);
                        return;
                    }
                }
            }
        }
コード例 #9
0
        public static int Solve(string text)
        {
            var        reader    = new SpanStringReader(text);
            Span <int> schedules = stackalloc int[2048];

            var scheduleCount = 0;
            var departure     = reader.ReadInt(true);

            while (!reader.IsEndOfFile())
            {
                var value = reader.ReadUntil(',', true);
                if (value[0] == 'x')
                {
                    continue;
                }

                schedules[scheduleCount++] = reader.ParseInt(value);
            }

            var closestScheduleValue = double.MaxValue;
            var closestSchedule      = -1;

            for (var i = 0; i < scheduleCount; ++i)
            {
                var nextDepartureTime = Math.Ceiling(departure / (double)schedules[i]) * schedules[i];
                var minutesToWait     = nextDepartureTime - departure;

                if (minutesToWait < closestScheduleValue)
                {
                    closestScheduleValue = minutesToWait;
                    closestSchedule      = i;
                }
            }

            return(schedules[closestSchedule] * (int)closestScheduleValue);
        }
コード例 #10
0
 public static ulong Solve(string text)
 {
     var reader = new SpanStringReader(text);
     Span <(ulong Value, ulong Modulo)> schedules = stackalloc (ulong Value, ulong Modulo)[2048];
コード例 #11
0
 public static ReadOnlySpan <char> GetMask(ref SpanStringReader reader)
 {
     reader.ReadUntil('=', false);
     reader.ReadChar(true);
     return(reader.ReadWord(true));
 }
コード例 #12
0
 public static int Solve(string text)
 {
     var reader = new SpanStringReader(text);
     Span <(int Value, int Cell)> schedules = stackalloc (int Value, int Cell)[2048];