今天的挑戰很簡單:
第 1 部分:
為了解決這個問題,我們必須
簡單吧。
第 2 部分:
這有點棘手,但我的解決方案的主要概念是:
建立一個字典,其中 key 是 listA 中的數字,value 使用 Count() 方法統計 listB 中與 key 相同的數字(與 listA 索引相同的數字)。
那麼這只是一個將鍵乘以值並對總數求和的簡單情況。
var input = File.ReadAllLines("./input_1.txt") .Select(s => s.Split([' '], StringSplitOptions.RemoveEmptyEntries)).ToList(); var lists = ProcessLines(input); Part1(lists.list1, lists.list2); Part2(lists.list1, lists.list2); return; void Part1(List<int> list1, List<int> list2) { var ordered1 = list1.OrderBy(x => x).ToList(); var ordered2 = list2.OrderBy(x => x).ToList(); var totals = ordered1 .Select((t, i) => Math.Abs(t - ordered2[i])) .Select(difference => (long)difference) .ToList(); Console.WriteLine("Sum of differences: " + totals.Sum()); } void Part2(List<int> list1, List<int> list2) { var counts = list1.ToDictionary( number => number, number => list2.Count(x => x == number) ); var sum = counts.Sum(x => x.Value * x.Key); Console.WriteLine("Sum of counts: " + sum); } (List<int> list1, List<int> list2) ProcessLines(List<string[]> rows) { var list1 = new List<int>(); var list2 = new List<int>(); foreach (var row in rows) { list1.Add(int.Parse(row[0])); list2.Add(int.Parse(row[1])); } return (list1, list2); }
第 1 部分 - Python
相同的概念不同的語法 - 很多
使用內建的 zip 函數和清單理解功能更加簡潔。
def get_steps(list1, list2): totals = [abs(value - partner_item) for value, partner_item in zip(list1, list2)] print("Sum Total:", sum(totals)) def read_input(file_name): list1, list2 = zip(*((int(num1), int(num2)) for num1, num2 in (line.split() for line in open(file_name)))) return sorted(list1), sorted(list2) list1, list2 = read_input("input.txt") get_steps(list1, list2)
第 2 部分 - 進行中(已經太晚了)⏰
以上是AoC '- 日歷史學家歇斯底里(C# 和 Python)#劇透的詳細內容。更多資訊請關注PHP中文網其他相關文章!