Da wir wieder in den Fluss der Dinge kommen, stelle ich fest, dass es einen Rhythmus gibt, an ein Rätsel heranzugehen, der genauso dazu gehört, ein Rätsel sauber und effizient zu lösen wie das Rätsel selbst. Hier ist mein Arbeitsablauf, wie ist Ihrer?
Ich beginne damit, zwei Dateien zu erstellen: eine .py-Datei mit der unten gezeigten Vorlage (AoC-2019-7.py) und eine leere Textdatei für das Rätsel (AoC-2019-input-7.txt). Dann beginne ich mit dem Lesen des Rätsels. Wenn ich zum Link für die Rätseleingabe komme, kann ich die Daten einfach mit Strg+A Strg+V in die Eingabedatei übertragen.
#!/usr/bin/env python3
"""Solution for Advent of Code challenge 2019 - Day X"""
__author__ = "Serge Beaumont"
__date__ = "December 2019"
def load_input(day):
with open(f"AoC-2019-input-{day}.txt") as infile:
return [[int(y) for y in x.split(',')] for x in infile.readlines()]
def do(data):
return False
if __name__ == '__main__':
# Run tests
# assert do(XXX) == YYY
# Load data
data = load_input(0)
print(data)
# Solve puzzle
result = do(data)
# Output
print(f"Part 1: {result}")
Als allererstes müssen Sie sicherstellen, dass die Daten korrekt geladen werden. Die Anweisung print(data) in der .py-Datei dient genau diesem Zweck: Ich neige dazu, sie später zu entfernen. Je nach Bedarf muss ich eventuell Zeilen aufteilen, Leerzeichen entfernen und Daten in Tupel aufteilen. Die Vorlage oben zeigt eine der aufwändigeren Versionen: alle Zeilen einlesen, entlang von Komma-Grenzen aufteilen und alle Zahlen in Ints umwandeln. Wenn ich es mir recht überlege, war dieses Jahr nicht so regex-lastig wie andere Jahre - bis jetzt...
Der nächste Schritt besteht darin, alle Beispiele in assert do(example input) == expected output Zeilen zu kopieren. Es gibt zwei Dinge, die für mich bei meinem Testansatz wichtig sind:
- dass alle Beispiele vor dem eigentlichen Rätsel ausgeführt werden: Wenn alle Tests laufen, wird das eigentliche Rätsel in der Regel sauber ausgeführt, was eine große Zeitersparnis bedeutet, wenn die Bearbeitung länger dauert, und
- mit einer
do()Funktion, so dass das Puzzle entweder von einem Test aus oder mit den eigentlichen Puzzle-Daten transparent aufgerufen werden kann.
Wenn ich eine Lösung auf der Rätselseite ausprobiere und sie falsch ist, erhalten Sie eine Seite mit einigen Informationen, manchmal sogar wenn die Antwort zu hoch oder zu niedrig war. Ich füge diese Informationen als Assert-Anweisungen am Ende der Datei ein.
Wenn ich Teil 1 richtig gelöst habe, lese ich zuerst Teil 2, bevor ich entscheide, ob ich die Lösung von Teil 2 in den Code von Teil 1 integriere oder ob ich eine separate .py-Datei verwende.
Dieses Jahr habe ich sogar den kompletten IntCode-Computer in eine eigene Bibliothek ausgelagert. Ich habe schon einige Leute gesehen, die sich darüber beschwert haben, dass der Computer drei Tage lang in der Bibliothek steht, aber ich bin gespannt, was Eric The Puzzle Master Wastl in petto hat. Was mir an den drei Tagen mit dem IntCode-Computer gefällt, ist, dass es mir erlaubt bzw. mich gezwungen hat, den Code zu überarbeiten, was eine interessante Abwechslung zu dem Wegwerfcode ist, den man schreiben kann, wenn er nur für einen einzigen Tag ist...
Wenn es noch etwas gibt, das in meinem Ansatz konsistent ist, dann ist es mein Timing von Dusche und Frühstück. Ich lese das Rätsel absichtlich vor der Dusche und dem Frühstück, probiere eine Lösung aus und zwinge mich dann zu meiner täglichen Routine. Ich habe festgestellt, dass es mir sehr hilft, wenn ich eine Weile über das Rätsel nachdenke, während ich nicht auf den Bildschirm starre. Ich glaube, 80 % meiner Durchbrüche gelingen mir während dieser "Auszeit".
Das ist mein Ansatz. Was ist Ihrer?
Advent of Code 2019 Series
- Advent of Code 2019 Has Started - Join In!
- Advent of Code 2019 - Day 2
- Advent of Code: How Excel Made My Day and Saved My Son's Day Too
- Advent of Code - Day 4: Visualize
- Advent of Code - Day 5: Saintaerkla2s
- Advent of Code - Day 6: How I Got Hooked on AoC
- Advent of Code - Day 7: Share Your Workflow
- Advent of Code - Day 8: How Simple Things Can Be Very Hard for Some People
- Advent of Code - Day 9: How I Started Enjoying Solving Programming Puzzles
- Advent of Code - Day 10: Space Cowboys Shooting Pixels in the Sky
- Advent of Code - Day 11: To Be or Not to Be
- Advent of Code - Day 12: Shooting for the Moon
- Advent of Code - Day 14: Chain Reaction
- Advent of Code - Day 16: Curses
- Advent of Code - Day 17: Vacuuming a Scaffold with the Intcode Program
- How Little Green Men Helped Me Solve a Puzzle
- Advent of Code - Day 20: A Little Bit of Revision
- Advent of Code - Day 21: It's a Marathon, Not a Sprint
- Advent of Code - Day 22: Shuffling Cards Until Eternity
- Advent of Code - Day 23: The Network is Reliable
- Advent of Code - Day 24 & 25: Think Out of the Box
Verfasst von
Serge Beaumont
Unsere Ideen
Weitere Blogs
Contact


