Day 1: Historian Hysteria

Megathread guidelines

  • Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
  • You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://blocks.programming.dev if you prefer sending it through a URL

FAQ

  • @SteveDinn@lemmy.ca
    link
    fedilink
    119 hours ago

    C#

    using System;
    using System.Linq;
    
    public record Point(int X, int Y); 
    
    static class Program
    {
        static async Task Main(string[] args)
        {
            var data = (await ReadInputFromFile("data.txt")).ToArray();
    
            var part1Answer = CalculateTotalDifference(data);
            Console.WriteLine($"Part 1 = {part1Answer}");
    
            var part2Answer = CountFrequencies(data);
            Console.WriteLine($"Part 2 = {part2Answer}");
        }
    
        public static int CountFrequencies(ICollection<Point> points)
        {
            var freq = points
                .GroupBy(p => p.Y)
                .ToDictionary(g => g.Key, g => g.Count());
            return points
                .Sum(p => freq.GetValueOrDefault(p.X, 0) * p.X);
        }
    
        public static int CalculateTotalDifference(ICollection<Point> points)
            => points.OrderBy(p => p.X)
                .Zip(
                    points.OrderBy(p => p.Y),
                    (px, py) => Math.Abs(px.X - py.Y))
                .Sum();
    
        public static readonly char[] Delimiter = new char[] { ' ' };
        public static async Task<IEnumerable<Point>> ReadInputFromFile(string path)
            => (await File.ReadAllLinesAsync(path))
                .Select(l =>
                {
                    var parts = l.Split(
                        Delimiter,
                        StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
                    return new Point(int.Parse(parts[0]), int.Parse(parts[1]));
                });
    }