Advent of Code

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Und auch Tag 3 ging mit dem C64. Im Grunde sogar in BASIC, wenn denn die Gleitkommazahlen dort es geschafft hätten das Ergebnis von Teil 2 verlustfrei zu repräsentieren. Aber 3.5174013e+09 wollte die Webseite nicht als Antwort durchgehen lassen. Habe es dann noch mal in C programmiert und 3517401300 herausbekommen, was die Webseite als korrekt befunden hat. Also war der Wert von BASIC eigentlich auch richtig, aber das konnte man ja nicht ahnen, das die beiden letzten Ziffern 0en sind. Wobei ich natürlich hätte ”schummeln” können, und die Multiplikanden die das BASIC-Programm ausgegeben hat, einfach mit einem Taschenrechner ausmultiplizieren können.

    BASIC-Lösung:

    Spoiler anzeigen

    Tigerbeere Keine der bisherigen Dateien ist IMHO sinnvoll mit dem `csv`-Modul zu lesen. So wirklich gut verständlich wird Code nicht wenn man falsche Werkzeuge verwendet.

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

  • Was ich an deinem Ansatz mit dem C64 so gerne mag, __blackjack__, ist die Tatsache, dass du etwas kreativer sein muss in der Lösungsfindung, weil du eben nicht eine riesengroße Standard-Lib hast oder gar schnelle Prozessoren.

    Ich sitze gerade an Aufgabe zwei und optimiere gerade (soweit ich das in der neuen Sprache überhaupt schon kann) mein Parsing der Eingaben - natürlich könnte ich durch die relativ mächtige Sprache auch einfach für jeden benötigten Teil ein Regex einsetzen - oder aber ich versuche alle Informationen direkt in einer Iteration abzufrühstücken.

    Aktuell sind's bei mir diverse String-Operationen, weswegen ich noch nicht ganz dort gelandet bin, wo ich ggf. hin möchte. Mal sehen :)

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

  • Dafür verzweifel ich an der heutigen Aufgabe.

    :denker:

    hab auch langsam keine Ideen mehr wo mein Fehler liegt.

    So durch Zufall, hab ich den Fehler gefunden, kann ihn mir aber nicht erklären.

    Vielleicht einer von euch? Bei meiner Input Datei musste ich am Ende eine zusätzliche leere Zeile einfügen, sodass sie so endet:

    Code
    cid:271 pid:#4b8380 hcl:80fab0
    byr:2024 ecl:#20e25f
    iyr:1945
    eyr:1935 hgt:159cm
    ACHTUNG funktionierende Lösung
  • Hofei Mein Verdacht wäre, dass Python nur bis zu bestimmten Trennzeichen in readlines() agiert - und wenn ein New-Line (welches auch immer) dann in der letzten Zeile fehlt, dass diese nicht gelesen wird.

    Fänd' ich eigenartig, aber es gibt diverse Parser/Linter die genau so ein New Line Character am Dateiende voraussetzen (deswegen gibt es diese Option bspw. auch in vielen Code Editoren, dass automatisiert ein solches Zeichen ergänzt wird, falls es am Dateiende fehlt).

    Das Internet scheint den Verdacht zu bestätigen, aber ist natürlich auch nur eine Annahme:

    Zitat

    file.readlines() will only ever split on \n, \r or \r\n depending on the OS and if universal newline support is enabled.

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

  • Vielleicht einer von euch? Bei meiner Input Datei musste ich am Ende eine zusätzliche leere Zeile einfügen, sodass sie so endet:

    Ist eigentlich klar: Warum sollte Dein Programm denn sonst für den letzten Pass noch die Zeile 44 erreichen?

    Der 2. Teil heute war ja eher Fleißarbeit, ich hoffe, das entwickelt sich nicht weiter in die Richtung. Den Spaßfaktor fand ich da jedenfalls recht begrenzt.

  • Der 2. Teil heute war ja eher Fleißarbeit, ich hoffe, das entwickelt sich nicht weiter in die Richtung. Den Spaßfaktor fand ich da jedenfalls recht begrenzt.

    Ja, das war heute recht aufwendig und viel Tipparbeit, vorallem weil ich kein Regex kann.

    Ist eigentlich klar: Warum sollte Dein Programm denn sonst für den letzten Pass noch die Zeile 44 erreichen?

    Aber mit einer leeren Zeile endete die Datei, aber erst nach einer 2. leeren Zeile funktioniert es. Das versteh ich eben nicht.

  • Nur eine kurze Anmerkung, weil Renao das erwaehnt hat: ja, es gibt Fehlverhalten bei fehlenden Zeilenende-Zeichen am Dateiende. ZB beim C-Praeprozessor. Der pappt einfach mehrere Includes direkt hintereinanender, und damit wird die letzte Zeile ohne Zeilenende-Zeichen der Anfang der ersten Zeile des includes danach. Tolle Fehlermeldungen sind garantiert.

    Bei readlines() ist das aber NICHT das Problem. Das arbeitet auch in dem Fall korrekt. Es muesst streng genommen readlines_and_last_chunk() heissen.

  • Aber mit einer leeren Zeile endete die Datei, aber erst nach einer 2. leeren Zeile funktioniert es. Das versteh ich eben nicht.

    Ich würde mal anstatt readlines(), readline() in einer Schleife benutzen und mit Print die einzelnen Zeilen ausgeben lassen. Vielleicht mit Zeilennummer und verschiedenen Testdateien, welche unterschiedlich enden (kein, ein, zwei, ... Zeilen). Damit sollte man das Verhalten sehen können. Möglicherweise arbeiten die beiden Funktionen unterschiedlich.

  • Hofei Der Fehler liegt in Deinem Programm. Immer wenn Du in generate_passport_data() eine Leerzeile triffst, geht Dein Programm davon aus das der Reisepass komplett ist und Du fügst ihn zu passport_data hinzu. Und das ist auch schon die ganze Erklärung warum Du den letzten Reisepass verpasst, weil die Leerzeile ja nicht die Reisepässe abschliesst, sondern nur trennt, und nach dem letzten Reisepass keine Leerzeile in den Daten ist. Du musst nach der Schleife also noch schauen ob Du einen Reisepass hast der noch nicht hinzugefügt wurde. Oder eben künstlich eine Leerzeile anfügen.

    Wobei man das ja nicht in der Datei machen muss, man kann das ja auch im Programm machen. Wenn man wie Du erst alles in den Speicher in eine Liste liest, einfach nach dem Einlesen mit inhalt.append("") beispielsweise, oder falls man die Datei direkt als Iterator verwendet mit itertools.chain().

    analyze_passwort_data() hat IMHO eine komische API weil es ein Wörterbuch übergeben bekommt, dieses verändert, und es dann auch wieder zurück gibt. Das finde ich verwirrend, weil der Aufrufer hat das ja bereits, sieht also die Veränderungen sowieso schon.

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

  • Kleiner Nachtrag zu diesen ?-Typ-Annotationen : Die ersten drei sind falsch. Oder der Code ist es. Wenn man Typannotationen verwendet, dann sollte man die auch richtig machen. Letztlich sind es ja nur Kommentare, aber im Gegensatz zu Kommentaren erwartet der Leser, dass die *wirklich* stimmen, insbesondere wenn der Leser von anderen Programmiersprachen gewohnt ist, das die Angaben da Deklarationen sind und irgendwo hart durchgesetzt werden. Python ignoriert die aber komplett. Sind eben nur ”bessere” Kommentare.

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

  • Hallo zusammen.

    Habe diesen Thread von Anfang an mitgelesen und finde es eine coole Idee.:bravo2:Bis jetzt die Aufgaben in "prosa" gelöst.

    Heute habe ich mich endlich durch gerungen und Tag 1 "real - also mit Programmieren" gelöst. Habe auch beide Teile geschafft :saint:. Setze mich gleich noch an Tag 2.

    Schade find ich, dass keine "Muster"Lösungen veröffentlicht werden.

    So kann ich schauen, was andere programmiert haben und so weiter lernen (Meine Programmiersprache ist Python.

    Über Umwege ist dieser Wunsch, in Erfüllung gegangen und Dank Linus kann ich jetzt eine weitere Lösung in Python anschauen.


    Freundliche Grüsse

    Dani

  • Auch Tag 4 geht in BASIC auf'm C64 noch:

    Spoiler anzeigen

    Tag 2 in Python:

    Spoiler anzeigen

    dll-live Wobei die Lösung von Linus keine Musterlösung ist. Die is_valid_password() würde nicht mal ansatzweise durch einen Code-Review kommen. Das ist eher ”cleverer” Missbrauch von Sprachmitteln um das möglichst unleserlich zu machen.

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

  • nicht mal ansatzweise durch einen Code-Review kommen

    Ist ja auch nicht Sinn der Sache ;) - manche lernen mit dem AoC neue Sprachen, manche spielen Code-Golf, ich will's einfach nur halbwegs kompakt gelöst bekommen und dabei ein paar Sprach-Features verwenden, die ich sonst eher seltener sehe (&=, :=, Set-Operatoren, ...). Dafür brauche ich weder Kommentare noch Unit-Tests noch ausführliches Error-Handling :)

    Eine "Musterlösung" kann es aufgrund der Zielgebung "finde die Lösung/Antwort" IMO gar nicht geben - "saubere" Lösung, von mir aus.

  • einfach nach dem Einlesen mit inhalt.append("") beispielsweise

    Danke, das werd ich hinzufügen

    Wenn man Typannotationen verwendet, dann sollte man die auch richtig machen.

    Muss gestehen, ich bin bis heute davon ausgegangen, dass ich bei @dataclasses den Typ mit definieren muss.

    Das finde ich verwirrend, weil der Aufrufer hat das ja bereits, sieht also die Veränderungen sowieso schon.

    Du spielst hier sicherlich auf mutable - immutable an. Es das denn wirklich "so falsch"? Denn zum einen dachte ich immer dass explizit besser ist als implizit, dann ist es auch für mich persönlich ersichtlicher wie und wo die Daten weiterverwendet werden und das 3. ist, was ist wenn man die Rückgabe mal an einer anderen Stellen werden möchte.

    Besten Dank

    Gerne doch - aber nicht spicken :lol:

    Finde es eine gute Gelegenheit zu sehen, wie andere an das gleiche Problem ran gehen und ihre Lösungen aussehen.

  • Hm, heute war ja irgendwie enttäuschend einfach. Das CPGrey-Video hat die Stimmung dann wieder gehoben.

    Tag 5 in BASIC auf dem C64:

    Spoiler anzeigen

    Tag 3 in Python:

    Spoiler anzeigen

    Hofei Wenn eine Funktion etwas veränderbares bekommt und das verändert, dann ist es IMHO sehr unerwartet, dass sie das auch wieder zurück gibt, weil das keinen Sinn macht. Insbesondere würde ich dann nicht erwarten, dass sie etwas verändert, eben weil dann der Rückgabewert keinen Sinn macht.

    Das Argument mit an anderer Stelle verstehe ich nicht? Der Aufrufer hat den Wert doch, der kann den auch noch woanders verwenden ohne das er von der Funktion wieder zurückgegeben wird‽

    Wie gesagt, ich finde das sehr überraschend. Funktionen sollten eigentlich möglichst ohne Seiteneffekte laufen und falls es doch welche gibt, sollte das am Namen oder der Dokumentation klar gemacht werden und es sollte nicht so aussehen als wäre das eine normale Funktion. Normal jetzt im Sinne von keine Seiteneffekte. Dokumentation ist natürlich bei diesen Miniprojekten nicht zwingend notwendig, aber überraschende APIs würde ich auch hier nicht verwenden.

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

Jetzt mitmachen!

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