Advent of Code 1: „Report Repair” – Lösungsaustausch

Das Advent of Code-Puzzle „Report Repair“ für heute ist ab jetzt verfügbar!

In diesem Thread könnt ihr eure Lösungen posten, oder euch über das Puzzle austauschen.

Quellcode bitte in dieser Syntax posten („python“ durch die verwendete Sprache ersetzen):

```python
print("hello world")
```

Hier mal meine quick and dirty Lösung in c#:

static int Solve1(int[] input) {
	foreach(var num1 in input) {
		foreach(var num2 in input) {
			if (num1 + num2 == 2020 && num1 != num2) {
				return num1 * num2;
			}
		}
	}

	return - 1;
}

static int Solve2(int[] input) {
	foreach(var num1 in input) {
		foreach(var num2 in input) {
			foreach(var num3 in input) {
				if (num1 + num2 + num3 == 2020 && num1 != num2 && num1 != num3) {
					return num1 * num2 * num3;
				}
			}
		}
	}

	return - 1;
}

Python, in guter, alter xkcd 974-Manier kann es nicht nur 2 oder 3, sondern n Nummern…

#!/usr/bin/env python3

import math


def main():
    with open("01-input.txt", "r") as file:
        input = list(map(int, file))
        for sum_of in range(10):
            nums = find_sum(input, target := 2020, sum_of)
            if nums:
                print(
                    f"The {sum_of} numbers are that sum up to {target}: {nums}"
                )
                print(f"The result is {math.prod(nums)}")
            else:
                print(f"There are no {sum_of} numbers that sum up to {target}")


def find_sum(input: list, target: int, sum_of: int) -> tuple[int, int]:
    input.sort()

    if sum_of < 1:
        for number in input:
            if number > target:
                break
            if number == target:
                return (number, )
    else:
        for idx, number in enumerate(reversed(input)):
            if number < target:
                subtarget = target - number
                ret = find_sum(input[:-idx], subtarget, sum_of - 1)
                if ret:
                    return number, *ret


if __name__ == "__main__":
    main()