Advent of Code

  • Heute hatte zum Glück ein anderer Zollbeamter dienst, der ließ mich nun auch endlich mit folgendem Code durch den Zoll:

    Überleg Dir wie die Gruppenanwort für jede Gruppe initialisiert werden muss. Es ist *nicht* die leere Menge!

    Das brachte mich dann letztens auf einen anderen / richtigen Gedanken.

    Die restlichen Verbesserungsvorschläge werde ich versuchen für die Zukunft zu beherzigen, danke dafür. In der aktuellen Lösung sind sie aber noch nicht eingearbeitet. Vll hol ich das bei Zeiten einmal nach :thumbup:

  • Der Tag geht, wie auch meine Nerven dem Ende zu.

    Vielleicht reicht ja auch wieder ein Schups in die richtige Richtung, wobei ich mir das bei der heutigen Aufgabe nicht denken kann.

    Bin jedenfalls kläglich gescheitert.

    Habe bis jetzt überhaupt gebraucht mal ein Ergebnis zu bekommen, aber das ist mit 190 zu hoch.

    Hier mein Versuch (und ja einmal habe ich mal wieder continuebenötigt)

    Manul Code sieht schön schlank aus, aber da ich von selbst schonmal kein Regex behersche, probierte ich einen anderen Weg. Einen falschen Weg.

    Wie gings dem Rest mit der heutigen Aufgabe?

  • aber da ich von selbst schonmal kein Regex behersche, probierte ich einen anderen Weg. Einen falschen Weg.

    Abgesehen davon, daß die heutige Aufgabe ein guter Anlaß wäre, sich (noch) mal mit regulären Ausdrücken zu beschäftigen (ich musste auch noch mal nachlesen, sowohl über deren Syntax als auch vor allem über ihre Verwendung in Python), scheint mir Dein Ansatz keineswegs falsch zu sein: Zumindest erzeugt er aus meinen Inputdaten die selben Regeln wie mein Code.

    Wo's dann schiefgeht, ist offenbar bei der Suche nach der Antwort. Hier finde ich Deine Funktion wieder unübersichtlich und – zumindest ohne Kommentare – schwer nachzuvollziehen. Was ich beobachtet habe: Wenn ich Deinen Code mehrmals aufrufe, bringt er unterschiedliche Ergebnisse. Die sind mit meinem Input manchmal richtig und manchmal zu niedrig. Die einzige Erklärung, die ich um die Uhrzeit spontan dafür habe, ist, daß beim Iterieren über ein Dictionary die Reihenfolge nicht definiert ist. Vielleicht hilft das ja ein bißchen weiter.

    P.S. Nach nochmaligem Drüberschauen: Du brauchst in Deinem Code tatsächlich ein continue, aber nicht da, wo Du es eingebaut hast (da ist es überflüssig), sondern in einer anderen Funktion. Außerdem scheinst Du

    Zitat

    If you wanted to carry it in at least one other bag

    in der Aufgabenstellung überlesen zu haben. Mit 2 kleinen Änderungen liefert Dein Code bei mir konsistent das richtige Ergebnis.

    Einmal editiert, zuletzt von Manul (7. Dezember 2020 um 23:32)

  • Seit Python 3.6 inoffiziell und danach offiziell sind Dicts geordnet. Und deterministisch waren sie schon immer. Darum würde mich das als Ursache verwundern.

  • aber da ich von selbst schonmal kein Regex behersche, probierte ich einen anderen Weg. Einen falschen Weg.

    Viel Regex braucht man heute aber eh nicht - ich bin z.B. mit r"(\d+) (\w+ \w+) bags?" ausgekommen (klar, geht auch ganz ohne). Bei Interesse weisst du ja, wo du meine ganze Lösung findest - verlinken werde ich hier nichts mehr... :baeh2:

  • Hallo zusammen

    Bei der heutigen Aufgabe bin ich bis jetzt auch gescheitert.

    Morgen nochmal probieren und dann ggf. Tipps und Hilfe holen.

    Habe bis jetzt nicht mal Code, welcher gezeigt werden könnte, läuft nicht rund....

    Freundliche Grüsse

    Daniel

  • Ich komme für Tag 7 ohne reguläre Ausdrücke aus. Das liess sich alles mit `strip()`, `split()`, und `rsplit()` erledigen. Der Trenner dafür kann ja auch mal ein fester Satzteil sein. ?

    BASIC-Lösung gibt's keine. Ich hatte nicht die Zeit, aber ich denke ich werde das mal in C für den C64 ausprobieren. Problematisch dürfte die Datenmenge werden. Wenn man Arbeitsspeicher der vom System verwendet wird, den Speicher für den Text der angezeigt wird, und die Speicherbereiche in denen I/O-Register und ROM liegen abzieht, bleiben für Programm und Daten ca. 50 KiB. Die Eingabedaten sind aber schon etwas über 42 KiB. 8 KiB für Programm, den Graphen, und Stack sind zu knapp, und ich glaube nicht, dass es viel hilft, dass man aus den Eingabedaten ein bisschen was von dem ”Füllstoff” rauswerfen kann.

    Tag 5 in Python "regulär":

    Spoiler anzeigen

    Und Tag 5 in Python in 127 Zeichen (Gemeinschaftsprodukt aus'm Python-Forum):

    Python
    S=set(int(s.translate({70:48,66:49,76:48,82:49}),2)for s in open("input.txt"));m=max(S);print(m,(set(range(min(S),m))-S).pop())

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

    Einmal editiert, zuletzt von __blackjack__ (8. Dezember 2020 um 01:44)

  • Die Eingabedaten sind aber schon etwas über 42 KiB. 8 KiB für Programm, den Graphen, und Stack sind zu knapp, und ich glaube nicht, dass es viel hilft, dass man aus den Eingabedaten ein bisschen was von dem ”Füllstoff” rauswerfen kann.

    Bist Du sicher, dass Du das nicht unterschätzt? Wenn ich meine Eingabedaten in dieses Format bringe

    Code
    vibrant aqua1shiny magenta2muted teal1dim magenta1muted chartreuse
    vibrant violet4pale maroon
    dark indigo1light maroon3pale red1drab brown4dim magenta
    dark coral5dull aqua5plaid green2posh bronze
    dim lavender2muted violet5wavy gold3vibrant plum5bright teal
    mirrored turquoise5muted olive5bright gold2vibrant violet
    faded brown5faded tomato
    muted orange5dull aqua2light salmon1striped black1pale gray
    posh black4faded silver
    muted coral3mirrored turquoise

    bleiben von > 43 KiB noch < 25 KiB übrig. Und da habe ich sogar die Leerzeichen in den Farbnamen behalten. Wenn das immer noch zuviel ist, könnte man natürlich auch die Farben indizieren oder abkürzen.

    Ich denke, das müsste sogar in BASIC machbar sein. Mit C auf dem C64 habe ich keinerlei Erfahrung, aber ich würde vermuten, daß man damit eher weniger Speicher braucht (und mehr zur Verfügung hat).

  • Hallo zusammen

    Teil 1 der heutigen Aufgabe habe ich gelöst. :)

    Bei Teil 2 stecke ich in einem moralischen Dilemma - bis jetzt habe ich nur einen "try and error" Ansatz. Das möchte ich aber nicht programmieren? Was für andere Ansätze kennt ihr?:helpnew:

    lauffähiger Code aoc2020-day 8 Teil 1

    Verbessereungstipps zu meinem Code, nehme ich gerne an.

    Freundliche Grüsse

    Dani

  • Manul Nee, sicher bin ich nicht. Habe es noch nicht ausprobiert. ?

    C vs. BASIC auf dem C64: Der Code wird grösser, Daten (bei Zahlen) kleiner, und man hat mehr Arbeitsspeicher für Programm und Daten. 50 KiB vs. 38 KiB, weil bei C-Programmen das BASIC-ROM ausgeschaltet werden kann und man 4 KiB RAM nutzen kann die vom BASIC nicht verwendet werden. Letzteres könnte man von BASIC natürlich verwenden, aber nicht ”normal” für BASIC-Variablen.

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

  • dll-live Ich habe auch „trial & error“ und denke auch alles andere wäre massiv aufwändiger. Hatte auch erst so ein flaues Gefühl dabei, bis mir klar geworden ist, dass es keine bedingten Verzweigungen gibt, so eine Endlosschleife also nach maximal n Schritten erkannt ist, mit n=Anzahl der Anweisungen.

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

  • Außerdem scheinst Du

    ...

    in der Aufgabenstellung überlesen zu haben

    überlesen oder nicht verstanden - beides möglich. Englisch ist nicht meine Stärke.

    Wenn ich das richtig verstehe, dürfte dann dieses Teil den Counter nicht mehr erhöhen:

    Code
        for relevanter_bag in bags:
            if bags[relevanter_bag] is None:
                if search_bag == relevanter_bag:
                    counter += 1
                continue
            else:
                print(bags[relevanter_bag].keys())
                if search_bag == relevanter_bag:
                    counter += 1

    Dann wird das Ergebnis nur um 1 tiefer mit 189 was immer noch falsch ist.

    Da mir die Ideen ausgehen und die Lust verschwunden ist, kapitulier ich vor Tag 7.

    Vielen Dank, dass du dir so viel Zeit nimmst und den Code getestet hast.

  • Also ich habe Tag 7 nochmals kommentiert, eine Lösung, den Fehler in meinem Code habe ich bisher nicht finden können.

    Wäre schön, wenn mir jemand meinen Denkfehler im Code zeigen könnte. Laut Manul bin ich ja knapp dran, aber den Fehler finde ich leider nicht ohne fremde Hilfe


    Zum heutigen Tag 8,

    ja machte ich auch über Try and Error. Einfach jede Kombination erstellt und geprüft ob es erfolgreich durchläuft. Da musste man sogar am PC kurz auf das Ergebnis warten.

  • Tag 8 in C64 BASIC:

    Spoiler anzeigen

    Tag 6 in Python:

    Spoiler anzeigen

    Hofei Wie langsam ist Dein PC? Und welche ”Kombinationen” meinst Du? Ich denke Du machst da zu viel. Wahrscheinlich sogar viel zu viel. Wie viele ”Kombinationen” hat denn das Beispiel aus der Aufgabe bei Deiner Lösung?

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

  • So, da mangels Zeit die Lösungsfindung in einer komplett anders strukturierten Sprache doch etwas länger dauert, habe ich mich entschlossen erstmal bisschen aufs Gas zu drücken und die Lösungen in meinem Täglich-Brot-C# zu implementieren:

    => https://github.com/renao/Advent_of_Code_NET

    Um dem Monk in mir gerecht zu werden, habe ich erstmal natürlich die bereits gelösten Aufgaben nachgebaut und stecke gerade an Tag 3 Teil 2 fest.

    Ehrlicherweise bin ich mir gerade unsicher, ob mein Weg durch die "Slopes" an einer Stelle einen Gedankenfehler hat oder ob ich irgendwo einen Overflow nicht mitbekomme beim Multiplizieren der Antworten.

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

    Dann hätte ich eine richtige Assertion für den Test und könnte mich zumindest daran orientieren :)

    Natürlich ist das Knobeln hier auch Teil der Sache, aber es macht auch mehr Spaß, wenn ich auch mal fix wieder an die aktuellen Aufgaben komme ;)

    P.S.: Meine falsche Lösung ist: 8034812640

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

Jetzt mitmachen!

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