Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. ioBroker Advent of Code

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    ioBroker Advent of Code

    This topic has been deleted. Only users with topic management privileges can see it.
    • BananaJoe
      BananaJoe Most Active @bluegaspode last edited by

      @bluegaspode sagte in ioBroker Advent of Code:

      Und, wer von euch hat auch initial 'Brute Force' verwendet

      Ich ... musste eh gerade hoch zum Essen machen, hatte gesehen das er nach 20 Sekunden den Start gefunden hatte und dachte mir "ist bestimmt fertig wenn ich in nach dem Essen wieder runter komme".

      Hatte mir zwar während des Essen eine Abkürzung überlegt (Mit verdoppelt und halbieren als Feinsuche) ... aber schön wenn es auch mal schnell ging.
      In meiner Formelsammlung aus der Realschule 1985-1989 habe ich x^2 +bx +c nicht gefunden, in der Lehre habe ich ein paar Sinuskurven mal berechnet ... https://www.lernhelfer.de/schuelerlexikon/mathematik/artikel/quadratische-funktionen

      bluegaspode 1 Reply Last reply Reply Quote 0
      • bluegaspode
        bluegaspode @BananaJoe last edited by

        @bananajoe das ist aber eine lange Laufzeit.
        Meine Lösung, die stur alles durchprobiert ist auch für Teil 2 in kleiner einer Sekunde durch.

        Ohne Optimierung und nix, nur durchprobieren und rechnen.

        haus-automatisierung BananaJoe 2 Replies Last reply Reply Quote 0
        • haus-automatisierung
          haus-automatisierung Developer Most Active @bluegaspode last edited by

          @bluegaspode sagte in ioBroker Advent of Code:

          Meine Lösung, die stur alles durchprobiert ist auch für Teil 2 in kleiner einer Sekunde durch.

          Ja, hier auch. Daher gar keine weiteren Gedanken gemacht... 🙂

          1 Reply Last reply Reply Quote 0
          • BananaJoe
            BananaJoe Most Active @bluegaspode last edited by

            @bluegaspode sagte in ioBroker Advent of Code:

            Meine Lösung, die stur alles durchprobiert ist auch für Teil 2 in kleiner einer Sekunde durch.

            Ich nutze AutoIt, das performt ggf. nicht so gut

            1 Reply Last reply Reply Quote 1
            • haus-automatisierung
              haus-automatisierung Developer Most Active last edited by

              Gestern (Tag 7) habe ich probiert den Teil 2 vorauszuahnen und die Logik so gebaut, dass noch die Wertigkeit der einzelnen Treffer (also AAA wäre höher gewertet als KKK) berücksichtigt wird. Fazit: War Quatsch und zu kompliziert 🙂 Also wieder vereinfacht.

              • Vorher: https://github.com/klein0r/advent-of-code-2023/blob/60780a67f4eba378f7a522b34b3dd3a110e4f45c/day-07/index.js
              • Nachher: https://github.com/klein0r/advent-of-code-2023/blob/299c79fccfdd4b23e4873a89cd9021b54c5475a0/day-07/index.js

              Habt ihr auch mit Bitmasken gearbeitet um die Wertigkeit der Typen festzulegen?

              BananaJoe 1 Reply Last reply Reply Quote 0
              • I
                ignis-draco last edited by

                Ich habe das über ein enum gelöst

                class Strong(IntEnum):
                  HIGH_CARD = 0
                  ONE_PAIR = 1
                  TWO_PAIR = 2
                  THREE_OF_A_KIND = 3
                  FULL_HOUSE = 4
                  FOUR_OF_A_KIND = 5
                  FIVE_OF_A_KIND = 6
                
                  @classmethod
                  def maxKind(self, value):
                    if value == self.FIVE_OF_A_KIND:
                      return 5 
                    if value == self.FOUR_OF_A_KIND:
                      return 4
                    if value == self.THREE_OF_A_KIND or value == self.FULL_HOUSE:
                      return 3
                    if value == self.ONE_PAIR or value == self.TWO_PAIR:
                      return 2 
                    return 1
                  
                  @classmethod
                  def addOneKind(self, value):
                    if value == self.FIVE_OF_A_KIND:
                      return self.FIVE_OF_A_KIND
                    if value == self.FOUR_OF_A_KIND:
                      return self.FIVE_OF_A_KIND
                    if value == self.THREE_OF_A_KIND or value == self.FULL_HOUSE:
                      return self.FOUR_OF_A_KIND
                    if value == self.ONE_PAIR or value == self.TWO_PAIR:
                      return self.THREE_OF_A_KIND
                    return self.ONE_PAIR
                
                1 Reply Last reply Reply Quote 1
                • BananaJoe
                  BananaJoe Most Active @haus-automatisierung last edited by

                  @haus-automatisierung sagte in ioBroker Advent of Code:

                  Habt ihr auch mit Bitmasken gearbeitet um die Wertigkeit der Typen festzulegen?

                  Maximal kompliziert mit Zerlegen in Arrays (die Zeilen und die Kartensätze), Textvergleich in der Reihenfolge der Kartenwertigkeit und Feststellung ob es nun ein 5er, 4er, Full House usw. ist und zuweisen eines Wertes je nach Treffer, anhand diesen Wertes die Wertigkeit der Kartensätze festgelegt, festgestellt das ich damit meine Liste genau falsch herum aufgebaut habe. Nach dem Umdrehen der Liste waren aber auch innerhalb eines Wertes (z.B. Full House) die Reihenfolge nun falsch herum war ... aber nicht immer. Um mir dann bei einem anderen die Idee mit "Suchen und Ersetzen" abzuschauen und die neuen Buchstaben dann zu sortieren damit die Wertigkeit der einzelnen Karten Alphabetisch wird. Dann kam der Einfall Präfixe zu setzen damit ich das einfach nach Text sortieren kann.

                  Da hat man dann seine 200 Zeilen Lösung und staunt wie kurz andere das hinbekommen mit Funktionen die ich noch nie benutzt habe.

                  1 Reply Last reply Reply Quote 1
                  • haus-automatisierung
                    haus-automatisierung Developer Most Active last edited by

                    Teil 2 heute nervt mal richtig 🙂 Durchrechnen dauert ewig... Wollte mal gucken wie hoch das Ergebnis ungefähr liegt und habe 10000000000000 eingegeben. "Answer too low". Oha...

                    Heute Abend mal mehr Gedanken machen wie das klappen könnte.

                    OliverIO 1 Reply Last reply Reply Quote 0
                    • OliverIO
                      OliverIO @haus-automatisierung last edited by

                      @haus-automatisierung

                      hah, teil2, hat ein weilchen gedauert, aber es geht dann schnell
                      hier mit spoiler.
                      meine zahl ist 13133452426987.
                      da hätte er ein weilchen gerechnet (monate?)


                      den algoritmus aus teil1 für jeden einzelnen start bis ende pfad durchrechnen und dann den kleinsten gemeinsamen vielfachen für alle durchläufe finden
                      alle ergebnisse für jeden durchlauf hier komma-separiert eintragen
                      https://www.matheretter.de/rechner/kgv

                      haus-automatisierung bluegaspode 2 Replies Last reply Reply Quote 0
                      • haus-automatisierung
                        haus-automatisierung Developer Most Active @OliverIO last edited by

                        @oliverio Jau habe ich mittlerweile auch so umgesetzt 🙃 19ms

                        1 Reply Last reply Reply Quote 0
                        • BananaJoe
                          BananaJoe Most Active last edited by

                          Ich fürchte ich bräuchte mal einen Tipp in die richtige Richtung. Ich habe auch schon auf Reddit gelesen das LCM bzw. die Multiplikation der Pfade mein Freund ist, mich durch diverse Seiten gehangelt welche das zu versuchen zu erklären. Aber ich verstehe trotzdem nur Bahnhof.

                          bluegaspode 1 Reply Last reply Reply Quote 0
                          • bluegaspode
                            bluegaspode @OliverIO last edited by

                            @oliverio Das klappt aber nur, weil der Input das 'zufällig' erlaubt.

                            Ich bin gar nicht auf die Idee Idee gekommen und hab daher gar nicht dran gedacht.

                            Mal als Beispiel, wo der Ansatz nicht klappt :

                            Kette A: 3 Schritte bis zum ersten Z, 20 Schritte bis zu einem anderen Z, 3 Schritte zurück zum ersten Z.

                            Kette B: 2 Schritte bis zum ersten Z, 7 Schritte zurück zum ersten Z.

                            Dein kGV wäre dann 6. Nach 6 Schritten treffen sich die Geister aber gar nicht.

                            Gibt größere Diskussionen auf Reddit, aber am Ende stellt sich raus, dass der Weg den man vom Anfang zum ersten Z braucht der gleiche Weg wie zum nächsten Z ist (obwohl die Kette nichtmal wieder am Anfang vorbeigeht).

                            Naja, ich habe zu kompliziert gedacht und deswegen meine Lösung mit all den Tagesablenkungen immer noch nicht.

                            1 Reply Last reply Reply Quote 0
                            • bluegaspode
                              bluegaspode @BananaJoe last edited by bluegaspode

                              @bananajoe

                              Ein einfaches Beispiel:

                              Pfad 1: du brauchst 6 Schritte zum Z (und 6 bis zum nächsten)

                              Pfad 2: du brauchst 14 Schritte zum Z (und 14 zum dann nächsten)

                              kgv ist 42 (7*3*2).

                              Die 6er Kette kommt da nach 7 Runden an.
                              Die 14er Kette nach 3 Runden.

                              Dann hast du überall gleichzeitig ein Z.

                              Alles nur multiplizieren (6*14) ist auch ein Punkt wo überall ein Z ist, der ist aber zu weit 'hinten'

                              BananaJoe 1 Reply Last reply Reply Quote 0
                              • BananaJoe
                                BananaJoe Most Active @bluegaspode last edited by BananaJoe

                                @bluegaspode ich habe da gerade eine Schranke im Gehirn.
                                Was meinst du mit

                                Pfad 1: du brauchst 6 Schritte zum Z (und 6 bis zum nächsten)

                                Ich nehme an du beziehst die auf die Beispieldaten?

                                Pfad 1: du brauchst 6 Schritte zum Z (und 6 bis zum nächsten)

                                Verstehe ich in diesem Zusammenhang nicht.

                                Ich starte in der ersten Zeile Ich starte mit AAA, man muss den Text schon genau lesen

                                AAA = (BBB, CCC)
                                BBB = (DDD, EEE)
                                CCC = (ZZZ, GGG)
                                DDD = (DDD, DDD)
                                EEE = (EEE, EEE)
                                GGG = (GGG, GGG)
                                ZZZ = (ZZZ, ZZZ)
                                

                                AAA ist der aktuelle "node"
                                BBB und CCC sind die nächsten "nodes", abhängig davon wie die Anweisung gerade ist.
                                Die ist RL, also nehme ich für das R die CCC und schaue dort nach was dort bei L, also links steht.
                                Da steht GGG. Und weil das nicht ZZZ ist fange ich mit den Anweisungen wieder von vorne an.

                                Solange bis ich auf ZZZ stoße. In Part 1 zähle ich die einzelnen Schritte dafür und das ist die Lösung.
                                Ich erkenne aber die Abkürzung nicht. Per "Brute Force" war das noch machbar, aber natürlich für Teil 2 nicht

                                Nachtrag: Erkläre es bitte als wäre ich 10 Jahre alt ...

                                bluegaspode 1 Reply Last reply Reply Quote 0
                                • bluegaspode
                                  bluegaspode @BananaJoe last edited by bluegaspode

                                  @bananajoe
                                  etwas ausführlicher.

                                  Für Teil 1 hast du alles richtig gemacht. Teil 2 baut darauf auf, du musst es mit etwas Mathematik kombinieren.

                                  Stell dir vor, du verfolgt die LR Anweisungen, dann entsteht ja eine "Kette" wie du von xxA nach xxZ kommst. Im Original sind mehrere Ketten 'versteckt', die du ja alle gleichzeitig ablaufen sollst.

                                  Dies hier ist ein neues ausgedachtes Beispiel:

                                  Pfad 1 (mit 6 Schritten vom ersten xxA bis zum ersten xxZ):
                                  AAA -> AAB -> AAC -> AAD -> AAE -> AAF -> AAZ

                                  Pfad2 (mit 14 Schritten vom ersten xxA bis zum ersten xxZ)

                                  BBA -> BBB -> BBC-> BBD -> BBE -> BBF -> BBG -> BBH -> BBI -> BBJ -> BBK -> BBL -> BBM -> BBN -> BBZ

                                  Die "Ketten" gehen dann natürlich weiter, man landet ja immer wieder regelmäßig beim AAZ oder BBZ. Die Inputdaten des Rätsels sind so aufgebaut, dass du in der ersten Kette, wenn du 'AAZ' nach 6 Schritten gefunden hast, die Kette weitergeht und du dann erneut nach 6 Schritten das nächste 'AAZ' findest.

                                  In der 2ten Kette findest du nach jedem 14ten Schritt das 'BBZ'.

                                  Wenn man das in Zahlen ausdrückst, findest du ein 'AAZ' aus der ersten Kette also an folgenden Stellen (vielfache von 6)
                                  06 -> 12 -> 18 -> 24 -> 30 -> 36 -> 42 -> 48 -> 56 -> ...

                                  Das 'BBZ' findest du an vielfachen von 14:
                                  14 .........................-> 28 ...............-> 42

                                  42 ist hier die magische Nummer. Beide 'Ketten' haben an der 42igsten Stelle ihr AAZ bzw. BBZ als die Bedingung die du suchen sollst.

                                  42 ist das kleinste gemeinsame Vielfache von 6 und 14.

                                  Um das Rätsel zu lösen musst du also:

                                  • alle Startpunkte finden ('xxA'). Von jedem Startpunkt suchen, bis du das erste 'xxZ' findest. Diese "Kettenlänge" musst du dir merken.

                                  Wenn du weißt, wie lang alle Ketten sind, musst du von allen Ketten das kleinste gemeinsame Vielfache berechnen. Das wäre der Punkt, wo, wenn du alle Ketten mehrfach gleichzeitig abfährst zum ersten mal bei allen gleichzeitig ein 'xxZ' findest.

                                  BananaJoe 1 Reply Last reply Reply Quote 1
                                  • BananaJoe
                                    BananaJoe Most Active @bluegaspode last edited by

                                    @bluegaspode Danke!

                                    Ich behaupte nicht es verstanden zu haben, aber ich habe das Ergebnis (und den 2. Stern).
                                    Ich habe alle gefunden Pfade bzw. deren Anzahlen in den von @OliverIO geposteten kgv Rechner gepackt und es kam tatsächlich die richtige Lösung dabei heraus.

                                    Nur der Vollständig halber habe ich das noch als Funktion in mein Programm eingebaut.

                                    So habe ich doch noch meinen 2. Stern heute geschafft, ich hatte schon verzweifelt ...

                                    OliverIO 1 Reply Last reply Reply Quote 1
                                    • BananaJoe
                                      BananaJoe Most Active last edited by BananaJoe

                                      Das lief heute, Day 9 schon besser, auch wenn ich wieder einen selten dämlichen Fehler drin hatte.
                                      Meine Ausstiegsbedingung war das die Summe(!!!) aller Werte einer Stufe 0 ist. Nun gab es natürlich 4 Zeilen in den Daten wo es auch einen Schritt gab der Zufällig 0 ergibt. Ich hatte mir alles ausgeben lassen, aber erst auf den 10. Blick gesehen das bei einigen Zeilen die 0 0 0 0 fehlte.

                                      Dafür war Part 2 mal ausgesprochen leicht ... es musste nur eine Zeile mit einem ArrayReverse ergänzt werden

                                      1 Reply Last reply Reply Quote 0
                                      • OliverIO
                                        OliverIO @BananaJoe last edited by

                                        @bananajoe sagte in ioBroker Advent of Code:

                                        Ich behaupte nicht es verstanden zu haben

                                        aber eigentlich dann simpel. evtl denkt man nicht direkt gleich daran, das es so funktionieren könnte.

                                        du hast 3 start-nodes. mit
                                        bei 1 kommst du in 2 schritten durch,
                                        bei 2 kommst du in 3 schritten durch
                                        bei 3 kommst du mit 4 schritten durch

                                        dann musst du 234 machen, das ist die Anzahl der schritte wo zum ersten mal alle 3 startnodes zugleich am gleichen endpunkt ankommen. daher auch kgv=kleinster gemeinsamer vielfacher.
                                        theoretisch kann man das auch in javascript rechnen. es kann da aber schnell zu überläufen kommen. ich denke die webseite nimmt eine andere bibliothek als die javascript eigenen rechenfunktionen zu verwenden.

                                        1 Reply Last reply Reply Quote 1
                                        • BananaJoe
                                          BananaJoe Most Active last edited by

                                          So, der ganze Sonntag ist nur für das Rätsel drauf gegangen ... also Teil B.
                                          Ich hatte mir gleich am Anfang gebaut das er mir das ganze - mit richtigen Ecken und Linien - wieder als Text ausgibt (aka ASCII-Art).
                                          Ich hatte dann zwar eine Lösung, die war aber nur nah dran und die letzten Fehler habe ich dann von Hand gezählt und abgezogen. Ich hatte alle Leerzeichen innerhalb des Pfades mit X markiert, es waren aber noch zu viele da einige ja nicht umschlossen wirklich waren. Aus dem ASCII ein png gemacht, im Malprogramm einmal das Füllwerkzeug genommen und die X die im bunten waren abgezogen.
                                          Aber mich hatte natürlich mein Ehrgeiz gepackt das ich das mit dem Programm hinbekomme.

                                          Da habe ich jetzt 5h dran verschwendet, ich inzwischen wieder weiter weg von der Lösung wie am Anfang. und bei fast 600 Zeilen Code.

                                          Und sieht man andere "Flitzpiepen" die das mit weniger als 100 Zeilen machen.
                                          Ok, ich musste mir meinen "FloodFill" auch selbst schreiben, inklusive das ich immer wieder an das Limit bei den Rekursiven Aufrufen gestoßen bin.

                                          Hoffentlich ist morgen wieder einfach, eigentlich wollte ich heute doch ganz viel andere Sachen machen.

                                          bluegaspode 1 Reply Last reply Reply Quote 1
                                          • bluegaspode
                                            bluegaspode @BananaJoe last edited by

                                            @bananajoe Dich hat der AoC Virus gefangen 🙂
                                            Ich habe für den 2ten Teil auch was ziemlich komplexes geschrieben.

                                            In dem Moment wo sich dir Lösung hatte, fiel mir was viel einfacheres ein...

                                            Man kann in in Polygonen sehr einfach bestimmen, was innen und was außen ist.

                                            Du musst dir nur aus Teil eins alle Positionen der Strecke merken (damit du den ganzen anderen 'Müll' ignorieren kannst).

                                            Dann einfach jede Zeile von links nach rechts wandern. Dabei zählst du nur, ob du die Strecke kreuzt. Hast du sie einmal gekreuzt: bist du 'innen', zweimal gekreuzt wieder 'außen' und sie weiter. Also testest du, ob du eine gerade oder ungerade Anzahl Wege gekreuzt hast und je nachdem die leeren Felder an denen du vorbeikommst zählen oder nicht. Bei den Ecken nur bestimmte Ecke zählen, damit einen waagerechte Wände die Rechnung nicht kaputt machen.

                                            Schau mal hier unter 'Raycasting' :
                                            https://en.m.wikipedia.org/wiki/Point_in_polygon

                                            Das ist hier relativ einfach weil alles schön gerade ist.

                                            Andere haben das Labyrinth 'aufgeplustert'. Aus Jedem Punkt eine 3x3 Fläche machen., dann lässt sich der FloodFill auf der größeren Fläche einsetzen, weil er sich dann gut zwischen den Wänden durchschlängeln kann.

                                            BananaJoe 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate
                                            FAQ Cloud / IOT
                                            HowTo: Node.js-Update
                                            HowTo: Backup/Restore
                                            Downloads
                                            BLOG

                                            832
                                            Online

                                            31.8k
                                            Users

                                            80.0k
                                            Topics

                                            1.3m
                                            Posts

                                            12
                                            86
                                            7099
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo