Advent of Code

  • Heute war's eigentlich recht leicht. Ich musste mich aber überwinden anzufangen — Meh, Rekursion, meh ”1000” Sonderfälle beachten. Aber wie gesagt, war dann doch einfach.

    framp Die übrig gebliebene Zeit habe ich dann genutzt Tag 11 noch mal in FreeBASIC mit OOP zu schreiben:

    Display Spoiler

    „All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman

  • Interessant, Vielen Dank __blackjack__ dass Du mir zeigst dass sich bei Basic doch eine Menge getan hat. Dass OO dort mittlerweile moeglich ist haette ich nicht gedacht :no_sad: Deinen Code kann ich sogar schon lesen :lol: Kein goto und sogar ein this :)

    Ist jetzt OT - aber wie sieht es mit Scoping und Inheritance aus? Geht vielleicht sogar multiple Inheritance?

    :no_sad: ... Kein Backup - kein Mitleid ... :no_sad:
    Ich nutze raspiBackup um meine Raspberries
    regelmäßig und zuverlässig
    einmal pro Woche zu sichern

  • Heute ist ja mal wieder so ein Tag… Teil 1 heute morgen recht geradlinig umgesetzt. Und nun am überlegen ob ich für Teil 2 das ganze erst einmal umschreibe um eine geeignetere Repräsentation für die „smudge correcting“-Funktionalität zu haben, oder ob ich das auch einfach auf den eingelesenen Zeilenblöcken mit den "." und "#" Zeichen mit etwas mehr Code löse…

    framp Ich weiss jetzt nicht genau was hier mit Scoping gemeint ist‽ Funktionen, Prozeduren und damit natürlich auch Methoden und Properties haben ihren eigenen Sichtbarkeitsbereich für Variablen.

    Typen und Konstanten sind auch innerhalb von Funktionen, Prozeduren, … im gleichen Namensraum sichtbar, Variablen die ausserhalb von Funktionen & Co definiert wurden *nicht*, solange sie nicht als SHARED deklariert wurden.

    Es gibt Namensräume (Namespace <name> … End Namespace), deren Inhalt man entweder über den Namen und einen Punkt ansprechen kann, also bei einem ``Namespace Cartesic`` zum Beispiel ``Cartesic.TPoint(42, 23)`` oder man kann den Inhalt des Namensraums mit ``Using Cartesic`` im aktuellen Namensraum bekannt machen und danach einfach ``TPoint(42, 23)`` schreiben. Namensräume sind verschachtelbar.

    Man kann mit ``With`` die Namen von Attributen von Objekten sichtbar machen, allerdings braucht man einen zusätzlichen Punkt davor. Da hat man aus den ”Fehlern” von Pascal gelernt. Siehe Zeile 64 im Programm in #301.

    In folgendem Code sind `i` und `j` nur innerhalb der Schleife definiert:

    Visual Basic
    For i As Integer = 1 To 5
      Dim j As Integer = 42
      Print i, j
    Next

    Wenn man einfach mal so irgendwo einen Sichtbarkeitsbereich braucht, gibt es ``Scope … End Scope``. Das ist vergleichbar mit ``{ … }`` innerhalb einer Funktion in C und verwandten Sprachen.

    Es gibt nur Einfachvererbung. Das Schlüsselwort INTERFACE ist reserviert, aber es gibt noch keine Interfaces. Um virtuelle und abstrakte Methoden zu haben, muss die Verberbungshierarchie mit OBJECT beginnen, weil das die nötige Mechanik für die Tabelle mit den virtuellen Methoden mitbringt.

    Also wie gesagt, das ist FreeBASIC. VisualBasic.NET kann im Grunde alles was C# kann, nur mit BASIC inspirierter Syntax die vom klassischen VisualBasic kommt, was ja der Nachfolger von QBasic/QuickBasic ist. (Das erste VisualBasic war noch für DOS! 🤓)

    In VB.NET muss man ja das gleiche wie in C#ausdrücken können, denn am Ende läuft das in der .NET-Umgebung und man kann dort ja normalerweise Assemblies von anderen Sprachen verwenden. Also in VB.NET Sachen die in C# geschrieben sind, und in C# Sachen die in VB.NET geschrieben sind.

    „All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman

  • Ich weiss jetzt nicht genau was hier mit Scoping gemeint ist‽

    Du hast alle Ecken wo Scoping direkt oder indirekt vorkommt doch perfekt erklaert :danke_ATDE:

    Ist echt erstaunlich wie sich BASIC entwickelt hat. Dass multiple Inheritance fehlt ist nicht so dramatisch. Dadurch handelt man sich diverse andere Probleme ein. Interessant dass abstrakte und virtuelle Methoden existieren. Die gehoeren aber natuerlich konsequenterweise zu OO. Meinst Du dass Interfaces zukuenftig noch kommen? Wenn das Keyword schon reserviert ist ist das ja naheliegend.

    :no_sad: ... Kein Backup - kein Mitleid ... :no_sad:
    Ich nutze raspiBackup um meine Raspberries
    regelmäßig und zuverlässig
    einmal pro Woche zu sichern

  • Macht jemad mit?

    Lösung Tag 1

    🎧 Wir hatten damals keine Handys, wir hatten nur das Komasaufen.
    Wir hatten keine Ballerspiele, wir sind noch echt Amok gelaufen. 🎧

  • Ja, ich bin dabei. Der Altair Emulator ist immer noch am Bubblesort der zweiten Liste für den ersten Aufgabenteil. Mal sehen ob das heute noch fertig wird.

    Dass das Ergebnis richtig sein wird, weiss ich weil der DOS-PC mit QBasic das selbe Programm in ca. 2 Minuten abgearbeitet hatte. 8080 mit 2 Mhz vs. 486 mit 33 Mhz. 🤣

    „All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman

  • simonz Für Teil 2 von heute (Tag 5) selbst was geschrieben, oder ein Modul mit dem fertigen Algorithmus verwendet?

    Der letzte Fehler den ich beseitigen musste, war dass der Hinweis ernst gemeint war, die Regeln die nicht vorhandene Seiten in der Aktualisierung betreffen zu ignorieren. In meinen Eingabedaten sind nämlich Regeln die sich widersprechen. Die Regeln 21|77, 22|21, und 77|22 sind nicht gleichzeitig erfüllbar. Die kommen aber zusammen auch in keiner meiner Aktualisierung vor. 🙂

    „All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman

  • simonz Für Teil 2 von heute (Tag 5) selbst was geschrieben, oder ein Modul mit dem fertigen Algorithmus verwendet?

    Ich schreibe diese Programme immer selbst. Oder ich breche das Rätsel ab. Weil: Mir geht es um's Lösen und Lernen.

    Display Spoiler



    Was meinst Du mit "mit dem fertigen Algorithmus"?

    Edited 2 times, last by simonz: Bugfix (test --> is_test) (December 5, 2024 at 2:48 PM).

  • Mit fertigen Algorithmus meine ich den Algorithmus den man üblicherweise verwendet wenn man Dinge, die Abhängigkeiten haben, so sortiert, das die Abhängigkeiten alle vorher vorkommen. Link zu Wikipedia:

    Display Spoiler

    Mir geht's auch um's Lösen und Lernen bzw. Üben. Wenn ich erkenne, dass man da eine Standardlösung anwenden kann, und weiss in welchem Modul es die gibt, dann erfinde ich das Rad nicht noch mal neu. Bei der mul(…,…)-Aufgabe hast Du doch wahrscheinlich auch das re-Modul verwendet und das nicht selbst noch mal neu implementiert‽ Das wäre ja auch so etwas wo man den regulären Ausdruck nehmen könnte, da einen Zustandsautomaten draus aufzeichnen könnte, um den dann selber in Code umzusetzen.

    Den Sortieralgorithmus hatte ich auch im Studium schon mal implementieren müssen. Nach der Beschreibung in „Introduction to Algorithms“ (der „Cormen“). Das sind nur drei relativ simple Schritte, die voraussetzen, dass man eine Tiefensuche über den Graphen schreiben kann. Was ja letztlich auch kein Hexenwerk ist.

    Bei Deinen rules (ich weigere mich ein my davor zu schreiben 😜) wäre collections.defaultdict() sinnvoll. Und statt append() und danach sort() könnte man bisect.insort() verwenden, was ein neues Element in eine sortiere Liste an der passenden Stelle einfügt. Oder man hängt erst einmal alles an und macht dann noch eine Schleife über die ganzen Listen und sortiert die jeweils einmal. Wobei die Listen später mit in-Tests verwendet werden, also eigentlich besser set()s wären.

    mysort() sortiert nichts, das wäre vom Namen her besser compare_pages() oder etwas in der Richtung.

    Das is_test-Flag sieht an vielen Stellen aus, als würde da logging mit einem Loglevel nachgebaut.

    Mir gefällt die Strukturierung der Regeln nicht so ganz. Fester Satz an Schlüsseln die Zeichenketten sind, deutet in der Regel auf eine Klasse hin. Und ich hätte da auch eher Regeln = Seitennummer → (before=Seitennummern, after=Seitennummern) statt Regeln = (before=Seitennumer → Seitennummern, after=Seitennummer → Seitennummern) gemacht. Denn die beiden Wörterbücher haben ja die selben Schlüssel, sind also ”parallele” Datenstrukturen.

    „All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman

  • __blackjack__ Ich habe nun die meisten Deiner Vorschläge umgesetzt:

    • Namenswahl verbessert
    • bisect.insort() verwendet
    • Aufbau und Handling der rules (nicht mehr myrules ;))

    Das mit collections.defaultdict hatte ich für meine alte rules-Struktur hinbekommen, siehe Kommentare im Quelltext.
    Für die neue, von Dir empfohlene, Struktur (ja, gefällt mir auch besser), klappte das nicht. Da habe ich try/except verwendet.

    Geht das Füllen des rules Dictionaries (Zeilen 114-138) nicht auch eleganter? Auch irgendwie mit defaultdict oder so?


    Display Spoiler
  • Geht das Füllen des rules Dictionaries (Zeilen 114-138) nicht auch eleganter? Auch irgendwie mit defaultdict oder so?

    Ich habe es selber herausbekommen. Zumindest irgendetwas. :)

    Aus:

    ist nun dies geworden (und mit set statt dict ) :

    Faszinierend, das mit den defaultdicts...

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!