오늘의 챌린지는 아주 간단했습니다.
1부:
문제를 해결하려면
쉽죠.
2부:
이것은 조금 더 까다로웠지만 내 솔루션의 주요 개념은 다음과 같습니다.
키가 listA의 숫자인 사전을 생성합니다. 값은 Count() 메서드를 사용하여 키와 동일한(listA와 동일한 인덱스에 있는 숫자) listB의 모든 숫자를 계산합니다.
그러면 키에 값을 곱하고 합계를 합산하는 간단한 경우입니다.
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 '- Day Historian Hysteria(C# 및 Python) #스포일러의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!