Der Tag neigt sich dem Ende, ich komme mal wieder nicht voran.
Ich habe im ersten Schritt die Position aller Zahlen rausgesucht und das sieht mit den Beispieldaten so aus:
Code: Alles auswählen
{0: [(0, 3), (5, 8)], 1: [], 2: [(2, 4), (6, 9)], 3: [], 4: [(0, 3)], 5: [(7, 9)], 6: [(2, 5)], 7: [(6, 9)], 8: [], 9: [(1, 4), (5, 8)]}
Schlüssel ist die Zeilennummer und die Tupel gibt an, bei welchem Index die Zahl(enfolge) anfängt und aufhört.
Mein Gedanke war, das ich mit den Indexwerten auf die Input-Daten losgehe und wenn +1 neben der gefunden Zahl oder unter der gefunden Zahl bzw. diagonal kein Punkt und keine Zahl ist, dann schreibe ich die Zahl in eine Liste.
Mit den Beispieldaten funktionierte das auch, aber mit den "richtigen" Daten leider nicht.
Hm da muss ich heute wohl aufgeben. Ich wäre, auch wenn ich unter der Woche immer wenig Zeit habe, trotzdem sehr interessiert, wie denn eine saubere Python-Lösung aussieht. Das muss ich echt aufarbeiten, bei einer ähnlichen Aufgabe bin ich in dem letzten oder vorletzten Jahr auch ausgeschieden.
Das ist mein experimentier-Code, der zumindest für die Beispieldaten funktioniert.
Code: Alles auswählen
import re
from pathlib import Path
INPUT = Path('/home/dennis/AoC/2023/Day3/input.txt')
EXAMPLE_LINES = """\
467..114..
...*......
..35..633.
......#...
617*......
.....+.58.
..592.....
......755.
...$.*....
.664.598..""".splitlines()
def main():
engine_parts = INPUT.read_text(encoding='UTF-8').splitlines()
line_to_parts = {number: [] for number in range(len(engine_parts))}
for line_number, line in enumerate(engine_parts):
for match in re.finditer(r"\d+", line):
line_to_parts[line_number].append(match.span())
found_part = set()
for line_number, parts in line_to_parts.items():
for part in parts:
start, end = part
try:
item = engine_parts[line_number][end]
except IndexError:
item = '.'
if item != '.' and not item.isdigit():
found_part.add(int(engine_parts[line_number][start:end]))
else:
try:
for item in engine_parts[line_number + 1][start:end + 1]:
if item != '.' and not item.isdigit():
found_part.add(int(engine_parts[line_number][start:end]))
except IndexError:
pass
try:
for item in engine_parts[line_number - 1][start:end + 1]:
if item != '.' and not item.isdigit():
found_part.add(int(engine_parts[line_number][start:end]))
except IndexError:
pass
try:
for item in engine_parts[line_number + 1][start - 1:end]:
if item != '.' and not item.isdigit():
found_part.add(int(engine_parts[line_number][start:end]))
except IndexError:
pass
try:
for item in engine_parts[line_number - 1][start - 1:end]:
if item != '.' and not item.isdigit():
found_part.add(int(engine_parts[line_number][start:end]))
except IndexError:
pass
print(sum(found_part))
if __name__ == "__main__":
main()
Danke und viele Grüße
Dennis