{"id":34590,"date":"2018-12-01T09:58:00","date_gmt":"2018-12-01T08:58:00","guid":{"rendered":"https:\/\/www.happycoders.eu\/?p=34590"},"modified":"2024-12-02T12:02:00","modified_gmt":"2024-12-02T11:02:00","slug":"advent-of-code-2015","status":"publish","type":"post","link":"https:\/\/www.happycoders.eu\/de\/algorithmen\/advent-of-code-2015\/","title":{"rendered":"Advent of Code 2015 \u2013 Objektorientierte L\u00f6sungen in Java"},"content":{"rendered":"\n<p>In diesem Artikel findest du kurze Erkl\u00e4rungen zu meinen L\u00f6sungen f\u00fcr <a href=\"https:\/\/adventofcode.com\/2015\/\" target=\"_blank\" rel=\"noopener\">Advent of Code 2015<\/a>.<\/p>\n\n\n\n<p>Meine L\u00f6sungen findest du in diesem GitHub-Projekt: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2015\" target=\"_blank\" rel=\"noopener\">Advent of Code 2015 \u2013 Object-oriented Solutions in Java<\/a>.<\/p>\n\n\n\n<div class=\"wp-block-group has-global-padding\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"advent-of-code-2015-tag-1-loesung\">Advent of Code 2015 \u2013 Tag 1 L\u00f6sung<\/h2>\n\n\n\n<p><a rel=\"noopener\" href=\"https:\/\/adventofcode.com\/2015\/day\/1\" target=\"_blank\">Tag 1<\/a> ist schnell gel\u00f6st: Ein Counter wird f\u00fcr jede '(' hoch- und f\u00fcr jede ')' wieder runtergez\u00e4hlt \u2013 entweder bis zum Ende (Teil eins) oder bis der Z\u00e4hler den Wert -1 erreicht (Teil zwei).<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2015\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2015\/day1\" target=\"_blank\" rel=\"noopener\">Advent of Code 2015 Tag 1 L\u00f6sung<\/a><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"advent-of-code-2015-tag-2-loesung\">Advent of Code 2015 \u2013 Tag 2 L\u00f6sung<\/h2>\n\n\n\n<p><a rel=\"noopener\" href=\"https:\/\/adventofcode.com\/2015\/day\/2\" target=\"_blank\">Tag 2<\/a> ist auch recht einfach \u2013 man muss nur jede Zeile in L\u00e4nge, Breite und H\u00f6he parsen und ein paar Grundrechenarten anwenden, um Fl\u00e4chen, Umfang und Volumen zu berechnen.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2015\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2015\/day2\" target=\"_blank\" rel=\"noopener\">Advent of Code 2015 Tag 2 L\u00f6sung<\/a><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"advent-of-code-2015-tag-3-loesung\">Advent of Code 2015 \u2013 Tag 3 L\u00f6sung<\/h2>\n\n\n\n<p>Die L\u00f6sung von <a rel=\"noopener\" href=\"https:\/\/adventofcode.com\/2015\/day\/3\" target=\"_blank\">Tag 3<\/a> habe ich mit einem <code>Set<\/code> implementiert, das alle Orte speichert, die Santa besucht hat. Die L\u00f6sung von Teil eins entspricht der Gr\u00f6\u00dfe des Sets.<\/p>\n\n\n\n<p>F\u00fcr Teil zwei habe ich je ein <code>Set<\/code> f\u00fcr Santa und eines f\u00fcr Robo-Santa verwendet. Am Ende werden beide <code>Set<\/code>s zu einem zusammengef\u00fchrt und dessen Gr\u00f6\u00dfe zur\u00fcckgegeben.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2015\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2015\/day3\" target=\"_blank\" rel=\"noopener\">Advent of Code 2015 Tag 3 L\u00f6sung<\/a><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"advent-of-code-2015-tag-4-loesung\">Advent of Code 2015 \u2013 Tag 4 L\u00f6sung<\/h2>\n\n\n\n<p>Um <a rel=\"noopener\" href=\"https:\/\/adventofcode.com\/2015\/day\/4\" target=\"_blank\">Tag 4<\/a> zu l\u00f6sen, m\u00fcssen wir \u00fcber alle positiven Zahlen iterieren, bis wir einen Hash mit der geforderten Anzahl von f\u00fchrenden Nullen finden. Es geht etwa doppelt so schnell, wenn wir direkt im Byte-Array nach den f\u00fchrenden Nullen suchen und dieses nicht erst in einen Hex-String umwandeln.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2015\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2015\/day4\" target=\"_blank\" rel=\"noopener\">Advent of Code 2015 Tag 4 L\u00f6sung<\/a><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"advent-of-code-2015-tag-5-loesung\">Advent of Code 2015 \u2013 Tag 5 L\u00f6sung<\/h2>\n\n\n\n<p>F\u00fcr <a rel=\"noopener\" href=\"https:\/\/adventofcode.com\/2015\/day\/5\" target=\"_blank\">Tag 5<\/a> habe ich zwei \"Nice String\"-Detektoren geschrieben, die das Interface <code>Predicate&lt;String&gt;<\/code> implementieren. Auf diese Weise k\u00f6nnen wir den Detektor f\u00fcr Teil zwei leicht austauschen.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2015\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2015\/day5\" target=\"_blank\" rel=\"noopener\">Advent of Code 2015 Tag 5 L\u00f6sung<\/a><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"advent-of-code-2015-tag-6-loesung\">Advent of Code 2015 \u2013 Tag 6 L\u00f6sung<\/h2>\n\n\n\n<p><a href=\"https:\/\/adventofcode.com\/2015\/day\/6\" target=\"_blank\" rel=\"noopener\">Tag 6<\/a> habe ich mit einem zweidimensionalen Array von ints gel\u00f6st. Ich habe die beiden Regels\u00e4tze f\u00fcr Teil eins und zwei jeweils mit einer <code>Map<\/code> vom Kommando (\"turn on\", \"toggle\", \"turn off\") auf einen <code>IntUnaryOperator<\/code> implementiert, der die neue Helligkeit auf der Grundlage der vorherigen berechnet.<\/p>\n\n\n\n<p>Dies ist der interessante Teil des Codes:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">EnumMap&lt;Command, IntUnaryOperator&gt; commandToOperatorPart1 = <span class=\"hljs-keyword\">new<\/span> EnumMap&lt;&gt;(Command<span class=\"hljs-class\">.<span class=\"hljs-keyword\">class<\/span>)<\/span>;\ncommandToOperatorPart1.put(TURN_ON, brightness -&gt; <span class=\"hljs-number\">1<\/span>);\ncommandToOperatorPart1.put(TOGGLE, brightness -&gt; <span class=\"hljs-number\">1<\/span> - brightness);\ncommandToOperatorPart1.put(TURN_OFF, brightness -&gt; <span class=\"hljs-number\">0<\/span>);\n\nEnumMap&lt;Command, IntUnaryOperator&gt; commandToOperatorPart2 = <span class=\"hljs-keyword\">new<\/span> EnumMap&lt;&gt;(Command<span class=\"hljs-class\">.<span class=\"hljs-keyword\">class<\/span>)<\/span>;\ncommandToOperatorPart2.put(TURN_ON, brightness -&gt; brightness + <span class=\"hljs-number\">1<\/span>);\ncommandToOperatorPart2.put(TOGGLE, brightness -&gt; brightness + <span class=\"hljs-number\">2<\/span>);\ncommandToOperatorPart2.put(TURN_OFF, brightness -&gt; Math.max(brightness - <span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">0<\/span>));<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Und so wird eine solche Operation auf ein Feld im Array angewendet:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">IntUnaryOperator operator = commandToOperator.get(command);\nbrightness&#091;y]&#091;x] = operator.applyAsInt(brightness&#091;y]&#091;x]);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2015\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2015\/day6\" target=\"_blank\" rel=\"noopener\">Advent of Code 2015 Tag 6 L\u00f6sung<\/a><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"advent-of-code-2015-tag-7-loesung\">Advent of Code 2015 \u2013 Tag 7 L\u00f6sung<\/h2>\n\n\n\n<p>Das Dom\u00e4nenmodell f\u00fcr <a rel=\"noopener\" href=\"https:\/\/adventofcode.com\/2015\/day\/7\" target=\"_blank\">Tag 7<\/a> war ein bisschen schwierig zu gestalten. So sah es am Ende aus:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1640\" height=\"753\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2015-day7-classes.png\" alt=\"Advent of Code 2015 - Tag 7 - Dom\u00e4nenmodell Klassendiagramm\" class=\"wp-image-34595\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2015-day7-classes.png 1640w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2015-day7-classes-224x103.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2015-day7-classes-336x154.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2015-day7-classes-504x231.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2015-day7-classes-672x309.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2015-day7-classes-400x184.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2015-day7-classes-600x275.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2015-day7-classes-800x367.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2015-day7-classes-944x433.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2015-day7-classes-1200x551.png 1200w\" sizes=\"(max-width: 1640px) 100vw, 1640px\" \/><\/figure>\n\n\n\n<p>Wenn dieses Modell fertig verdrahtet ist, muss man nur noch die <code>Instruction<\/code> mit der <code>destinationWireId<\/code> finden und die Methode <code>getSignal()<\/code> f\u00fcr die <code>WireSource<\/code> dieser <code>Instruction<\/code> aufrufen.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2015\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2015\/day7\" target=\"_blank\" rel=\"noopener\">Advent of Code 2015 Tag 7 L\u00f6sung<\/a><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"advent-of-code-2015-tag-8-loesung\">Advent of Code 2015 \u2013 Tag 8 L\u00f6sung<\/h2>\n\n\n\n<p>An <a rel=\"noopener\" href=\"https:\/\/adventofcode.com\/2015\/day\/8\" target=\"_blank\">Tag 8<\/a> k\u00f6nnen wir uns ein wenig zur\u00fccklehnen. Die Escape- und Unescape-Methoden sind schnell implementiert.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2015\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2015\/day8\" target=\"_blank\" rel=\"noopener\">Advent of Code 2015 Tag 8 L\u00f6sung<\/a><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"advent-of-code-2015-tag-9-loesung\">Advent of Code 2015 \u2013 Tag 9 L\u00f6sung<\/h2>\n\n\n\n<p>An <a href=\"https:\/\/adventofcode.com\/2015\/day\/9\">Tag 9<\/a> m\u00fcssen wir das klassische \"<a rel=\"noopener\" href=\"https:\/\/de.wikipedia.org\/wiki\/Problem_des_Handlungsreisenden\" target=\"_blank\">Problem des Handlungsreisenden<\/a>\" (Travelling salesman problem) l\u00f6sen. Da wir nur ein paar St\u00e4dte haben, k\u00f6nnen wir eine einfache Tiefensuche durchf\u00fchren, um alle m\u00f6glichen Routen zu finden, und ihre minimale und maximale L\u00e4nge festhalten.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2015\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2015\/day9\" target=\"_blank\" rel=\"noopener\">Advent of Code 2015 Tag 9 L\u00f6sung<\/a><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"advent-of-code-2015-tag-10-loesung\">Advent of Code 2015 \u2013 Tag 10 L\u00f6sung<\/h2>\n\n\n\n<p>Ein Blick in den von <a href=\"https:\/\/adventofcode.com\/2015\/day\/10\" target=\"_blank\" rel=\"noopener\">Tag 10<\/a> verlinkten Wikipedia-Artikel l\u00e4sst mich vermuten, dass die die L\u00e4nge der Sequenz nach 40 Runden in der Gr\u00f6\u00dfenordnung von einer Million liegt. Das sollte jeder moderne Computer in wenigen Millisekunden simulieren k\u00f6nnen.<\/p>\n\n\n\n<p>Der Algorithmus ist schnell implementiert und l\u00f6st Teil eins in 5 Millisekunden. Mein Ergebnis ist 492.982 \u2013 liegt also in der angepeilten Gr\u00f6\u00dfenordnung.<\/p>\n\n\n\n<p>Auch f\u00fcr Teil zwei \u2013 50 Runden \u2013 braucht der Algorithmus nur 70 ms.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2015\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2015\/day10\" target=\"_blank\" rel=\"noopener\">Advent of Code 2015 Tag 10 L\u00f6sung<\/a><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"advent-of-code-2015-tag-11-loesung\">Advent of Code 2015 \u2013 Tag 11 L\u00f6sung<\/h2>\n\n\n\n<p>Der Algorithmus f\u00fcr <a href=\"https:\/\/adventofcode.com\/2015\/day\/11\" target=\"_blank\" rel=\"noopener\">Tag 11<\/a> schafft die Aufgabe auch ohne Optimierungen in unter 100 ms. Mit einigen Optimierungen l\u00e4sst sich diese Zeit stark reduzieren:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Der String wird zu Beginn in ein Character-Array umgewandelt; alle Operationen erfolgen auf diesem; die R\u00fcckumwandung in einen String erfolgt erst am Ende.<\/li>\n\n\n\n<li>Zu Beginn wird gepr\u00fcft, ob das Passwort einen der Buchstaben i, l, o enth\u00e4lt. Wenn ja, dann wird die entsprechende Stelle sofort erh\u00f6ht und alle Folgestellen auf 'a' gesetzt.<\/li>\n\n\n\n<li>Beim Hochz\u00e4hlen werden die Buchstaben i, l, o \u00fcbersprungen.<\/li>\n<\/ul>\n\n\n\n<p>Mit diesen Optimierungen findet der Algorithmus das n\u00e4chste Passwort in 0,016 ms!<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2015\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2015\/day11\" target=\"_blank\" rel=\"noopener\">Advent of Code 2015 Tag 11 L\u00f6sung<\/a><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"advent-of-code-2015-tag-12-loesung\">Advent of Code 2015 \u2013 Tag 12 L\u00f6sung<\/h2>\n\n\n\n<p>Teil eins von <a rel=\"noopener\" href=\"https:\/\/adventofcode.com\/2015\/day\/12\" target=\"_blank\">Tag 12<\/a> l\u00e4sst sich mit einem simplen regul\u00e4ren Ausdruck l\u00f6sen: \"-?\\d+\" (die Anf\u00fchrungszeichen geh\u00f6ren nicht dazu). Wir m\u00fcssen nur noch alle Treffer aufsummieren.<\/p>\n\n\n\n<p>Teil zwei l\u00e4sst sich mit einem JSON-Parser (z. B. <a rel=\"noopener\" href=\"https:\/\/github.com\/google\/gson\" target=\"_blank\">Gson<\/a>) und Rekursion gut l\u00f6sen.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2015\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2015\/day12\" target=\"_blank\" rel=\"noopener\">Advent of Code 2015 Tag 12 L\u00f6sung<\/a><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"advent-of-code-2015-tag-13-loesung\">Advent of Code 2015 \u2013 Tag 13 L\u00f6sung<\/h2>\n\n\n\n<p><a rel=\"noopener\" href=\"https:\/\/adventofcode.com\/2015\/day\/13\" target=\"_blank\">Tag 13<\/a> l\u00e4sst sich mit einer Tiefensuche \u00fcber alle m\u00f6glichen Sitzordnungen schnell l\u00f6sen.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2015\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2015\/day13\" target=\"_blank\" rel=\"noopener\">Advent of Code 2015 Tag 13 L\u00f6sung<\/a><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"advent-of-code-2015-tag-14-loesung\">Advent of Code 2015 \u2013 Tag 14 L\u00f6sung<\/h2>\n\n\n\n<p>Teil eins von <a href=\"https:\/\/adventofcode.com\/2015\/day\/14\" target=\"_blank\" rel=\"noopener\">Tag 14<\/a>, also die Entfernung, die ein Rentier nach einer bestimmten Zeit zur\u00fcckgelegt hat, l\u00e4sst sich leicht berechnen. <\/p>\n\n\n\n<p>Die gleiche Formel k\u00f6nnen wir f\u00fcr Teil zwei anwenden, mit ihr l\u00e4sst sich die Aufgabe in weniger als einer Millisekunde l\u00f6sen. Die <a href=\"\/de\/algorithmen\/o-notation-zeitkomplexitaet\/\">Zeitkomplexit\u00e4t<\/a> ist allerdings <em>O(n\u00b2 \u00b7 m)<\/em>, wobei <em>n<\/em> die simulierte Zeit ist und <em>m<\/em> die Anzahl der Rentiere. Die ben\u00f6tigte Zeit w\u00e4chst also im Quadrat mit der simulierten Zeit.<\/p>\n\n\n\n<p>Schneller geht es, wenn wir den Fortschritt der Rentiere Sekunde f\u00fcr Sekunde simulieren (so habe ich Teil zwei letztlich implementiert). So erreichen wir die deutlich bessere Zeitkomplexit\u00e4t <em>O(n \u00b7 m)<\/em>.<\/p>\n\n\n\n<p>GitHub: <a rel=\"noopener\" href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2015\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2015\/day14\" target=\"_blank\">Advent of Code 2015 Tag 14 L\u00f6sung<\/a><\/p>\n\n\n<div class=\"convertkit-form wp-block-convertkit-form\" style=\"\"><script async data-uid=\"5c918c0177\" src=\"https:\/\/happycoders.kit.com\/5c918c0177\/index.js\" data-jetpack-boost=\"ignore\" data-no-defer=\"1\" data-no-optimize=\"1\" nowprocket><\/script><\/div>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"advent-of-code-2015-tag-15-loesung\">Advent of Code 2015 \u2013 Tag 15 L\u00f6sung<\/h2>\n\n\n\n<p>Die Aufgabe von <a href=\"https:\/\/adventofcode.com\/2015\/day\/15\" target=\"_blank\" rel=\"noopener\">Tag 15<\/a> l\u00e4sst sich wieder mit einer Tiefensuche l\u00f6sen, \u00fcber die wir f\u00fcr alle m\u00f6glichen Kombinationen von Zutataten den jeweiligen Score berechnen. F\u00fcr Teil 2 habe ich einfach die Berechnung des Scores angepasst: Sobald ein Keks keine 500 Kalorien hat, wird dessen Score als 0 festgelegt.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2015\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2015\/day15\" target=\"_blank\" rel=\"noopener\">Advent of Code 2015 Tag 15 L\u00f6sung<\/a><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"advent-of-code-2015-tag-16-loesung\">Advent of Code 2015 \u2013 Tag 16 L\u00f6sung<\/h2>\n\n\n\n<p>Die L\u00f6sung f\u00fcr <a rel=\"noopener\" href=\"https:\/\/adventofcode.com\/2015\/day\/16\" target=\"_blank\">Tag 16<\/a> kann sehr elegant mit einem <code>Predicate&lt;Sue&gt;<\/code> als abstrakte Basisklasse f\u00fcr ein <a rel=\"noopener\" href=\"https:\/\/de.wikipedia.org\/wiki\/Strategie_(Entwurfsmuster)\" target=\"_blank\">Strategy Pattern<\/a> implementiert werden. So k\u00f6nnen f\u00fcr Teil eins und Teil zwei leicht zwei unterschiedliche Strategien implementiert werden.<\/p>\n\n\n\n<p>Da alle angeforderten Eigenschaften vorab bekannt sind, k\u00f6nnten sie in entsprechend benannten Variablen gespeichert werden, wobei eine nicht bekannte Eigenschaft als <code>null<\/code> oder <code>-1<\/code> gespeichert werden k\u00f6nnte. Eleganter und flexibler ist eine Liste von Tupeln von Eigenschaftname und -wert. Eine nicht bekannte Eigenschaft zeichnet sich dann durch Nichtvorhandensein in der Liste aus.<\/p>\n\n\n\n<p>GitHub: <a rel=\"noopener\" href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2015\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2015\/day16\" target=\"_blank\">Advent of Code 2015 Tag 16 L\u00f6sung<\/a><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"advent-of-code-2015-tag-17-loesung\">Advent of Code 2015 \u2013 Tag 17 L\u00f6sung<\/h2>\n\n\n\n<p>Die Aufgabe von <a href=\"https:\/\/adventofcode.com\/2015\/day\/17\" target=\"_blank\" rel=\"noopener\">Tag 17<\/a> kann per Tiefensuche gel\u00f6st werden. Bei 20 Containern gibt es genau 2<sup>20<\/sup> \u2013 also etwas mehr als eine Million \u2013 verschiedene Kombinationen. Es dauert etwa 3,2 Millisekunden, diese alle durchzuprobieren.<\/p>\n\n\n\n<p>Doch es gibt eine Menge Optimierungspotential:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Ist bei einer unvollst\u00e4ndigen Kombination das Zielvolumen <em>exakt erreicht<\/em>, haben wir eine Kombination gefunden und brauchen den Pfad nicht weiter zu verfolgen \u2013 die restlichen Container werden nicht ben\u00f6tigt. <\/li>\n\n\n\n<li>Ist bei einer unvollst\u00e4ndigen Kombination das Zielvolumen <em>\u00fcberschritten<\/em>, k\u00f6nnen wir den aktuellen Pfad abbrechen.<\/li>\n\n\n\n<li>Wenn die aktuelle Summe plus das kleinste Element der restlichen Elemente die Zielsumme <em>\u00fcberschreitet<\/em>, k\u00f6nnen wir den Pfad ebenfalls abbrechen. Das kleinste Element der letzten x Elemente k\u00f6nnen wir vorab f\u00fcr jede Position innerhalb der Containerfolge bestimmen.<\/li>\n\n\n\n<li>Wenn die Summe der Volumen der restlichen Container <em>nicht ausreicht<\/em>, um die noch ben\u00f6tigte Restsumme zu erreichen, k\u00f6nnen wir den Pfad ebenfalls abbrechen. Die Restsummen der letzten x Elemente k\u00f6nnen wir ebenfalls vorab berechnen.<\/li>\n<\/ol>\n\n\n\n<p>Mit diesen Optimierungen dauert es nur noch 0,15 ms, alle passenden Kombinationen zu finden. Die Optomierungen haben den Algorithmus also um mehr als Faktor 20 beschleunigt.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2015\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2015\/day17\" target=\"_blank\" rel=\"noopener\">Advent of Code 2015 Tag 17 L\u00f6sung<\/a><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"advent-of-code-2015-tag-18-loesung\">Advent of Code 2015 \u2013 Tag 18 L\u00f6sung<\/h2>\n\n\n\n<p>An <a rel=\"noopener\" href=\"https:\/\/adventofcode.com\/2015\/day\/18\" target=\"_blank\">Tag 18<\/a> m\u00fcssen wir <a rel=\"noopener\" href=\"https:\/\/de.wikipedia.org\/wiki\/Conways_Spiel_des_Lebens\" target=\"_blank\">Conway's Game of Life<\/a> implementieren. Da unser Grid begrenzt ist und relativ viele lebende Zellen enth\u00e4lt, eignet sich ein zweidimensionalen boolean-Array. (Bei unbegrenzten Feldern oder wenigen lebenden Zellen kann man auch nur die lebenden Zellen in einer Collection speichern.)<\/p>\n\n\n\n<p>Die Anpassungen f\u00fcr Teil zwei \u2013 die vier Ecken immer eingeschaltet zu lassen \u2013 sind schnell erledigt.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2015\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2015\/day18\" target=\"_blank\" rel=\"noopener\">Advent of Code 2015 Tag 18 L\u00f6sung<\/a><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"advent-of-code-2015-tag-19-loesung\">Advent of Code 2015 \u2013 Tag 19 L\u00f6sung<\/h2>\n\n\n\n<p>Teil eins der Aufgabe von <a rel=\"noopener\" href=\"https:\/\/adventofcode.com\/2015\/day\/19\" target=\"_blank\">Tag 19<\/a> ist schnell gel\u00f6st, indem wir das Molek\u00fcl Atom f\u00fcr Atom durchgehen, die Atome jeweils durch all ihre Ersetzungen ersetzen und die entstandenen Molek\u00fcle in einem Set speichern. Dessen Gr\u00f6\u00dfe ist am Ende die L\u00f6sung.<\/p>\n\n\n\n<p>Teil zwei ist deutlich komplexer. Ich habe mehrere Brute-Force-L\u00f6sungen durchprobiert: Breitensuche vorw\u00e4rts, Tiefensuche vorw\u00e4rts, Breitensuche r\u00fcckw\u00e4rts, Tiefensuche r\u00fcckw\u00e4rts. Der einzige Weg, der in akzeptabler Zeit \u00fcberhaupt zu <em>einer<\/em> L\u00f6sung f\u00fchrte, war eine Tiefensuche r\u00fcckw\u00e4rts (d. h. der Versuch, vom Zielmolek\u00fcl durch umgekehrtes Anwenden der Ersetzungsregeln zum Elektron zu gelangen) \u2013 mit Priorisierung der Ersetzungsregeln absteigend nach L\u00e4nge des Zielmolek\u00fcls. Auf diese Weise wurde nach wenigen Sekunden zumindest <em>ein<\/em> Ergebnis gefunden. Doch es h\u00e4tte mehrere Tage gedauert, die Tiefensuche bis zum Ende laufen zu lassen.<\/p>\n\n\n\n<p>Auf eine bessere L\u00f6sung brachte mich erst ein Blick in das entsprechende <a rel=\"noopener\" href=\"https:\/\/www.reddit.com\/r\/adventofcode\/comments\/3xflz8\/day_19_solutions\/\" target=\"_blank\">Reddit-Topic<\/a>:<\/p>\n\n\n\n<p>Wenn wir uns die Ersetzungsregeln genauer anschauen, f\u00e4llt auf, dass diese einem der folgenden Muster zuzuordnen sind, wobei X f\u00fcr ein beliebiges Atom steht:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>e =&gt; XX<\/li>\n\n\n\n<li>X =&gt; XX<\/li>\n\n\n\n<li>X =&gt; XRnXAr<\/li>\n\n\n\n<li>X =&gt; XRnXYXAr<\/li>\n\n\n\n<li>X =&gt; XRnXYXYXAr<\/li>\n<\/ul>\n\n\n\n<p>Rn, Y und Ar stehen nur auf der rechten Seite der Regeln. Wenn wir sie durch '(', ',' und ')' ersetzen, sehen die Regeln wie folgt aus:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>e =&gt; XX<\/li>\n\n\n\n<li>X =&gt; XX<\/li>\n\n\n\n<li>X =&gt; X(X)<\/li>\n\n\n\n<li>X =&gt; X(X,X)<\/li>\n\n\n\n<li>X =&gt; X(X,X,X)<\/li>\n<\/ul>\n\n\n\n<p>Auf der linken Seite steht immer genau <em>ein<\/em> Atom. Und jedes Zielmuster hat eine spezifische L\u00e4nge. Die Anwendung eines bestimmten Musters verl\u00e4ngert also das Molekul um eine bestimmte Anzahl Atome:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>e =&gt; XX \u2013 von 1 auf 2, also +1<\/li>\n\n\n\n<li>X =&gt; XX \u2013 von 1 auf 2, also +1<\/li>\n\n\n\n<li>X =&gt; X(X) \u2013 von 1 auf 4, also +3<\/li>\n\n\n\n<li>X =&gt; X(X,X) \u2013 von 1 auf 6, also +5<\/li>\n\n\n\n<li>X =&gt; X(X,X,X) \u2013 von 1 auf 8, also +7<\/li>\n<\/ul>\n\n\n\n<p>Wenn wir keine Klammern und Kommas h\u00e4tten, w\u00e4re die Anzahl der Schritte, um von einem Atom (\"e\") zu <em>n<\/em> Atomen zu gelangen genau <em>n-1<\/em>, da wir das Molek\u00fcl in jedem Schritt um ein Atom verl\u00e4ngern.<\/p>\n\n\n\n<p>Beispiel: Um von \"e\" zu \"XXXX\" (n = 4) zu gelangen, br\u00e4uchten wir 4-1 = 3 Schritte:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>e \u2192 XX<\/li>\n\n\n\n<li>XX \u2192 XXX<\/li>\n\n\n\n<li>XXX \u2192 XXXX<\/li>\n<\/ol>\n\n\n\n<p>Wenn wir zus\u00e4tzlich die Regel X =&gt; X(X) beachten, verl\u00e4ngert sich das Molek\u00fcl zus\u00e4tzlich um die \"Klammer-Atome\". Um aus dem Zielmolek\u00fcl die Anzahl der Schritte zu berechnen, k\u00f6nnen wir diese \"Klammer-Atome\" einfach wieder abziehen. Wir br\u00e4uchten also <em>n-1-(Anzahl der Klammern)<\/em> Schritte.<\/p>\n\n\n\n<p>Beispiel: Um von \"e\" zu \"X(X)X(X)\" (n = 8) zu gelangen, br\u00e4uchten wir 8-1-4 = 3 Schritte:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>e \u2192 XX<\/li>\n\n\n\n<li>XX \u2192 X(X)X (erstes X ersetzt)<\/li>\n\n\n\n<li>X(X)X \u2192 X(X)X(X) (letztes X ersetzt)<\/li>\n<\/ol>\n\n\n\n<p>Wenn wir nun auch noch die Regeln X =&gt; X(X,X) und X =&gt; X(X,X,X) beachten, verl\u00e4ngert sich das Molek\u00fcl mit jedem Komma um <em>zwei<\/em> weitere Atome: das Komma-Atom selbst und das auf das Komma folgende Atom. F\u00fcr jedes Komma m\u00fcssen wir also <em>zwei<\/em> Atome abziehen. Als Gesamtformel ergibt sich:<\/p>\n\n\n\n<p class=\"has-text-align-center\"><em>Anzahl Schritte = Anzahl Zielatome - 1 - Anzahl Klammern - 2 \u00d7 Anzahl Kommas<\/em><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><\/li>\n<\/ul>\n\n\n\n<p>Beispiel: Um von \"e\" zu \"X(X,X(X,X,X))X\" (n = 14) zu gelangen, br\u00e4uchten wir 14-1-4-2\u00d74 = 3 Schritte:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>e \u2192 XX<\/li>\n\n\n\n<li>XX \u2192 X(X,X)X (erstes X ersetzt)<\/li>\n\n\n\n<li>X(X,X)X \u2192 X(X,X(X,X,X))X (zweites X innerhalb der Klammern ersetzt)<\/li>\n<\/ol>\n\n\n\n<p>Mittels dieser Formel ist auch Teil 2 der Aufgabe schnell gel\u00f6st.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2015\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2015\/day19\" target=\"_blank\" rel=\"noopener\">Advent of Code 2015 Tag 19 L\u00f6sung<\/a><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"advent-of-code-2015-tag-20-loesung\">Advent of Code 2015 \u2013 Tag 20 L\u00f6sung<\/h2>\n\n\n\n<p>Teilaufgabe eins von <a href=\"https:\/\/adventofcode.com\/2015\/day\/20\" target=\"_blank\" rel=\"noopener\">Tag 20<\/a> k\u00f6nnen wir auch wie folgt formulieren:<\/p>\n\n\n\n<p>Gesucht ist das kleinste <em>n<\/em>, f\u00fcr das die <a rel=\"noopener\" href=\"https:\/\/de.wikipedia.org\/wiki\/Teilerfunktion\" target=\"_blank\">Teilerfunktion<\/a> <em>\u03c3<sub>1<\/sub>(n) &gt;= p<\/em> ist (mit <em>p = Puzzle Input \/ 10<\/em>).<\/p>\n\n\n\n<p>Diese Funktion ist schnell implementiert und f\u00fcr Teilaufgabe zwei schnell mit ein paar zus\u00e4tzlichen Parametern adaptiert.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2015\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2015\/day20\" target=\"_blank\" rel=\"noopener\">Advent of Code 2015 Tag 20 L\u00f6sung<\/a><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"advent-of-code-2015-tag-21-loesung\">Advent of Code 2015 \u2013 Tag 21 L\u00f6sung<\/h2>\n\n\n\n<p>F\u00fcr <a href=\"https:\/\/adventofcode.com\/2015\/day\/21\">Tag 21<\/a> habe ich einen Simulator geschrieben, der das Spiel mit gegebenen Parametern (\"hit points\", \"damage\", \"armor\" pro Spieler) durchspielt und den Sieger zur\u00fcckgibt. Mit dem Simulator k\u00f6nnen alle erlaubten Kombinationen von Waffe, Verteidigung und Ringen (es gibt nur 1.080 solcher Kombinationen) durchgespielt werden.<\/p>\n\n\n\n<p>Wenn wir vorab die m\u00f6glichen Kombinationen nach Gesamtkosten sortieren (aufsteigend f\u00fcr Teilaufgabe eins und absteigend f\u00fcr Teilaufgabe zwei), dann k\u00f6nnen wir die Simulationen abbrechen, sobald die erste Kombination gefunden wurde, bei der der Spieler (bei Teilaufgabe eins) bzw. der Boss (bei Teilaufgabe zwei) gewinnt.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2015\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2015\/day21\" target=\"_blank\" rel=\"noopener\">Advent of Code 2015 Tag 21 L\u00f6sung<\/a><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"advent-of-code-2015-tag-22-loesung\">Advent of Code 2015 \u2013 Tag 22 L\u00f6sung<\/h2>\n\n\n\n<p>Die Aufgabe von <a rel=\"noopener\" href=\"https:\/\/adventofcode.com\/2015\/day\/22\" target=\"_blank\">Tag 22<\/a> kann gut mit einer Breitensuche gel\u00f6st werden, da es pro Spielrunde nicht allzu viele M\u00f6glichkeiten gibt (die bezahlbaren und aktuell nicht aktiven Zauberspr\u00fcche).<\/p>\n\n\n\n<p>Ich habe die Breitensuche mit einer <a href=\"\/de\/algorithmen\/priorityqueue-java\/\">PriorityQueue<\/a> implementiert, die die erreichten Spielst\u00e4nde nach Gesamtkosten aufsteigend sortiert.<\/p>\n\n\n\n<p>Wenn eine L\u00f6sung gefunden wurde und wir einen Zauberspruch \u00fcberspringen mussten (weil dieser nicht bezahlbar war oder bereits aktiv ist), k\u00f6nnten wir noch eine bessere L\u00f6sung finden \u2013 von einem weiter hinten in der Queue liegenden Spielstand aus mit gleich viel oder h\u00f6heren Kosten kombiniert mit einem g\u00fcnstigeren Zauberspruch.<\/p>\n\n\n\n<p>Wir brauchen die Suche jedoch nur solange fortzusetzen, bis die Kosten des Spielstands in der Queue plus die Kosten des g\u00fcnstigsten Zauberspruchs gleich oder h\u00f6her als die Kosten der bisher besten L\u00f6sung sind. Alle weiteren Spielst\u00e4nde in der Queue w\u00fcrden zu einer teureren L\u00f6sung f\u00fchren.<\/p>\n\n\n\n<p>Die Anpassungen f\u00fcr Teil zwei sind minimal.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2015\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2015\/day22\" target=\"_blank\" rel=\"noopener\">Advent of Code 2015 Tag 22 L\u00f6sung<\/a><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"advent-of-code-2015-tag-23-loesung\">Advent of Code 2015 \u2013 Tag 23 L\u00f6sung<\/h2>\n\n\n\n<p>An <a href=\"https:\/\/adventofcode.com\/2015\/day\/23\" target=\"_blank\" rel=\"noopener\">Tag 23<\/a> m\u00fcssen wir eine CPU mit zwei Registern und sechs Instruktionen emulieren. Dies ist recht einfach, und auch die \u00c4nderungen f\u00fcr Teil zwei sind schnell gemacht.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2015\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2015\/day23\" target=\"_blank\" rel=\"noopener\">Advent of Code 2015 Tag 23 L\u00f6sung<\/a><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"advent-of-code-2015-tag-24-loesung\">Advent of Code 2015 \u2013 Tag 24 L\u00f6sung<\/h2>\n\n\n\n<p>F\u00fcr die Aufgabe von <a rel=\"noopener\" href=\"https:\/\/adventofcode.com\/2015\/day\/24\" target=\"_blank\">Tag 24<\/a> eignet sich wieder eine Tiefensuche \u00fcber die m\u00f6glichen Paket-Kombinationen. Dabei m\u00fcssen wir nur f\u00fcr das erste Abteil eine optimale L\u00f6sung finden. Wannimmer wir f\u00fcr das erste Abteil eine L\u00f6sung gefunden haben und diese besser ist als die bisher beste L\u00f6sung, m\u00fcssen wir nur pr\u00fcfen, ob es f\u00fcr die restlichen Abteile <em>wenigstens eine<\/em> L\u00f6sung gibt.<\/p>\n\n\n\n<p>Sobald die Tiefensuche f\u00fcr das erste Abteil zu mehr Paketen f\u00fchrt als die bisher beste L\u00f6sung, kann der entsprechende Pfad abgebrochen werden.<\/p>\n\n\n\n<p>Meine Implementierung findet eine L\u00f6sung f\u00fcr Teil eins in 1,5 s und f\u00fcr Teil zwei in 40 ms.<\/p>\n\n\n\n<p>GitHub:&nbsp;<a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2015\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2015\/day24\" target=\"_blank\" rel=\"noopener\">Advent of Code 2015 Tag 24 L\u00f6sung<\/a><\/p>\n\n\n\n<p><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group has-global-padding\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"advent-of-code-2015-tag-25-loesung\">Advent of Code 2015 \u2013 Tag 25 L\u00f6sung<\/h2>\n\n\n\n<p>An <a rel=\"noopener\" href=\"https:\/\/adventofcode.com\/2015\/day\/25\" target=\"_blank\">Tag 25<\/a> von Advent of Code 2015 m\u00fcssen wir einen Code-Generator implementieren. Die Beschreibung der Aufgabe ist lang, die L\u00f6sung erfordert aber nur wenige Zeilen Code:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">solve<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> row, <span class=\"hljs-keyword\">int<\/span> col)<\/span> <\/span>{\n  <span class=\"hljs-keyword\">int<\/span> elementIndex = calculateElementIndex(row - <span class=\"hljs-number\">1<\/span>, col - <span class=\"hljs-number\">1<\/span>);\n  <span class=\"hljs-keyword\">return<\/span> getCode(elementIndex);\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">calculateElementIndex<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> row, <span class=\"hljs-keyword\">int<\/span> col)<\/span> <\/span>{\n  <span class=\"hljs-keyword\">int<\/span> diagonalNumber = row + col;\n  <span class=\"hljs-keyword\">int<\/span> diagonalStart = diagonalNumber * (diagonalNumber + <span class=\"hljs-number\">1<\/span>) \/ <span class=\"hljs-number\">2<\/span>;\n  <span class=\"hljs-keyword\">return<\/span> diagonalStart + col;\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">getCode<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> iterations)<\/span> <\/span>{\n  <span class=\"hljs-keyword\">int<\/span> code = <span class=\"hljs-number\">20_151_125<\/span>;\n  <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">int<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; iterations; i++) {\n    code = (<span class=\"hljs-keyword\">int<\/span>) (code * <span class=\"hljs-number\">252_533L<\/span> % <span class=\"hljs-number\">33_554_393<\/span>);\n  }\n  <span class=\"hljs-keyword\">return<\/span> code;\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>GitHub:&nbsp;<a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2015\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2015\/day25\" target=\"_blank\" rel=\"noopener\">Advent of Code 2015 Tag 25 L\u00f6sung<\/a><\/p>\n\n\n\n<p>Wenn dir der Artikel gefallen hat, teile ihn gerne \u00fcber einen der Share-Buttons am Ende. M\u00f6chtest du per E-Mail informiert werden, wenn ich einen neuen Artikel ver\u00f6ffentliche? Dann <a href=\"#\" data-formkit-toggle=\"d8ee997126\">klicke hier<\/a>, um dich in den HappyCoders-E-Mail-Verteiler einzutragen<\/p>\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Hier findest Du alle L\u00f6sungen zu Advent of Code 2015. Alle Aufgaben sind objektorientiert und testgetrieben in Java implementiert.<\/p>\n","protected":false},"author":1,"featured_media":34616,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_titles_title":"","_seopress_titles_desc":"Hier findest Du alle L\u00f6sungen zu Advent of Code 2015. Alle Aufgaben sind objektorientiert und testgetrieben in Java implementiert.","_seopress_robots_index":"","_seopress_robots_follow":"","_seopress_robots_imageindex":"","_seopress_robots_snippet":"","_seopress_robots_primary_cat":"","_seopress_robots_breadcrumbs":"","_seopress_robots_freeze_modified_date":"","_seopress_robots_custom_modified_date":"","_seopress_robots_canonical":"","_seopress_social_fb_title":"","_seopress_social_fb_desc":"","_seopress_social_fb_img":"","_seopress_social_fb_img_attachment_id":0,"_seopress_social_fb_img_width":0,"_seopress_social_fb_img_height":0,"_seopress_social_twitter_title":"","_seopress_social_twitter_desc":"","_seopress_social_twitter_img":"","_seopress_social_twitter_img_attachment_id":0,"_seopress_social_twitter_img_width":0,"_seopress_social_twitter_img_height":0,"_seopress_redirections_value":"","_seopress_redirections_enabled":"","_seopress_redirections_enabled_regex":"","_seopress_redirections_logged_status":"","_seopress_redirections_param":"","_seopress_redirections_type":0,"_seopress_analysis_target_kw":"advent of code 2015","_seopress_news_disabled":"","_seopress_video_disabled":"","_seopress_video":[],"_seopress_pro_schemas_manual":[],"_seopress_pro_rich_snippets_disable_all":"","_seopress_pro_rich_snippets_disable":[],"_seopress_pro_schemas":[],"_uag_custom_page_level_css":"","_wp_convertkit_post_meta":{"form":"-1","landing_page":"","tag":"0","restrict_content":"0"},"_metis_text_type":"standard","_metis_text_length":16700,"_post_count":0,"footnotes":""},"categories":[127],"tags":[208],"class_list":["post-34590","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-algorithmen","tag-advent-of-code-de"],"uagb_featured_image_src":{"full":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2015-solutions.jpg",1770,986,false],"thumbnail":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2015-solutions.jpg",150,84,false],"medium":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2015-solutions.jpg",300,167,false],"medium_large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2015-solutions.jpg",768,428,false],"large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2015-solutions.jpg",1024,570,false],"feature_thumb_224":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2015-solutions-224x125.jpg",224,125,true],"feature_thumb_336":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2015-solutions-336x187.jpg",336,187,true],"feature_thumb_504":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2015-solutions-504x281.jpg",504,281,true],"feature_thumb_672":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2015-solutions-672x374.jpg",672,374,true],"half_400":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2015-solutions-400x223.jpg",400,223,true],"half_600":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2015-solutions-600x334.jpg",600,334,true],"full_800":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2015-solutions-800x446.jpg",800,446,true],"full_944":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2015-solutions-944x526.jpg",944,526,true],"full_1200":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2015-solutions-1200x668.jpg",1200,668,true],"wide_1180":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2015-solutions-1180x490.jpg",1180,490,true],"wide_1770":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2015-solutions-1770x735.jpg",1770,735,true],"1536x1536":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2015-solutions.jpg",1536,856,false],"2048x2048":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2015-solutions.jpg",1770,986,false]},"uagb_author_info":{"display_name":"Sven Woltmann","author_link":"https:\/\/www.happycoders.eu\/de\/author\/sven\/"},"uagb_comment_info":0,"uagb_excerpt":"Hier findest Du alle L\u00f6sungen zu Advent of Code 2015. Alle Aufgaben sind objektorientiert und testgetrieben in Java implementiert.","public_identification_id":"93eaa7e83f5e4493b95da7c23d8f336a","private_identification_id":"2c7bd497c9014f69bfce8979c5019ad2","_links":{"self":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/34590","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/comments?post=34590"}],"version-history":[{"count":10,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/34590\/revisions"}],"predecessor-version":[{"id":42176,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/34590\/revisions\/42176"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media\/34616"}],"wp:attachment":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media?parent=34590"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/categories?post=34590"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/tags?post=34590"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}