{"id":34496,"date":"2022-12-01T08:00:00","date_gmt":"2022-12-01T07:00:00","guid":{"rendered":"https:\/\/www.happycoders.eu\/?p=34496"},"modified":"2024-12-02T12:00:03","modified_gmt":"2024-12-02T11:00:03","slug":"advent-of-code-2022","status":"publish","type":"post","link":"https:\/\/www.happycoders.eu\/de\/algorithmen\/advent-of-code-2022\/","title":{"rendered":"Advent of Code 2022 \u2013 Objektorientierte L\u00f6sungen in Java"},"content":{"rendered":"\n<p>Ungeduldig? Dann geht es hier ohne Umwege zu meinen <a rel=\"noopener\" href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2022\" target=\"_blank\">L\u00f6sungen f\u00fcr Advent of Code 2022<\/a> :-)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"was-ist-advent-of-code\">Was ist Advent of Code?<\/h2>\n\n\n\n<p><a href=\"https:\/\/adventofcode.com\/\">Advent of Code<\/a> ist eine j\u00e4hrliche, vorweihnachtliche Serie von Programmieraufgaben, die als Adventskalender verpackt sind. Hinter dessen T\u00fcren verbergen sich t\u00e4glich neue \u2013 von Tag zu Tag schwierigere \u2013 Herausforderungen.<\/p>\n\n\n\n<p>Die Aufgaben k\u00f6nnen in einer beliebigen Programmiersprache gel\u00f6st werden und bestehen jeweils aus zwei Teilaufgaben.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"wie-schwer-ist-advent-of-code\">Wie schwer ist Advent of Code?<\/h2>\n\n\n\n<p>Die erste Teilaufgabe ist meist relativ schnell gel\u00f6st.<\/p>\n\n\n\n<p>Bei der zweiten Aufgabe wird die Gr\u00f6\u00dfenordnung des Problems drastisch angehoben. Das f\u00fchrt in der Regel dazu, dass die L\u00f6sung noch einmal \u00fcberarbeitet werden muss, da der intuitiv implementierte Algorithmus oft eine zu hohe <a href=\"\/de\/algorithmen\/o-notation-zeitkomplexitaet\/\">Komplexit\u00e4tsklasse<\/a> aufweist und Stunden, Tage oder gar Monate f\u00fcr die L\u00f6sung der Aufgabe brauchen w\u00fcrde.<\/p>\n\n\n\n<p>Kurz nach der Ver\u00f6ffentlichung eines neuen Advent-of-Code-R\u00e4tsels findet man bereits die ersten L\u00f6sungen <a href=\"https:\/\/www.reddit.com\/r\/adventofcode\/\" target=\"_blank\" rel=\"noopener\">im entsprechenden Reddit<\/a>. Diese bestehen meist aus prozeduralem Spaghetti-Code, der nicht besonders gut lesbar, geschweige denn wartbar, ist.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"meine-advent-of-code-antworten-2022\">Meine Advent of Code Antworten 2022<\/h2>\n\n\n\n<p>Ich habe mir daher die M\u00fche gemacht, jede Aufgabe wirklich objektorientiert und testgetrieben in Java zu implementieren, so dass eine L\u00f6sung aus kleinen, verst\u00e4ndlichen, miteinander interagierenden Objekten entsteht.<\/p>\n\n\n\n<p>Dieser Ansatz f\u00fchrt in der Regel auch dazu, dass sich die Optimierungen, die f\u00fcr Teilaufgabe zwei notwendig sind, auf einen kleinen Ausschnitt des Codes beschr\u00e4nken \u2013 oft auf eine einzige Klasse.<\/p>\n\n\n\n<p>Meine L\u00f6sungen findest du in diesem GitHub-Projekt: <a rel=\"noopener\" href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2022\" target=\"_blank\">Advent of Code 2022 \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-2022-tag-1-loesung\">Advent of Code 2022 \u2013 Tag 1 L\u00f6sung<\/h2>\n\n\n\n<p>Die Aufgaben von <a href=\"https:\/\/adventofcode.com\/2022\/day\/1\" target=\"_blank\" rel=\"noopener\">Tag 1<\/a> lassen sich elegant mit Java Streams l\u00f6sen. Die folgende Methode liefert einen Stream der Kaloriensummen f\u00fcr jeden Block:<\/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\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">static<\/span> IntStream <span class=\"hljs-title\">getCaloriesSums<\/span><span class=\"hljs-params\">(String input)<\/span> <\/span>{\n  String&#091;] blocks = input.split(<span class=\"hljs-string\">\"\\\\n\\\\n\"<\/span>);\n  <span class=\"hljs-keyword\">return<\/span> Arrays.stream(blocks)\n      .mapToInt(block -&gt; block.lines().mapToInt(Integer::parseInt).sum());\n}<\/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>Den gr\u00f6\u00dften Block ermitteln wir mittels <code>max()<\/code>:<\/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\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">calculateMaxCalories<\/span><span class=\"hljs-params\">(String input)<\/span> <\/span>{\n  IntStream caloriesSums = getCaloriesSums(input);\n  <span class=\"hljs-keyword\">return<\/span> caloriesSums.max().orElse(<span class=\"hljs-number\">0<\/span>);\n}<\/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>F\u00fcr die Summe der drei gr\u00f6\u00dften Blocks m\u00fcssen wir den Stream absteigend sortieren. Dazu ist leider ein Boxing und ein Unboxing erforderlich, da sich ein <code>IntStream<\/code> nur aufsteigend sortieren l\u00e4sst:<\/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\">calculateSumOfTopThreeCalories<\/span><span class=\"hljs-params\">(String input)<\/span> <\/span>{\n  IntStream caloriesSums = getCaloriesSums(input);\n  <span class=\"hljs-keyword\">return<\/span> caloriesSums\n      .boxed()\n      .sorted(Comparator.reverseOrder())\n      .mapToInt(Integer::valueOf)\n      .limit(<span class=\"hljs-number\">3<\/span>)\n      .sum();\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: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2022\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2022\/day1\" target=\"_blank\" rel=\"noopener\">Advent of Code 2022 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-2022-tag-2-loesung\">Advent of Code 2022 \u2013 Tag 2 L\u00f6sung<\/h2>\n\n\n\n<p>An <a rel=\"noopener\" href=\"https:\/\/adventofcode.com\/2022\/day\/2\" target=\"_blank\">Tag 2<\/a> m\u00fcssen wir einen Simulator f\u00fcr <a rel=\"noopener\" href=\"https:\/\/de.wikipedia.org\/wiki\/Schere,_Stein,_Papier\" target=\"_blank\">Schere-Stein-Papier<\/a> schreiben. Teilaufgabe zwei, bei der wir vom Spielergebnis auf den Zug r\u00fcckschlie\u00dfen m\u00fcssen, habe ich durch ausprobieren gel\u00f6st \u2013 es gibt ja nur drei m\u00f6gliche Z\u00fcge. Eleganter w\u00e4re es nat\u00fcrlich, den eigenen Zug aus dem Zug dem Gegners und dem gew\u00fcnschten Ergebnis zu berechnen.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2022\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2022\/day2\" target=\"_blank\" rel=\"noopener\">Advent of Code 2022 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-2022-tag-3-loesung\">Advent of Code 2022 \u2013 Tag 3 L\u00f6sung<\/h2>\n\n\n\n<p>An <a href=\"https:\/\/adventofcode.com\/2022\/day\/3\" target=\"_blank\" rel=\"noopener\">Tag 3<\/a> m\u00fcssen wir einen Algorithmus implementieren, der aus mehreren Listen von Gegenst\u00e4nden (aus zwei F\u00e4chern eines Rucksacks bzw. aus drei Rucks\u00e4cken) diejenigen herausfiltert, die mehrfach vorkommen.<\/p>\n\n\n\n<p>Wenn wir dabei jedes Element einer Liste mit allen Elementen der zwei anderen Listen vergleichen, k\u00e4men wir auf eine <a href=\"\/de\/algorithmen\/o-notation-zeitkomplexitaet\/\">Zeitkomplexit\u00e4t<\/a> von <em>O(n\u00b2)<\/em>.<\/p>\n\n\n\n<p>Da die Menge der m\u00f6glichen Elemente (A-Z und a-z) sehr klein ist, k\u00f6nnen wir stattdessen ein Array mit Bitsets f\u00fcr jedes m\u00f6gliche Element anlegen, dann \u00fcber jede Liste iterieren und f\u00fcr jedes enthaltene Element ein Bit f\u00fcr die entsprechende Liste setzen und zuletzt pr\u00fcfen, f\u00fcr welche Elemente alle Bits gesetzt sind. Dieser Algorithmus hat die deutlich bessere Zeitkomplexit\u00e4t <em>O(n)<\/em>.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2022\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2022\/day3\" target=\"_blank\" rel=\"noopener\">Advent of Code 2022 Tag 3 L\u00f6sung<\/a><\/p>\n<\/div><\/div>\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\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-2022-tag-4-loesung\">Advent of Code 2022 \u2013 Tag 4 L\u00f6sung<\/h2>\n\n\n\n<p>F\u00fcr <a rel=\"noopener\" href=\"https:\/\/adventofcode.com\/2022\/day\/4\" target=\"_blank\">Tag 4<\/a> habe ich eine Klasse <code>SectionAssignment<\/code> implementiert. Diese speichert den Start- und Endpunkt einer Sektion und bietet Methoden, um zu pr\u00fcfen, ob eine Sektion eine andere umschlie\u00dft bzw. ob zwei Sektionen teilweise \u00fcberlappen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-function\">record <span class=\"hljs-title\">SectionAssignment<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> start, <span class=\"hljs-keyword\">int<\/span> end)<\/span> <\/span>{\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">boolean<\/span> <span class=\"hljs-title\">fullyContains<\/span><span class=\"hljs-params\">(SectionAssignment other)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">return<\/span> start &lt;= other.start &amp;&amp; end &gt;= other.end;\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">boolean<\/span> <span class=\"hljs-title\">overlaps<\/span><span class=\"hljs-params\">(SectionAssignment other)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">return<\/span> start &gt;= other.start &amp;&amp; start &lt;= other.end\n        || end &gt;= other.start &amp;&amp; end &lt;= other.end\n        || other.start &gt;= start &amp;&amp; other.start &lt;= end\n        || other.end &gt;= start &amp;&amp; other.end &lt;= end;\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><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>Mit dieser Klasse sind beide Teilaufgaben schnell gel\u00f6st.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2022\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2022\/day4\" target=\"_blank\" rel=\"noopener\">Advent of Code 2022 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-2022-tag-5-loesung\">Advent of Code 2022 \u2013 Tag 5 L\u00f6sung<\/h2>\n\n\n\n<p>An <a rel=\"noopener\" href=\"https:\/\/adventofcode.com\/2022\/day\/5\" target=\"_blank\">Tag 5<\/a> habe ich das <a rel=\"noopener\" href=\"https:\/\/en.wikipedia.org\/wiki\/Strategy_pattern\" target=\"_blank\">Strategy Pattern<\/a> angewendet, um die zwei Arten von Kr\u00e4nen zu implementieren und austauschbar zu machen:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" width=\"1600\" height=\"416\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/01\/advent-of-code-2022-day5-classes.v2.png\" alt=\"Advent of Code 2022 Tag 5 Klassendiagramm\" class=\"wp-image-34688\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/01\/advent-of-code-2022-day5-classes.v2.png 1600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/01\/advent-of-code-2022-day5-classes.v2-224x58.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/01\/advent-of-code-2022-day5-classes.v2-336x87.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/01\/advent-of-code-2022-day5-classes.v2-504x131.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/01\/advent-of-code-2022-day5-classes.v2-672x175.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/01\/advent-of-code-2022-day5-classes.v2-400x104.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/01\/advent-of-code-2022-day5-classes.v2-600x156.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/01\/advent-of-code-2022-day5-classes.v2-800x208.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/01\/advent-of-code-2022-day5-classes.v2-944x245.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/01\/advent-of-code-2022-day5-classes.v2-1200x312.png 1200w\" sizes=\"(max-width: 1600px) 100vw, 1600px\" \/><\/figure>\n<\/div>\n\n\n<p>Die <code>move()<\/code>-Methoden sehen wie folgt aus. Der CrateMover 9000 nimmt \u2013 nach und nach \u2013 die gew\u00fcnschte Anzahl von Kisten von einem Stapel und stellt sie auf den anderen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">CrateMover9000<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title\">CrateMover<\/span> <\/span>{\n\n  <span class=\"hljs-meta\">@Override<\/span>\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">move<\/span><span class=\"hljs-params\">(CrateStacks crateStacks, Move move)<\/span> <\/span>{\n    CrateStack fromStack = CrateMover.getSourceStack(crateStacks, move);\n    CrateStack toStack = CrateMover.getTargetStack(crateStacks, move);\n\n    <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">int<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; move.number(); i++) {\n      toStack.push(fromStack.pop());\n    }\n  }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><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>CrateMover 9001 benutzt einen Hilfs-<a href=\"\/de\/algorithmen\/stack-datenstruktur\/\">Stack<\/a>, um die Reihenfolge der Kisten zwischendurch umzudrehen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">CrateMover9001<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title\">CrateMover<\/span> <\/span>{\n\n  <span class=\"hljs-meta\">@Override<\/span>\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">move<\/span><span class=\"hljs-params\">(CrateStacks crateStacks, Move move)<\/span> <\/span>{\n    CrateStack fromStack = CrateMover.getSourceStack(crateStacks, move);\n    CrateStack toStack = CrateMover.getTargetStack(crateStacks, move);\n\n    Deque&lt;Crate&gt; helperStack = <span class=\"hljs-keyword\">new<\/span> LinkedList&lt;&gt;();\n    <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">int<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; move.number(); i++) {\n      helperStack.push(fromStack.pop());\n    }\n\n    <span class=\"hljs-keyword\">while<\/span> (!helperStack.isEmpty()) {\n      toStack.push(helperStack.pop());\n    }\n  }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><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-2022\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2022\/day5\" target=\"_blank\" rel=\"noopener\">Advent of Code 2022 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-2022-tag-6-loesung\">Advent of Code 2022 \u2013 Tag 6 L\u00f6sung<\/h2>\n\n\n\n<p>Die L\u00f6sung f\u00fcr <a rel=\"noopener\" href=\"https:\/\/adventofcode.com\/2022\/day\/6\" target=\"_blank\">Tag 6<\/a> habe ich mit einem <code>Set&lt;Character&gt;<\/code> implementiert. Von jeder Position in der Zeichenkette werden die zur\u00fcckliegenden Zeichen entsprechend der Marker-L\u00e4nge in das <code>Set<\/code> geschrieben. Sobald das <code>Set<\/code> ein Zeichen bereits enth\u00e4lt, wird das <code>Set<\/code> zur\u00fcckgesetzt und der Versuch beim n\u00e4chsten Zeichen wiederholt \u2013 solange, bis der Marker (also die entsprechende Anzahl unterschiedlicher Zeichen) gefunden wurde.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2022\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2022\/day6\" target=\"_blank\" rel=\"noopener\">Advent of Code 2022 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-2022-tag-7-loesung\">Advent of Code 2022 \u2013 Tag 7 L\u00f6sung<\/h2>\n\n\n\n<p>F\u00fcr <a rel=\"noopener\" href=\"https:\/\/adventofcode.com\/2022\/day\/7\" target=\"_blank\">Tag 7<\/a> habe ich einen Parser geschrieben, der aus den vorgegebenen Kommandos einen Verzeichnis-Baum aus folgenden Klassen (entsprechend dem <a rel=\"noopener\" href=\"https:\/\/de.wikipedia.org\/wiki\/Kompositum_(Entwurfsmuster)\" target=\"_blank\">Composite Pattern<\/a>) aufbaut:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" width=\"1600\" height=\"666\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/01\/advent-of-code-2022-day7-classes.png\" alt=\"Advent of Code 2022 Tag 7 Klassendiagramm\" class=\"wp-image-34687\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/01\/advent-of-code-2022-day7-classes.png 1600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/01\/advent-of-code-2022-day7-classes-224x93.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/01\/advent-of-code-2022-day7-classes-336x140.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/01\/advent-of-code-2022-day7-classes-504x210.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/01\/advent-of-code-2022-day7-classes-672x280.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/01\/advent-of-code-2022-day7-classes-400x167.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/01\/advent-of-code-2022-day7-classes-600x250.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/01\/advent-of-code-2022-day7-classes-800x333.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/01\/advent-of-code-2022-day7-classes-944x393.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/01\/advent-of-code-2022-day7-classes-1200x500.png 1200w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2023\/01\/advent-of-code-2022-day7-classes-1180x490.png 1180w\" sizes=\"(max-width: 1600px) 100vw, 1600px\" \/><\/figure>\n<\/div>\n\n\n<p>F\u00fcr die L\u00f6sung von Teil eins m\u00fcssen wir dann nur noch alle Unterverzeichnisse rekursiv durchgehen und diejenigen herausfiltern, die dem Gr\u00f6\u00dfenkriterium entsprechen. Das l\u00e4sst sich sehr elegant mit Javas Stream API l\u00f6sen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">long<\/span> sumOfSizes =\n    root.listWithAllSubDirectories().stream()\n        .mapToLong(Directory::totalSize)\n        .filter(totalSize -&gt; totalSize &lt;= maxTotalSize)\n        .sum();<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><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>F\u00fcr Teil zwei m\u00fcssen wir ebenfalls nach Gr\u00f6\u00dfe filtern und dann das kleinste Verzeichnis bestimmen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">long<\/span> freeSpace = <span class=\"hljs-number\">70_000_000<\/span> - root.totalSize();\n<span class=\"hljs-keyword\">long<\/span> moreSpaceNeeded = <span class=\"hljs-number\">30_000_000<\/span> - freeSpace;\n\n<span class=\"hljs-keyword\">long<\/span> smallestDirectoryToDeleteTotalSize =\n    root.listWithAllSubDirectories().stream()\n        .filter(directory -&gt; directory.totalSize() &gt;= moreSpaceNeeded)\n        .min(Comparator.comparing(Directory::totalSize))\n        .orElseThrow()\n        .totalSize();<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><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-2022\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2022\/day7\" target=\"_blank\" rel=\"noopener\">Advent of Code 2022 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-2022-tag-8-loesung\">Advent of Code 2022 \u2013 Tag 8 L\u00f6sung<\/h2>\n\n\n\n<p>Um die Aufgabe f\u00fcr <a rel=\"noopener\" href=\"https:\/\/adventofcode.com\/2022\/day\/8\" target=\"_blank\">Tag 8<\/a> zu l\u00f6sen, brauchen wir keine Tricks, nur etwas Programmierarbeit. Wir k\u00f6nnen hier viel f\u00fcr die Verst\u00e4ndlichkeit des Codes tun, indem wir Richtungen als Enum und Positionen als <a href=\"\/de\/java\/java-records\/\">Record<\/a> modellieren (die <code>moveTo(...)<\/code>-Methode ist mit der in Java 14 eingef\u00fchrten <a href=\"\/de\/java\/switch-expressions\/\">Switch Expression<\/a> implementiert):<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">enum<\/span> Direction {\n  TOP,\n  RIGHT,\n  BOTTOM,\n  LEFT;\n}\n\n<span class=\"hljs-function\">record <span class=\"hljs-title\">Position<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> column, <span class=\"hljs-keyword\">int<\/span> row)<\/span> <\/span>{\n  <span class=\"hljs-function\">Position <span class=\"hljs-title\">moveTo<\/span><span class=\"hljs-params\">(Direction direction)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">switch<\/span> (direction) {\n      <span class=\"hljs-keyword\">case<\/span> TOP -&gt; <span class=\"hljs-keyword\">new<\/span> Position(column, row - <span class=\"hljs-number\">1<\/span>);\n      <span class=\"hljs-keyword\">case<\/span> RIGHT -&gt; <span class=\"hljs-keyword\">new<\/span> Position(column + <span class=\"hljs-number\">1<\/span>, row);\n      <span class=\"hljs-keyword\">case<\/span> BOTTOM -&gt; <span class=\"hljs-keyword\">new<\/span> Position(column, row + <span class=\"hljs-number\">1<\/span>);\n      <span class=\"hljs-keyword\">case<\/span> LEFT -&gt; <span class=\"hljs-keyword\">new<\/span> Position(column - <span class=\"hljs-number\">1<\/span>, row);\n    };\n  }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><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>Mittels <code>Position.moveTo(...)<\/code> k\u00f6nnen wir dann von jedem Feld aus in die vier Himmelsrichtungen laufen und  die H\u00f6he der B\u00e4ume mit den Kriterien der jeweiligen Teilaufgabe abgleichen.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2022\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2022\/day8\" target=\"_blank\" rel=\"noopener\">Advent of Code 2022 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-2022-tag-9-loesung\">Advent of Code 2022 \u2013 Tag 9 L\u00f6sung<\/h2>\n\n\n\n<p>Den <code>Position<\/code>-Record k\u00f6nnen wir an <a rel=\"noopener\" href=\"https:\/\/adventofcode.com\/2022\/day\/9\" target=\"_blank\">Tag 9<\/a> erneut einsetzen, um die Knoten des Seils zu speichern und einen nach dem anderen entsprechend der vorgegebenen Regeln zu bewegen.<\/p>\n\n\n\n<p>Die Position des jeweils letzten Knotens speichern wir in einem <code>Set&lt;Position&gt;<\/code>. Dessen Gr\u00f6\u00dfe ist am Ende die L\u00f6sung der Aufgabe.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2022\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2022\/day9\" target=\"_blank\" rel=\"noopener\">Advent of Code 2022 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-2022-tag-10-loesung\">Advent of Code 2022 \u2013 Tag 10 L\u00f6sung<\/h2>\n\n\n\n<p>An <a rel=\"noopener\" href=\"https:\/\/adventofcode.com\/2022\/day\/10\" target=\"_blank\">Tag 10<\/a> m\u00fcssen wir einen einfachen CPU-Emulator implementieren, der zwei verschiedene Operationen ausf\u00fchren kann und w\u00e4hrend der Dauer dieser Operationen entsprechend des X-Registers und der aktuellen X-Position des Bildschirms auf diesem ein Pixel an- oder abschaltet. Die Implementierung erfordert weder Tricks noch Optimierungen.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2022\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2022\/day10\" target=\"_blank\" rel=\"noopener\">Advent of Code 2022 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-2022-tag-11-loesung\">Advent of Code 2022 \u2013 Tag 11 L\u00f6sung<\/h2>\n\n\n\n<p>Das Problem bei Teil zwei von <a href=\"https:\/\/adventofcode.com\/2022\/day\/11\" target=\"_blank\" rel=\"noopener\">Tag 11<\/a> ist, dass der \"Worry Level\" durch das Quadrieren schnell gigantische Ausma\u00dfe annimmt. Der Trick, um den Worry Level gering zu halten ohne dabei die Spiellogik zu \u00e4ndern, ist es die Formel f\u00fcr die Erholung<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">worryLevel = worryLevel \/ <span class=\"hljs-number\">3<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><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>zu ersetzen durch<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">worryLevel = worryLevel % reliefDivisor<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><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>wobei der <code>reliefDivisor<\/code> das Produkt aller verschiedenen Nenner der \"Test\"-Operationen ist.<\/p>\n\n\n\n<p>Im Beispiel haben wir die folgenden vier Tests:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">Test: divisible by 23\nTest: divisible by 19\nTest: divisible by 13\nTest: divisible by 17<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Klartext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Der <code>reliefDivisor<\/code> berechnet sich f\u00fcr das Beispiel als 23 \u00d7 19 \u00d7 13 \u00d7 17 = 96.577<\/p>\n\n\n\n<p>Wenn wir nun zur Erholung den Worry Level auf den Rest bei Teilung durch diesen Wert setzen, ist sichergestellt, dass a) der Worry Level klein bleibt und b) sich das Ergebnis der \"Test\"-Operationen nicht \u00e4ndern, egal bei welchem Affen sich ein Item befindet.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2022\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2022\/day11\" target=\"_blank\" rel=\"noopener\">Advent of Code 2022 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-2022-tag-12-loesung\">Advent of Code 2022 \u2013 Tag 12 L\u00f6sung<\/h2>\n\n\n\n<p>F\u00fcr <a href=\"https:\/\/adventofcode.com\/2022\/day\/12\" target=\"_blank\" rel=\"noopener\">Tag 12<\/a> habe ich einen Breadth-First-Algorithmus implementiert, der von der Startposition zu allen erreichbaren Felder geht und dann von jedem erreichbaren Feld weiter zu allen von dort erreichbaren Feldern, usw. Bereits in einem vorherigen Schritt erreichte Felder werden ignoriert, da dorthin bereits ein k\u00fcrzerer Weg gefunden wurde.<\/p>\n\n\n\n<p>F\u00fcr Teil zwei habe ich einfach den Algorithmus aus Teil eins auf alle m\u00f6glichen Startfelder angewendet und den k\u00fcrzesten aller k\u00fcrzesten Wege bestimmt.<\/p>\n\n\n\n<p>Die relativ geringe Gr\u00f6\u00dfe des Problems hat diese triviale L\u00f6sung erm\u00f6glicht. Bei einer deutlich gr\u00f6\u00dferen Karte h\u00e4tte man auch vom Ziel zur\u00fcck zum Start gehen k\u00f6nnen und beim ersten Erreichen eines potentiellen Startfeldes die bis dahin zur\u00fcckgelegten Felder zur\u00fcckgeben k\u00f6nnen.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2022\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2022\/day12\" target=\"_blank\" rel=\"noopener\">Advent of Code 2022 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-2022-tag-13-loesung\">Advent of Code 2022 \u2013 Tag 13 L\u00f6sung<\/h2>\n\n\n\n<p>F\u00fcr <a rel=\"noopener\" href=\"https:\/\/adventofcode.com\/2022\/day\/13\" target=\"_blank\">Tag 13<\/a> habe ich einen <a href=\"\/de\/java\/comparator-comparable-compareto\/\">Comparator<\/a> geschrieben, den ich sowohl in Teil eins verwende, um zu z\u00e4hlen, wie viele Paket-Paare in der richtigen Reihenfolge liegen, als auch in Teil zwei, um die Pakete mittels <code>List.sort()<\/code> zu sortieren.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2022\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2022\/day13\" target=\"_blank\" rel=\"noopener\">Advent of Code 2022 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-2022-tag-14-loesung\">Advent of Code 2022 \u2013 Tag 14 L\u00f6sung<\/h2>\n\n\n\n<p>Die Aufgabe von <a rel=\"noopener\" href=\"https:\/\/adventofcode.com\/2022\/day\/14\" target=\"_blank\">Tag 14<\/a> l\u00e4sst sich sehr leicht mit einem Raster von Tiles l\u00f6sen. Teil zwei erfordert heute keine besonderen Tricks.<\/p>\n\n\n\n<p>GitHub: <a rel=\"noopener\" href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2022\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2022\/day14\" target=\"_blank\">Advent of Code 2022 Tag 14 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-2022-tag-15-loesung\">Advent of Code 2022 \u2013 Tag 15 L\u00f6sung<\/h2>\n\n\n\n<p>Die triviale L\u00f6sung f\u00fcr <a rel=\"noopener\" href=\"https:\/\/adventofcode.com\/2022\/day\/15\" target=\"_blank\">Tag 15<\/a> funktioniert ebenfalls mit einem Raster. Bei Teil zwei erweist sich ein Raster allerdings als zu aufw\u00e4ndig. <\/p>\n\n\n\n<p>Der Trick ist es, die durch die Sensoren abgedeckten Bereiche nicht in einem Raster, sondern mit Start- und Endpositionen zu speichern, dabei angrenzende oder \u00fcberschneidende Bereiche zu kombinieren, und letztlich daraus die nicht abgedeckte Position zu ermitteln.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2022\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2022\/day15\" target=\"_blank\" rel=\"noopener\">Advent of Code 2022 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-2022-tag-16-loesung\">Advent of Code 2022 \u2013 Tag 16 L\u00f6sung<\/h2>\n\n\n\n<p>Die Aufgabe von <a rel=\"noopener\" href=\"https:\/\/adventofcode.com\/2022\/day\/16\" target=\"_blank\">Tag 16<\/a> kann mit einer Tiefensuche gel\u00f6st werden. Dabei gibt es nicht die <em>eine<\/em> Optimierung, sondern mehrere, die den Algorithmus jeweils um einen signifikanten Faktor schneller machen. Ich habe die folgenden vier Optimierungen angewendet:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Der Algorithmus pr\u00fcft in jeder Situation, ob dieselbe Situation (d. h. die Kombination aus Ventilstellungen, Aktorpositionen und abgelaufene Minuten) bereits zuvor aufgetreten ist. Wenn ja, und wenn diese Situation zu gleich viel oder mehr abgelassenem Druck gef\u00fchrt hat, muss der aktuelle Weg nicht weiter erkundet werden.<\/li>\n\n\n\n<li>In jeder Situation wird berechnet, wie viel Druck in der restlichen Zeit maximal abgelassen werden kann, wenn die Ventile nach absteigender Durchflussmenge ge\u00f6ffnet werden. Ergibt dies ein schlechteres Ergebnis als das aktuell beste, wird der Weg nicht weiter verfolgt.<\/li>\n\n\n\n<li>Bei dem Vergleich der Situation mit allen bisherigen Situationen gelten zwei Situationen auch dann als gleich, wenn die Positionen von dir und dem Elefanten vertauscht sind.<\/li>\n\n\n\n<li>Wenn erkannt wird, dass ein Aktor im Kreis gelaufen ist, ohne auf diesem ein Ventil ge\u00f6ffnet zu haben, wird der aktuelle Weg ebenfalls nicht weiter verfolgt.<\/li>\n<\/ol>\n\n\n\n<p>Mit Hilfe dieser Optimierungen l\u00e4sst sich Teilaufgabe zwei in etwa zwei Sekunden l\u00f6sen.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2022\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2022\/day16\" target=\"_blank\" rel=\"noopener\">Advent of Code 2022 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-2022-tag-17-loesung\">Advent of Code 2022 \u2013 Tag 17 L\u00f6sung<\/h2>\n\n\n\n<p>Die Simulation f\u00fcr <a href=\"https:\/\/adventofcode.com\/2022\/day\/17\" target=\"_blank\" rel=\"noopener\">Tag 17<\/a> ist mit bin\u00e4ren Operationen relativ schnell implementiert: \"shift left\" und \"shift right\", um den Felsen zu verschieben, \"bitwise and\" f\u00fcr die Kollisionspr\u00fcfung und \"bitwise or\" f\u00fcr die Manifestierung eines Felsens.<\/p>\n\n\n\n<p>1.000.000.000.000 Felsen zu simulieren h\u00e4tte mit meiner initialen Implementierung allerdings knapp 20 Stunden gedauert. <\/p>\n\n\n\n<p>Der Trick f\u00fcr Teilaufgabe zwei besteht darin, Wiederholungen in den Fall- und Verschiebemustern zu finden. Dazu speichert mein Algorithmus eine Kombination aus aktuellem Felsen, aktueller Position in der Eingabe und H\u00f6henprofil der oberen Felsenreihen als Key in einer Map mit aktuell h\u00f6chstem Felsen und Anzahl der bisher gefallenen Felsen als Value.<\/p>\n\n\n\n<p>Sobald dieselbe Kombination erneut auftritt (was \u00fcberraschend schnell passiert), k\u00f6nnen wir mit Hilfe der Anzahl zwischenzeitlich gefallener Felsen und des zwischenzeitlichen Wachstums des Felsenberges in wenigen Millisekunden ein paar Milliarden Schritte \u00fcberspringen. So l\u00e4sst sich auch Teilaufgabe zwei in wenigen hundert Millisekunden l\u00f6sen.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2022\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2022\/day17\" target=\"_blank\" rel=\"noopener\">Advent of Code 2022 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-2022-tag-18-loesung\">Advent of Code 2022 \u2013 Tag 18 L\u00f6sung<\/h2>\n\n\n\n<p>Teilaufgabe eins von <a rel=\"noopener\" href=\"https:\/\/adventofcode.com\/2022\/day\/18\" target=\"_blank\">Tag 18<\/a> ist schnell gel\u00f6st. Wir speichern alle Cubes in einem Set und iterieren dann \u00fcber dieses und z\u00e4hlen \u2013 mit Hilfe von <code>Set contains()<\/code> \u2013 diejenigen Seiten, auf denen sich kein Cube befindet.<\/p>\n\n\n\n<p>Teil zwei habe ich mit iterativem Floodfill gel\u00f6st. Dabei wird der Bereich au\u00dferhalb des Droplets Cube f\u00fcr Cube mit \"Dampf\" gef\u00fcllt. Jedesmal, wenn ein Cube nicht gef\u00fcllt werden kann, weil sich dort Lava befindet, wird ein Counter hochgez\u00e4hlt. Dieser Counter enth\u00e4lt am Ende die gesuchte Au\u00dfenfl\u00e4che.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2022\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2022\/day18\" target=\"_blank\" rel=\"noopener\">Advent of Code 2022 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-2022-tag-19-loesung\">Advent of Code 2022 \u2013 Tag 19 L\u00f6sung<\/h2>\n\n\n\n<p><a href=\"https:\/\/adventofcode.com\/2022\/day\/19\" target=\"_blank\" rel=\"noopener\">Tag 19<\/a> erinnert an die Ventil-Aufgabe von Tag 16. Auch diese Aufgabe l\u00f6st man mittels einer Tiefensuche und diversen Optimierungen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Unter der Annahme, dass wir in jeder Runde einen Geode-Roboter produzieren, k\u00f6nnen wir berechnen, wie viele Geoden von einer bestimmten Situation aus maximal noch produziert werden k\u00f6nnten. Ist diese Zahl kleiner als der aktuelle Bestwert, braucht der aktuelle Pfad nicht weiter erforscht zu werden.<\/li>\n\n\n\n<li>Wenn ein bestimmter Roboter auch in der vorherigen Runde h\u00e4tte gekauft werden k\u00f6nnen \u2013 in der Runde aber <em>gar kein<\/em> Roboter gekauft wurde, dann brauchen wir ihn auch jetzt nicht zu kaufen. Sparen macht nur f\u00fcr einen <em>anderen<\/em> Roboter Sinn.<\/li>\n\n\n\n<li>In der letzten Minute brauchen wir keine Roboter zu produzieren.<\/li>\n\n\n\n<li>In der vorletzten Minute brauchen wir nur Geode-Roboter zu produzieren.<\/li>\n\n\n\n<li>In der vor-vorletzten Minute brauchen wir nur Geode-, Ore- oder Obsidian-Roboter (also keine Clay-Roboter) zu produzieren.<\/li>\n<\/ul>\n\n\n\n<p>Meine Implementierung l\u00f6st Teil eins in 4 Sekunden und Teil zwei in 52 Sekunden.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2022\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2022\/day19\" target=\"_blank\" rel=\"noopener\">Advent of Code 2022 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-2022-tag-20-loesung\">Advent of Code 2022 \u2013 Tag 20 L\u00f6sung<\/h2>\n\n\n\n<p>Die L\u00f6sung f\u00fcr <a rel=\"noopener\" href=\"https:\/\/adventofcode.com\/2022\/day\/20\" target=\"_blank\">Tag 20<\/a> l\u00e4sst sich gut mit einer doppelt verketteten, zirkul\u00e4ren Liste implementieren. Teil eins kommt ganz ohne Optimierungen aus. <\/p>\n\n\n\n<p>Bei Teil zwei m\u00fcssten wir die Knoten mehrere Billionen Mal verschieben. Das k\u00f6nnen wir mit einer einfachen Formel auf ein paar Tausend reduzieren:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">long<\/span> distance = node.value()  % (size - <span class=\"hljs-number\">1<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><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>Der Trick dabei ist, nicht durch <code>size<\/code> (die Anzahl der Elemente) zu teilen, sondern durch <code>size - 1<\/code>. Du kannst das am Beispiel nachvollziehen: In der Liste der L\u00e4nge 7 m\u00fcsstest du ein Elemente sechs mal nach rechts schieben, damit es wieder an seinem Ausgangspunkt ankommt.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2022\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2022\/day20\" target=\"_blank\" rel=\"noopener\">Advent of Code 2022 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-2022-tag-21-loesung\">Advent of Code 2022 \u2013 Tag 21 L\u00f6sung<\/h2>\n\n\n\n<p>F\u00fcr die L\u00f6sung von <a href=\"https:\/\/adventofcode.com\/2022\/day\/21\" target=\"_blank\" rel=\"noopener\">Tag 21<\/a> habe ich einen gerichteten azyklischen Graph (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Directed_acyclic_graph\" target=\"_blank\" rel=\"noopener\">Directed acyclic graph<\/a>) der mathematischen Operationen aufgebaut. Da die Ergebnisse mancher Operationen mehrfach verwendet werden, werden sie gespeichert, sobald sie einmal berechnet wurden.<\/p>\n\n\n\n<p>F\u00fcr Teil zwei habe ich zun\u00e4chst versucht, eine Tiefensuche zu implementieren, d. h. verschiedene Werte f\u00fcr den \u201chumn\u201d-Knoten einzusetzen und dann zu pr\u00fcfen, ob beide Operanden des \u201croot\u201d-Knotens gleich sind. Diese Variante habe ich noch dahingehend optimiert, dass ich zwischen zwei Versuchen nicht alle gespeicherten Ergebnisse gel\u00f6scht habe, sondern nur diejenigen auf dem Pfad von \u201croot\u201d zu \u201chumn\u201d. Doch auch so h\u00e4tte die Berechnung zu lange gedauert, um diese L\u00f6sung zu akzeptieren.<\/p>\n\n\n\n<p>Basierend auf der eben genannten Optimierung konnte ich eine deutlich schnellere L\u00f6sung implementieren. Und zwar k\u00f6nnen wir einfach die mathematischen Operationen auf dem Weg von \u201croot\u201d zu \u201chumn\u201d r\u00fcckw\u00e4rts ausf\u00fchren und kommen so in wenigen Millisekunden zum Ergebnis.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2022\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2022\/day21\" target=\"_blank\" rel=\"noopener\">Advent of Code 2022 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-2022-tag-22-loesung\">Advent of Code 2022 \u2013 Tag 22 L\u00f6sung<\/h2>\n\n\n\n<p><a href=\"https:\/\/adventofcode.com\/2022\/day\/22\" target=\"_blank\" rel=\"noopener\">Tag 22<\/a> fing einmal wieder leicht an. Mit einem zweidimensionalen Raster und ein paar Sonderbehandlungen f\u00fcr die Bereiche au\u00dferhalb der Karte ist Teil eins schnell gel\u00f6st.<\/p>\n\n\n\n<p>Teil zwei ist deutlich kniffliger. Ich habe dazu Logik geschrieben, die die Koordinaten auf der Karte in Koordinaten auf einer W\u00fcrfelseite mappt, dann die W\u00fcrfenseite mittels einer zus\u00e4tzlichen Liste von Kantenverbindungen (\u201cWurml\u00f6chern\u201d) verschiebt und dreht, und zuletzt die Koordinaten auf der verschobenen und gedrehten W\u00fcrfelseite wieder zur\u00fcck auf die Koordinaten der globalen Karte mappt.<\/p>\n\n\n\n<p>Die Liste von Kantenverbindungen habe ich manuell aus meinem Puzzle Input generiert. Meine L\u00f6sung wird daher nicht ohne manuelle Anpassung der Kantenverbindungen bei allen funktionieren (es sei denn die Eingabe hat dasselbe Schnittmuster). Man kann die Kantenverbindungen auch algorithmisch bestimmen, aber dazu hat mir die Zeit gefehlt. Vielleicht hole ich das noch nach.<\/p>\n\n\n\n<p>GitHub: <a rel=\"noopener\" href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2022\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2022\/day22\" target=\"_blank\">Advent of Code 2022 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-2022-tag-23-loesung\">Advent of Code 2022 \u2013 Tag 23 L\u00f6sung<\/h2>\n\n\n\n<p>An <a href=\"https:\/\/adventofcode.com\/2022\/day\/23\" target=\"_blank\" rel=\"noopener\">Tag 23<\/a> k\u00f6nnen wir uns bereits bei der L\u00f6sung der ersten Teilaufgabe darauf einstellen, dass wir in Teilaufgabe zwei vermutlich mehr als zehn Runden simulieren m\u00fcssen. Da das Feld so immer weiter wachsen wird, sollten wir die Elfen nicht in einem zweidimensionalen Array speichern.<\/p>\n\n\n\n<p>Mein Algorithmus speichert die Elfen als Liste und zus\u00e4tzlich deren Positionen in einem <code>Set&lt;Position&gt;<\/code>. So l\u00e4sst sich die Kollisionspr\u00fcfung leicht mittelns <code>Set.contains()<\/code> l\u00f6sen. Die L\u00f6sung von Teilaufgabe zwei dauert so weniger als eine Sekunde.<\/p>\n\n\n\n<p>GitHub: <a href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2022\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2022\/day23\" target=\"_blank\" rel=\"noopener\">Advent of Code 2022 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-2022-tag-24-loesung\">Advent of Code 2022 \u2013 Tag 24 L\u00f6sung<\/h2>\n\n\n\n<p>An <a rel=\"noopener\" href=\"https:\/\/adventofcode.com\/2022\/day\/24\" target=\"_blank\">Tag 24<\/a> m\u00fcssen wir erneut einen <a href=\"https:\/\/www.happycoders.eu\/de\/algorithmen\/shortest-path-problem-java\/\">Pathfinding-Algorithmus<\/a> implementieren. F\u00fcr die heutige Aufgabe ist eine Tiefensuche nicht geeignet, da sich die Karte bei jedem Zug \u00e4ndert. Bei meinem Puzzle Input dauert es 95.400 Schritte, bis das Ziel das erste Mal erreicht wird und etwas \u00fcber eine Minute, bis Teilaufgabe eins gel\u00f6st ist.<\/p>\n\n\n\n<p>Eine Breitensuche l\u00f6st Teil ein in nur 95 ms und Teil zwei in 130 ms.<\/p>\n\n\n\n<p>Optimiert habe ich die Berechnung der freien Positionen. Statt die komplette Spielkarte f\u00fcr jeden Schritt zu simulieren, berechne ich mittels Modulo-Operation, ob ein Feld zu einer bestimmten Zeit frei ist oder nicht:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">boolean<\/span> <span class=\"hljs-title\">isBlizzardAtMinute<\/span><span class=\"hljs-params\">(Position pos, <span class=\"hljs-keyword\">int<\/span> minute)<\/span> <\/span>{\n  <span class=\"hljs-keyword\">return<\/span> tiles&#091;modulo(pos.row() + minute, height)]&#091;pos.column()] == Tile.UP\n      || tiles&#091;modulo(pos.row() - minute, height)]&#091;pos.column()] == Tile.DOWN\n      || tiles&#091;pos.row()]&#091;modulo(pos.column() + minute, width)] == Tile.LEFT\n      || tiles&#091;pos.row()]&#091;modulo(pos.column() - minute, width)] == Tile.UP;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><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-2022\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2022\/day24\" target=\"_blank\" rel=\"noopener\">Advent of Code 2022 Tag 24 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-2022-tag-25-loesung\">Advent of Code 2022 \u2013 Tag 25 L\u00f6sung<\/h2>\n\n\n\n<p>Die L\u00f6sung f\u00fcr <a href=\"https:\/\/adventofcode.com\/2022\/day\/25\" target=\"_blank\" rel=\"noopener\">Tag 25<\/a> besteht nur aus wenigen Zeilen Code. Der kniffligere Teil ist das Umwandeln einer Dezimalzahl in einen Snafu-String. Hier die entsprechende Methode:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" 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> String <span class=\"hljs-title\">toSnafuString<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">long<\/span> decimal)<\/span> <\/span>{\n  StringBuilder result = <span class=\"hljs-keyword\">new<\/span> StringBuilder();\n\n  <span class=\"hljs-keyword\">do<\/span> {\n    <span class=\"hljs-keyword\">long<\/span> fives = (decimal + <span class=\"hljs-number\">2<\/span>) \/ <span class=\"hljs-number\">5<\/span>;\n    <span class=\"hljs-keyword\">int<\/span> digit = (<span class=\"hljs-keyword\">int<\/span>) (decimal - <span class=\"hljs-number\">5<\/span> * fives);\n    result.insert(<span class=\"hljs-number\">0<\/span>, convertDecimalToSnafuDigit(digit));\n    decimal = fives;\n  } <span class=\"hljs-keyword\">while<\/span> (decimal != <span class=\"hljs-number\">0<\/span>);\n\n  <span class=\"hljs-keyword\">return<\/span> result.toString();\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><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 rel=\"noopener\" href=\"https:\/\/github.com\/SvenWoltmann\/advent-of-code-2022\/tree\/main\/src\/main\/java\/eu\/happycoders\/adventofcode2022\/day25\" target=\"_blank\">Advent of Code 2022 Tag 25 L\u00f6sung<\/a><\/p>\n<\/div><\/div>\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","protected":false},"excerpt":{"rendered":"<p>Hier findest Du alle L\u00f6sungen zu Advent of Code 2022. Alle Aufgaben sind objektorientiert und testgetrieben in Java implementiert.<\/p>\n","protected":false},"author":1,"featured_media":34497,"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 2022. 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 2022,advent of code","_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":21955,"_post_count":0,"footnotes":""},"categories":[127],"tags":[208],"class_list":["post-34496","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-2022-solutions.jpg",1770,986,false],"thumbnail":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2022-solutions.jpg",150,84,false],"medium":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2022-solutions.jpg",300,167,false],"medium_large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2022-solutions.jpg",768,428,false],"large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2022-solutions.jpg",1024,570,false],"feature_thumb_224":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2022-solutions-224x125.jpg",224,125,true],"feature_thumb_336":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2022-solutions-336x187.jpg",336,187,true],"feature_thumb_504":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2022-solutions-504x281.jpg",504,281,true],"feature_thumb_672":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2022-solutions-672x374.jpg",672,374,true],"half_400":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2022-solutions-400x223.jpg",400,223,true],"half_600":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2022-solutions-600x334.jpg",600,334,true],"full_800":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2022-solutions-800x446.jpg",800,446,true],"full_944":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2022-solutions-944x526.jpg",944,526,true],"full_1200":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2022-solutions-1200x668.jpg",1200,668,true],"wide_1180":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2022-solutions-1180x490.jpg",1180,490,true],"wide_1770":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2022-solutions-1770x735.jpg",1770,735,true],"1536x1536":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2022-solutions.jpg",1536,856,false],"2048x2048":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/12\/advent-of-code-2022-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 2022. Alle Aufgaben sind objektorientiert und testgetrieben in Java implementiert.","public_identification_id":"05818cefcc5745ee8e38736cde558a94","private_identification_id":"142dbcb6c41044c087a5713cd610372c","_links":{"self":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/34496","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=34496"}],"version-history":[{"count":10,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/34496\/revisions"}],"predecessor-version":[{"id":42160,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/34496\/revisions\/42160"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media\/34497"}],"wp:attachment":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media?parent=34496"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/categories?post=34496"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/tags?post=34496"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}