Advent of Code

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Manul Ich hatte die Berechnung der relativen Positionen der Nachbarn so verallgemeinert:

    Spoiler anzeigen
    Python
    from itertools import product
    
    ...
    
    def calculate_neighbour_deltas(dimension_count):
        return [
            Point(*coordinates)
            for coordinates in product([-1, 0, 1], repeat=dimension_count)
            if not all(component == 0 for component in coordinates)
        ]

    `Point` ist nicht allgemein, sondern einfach 4D mit 0 als Defaultwert für alle Komponenten.

    Das mit der Zeichenkettenverarbeitung kann ich auch nicht finden. Ich bin bis jetzt eigentlich immer hauptsächlich mit `strip()`, `split()`, und `partition()` in Python ausgekommen + `more_itertools.split_at()` wenn eine Eingabe aus mehreren durch Leerzeilen getrennten Blöcken bestand. Wobei ich das parsen in der Regel auf mehrere Funktionen/Methoden aufteile. Vielleicht wird das tatsächlich etwas unübersichtlich und nervig wenn man alles komplett in einer Funktion/Methode parst.

    Vielleicht hab ich schlecht ausgedrückt, wenn ich meine Anmerkungen von heute morgen nochmal lese.

    Es sind nicht unbedingt die String-Operationen, die mich jetzt nerven, sondern dass meist der eigentliche Algorithmus darauf basiert, dass man einfach beim Parsen der Datei mal hier drauf und mal da drauf achten muss. Eigentlich sind das alles so Aufgaben, bei denen ich lerne ein effektives Parsen anzuwenden aber nicht mal wirklich zu knobeln.

    Aber vielleicht kommt da ja mehr nach Tag 7 ... mal sehen :)

    .NET-, Unity3D-, Web-Dev.
    Mikrocomputer-Hobbyist.

  • Ich bin mir nicht ganz sicher, ob ich verstehe, was Du meinst. Der Kniff beim Parsen ist doch, die Eingabe hinterher in einer Form repräsentiert zu haben, die einem eben das Bearbeiten der gestellten Aufgabe möglichst leicht macht. Ich finde, das beinhaltet durchaus ein bißchen Knobeln. Zumal ja immer noch das Raten dazu kommt, was wohl in Teil gefragt wird, und der Versuch, beim Parsen gleich dafür vorzusorgen. Das finde ich teilweise das witzigste.

    Die heutige (Tag 19) Aufgabe fand ich so na ja. Aufgabenstellungen

    Spoiler anzeigen

    mit Rekursion

    wie in Teil 2 machen mir beim Nachdenken immer Knoten ins Hirn und ich brauche dementsprechend viele Versuche mit relativ viel trial & error, bis ich sie gelöst habe. Das ist zwar nicht unlehrreich, aber auch nicht durchgehend übertrieben spaßig. Mit meiner Lösung bin ich mittelzufrieden: Ich hätte sie gerne etwas allgemeiner und etwas übersichtlicher gehabt.

  • Hallo zusammen

    Leider teile ich euch heute mit, dass ich aus Zeitgründen (Arbeit und "normales Leben und dann noch hier probieren eine Lösung finden) nun "mehrheitlich" aufgebe. ;(;(;(

    Finde die Idee super, und durch das hier einige Ihre Lösungen präsentieren kann ich von denen lernen. Dafür nochmals und auch noch im voraus an alle :danke_ATDE::danke_ATDE::danke_ATDE::bravo2::bravo2::bravo2:

    Freundliche Grüsse

    Dani

  • Manul Ich habe die Regeln einfach in einen regulären Ausdruck übersetzt. Mit einer Sonderbehandlung in Teil 2 für die betroffenen Regeln. Zur Hälfte ging das noch ganz regulär (Knallerwortspiel ?), für die andere Hälfte muss man eine Regex-Engine verwenden, die das kann was in Deinem Spoiler versteckt ist. Damit ist das dann recht einfach. Also in Python ist das ein Grund sich das externe `regex`-Modul mal anzuschauen. Hat die gleiche API wie das `re`-Modul aus der Standardbibliothek, kann aber ein bisschen mehr.

    Für Teil 1 ist in Python 3.9 das neu hinzugekommene `graphlib`-Modul nützlich. Vorsicht Spoiler: Nicht in das Modul schauen wenn man keinen deutlichen Hinweis haben möchte. Wer noch kein Python 3.9 einsetzt: Das Modul gibt es als `graphlib-backport` aus dem Python Package Index für Versionen von 3.6 bis 3.8.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Die heutige (Tag 20) Aufgabe fiel für mich – auch wenn mein Spoiler von gestern heute nicht gilt – doch wieder in die gleiche Kategorie: Knoten ins Hirn, viel trial & error und damit letztlich Fleißarbeit mit mäßigem Spaßfaktor.

    Vermutlich ist mein Ansatz wieder zu kompliziert und ich habe diverse Räder neu erfunden, die ich in Form von Pythonbibliotheken gratis frei Haus hätte bekommen können.

    Wenn die verbleibenden Aufgaben ähnlich sind, muß ich schauen, ob ich dabeibleibe.

  • Manul Teil 1 von Tag 19 lässt sich sehr einfach, weil direkt, auf reguläre Ausdrücke abbilden. Die erste Modifikation von Teil 2 ist auch noch ganz einfach auf reguläre Ausdrücke übertragbar, also noch mit dem `re`-Modul realisierbar. Nur die zweite Modifikation verlangt etwas was reguläre Ausdrücke wie sie Sinne von formalen Sprachen definiert sind, nicht leisten können, wo man dann auf die nächste Stufe, kontextfreie Sprachen, gehen muss. Aber es gibt Regex-Engines die ”aufgebohrt” sind und man auch die zweite Modifikation von Aufgabenteil zwei als ”regulären” Ausdruck beschreiben kann. Perl und Ruby können das von Haus aus. Für Python kann man das `regex`-Modul installieren.

    Hier meine Lösung für Tag 19:

    Spoiler anzeigen

    Das Programm wandelt die Regeln erst in ein Wörterbuch das Regelnummer auf eine Liste von Listen umwandelt, wobei die äussere Liste die Alternativen enthält, und die inneren Listen die Verkettungen von Regeln. Oder es wird die Regelnummer auf den Buchstaben abgebildet.

    Und dann habe ich eine Funktion die diese Datenstruktur in reguläre Ausdrücke umwandelt. Da kommt erst `graphlib` ins Spiel um die Regeln so zu sortieren dass man immer nur Regeln betrachten kann für die man vorher schon alle benötigten Regeln die von der Regel verwendet werden verarbeitet hat. Beim ersten Beispiel kann man die Regeln einfach von der letzten bis zur ersten Abarbeiten, aber die tatsächlichen Eingabedaten sind unsortiert.

    Umwandlung in einen regulären Ausdruck am ersten Beispiel, wo man nichts sortieren muss, sondern einfach von Regel 5 bis Regel 0 gehen kann:

    Code
    0: 4 1 5
    1: 2 3 | 3 2
    2: 4 4 | 5 5
    3: 4 5 | 5 4
    4: "a"
    5: "b"

    4 und 5 sind einfach der Buchstabe selbst. Und dann muss man die eigentlich einfach nur noch in die Regeln davor einsetzen und Klammern um einen passenden regulären Ausdruck aufzubauen:

    3: "(ab|ba)"

    2: "(aa|bb)"

    1: "((aa|bb)(ab|ba)|(ab|ba)(aa|bb))"

    0: "(a((aa|bb)(ab|ba)|(ab|ba)(aa|bb))b)"

    Teil zwei ist bei mir auch nicht allgemein gelöst, sondern wirklich sehr eng an der Aufgabe in die Lösung von Teil eins rein gepatcht. Ich denke man kann mit `regex` eine allgemeinere Lösung umsetzen. Also wo man nicht ”manuell” über die Bedeutung der beiden Modifikationen nachdenkt, sondern die einfach an den Regeln ändert und die geänderten Regeln durch die gleiche, unveränderte Funktion jagt, die auch für Teil eins funktioniert. Wäre ein TODO. ?

    Die heutige Aufgabe habe ich gelesen, und ein paar Zeichnungen auf einem gebrauchten Briefumschlag gemacht, und dann beschlossen das heute Sonntag ist.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Ich bin mir nicht ganz sicher, ob ich verstehe, was Du meinst. Der Kniff beim Parsen ist doch, die Eingabe hinterher in einer Form repräsentiert zu haben, die einem eben das Bearbeiten der gestellten Aufgabe möglichst leicht macht. Ich finde, das beinhaltet durchaus ein bißchen Knobeln. Zumal ja immer noch das Raten dazu kommt, was wohl in Teil gefragt wird, und der Versuch, beim Parsen gleich dafür vorzusorgen. Das finde ich teilweise das witzigste.

    ...

    Hm ich habe ehrlicherweise meist direkt beim Parsen versucht auf die Lösung der Aufgabe einzugehen, ohne mir bspw. irgendwelche Hilfsobjekte zu bauen - möglichst keine Zyklen verschwenden, wenn es offensichtlich klappt ;)

    Na ja, so oder so lese ich hier noch ein wenig quer, aber der Rückstand mindert meine Motivation noch umso mehr ... viel Spaß und Erfolg euch noch :)

    .NET-, Unity3D-, Web-Dev.
    Mikrocomputer-Hobbyist.

  • __blackjack__ Danke! Den TopologicalSorter muss ich mir nochmal genauer anschauen – was er in Deiner Lösung macht, ist mir jetzt klar, warum er das macht noch nicht endgültig. ;)

    Meine umständliche Lösung ist in gewisser Weise dann sogar allgemeiner als Deine, macht aber eben sehr spezifische Annahmen über die Eigenschaften der Regeln

    Spoiler anzeigen

    mit Rekursion

    .

    Renão Na ja, was heißt Hilfsobjekte? Ich versuche halt jeweils schon, die eingelesenen Daten auch gleich in geeigneter Form zu speichern, weil ich ja weiß, daß ich sie nochmal brauchen werde.

    Die heutige (Tag 21) Aufgabe fand ich wieder etwas überschaubarer und dementsprechend auch in deutlich kürzerer Zeit zu lösen. Vielleicht motiviert das ja den einen oder anderen der mittlerweile passiven Mitleser, sich an der doch noch mal zu versuchen.

    Einmal editiert, zuletzt von Manul (22. Dezember 2020 um 09:52)

  • Spielt außer mir eigentlich noch jemand mit?

    Die heutige Aufgabe (Tag 23) ist eigentlich relativ trivial, mein naiver Ansatz stößt im Teil 2 aber an Ressourcengrenzen. Geht das noch jemandem ähnlich? Ich habe ein, zwei Ideen, wo ich ansetzen könnte, bin mir aber unsicher, ob die erfolgversprechend sind.

  • Ich setze mal mein Selbstgespräch fort: Tag 24 war wieder relativ straightforward, Teil 2 war dann noch mal

    Spoiler anzeigen

    eine Conway-Variante

    , mehr davon braucht's jetzt nicht mehr.

    Nach nochmaligem Nachdenken habe ich meinen Teil 2 von Tag 23 jetzt auch auf knapp eine Minute Laufzeit bekommen. Anderswo habe ich von 8 Sekunden Laufzeit (wenn ich mich richtig erinnere ebenfalls in Python) gelesen, da würde mich schon interessieren, mit welchem Ansatz das erreicht wurde.

    Jetzt noch das morgige Finale...

    Einmal editiert, zuletzt von Manul (25. Dezember 2020 um 10:33) aus folgendem Grund: "Filiale"??? Wie kam ich denn da drauf?

  • Salü Manul

    Finde es tool, das du bis am Schluss zeit hattest (gehe jetzt einfach davon aus, das morgen auch noch gemacht wird).

    bei mir hat es leider nicht mehr gereicht, und aktuell stehen wieder andere "wichtigere / interessantere " oder anders ausgedrückt "nützlichere " Projekt an. (z.B.: erste Schritte mit Grafana (geht "nur" noch um die Darstellung - Die Datenaufzeichnung ist in mysql und influxdb vorhanden - da geht es erst mal um Temperaturaufzeichnung von 5 Messpunkten über ca 40 Stunden mit jede MInute ein Messwert. Was mich vorallem INteressiert ist die Dynamische ansicht - also "zoomen, falls ich ein Bereich genauer anschauen möchte....).

    Gruss Dani

  • =O

    Nicht zu glauben, aber bald ist wieder ein Jahr um und somit steht das Advent of Code Event so langsam vor der Türe.

    https://www.heise.de/news/Advent-of…en-6269129.html

    Habe leider bisher noch nichtmal die restlichen Rätsel von 2020 nachgemacht, bin gespannt wie weit ich es dieses Jahr wieder schaffe.

    Wer wird dieses Jahr sonst noch wieder mit dabei sein?

  • an sich eine coole Sache! Aber das werde ich mir persönlich nicht auch noch antun. Es stehen eh schon so viele Dinge auf meiner TODO-Liste :lol:

    A so a Woch, då kánnst so vui z'reissn, aber mit da Arwat is komplett versaut!

    ("Ja, so eine Woche, da könnte man so viel schaffen, aber mit der Arbeit ist sie komplett versaut!")

    :stumm:

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!