NEWS
ioBroker Advent of Code
-
@bananajoe said in ioBroker Advent of Code:
Was ich jetzt schon hasse ist wenn ich feststelle das ich falsch an Teil 1 heran gegangen bin wenn ich Teil 2 mache ...
In diversen Tipps & Tricks zum AoC findest du Sätze wie: "The second puzzle is always a twist on the first, and it’s meant to simulate the real-world experience of changing requirements."
Es gibt also kein "falsch an den ersten Teil rangegangen". Der 2te Teil ist in der Regel bewusst so konstruiert, dass du vom ersten Teil nicht ableiten kannst, was beim 2ten passiert, du deinen Code also auch nicht darauf vorbereiten kannst.
Stattdessen ist 'Keep It simple stupid' durchaus angebracht. Und sich dann agil immer auf den Twist einlassen, der im 2ten Teil passiert, also wenn der Kunde / die Elfen endlich mit den wahren Requirements rausrücken, die sie dir nie am Anfang sagen.
-
Oh man Tag 6. Wie blöd kann ich nur sein
Das einzige Problem ist das lesen bei mir gewesen. Oder haben sie eine Fehler in der Aufgabe ? -
@ignis-draco sagte in ioBroker Advent of Code:
Das einzige Problem ist das lesen bei mir gewesen.
Das kenn ich, wobei es heute ja ganz gut ging Fehler konnte ich nicht finden - fand das heute recht ausführlich erklärt.
-
Und, wer von euch hat auch initial 'Brute Force' verwendet und später noch die alten Schulbücher aufgemacht, wie die Formel x^2 +bx +c aufgelöst wird?
-
@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 ichx^2 +bx +c
nicht gefunden, in der Lehre habe ich ein paar Sinuskurven mal berechnet ... https://www.lernhelfer.de/schuelerlexikon/mathematik/artikel/quadratische-funktionen -
@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.
-
@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...
-
@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
-
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?
-
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
-
@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.
-
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.
-
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?) -
@oliverio Jau habe ich mittlerweile auch so umgesetzt 19ms
-
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.
-
@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.
-
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'
-
@bluegaspode ich habe da gerade eine Schranke im Gehirn.
Was meinst du mitPfad 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 ZeileIch starte mitAAA
, man muss den Text schon genau lesenAAA = (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
undCCC
sind die nächsten "nodes", abhängig davon wie die Anweisung gerade ist.
Die istRL
, also nehme ich für dasR
dieCCC
und schaue dort nach was dort beiL
, also links steht.
Da stehtGGG
. Und weil das nichtZZZ
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 nichtNachtrag: Erkläre es bitte als wäre ich 10 Jahre alt ...
-
@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 -> AAZPfad2 (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 ...............-> 4242 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.
-
@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 ...