Advent of Code

  • Hat jemand mal Lust auf meine (falsche-) Lösung zu schauen bzw. meinen Input mal bei sich durchzujagen?

    Du darfst dich auch gern an dem Code bedienen Mr. Adrian: https://github.com/Hofei90/Hof…tofCode/blob/main/day3.py

    Aber die Lösung lautet:

    Solution auf Day 3 #1: 244

    Solution auf Day 3 #2: 9406609920


    Wie langsam ist Dein PC?

    Der ausführende PC war nicht mein PC.

    Aber auf meinen PC habe ich es jetzt auch nochmals ausgeführt und den Code etwas modifiziert um die Anzahl der gewünschten Kombinationen und Dauer zu erhalten:


    Code
    Lösung Teil 1, Accumulator: 1489
    Anzahl an Anweisungsvariationen: 280
    Lösung Teil 2, Accumulator: 1539
    Dauer der Ausführung von Teil 1 und 2 Gesamt: 1.050234 Sekunden
    
    Process finished with exit code 0
  • Hallo zusammen


    Die Aufgabe für heute hat mir sehr gut gefallen:)



    Finde den gestrigen und heutigen Tag sehr gut um andere Lösungen anzuschauen und mich dann damit in Python weiterzubilden (anderen - kompakteren Code (mit mehr "build-in" genutzen Funktionen) )zu schreiben.


    Freundliche Grüsse


    Dani


    Gruss Dani

  • Ja die Aufgabe heute lag mir auch besser, nach anfänglichen Verständnisschwierigkeiten.

    Code ist wieder in GH dll-live

    Was mir hier sofort auffällt bei dir sind die Zeilen 86-88, man kann auf Listen min und max Funktionen anwenden.

    Und statt einer while Schleife finde ich ist hier eine For Schleife geeigneter.


    Tag 7 - sry Manul, aber wenn ich die Stelle mit Continue ersetze ändert es auch nichts dem Ergebnis :denker:

  • dll-live Das sieht nicht wirklich nach Python aus. Eher nach BASIC mit der Verwendung von den ganzen Indexwerten und ``while``-Schleifen.


    Du scheinst das auch alles als Bearbeitung einer Textdatei mit Zeilen zu verstehen. Das ist aber etwas was man nach dem ersten Schritt in der Verarbeitung hinter sich lassen würde. Man liest die Eingabedatei in eine Liste mit Zahlen ein. Danach braucht man kein `int()` und irgendwelche Namen die `zeile` beinhalten sind falsch, denn es gibt da keine Zeilen mehr. Das war mal in der Datei. Aber was mal in der Datei war ist nach dem einlesen völlig egal, denn nach dem einlesen hat man nur noch eine Sequenz von Zahlen. Egal wo die mal hergekommen sind.


    `vergleichszahl` ist ein irreführender Name weil das gar keine Zahl aus der Zahlenmenge ist, sondern ein Index. Und es der ändert sich nicht innerhalb eines Schleifendurchlaufs, also wäre es effizienter sich nicht den Index zu merken, sondern tatsächlich die Zahl an diesem Index, also `summen_kontrolle`. Schon hat man eine Variable weniger.


    Also das gilt für den ersten Teil. Im zweiten Teil wird `vergleichszahl` dann tatsächlich für eine Zahl und nicht für einen Index verwendet.


    `summen_kontrolle` ist IMHO auch ein komischer Name. Passender wäre IMHO `gesuchte_summe`.


    Die äussere ``while``-Schleife in Aufgabenteil 1 ist eigentlich eine ``for``-Schleife. Statt die Laufvariable manuell zu verwalten und mit einem Flag für den Abbruch zu arbeiten, würde man ersteres durch das ``for`` erledigen lassen, und letzteres durch ``return`` — weil mehr als eine Schleife verlassen wird, und das Ergebnis an dem Punkt fest steht. Daraus folgt, das man noch einen guten Grund hat den Aufgabenteil in eine eigene Funktion zu verschieben, neben der verwirrenden Wiederverwendung von Namen für andere Dinge im zweiten Aufgabenteil.


    `erste_zeile` und `naechste_zeile` sind nichtssagende Namen für zwei Indexvariablen. Da findet man auch inhaltlich nicht wirklich bessere Namen, aber dann kann man auch `i` und `j` nehmen, und der Leser weiss dann gleich, dass es generische Indexvariablen sind.


    Zwischenstand für die Funktion für den ersten Teil:

    Was Du hier in der inneren ``while``-Schleife gemacht hast sind eigentlich zwei verschachtelte ``for``-Schleifen. Da man aus der inneren beide abbrechen möchte, wenn man das Ergebnis hat, auch hier wieder eine eigene Funktion:

    Man beachte das `BLOCK_LAENGE` nicht einfach ein umbenanntes `BLOCK` ist, sondern tatsächlich die Länge der Präambel, also 25.


    Im zweiten Teil haben `erste_zeile` und `startzeile` immer den gleichen Wert. Man muss da keine zwei Namen für haben.


    Die hässlichen Flags kann man auch loswerden wenn man das ein bisschen umschreibt.


    `summen_liste`: Statt der Schleife kann man da die Unterliste einfach heraus-„slicen“.


    Zwischenstand:

    “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

  • __blackjack__


    Besten Dank dass du dich mit meinem Code befasst hast und mir Tipps für Verbesserungen gibst. :danke_ATDE::danke_ATDE::danke_ATDE:


    Noch eine generelle Frage:

    woher kennt ihr Funktionen wie

    Code
     zahlenreihe[start_index : end_index + 1]

    oder

    Code
    combinations = itertools.combinations(values, 2)

    => Ausschnitt von Hofei Code.


    Freundliche Grüsse

    Dani

  • Ersteres würd ich behaupten gehört zum Grundwissen.

    Full ACK, nennt sich "slicing".


    Zweiteres wohl durch Suchmaschine, Erfahrung und Tipps von anderen Usern

    Oder einfach ziellos in der Python-Doku lesen, da findet man auch nach Jahren noch bislang unbekannte Funktionen oder gar ganze Module ;)


    => "Batteries included"!!! :bravo2:

  • Bei `itertools` habe ich tatsächlich irgendwann einmal die Dokumentation gelesen, weil es sehr generische Funktionen sind, also im Grunde Grundbausteine wie die Syntax für den Programmfluss und Grunddatentypen. In der Dokumentation zum Modul gibt es auch ein paar nützliche Rezepte für weitere Werkzeuge die man sich aus den `itertools` basteln kann. Die gibt es fertig importierbar im externen `more_itertools`-Modul, mit noch ein paar weiteren nützlichen Werkzeugen. Zum Beispiel `more_itertools.split_at()`, was ich schon in zwei Aufgaben hier genutzt habe um Eingabedaten an Leerzeilen aufzuteilen.


    Tag 9 in C64 BASIC:

    Wobei ich wohl ein bisschen Glück mit den Eingabedaten habe, dass bei mir die Werte bis zum Ergebnis von Teil 1 noch mit den Gleitkommazahlen vom C64 BASIC noch exakt repräsentierbar sind. Das sind nicht alle Zahlen in meinen Eingabedaten.


    Tag 7 in Python:

    “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

  • Ich bin jetzt auch fertig mit der Aufgabe :bravo2:




    dll-live ich bin durch den Post #13 von __blackjack__ auf die itertools aufmerksam geworden. Ich schau mir jeden Tag (wenn ich fertig bin) den Code der Anderen an und versuche ihn zu verstehen. Funktionen die ich nicht kenne schreibe ich mir auf und schlage diese nach wenn ich Zeit habe.

    Das bring mich zu einer Frage an die Experten. Ich habe gesehen das Linus manchmal ein Unterstrich hinter der Funktion hat z.B hinter map_ trees = [traverse_map_and_count_trees(map_, x_step=x, y_step=y) for x, y in slopes] von Tag 3. Was macht das oder nach was muss ich Suchen um Informationen zu bekommen?


    Danke und Gruss


    Steinardo

  • Das bring mich zu einer Frage an die Experten. Ich habe gesehen das Linus manchmal ein Unterstrich hinter der Funktion hat z.B hinter map_ trees = [traverse_map_and_count_trees(map_, x_step=x, y_step=y) for x, y in slopes] von Tag 3. Was macht das

    Das geschieht üblicherweise, wenn ein Variablenname sonst ein builtin überschreiben würde (was schlechter Stil ist) oder es sich um ein reserved Keyword handelt. Entweder denkt man sich dann einen besseren Namen aus, oder man hängt einen Unterstrich an ;)


    Siehe:


    nach was muss ich Suchen um Informationen zu bekommen?

    "python variable trailing underscore"

  • Hallo zusammen.


    Besten Dank für eure Antworten:


    Manchmal verweigert meiin HIrn, "Offensichtliche" ZUsammenhänge und somit sehe ich den Wald vor lauter Bäumen nicht mehr.


    Quote

    nennt sich "slicing"


    slicing, kenn ich - habe ich schon mehrmals auf strings angewendet. dachte das sei nur auf strings begrenzt. das ein string eine liste von char ist wusste (weiss) ich auch.

    Gruss

    Dani

  • Was ist es dann?

    Eine Instanz der Klasse str, also ein Objekt (wie alles in Python). Mit Methoden und allem, was dazu gehört.


    class str(object='')

    class str(object=b'', encoding='utf-8', errors='strict')

    Return a string version of object. If object is not provided, returns the empty string. Otherwise, the behavior of str() depends on whether encoding or errors is given, as follows.


    Textual data in Python is handled with str objects, or strings. Strings are immutable sequences of Unicode code points


    Python
    >>> isinstance("foo", str)
    True
    >>> "foo".__class__
    <class 'str'>
    >>> 


    Edit: Einen "char"-Typ wie in C gibt es in Python auch nicht, also noch ein Grund, warum dieser Vergleich wenig sinnvoll ist. Was es gibt, sind Strings mit nur einem Zeichen, aber dann würdest du einen String als "Liste von Strings" definieren, und das geht nicht ;)

  • Du darfst dich auch gern an dem Code bedienen Mr. Adrian: https://github.com/Hofei90/Hof…tofCode/blob/main/day3.py

    Aber die Lösung lautet:

    Solution auf Day 3 #1: 244

    Solution auf Day 3 #2: 9406609920

    [...]

    Vielen lieben Dank schon einmal!


    Ich habe es meinen Tests hinzugefügt und werde mal weiter knobeln.


    Ich muss auch zugeben, dass ich bis gestern dachte, dass ich gar nicht weiter machen kann, wenn ich die alten Aufgaben noch nicht gelöst habe. Dennoch ergibt es natürlich viel mehr Sinn, die Aufgaben der Reihe nach zu erledigen.

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

  • Tag 7 - sry Manul, aber wenn ich die Stelle mit Continue ersetze ändert es auch nichts dem Ergebnis

    Merkwürdig. Wenn ich genau das tue, liefert Dein Code für meinen Input das korrekte Ergebnis. Für Deinen Input, den ich so frei war, mir von Github zu laden, liefert er das selbe Ergebnis wie mein Code, nämlich 289. Wenn die Website das als falsch deklariert, solltest Du vielleicht sicherheitshalber noch mal überprüfen, ob nicht beim Runterladen der Eingabedatei was schiefgegangen ist.

  • Hallo zusammen


    Heute hatte ich etwas Zeit und dank den Mitglieder hier im Forum, (vor allem __blackjack__  Hofei  Linus  Manul  hyle Steinardo u.v.m ) mein Code etwas verbessert. Dafür allen (auch denen die ich ich nicht explizit aufgezählt habe :danke_ATDE::danke_ATDE::danke_ATDE::danke_ATDE::danke_ATDE:.


    Leider habe ich programmiertechnisch nur den ersten Teil geschafft (der war ganz easy, doch beim zweiten bin ich hängen geblieben - in Prosa weiss ich was zu tun ist, nur der mathematische weg dazu fehlt mir...)


    Evtl mag mir ja da noch jemand einen Schubs geben.... (Soweit ich es verstanden habe, muss ich 2 oder 3 aufeinander folgende 1-Schritte suchen und die dann ersetzen, und das in allen möglichen Kombinationen.)



    Freundliche Grüsse

    Dani