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
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/22323136
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465
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])); }); }