Re: Advent of Code
Verfasst: Sonntag 11. Dezember 2022, 12:26
Seit 2002 Diskussionen rund um die Programmiersprache Python
https://www.python-forum.de/
Soweit d'accord.__blackjack__ hat geschrieben: ↑Sonntag 11. Dezember 2022, 13:59 @Manul: Mathe-Aufgaben. Bäh. Ich vermute für Teil zwei müsste man eine Repräsentation für die Zahlen finden die nicht so ”gross” wird und bei der man die Operationen und Tests effizient durchführen kann.
Sicher? Ich habe so eine Repräsentation gefunden (auch wenn ich nicht sicher bin, ob sie die effizienteste ist), aber die kommt mit dem "Abkühlen" nicht zurecht.__blackjack__ hat geschrieben: ↑Sonntag 11. Dezember 2022, 13:59 Dann müsste man an einer Lösung für Teil 1 nicht viel ändern.
Jetzt bin ich neugierig: Wie sieht die denn aus? Ich habe in Teil 2 für alle items zu allen vorkommenden Divisoren jeweils den "worry"-Wert modulo des Divisors gespeichert. Das funktioniert prima für Addition und Multiplikation, aber nicht mehr für Integerdivision mit Abrunden.narpfel hat geschrieben: ↑Sonntag 11. Dezember 2022, 14:45 Es gibt auch eine einfache Lösung, die nicht darauf basiert, dass der Test immer auf Teilbarkeit durch eine Primzahl testet. Und man kann auch ganz normale `int` zur Repräsentation nehmen. Im Prinzip ist das Diff von Teil 1 zu Teil 2 bei mir drei Zeilen lang.
(Hervorhebung von mir)https://adventofcode.com/2022/day/11 hat geschrieben: After each monkey inspects an item but before it tests your worry level, your relief that the monkey's inspection didn't damage the item causes your worry level to be divided by three and rounded down to the nearest integer.
Code: Alles auswählen
def part_1(monkeys):
return solve(
monkeys,
round_count=20,
worry_level_update=lambda worry_level: worry_level // 3,
)
def part_2(monkeys):
return solve(
monkeys,
round_count=10_000,
worry_level_update=lambda worry_level: <<magic>>,
)
Da bin ich gespannt. Ich habe keine Ahnung, wie eine Repräsentation aussieht, die wegen der Addition nicht klappt.__blackjack__ hat geschrieben: ↑Sonntag 11. Dezember 2022, 13:59 @Manul: Mathe-Aufgaben. Bäh. Ich vermute für Teil zwei müsste man eine Repräsentation für die Zahlen finden die nicht so ”gross” wird und bei der man die Operationen und Tests effizient durchführen kann. Dann müsste man an einer Lösung für Teil 1 nicht viel ändern. Ich hätte eine Idee, wenn da nicht die Addition als Operation wäre. (Es ist wahrscheinlich jedem aufgefallen, dass die Teilbarkeit immer eine Primzahl betrifft.)
Das hatte ich indirekt aus
geschlossen. Je nach Interpretation sehen wir hier schon 1 bis 3 geänderte Zeilen, da bleibt an anderer Stelle nicht mehr viel Luft.
Code: Alles auswählen
from math import prod
class Monkey:
def __init__(self, data):
self.items = list(map(int, data[1][16:].split(', ')))
self.op = data[2][21:].split()
self.divisor = int(data[3].split()[-1])
self.next = [int(data[4].split()[-1]), int(data[5].split()[-1])]
self.inspected = 0
def inspect(self, part1):
while self.items:
worry = self.items.pop(0)
self.inspected += 1
factor = worry if self.op[1] == 'old' else int(self.op[1])
new = worry * factor if self.op[0] == '*' else worry + factor
new = int(new / 3) if part1 else new % common
monkeys[self.next[bool(new % self.divisor)]].items.append(new)
data = [line.strip() for line in open('input.txt').readlines()]
monkeys = [Monkey(data[i*7:(i+1)*7]) for i in range((len(data) // 7)+1)]
common = prod([monkey.divisor for monkey in monkeys]) # Produkt aller Modulo Werte der Affen
def run(amount, part1):
for round in range(amount):
for monkey in monkeys:
monkey.inspect(part1)
run(20, True)
print('Part 1:', prod(sorted([monkey.inspected for monkey in monkeys])[-2:]))
monkeys = [Monkey(data[i*7:(i+1)*7]) for i in range((len(data) // 7)+1)]
run(10000, False)
print('Part 2:', prod(sorted([monkey.inspected for monkey in monkeys])[-2:]))
Ah, ja, das wäre eine gute Möglichkeit, auch große Zahlen darzustellen, wenn es nur Multiplikation gäbe.__blackjack__ hat geschrieben: ↑Sonntag 11. Dezember 2022, 18:15 @bords0: Ich hatte an eine Primfaktorzerlegung gedacht. Das lässt sich leicht multiplizieren, aber Addition geht halt nicht. AFAIK. Kein Mathegenie hier.![]()