Advent of Code

  • Weil es hier kein allgemeines Unterforum im Bereich „Programmierung“ gibt, schreibe ich das mal ins „Offtopic“:


    Auch eine Pandemie konnte Eric Wastl und seine Helfer (Elfen?) nicht davon abhalten auch dieses Jahr einen Advent of Code vorzubereiten. Ein ”Adventskalender” mit kleinen Aufgaben die man mit einer Programmiersprache seiner Wahl lösen kann. Eingebettet sind die Aufgaben jedes Jahr in eine schräge Geschichte wie man dem Weihnachtsmann dabei hilft seinen Job zu erledigen.


    Gefragt ist nicht das Programm, sondern die jeweilige Lösung zu gegebenem Aufgabentext und Eingabedaten. Die Daten sind in der Regel für jeden Teilnehmer individuell, so dass man die Lösung nicht einfach von jemand anderem ”abschreiben” kann, sondern tatsächlich den Lösungsweg braucht.


    Die aktuelle Aufgabe wird jeden Tag vom 1. bis zum 25. Dezember um 6 Uhr mitteleuropäischer Zeit veröffentlicht und besteht aus zwei Teilen. Der zweite Teil wird freigeschaltet nachdem man den ersten Teil gelöst hat, und bezieht sich auf den ersten Teil. Das heisst die Aufgabe vom ersten Teil wird erweitert oder etwas geändert.


    Die ersten vier Jahre waren die Aufgaben der Tage unabhängig voneinander. Letztes Jahr war so ungefähr jeden zweiten Tag eine Aufgabe, die sich auf einen vorherigen Tag bezog: Es musste ein Emulator für einen virtuellen Prozessor um Befehle erweitert werden oder man musste den emulierten Prozessor zur Lösung einer Aufgabe verwenden. Man kann sich auch die Aufgaben der vergangenen Jahre auf der Webseite anschauen und das alles auch noch lösen wenn man möchte.


    Warum das hier vielleicht nicht ganz Offtopic ist: Solche Challenges eignen sich für Leute die Programmieren lernen wollen, die Grundlagen durchgearbeitet haben, aber nun keine Idee haben was sie programmieren könnten um zu das Erlernte zu üben/anzuwenden.


    Und eventuell wäre beispielsweise ein Raspi-Zero schon eine Plattform die eine zusätzliche Hürde darstellt, die durch die ”langsame” CPU und den ”kleinen” Arbeitsspeicher ein bisschen mehr herausfordert, als normale Desktoprechner mit mehreren Ghz und Kernen und Unmengen an RAM wo man einiges auch einfach „brute force“ lösen kann, ohne sich Gedanken um eine effizientere Lösung machen zu müssen.

    “If debugging is the process of removing software bugs, then programming must be the process of putting them in.” — Edsger Dijkstra

    Edited once, last by __blackjack__ ().

    • Official Post

    Weil es hier kein allgemeines Unterforum im Bereich „Programmierung“ gibt

    die man mit einer Programmiersprache seiner Wahl lösen kann

    Dann verschiebe ich das trotzdem mal hierher.

  • hyle Jetzt sieht's halt so ein bisschen so aus als wenn es nicht für Python geeignet ist, sondern nur für andere Programmiersprachen. Aus meiner Sicht vor allem deswegen komisch weil Python die Sprache meiner Wahl für die Aufgaben ist die ich nicht auf dem C64 oder dem DOS-Rechner gelöst bekomme. 🙂

    “If debugging is the process of removing software bugs, then programming must be the process of putting them in.” — Edsger Dijkstra

    • Official Post

    Hmm... ja klar, verstehe ich! Meine Intension war es halt, dass andere Sprachen nicht auf eine spezielle Sprache (wie Python) festgelegt wäre und der OT-Bereich imho noch ungeeigneter ist, denn OT ist es ja auch nicht wirklich. Schwere Entscheidung! :conf:


    Vielleicht bringt es ja was, wenn Du "mit einer Programmiersprache seiner Wahl" hervorhebst (habe das in meinem Beitrag auch mal gemacht).

  • Oh, cool.


    Danke für den Hinweis. Nachdem ich eine Hand voll Entwickler zumindest schon mal für den Hacktober bei uns begeitern konnte, werde ich diese Aufgaben einfach mal auch bei uns in der Firma streuen :)


    __blackjack__ Entschuldige bitte, aber ich bin selten hier im Python-Forum unterwegs, dementsprechend kann ich das nicht einschätzen: Hast du vor Python auf dem Weg zu lernen oder ist es erfahrungsgemäß einfach mal ein größtenteils "anderes" Feld in dem man diese Aufgaben löst?


    Ich würde anhand der ersten Aufgaben sonst mal schauen, ob ich den AoC dafür nutze, den lange aufgeschobenen Start mit elixir zu wagen :)

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

  • Renão Ich denke Python kann ich halbwegs. Programmiere damit schon seit Anfang 2003, erst privat und im Studium, mittlerweile privat und beruflich. 🙂


    Ich versuche die Aufgaben immer erst einmal auf dem C64 zu lösen, in BASIC oder C und ggf. Assembler. Geht natürlich nicht immer mit der Rechenleistung und dem Arbeitsspeicher. Zweitgrössere Stufe ist dann ein 486er mit DOS. Falls der auch nicht reicht kommt ein modernerer Linuxrechner zum Einsatz. Wobei da auch tatsächlich schon ein paar mal ein Raspi zum Einsatz kam, weil die Aufgaben um 6 Uhr veröffentlicht werden und ich ab und zu eine Lösung angefangen hatte wo ja nicht immer so klar ist was die dann für eine Laufzeit hat. Und das lief dann weiter und ich habe vom Büro aus nachgeschaut wie der Raspi zuhause so voran kommt. Das ist bei Homeoffice jetzt natürlich nicht notwendig.

    “If debugging is the process of removing software bugs, then programming must be the process of putting them in.” — Edsger Dijkstra

  • Ah, schöne Challenge mit dem C64.


    Packst du deinen Code irgendwo öffentlich hin?


    Wenn es irgendwen interessieren würde und ich wirklich die Zeit dafür finde, würde ich das alles in ein github Repo packen und man könnte sich hier zu seinen Lösungen austauschen.

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

  • Ich bin ja schon auf das die vor dem Niveau gespannt

    Du kannst dir ja mal die vergangenen Aufgaben anschauen. Ich habe auch schon reingeschaut, ob was für mich dabei ist.


    Grüße

    Dennis

    ... ob's hinterm Horizont wirklich so weit runter geht oder ob die Welt vielleicht doch gar keine Scheibe ist?

  • Renão Ich habe den Code zwar auch immer in einem Repo aber lokal, nicht öffentlich. Der ist auch oft nicht durchgehend in einer Form die mir unpeinlich wäre. 😉 Am Anfang ist ja noch Zeit aber in der Vergangenheit habe ich dann irgendwann auch immer angefangen hinterher zu hängen. Um jetzt niemanden von den Aufgaben abzuschrecken: Das hat teilweise auch mit der zusätzlichen Einschränkung des C64 zu tun. Vorletztes Jahr hat mich beispielsweise eine für mich überraschende Eigenschaft einer RAM-Erweiterung tagelang beschäftigt und richtig Zeit gekostet bis ich den Fehler in der Ansteuerung gefunden hatte. Es lag letztlich wirklich am Code, ich war aber zwischenzeitlich auch nicht sicher ob die Hardware nicht 'ne Macke hatte, weil eine andere, aktuelle Speichererweiterung das Problemverhalten nicht zeigte, und auch Emulatoren sich da nicht ”einig” waren.


    Hofei So allgemein steigt das Niveau im laufe der Zeit ein bisschen, aber auch in späteren Tagen kamen auch immer mal wieder einfache Aufgaben. Und man hat in den beiden Aufgabenteilen pro Tag ein Gefälle, das heisst die erste Teilaufgabe ist in der Regel ”einfacher” als der zweite. Wobei das manchmal nicht zwangsläufig etwas mit dem Niveau zu tun hat, beziehungsweise man Niveau manchmal auch mit Rechenleistung und/oder Geduld ersetzen kann. Also so Sachen wie Aufgabenteil 1 ergibt einen verhältnismässig einfachen Algorithmus der für n=42 oder 10 Zeichen Eingabe oder … in einer Sekunde ein Ergebnis berechnet. Aufgabenteil 2 ist im Grunde die gleiche Aufgabe aber mit deutlich grösserer Eingabe (n=23.000.000 oder 2 KiB Zeichen oder …). Und dann kann man manchmal einfach warten bis das dann halt in einer Stunde durchgerechnet ist, oder man kann versuchen den Algorithmus auf mehrere Kerne/Prozessoren zu verteilen, oder man macht sich auf die Suche nach einem cleveren Algorithmus und erhöht damit tatsächlich das Niveau.


    Was ich bei den Aufgaben gut finde ist das es zu der Beschreibung des Problems fast immer auch ein kleines Beispiel einer Eingabe gibt, wo durchgegangen wird wie man auf die Ausgabe kommt + weitere Eingabe/Ausgabe-Paare. Diese Daten enthalten in der Regel auch wichtige Randfälle. Dass heisst wenn es in der Beschreibung Unklarheiten/Mehrdeutigkeiten/Interpretationsspielraum gibt, dann klären die Beispieldaten das in der Regel. Ein guter Anfang ist also diese Eingabe/Ausgabe-Beispiele als Tests zu programmieren.

    “If debugging is the process of removing software bugs, then programming must be the process of putting them in.” — Edsger Dijkstra

  • Bis jetzt machts Spaß :):bravo2: Meinen ersten und zweiten Stern habe ich.

    Habe meine Signatur mal erweitert mit Werbung für Advent of Code und den Link zu dem GH Repository von meinen Lösungen. Vielleicht mögen sich ja andere Teilnehmender anschließen und auch ihre Lösungen auf GH veröffentlichen und den Link als Signatur setzen.

    :danke_ATDE: nochmals für den Tipp.


    Irgendwann wird der Punkt kommen wo ich nachfragen muss, da bin ich mir sicher.

  • Gratulation zum ⭐️.


    Ich habe meinen ersten auch. In BASIC auf'm C64 in einer Minute und sechs Sekunden errechnet. Und hier ist dann auch schon das erste Problem bei dem Aufgabenteil zwei länger dauert. Nur eine kleine Codeänderung gegenüber Teil 1, aber der C64 rechnet jetzt schon ewig. Habe nicht auf die Uhr geschaut als ich das Programm gestartet habe, aber gefühlt eine Stunde ist der schon beschäftigt. Habe das gerade auf dem DOS-PC in QBasic noch mal implementiert. Teil 1 war in einer halben Sekunde berechnet, Teil 2 in zwei Minuten und 15 Sekunden, aaaber die Genauigkeit der normalen Gleitkommazahlen hat nicht für das Ergebnis ausgereicht. Also Datentyp auf LONG geändert und der erste Teil braucht nur noch etwas unter einer Viertelsekunde und der zweite Teil liefert nach 43,45 Sekunden das richtige Ergebnis. Jetzt bin ich gespannt wann der C64 fertig wird und ob da das Ergebnis als Gleitkommazahl noch genau ermittelt werden kann.


    Meine Python-Lösung ist ein bisschen kompakter als Deine. Insbesondere das einlesen als Zahlen, wobei ich die Eingabe auf der Standardeingabe erwarte, damit man die da einfach ”rein-pipen” kann:

    Das `more_itertools.one()` kann man durch die eingebaute `next()`-Funktion ersetzen, falls man sich das nicht als Abhängigkeit installieren möchte.

    “If debugging is the process of removing software bugs, then programming must be the process of putting them in.” — Edsger Dijkstra

  • Die 6 Zahlen sind das Beispiel, in der Aufgabe sind es 200 Zahlen. Aus den 200 Zahlen sind dann die 2 Zahlen gesucht, die als Summe 2020 geben ja.

    An deine Zahlen kommst du nachdem du eingeloggt bist auf ******* (weiß ich jetzt nicht mehr was da steht) drückst

  • Schöner Fund, vielen Dank __blackjack__ !


    Ich habe mich auch mal an Tag 1 probiert, mein Ansatz mit Python ist etwas anders: Möglicherweise weniger elegant aber m.E. effizienter, da weniger Berechnungen anfallen. Vielleicht wäre damit auch der C64 etwas weniger lang beschäftigt.


  • Puh, ich habe vorhin mal 30-40 Minuten investiert, bin auch schon relativ weit gekommen, dafür dass ich mit elixir direkt mal Hals-über-Kopf in die funktionalen Sprachen springe und mir die Standard Lib zusammensuchen muss.


    _Eigentlich_ fehlt mir nur noch das Raussuchen der Zahlen ... dann werde ich auch mal meinen ziemlich miesen elixir-Code veröffentlichen :P

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

  • Nachtrag: Habe heute auch mal einen Beitrag in unserem Intranet zum Thema verfasst. Bisher gab es vor allem Rückmeldungen von den Nicht-Codern :P

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