Advent of Code

  • Hallo zusammen


    Teil 1 der heutigen Aufgabe habe ich gelöst. Bei Teil 2 blicke ich nicht durch (bekomme einen wert der viel kleiner als 100000000000000 ist.


    Obwohl mein Teil 1 (für mich) schön kurz ist, bin ich mir sicher das es noch kürzer geht. Evtl kann ich da dann noch was lernen.


    Anbei mal mein Code für Teil 1.

    Freundliche Grüsse

    Dani

  • Teil 2 heute ist die erste Aufgabe, die ich wirklich knifflig finde. Eine Lösung für sämtliche Beispiele habe ich, aber wenn ich die auf den echten Input loslasse, braucht sie Stunden. Die Variante mit allen Optimierungen, die mir bis jetzt eingefallen sind, läuft jetzt auch schon seit ca. 10 Minuten. Mal sehen, ob und wann die ein Ergebnis ausspuckt.


    Zwischenlösung Teil 1 in Python:

  • Wie kommt Ihr auf die Ansätze für den Tag 2?

    Ich nehme an, Du meinst Teil 2?


    Ich addiere von hinten die Anzahl der Wege auf, auf denen man vom jeweiligen Adapter zum Ziel kommen kann. Für den letzten Adapter ist das genau einer, weil es ja keine höheren Adapter mehr gibt. Für alle anderen Adapter x schaue ich mir an, welche weiteren Adapter y (maximal 3) ich von dort erreichen kann. Die Anzahl der Wege von x ist dann gleich der Summe der Wege von allen y. Wird das so klar?

  • Manul


    Absolut richtig! Natürlich meine ich Teil 2. Weiss nicht, warum da Tag steht!


    Noch nicht ganz, aber ich bin wieder ein Schritt weiter! Muss dass mal in einer ruhigen Minute schritt für schritt (mit einen einfachen und kurzen) Beispiel durchgehen.


    Dein Teil 1 von heute gefällt mir auch, habe zuerst versucht das dict (sollte nur die Bus ID's enthalten) mit einer "List-comprehension" zu erstellen, ist mir aber nicht gelungen.


    Gruss Dani

  • So, mein Code für heute ist auf Github. Für Teil 2 gibt's sicher auch elegantere Methoden, da bin ich gespannt, wie Ihr das löst.


    Beim 2. Teil von Tag 13 stehe ich kurz vorm Aufgeben. Irgendwie habe ich das Gefühl, eine offensichtliche Möglichkeit zur Vereinfachung zu übersehen. Tips und Hinweise werden gerne angenommen, aber bitte nicht gleich komplett die Lösung spoilern!

  • Manul Tag 13, Teil 2 habe ich hinbekommen in dem ich das erst für die ersten beiden Busse gelöst habe. Ziemlich einfach in dem ich mir überlegt habe in welcher Schrittweite ich durch die Zeit gehen muss, denn man muss ja nicht jede einzelne Minute prüfen und wie ich prüfe ob, wenn der Bus bei Minute x ist, der nächste Bus bei Minute x + Versatz ist. Das ist eine einfache ``while``-Schleife die prüft ob der nächste Bus schon an der richtigen Stelle in der Zeit abfährt und die die Zeit erhöht.


    Wenn man das für die ersten beiden Busse gefunden hat, kann man sich überlegen wie man den nächsten Bus synchron bekommt. Also im Grunde genau so wie bei den ersten beiden, nur dass man die Schrittweite so wählen muss, das die bisher gefundenen synchronisierten Busse gleich bleiben. Das wiederholt sich ja periodisch, und man braucht nur in solchen Schritten zu prüfen ob zu den bisher gefundenen Bussen auch der nächste zu suchende Bus passt. Eine Eigenschaft der Busnummern macht die Berechnung der neuen Schrittweite dann auch noch supersimpel.


    Wenn ich mir das bisschen, sehr einfachen Code anschaue, den ich dafür am Ende habe und der für meine Eingabedaten das Ergebnis in unter 1000 Schritten berechnet, die aus zwei einfachen Rechnungen (Schleifenbedingung und eine Addition in der Schleife) bestehen, dann habe ich aber verhältnismässig viel Zeit gebraucht um auf die handvoll Zeilen zu kommen. 😎

    “The most likely way for the world to be destroyed, most experts agree, is by accident. That's where we come in; we're computer professionals. We cause accidents.” — Nathaniel Borenstein

  • Mein Code für heute braucht für Teil 2 auch schon wieder ~90 Sekunden (bzw. fast 9 Minuten, wenn ich die Ausgabe der einzelnen Züge einschalte). Ich vermute auch hier Optimierungspotential durch Nachdenken.


    Hofei Zu Deiner heutigen Lösung hätte ich eine linguistische Anmerkung: Das Wort "speeched" gibt es m.W. im Englischen nicht, Du suchst "spoken". SCNR

  • Da werd ich dir mal nicht widersprechen und mich für den Tipp bei dir bedanken.


    EDIT:
    Eigentlich hatte der Beitrag etwas mehr Inhalt mit einer Frage zu Tag 12, indem Moment fand ich aber dann meinen Vorzeichenfehler.

  • Puh, irgendwie komme ich den Aufgaben nicht hinterher - dennoch macht es weiterhin Spaß zu tüfteln ;)


    Werde dann gleich endlich mal mit Day 5 anfangen und ggf. krieg ich den 6. auch noch hinterher... mal sehen - dauert dann hier und da ja auch bisschen länger als man denkt :)

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

  • Schön, dass hier viele weiterhin fleissig Rätsel lösen :bravo2:


    Ich habe vor einigen Tagen "aufgegeben", zumindest vorerst - nicht etwa, weil die Aufgaben zu schwer sind, sondern einfach die Lust verloren. Meine freie Zeit in richtige (Open-Source) Projekte zu investieren finde ich persönlich sinnvoller, aber ich bin gespannt, wer bis ganz zum Schluss mitmacht!

  • Ich habe vor einigen Tagen "aufgegeben", zumindest vorerst

    Das ist schade, bei einigen Aufgaben hätte es mich durchaus interessiert, wie Du das löst, beispielsweise Teil 2 von Tag 14. Meine Lösung für heute (Tag 16) hat auch ein paar Stellen, an denen ich das Gefühl habe, man könnte das mit umfangreicheren Pythonkenntnissen eleganter lösen.


    Aber das hier:

    Meine freie Zeit in richtige (Open-Source) Projekte zu investieren finde ich persönlich sinnvoller

    finde ich natürlich auch nachvollziehbar.


    Ich habe diese Woche frei, insofern werde ich wohl erst mal dabei bleiben.

  • Puh, ich muss ja sagen, es geht mir auch mittlerweile bisschen auf die Nerven, dass man durch Form der Inputs eigentlich fast nur IO und String-Operationen macht ... mh ...

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

  • dass man durch Form der Inputs eigentlich fast nur IO und String-Operationen macht

    Habe ich bis jetzt gar nicht so empfunden. Beziehst Du Dich da auf einen bestimmten Tag? Wir könnten ja mal unsere Lösungen im Hinblick auf Einlesen des Inputs vergleichen.


    Generell fände ich es schön, wenn hier etwas mehr Austausch über die Lösungen stattfinden würde. Ich fang einfach mal mit ein paar Fragen zu meinen Lösungen an:


    Heute (Tag 18) habe ich das Gefühl, möglicherweise einen Anwendungsfall für eine globale Variable gefunden zu haben. Damit hätte ich mir

    sparen können. Alternative wäre möglicherweise ein klassenbasierter Ansatz gewesen. Aber dazu hätte ich in Teil 1 besser raten müssen, was in Teil 2 auf mich zukommt. Wie hättet Ihr das gelöst?


    Außerdem musste ich heute an einer Stelle abprüfen, ob ein Objekt ein Match auf eine Regular Expression ist. Der im Netz gefundene Weg erscheint mir etwas hacky. Hat da jemand bessere Vorschläge?


    Zu gestern (Tag 17) hätte ich eine Frage zum

    Ich habe das explizit gelöst, hätte aber natürlich lieber einen generellen Ansatz. Meine einzige Idee ist eine rekursive Funktion, hat jemand andere Vorschläge?

  • Hey Manul,


    zum Austausch: gerne. Vermutlich motiviert das auch noch mal ein wenig mehr, weiterzumachen.


    Mein Problem beim AoC ist aktuell, dass es wirklich nur um diese eine Lösung geht. Dahingehend ist der Lösungsansatz häufig relativ schnell erkennbar, allerdings versuche ich den Fall dann mal für mich zu nutzen und einfach mal bisschen anders an die Problem ranzugehen (ich habe aufgegeben in diesem Rahmen elixir zu lernen und löse erstmal um voranzukommen alles im gewohnten .NET Core Umfeld). Dennoch fühle ich mich im Kontext dieser Aufgaben eher dahingehend zum Prutschen als zum sauberen Programmieren animiert ;-).


    Ich finde es leider etwas befremdlich, wenn eine Story aufgebaut wird, und am Ende aber so kryptische Lösungen gefragt sind, wie "Was ist die Summe aller Zoll-Antworten, die von jedem mit ja beantwortet wurden?".


    Hatte mir an der Stelle etwas mehr Motivation durch die Story erhofft.


    Zu deiner Lösung kann ich noch nichts sagen, habe gestern erstmal keine Lust mehr auf Day 7, Puzzle 2 gehabt. Mal schauen, ob ich diese Aufgabe erstmal überspringe oder mich heute dann noch mal dransetze :)

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

  • Manul Ich hatte die Berechnung der relativen Positionen der Nachbarn so verallgemeinert:

    `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.

    “The most likely way for the world to be destroyed, most experts agree, is by accident. That's where we come in; we're computer professionals. We cause accidents.” — Nathaniel Borenstein