__blackjack__ hat geschrieben: Donnerstag 27. Dezember 2018, 11:42
@ThomasL: Ich habe Deinen Code mal überarbeitet, aber der Ansatz ist IMHO nicht gut, denn Dein Original braucht bei mir 11 Sekunden!  Das habe ich auf knapp unter 4 drücken können, ohne das ich speziell irgendwas gemacht habe ausser Vereinfachungen die IMHO alle nicht auf Kosten der Lesbarkeit gehen, aber gegen den Sekundenbruchteil den der Ansatz von kbr und mir braucht, ist das IMHO immer noch zu langsam.
 
Hi __blackjack__, es ist mir immer eine Freude, deine Code-Beispiele durch zu arbeiten, sie zu verstehen und daraus zu lernen.
Persönlich habe ich die täglichen AoC Aufgaben nicht so verstanden, dass es dabei darum geht, Code mit der kürzesten runtime zu schreiben.
Bei den Teilnehmern die auf eine Platzierung im Leaderboard "scharf" waren, ging es eher darum, so schnell wie möglich eine Lösung zu coden
um unter die Top100 zu kommen. Klar, wenn der gewählte Algorithmus dann eine Runtime von Stunden hat ist das kontraproduktiv.
Aber 1h die runtime zu optimieren um dann 11sek zu "sparen" macht keinen Sinn.
Aber ich kann mir vorstellen, dass du einen beruflichen Background hast, bei dem es wichtig ist, das jede ms in der Produktion eingespart wird und das ist auch gut so.
Ich habe mal meine Kenntnisse in regular expressions aufgefrischt (Danke an @kbr für seinen Einlese-Code)
und das Einlesen der Daten und das Erstellen der "squares"-Liste zusammen gefasst.
Auf meiner todo-Liste steht definitiv noch die Einarbeitung in das Modul itertools, das ist bisher zu kurz gekommen.
Code: Alles auswählen
from itertools import combinations
import re
# ----- Part 1 -----
pattern = re.compile(r'#\d+ @ (\d+),(\d+): (\d+)x(\d+)')
squares = list()
with open('day_03_input.txt', 'r') as inputfile:
    for line in inputfile:
        start_x, start_y, width, height = list(map(int, pattern.match(line).groups()))
        squares.append(set((start_x + x, start_y + y) for x in range(width) for y in range(height)))
union = set()
for mat1, mat2 in combinations(squares, 2):
    union |= mat1 & mat2
print(len(union))
# ----- Part 2 -----
for idnum, square in enumerate(squares, 1):
    if union.isdisjoint(square):
        print(idnum)