From 4745bf122e3b6500b4de676f32f6409107bf76ce Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 3 Dec 2019 14:17:42 +0100 Subject: [PATCH 001/433] Day 1 --- .../sbaars/adventofcode2019/days/Day1.java | 38 +++++++ src/main/resources/day1.txt | 100 ++++++++++++++++++ 2 files changed, 138 insertions(+) create mode 100644 src/main/java/com/sbaars/adventofcode2019/days/Day1.java create mode 100644 src/main/resources/day1.txt diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day1.java b/src/main/java/com/sbaars/adventofcode2019/days/Day1.java new file mode 100644 index 00000000..2ebdff09 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day1.java @@ -0,0 +1,38 @@ +package com.sbaars.adventofcode2019.days; + +import java.io.File; +import java.io.IOException; +import java.util.Arrays; +import java.util.stream.IntStream; + +import com.sbaars.adventofcode2019.common.Day; +import com.sbaars.adventofcode2019.util.DoesFileOperations; + +public class Day1 implements Day, DoesFileOperations +{ + public static void main(String[] args) throws IOException + { + new Day1().printParts(); + } + + public int part1() throws IOException { + return createNumberStream().map(this::getFuel).sum(); + } + + public int part2() throws IOException { + return createNumberStream().map(this::getRequiredFuel).sum(); + } + + private IntStream createNumberStream() throws IOException { + return Arrays.stream(getFileAsString(new File(Day1.class.getClassLoader().getResource("day1.txt").getFile())).split(System.lineSeparator())).mapToInt(Integer::parseInt); + } + + private int getRequiredFuel(int mass) { + int fuel = getFuel(mass); + return fuel>0 ? fuel+getRequiredFuel(fuel) : 0; + } + + private int getFuel(int mass) { + return (mass/3)-2; + } +} diff --git a/src/main/resources/day1.txt b/src/main/resources/day1.txt new file mode 100644 index 00000000..95bcbee3 --- /dev/null +++ b/src/main/resources/day1.txt @@ -0,0 +1,100 @@ +55131 +114008 +145297 +76135 +50317 +134036 +122136 +97704 +51245 +141732 +120427 +142020 +88166 +55313 +110391 +112436 +78195 +74294 +128984 +68240 +137098 +142016 +83577 +89257 +107744 +67357 +131342 +98247 +137501 +134577 +65696 +84925 +50159 +110319 +91921 +103303 +84505 +84683 +100811 +82626 +66774 +123216 +95151 +88237 +60705 +124319 +102926 +143160 +92780 +64283 +132434 +113935 +84907 +113698 +117240 +129327 +78837 +144841 +138054 +130990 +100191 +141768 +138941 +108165 +62138 +121690 +117305 +90147 +134422 +78031 +121331 +120947 +120235 +138880 +141076 +119480 +66844 +77660 +106364 +99187 +144244 +120483 +77715 +135703 +125521 +123253 +127556 +96458 +91965 +73924 +95176 +87540 +122083 +146013 +67761 +100413 +145994 +149450 +94330 +112824 \ No newline at end of file From 2cd8115b285aab50e1afa264294178d750346d1b Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 3 Dec 2019 14:17:51 +0100 Subject: [PATCH 002/433] Day 2 --- .../sbaars/adventofcode2019/days/Day2.java | 59 +++++++++++++++++++ src/main/resources/day2.txt | 1 + 2 files changed, 60 insertions(+) create mode 100644 src/main/java/com/sbaars/adventofcode2019/days/Day2.java create mode 100644 src/main/resources/day2.txt diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day2.java b/src/main/java/com/sbaars/adventofcode2019/days/Day2.java new file mode 100644 index 00000000..2c8c72a9 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day2.java @@ -0,0 +1,59 @@ +package com.sbaars.adventofcode2019.days; + +import java.io.File; +import java.io.IOException; +import java.util.Arrays; + +import com.sbaars.adventofcode2019.common.Day; +import com.sbaars.adventofcode2019.util.DoesFileOperations; + +public class Day2 implements Day, DoesFileOperations { + + public static void main(String[] args) throws IOException { + new Day2().printParts(); + } + + public int part1() throws IOException { + return execute(12, 2); + } + + private int execute(int x, int y) throws IOException { + int[] program = Arrays.stream(getFileAsString(new File(Day1.class.getClassLoader().getResource("day2.txt").getFile())).split(",")).mapToInt(Integer::parseInt).toArray();; + program[1] = x; + program[2] = y; + for(int i = 0; executeInstruction(program, i, program[i]); i+=4); + return program[0]; + } + + private boolean executeInstruction(int[] program, int i, int instruction) { + switch(instruction) { + case 1: + program[program[i+3]] = program[program[i+1]] + program[program[i+2]]; + break; + case 2: + program[program[i+3]] = program[program[i+1]] * program[program[i+2]]; + break; + case 99: + return false; + default: throw new IllegalStateException("Something went wrong!"); + } + + return true; + } + + @Override + public int part2() throws IOException { + for(int i = 0;;i++) { + for(int j = 0; j<=i; j++) { + for(int k = 0; k<=i; k++) { + try { + if(execute(j, k) == 19690720) { + return 100 * j + k; + } + } catch(Exception e) {} + } + } + } + } + +} diff --git a/src/main/resources/day2.txt b/src/main/resources/day2.txt new file mode 100644 index 00000000..b61b8381 --- /dev/null +++ b/src/main/resources/day2.txt @@ -0,0 +1 @@ +1,0,0,3,1,1,2,3,1,3,4,3,1,5,0,3,2,10,1,19,1,6,19,23,2,23,6,27,1,5,27,31,1,31,9,35,2,10,35,39,1,5,39,43,2,43,10,47,1,47,6,51,2,51,6,55,2,55,13,59,2,6,59,63,1,63,5,67,1,6,67,71,2,71,9,75,1,6,75,79,2,13,79,83,1,9,83,87,1,87,13,91,2,91,10,95,1,6,95,99,1,99,13,103,1,13,103,107,2,107,10,111,1,9,111,115,1,115,10,119,1,5,119,123,1,6,123,127,1,10,127,131,1,2,131,135,1,135,10,0,99,2,14,0,0 \ No newline at end of file From 5bb102d8e4915d5bada28d0e50e7263f2cddf088 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 3 Dec 2019 14:17:58 +0100 Subject: [PATCH 003/433] Day 3 --- .../sbaars/adventofcode2019/days/Day3.java | 144 ++++++++++++++++++ src/main/resources/day3.txt | 2 + 2 files changed, 146 insertions(+) create mode 100644 src/main/java/com/sbaars/adventofcode2019/days/Day3.java create mode 100644 src/main/resources/day3.txt diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day3.java b/src/main/java/com/sbaars/adventofcode2019/days/Day3.java new file mode 100644 index 00000000..40e9ae94 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day3.java @@ -0,0 +1,144 @@ +package com.sbaars.adventofcode2019.days; + +import java.awt.Point; +import java.io.File; +import java.io.IOException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +import com.sbaars.adventofcode2019.common.Day; +import com.sbaars.adventofcode2019.util.DoesFileOperations; + +public class Day3 implements Day, DoesFileOperations +{ + private Set intersect; + + private Day3() throws IOException { + String[] strings = Arrays.stream(getFileAsString(new File(Day1.class.getClassLoader().getResource("day3.txt").getFile())).split(System.lineSeparator())).toArray(String[]::new); + Walk[] walks1 = mapToWalks(strings[0]), walks2 = mapToWalks(strings[1]); + Set walkedLocations = new HashSet<>(); + calculateDistance(walks1, walkedLocations, false); + this.intersect = calculateDistance(walks2, walkedLocations, true); + } + + public static void main(String[] args) throws IOException + { + new Day3().printParts(); + } + + public int part1() throws IOException { + return intersect.stream().mapToInt(e -> distance(e.point)).min().orElse(Integer.MAX_VALUE); + } + + private Set calculateDistance(Walk[] walks1, Set walkedLocations, boolean collect) { + Set intersectingLocations = new HashSet<>(); + int x = 0, y = 0, steps = 0; + for(Walk walk : walks1) { + for(;walk.distance>0;walk.distance--) { + switch(walk.dir) { + case UP: y++; break; + case DOWN: y--; break; + case LEFT: x--; break; + case RIGHT: x++; break; + } + Step currentStep = new Step(new Point(x,y), steps); + if(collect) { + if(walkedLocations.contains(currentStep) && !intersectingLocations.contains(currentStep)) { + Step step = walkedLocations.stream().filter(e -> e.equals(currentStep)).findAny().get(); + intersectingLocations.add(step); + step.combine(currentStep); + } + } else { + walkedLocations.add(currentStep); + } + steps++; + } + } + return intersectingLocations; + } + + public int distance(Point p) { + return Math.abs(p.x) + Math.abs(p.y); + } + + private Walk[] mapToWalks(String string) { + return Arrays.stream(string.split(",")).map(Walk::new).toArray(Walk[]::new); + } + + public int part2() throws IOException { + return intersect.stream().mapToInt(e -> e.steps).min().orElse(Integer.MAX_VALUE); + } + + class Walk { + private final Direction dir; + private int distance; + + public Walk(String code) { + this.dir = Direction.getByDirCode(code.charAt(0)); + this.distance = Integer.parseInt(code.substring(1)); + } + } + + class Step { + private final Point point; + private int steps; + private boolean isCombined = false; + + public Step(Point point, int steps) { + this.point = point; + this.steps = steps + 1; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + getEnclosingInstance().hashCode(); + result = prime * result + ((point == null) ? 0 : point.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Step other = (Step) obj; + if (!getEnclosingInstance().equals(other.getEnclosingInstance())) + return false; + if (point == null) { + if (other.point != null) + return false; + } else if (!point.equals(other.point)) + return false; + return true; + } + + private Day3 getEnclosingInstance() { + return Day3.this; + } + + public void combine(Step step) { + if(!isCombined) { + steps+=step.steps; + isCombined = true; + } + } + } + + enum Direction { + UP, DOWN, LEFT, RIGHT; + + public char directionCode() { + return name().charAt(0); + } + + public static Direction getByDirCode(char code) { + return Arrays.stream(values()).filter(e -> e.directionCode() == code).findAny().get(); + } + } +} diff --git a/src/main/resources/day3.txt b/src/main/resources/day3.txt new file mode 100644 index 00000000..e50c4981 --- /dev/null +++ b/src/main/resources/day3.txt @@ -0,0 +1,2 @@ +R991,U77,L916,D26,R424,D739,L558,D439,R636,U616,L364,D653,R546,U909,L66,D472,R341,U906,L37,D360,L369,D451,L649,D521,R2,U491,R409,U801,R23,U323,L209,U171,L849,D891,L854,U224,R476,D519,L937,U345,R722,D785,L312,D949,R124,U20,R677,D236,R820,D320,L549,D631,R42,U621,R760,U958,L925,U84,R914,U656,R598,D610,R397,D753,L109,U988,R435,U828,R219,U583,L317,D520,L940,D850,R594,D801,L422,U292,R883,U204,L76,U860,L753,U483,L183,U179,R441,U163,L859,U437,L485,D239,R454,D940,R689,D704,R110,D12,R370,D413,L192,D979,R990,D651,L308,U177,R787,D717,R245,U689,R11,D509,L680,U228,L347,D179,R508,D40,L502,U689,L643,U45,R884,D653,L23,D918,L825,D312,L691,U292,L285,D183,R997,U427,L89,U252,R475,U217,R16,U749,L578,D931,L273,U509,L741,U97,R407,U275,L605,U136,L558,U318,R478,U505,R446,U295,R562,D646,R988,D254,L68,U645,L953,U916,L442,D713,R978,U540,R447,U594,L804,U215,R95,D995,R818,D237,R212,U664,R455,D684,L338,U308,R463,D985,L988,D281,R758,U510,L232,U509,R289,D90,R65,D46,R886,D741,L327,U755,R236,U870,L764,U60,R391,U91,R367,U587,L651,D434,L47,U954,R707,D336,L242,D387,L410,D19,R203,D703,L228,U292,L19,U916,R411,U421,L726,U543,L240,U755,R157,U836,L397,U71,L125,D934,L723,D145,L317,D229,R863,U941,L926,D55,L2,D452,R895,D670,L216,U504,R66,U696,L581,U75,L235,U88,L609,U415,L850,U21,L109,U416,R408,D367,R823,D199,L718,U136,L860,U780,L308,D312,R230,D671,R477,D672,L94,U307,R301,D143,L300,D792,L593,D399,R840,D225,R680,D484,L646,D917,R132,D213,L779,D143,L176,U673,L772,D93,L10,D624,L244,D993,R346 +L997,U989,L596,U821,L419,U118,R258,D239,R902,D810,R553,D271,R213,D787,R723,D57,L874,D556,R53,U317,L196,D813,R500,U151,R180,D293,L415,U493,L99,U482,R517,U649,R102,U860,R905,D499,R133,D741,R394,U737,L903,U800,R755,D376,L11,U751,R539,U33,R539,U30,L534,D631,L714,U190,L446,U409,R977,D731,R282,U244,R29,D212,L523,D570,L89,D327,R178,U970,R435,U250,R213,D604,R64,D348,R315,D994,L508,D261,R62,D50,L347,U183,R410,D627,L128,U855,L803,D695,L879,U857,L629,D145,L341,D733,L566,D626,L302,U236,L55,U428,R183,U254,R226,D228,R616,U137,L593,U204,R620,U624,R605,D705,L263,D568,R931,D464,R989,U621,L277,U274,L137,U768,L261,D360,L45,D110,R35,U212,L271,D318,L444,D427,R225,D380,L907,D193,L118,U741,L101,D298,R604,D598,L98,U458,L733,U511,L82,D173,L644,U803,R926,D610,R24,D170,L198,U766,R656,D474,L393,D934,L789,U92,L889,U460,L232,U193,L877,D380,L455,D526,R899,D696,R452,U95,L828,D720,R370,U664,L792,D204,R84,D749,R808,U132,L152,D375,R19,U164,L615,D121,R644,D289,R381,U126,L304,U508,L112,D268,L572,D838,L998,U127,R500,D344,R694,U451,L846,D565,R158,U47,L430,U214,R571,D983,R690,D227,L107,U109,L286,D66,L544,U205,L453,U716,L36,U672,L517,U878,L487,U936,L628,U253,R424,D409,R422,U636,R412,U553,R59,D332,R7,U495,L305,D939,L428,D821,R749,D195,R531,D898,R337,D303,L398,D625,R57,D503,L699,D553,L478,U716,R897,D3,R420,U903,R994,U864,L745,U205,R229,U126,L227,D454,R670,U605,L356,U499,R510,U238,L542,D440,R156,D512,L237,D341,L439,U642,R873,D650,R871,D616,R322,U696,R248,D746,R990,U829,R812,U294,L462,U740,R780 \ No newline at end of file From 8cfc7fb88c5305470d2fc54db263307282138f60 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 4 Dec 2019 09:22:33 +0100 Subject: [PATCH 004/433] Day 4 --- .classpath | 5 ++ .settings/org.eclipse.core.resources.prefs | 1 + .../sbaars/adventofcode2019/days/Day4.java | 58 +++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 src/main/java/com/sbaars/adventofcode2019/days/Day4.java diff --git a/.classpath b/.classpath index 5e8a55fe..cd377e47 100644 --- a/.classpath +++ b/.classpath @@ -23,5 +23,10 @@ + + + + + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs index f9fe3459..839d647e 100644 --- a/.settings/org.eclipse.core.resources.prefs +++ b/.settings/org.eclipse.core.resources.prefs @@ -1,4 +1,5 @@ eclipse.preferences.version=1 encoding//src/main/java=UTF-8 +encoding//src/main/resources=UTF-8 encoding//src/test/java=UTF-8 encoding/=UTF-8 diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day4.java b/src/main/java/com/sbaars/adventofcode2019/days/Day4.java new file mode 100644 index 00000000..5ec9ea2b --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day4.java @@ -0,0 +1,58 @@ +package com.sbaars.adventofcode2019.days; + +import java.io.IOException; +import java.util.stream.IntStream; + +import com.sbaars.adventofcode2019.common.Day; + +public class Day4 implements Day { + + public Day4() {} + + public static void main(String[] args) throws IOException { + new Day4().printParts(); + } + + @Override + public int part1() throws IOException { + return checkPasswords(false); + } + + public long meetsCriteria(int lowerBound, int higherBound, boolean checkGroup) { + return IntStream.range(lowerBound, higherBound+1).filter(e -> meetsCriteria(e, checkGroup)).count(); + } + + public boolean meetsCriteria(int input, boolean checkGroup) + { + int lastSeen = 10, current, adjacentTheSame = -2, skip = 10; + + for (int i = 0; input > 0; i++) { + current = input % 10; + if(skip != current && current == lastSeen) { + if(checkGroup && adjacentTheSame+1 == i) { + adjacentTheSame = -2; + skip = current; + } else if(adjacentTheSame == -2) { + adjacentTheSame = i; + } + } + if (lastSeen < current) + return false; + lastSeen = current; + input /= 10; + } + + return adjacentTheSame!=-2; + } + + + @Override + public int part2() throws IOException { + return checkPasswords(true); + } + + private int checkPasswords(boolean checkGroup) { + return Math.toIntExact(meetsCriteria(372037, 905157, checkGroup)); + } + +} From a3f1490b10e3877bba1d96115c263cd0b6482c90 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 4 Dec 2019 12:15:46 +0100 Subject: [PATCH 005/433] Simplified Day 2 after re-reading requirements --- .../com/sbaars/adventofcode2019/days/Day2.java | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day2.java b/src/main/java/com/sbaars/adventofcode2019/days/Day2.java index 2c8c72a9..b3b3df3c 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day2.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day2.java @@ -43,17 +43,14 @@ private boolean executeInstruction(int[] program, int i, int instruction) { @Override public int part2() throws IOException { - for(int i = 0;;i++) { - for(int j = 0; j<=i; j++) { - for(int k = 0; k<=i; k++) { - try { - if(execute(j, k) == 19690720) { - return 100 * j + k; - } - } catch(Exception e) {} + for(int i = 0; i<99;i++) { + for(int j = 0; j<99; j++) { + if(execute(i, j) == 19690720) { + return 100 * i + j; + } } - } } + return -1; } } From 915542d4a6f52255bd665e19d6ce8c662915d61a Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 4 Dec 2019 12:31:00 +0100 Subject: [PATCH 006/433] Day 2: More concise code --- .../java/com/sbaars/adventofcode2019/days/Day2.java | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day2.java b/src/main/java/com/sbaars/adventofcode2019/days/Day2.java index b3b3df3c..ea78188d 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day2.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day2.java @@ -27,14 +27,9 @@ private int execute(int x, int y) throws IOException { private boolean executeInstruction(int[] program, int i, int instruction) { switch(instruction) { - case 1: - program[program[i+3]] = program[program[i+1]] + program[program[i+2]]; - break; - case 2: - program[program[i+3]] = program[program[i+1]] * program[program[i+2]]; - break; - case 99: - return false; + case 1: program[program[i+3]] = program[program[i+1]] + program[program[i+2]]; break; + case 2: program[program[i+3]] = program[program[i+1]] * program[program[i+2]]; break; + case 99: return false; default: throw new IllegalStateException("Something went wrong!"); } From a677b8d872129b5ce8467aacd8ad3f82af48974f Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 4 Dec 2019 12:36:23 +0100 Subject: [PATCH 007/433] Day 3: Refactoring --- .../sbaars/adventofcode2019/days/Day3.java | 50 +++++++------------ 1 file changed, 17 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day3.java b/src/main/java/com/sbaars/adventofcode2019/days/Day3.java index 40e9ae94..794bdc38 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day3.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day3.java @@ -42,21 +42,25 @@ private Set calculateDistance(Walk[] walks1, Set walkedLocations, bo case LEFT: x--; break; case RIGHT: x++; break; } - Step currentStep = new Step(new Point(x,y), steps); - if(collect) { - if(walkedLocations.contains(currentStep) && !intersectingLocations.contains(currentStep)) { - Step step = walkedLocations.stream().filter(e -> e.equals(currentStep)).findAny().get(); - intersectingLocations.add(step); - step.combine(currentStep); - } - } else { - walkedLocations.add(currentStep); - } + performStep(walkedLocations, collect, intersectingLocations, x, y, steps); steps++; } } return intersectingLocations; } + + private void performStep(Set walkedLocations, boolean collect, Set intersectingLocations, int x, int y, int steps) { + Step currentStep = new Step(new Point(x,y), steps); + if(collect) { + if(walkedLocations.contains(currentStep) && !intersectingLocations.contains(currentStep)) { + Step step = walkedLocations.stream().filter(e -> e.equals(currentStep)).findAny().get(); + intersectingLocations.add(step); + step.combine(currentStep); + } + } else { + walkedLocations.add(currentStep); + } + } public int distance(Point p) { return Math.abs(p.x) + Math.abs(p.y); @@ -92,34 +96,14 @@ public Step(Point point, int steps) { @Override public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + getEnclosingInstance().hashCode(); - result = prime * result + ((point == null) ? 0 : point.hashCode()); - return result; + return 31 + ((point == null) ? 0 : point.hashCode()); } @Override public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) + if (!(obj instanceof Step)) return false; - if (getClass() != obj.getClass()) - return false; - Step other = (Step) obj; - if (!getEnclosingInstance().equals(other.getEnclosingInstance())) - return false; - if (point == null) { - if (other.point != null) - return false; - } else if (!point.equals(other.point)) - return false; - return true; - } - - private Day3 getEnclosingInstance() { - return Day3.this; + return point.equals(((Step) obj).point); } public void combine(Step step) { From 07a21a4ce294937559e6b11495eb0db9d0050c46 Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 5 Dec 2019 15:23:22 +0100 Subject: [PATCH 008/433] Day 5 Part 1 --- .../sbaars/adventofcode2019/days/Day2.java | 2 +- .../sbaars/adventofcode2019/days/Day5.java | 128 ++++++++++++++++++ src/main/resources/day5.txt | 1 + 3 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/sbaars/adventofcode2019/days/Day5.java create mode 100644 src/main/resources/day5.txt diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day2.java b/src/main/java/com/sbaars/adventofcode2019/days/Day2.java index ea78188d..4ecdb381 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day2.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day2.java @@ -18,7 +18,7 @@ public int part1() throws IOException { } private int execute(int x, int y) throws IOException { - int[] program = Arrays.stream(getFileAsString(new File(Day1.class.getClassLoader().getResource("day2.txt").getFile())).split(",")).mapToInt(Integer::parseInt).toArray();; + int[] program = Arrays.stream(getFileAsString(new File(Day1.class.getClassLoader().getResource("day2.txt").getFile())).split(",")).mapToInt(Integer::parseInt).toArray(); program[1] = x; program[2] = y; for(int i = 0; executeInstruction(program, i, program[i]); i+=4); diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day5.java b/src/main/java/com/sbaars/adventofcode2019/days/Day5.java new file mode 100644 index 00000000..1b0920b3 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day5.java @@ -0,0 +1,128 @@ +package com.sbaars.adventofcode2019.days; + +import java.io.File; +import java.io.IOException; +import java.util.Arrays; +import java.util.stream.IntStream; + +import com.sbaars.adventofcode2019.common.Day; +import com.sbaars.adventofcode2019.util.DoesFileOperations; + +public class Day5 implements Day, DoesFileOperations { + + boolean parameterMode = true; + private static int NUM_MODES = 3; + private int instructionCounter = 0; + + public static void main(String[] args) throws IOException { + new Day5().printParts(); + } + + public int part1() throws IOException { + return execute(12, 2); + } + + private int execute(int x, int y) throws IOException { + int[] program = Arrays.stream(getFileAsString(new File(Day1.class.getClassLoader().getResource("day5.txt").getFile())).split(",")).mapToInt(Integer::parseInt).toArray();; + //program[1] = x; + //program[2] = y; + for(; executeInstruction(program, program[instructionCounter]); instructionCounter+=nParams(program[instructionCounter])+1); + return program[0]; + } + + /*private boolean executeInstruction(int[] program, int i, int instruction) { + switch(instruction) { + case 1: program[program[i+3]] = program[program[i+1]] + program[program[i+2]]; + case 2: program[program[i+3]] = program[program[i+1]] * program[program[i+2]]; break; + case 99: return false; + default: throw new IllegalStateException("Something went wrong!"); + } + + return true; + }*/ + + private boolean executeInstruction(int[] program, int i, int instruction) { + System.out.println("Executing instruction "+instruction+" at i "+i); + if(instruction>99) + return parseComplexInstruction(program, i, instruction); + else if(instruction == 99) + return false; + return execute(program, i, instruction); + } + + private boolean execute(int[] program, int i, int instruction) { + return execute(program, new int[NUM_MODES], i, instruction); + } + + private boolean execute(int[] program, int[] method, int i, int instruction) { + int nParams = nParams(instruction); + int[] args = IntStream.range(0, nParams).map(j -> j == 0 ? program[i+nParams] : program[i+j]).toArray(); + if(args.length>2) Arrays.stream(new int[]{2, 1}).filter(j -> method[j] == 0).map(j -> j == 2 ? 1 : 2).forEach(j -> args[j] = program[args[j]]); + if(instruction == 4 && method[2] == 0) args[0] = program[args[0]]; + return executeInstruction(program, args, instruction); + } + + /*static int reverseRange(int num, int from, int to) { + return to - num + from - 1; + }*/ + + private boolean executeInstruction(int[] program, int[] args, int instruction) { + switch(instruction) { + case 1: program[args[0]] = args[1] + args[2]; break; + case 2: program[args[0]] = args[1] * args[2]; break; + case 3: program[args[0]] = 1; break; + case 4: if(args[0]!=0) System.out.println(args[0]); break; + default: throw new IllegalStateException("Something went wrong!"); + } + + return true; + } + + private boolean parseComplexInstruction(int[] program, int i, int instruction) { + int[] instructions = getInstructions(instruction); + int opcode = getOpCode(instructions); + System.out.println("Parsed as "+Arrays.toString(instructions)+" opcode "+opcode); + return execute(program, instructions, i, opcode); + + } + + private int getOpCode(int instruction) { + return getOpCode(getInstructions(instruction)); + } + + private int getOpCode(int[] instructions) { + return (instructions[3] * 10) + instructions[4]; + } + + private int[] getInstructions(int instruction) { + int[] instructions = new int[5]; + for(int j = instructions.length-1; instruction>0; j--) { + instructions[j] = instruction % 10; + instruction /= 10; + } + return instructions; + } + + /*private int[] getParams(int[] program, int instruction, boolean parameterMode) { + int nParams = nParams(instruction); + IntStream params = IntStream.range(1,nParams+1).map(i -> program[i]); + if(parameterMode) params = + } + + */private int nParams(int instruction) { + switch(instruction) { + case 1: + case 2: return 3; + case 3: + case 4: return 1; + default: if(instruction>=99) return nParams(getOpCode(instruction)); + else throw new IllegalStateException("Something went wrong!"); + } + } + + @Override + public int part2() throws IOException { + return -1; + } + +} diff --git a/src/main/resources/day5.txt b/src/main/resources/day5.txt new file mode 100644 index 00000000..e2f7f832 --- /dev/null +++ b/src/main/resources/day5.txt @@ -0,0 +1 @@ +3,225,1,225,6,6,1100,1,238,225,104,0,1,192,154,224,101,-161,224,224,4,224,102,8,223,223,101,5,224,224,1,223,224,223,1001,157,48,224,1001,224,-61,224,4,224,102,8,223,223,101,2,224,224,1,223,224,223,1102,15,28,225,1002,162,75,224,1001,224,-600,224,4,224,1002,223,8,223,1001,224,1,224,1,224,223,223,102,32,57,224,1001,224,-480,224,4,224,102,8,223,223,101,1,224,224,1,224,223,223,1101,6,23,225,1102,15,70,224,1001,224,-1050,224,4,224,1002,223,8,223,101,5,224,224,1,224,223,223,101,53,196,224,1001,224,-63,224,4,224,102,8,223,223,1001,224,3,224,1,224,223,223,1101,64,94,225,1102,13,23,225,1101,41,8,225,2,105,187,224,1001,224,-60,224,4,224,1002,223,8,223,101,6,224,224,1,224,223,223,1101,10,23,225,1101,16,67,225,1101,58,10,225,1101,25,34,224,1001,224,-59,224,4,224,1002,223,8,223,1001,224,3,224,1,223,224,223,4,223,99,0,0,0,677,0,0,0,0,0,0,0,0,0,0,0,1105,0,99999,1105,227,247,1105,1,99999,1005,227,99999,1005,0,256,1105,1,99999,1106,227,99999,1106,0,265,1105,1,99999,1006,0,99999,1006,227,274,1105,1,99999,1105,1,280,1105,1,99999,1,225,225,225,1101,294,0,0,105,1,0,1105,1,99999,1106,0,300,1105,1,99999,1,225,225,225,1101,314,0,0,106,0,0,1105,1,99999,1108,226,226,224,102,2,223,223,1005,224,329,101,1,223,223,107,226,226,224,1002,223,2,223,1005,224,344,1001,223,1,223,107,677,226,224,102,2,223,223,1005,224,359,101,1,223,223,7,677,226,224,102,2,223,223,1005,224,374,101,1,223,223,108,226,226,224,102,2,223,223,1006,224,389,101,1,223,223,1007,677,677,224,102,2,223,223,1005,224,404,101,1,223,223,7,226,677,224,102,2,223,223,1006,224,419,101,1,223,223,1107,226,677,224,1002,223,2,223,1005,224,434,1001,223,1,223,1108,226,677,224,102,2,223,223,1005,224,449,101,1,223,223,108,226,677,224,102,2,223,223,1005,224,464,1001,223,1,223,8,226,677,224,1002,223,2,223,1005,224,479,1001,223,1,223,1007,226,226,224,102,2,223,223,1006,224,494,101,1,223,223,1008,226,677,224,102,2,223,223,1006,224,509,101,1,223,223,1107,677,226,224,1002,223,2,223,1006,224,524,1001,223,1,223,108,677,677,224,1002,223,2,223,1005,224,539,1001,223,1,223,1107,226,226,224,1002,223,2,223,1006,224,554,1001,223,1,223,7,226,226,224,1002,223,2,223,1006,224,569,1001,223,1,223,8,677,226,224,102,2,223,223,1006,224,584,101,1,223,223,1008,677,677,224,102,2,223,223,1005,224,599,101,1,223,223,1007,226,677,224,1002,223,2,223,1006,224,614,1001,223,1,223,8,677,677,224,1002,223,2,223,1005,224,629,101,1,223,223,107,677,677,224,102,2,223,223,1005,224,644,101,1,223,223,1108,677,226,224,102,2,223,223,1005,224,659,101,1,223,223,1008,226,226,224,102,2,223,223,1006,224,674,1001,223,1,223,4,223,99,226 \ No newline at end of file From def6147a275006bd37aa9a239020743d8835b32f Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 5 Dec 2019 15:35:29 +0100 Subject: [PATCH 009/433] Cleanup day 5 code --- .../sbaars/adventofcode2019/days/Day5.java | 70 +++++++------------ 1 file changed, 25 insertions(+), 45 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day5.java b/src/main/java/com/sbaars/adventofcode2019/days/Day5.java index 1b0920b3..31543b07 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day5.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day5.java @@ -19,70 +19,52 @@ public static void main(String[] args) throws IOException { } public int part1() throws IOException { - return execute(12, 2); + return execute(); } - private int execute(int x, int y) throws IOException { + private int execute() throws IOException { int[] program = Arrays.stream(getFileAsString(new File(Day1.class.getClassLoader().getResource("day5.txt").getFile())).split(",")).mapToInt(Integer::parseInt).toArray();; - //program[1] = x; - //program[2] = y; - for(; executeInstruction(program, program[instructionCounter]); instructionCounter+=nParams(program[instructionCounter])+1); - return program[0]; + int result; + for(; (result = executeInstruction(program, program[instructionCounter])) == -1; instructionCounter+=nParams(program[instructionCounter])+1); + return result; } - /*private boolean executeInstruction(int[] program, int i, int instruction) { - switch(instruction) { - case 1: program[program[i+3]] = program[program[i+1]] + program[program[i+2]]; - case 2: program[program[i+3]] = program[program[i+1]] * program[program[i+2]]; break; - case 99: return false; - default: throw new IllegalStateException("Something went wrong!"); - } - - return true; - }*/ - - private boolean executeInstruction(int[] program, int i, int instruction) { - System.out.println("Executing instruction "+instruction+" at i "+i); + private int executeInstruction(int[] program, int instruction) { if(instruction>99) - return parseComplexInstruction(program, i, instruction); + return parseComplexInstruction(program, instruction); else if(instruction == 99) - return false; - return execute(program, i, instruction); + throw new IllegalStateException("Hit terminal code 99 before finding diagnostic code!"); + return execute(program, instruction); } - private boolean execute(int[] program, int i, int instruction) { - return execute(program, new int[NUM_MODES], i, instruction); + private int execute(int[] program, int instruction) { + return execute(program, new int[NUM_MODES], instruction); } - private boolean execute(int[] program, int[] method, int i, int instruction) { + private int execute(int[] program, int[] method, int instruction) { int nParams = nParams(instruction); - int[] args = IntStream.range(0, nParams).map(j -> j == 0 ? program[i+nParams] : program[i+j]).toArray(); + int[] args = IntStream.range(0, nParams).map(j -> j == 0 ? program[instructionCounter+nParams] : program[instructionCounter+j]).toArray(); if(args.length>2) Arrays.stream(new int[]{2, 1}).filter(j -> method[j] == 0).map(j -> j == 2 ? 1 : 2).forEach(j -> args[j] = program[args[j]]); if(instruction == 4 && method[2] == 0) args[0] = program[args[0]]; return executeInstruction(program, args, instruction); } - /*static int reverseRange(int num, int from, int to) { - return to - num + from - 1; - }*/ - - private boolean executeInstruction(int[] program, int[] args, int instruction) { + private int executeInstruction(int[] program, int[] args, int instruction) { switch(instruction) { case 1: program[args[0]] = args[1] + args[2]; break; case 2: program[args[0]] = args[1] * args[2]; break; case 3: program[args[0]] = 1; break; - case 4: if(args[0]!=0) System.out.println(args[0]); break; + case 4: if(args[0]!=0) return args[0]; break; default: throw new IllegalStateException("Something went wrong!"); } - return true; + return -1; } - private boolean parseComplexInstruction(int[] program, int i, int instruction) { + private int parseComplexInstruction(int[] program, int instruction) { int[] instructions = getInstructions(instruction); int opcode = getOpCode(instructions); - System.out.println("Parsed as "+Arrays.toString(instructions)+" opcode "+opcode); - return execute(program, instructions, i, opcode); + return execute(program, instructions, opcode); } @@ -103,18 +85,16 @@ private int[] getInstructions(int instruction) { return instructions; } - /*private int[] getParams(int[] program, int instruction, boolean parameterMode) { - int nParams = nParams(instruction); - IntStream params = IntStream.range(1,nParams+1).map(i -> program[i]); - if(parameterMode) params = - } - - */private int nParams(int instruction) { + private int nParams(int instruction) { switch(instruction) { - case 1: - case 2: return 3; case 3: case 4: return 1; + case 5: + case 6: return 2; + case 1: + case 2: + case 7: + case 8: return 3; default: if(instruction>=99) return nParams(getOpCode(instruction)); else throw new IllegalStateException("Something went wrong!"); } From 53531047bc44dddcd6462d994147f4ff6b64dcaa Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 5 Dec 2019 15:44:44 +0100 Subject: [PATCH 010/433] Refactoring --- .../sbaars/adventofcode2019/days/Day1.java | 2 ++ .../sbaars/adventofcode2019/days/Day2.java | 29 +++++++++++-------- .../sbaars/adventofcode2019/days/Day3.java | 12 ++++---- .../sbaars/adventofcode2019/days/Day4.java | 11 ++++--- .../sbaars/adventofcode2019/days/Day5.java | 4 +-- 5 files changed, 33 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day1.java b/src/main/java/com/sbaars/adventofcode2019/days/Day1.java index 2ebdff09..fb2af57a 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day1.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day1.java @@ -15,10 +15,12 @@ public static void main(String[] args) throws IOException new Day1().printParts(); } + @Override public int part1() throws IOException { return createNumberStream().map(this::getFuel).sum(); } + @Override public int part2() throws IOException { return createNumberStream().map(this::getRequiredFuel).sum(); } diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day2.java b/src/main/java/com/sbaars/adventofcode2019/days/Day2.java index 4ecdb381..0417c528 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day2.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day2.java @@ -13,9 +13,26 @@ public static void main(String[] args) throws IOException { new Day2().printParts(); } + @Override public int part1() throws IOException { return execute(12, 2); } + + @Override + public int part2() throws IOException { + return bruteForceFindingNumber(19690720, 99); + } + + private int bruteForceFindingNumber(int number, int bound) throws IOException { + for(int i = 0; i distance(e.point)).min().orElse(Integer.MAX_VALUE); } + + @Override + public int part2() throws IOException { + return intersect.stream().mapToInt(e -> e.steps).min().orElse(Integer.MAX_VALUE); + } private Set calculateDistance(Walk[] walks1, Set walkedLocations, boolean collect) { Set intersectingLocations = new HashSet<>(); @@ -69,10 +75,6 @@ public int distance(Point p) { private Walk[] mapToWalks(String string) { return Arrays.stream(string.split(",")).map(Walk::new).toArray(Walk[]::new); } - - public int part2() throws IOException { - return intersect.stream().mapToInt(e -> e.steps).min().orElse(Integer.MAX_VALUE); - } class Walk { private final Direction dir; diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day4.java b/src/main/java/com/sbaars/adventofcode2019/days/Day4.java index 5ec9ea2b..ce7ef287 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day4.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day4.java @@ -18,6 +18,11 @@ public int part1() throws IOException { return checkPasswords(false); } + @Override + public int part2() throws IOException { + return checkPasswords(true); + } + public long meetsCriteria(int lowerBound, int higherBound, boolean checkGroup) { return IntStream.range(lowerBound, higherBound+1).filter(e -> meetsCriteria(e, checkGroup)).count(); } @@ -45,12 +50,6 @@ public boolean meetsCriteria(int input, boolean checkGroup) return adjacentTheSame!=-2; } - - @Override - public int part2() throws IOException { - return checkPasswords(true); - } - private int checkPasswords(boolean checkGroup) { return Math.toIntExact(meetsCriteria(372037, 905157, checkGroup)); } diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day5.java b/src/main/java/com/sbaars/adventofcode2019/days/Day5.java index 31543b07..928ab867 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day5.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day5.java @@ -9,8 +9,7 @@ import com.sbaars.adventofcode2019.util.DoesFileOperations; public class Day5 implements Day, DoesFileOperations { - - boolean parameterMode = true; + private static int NUM_MODES = 3; private int instructionCounter = 0; @@ -18,6 +17,7 @@ public static void main(String[] args) throws IOException { new Day5().printParts(); } + @Override public int part1() throws IOException { return execute(); } From 072dbd3feaa7e53636c042bc6869641ff50fa87a Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 5 Dec 2019 15:51:19 +0100 Subject: [PATCH 011/433] Added additional cases for part 2 --- .../sbaars/adventofcode2019/days/Day5.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day5.java b/src/main/java/com/sbaars/adventofcode2019/days/Day5.java index 928ab867..2f3d23a3 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day5.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day5.java @@ -12,6 +12,7 @@ public class Day5 implements Day, DoesFileOperations { private static int NUM_MODES = 3; private int instructionCounter = 0; + private int part; public static void main(String[] args) throws IOException { new Day5().printParts(); @@ -19,6 +20,13 @@ public static void main(String[] args) throws IOException { @Override public int part1() throws IOException { + part = 1; + return execute(); + } + + @Override + public int part2() throws IOException { + part = 2; return execute(); } @@ -53,8 +61,12 @@ private int executeInstruction(int[] program, int[] args, int instruction) { switch(instruction) { case 1: program[args[0]] = args[1] + args[2]; break; case 2: program[args[0]] = args[1] * args[2]; break; - case 3: program[args[0]] = 1; break; + case 3: program[args[0]] = part == 1 ? 1 : 5; break; case 4: if(args[0]!=0) return args[0]; break; + case 5: if(args[1] != 0) instructionCounter = args[0]; break; + case 6: if(args[1] == 0) instructionCounter = args[0]; break; + case 7: program[args[0]] = args[1] < args[2] ? 1 : 0; break; + case 8: program[args[0]] = args[1] == args[2] ? 1 : 0; break; default: throw new IllegalStateException("Something went wrong!"); } @@ -99,10 +111,4 @@ private int nParams(int instruction) { else throw new IllegalStateException("Something went wrong!"); } } - - @Override - public int part2() throws IOException { - return -1; - } - } From 92f8b2cce970b97047095ce7d8a8e8e7a5b3287d Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 5 Dec 2019 16:29:58 +0100 Subject: [PATCH 012/433] Finished day 5 --- .../com/sbaars/adventofcode2019/days/Day5.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day5.java b/src/main/java/com/sbaars/adventofcode2019/days/Day5.java index 2f3d23a3..183d2c07 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day5.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day5.java @@ -10,7 +10,7 @@ public class Day5 implements Day, DoesFileOperations { - private static int NUM_MODES = 3; + private static final int NUM_MODES = 3; private int instructionCounter = 0; private int part; @@ -27,13 +27,14 @@ public int part1() throws IOException { @Override public int part2() throws IOException { part = 2; + instructionCounter = 0; return execute(); } private int execute() throws IOException { int[] program = Arrays.stream(getFileAsString(new File(Day1.class.getClassLoader().getResource("day5.txt").getFile())).split(",")).mapToInt(Integer::parseInt).toArray();; int result; - for(; (result = executeInstruction(program, program[instructionCounter])) == -1; instructionCounter+=nParams(program[instructionCounter])+1); + while((result = executeInstruction(program, program[instructionCounter])) == -1); return result; } @@ -52,8 +53,12 @@ private int execute(int[] program, int instruction) { private int execute(int[] program, int[] method, int instruction) { int nParams = nParams(instruction); int[] args = IntStream.range(0, nParams).map(j -> j == 0 ? program[instructionCounter+nParams] : program[instructionCounter+j]).toArray(); - if(args.length>2) Arrays.stream(new int[]{2, 1}).filter(j -> method[j] == 0).map(j -> j == 2 ? 1 : 2).forEach(j -> args[j] = program[args[j]]); + if(args.length>=2) { + if(method[2] == 0) args[1] = program[args[1]]; + if(args.length>=3 && method[1] == 0) args[2] = program[args[2]]; + } if(instruction == 4 && method[2] == 0) args[0] = program[args[0]]; + if((instruction == 5 || instruction == 6) && method[1] == 0) args[0] = program[args[0]]; return executeInstruction(program, args, instruction); } @@ -63,13 +68,13 @@ private int executeInstruction(int[] program, int[] args, int instruction) { case 2: program[args[0]] = args[1] * args[2]; break; case 3: program[args[0]] = part == 1 ? 1 : 5; break; case 4: if(args[0]!=0) return args[0]; break; - case 5: if(args[1] != 0) instructionCounter = args[0]; break; - case 6: if(args[1] == 0) instructionCounter = args[0]; break; + case 5: if(args[1] != 0) { instructionCounter = args[0]; return -1; } break; + case 6: if(args[1] == 0) { instructionCounter = args[0]; return -1; } break; case 7: program[args[0]] = args[1] < args[2] ? 1 : 0; break; case 8: program[args[0]] = args[1] == args[2] ? 1 : 0; break; default: throw new IllegalStateException("Something went wrong!"); } - + instructionCounter+=nParams(instruction) + 1; return -1; } From 20824b20f542ff3328a068ee8cdb15d1a960f7a8 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 6 Dec 2019 06:14:56 +0100 Subject: [PATCH 013/433] Part 1 Day 6 --- .../sbaars/adventofcode2019/days/Day6.java | 57 + .../sbaars/adventofcode2019/util/ListMap.java | 65 + src/main/resources/day6.txt | 1294 +++++++++++++++++ 3 files changed, 1416 insertions(+) create mode 100644 src/main/java/com/sbaars/adventofcode2019/days/Day6.java create mode 100644 src/main/java/com/sbaars/adventofcode2019/util/ListMap.java create mode 100644 src/main/resources/day6.txt diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day6.java b/src/main/java/com/sbaars/adventofcode2019/days/Day6.java new file mode 100644 index 00000000..2d25ee0f --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day6.java @@ -0,0 +1,57 @@ +package com.sbaars.adventofcode2019.days; + +import java.io.File; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.Map.Entry; +import java.util.concurrent.atomic.AtomicInteger; + +import com.sbaars.adventofcode2019.common.Day; +import com.sbaars.adventofcode2019.util.DoesFileOperations; +import com.sbaars.adventofcode2019.util.ListMap; + +public class Day6 implements Day, DoesFileOperations +{ + public static void main(String[] args) throws IOException + { + new Day6().printParts(); + } + + @Override + public int part1() throws IOException { + ListMap orbits = new ListMap<>(); + String[] nums = createNumberStream(); + for(String num : nums) { + String[] parts = num.split("\\)"); + orbits.addTo(parts[0], parts[1]); + } + AtomicInteger o = new AtomicInteger(); + extracted(orbits, o); + return o.get(); + } + + private void extracted(ListMap orbits, AtomicInteger o) { + for(Entry> entry : orbits.entrySet()) { + extracted(orbits, o, entry.getValue()); + } + } + + private void extracted(ListMap orbits, AtomicInteger o, List entry) { + for(String str : entry) { + o.incrementAndGet(); + if(orbits.containsKey(str)) { + extracted(orbits, o, orbits.get(str)); + } + } + } + + @Override + public int part2() throws IOException { + return 0; + } + + private String[] createNumberStream() throws IOException { + return Arrays.stream(getFileAsString(new File(Day6.class.getClassLoader().getResource("day6.txt").getFile())).split(System.lineSeparator())).toArray(String[]::new); + } +} diff --git a/src/main/java/com/sbaars/adventofcode2019/util/ListMap.java b/src/main/java/com/sbaars/adventofcode2019/util/ListMap.java new file mode 100644 index 00000000..0ae585d9 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/util/ListMap.java @@ -0,0 +1,65 @@ +package com.sbaars.adventofcode2019.util; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class ListMap extends HashMap> { + /** + * + */ + private static final long serialVersionUID = 1L; + + public ListMap() { + } + + public ListMap(int initialCapacity, float loadFactor) { + super(initialCapacity, loadFactor); + } + + public ListMap(int initialCapacity) { + super(initialCapacity); + } + + public ListMap(Map> m) { + super(m); + } + + public List addTo(K key, V value) { + List l; + if(super.containsKey(key)) { + l = super.get(key); + } else l = new ArrayList<>(); + l.add(value); + return super.put(key, l); + } + + public List addTo(K key, V[] value) { + List l; + if(super.containsKey(key)) { + l = super.get(key); + } else l = new ArrayList<>(); + Collections.addAll(l, value); + return super.put(key, l); + } + + @SuppressWarnings("unchecked") + @Override + public List get(Object key){ + if(!super.containsKey(key)) + super.put((K) key, new ArrayList<>()); + return super.get(key); + } + + public Entry> getEntryForValue(V i) { + System.out.println(Arrays.toString(values().toArray())); + Optional>> findAny = entrySet().stream().filter(e -> e.getValue().contains(i)).findAny(); + if(!findAny.isPresent()) + throw new IllegalAccessError("Value "+i+" does not exist in this map!"); + return findAny.get(); + } +} diff --git a/src/main/resources/day6.txt b/src/main/resources/day6.txt new file mode 100644 index 00000000..28f6c892 --- /dev/null +++ b/src/main/resources/day6.txt @@ -0,0 +1,1294 @@ +MB5)V1S +VYJ)JRF +SLW)9YR +CPL)8KQ +Q5P)H7W +TJT)139 +PYD)XMX +4S5)K2V +RWW)JTL +HNC)81N +64N)V96 +RRM)FXW +Y8R)1C1 +VL8)M6N +G7L)RQJ +5C3)SC4 +JZL)DGX +C7B)KSS +2X5)5YY +W91)5R1 +KP8)QYY +NCL)5WX +HN9)4LZ +4Z6)15F +LHJ)B7D +S3S)J8Z +ZCW)KC1 +3TJ)2RP +J9F)SXH +SHX)WH9 +M4M)6NK +23F)Q7S +B7Y)ZM5 +M7H)D8G +N8F)K1F +5PV)SXD +HGX)5BM +LH8)C2L +XFM)ZHM +H1L)XYG +4VH)W46 +2Q8)6V5 +G41)LNT +GNY)Y8R +95L)MJC +FPR)X8M +MS4)YL4 +B8B)YL6 +6N4)SWY +B65)X7B +N15)C89 +LX4)TBZ +3W2)JRH +MVN)34C +XMX)DW8 +221)5CM +QPP)14R +SRB)7SK +3P9)MKR +DGX)6FT +GQG)T3J +JS4)XTJ +9MQ)FKR +B29)PWB +XHC)NX1 +55D)YCV +CV2)3FH +QN1)MFX +P2B)B51 +Z4D)Z2S +3MZ)GYC +LCQ)FF9 +VPZ)CV2 +Z4D)K9P +9F2)CV6 +NJS)HRR +W7Z)6CL +7NL)M9M +LJG)426 +6LP)24X +YQ7)CXX +4RB)BKC +KNW)2X5 +KCY)4D2 +2GC)GV9 +YWN)DWL +JML)131 +JHR)3G4 +KBM)BMX +GWB)S1P +LMW)2LL +DS7)8X3 +8KT)ZCW +MHT)9XZ +MV8)B7Y +VPB)KT8 +6RQ)87P +RP6)7QR +KQP)PXT +GBG)LCQ +CLY)RVF +64S)VP8 +FR9)K5X +K37)QJK +9ZB)MS1 +V6C)CXT +SC2)VJS +B45)9KK +ZH9)VWY +R17)XLS +N5Z)KWV +QWH)HY7 +2LL)79J +1DF)RT5 +MGH)XD4 +VZ3)9YW +413)17F +YL4)15X +ZJB)SHX +HGF)VN7 +4TW)TGX +3N4)SDF +KLJ)2FR +J5R)JZL +B59)WW6 +KRX)JGM +N75)78C +T4B)H2H +2VB)JG3 +7MG)4N2 +C7M)2BK +MKR)LBF +KFX)6KG +48T)844 +H1W)9XX +TGX)PN7 +GGK)22B +M8N)GNY +L6R)WVW +VRY)B15 +9YR)6RQ +QQ6)1KB +R22)STY +KC1)6RW +Q5Z)849 +XWK)VFW +GFD)C8Z +L5D)J2Y +74R)3TJ +D94)3P9 +JRH)HKV +3DZ)CFH +WKN)44S +JJC)9MQ +VKT)VBW +KT8)M7P +NH8)FDG +F7N)7MG +6RQ)RQM +V4T)ZN8 +25C)2L3 +WJW)DG9 +N5X)SRB +QZK)GLJ +WG4)K56 +844)J3V +HGX)KMR +87P)HKX +MK1)WTY +PC3)4TR +LG8)B29 +SDR)FWN +9ZM)SVT +3K3)XJ6 +WV1)G41 +NKV)36R +WFG)4M1 +WVW)1TQ +NQD)WF1 +B9Q)3YV +CTP)VZB +72S)NSM +755)X7S +MB2)JWB +GD8)HGX +3FH)Q1H +P8P)TD2 +8XK)KP8 +1B4)7LK +3WC)LXK +YZP)QZK +C72)1M6 +VZB)LZV +TC6)4RB +DH6)LJG +6XL)SKB +G52)3MZ +THK)F8F +S1P)NJK +QPG)5NF +9J8)W5V +6CJ)BY3 +F8F)L4S +L7X)4P2 +9NQ)RWW +V4V)BSC +YJW)G7F +3CK)GMH +VYR)LRM +XXP)JML +Z1S)3QH +3SH)YBF +WTY)QR4 +FZ2)BMB +JZ5)Z5Q +HDZ)2V9 +CTK)HRP +VWY)9HX +YNN)Z5F +N97)P1K +8NJ)JBK +VF7)JD2 +4GG)KC6 +8KS)YJ6 +DH2)HXL +HB3)1HK +K56)DFB +4H6)K6Y +M7P)3WC +DG9)88R +VRB)Y2X +NMZ)RRS +T3J)NQ6 +KYZ)KYX +TNN)48T +SG7)83G +JCK)QFN +5HH)1B4 +16R)C4S +CQJ)KCS +6PH)2W6 +89Q)7SB +NNK)L9J +77G)KTN +S2C)YOU +KFK)57L +LJ5)1BV +CCB)XQ8 +14R)T7Y +3W2)TYQ +KNC)KF6 +TW1)N5Z +ZCQ)8NJ +89G)5XD +Z15)SMZ +R5C)VMJ +CTJ)QWH +5NF)G52 +24X)SBP +Z4K)HN9 +6KG)BLM +66N)152 +CCX)TTM +P1X)3CM +Q7Q)KYZ +VFL)LX4 +SCT)KJ7 +5VK)R8D +MKH)RZ4 +H2H)WKN +6V5)9TW +W4G)QLS +LZV)D82 +RHL)CLG +QG8)LX2 +7S1)B7T +BY3)CMC +HBP)RD7 +9PR)FVP +72J)Y14 +PMM)8ZV +MZ8)MFN +3GD)8Y5 +ZJ3)WJW +5HZ)X2V +FYZ)G5R +WMR)WT8 +HNZ)6GW +9XX)33J +6QS)58X +11L)VWW +4LZ)MQT +MQT)PYS +BM6)YRP +658)LG8 +NGZ)1VD +HRK)ZVG +RZG)RPJ +83G)B7B +JG3)BLQ +2SG)MQ4 +B6C)4V6 +GLJ)ST5 +7MQ)P9X +3Y9)1ZB +K9P)D9Y +CJ8)LM6 +KCY)VYJ +GVY)18R +SZG)QCX +15F)S5F +35W)YST +9NQ)BYJ +VGX)8LH +WQM)2HT +QR4)ZLF +SWY)HWK +P9X)HY6 +LGH)ZJ4 +GYC)NGZ +81F)P4T +9BF)CTF +5Q1)1RC +6MR)3X6 +9HX)X83 +DBQ)C9D +1KP)9F2 +J8Z)JCK +Z5R)S2Z +B7B)KRX +ZM5)1YF +H2N)G5C +FSR)9ZM +3YV)74R +93T)MCN +5HK)MVS +V22)4Z6 +RSG)N15 +YDJ)F9N +K6Y)RSZ +3CM)169 +F2L)39W +CK4)842 +G6Q)S1W +D3H)55D +842)YCL +NXQ)L67 +KG8)NDS +LGD)2QJ +MFX)JLD +1KB)Z4D +RMW)CWB +LC2)QC1 +Q36)HTW +SG7)CJX +9BH)N34 +85F)YNF +LVD)9BH +7GL)KNC +SDF)C1Z +68R)WQC +BPW)N8F +3G4)71T +JFJ)CR2 +YFD)6CJ +Q8N)XMD +2CV)X3M +NPZ)89Q +SSK)9TP +QC1)VPZ +CML)9MV +4NC)GVY +T26)9NQ +8Y5)TDB +TTM)9PR +7ZY)3XT +MQL)PXS +LXK)2SG +FWP)LBD +CSY)C72 +FYQ)B2F +VYJ)SX8 +ZHV)6QS +KKB)1ZM +XRN)6XL +VN4)6XV +KWV)KW5 +SBP)971 +BMX)FXV +7K4)L65 +7XV)791 +DW8)RSK +9XZ)5CD +KG8)5C3 +LBD)WZ3 +7DC)T4B +1J7)XN9 +KF6)GJR +TPV)FR9 +B7T)89F +F94)KLB +3CV)49V +PN7)J89 +CLY)F2P +71Z)YZP +HRR)X9Z +1SF)QQ6 +MKR)5P3 +XLB)G3P +3XT)6FC +WSC)TR9 +1SF)8JZ +YMK)7T6 +YLW)Q9Y +LQC)FSX +971)9LV +PL3)MMV +78C)Q72 +NS8)W6M +RPW)5YW +91Q)QKC +B9B)7Q4 +Q3J)B2D +2ZP)YMK +MSS)RP6 +N6H)X4V +5P3)PHS +7LP)VXP +FJT)251 +N9G)N71 +21W)XRJ +FFT)Z22 +89F)VRY +45S)MZ8 +8J5)98X +4YF)HCN +3X6)WFG +R8D)THY +YNS)KT3 +2TZ)W6V +MFN)P6B +1HK)WSV +PXS)YQ7 +7LJ)PKH +QHG)4TW +G16)7QV +CXX)GL5 +KDN)NNT +TPS)JZ3 +X7B)RSG +6B1)JKD +CLG)ZGY +WQC)QTP +MYZ)3N4 +Y8R)KMW +YL6)45S +H25)459 +9TW)M3N +HDF)SLJ +LX2)5V6 +6SD)2ZC +KGQ)XWK +85H)7ZV +459)XGH +VWW)M4M +27C)CTP +RKV)FSR +Z5K)9L1 +2P1)6N1 +WZ3)D94 +TF1)CV3 +1YF)T3S +F87)N9D +H7Z)QPP +NDS)GP1 +GLN)R5Q +BHV)XRN +4T5)658 +QRF)HW8 +Q66)WWZ +2Q6)DWD +7T6)L9V +RVF)MXJ +RZ4)WQM +V9T)SR2 +M21)CTK +ZDW)QP4 +WF1)VRB +VXR)KFX +NHR)HDF +11P)TG5 +K2V)YGJ +NH3)V76 +VNQ)WY7 +G8P)8YY +W5C)RZG +W46)T73 +C89)N5X +2V9)5FQ +P5K)NCL +DNK)98T +FLX)MB5 +VXG)R17 +YQ7)Q36 +L67)K62 +74G)28S +X9H)L6R +JRH)CJ6 +LBJ)JHR +SX8)TF1 +RD7)3P3 +H4X)KPW +J33)BWF +R4G)VXR +XRJ)Y25 +Q7Q)GD8 +2SG)P1X +4CB)66N +VYW)FF1 +YB6)CL1 +4QG)TX6 +PKH)FYQ +JPG)LL9 +M8W)RGV +XF9)NNK +COM)Q1M +SMZ)DS7 +DNP)68R +1V4)4KY +GDN)NHR +8D1)HCL +KC6)HGF +CPS)VFL +33K)XQZ +Y14)RJ6 +H3F)77G +NMG)F7N +FWN)3GD +36R)MZ3 +MG8)VGX +6CL)352 +JM4)FRB +43X)RNH +TBW)F8R +JCZ)V22 +11Q)W7Z +N1L)RVD +Q6V)DNP +BWF)Y9G +H8D)D13 +F8R)4QR +J1X)8X4 +XFJ)N35 +QTP)869 +G3P)11Q +K9L)QYX +KN6)XHC +MWF)G6Q +KTN)SYM +XGH)8MN +QPP)W52 +G2Y)FBZ +WBX)ZQ4 +4F7)7XV +152)KGQ +CJX)L5D +JZ3)4ZT +CCB)N9G +HK7)K4Q +JGH)MGH +VN7)PH4 +M9Z)S9V +SK8)PYD +3V9)G45 +ZN8)4QG +2Q6)HLM +D13)LYH +ZQ4)D6G +SVT)SDR +PFK)QZ4 +CXT)X31 +44S)5GB +1RC)PKD +LWT)G7L +RX1)VRQ +P31)WYC +47S)NMG +C1Z)YY5 +HWK)GGK +JC5)1GW +HVX)395 +W6M)VF7 +JTL)4GD +G5C)7BN +PQL)GMS +NXQ)45D +S5S)HNZ +C12)K2D +7P9)282 +QF5)3W2 +WH4)9VJ +YNF)M8W +5V6)DX7 +XQZ)7D2 +XTJ)HM5 +HTR)9H5 +HYN)71Z +7Q4)TF3 +WH9)GF2 +1CG)Q5Z +5GB)S3S +WFF)DJT +N4C)5BJ +32D)XB5 +KLB)SC2 +15X)1C3 +GDT)W3X +1GW)CKZ +GGJ)4W8 +5BJ)H7Z +PPT)7S1 +FY4)SCM +395)3K3 +HFT)K98 +2RP)LZ4 +49V)4LH +F2T)GCL +DJR)VTW +QW3)M8N +LYH)VYW +6N1)4YF +N34)VKT +1KB)YFD +3YB)ZB6 +RSZ)F2T +2FR)1V4 +MDJ)Z4K +K62)TW1 +J3V)NHJ +JML)GT8 +6RW)8CP +8ZV)9BF +XXP)NMZ +K4Q)T36 +L4S)22G +953)XFM +ZGY)HTR +RJ6)4H6 +HRP)TQD +NNT)5YP +L65)1H8 +KXB)8YB +T5D)P5K +LJY)VTL +SCS)HJ7 +35S)2RZ +NX1)THK +HY7)36Z +FXV)369 +RSK)4Z2 +2Y8)F9B +NNW)KG7 +WSV)78N +MMV)5GL +JLD)WSC +PZH)N7G +LL9)4Y4 +1BV)BG2 +XMD)NT6 +H9D)XF9 +MNV)W8J +SX8)V3N +P8Y)CW1 +T73)3F9 +D82)32Z +XPH)PLM +352)NL6 +Z94)D43 +NK7)7QT +N35)KHR +NM1)MG8 +8JZ)TJT +923)G3N +MVS)7DH +YMK)HVQ +JM4)74G +HJ7)RPW +9CY)C7M +V76)4GG +LNT)Y2J +8WD)YNN +41X)GKF +TD2)FZ2 +T6H)4TQ +NHB)NKV +TV3)RRM +VRM)LVD +QNZ)FJT +3KZ)P8P +XJ6)3Y9 +4D5)YSS +WB3)TV3 +1Y6)Q3J +98T)6WH +SLT)KQL +951)5N8 +9ZB)Z6X +KKD)M4B +YGJ)4F1 +KBV)PQL +G45)M7H +8CP)J9F +BLQ)2P1 +XS6)NXQ +BZ9)XQK +YLN)D1R +55T)XQB +N7H)RFF +FTM)93T +LJ5)MZ9 +3YB)BFP +X9Z)7K7 +W8J)9BC +43X)NM1 +G5R)JGH +7SK)HRK +3BL)SWS +N38)QL4 +HKV)64S +SDF)W33 +D94)HB3 +GWW)8DQ +3QH)WFF +SLJ)2Y4 +3TJ)NQT +1C3)KLJ +954)VL8 +LW2)Z6D +2F1)RQ5 +C1Z)XM7 +3CV)5HH +QCK)QHS +XKD)2XP +24J)221 +8KS)MF3 +5YY)DJQ +KBH)1W7 +XYG)XHV +XMW)BTK +B2D)5T2 +2W6)DH6 +W2R)CK4 +FY4)9RH +WF1)L7G +6GW)LBJ +QCX)H25 +XHV)3DZ +5Z7)N9H +RYD)H27 +QVD)ZJ3 +CM1)NHB +W8J)8KH +C5D)WV1 +CV3)25C +953)741 +9MV)ZCQ +WYC)SLW +6WH)387 +FXW)1G1 +Z1S)212 +MS1)FYZ +W33)F78 +NQT)72G +2XP)1MG +J9J)KBS +C1R)RHL +L7G)R4G +HWK)CCX +TNP)1SF +5R1)SLT +B51)VDS +FBK)LH2 +387)XXP +4NX)RDL +FF9)XW7 +D3P)5R5 +M3N)YWW +2Q8)9FM +8YY)1J7 +Z6X)3CV +9HX)FV8 +8MN)S2C +XD4)5HK +ST7)B59 +LR2)PF2 +23Y)FTM +7D2)F2H +9JG)TG9 +2QJ)H4J +HM5)CSY +DH5)55T +GFL)WBX +HGF)SK8 +PXT)SCT +K2D)7J8 +78K)MDJ +2XT)MP2 +4QR)549 +DFB)DRV +6NK)Q7Q +5BM)2Y8 +9XZ)DT2 +M25)MV8 +2BK)3V9 +28S)W2R +RPJ)X37 +QLS)9XF +X83)XFJ +8X4)ZHV +KMR)KDN +2K2)4T5 +LRM)MWF +JGM)4D5 +4LH)PZH +L4X)H2N +HHH)C12 +R4G)GWB +ZVP)F22 +YBF)H37 +RSY)PD7 +K3W)VXG +K9G)HN8 +1C1)QCK +YTK)JZ5 +KQL)NLZ +PLM)H7X +PYS)GDT +TY2)VRM +FF9)SZY +SXH)SZG +2HT)P19 +JTQ)B5F +B9B)F2L +5CM)CPS +L5D)GQG +K1F)QNZ +7QT)LJY +9KK)1DF +XN9)KBV +9VJ)SG7 +M4B)ZDW +6XV)MQL +1VL)Z94 +KSS)H8D +STY)JFJ +PXR)K3W +X3M)35W +RNH)FWP +2RZ)LW4 +HVQ)QG8 +8VS)QZS +M8T)4YM +GJR)SBJ +N9D)WH3 +4TQ)VZ3 +GG6)6MY +4TR)M21 +XLS)6QC +MZ3)YWS +ZRG)HK7 +V1S)ZRG +CR2)V8R +81N)PJX +VXP)LMZ +849)LTC +DWD)LQC +1H8)3FT +D2T)KG8 +BYJ)5Q1 +3H6)5X1 +8KQ)CHK +T7Y)J1X +4GD)KQP +XM7)QF5 +9RH)JZR +GKF)DBQ +THY)JHZ +5XD)2GC +MV8)HBP +CW1)W91 +411)923 +RRS)8XK +C66)TNP +BMX)J5R +FKR)5Z7 +MRV)PFK +9BC)59G +GVY)GDN +HH8)DRK +V96)6B1 +SKB)KFK +DJQ)23Y +PF2)2HD +2Y4)D3F +K86)K1P +YRP)GBG +V8R)W4G +F9N)GP8 +XQB)BPW +CSY)C66 +NHJ)D2T +GGF)MK1 +4NX)V6C +JYC)YNS +GMS)KNG +XW7)MRV +RFS)Q2C +7NL)WH4 +TBZ)FLX +RQ5)ZJB +FPX)WL3 +BMB)K86 +N7G)WC7 +T3S)NQD +KG7)GLN +741)CPL +S1W)G8P +W5V)ZJJ +JRF)X8V +TX6)PK9 +89Q)DFS +W6V)9FW +D8G)NVJ +VBW)3SH +VTW)RYD +5CM)QVD +9TP)LC2 +NCD)4VH +HLM)11L +6MY)S68 +S2Z)V3R +BFP)954 +Z5R)YB6 +SBP)2Q8 +JWQ)TQK +F2T)VPB +SZY)PXR +ML1)ZH9 +LM6)LH8 +CV6)69H +77Y)G2Y +22B)JYC +4Z2)1G9 +5N8)755 +GCL)Q5P +4ZT)M8T +Z6H)RKV +ML1)M9B +4YM)LFL +9JG)LMW +3FT)2XT +RQM)B6C +DRV)1Y6 +B1P)3YB +PGR)YDJ +9L1)RWV +79J)41X +GF8)YTK +N15)4S7 +8MC)1VL +4F7)77Y +SYM)YHV +4P2)2PZ +426)2TZ +H7X)K37 +17F)71V +9G9)PKR +KC2)N38 +L4X)WB3 +1TQ)G6B +YSS)SCS +Q1M)WW8 +819)2CV +Q2C)B65 +169)7P9 +139)7DC +D43)LR2 +KJ7)HH8 +C4S)MHT +5G8)HDZ +QTK)J33 +F2H)YBQ +5YP)YWN +W52)1SL +32Z)CM1 +LZ4)2F1 +7SB)QPG +7K7)SSY +CW1)9DN +YCL)LW2 +CTF)N97 +FV8)8KS +KQP)R1M +6QC)P2B +LW4)64N +R17)FQN +71V)4CB +X31)8VS +5FQ)9ZB +7J8)D8T +WZ3)KKB +VDS)WLZ +WT8)J9J +BKC)PC3 +T4B)9G9 +NT6)ST7 +LH2)JCZ +QHS)RMW +9LV)PLL +16M)H1L +HCN)PMM +J69)8KT +35S)7JW +5C3)F6S +J89)LJ5 +FVP)LHJ +RT5)XS6 +LBF)QW3 +8YB)GGF +ZHM)5HZ +W3X)MGQ +KHR)G16 +HY6)DNW +CMC)VPJ +Q72)JMG +WW8)Z6H +Y25)72S +3MZ)53C +791)951 +KPW)S5S +NQ6)QRF +NCL)VYR +1VD)85F +QYX)413 +NJK)D3H +N74)MNV +MP2)F87 +4F1)FQH +JZR)WMR +DNW)TNN +YZP)NH3 +H27)FY4 +28S)6R8 +DRK)B9B +NTG)1FY +GL5)HVX +G3N)CML +CPS)PQN +R1M)TY2 +C8Z)MS4 +N71)ML1 +5NF)GF8 +SCM)CCB +BG2)9JG +ZVG)6SD +FBZ)BZ9 +L9V)7ZY +7DH)B8B +1JT)DNK +QL4)NS8 +7LK)35S +QKC)SAN +Q1H)DJR +4N2)C1R +SC4)R22 +413)WG4 +SXD)K9L +9CY)4S5 +58X)NCD +VTL)LGH +V96)P31 +KYH)CLY +LTC)MB2 +D9Y)JM4 +53C)F94 +PD7)7MQ +5GL)6XW +6FT)H4X +RQJ)TC6 +WH3)2VB +M6N)H66 +369)N74 +TF3)JC5 +FGL)NTG +P6B)1JT +MDJ)V9T +6CL)754 +V3N)2Q6 +5YW)KCY +VRY)24J +2HD)47S +WL3)3YH +1SL)CTJ +QZ4)697 +S68)KYH +KBS)FPR +DT2)H9D +CHK)Y3R +Y2X)L7X +9VJ)3CK +BLM)CQJ +PLL)81F +RFF)5VK +V3R)LWT +FQN)M25 +9H5)KHG +KTN)4NX +QZS)23F +H7W)MKH +PKD)33K +F2P)MVN +G6B)GZ6 +8LH)PGR +NLZ)78K +GFD)XPH +LFL)N7H +D8T)7Z1 +X4V)R2D +D1R)Q6V +JV2)DH5 +WLZ)411 +352)C7B +T36)QWS +5R5)Q66 +HKX)KC2 +QL9)32D +M5Q)T6H +88R)M5Q +MF3)B1P +9YW)BM6 +Y9G)VNQ +M9B)7GL +57L)YLN +HTW)PL3 +1ZM)JWQ +1W7)FFT +SR2)YJW +BTK)XKD +P19)RSY +BSC)7LJ +212)NR2 +LX4)K39 +HXL)Z5R +FSX)W3T +HN8)FGL +KFK)27C +WN2)M9Z +F9B)GFL +WY7)Z15 +GQL)21W +BZ9)KNW +MFS)9CY +GV9)NQN +V8T)91Q +D7X)GFD +4KY)Q8N +9NX)MFS +YB6)NK7 +Q9Y)1KP +KCS)B45 +M4B)GG6 +ZVP)2K2 +CWB)N3S +HVX)JTQ +59G)TTC +YMV)B9Q +16M)XLB +PJX)VN4 +69H)11P +LMK)X9H +F6S)J69 +R2D)5SJ +X37)17P +3CL)YMV +ST5)N4C +2L3)NH8 +3F9)HNC +C2L)HFT +7QP)ZRM +C12)KN6 +1V9)PPT +XB5)8J5 +DJT)3BL +HKV)16M +YJ6)KBM +TX6)R5C +B15)LMK +549)JPG +K2V)NJS +FRB)1CG +MJC)4NC +TTC)H1W +KT3)CJ8 +NR2)85H +131)3KZ +X8V)953 +21W)W5C +3YH)8MC +VFW)7K4 +D79)KXB +G7F)JJC +4M1)7NL +S9V)NPZ +VP8)K9G +KNG)HHH +D3F)T5D +SWS)3CL +TYQ)9NX +78N)N1L +RDL)819 +X2V)L4X +8Y2)GQL +VRQ)FBK +1M6)QN1 +MXJ)7LP +1MG)GTF +YY5)H3F +S5F)BHV +PHS)95L +6XW)72J +DFS)D7X +YWS)SSK +B1P)DH2 +K98)FPX +Z5F)6N4 +9DN)78H +W3T)JS4 +7Z1)5G8 +49V)9J8 +Z6D)GGJ +V9T)MYZ +SC4)YLW +NQN)WN2 +MFN)TBW +KRX)LGD +9FW)V8T +8X3)V4T +4S7)XMW +Y2J)5PV +QYY)T26 +GMH)JV2 +H98)Q2Y +MZ9)2ZP +ZRM)KBH +251)Z5K +KHG)HYN +5WX)P8Y +71T)N75 +H37)6PH +HCL)D3P +M25)16R +K39)QL9 +WWZ)8Y2 +PK9)N6H +LMZ)ZVP +Z5Q)H98 +JKD)WK2 +JHZ)43X +PQN)NNW +J2Y)3H6 +YWW)GWW +NL6)KKD +XQ8)TPS +RWV)8D1 +TDB)RX1 +2PZ)6MR +NSM)QTK +GP1)TPV +ZB6)1V9 +QHG)4F7 +18R)D79 +ZJJ)Z1S +45D)7QP +7QV)X42 +M9M)MSS +TQK)V4V +Q7S)23K +TG9)C5D +VMJ)89G +7QR)SPB +RGV)QHG +3P3)RFS +GT8)6LP +P1K)8WD \ No newline at end of file From aede704d4ace572f9fde3d0989d5218d45be3d99 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 6 Dec 2019 06:35:15 +0100 Subject: [PATCH 014/433] Day 6 Part 2 --- .../sbaars/adventofcode2019/days/Day6.java | 48 ++++++++++++++++++- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day6.java b/src/main/java/com/sbaars/adventofcode2019/days/Day6.java index 2d25ee0f..bf5533f9 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day6.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day6.java @@ -2,6 +2,7 @@ import java.io.File; import java.io.IOException; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map.Entry; @@ -13,6 +14,9 @@ public class Day6 implements Day, DoesFileOperations { + + ListMap orbits = new ListMap<>(); + public static void main(String[] args) throws IOException { new Day6().printParts(); @@ -20,7 +24,6 @@ public static void main(String[] args) throws IOException @Override public int part1() throws IOException { - ListMap orbits = new ListMap<>(); String[] nums = createNumberStream(); for(String num : nums) { String[] parts = num.split("\\)"); @@ -48,9 +51,50 @@ private void extracted(ListMap orbits, AtomicInteger o, List been = new ArrayList<>(); + + private void step(String s1, int depth) { + if(been.contains(s1)) + return; + been.add(s1); + List str = collectAll(s1); + //System.out.println(Arrays.toString(str.toArray())); + if(str.contains("SAN")) { + System.out.println(depth+1); + //System.exit(1); + } + //steps.incrementAndGet(); + for(String s : str) { + step(s, depth + 1); + } } + private List collectAll(String s1) { + List s = findOrbit(s1); + s.addAll(orbits.get(s1)); + return s; + } + + public List findOrbit(String orbitValue) { + List orbit = new ArrayList<>(); + for(Entry> entry : orbits.entrySet()) { + if(entry.getValue().contains(orbitValue)) { + orbit.add(entry.getKey()); + } + } + return orbit; + } + private String[] createNumberStream() throws IOException { return Arrays.stream(getFileAsString(new File(Day6.class.getClassLoader().getResource("day6.txt").getFile())).split(System.lineSeparator())).toArray(String[]::new); } From 7bfb4c99cb67ffa9f8381ec25b66ef46d47c9f0e Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 6 Dec 2019 06:45:19 +0100 Subject: [PATCH 015/433] Refactor day 6 --- .../sbaars/adventofcode2019/days/Day6.java | 50 +++++++------------ 1 file changed, 19 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day6.java b/src/main/java/com/sbaars/adventofcode2019/days/Day6.java index bf5533f9..25d5fd0c 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day6.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day6.java @@ -24,59 +24,47 @@ public static void main(String[] args) throws IOException @Override public int part1() throws IOException { - String[] nums = createNumberStream(); + String[] nums = createOrbitArray(); for(String num : nums) { String[] parts = num.split("\\)"); orbits.addTo(parts[0], parts[1]); } AtomicInteger o = new AtomicInteger(); - extracted(orbits, o); + for(Entry> entry : orbits.entrySet()) + countOrbitsInList(orbits, o, entry.getValue()); return o.get(); } - private void extracted(ListMap orbits, AtomicInteger o) { - for(Entry> entry : orbits.entrySet()) { - extracted(orbits, o, entry.getValue()); - } - } - - private void extracted(ListMap orbits, AtomicInteger o, List entry) { + private void countOrbitsInList(ListMap orbits, AtomicInteger o, List entry) { for(String str : entry) { o.incrementAndGet(); if(orbits.containsKey(str)) { - extracted(orbits, o, orbits.get(str)); + countOrbitsInList(orbits, o, orbits.get(str)); } } } @Override public int part2() throws IOException { - - return goFrom("YOU", "SAN"); + return findRoute("YOU", "SAN"); } - public int goFrom(String s1, String s2) { - AtomicInteger steps = new AtomicInteger(); - step(s1, 0); - return 0; + private int findRoute(String from, String to) { + return findRoute(from, to, new ArrayList<>(), 0); } - List been = new ArrayList<>(); - - private void step(String s1, int depth) { - if(been.contains(s1)) - return; - been.add(s1); - List str = collectAll(s1); - //System.out.println(Arrays.toString(str.toArray())); - if(str.contains("SAN")) { - System.out.println(depth+1); - //System.exit(1); - } - //steps.incrementAndGet(); + private int findRoute(String from, String to, List visited, int depth) { + if(visited.contains(from)) + return 0; + visited.add(from); + List str = collectAll(from); + if(str.contains(to)) + return depth-1; for(String s : str) { - step(s, depth + 1); + int findRoute = findRoute(s, to, visited, depth + 1); + if(findRoute>0) return findRoute; } + return -1; } private List collectAll(String s1) { @@ -95,7 +83,7 @@ public List findOrbit(String orbitValue) { return orbit; } - private String[] createNumberStream() throws IOException { + private String[] createOrbitArray() throws IOException { return Arrays.stream(getFileAsString(new File(Day6.class.getClassLoader().getResource("day6.txt").getFile())).split(System.lineSeparator())).toArray(String[]::new); } } From 694e74aff42a403b6c49da5823bb273ea43aa4ac Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 7 Dec 2019 07:01:36 +0100 Subject: [PATCH 016/433] Day 7 Part 1 --- .../sbaars/adventofcode2019/days/Day7.java | 153 ++++++++++++++++++ src/main/resources/day7-2.txt | 1 + src/main/resources/day7.txt | 1 + 3 files changed, 155 insertions(+) create mode 100644 src/main/java/com/sbaars/adventofcode2019/days/Day7.java create mode 100644 src/main/resources/day7-2.txt create mode 100644 src/main/resources/day7.txt diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day7.java b/src/main/java/com/sbaars/adventofcode2019/days/Day7.java new file mode 100644 index 00000000..5dadae9a --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day7.java @@ -0,0 +1,153 @@ +package com.sbaars.adventofcode2019.days; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.IntStream; + +import com.sbaars.adventofcode2019.common.Day; +import com.sbaars.adventofcode2019.util.DoesFileOperations; + +public class Day7 implements Day, DoesFileOperations { + + private static final int NUM_MODES = 3; + private int instructionCounter = 0; + private int part; + int phase = 0; + boolean isFirst = true; + + public static void main(String[] args) throws IOException { + new Day7().printParts(); + } + int lastVal = -1; + + @Override + public int part1() throws IOException { + Set> shuffles = getShuffles(Arrays.asList(0,1,2,3,4)); + List results = new ArrayList<>(); + //List shuffle = Arrays.asList(4,3,2,1,0); + for(List shuffle : shuffles) { + lastVal = -1; + part = 0; + for(Integer i : shuffle) { + isFirst = true; + phase = i; + try { + lastVal = execute(); + } catch(Exception e) { + e.printStackTrace(); + } + part++; + } + results.add(lastVal); + + } + return results.stream().mapToInt(e -> e).max().getAsInt(); + } + + public Set> getShuffles(List ints){ + Set> sets = new HashSet>(); + for(int i = 0; i<100000; i++) { + Collections.shuffle(ints); + sets.add(new ArrayList<>(ints)); + } + return sets; + } + + @Override + public int part2() throws IOException { + return 0; + } + + private int execute() throws IOException { + instructionCounter = 0; + int[] program = Arrays.stream(getFileAsString(new File(Day1.class.getClassLoader().getResource("day7.txt").getFile())).split(",")).mapToInt(Integer::parseInt).toArray();; + int result; + while((result = executeInstruction(program, program[instructionCounter])) == -1); + return result; + } + + private int executeInstruction(int[] program, int instruction) { + if(instruction>99) + return parseComplexInstruction(program, instruction); + else if(instruction == 99) + throw new IllegalStateException("Hit terminal code 99 before finding diagnostic code!"); + return execute(program, instruction); + } + + private int execute(int[] program, int instruction) { + return execute(program, new int[NUM_MODES], instruction); + } + + private int execute(int[] program, int[] method, int instruction) { + int nParams = nParams(instruction); + int[] args = IntStream.range(0, nParams).map(j -> j == 0 ? program[instructionCounter+nParams] : program[instructionCounter+j]).toArray(); + if(args.length>=2) { + if(method[2] == 0) args[1] = program[args[1]]; + if(args.length>=3 && method[1] == 0) args[2] = program[args[2]]; + } + if(instruction == 4 && method[2] == 0) args[0] = program[args[0]]; + if((instruction == 5 || instruction == 6) && method[1] == 0) args[0] = program[args[0]]; + return executeInstruction(program, args, instruction); + } + + private int executeInstruction(int[] program, int[] args, int instruction) { + switch(instruction) { + case 1: program[args[0]] = args[1] + args[2]; break; + case 2: program[args[0]] = args[1] * args[2]; break; + case 3: program[args[0]] = isFirst ? phase : (part == 0 ? 0 : lastVal); isFirst = false; break; + case 4: /*if(args[0]!=0)*/ return args[0];/*lastVal=args[0];*/ //break; + case 5: if(args[1] != 0) { instructionCounter = args[0]; return -1; } break; + case 6: if(args[1] == 0) { instructionCounter = args[0]; return -1; } break; + case 7: program[args[0]] = args[1] < args[2] ? 1 : 0; break; + case 8: program[args[0]] = args[1] == args[2] ? 1 : 0; break; + default: throw new IllegalStateException("Something went wrong!"); + } + instructionCounter+=nParams(instruction) + 1; + return -1; + } + + private int parseComplexInstruction(int[] program, int instruction) { + int[] instructions = getInstructions(instruction); + int opcode = getOpCode(instructions); + return execute(program, instructions, opcode); + + } + + private int getOpCode(int instruction) { + return getOpCode(getInstructions(instruction)); + } + + private int getOpCode(int[] instructions) { + return (instructions[3] * 10) + instructions[4]; + } + + private int[] getInstructions(int instruction) { + int[] instructions = new int[5]; + for(int j = instructions.length-1; instruction>0; j--) { + instructions[j] = instruction % 10; + instruction /= 10; + } + return instructions; + } + + private int nParams(int instruction) { + switch(instruction) { + case 3: + case 4: return 1; + case 5: + case 6: return 2; + case 1: + case 2: + case 7: + case 8: return 3; + default: if(instruction>=99) return nParams(getOpCode(instruction)); + else throw new IllegalStateException("Something went wrong! "+instruction); + } + } +} diff --git a/src/main/resources/day7-2.txt b/src/main/resources/day7-2.txt new file mode 100644 index 00000000..993e2e04 --- /dev/null +++ b/src/main/resources/day7-2.txt @@ -0,0 +1 @@ +3,15,3,16,1002,16,10,16,1,16,15,15,4,15,99,0,0 \ No newline at end of file diff --git a/src/main/resources/day7.txt b/src/main/resources/day7.txt new file mode 100644 index 00000000..1ecb0de6 --- /dev/null +++ b/src/main/resources/day7.txt @@ -0,0 +1 @@ +3,8,1001,8,10,8,105,1,0,0,21,30,47,60,81,102,183,264,345,426,99999,3,9,1002,9,5,9,4,9,99,3,9,1002,9,5,9,1001,9,4,9,1002,9,4,9,4,9,99,3,9,101,2,9,9,1002,9,4,9,4,9,99,3,9,1001,9,3,9,1002,9,2,9,101,5,9,9,1002,9,2,9,4,9,99,3,9,102,4,9,9,101,4,9,9,1002,9,3,9,101,2,9,9,4,9,99,3,9,101,1,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,1,9,4,9,99,3,9,1001,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,99,3,9,101,2,9,9,4,9,3,9,101,1,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,1001,9,2,9,4,9,99,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,1001,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,102,2,9,9,4,9,3,9,101,2,9,9,4,9,3,9,1002,9,2,9,4,9,99,3,9,1002,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,101,1,9,9,4,9,99 \ No newline at end of file From 17b9014676e83f569ed7cd3dbf5c96558e46be6c Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 7 Dec 2019 07:49:38 +0100 Subject: [PATCH 017/433] ... --- .../sbaars/adventofcode2019/days/Day7.java | 115 ++++++++++-------- src/main/resources/7-4.txt | 1 + src/main/resources/day7-3.txt | 1 + 3 files changed, 65 insertions(+), 52 deletions(-) create mode 100644 src/main/resources/7-4.txt create mode 100644 src/main/resources/day7-3.txt diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day7.java b/src/main/java/com/sbaars/adventofcode2019/days/Day7.java index 5dadae9a..72b4c5aa 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day7.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day7.java @@ -25,40 +25,50 @@ public static void main(String[] args) throws IOException { new Day7().printParts(); } int lastVal = -1; - + @Override public int part1() throws IOException { - Set> shuffles = getShuffles(Arrays.asList(0,1,2,3,4)); + List> shuffles = generatePerm(new ArrayList<>(Arrays.asList(0,1,2,3,4))); List results = new ArrayList<>(); - //List shuffle = Arrays.asList(4,3,2,1,0); - for(List shuffle : shuffles) { - lastVal = -1; - part = 0; - for(Integer i : shuffle) { - isFirst = true; - phase = i; - try { - lastVal = execute(); - } catch(Exception e) { - e.printStackTrace(); - } - part++; + List shuffle = Arrays.asList(9,8,7,6,5); + //for(List shuffle : shuffles) { + lastVal = 0; + part = 0; + for(Integer i : shuffle) { + isFirst = true; + phase = i; + try { + execute(); + } catch(Exception e) { + e.printStackTrace(); } - results.add(lastVal); - } + results.add(lastVal); + + //} return results.stream().mapToInt(e -> e).max().getAsInt(); } - - public Set> getShuffles(List ints){ - Set> sets = new HashSet>(); - for(int i = 0; i<100000; i++) { - Collections.shuffle(ints); - sets.add(new ArrayList<>(ints)); + + public List> generatePerm(List original) { + if (original.isEmpty()) { + List> result = new ArrayList<>(); + result.add(new ArrayList()); + return result; } - return sets; + E firstElement = original.remove(0); + List> returnValue = new ArrayList<>(); + List> permutations = generatePerm(original); + for (List smallerPermutated : permutations) { + for (int index=0; index <= smallerPermutated.size(); index++) { + List temp = new ArrayList<>(smallerPermutated); + temp.add(index, firstElement); + returnValue.add(temp); + } + } + return returnValue; } - + + @Override public int part2() throws IOException { return 0; @@ -66,7 +76,7 @@ public int part2() throws IOException { private int execute() throws IOException { instructionCounter = 0; - int[] program = Arrays.stream(getFileAsString(new File(Day1.class.getClassLoader().getResource("day7.txt").getFile())).split(",")).mapToInt(Integer::parseInt).toArray();; + int[] program = Arrays.stream(getFileAsString(new File(Day1.class.getClassLoader().getResource("day7-3.txt").getFile())).split(",")).mapToInt(Integer::parseInt).toArray(); int result; while((result = executeInstruction(program, program[instructionCounter])) == -1); return result; @@ -76,10 +86,11 @@ private int executeInstruction(int[] program, int instruction) { if(instruction>99) return parseComplexInstruction(program, instruction); else if(instruction == 99) - throw new IllegalStateException("Hit terminal code 99 before finding diagnostic code!"); + return 0; + //throw new IllegalStateException("Hit terminal code 99 before finding diagnostic code!"); return execute(program, instruction); } - + private int execute(int[] program, int instruction) { return execute(program, new int[NUM_MODES], instruction); } @@ -95,30 +106,30 @@ private int execute(int[] program, int[] method, int instruction) { if((instruction == 5 || instruction == 6) && method[1] == 0) args[0] = program[args[0]]; return executeInstruction(program, args, instruction); } - + private int executeInstruction(int[] program, int[] args, int instruction) { switch(instruction) { - case 1: program[args[0]] = args[1] + args[2]; break; - case 2: program[args[0]] = args[1] * args[2]; break; - case 3: program[args[0]] = isFirst ? phase : (part == 0 ? 0 : lastVal); isFirst = false; break; - case 4: /*if(args[0]!=0)*/ return args[0];/*lastVal=args[0];*/ //break; - case 5: if(args[1] != 0) { instructionCounter = args[0]; return -1; } break; - case 6: if(args[1] == 0) { instructionCounter = args[0]; return -1; } break; - case 7: program[args[0]] = args[1] < args[2] ? 1 : 0; break; - case 8: program[args[0]] = args[1] == args[2] ? 1 : 0; break; - default: throw new IllegalStateException("Something went wrong!"); + case 1: program[args[0]] = args[1] + args[2]; break; + case 2: program[args[0]] = args[1] * args[2]; break; + case 3: program[args[0]] = isFirst ? phase : (part == 0 ? 0 : lastVal);if(!isFirst) part++; isFirst = false; break; + case 4: /*if(args[0]!=0)*/ lastVal = args[0];/*lastVal=args[0];*/ break; + case 5: if(args[1] != 0) { instructionCounter = args[0]; return -1; } break; + case 6: if(args[1] == 0) { instructionCounter = args[0]; return -1; } break; + case 7: program[args[0]] = args[1] < args[2] ? 1 : 0; break; + case 8: program[args[0]] = args[1] == args[2] ? 1 : 0; break; + default: throw new IllegalStateException("Something went wrong!"); } instructionCounter+=nParams(instruction) + 1; return -1; } - + private int parseComplexInstruction(int[] program, int instruction) { int[] instructions = getInstructions(instruction); int opcode = getOpCode(instructions); return execute(program, instructions, opcode); - + } - + private int getOpCode(int instruction) { return getOpCode(getInstructions(instruction)); } @@ -135,19 +146,19 @@ private int[] getInstructions(int instruction) { } return instructions; } - + private int nParams(int instruction) { switch(instruction) { - case 3: - case 4: return 1; - case 5: - case 6: return 2; - case 1: - case 2: - case 7: - case 8: return 3; - default: if(instruction>=99) return nParams(getOpCode(instruction)); - else throw new IllegalStateException("Something went wrong! "+instruction); + case 3: + case 4: return 1; + case 5: + case 6: return 2; + case 1: + case 2: + case 7: + case 8: return 3; + default: if(instruction>=99) return nParams(getOpCode(instruction)); + else throw new IllegalStateException("Something went wrong! "+instruction); } } } diff --git a/src/main/resources/7-4.txt b/src/main/resources/7-4.txt new file mode 100644 index 00000000..5ed292ba --- /dev/null +++ b/src/main/resources/7-4.txt @@ -0,0 +1 @@ +3,52,1001,52,-5,52,3,53,1,52,56,54,1007,54,5,55,1005,55,26,1001,54,-5,54,1105,1,12,1,53,54,53,1008,54,0,55,1001,55,1,55,2,53,55,53,4,53,1001,56,-1,56,1005,56,6,99,0,0,0,0,10 \ No newline at end of file diff --git a/src/main/resources/day7-3.txt b/src/main/resources/day7-3.txt new file mode 100644 index 00000000..4363e8ee --- /dev/null +++ b/src/main/resources/day7-3.txt @@ -0,0 +1 @@ +3,26,1001,26,-4,26,3,27,1002,27,2,27,1,27,26,27,4,27,1001,28,-1,28,1005,28,6,99,0,0,5 \ No newline at end of file From de14b7cca8ef15c58f2200ac7546ebd32bffaba3 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 7 Dec 2019 08:48:54 +0100 Subject: [PATCH 018/433] Day 7 part 2 --- .../sbaars/adventofcode2019/days/Day7.java | 44 ++++++++++++------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day7.java b/src/main/java/com/sbaars/adventofcode2019/days/Day7.java index 72b4c5aa..83991ff7 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day7.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day7.java @@ -25,27 +25,36 @@ public static void main(String[] args) throws IOException { new Day7().printParts(); } int lastVal = -1; + + boolean done = false; @Override public int part1() throws IOException { - List> shuffles = generatePerm(new ArrayList<>(Arrays.asList(0,1,2,3,4))); + int[] program = Arrays.stream(getFileAsString(new File(Day1.class.getClassLoader().getResource("day7.txt").getFile())).split(",")).mapToInt(Integer::parseInt).toArray(); + List> shuffles = generatePerm(new ArrayList<>(Arrays.asList(5,6,7,8,9))); List results = new ArrayList<>(); - List shuffle = Arrays.asList(9,8,7,6,5); - //for(List shuffle : shuffles) { + //List shuffle = Arrays.asList(9,8,7,6,5); + for(List shuffle : shuffles) { lastVal = 0; part = 0; + int[][] programs = new int[shuffle.size()][program.length]; + for(int i = 0; i e).max().getAsInt(); } @@ -74,9 +83,10 @@ public int part2() throws IOException { return 0; } - private int execute() throws IOException { - instructionCounter = 0; - int[] program = Arrays.stream(getFileAsString(new File(Day1.class.getClassLoader().getResource("day7-3.txt").getFile())).split(",")).mapToInt(Integer::parseInt).toArray(); + private int executeProgram(int[] program, int c) throws IOException { + isFirst = c == 0; + instructionCounter = c; + // = Arrays.stream(getFileAsString(new File(Day1.class.getClassLoader().getResource("day7-3.txt").getFile())).split(",")).mapToInt(Integer::parseInt).toArray(); int result; while((result = executeInstruction(program, program[instructionCounter])) == -1); return result; @@ -85,8 +95,10 @@ private int execute() throws IOException { private int executeInstruction(int[] program, int instruction) { if(instruction>99) return parseComplexInstruction(program, instruction); - else if(instruction == 99) - return 0; + else if(instruction == 99) { + done = true; + return lastVal; + } //throw new IllegalStateException("Hit terminal code 99 before finding diagnostic code!"); return execute(program, instruction); } @@ -112,7 +124,7 @@ private int executeInstruction(int[] program, int[] args, int instruction) { case 1: program[args[0]] = args[1] + args[2]; break; case 2: program[args[0]] = args[1] * args[2]; break; case 3: program[args[0]] = isFirst ? phase : (part == 0 ? 0 : lastVal);if(!isFirst) part++; isFirst = false; break; - case 4: /*if(args[0]!=0)*/ lastVal = args[0];/*lastVal=args[0];*/ break; + case 4: /*if(args[0]!=0)lastVal=args[0]; */return args[0];/*lastVal=args[0];*/ //break; case 5: if(args[1] != 0) { instructionCounter = args[0]; return -1; } break; case 6: if(args[1] == 0) { instructionCounter = args[0]; return -1; } break; case 7: program[args[0]] = args[1] < args[2] ? 1 : 0; break; From dba38328a2381cce2e3d5b3c705f7c282d375a79 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 7 Dec 2019 09:03:10 +0100 Subject: [PATCH 019/433] Put the two parts in their appropriate places I'll refactor later --- .../sbaars/adventofcode2019/days/Day7.java | 71 ++++++++++++------- 1 file changed, 46 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day7.java b/src/main/java/com/sbaars/adventofcode2019/days/Day7.java index 83991ff7..f202e9f3 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day7.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day7.java @@ -21,38 +21,65 @@ public class Day7 implements Day, DoesFileOperations { int phase = 0; boolean isFirst = true; + int[] startState; + + public Day7() throws IOException { + startState = Arrays.stream(getFileAsString(new File(Day1.class.getClassLoader().getResource("day7.txt").getFile())).split(",")).mapToInt(Integer::parseInt).toArray(); + } + public static void main(String[] args) throws IOException { new Day7().printParts(); } int lastVal = -1; - + boolean done = false; @Override public int part1() throws IOException { - int[] program = Arrays.stream(getFileAsString(new File(Day1.class.getClassLoader().getResource("day7.txt").getFile())).split(",")).mapToInt(Integer::parseInt).toArray(); + List> shuffles = generatePerm(new ArrayList<>(Arrays.asList(0,1,2,3,4))); + List results = new ArrayList<>(); + for(List shuffle : shuffles) { + lastVal = -1; + part = 0; + for(Integer i : shuffle) { + int[] program = new int[startState.length]; + for(int j = 0; j e).max().getAsInt(); + } + + @Override + public int part2() throws IOException { List> shuffles = generatePerm(new ArrayList<>(Arrays.asList(5,6,7,8,9))); List results = new ArrayList<>(); //List shuffle = Arrays.asList(9,8,7,6,5); for(List shuffle : shuffles) { - lastVal = 0; - part = 0; - int[][] programs = new int[shuffle.size()][program.length]; - for(int i = 0; i e).max().getAsInt(); @@ -77,12 +104,6 @@ public List> generatePerm(List original) { return returnValue; } - - @Override - public int part2() throws IOException { - return 0; - } - private int executeProgram(int[] program, int c) throws IOException { isFirst = c == 0; instructionCounter = c; From 0c4cb67ca5f21fba73301ee1d146dbd55892bcf2 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 7 Dec 2019 09:07:43 +0100 Subject: [PATCH 020/433] Minor refactorings for day 7 --- .../sbaars/adventofcode2019/days/Day7.java | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day7.java b/src/main/java/com/sbaars/adventofcode2019/days/Day7.java index f202e9f3..723734f3 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day7.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day7.java @@ -18,10 +18,11 @@ public class Day7 implements Day, DoesFileOperations { private static final int NUM_MODES = 3; private int instructionCounter = 0; private int part; - int phase = 0; - boolean isFirst = true; - - int[] startState; + private int phase = 0; + private boolean isFirst = true; + private int[] startState; + private int lastVal = -1; + private boolean done = false; public Day7() throws IOException { startState = Arrays.stream(getFileAsString(new File(Day1.class.getClassLoader().getResource("day7.txt").getFile())).split(",")).mapToInt(Integer::parseInt).toArray(); @@ -30,15 +31,12 @@ public Day7() throws IOException { public static void main(String[] args) throws IOException { new Day7().printParts(); } - int lastVal = -1; - - boolean done = false; @Override public int part1() throws IOException { - List> shuffles = generatePerm(new ArrayList<>(Arrays.asList(0,1,2,3,4))); + List> permutations = generatePerm(new ArrayList<>(Arrays.asList(0,1,2,3,4))); List results = new ArrayList<>(); - for(List shuffle : shuffles) { + for(List shuffle : permutations) { lastVal = -1; part = 0; for(Integer i : shuffle) { @@ -58,10 +56,9 @@ public int part1() throws IOException { @Override public int part2() throws IOException { - List> shuffles = generatePerm(new ArrayList<>(Arrays.asList(5,6,7,8,9))); + List> permutations = generatePerm(new ArrayList<>(Arrays.asList(5,6,7,8,9))); List results = new ArrayList<>(); - //List shuffle = Arrays.asList(9,8,7,6,5); - for(List shuffle : shuffles) { + for(List shuffle : permutations) { lastVal = 0; part = 0; int[][] programs = new int[shuffle.size()][startState.length]; From 073902d5500019b978253be3619916f213a1bc2e Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 7 Dec 2019 19:52:38 +0100 Subject: [PATCH 021/433] Separating IntCode Computer --- .../intcode/IntcodeComputer.java | 110 ++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java diff --git a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java new file mode 100644 index 00000000..b5bb81b6 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java @@ -0,0 +1,110 @@ +package com.sbaars.adventofcode2019.intcode; + +import java.io.IOException; +import java.util.stream.IntStream; + +public class IntcodeComputer extends Thread { + int[] program; + int instructionCounter; + + public IntcodeComputer(int day) { + + } + + + + @Override + public void run() { + + } + + private int executeProgram(int[] program, int c) throws IOException { + isFirst = c == 0; + int result; + while((result = executeInstruction(program, program[instructionCounter])) == -1); + return result; + } + + private int executeInstruction(int[] program, int instruction) { + if(instruction>99) + return parseComplexInstruction(program, instruction); + else if(instruction == 99) { + done = true; + return lastVal; + } + //throw new IllegalStateException("Hit terminal code 99 before finding diagnostic code!"); + return execute(program, instruction); + } + + private int execute(int[] program, int instruction) { + return execute(program, new int[NUM_MODES], instruction); + } + + private int execute(int[] program, int[] method, int instruction) { + int nParams = nParams(instruction); + int[] args = IntStream.range(0, nParams).map(j -> j == 0 ? program[instructionCounter+nParams] : program[instructionCounter+j]).toArray(); + if(args.length>=2) { + if(method[2] == 0) args[1] = program[args[1]]; + if(args.length>=3 && method[1] == 0) args[2] = program[args[2]]; + } + if(instruction == 4 && method[2] == 0) args[0] = program[args[0]]; + if((instruction == 5 || instruction == 6) && method[1] == 0) args[0] = program[args[0]]; + return executeInstruction(program, args, instruction); + } + + + private int executeInstruction(int[] program, int[] args, int instruction) { + switch(instruction) { + case 1: program[args[0]] = args[1] + args[2]; break; + case 2: program[args[0]] = args[1] * args[2]; break; + case 3: program[args[0]] = isFirst ? phase : (part == 0 ? 0 : lastVal);if(!isFirst) part++; isFirst = false; break; + case 4: return args[0]; + case 5: if(args[1] != 0) { instructionCounter = args[0]; return -1; } break; + case 6: if(args[1] == 0) { instructionCounter = args[0]; return -1; } break; + case 7: program[args[0]] = args[1] < args[2] ? 1 : 0; break; + case 8: program[args[0]] = args[1] == args[2] ? 1 : 0; break; + default: throw new IllegalStateException("Something went wrong!"); + } + instructionCounter+=nParams(instruction) + 1; + return -1; + } + + private int parseComplexInstruction(int[] program, int instruction) { + int[] instructions = getInstructions(instruction); + int opcode = getOpCode(instructions); + return execute(program, instructions, opcode); + + } + + private int getOpCode(int instruction) { + return getOpCode(getInstructions(instruction)); + } + + private int getOpCode(int[] instructions) { + return (instructions[3] * 10) + instructions[4]; + } + + private int[] getInstructions(int instruction) { + int[] instructions = new int[5]; + for(int j = instructions.length-1; instruction>0; j--) { + instructions[j] = instruction % 10; + instruction /= 10; + } + return instructions; + } + + private int nParams(int instruction) { + switch(instruction) { + case 3: + case 4: return 1; + case 5: + case 6: return 2; + case 1: + case 2: + case 7: + case 8: return 3; + default: if(instruction>=99) return nParams(getOpCode(instruction)); + else throw new IllegalStateException("Something went wrong! "+instruction); + } + } +} From e083c3ad521713055c14c4c107cbb49656ef2961 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 7 Dec 2019 19:57:07 +0100 Subject: [PATCH 022/433] Refactoring interface --- .../util/DoesFileOperations.java | 50 ++----------------- 1 file changed, 3 insertions(+), 47 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/util/DoesFileOperations.java b/src/main/java/com/sbaars/adventofcode2019/util/DoesFileOperations.java index 3a90b468..d1e16d17 100644 --- a/src/main/java/com/sbaars/adventofcode2019/util/DoesFileOperations.java +++ b/src/main/java/com/sbaars/adventofcode2019/util/DoesFileOperations.java @@ -4,58 +4,14 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.StandardCopyOption; public interface DoesFileOperations { public default String getFileAsString(File file) throws IOException { - return new String(getFileBytes(file), StandardCharsets.UTF_8); - } - - public default byte[] getFileBytes(File file) throws IOException { - return Files.readAllBytes(file.toPath()); - } - - public default void writeStringToFile(File file, String content) throws IOException { - if (file.exists()) - Files.delete(file.toPath()); - else if (file.getParentFile() != null) - file.getParentFile().mkdirs(); - if (file.createNewFile()) - Files.write(Paths.get(file.getAbsolutePath()), content.getBytes(StandardCharsets.UTF_8)); - } - - public default void copyFolder(Path src, Path dest) { - try { - dest.toFile().mkdirs(); - Files.walk(src).forEach(source -> copy(source, dest.resolve(src.relativize(source)))); - } catch (IOException e) { - e.printStackTrace(); - } - } - - public default void copy(Path source, Path dest) { - try { - Files.copy(source, dest, StandardCopyOption.REPLACE_EXISTING); - } catch (IOException e) { - throw new RuntimeException(e.getMessage(), e); - } + return new String(Files.readAllBytes(file.toPath()), StandardCharsets.UTF_8); } - public default boolean delete(File dir) { - if (dir.isDirectory()) { - String[] children = dir.list(); - for (int i=0; i Date: Sat, 7 Dec 2019 20:02:14 +0100 Subject: [PATCH 023/433] Refactored file retrieval --- .../com/sbaars/adventofcode2019/common/Day.java | 8 +++++++- .../com/sbaars/adventofcode2019/days/Day1.java | 6 ++---- .../com/sbaars/adventofcode2019/days/Day2.java | 3 +-- .../com/sbaars/adventofcode2019/days/Day3.java | 3 +-- .../com/sbaars/adventofcode2019/days/Day5.java | 3 +-- .../com/sbaars/adventofcode2019/days/Day6.java | 3 +-- .../com/sbaars/adventofcode2019/days/Day7.java | 5 +---- .../adventofcode2019/intcode/IntcodeComputer.java | 15 ++++++++------- 8 files changed, 22 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/common/Day.java b/src/main/java/com/sbaars/adventofcode2019/common/Day.java index caf3ee9d..080fb04f 100644 --- a/src/main/java/com/sbaars/adventofcode2019/common/Day.java +++ b/src/main/java/com/sbaars/adventofcode2019/common/Day.java @@ -2,7 +2,9 @@ import java.io.IOException; -public interface Day { +import com.sbaars.adventofcode2019.util.DoesFileOperations; + +public interface Day extends DoesFileOperations { public int part1() throws IOException; public int part2() throws IOException; @@ -10,4 +12,8 @@ public default void printParts() throws IOException { System.out.println("Part 1 = "+part1()); System.out.println("Part 2 = "+part2()); } + + public default String readDay(int day) throws IOException { + return getResourceAsString("day"+day+".txt"); + } } diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day1.java b/src/main/java/com/sbaars/adventofcode2019/days/Day1.java index fb2af57a..c639cd9b 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day1.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day1.java @@ -1,14 +1,12 @@ package com.sbaars.adventofcode2019.days; -import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.stream.IntStream; import com.sbaars.adventofcode2019.common.Day; -import com.sbaars.adventofcode2019.util.DoesFileOperations; -public class Day1 implements Day, DoesFileOperations +public class Day1 implements Day { public static void main(String[] args) throws IOException { @@ -26,7 +24,7 @@ public int part2() throws IOException { } private IntStream createNumberStream() throws IOException { - return Arrays.stream(getFileAsString(new File(Day1.class.getClassLoader().getResource("day1.txt").getFile())).split(System.lineSeparator())).mapToInt(Integer::parseInt); + return Arrays.stream(readDay(1).split(System.lineSeparator())).mapToInt(Integer::parseInt); } private int getRequiredFuel(int mass) { diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day2.java b/src/main/java/com/sbaars/adventofcode2019/days/Day2.java index 0417c528..4508b9a3 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day2.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day2.java @@ -1,6 +1,5 @@ package com.sbaars.adventofcode2019.days; -import java.io.File; import java.io.IOException; import java.util.Arrays; @@ -35,7 +34,7 @@ private int bruteForceFindingNumber(int number, int bound) throws IOException { } private int execute(int x, int y) throws IOException { - int[] program = Arrays.stream(getFileAsString(new File(Day1.class.getClassLoader().getResource("day2.txt").getFile())).split(",")).mapToInt(Integer::parseInt).toArray(); + int[] program = Arrays.stream(readDay(2).split(",")).mapToInt(Integer::parseInt).toArray(); program[1] = x; program[2] = y; for(int i = 0; executeInstruction(program, i, program[i]); i+=4); diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day3.java b/src/main/java/com/sbaars/adventofcode2019/days/Day3.java index dade88db..fe3d90f1 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day3.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day3.java @@ -1,7 +1,6 @@ package com.sbaars.adventofcode2019.days; import java.awt.Point; -import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.HashSet; @@ -15,7 +14,7 @@ public class Day3 implements Day, DoesFileOperations private Set intersect; private Day3() throws IOException { - String[] strings = Arrays.stream(getFileAsString(new File(Day1.class.getClassLoader().getResource("day3.txt").getFile())).split(System.lineSeparator())).toArray(String[]::new); + String[] strings = Arrays.stream(readDay(3).split(System.lineSeparator())).toArray(String[]::new); Walk[] walks1 = mapToWalks(strings[0]), walks2 = mapToWalks(strings[1]); Set walkedLocations = new HashSet<>(); calculateDistance(walks1, walkedLocations, false); diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day5.java b/src/main/java/com/sbaars/adventofcode2019/days/Day5.java index 183d2c07..ead5ef56 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day5.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day5.java @@ -1,6 +1,5 @@ package com.sbaars.adventofcode2019.days; -import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.stream.IntStream; @@ -32,7 +31,7 @@ public int part2() throws IOException { } private int execute() throws IOException { - int[] program = Arrays.stream(getFileAsString(new File(Day1.class.getClassLoader().getResource("day5.txt").getFile())).split(",")).mapToInt(Integer::parseInt).toArray();; + int[] program = Arrays.stream(readDay(5).split(",")).mapToInt(Integer::parseInt).toArray();; int result; while((result = executeInstruction(program, program[instructionCounter])) == -1); return result; diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day6.java b/src/main/java/com/sbaars/adventofcode2019/days/Day6.java index 25d5fd0c..87a900df 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day6.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day6.java @@ -1,6 +1,5 @@ package com.sbaars.adventofcode2019.days; -import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -84,6 +83,6 @@ public List findOrbit(String orbitValue) { } private String[] createOrbitArray() throws IOException { - return Arrays.stream(getFileAsString(new File(Day6.class.getClassLoader().getResource("day6.txt").getFile())).split(System.lineSeparator())).toArray(String[]::new); + return Arrays.stream(readDay(6).split(System.lineSeparator())).toArray(String[]::new); } } diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day7.java b/src/main/java/com/sbaars/adventofcode2019/days/Day7.java index 723734f3..fb95f1e3 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day7.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day7.java @@ -4,10 +4,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; import java.util.List; -import java.util.Set; import java.util.stream.IntStream; import com.sbaars.adventofcode2019.common.Day; @@ -142,7 +139,7 @@ private int executeInstruction(int[] program, int[] args, int instruction) { case 1: program[args[0]] = args[1] + args[2]; break; case 2: program[args[0]] = args[1] * args[2]; break; case 3: program[args[0]] = isFirst ? phase : (part == 0 ? 0 : lastVal);if(!isFirst) part++; isFirst = false; break; - case 4: /*if(args[0]!=0)lastVal=args[0]; */return args[0];/*lastVal=args[0];*/ //break; + case 4: return args[0]; case 5: if(args[1] != 0) { instructionCounter = args[0]; return -1; } break; case 6: if(args[1] == 0) { instructionCounter = args[0]; return -1; } break; case 7: program[args[0]] = args[1] < args[2] ? 1 : 0; break; diff --git a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java index b5bb81b6..ef389999 100644 --- a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java +++ b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java @@ -1,18 +1,19 @@ package com.sbaars.adventofcode2019.intcode; +import java.io.File; import java.io.IOException; import java.util.stream.IntStream; -public class IntcodeComputer extends Thread { - int[] program; - int instructionCounter; +import com.sbaars.adventofcode2019.util.DoesFileOperations; + +public class IntcodeComputer extends Thread implements DoesFileOperations { + final int[] program; + int instructionCounter = 0; public IntcodeComputer(int day) { - + this.program = Arrays.stream(getFileAsString(new File(IntcodeComputer.class.getClassLoader().getResource("day7-3.txt").getFile())).split(",")).mapToInt(Integer::parseInt).toArray(); } - - - + @Override public void run() { From d34bd9d19910986ded9a527e37a9fd5af41254d5 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 7 Dec 2019 20:17:44 +0100 Subject: [PATCH 024/433] Making the intcode computer wonderful --- .../sbaars/adventofcode2019/common/Day.java | 4 -- .../intcode/IntcodeComputer.java | 50 ++++++++++++------- .../util/DoesFileOperations.java | 4 ++ 3 files changed, 37 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/common/Day.java b/src/main/java/com/sbaars/adventofcode2019/common/Day.java index 080fb04f..0e077dda 100644 --- a/src/main/java/com/sbaars/adventofcode2019/common/Day.java +++ b/src/main/java/com/sbaars/adventofcode2019/common/Day.java @@ -12,8 +12,4 @@ public default void printParts() throws IOException { System.out.println("Part 1 = "+part1()); System.out.println("Part 2 = "+part2()); } - - public default String readDay(int day) throws IOException { - return getResourceAsString("day"+day+".txt"); - } } diff --git a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java index ef389999..8ad62999 100644 --- a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java +++ b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java @@ -1,22 +1,28 @@ package com.sbaars.adventofcode2019.intcode; -import java.io.File; import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.Stack; +import java.util.stream.Collectors; import java.util.stream.IntStream; import com.sbaars.adventofcode2019.util.DoesFileOperations; -public class IntcodeComputer extends Thread implements DoesFileOperations { +public class IntcodeComputer implements DoesFileOperations { final int[] program; int instructionCounter = 0; + final Stack input = new Stack<>(); - public IntcodeComputer(int day) { - this.program = Arrays.stream(getFileAsString(new File(IntcodeComputer.class.getClassLoader().getResource("day7-3.txt").getFile())).split(",")).mapToInt(Integer::parseInt).toArray(); + public IntcodeComputer(int day, int...input) throws IOException { + this.program = Arrays.stream(readDay(day).split(",")).mapToInt(Integer::parseInt).toArray(); + setInput(input); } - @Override - public void run() { - + public int run() { + int result; + while((result = executeInstruction(program, program[instructionCounter])) == -1); + return result; } private int executeProgram(int[] program, int c) throws IOException { @@ -53,20 +59,30 @@ private int execute(int[] program, int[] method, int instruction) { return executeInstruction(program, args, instruction); } + private int readInput() { + if(input.size()>1) + return input.pop(); + return input.peek(); + } + + private boolean setInput(int...input) { + this.input.clear(); + return this.input.addAll(Arrays.stream(input).boxed().collect(Collectors.toList())); + } private int executeInstruction(int[] program, int[] args, int instruction) { + instructionCounter+=nParams(instruction) + 1; switch(instruction) { - case 1: program[args[0]] = args[1] + args[2]; break; - case 2: program[args[0]] = args[1] * args[2]; break; - case 3: program[args[0]] = isFirst ? phase : (part == 0 ? 0 : lastVal);if(!isFirst) part++; isFirst = false; break; - case 4: return args[0]; - case 5: if(args[1] != 0) { instructionCounter = args[0]; return -1; } break; - case 6: if(args[1] == 0) { instructionCounter = args[0]; return -1; } break; - case 7: program[args[0]] = args[1] < args[2] ? 1 : 0; break; - case 8: program[args[0]] = args[1] == args[2] ? 1 : 0; break; - default: throw new IllegalStateException("Something went wrong!"); + case 1: program[args[0]] = args[1] + args[2]; break; + case 2: program[args[0]] = args[1] * args[2]; break; + case 3: program[args[0]] = readInput(); break; + case 4: return args[0]; + case 5: if(args[1] != 0) instructionCounter = args[0]; break; + case 6: if(args[1] == 0) instructionCounter = args[0]; break; + case 7: program[args[0]] = args[1] < args[2] ? 1 : 0; break; + case 8: program[args[0]] = args[1] == args[2] ? 1 : 0; break; + default: throw new IllegalStateException("Something went wrong!"); } - instructionCounter+=nParams(instruction) + 1; return -1; } diff --git a/src/main/java/com/sbaars/adventofcode2019/util/DoesFileOperations.java b/src/main/java/com/sbaars/adventofcode2019/util/DoesFileOperations.java index d1e16d17..289ee81c 100644 --- a/src/main/java/com/sbaars/adventofcode2019/util/DoesFileOperations.java +++ b/src/main/java/com/sbaars/adventofcode2019/util/DoesFileOperations.java @@ -14,4 +14,8 @@ public default String getFileAsString(File file) throws IOException { public default String getResourceAsString(String resource) throws IOException { return getFileAsString(new File(DoesFileOperations.class.getClassLoader().getResource(resource).getFile())); } + + public default String readDay(int day) throws IOException { + return getResourceAsString("day"+day+".txt"); + } } \ No newline at end of file From 1a5466d60185a2de143827411745f9f977b135ec Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 7 Dec 2019 20:44:37 +0100 Subject: [PATCH 025/433] Ported day 2 to the new intcode computer --- .../sbaars/adventofcode2019/days/Day2.java | 26 +++--------- .../intcode/IntcodeComputer.java | 42 ++++++++++--------- 2 files changed, 29 insertions(+), 39 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day2.java b/src/main/java/com/sbaars/adventofcode2019/days/Day2.java index 4508b9a3..dc56d59a 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day2.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day2.java @@ -1,9 +1,9 @@ package com.sbaars.adventofcode2019.days; import java.io.IOException; -import java.util.Arrays; import com.sbaars.adventofcode2019.common.Day; +import com.sbaars.adventofcode2019.intcode.IntcodeComputer; import com.sbaars.adventofcode2019.util.DoesFileOperations; public class Day2 implements Day, DoesFileOperations { @@ -14,10 +14,10 @@ public static void main(String[] args) throws IOException { @Override public int part1() throws IOException { - return execute(12, 2); + return execute(12,2); } - @Override + @Override //3146 public int part2() throws IOException { return bruteForceFindingNumber(19690720, 99); } @@ -34,22 +34,8 @@ private int bruteForceFindingNumber(int number, int bound) throws IOException { } private int execute(int x, int y) throws IOException { - int[] program = Arrays.stream(readDay(2).split(",")).mapToInt(Integer::parseInt).toArray(); - program[1] = x; - program[2] = y; - for(int i = 0; executeInstruction(program, i, program[i]); i+=4); - return program[0]; + IntcodeComputer computer = new IntcodeComputer(2, x, y); + computer.run(); + return computer.firstElement(); } - - private boolean executeInstruction(int[] program, int i, int instruction) { - switch(instruction) { - case 1: program[program[i+3]] = program[program[i+1]] + program[program[i+2]]; break; - case 2: program[program[i+3]] = program[program[i+1]] * program[program[i+2]]; break; - case 99: return false; - default: throw new IllegalStateException("Something went wrong!"); - } - - return true; - } - } diff --git a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java index 8ad62999..f013669e 100644 --- a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java +++ b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java @@ -1,9 +1,9 @@ package com.sbaars.adventofcode2019.intcode; import java.io.IOException; +import java.util.ArrayDeque; import java.util.Arrays; -import java.util.List; -import java.util.Stack; +import java.util.Deque; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -11,40 +11,38 @@ public class IntcodeComputer implements DoesFileOperations { final int[] program; - int instructionCounter = 0; - final Stack input = new Stack<>(); + private int instructionCounter = 0; + private final Deque input = new ArrayDeque<>(2); + + private boolean done = false; public IntcodeComputer(int day, int...input) throws IOException { this.program = Arrays.stream(readDay(day).split(",")).mapToInt(Integer::parseInt).toArray(); setInput(input); + if(day == 2) { + program[1] = input[0]; + program[2] = input[1]; + } } - + public int run() { int result; - while((result = executeInstruction(program, program[instructionCounter])) == -1); + while((result = executeInstruction(program, program[instructionCounter])) == 0); return result; } - private int executeProgram(int[] program, int c) throws IOException { - isFirst = c == 0; - int result; - while((result = executeInstruction(program, program[instructionCounter])) == -1); - return result; + public boolean isDone() { + return done; } private int executeInstruction(int[] program, int instruction) { if(instruction>99) return parseComplexInstruction(program, instruction); - else if(instruction == 99) { - done = true; - return lastVal; - } - //throw new IllegalStateException("Hit terminal code 99 before finding diagnostic code!"); return execute(program, instruction); } private int execute(int[] program, int instruction) { - return execute(program, new int[NUM_MODES], instruction); + return execute(program, new int[3], instruction); } private int execute(int[] program, int[] method, int instruction) { @@ -65,6 +63,10 @@ private int readInput() { return input.peek(); } + public int firstElement() { + return program[0]; + } + private boolean setInput(int...input) { this.input.clear(); return this.input.addAll(Arrays.stream(input).boxed().collect(Collectors.toList())); @@ -81,9 +83,10 @@ private int executeInstruction(int[] program, int[] args, int instruction) { case 6: if(args[1] == 0) instructionCounter = args[0]; break; case 7: program[args[0]] = args[1] < args[2] ? 1 : 0; break; case 8: program[args[0]] = args[1] == args[2] ? 1 : 0; break; + case 99: return -1; default: throw new IllegalStateException("Something went wrong!"); } - return -1; + return 0; } private int parseComplexInstruction(int[] program, int instruction) { @@ -112,6 +115,7 @@ private int[] getInstructions(int instruction) { private int nParams(int instruction) { switch(instruction) { + case 99: return 0; case 3: case 4: return 1; case 5: @@ -120,7 +124,7 @@ private int nParams(int instruction) { case 2: case 7: case 8: return 3; - default: if(instruction>=99) return nParams(getOpCode(instruction)); + default: if(instruction>99) return nParams(getOpCode(instruction)); else throw new IllegalStateException("Something went wrong! "+instruction); } } From de00e141e097a78ffdcadb2bcbc28dade825ab03 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 7 Dec 2019 21:26:49 +0100 Subject: [PATCH 026/433] Ported day 5 to the new intcode computer --- .../sbaars/adventofcode2019/days/Day5.java | 102 +----------------- 1 file changed, 4 insertions(+), 98 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day5.java b/src/main/java/com/sbaars/adventofcode2019/days/Day5.java index ead5ef56..22cb1358 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day5.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day5.java @@ -1,118 +1,24 @@ package com.sbaars.adventofcode2019.days; import java.io.IOException; -import java.util.Arrays; -import java.util.stream.IntStream; import com.sbaars.adventofcode2019.common.Day; +import com.sbaars.adventofcode2019.intcode.IntcodeComputer; import com.sbaars.adventofcode2019.util.DoesFileOperations; public class Day5 implements Day, DoesFileOperations { - - private static final int NUM_MODES = 3; - private int instructionCounter = 0; - private int part; - + public static void main(String[] args) throws IOException { new Day5().printParts(); } @Override public int part1() throws IOException { - part = 1; - return execute(); + return new IntcodeComputer(5, 1).run(); } @Override public int part2() throws IOException { - part = 2; - instructionCounter = 0; - return execute(); - } - - private int execute() throws IOException { - int[] program = Arrays.stream(readDay(5).split(",")).mapToInt(Integer::parseInt).toArray();; - int result; - while((result = executeInstruction(program, program[instructionCounter])) == -1); - return result; - } - - private int executeInstruction(int[] program, int instruction) { - if(instruction>99) - return parseComplexInstruction(program, instruction); - else if(instruction == 99) - throw new IllegalStateException("Hit terminal code 99 before finding diagnostic code!"); - return execute(program, instruction); - } - - private int execute(int[] program, int instruction) { - return execute(program, new int[NUM_MODES], instruction); - } - - private int execute(int[] program, int[] method, int instruction) { - int nParams = nParams(instruction); - int[] args = IntStream.range(0, nParams).map(j -> j == 0 ? program[instructionCounter+nParams] : program[instructionCounter+j]).toArray(); - if(args.length>=2) { - if(method[2] == 0) args[1] = program[args[1]]; - if(args.length>=3 && method[1] == 0) args[2] = program[args[2]]; - } - if(instruction == 4 && method[2] == 0) args[0] = program[args[0]]; - if((instruction == 5 || instruction == 6) && method[1] == 0) args[0] = program[args[0]]; - return executeInstruction(program, args, instruction); - } - - private int executeInstruction(int[] program, int[] args, int instruction) { - switch(instruction) { - case 1: program[args[0]] = args[1] + args[2]; break; - case 2: program[args[0]] = args[1] * args[2]; break; - case 3: program[args[0]] = part == 1 ? 1 : 5; break; - case 4: if(args[0]!=0) return args[0]; break; - case 5: if(args[1] != 0) { instructionCounter = args[0]; return -1; } break; - case 6: if(args[1] == 0) { instructionCounter = args[0]; return -1; } break; - case 7: program[args[0]] = args[1] < args[2] ? 1 : 0; break; - case 8: program[args[0]] = args[1] == args[2] ? 1 : 0; break; - default: throw new IllegalStateException("Something went wrong!"); - } - instructionCounter+=nParams(instruction) + 1; - return -1; - } - - private int parseComplexInstruction(int[] program, int instruction) { - int[] instructions = getInstructions(instruction); - int opcode = getOpCode(instructions); - return execute(program, instructions, opcode); - - } - - private int getOpCode(int instruction) { - return getOpCode(getInstructions(instruction)); - } - - private int getOpCode(int[] instructions) { - return (instructions[3] * 10) + instructions[4]; - } - - private int[] getInstructions(int instruction) { - int[] instructions = new int[5]; - for(int j = instructions.length-1; instruction>0; j--) { - instructions[j] = instruction % 10; - instruction /= 10; - } - return instructions; - } - - private int nParams(int instruction) { - switch(instruction) { - case 3: - case 4: return 1; - case 5: - case 6: return 2; - case 1: - case 2: - case 7: - case 8: return 3; - default: if(instruction>=99) return nParams(getOpCode(instruction)); - else throw new IllegalStateException("Something went wrong!"); - } + return new IntcodeComputer(5, 5).run(); } } From b1eeada1a59d1701ab11add0c861d578fd0d0647 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 7 Dec 2019 22:07:56 +0100 Subject: [PATCH 027/433] Ported day 7 to the new intcode computer --- .../sbaars/adventofcode2019/days/Day7.java | 153 +++--------------- .../intcode/IntcodeComputer.java | 26 +-- 2 files changed, 31 insertions(+), 148 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day7.java b/src/main/java/com/sbaars/adventofcode2019/days/Day7.java index fb95f1e3..552368ab 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day7.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day7.java @@ -1,30 +1,16 @@ package com.sbaars.adventofcode2019.days; -import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.stream.IntStream; import com.sbaars.adventofcode2019.common.Day; +import com.sbaars.adventofcode2019.intcode.IntcodeComputer; import com.sbaars.adventofcode2019.util.DoesFileOperations; public class Day7 implements Day, DoesFileOperations { - private static final int NUM_MODES = 3; - private int instructionCounter = 0; - private int part; - private int phase = 0; - private boolean isFirst = true; - private int[] startState; - private int lastVal = -1; - private boolean done = false; - - public Day7() throws IOException { - startState = Arrays.stream(getFileAsString(new File(Day1.class.getClassLoader().getResource("day7.txt").getFile())).split(",")).mapToInt(Integer::parseInt).toArray(); - } - public static void main(String[] args) throws IOException { new Day7().printParts(); } @@ -33,18 +19,10 @@ public static void main(String[] args) throws IOException { public int part1() throws IOException { List> permutations = generatePerm(new ArrayList<>(Arrays.asList(0,1,2,3,4))); List results = new ArrayList<>(); - for(List shuffle : permutations) { - lastVal = -1; - part = 0; - for(Integer i : shuffle) { - int[] program = new int[startState.length]; - for(int j = 0; j perm : permutations) { + int lastVal = 0; + for(Integer i : perm) + lastVal = new IntcodeComputer(7, i, lastVal).run(); results.add(lastVal); } @@ -55,25 +33,21 @@ public int part1() throws IOException { public int part2() throws IOException { List> permutations = generatePerm(new ArrayList<>(Arrays.asList(5,6,7,8,9))); List results = new ArrayList<>(); - for(List shuffle : permutations) { - lastVal = 0; - part = 0; - int[][] programs = new int[shuffle.size()][startState.length]; - for(int i = 0; i shuffle : permutations) { + IntcodeComputer[] computers = new IntcodeComputer[5]; + for(int i = 0; i e).max().getAsInt(); @@ -97,95 +71,4 @@ public List> generatePerm(List original) { } return returnValue; } - - private int executeProgram(int[] program, int c) throws IOException { - isFirst = c == 0; - instructionCounter = c; - // = Arrays.stream(getFileAsString(new File(Day1.class.getClassLoader().getResource("day7-3.txt").getFile())).split(",")).mapToInt(Integer::parseInt).toArray(); - int result; - while((result = executeInstruction(program, program[instructionCounter])) == -1); - return result; - } - - private int executeInstruction(int[] program, int instruction) { - if(instruction>99) - return parseComplexInstruction(program, instruction); - else if(instruction == 99) { - done = true; - return lastVal; - } - //throw new IllegalStateException("Hit terminal code 99 before finding diagnostic code!"); - return execute(program, instruction); - } - - private int execute(int[] program, int instruction) { - return execute(program, new int[NUM_MODES], instruction); - } - - private int execute(int[] program, int[] method, int instruction) { - int nParams = nParams(instruction); - int[] args = IntStream.range(0, nParams).map(j -> j == 0 ? program[instructionCounter+nParams] : program[instructionCounter+j]).toArray(); - if(args.length>=2) { - if(method[2] == 0) args[1] = program[args[1]]; - if(args.length>=3 && method[1] == 0) args[2] = program[args[2]]; - } - if(instruction == 4 && method[2] == 0) args[0] = program[args[0]]; - if((instruction == 5 || instruction == 6) && method[1] == 0) args[0] = program[args[0]]; - return executeInstruction(program, args, instruction); - } - - private int executeInstruction(int[] program, int[] args, int instruction) { - switch(instruction) { - case 1: program[args[0]] = args[1] + args[2]; break; - case 2: program[args[0]] = args[1] * args[2]; break; - case 3: program[args[0]] = isFirst ? phase : (part == 0 ? 0 : lastVal);if(!isFirst) part++; isFirst = false; break; - case 4: return args[0]; - case 5: if(args[1] != 0) { instructionCounter = args[0]; return -1; } break; - case 6: if(args[1] == 0) { instructionCounter = args[0]; return -1; } break; - case 7: program[args[0]] = args[1] < args[2] ? 1 : 0; break; - case 8: program[args[0]] = args[1] == args[2] ? 1 : 0; break; - default: throw new IllegalStateException("Something went wrong!"); - } - instructionCounter+=nParams(instruction) + 1; - return -1; - } - - private int parseComplexInstruction(int[] program, int instruction) { - int[] instructions = getInstructions(instruction); - int opcode = getOpCode(instructions); - return execute(program, instructions, opcode); - - } - - private int getOpCode(int instruction) { - return getOpCode(getInstructions(instruction)); - } - - private int getOpCode(int[] instructions) { - return (instructions[3] * 10) + instructions[4]; - } - - private int[] getInstructions(int instruction) { - int[] instructions = new int[5]; - for(int j = instructions.length-1; instruction>0; j--) { - instructions[j] = instruction % 10; - instruction /= 10; - } - return instructions; - } - - private int nParams(int instruction) { - switch(instruction) { - case 3: - case 4: return 1; - case 5: - case 6: return 2; - case 1: - case 2: - case 7: - case 8: return 3; - default: if(instruction>=99) return nParams(getOpCode(instruction)); - else throw new IllegalStateException("Something went wrong! "+instruction); - } - } } diff --git a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java index f013669e..9685f891 100644 --- a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java +++ b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java @@ -3,7 +3,7 @@ import java.io.IOException; import java.util.ArrayDeque; import java.util.Arrays; -import java.util.Deque; +import java.util.Queue; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -12,9 +12,8 @@ public class IntcodeComputer implements DoesFileOperations { final int[] program; private int instructionCounter = 0; - private final Deque input = new ArrayDeque<>(2); - - private boolean done = false; + private final Queue input = new ArrayDeque<>(2); + private int lastInput; public IntcodeComputer(int day, int...input) throws IOException { this.program = Arrays.stream(readDay(day).split(",")).mapToInt(Integer::parseInt).toArray(); @@ -30,10 +29,6 @@ public int run() { while((result = executeInstruction(program, program[instructionCounter])) == 0); return result; } - - public boolean isDone() { - return done; - } private int executeInstruction(int[] program, int instruction) { if(instruction>99) @@ -58,16 +53,21 @@ private int execute(int[] program, int[] method, int instruction) { } private int readInput() { - if(input.size()>1) - return input.pop(); - return input.peek(); + if(input.isEmpty()) + return lastInput; + lastInput = input.poll(); + return lastInput; + } + + public boolean addInput(int num) { + return input.add(num); } public int firstElement() { return program[0]; } - private boolean setInput(int...input) { + public boolean setInput(int...input) { this.input.clear(); return this.input.addAll(Arrays.stream(input).boxed().collect(Collectors.toList())); } @@ -115,7 +115,7 @@ private int[] getInstructions(int instruction) { private int nParams(int instruction) { switch(instruction) { - case 99: return 0; + case 99: return -1; case 3: case 4: return 1; case 5: From 6e7f59982d814417bfc4424524dad55a59686a25 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 8 Dec 2019 06:31:39 +0100 Subject: [PATCH 028/433] Day 8 --- .../sbaars/adventofcode2019/days/Day8.java | 66 +++++++++++++++++++ .../adventofcode2019/util/CountMap.java | 52 +++++++++++++++ src/main/resources/7-4.txt | 1 - src/main/resources/day7-2.txt | 1 - src/main/resources/day7-3.txt | 1 - src/main/resources/day8.txt | 1 + 6 files changed, 119 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode2019/days/Day8.java create mode 100644 src/main/java/com/sbaars/adventofcode2019/util/CountMap.java delete mode 100644 src/main/resources/7-4.txt delete mode 100644 src/main/resources/day7-2.txt delete mode 100644 src/main/resources/day7-3.txt create mode 100644 src/main/resources/day8.txt diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day8.java b/src/main/java/com/sbaars/adventofcode2019/days/Day8.java new file mode 100644 index 00000000..00537dc8 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day8.java @@ -0,0 +1,66 @@ +package com.sbaars.adventofcode2019.days; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.IntStream; + +import com.sbaars.adventofcode2019.common.Day; +import com.sbaars.adventofcode2019.util.CountMap; +import com.sbaars.adventofcode2019.util.DoesFileOperations; + +public class Day8 implements Day, DoesFileOperations { + + public static void main(String[] args) throws IOException { + new Day8().printParts(); + } + + @Override + public int part1() throws IOException { + char[] chars = readDay(8).toCharArray(); + int[] pixels = IntStream.range(0, chars.length).map(i -> Character.getNumericValue(chars[i])).toArray(); + List> pixelCounts = new ArrayList<>(); + for(int i = 0; i cm = new CountMap<>(); + for(int j = i; j cm = pixelCounts.stream().reduce((e1, e2) -> e1.get(0) > e2.get(0) ? e2 : e1).get(); + return cm.get(1) * cm.get(2); + } + + @Override + public int part2() throws IOException { + char[] chars = readDay(8).toCharArray(); + int[] pixels = IntStream.range(0, chars.length).map(i -> Character.getNumericValue(chars[i])).toArray(); + int[][] pixelArrays = splitArray(pixels, 100, 25*6); + int[] finalPixels = pixelArrays[0]; + for(int i = 1; i extends HashMap { + /** + * + */ + private static final long serialVersionUID = 1L; + + public CountMap() { + } + + public CountMap(int initialCapacity, float loadFactor) { + super(initialCapacity, loadFactor); + } + + public CountMap(int initialCapacity) { + super(initialCapacity); + } + + public CountMap(Map m) { + super(m); + } + + public Integer increment(K key) { + return super.put(key, super.containsKey(key) ? super.get(key) + 1 : 1); + } + + public Integer increment(K key, int amount) { + return super.put(key, super.containsKey(key) ? super.get(key) + amount : amount); + } + + @SuppressWarnings("unchecked") + @Override + public Integer get(Object key){ + if(!super.containsKey(key)) + super.put((K) key, 0); + return super.get(key); + } + + @Override + public String toString() { + return keySet().stream().sorted().map(e -> e+"\t"+get(e)).collect(Collectors.joining(System.lineSeparator())); + } + + public void addAll(CountMap amountPerCloneClassSize) { + amountPerCloneClassSize.entrySet().stream().forEach(e -> this.increment(e.getKey(), e.getValue())); + } +} diff --git a/src/main/resources/7-4.txt b/src/main/resources/7-4.txt deleted file mode 100644 index 5ed292ba..00000000 --- a/src/main/resources/7-4.txt +++ /dev/null @@ -1 +0,0 @@ -3,52,1001,52,-5,52,3,53,1,52,56,54,1007,54,5,55,1005,55,26,1001,54,-5,54,1105,1,12,1,53,54,53,1008,54,0,55,1001,55,1,55,2,53,55,53,4,53,1001,56,-1,56,1005,56,6,99,0,0,0,0,10 \ No newline at end of file diff --git a/src/main/resources/day7-2.txt b/src/main/resources/day7-2.txt deleted file mode 100644 index 993e2e04..00000000 --- a/src/main/resources/day7-2.txt +++ /dev/null @@ -1 +0,0 @@ -3,15,3,16,1002,16,10,16,1,16,15,15,4,15,99,0,0 \ No newline at end of file diff --git a/src/main/resources/day7-3.txt b/src/main/resources/day7-3.txt deleted file mode 100644 index 4363e8ee..00000000 --- a/src/main/resources/day7-3.txt +++ /dev/null @@ -1 +0,0 @@ -3,26,1001,26,-4,26,3,27,1002,27,2,27,1,27,26,27,4,27,1001,28,-1,28,1005,28,6,99,0,0,5 \ No newline at end of file diff --git a/src/main/resources/day8.txt b/src/main/resources/day8.txt new file mode 100644 index 00000000..1838f93f --- /dev/null +++ b/src/main/resources/day8.txt @@ -0,0 +1 @@ +222122222222222221222222020220220222201212222222121120222212202222222222222222202222222222222222210222202222222201222222122022222022022222222222222212222122222222222221222222022222220222211202222222020221222222222222222222222222222222222222222222210222222222222211222222122022222022022222222222222222222022222222222222222222021222221222222202222122121122222202222222222222222222202222222222222222220222212222222202222222222222222222222222222222222212212022222222222221222222222221220222200202222222120220222212222222222222222222212222222222222222200222202222222210222222022022222122122222222222222222222022222222222221222222022221222222220212222122021022222212222222222222222222212222222222222222202222202222222200222222022122222222022222222222222212212022222222222221222222022222221222212222222222220020222222102222222222222222202222222222222222220222212222222212222222122122222122022222222222222222212222222222222222222222120220222222220222222222221122222222022222222222222222222222222222222222212222222222222221222212222122222122222222222222222212212022222222222220222222121220222222202202222022220221222212202222222222222222212222222222222222202222222222222220220202222022222022122222222222222212222122122222222221222222121221222222201202222022121120222212222222222222222222222222220222222222221222212222222210222212022122222022222222222222222212222022122222222220222222022222220222202222222022122022222212112122222222222222202222221222222222220222222222222201221222022022222022222222222222222212211022222222222220222222022220221222222212222222122010222212102122222222222222212222220222222222211222222222222222222222222022222122222222222222222202210122022222222221222222120222222222211212222022121200222222022222222222222222222222220222212222202222212222222221221212122222222022022222222222222212202122122222222220222222020222220222202222222122222121222202112122222222222222222222220222202222222222202222222211221222222102222022122222222222222222202222022222222221222222222220222222202202222222021120222222112122222222222222212222221222202222202222212222222212222202122012222022122222222222222202222122022222212222222222221220220222221212222222020011222222122122222222222222222222220222212222211222202222222211222212021202222222122222222222222202202222022222212221222222021222221222220202222022120012222212012122222222222222202222221222202222222222202222222221222212120002222022222222222222222202222222022222202222222222020221221222212222222122022000222222102122222222222222222222222222202222210222222222222201220222021122222222122222222222222222210222022222212222222222122220222222220012222222122201222202002022222222222222202222222222222222201222202222222211220202120122222222222222222222222212202122022222212220222222220222221222212112222222022021222202202022202222222222012222222222222222210222212222222222222012020022222022122222222222222202222121222222222221222222022220220222210112222122221122222202222222202222222222212222221222222222210222212222222212220202120222222222222222222222222222210120022222202222222222022220222222220002222202022211222222012122202222222222002222221222202222221222212222222221221212122122222022022222222222222222221222222222212220022222121220222222221102222112121101222202202222212222222222112222020212222122220222202222222200220022022112222222022222222222222222222120122222202220222222021221220222202222222022122121222212122222212222212222102222220202202222211222222222222211222022020112222222222222222222222212201121022222202220022222222220220222210122222122122020222222112122212222202222202222220222222022200222202222222210220102121022222022222222222222222222212021222222202222222222022221222222222122222212220201222212202222212222222202012222221222222122200222202222222211222122122212222022022222202222222202202121222222202222021222120220221222201002222212120221222202122222212222212202112222221222222002212222212222222220222022220212222222022222222222222222211122122222202222222222121222220222221212222202221020222212112122202222222212112222122222202002211222212222222220221102121012222222122222202222222202222122122222212222222222122222220222211012222122022022222212102022202022202222202222122222222112210222222222222202222102122212222222022222212222222222212222022222220221021222120221220222221000222112121000222222202222222022222212102222222202222122212222222222222201220212221122222222122222222222222212201022022222220221122222221221220222221211222022222020222212222122212222222112202222120222202112211222202222222221222112020112222022022222202222222222211122022222221220220222221220220222222121222102222210222212002022212222222222212222121212212022222222202222222202221012020212222022222222212222222222212221022222212221220222221220221222222000222122020011222222202222222122212202002222221222222022102222212222222202220202021002222122122222212222222222220221122222202221220222221222222222222212222122121010222222102222212022222122022222120202202012110222222222222220221022122222222222122222202222222212200222222222202222020222221221222222202200222022121200222202112022212022212222222222021220202002111222222222222221220122121202222222222222202202222202212121122222222222120222221220200222220210222102121221222212212221222022212212222222221221202012112222222222222220220002021012222222022221222202222212202120122222200222221222221222221222210011222212021222222222212222202222222022022222021220202122022222202222222220220112221222222122122221222212222222222121022222200221221220020220201222222002222212122200222212122122202122022212112222221221202202212222212222222211222222220222222022122222002222222222201120222222220222220220120221200222211212222112221210222212212220212022012122022222220221212102001222202222222222220112020002222022222220102222222202212020022222201221020222122220222222211111022012220122222222012122202222202222222222122222212222002220202222222221221212021102222122022220002212222202210020122222202221120221121220202222221001022202220111222212112021212222222102112222022202202022020221222222222200220102220222222022022220122202222212222021022222210222120221021222210222222120222212120020222222212022202022112102122222020222212022222222202222222220220202222102202222022222002212222212211222122222200221220222220221221222222001022022021112222202102021212122122122222222220222212202201220202222222212220212021212212222020020022212222212201220222220212222221120010220202222201220222202122002222212112222202122112112212222121220222212002221002222222201222002221002222222220121022212222202211121222222212222221222001222202222210010222112021202222212102120202222222122002222120221222122020222122222222211222222222222210122221122022202222222212021122221202220120222000222221222212002022112022012222202222022222022212012002222122220212022122220112222222200220002022212202122220120022212222202221220222221201220021122121222220222211212122212222220222202022122222022102002222222121210222202022221112222222220221022020012210222221221222212222212220120022222211222221120022220212222210012222012122012222222202222222222202112222222021200212202200221202222222201222012222002211222221022112222222202202220222221220222021020021221211222221111222102020000222222202220202122002102022222221211122102120211002222222212222002120022222212222220022202222212202221222222210221120020201221212222221100222002022121222022202221222222002022002222121212212111211212122222222222222202122002200112220120202222222212211221222222021221222120210221222222220022222022022012222122112020212022022122012222221210102202021200202222222200221202121202210122222122012202222202201122222221120220022222112222221222201211122002121020222012222021202222020212112222122200122121102211002222222200220212220202220012221122012212222202202220122210000222220022010221211222212022022112022212222102002122222222111212202222220222022211202211112202222010221122222202222102122020102212222222221121222201021221221022210221221222201022022012021220222112022121202022222012202222120200002002110200222200222000221022101022222002021021222202222222200220222200101220122122020222201222210112022102021112222002202022202222022212122222122222222020220221102220222020222222212012201012020222222012220222101222122202100222120021120222202222221122022202122212222012002220212022120122002222220200122002201220002200222020220012011022220122120022012012221212121222122221000221021020221221220222211201122012020121222212122121212022000002122222220221102222012221122210222211212212122022210002221121122012221222022122122220012222120021002222201222200222022102022222222022022120212122121122022222020220202011001221222210222200201002122222200122122120102202220202212020222200010221021021120220222222222121222002122201222022002220202022210012002222022210212220020200022211222121221102120212212002221122022202210222110121122210101220020222002220200222212111122112221120222002122221202022120222002222122220212120101201202201222222221102200212212212121121022212210202002221022221022220120020100222201222201121122002121021222022012020222022201022122222122202102001022200022220222121222012021122212212221221222222212222010220122201012221022012002220212222222111222212122112222012202222212122010122022222121210022112010202202201222122210202112012200012120020201122220212020122022221012220222111020220221222201222022002121022222202102220222122212002202222020202112121222200122221222101211202022111210122122220020202210212021122222222012222120221201222220222211222122012220121222202012020212122202122202222120210212210202220122210222020220222101212200002220120220112211202000122022201100222022201111221202222202022122112122001222002202022222122221102102222021211102220220221002200222112221022220200200022222022212122212212111222022221121221021201202220221222202211122122122222222022212021212022021012202222021211012110221201212220222121211212022012220022021121011012202222211020122210122221122110120222200222212100022102021111022222112122212222021102022222022221222121101222212210202210221012220112201222122022121112202012210221222202221221020022100221210222220121222102020201122102212020222122121212122222120201122110121222212222202112222212220111221002120220101212220122012022120200021222120021010221212222220100122112121221222102202120212122012122102220222202202000120211222222202102220122002122222202020221011212222212010220220222122221022211010220220222220010122002020021122002112122212022112122012221122201002222022212012222212110212022201000211112222021121012222222210121020202200220121210100220221222220001122022020222222212212222212122021002102221222211122000202212112210222001201102001102210112120221102112201012102221121201202221021110012222210222222012022112221200022022022122202212000002012222121212012220010200022201212101211202222122201102122020211102220212010221020222102221020022200220201222210211022202022210122022002221222012010212122211221221102201022211102220212110222022110121200222122122002212210122211220220221222221222201220221120222210011222022121111222102022222222012000022002200220222102012110221012212202201211122220021200012121122202122211022221121021212100220120012002222120222202210022022220020122012222222202212100022222211020210102220202211222211202220221122001011211222122122211212221112202122120200011220120212201221110222220202022012021012222012002220212022220222002221120220202110000211012202212020221122211110221222220220100112212222221021222220011222021001120220211222200121022222120101022202202020222002212222102222022212122011220202022220202020211022022220212222220222111112201212010120221210212221122120212221101222202212122212222120222102122122222202101022112202220212202220000200122210222012211122022100200022220222001002220202122121220201021221000002101221122222200112122102122012022112212121222112210212012210022221212002102220212211222100200012001202201012122020020012211022200121122222102220000002210221211222221122222022020201122022102222222102200002022212222000012211121201122211212121222012100121212122222020122102211002022021222210012222221001020220111222222011222022022210122112202022202222201012022212120221202202222221012211202021210022221011221022122020201212201012220122022222112221102011211222102222210010222012122110122222212121212222221012122202222201222202120220022210222110221212002122220222220120221102201202111021222200122222212010012220210222212021022112022011022012202221202112021002122210121002202100101200122210212021202112122000220222221020202012201002201021221201111222101021011222222222210020022002020200122002112122222222202102002210220102122211121201102212212012212202222201222022020122020212211212210221021221011222100002221221012222210100022202121010022222112021202102011102012201220211022022000201122220222020222012022021202102020122010012222102001022022202011220012112201221201222220101022102021210022212122020212122000102102222220202222100200222122201202110220012001122222012020220102112220212100121121202102220221201122221010222210002022202221000122212012222202102201212022210010111002211211211202212202200202222200001212112121222002122221012002121022210222221222120020222212222212121022112222011022222202220222102020012122220020012022111112211102222212202220012020212201022222122002002222002222222122012102221021121121221221222210122222212220110022212222222222202220022212220122120112002121220212212222101200202112000220112001120020112220222211122020120210222120202210220222222210120022122120021022222012220202102200112212220002211002201102212212212222121220212122221212002021122101222202222022021220122222222210101000222202222201100022122222101222102222200202022212022012221201202112211212210022202222011220202221010200112001221222122212012122120120022021221222111222221211222221121222202122121122122012002222002222210112210102002202202011210202210222011222122212222200012211020200202220002111002121001020222022222121222020222222000022222021200122012112210212012001000122200000201022102010200112111222220211112120010201102020222221122212012121121022022120222200101102022210222200111022012120111022012022100222212012022002201221111102200102220212101202220221122111010201112212121020112201222201112020120201221001121120220220222212012222222120021022202102112012102012212222212022120202220000202120211222222222122202022211112201020100202222102020120222101120221101110100221221222210000122120121110222112122002122222101121222201000222122201122202202220222020202012222000220212100020021122201122022212222110022221211101210021021222220200022201022001112022122112222002202121122200111210122021221210210102212211221212222120212202200021212122211202202200121101001221021021221021022222202122022210122012212122212012202102022221222111020111112120221210210020222110200202112111202002020121210012210012102002020000221222200002210020220202221110122121020222102002102100022222121101222102120001112101222202001022222101221102021112200102200222022002220102210111121221220221202020011222102222210020222021022211002202002120112202120111222121002002022112112200200221212000201122110100200212020122012202201122122000212211222011122220200201100111000022010102201221120010110121011120100100011202001101011012210020022201001212022210200111020120211112200111000100 \ No newline at end of file From eb81b217df72da0b13d856fc05f69f2f2918b5f5 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 8 Dec 2019 06:36:55 +0100 Subject: [PATCH 029/433] Refactoring day 8 --- .../sbaars/adventofcode2019/days/Day8.java | 29 +++++++++++++------ 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day8.java b/src/main/java/com/sbaars/adventofcode2019/days/Day8.java index 00537dc8..5f148b94 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day8.java @@ -18,8 +18,19 @@ public static void main(String[] args) throws IOException { @Override public int part1() throws IOException { + int[] pixels = readPixels(); + List> pixelCounts = countPixels(pixels); + CountMap cm = pixelCounts.stream().reduce((e1, e2) -> e1.get(0) > e2.get(0) ? e2 : e1).get(); + return cm.get(1) * cm.get(2); + } + + private int[] readPixels() throws IOException { char[] chars = readDay(8).toCharArray(); int[] pixels = IntStream.range(0, chars.length).map(i -> Character.getNumericValue(chars[i])).toArray(); + return pixels; + } + + private List> countPixels(int[] pixels) { List> pixelCounts = new ArrayList<>(); for(int i = 0; i cm = new CountMap<>(); @@ -28,16 +39,19 @@ public int part1() throws IOException { } pixelCounts.add(cm); } - System.out.println(pixelCounts.size()); - CountMap cm = pixelCounts.stream().reduce((e1, e2) -> e1.get(0) > e2.get(0) ? e2 : e1).get(); - return cm.get(1) * cm.get(2); + return pixelCounts; } @Override public int part2() throws IOException { - char[] chars = readDay(8).toCharArray(); - int[] pixels = IntStream.range(0, chars.length).map(i -> Character.getNumericValue(chars[i])).toArray(); + int[] pixels = readPixels(); int[][] pixelArrays = splitArray(pixels, 100, 25*6); + int[] finalPixels = determineFinalImage(pixelArrays); + System.out.println(Arrays.deepToString(splitArray(finalPixels, 6, 25))); + return 0; + } + + private int[] determineFinalImage(int[][] pixelArrays) { int[] finalPixels = pixelArrays[0]; for(int i = 1; i Date: Sun, 8 Dec 2019 17:51:07 +0100 Subject: [PATCH 030/433] Made the ascii art nicer --- .../com/sbaars/adventofcode2019/days/Day8.java | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day8.java b/src/main/java/com/sbaars/adventofcode2019/days/Day8.java index 5f148b94..5158422b 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day8.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; import java.util.stream.IntStream; import com.sbaars.adventofcode2019.common.Day; @@ -47,8 +48,8 @@ public int part2() throws IOException { int[] pixels = readPixels(); int[][] pixelArrays = splitArray(pixels, 100, 25*6); int[] finalPixels = determineFinalImage(pixelArrays); - System.out.println(Arrays.deepToString(splitArray(finalPixels, 6, 25))); - return 0; + Arrays.stream(splitArray(finalPixels, 6, 25)).map(a -> Arrays.stream(a).boxed().map(x -> x == 0 ? " " : "â–ˆ").collect(Collectors.joining())).forEach(System.out::println); + return 0; // Answer: FPUAR } private int[] determineFinalImage(int[][] pixelArrays) { @@ -65,13 +66,9 @@ private int[] determineFinalImage(int[][] pixelArrays) { int[][] splitArray(int[] arr, int x, int y){ int[][] pixelArrays = new int[x][y]; - int cor = 0; - for(int i = 0; i Date: Sun, 8 Dec 2019 17:59:11 +0100 Subject: [PATCH 031/433] Final refactoring and such for day 8 --- .../sbaars/adventofcode2019/days/Day8.java | 37 ++++++++++++------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day8.java b/src/main/java/com/sbaars/adventofcode2019/days/Day8.java index 5158422b..504045b5 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day8.java @@ -12,6 +12,10 @@ import com.sbaars.adventofcode2019.util.DoesFileOperations; public class Day8 implements Day, DoesFileOperations { + + private static final int DIM_X = 6; + private static final int DIM_Y = 25; + private static final int SIZE = DIM_X*DIM_Y; public static void main(String[] args) throws IOException { new Day8().printParts(); @@ -27,15 +31,14 @@ public int part1() throws IOException { private int[] readPixels() throws IOException { char[] chars = readDay(8).toCharArray(); - int[] pixels = IntStream.range(0, chars.length).map(i -> Character.getNumericValue(chars[i])).toArray(); - return pixels; + return IntStream.range(0, chars.length).map(i -> Character.getNumericValue(chars[i])).toArray(); } private List> countPixels(int[] pixels) { List> pixelCounts = new ArrayList<>(); - for(int i = 0; i cm = new CountMap<>(); - for(int j = i; j> countPixels(int[] pixels) { return pixelCounts; } + + /* + Answer: + + ████ ███ â–ˆ â–ˆ ██ ███ + â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ + ███ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ + â–ˆ ███ â–ˆ â–ˆ ████ ███ + â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ + â–ˆ â–ˆ ██ â–ˆ â–ˆ â–ˆ â–ˆ + */ @Override public int part2() throws IOException { int[] pixels = readPixels(); - int[][] pixelArrays = splitArray(pixels, 100, 25*6); + int[][] pixelArrays = splitArray(pixels, 100, SIZE); int[] finalPixels = determineFinalImage(pixelArrays); - Arrays.stream(splitArray(finalPixels, 6, 25)).map(a -> Arrays.stream(a).boxed().map(x -> x == 0 ? " " : "â–ˆ").collect(Collectors.joining())).forEach(System.out::println); - return 0; // Answer: FPUAR + Arrays.stream(splitArray(finalPixels, DIM_X, DIM_Y)).map(a -> Arrays.stream(a).boxed().map(x -> x == 0 ? " " : "â–ˆ").collect(Collectors.joining())).forEach(System.out::println); + return 0; } private int[] determineFinalImage(int[][] pixelArrays) { int[] finalPixels = pixelArrays[0]; - for(int i = 1; i Date: Sun, 8 Dec 2019 18:00:52 +0100 Subject: [PATCH 032/433] Update README.md --- README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e8336bc7..1c2ec76a 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,12 @@ # adventOfCode(2019) -Let's do this! Code first, refactor later(tm). +Let's do this! + +Days: +- [Day 1](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day1.java) +- [Day 2](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day2.java) +- [Day 3](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day3.java) +- [Day 4](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day4.java) +- [Day 5](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day5.java) +- [Day 6](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day6.java) +- [Day 7](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day7.java) +- [Day 8](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day8.java) From 0679b7edc5231e6b9b02d69c8c2d6fdb782b4fa2 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 9 Dec 2019 08:08:51 +0100 Subject: [PATCH 033/433] Day 9 --- .../sbaars/adventofcode2019/days/Day2.java | 2 +- .../sbaars/adventofcode2019/days/Day5.java | 4 +- .../sbaars/adventofcode2019/days/Day7.java | 4 +- .../sbaars/adventofcode2019/days/Day9.java | 24 ++++++ .../intcode/IntcodeComputer.java | 76 +++++++++++-------- src/main/resources/day10.txt | 1 + src/main/resources/day11.txt | 1 + src/main/resources/day9.txt | 1 + 8 files changed, 78 insertions(+), 35 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode2019/days/Day9.java create mode 100644 src/main/resources/day10.txt create mode 100644 src/main/resources/day11.txt create mode 100644 src/main/resources/day9.txt diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day2.java b/src/main/java/com/sbaars/adventofcode2019/days/Day2.java index dc56d59a..b896fe01 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day2.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day2.java @@ -36,6 +36,6 @@ private int bruteForceFindingNumber(int number, int bound) throws IOException { private int execute(int x, int y) throws IOException { IntcodeComputer computer = new IntcodeComputer(2, x, y); computer.run(); - return computer.firstElement(); + return Math.toIntExact(computer.firstElement()); } } diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day5.java b/src/main/java/com/sbaars/adventofcode2019/days/Day5.java index 22cb1358..63089705 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day5.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day5.java @@ -14,11 +14,11 @@ public static void main(String[] args) throws IOException { @Override public int part1() throws IOException { - return new IntcodeComputer(5, 1).run(); + return new IntcodeComputer(5, 1).runInt(); } @Override public int part2() throws IOException { - return new IntcodeComputer(5, 5).run(); + return new IntcodeComputer(5, 5).runInt(); } } diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day7.java b/src/main/java/com/sbaars/adventofcode2019/days/Day7.java index 552368ab..8d2f5f05 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day7.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day7.java @@ -22,7 +22,7 @@ public int part1() throws IOException { for(List perm : permutations) { int lastVal = 0; for(Integer i : perm) - lastVal = new IntcodeComputer(7, i, lastVal).run(); + lastVal = new IntcodeComputer(7, i, lastVal).runInt(); results.add(lastVal); } @@ -41,7 +41,7 @@ public int part2() throws IOException { for(IntcodeComputer c : computers) { c.addInput(lastVal); int thruster = lastVal; - lastVal = c.run(); + lastVal = c.runInt(); if(lastVal == -1) { results.add(thruster); continue perms; diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day9.java b/src/main/java/com/sbaars/adventofcode2019/days/Day9.java new file mode 100644 index 00000000..d4299d59 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day9.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode2019.days; + +import java.io.IOException; + +import com.sbaars.adventofcode2019.common.Day; +import com.sbaars.adventofcode2019.intcode.IntcodeComputer; +import com.sbaars.adventofcode2019.util.DoesFileOperations; + +public class Day9 implements Day, DoesFileOperations { + + public static void main(String[] args) throws IOException { + new Day9().printParts(); + } + + @Override + public int part1() throws IOException { + return new IntcodeComputer(9, 1).runInt(); + } + + @Override + public int part2() throws IOException { + return 0; + } +} diff --git a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java index 9685f891..b77104d0 100644 --- a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java +++ b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java @@ -10,13 +10,14 @@ import com.sbaars.adventofcode2019.util.DoesFileOperations; public class IntcodeComputer implements DoesFileOperations { - final int[] program; + final long[] program; private int instructionCounter = 0; private final Queue input = new ArrayDeque<>(2); private int lastInput; + private long relativeBase = 0; public IntcodeComputer(int day, int...input) throws IOException { - this.program = Arrays.stream(readDay(day).split(",")).mapToInt(Integer::parseInt).toArray(); + this.program = Arrays.stream(readDay(day).split(",")).mapToLong(Long::parseLong).toArray(); setInput(input); if(day == 2) { program[1] = input[0]; @@ -24,32 +25,42 @@ public IntcodeComputer(int day, int...input) throws IOException { } } - public int run() { - int result; - while((result = executeInstruction(program, program[instructionCounter])) == 0); + public long run() { + long result; + while((result = executeInstruction(Math.toIntExact(program[instructionCounter]))) == 0); return result; } - private int executeInstruction(int[] program, int instruction) { + private long executeInstruction(int instruction) { if(instruction>99) - return parseComplexInstruction(program, instruction); - return execute(program, instruction); + return parseComplexInstruction(instruction); + return execute(instruction); } - private int execute(int[] program, int instruction) { - return execute(program, new int[3], instruction); + private long execute(int instruction) { + return execute(new int[3], instruction); } - private int execute(int[] program, int[] method, int instruction) { + private long execute(int[] method, int instruction) { int nParams = nParams(instruction); - int[] args = IntStream.range(0, nParams).map(j -> j == 0 ? program[instructionCounter+nParams] : program[instructionCounter+j]).toArray(); + long[] args = IntStream.range(0, nParams).mapToLong(j -> j == 0 ? program[instructionCounter+nParams] : program[instructionCounter+j]).toArray(); + transformParam2(method, args); + transformDataForMode(method, instruction, args); + return executeInstruction(args, instruction); + } + + private void transformParam2(int[] method, long[] args) { if(args.length>=2) { - if(method[2] == 0) args[1] = program[args[1]]; - if(args.length>=3 && method[1] == 0) args[2] = program[args[2]]; + if(method[2] == 0 || method[2] == 2) args[1] = method[2] == 0 ? program[Math.toIntExact(args[1])] : program[Math.toIntExact(relativeBase+args[1])]; + if(args.length>=3 && (method[1] == 0 || method[1] == 2)) args[2] = method[1] == 0 ? program[Math.toIntExact(args[2])] : program[Math.toIntExact(relativeBase+args[2])]; + } + } + + private void transformDataForMode(int[] method, int instruction, long[] args) { + if(instruction == 4 && (method[2] == 0 || method[2] == 2)) { + args[0] = method[2] == 0 ? program[Math.toIntExact(args[0])] : program[Math.toIntExact(relativeBase+args[0])]; } - if(instruction == 4 && method[2] == 0) args[0] = program[args[0]]; - if((instruction == 5 || instruction == 6) && method[1] == 0) args[0] = program[args[0]]; - return executeInstruction(program, args, instruction); + if((instruction == 5 || instruction == 6) && (method[1] == 0 || method[1] == 2)) args[0] = method[1] == 0 ? program[Math.toIntExact(args[0])] : program[Math.toIntExact(relativeBase+args[0])]; } private int readInput() { @@ -63,7 +74,7 @@ public boolean addInput(int num) { return input.add(num); } - public int firstElement() { + public long firstElement() { return program[0]; } @@ -72,28 +83,28 @@ public boolean setInput(int...input) { return this.input.addAll(Arrays.stream(input).boxed().collect(Collectors.toList())); } - private int executeInstruction(int[] program, int[] args, int instruction) { + private long executeInstruction(long[] args, int instruction) { instructionCounter+=nParams(instruction) + 1; switch(instruction) { - case 1: program[args[0]] = args[1] + args[2]; break; - case 2: program[args[0]] = args[1] * args[2]; break; - case 3: program[args[0]] = readInput(); break; + case 1: program[Math.toIntExact(args[0])] = args[1] + args[2]; break; + case 2: program[Math.toIntExact(args[0])] = args[1] * args[2]; break; + case 3: program[Math.toIntExact(args[0])] = readInput(); break; case 4: return args[0]; - case 5: if(args[1] != 0) instructionCounter = args[0]; break; - case 6: if(args[1] == 0) instructionCounter = args[0]; break; - case 7: program[args[0]] = args[1] < args[2] ? 1 : 0; break; - case 8: program[args[0]] = args[1] == args[2] ? 1 : 0; break; + case 5: if(args[1] != 0) instructionCounter = Math.toIntExact(args[0]); break; + case 6: if(args[1] == 0) instructionCounter = Math.toIntExact(args[0]); break; + case 7: program[Math.toIntExact(args[0])] = args[1] < args[2] ? 1 : 0; break; + case 8: program[Math.toIntExact(args[0])] = args[1] == args[2] ? 1 : 0; break; + case 9: relativeBase += Math.toIntExact(args[0]); break; case 99: return -1; default: throw new IllegalStateException("Something went wrong!"); } return 0; } - private int parseComplexInstruction(int[] program, int instruction) { + private long parseComplexInstruction(int instruction) { int[] instructions = getInstructions(instruction); int opcode = getOpCode(instructions); - return execute(program, instructions, opcode); - + return execute(instructions, opcode); } private int getOpCode(int instruction) { @@ -117,7 +128,8 @@ private int nParams(int instruction) { switch(instruction) { case 99: return -1; case 3: - case 4: return 1; + case 4: + case 9: return 1; case 5: case 6: return 2; case 1: @@ -128,4 +140,8 @@ private int nParams(int instruction) { else throw new IllegalStateException("Something went wrong! "+instruction); } } + + public int runInt() { + return Math.toIntExact(run()); + } } diff --git a/src/main/resources/day10.txt b/src/main/resources/day10.txt new file mode 100644 index 00000000..ad185663 --- /dev/null +++ b/src/main/resources/day10.txt @@ -0,0 +1 @@ +1102,34915192,34915192,7,4,7,99,0 \ No newline at end of file diff --git a/src/main/resources/day11.txt b/src/main/resources/day11.txt new file mode 100644 index 00000000..521db733 --- /dev/null +++ b/src/main/resources/day11.txt @@ -0,0 +1 @@ +109,1,204,-1,1001,100,1,100,1008,100,16,101,1006,101,0,99 \ No newline at end of file diff --git a/src/main/resources/day9.txt b/src/main/resources/day9.txt new file mode 100644 index 00000000..e3d2a86a --- /dev/null +++ b/src/main/resources/day9.txt @@ -0,0 +1 @@ +1102,34463338,34463338,63,1007,63,34463338,63,1005,63,53,1101,3,0,1000,109,988,209,12,9,1000,209,6,209,3,203,0,1008,1000,1,63,1005,63,65,1008,1000,2,63,1005,63,904,1008,1000,0,63,1005,63,58,4,25,104,0,99,4,0,104,0,99,4,17,104,0,99,0,0,1102,1,550,1027,1101,0,0,1020,1101,30,0,1004,1101,0,22,1014,1102,1,36,1009,1101,37,0,1007,1102,25,1,1010,1102,1,33,1012,1102,282,1,1029,1102,1,488,1025,1101,0,31,1019,1101,0,21,1008,1101,0,35,1015,1101,664,0,1023,1102,26,1,1001,1101,28,0,1016,1102,29,1,1005,1102,1,24,1002,1101,20,0,1018,1101,27,0,1013,1101,38,0,1017,1102,1,1,1021,1102,1,557,1026,1102,1,39,1000,1101,23,0,1006,1101,493,0,1024,1102,1,291,1028,1101,671,0,1022,1101,0,34,1003,1101,0,32,1011,109,10,21108,40,40,8,1005,1018,199,4,187,1105,1,203,1001,64,1,64,1002,64,2,64,109,-14,2108,30,8,63,1005,63,225,4,209,1001,64,1,64,1105,1,225,1002,64,2,64,109,3,2102,1,4,63,1008,63,34,63,1005,63,251,4,231,1001,64,1,64,1106,0,251,1002,64,2,64,109,12,2107,22,-5,63,1005,63,269,4,257,1105,1,273,1001,64,1,64,1002,64,2,64,109,20,2106,0,-3,4,279,1001,64,1,64,1106,0,291,1002,64,2,64,109,-16,21108,41,40,-3,1005,1012,311,1001,64,1,64,1105,1,313,4,297,1002,64,2,64,109,-13,2101,0,2,63,1008,63,30,63,1005,63,335,4,319,1105,1,339,1001,64,1,64,1002,64,2,64,109,-3,2102,1,4,63,1008,63,35,63,1005,63,359,1106,0,365,4,345,1001,64,1,64,1002,64,2,64,109,15,1205,6,377,1105,1,383,4,371,1001,64,1,64,1002,64,2,64,109,5,21102,42,1,-2,1008,1017,39,63,1005,63,403,1106,0,409,4,389,1001,64,1,64,1002,64,2,64,109,-17,21107,43,44,10,1005,1012,431,4,415,1001,64,1,64,1106,0,431,1002,64,2,64,109,14,21107,44,43,-4,1005,1012,451,1001,64,1,64,1106,0,453,4,437,1002,64,2,64,109,1,21102,45,1,-3,1008,1014,45,63,1005,63,479,4,459,1001,64,1,64,1105,1,479,1002,64,2,64,109,7,2105,1,0,4,485,1106,0,497,1001,64,1,64,1002,64,2,64,109,5,1206,-8,513,1001,64,1,64,1106,0,515,4,503,1002,64,2,64,109,-33,2101,0,7,63,1008,63,32,63,1005,63,535,1106,0,541,4,521,1001,64,1,64,1002,64,2,64,109,23,2106,0,8,1001,64,1,64,1106,0,559,4,547,1002,64,2,64,109,-1,21101,46,0,-5,1008,1013,46,63,1005,63,585,4,565,1001,64,1,64,1105,1,585,1002,64,2,64,109,-4,21101,47,0,2,1008,1016,44,63,1005,63,605,1105,1,611,4,591,1001,64,1,64,1002,64,2,64,109,-18,1207,4,38,63,1005,63,627,1106,0,633,4,617,1001,64,1,64,1002,64,2,64,109,5,2107,22,7,63,1005,63,649,1106,0,655,4,639,1001,64,1,64,1002,64,2,64,109,12,2105,1,10,1001,64,1,64,1106,0,673,4,661,1002,64,2,64,109,-10,1208,6,33,63,1005,63,693,1001,64,1,64,1106,0,695,4,679,1002,64,2,64,109,-7,2108,35,7,63,1005,63,715,1001,64,1,64,1106,0,717,4,701,1002,64,2,64,109,6,1208,5,37,63,1005,63,735,4,723,1106,0,739,1001,64,1,64,1002,64,2,64,109,-4,1202,5,1,63,1008,63,34,63,1005,63,765,4,745,1001,64,1,64,1105,1,765,1002,64,2,64,109,29,1206,-7,783,4,771,1001,64,1,64,1105,1,783,1002,64,2,64,109,-28,1201,6,0,63,1008,63,29,63,1005,63,809,4,789,1001,64,1,64,1106,0,809,1002,64,2,64,109,5,1202,2,1,63,1008,63,20,63,1005,63,829,1106,0,835,4,815,1001,64,1,64,1002,64,2,64,109,-1,1201,6,0,63,1008,63,35,63,1005,63,859,1001,64,1,64,1105,1,861,4,841,1002,64,2,64,109,2,1207,-3,25,63,1005,63,879,4,867,1105,1,883,1001,64,1,64,1002,64,2,64,109,13,1205,3,901,4,889,1001,64,1,64,1106,0,901,4,64,99,21101,0,27,1,21101,915,0,0,1106,0,922,21201,1,22987,1,204,1,99,109,3,1207,-2,3,63,1005,63,964,21201,-2,-1,1,21101,0,942,0,1106,0,922,22101,0,1,-1,21201,-2,-3,1,21101,0,957,0,1106,0,922,22201,1,-1,-2,1105,1,968,21202,-2,1,-2,109,-3,2105,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file From 3135889005d34933965c6f745c2b02c4394bee30 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 9 Dec 2019 08:09:22 +0100 Subject: [PATCH 034/433] Day 9 part 2 --- src/main/java/com/sbaars/adventofcode2019/days/Day9.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day9.java b/src/main/java/com/sbaars/adventofcode2019/days/Day9.java index d4299d59..f346084f 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day9.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day9.java @@ -19,6 +19,6 @@ public int part1() throws IOException { @Override public int part2() throws IOException { - return 0; + return new IntcodeComputer(9, 2).runInt(); } } From f5c19b5cc3aa72c8d51ce0367e823a283d9d9df9 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 9 Dec 2019 12:03:39 +0100 Subject: [PATCH 035/433] Working on a refactoring for the intcodecomputer --- .../sbaars/adventofcode2019/days/Day6.java | 3 +- .../intcode/IntcodeComputer.java | 29 ++++++++++++------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day6.java b/src/main/java/com/sbaars/adventofcode2019/days/Day6.java index 87a900df..82231d94 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day6.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day6.java @@ -11,8 +11,7 @@ import com.sbaars.adventofcode2019.util.DoesFileOperations; import com.sbaars.adventofcode2019.util.ListMap; -public class Day6 implements Day, DoesFileOperations -{ +public class Day6 implements Day, DoesFileOperations { ListMap orbits = new ListMap<>(); diff --git a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java index b77104d0..833e310e 100644 --- a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java +++ b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java @@ -15,6 +15,7 @@ public class IntcodeComputer implements DoesFileOperations { private final Queue input = new ArrayDeque<>(2); private int lastInput; private long relativeBase = 0; + private static final int[] DO_NOT_TRANSFORM_FINAL_ARGUMENT = {1, 2, 3, 7, 8}; public IntcodeComputer(int day, int...input) throws IOException { this.program = Arrays.stream(readDay(day).split(",")).mapToLong(Long::parseLong).toArray(); @@ -43,13 +44,19 @@ private long execute(int instruction) { private long execute(int[] method, int instruction) { int nParams = nParams(instruction); - long[] args = IntStream.range(0, nParams).mapToLong(j -> j == 0 ? program[instructionCounter+nParams] : program[instructionCounter+j]).toArray(); - transformParam2(method, args); - transformDataForMode(method, instruction, args); + long[] args = IntStream.range(0, nParams).mapToLong(j -> program[instructionCounter+j]).toArray(); + //transformParam2(method, args); + //transformDataForMode(method, instruction, args); + transformParameters(method, args, instruction); return executeInstruction(args, instruction); } + + private void transformParameters(int[] method, long[] args, int instruction) { + IntStream.range(0, args.length).filter(i -> method[i] != 1).filter(i -> i+1 != args.length || !Arrays.stream(DO_NOT_TRANSFORM_FINAL_ARGUMENT) + .anyMatch(j -> j==instruction)).forEach(i -> args[i] = program[Math.toIntExact((method[i] == 2 ? relativeBase : 0) + args[i])]); + } - private void transformParam2(int[] method, long[] args) { + /*private void transformParam2(int[] method, long[] args) { if(args.length>=2) { if(method[2] == 0 || method[2] == 2) args[1] = method[2] == 0 ? program[Math.toIntExact(args[1])] : program[Math.toIntExact(relativeBase+args[1])]; if(args.length>=3 && (method[1] == 0 || method[1] == 2)) args[2] = method[1] == 0 ? program[Math.toIntExact(args[2])] : program[Math.toIntExact(relativeBase+args[2])]; @@ -61,7 +68,7 @@ private void transformDataForMode(int[] method, int instruction, long[] args) { args[0] = method[2] == 0 ? program[Math.toIntExact(args[0])] : program[Math.toIntExact(relativeBase+args[0])]; } if((instruction == 5 || instruction == 6) && (method[1] == 0 || method[1] == 2)) args[0] = method[1] == 0 ? program[Math.toIntExact(args[0])] : program[Math.toIntExact(relativeBase+args[0])]; - } + }*/ private int readInput() { if(input.isEmpty()) @@ -86,14 +93,14 @@ public boolean setInput(int...input) { private long executeInstruction(long[] args, int instruction) { instructionCounter+=nParams(instruction) + 1; switch(instruction) { - case 1: program[Math.toIntExact(args[0])] = args[1] + args[2]; break; - case 2: program[Math.toIntExact(args[0])] = args[1] * args[2]; break; + case 1: program[Math.toIntExact(args[2])] = args[0] + args[1]; break; + case 2: program[Math.toIntExact(args[2])] = args[0] * args[1]; break; case 3: program[Math.toIntExact(args[0])] = readInput(); break; case 4: return args[0]; - case 5: if(args[1] != 0) instructionCounter = Math.toIntExact(args[0]); break; - case 6: if(args[1] == 0) instructionCounter = Math.toIntExact(args[0]); break; - case 7: program[Math.toIntExact(args[0])] = args[1] < args[2] ? 1 : 0; break; - case 8: program[Math.toIntExact(args[0])] = args[1] == args[2] ? 1 : 0; break; + case 5: if(args[0] != 0) instructionCounter = Math.toIntExact(args[1]); break; + case 6: if(args[0] == 0) instructionCounter = Math.toIntExact(args[1]); break; + case 7: program[Math.toIntExact(args[2])] = args[0] < args[1] ? 1 : 0; break; + case 8: program[Math.toIntExact(args[2])] = args[0] == args[1] ? 1 : 0; break; case 9: relativeBase += Math.toIntExact(args[0]); break; case 99: return -1; default: throw new IllegalStateException("Something went wrong!"); From 0a0a79f4253ec6d768a43723a285866c9f503e7c Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 10 Dec 2019 07:33:18 +0100 Subject: [PATCH 036/433] Day 10 part 1 --- .../sbaars/adventofcode2019/days/Day10.java | 92 +++++++++++++++++++ src/main/resources/day10.txt | 40 +++++++- src/main/resources/day11.txt | 11 ++- src/main/resources/day12.txt | 10 ++ 4 files changed, 151 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode2019/days/Day10.java create mode 100644 src/main/resources/day12.txt diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day10.java b/src/main/java/com/sbaars/adventofcode2019/days/Day10.java new file mode 100644 index 00000000..5df59c1d --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day10.java @@ -0,0 +1,92 @@ +package com.sbaars.adventofcode2019.days; + +import java.awt.Point; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import com.sbaars.adventofcode2019.common.Day; +import com.sbaars.adventofcode2019.util.DoesFileOperations; + +public class Day10 implements Day, DoesFileOperations { + + public static void main(String[] args) throws IOException { + new Day10().printParts(); + } + + @Override + public int part1() throws IOException { + String[] mapString = Arrays.stream(readDay(10).split(System.lineSeparator())).toArray(String[]::new); + char[][] map = new char[mapString.length][mapString[0].length()]; + List asteroids = new ArrayList<>(); + for(int i = 0; i asteroids, Point asteroid, Point mapSize) { + //System.out.println("Count visible "+asteroid); + List visible = new ArrayList<>(asteroids); + for(int i = 0; i=0 && rem.y>=0) { + int index = visible.indexOf(rem); + if(index!=-1) { + visible.remove(index); + if(index Date: Tue, 10 Dec 2019 08:34:35 +0100 Subject: [PATCH 037/433] Rewriting day 10 --- .../sbaars/adventofcode2019/days/Day10.java | 63 +++++++++++++------ 1 file changed, 44 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day10.java b/src/main/java/com/sbaars/adventofcode2019/days/Day10.java index 5df59c1d..5a1442b6 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day10.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day10.java @@ -5,11 +5,16 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; import com.sbaars.adventofcode2019.common.Day; import com.sbaars.adventofcode2019.util.DoesFileOperations; public class Day10 implements Day, DoesFileOperations { + + private final List asteroids = new ArrayList<>(); + private Point baseLocation; public static void main(String[] args) throws IOException { new Day10().printParts(); @@ -18,26 +23,22 @@ public static void main(String[] args) throws IOException { @Override public int part1() throws IOException { String[] mapString = Arrays.stream(readDay(10).split(System.lineSeparator())).toArray(String[]::new); - char[][] map = new char[mapString.length][mapString[0].length()]; - List asteroids = new ArrayList<>(); for(int i = 0; i nVisible[i] > nVisible[j] ? i : j).getAsInt()); return Arrays.stream(nVisible).max().getAsInt(); } - private int countNVisible(List asteroids, Point asteroid, Point mapSize) { - //System.out.println("Count visible "+asteroid); + private int countNVisible(Point asteroid, Point mapSize) { List visible = new ArrayList<>(asteroids); for(int i = 0; i asteroids, Point asteroid, Point mapSize) Point rel = new Point(visible.get(i).x - asteroid.x, visible.get(i).y - asteroid.y); int max = Math.max(Math.abs(rel.x)+1, Math.abs(rel.y)+1); - if(visible.get(i).equals(new Point(4,4))) { - System.out.println("Hi"); - } - Point step = new Point(rel.x, rel.y); for(int j = 2; j<=max; j++) { if(addRel(rel.x) % j == 0 && addRel(rel.y) % j == 0) { step = new Point(addRel(rel.x) / j, addRel(rel.y) / j); } } - Point rem = new Point(visible.get(i).x + step.x, visible.get(i).y+step.y); - - if(visible.get(i).equals(new Point(4,4))) { - System.out.println("Hi"); - } + Point rem = new Point(visible.get(i).x + step.x, visible.get(i).y+step.y); while(rem.x<=mapSize.x && rem.y<=mapSize.y && rem.x>=0 && rem.y>=0) { int index = visible.indexOf(rem); if(index!=-1) { @@ -70,10 +63,8 @@ private int countNVisible(List asteroids, Point asteroid, Point mapSize) i--; } rem = new Point(rem.x + step.x, rem.y+step.y); - } } - if(visible.size() == 37) System.out.println(asteroid); return visible.size(); } @@ -87,6 +78,40 @@ else if (x == 0) @Override public int part2() throws IOException { + List asteroidList = asteroids.stream().map(e -> new Asteroid(calcRotationAngleInDegrees(baseLocation, e), baseLocation.distance(e), e)).collect(Collectors.toList()); + double currentRotation = -0.0000000000000000000000000001; + for(int destroyed = 0; destroyed<200; destroyed++) { + int nextRotation = ro + } return 0; } + + public static double calcRotationAngleInDegrees(Point centerPt, Point targetPt) + { + double theta = Math.atan2(targetPt.y - centerPt.y, targetPt.x - centerPt.x); + theta += Math.PI/2.0; + + double angle = Math.toDegrees(theta); + if (angle < 0) { + angle += 360; + } + + return angle; + } + + class Asteroid { + double rotation; + double distance; + Point position; + + + public Asteroid(double rotation, double distance, Point position) { + super(); + this.rotation = rotation; + this.distance = distance; + this.position = position; + } + + + } } From 17d885f9fdf7771b02c683ecaedf4c2639f33680 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 10 Dec 2019 12:50:14 +0100 Subject: [PATCH 038/433] Rewrote day 10 --- .../sbaars/adventofcode2019/days/Day10.java | 77 ++++++++++--------- src/main/resources/day13.txt | 5 ++ 2 files changed, 44 insertions(+), 38 deletions(-) create mode 100644 src/main/resources/day13.txt diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day10.java b/src/main/java/com/sbaars/adventofcode2019/days/Day10.java index 5a1442b6..44299206 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day10.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day10.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.OptionalDouble; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -26,46 +27,20 @@ public int part1() throws IOException { for(int i = 0; i nVisible[i] > nVisible[j] ? i : j).getAsInt()); - return Arrays.stream(nVisible).max().getAsInt(); + return Math.toIntExact(Arrays.stream(nVisible).max().getAsLong()); } - private int countNVisible(Point asteroid, Point mapSize) { - List visible = new ArrayList<>(asteroids); - for(int i = 0; i=0 && rem.y>=0) { - int index = visible.indexOf(rem); - if(index!=-1) { - visible.remove(index); - if(index new Asteroid(calcRotationAngleInDegrees(asteroid, e), asteroid.distance(e), e)).mapToDouble(e -> e.rotation).distinct().count(); } private int addRel(int x) { @@ -78,12 +53,25 @@ else if (x == 0) @Override public int part2() throws IOException { + System.out.println("Base = "+baseLocation); List asteroidList = asteroids.stream().map(e -> new Asteroid(calcRotationAngleInDegrees(baseLocation, e), baseLocation.distance(e), e)).collect(Collectors.toList()); - double currentRotation = -0.0000000000000000000000000001; - for(int destroyed = 0; destroyed<200; destroyed++) { - int nextRotation = ro + asteroidList.remove(new Asteroid(0, 0, baseLocation)); + Asteroid prevDestroyed = new Asteroid(Double.MIN_VALUE, 0, new Point(0,0)); + for(int destroyed = 0; destroyed<250; destroyed++) { + Asteroid prev = prevDestroyed; + OptionalDouble nextRot = asteroidList.stream().mapToDouble(e -> e.rotation).filter(e -> e > prev.rotation).min(); + if(nextRot.isPresent()) { + double nextRotation = nextRot.getAsDouble(); + Asteroid a = asteroidList.stream().filter(e -> e.rotation == nextRotation).reduce((a1, a2) -> a1.distance < a2.distance ? a1 : a2).get(); + asteroidList.remove(a); + prevDestroyed = a; + System.out.println(destroyed+". BOOM "+a.position+" rot "+a.rotation+" dis "+a.distance); + } else { + prevDestroyed = new Asteroid(Double.MIN_VALUE, 0, new Point(0,0)); + destroyed--; + } } - return 0; + return prevDestroyed.position.x*100+prevDestroyed.position.y; } public static double calcRotationAngleInDegrees(Point centerPt, Point targetPt) @@ -104,14 +92,27 @@ class Asteroid { double distance; Point position; - public Asteroid(double rotation, double distance, Point position) { super(); this.rotation = rotation; this.distance = distance; this.position = position; } - - + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((position == null) ? 0 : position.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof Asteroid)) + return false; + Asteroid other = (Asteroid) obj; + return position.equals(other.position); + } } } diff --git a/src/main/resources/day13.txt b/src/main/resources/day13.txt new file mode 100644 index 00000000..f59635f7 --- /dev/null +++ b/src/main/resources/day13.txt @@ -0,0 +1,5 @@ +.#....#####...#.. +##...##.#####..## +##...#...#.#####. +..#.....X...###.. +..#.#.....#....## \ No newline at end of file From 675997debd5d2e93b962734a694829284bff84d7 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 10 Dec 2019 13:10:51 +0100 Subject: [PATCH 039/433] Finalize day 10 --- .../sbaars/adventofcode2019/days/Day10.java | 35 +++++-------------- 1 file changed, 9 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day10.java b/src/main/java/com/sbaars/adventofcode2019/days/Day10.java index 44299206..f58bb14f 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day10.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day10.java @@ -2,7 +2,6 @@ import java.awt.Point; import java.io.IOException; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.OptionalDouble; @@ -14,8 +13,13 @@ public class Day10 implements Day, DoesFileOperations { - private final List asteroids = new ArrayList<>(); + private final List asteroids; private Point baseLocation; + + public Day10() throws IOException { + String[] mapString = Arrays.stream(readDay(10).split(System.lineSeparator())).toArray(String[]::new); + this.asteroids = IntStream.range(0, mapString.length).boxed().flatMap(i -> IntStream.range(0, mapString[i].length()).mapToObj(j -> new Point(j, i))).filter(p -> mapString[p.y].charAt(p.x) == '#').collect(Collectors.toList()); + } public static void main(String[] args) throws IOException { new Day10().printParts(); @@ -23,41 +27,21 @@ public static void main(String[] args) throws IOException { @Override public int part1() throws IOException { - String[] mapString = Arrays.stream(readDay(10).split(System.lineSeparator())).toArray(String[]::new); - for(int i = 0; i nVisible[i] > nVisible[j] ? i : j).getAsInt()); return Math.toIntExact(Arrays.stream(nVisible).max().getAsLong()); } - private long countNVisible(Point asteroid, Point mapSize) { + private long countNVisible(Point asteroid) { return asteroids.stream().map(e -> new Asteroid(calcRotationAngleInDegrees(asteroid, e), asteroid.distance(e), e)).mapToDouble(e -> e.rotation).distinct().count(); } - - private int addRel(int x) { - if(x<0) - return x-1; - else if (x == 0) - return x; - return x+1; - } @Override public int part2() throws IOException { - System.out.println("Base = "+baseLocation); List asteroidList = asteroids.stream().map(e -> new Asteroid(calcRotationAngleInDegrees(baseLocation, e), baseLocation.distance(e), e)).collect(Collectors.toList()); - asteroidList.remove(new Asteroid(0, 0, baseLocation)); Asteroid prevDestroyed = new Asteroid(Double.MIN_VALUE, 0, new Point(0,0)); - for(int destroyed = 0; destroyed<250; destroyed++) { + for(int destroyed = 1; destroyed<200; destroyed++) { Asteroid prev = prevDestroyed; OptionalDouble nextRot = asteroidList.stream().mapToDouble(e -> e.rotation).filter(e -> e > prev.rotation).min(); if(nextRot.isPresent()) { @@ -65,7 +49,6 @@ public int part2() throws IOException { Asteroid a = asteroidList.stream().filter(e -> e.rotation == nextRotation).reduce((a1, a2) -> a1.distance < a2.distance ? a1 : a2).get(); asteroidList.remove(a); prevDestroyed = a; - System.out.println(destroyed+". BOOM "+a.position+" rot "+a.rotation+" dis "+a.distance); } else { prevDestroyed = new Asteroid(Double.MIN_VALUE, 0, new Point(0,0)); destroyed--; From 52fb8fea8e1d4429651057c9ce4b7754398cb69d Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 10 Dec 2019 13:29:22 +0100 Subject: [PATCH 040/433] Final refactoring --- .../sbaars/adventofcode2019/days/Day10.java | 50 ++++++++----------- 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day10.java b/src/main/java/com/sbaars/adventofcode2019/days/Day10.java index f58bb14f..fd84a88b 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day10.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day10.java @@ -8,6 +8,8 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; +import javax.swing.text.Position; + import com.sbaars.adventofcode2019.common.Day; import com.sbaars.adventofcode2019.util.DoesFileOperations; @@ -33,41 +35,24 @@ public int part1() throws IOException { return Math.toIntExact(Arrays.stream(nVisible).max().getAsLong()); } - private long countNVisible(Point asteroid) { - return asteroids.stream().map(e -> new Asteroid(calcRotationAngleInDegrees(asteroid, e), asteroid.distance(e), e)).mapToDouble(e -> e.rotation).distinct().count(); - } - @Override public int part2() throws IOException { - List asteroidList = asteroids.stream().map(e -> new Asteroid(calcRotationAngleInDegrees(baseLocation, e), baseLocation.distance(e), e)).collect(Collectors.toList()); - Asteroid prevDestroyed = new Asteroid(Double.MIN_VALUE, 0, new Point(0,0)); + List asteroidList = asteroids.stream().map(e -> new Asteroid(baseLocation, e)).collect(Collectors.toList()); + Asteroid prevDestroyed = new Asteroid(); for(int destroyed = 1; destroyed<200; destroyed++) { Asteroid prev = prevDestroyed; OptionalDouble nextRot = asteroidList.stream().mapToDouble(e -> e.rotation).filter(e -> e > prev.rotation).min(); if(nextRot.isPresent()) { double nextRotation = nextRot.getAsDouble(); - Asteroid a = asteroidList.stream().filter(e -> e.rotation == nextRotation).reduce((a1, a2) -> a1.distance < a2.distance ? a1 : a2).get(); - asteroidList.remove(a); - prevDestroyed = a; - } else { - prevDestroyed = new Asteroid(Double.MIN_VALUE, 0, new Point(0,0)); - destroyed--; + prevDestroyed = asteroidList.stream().filter(e -> e.rotation == nextRotation).reduce((a1, a2) -> a1.distance < a2.distance ? a1 : a2).get(); + asteroidList.remove(prevDestroyed); } } return prevDestroyed.position.x*100+prevDestroyed.position.y; } - public static double calcRotationAngleInDegrees(Point centerPt, Point targetPt) - { - double theta = Math.atan2(targetPt.y - centerPt.y, targetPt.x - centerPt.x); - theta += Math.PI/2.0; - - double angle = Math.toDegrees(theta); - if (angle < 0) { - angle += 360; - } - - return angle; + private long countNVisible(Point asteroid) { + return asteroids.stream().map(e -> new Asteroid(asteroid, e)).mapToDouble(e -> e.rotation).distinct().count(); } class Asteroid { @@ -75,11 +60,20 @@ class Asteroid { double distance; Point position; - public Asteroid(double rotation, double distance, Point position) { - super(); - this.rotation = rotation; - this.distance = distance; - this.position = position; + public Asteroid(Point center, Point me) { + this.rotation = calcRotationAngleInDegrees(center, me); + this.distance = me.distance(center); + this.position = me; + } + + public Asteroid() { + this.rotation = Double.MIN_VALUE; + } + + private double calcRotationAngleInDegrees(Point centerPt, Point targetPt) { + double theta = Math.atan2(targetPt.y - centerPt.y, targetPt.x - centerPt.x) + Math.PI/2.0; + double angle = Math.toDegrees(theta); + return angle < 0 ? angle + 360 : angle; } @Override From b25e30971fefde279682cb062091b410f0557aef Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 10 Dec 2019 17:48:10 +0100 Subject: [PATCH 041/433] Making the intcode computer better I wonder if tomorrow is another intcode assignment --- .../sbaars/adventofcode2019/days/Day10.java | 2 -- .../sbaars/adventofcode2019/days/Day2.java | 2 +- .../intcode/IntcodeComputer.java | 20 ++----------------- src/main/resources/day11.txt | 10 ---------- src/main/resources/day12.txt | 10 ---------- src/main/resources/day13.txt | 5 ----- 6 files changed, 3 insertions(+), 46 deletions(-) delete mode 100644 src/main/resources/day11.txt delete mode 100644 src/main/resources/day12.txt delete mode 100644 src/main/resources/day13.txt diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day10.java b/src/main/java/com/sbaars/adventofcode2019/days/Day10.java index fd84a88b..5ded2040 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day10.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day10.java @@ -8,8 +8,6 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -import javax.swing.text.Position; - import com.sbaars.adventofcode2019.common.Day; import com.sbaars.adventofcode2019.util.DoesFileOperations; diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day2.java b/src/main/java/com/sbaars/adventofcode2019/days/Day2.java index b896fe01..15799ce6 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day2.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day2.java @@ -17,7 +17,7 @@ public int part1() throws IOException { return execute(12,2); } - @Override //3146 + @Override public int part2() throws IOException { return bruteForceFindingNumber(19690720, 99); } diff --git a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java index 833e310e..3dfcee38 100644 --- a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java +++ b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java @@ -44,9 +44,7 @@ private long execute(int instruction) { private long execute(int[] method, int instruction) { int nParams = nParams(instruction); - long[] args = IntStream.range(0, nParams).mapToLong(j -> program[instructionCounter+j]).toArray(); - //transformParam2(method, args); - //transformDataForMode(method, instruction, args); + long[] args = IntStream.range(1, nParams+1).mapToLong(j -> program[instructionCounter+j]).toArray(); transformParameters(method, args, instruction); return executeInstruction(args, instruction); } @@ -55,21 +53,7 @@ private void transformParameters(int[] method, long[] args, int instruction) { IntStream.range(0, args.length).filter(i -> method[i] != 1).filter(i -> i+1 != args.length || !Arrays.stream(DO_NOT_TRANSFORM_FINAL_ARGUMENT) .anyMatch(j -> j==instruction)).forEach(i -> args[i] = program[Math.toIntExact((method[i] == 2 ? relativeBase : 0) + args[i])]); } - - /*private void transformParam2(int[] method, long[] args) { - if(args.length>=2) { - if(method[2] == 0 || method[2] == 2) args[1] = method[2] == 0 ? program[Math.toIntExact(args[1])] : program[Math.toIntExact(relativeBase+args[1])]; - if(args.length>=3 && (method[1] == 0 || method[1] == 2)) args[2] = method[1] == 0 ? program[Math.toIntExact(args[2])] : program[Math.toIntExact(relativeBase+args[2])]; - } - } - - private void transformDataForMode(int[] method, int instruction, long[] args) { - if(instruction == 4 && (method[2] == 0 || method[2] == 2)) { - args[0] = method[2] == 0 ? program[Math.toIntExact(args[0])] : program[Math.toIntExact(relativeBase+args[0])]; - } - if((instruction == 5 || instruction == 6) && (method[1] == 0 || method[1] == 2)) args[0] = method[1] == 0 ? program[Math.toIntExact(args[0])] : program[Math.toIntExact(relativeBase+args[0])]; - }*/ - + private int readInput() { if(input.isEmpty()) return lastInput; diff --git a/src/main/resources/day11.txt b/src/main/resources/day11.txt deleted file mode 100644 index 86503469..00000000 --- a/src/main/resources/day11.txt +++ /dev/null @@ -1,10 +0,0 @@ -......#.#. -#..#.#.... -..#######. -.#.#.###.. -.#..#..... -..#....#.# -#..#....#. -.##.#..### -##...#..#. -.#....#### \ No newline at end of file diff --git a/src/main/resources/day12.txt b/src/main/resources/day12.txt deleted file mode 100644 index dc708abc..00000000 --- a/src/main/resources/day12.txt +++ /dev/null @@ -1,10 +0,0 @@ -#.#...#.#. -.###....#. -.#....#... -##.#.#.#.# -....#.#.#. -.##..###.# -..#...##.. -..##....## -......#... -.####.###. \ No newline at end of file diff --git a/src/main/resources/day13.txt b/src/main/resources/day13.txt deleted file mode 100644 index f59635f7..00000000 --- a/src/main/resources/day13.txt +++ /dev/null @@ -1,5 +0,0 @@ -.#....#####...#.. -##...##.#####..## -##...#...#.#####. -..#.....X...###.. -..#.#.....#....## \ No newline at end of file From ab7cf52360c6501ef63505804d72d9dc61514125 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 10 Dec 2019 18:41:11 +0100 Subject: [PATCH 042/433] Built a test for the intcode computer --- pom.xml | 2 +- .../sbaars/adventofcode2019/days/Day9.java | 4 +-- .../sbaars/adventofcode2019/IntcodeTest.java | 33 +++++++++++++++++++ 3 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 src/test/java/com/sbaars/adventofcode2019/IntcodeTest.java diff --git a/pom.xml b/pom.xml index 07702b4e..2c0cbecb 100644 --- a/pom.xml +++ b/pom.xml @@ -18,7 +18,7 @@ junit junit - 3.8.1 + 3.8.2 test diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day9.java b/src/main/java/com/sbaars/adventofcode2019/days/Day9.java index f346084f..a024bf01 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day9.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day9.java @@ -13,8 +13,8 @@ public static void main(String[] args) throws IOException { } @Override - public int part1() throws IOException { - return new IntcodeComputer(9, 1).runInt(); + public int part1() throws IOException { // Just append a 2 to the number ;-) + return Math.toIntExact(new IntcodeComputer(9, 1).run()-2000000000L); } @Override diff --git a/src/test/java/com/sbaars/adventofcode2019/IntcodeTest.java b/src/test/java/com/sbaars/adventofcode2019/IntcodeTest.java new file mode 100644 index 00000000..5afbaca7 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode2019/IntcodeTest.java @@ -0,0 +1,33 @@ +package com.sbaars.adventofcode2019; + +import java.io.IOException; + +import com.sbaars.adventofcode2019.days.Day2; +import com.sbaars.adventofcode2019.days.Day5; +import com.sbaars.adventofcode2019.days.Day7; +import com.sbaars.adventofcode2019.days.Day9; + +import junit.framework.Assert; +import junit.framework.TestCase; + +public class IntcodeTest extends TestCase { + public void testDay2() throws IOException { + Assert.assertEquals(new Day2().part1(), 8017076); + Assert.assertEquals(new Day2().part2(), 3146); + } + + public void testDay5() throws IOException { + Assert.assertEquals(new Day5().part1(), 11049715); + Assert.assertEquals(new Day5().part2(), 2140710); + } + + public void testDay7() throws IOException { + Assert.assertEquals(new Day7().part1(), 116680); + Assert.assertEquals(new Day7().part2(), 89603079); + } + + public void testDay9() throws IOException { + Assert.assertEquals(new Day9().part1(), 518058886); + Assert.assertEquals(new Day9().part2(), 44292); + } +} From 83a01d42c7d7a935cb22f24bdacda076ee223830 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 10 Dec 2019 19:46:10 +0100 Subject: [PATCH 043/433] Intcode Computer: Flipping Arguments --- .../com/sbaars/adventofcode2019/intcode/IntcodeComputer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java index 3dfcee38..602d7aa4 100644 --- a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java +++ b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java @@ -95,7 +95,7 @@ private long executeInstruction(long[] args, int instruction) { private long parseComplexInstruction(int instruction) { int[] instructions = getInstructions(instruction); int opcode = getOpCode(instructions); - return execute(instructions, opcode); + return execute(new int[] {instructions[2], instructions[1], instructions[0]}, opcode); } private int getOpCode(int instruction) { From 73c22bf56b7a3c8912ad36c182b77da73c578c5a Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 10 Dec 2019 19:48:42 +0100 Subject: [PATCH 044/433] Flip arguments for the intcode tests --- .../com/sbaars/adventofcode2019/IntcodeTest.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/test/java/com/sbaars/adventofcode2019/IntcodeTest.java b/src/test/java/com/sbaars/adventofcode2019/IntcodeTest.java index 5afbaca7..a7608e99 100644 --- a/src/test/java/com/sbaars/adventofcode2019/IntcodeTest.java +++ b/src/test/java/com/sbaars/adventofcode2019/IntcodeTest.java @@ -12,22 +12,22 @@ public class IntcodeTest extends TestCase { public void testDay2() throws IOException { - Assert.assertEquals(new Day2().part1(), 8017076); - Assert.assertEquals(new Day2().part2(), 3146); + Assert.assertEquals(8017076, new Day2().part1()); + Assert.assertEquals(3146, new Day2().part2()); } public void testDay5() throws IOException { - Assert.assertEquals(new Day5().part1(), 11049715); - Assert.assertEquals(new Day5().part2(), 2140710); + Assert.assertEquals(11049715, new Day5().part1()); + Assert.assertEquals(2140710, new Day5().part2()); } public void testDay7() throws IOException { - Assert.assertEquals(new Day7().part1(), 116680); - Assert.assertEquals(new Day7().part2(), 89603079); + Assert.assertEquals(116680, new Day7().part1()); + Assert.assertEquals(89603079, new Day7().part2()); } public void testDay9() throws IOException { - Assert.assertEquals(new Day9().part1(), 518058886); - Assert.assertEquals(new Day9().part2(), 44292); + Assert.assertEquals(518058886, new Day9().part1()); + Assert.assertEquals(44292, new Day9().part2()); } } From 4c98a4e39d38aefa85890110c17201d40e03ad85 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 10 Dec 2019 20:44:49 +0100 Subject: [PATCH 045/433] Finish up intcode computer refactoring --- .classpath | 5 +- pom.xml | 47 +++++++++++-------- .../sbaars/adventofcode2019/days/Day9.java | 4 +- .../intcode/IntcodeComputer.java | 7 ++- 4 files changed, 38 insertions(+), 25 deletions(-) diff --git a/.classpath b/.classpath index cd377e47..0c01b411 100644 --- a/.classpath +++ b/.classpath @@ -8,13 +8,14 @@ + - - + + diff --git a/pom.xml b/pom.xml index 2c0cbecb..d448fdd5 100644 --- a/pom.xml +++ b/pom.xml @@ -1,25 +1,32 @@ - - 4.0.0 + + 4.0.0 - com.sbaars - adventofcode2019 - 0.0.1-SNAPSHOT - jar + com.sbaars + adventofcode2019 + 0.0.1-SNAPSHOT + jar - adventofcode2019 - http://maven.apache.org + adventofcode2019 + http://maven.apache.org - - UTF-8 - + + UTF-8 + - - - junit - junit - 3.8.2 - test - - + + + junit + junit + 3.8.2 + test + + + org.projectlombok + lombok + 1.18.8 + compile + + diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day9.java b/src/main/java/com/sbaars/adventofcode2019/days/Day9.java index a024bf01..0b58467e 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day9.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day9.java @@ -14,7 +14,9 @@ public static void main(String[] args) throws IOException { @Override public int part1() throws IOException { // Just append a 2 to the number ;-) - return Math.toIntExact(new IntcodeComputer(9, 1).run()-2000000000L); + long res = new IntcodeComputer(9, 1).run(); + System.out.println(res); + return Math.toIntExact(res-2000000000L); } @Override diff --git a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java index 602d7aa4..1f641266 100644 --- a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java +++ b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java @@ -50,8 +50,11 @@ private long execute(int[] method, int instruction) { } private void transformParameters(int[] method, long[] args, int instruction) { - IntStream.range(0, args.length).filter(i -> method[i] != 1).filter(i -> i+1 != args.length || !Arrays.stream(DO_NOT_TRANSFORM_FINAL_ARGUMENT) - .anyMatch(j -> j==instruction)).forEach(i -> args[i] = program[Math.toIntExact((method[i] == 2 ? relativeBase : 0) + args[i])]); + IntStream.range(0, args.length).filter(i -> method[i] != 1).filter(i -> i+1 != args.length || !Arrays.stream(DO_NOT_TRANSFORM_FINAL_ARGUMENT).anyMatch(j -> j==instruction)) + .forEach(i -> args[i] = program[Math.toIntExact((method[i] == 2 ? relativeBase : 0) + args[i])]); + if(Arrays.stream(DO_NOT_TRANSFORM_FINAL_ARGUMENT).anyMatch(j -> j==instruction) && method[args.length-1] == 2) { + args[args.length-1] += relativeBase; + } } private int readInput() { From dd3ae9f428f08c2b76734c34c0b2823e206481c0 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 11 Dec 2019 06:37:22 +0100 Subject: [PATCH 046/433] Day 11 part 1 --- .../sbaars/adventofcode2019/days/Day11.java | 80 +++++++++++++++++++ .../intcode/IntcodeComputer.java | 13 ++- src/main/resources/day11.txt | 1 + 3 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode2019/days/Day11.java create mode 100644 src/main/resources/day11.txt diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day11.java b/src/main/java/com/sbaars/adventofcode2019/days/Day11.java new file mode 100644 index 00000000..d7027319 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day11.java @@ -0,0 +1,80 @@ +package com.sbaars.adventofcode2019.days; + +import java.awt.Point; +import java.io.IOException; +import java.util.HashSet; +import java.util.Set; + +import com.sbaars.adventofcode2019.common.Day; +import com.sbaars.adventofcode2019.intcode.IntcodeComputer; +import com.sbaars.adventofcode2019.util.DoesFileOperations; + +public class Day11 implements Day, DoesFileOperations { + + int face = 0; + Set paintedOnce = new HashSet<>(); + Set whitePlaces = new HashSet<>(); + + enum Direction { UP, RIGHT, DOWN, LEFT } + + Direction dir = Direction.UP; + + public void turn() { + int cur = dir.ordinal()+1; + if(cur == Direction.values().length) + cur = 0; + dir = Direction.values()[cur]; + } + + public static void main(String[] args) throws IOException { + new Day11().printParts(); + } + + @Override + public int part1() throws IOException { + IntcodeComputer c = new IntcodeComputer(11); + Point currentLocation = new Point(0,0); + + while(true) { + c.setInput(whitePlaces.contains(currentLocation) ? 1 : 0); + int paintColor = c.runInt(); + if(paintColor == -2) + break; + int turn = c.runInt(); + if(turn == -2) + break; + System.out.println("Loc = "+currentLocation+"Paint = " + paintColor+ ", turn = "+turn+", is space white = "+whitePlaces.contains(currentLocation)); + paintedOnce.add(currentLocation); + if(paintColor == 1) { + whitePlaces.add(currentLocation); + } else if(paintColor == 0) { + whitePlaces.remove(currentLocation); + } + + if(turn == 1) { + turn(); + } + currentLocation = move(currentLocation, dir); + } + return paintedOnce.size(); + } + + private Point move(Point currentLocation, Direction dir2) { + switch (dir2) { + case UP: + return new Point(currentLocation.x, currentLocation.y+1); + case DOWN: + return new Point(currentLocation.x, currentLocation.y-1); + case RIGHT: + return new Point(currentLocation.x+1, currentLocation.y); + case LEFT: + return new Point(currentLocation.x-1, currentLocation.y); + } + return null; + } + + @Override + public int part2() throws IOException { + return 0; + } +} diff --git a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java index 1f641266..b4322d94 100644 --- a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java +++ b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java @@ -10,7 +10,7 @@ import com.sbaars.adventofcode2019.util.DoesFileOperations; public class IntcodeComputer implements DoesFileOperations { - final long[] program; + private long[] program; private int instructionCounter = 0; private final Queue input = new ArrayDeque<>(2); private int lastInput; @@ -19,6 +19,7 @@ public class IntcodeComputer implements DoesFileOperations { public IntcodeComputer(int day, int...input) throws IOException { this.program = Arrays.stream(readDay(day).split(",")).mapToLong(Long::parseLong).toArray(); + this.program = Arrays.copyOf(this.program, 10000); setInput(input); if(day == 2) { program[1] = input[0]; @@ -28,7 +29,7 @@ public IntcodeComputer(int day, int...input) throws IOException { public long run() { long result; - while((result = executeInstruction(Math.toIntExact(program[instructionCounter]))) == 0); + while((result = executeInstruction(Math.toIntExact(program[instructionCounter]))) == -1); return result; } @@ -50,8 +51,12 @@ private long execute(int[] method, int instruction) { } private void transformParameters(int[] method, long[] args, int instruction) { + try { IntStream.range(0, args.length).filter(i -> method[i] != 1).filter(i -> i+1 != args.length || !Arrays.stream(DO_NOT_TRANSFORM_FINAL_ARGUMENT).anyMatch(j -> j==instruction)) .forEach(i -> args[i] = program[Math.toIntExact((method[i] == 2 ? relativeBase : 0) + args[i])]); + } catch (Exception e) { + e.printStackTrace(); + } if(Arrays.stream(DO_NOT_TRANSFORM_FINAL_ARGUMENT).anyMatch(j -> j==instruction) && method[args.length-1] == 2) { args[args.length-1] += relativeBase; } @@ -89,10 +94,10 @@ private long executeInstruction(long[] args, int instruction) { case 7: program[Math.toIntExact(args[2])] = args[0] < args[1] ? 1 : 0; break; case 8: program[Math.toIntExact(args[2])] = args[0] == args[1] ? 1 : 0; break; case 9: relativeBase += Math.toIntExact(args[0]); break; - case 99: return -1; + case 99: return -2; default: throw new IllegalStateException("Something went wrong!"); } - return 0; + return -1; } private long parseComplexInstruction(int instruction) { diff --git a/src/main/resources/day11.txt b/src/main/resources/day11.txt new file mode 100644 index 00000000..7f841847 --- /dev/null +++ b/src/main/resources/day11.txt @@ -0,0 +1 @@ +3,8,1005,8,342,1106,0,11,0,0,0,104,1,104,0,3,8,102,-1,8,10,1001,10,1,10,4,10,1008,8,0,10,4,10,1002,8,1,29,2,1006,19,10,1,1005,19,10,2,1102,11,10,3,8,102,-1,8,10,101,1,10,10,4,10,108,1,8,10,4,10,1001,8,0,62,2,1009,15,10,3,8,102,-1,8,10,101,1,10,10,4,10,108,1,8,10,4,10,1002,8,1,88,2,1101,6,10,3,8,102,-1,8,10,1001,10,1,10,4,10,108,0,8,10,4,10,102,1,8,114,1,105,8,10,1,1102,18,10,2,6,5,10,1,2,15,10,3,8,1002,8,-1,10,101,1,10,10,4,10,1008,8,1,10,4,10,1001,8,0,153,1,105,15,10,3,8,1002,8,-1,10,1001,10,1,10,4,10,108,0,8,10,4,10,102,1,8,178,1,1006,15,10,1006,0,96,1006,0,35,1,104,7,10,3,8,1002,8,-1,10,1001,10,1,10,4,10,108,0,8,10,4,10,102,1,8,214,1006,0,44,2,1105,17,10,1,1107,19,10,1,4,16,10,3,8,1002,8,-1,10,1001,10,1,10,4,10,1008,8,0,10,4,10,102,1,8,252,1006,0,6,1,1001,20,10,1006,0,45,2,1109,5,10,3,8,1002,8,-1,10,101,1,10,10,4,10,108,1,8,10,4,10,102,1,8,287,2,101,20,10,2,1006,18,10,1,1009,9,10,3,8,102,-1,8,10,1001,10,1,10,4,10,108,1,8,10,4,10,1002,8,1,321,101,1,9,9,1007,9,1031,10,1005,10,15,99,109,664,104,0,104,1,21102,48210117528,1,1,21102,1,359,0,1105,1,463,21102,932700763028,1,1,21102,370,1,0,1105,1,463,3,10,104,0,104,1,3,10,104,0,104,0,3,10,104,0,104,1,3,10,104,0,104,1,3,10,104,0,104,0,3,10,104,0,104,1,21102,1,179557207079,1,21102,417,1,0,1105,1,463,21102,1,28994202816,1,21101,0,428,0,1105,1,463,3,10,104,0,104,0,3,10,104,0,104,0,21101,0,709580710756,1,21102,1,451,0,1106,0,463,21102,825016201984,1,1,21101,462,0,0,1106,0,463,99,109,2,21201,-1,0,1,21102,40,1,2,21101,0,494,3,21102,1,484,0,1105,1,527,109,-2,2106,0,0,0,1,0,0,1,109,2,3,10,204,-1,1001,489,490,505,4,0,1001,489,1,489,108,4,489,10,1006,10,521,1101,0,0,489,109,-2,2105,1,0,0,109,4,1201,-1,0,526,1207,-3,0,10,1006,10,544,21102,1,0,-3,21202,-3,1,1,22102,1,-2,2,21102,1,1,3,21102,563,1,0,1105,1,568,109,-4,2106,0,0,109,5,1207,-3,1,10,1006,10,591,2207,-4,-2,10,1006,10,591,21202,-4,1,-4,1105,1,659,22102,1,-4,1,21201,-3,-1,2,21202,-2,2,3,21102,610,1,0,1106,0,568,21201,1,0,-4,21102,1,1,-1,2207,-4,-2,10,1006,10,629,21102,1,0,-1,22202,-2,-1,-2,2107,0,-3,10,1006,10,651,21202,-1,1,1,21102,1,651,0,106,0,526,21202,-2,-1,-2,22201,-4,-2,-4,109,-5,2106,0,0 \ No newline at end of file From 04d4cdb4c79d16847ae6e1f68664c03d44852cf3 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 11 Dec 2019 07:06:10 +0100 Subject: [PATCH 047/433] Day 11 part 2 --- .../sbaars/adventofcode2019/days/Day11.java | 43 +++++++++---------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day11.java b/src/main/java/com/sbaars/adventofcode2019/days/Day11.java index d7027319..0738dd16 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day11.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day11.java @@ -11,19 +11,13 @@ public class Day11 implements Day, DoesFileOperations { - int face = 0; - Set paintedOnce = new HashSet<>(); - Set whitePlaces = new HashSet<>(); - enum Direction { UP, RIGHT, DOWN, LEFT } - Direction dir = Direction.UP; - - public void turn() { + public Direction turn(Direction dir) { int cur = dir.ordinal()+1; if(cur == Direction.values().length) cur = 0; - dir = Direction.values()[cur]; + return Direction.values()[cur]; } public static void main(String[] args) throws IOException { @@ -32,9 +26,18 @@ public static void main(String[] args) throws IOException { @Override public int part1() throws IOException { + return robotWalk(false).size(); + } + + private Set robotWalk(boolean startWhite) throws IOException { IntcodeComputer c = new IntcodeComputer(11); Point currentLocation = new Point(0,0); - + int steps = 0; + Direction dir = Direction.UP; + Set paintedOnce = new HashSet<>(); + Set whitePlaces = new HashSet<>(); + if(startWhite) + whitePlaces.add(currentLocation); while(true) { c.setInput(whitePlaces.contains(currentLocation) ? 1 : 0); int paintColor = c.runInt(); @@ -43,7 +46,7 @@ public int part1() throws IOException { int turn = c.runInt(); if(turn == -2) break; - System.out.println("Loc = "+currentLocation+"Paint = " + paintColor+ ", turn = "+turn+", is space white = "+whitePlaces.contains(currentLocation)); + System.out.println("Loc = "+currentLocation+", step = "+steps+", Paint = " + paintColor+ ", turn = "+turn+", is space white = "+whitePlaces.contains(currentLocation)); paintedOnce.add(currentLocation); if(paintColor == 1) { whitePlaces.add(currentLocation); @@ -51,30 +54,26 @@ public int part1() throws IOException { whitePlaces.remove(currentLocation); } - if(turn == 1) { - turn(); - } + if(turn == 1) dir = turn(dir); currentLocation = move(currentLocation, dir); + steps++; } - return paintedOnce.size(); + return paintedOnce; } private Point move(Point currentLocation, Direction dir2) { switch (dir2) { - case UP: - return new Point(currentLocation.x, currentLocation.y+1); - case DOWN: - return new Point(currentLocation.x, currentLocation.y-1); - case RIGHT: - return new Point(currentLocation.x+1, currentLocation.y); - case LEFT: - return new Point(currentLocation.x-1, currentLocation.y); + case UP: return new Point(currentLocation.x, currentLocation.y+1); + case DOWN: return new Point(currentLocation.x, currentLocation.y-1); + case RIGHT: return new Point(currentLocation.x+1, currentLocation.y); + case LEFT: return new Point(currentLocation.x-1, currentLocation.y); } return null; } @Override public int part2() throws IOException { + robotWalk(true); return 0; } } From 65154534e99ab3f5978c5964b686a9f2936ccd2e Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 11 Dec 2019 07:42:42 +0100 Subject: [PATCH 048/433] The answer is not always an integer --- .../sbaars/adventofcode2019/common/Day.java | 8 +++--- .../sbaars/adventofcode2019/days/Day1.java | 4 +-- .../sbaars/adventofcode2019/days/Day10.java | 6 ++--- .../sbaars/adventofcode2019/days/Day11.java | 26 +++++++++---------- .../sbaars/adventofcode2019/days/Day2.java | 8 +++--- .../sbaars/adventofcode2019/days/Day3.java | 4 +-- .../sbaars/adventofcode2019/days/Day4.java | 4 +-- .../sbaars/adventofcode2019/days/Day5.java | 8 +++--- .../sbaars/adventofcode2019/days/Day6.java | 4 +-- .../sbaars/adventofcode2019/days/Day7.java | 4 +-- .../sbaars/adventofcode2019/days/Day8.java | 4 +-- .../sbaars/adventofcode2019/days/Day9.java | 10 +++---- .../com/sbaars/adventofcode2019/util/OCR.java | 5 ++++ 13 files changed, 49 insertions(+), 46 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode2019/util/OCR.java diff --git a/src/main/java/com/sbaars/adventofcode2019/common/Day.java b/src/main/java/com/sbaars/adventofcode2019/common/Day.java index 0e077dda..badd6819 100644 --- a/src/main/java/com/sbaars/adventofcode2019/common/Day.java +++ b/src/main/java/com/sbaars/adventofcode2019/common/Day.java @@ -5,11 +5,11 @@ import com.sbaars.adventofcode2019.util.DoesFileOperations; public interface Day extends DoesFileOperations { - public int part1() throws IOException; - public int part2() throws IOException; + public Object part1() throws IOException; + public Object part2() throws IOException; public default void printParts() throws IOException { - System.out.println("Part 1 = "+part1()); - System.out.println("Part 2 = "+part2()); + System.out.println("Part 1: "+part1()); + System.out.println("Part 2: "+part2()); } } diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day1.java b/src/main/java/com/sbaars/adventofcode2019/days/Day1.java index c639cd9b..2aede117 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day1.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day1.java @@ -14,12 +14,12 @@ public static void main(String[] args) throws IOException } @Override - public int part1() throws IOException { + public Object part1() throws IOException { return createNumberStream().map(this::getFuel).sum(); } @Override - public int part2() throws IOException { + public Object part2() throws IOException { return createNumberStream().map(this::getRequiredFuel).sum(); } diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day10.java b/src/main/java/com/sbaars/adventofcode2019/days/Day10.java index 5ded2040..19e9b6ce 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day10.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day10.java @@ -26,15 +26,15 @@ public static void main(String[] args) throws IOException { } @Override - public int part1() throws IOException { + public Object part1() throws IOException { long[] nVisible = new long[asteroids.size()]; for(int i = 0; i nVisible[i] > nVisible[j] ? i : j).getAsInt()); - return Math.toIntExact(Arrays.stream(nVisible).max().getAsLong()); + return Arrays.stream(nVisible).max().getAsLong(); } @Override - public int part2() throws IOException { + public Object part2() throws IOException { List asteroidList = asteroids.stream().map(e -> new Asteroid(baseLocation, e)).collect(Collectors.toList()); Asteroid prevDestroyed = new Asteroid(); for(int destroyed = 1; destroyed<200; destroyed++) { diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day11.java b/src/main/java/com/sbaars/adventofcode2019/days/Day11.java index 0738dd16..1376f62d 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day11.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day11.java @@ -13,10 +13,12 @@ public class Day11 implements Day, DoesFileOperations { enum Direction { UP, RIGHT, DOWN, LEFT } - public Direction turn(Direction dir) { - int cur = dir.ordinal()+1; + public Direction turn(Direction dir, boolean right) { + int cur = dir.ordinal() + (right ? 1 : -1); if(cur == Direction.values().length) cur = 0; + else if(cur == -1) + cur = 3; return Direction.values()[cur]; } @@ -25,17 +27,17 @@ public static void main(String[] args) throws IOException { } @Override - public int part1() throws IOException { - return robotWalk(false).size(); + public Object part1() throws IOException { + return robotWalk(false); } - private Set robotWalk(boolean startWhite) throws IOException { + private Object robotWalk(boolean startWhite) throws IOException { IntcodeComputer c = new IntcodeComputer(11); Point currentLocation = new Point(0,0); int steps = 0; Direction dir = Direction.UP; - Set paintedOnce = new HashSet<>(); - Set whitePlaces = new HashSet<>(); + final Set paintedOnce = new HashSet<>(); + final Set whitePlaces = new HashSet<>(); if(startWhite) whitePlaces.add(currentLocation); while(true) { @@ -46,7 +48,6 @@ private Set robotWalk(boolean startWhite) throws IOException { int turn = c.runInt(); if(turn == -2) break; - System.out.println("Loc = "+currentLocation+", step = "+steps+", Paint = " + paintColor+ ", turn = "+turn+", is space white = "+whitePlaces.contains(currentLocation)); paintedOnce.add(currentLocation); if(paintColor == 1) { whitePlaces.add(currentLocation); @@ -54,11 +55,11 @@ private Set robotWalk(boolean startWhite) throws IOException { whitePlaces.remove(currentLocation); } - if(turn == 1) dir = turn(dir); + dir = turn(dir, turn == 1); currentLocation = move(currentLocation, dir); steps++; } - return paintedOnce; + return startWhite ? "JELEFGHP" : paintedOnce.size(); } private Point move(Point currentLocation, Direction dir2) { @@ -72,8 +73,7 @@ private Point move(Point currentLocation, Direction dir2) { } @Override - public int part2() throws IOException { - robotWalk(true); - return 0; + public Object part2() throws IOException { + return robotWalk(true); } } diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day2.java b/src/main/java/com/sbaars/adventofcode2019/days/Day2.java index 15799ce6..ee75b695 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day2.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day2.java @@ -13,12 +13,12 @@ public static void main(String[] args) throws IOException { } @Override - public int part1() throws IOException { + public Object part1() throws IOException { return execute(12,2); } @Override - public int part2() throws IOException { + public Object part2() throws IOException { return bruteForceFindingNumber(19690720, 99); } @@ -33,9 +33,9 @@ private int bruteForceFindingNumber(int number, int bound) throws IOException { return -1; } - private int execute(int x, int y) throws IOException { + private long execute(int x, int y) throws IOException { IntcodeComputer computer = new IntcodeComputer(2, x, y); computer.run(); - return Math.toIntExact(computer.firstElement()); + return computer.firstElement(); } } diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day3.java b/src/main/java/com/sbaars/adventofcode2019/days/Day3.java index fe3d90f1..0a37f868 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day3.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day3.java @@ -27,12 +27,12 @@ public static void main(String[] args) throws IOException } @Override - public int part1() throws IOException { + public Object part1() throws IOException { return intersect.stream().mapToInt(e -> distance(e.point)).min().orElse(Integer.MAX_VALUE); } @Override - public int part2() throws IOException { + public Object part2() throws IOException { return intersect.stream().mapToInt(e -> e.steps).min().orElse(Integer.MAX_VALUE); } diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day4.java b/src/main/java/com/sbaars/adventofcode2019/days/Day4.java index ce7ef287..5031388b 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day4.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day4.java @@ -14,12 +14,12 @@ public static void main(String[] args) throws IOException { } @Override - public int part1() throws IOException { + public Object part1() throws IOException { return checkPasswords(false); } @Override - public int part2() throws IOException { + public Object part2() throws IOException { return checkPasswords(true); } diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day5.java b/src/main/java/com/sbaars/adventofcode2019/days/Day5.java index 63089705..2c140236 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day5.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day5.java @@ -13,12 +13,12 @@ public static void main(String[] args) throws IOException { } @Override - public int part1() throws IOException { - return new IntcodeComputer(5, 1).runInt(); + public Object part1() throws IOException { + return new IntcodeComputer(5, 1).run(); } @Override - public int part2() throws IOException { - return new IntcodeComputer(5, 5).runInt(); + public Object part2() throws IOException { + return new IntcodeComputer(5, 5).run(); } } diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day6.java b/src/main/java/com/sbaars/adventofcode2019/days/Day6.java index 82231d94..4c87c8f7 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day6.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day6.java @@ -21,7 +21,7 @@ public static void main(String[] args) throws IOException } @Override - public int part1() throws IOException { + public Object part1() throws IOException { String[] nums = createOrbitArray(); for(String num : nums) { String[] parts = num.split("\\)"); @@ -43,7 +43,7 @@ private void countOrbitsInList(ListMap orbits, AtomicInteger o, } @Override - public int part2() throws IOException { + public Object part2() throws IOException { return findRoute("YOU", "SAN"); } diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day7.java b/src/main/java/com/sbaars/adventofcode2019/days/Day7.java index 8d2f5f05..51130286 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day7.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day7.java @@ -16,7 +16,7 @@ public static void main(String[] args) throws IOException { } @Override - public int part1() throws IOException { + public Object part1() throws IOException { List> permutations = generatePerm(new ArrayList<>(Arrays.asList(0,1,2,3,4))); List results = new ArrayList<>(); for(List perm : permutations) { @@ -30,7 +30,7 @@ public int part1() throws IOException { } @Override - public int part2() throws IOException { + public Object part2() throws IOException { List> permutations = generatePerm(new ArrayList<>(Arrays.asList(5,6,7,8,9))); List results = new ArrayList<>(); perms: for(List shuffle : permutations) { diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day8.java b/src/main/java/com/sbaars/adventofcode2019/days/Day8.java index 504045b5..6c3e8623 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day8.java @@ -22,7 +22,7 @@ public static void main(String[] args) throws IOException { } @Override - public int part1() throws IOException { + public Object part1() throws IOException { int[] pixels = readPixels(); List> pixelCounts = countPixels(pixels); CountMap cm = pixelCounts.stream().reduce((e1, e2) -> e1.get(0) > e2.get(0) ? e2 : e1).get(); @@ -58,7 +58,7 @@ private List> countPixels(int[] pixels) { â–ˆ â–ˆ ██ â–ˆ â–ˆ â–ˆ â–ˆ */ @Override - public int part2() throws IOException { + public Object part2() throws IOException { int[] pixels = readPixels(); int[][] pixelArrays = splitArray(pixels, 100, SIZE); int[] finalPixels = determineFinalImage(pixelArrays); diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day9.java b/src/main/java/com/sbaars/adventofcode2019/days/Day9.java index 0b58467e..0f725020 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day9.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day9.java @@ -13,14 +13,12 @@ public static void main(String[] args) throws IOException { } @Override - public int part1() throws IOException { // Just append a 2 to the number ;-) - long res = new IntcodeComputer(9, 1).run(); - System.out.println(res); - return Math.toIntExact(res-2000000000L); + public Object part1() throws IOException { // Just append a 2 to the number ;-) + return new IntcodeComputer(9, 1).run(); } @Override - public int part2() throws IOException { - return new IntcodeComputer(9, 2).runInt(); + public Object part2() throws IOException { + return new IntcodeComputer(9, 2).run(); } } diff --git a/src/main/java/com/sbaars/adventofcode2019/util/OCR.java b/src/main/java/com/sbaars/adventofcode2019/util/OCR.java new file mode 100644 index 00000000..3ca3d013 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/util/OCR.java @@ -0,0 +1,5 @@ +package com.sbaars.adventofcode2019.util; + +public class OCR { + +} From 930efa93325415695c6ef7391184456f478e258c Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 11 Dec 2019 08:06:51 +0100 Subject: [PATCH 049/433] Implemented OCR for day 8 --- .../sbaars/adventofcode2019/days/Day11.java | 2 -- .../sbaars/adventofcode2019/days/Day8.java | 16 ++------- .../com/sbaars/adventofcode2019/util/OCR.java | 36 +++++++++++++++++++ 3 files changed, 39 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day11.java b/src/main/java/com/sbaars/adventofcode2019/days/Day11.java index 1376f62d..65428ce6 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day11.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day11.java @@ -34,7 +34,6 @@ public Object part1() throws IOException { private Object robotWalk(boolean startWhite) throws IOException { IntcodeComputer c = new IntcodeComputer(11); Point currentLocation = new Point(0,0); - int steps = 0; Direction dir = Direction.UP; final Set paintedOnce = new HashSet<>(); final Set whitePlaces = new HashSet<>(); @@ -57,7 +56,6 @@ private Object robotWalk(boolean startWhite) throws IOException { dir = turn(dir, turn == 1); currentLocation = move(currentLocation, dir); - steps++; } return startWhite ? "JELEFGHP" : paintedOnce.size(); } diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day8.java b/src/main/java/com/sbaars/adventofcode2019/days/Day8.java index 6c3e8623..45c8647b 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day8.java @@ -10,6 +10,7 @@ import com.sbaars.adventofcode2019.common.Day; import com.sbaars.adventofcode2019.util.CountMap; import com.sbaars.adventofcode2019.util.DoesFileOperations; +import com.sbaars.adventofcode2019.util.OCR; public class Day8 implements Day, DoesFileOperations { @@ -46,24 +47,13 @@ private List> countPixels(int[] pixels) { return pixelCounts; } - - /* - Answer: - - ████ ███ â–ˆ â–ˆ ██ ███ - â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ - ███ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ - â–ˆ ███ â–ˆ â–ˆ ████ ███ - â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ - â–ˆ â–ˆ ██ â–ˆ â–ˆ â–ˆ â–ˆ - */ @Override public Object part2() throws IOException { int[] pixels = readPixels(); int[][] pixelArrays = splitArray(pixels, 100, SIZE); int[] finalPixels = determineFinalImage(pixelArrays); - Arrays.stream(splitArray(finalPixels, DIM_X, DIM_Y)).map(a -> Arrays.stream(a).boxed().map(x -> x == 0 ? " " : "â–ˆ").collect(Collectors.joining())).forEach(System.out::println); - return 0; + String[] image = Arrays.stream(splitArray(finalPixels, DIM_X, DIM_Y)).map(a -> Arrays.stream(a).boxed().map(x -> x == 0 ? " " : "â–ˆ").collect(Collectors.joining())).toArray(String[]::new); + return new OCR(image).getString(); } private int[] determineFinalImage(int[][] pixelArrays) { diff --git a/src/main/java/com/sbaars/adventofcode2019/util/OCR.java b/src/main/java/com/sbaars/adventofcode2019/util/OCR.java index 3ca3d013..e5c89fe4 100644 --- a/src/main/java/com/sbaars/adventofcode2019/util/OCR.java +++ b/src/main/java/com/sbaars/adventofcode2019/util/OCR.java @@ -1,5 +1,41 @@ package com.sbaars.adventofcode2019.util; +import java.util.ArrayList; +import java.util.List; + public class OCR { + + List characters = new ArrayList<>(); + public OCR(String[] image) { + for(int i = 0; i Date: Wed, 11 Dec 2019 18:44:48 +0100 Subject: [PATCH 050/433] stuff --- .../sbaars/adventofcode2019/days/Day11.java | 27 ++++++++++++------- .../sbaars/adventofcode2019/IntcodeTest.java | 10 +++---- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day11.java b/src/main/java/com/sbaars/adventofcode2019/days/Day11.java index 65428ce6..ced60c60 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day11.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day11.java @@ -12,15 +12,6 @@ public class Day11 implements Day, DoesFileOperations { enum Direction { UP, RIGHT, DOWN, LEFT } - - public Direction turn(Direction dir, boolean right) { - int cur = dir.ordinal() + (right ? 1 : -1); - if(cur == Direction.values().length) - cur = 0; - else if(cur == -1) - cur = 3; - return Direction.values()[cur]; - } public static void main(String[] args) throws IOException { new Day11().printParts(); @@ -57,7 +48,23 @@ private Object robotWalk(boolean startWhite) throws IOException { dir = turn(dir, turn == 1); currentLocation = move(currentLocation, dir); } - return startWhite ? "JELEFGHP" : paintedOnce.size(); + return startWhite ? constructImage(whitePlaces) : paintedOnce.size(); + } + + private int constructImage(Set whitePlaces) { + int cornerX = whitePlaces.stream().mapToInt(e -> e.x).min().getAsInt(); + int cornerY = whitePlaces.stream().mapToInt(e -> e.y).min().getAsInt(); + whitePlaces.forEach(e -> e.move(e.x - cornerX, e.y - cornerY)); + return 0; + } + + public Direction turn(Direction dir, boolean right) { + int cur = dir.ordinal() + (right ? 1 : -1); + if(cur == Direction.values().length) + cur = 0; + else if(cur == -1) + cur = 3; + return Direction.values()[cur]; } private Point move(Point currentLocation, Direction dir2) { diff --git a/src/test/java/com/sbaars/adventofcode2019/IntcodeTest.java b/src/test/java/com/sbaars/adventofcode2019/IntcodeTest.java index a7608e99..04ad01b3 100644 --- a/src/test/java/com/sbaars/adventofcode2019/IntcodeTest.java +++ b/src/test/java/com/sbaars/adventofcode2019/IntcodeTest.java @@ -12,13 +12,13 @@ public class IntcodeTest extends TestCase { public void testDay2() throws IOException { - Assert.assertEquals(8017076, new Day2().part1()); + Assert.assertEquals(8017076L, new Day2().part1()); Assert.assertEquals(3146, new Day2().part2()); } public void testDay5() throws IOException { - Assert.assertEquals(11049715, new Day5().part1()); - Assert.assertEquals(2140710, new Day5().part2()); + Assert.assertEquals(11049715L, new Day5().part1()); + Assert.assertEquals(2140710L, new Day5().part2()); } public void testDay7() throws IOException { @@ -27,7 +27,7 @@ public void testDay7() throws IOException { } public void testDay9() throws IOException { - Assert.assertEquals(518058886, new Day9().part1()); - Assert.assertEquals(44292, new Day9().part2()); + Assert.assertEquals(2518058886L, new Day9().part1()); + Assert.assertEquals(44292L, new Day9().part2()); } } From 2f102b0dadbad92b8adac423470bfa8944457042 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 11 Dec 2019 20:05:06 +0100 Subject: [PATCH 051/433] Fixed broken intcode programs --- src/main/java/com/sbaars/adventofcode2019/days/Day5.java | 5 ++++- src/main/java/com/sbaars/adventofcode2019/days/Day7.java | 2 +- .../sbaars/adventofcode2019/intcode/IntcodeComputer.java | 8 ++------ 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day5.java b/src/main/java/com/sbaars/adventofcode2019/days/Day5.java index 2c140236..b66cb9c2 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day5.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day5.java @@ -14,7 +14,10 @@ public static void main(String[] args) throws IOException { @Override public Object part1() throws IOException { - return new IntcodeComputer(5, 1).run(); + long res; + IntcodeComputer intcodeComputer = new IntcodeComputer(5, 1); + while((res = intcodeComputer.run()) == 0); + return res; } @Override diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day7.java b/src/main/java/com/sbaars/adventofcode2019/days/Day7.java index 51130286..57cb5138 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day7.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day7.java @@ -42,7 +42,7 @@ public Object part2() throws IOException { c.addInput(lastVal); int thruster = lastVal; lastVal = c.runInt(); - if(lastVal == -1) { + if(lastVal == -2) { results.add(thruster); continue perms; } diff --git a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java index b4322d94..9523ec25 100644 --- a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java +++ b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java @@ -19,7 +19,7 @@ public class IntcodeComputer implements DoesFileOperations { public IntcodeComputer(int day, int...input) throws IOException { this.program = Arrays.stream(readDay(day).split(",")).mapToLong(Long::parseLong).toArray(); - this.program = Arrays.copyOf(this.program, 10000); + this.program = Arrays.copyOf(this.program, 10000); // Quick hack to enlange memory, should be refactored. setInput(input); if(day == 2) { program[1] = input[0]; @@ -50,13 +50,9 @@ private long execute(int[] method, int instruction) { return executeInstruction(args, instruction); } - private void transformParameters(int[] method, long[] args, int instruction) { - try { + private void transformParameters(int[] method, long[] args, int instruction) { IntStream.range(0, args.length).filter(i -> method[i] != 1).filter(i -> i+1 != args.length || !Arrays.stream(DO_NOT_TRANSFORM_FINAL_ARGUMENT).anyMatch(j -> j==instruction)) .forEach(i -> args[i] = program[Math.toIntExact((method[i] == 2 ? relativeBase : 0) + args[i])]); - } catch (Exception e) { - e.printStackTrace(); - } if(Arrays.stream(DO_NOT_TRANSFORM_FINAL_ARGUMENT).anyMatch(j -> j==instruction) && method[args.length-1] == 2) { args[args.length-1] += relativeBase; } From a979e4ddfe43397cf32fe209e18a870146a1ee65 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 11 Dec 2019 20:13:27 +0100 Subject: [PATCH 052/433] Lots' a stuff --- .../adventofcode2019/{util => common}/OCR.java | 2 +- .../adventofcode2019/common/ProcessesImages.java | 10 ++++++++++ .../com/sbaars/adventofcode2019/days/Day10.java | 3 +-- .../com/sbaars/adventofcode2019/days/Day11.java | 9 +++++++-- .../com/sbaars/adventofcode2019/days/Day2.java | 3 +-- .../com/sbaars/adventofcode2019/days/Day3.java | 3 +-- .../com/sbaars/adventofcode2019/days/Day5.java | 3 +-- .../com/sbaars/adventofcode2019/days/Day6.java | 3 +-- .../com/sbaars/adventofcode2019/days/Day7.java | 3 +-- .../com/sbaars/adventofcode2019/days/Day8.java | 14 +++++--------- .../com/sbaars/adventofcode2019/days/Day9.java | 5 ++--- 11 files changed, 31 insertions(+), 27 deletions(-) rename src/main/java/com/sbaars/adventofcode2019/{util => common}/OCR.java (95%) create mode 100644 src/main/java/com/sbaars/adventofcode2019/common/ProcessesImages.java diff --git a/src/main/java/com/sbaars/adventofcode2019/util/OCR.java b/src/main/java/com/sbaars/adventofcode2019/common/OCR.java similarity index 95% rename from src/main/java/com/sbaars/adventofcode2019/util/OCR.java rename to src/main/java/com/sbaars/adventofcode2019/common/OCR.java index e5c89fe4..3628f1d1 100644 --- a/src/main/java/com/sbaars/adventofcode2019/util/OCR.java +++ b/src/main/java/com/sbaars/adventofcode2019/common/OCR.java @@ -1,4 +1,4 @@ -package com.sbaars.adventofcode2019.util; +package com.sbaars.adventofcode2019.common; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/sbaars/adventofcode2019/common/ProcessesImages.java b/src/main/java/com/sbaars/adventofcode2019/common/ProcessesImages.java new file mode 100644 index 00000000..edb7eadd --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/common/ProcessesImages.java @@ -0,0 +1,10 @@ +package com.sbaars.adventofcode2019.common; + +import java.util.Arrays; +import java.util.stream.Collectors; + +public interface ProcessesImages { + public default String[] createAsciiArray(int[][] pixels) { + return Arrays.stream(pixels).map(a -> Arrays.stream(a).boxed().map(x -> x == 0 ? " " : "â–ˆ").collect(Collectors.joining())).toArray(String[]::new); + } +} diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day10.java b/src/main/java/com/sbaars/adventofcode2019/days/Day10.java index 19e9b6ce..712aa57d 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day10.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day10.java @@ -9,9 +9,8 @@ import java.util.stream.IntStream; import com.sbaars.adventofcode2019.common.Day; -import com.sbaars.adventofcode2019.util.DoesFileOperations; -public class Day10 implements Day, DoesFileOperations { +public class Day10 implements Day { private final List asteroids; private Point baseLocation; diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day11.java b/src/main/java/com/sbaars/adventofcode2019/days/Day11.java index ced60c60..2528af6f 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day11.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day11.java @@ -7,9 +7,8 @@ import com.sbaars.adventofcode2019.common.Day; import com.sbaars.adventofcode2019.intcode.IntcodeComputer; -import com.sbaars.adventofcode2019.util.DoesFileOperations; -public class Day11 implements Day, DoesFileOperations { +public class Day11 implements Day { enum Direction { UP, RIGHT, DOWN, LEFT } @@ -55,6 +54,12 @@ private int constructImage(Set whitePlaces) { int cornerX = whitePlaces.stream().mapToInt(e -> e.x).min().getAsInt(); int cornerY = whitePlaces.stream().mapToInt(e -> e.y).min().getAsInt(); whitePlaces.forEach(e -> e.move(e.x - cornerX, e.y - cornerY)); + int sizex = whitePlaces.stream().mapToInt(e -> e.x).max().getAsInt(); + int sizey = whitePlaces.stream().mapToInt(e -> e.y).max().getAsInt(); + int[][] places = new int[sizex][sizey]; + for(Point p : whitePlaces) { + places[p.x][p.y] = 1; + } return 0; } diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day2.java b/src/main/java/com/sbaars/adventofcode2019/days/Day2.java index ee75b695..2f17263c 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day2.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day2.java @@ -4,9 +4,8 @@ import com.sbaars.adventofcode2019.common.Day; import com.sbaars.adventofcode2019.intcode.IntcodeComputer; -import com.sbaars.adventofcode2019.util.DoesFileOperations; -public class Day2 implements Day, DoesFileOperations { +public class Day2 implements Day { public static void main(String[] args) throws IOException { new Day2().printParts(); diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day3.java b/src/main/java/com/sbaars/adventofcode2019/days/Day3.java index 0a37f868..3199f6dd 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day3.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day3.java @@ -7,9 +7,8 @@ import java.util.Set; import com.sbaars.adventofcode2019.common.Day; -import com.sbaars.adventofcode2019.util.DoesFileOperations; -public class Day3 implements Day, DoesFileOperations +public class Day3 implements Day { private Set intersect; diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day5.java b/src/main/java/com/sbaars/adventofcode2019/days/Day5.java index b66cb9c2..0e5b4006 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day5.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day5.java @@ -4,9 +4,8 @@ import com.sbaars.adventofcode2019.common.Day; import com.sbaars.adventofcode2019.intcode.IntcodeComputer; -import com.sbaars.adventofcode2019.util.DoesFileOperations; -public class Day5 implements Day, DoesFileOperations { +public class Day5 implements Day { public static void main(String[] args) throws IOException { new Day5().printParts(); diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day6.java b/src/main/java/com/sbaars/adventofcode2019/days/Day6.java index 4c87c8f7..50813c0e 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day6.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day6.java @@ -8,10 +8,9 @@ import java.util.concurrent.atomic.AtomicInteger; import com.sbaars.adventofcode2019.common.Day; -import com.sbaars.adventofcode2019.util.DoesFileOperations; import com.sbaars.adventofcode2019.util.ListMap; -public class Day6 implements Day, DoesFileOperations { +public class Day6 implements Day { ListMap orbits = new ListMap<>(); diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day7.java b/src/main/java/com/sbaars/adventofcode2019/days/Day7.java index 57cb5138..530975e3 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day7.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day7.java @@ -7,9 +7,8 @@ import com.sbaars.adventofcode2019.common.Day; import com.sbaars.adventofcode2019.intcode.IntcodeComputer; -import com.sbaars.adventofcode2019.util.DoesFileOperations; -public class Day7 implements Day, DoesFileOperations { +public class Day7 implements Day { public static void main(String[] args) throws IOException { new Day7().printParts(); diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day8.java b/src/main/java/com/sbaars/adventofcode2019/days/Day8.java index 45c8647b..bf593ba9 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day8.java @@ -2,17 +2,15 @@ import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; import java.util.stream.IntStream; import com.sbaars.adventofcode2019.common.Day; +import com.sbaars.adventofcode2019.common.OCR; +import com.sbaars.adventofcode2019.common.ProcessesImages; import com.sbaars.adventofcode2019.util.CountMap; -import com.sbaars.adventofcode2019.util.DoesFileOperations; -import com.sbaars.adventofcode2019.util.OCR; -public class Day8 implements Day, DoesFileOperations { +public class Day8 implements Day, ProcessesImages { private static final int DIM_X = 6; private static final int DIM_Y = 25; @@ -49,11 +47,9 @@ private List> countPixels(int[] pixels) { @Override public Object part2() throws IOException { - int[] pixels = readPixels(); - int[][] pixelArrays = splitArray(pixels, 100, SIZE); + int[][] pixelArrays = splitArray(readPixels(), 100, SIZE); int[] finalPixels = determineFinalImage(pixelArrays); - String[] image = Arrays.stream(splitArray(finalPixels, DIM_X, DIM_Y)).map(a -> Arrays.stream(a).boxed().map(x -> x == 0 ? " " : "â–ˆ").collect(Collectors.joining())).toArray(String[]::new); - return new OCR(image).getString(); + return new OCR(createAsciiArray(splitArray(finalPixels, DIM_X, DIM_Y))).getString(); } private int[] determineFinalImage(int[][] pixelArrays) { diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day9.java b/src/main/java/com/sbaars/adventofcode2019/days/Day9.java index 0f725020..55c3b31c 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day9.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day9.java @@ -4,16 +4,15 @@ import com.sbaars.adventofcode2019.common.Day; import com.sbaars.adventofcode2019.intcode.IntcodeComputer; -import com.sbaars.adventofcode2019.util.DoesFileOperations; -public class Day9 implements Day, DoesFileOperations { +public class Day9 implements Day { public static void main(String[] args) throws IOException { new Day9().printParts(); } @Override - public Object part1() throws IOException { // Just append a 2 to the number ;-) + public Object part1() throws IOException { return new IntcodeComputer(9, 1).run(); } From e87eb70ea26cfc290ace91e528b59cdaf02c9879 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 11 Dec 2019 20:21:44 +0100 Subject: [PATCH 053/433] Main method to run all --- .../java/com/sbaars/adventofcode2019/Main.java | 17 +++++++++++++++++ .../com/sbaars/adventofcode2019/days/Day3.java | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/sbaars/adventofcode2019/Main.java diff --git a/src/main/java/com/sbaars/adventofcode2019/Main.java b/src/main/java/com/sbaars/adventofcode2019/Main.java new file mode 100644 index 00000000..df476862 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/Main.java @@ -0,0 +1,17 @@ +package com.sbaars.adventofcode2019; + +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; + +import com.sbaars.adventofcode2019.common.Day; + +public class Main { + public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException, InvocationTargetException, NoSuchMethodException { + for(int day = 1; day<=11; day++) { + System.out.println("Day "+day+":"); + Day instance = (Day)Class.forName("com.sbaars.adventofcode2019.days.Day"+day).getDeclaredConstructor().newInstance(); + instance.printParts(); + System.out.println(); + } + } +} diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day3.java b/src/main/java/com/sbaars/adventofcode2019/days/Day3.java index 3199f6dd..55a094b6 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day3.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day3.java @@ -12,7 +12,7 @@ public class Day3 implements Day { private Set intersect; - private Day3() throws IOException { + public Day3() throws IOException { String[] strings = Arrays.stream(readDay(3).split(System.lineSeparator())).toArray(String[]::new); Walk[] walks1 = mapToWalks(strings[0]), walks2 = mapToWalks(strings[1]); Set walkedLocations = new HashSet<>(); From e55b5e66906de0d9445444208d3b886c79267300 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 11 Dec 2019 21:03:39 +0100 Subject: [PATCH 054/433] JAVA 13 LETZZZ GOOOO --- .classpath | 2 +- .settings/org.eclipse.jdt.core.prefs | 13 ++-- pom.xml | 13 ++++ .../sbaars/adventofcode2019/common/OCR.java | 65 ++++++++++++++----- .../sbaars/adventofcode2019/days/Day11.java | 24 +++---- .../sbaars/adventofcode2019/days/Day8.java | 2 +- 6 files changed, 84 insertions(+), 35 deletions(-) diff --git a/.classpath b/.classpath index 0c01b411..b51d40f7 100644 --- a/.classpath +++ b/.classpath @@ -13,7 +13,7 @@ - + diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index db24ee78..60af120b 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -1,15 +1,16 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=13 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.compliance=13 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=enabled org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore -org.eclipse.jdt.core.compiler.release=disabled -org.eclipse.jdt.core.compiler.source=1.8 +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=13 diff --git a/pom.xml b/pom.xml index d448fdd5..9f19708b 100644 --- a/pom.xml +++ b/pom.xml @@ -13,6 +13,9 @@ UTF-8 + 8 + 13 + 13 @@ -29,4 +32,14 @@ compile + + + + maven-compiler-plugin + + 13 + + + + diff --git a/src/main/java/com/sbaars/adventofcode2019/common/OCR.java b/src/main/java/com/sbaars/adventofcode2019/common/OCR.java index 3628f1d1..470e7c50 100644 --- a/src/main/java/com/sbaars/adventofcode2019/common/OCR.java +++ b/src/main/java/com/sbaars/adventofcode2019/common/OCR.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.List; +@SuppressWarnings("preview") public class OCR { List characters = new ArrayList<>(); @@ -16,26 +17,58 @@ public OCR(String[] image) { characters.add(character); } } - - // I will expand this as more characters present themselves throughout these challenges. - public String getString() { + + @Override + public String toString() { StringBuilder result = new StringBuilder(); for(String[] character : characters) { - if(character[0].equals("████")) - result.append('F'); - else if(character[0].equals("███ ")) { - if(character[5].equals("â–ˆ ")) - result.append('P'); - else if(character[5].equals("â–ˆ â–ˆ")) { - result.append('R'); - } - } else if (character[0].equals("â–ˆ â–ˆ")) { - result.append('U'); - } else if(character[0].equals(" ██ ")) { - result.append('A'); - } + result.append(switch(character[0]) { + case "████" -> fullTop(character); + case "███ " -> threeTopLeft(character); + case "â–ˆ â–ˆ" -> bothSides(character); + case " ██ " -> middleTwo(character); + case " ██" -> 'J'; + case "â–ˆ " -> 'L'; + default -> dontKnow(); + }); } return result.toString(); } + + private char bothSides(String[] character) { + return switch(character[5]) { + case " ██ " -> 'U'; + case "â–ˆ â–ˆ" -> 'H'; + default -> dontKnow(); + }; + } + + private char middleTwo(String[] character) { + return switch(character[5]) { + case " ███" -> 'G'; + case "â–ˆ â–ˆ" -> 'A'; + default -> dontKnow(); + }; + } + + private char dontKnow() { + throw new IllegalArgumentException("I don't know your character yet!"); + } + + private char fullTop(String[] character) { + return switch(character[5]) { + case "â–ˆ " -> 'F'; + case "████" -> 'E'; + default -> dontKnow(); + }; + } + + private char threeTopLeft(String[] character) { + return switch(character[5]) { + case "â–ˆ " -> 'P'; + case "â–ˆ â–ˆ" -> 'R'; + default -> dontKnow(); + }; + } } diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day11.java b/src/main/java/com/sbaars/adventofcode2019/days/Day11.java index 2528af6f..1313cee5 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day11.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day11.java @@ -2,13 +2,16 @@ import java.awt.Point; import java.io.IOException; +import java.util.Arrays; import java.util.HashSet; import java.util.Set; import com.sbaars.adventofcode2019.common.Day; +import com.sbaars.adventofcode2019.common.OCR; +import com.sbaars.adventofcode2019.common.ProcessesImages; import com.sbaars.adventofcode2019.intcode.IntcodeComputer; -public class Day11 implements Day { +public class Day11 implements Day, ProcessesImages { enum Direction { UP, RIGHT, DOWN, LEFT } @@ -50,17 +53,16 @@ private Object robotWalk(boolean startWhite) throws IOException { return startWhite ? constructImage(whitePlaces) : paintedOnce.size(); } - private int constructImage(Set whitePlaces) { + private OCR constructImage(Set whitePlaces) { int cornerX = whitePlaces.stream().mapToInt(e -> e.x).min().getAsInt(); int cornerY = whitePlaces.stream().mapToInt(e -> e.y).min().getAsInt(); whitePlaces.forEach(e -> e.move(e.x - cornerX, e.y - cornerY)); - int sizex = whitePlaces.stream().mapToInt(e -> e.x).max().getAsInt(); - int sizey = whitePlaces.stream().mapToInt(e -> e.y).max().getAsInt(); - int[][] places = new int[sizex][sizey]; - for(Point p : whitePlaces) { - places[p.x][p.y] = 1; - } - return 0; + int sizex = whitePlaces.stream().mapToInt(e -> e.x).max().getAsInt()+1; + int sizey = whitePlaces.stream().mapToInt(e -> e.y).max().getAsInt()+1; + int[][] places = new int[sizey][sizex]; + for(Point p : whitePlaces) + places[p.y][p.x] = 1; + return new OCR(createAsciiArray(places)); } public Direction turn(Direction dir, boolean right) { @@ -74,8 +76,8 @@ else if(cur == -1) private Point move(Point currentLocation, Direction dir2) { switch (dir2) { - case UP: return new Point(currentLocation.x, currentLocation.y+1); - case DOWN: return new Point(currentLocation.x, currentLocation.y-1); + case UP: return new Point(currentLocation.x, currentLocation.y-1); + case DOWN: return new Point(currentLocation.x, currentLocation.y+1); case RIGHT: return new Point(currentLocation.x+1, currentLocation.y); case LEFT: return new Point(currentLocation.x-1, currentLocation.y); } diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day8.java b/src/main/java/com/sbaars/adventofcode2019/days/Day8.java index bf593ba9..d2995743 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day8.java @@ -49,7 +49,7 @@ private List> countPixels(int[] pixels) { public Object part2() throws IOException { int[][] pixelArrays = splitArray(readPixels(), 100, SIZE); int[] finalPixels = determineFinalImage(pixelArrays); - return new OCR(createAsciiArray(splitArray(finalPixels, DIM_X, DIM_Y))).getString(); + return new OCR(createAsciiArray(splitArray(finalPixels, DIM_X, DIM_Y))); } private int[] determineFinalImage(int[][] pixelArrays) { From c40cdd8b4d5685c054eeb6018809a365b046df43 Mon Sep 17 00:00:00 2001 From: Simon <8466614+SimonBaars@users.noreply.github.com> Date: Wed, 11 Dec 2019 21:04:39 +0100 Subject: [PATCH 055/433] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 1c2ec76a..e0516844 100644 --- a/README.md +++ b/README.md @@ -10,3 +10,6 @@ Days: - [Day 6](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day6.java) - [Day 7](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day7.java) - [Day 8](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day8.java) +- [Day 9](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day9.java) +- [Day 10](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day10.java) +- [Day 11](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day11.java) From cd41983b8568f01875948e0a7c92cafe9ea28346 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 11 Dec 2019 21:07:32 +0100 Subject: [PATCH 056/433] Day 12: I'm ready :) --- .../sbaars/adventofcode2019/days/Day11.java | 1 - .../sbaars/adventofcode2019/days/Day12.java | 22 +++++++++++++++++++ src/main/resources/day12.txt | 0 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/sbaars/adventofcode2019/days/Day12.java create mode 100644 src/main/resources/day12.txt diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day11.java b/src/main/java/com/sbaars/adventofcode2019/days/Day11.java index 1313cee5..3b49d2a6 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day11.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day11.java @@ -2,7 +2,6 @@ import java.awt.Point; import java.io.IOException; -import java.util.Arrays; import java.util.HashSet; import java.util.Set; diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day12.java b/src/main/java/com/sbaars/adventofcode2019/days/Day12.java new file mode 100644 index 00000000..57091c92 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day12.java @@ -0,0 +1,22 @@ +package com.sbaars.adventofcode2019.days; + +import java.io.IOException; + +import com.sbaars.adventofcode2019.common.Day; + +public class Day12 implements Day { + + public static void main(String[] args) throws IOException { + new Day12().printParts(); + } + + @Override + public Object part1() throws IOException { + return 0; + } + + @Override + public Object part2() throws IOException { + return 0; + } +} diff --git a/src/main/resources/day12.txt b/src/main/resources/day12.txt new file mode 100644 index 00000000..e69de29b From 3910423ff1fa1184ce126366fe4cabcae3926122 Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 12 Dec 2019 06:32:13 +0100 Subject: [PATCH 057/433] Day 12 Part 1 --- .../sbaars/adventofcode2019/days/Day12.java | 37 ++++++++++++++++++- src/main/resources/day12.txt | 4 ++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day12.java b/src/main/java/com/sbaars/adventofcode2019/days/Day12.java index 57091c92..615265d6 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day12.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day12.java @@ -1,20 +1,53 @@ package com.sbaars.adventofcode2019.days; import java.io.IOException; +import java.util.Arrays; import com.sbaars.adventofcode2019.common.Day; public class Day12 implements Day { + int[][] moons = {{-5,6-11},{-8,-4,-2},{1,16,4},{11,11,-4}}; + //int[][] moons = {{-8,-10,0},{5,5,10},{2,-7,3},{9,-8,-3}}; + //int[][] moons = {{-1,0,2},{2,-10,-7},{4,-8,8},{3,5,-1}}; + int[][] velocity = {{0,0,0},{0,0,0},{0,0,0},{0,0,0}}; + public static void main(String[] args) throws IOException { new Day12().printParts(); } @Override public Object part1() throws IOException { - return 0; + for(int n = 0; n<1000; n++) { + for(int i = 0; i moon2) { + velocity[i][dim]--; + velocity[j][dim]++; + } + } + } + } + //System.out.println("Res = "+Arrays.deepToString(velocity)); + for(int i = 0; i Date: Thu, 12 Dec 2019 07:48:18 +0100 Subject: [PATCH 060/433] Use shorts instead of integer --- .../sbaars/adventofcode2019/days/Day12.java | 51 ++++++++++++------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day12.java b/src/main/java/com/sbaars/adventofcode2019/days/Day12.java index fb282afe..8fede31b 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day12.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day12.java @@ -9,10 +9,10 @@ public class Day12 implements Day { - //int[][] moons = {{-5,6,-11},{-8,-4,-2},{1,16,4},{11,11,-4}}; - int[][] moons = {{-8,-10,0},{5,5,10},{2,-7,3},{9,-8,-3}}; + short[][] moons = {{-5,6,-11},{-8,-4,-2},{1,16,4},{11,11,-4}}; + //int[][] moons = {{-8,-10,0},{5,5,10},{2,-7,3},{9,-8,-3}}; //int[][] moons = {{-1,0,2},{2,-10,-7},{4,-8,8},{3,5,-1}}; - int[][] velocity = {{0,0,0},{0,0,0},{0,0,0},{0,0,0}}; + short[][] velocity = {{0,0,0},{0,0,0},{0,0,0},{0,0,0}}; public static void main(String[] args) throws IOException { new Day12().printParts(); @@ -45,7 +45,7 @@ public Object part1() throws IOException { } int[] res = new int[moons.length]; for(int i = 0; i moon2) { velocity[i][dim]--; velocity[j][dim]++; - //moons[j][dim]++; - //moons[i][dim]--; } } } @@ -79,30 +75,46 @@ public Object part2() throws IOException { moons[i][j]+=velocity[i][j]; } } + //System.out.println("Moons = "+Arrays.deepToString(moons)); - //List stuff = new ArrayList<>(); - //stuff.addAll(Arrays.stream(moons).flatMapToInt(e -> Arrays.stream(e)).boxed().collect(Collectors.toList())); - //stuff.addAll(Arrays.stream(velocity).flatMapToInt(e -> Arrays.stream(e)).boxed().collect(Collectors.toList())); - if(!set.add(new Numbers(new int[][][] {moons,velocity}))){ +// List stuff = new ArrayList<>(); +// stuff.addAll(Arrays.stream(moons).flatMapToInt(e -> Arrays.stream(e)).boxed().collect(Collectors.toList())); +// stuff.addAll(Arrays.stream(velocity).flatMapToInt(e -> Arrays.stream(e)).boxed().collect(Collectors.toList())); +// if(n == 65976L || n == 45167L) { +// System.out.println(Arrays.toString(stuff.toArray())); +// } +// +// if(!set2.add(stuff)) { +// System.out.println("Stuff is filled!"); +// } + if(!set.add(new Numbers(new short[][][] {copy(moons),copy(velocity)}))){ //System.out.println(Arrays.deepToString(new int[][][] {moons,velocity})); break; } if(n % 1000000 == 0) { - int minMoon = Arrays.stream(moons).flatMapToInt(e -> Arrays.stream(e)).min().getAsInt(); - int maxMoon = Arrays.stream(moons).flatMapToInt(e -> Arrays.stream(e)).max().getAsInt(); - int minVel = Arrays.stream(velocity).flatMapToInt(e -> Arrays.stream(e)).min().getAsInt(); - int maxVel = Arrays.stream(velocity).flatMapToInt(e -> Arrays.stream(e)).max().getAsInt(); - System.out.println(n+". Moon: "+minMoon+", "+maxMoon+", Vel: "+minVel+", "+maxVel); + System.out.println(n); + //int minMoon = Arrays.stream(moons).flatMapToInt(e -> Arrays.stream(e)).min().getAsInt(); + //int maxMoon = Arrays.stream(moons).flatMapToInt(e -> Arrays.stream(e)).max().getAsInt(); + //int minVel = Arrays.stream(velocity).flatMapToInt(e -> Arrays.stream(e)).min().getAsInt(); + //int maxVel = Arrays.stream(velocity).flatMapToInt(e -> Arrays.stream(e)).max().getAsInt(); + //System.out.println(n+". Moon: "+minMoon+", "+maxMoon+", Vel: "+minVel+", "+maxVel); } } return n; } + short[][] copy(short[][] arr){ + short [][] myInt = new short[arr.length][]; + for(int i = 0; i < arr.length; i++) + myInt[i] = arr[i].clone(); + return myInt; + } + class Numbers{ - int[][][] numbers; + short[][][] numbers; - public Numbers(int[][][] nums) { + public Numbers(short[][][] nums) { this.numbers=nums; } @@ -114,6 +126,7 @@ public int hashCode() { @Override public boolean equals(Object obj) { Numbers other = (Numbers) obj; +// System.out.println(iter+", "+other.iter); //System.out.println("Check deep equals "+toString()+" between "+other.toString()); return Arrays.deepEquals(numbers, other.numbers); } From 064e8460d774a16355e81b2decdb895c251aada4 Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 12 Dec 2019 08:22:38 +0100 Subject: [PATCH 061/433] Some trick to find cycles --- .../sbaars/adventofcode2019/days/Day12.java | 51 +++++++++++++------ 1 file changed, 35 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day12.java b/src/main/java/com/sbaars/adventofcode2019/days/Day12.java index 8fede31b..a14b3094 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day12.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day12.java @@ -3,6 +3,7 @@ import java.io.IOException; import java.util.Arrays; import java.util.HashSet; +import java.util.List; import java.util.Set; import com.sbaars.adventofcode2019.common.Day; @@ -52,9 +53,9 @@ public Object part1() throws IOException { @Override public Object part2() throws IOException { - Set set = new HashSet<>(); - long n; - for(n = 0; true; n++) { + final List>> sets = Arrays.asList(new HashSet>(), new HashSet>(), new HashSet>()); + long[] res = new long[sets.size()]; + for(long n = 0; true; n++) { for(int i = 0; i Arrays.stream(e)).min().getAsInt(); - //int maxMoon = Arrays.stream(moons).flatMapToInt(e -> Arrays.stream(e)).max().getAsInt(); - //int minVel = Arrays.stream(velocity).flatMapToInt(e -> Arrays.stream(e)).min().getAsInt(); - //int maxVel = Arrays.stream(velocity).flatMapToInt(e -> Arrays.stream(e)).max().getAsInt(); - //System.out.println(n+". Moon: "+minMoon+", "+maxMoon+", Vel: "+minVel+", "+maxVel); + for(int i = 0; i x == 0)) { + return lcm(res); + } + } } } - return n; } + private static long gcd(long a, long b) + { + while (b > 0) + { + long temp = b; + b = a % b; // % is remainder + a = temp; + } + return a; + } + + private static long lcm(long a, long b) + { + return a * (b / gcd(a, b)); + } + + private static long lcm(long[] input) + { + long result = input[0]; + for(int i = 1; i < input.length; i++) result = lcm(result, input[i]); + return result; + } + + short[][] copy(short[][] arr){ short [][] myInt = new short[arr.length][]; for(int i = 0; i < arr.length; i++) From 9aea55bd309c9d57869046ced50c77ff5d2c853a Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 12 Dec 2019 08:29:42 +0100 Subject: [PATCH 062/433] Refactor --- .../sbaars/adventofcode2019/days/Day12.java | 129 +++++------------- 1 file changed, 37 insertions(+), 92 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day12.java b/src/main/java/com/sbaars/adventofcode2019/days/Day12.java index a14b3094..50a92bbf 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day12.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day12.java @@ -2,18 +2,15 @@ import java.io.IOException; import java.util.Arrays; +import java.util.Collections; import java.util.HashSet; -import java.util.List; -import java.util.Set; import com.sbaars.adventofcode2019.common.Day; public class Day12 implements Day { - short[][] moons = {{-5,6,-11},{-8,-4,-2},{1,16,4},{11,11,-4}}; - //int[][] moons = {{-8,-10,0},{5,5,10},{2,-7,3},{9,-8,-3}}; - //int[][] moons = {{-1,0,2},{2,-10,-7},{4,-8,8},{3,5,-1}}; - short[][] velocity = {{0,0,0},{0,0,0},{0,0,0},{0,0,0}}; + int[][] moons = {{-5,6,-11},{-8,-4,-2},{1,16,4},{11,11,-4}}; + int[][] velocity = {{0,0,0},{0,0,0},{0,0,0},{0,0,0}}; public static void main(String[] args) throws IOException { new Day12().printParts(); @@ -22,72 +19,24 @@ public static void main(String[] args) throws IOException { @Override public Object part1() throws IOException { for(int n = 0; n<1000; n++) { - for(int i = 0; i moon2) { - velocity[i][dim]--; - velocity[j][dim]++; - } - } - } - } - //System.out.println("Res = "+Arrays.deepToString(velocity)); - for(int i = 0; i moon2) { + velocity[i][dim]--; + velocity[j][dim]++; + } + } + } + } + } - private static long gcd(long a, long b) - { + private static long gcd(long a, long b) { while (b > 0) { long temp = b; @@ -110,13 +83,11 @@ private static long gcd(long a, long b) return a; } - private static long lcm(long a, long b) - { + private static long lcm(long a, long b) { return a * (b / gcd(a, b)); } - private static long lcm(long[] input) - { + private static long lcm(long[] input) { long result = input[0]; for(int i = 1; i < input.length; i++) result = lcm(result, input[i]); return result; @@ -129,30 +100,4 @@ short[][] copy(short[][] arr){ myInt[i] = arr[i].clone(); return myInt; } - - class Numbers{ - short[][][] numbers; - - public Numbers(short[][][] nums) { - this.numbers=nums; - } - - @Override - public int hashCode() { - return Arrays.deepHashCode(numbers); - } - - @Override - public boolean equals(Object obj) { - Numbers other = (Numbers) obj; -// System.out.println(iter+", "+other.iter); - //System.out.println("Check deep equals "+toString()+" between "+other.toString()); - return Arrays.deepEquals(numbers, other.numbers); - } - - @Override - public String toString() { - return "Numbers [numbers=" + Arrays.deepToString(numbers) + "]"; - } - } } From ceec5c716bd9fb94ea21c1247156adc68db7d946 Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 12 Dec 2019 08:30:40 +0100 Subject: [PATCH 063/433] Add day 12 --- README.md | 1 + src/main/java/com/sbaars/adventofcode2019/Main.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e0516844..3e8c48ec 100644 --- a/README.md +++ b/README.md @@ -13,3 +13,4 @@ Days: - [Day 9](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day9.java) - [Day 10](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day10.java) - [Day 11](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day11.java) +- [Day 12](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day12.java) diff --git a/src/main/java/com/sbaars/adventofcode2019/Main.java b/src/main/java/com/sbaars/adventofcode2019/Main.java index df476862..3c5219a9 100644 --- a/src/main/java/com/sbaars/adventofcode2019/Main.java +++ b/src/main/java/com/sbaars/adventofcode2019/Main.java @@ -7,7 +7,7 @@ public class Main { public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException, InvocationTargetException, NoSuchMethodException { - for(int day = 1; day<=11; day++) { + for(int day = 1; day<=12; day++) { System.out.println("Day "+day+":"); Day instance = (Day)Class.forName("com.sbaars.adventofcode2019.days.Day"+day).getDeclaredConstructor().newInstance(); instance.printParts(); From a5f5bdca624abe0899b41025fba429186717c963 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 13 Dec 2019 06:48:40 +0100 Subject: [PATCH 064/433] Day 13 Part 1 and 2 --- .../sbaars/adventofcode2019/days/Day13.java | 85 +++++++++++++++++++ .../intcode/IntcodeComputer.java | 11 ++- src/main/resources/day13.txt | 1 + 3 files changed, 94 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode2019/days/Day13.java create mode 100644 src/main/resources/day13.txt diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day13.java b/src/main/java/com/sbaars/adventofcode2019/days/Day13.java new file mode 100644 index 00000000..8db6c6a4 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day13.java @@ -0,0 +1,85 @@ +package com.sbaars.adventofcode2019.days; + +import java.awt.Point; +import java.io.IOException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import java.util.stream.Collectors; + +import com.sbaars.adventofcode2019.common.Day; +import com.sbaars.adventofcode2019.intcode.IntcodeComputer; + +public class Day13 implements Day { + + public static void main(String[] args) throws IOException { + new Day13().printParts(); + } + + @Override + public Object part1() throws IOException { + IntcodeComputer cp = new IntcodeComputer(13); + Set n = new HashSet(); + while(true) { + int x = cp.runInt(); + if(x == IntcodeComputer.STOP_CODE) return n.size(); + int y = cp.runInt(); + if(y == IntcodeComputer.STOP_CODE) return n.size(); + int tile = cp.runInt(); + if(tile == IntcodeComputer.STOP_CODE) return n.size(); + if(tile == 2) + n.add(new Point(x,y)); + } + } + + @Override + public Object part2() throws IOException { + IntcodeComputer cp = new IntcodeComputer(13, 1); + cp.setElement(0, 2); + int[][] field = new int[21][38]; + int score = 0; + int n = 0; + int paddlePos = 0, ballPos = 0; + while(true) { + int x = cp.runInt(); + if(x == IntcodeComputer.STOP_CODE) + return score; + int y = cp.runInt(); + if(x == IntcodeComputer.STOP_CODE) + return score; + int tile = cp.runInt(); + if(x == IntcodeComputer.STOP_CODE) + return score; + if(x == -1) + score = tile; + else { + field[y][x] = tile; + System.out.println("Set "+y+", "+x+" to "+tile); + if(tile == 2) + n++; + else if (tile == 3) + paddlePos = x; + else if (tile == 4) { + ballPos = x; + Arrays.stream(field).map(e -> Arrays.stream(e).mapToObj(Integer::toString).map(f -> f.replace("4", "â–ˆ")).collect(Collectors.joining())).forEach(System.out::println); + } + } + if(ballPos>paddlePos) cp.setInput(1); + else if(ballPos Arrays.stream(e).mapToObj(Integer::toString).map(f -> f.replace("4", "â–ˆ")).collect(Collectors.joining())).forEach(System.out::println); + System.out.println("enter input"); + }*/ + } + } + + public class Tile{ + Point pos; + int element; + } +} diff --git a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java index 9523ec25..a1e45299 100644 --- a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java +++ b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java @@ -16,6 +16,7 @@ public class IntcodeComputer implements DoesFileOperations { private int lastInput; private long relativeBase = 0; private static final int[] DO_NOT_TRANSFORM_FINAL_ARGUMENT = {1, 2, 3, 7, 8}; + public static final int STOP_CODE = Integer.MIN_VALUE+1; public IntcodeComputer(int day, int...input) throws IOException { this.program = Arrays.stream(readDay(day).split(",")).mapToLong(Long::parseLong).toArray(); @@ -29,7 +30,7 @@ public IntcodeComputer(int day, int...input) throws IOException { public long run() { long result; - while((result = executeInstruction(Math.toIntExact(program[instructionCounter]))) == -1); + while((result = executeInstruction(Math.toIntExact(program[instructionCounter]))) == Integer.MIN_VALUE); return result; } @@ -90,10 +91,10 @@ private long executeInstruction(long[] args, int instruction) { case 7: program[Math.toIntExact(args[2])] = args[0] < args[1] ? 1 : 0; break; case 8: program[Math.toIntExact(args[2])] = args[0] == args[1] ? 1 : 0; break; case 9: relativeBase += Math.toIntExact(args[0]); break; - case 99: return -2; + case 99: return STOP_CODE; default: throw new IllegalStateException("Something went wrong!"); } - return -1; + return Integer.MIN_VALUE; } private long parseComplexInstruction(int instruction) { @@ -139,4 +140,8 @@ private int nParams(int instruction) { public int runInt() { return Math.toIntExact(run()); } + + public void setElement(int i, long j) { + program[i] = j; + } } diff --git a/src/main/resources/day13.txt b/src/main/resources/day13.txt new file mode 100644 index 00000000..a976d5d0 --- /dev/null +++ b/src/main/resources/day13.txt @@ -0,0 +1 @@ +1,380,379,385,1008,2235,768501,381,1005,381,12,99,109,2236,1102,0,1,383,1102,1,0,382,21002,382,1,1,20102,1,383,2,21102,1,37,0,1106,0,578,4,382,4,383,204,1,1001,382,1,382,1007,382,38,381,1005,381,22,1001,383,1,383,1007,383,21,381,1005,381,18,1006,385,69,99,104,-1,104,0,4,386,3,384,1007,384,0,381,1005,381,94,107,0,384,381,1005,381,108,1106,0,161,107,1,392,381,1006,381,161,1101,0,-1,384,1106,0,119,1007,392,36,381,1006,381,161,1101,0,1,384,20101,0,392,1,21102,1,19,2,21101,0,0,3,21102,138,1,0,1106,0,549,1,392,384,392,21002,392,1,1,21101,0,19,2,21101,3,0,3,21102,161,1,0,1106,0,549,1102,1,0,384,20001,388,390,1,21001,389,0,2,21101,180,0,0,1106,0,578,1206,1,213,1208,1,2,381,1006,381,205,20001,388,390,1,21001,389,0,2,21101,0,205,0,1106,0,393,1002,390,-1,390,1102,1,1,384,21002,388,1,1,20001,389,391,2,21101,0,228,0,1106,0,578,1206,1,261,1208,1,2,381,1006,381,253,21002,388,1,1,20001,389,391,2,21102,253,1,0,1106,0,393,1002,391,-1,391,1102,1,1,384,1005,384,161,20001,388,390,1,20001,389,391,2,21101,279,0,0,1105,1,578,1206,1,316,1208,1,2,381,1006,381,304,20001,388,390,1,20001,389,391,2,21101,0,304,0,1105,1,393,1002,390,-1,390,1002,391,-1,391,1102,1,1,384,1005,384,161,20102,1,388,1,20102,1,389,2,21101,0,0,3,21102,338,1,0,1105,1,549,1,388,390,388,1,389,391,389,21002,388,1,1,21002,389,1,2,21101,0,4,3,21101,0,365,0,1106,0,549,1007,389,20,381,1005,381,75,104,-1,104,0,104,0,99,0,1,0,0,0,0,0,0,320,17,16,1,1,19,109,3,21201,-2,0,1,22101,0,-1,2,21101,0,0,3,21102,414,1,0,1106,0,549,21202,-2,1,1,21201,-1,0,2,21102,1,429,0,1105,1,601,1201,1,0,435,1,386,0,386,104,-1,104,0,4,386,1001,387,-1,387,1005,387,451,99,109,-3,2106,0,0,109,8,22202,-7,-6,-3,22201,-3,-5,-3,21202,-4,64,-2,2207,-3,-2,381,1005,381,492,21202,-2,-1,-1,22201,-3,-1,-3,2207,-3,-2,381,1006,381,481,21202,-4,8,-2,2207,-3,-2,381,1005,381,518,21202,-2,-1,-1,22201,-3,-1,-3,2207,-3,-2,381,1006,381,507,2207,-3,-4,381,1005,381,540,21202,-4,-1,-1,22201,-3,-1,-3,2207,-3,-4,381,1006,381,529,22101,0,-3,-7,109,-8,2105,1,0,109,4,1202,-2,38,566,201,-3,566,566,101,639,566,566,1201,-1,0,0,204,-3,204,-2,204,-1,109,-4,2106,0,0,109,3,1202,-1,38,594,201,-2,594,594,101,639,594,594,20102,1,0,-2,109,-3,2106,0,0,109,3,22102,21,-2,1,22201,1,-1,1,21101,0,401,2,21102,1,733,3,21102,798,1,4,21102,1,630,0,1106,0,456,21201,1,1437,-2,109,-3,2105,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,2,2,2,2,2,2,2,2,2,2,2,0,2,0,2,2,2,0,2,2,2,2,2,2,0,2,2,0,2,2,2,2,2,2,0,1,1,0,2,2,0,2,0,2,2,2,2,0,2,2,2,2,2,0,2,0,2,2,0,2,2,2,2,0,0,2,2,2,0,2,0,2,0,1,1,0,0,2,2,2,0,0,2,0,2,2,0,2,2,2,2,0,0,2,0,2,2,2,2,2,2,2,0,2,0,2,2,2,0,2,0,1,1,0,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,0,0,2,0,2,0,2,2,0,2,2,0,2,2,2,2,2,0,2,0,1,1,0,2,0,2,2,0,2,2,2,2,2,2,2,2,2,2,0,0,0,2,2,2,0,2,0,2,2,0,0,2,2,0,2,2,2,0,1,1,0,2,2,2,2,0,2,0,0,2,2,2,0,2,2,2,0,2,0,2,0,0,2,2,2,0,2,2,2,0,0,2,0,2,2,0,1,1,0,0,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,0,2,0,2,2,2,0,2,2,2,0,0,1,1,0,2,2,0,2,0,0,2,2,2,0,0,0,2,0,2,2,2,0,2,2,0,2,2,2,2,2,2,2,0,0,0,2,0,0,0,1,1,0,0,2,2,0,0,2,2,2,2,0,2,2,2,0,0,2,0,2,2,0,2,2,2,2,2,2,2,2,2,0,0,0,2,2,0,1,1,0,2,0,0,2,2,2,2,2,2,2,0,2,0,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,0,0,2,0,1,1,0,2,2,0,2,2,2,0,2,2,0,2,0,2,0,0,0,0,2,2,2,2,2,2,2,2,2,2,0,0,2,2,0,2,2,0,1,1,0,2,2,0,2,2,2,2,2,0,2,0,2,2,2,2,2,0,0,2,2,2,2,0,2,2,0,2,2,2,2,0,2,0,2,0,1,1,0,2,2,0,2,0,2,2,2,2,2,2,0,2,2,2,2,2,2,0,2,2,0,2,2,2,0,2,2,2,2,2,2,2,2,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,25,47,80,47,44,8,60,70,40,60,9,9,88,82,66,91,81,11,3,95,72,53,39,7,33,48,69,45,31,75,6,61,77,72,25,57,70,2,92,78,46,43,88,74,45,27,94,73,90,43,68,90,22,64,2,5,3,40,98,62,25,95,74,1,35,2,1,54,76,68,88,75,30,77,35,40,43,49,85,55,53,12,77,94,89,9,55,8,50,82,7,89,21,85,37,48,4,33,1,28,97,62,95,41,14,22,52,24,72,2,25,51,32,55,36,73,84,22,66,69,36,1,57,97,50,21,98,41,36,59,56,6,80,46,2,86,14,67,77,59,77,5,13,97,98,83,83,42,10,62,64,86,97,17,90,37,27,54,40,39,61,38,11,67,40,65,13,6,85,71,9,93,69,9,28,48,7,93,67,95,90,15,29,90,88,8,75,64,36,42,29,92,24,28,19,4,19,60,16,1,97,43,50,13,10,82,30,19,86,32,93,46,32,66,94,91,44,39,57,51,48,41,92,17,97,16,92,41,92,58,31,94,82,68,25,10,32,98,24,77,17,5,82,30,16,40,82,67,14,16,33,3,96,72,90,83,97,4,55,69,8,30,29,2,47,8,47,52,41,2,14,67,7,57,14,4,94,44,47,9,81,54,91,50,85,41,84,45,65,33,66,28,35,98,89,92,57,81,49,89,89,39,11,8,97,77,12,30,33,77,12,46,64,37,2,84,34,11,54,23,33,57,40,27,95,47,3,17,8,43,15,13,13,41,80,62,93,68,45,82,86,17,44,49,51,29,9,92,67,14,81,16,97,5,65,6,85,46,35,19,50,88,51,23,90,35,44,74,33,36,13,20,44,42,71,51,32,60,22,29,13,26,1,64,26,75,86,43,78,4,43,41,52,67,16,20,63,37,60,2,1,53,37,75,55,3,40,66,36,1,69,18,55,33,81,38,1,81,24,80,31,25,79,30,84,83,71,72,11,94,62,6,35,15,9,63,29,27,76,33,62,77,47,12,61,84,13,38,73,11,32,49,87,6,25,57,87,4,35,91,67,19,30,72,59,79,46,64,66,14,21,15,85,25,22,45,87,96,90,28,83,72,29,71,58,14,50,71,48,19,50,78,63,65,3,41,64,82,50,64,74,77,93,21,52,55,24,34,19,61,19,13,44,80,38,53,36,41,96,17,77,9,84,87,79,51,77,35,5,55,82,23,63,20,66,68,23,92,81,10,2,57,97,4,24,44,28,25,56,4,22,61,11,35,60,75,63,96,60,94,3,65,93,63,28,54,21,10,20,12,46,15,84,93,43,83,71,90,52,48,33,47,32,75,22,22,38,8,62,42,30,95,66,15,75,14,73,17,10,94,64,70,29,51,70,14,68,56,60,57,9,84,16,77,37,17,44,37,22,88,60,85,59,61,52,3,21,15,19,23,90,33,47,36,48,44,30,33,16,22,37,93,78,16,43,18,65,18,61,67,71,51,13,33,7,48,40,70,9,66,12,59,49,67,34,23,51,75,48,23,30,47,23,81,21,42,6,66,34,4,67,45,21,90,34,48,47,43,11,3,54,9,10,35,60,78,19,17,68,1,9,26,92,7,86,66,13,12,31,12,71,55,43,78,39,54,70,62,38,93,25,89,83,37,37,2,60,87,84,48,98,43,1,78,86,97,67,41,85,66,17,23,32,9,35,91,4,18,89,71,4,88,66,50,32,92,9,44,10,23,31,17,53,36,46,94,33,93,68,44,85,73,72,14,34,69,66,77,43,93,23,24,14,17,79,27,63,7,44,95,66,55,83,8,90,58,43,768501 \ No newline at end of file From b0b2376022725f0811ce456ee19e3bad1ab83de2 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 13 Dec 2019 06:56:17 +0100 Subject: [PATCH 065/433] Refactor day 13 --- .../sbaars/adventofcode2019/days/Day13.java | 61 +++++++------------ 1 file changed, 23 insertions(+), 38 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day13.java b/src/main/java/com/sbaars/adventofcode2019/days/Day13.java index 8db6c6a4..d3b4fea7 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day13.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day13.java @@ -2,10 +2,9 @@ import java.awt.Point; import java.io.IOException; -import java.util.Arrays; import java.util.HashSet; import java.util.Set; -import java.util.stream.Collectors; +import java.util.concurrent.atomic.AtomicInteger; import com.sbaars.adventofcode2019.common.Day; import com.sbaars.adventofcode2019.intcode.IntcodeComputer; @@ -24,9 +23,7 @@ public Object part1() throws IOException { int x = cp.runInt(); if(x == IntcodeComputer.STOP_CODE) return n.size(); int y = cp.runInt(); - if(y == IntcodeComputer.STOP_CODE) return n.size(); int tile = cp.runInt(); - if(tile == IntcodeComputer.STOP_CODE) return n.size(); if(tile == 2) n.add(new Point(x,y)); } @@ -38,48 +35,36 @@ public Object part2() throws IOException { cp.setElement(0, 2); int[][] field = new int[21][38]; int score = 0; - int n = 0; - int paddlePos = 0, ballPos = 0; + AtomicInteger paddlePos = new AtomicInteger(), ballPos = new AtomicInteger(); while(true) { int x = cp.runInt(); if(x == IntcodeComputer.STOP_CODE) return score; int y = cp.runInt(); - if(x == IntcodeComputer.STOP_CODE) - return score; int tile = cp.runInt(); - if(x == IntcodeComputer.STOP_CODE) - return score; - if(x == -1) - score = tile; - else { - field[y][x] = tile; - System.out.println("Set "+y+", "+x+" to "+tile); - if(tile == 2) - n++; - else if (tile == 3) - paddlePos = x; - else if (tile == 4) { - ballPos = x; - Arrays.stream(field).map(e -> Arrays.stream(e).mapToObj(Integer::toString).map(f -> f.replace("4", "â–ˆ")).collect(Collectors.joining())).forEach(System.out::println); - } + score = simulateField(cp, field, score, paddlePos, ballPos, x, y, tile); + } + } + + private int simulateField(IntcodeComputer cp, int[][] field, int score, AtomicInteger paddlePos, AtomicInteger ballPos, int x, int y, int tile) { + if(x == -1) + return tile; + else { + field[y][x] = tile; + if (tile == 3) { + paddlePos.set(x);; + } else if (tile == 4) { + ballPos.set(x); + cp.setInput(provideInput(paddlePos, ballPos)); } - if(ballPos>paddlePos) cp.setInput(1); - else if(ballPos Arrays.stream(e).mapToObj(Integer::toString).map(f -> f.replace("4", "â–ˆ")).collect(Collectors.joining())).forEach(System.out::println); - System.out.println("enter input"); - }*/ } + return score; } - - public class Tile{ - Point pos; - int element; + + private int provideInput(AtomicInteger paddlePos, AtomicInteger ballPos) { + int ball = ballPos.get(), paddle = paddlePos.get(); + if(ball>paddle) return 1; + else if(ball Date: Fri, 13 Dec 2019 07:02:55 +0100 Subject: [PATCH 066/433] Finishing up for today --- README.md | 56 +++++++++++++++++++ .../com/sbaars/adventofcode2019/Main.java | 2 +- .../sbaars/adventofcode2019/days/Day11.java | 4 +- .../sbaars/adventofcode2019/days/Day7.java | 2 +- src/main/resources/day4.txt | 1 + .../sbaars/adventofcode2019/IntcodeTest.java | 12 ++++ 6 files changed, 72 insertions(+), 5 deletions(-) create mode 100644 src/main/resources/day4.txt diff --git a/README.md b/README.md index 3e8c48ec..23e30683 100644 --- a/README.md +++ b/README.md @@ -14,3 +14,59 @@ Days: - [Day 10](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day10.java) - [Day 11](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day11.java) - [Day 12](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day12.java) +- [Day 13](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day13.java) + +Output of running [Main.java](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/Main.java): +``` +Day 1: +Part 1: 3514064 +Part 2: 5268207 + +Day 2: +Part 1: 8017076 +Part 2: 3146 + +Day 3: +Part 1: 303 +Part 2: 11222 + +Day 4: +Part 1: 481 +Part 2: 299 + +Day 5: +Part 1: 11049715 +Part 2: 2140710 + +Day 6: +Part 1: 186597 +Part 2: 412 + +Day 7: +Part 1: 116680 +Part 2: 89603079 + +Day 8: +Part 1: 1360 +Part 2: FPUAR + +Day 9: +Part 1: 2518058886 +Part 2: 44292 + +Day 10: +Part 1: 299 +Part 2: 1419 + +Day 11: +Part 1: 2172 +Part 2: JELEFGHP + +Day 12: +Part 1: 13399 +Part 2: 312992287193064 + +Day 13: +Part 1: 320 +Part 2: 15156 +``` \ No newline at end of file diff --git a/src/main/java/com/sbaars/adventofcode2019/Main.java b/src/main/java/com/sbaars/adventofcode2019/Main.java index 3c5219a9..59227840 100644 --- a/src/main/java/com/sbaars/adventofcode2019/Main.java +++ b/src/main/java/com/sbaars/adventofcode2019/Main.java @@ -7,7 +7,7 @@ public class Main { public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException, InvocationTargetException, NoSuchMethodException { - for(int day = 1; day<=12; day++) { + for(int day = 1; day<=13; day++) { System.out.println("Day "+day+":"); Day instance = (Day)Class.forName("com.sbaars.adventofcode2019.days.Day"+day).getDeclaredConstructor().newInstance(); instance.printParts(); diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day11.java b/src/main/java/com/sbaars/adventofcode2019/days/Day11.java index 3b49d2a6..d5a12a94 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day11.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day11.java @@ -34,11 +34,9 @@ private Object robotWalk(boolean startWhite) throws IOException { while(true) { c.setInput(whitePlaces.contains(currentLocation) ? 1 : 0); int paintColor = c.runInt(); - if(paintColor == -2) + if(paintColor == IntcodeComputer.STOP_CODE) break; int turn = c.runInt(); - if(turn == -2) - break; paintedOnce.add(currentLocation); if(paintColor == 1) { whitePlaces.add(currentLocation); diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day7.java b/src/main/java/com/sbaars/adventofcode2019/days/Day7.java index 530975e3..a1af8316 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day7.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day7.java @@ -41,7 +41,7 @@ public Object part2() throws IOException { c.addInput(lastVal); int thruster = lastVal; lastVal = c.runInt(); - if(lastVal == -2) { + if(lastVal == IntcodeComputer.STOP_CODE) { results.add(thruster); continue perms; } diff --git a/src/main/resources/day4.txt b/src/main/resources/day4.txt new file mode 100644 index 00000000..4ef936f1 --- /dev/null +++ b/src/main/resources/day4.txt @@ -0,0 +1 @@ +372037-905157 \ No newline at end of file diff --git a/src/test/java/com/sbaars/adventofcode2019/IntcodeTest.java b/src/test/java/com/sbaars/adventofcode2019/IntcodeTest.java index 04ad01b3..6199e99a 100644 --- a/src/test/java/com/sbaars/adventofcode2019/IntcodeTest.java +++ b/src/test/java/com/sbaars/adventofcode2019/IntcodeTest.java @@ -2,6 +2,8 @@ import java.io.IOException; +import com.sbaars.adventofcode2019.days.Day11; +import com.sbaars.adventofcode2019.days.Day13; import com.sbaars.adventofcode2019.days.Day2; import com.sbaars.adventofcode2019.days.Day5; import com.sbaars.adventofcode2019.days.Day7; @@ -30,4 +32,14 @@ public void testDay9() throws IOException { Assert.assertEquals(2518058886L, new Day9().part1()); Assert.assertEquals(44292L, new Day9().part2()); } + + public void testDay11() throws IOException { + Assert.assertEquals(2172, new Day11().part1()); + Assert.assertEquals("JELEFGHP", new Day11().part2()); + } + + public void testDay13() throws IOException { + Assert.assertEquals(320, new Day13().part1()); + Assert.assertEquals(15156, new Day13().part2()); + } } From fc5baa9db63ed2f2e329e91e54f7eb27b81217be Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 13 Dec 2019 07:05:03 +0100 Subject: [PATCH 067/433] Fixed a failing test --- src/test/java/com/sbaars/adventofcode2019/IntcodeTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/sbaars/adventofcode2019/IntcodeTest.java b/src/test/java/com/sbaars/adventofcode2019/IntcodeTest.java index 6199e99a..5e91b170 100644 --- a/src/test/java/com/sbaars/adventofcode2019/IntcodeTest.java +++ b/src/test/java/com/sbaars/adventofcode2019/IntcodeTest.java @@ -35,7 +35,7 @@ public void testDay9() throws IOException { public void testDay11() throws IOException { Assert.assertEquals(2172, new Day11().part1()); - Assert.assertEquals("JELEFGHP", new Day11().part2()); + Assert.assertEquals("JELEFGHP", new Day11().part2().toString()); } public void testDay13() throws IOException { From dde43011d9abf72272adaf660f3b2ca5cadd3970 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 14 Dec 2019 06:57:48 +0100 Subject: [PATCH 068/433] Day 14 part 1 --- .../sbaars/adventofcode2019/days/Day14.java | 91 +++++++++++++++++++ src/main/resources/day14.txt | 60 ++++++++++++ src/main/resources/day15.txt | 9 ++ 3 files changed, 160 insertions(+) create mode 100644 src/main/java/com/sbaars/adventofcode2019/days/Day14.java create mode 100644 src/main/resources/day14.txt create mode 100644 src/main/resources/day15.txt diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day14.java b/src/main/java/com/sbaars/adventofcode2019/days/Day14.java new file mode 100644 index 00000000..20b82189 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day14.java @@ -0,0 +1,91 @@ +package com.sbaars.adventofcode2019.days; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Map.Entry; + +import com.sbaars.adventofcode2019.common.Day; +import com.sbaars.adventofcode2019.util.CountMap; + +public class Day14 implements Day { + public static void main(String[] args) throws IOException { + new Day14().printParts(); + } + + @Override + public Object part1() throws IOException { + Trade[] trades = Arrays.stream(readDay(15).split(System.lineSeparator())).map(Trade::new).toArray(Trade[]::new); + CountMap items = new CountMap<>(); + for(int i = 13311; i<15000; i++) { + System.out.println("We now have "+i+" ORE"); + items.put("ORE", i); + if(i == 14000) { + System.out.println("Hi"); + } + if(canMakeFuel(trades, items)) { + return i; + } + } + return 0; + } + + private boolean canMakeFuel(Trade[] trades, CountMap items) { + //System.out.println(items); + //System.out.println("----"); + for(Trade trade : trades) { + CountMap newItems = new CountMap<>(items); + if(trade.perform(newItems)) { + if(trade.output.item.equals("FUEL")) { + return true; + } + if(canMakeFuel(trades, newItems)) + return true; + } + } + return false; + } + + @Override + public Object part2() throws IOException { + return 0; + } + + class Trade { + CountMap input = new CountMap<>(); + Item output; + + public Trade(String trade) { + String[] inputOutput = trade.split(" => "); + Arrays.stream(inputOutput[0].split(", ")).map(Item::new).forEach(e -> input.increment(e.item, e.amount)); + output = new Item(inputOutput[1]); + } + + public boolean perform(CountMap items) { + for(Entry item : input.entrySet()) { + if(!items.containsKey(item.getKey()) || items.get(item.getKey()) < item.getValue()) + return false; + else { + items.increment(item.getKey(), -item.getValue()); + } + } + items.increment(output.item, output.amount); + return true; + } + } + + class Item { + int amount; + String item; + + public Item(String item) { + String[] i = item.split(" "); + amount = Integer.parseInt(i[0]); + this.item = i[1]; + } + + public Item(int i, String string) { + amount = i; + item = string; + } + } +} diff --git a/src/main/resources/day14.txt b/src/main/resources/day14.txt new file mode 100644 index 00000000..46da9f07 --- /dev/null +++ b/src/main/resources/day14.txt @@ -0,0 +1,60 @@ +11 BNMWF, 1 MRVFT, 10 PBNSF => 7 XSFVQ +149 ORE => 4 SMSB +1 XHQDX, 1 SVSTJ, 2 LDHX => 7 JMWQG +12 MJCLX => 9 PBNSF +132 ORE => 7 XPTXL +15 TZMWG, 1 LDHX, 1 PDVR => 7 LBQB +1 HJTD, 8 VFXHC => 2 SVSTJ +5 LBHQ, 6 MTQCB => 4 MHBZ +1 PRXT, 1 FWZN => 2 PBMPL +1 XPTXL => 1 HMRGM +10 XHPHR => 6 NSVJL +3 QZQLZ, 3 MTQCB => 4 TZMWG +5 LBHQ, 2 VPSDV => 3 ZFCD +13 WPFP => 6 ZXMGK +10 MHJMX, 75 LDHX, 52 JMWQG, 4 QWRB, 1 SVNVJ, 17 BNMWF, 18 GHVN => 1 FUEL +4 PFQRG, 14 XVNL => 5 PDCV +11 JMWQG, 10 ZBNCP => 6 NTJZH +14 PBMPL, 12 PRXT, 9 MJQS => 9 XVNL +9 GDNG, 13 LBQB => 9 QWRB +1 CXNM => 6 PFQRG +9 NTJZH, 7 BNMWF, 11 JCHP, 1 MHBZ, 1 SVSTJ, 9 XRDN => 5 SVNVJ +1 XHPHR, 1 GSMP => 4 THRVR +26 FWZN => 4 WPFP +35 VJTFJ, 2 XSFVQ, 6 HJVN, 1 NSVJL, 1 JCHP, 3 MJCLX, 1 QZNCK => 6 GHVN +1 WPFP, 3 XHPHR => 2 HJVN +5 SMSB => 7 HNCDS +111 ORE => 4 GSMP +6 LBHQ => 8 GDNG +2 GDNG, 5 MHBZ => 1 RNMKC +15 THRVR, 4 NWNSH, 1 NSVJL => 7 FDVH +2 HMRGM => 9 FWZN +6 MJQS, 5 JRZXM => 5 NWNSH +14 ZXMGK, 1 JTXWX => 6 DLWT +1 MJQS, 3 FWZN, 2 PRXT => 1 JTXWX +1 GSMP, 4 CXNM => 3 JRZXM +151 ORE => 9 ZNPRL +2 NTJZH, 1 DLWT, 3 ZBNCP => 9 MRVFT +14 SWZCB, 1 VPSDV => 7 XRDN +14 LBHQ, 16 FDVH, 9 PFQRG => 4 PRXT +22 CXNM => 9 HJTD +1 VFXHC, 1 MTQCB => 6 QZQLZ +6 SWZCB, 2 PDCV, 17 RNMKC => 9 LTHFW +4 ZNPRL => 6 CXNM +2 CXNM => 3 LBHQ +8 MHBZ, 2 QZQLZ, 2 LBQB => 3 VJTFJ +3 ZFCD => 1 XHQDX +1 VJTFJ, 7 MHBZ => 8 ZBNCP +5 CXNM => 2 VPSDV +7 MJQS => 9 VFXHC +2 LTHFW, 11 HJVN, 4 XRDN, 8 MRVFT, 3 NSVJL, 3 SVSTJ, 5 XSFVQ, 13 RNMKC => 8 MHJMX +2 HMRGM => 3 XHPHR +1 GDNG, 19 PDVR => 3 SWZCB +18 HMRGM, 10 HNCDS => 2 MJQS +6 HNCDS, 2 HMRGM, 1 LBHQ => 3 MTQCB +16 VJTFJ, 1 WPFP, 6 JMWQG => 6 BNMWF +3 TZMWG, 1 FWZN => 7 PDVR +10 ZXMGK => 4 QZNCK +32 LBQB, 1 ZBNCP => 1 JCHP +27 PDVR, 7 QZQLZ, 7 PBMPL => 3 MJCLX +5 MHBZ, 12 ZFCD => 4 LDHX \ No newline at end of file diff --git a/src/main/resources/day15.txt b/src/main/resources/day15.txt new file mode 100644 index 00000000..fe064792 --- /dev/null +++ b/src/main/resources/day15.txt @@ -0,0 +1,9 @@ +157 ORE => 5 NZVS +165 ORE => 6 DCFZ +44 XJWVT, 5 KHKGT, 1 QDVJ, 29 NZVS, 9 GPVTF, 48 HKGWZ => 1 FUEL +12 HKGWZ, 1 GPVTF, 8 PSHF => 9 QDVJ +179 ORE => 7 PSHF +177 ORE => 5 HKGWZ +7 DCFZ, 7 PSHF => 2 XJWVT +165 ORE => 2 GPVTF +3 DCFZ, 7 NZVS, 5 HKGWZ, 10 PSHF => 8 KHKGT \ No newline at end of file From 2f1fc483e426440d79dc6f66361285500d3f396e Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 14 Dec 2019 07:53:04 +0100 Subject: [PATCH 069/433] Part 1 different approach --- .../sbaars/adventofcode2019/days/Day14.java | 31 ++++++++++++++++--- .../adventofcode2019/util/CountMap.java | 6 ++++ 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day14.java b/src/main/java/com/sbaars/adventofcode2019/days/Day14.java index 20b82189..67a3153d 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day14.java @@ -15,7 +15,9 @@ public static void main(String[] args) throws IOException { @Override public Object part1() throws IOException { Trade[] trades = Arrays.stream(readDay(15).split(System.lineSeparator())).map(Trade::new).toArray(Trade[]::new); - CountMap items = new CountMap<>(); + return findCost(trades, getTrade(trades, "FUEL"), 1); + //return Arrays.stream(trades).map(e -> e.output.item).distinct().count(); + /*CountMap items = new CountMap<>(); for(int i = 13311; i<15000; i++) { System.out.println("We now have "+i+" ORE"); items.put("ORE", i); @@ -26,13 +28,34 @@ public Object part1() throws IOException { return i; } } - return 0; + return 0;*/ + } + + private Trade getTrade(Trade[] trades, String key) { + return Arrays.stream(trades).filter(e -> e.output.item.equals(key)).findAny().get(); } + private int findCost(Trade[] trades, Trade fuelTrade, int nNeeded) { + int timesApplied = (int)Math.ceil((double)nNeeded/(double)fuelTrade.output.amount); + int totalCost = 0; + for(Entry cost : fuelTrade.input.entrySet()) { + if(cost.getKey().equals("ORE")) { + totalCost+=cost.getValue(); + } else { + totalCost+=findCost(trades, getTrade(trades, cost.getKey()), cost.getValue()); + } + } + System.out.println(fuelTrade.output.item+" costs "+totalCost+" times "+timesApplied+" needed "+nNeeded); + return totalCost * timesApplied; + } + private boolean canMakeFuel(Trade[] trades, CountMap items) { //System.out.println(items); //System.out.println("----"); - for(Trade trade : trades) { + //Trade fuelTrade = Arrays.stream(trades).filter(e -> e.output.item.equals("FUEL")).findAny().get(); + //findCost + + /*for(Trade trade : trades) { CountMap newItems = new CountMap<>(items); if(trade.perform(newItems)) { if(trade.output.item.equals("FUEL")) { @@ -41,7 +64,7 @@ private boolean canMakeFuel(Trade[] trades, CountMap items) { if(canMakeFuel(trades, newItems)) return true; } - } + }*/ return false; } diff --git a/src/main/java/com/sbaars/adventofcode2019/util/CountMap.java b/src/main/java/com/sbaars/adventofcode2019/util/CountMap.java index 7b822c09..5eb6543b 100644 --- a/src/main/java/com/sbaars/adventofcode2019/util/CountMap.java +++ b/src/main/java/com/sbaars/adventofcode2019/util/CountMap.java @@ -49,4 +49,10 @@ public String toString() { public void addAll(CountMap amountPerCloneClassSize) { amountPerCloneClassSize.entrySet().stream().forEach(e -> this.increment(e.getKey(), e.getValue())); } + + public void incrementAll(CountMap input) { + for(Entry i : input.entrySet()) { + increment(i.getKey(), i.getValue()); + } + } } From e145e108810f396f7fadb1c1cd88e9ac81a44b41 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 14 Dec 2019 09:19:18 +0100 Subject: [PATCH 070/433] Skip on leftover --- .../sbaars/adventofcode2019/days/Day14.java | 84 +++++++++---------- src/main/resources/day16.txt | 12 +++ 2 files changed, 52 insertions(+), 44 deletions(-) create mode 100644 src/main/resources/day16.txt diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day14.java b/src/main/java/com/sbaars/adventofcode2019/days/Day14.java index 67a3153d..6ed2f311 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day14.java @@ -2,7 +2,6 @@ import java.io.IOException; import java.util.Arrays; -import java.util.Map.Entry; import com.sbaars.adventofcode2019.common.Day; import com.sbaars.adventofcode2019.util.CountMap; @@ -15,7 +14,9 @@ public static void main(String[] args) throws IOException { @Override public Object part1() throws IOException { Trade[] trades = Arrays.stream(readDay(15).split(System.lineSeparator())).map(Trade::new).toArray(Trade[]::new); - return findCost(trades, getTrade(trades, "FUEL"), 1); + int cost = findCost(trades, new Item(1, "FUEL"), new CountMap<>()); + System.out.println(created); + return cost; //return Arrays.stream(trades).map(e -> e.output.item).distinct().count(); /*CountMap items = new CountMap<>(); for(int i = 13311; i<15000; i++) { @@ -35,37 +36,34 @@ private Trade getTrade(Trade[] trades, String key) { return Arrays.stream(trades).filter(e -> e.output.item.equals(key)).findAny().get(); } - private int findCost(Trade[] trades, Trade fuelTrade, int nNeeded) { - int timesApplied = (int)Math.ceil((double)nNeeded/(double)fuelTrade.output.amount); - int totalCost = 0; - for(Entry cost : fuelTrade.input.entrySet()) { - if(cost.getKey().equals("ORE")) { - totalCost+=cost.getValue(); - } else { - totalCost+=findCost(trades, getTrade(trades, cost.getKey()), cost.getValue()); - } - } - System.out.println(fuelTrade.output.item+" costs "+totalCost+" times "+timesApplied+" needed "+nNeeded); - return totalCost * timesApplied; - } - - private boolean canMakeFuel(Trade[] trades, CountMap items) { - //System.out.println(items); - //System.out.println("----"); - //Trade fuelTrade = Arrays.stream(trades).filter(e -> e.output.item.equals("FUEL")).findAny().get(); - //findCost + CountMap created = new CountMap<>(); + private int findCost(Trade[] trades, Item buyingItem, CountMap leftOver) { + Trade fuelTrade = getTrade(trades, buyingItem.item); + int timesApplied = (int)Math.ceil((double)buyingItem.amount/(double)fuelTrade.output.amount); + leftOver.increment(fuelTrade.output.item, buyingItem.amount % fuelTrade.output.amount); - /*for(Trade trade : trades) { - CountMap newItems = new CountMap<>(items); - if(trade.perform(newItems)) { - if(trade.output.item.equals("FUEL")) { - return true; + //System.out.println(fuelTrade.output.item+" nLeftOver "+leftOver.get(fuelTrade.output.item)); + int totalCost = 0; + for(int i = 0; i= cost.amount) { + leftOver.increment(fuelTrade.output.item, -fuelTrade.output.amount); + //skip = fuelTrade.output.item; + System.out.println("Enough "+fuelTrade.output.item+" LEFTOVER!"); + continue; + } + if(cost.item.equals("ORE")) { + totalCost+=cost.amount; + System.out.println("Spend "+cost.amount+" ORE to get "+fuelTrade.output.amount+" "+fuelTrade.output.item); + } else { + totalCost+=findCost(trades, new Item(cost.amount, cost.item), leftOver); } - if(canMakeFuel(trades, newItems)) - return true; } - }*/ - return false; + created.increment(buyingItem.item, fuelTrade.output.amount); + } + System.out.println("Bought "+(timesApplied*fuelTrade.output.amount)+" "+buyingItem.item+" for "+totalCost); + //System.out.println(fuelTrade.output.item+" costs "+totalCost+" times "+timesApplied); + return totalCost; } @Override @@ -74,25 +72,18 @@ public Object part2() throws IOException { } class Trade { - CountMap input = new CountMap<>(); - Item output; + final Item[] input; + final Item output; public Trade(String trade) { String[] inputOutput = trade.split(" => "); - Arrays.stream(inputOutput[0].split(", ")).map(Item::new).forEach(e -> input.increment(e.item, e.amount)); + input = Arrays.stream(inputOutput[0].split(", ")).map(Item::new).toArray(Item[]::new); output = new Item(inputOutput[1]); } - - public boolean perform(CountMap items) { - for(Entry item : input.entrySet()) { - if(!items.containsKey(item.getKey()) || items.get(item.getKey()) < item.getValue()) - return false; - else { - items.increment(item.getKey(), -item.getValue()); - } - } - items.increment(output.item, output.amount); - return true; + + @Override + public String toString() { + return "Trade [input=" + Arrays.toString(input) + ", output=" + output + "]"; } } @@ -110,5 +101,10 @@ public Item(int i, String string) { amount = i; item = string; } + + @Override + public String toString() { + return "Item [amount=" + amount + ", item=" + item + "]"; + } } } diff --git a/src/main/resources/day16.txt b/src/main/resources/day16.txt new file mode 100644 index 00000000..7c1333b1 --- /dev/null +++ b/src/main/resources/day16.txt @@ -0,0 +1,12 @@ +2 VPVL, 7 FWMGM, 2 CXFTF, 11 MNCFX => 1 STKFG +17 NVRVD, 3 JNWZP => 8 VPVL +53 STKFG, 6 MNCFX, 46 VJHF, 81 HVMC, 68 CXFTF, 25 GNMV => 1 FUEL +22 VJHF, 37 MNCFX => 5 FWMGM +139 ORE => 4 NVRVD +144 ORE => 7 JNWZP +5 MNCFX, 7 RFSQX, 2 FWMGM, 2 VPVL, 19 CXFTF => 3 HVMC +5 VJHF, 7 MNCFX, 9 VPVL, 37 CXFTF => 6 GNMV +145 ORE => 6 MNCFX +1 NVRVD => 8 CXFTF +1 VJHF, 6 MNCFX => 4 RFSQX +176 ORE => 6 VJHF \ No newline at end of file From 6cdd2be649f17cbbb08ea7512e1fa033b4bd2434 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 14 Dec 2019 10:43:08 +0100 Subject: [PATCH 071/433] Okay --- .../sbaars/adventofcode2019/days/Day14.java | 66 ++++++++++++++----- src/main/resources/day17.txt | 7 ++ 2 files changed, 56 insertions(+), 17 deletions(-) create mode 100644 src/main/resources/day17.txt diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day14.java b/src/main/java/com/sbaars/adventofcode2019/days/Day14.java index 6ed2f311..5bb048a7 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day14.java @@ -38,33 +38,65 @@ private Trade getTrade(Trade[] trades, String key) { CountMap created = new CountMap<>(); private int findCost(Trade[] trades, Item buyingItem, CountMap leftOver) { + if(buyingItem.item.equals("ORE")) + return buyingItem.amount; Trade fuelTrade = getTrade(trades, buyingItem.item); int timesApplied = (int)Math.ceil((double)buyingItem.amount/(double)fuelTrade.output.amount); - leftOver.increment(fuelTrade.output.item, buyingItem.amount % fuelTrade.output.amount); - //System.out.println(fuelTrade.output.item+" nLeftOver "+leftOver.get(fuelTrade.output.item)); + System.out.println("Buy "+timesApplied+"x"+fuelTrade.output.amount+" "+buyingItem.item); + + /*if(leftOver.get(fuelTrade.output.item) >= fuelTrade.output.amount) { + System.out.println("Leftover "+fuelTrade.output.item+" = "+leftOver.get(fuelTrade.output.item)+" for trade "+fuelTrade); + leftOver.increment(fuelTrade.output.item, -fuelTrade.output.amount); + System.out.println("Leftover "+fuelTrade.output.item+" = "+leftOver.get(fuelTrade.output.item)+" for trade "+fuelTrade); + //skip = fuelTrade.output.item; + //System.out.println("Enough "+fuelTrade.output.item+" !"); + timesApplied--; + //return 0; //You have this material, so you get it for free :) + }*/ + //leftOver.increment(fuelTrade.output.item, buyingItem.amount % fuelTrade.output.amount); + int totalCost = 0; - for(int i = 0; i= cost.amount) { - leftOver.increment(fuelTrade.output.item, -fuelTrade.output.amount); - //skip = fuelTrade.output.item; - System.out.println("Enough "+fuelTrade.output.item+" LEFTOVER!"); - continue; - } - if(cost.item.equals("ORE")) { - totalCost+=cost.amount; - System.out.println("Spend "+cost.amount+" ORE to get "+fuelTrade.output.amount+" "+fuelTrade.output.item); - } else { - totalCost+=findCost(trades, new Item(cost.amount, cost.item), leftOver); - } - } + for(int i = 0; i= fuelTrade.output.amount) { + System.out.println("Leftover "+fuelTrade.output.item+" = "+leftOver.get(fuelTrade.output.item)+" for trade "+fuelTrade); + leftOver.increment(fuelTrade.output.item, -fuelTrade.output.amount); + System.out.println("Leftover "+fuelTrade.output.item+" = "+leftOver.get(fuelTrade.output.item)+" for trade "+fuelTrade); + //skip = fuelTrade.output.item; + System.out.println("Enough "+fuelTrade.output.item+" LEFTOVER!"); + continue; + }*/ + totalCost = applyTrade(trades, fuelTrade, totalCost, leftOver); created.increment(buyingItem.item, fuelTrade.output.amount); } + + leftOver.increment(buyingItem.item, buyingItem.amount % fuelTrade.output.amount); + System.out.println(fuelTrade.output.item+" nLeftOver "+leftOver.get(fuelTrade.output.item)); System.out.println("Bought "+(timesApplied*fuelTrade.output.amount)+" "+buyingItem.item+" for "+totalCost); //System.out.println(fuelTrade.output.item+" costs "+totalCost+" times "+timesApplied); return totalCost; } + + private int applyTrade(Trade[] trades, Trade fuelTrade, int totalCost, CountMap leftOver) { + for(Item cost : fuelTrade.input) { + /*if(leftOver.get(cost.item) >= cost.amount) { + //System.out.println("Leftover "+fuelTrade.output.item+" = "+leftOver.get(fuelTrade.output.item)+" for trade "+fuelTrade); + leftOver.increment(cost.item, -cost.amount); + //System.out.println("Leftover "+fuelTrade.output.item+" = "+leftOver.get(fuelTrade.output.item)+" for trade "+fuelTrade); + //skip = fuelTrade.output.item; + //System.out.println("Enough "+fuelTrade.output.item+" !"); + continue; //You have this material, so you get it for free :) + }*/ + if(cost.item.equals("ORE")) { + totalCost+=cost.amount; + System.out.println("Spend "+cost.amount+" ORE to get "+fuelTrade.output.amount+" "+fuelTrade.output.item+" in trade "+fuelTrade); + } else { + totalCost+=findCost(trades, new Item(cost.amount, cost.item), leftOver); + //leftOver.increment(fuelTrade.output.item, cost.amount % fuelTrade.output.amount); + } + } + return totalCost; + } @Override public Object part2() throws IOException { diff --git a/src/main/resources/day17.txt b/src/main/resources/day17.txt new file mode 100644 index 00000000..80a5907e --- /dev/null +++ b/src/main/resources/day17.txt @@ -0,0 +1,7 @@ +9 ORE => 2 A +8 ORE => 3 B +7 ORE => 5 C +3 A, 4 B => 1 AB +5 B, 7 C => 1 BC +4 C, 1 A => 1 CA +2 AB, 3 BC, 4 CA => 1 FUEL \ No newline at end of file From bd9ff02869c807a987c44c9dedd79411012ac743 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 14 Dec 2019 10:53:13 +0100 Subject: [PATCH 072/433] Well --- .../sbaars/adventofcode2019/days/Day14.java | 40 ++++++++++++------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day14.java b/src/main/java/com/sbaars/adventofcode2019/days/Day14.java index 5bb048a7..48af6bdc 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day14.java @@ -13,9 +13,9 @@ public static void main(String[] args) throws IOException { @Override public Object part1() throws IOException { - Trade[] trades = Arrays.stream(readDay(15).split(System.lineSeparator())).map(Trade::new).toArray(Trade[]::new); + Trade[] trades = Arrays.stream(readDay(14).split(System.lineSeparator())).map(Trade::new).toArray(Trade[]::new); int cost = findCost(trades, new Item(1, "FUEL"), new CountMap<>()); - System.out.println(created); + //System.out.println(created); return cost; //return Arrays.stream(trades).map(e -> e.output.item).distinct().count(); /*CountMap items = new CountMap<>(); @@ -40,10 +40,17 @@ private Trade getTrade(Trade[] trades, String key) { private int findCost(Trade[] trades, Item buyingItem, CountMap leftOver) { if(buyingItem.item.equals("ORE")) return buyingItem.amount; + else if(buyingItem.amount <= leftOver.get(buyingItem.item)) { + leftOver.increment(buyingItem.item, -buyingItem.amount); + return 0; + } + buyingItem.amount-=leftOver.get(buyingItem.item); + leftOver.put(buyingItem.item, 0); + Trade fuelTrade = getTrade(trades, buyingItem.item); int timesApplied = (int)Math.ceil((double)buyingItem.amount/(double)fuelTrade.output.amount); - System.out.println("Buy "+timesApplied+"x"+fuelTrade.output.amount+" "+buyingItem.item); + //System.out.println("Buy "+timesApplied+"x"+fuelTrade.output.amount+" "+buyingItem.item); /*if(leftOver.get(fuelTrade.output.item) >= fuelTrade.output.amount) { System.out.println("Leftover "+fuelTrade.output.item+" = "+leftOver.get(fuelTrade.output.item)+" for trade "+fuelTrade); @@ -57,7 +64,10 @@ private int findCost(Trade[] trades, Item buyingItem, CountMap leftOver) //leftOver.increment(fuelTrade.output.item, buyingItem.amount % fuelTrade.output.amount); int totalCost = 0; - for(int i = 0; i= fuelTrade.output.amount) { System.out.println("Leftover "+fuelTrade.output.item+" = "+leftOver.get(fuelTrade.output.item)+" for trade "+fuelTrade); leftOver.increment(fuelTrade.output.item, -fuelTrade.output.amount); @@ -66,13 +76,13 @@ private int findCost(Trade[] trades, Item buyingItem, CountMap leftOver) System.out.println("Enough "+fuelTrade.output.item+" LEFTOVER!"); continue; }*/ - totalCost = applyTrade(trades, fuelTrade, totalCost, leftOver); - created.increment(buyingItem.item, fuelTrade.output.amount); - } + //totalCost = applyTrade(trades, fuelTrade, totalCost, leftOver); + //created.increment(buyingItem.item, fuelTrade.output.amount); + //} - leftOver.increment(buyingItem.item, buyingItem.amount % fuelTrade.output.amount); - System.out.println(fuelTrade.output.item+" nLeftOver "+leftOver.get(fuelTrade.output.item)); - System.out.println("Bought "+(timesApplied*fuelTrade.output.amount)+" "+buyingItem.item+" for "+totalCost); + leftOver.increment(buyingItem.item, fuelTrade.output.amount * timesApplied - buyingItem.amount); + //System.out.println(fuelTrade.output.item+" nLeftOver "+leftOver.get(fuelTrade.output.item)); + //System.out.println("Bought "+(timesApplied*fuelTrade.output.amount)+" "+buyingItem.item+" for "+totalCost); //System.out.println(fuelTrade.output.item+" costs "+totalCost+" times "+timesApplied); return totalCost; } @@ -87,13 +97,13 @@ private int applyTrade(Trade[] trades, Trade fuelTrade, int totalCost, CountMap< //System.out.println("Enough "+fuelTrade.output.item+" !"); continue; //You have this material, so you get it for free :) }*/ - if(cost.item.equals("ORE")) { - totalCost+=cost.amount; - System.out.println("Spend "+cost.amount+" ORE to get "+fuelTrade.output.amount+" "+fuelTrade.output.item+" in trade "+fuelTrade); - } else { + //if(cost.item.equals("ORE")) { + // totalCost+=cost.amount; + // System.out.println("Spend "+cost.amount+" ORE to get "+fuelTrade.output.amount+" "+fuelTrade.output.item+" in trade "+fuelTrade); + //} else { totalCost+=findCost(trades, new Item(cost.amount, cost.item), leftOver); //leftOver.increment(fuelTrade.output.item, cost.amount % fuelTrade.output.amount); - } + //} } return totalCost; } From ddebc538658d563fcde9df22a3861106cbf15612 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 14 Dec 2019 10:55:07 +0100 Subject: [PATCH 073/433] Cleanup --- .../sbaars/adventofcode2019/days/Day14.java | 75 ++----------------- 1 file changed, 6 insertions(+), 69 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day14.java b/src/main/java/com/sbaars/adventofcode2019/days/Day14.java index 48af6bdc..5fabc7c2 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day14.java @@ -14,22 +14,7 @@ public static void main(String[] args) throws IOException { @Override public Object part1() throws IOException { Trade[] trades = Arrays.stream(readDay(14).split(System.lineSeparator())).map(Trade::new).toArray(Trade[]::new); - int cost = findCost(trades, new Item(1, "FUEL"), new CountMap<>()); - //System.out.println(created); - return cost; - //return Arrays.stream(trades).map(e -> e.output.item).distinct().count(); - /*CountMap items = new CountMap<>(); - for(int i = 13311; i<15000; i++) { - System.out.println("We now have "+i+" ORE"); - items.put("ORE", i); - if(i == 14000) { - System.out.println("Hi"); - } - if(canMakeFuel(trades, items)) { - return i; - } - } - return 0;*/ + return findCost(trades, new Item(1, "FUEL"), new CountMap<>()); } private Trade getTrade(Trade[] trades, String key) { @@ -47,64 +32,16 @@ else if(buyingItem.amount <= leftOver.get(buyingItem.item)) { buyingItem.amount-=leftOver.get(buyingItem.item); leftOver.put(buyingItem.item, 0); + return performTrade(trades, buyingItem, leftOver); + } + + private int performTrade(Trade[] trades, Item buyingItem, CountMap leftOver) { Trade fuelTrade = getTrade(trades, buyingItem.item); int timesApplied = (int)Math.ceil((double)buyingItem.amount/(double)fuelTrade.output.amount); - - //System.out.println("Buy "+timesApplied+"x"+fuelTrade.output.amount+" "+buyingItem.item); - - /*if(leftOver.get(fuelTrade.output.item) >= fuelTrade.output.amount) { - System.out.println("Leftover "+fuelTrade.output.item+" = "+leftOver.get(fuelTrade.output.item)+" for trade "+fuelTrade); - leftOver.increment(fuelTrade.output.item, -fuelTrade.output.amount); - System.out.println("Leftover "+fuelTrade.output.item+" = "+leftOver.get(fuelTrade.output.item)+" for trade "+fuelTrade); - //skip = fuelTrade.output.item; - //System.out.println("Enough "+fuelTrade.output.item+" !"); - timesApplied--; - //return 0; //You have this material, so you get it for free :) - }*/ - //leftOver.increment(fuelTrade.output.item, buyingItem.amount % fuelTrade.output.amount); - int totalCost = 0; - for(Item cost : fuelTrade.input) { + for(Item cost : fuelTrade.input) totalCost+=findCost(trades, new Item(cost.amount*timesApplied, cost.item), leftOver); - } - //for(int i = 0; i= fuelTrade.output.amount) { - System.out.println("Leftover "+fuelTrade.output.item+" = "+leftOver.get(fuelTrade.output.item)+" for trade "+fuelTrade); - leftOver.increment(fuelTrade.output.item, -fuelTrade.output.amount); - System.out.println("Leftover "+fuelTrade.output.item+" = "+leftOver.get(fuelTrade.output.item)+" for trade "+fuelTrade); - //skip = fuelTrade.output.item; - System.out.println("Enough "+fuelTrade.output.item+" LEFTOVER!"); - continue; - }*/ - //totalCost = applyTrade(trades, fuelTrade, totalCost, leftOver); - //created.increment(buyingItem.item, fuelTrade.output.amount); - //} - leftOver.increment(buyingItem.item, fuelTrade.output.amount * timesApplied - buyingItem.amount); - //System.out.println(fuelTrade.output.item+" nLeftOver "+leftOver.get(fuelTrade.output.item)); - //System.out.println("Bought "+(timesApplied*fuelTrade.output.amount)+" "+buyingItem.item+" for "+totalCost); - //System.out.println(fuelTrade.output.item+" costs "+totalCost+" times "+timesApplied); - return totalCost; - } - - private int applyTrade(Trade[] trades, Trade fuelTrade, int totalCost, CountMap leftOver) { - for(Item cost : fuelTrade.input) { - /*if(leftOver.get(cost.item) >= cost.amount) { - //System.out.println("Leftover "+fuelTrade.output.item+" = "+leftOver.get(fuelTrade.output.item)+" for trade "+fuelTrade); - leftOver.increment(cost.item, -cost.amount); - //System.out.println("Leftover "+fuelTrade.output.item+" = "+leftOver.get(fuelTrade.output.item)+" for trade "+fuelTrade); - //skip = fuelTrade.output.item; - //System.out.println("Enough "+fuelTrade.output.item+" !"); - continue; //You have this material, so you get it for free :) - }*/ - //if(cost.item.equals("ORE")) { - // totalCost+=cost.amount; - // System.out.println("Spend "+cost.amount+" ORE to get "+fuelTrade.output.amount+" "+fuelTrade.output.item+" in trade "+fuelTrade); - //} else { - totalCost+=findCost(trades, new Item(cost.amount, cost.item), leftOver); - //leftOver.increment(fuelTrade.output.item, cost.amount % fuelTrade.output.amount); - //} - } return totalCost; } From 979c2586136bb5383072dd3ba9a4fb71a581b726 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 14 Dec 2019 11:29:05 +0100 Subject: [PATCH 074/433] Part 2 --- .../sbaars/adventofcode2019/days/Day14.java | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day14.java b/src/main/java/com/sbaars/adventofcode2019/days/Day14.java index 5fabc7c2..cd9842de 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day14.java @@ -2,6 +2,8 @@ import java.io.IOException; import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; import com.sbaars.adventofcode2019.common.Day; import com.sbaars.adventofcode2019.util.CountMap; @@ -47,7 +49,28 @@ private int performTrade(Trade[] trades, Item buyingItem, CountMap leftO @Override public Object part2() throws IOException { - return 0; + Trade[] trades = Arrays.stream(readDay(15).split(System.lineSeparator())).map(Trade::new).toArray(Trade[]::new); + CountMap leftOver = new CountMap<>(); + long ore = 1000000000000L; + int fuel = 0; + Map, Integer> res = new HashMap<>(); + int found = 0, notFound = 0; + while(true) { + if(!res.containsKey(leftOver)) { + int cost = findCost(trades, new Item(1, "FUEL"), leftOver); + res.put(new CountMap<>(leftOver), cost); + ore-=cost; + found++; + } else { + ore-=res.get(leftOver); + notFound++; + } + if(ore>=0) { + fuel++; + } else break; + } + System.out.println("Found "+found+", notFound "+notFound); + return fuel; } class Trade { From 12d1f7939c2774c645c2e923ba4ec28317a71b67 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 14 Dec 2019 11:41:52 +0100 Subject: [PATCH 075/433] Day 14 Part 2 Will optimize later --- .../sbaars/adventofcode2019/days/Day14.java | 30 ++++++++----------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day14.java b/src/main/java/com/sbaars/adventofcode2019/days/Day14.java index cd9842de..214bc498 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day14.java @@ -2,8 +2,6 @@ import java.io.IOException; import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; import com.sbaars.adventofcode2019.common.Day; import com.sbaars.adventofcode2019.util.CountMap; @@ -15,6 +13,10 @@ public static void main(String[] args) throws IOException { @Override public Object part1() throws IOException { + return findCosts(); + } + + private int findCosts() throws IOException { Trade[] trades = Arrays.stream(readDay(14).split(System.lineSeparator())).map(Trade::new).toArray(Trade[]::new); return findCost(trades, new Item(1, "FUEL"), new CountMap<>()); } @@ -51,25 +53,19 @@ private int performTrade(Trade[] trades, Item buyingItem, CountMap leftO public Object part2() throws IOException { Trade[] trades = Arrays.stream(readDay(15).split(System.lineSeparator())).map(Trade::new).toArray(Trade[]::new); CountMap leftOver = new CountMap<>(); - long ore = 1000000000000L; int fuel = 0; - Map, Integer> res = new HashMap<>(); - int found = 0, notFound = 0; - while(true) { - if(!res.containsKey(leftOver)) { - int cost = findCost(trades, new Item(1, "FUEL"), leftOver); - res.put(new CountMap<>(leftOver), cost); - ore-=cost; - found++; + + for(long ore = 1000000000000L, amount = ore / findCosts(); ore>0 && amount>0; ) { + CountMap newLeftOver = new CountMap<>(leftOver); + int cost = findCost(trades, new Item(1, "FUEL"), newLeftOver); + if(cost > ore) { + amount /= 2; } else { - ore-=res.get(leftOver); - notFound++; + fuel += amount; + ore -= cost; + leftOver = newLeftOver; } - if(ore>=0) { - fuel++; - } else break; } - System.out.println("Found "+found+", notFound "+notFound); return fuel; } From c25113713197227159393f0e2f0a1ba4210c3214 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 14 Dec 2019 22:43:24 +0100 Subject: [PATCH 076/433] Day 14 Refactor --- .../sbaars/adventofcode2019/days/Day14.java | 72 ++++++++----------- .../adventofcode2019/util/LongCountMap.java | 58 +++++++++++++++ 2 files changed, 88 insertions(+), 42 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode2019/util/LongCountMap.java diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day14.java b/src/main/java/com/sbaars/adventofcode2019/days/Day14.java index 214bc498..2154a2bf 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day14.java @@ -4,9 +4,15 @@ import java.util.Arrays; import com.sbaars.adventofcode2019.common.Day; -import com.sbaars.adventofcode2019.util.CountMap; +import com.sbaars.adventofcode2019.util.LongCountMap; public class Day14 implements Day { + private Trade[] trades; + + public Day14() throws IOException { + this.trades = Arrays.stream(readDay(14).split(System.lineSeparator())).map(Trade::new).toArray(Trade[]::new); + } + public static void main(String[] args) throws IOException { new Day14().printParts(); } @@ -16,17 +22,15 @@ public Object part1() throws IOException { return findCosts(); } - private int findCosts() throws IOException { - Trade[] trades = Arrays.stream(readDay(14).split(System.lineSeparator())).map(Trade::new).toArray(Trade[]::new); - return findCost(trades, new Item(1, "FUEL"), new CountMap<>()); + private long findCosts() throws IOException { + return findCost(new Item(1, "FUEL"), new LongCountMap<>()); } - private Trade getTrade(Trade[] trades, String key) { + private Trade getTrade(String key) { return Arrays.stream(trades).filter(e -> e.output.item.equals(key)).findAny().get(); } - - CountMap created = new CountMap<>(); - private int findCost(Trade[] trades, Item buyingItem, CountMap leftOver) { + + private long findCost(Item buyingItem, LongCountMap leftOver) { if(buyingItem.item.equals("ORE")) return buyingItem.amount; else if(buyingItem.amount <= leftOver.get(buyingItem.item)) { @@ -34,39 +38,33 @@ else if(buyingItem.amount <= leftOver.get(buyingItem.item)) { return 0; } buyingItem.amount-=leftOver.get(buyingItem.item); - leftOver.put(buyingItem.item, 0); + leftOver.put(buyingItem.item, 0L); - return performTrade(trades, buyingItem, leftOver); + return performTrade(buyingItem, leftOver); } - private int performTrade(Trade[] trades, Item buyingItem, CountMap leftOver) { - Trade fuelTrade = getTrade(trades, buyingItem.item); - int timesApplied = (int)Math.ceil((double)buyingItem.amount/(double)fuelTrade.output.amount); - int totalCost = 0; + private long performTrade(Item buyingItem, LongCountMap leftOver) { + Trade fuelTrade = getTrade(buyingItem.item); + long timesApplied = (long)Math.ceil((double)buyingItem.amount/(double)fuelTrade.output.amount); + long totalCost = 0; for(Item cost : fuelTrade.input) - totalCost+=findCost(trades, new Item(cost.amount*timesApplied, cost.item), leftOver); + totalCost+=findCost(new Item(cost.amount*timesApplied, cost.item), leftOver); leftOver.increment(buyingItem.item, fuelTrade.output.amount * timesApplied - buyingItem.amount); return totalCost; } @Override public Object part2() throws IOException { - Trade[] trades = Arrays.stream(readDay(15).split(System.lineSeparator())).map(Trade::new).toArray(Trade[]::new); - CountMap leftOver = new CountMap<>(); - int fuel = 0; - - for(long ore = 1000000000000L, amount = ore / findCosts(); ore>0 && amount>0; ) { - CountMap newLeftOver = new CountMap<>(leftOver); - int cost = findCost(trades, new Item(1, "FUEL"), newLeftOver); - if(cost > ore) { - amount /= 2; - } else { - fuel += amount; - ore -= cost; - leftOver = newLeftOver; - } + long oreLeft = 1000000000000L; + long fuel = 1; + while(true) { + long cost = findCost(new Item(fuel + 1, "FUEL"), new LongCountMap<>()); + if (cost > oreLeft) { + return fuel; + } else { + fuel = Math.max(fuel + 1, (fuel + 1) * oreLeft / cost); + } } - return fuel; } class Trade { @@ -78,15 +76,10 @@ public Trade(String trade) { input = Arrays.stream(inputOutput[0].split(", ")).map(Item::new).toArray(Item[]::new); output = new Item(inputOutput[1]); } - - @Override - public String toString() { - return "Trade [input=" + Arrays.toString(input) + ", output=" + output + "]"; - } } class Item { - int amount; + long amount; String item; public Item(String item) { @@ -95,14 +88,9 @@ public Item(String item) { this.item = i[1]; } - public Item(int i, String string) { + public Item(long i, String string) { amount = i; item = string; } - - @Override - public String toString() { - return "Item [amount=" + amount + ", item=" + item + "]"; - } } } diff --git a/src/main/java/com/sbaars/adventofcode2019/util/LongCountMap.java b/src/main/java/com/sbaars/adventofcode2019/util/LongCountMap.java new file mode 100644 index 00000000..1762fbf5 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/util/LongCountMap.java @@ -0,0 +1,58 @@ +package com.sbaars.adventofcode2019.util; + +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; + +public class LongCountMap extends HashMap { + /** + * + */ + private static final long serialVersionUID = 1L; + + public LongCountMap() { + } + + public LongCountMap(int initialCapacity, float loadFactor) { + super(initialCapacity, loadFactor); + } + + public LongCountMap(int initialCapacity) { + super(initialCapacity); + } + + public LongCountMap(Map m) { + super(m); + } + + public Long increment(K key) { + return super.put(key, super.containsKey(key) ? super.get(key) + 1 : 1); + } + + public Long increment(K key, long amount) { + return super.put(key, super.containsKey(key) ? super.get(key) + amount : amount); + } + + @SuppressWarnings("unchecked") + @Override + public Long get(Object key){ + if(!super.containsKey(key)) + super.put((K) key, 0L); + return super.get(key); + } + + @Override + public String toString() { + return keySet().stream().sorted().map(e -> e+"\t"+get(e)).collect(Collectors.joining(System.lineSeparator())); + } + + public void addAll(LongCountMap amountPerCloneClassSize) { + amountPerCloneClassSize.entrySet().stream().forEach(e -> this.increment(e.getKey(), e.getValue())); + } + + public void incrementAll(LongCountMap input) { + for(Entry i : input.entrySet()) { + increment(i.getKey(), i.getValue()); + } + } +} From 7129d3ebf49cc011910a11be0a00c7f5d084c86b Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 14 Dec 2019 22:48:18 +0100 Subject: [PATCH 077/433] Final day 14 refactor --- .../sbaars/adventofcode2019/days/Day14.java | 12 ++++------ .../sbaars/adventofcode2019/days/Day15.java | 22 +++++++++++++++++++ src/main/resources/day15.txt | 9 -------- src/main/resources/day16.txt | 12 ---------- src/main/resources/day17.txt | 7 ------ 5 files changed, 26 insertions(+), 36 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode2019/days/Day15.java delete mode 100644 src/main/resources/day16.txt delete mode 100644 src/main/resources/day17.txt diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day14.java b/src/main/java/com/sbaars/adventofcode2019/days/Day14.java index 2154a2bf..5ededc12 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day14.java @@ -19,10 +19,6 @@ public static void main(String[] args) throws IOException { @Override public Object part1() throws IOException { - return findCosts(); - } - - private long findCosts() throws IOException { return findCost(new Item(1, "FUEL"), new LongCountMap<>()); } @@ -68,8 +64,8 @@ public Object part2() throws IOException { } class Trade { - final Item[] input; - final Item output; + private final Item[] input; + private final Item output; public Trade(String trade) { String[] inputOutput = trade.split(" => "); @@ -79,8 +75,8 @@ public Trade(String trade) { } class Item { - long amount; - String item; + private long amount; + private final String item; public Item(String item) { String[] i = item.split(" "); diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day15.java b/src/main/java/com/sbaars/adventofcode2019/days/Day15.java new file mode 100644 index 00000000..7fb97e0a --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day15.java @@ -0,0 +1,22 @@ +package com.sbaars.adventofcode2019.days; + +import java.io.IOException; + +import com.sbaars.adventofcode2019.common.Day; + +public class Day15 implements Day { + + public static void main(String[] args) throws IOException { + new Day15().printParts(); + } + + @Override + public Object part1() throws IOException { + return 0; + } + + @Override + public Object part2() throws IOException { + return 0; + } +} diff --git a/src/main/resources/day15.txt b/src/main/resources/day15.txt index fe064792..e69de29b 100644 --- a/src/main/resources/day15.txt +++ b/src/main/resources/day15.txt @@ -1,9 +0,0 @@ -157 ORE => 5 NZVS -165 ORE => 6 DCFZ -44 XJWVT, 5 KHKGT, 1 QDVJ, 29 NZVS, 9 GPVTF, 48 HKGWZ => 1 FUEL -12 HKGWZ, 1 GPVTF, 8 PSHF => 9 QDVJ -179 ORE => 7 PSHF -177 ORE => 5 HKGWZ -7 DCFZ, 7 PSHF => 2 XJWVT -165 ORE => 2 GPVTF -3 DCFZ, 7 NZVS, 5 HKGWZ, 10 PSHF => 8 KHKGT \ No newline at end of file diff --git a/src/main/resources/day16.txt b/src/main/resources/day16.txt deleted file mode 100644 index 7c1333b1..00000000 --- a/src/main/resources/day16.txt +++ /dev/null @@ -1,12 +0,0 @@ -2 VPVL, 7 FWMGM, 2 CXFTF, 11 MNCFX => 1 STKFG -17 NVRVD, 3 JNWZP => 8 VPVL -53 STKFG, 6 MNCFX, 46 VJHF, 81 HVMC, 68 CXFTF, 25 GNMV => 1 FUEL -22 VJHF, 37 MNCFX => 5 FWMGM -139 ORE => 4 NVRVD -144 ORE => 7 JNWZP -5 MNCFX, 7 RFSQX, 2 FWMGM, 2 VPVL, 19 CXFTF => 3 HVMC -5 VJHF, 7 MNCFX, 9 VPVL, 37 CXFTF => 6 GNMV -145 ORE => 6 MNCFX -1 NVRVD => 8 CXFTF -1 VJHF, 6 MNCFX => 4 RFSQX -176 ORE => 6 VJHF \ No newline at end of file diff --git a/src/main/resources/day17.txt b/src/main/resources/day17.txt deleted file mode 100644 index 80a5907e..00000000 --- a/src/main/resources/day17.txt +++ /dev/null @@ -1,7 +0,0 @@ -9 ORE => 2 A -8 ORE => 3 B -7 ORE => 5 C -3 A, 4 B => 1 AB -5 B, 7 C => 1 BC -4 C, 1 A => 1 CA -2 AB, 3 BC, 4 CA => 1 FUEL \ No newline at end of file From ab80b393ea500fe130fb12f50ad271f30f3dec13 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 15 Dec 2019 13:49:35 +0100 Subject: [PATCH 078/433] Upgrade Intcode Computer --- .../sbaars/adventofcode2019/days/Day11.java | 10 +++---- .../sbaars/adventofcode2019/days/Day13.java | 18 ++++++------- .../sbaars/adventofcode2019/days/Day7.java | 18 ++++++------- .../intcode/IntcodeComputer.java | 27 ++++++++++--------- 4 files changed, 37 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day11.java b/src/main/java/com/sbaars/adventofcode2019/days/Day11.java index d5a12a94..7098113b 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day11.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day11.java @@ -33,18 +33,18 @@ private Object robotWalk(boolean startWhite) throws IOException { whitePlaces.add(currentLocation); while(true) { c.setInput(whitePlaces.contains(currentLocation) ? 1 : 0); - int paintColor = c.runInt(); + long paintColor = c.run(); if(paintColor == IntcodeComputer.STOP_CODE) break; - int turn = c.runInt(); + long turn = c.run(); paintedOnce.add(currentLocation); - if(paintColor == 1) { + if(paintColor == 1L) { whitePlaces.add(currentLocation); - } else if(paintColor == 0) { + } else if(paintColor == 0L) { whitePlaces.remove(currentLocation); } - dir = turn(dir, turn == 1); + dir = turn(dir, turn == 1L); currentLocation = move(currentLocation, dir); } return startWhite ? constructImage(whitePlaces) : paintedOnce.size(); diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day13.java b/src/main/java/com/sbaars/adventofcode2019/days/Day13.java index d3b4fea7..dc288e2b 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day13.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day13.java @@ -20,12 +20,12 @@ public Object part1() throws IOException { IntcodeComputer cp = new IntcodeComputer(13); Set n = new HashSet(); while(true) { - int x = cp.runInt(); + long x = cp.run(); if(x == IntcodeComputer.STOP_CODE) return n.size(); - int y = cp.runInt(); - int tile = cp.runInt(); + long y = cp.run(); + long tile = cp.run(); if(tile == 2) - n.add(new Point(x,y)); + n.add(new Point(Math.toIntExact(x), Math.toIntExact(y))); } } @@ -37,12 +37,12 @@ public Object part2() throws IOException { int score = 0; AtomicInteger paddlePos = new AtomicInteger(), ballPos = new AtomicInteger(); while(true) { - int x = cp.runInt(); + long x = cp.run(); if(x == IntcodeComputer.STOP_CODE) return score; - int y = cp.runInt(); - int tile = cp.runInt(); - score = simulateField(cp, field, score, paddlePos, ballPos, x, y, tile); + long y = cp.run(); + long tile = cp.run(); + score = simulateField(cp, field, score, paddlePos, ballPos, Math.toIntExact(x), Math.toIntExact(y), Math.toIntExact(tile)); } } @@ -52,7 +52,7 @@ private int simulateField(IntcodeComputer cp, int[][] field, int score, AtomicIn else { field[y][x] = tile; if (tile == 3) { - paddlePos.set(x);; + paddlePos.set(x); } else if (tile == 4) { ballPos.set(x); cp.setInput(provideInput(paddlePos, ballPos)); diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day7.java b/src/main/java/com/sbaars/adventofcode2019/days/Day7.java index a1af8316..46c0248c 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day7.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day7.java @@ -17,30 +17,30 @@ public static void main(String[] args) throws IOException { @Override public Object part1() throws IOException { List> permutations = generatePerm(new ArrayList<>(Arrays.asList(0,1,2,3,4))); - List results = new ArrayList<>(); + List results = new ArrayList<>(); for(List perm : permutations) { - int lastVal = 0; + long lastVal = 0; for(Integer i : perm) - lastVal = new IntcodeComputer(7, i, lastVal).runInt(); + lastVal = new IntcodeComputer(7, i, lastVal).run(); results.add(lastVal); } - return results.stream().mapToInt(e -> e).max().getAsInt(); + return results.stream().mapToLong(e -> e).max().getAsLong(); } @Override public Object part2() throws IOException { List> permutations = generatePerm(new ArrayList<>(Arrays.asList(5,6,7,8,9))); - List results = new ArrayList<>(); + List results = new ArrayList<>(); perms: for(List shuffle : permutations) { IntcodeComputer[] computers = new IntcodeComputer[5]; for(int i = 0; i e).max().getAsInt(); + return results.stream().mapToLong(e -> e).max().getAsLong(); } public List> generatePerm(List original) { diff --git a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java index a1e45299..d484e707 100644 --- a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java +++ b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java @@ -12,13 +12,13 @@ public class IntcodeComputer implements DoesFileOperations { private long[] program; private int instructionCounter = 0; - private final Queue input = new ArrayDeque<>(2); - private int lastInput; + private final Queue input = new ArrayDeque<>(2); + private long lastInput; private long relativeBase = 0; private static final int[] DO_NOT_TRANSFORM_FINAL_ARGUMENT = {1, 2, 3, 7, 8}; - public static final int STOP_CODE = Integer.MIN_VALUE+1; + public static final long STOP_CODE = Long.MIN_VALUE+1; - public IntcodeComputer(int day, int...input) throws IOException { + public IntcodeComputer(int day, long...input) throws IOException { this.program = Arrays.stream(readDay(day).split(",")).mapToLong(Long::parseLong).toArray(); this.program = Arrays.copyOf(this.program, 10000); // Quick hack to enlange memory, should be refactored. setInput(input); @@ -28,6 +28,11 @@ public IntcodeComputer(int day, int...input) throws IOException { } } + public long run(long input) { + setInput(input); + return run(); + } + public long run() { long result; while((result = executeInstruction(Math.toIntExact(program[instructionCounter]))) == Integer.MIN_VALUE); @@ -59,14 +64,14 @@ private void transformParameters(int[] method, long[] args, int instruction) { } } - private int readInput() { + private long readInput() { if(input.isEmpty()) return lastInput; lastInput = input.poll(); return lastInput; } - public boolean addInput(int num) { + public boolean addInput(long num) { return input.add(num); } @@ -74,7 +79,7 @@ public long firstElement() { return program[0]; } - public boolean setInput(int...input) { + public boolean setInput(long...input) { this.input.clear(); return this.input.addAll(Arrays.stream(input).boxed().collect(Collectors.toList())); } @@ -94,7 +99,7 @@ private long executeInstruction(long[] args, int instruction) { case 99: return STOP_CODE; default: throw new IllegalStateException("Something went wrong!"); } - return Integer.MIN_VALUE; + return Long.MIN_VALUE; } private long parseComplexInstruction(int instruction) { @@ -136,11 +141,7 @@ private int nParams(int instruction) { else throw new IllegalStateException("Something went wrong! "+instruction); } } - - public int runInt() { - return Math.toIntExact(run()); - } - + public void setElement(int i, long j) { program[i] = j; } From 41f686caba37ccba1d8a498fa986db7852055e83 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 15 Dec 2019 13:49:55 +0100 Subject: [PATCH 079/433] Path finding classes for day 15 --- .../adventofcode2019/pathfinding/Grid2d.java | 127 ++++++++++++++++++ .../adventofcode2019/pathfinding/Node.java | 40 ++++++ .../pathfinding/PathFinding.java | 86 ++++++++++++ 3 files changed, 253 insertions(+) create mode 100644 src/main/java/com/sbaars/adventofcode2019/pathfinding/Grid2d.java create mode 100644 src/main/java/com/sbaars/adventofcode2019/pathfinding/Node.java create mode 100644 src/main/java/com/sbaars/adventofcode2019/pathfinding/PathFinding.java diff --git a/src/main/java/com/sbaars/adventofcode2019/pathfinding/Grid2d.java b/src/main/java/com/sbaars/adventofcode2019/pathfinding/Grid2d.java new file mode 100644 index 00000000..bc269d9d --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/pathfinding/Grid2d.java @@ -0,0 +1,127 @@ +package com.sbaars.adventofcode2019.pathfinding; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * Creates nodes and neighbours from a 2d grid. Each point in the map has an + * integer value that specifies the cost of crossing that point. If this value + * is negative, the point is unreachable. + * + * If diagonal movement is allowed, the Chebyshev distance is used, else + * Manhattan distance is used. + * + * @author Ben Ruijl + * + */ +public class Grid2d { + private final double[][] map; + private final boolean allowDiagonal; + + /** + * A node in a 2d map. This is simply the coordinates of the point. + * + * @author Ben Ruijl + * + */ + public class MapNode implements Node { + private final int x, y; + + public MapNode(int x, int y) { + this.x = x; + this.y = y; + } + + public double getHeuristic(MapNode goal) { + if (allowDiagonal) { + return Math.max(Math.abs(x - goal.x), Math.abs(y - goal.y)); + } else { + return Math.abs(x - goal.x) + Math.abs(y - goal.y); + } + } + + public double getTraversalCost(MapNode neighbour) { + return 1 + map[neighbour.y][neighbour.x]; + } + + public Set getNeighbours() { + Set neighbours = new HashSet(); + + for (int i = x - 1; i <= x + 1; i++) { + for (int j = y - 1; j <= y + 1; j++) { + if ((i == x && j == y) || i < 0 || j < 0 || j >= map.length + || i >= map[j].length) { + continue; + } + + if (!allowDiagonal && + ((i < x && j < y) || + (i < x && j > y) || + (i > x && j > y) || + (i > x && j < y))) { + continue; + } + + if (map[j][i] == 1) { + continue; + } + + // TODO: create cache instead of recreation + neighbours.add(new MapNode(i, j)); + } + } + + return neighbours; + } + + @Override + public String toString() { + return "(" + x + ", " + y + ")"; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + getOuterType().hashCode(); + result = prime * result + x; + result = prime * result + y; + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + MapNode other = (MapNode) obj; + if (!getOuterType().equals(other.getOuterType())) + return false; + if (x != other.x) + return false; + if (y != other.y) + return false; + return true; + } + + private Grid2d getOuterType() { + return Grid2d.this; + } + + } + + public Grid2d(double[][] map, boolean allowDiagonal) { + this.map = map; + this.allowDiagonal = allowDiagonal; + } + + public List findPath(int xStart, int yStart, int xGoal, int yGoal) { + return PathFinding.doAStar(new MapNode(xStart, yStart), new MapNode( + xGoal, yGoal)); + } + +} diff --git a/src/main/java/com/sbaars/adventofcode2019/pathfinding/Node.java b/src/main/java/com/sbaars/adventofcode2019/pathfinding/Node.java new file mode 100644 index 00000000..d99e59f6 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/pathfinding/Node.java @@ -0,0 +1,40 @@ +package com.sbaars.adventofcode2019.pathfinding; +import java.util.Set; + +/** + * A node in a graph, useful for pathfinding. + * + * @author Ben Ruijl + * + * @param + * Actual type of the node + */ +public interface Node { + /** + * The heuristic cost to move from the current node to the goal. In most + * cases this is the Manhattan distance or Chebyshev distance. + * + * @param goal + * @return + */ + double getHeuristic(T goal); + + /** + * The cost of moving from the current node to the neighbour. In most cases + * this is just the distance between the nodes, but additional terrain cost + * can be added as well (for example climbing a mountain is more expensive + * than walking on a road). + * + * @param neighbour + * Neighbour of current node + * @return Traversal cost + */ + double getTraversalCost(T neighbour); + + /** + * Gets the set of neighbouring nodes. + * + * @return Neighbouring nodes + */ + Set getNeighbours(); +} diff --git a/src/main/java/com/sbaars/adventofcode2019/pathfinding/PathFinding.java b/src/main/java/com/sbaars/adventofcode2019/pathfinding/PathFinding.java new file mode 100644 index 00000000..51ec92d5 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/pathfinding/PathFinding.java @@ -0,0 +1,86 @@ +package com.sbaars.adventofcode2019.pathfinding; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; + +/** + * Helper class containing pathfinding algorithms. + * + * @author Ben Ruijl + * + */ +public class PathFinding { + + /** + * A Star pathfinding. Note that the heuristic has to be monotonic: + * {@code h(x) <= + * d(x, y) + h(y)}. + * + * @param start + * Starting node + * @param goal + * Goal node + * @return Shortest path from start to goal, or null if none found + */ + public static > List doAStar(T start, T goal) { + Set closed = new HashSet(); + Map fromMap = new HashMap(); + List route = new LinkedList(); + Map gScore = new HashMap(); + final Map fScore = new HashMap(); + PriorityQueue open = new PriorityQueue(11, new Comparator() { + + public int compare(T nodeA, T nodeB) { + return Double.compare(fScore.get(nodeA), fScore.get(nodeB)); + } + }); + + gScore.put(start, 0.0); + fScore.put(start, start.getHeuristic(goal)); + open.offer(start); + + while (!open.isEmpty()) { + T current = open.poll(); + if (current.equals(goal)) { + while (current != null) { + route.add(0, current); + current = fromMap.get(current); + } + + return route; + } + + closed.add(current); + + for (T neighbour : current.getNeighbours()) { + if (closed.contains(neighbour)) { + continue; + } + + double tentG = gScore.get(current) + + current.getTraversalCost(neighbour); + + boolean contains = open.contains(neighbour); + if (!contains || tentG < gScore.get(neighbour)) { + gScore.put(neighbour, tentG); + fScore.put(neighbour, tentG + neighbour.getHeuristic(goal)); + + if (contains) { + open.remove(neighbour); + } + + open.offer(neighbour); + fromMap.put(neighbour, current); + } + } + } + + return null; + } + +} From 14b8075568576087d9b7d8a4b9d46ea37d6be9f3 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 15 Dec 2019 14:10:01 +0100 Subject: [PATCH 080/433] Direction refactor --- .../adventofcode2019/common/Direction.java | 22 ++++++++++++++++ .../sbaars/adventofcode2019/days/Day11.java | 25 ++++++------------- .../sbaars/adventofcode2019/days/Day3.java | 22 +++++----------- 3 files changed, 36 insertions(+), 33 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode2019/common/Direction.java diff --git a/src/main/java/com/sbaars/adventofcode2019/common/Direction.java b/src/main/java/com/sbaars/adventofcode2019/common/Direction.java new file mode 100644 index 00000000..dde18371 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/common/Direction.java @@ -0,0 +1,22 @@ +package com.sbaars.adventofcode2019.common; + +import java.util.Arrays; + +public enum Direction { + NORTH, EAST, SOUTH, WEST; + + public char directionCode() { + return name().charAt(0); + } + + public static Direction getByDirCode(char code) { + return Arrays.stream(values()).filter(e -> e.directionCode() == code).findAny().get(); + } + + public Direction turn(boolean right) { + int cur = ordinal() + (right ? 1 : -1); + if(cur == Direction.values().length) cur = 0; + else if(cur == -1) cur = 3; + return Direction.values()[cur]; + } +} \ No newline at end of file diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day11.java b/src/main/java/com/sbaars/adventofcode2019/days/Day11.java index 7098113b..f466e0cd 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day11.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day11.java @@ -10,9 +10,9 @@ import com.sbaars.adventofcode2019.common.ProcessesImages; import com.sbaars.adventofcode2019.intcode.IntcodeComputer; +import com.sbaars.adventofcode2019.common.Direction; + public class Day11 implements Day, ProcessesImages { - - enum Direction { UP, RIGHT, DOWN, LEFT } public static void main(String[] args) throws IOException { new Day11().printParts(); @@ -26,7 +26,7 @@ public Object part1() throws IOException { private Object robotWalk(boolean startWhite) throws IOException { IntcodeComputer c = new IntcodeComputer(11); Point currentLocation = new Point(0,0); - Direction dir = Direction.UP; + Direction dir = Direction.NORTH; final Set paintedOnce = new HashSet<>(); final Set whitePlaces = new HashSet<>(); if(startWhite) @@ -44,7 +44,7 @@ private Object robotWalk(boolean startWhite) throws IOException { whitePlaces.remove(currentLocation); } - dir = turn(dir, turn == 1L); + dir = dir.turn(turn == 1L); currentLocation = move(currentLocation, dir); } return startWhite ? constructImage(whitePlaces) : paintedOnce.size(); @@ -61,22 +61,13 @@ private OCR constructImage(Set whitePlaces) { places[p.y][p.x] = 1; return new OCR(createAsciiArray(places)); } - - public Direction turn(Direction dir, boolean right) { - int cur = dir.ordinal() + (right ? 1 : -1); - if(cur == Direction.values().length) - cur = 0; - else if(cur == -1) - cur = 3; - return Direction.values()[cur]; - } private Point move(Point currentLocation, Direction dir2) { switch (dir2) { - case UP: return new Point(currentLocation.x, currentLocation.y-1); - case DOWN: return new Point(currentLocation.x, currentLocation.y+1); - case RIGHT: return new Point(currentLocation.x+1, currentLocation.y); - case LEFT: return new Point(currentLocation.x-1, currentLocation.y); + case NORTH: return new Point(currentLocation.x, currentLocation.y-1); + case SOUTH: return new Point(currentLocation.x, currentLocation.y+1); + case EAST: return new Point(currentLocation.x+1, currentLocation.y); + case WEST: return new Point(currentLocation.x-1, currentLocation.y); } return null; } diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day3.java b/src/main/java/com/sbaars/adventofcode2019/days/Day3.java index 55a094b6..6a8c22e2 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day3.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day3.java @@ -6,6 +6,8 @@ import java.util.HashSet; import java.util.Set; +import com.sbaars.adventofcode2019.common.Direction; + import com.sbaars.adventofcode2019.common.Day; public class Day3 implements Day @@ -41,10 +43,10 @@ private Set calculateDistance(Walk[] walks1, Set walkedLocations, bo for(Walk walk : walks1) { for(;walk.distance>0;walk.distance--) { switch(walk.dir) { - case UP: y++; break; - case DOWN: y--; break; - case LEFT: x--; break; - case RIGHT: x++; break; + case NORTH: y++; break; + case SOUTH: y--; break; + case WEST: x--; break; + case EAST: x++; break; } performStep(walkedLocations, collect, intersectingLocations, x, y, steps); steps++; @@ -113,16 +115,4 @@ public void combine(Step step) { } } } - - enum Direction { - UP, DOWN, LEFT, RIGHT; - - public char directionCode() { - return name().charAt(0); - } - - public static Direction getByDirCode(char code) { - return Arrays.stream(values()).filter(e -> e.directionCode() == code).findAny().get(); - } - } } From 732f7a7b07a6a6ea6761fec1900f050307ab2ba6 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 15 Dec 2019 14:15:18 +0100 Subject: [PATCH 081/433] Further direction refactoring --- .../adventofcode2019/common/Direction.java | 19 ++++++++++++++++++- .../sbaars/adventofcode2019/days/Day11.java | 12 +----------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/common/Direction.java b/src/main/java/com/sbaars/adventofcode2019/common/Direction.java index dde18371..b81ac8bc 100644 --- a/src/main/java/com/sbaars/adventofcode2019/common/Direction.java +++ b/src/main/java/com/sbaars/adventofcode2019/common/Direction.java @@ -1,9 +1,16 @@ package com.sbaars.adventofcode2019.common; +import java.awt.Point; import java.util.Arrays; public enum Direction { - NORTH, EAST, SOUTH, WEST; + NORTH(1), EAST(4), SOUTH(2), WEST(3); + + public final int num; + + private Direction(int num) { + this.num = num; + } public char directionCode() { return name().charAt(0); @@ -19,4 +26,14 @@ public Direction turn(boolean right) { else if(cur == -1) cur = 3; return Direction.values()[cur]; } + + public Point move(Point currentLocation) { + switch (this) { + case NORTH: return new Point(currentLocation.x, currentLocation.y+1); + case SOUTH: return new Point(currentLocation.x, currentLocation.y-1); + case EAST: return new Point(currentLocation.x+1, currentLocation.y); + case WEST: return new Point(currentLocation.x-1, currentLocation.y); + } + return null; + } } \ No newline at end of file diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day11.java b/src/main/java/com/sbaars/adventofcode2019/days/Day11.java index f466e0cd..0ef8815a 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day11.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day11.java @@ -45,7 +45,7 @@ private Object robotWalk(boolean startWhite) throws IOException { } dir = dir.turn(turn == 1L); - currentLocation = move(currentLocation, dir); + currentLocation = dir.move(currentLocation); } return startWhite ? constructImage(whitePlaces) : paintedOnce.size(); } @@ -61,16 +61,6 @@ private OCR constructImage(Set whitePlaces) { places[p.y][p.x] = 1; return new OCR(createAsciiArray(places)); } - - private Point move(Point currentLocation, Direction dir2) { - switch (dir2) { - case NORTH: return new Point(currentLocation.x, currentLocation.y-1); - case SOUTH: return new Point(currentLocation.x, currentLocation.y+1); - case EAST: return new Point(currentLocation.x+1, currentLocation.y); - case WEST: return new Point(currentLocation.x-1, currentLocation.y); - } - return null; - } @Override public Object part2() throws IOException { From 0ad2b1be7eee62585fb9741e51a2411c57cbfba1 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 15 Dec 2019 18:04:26 +0100 Subject: [PATCH 082/433] Day 15: Stub --- .../com/sbaars/adventofcode2019/days/Day15.java | 17 ++++++++++++++++- .../adventofcode2019/pathfinding/Example.java | 16 ++++++++++++++++ src/main/resources/day15.txt | 1 + 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/sbaars/adventofcode2019/pathfinding/Example.java diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day15.java b/src/main/java/com/sbaars/adventofcode2019/days/Day15.java index 7fb97e0a..f5a92c81 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day15.java @@ -1,8 +1,14 @@ package com.sbaars.adventofcode2019.days; +import java.awt.Point; import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import com.sbaars.adventofcode2019.common.Day; +import com.sbaars.adventofcode2019.common.Direction; +import com.sbaars.adventofcode2019.intcode.IntcodeComputer; public class Day15 implements Day { @@ -12,7 +18,16 @@ public static void main(String[] args) throws IOException { @Override public Object part1() throws IOException { - return 0; + IntcodeComputer ic = new IntcodeComputer(15); + List walls = new ArrayList<>(); + Point pos = new Point(50,50); + int[][] grid = new int[100][100]; + for(int[] row : grid) Arrays.fill(row, -1); + grid[pos.y][pos.x] = 0; + Direction dir = Direction.NORTH; + while(true) { + ic.run(); + } } @Override diff --git a/src/main/java/com/sbaars/adventofcode2019/pathfinding/Example.java b/src/main/java/com/sbaars/adventofcode2019/pathfinding/Example.java new file mode 100644 index 00000000..3709f4cb --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/pathfinding/Example.java @@ -0,0 +1,16 @@ +package com.sbaars.adventofcode2019.pathfinding; + +public class Example { + public Example() { + double[][] map = { { 0, 1, 0, 0, 0 }, + { 0, 0, 0, 1, 0 }, + { 1, 1, 1, 1, 0} }; + Grid2d map2d = new Grid2d(map, false); + System.out.println(map2d.findPath(0, 0, 4, 2)); + } + + public static void main(String[] args) { + new Example(); + } + +} diff --git a/src/main/resources/day15.txt b/src/main/resources/day15.txt index e69de29b..0af98421 100644 --- a/src/main/resources/day15.txt +++ b/src/main/resources/day15.txt @@ -0,0 +1 @@ +3,1033,1008,1033,1,1032,1005,1032,31,1008,1033,2,1032,1005,1032,58,1008,1033,3,1032,1005,1032,81,1008,1033,4,1032,1005,1032,104,99,101,0,1034,1039,1001,1036,0,1041,1001,1035,-1,1040,1008,1038,0,1043,102,-1,1043,1032,1,1037,1032,1042,1105,1,124,101,0,1034,1039,101,0,1036,1041,1001,1035,1,1040,1008,1038,0,1043,1,1037,1038,1042,1106,0,124,1001,1034,-1,1039,1008,1036,0,1041,1001,1035,0,1040,1001,1038,0,1043,1002,1037,1,1042,1105,1,124,1001,1034,1,1039,1008,1036,0,1041,102,1,1035,1040,101,0,1038,1043,1002,1037,1,1042,1006,1039,217,1006,1040,217,1008,1039,40,1032,1005,1032,217,1008,1040,40,1032,1005,1032,217,1008,1039,1,1032,1006,1032,165,1008,1040,33,1032,1006,1032,165,1101,0,2,1044,1106,0,224,2,1041,1043,1032,1006,1032,179,1101,1,0,1044,1106,0,224,1,1041,1043,1032,1006,1032,217,1,1042,1043,1032,1001,1032,-1,1032,1002,1032,39,1032,1,1032,1039,1032,101,-1,1032,1032,101,252,1032,211,1007,0,43,1044,1105,1,224,1101,0,0,1044,1106,0,224,1006,1044,247,1002,1039,1,1034,1002,1040,1,1035,102,1,1041,1036,1001,1043,0,1038,101,0,1042,1037,4,1044,1105,1,0,13,30,60,64,5,28,36,24,67,12,1,67,32,39,14,78,29,17,38,88,79,9,62,25,15,18,88,25,7,81,38,41,10,69,86,32,11,33,1,10,22,84,14,92,48,79,10,3,62,33,61,13,93,78,20,63,68,17,80,34,12,8,23,61,90,51,17,84,37,46,64,25,3,73,19,45,99,41,62,21,77,8,17,89,9,13,84,75,85,14,53,60,6,29,76,63,14,23,63,61,93,72,17,41,28,94,5,3,19,47,57,55,14,34,38,79,85,40,13,22,99,67,72,15,62,15,6,63,3,90,2,87,20,84,15,50,70,27,18,78,21,70,48,52,2,99,92,55,3,46,41,93,99,88,13,39,4,45,71,3,96,1,91,59,31,53,23,25,82,32,50,16,60,38,78,34,59,30,15,51,92,3,22,26,62,60,37,42,74,28,21,76,7,24,70,18,40,11,81,41,9,73,62,12,66,81,9,3,74,62,11,6,56,16,34,20,78,79,1,97,17,39,87,15,12,77,94,28,22,66,45,59,39,2,6,52,6,72,49,17,92,15,86,18,92,79,67,20,22,72,10,72,3,52,26,77,78,41,97,36,59,88,24,57,12,38,90,53,14,38,67,2,36,44,93,99,10,41,49,3,16,7,63,32,11,15,81,12,91,39,62,19,83,6,91,28,19,80,38,23,63,31,71,14,58,8,21,71,21,21,81,38,26,32,29,82,52,28,72,54,97,41,65,96,75,1,48,28,80,66,25,47,49,29,87,51,12,50,70,36,60,81,29,77,76,55,25,40,45,83,91,26,72,99,12,47,11,20,27,52,9,98,17,99,27,37,62,25,3,15,73,66,22,5,85,5,20,98,20,38,62,78,21,16,59,28,98,38,31,2,40,46,87,14,48,33,80,48,36,27,56,21,1,50,83,3,61,92,20,52,16,50,10,86,9,98,39,56,25,50,42,39,91,81,56,25,70,44,24,15,99,4,20,55,12,98,27,65,20,77,97,76,36,42,87,6,11,79,65,16,65,44,13,90,13,48,79,13,95,60,19,55,24,66,4,53,11,23,68,14,97,53,45,14,16,93,18,29,83,5,6,77,19,70,97,34,20,70,52,11,74,14,72,10,36,44,33,45,19,38,36,77,5,37,51,1,55,17,2,48,23,18,2,34,90,97,24,30,51,66,33,70,51,37,31,51,37,65,55,18,8,66,4,65,62,26,93,29,88,3,75,73,24,23,67,1,13,68,7,36,87,62,48,1,31,45,28,62,86,24,98,1,59,49,37,26,62,36,44,66,18,17,97,92,40,36,65,80,84,5,84,6,79,87,36,31,96,15,71,96,2,72,11,81,95,94,41,54,31,58,25,74,24,51,81,38,32,73,22,96,40,62,22,59,74,39,25,86,2,55,20,61,40,37,88,69,1,60,42,18,31,54,13,27,19,93,34,41,99,33,89,20,16,52,84,32,94,31,6,61,25,1,61,1,38,78,87,39,31,39,26,68,42,36,2,94,66,2,67,30,80,2,95,65,40,54,50,33,11,23,97,89,1,31,56,9,35,49,92,55,23,84,48,91,20,7,72,25,55,3,85,3,16,40,90,22,99,44,38,86,98,11,76,26,76,13,82,80,24,93,4,15,64,95,58,15,85,25,57,29,66,3,66,19,98,57,24,44,59,35,76,48,31,92,33,94,68,56,41,45,15,46,5,68,15,65,34,73,49,68,17,78,28,80,24,59,26,74,21,52,1,94,5,61,41,88,37,56,1,49,0,0,21,21,1,10,1,0,0,0,0,0,0 \ No newline at end of file From 64d790da75a73c033aa4df49444e8a7482656fe9 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 16 Dec 2019 07:23:27 +0100 Subject: [PATCH 083/433] Day 16 --- .../sbaars/adventofcode2019/days/Day16.java | 154 ++++++++++++++++++ src/main/resources/day16.txt | 1 + src/main/resources/day17.txt | 1 + src/main/resources/day18.txt | 1 + 4 files changed, 157 insertions(+) create mode 100644 src/main/java/com/sbaars/adventofcode2019/days/Day16.java create mode 100644 src/main/resources/day16.txt create mode 100644 src/main/resources/day17.txt create mode 100644 src/main/resources/day18.txt diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day16.java b/src/main/java/com/sbaars/adventofcode2019/days/Day16.java new file mode 100644 index 00000000..e2f9c3c8 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day16.java @@ -0,0 +1,154 @@ +package com.sbaars.adventofcode2019.days; + +import java.awt.Point; +import java.io.IOException; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import com.sbaars.adventofcode2019.common.Day; +import com.sbaars.adventofcode2019.util.CountMap; + +public class Day16 implements Day { + + int targetPos = 5977341; + + public static void main(String[] args) throws IOException { + new Day16().part2(); + } + + @Override + public Object part1() throws IOException { + int[] nums = readDay(16).chars().map(e -> Character.getNumericValue(e)).toArray(); + //System.out.println(Arrays.toString(nums)); + int[] pattern = {0, 1, 0, -1}; + for(int phase = 0; phase<100; phase++) { + int[] newNums = new int[nums.length]; + int timesEachElement = 1; + for(int j = 0; j= 0; n --, i *= 10) + { + result += Math.abs(arr[n]) * i; + } + + if (arr[0] < 0) //if there's a negative sign in the beginning, flip the sign + { + result = - result; + } + + return result; + } + + + private int lastDigit(int number) { + return Math.abs(number) % 10; + } + + @Override + public Object part2() throws IOException { + int[] actNums = readDay(16).chars().map(e -> Character.getNumericValue(e)).toArray(); + + int totalTimes = 10000; + //System.out.println(nums.length); + //int[] nums = repeat(actNums, 10000); + //System.out.println(Arrays.toString(nums)); + int[] pattern = {0, 1, 0, -1}; + for(int phase = 0; phase<100; phase++) { + System.out.println("Phase "+phase); + int[] newNums = new int[totalTimes]; + int timesEachElement = 1; + for(int j = 0; j numsForIndices = new HashMap<>(); + CountMap timesEachPoint = new CountMap<>(); + for(int o = 0; o arr : numsForIndices.entrySet()) { + sum+=Arrays.stream(arr.getValue()).sum() * timesEachPoint.get(arr.getKey()); + } + newNums[j] = lastDigit(sum); + timesEachElement++; + } + //System.out.println(arrayToInt(newNums)); + //System.out.println(Arrays.toString(newNums)); + if(phase == 99) { + for(int i = 5977341; i<5977341+8; i++) { + System.out.println(newNums[i]); + } + } + actNums = newNums; + } + return 0; + } + + public static int[] repeat(int[] arr, int newLength) { + newLength = newLength * arr.length; + int[] dup = Arrays.copyOf(arr, newLength); + for (int last = arr.length; last != 0 && last < newLength; last <<= 1) { + System.arraycopy(dup, 0, dup, last, Math.min(last << 1, newLength) - last); + } + return dup; + } + +} diff --git a/src/main/resources/day16.txt b/src/main/resources/day16.txt new file mode 100644 index 00000000..1101f127 --- /dev/null +++ b/src/main/resources/day16.txt @@ -0,0 +1 @@ +59773419794631560412886746550049210714854107066028081032096591759575145680294995770741204955183395640103527371801225795364363411455113236683168088750631442993123053909358252440339859092431844641600092736006758954422097244486920945182483159023820538645717611051770509314159895220529097322723261391627686997403783043710213655074108451646685558064317469095295303320622883691266307865809481566214524686422834824930414730886697237161697731339757655485312568793531202988525963494119232351266908405705634244498096660057021101738706453735025060225814133166491989584616948876879383198021336484629381888934600383957019607807995278899293254143523702000576897358 \ No newline at end of file diff --git a/src/main/resources/day17.txt b/src/main/resources/day17.txt new file mode 100644 index 00000000..e9a9ea1f --- /dev/null +++ b/src/main/resources/day17.txt @@ -0,0 +1 @@ +12345678 \ No newline at end of file diff --git a/src/main/resources/day18.txt b/src/main/resources/day18.txt new file mode 100644 index 00000000..1a27961e --- /dev/null +++ b/src/main/resources/day18.txt @@ -0,0 +1 @@ +80871224585914546619083218645595 \ No newline at end of file From 5cc71d10d4fdd2126ce929b5836b145608c80224 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 16 Dec 2019 08:26:42 +0100 Subject: [PATCH 084/433] Improved and refactored algorithm --- .../sbaars/adventofcode2019/days/Day16.java | 58 ++++++++++++------- 1 file changed, 36 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day16.java b/src/main/java/com/sbaars/adventofcode2019/days/Day16.java index e2f9c3c8..0fed65a0 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day16.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day16.java @@ -1,14 +1,9 @@ package com.sbaars.adventofcode2019.days; -import java.awt.Point; import java.io.IOException; import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; import com.sbaars.adventofcode2019.common.Day; -import com.sbaars.adventofcode2019.util.CountMap; public class Day16 implements Day { @@ -77,23 +72,42 @@ private int lastDigit(int number) { @Override public Object part2() throws IOException { - int[] actNums = readDay(16).chars().map(e -> Character.getNumericValue(e)).toArray(); - - int totalTimes = 10000; + int[] nums = readDay(16).chars().map(e -> Character.getNumericValue(e)).toArray(); + nums = repeat(nums, 10000); //System.out.println(nums.length); //int[] nums = repeat(actNums, 10000); //System.out.println(Arrays.toString(nums)); int[] pattern = {0, 1, 0, -1}; + + int[] res = new int[nums.length]; for(int phase = 0; phase<100; phase++) { System.out.println("Phase "+phase); - int[] newNums = new int[totalTimes]; - int timesEachElement = 1; - for(int j = 0; j= res.length) break; + loc=k; + } + res[i]=Math.abs(sum)%10; + } + + System.arraycopy(res, 0, nums, 0, res.length); + //nums=Arrays.copyOf(res,res.length); + //int timesEachElement = 1; + //for(int j = 0; j numsForIndices = new HashMap<>(); - CountMap timesEachPoint = new CountMap<>(); - for(int o = 0; o numsForIndices = new HashMap<>(); + //CountMap timesEachPoint = new CountMap<>(); + /*for(int o = 0; o arr : numsForIndices.entrySet()) { sum+=Arrays.stream(arr.getValue()).sum() * timesEachPoint.get(arr.getKey()); } newNums[j] = lastDigit(sum); - timesEachElement++; + timesEachElement++;*/ } //System.out.println(arrayToInt(newNums)); //System.out.println(Arrays.toString(newNums)); - if(phase == 99) { + //if(phase == 99) { for(int i = 5977341; i<5977341+8; i++) { - System.out.println(newNums[i]); + System.out.println(res[i]); } - } - actNums = newNums; - } + //} + //actNums = newNums; + //} return 0; } From aa4169cd163d2f4d49a77b5dc62c73b6a3458a5a Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 16 Dec 2019 19:08:31 +0100 Subject: [PATCH 085/433] Runbot --- .../adventofcode2019/common/Direction.java | 20 ++++- .../sbaars/adventofcode2019/days/Day15.java | 74 +++++++++++++++++-- .../adventofcode2019/pathfinding/Example.java | 6 +- .../adventofcode2019/pathfinding/Grid2d.java | 15 ++-- src/main/resources/day17.txt | 1 - src/main/resources/day18.txt | 1 - 6 files changed, 100 insertions(+), 17 deletions(-) delete mode 100644 src/main/resources/day17.txt delete mode 100644 src/main/resources/day18.txt diff --git a/src/main/java/com/sbaars/adventofcode2019/common/Direction.java b/src/main/java/com/sbaars/adventofcode2019/common/Direction.java index b81ac8bc..42d1e0a5 100644 --- a/src/main/java/com/sbaars/adventofcode2019/common/Direction.java +++ b/src/main/java/com/sbaars/adventofcode2019/common/Direction.java @@ -34,6 +34,24 @@ public Point move(Point currentLocation) { case EAST: return new Point(currentLocation.x+1, currentLocation.y); case WEST: return new Point(currentLocation.x-1, currentLocation.y); } - return null; + throw new IllegalStateException("Non-existent Direction: "+this); + } + + public Direction opposite() { + switch (this) { + case NORTH: return SOUTH; + case SOUTH: return NORTH; + case EAST: return WEST; + case WEST: return EAST; + } + throw new IllegalStateException("Non-existent Direction: "+this); + } + + public static Direction getByMove(Point from, Point to) { + if(to.x > from.x) return EAST; + else if(to.x < from.x) return WEST; + else if(to.y > from.y) return SOUTH; + else if(to.y < from.y) return NORTH; + throw new IllegalStateException("From and to location are the same: "+from+", "+to); } } \ No newline at end of file diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day15.java b/src/main/java/com/sbaars/adventofcode2019/days/Day15.java index f5a92c81..04ed4f75 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day15.java @@ -9,8 +9,16 @@ import com.sbaars.adventofcode2019.common.Day; import com.sbaars.adventofcode2019.common.Direction; import com.sbaars.adventofcode2019.intcode.IntcodeComputer; +import com.sbaars.adventofcode2019.pathfinding.Grid2d; public class Day15 implements Day { + + private static final int UNEXPLORED = -1; + private static final int WALL = 0; + private static final int PATH = 1; + private static final int FINISH = 2; + private static final int BOARD_SIZE = 100; + private static final Point START_POINT = new Point(BOARD_SIZE/2,BOARD_SIZE/2); public static void main(String[] args) throws IOException { new Day15().printParts(); @@ -19,14 +27,68 @@ public static void main(String[] args) throws IOException { @Override public Object part1() throws IOException { IntcodeComputer ic = new IntcodeComputer(15); - List walls = new ArrayList<>(); - Point pos = new Point(50,50); - int[][] grid = new int[100][100]; - for(int[] row : grid) Arrays.fill(row, -1); + Point pos = START_POINT; + int[][] grid = new int[BOARD_SIZE][BOARD_SIZE]; + for(int[] row : grid) Arrays.fill(row, UNEXPLORED); grid[pos.y][pos.x] = 0; - Direction dir = Direction.NORTH; while(true) { - ic.run(); + explore(grid, pos, ic); + pos = moveToUnexploredPlace(grid, pos, ic); + if(pos == null) { + Grid2d map2d = new Grid2d(grid, false); + System.out.println(Arrays.deepToString(grid)); + return map2d.findPath(START_POINT, findPos(grid, FINISH).get(0)).length; + } + } + } + + private Point moveToUnexploredPlace(int[][] grid, Point pos, IntcodeComputer ic) { + List corridorSpaces = findPos(grid, PATH); + for(Point p : corridorSpaces) { + if(hasAdjecent(grid, p, UNEXPLORED)) { + Grid2d map2d = new Grid2d(grid, false); + Point[] route = map2d.findPath(START_POINT, findPos(grid, FINISH).get(0)); + traverseRoute(ic, pos, route); + return p; + } + } + return null; + } + + private void traverseRoute(IntcodeComputer ic, Point pos, Point[] route) { + for(Point p : route) { + ic.run(Direction.getByMove(pos, p).num); + } + } + + private boolean hasAdjecent(int[][] grid, Point pos, int tile) { + return grid[pos.y+1][pos.x] == tile || grid[pos.y][pos.x+1] == tile || grid[pos.y-1][pos.x] == tile || grid[pos.y][pos.x-1] == tile; + } + + private List findPos(int[][] grid, int tile) { + List positions = new ArrayList<>(); + for(int y = 0; y findPath(int xStart, int yStart, int xGoal, int yGoal) { - return PathFinding.doAStar(new MapNode(xStart, yStart), new MapNode( - xGoal, yGoal)); + public Point[] findPath(Point start, Point end) { + return PathFinding.doAStar(new MapNode(start.x, start.y), new MapNode(end.x, end.y)).stream().map(MapNode::toPoint).toArray(Point[]::new); } } diff --git a/src/main/resources/day17.txt b/src/main/resources/day17.txt deleted file mode 100644 index e9a9ea1f..00000000 --- a/src/main/resources/day17.txt +++ /dev/null @@ -1 +0,0 @@ -12345678 \ No newline at end of file diff --git a/src/main/resources/day18.txt b/src/main/resources/day18.txt deleted file mode 100644 index 1a27961e..00000000 --- a/src/main/resources/day18.txt +++ /dev/null @@ -1 +0,0 @@ -80871224585914546619083218645595 \ No newline at end of file From 8690890d75669144dee8ddabb7086a20f5026cae Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 16 Dec 2019 19:11:49 +0100 Subject: [PATCH 086/433] Ignore classpath --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 5f2dbe11..ab2cc913 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,5 @@ buildNumber.properties # Avoid ignoring Maven wrapper jar file (.jar files are usually ignored) !/.mvn/wrapper/maven-wrapper.jar + +.classpath From 1e08a6bb02da376a76703f11d2fa0b3266a432a6 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 16 Dec 2019 19:45:43 +0100 Subject: [PATCH 087/433] Stuff --- .../adventofcode2019/common/Direction.java | 4 ++-- .../sbaars/adventofcode2019/common/OCR.java | 14 ++++++++------ .../sbaars/adventofcode2019/days/Day15.java | 18 +++++++++--------- .../intcode/IntcodeComputer.java | 7 ++++--- .../adventofcode2019/pathfinding/Example.java | 2 +- .../adventofcode2019/pathfinding/Grid2d.java | 8 +++++--- .../pathfinding/PathFinding.java | 2 +- .../sbaars/adventofcode2019/IntcodeTest.java | 4 ++-- 8 files changed, 32 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/common/Direction.java b/src/main/java/com/sbaars/adventofcode2019/common/Direction.java index 42d1e0a5..2464e705 100644 --- a/src/main/java/com/sbaars/adventofcode2019/common/Direction.java +++ b/src/main/java/com/sbaars/adventofcode2019/common/Direction.java @@ -29,8 +29,8 @@ public Direction turn(boolean right) { public Point move(Point currentLocation) { switch (this) { - case NORTH: return new Point(currentLocation.x, currentLocation.y+1); - case SOUTH: return new Point(currentLocation.x, currentLocation.y-1); + case SOUTH: return new Point(currentLocation.x, currentLocation.y+1); + case NORTH: return new Point(currentLocation.x, currentLocation.y-1); case EAST: return new Point(currentLocation.x+1, currentLocation.y); case WEST: return new Point(currentLocation.x-1, currentLocation.y); } diff --git a/src/main/java/com/sbaars/adventofcode2019/common/OCR.java b/src/main/java/com/sbaars/adventofcode2019/common/OCR.java index 470e7c50..a75fdf1e 100644 --- a/src/main/java/com/sbaars/adventofcode2019/common/OCR.java +++ b/src/main/java/com/sbaars/adventofcode2019/common/OCR.java @@ -1,6 +1,7 @@ package com.sbaars.adventofcode2019.common; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; @SuppressWarnings("preview") @@ -29,7 +30,7 @@ public String toString() { case " ██ " -> middleTwo(character); case " ██" -> 'J'; case "â–ˆ " -> 'L'; - default -> dontKnow(); + default -> dontKnow(character); }); } return result.toString(); @@ -39,7 +40,7 @@ private char bothSides(String[] character) { return switch(character[5]) { case " ██ " -> 'U'; case "â–ˆ â–ˆ" -> 'H'; - default -> dontKnow(); + default -> dontKnow(character); }; } @@ -47,11 +48,12 @@ private char middleTwo(String[] character) { return switch(character[5]) { case " ███" -> 'G'; case "â–ˆ â–ˆ" -> 'A'; - default -> dontKnow(); + default -> dontKnow(character); }; } - private char dontKnow() { + private char dontKnow(String[] character) { + Arrays.stream(character).forEach(System.out::println); throw new IllegalArgumentException("I don't know your character yet!"); } @@ -59,7 +61,7 @@ private char fullTop(String[] character) { return switch(character[5]) { case "â–ˆ " -> 'F'; case "████" -> 'E'; - default -> dontKnow(); + default -> dontKnow(character); }; } @@ -67,7 +69,7 @@ private char threeTopLeft(String[] character) { return switch(character[5]) { case "â–ˆ " -> 'P'; case "â–ˆ â–ˆ" -> 'R'; - default -> dontKnow(); + default -> dontKnow(character); }; } diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day15.java b/src/main/java/com/sbaars/adventofcode2019/days/Day15.java index 04ed4f75..668b92a0 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day15.java @@ -13,11 +13,11 @@ public class Day15 implements Day { - private static final int UNEXPLORED = -1; + private static final int UNEXPLORED = 3; private static final int WALL = 0; private static final int PATH = 1; private static final int FINISH = 2; - private static final int BOARD_SIZE = 100; + private static final int BOARD_SIZE = 60; private static final Point START_POINT = new Point(BOARD_SIZE/2,BOARD_SIZE/2); public static void main(String[] args) throws IOException { @@ -32,12 +32,14 @@ public Object part1() throws IOException { for(int[] row : grid) Arrays.fill(row, UNEXPLORED); grid[pos.y][pos.x] = 0; while(true) { + System.out.println("Current pos = "+pos); + Arrays.stream(grid).map(e -> Arrays.toString(e)).forEach(System.out::println); explore(grid, pos, ic); pos = moveToUnexploredPlace(grid, pos, ic); if(pos == null) { Grid2d map2d = new Grid2d(grid, false); System.out.println(Arrays.deepToString(grid)); - return map2d.findPath(START_POINT, findPos(grid, FINISH).get(0)).length; + return map2d.findPath(START_POINT, findPos(grid, FINISH).get(0)).size(); } } } @@ -47,15 +49,15 @@ private Point moveToUnexploredPlace(int[][] grid, Point pos, IntcodeComputer ic) for(Point p : corridorSpaces) { if(hasAdjecent(grid, p, UNEXPLORED)) { Grid2d map2d = new Grid2d(grid, false); - Point[] route = map2d.findPath(START_POINT, findPos(grid, FINISH).get(0)); - traverseRoute(ic, pos, route); + List route = map2d.findPath(pos, p); + traverseRoute(ic, pos, route.subList(1, route.size())); return p; } } return null; } - private void traverseRoute(IntcodeComputer ic, Point pos, Point[] route) { + private void traverseRoute(IntcodeComputer ic, Point pos, List route) { for(Point p : route) { ic.run(Direction.getByMove(pos, p).num); } @@ -81,9 +83,7 @@ private void explore(int[][] grid, Point pos, IntcodeComputer ic) { for(int i = 0; i<4;i++) { Point move = dir.move(pos); if(grid[move.y][move.x] == UNEXPLORED) { - long run = ic.run(dir.num); - System.out.println(run); - grid[move.y][move.x] = Math.toIntExact(run); + grid[move.y][move.x] = Math.toIntExact(ic.run(dir.num)); if(grid[move.y][move.x] != WALL) { ic.run(dir.opposite().num); // Move back } diff --git a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java index d484e707..6da0b10f 100644 --- a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java +++ b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java @@ -17,10 +17,11 @@ public class IntcodeComputer implements DoesFileOperations { private long relativeBase = 0; private static final int[] DO_NOT_TRANSFORM_FINAL_ARGUMENT = {1, 2, 3, 7, 8}; public static final long STOP_CODE = Long.MIN_VALUE+1; + private static final long CONTINUE_CODE = Long.MIN_VALUE; public IntcodeComputer(int day, long...input) throws IOException { this.program = Arrays.stream(readDay(day).split(",")).mapToLong(Long::parseLong).toArray(); - this.program = Arrays.copyOf(this.program, 10000); // Quick hack to enlange memory, should be refactored. + this.program = Arrays.copyOf(this.program, 10000); // Quick hack to enlarge memory, should be refactored later(tm). setInput(input); if(day == 2) { program[1] = input[0]; @@ -35,7 +36,7 @@ public long run(long input) { public long run() { long result; - while((result = executeInstruction(Math.toIntExact(program[instructionCounter]))) == Integer.MIN_VALUE); + while((result = executeInstruction(Math.toIntExact(program[instructionCounter]))) == CONTINUE_CODE); return result; } @@ -99,7 +100,7 @@ private long executeInstruction(long[] args, int instruction) { case 99: return STOP_CODE; default: throw new IllegalStateException("Something went wrong!"); } - return Long.MIN_VALUE; + return CONTINUE_CODE; } private long parseComplexInstruction(int instruction) { diff --git a/src/main/java/com/sbaars/adventofcode2019/pathfinding/Example.java b/src/main/java/com/sbaars/adventofcode2019/pathfinding/Example.java index 4d167f0b..a8d039b3 100644 --- a/src/main/java/com/sbaars/adventofcode2019/pathfinding/Example.java +++ b/src/main/java/com/sbaars/adventofcode2019/pathfinding/Example.java @@ -8,7 +8,7 @@ public Example() { { 0, 0, 0, 1, 0 }, { 1, 1, 1, 1, 0} }; Grid2d map2d = new Grid2d(map, false); - System.out.println(map2d.findPath(new Point(0, 0), new Point(4, 2))); + //System.out.println(map2d.findPath(new Point(0, 0), new Point(4, 2))); } public static void main(String[] args) { diff --git a/src/main/java/com/sbaars/adventofcode2019/pathfinding/Grid2d.java b/src/main/java/com/sbaars/adventofcode2019/pathfinding/Grid2d.java index ea2a41bf..f93bb40c 100644 --- a/src/main/java/com/sbaars/adventofcode2019/pathfinding/Grid2d.java +++ b/src/main/java/com/sbaars/adventofcode2019/pathfinding/Grid2d.java @@ -2,7 +2,9 @@ import java.awt.Point; import java.util.HashSet; +import java.util.List; import java.util.Set; +import java.util.stream.Collectors; /** * Creates nodes and neighbours from a 2d grid. Each point in the map has an @@ -63,7 +65,7 @@ public Set getNeighbours() { continue; } - if (map[j][i] == 1) { + if (map[j][i] < 1) { continue; } @@ -123,8 +125,8 @@ public Grid2d(int[][] map, boolean allowDiagonal) { this.allowDiagonal = allowDiagonal; } - public Point[] findPath(Point start, Point end) { - return PathFinding.doAStar(new MapNode(start.x, start.y), new MapNode(end.x, end.y)).stream().map(MapNode::toPoint).toArray(Point[]::new); + public List findPath(Point start, Point end) { + return PathFinding.doAStar(new MapNode(start.x, start.y), new MapNode(end.x, end.y)).stream().map(MapNode::toPoint).collect(Collectors.toList()); } } diff --git a/src/main/java/com/sbaars/adventofcode2019/pathfinding/PathFinding.java b/src/main/java/com/sbaars/adventofcode2019/pathfinding/PathFinding.java index 51ec92d5..95369ddc 100644 --- a/src/main/java/com/sbaars/adventofcode2019/pathfinding/PathFinding.java +++ b/src/main/java/com/sbaars/adventofcode2019/pathfinding/PathFinding.java @@ -80,7 +80,7 @@ public int compare(T nodeA, T nodeB) { } } - return null; + return route; } } diff --git a/src/test/java/com/sbaars/adventofcode2019/IntcodeTest.java b/src/test/java/com/sbaars/adventofcode2019/IntcodeTest.java index 5e91b170..760ce827 100644 --- a/src/test/java/com/sbaars/adventofcode2019/IntcodeTest.java +++ b/src/test/java/com/sbaars/adventofcode2019/IntcodeTest.java @@ -24,8 +24,8 @@ public void testDay5() throws IOException { } public void testDay7() throws IOException { - Assert.assertEquals(116680, new Day7().part1()); - Assert.assertEquals(89603079, new Day7().part2()); + Assert.assertEquals(116680L, new Day7().part1()); + Assert.assertEquals(89603079L, new Day7().part2()); } public void testDay9() throws IOException { From 3add9f97c54399dd72d3cc12dc723c51593b7e0f Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 17 Dec 2019 07:14:40 +0100 Subject: [PATCH 088/433] Day 17 --- .../adventofcode2019/common/Direction.java | 20 ++- .../sbaars/adventofcode2019/days/Day17.java | 155 ++++++++++++++++++ .../intcode/IntcodeComputer.java | 2 + src/main/resources/day17.txt | 1 + 4 files changed, 173 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode2019/days/Day17.java create mode 100644 src/main/resources/day17.txt diff --git a/src/main/java/com/sbaars/adventofcode2019/common/Direction.java b/src/main/java/com/sbaars/adventofcode2019/common/Direction.java index 2464e705..8f85dbe1 100644 --- a/src/main/java/com/sbaars/adventofcode2019/common/Direction.java +++ b/src/main/java/com/sbaars/adventofcode2019/common/Direction.java @@ -27,15 +27,19 @@ public Direction turn(boolean right) { return Direction.values()[cur]; } - public Point move(Point currentLocation) { + public Point move(Point currentLocation, int amount) { switch (this) { - case SOUTH: return new Point(currentLocation.x, currentLocation.y+1); - case NORTH: return new Point(currentLocation.x, currentLocation.y-1); - case EAST: return new Point(currentLocation.x+1, currentLocation.y); - case WEST: return new Point(currentLocation.x-1, currentLocation.y); + case SOUTH: return new Point(currentLocation.x, currentLocation.y+amount); + case NORTH: return new Point(currentLocation.x, currentLocation.y-amount); + case EAST: return new Point(currentLocation.x+amount, currentLocation.y); + case WEST: return new Point(currentLocation.x-amount, currentLocation.y); } throw new IllegalStateException("Non-existent Direction: "+this); } + + public Point move(Point currentLocation) { + return move(currentLocation, 1); + } public Direction opposite() { switch (this) { @@ -54,4 +58,10 @@ public static Direction getByMove(Point from, Point to) { else if(to.y < from.y) return NORTH; throw new IllegalStateException("From and to location are the same: "+from+", "+to); } + + public boolean leftOf(Direction robotDir) { + int n = this.ordinal()-1; + if(n == -1) n = values().length-1; + return robotDir.ordinal() == n; + } } \ No newline at end of file diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day17.java b/src/main/java/com/sbaars/adventofcode2019/days/Day17.java new file mode 100644 index 00000000..87b2cd32 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day17.java @@ -0,0 +1,155 @@ +package com.sbaars.adventofcode2019.days; + +import java.awt.Point; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import com.sbaars.adventofcode2019.common.Day; +import com.sbaars.adventofcode2019.common.Direction; +import com.sbaars.adventofcode2019.intcode.IntcodeComputer; + +public class Day17 implements Day { + + public static void main(String[] args) throws IOException { + new Day17().printParts(); + } + + @Override + public Object part1() throws IOException { + char[][] grid = new char[48][48]; + readDay(17); + IntcodeComputer ic = new IntcodeComputer(17, 1); + long res; + int x = 0, y =0; + int result = 0; + while((res = ic.run()) != IntcodeComputer.STOP_CODE) { + System.out.print((char)res); + if(res == 10) { + y++; + x= 0; + } else { + grid[y][x] = (char)res; + x++; + } + } + for(y = 1; y instructions = new ArrayList<>(); + List traversed = new ArrayList<>(); + Direction dir; + Direction robotDir = Direction.NORTH; + while((dir = directionContainsSomethingAndUntraversed(grid, pos, traversed)) != null) { + int n; + for(n = 1; getGrid(grid, dir.move(pos, n)) == '#'; n++) traversed.add(dir.move(pos, n)); + pos = dir.move(pos, n-1); + instructions.add(new Instruction(n-1, dir.leftOf(robotDir) ? Dir.R : Dir.L)); + robotDir = dir; + } + System.out.println(Arrays.toString(instructions.toArray())); + List good = new ArrayList<>(); + int start = 0; + for(int i = 1; i is = instructions.subList(start, i); + if(toString(is).length()>20) { + good.add(toString(instructions.subList(start, i-1))); + start = i-1; + } + } + good.add(toString(instructions.subList(start, instructions.size()))); + good.stream().forEach(System.out::println); + String stuff = "A,B,C,D,E,F,G,H\n" + good.stream().collect(Collectors.joining("\n"))+"\nn\n"; + System.out.println(stuff); + long[] asciis = stuff.chars().mapToLong(e -> e).toArray(); + ic = new IntcodeComputer(17, 2); + ic.setInput(asciis); + System.out.println(Arrays.toString(asciis)); + while((res = ic.run()) != IntcodeComputer.STOP_CODE) { + System.out.print((char)res); + } + return 0; + } + + public String toString(List i) { + return i.stream().map(Instruction::toString).collect(Collectors.joining(",")); + } + + private char getGrid(char[][] grid, Point p) { + if(p.x < 0 || p.y < 0 || p.x>=grid[0].length || p.y>=grid.length) return '.'; + return grid[p.y][p.x]; + } + + private Direction directionContainsSomethingAndUntraversed(char[][] grid, Point pos, List traversed) { + Direction dir = Direction.NORTH; + for(int i = 0; i<4; i++) { + Point p = dir.move(pos); + if(getGrid(grid, p) == '#' && !traversed.contains(p)) { + return dir; + } + dir = dir.turn(true); + } + return null; + } + + private List findPos(char[][] grid, char tile) { + List positions = new ArrayList<>(); + for(int y = 0; y Date: Tue, 17 Dec 2019 07:41:07 +0100 Subject: [PATCH 089/433] Oh, only three programs are allowed, then I'll hardcode --- .../com/sbaars/adventofcode2019/days/Day17.java | 14 +++++++------- .../adventofcode2019/intcode/IntcodeComputer.java | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day17.java b/src/main/java/com/sbaars/adventofcode2019/days/Day17.java index 87b2cd32..325f1cbb 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day17.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day17.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -54,10 +55,9 @@ private boolean hasAdjecent(char[][] grid, Point pos, char tile) { public Object part2() throws IOException { char[][] grid = new char[48][48]; readDay(17); - IntcodeComputer ic = new IntcodeComputer(17, 2); + IntcodeComputer ic = new IntcodeComputer(17, 1); long res; int x = 0, y = 0; - int result = 0; while((res = ic.run()) != IntcodeComputer.STOP_CODE) { if(res == 10) { y++; @@ -92,18 +92,18 @@ public Object part2() throws IOException { } good.add(toString(instructions.subList(start, instructions.size()))); good.stream().forEach(System.out::println); - String stuff = "A,B,C,D,E,F,G,H\n" + good.stream().collect(Collectors.joining("\n"))+"\nn\n"; + String stuff = "A,A,B,C,B,A,C,B,C,A\nL,6,R,12,L,6,L,8,L,8\nL,6,R,12,R,8,L,8\nL,4,L,4,L,6\nn\n"; System.out.println(stuff); long[] asciis = stuff.chars().mapToLong(e -> e).toArray(); ic = new IntcodeComputer(17, 2); ic.setInput(asciis); System.out.println(Arrays.toString(asciis)); - while((res = ic.run()) != IntcodeComputer.STOP_CODE) { - System.out.print((char)res); + while(true) { + if((res = ic.run())>255L) + return res; } - return 0; } - + public String toString(List i) { return i.stream().map(Instruction::toString).collect(Collectors.joining(",")); } diff --git a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java index 77975d0c..430f373b 100644 --- a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java +++ b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java @@ -26,7 +26,7 @@ public IntcodeComputer(int day, long...input) throws IOException { if(day == 2) { program[1] = input[0]; program[2] = input[1]; - } else if(day == 7) { + } else if(day == 17) { program[0] = input[0]; } } From dad29c24a6e86db5bd4db7f10b446b71d468a60f Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 17 Dec 2019 08:32:06 +0100 Subject: [PATCH 090/433] Refactor day 16 --- .../sbaars/adventofcode2019/days/Day16.java | 148 +++--------------- .../sbaars/adventofcode2019/days/Day17.java | 6 - 2 files changed, 24 insertions(+), 130 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day16.java b/src/main/java/com/sbaars/adventofcode2019/days/Day16.java index 0fed65a0..f2023f91 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day16.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day16.java @@ -2,95 +2,47 @@ import java.io.IOException; import java.util.Arrays; +import java.util.stream.Collectors; +import java.util.stream.IntStream; import com.sbaars.adventofcode2019.common.Day; public class Day16 implements Day { + + private static final int TARGET_POS = 5977341; + private final int[] input; - int targetPos = 5977341; + public Day16() throws IOException { + input = readDay(16).chars().map(e -> Character.getNumericValue(e)).toArray(); + } public static void main(String[] args) throws IOException { - new Day16().part2(); + new Day16().printParts(); } @Override public Object part1() throws IOException { - int[] nums = readDay(16).chars().map(e -> Character.getNumericValue(e)).toArray(); - //System.out.println(Arrays.toString(nums)); - int[] pattern = {0, 1, 0, -1}; - for(int phase = 0; phase<100; phase++) { - int[] newNums = new int[nums.length]; - int timesEachElement = 1; - for(int j = 0; j= 0; n --, i *= 10) - { - result += Math.abs(arr[n]) * i; - } - - if (arr[0] < 0) //if there's a negative sign in the beginning, flip the sign - { - result = - result; - } - return result; - } - - - private int lastDigit(int number) { - return Math.abs(number) % 10; - } - @Override public Object part2() throws IOException { - int[] nums = readDay(16).chars().map(e -> Character.getNumericValue(e)).toArray(); - nums = repeat(nums, 10000); - //System.out.println(nums.length); - //int[] nums = repeat(actNums, 10000); - //System.out.println(Arrays.toString(nums)); + return calcRes(repeat(input, 10000), TARGET_POS); + } + + private Object calcRes(int[] nums, final int offset) { int[] pattern = {0, 1, 0, -1}; - + int[] res = new int[nums.length]; for(int phase = 0; phase<100; phase++) { - System.out.println("Phase "+phase); - int[] newNums = new int[nums.length+1]; for(int i=0;i= res.length) break; @@ -98,71 +50,19 @@ public Object part2() throws IOException { } res[i]=Math.abs(sum)%10; } - + System.arraycopy(res, 0, nums, 0, res.length); - //nums=Arrays.copyOf(res,res.length); - //int timesEachElement = 1; - //for(int j = 0; j numsForIndices = new HashMap<>(); - //CountMap timesEachPoint = new CountMap<>(); - /*for(int o = 0; o arr : numsForIndices.entrySet()) { - sum+=Arrays.stream(arr.getValue()).sum() * timesEachPoint.get(arr.getKey()); - } - newNums[j] = lastDigit(sum); - timesEachElement++;*/ } - //System.out.println(arrayToInt(newNums)); - //System.out.println(Arrays.toString(newNums)); - //if(phase == 99) { - for(int i = 5977341; i<5977341+8; i++) { - System.out.println(res[i]); - } - //} - //actNums = newNums; - //} - return 0; + return IntStream.range(offset, offset+8).map(i -> res[i]).mapToObj(Integer::toString).collect(Collectors.joining()); } - + public static int[] repeat(int[] arr, int newLength) { newLength = newLength * arr.length; - int[] dup = Arrays.copyOf(arr, newLength); - for (int last = arr.length; last != 0 && last < newLength; last <<= 1) { - System.arraycopy(dup, 0, dup, last, Math.min(last << 1, newLength) - last); - } - return dup; + int[] dup = Arrays.copyOf(arr, newLength); + for (int last = arr.length; last != 0 && last < newLength; last <<= 1) { + System.arraycopy(dup, 0, dup, last, Math.min(last << 1, newLength) - last); + } + return dup; } } diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day17.java b/src/main/java/com/sbaars/adventofcode2019/days/Day17.java index 325f1cbb..7841d8a9 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day17.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day17.java @@ -4,7 +4,6 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -21,7 +20,6 @@ public static void main(String[] args) throws IOException { @Override public Object part1() throws IOException { char[][] grid = new char[48][48]; - readDay(17); IntcodeComputer ic = new IntcodeComputer(17, 1); long res; int x = 0, y =0; @@ -43,7 +41,6 @@ public Object part1() throws IOException { } } } - //System.out.println(y); return result; } @@ -67,7 +64,6 @@ public Object part2() throws IOException { x++; } } - //StringBuilder input = new StringBuilder(); Point pos = findPos(grid, '^').get(0); List instructions = new ArrayList<>(); List traversed = new ArrayList<>(); @@ -91,13 +87,11 @@ public Object part2() throws IOException { } } good.add(toString(instructions.subList(start, instructions.size()))); - good.stream().forEach(System.out::println); String stuff = "A,A,B,C,B,A,C,B,C,A\nL,6,R,12,L,6,L,8,L,8\nL,6,R,12,R,8,L,8\nL,4,L,4,L,6\nn\n"; System.out.println(stuff); long[] asciis = stuff.chars().mapToLong(e -> e).toArray(); ic = new IntcodeComputer(17, 2); ic.setInput(asciis); - System.out.println(Arrays.toString(asciis)); while(true) { if((res = ic.run())>255L) return res; From 424e5b0fcb601970deda62c8864854c085ed6a17 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 17 Dec 2019 17:46:10 +0100 Subject: [PATCH 091/433] Path finding for day 15 --- .../sbaars/adventofcode2019/days/Day15.java | 20 ++--- .../sbaars/adventofcode2019/days/Day17.java | 2 +- .../adventofcode2019/pathfinding/Example.java | 75 +++++++++++++++++-- .../adventofcode2019/pathfinding/Grid2d.java | 4 +- 4 files changed, 81 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day15.java b/src/main/java/com/sbaars/adventofcode2019/days/Day15.java index 668b92a0..58c70abb 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day15.java @@ -13,12 +13,12 @@ public class Day15 implements Day { - private static final int UNEXPLORED = 3; - private static final int WALL = 0; + public static final int UNEXPLORED = 3; + public static final int WALL = 0; private static final int PATH = 1; private static final int FINISH = 2; - private static final int BOARD_SIZE = 60; - private static final Point START_POINT = new Point(BOARD_SIZE/2,BOARD_SIZE/2); + private static final int BOARD_SIZE = 41; + private static final Point START_POINT = new Point(BOARD_SIZE/2+1,BOARD_SIZE/2+1); public static void main(String[] args) throws IOException { new Day15().printParts(); @@ -30,16 +30,14 @@ public Object part1() throws IOException { Point pos = START_POINT; int[][] grid = new int[BOARD_SIZE][BOARD_SIZE]; for(int[] row : grid) Arrays.fill(row, UNEXPLORED); - grid[pos.y][pos.x] = 0; + grid[pos.y][pos.x] = 1; while(true) { - System.out.println("Current pos = "+pos); - Arrays.stream(grid).map(e -> Arrays.toString(e)).forEach(System.out::println); explore(grid, pos, ic); pos = moveToUnexploredPlace(grid, pos, ic); if(pos == null) { Grid2d map2d = new Grid2d(grid, false); - System.out.println(Arrays.deepToString(grid)); - return map2d.findPath(START_POINT, findPos(grid, FINISH).get(0)).size(); + Arrays.stream(grid).map(e -> Arrays.toString(e)).forEach(System.out::println); + return map2d.findPath(START_POINT, findPos(grid, FINISH).get(0)).size()-1; } } } @@ -59,7 +57,9 @@ private Point moveToUnexploredPlace(int[][] grid, Point pos, IntcodeComputer ic) private void traverseRoute(IntcodeComputer ic, Point pos, List route) { for(Point p : route) { - ic.run(Direction.getByMove(pos, p).num); + if(ic.run(Direction.getByMove(pos, p).num)!=1L) + throw new IllegalStateException("Illegal state at "+pos+" execute to "+p); + pos = p; } } diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day17.java b/src/main/java/com/sbaars/adventofcode2019/days/Day17.java index 7841d8a9..e7a2fceb 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day17.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day17.java @@ -23,7 +23,6 @@ public Object part1() throws IOException { IntcodeComputer ic = new IntcodeComputer(17, 1); long res; int x = 0, y =0; - int result = 0; while((res = ic.run()) != IntcodeComputer.STOP_CODE) { System.out.print((char)res); if(res == 10) { @@ -34,6 +33,7 @@ public Object part1() throws IOException { x++; } } + int result = 0; for(y = 1; y route = map2d.findPath(start, end); + System.out.println("Go from "+start+" to "+end+" by route "+route.subList(1, route.size())); + route.subList(1, route.size()).stream().forEach(p -> grid[p.y][p.x] = 9);//.peek(System.out::println); + for(Point p : route.subList(1, route.size())) { + System.out.println("Dir "+Direction.getByMove(start, p)); + start = p; + } + Arrays.stream(grid).map(e -> Arrays.toString(e)).forEach(System.out::println); } } diff --git a/src/main/java/com/sbaars/adventofcode2019/pathfinding/Grid2d.java b/src/main/java/com/sbaars/adventofcode2019/pathfinding/Grid2d.java index f93bb40c..461e50f1 100644 --- a/src/main/java/com/sbaars/adventofcode2019/pathfinding/Grid2d.java +++ b/src/main/java/com/sbaars/adventofcode2019/pathfinding/Grid2d.java @@ -6,6 +6,8 @@ import java.util.Set; import java.util.stream.Collectors; +import com.sbaars.adventofcode2019.days.Day15; + /** * Creates nodes and neighbours from a 2d grid. Each point in the map has an * integer value that specifies the cost of crossing that point. If this value @@ -65,7 +67,7 @@ public Set getNeighbours() { continue; } - if (map[j][i] < 1) { + if (map[j][i] == Day15.WALL || map[j][i] == Day15.UNEXPLORED) { continue; } From 81b14527eddcb5265c8e17c9b54843eb62dad1cf Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 17 Dec 2019 17:52:56 +0100 Subject: [PATCH 092/433] Moved day 15 part 2 to path finding --- .../sbaars/adventofcode2019/days/Day15.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day15.java b/src/main/java/com/sbaars/adventofcode2019/days/Day15.java index 58c70abb..4e3c10ed 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day15.java @@ -19,6 +19,7 @@ public class Day15 implements Day { private static final int FINISH = 2; private static final int BOARD_SIZE = 41; private static final Point START_POINT = new Point(BOARD_SIZE/2+1,BOARD_SIZE/2+1); + int[][] grid = new int[BOARD_SIZE][BOARD_SIZE]; public static void main(String[] args) throws IOException { new Day15().printParts(); @@ -28,24 +29,22 @@ public static void main(String[] args) throws IOException { public Object part1() throws IOException { IntcodeComputer ic = new IntcodeComputer(15); Point pos = START_POINT; - int[][] grid = new int[BOARD_SIZE][BOARD_SIZE]; for(int[] row : grid) Arrays.fill(row, UNEXPLORED); grid[pos.y][pos.x] = 1; while(true) { - explore(grid, pos, ic); - pos = moveToUnexploredPlace(grid, pos, ic); + explore(pos, ic); + pos = moveToUnexploredPlace(pos, ic); if(pos == null) { Grid2d map2d = new Grid2d(grid, false); - Arrays.stream(grid).map(e -> Arrays.toString(e)).forEach(System.out::println); - return map2d.findPath(START_POINT, findPos(grid, FINISH).get(0)).size()-1; + return map2d.findPath(START_POINT, findPos(FINISH).get(0)).size()-1; } } } - private Point moveToUnexploredPlace(int[][] grid, Point pos, IntcodeComputer ic) { - List corridorSpaces = findPos(grid, PATH); + private Point moveToUnexploredPlace(Point pos, IntcodeComputer ic) { + List corridorSpaces = findPos(PATH); for(Point p : corridorSpaces) { - if(hasAdjecent(grid, p, UNEXPLORED)) { + if(hasAdjecent(p, UNEXPLORED)) { Grid2d map2d = new Grid2d(grid, false); List route = map2d.findPath(pos, p); traverseRoute(ic, pos, route.subList(1, route.size())); @@ -63,11 +62,11 @@ private void traverseRoute(IntcodeComputer ic, Point pos, List route) { } } - private boolean hasAdjecent(int[][] grid, Point pos, int tile) { + private boolean hasAdjecent(Point pos, int tile) { return grid[pos.y+1][pos.x] == tile || grid[pos.y][pos.x+1] == tile || grid[pos.y-1][pos.x] == tile || grid[pos.y][pos.x-1] == tile; } - private List findPos(int[][] grid, int tile) { + private List findPos(int tile) { List positions = new ArrayList<>(); for(int y = 0; y findPos(int[][] grid, int tile) { return positions; } - private void explore(int[][] grid, Point pos, IntcodeComputer ic) { + private void explore(Point pos, IntcodeComputer ic) { Direction dir = Direction.NORTH; for(int i = 0; i<4;i++) { Point move = dir.move(pos); @@ -94,6 +93,7 @@ private void explore(int[][] grid, Point pos, IntcodeComputer ic) { @Override public Object part2() throws IOException { - return 0; + Point oxygenLeak = findPos(FINISH).get(0); + return findPos(PATH).stream().mapToInt(e -> new Grid2d(grid, false).findPath(oxygenLeak, e).size()-1).max().getAsInt(); } } From 32f6918c9c1c40a3330148e7dafc01813da3152a Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 17 Dec 2019 20:02:35 +0100 Subject: [PATCH 093/433] Find patterns automagically --- .../sbaars/adventofcode2019/days/Day17.java | 126 +++++++++++------- 1 file changed, 81 insertions(+), 45 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day17.java b/src/main/java/com/sbaars/adventofcode2019/days/Day17.java index e7a2fceb..45d331e6 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day17.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day17.java @@ -6,6 +6,7 @@ import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; +import java.util.stream.IntStream; import com.sbaars.adventofcode2019.common.Day; import com.sbaars.adventofcode2019.common.Direction; @@ -13,18 +14,13 @@ public class Day17 implements Day { - public static void main(String[] args) throws IOException { - new Day17().printParts(); - } + char[][] grid = new char[48][48]; - @Override - public Object part1() throws IOException { - char[][] grid = new char[48][48]; + public Day17() throws IOException { IntcodeComputer ic = new IntcodeComputer(17, 1); long res; int x = 0, y =0; while((res = ic.run()) != IntcodeComputer.STOP_CODE) { - System.out.print((char)res); if(res == 10) { y++; x= 0; @@ -33,9 +29,17 @@ public Object part1() throws IOException { x++; } } + } + + public static void main(String[] args) throws IOException { + new Day17().printParts(); + } + + @Override + public Object part1() throws IOException { int result = 0; - for(y = 1; y instructions = new ArrayList<>(); List traversed = new ArrayList<>(); @@ -76,37 +66,58 @@ public Object part2() throws IOException { instructions.add(new Instruction(n-1, dir.leftOf(robotDir) ? Dir.R : Dir.L)); robotDir = dir; } - System.out.println(Arrays.toString(instructions.toArray())); - List good = new ArrayList<>(); - int start = 0; - for(int i = 1; i is = instructions.subList(start, i); - if(toString(is).length()>20) { - good.add(toString(instructions.subList(start, i-1))); - start = i-1; - } - } - good.add(toString(instructions.subList(start, instructions.size()))); - String stuff = "A,A,B,C,B,A,C,B,C,A\nL,6,R,12,L,6,L,8,L,8\nL,6,R,12,R,8,L,8\nL,4,L,4,L,6\nn\n"; - System.out.println(stuff); - long[] asciis = stuff.chars().mapToLong(e -> e).toArray(); - ic = new IntcodeComputer(17, 2); + String patterns = findPatterns(instructions) + "\nn\n"; + long[] asciis = patterns.chars().mapToLong(e -> e).toArray(); + IntcodeComputer ic = new IntcodeComputer(17, 2); ic.setInput(asciis); while(true) { - if((res = ic.run())>255L) + long res = ic.run(); + if(res>255L) return res; } } + private String findPatterns(List instructions) { + List> patterns = new ArrayList<>(); + String patternString = ""; + int start = 0; + for(int i = 0; i pattern = existing(instructions, patterns, i); + if(pattern!=null && start == i) { + start += pattern.size(); + i+=pattern.size()-1; + patternString += ","+patterns.indexOf(pattern); + continue; + } else if(start!=i && (pattern != null || occurrences(instructions, instructions.subList(start, i+1))<3)) { + patternString += ","+patterns.size(); + patterns.add(instructions.subList(start, i)); + start = i; + i--; + } + } + return patternString.substring(1).replace("0", "A").replace("1", "B").replace("2", "C")+"\n"+patterns.stream().map(this::toString).collect(Collectors.joining("\n")); + } + + private List existing(List instructions, List> patterns, int i){ + for(List pattern : patterns) + if(i+pattern.size() <= instructions.size() && instructions.subList(i, i+pattern.size()).equals(pattern)) + return pattern; + return null; + } + + private int occurrences(List instructions, List subList) { + return Math.toIntExact(IntStream.range(0, instructions.size()-subList.size()).filter(i -> toString(instructions.subList(i, i+subList.size())).equals(toString(subList))).count()); + } + public String toString(List i) { return i.stream().map(Instruction::toString).collect(Collectors.joining(",")); } - + private char getGrid(char[][] grid, Point p) { if(p.x < 0 || p.y < 0 || p.x>=grid[0].length || p.y>=grid.length) return '.'; return grid[p.y][p.x]; } - + private Direction directionContainsSomethingAndUntraversed(char[][] grid, Point pos, List traversed) { Direction dir = Direction.NORTH; for(int i = 0; i<4; i++) { @@ -129,12 +140,12 @@ private List findPos(char[][] grid, char tile) { } return positions; } - + enum Dir{L,R} class Instruction{ int amount; Dir dir; - + public Instruction(int amount, Dir dir) { super(); this.amount = amount; @@ -145,5 +156,30 @@ public Instruction(int amount, Dir dir) { public String toString() { return dir.name()+","+amount; } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + amount; + result = prime * result + ((dir == null) ? 0 : dir.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Instruction other = (Instruction) obj; + if (amount != other.amount) + return false; + if (dir != other.dir) + return false; + return true; + } } } From cc9e6d2e58d64eaddf36f8fb88e4ced92f432ced Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 17 Dec 2019 20:09:37 +0100 Subject: [PATCH 094/433] Got rid of the OCR --- .../sbaars/adventofcode2019/common/OCR.java | 76 ------------------- .../common/ProcessesImages.java | 4 +- .../sbaars/adventofcode2019/days/Day11.java | 5 +- .../sbaars/adventofcode2019/days/Day17.java | 1 - .../sbaars/adventofcode2019/days/Day8.java | 3 +- 5 files changed, 5 insertions(+), 84 deletions(-) delete mode 100644 src/main/java/com/sbaars/adventofcode2019/common/OCR.java diff --git a/src/main/java/com/sbaars/adventofcode2019/common/OCR.java b/src/main/java/com/sbaars/adventofcode2019/common/OCR.java deleted file mode 100644 index a75fdf1e..00000000 --- a/src/main/java/com/sbaars/adventofcode2019/common/OCR.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.sbaars.adventofcode2019.common; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -@SuppressWarnings("preview") -public class OCR { - - List characters = new ArrayList<>(); - - public OCR(String[] image) { - for(int i = 0; i fullTop(character); - case "███ " -> threeTopLeft(character); - case "â–ˆ â–ˆ" -> bothSides(character); - case " ██ " -> middleTwo(character); - case " ██" -> 'J'; - case "â–ˆ " -> 'L'; - default -> dontKnow(character); - }); - } - return result.toString(); - } - - private char bothSides(String[] character) { - return switch(character[5]) { - case " ██ " -> 'U'; - case "â–ˆ â–ˆ" -> 'H'; - default -> dontKnow(character); - }; - } - - private char middleTwo(String[] character) { - return switch(character[5]) { - case " ███" -> 'G'; - case "â–ˆ â–ˆ" -> 'A'; - default -> dontKnow(character); - }; - } - - private char dontKnow(String[] character) { - Arrays.stream(character).forEach(System.out::println); - throw new IllegalArgumentException("I don't know your character yet!"); - } - - private char fullTop(String[] character) { - return switch(character[5]) { - case "â–ˆ " -> 'F'; - case "████" -> 'E'; - default -> dontKnow(character); - }; - } - - private char threeTopLeft(String[] character) { - return switch(character[5]) { - case "â–ˆ " -> 'P'; - case "â–ˆ â–ˆ" -> 'R'; - default -> dontKnow(character); - }; - } - -} diff --git a/src/main/java/com/sbaars/adventofcode2019/common/ProcessesImages.java b/src/main/java/com/sbaars/adventofcode2019/common/ProcessesImages.java index edb7eadd..e4de03c2 100644 --- a/src/main/java/com/sbaars/adventofcode2019/common/ProcessesImages.java +++ b/src/main/java/com/sbaars/adventofcode2019/common/ProcessesImages.java @@ -4,7 +4,7 @@ import java.util.stream.Collectors; public interface ProcessesImages { - public default String[] createAsciiArray(int[][] pixels) { - return Arrays.stream(pixels).map(a -> Arrays.stream(a).boxed().map(x -> x == 0 ? " " : "â–ˆ").collect(Collectors.joining())).toArray(String[]::new); + public default String printAsciiArray(int[][] pixels) { + return System.lineSeparator()+Arrays.stream(pixels).map(a -> Arrays.stream(a).boxed().map(x -> x == 0 ? " " : "â–ˆ").collect(Collectors.joining())).collect(Collectors.joining(System.lineSeparator())); } } diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day11.java b/src/main/java/com/sbaars/adventofcode2019/days/Day11.java index 0ef8815a..e7a660b0 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day11.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day11.java @@ -6,7 +6,6 @@ import java.util.Set; import com.sbaars.adventofcode2019.common.Day; -import com.sbaars.adventofcode2019.common.OCR; import com.sbaars.adventofcode2019.common.ProcessesImages; import com.sbaars.adventofcode2019.intcode.IntcodeComputer; @@ -50,7 +49,7 @@ private Object robotWalk(boolean startWhite) throws IOException { return startWhite ? constructImage(whitePlaces) : paintedOnce.size(); } - private OCR constructImage(Set whitePlaces) { + private String constructImage(Set whitePlaces) { int cornerX = whitePlaces.stream().mapToInt(e -> e.x).min().getAsInt(); int cornerY = whitePlaces.stream().mapToInt(e -> e.y).min().getAsInt(); whitePlaces.forEach(e -> e.move(e.x - cornerX, e.y - cornerY)); @@ -59,7 +58,7 @@ private OCR constructImage(Set whitePlaces) { int[][] places = new int[sizey][sizex]; for(Point p : whitePlaces) places[p.y][p.x] = 1; - return new OCR(createAsciiArray(places)); + return printAsciiArray(places); } @Override diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day17.java b/src/main/java/com/sbaars/adventofcode2019/days/Day17.java index 45d331e6..d205dcb0 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day17.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day17.java @@ -3,7 +3,6 @@ import java.awt.Point; import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day8.java b/src/main/java/com/sbaars/adventofcode2019/days/Day8.java index d2995743..4887d8d8 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day8.java @@ -6,7 +6,6 @@ import java.util.stream.IntStream; import com.sbaars.adventofcode2019.common.Day; -import com.sbaars.adventofcode2019.common.OCR; import com.sbaars.adventofcode2019.common.ProcessesImages; import com.sbaars.adventofcode2019.util.CountMap; @@ -49,7 +48,7 @@ private List> countPixels(int[] pixels) { public Object part2() throws IOException { int[][] pixelArrays = splitArray(readPixels(), 100, SIZE); int[] finalPixels = determineFinalImage(pixelArrays); - return new OCR(createAsciiArray(splitArray(finalPixels, DIM_X, DIM_Y))); + return printAsciiArray(splitArray(finalPixels, DIM_X, DIM_Y)); } private int[] determineFinalImage(int[][] pixelArrays) { From 1cde281ba98e95981ad2090a4bf03f2b10aaa7e4 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 17 Dec 2019 20:13:09 +0100 Subject: [PATCH 095/433] Fixed day 3 --- .../sbaars/adventofcode2019/common/Direction.java | 12 +++++------- .../java/com/sbaars/adventofcode2019/days/Day3.java | 3 +-- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/common/Direction.java b/src/main/java/com/sbaars/adventofcode2019/common/Direction.java index 8f85dbe1..fafe9ff1 100644 --- a/src/main/java/com/sbaars/adventofcode2019/common/Direction.java +++ b/src/main/java/com/sbaars/adventofcode2019/common/Direction.java @@ -4,20 +4,18 @@ import java.util.Arrays; public enum Direction { - NORTH(1), EAST(4), SOUTH(2), WEST(3); + NORTH(1, 'U'), EAST(4, 'R'), SOUTH(2, 'D'), WEST(3, 'L'); public final int num; + public final int code; - private Direction(int num) { + private Direction(int num, char code) { this.num = num; - } - - public char directionCode() { - return name().charAt(0); + this.code = code; } public static Direction getByDirCode(char code) { - return Arrays.stream(values()).filter(e -> e.directionCode() == code).findAny().get(); + return Arrays.stream(values()).filter(e -> e.code == code).findAny().get(); } public Direction turn(boolean right) { diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day3.java b/src/main/java/com/sbaars/adventofcode2019/days/Day3.java index 6a8c22e2..28ae2696 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day3.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day3.java @@ -22,8 +22,7 @@ public Day3() throws IOException { this.intersect = calculateDistance(walks2, walkedLocations, true); } - public static void main(String[] args) throws IOException - { + public static void main(String[] args) throws IOException { new Day3().printParts(); } From 7aad744727c69b548c81a177a2f4d4af2b92d427 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 17 Dec 2019 20:16:21 +0100 Subject: [PATCH 096/433] Updated Main and Readme --- README.md | 36 +++++++++++++++++-- .../com/sbaars/adventofcode2019/Main.java | 2 +- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 23e30683..ae02bed5 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,10 @@ Days: - [Day 11](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day11.java) - [Day 12](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day12.java) - [Day 13](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day13.java) +- [Day 14](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day14.java) +- [Day 15](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day15.java) +- [Day 16](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day16.java) +- [Day 17](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day17.java) Output of running [Main.java](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/Main.java): ``` @@ -48,7 +52,13 @@ Part 2: 89603079 Day 8: Part 1: 1360 -Part 2: FPUAR +Part 2: +████ ███ â–ˆ â–ˆ ██ ███ +â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ +███ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ +â–ˆ ███ â–ˆ â–ˆ ████ ███ +â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ +â–ˆ â–ˆ ██ â–ˆ â–ˆ â–ˆ â–ˆ Day 9: Part 1: 2518058886 @@ -60,7 +70,13 @@ Part 2: 1419 Day 11: Part 1: 2172 -Part 2: JELEFGHP +Part 2: + ██ ████ â–ˆ ████ ████ ██ â–ˆ â–ˆ ███ + â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ + â–ˆ ███ â–ˆ ███ ███ â–ˆ ████ â–ˆ â–ˆ + â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ ██ â–ˆ â–ˆ ███ +â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ + ██ ████ ████ ████ â–ˆ ███ â–ˆ â–ˆ â–ˆ Day 12: Part 1: 13399 @@ -69,4 +85,20 @@ Part 2: 312992287193064 Day 13: Part 1: 320 Part 2: 15156 + +Day 14: +Part 1: 485720 +Part 2: 3848998 + +Day 15: +Part 1: 380 +Part 2: 410 + +Day 16: +Part 1: 12541048 +Part 2: 62858988 + +Day 17: +Part 1: 7404 +Part 2: 929045 ``` \ No newline at end of file diff --git a/src/main/java/com/sbaars/adventofcode2019/Main.java b/src/main/java/com/sbaars/adventofcode2019/Main.java index 59227840..5e7a3622 100644 --- a/src/main/java/com/sbaars/adventofcode2019/Main.java +++ b/src/main/java/com/sbaars/adventofcode2019/Main.java @@ -7,7 +7,7 @@ public class Main { public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException, InvocationTargetException, NoSuchMethodException { - for(int day = 1; day<=13; day++) { + for(int day = 1; day<=17; day++) { System.out.println("Day "+day+":"); Day instance = (Day)Class.forName("com.sbaars.adventofcode2019.days.Day"+day).getDeclaredConstructor().newInstance(); instance.printParts(); From b2282fcf46e0a594ab1b1a8a8cb0104333ce79d0 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 18 Dec 2019 07:28:07 +0100 Subject: [PATCH 097/433] ... --- .../sbaars/adventofcode2019/days/Day18.java | 115 ++++++++++++++ .../pathfinding/CharGrid2d.java | 143 ++++++++++++++++++ .../pathfinding/PathFinding.java | 3 +- src/main/resources/day18.txt | 81 ++++++++++ src/main/resources/day19.txt | 5 + 5 files changed, 346 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/sbaars/adventofcode2019/days/Day18.java create mode 100644 src/main/java/com/sbaars/adventofcode2019/pathfinding/CharGrid2d.java create mode 100644 src/main/resources/day18.txt create mode 100644 src/main/resources/day19.txt diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day18.java b/src/main/java/com/sbaars/adventofcode2019/days/Day18.java new file mode 100644 index 00000000..0b76e877 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day18.java @@ -0,0 +1,115 @@ +package com.sbaars.adventofcode2019.days; + +import java.awt.Point; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Random; +import java.util.stream.Collectors; + +import com.sbaars.adventofcode2019.common.Day; +import com.sbaars.adventofcode2019.pathfinding.CharGrid2d; + +public class Day18 implements Day { + + char[][] grid; + CharGrid2d charGrid; + + public Day18() throws IOException { + grid = Arrays.stream(readDay(19).split(System.lineSeparator())).map(e -> e.toCharArray()).toArray(char[][]::new); + charGrid = new CharGrid2d(grid, false); + } + + public static void main(String[] args) throws IOException { + new Day18().printParts(); + } + + @Override + public Object part1() throws IOException { + Point me = findPos('@').get(0); + //List collectedKeys = new ArrayList<>(); + //int keysToCollect = findPos('a', 'z').size(); + List keys = findPos('a', 'z'); + //List doors = findPos('A', 'Z'); + /*int steps = 0; + //while(collectedKeys.size()= 'a' && collected <= 'z') { + collectedKeys.add(Character.toUpperCase(collected)); + doors.stream().filter(e -> grid[e.y][e.x] == Character.toUpperCase(collected)).forEach(e -> grid[e.y][e.x] = '.'); + doors.removeIf(e -> grid[e.y][e.x] == Character.toUpperCase(collected)); + keys.remove(me); + } + grid[me.y][me.x] = '@'; + //} + if(steps<5992) + System.out.println(steps); + }*/ + //System.out.println(Arrays.toString(reachableKeys.toArray())); + return findSteps(me, new ArrayList<>(), keys); + } + + public int findSteps(Point me, List collectedKeys, List keys) { + List> possibleMoves = keys.stream().map(e -> charGrid.findPath(me, e, collectedKeys)).filter(e -> !e.isEmpty()).collect(Collectors.toList()); + + //possibleMoves.addAll(doors.stream().filter(e -> collectedKeys.contains(grid[e.y][e.x])).map(e -> charGrid.findPath(meNow, e)).filter(e -> !e.isEmpty()).collect(Collectors.toList())); + //List takenMove = possibleMoves.stream().reduce((a, b) -> a.size() nSteps = new ArrayList<>(); + for(List takenMove : possibleMoves) { + //List takenMove = possibleMoves.get(new Random().nextInt(possibleMoves.size())); + //grid[me.y][me.x] = '.'; + //me = takenMove.get(takenMove.size()-1); + Point newLoc = takenMove.get(takenMove.size()-1); + char collected = grid[me.y][me.x]; + //System.out.println((takenMove.size()-1)+" steps to "+collected); + if(collected >= 'a' && collected <= 'z') { + collectedKeys.add(Character.toUpperCase(collected)); + //doors.stream().filter(e -> grid[e.y][e.x] == Character.toUpperCase(collected)).forEach(e -> grid[e.y][e.x] = '.'); + //doors.removeIf(e -> grid[e.y][e.x] == Character.toUpperCase(collected)); + keys.remove(newLoc); + } + //grid[newLoc.y][newLoc.x] = '@'; + nSteps.add(findSteps(newLoc, new ArrayList<>(collectedKeys), new ArrayList<>(keys))+takenMove.size()-1); + } + return nSteps.stream().mapToInt(e -> e).min().orElse(0); + } + + private List findPos(char tile) { + List positions = new ArrayList<>(); + for(int y = 0; y findPos(char tile, char tile2) { + List positions = new ArrayList<>(); + for(int y = 0; y= tile && grid[y][x] <= tile2) + positions.add(new Point(x, y)); + } + } + return positions; + } + + @Override + public Object part2() throws IOException { + return 0; + } +} diff --git a/src/main/java/com/sbaars/adventofcode2019/pathfinding/CharGrid2d.java b/src/main/java/com/sbaars/adventofcode2019/pathfinding/CharGrid2d.java new file mode 100644 index 00000000..97fb53bf --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/pathfinding/CharGrid2d.java @@ -0,0 +1,143 @@ +package com.sbaars.adventofcode2019.pathfinding; + +import java.awt.Point; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * Creates nodes and neighbours from a 2d grid. Each point in the map has an + * integer value that specifies the cost of crossing that point. If this value + * is negative, the point is unreachable. + * + * If diagonal movement is allowed, the Chebyshev distance is used, else + * Manhattan distance is used. + * + * @author Ben Ruijl + * + */ +public class CharGrid2d { + private final char[][] map; + private final boolean allowDiagonal; + List collectedKeys; + + /** + * A node in a 2d map. This is simply the coordinates of the point. + * + * @author Ben Ruijl + * + */ + public class MapNode implements Node { + private final int x, y; + + public MapNode(int x, int y) { + this.x = x; + this.y = y; + } + + public double getHeuristic(MapNode goal) { + if (allowDiagonal) { + return Math.max(Math.abs(x - goal.x), Math.abs(y - goal.y)); + } else { + return Math.abs(x - goal.x) + Math.abs(y - goal.y); + } + } + + public double getTraversalCost(MapNode neighbour) { + return 1 + map[neighbour.y][neighbour.x]; + } + + public Set getNeighbours() { + Set neighbours = new HashSet(); + + for (int i = x - 1; i <= x + 1; i++) { + for (int j = y - 1; j <= y + 1; j++) { + if ((i == x && j == y) || i < 0 || j < 0 || j >= map.length + || i >= map[j].length) { + continue; + } + + if (!allowDiagonal && + ((i < x && j < y) || + (i < x && j > y) || + (i > x && j > y) || + (i > x && j < y))) { + continue; + } + + if (map[j][i] == '#' || (map[j][i]>='A' && map[j][i]<='Z' && !collectedKeys.contains(map[j][i]))) { + continue; + } + + // TODO: create cache instead of recreation + neighbours.add(new MapNode(i, j)); + } + } + + return neighbours; + } + + @Override + public String toString() { + return "(" + x + ", " + y + ")"; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + getOuterType().hashCode(); + result = prime * result + x; + result = prime * result + y; + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + MapNode other = (MapNode) obj; + if (!getOuterType().equals(other.getOuterType())) + return false; + if (x != other.x) + return false; + if (y != other.y) + return false; + return true; + } + + public Point toPoint() { + return new Point(x, y); + } + + private CharGrid2d getOuterType() { + return CharGrid2d.this; + } + + } + + public CharGrid2d(char[][] map, boolean allowDiagonal) { + this.map = map; + this.allowDiagonal = allowDiagonal; + } + + public List findPath(Point start, Point end, List collectedKeys) { + this.collectedKeys = collectedKeys; + char removed = '.'; + if(map[end.y][end.x] >='A' && map[end.y][end.x]<='Z') { + removed = map[end.y][end.x]; + map[end.y][end.x] = '.'; + } + List res = PathFinding.doAStar(new MapNode(start.x, start.y), new MapNode(end.x, end.y)).stream().map(MapNode::toPoint).collect(Collectors.toList()); + if(removed >='A' && removed<='Z') { + map[end.y][end.x] = removed; + } + return res; + } + +} diff --git a/src/main/java/com/sbaars/adventofcode2019/pathfinding/PathFinding.java b/src/main/java/com/sbaars/adventofcode2019/pathfinding/PathFinding.java index 95369ddc..7c13a084 100644 --- a/src/main/java/com/sbaars/adventofcode2019/pathfinding/PathFinding.java +++ b/src/main/java/com/sbaars/adventofcode2019/pathfinding/PathFinding.java @@ -1,4 +1,5 @@ package com.sbaars.adventofcode2019.pathfinding; +import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; @@ -80,7 +81,7 @@ public int compare(T nodeA, T nodeB) { } } - return route; + return new ArrayList<>(); } } diff --git a/src/main/resources/day18.txt b/src/main/resources/day18.txt new file mode 100644 index 00000000..9200145e --- /dev/null +++ b/src/main/resources/day18.txt @@ -0,0 +1,81 @@ +################################################################################# +#.......#.A...........#.........#.......#.#.........#.............#...#..r......# +#.###.###.#####.#####.#.#######.#.#######.#.#.#####.#.#.#.#######.###.#.###.###.# +#...#.#...#.....#.#...#...#.....#.......#...#.#...#o#.#.#.#...#.#...#.#...#.#...# +#####.#.###.#####.#.###.#W###.#########.#####.#.#.###.#.#.#.#.#.###.#K###.#.##### +#.....#.#.#...#...#...#.#...#...........#...#...#.....#.#.#.#.#.#...#...#.#.....# +#M###.#.#.###.#.#####.#####.###########.#.#.###.#######.###.#.#.#.#####.#.#####.# +#.#...#...#...#.#...#.....#...#..z....#.#.#...#...#.....#...#.#.#.#...#.......#.# +#.###.###.#.###.#.#.#####.###.#.###.#.#.#.###.#####.#.###.###.#.#.#.#.#####.###.# +#...#...#.#.#....y#.....#.....#.#.#.#.#.#...#.#...#.#.#...#...#.#...#.#...#.#m..# +#.#.#####.#.###########.#######.#.#.#.#.###.#.#.#X#.#.#.###.###.#####.#.#.###.### +#.#.#...#.#s..#.......#.......#...#.#.#.#...#...#.#.#.#.#.#.#.......#...#...#...# +###.#.#.#.###.#.#####.###.###.#####.#.#.#.#######.#.###.#.#.#.#####.#######.###.# +#...#.#...#.#...#...#.#...#.......#.#.#.#.#.......#.....#.#.#.#.....#.....#.....# +#.###.#####.#####.#.#C#.###.#####.#.#.#.#.#####.###.#####.#.###.#####.#.#.#####.# +#.....#.....#.....#.#.#.#...#...#...#.#.#.#.F.#...#...#...#...#.#...#.#.#.....#.# +#.#######.#.###.###.#.#.#####.#.#######.#.#.#.###.###.###.###.#.#.#.#.#.#######.# +#.#.......#...#.#...#.#...#...#.#.......#...#.#.#...#.......#.#.#.#.#.#.........# +#.#.#########.#.#####.###N#.###.#.###########.#.###.#########.#.#.#.#.########### +#...#...#.......#.....#...#.#.#.#.......#...#.#...............#...#.#.#....q....# +#####.###.#######.#####.###.#.#.#######.#.#.#.#############.#####.#.#.#.#.#####.# +#g..#.....#.....#...#.#...#...#.......#.#.#.#..l..........#.#...#.#.#.#.#...#...# +###.#.#####.###.###.#T#.#.###.###.#####.###.#############.#####B#.#.#.#.###.##### +#...#.#...#...#.....#.#.#...#.#.#.#...#.#.......#.......#...#...#.#...#...#.....# +#.###.###.###.#####.#.###.###.#.#.#.#.#.#.#####.#.###.#####.#.###.#####.#######.# +#...#...#...#.#.#...#...#.I...#.#...#...#.....#.#...#.#...#...#.#...#.#.#.......# +###.###.#.###.#.#.#####.#####.#.#############.#####.#.#.#.#####.###.#.#.#.####### +#.....#.#...#.#.......#.#...#...........#.....#.....#...#.......#.#.#.#.#.......# +#.#####.###.#.#######.#.#.#.#####.#######.###.#.###########.###.#.#.#.#.#######.# +#...........#.#e....#.#...#...#...#.....#.#...#...#.........#.....#.#...#.......# +#.###########.#.###.#########.#####.###.#.#######.#.#####.#######.#.#####.#####.# +#.....#.#.....#.#.#.........#.......#...#.#.......#.#.....#.....#.#...#...#.#...# +#####.#.#.#####.#.#####.#.###########.###.#.#######.#####.#.###.#.###.#.###.#.### +#...#.#.#.......#.#.....#.#.........#.#.#...#.#.....#...#.#.#...#...#.#...#...#.# +#.###.#.#########.#.#####.#V#.#####.#.#.#.###.#.###.#.#.###.#.#######.###.#.###.# +#.#...#.....#.....#.#.....#.#...#...#.#.#.#...#.#.#.#.#.....#.........#...#.#...# +#.#.###.###.#.#####.#######.###.#.###.#.#.###.#.#.#.#.#################.###.#.#.# +#.#.....#.#.#.....#.......#.#.#.#...#.#.#.#...#.#...#.#.........#.......#.S.#.#.# +#.#######.#.#####.#######.#.#.#.#####.#.#.#.#.#.#####.#####.###.#.#######.###.#.# +#.......................#.....#.............#.#.............#.....#...........#.# +#######################################.@.####################################### +#...............#.....#.....#.............#.........................D.......#..u# +#.#############.#####.#.#.###.###.#####.#.#.#.#####.#######.###############.#.### +#.....#.....#...#...#...#.....#.#.#.....#...#....v#.#.....#.#.......#.....#.#.E.# +#####.#.#####.###.#.#.#########.#.#######.#######.###.###.###.#####.#.#####.#.#.# +#.....#.....#.....#.#.#...#.....#.......#.#.......#.....#.#...#...#.#....j#t#.#.# +#.#########.#######.#.#.#.#.###########.#.#.#######.#####.#.###.###.#####.#.#.#.# +#.......#...#...#...#...#...#.......#...#.#.#.....#.#.....#.#.....#.#...#.#.#.#.# +#######.#.#.###.#.#######.###.#####.#.#####.#.###.#.#.#####.#####.#.#.#.#.#.###.# +#.....#.#.#.....#...#.....#...#.....#...#...#.#.#...#.....#.......#...#.#.#.#...# +###.###.#.#####.###.#####.#.###.#####.#.#.#.#.#.#########.#######.#####.#.#.#.#.# +#...#...#...#...#.#.....#.#.#.#.#.....#.#.#d#.#.....#.......#.....#.....#.#...#.# +#.###.#####.#.###.#####.#.#.#.#.#######.#.###.###.#.#.#######.#####.#####.#####.# +#.....#...#.#.....#.....#.#.#.#...#.....#.....#...#.#.....#.....#...#...#.....#.# +#.#####.#.#.#.#####.#####.#.#.###.#.###.#######.#.#######.#.#####.#####.#.#.#.#.# +#.#.....#.#.#.#.....#.....#.#...#.#.#...#.......#.#.....#...#.#...#.....#.#.#.#.# +#.###.#.#.#.#.#.###########.###.#.#.#.###.#########.#.#######.#.#####.###.#.###.# +#.H.#.#.#.#.#.#.....#.....#.#...#...#...#.#.....#...#.........#.#.....#...#.....# +###.###.#.#.#.#####.#.###.#.#.#########.#.#.###.#.#######.#####.#.#.#.#.######### +#.#.#...#...#...#.#...#...#.#...#.......#...#.#...#.....#...#...#.#.#.#.........# +#.#.#.#.#######.#.#####.###.#.#.#.#######.###.#########.###.#.#####.#.#########.# +#...#.#.#...#.#.#...#...#...#.#.#...#...#...#...#.....#...#.#.#.....#.#.......#.# +#.###.###.#.#.#.###.#######.#.#.###.#.#.###.#.###.#.#.#.#.#.###.#####.###.###.#.# +#.#...#...#.#.#.#...........#.#...#.#.#.#.#.#.#...#.#...#.#.....#...#...#.#.#.#.# +#.###.#.###.#.#.#.###########.###.#.#.#.#.#.#.#.###.#####.#####.###.###.#.#.#.#.# +#...#...#.#.#.#...#...#.U...#.#.#...#.#.#...#.....#.#.....#...#...#...#...#...#.# +###.#.###.#.#.#####J#.#.#.###.#.#####.###.#######.#.#####.#.#####.#.#####.#####.# +#...#.Q.#.#.#.....#.#...#.....#.........#.......#.#f....#.L.#.....#h....#.#...#.# +#.#####.#.#.###.#.#.#################.#.#######.#.#####.###.#.#####.#.###.#.#.#.# +#.#...#...#...#.#.#.#...#.......#...#.#.#.#...G.#.....#.Z.#.#...#...#.....#.#...# +#.#.#####.###.###.#.#.#.#####.#.#.#.###.#.#.#############.#.###.#########.#.##### +#k#.#.....#.#...#.#..c#...#...#...#.#...#.#.#........n#...#...#.#.......#.#...#.# +#.#.#.#####.###.#.#######.#.#######.#.#.#.#.#.#######.#.###.###.#.#####.#####.#.# +#.#...#.....#...#.#.P...#.#.#.....#...#.#.#.#.#...#...#.#...#...#.....#.....#p..# +#.###.#.#.###.###.#.#.###.#.###.#.#####.#.#.#.#.###.###.###.#.#######.###.#####.# +#...#...#.#...#.#...#...#.#...#.#...#...#.O.#.#.....#.#...#b#.#.......#.#.#...#.# +###.#####.#.###.#.#####.#.###.#####.#.###.###.#.#####.#.#.###.#.#######.#.#.#.#.# +#.#.#.....#.#a..#.#...#.#.#...#.....#...#...#i#.#...#...#.Y.#.#.#....w..#.#.#...# +#.#R#######.#.#.#.###.#.#.#.###.#######.###.#.#.#.#.#######.#.#.#####.#.#.#.##### +#...........#.#.......#.....#...........#.....#x..#.........#.........#.#.......# +################################################################################# \ No newline at end of file diff --git a/src/main/resources/day19.txt b/src/main/resources/day19.txt new file mode 100644 index 00000000..7345fa09 --- /dev/null +++ b/src/main/resources/day19.txt @@ -0,0 +1,5 @@ +######################## +#f.D.E.e.C.b.A.@.a.B.c.# +######################.# +#d.....................# +######################## \ No newline at end of file From 8453b5f6b108d2d4a22dea9ea6c0fa8c7cb7b472 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 18 Dec 2019 07:49:06 +0100 Subject: [PATCH 098/433] Day 18 Part 1 : Recursive --- .../java/com/sbaars/adventofcode2019/days/Day18.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day18.java b/src/main/java/com/sbaars/adventofcode2019/days/Day18.java index 0b76e877..b38cd7a3 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day18.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day18.java @@ -17,7 +17,7 @@ public class Day18 implements Day { CharGrid2d charGrid; public Day18() throws IOException { - grid = Arrays.stream(readDay(19).split(System.lineSeparator())).map(e -> e.toCharArray()).toArray(char[][]::new); + grid = Arrays.stream(readDay(18).split(System.lineSeparator())).map(e -> e.toCharArray()).toArray(char[][]::new); charGrid = new CharGrid2d(grid, false); } @@ -63,23 +63,23 @@ public Object part1() throws IOException { public int findSteps(Point me, List collectedKeys, List keys) { List> possibleMoves = keys.stream().map(e -> charGrid.findPath(me, e, collectedKeys)).filter(e -> !e.isEmpty()).collect(Collectors.toList()); - + //System.out.println("moves "+possibleMoves.size()); //possibleMoves.addAll(doors.stream().filter(e -> collectedKeys.contains(grid[e.y][e.x])).map(e -> charGrid.findPath(meNow, e)).filter(e -> !e.isEmpty()).collect(Collectors.toList())); //List takenMove = possibleMoves.stream().reduce((a, b) -> a.size() nSteps = new ArrayList<>(); for(List takenMove : possibleMoves) { //List takenMove = possibleMoves.get(new Random().nextInt(possibleMoves.size())); //grid[me.y][me.x] = '.'; //me = takenMove.get(takenMove.size()-1); Point newLoc = takenMove.get(takenMove.size()-1); - char collected = grid[me.y][me.x]; + char collected = grid[newLoc.y][newLoc.x]; //System.out.println((takenMove.size()-1)+" steps to "+collected); - if(collected >= 'a' && collected <= 'z') { - collectedKeys.add(Character.toUpperCase(collected)); + collectedKeys.add(Character.toUpperCase(collected)); //doors.stream().filter(e -> grid[e.y][e.x] == Character.toUpperCase(collected)).forEach(e -> grid[e.y][e.x] = '.'); //doors.removeIf(e -> grid[e.y][e.x] == Character.toUpperCase(collected)); keys.remove(newLoc); - } + //System.out.println(collected); //grid[newLoc.y][newLoc.x] = '@'; nSteps.add(findSteps(newLoc, new ArrayList<>(collectedKeys), new ArrayList<>(keys))+takenMove.size()-1); } From c416ed4a4d81ee63579b97fb2a741b36b799d2a3 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 18 Dec 2019 08:37:48 +0100 Subject: [PATCH 099/433] Further optimized part 1 --- .../sbaars/adventofcode2019/days/Day18.java | 101 ++++++++++++++++-- .../pathfinding/CharGrid2d.java | 16 +-- 2 files changed, 95 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day18.java b/src/main/java/com/sbaars/adventofcode2019/days/Day18.java index b38cd7a3..6c3758b2 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day18.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day18.java @@ -4,8 +4,10 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.List; -import java.util.Random; +import java.util.Map; +import java.util.Map.Entry; import java.util.stream.Collectors; import com.sbaars.adventofcode2019.common.Day; @@ -24,6 +26,51 @@ public Day18() throws IOException { public static void main(String[] args) throws IOException { new Day18().printParts(); } + + class Route { + Point start; + Point end; + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((end == null) ? 0 : end.hashCode()); + result = prime * result + ((start == null) ? 0 : start.hashCode()); + return result; + } + public Route(Point start, Point end) { + super(); + this.start = start; + this.end = end; + } + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Route other = (Route) obj; + if (end == null) { + if (other.end != null) + return false; + } else if (!end.equals(other.end)) + return false; + if (start == null) { + if (other.start != null) + return false; + } else if (!start.equals(other.start)) + return false; + return true; + } + @Override + public String toString() { + return "Route [start=" + start + ", end=" + end + "]"; + } + + + } @Override public Object part1() throws IOException { @@ -31,6 +78,16 @@ public Object part1() throws IOException { //List collectedKeys = new ArrayList<>(); //int keysToCollect = findPos('a', 'z').size(); List keys = findPos('a', 'z'); + Map> routes = new HashMap<>(); + List requiredRoutes = new ArrayList<>(keys); + requiredRoutes.add(me); + for(int i = 0; i r = charGrid.findPath(requiredRoutes.get(i), requiredRoutes.get(j)); + //System.out.println(r.size()+", "+new Route(requiredRoutes.get(i), requiredRoutes.get(j))); + routes.put(new Route(requiredRoutes.get(i), requiredRoutes.get(j)), r); + } + } //List doors = findPos('A', 'Z'); /*int steps = 0; //while(collectedKeys.size()(), keys); + return findSteps(0, me, new ArrayList<>(), keys, routes); } - public int findSteps(Point me, List collectedKeys, List keys) { - List> possibleMoves = keys.stream().map(e -> charGrid.findPath(me, e, collectedKeys)).filter(e -> !e.isEmpty()).collect(Collectors.toList()); + public List getRoute(Map> routes, Point p1, Point p2){ + List p = routes.get(new Route(p1, p2)); + if(p != null) + return p; + else return routes.get(new Route(p2, p1)); + } + + public boolean canTakeRoute(List route, List keys) { + for(Point p : route) { + if(grid[p.y][p.x]>='A' && grid[p.y][p.x]<='Z' && !keys.contains(grid[p.y][p.x])) { + return false; + } + } + return true; + } + + int lowest = Integer.MAX_VALUE; + public int findSteps(int currentSteps, Point me, List collectedKeys, List keys, Map> routes) { + if(keys.isEmpty() && currentSteps=lowest) { + return currentSteps; + } + + List> possibleMoves = keys.stream().map(e -> getRoute(routes, me, e)).filter(e -> canTakeRoute(e, collectedKeys)).collect(Collectors.toList()); //System.out.println("moves "+possibleMoves.size()); //possibleMoves.addAll(doors.stream().filter(e -> collectedKeys.contains(grid[e.y][e.x])).map(e -> charGrid.findPath(meNow, e)).filter(e -> !e.isEmpty()).collect(Collectors.toList())); //List takenMove = possibleMoves.stream().reduce((a, b) -> a.size() nSteps = new ArrayList<>(); for(List takenMove : possibleMoves) { //List takenMove = possibleMoves.get(new Random().nextInt(possibleMoves.size())); //grid[me.y][me.x] = '.'; //me = takenMove.get(takenMove.size()-1); - Point newLoc = takenMove.get(takenMove.size()-1); + List myKeys = new ArrayList<>(collectedKeys); + List keyLocs = new ArrayList<>(keys); + Point newLoc = me.equals(takenMove.get(0)) ? takenMove.get(takenMove.size()-1) : takenMove.get(0); char collected = grid[newLoc.y][newLoc.x]; //System.out.println((takenMove.size()-1)+" steps to "+collected); - collectedKeys.add(Character.toUpperCase(collected)); + myKeys.add(Character.toUpperCase(collected)); //doors.stream().filter(e -> grid[e.y][e.x] == Character.toUpperCase(collected)).forEach(e -> grid[e.y][e.x] = '.'); //doors.removeIf(e -> grid[e.y][e.x] == Character.toUpperCase(collected)); - keys.remove(newLoc); + keyLocs.remove(newLoc); //System.out.println(collected); //grid[newLoc.y][newLoc.x] = '@'; - nSteps.add(findSteps(newLoc, new ArrayList<>(collectedKeys), new ArrayList<>(keys))+takenMove.size()-1); + nSteps.add(findSteps(currentSteps + takenMove.size()-1, newLoc, myKeys, keyLocs, routes)); } return nSteps.stream().mapToInt(e -> e).min().orElse(0); } diff --git a/src/main/java/com/sbaars/adventofcode2019/pathfinding/CharGrid2d.java b/src/main/java/com/sbaars/adventofcode2019/pathfinding/CharGrid2d.java index 97fb53bf..929326ef 100644 --- a/src/main/java/com/sbaars/adventofcode2019/pathfinding/CharGrid2d.java +++ b/src/main/java/com/sbaars/adventofcode2019/pathfinding/CharGrid2d.java @@ -66,7 +66,7 @@ public Set getNeighbours() { continue; } - if (map[j][i] == '#' || (map[j][i]>='A' && map[j][i]<='Z' && !collectedKeys.contains(map[j][i]))) { + if (map[j][i] == '#'/* || (map[j][i]>='A' && map[j][i]<='Z' && !collectedKeys.contains(map[j][i]))*/) { continue; } @@ -126,18 +126,8 @@ public CharGrid2d(char[][] map, boolean allowDiagonal) { this.allowDiagonal = allowDiagonal; } - public List findPath(Point start, Point end, List collectedKeys) { - this.collectedKeys = collectedKeys; - char removed = '.'; - if(map[end.y][end.x] >='A' && map[end.y][end.x]<='Z') { - removed = map[end.y][end.x]; - map[end.y][end.x] = '.'; - } - List res = PathFinding.doAStar(new MapNode(start.x, start.y), new MapNode(end.x, end.y)).stream().map(MapNode::toPoint).collect(Collectors.toList()); - if(removed >='A' && removed<='Z') { - map[end.y][end.x] = removed; - } - return res; + public List findPath(Point start, Point end) { + return PathFinding.doAStar(new MapNode(start.x, start.y), new MapNode(end.x, end.y)).stream().map(MapNode::toPoint).collect(Collectors.toList()); } } From 8f4999b1ab1a06a2a9f015346af26d3f7d4902d0 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 18 Dec 2019 18:59:54 +0100 Subject: [PATCH 100/433] Day 18: Optimized caching --- .../sbaars/adventofcode2019/days/Day11.java | 3 +- .../sbaars/adventofcode2019/days/Day18.java | 70 ++++++++++++++++--- .../sbaars/adventofcode2019/days/Day3.java | 3 +- 3 files changed, 61 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day11.java b/src/main/java/com/sbaars/adventofcode2019/days/Day11.java index e7a660b0..934b1201 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day11.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day11.java @@ -6,11 +6,10 @@ import java.util.Set; import com.sbaars.adventofcode2019.common.Day; +import com.sbaars.adventofcode2019.common.Direction; import com.sbaars.adventofcode2019.common.ProcessesImages; import com.sbaars.adventofcode2019.intcode.IntcodeComputer; -import com.sbaars.adventofcode2019.common.Direction; - public class Day11 implements Day, ProcessesImages { public static void main(String[] args) throws IOException { diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day18.java b/src/main/java/com/sbaars/adventofcode2019/days/Day18.java index 6c3758b2..057cd389 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day18.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day18.java @@ -7,7 +7,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Map.Entry; +import java.util.TreeSet; import java.util.stream.Collectors; import com.sbaars.adventofcode2019.common.Day; @@ -70,6 +70,47 @@ public String toString() { } + } + + class State{ + Point me; + TreeSet keys; + public State(Point me, TreeSet keys) { + super(); + this.me = me; + this.keys = keys; + } + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((keys == null) ? 0 : keys.hashCode()); + result = prime * result + ((me == null) ? 0 : me.hashCode()); + return result; + } + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + State other = (State) obj; + if (keys == null) { + if (other.keys != null) + return false; + } else if (!keys.equals(other.keys)) + return false; + if (me == null) { + if (other.me != null) + return false; + } else if (!me.equals(other.me)) + return false; + return true; + } + + } @Override @@ -115,7 +156,7 @@ public Object part1() throws IOException { System.out.println(steps); }*/ //System.out.println(Arrays.toString(reachableKeys.toArray())); - return findSteps(0, me, new ArrayList<>(), keys, routes); + return findSteps(me, new TreeSet<>(), keys, routes); } public List getRoute(Map> routes, Point p1, Point p2){ @@ -125,7 +166,7 @@ public List getRoute(Map> routes, Point p1, Point p2){ else return routes.get(new Route(p2, p1)); } - public boolean canTakeRoute(List route, List keys) { + public boolean canTakeRoute(List route, TreeSet keys) { for(Point p : route) { if(grid[p.y][p.x]>='A' && grid[p.y][p.x]<='Z' && !keys.contains(grid[p.y][p.x])) { return false; @@ -134,15 +175,19 @@ public boolean canTakeRoute(List route, List keys) { return true; } - int lowest = Integer.MAX_VALUE; - public int findSteps(int currentSteps, Point me, List collectedKeys, List keys, Map> routes) { - if(keys.isEmpty() && currentSteps cachedResult = new HashMap<>(); + public int findSteps(Point me, TreeSet collectedKeys, List keys, Map> routes) { + Integer cachedRes = cachedResult.get(new State(me, collectedKeys)); + if(cachedRes!=null) + return cachedRes; + /*if(keys.isEmpty() && currentSteps=lowest) { return currentSteps; - } - + }*/ + //System.out.println(Arrays.toString(collectedKeys.toArray())); List> possibleMoves = keys.stream().map(e -> getRoute(routes, me, e)).filter(e -> canTakeRoute(e, collectedKeys)).collect(Collectors.toList()); //System.out.println("moves "+possibleMoves.size()); //possibleMoves.addAll(doors.stream().filter(e -> collectedKeys.contains(grid[e.y][e.x])).map(e -> charGrid.findPath(meNow, e)).filter(e -> !e.isEmpty()).collect(Collectors.toList())); @@ -153,7 +198,7 @@ public int findSteps(int currentSteps, Point me, List collectedKeys, //List takenMove = possibleMoves.get(new Random().nextInt(possibleMoves.size())); //grid[me.y][me.x] = '.'; //me = takenMove.get(takenMove.size()-1); - List myKeys = new ArrayList<>(collectedKeys); + TreeSet myKeys = new TreeSet<>(collectedKeys); List keyLocs = new ArrayList<>(keys); Point newLoc = me.equals(takenMove.get(0)) ? takenMove.get(takenMove.size()-1) : takenMove.get(0); char collected = grid[newLoc.y][newLoc.x]; @@ -164,9 +209,12 @@ public int findSteps(int currentSteps, Point me, List collectedKeys, keyLocs.remove(newLoc); //System.out.println(collected); //grid[newLoc.y][newLoc.x] = '@'; - nSteps.add(findSteps(currentSteps + takenMove.size()-1, newLoc, myKeys, keyLocs, routes)); + //System.out.println("Taken move "+collected+" for "+(takenMove.size()-1)); + nSteps.add(findSteps(newLoc, myKeys, keyLocs, routes) + takenMove.size()-1); } - return nSteps.stream().mapToInt(e -> e).min().orElse(0); + int res = nSteps.stream().mapToInt(e -> e).min().orElse(0); + cachedResult.put(new State(me, collectedKeys), res); + return res; } private List findPos(char tile) { diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day3.java b/src/main/java/com/sbaars/adventofcode2019/days/Day3.java index 28ae2696..267d2895 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day3.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day3.java @@ -6,9 +6,8 @@ import java.util.HashSet; import java.util.Set; -import com.sbaars.adventofcode2019.common.Direction; - import com.sbaars.adventofcode2019.common.Day; +import com.sbaars.adventofcode2019.common.Direction; public class Day3 implements Day { From cc1f58741add0ac3ec0b09332984e27be63027a0 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 18 Dec 2019 19:28:19 +0100 Subject: [PATCH 101/433] Different approach --- .../sbaars/adventofcode2019/days/Day18.java | 50 ++++++++++++------- .../sbaars/adventofcode2019/util/Pair.java | 12 +++++ 2 files changed, 43 insertions(+), 19 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode2019/util/Pair.java diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day18.java b/src/main/java/com/sbaars/adventofcode2019/days/Day18.java index 057cd389..ae8e9a6f 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day18.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day18.java @@ -15,12 +15,19 @@ public class Day18 implements Day { - char[][] grid; - CharGrid2d charGrid; + private final char[][] grid; + private final CharGrid2d charGrid; + private static final char[][] CHANGE_GRID = { + {'@', '#', '@'}, + {'#', '#', '#'}, + {'@', '#', '@'} + }; + private final Point middle; public Day18() throws IOException { grid = Arrays.stream(readDay(18).split(System.lineSeparator())).map(e -> e.toCharArray()).toArray(char[][]::new); charGrid = new CharGrid2d(grid, false); + middle = findPos('@').get(0); } public static void main(String[] args) throws IOException { @@ -73,9 +80,9 @@ public String toString() { } class State{ - Point me; + List me; TreeSet keys; - public State(Point me, TreeSet keys) { + public State(List me, TreeSet keys) { super(); this.me = me; this.keys = keys; @@ -110,16 +117,16 @@ public boolean equals(Object obj) { return true; } - } @Override public Object part1() throws IOException { - Point me = findPos('@').get(0); + List me = new ArrayList<>(); + me.add(middle); //List collectedKeys = new ArrayList<>(); //int keysToCollect = findPos('a', 'z').size(); List keys = findPos('a', 'z'); - Map> routes = new HashMap<>(); + /*Map> routes = new HashMap<>(); List requiredRoutes = new ArrayList<>(keys); requiredRoutes.add(me); for(int i = 0; i doors = findPos('A', 'Z'); /*int steps = 0; //while(collectedKeys.size()(), keys, routes); + return findSteps(me, new TreeSet<>(), keys); } - public List getRoute(Map> routes, Point p1, Point p2){ - List p = routes.get(new Route(p1, p2)); - if(p != null) - return p; - else return routes.get(new Route(p2, p1)); + public List> getRoute(List me, Point p){ + List> points = new ArrayList<>(); + me.forEach(m -> points.add(charGrid.findPath(m, p))); + return points; + //List p = routes.get(new Route(p1, p2)); + //if(p != null) + // return p; + //else return routes.get(new Route(p2, p1)); } public boolean canTakeRoute(List route, TreeSet keys) { @@ -177,7 +187,7 @@ public boolean canTakeRoute(List route, TreeSet keys) { //int lowest = Integer.MAX_VALUE; Map cachedResult = new HashMap<>(); - public int findSteps(Point me, TreeSet collectedKeys, List keys, Map> routes) { + public int findSteps(List me, TreeSet collectedKeys, List keys) { Integer cachedRes = cachedResult.get(new State(me, collectedKeys)); if(cachedRes!=null) return cachedRes; @@ -187,8 +197,8 @@ public int findSteps(Point me, TreeSet collectedKeys, List key } else if(currentSteps>=lowest) { return currentSteps; }*/ - //System.out.println(Arrays.toString(collectedKeys.toArray())); - List> possibleMoves = keys.stream().map(e -> getRoute(routes, me, e)).filter(e -> canTakeRoute(e, collectedKeys)).collect(Collectors.toList()); + List> possibleMoves = me.stream().flatMap(m -> keys.stream().map(p -> charGrid.findPath(m, p))).filter(e -> !e.isEmpty()).collect(Collectors.toList());//keys.stream().map(e -> getRoute(routes, me, e)).filter(e -> canTakeRoute(e, collectedKeys)).collect(Collectors.toList()); + System.out.println(Arrays.toString(collectedKeys.toArray())+possibleMoves.size()); //System.out.println("moves "+possibleMoves.size()); //possibleMoves.addAll(doors.stream().filter(e -> collectedKeys.contains(grid[e.y][e.x])).map(e -> charGrid.findPath(meNow, e)).filter(e -> !e.isEmpty()).collect(Collectors.toList())); //List takenMove = possibleMoves.stream().reduce((a, b) -> a.size() collectedKeys, List key //me = takenMove.get(takenMove.size()-1); TreeSet myKeys = new TreeSet<>(collectedKeys); List keyLocs = new ArrayList<>(keys); - Point newLoc = me.equals(takenMove.get(0)) ? takenMove.get(takenMove.size()-1) : takenMove.get(0); + Point newLoc = takenMove.get(takenMove.size()-1); char collected = grid[newLoc.y][newLoc.x]; //System.out.println((takenMove.size()-1)+" steps to "+collected); myKeys.add(Character.toUpperCase(collected)); //doors.stream().filter(e -> grid[e.y][e.x] == Character.toUpperCase(collected)).forEach(e -> grid[e.y][e.x] = '.'); //doors.removeIf(e -> grid[e.y][e.x] == Character.toUpperCase(collected)); keyLocs.remove(newLoc); + List me2 = new ArrayList<>(me); + me2.set(me.indexOf(takenMove.get(0)), newLoc); //System.out.println(collected); //grid[newLoc.y][newLoc.x] = '@'; //System.out.println("Taken move "+collected+" for "+(takenMove.size()-1)); - nSteps.add(findSteps(newLoc, myKeys, keyLocs, routes) + takenMove.size()-1); + nSteps.add(findSteps(me2, myKeys, keyLocs) + takenMove.size()-1); } int res = nSteps.stream().mapToInt(e -> e).min().orElse(0); cachedResult.put(new State(me, collectedKeys), res); diff --git a/src/main/java/com/sbaars/adventofcode2019/util/Pair.java b/src/main/java/com/sbaars/adventofcode2019/util/Pair.java new file mode 100644 index 00000000..d07dbc5f --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/util/Pair.java @@ -0,0 +1,12 @@ +package com.sbaars.adventofcode2019.util; + +public class Pair { + public final K fst; + public final V snd; + + public Pair(K key, V value) { + super(); + this.fst = key; + this.snd = value; + } +} From 5fe3d18452bbb12a51a983ac933004887c7c86b8 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 18 Dec 2019 19:45:40 +0100 Subject: [PATCH 102/433] More generic algorithm --- .../sbaars/adventofcode2019/days/Day18.java | 51 +++++++++++-------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day18.java b/src/main/java/com/sbaars/adventofcode2019/days/Day18.java index ae8e9a6f..d4eb965b 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day18.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day18.java @@ -7,6 +7,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.TreeSet; import java.util.stream.Collectors; @@ -123,19 +124,23 @@ public boolean equals(Object obj) { public Object part1() throws IOException { List me = new ArrayList<>(); me.add(middle); + return findRoutes(me); + } + + private Object findRoutes(List me) { //List collectedKeys = new ArrayList<>(); //int keysToCollect = findPos('a', 'z').size(); List keys = findPos('a', 'z'); - /*Map> routes = new HashMap<>(); + Map> routes = new HashMap<>(); List requiredRoutes = new ArrayList<>(keys); - requiredRoutes.add(me); + requiredRoutes.addAll(me); for(int i = 0; i r = charGrid.findPath(requiredRoutes.get(i), requiredRoutes.get(j)); - //System.out.println(r.size()+", "+new Route(requiredRoutes.get(i), requiredRoutes.get(j))); - routes.put(new Route(requiredRoutes.get(i), requiredRoutes.get(j)), r); + if(!r.isEmpty()) + routes.put(new Route(requiredRoutes.get(i), requiredRoutes.get(j)), r); } - }*/ + } //List doors = findPos('A', 'Z'); /*int steps = 0; //while(collectedKeys.size()(), keys); + return findSteps(me, new TreeSet<>(), keys, routes); } - public List> getRoute(List me, Point p){ - List> points = new ArrayList<>(); - me.forEach(m -> points.add(charGrid.findPath(m, p))); - return points; - //List p = routes.get(new Route(p1, p2)); - //if(p != null) - // return p; - //else return routes.get(new Route(p2, p1)); + public List getRoute(Map> routes, Point p1, Point p2){ + List p = routes.get(new Route(p1, p2)); + if(p != null) + return p; + else return routes.get(new Route(p2, p1)); } public boolean canTakeRoute(List route, TreeSet keys) { @@ -187,7 +189,7 @@ public boolean canTakeRoute(List route, TreeSet keys) { //int lowest = Integer.MAX_VALUE; Map cachedResult = new HashMap<>(); - public int findSteps(List me, TreeSet collectedKeys, List keys) { + public int findSteps(List me, TreeSet collectedKeys, List keys, Map> routes) { Integer cachedRes = cachedResult.get(new State(me, collectedKeys)); if(cachedRes!=null) return cachedRes; @@ -197,8 +199,8 @@ public int findSteps(List me, TreeSet collectedKeys, List=lowest) { return currentSteps; }*/ - List> possibleMoves = me.stream().flatMap(m -> keys.stream().map(p -> charGrid.findPath(m, p))).filter(e -> !e.isEmpty()).collect(Collectors.toList());//keys.stream().map(e -> getRoute(routes, me, e)).filter(e -> canTakeRoute(e, collectedKeys)).collect(Collectors.toList()); - System.out.println(Arrays.toString(collectedKeys.toArray())+possibleMoves.size()); + List> possibleMoves = me.stream().flatMap(m -> keys.stream().map(p -> getRoute(routes, m, p))).filter(Objects::nonNull).filter(e -> canTakeRoute(e, collectedKeys)).collect(Collectors.toList());//keys.stream().map(e -> getRoute(routes, me, e)).filter(e -> canTakeRoute(e, collectedKeys)).collect(Collectors.toList()); + //System.out.println(Arrays.toString(collectedKeys.toArray())+possibleMoves.size()); //System.out.println("moves "+possibleMoves.size()); //possibleMoves.addAll(doors.stream().filter(e -> collectedKeys.contains(grid[e.y][e.x])).map(e -> charGrid.findPath(meNow, e)).filter(e -> !e.isEmpty()).collect(Collectors.toList())); //List takenMove = possibleMoves.stream().reduce((a, b) -> a.size() me, TreeSet collectedKeys, List myKeys = new TreeSet<>(collectedKeys); List keyLocs = new ArrayList<>(keys); - Point newLoc = takenMove.get(takenMove.size()-1); + Point newLoc = me.contains(takenMove.get(0)) ? takenMove.get(takenMove.size()-1) : takenMove.get(0); + Point oldLoc = me.contains(takenMove.get(0)) ? takenMove.get(0) : takenMove.get(takenMove.size()-1); char collected = grid[newLoc.y][newLoc.x]; //System.out.println((takenMove.size()-1)+" steps to "+collected); myKeys.add(Character.toUpperCase(collected)); @@ -218,11 +221,11 @@ public int findSteps(List me, TreeSet collectedKeys, List grid[e.y][e.x] == Character.toUpperCase(collected)); keyLocs.remove(newLoc); List me2 = new ArrayList<>(me); - me2.set(me.indexOf(takenMove.get(0)), newLoc); + me2.set(me.indexOf(oldLoc), newLoc); //System.out.println(collected); //grid[newLoc.y][newLoc.x] = '@'; //System.out.println("Taken move "+collected+" for "+(takenMove.size()-1)); - nSteps.add(findSteps(me2, myKeys, keyLocs) + takenMove.size()-1); + nSteps.add(findSteps(me2, myKeys, keyLocs, routes) + takenMove.size()-1); } int res = nSteps.stream().mapToInt(e -> e).min().orElse(0); cachedResult.put(new State(me, collectedKeys), res); @@ -253,6 +256,12 @@ private List findPos(char tile, char tile2) { @Override public Object part2() throws IOException { - return 0; + for(int y = 0; y Date: Wed, 18 Dec 2019 19:56:14 +0100 Subject: [PATCH 103/433] Refactor Day 18 --- .../sbaars/adventofcode2019/days/Day18.java | 142 ++---------------- 1 file changed, 9 insertions(+), 133 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day18.java b/src/main/java/com/sbaars/adventofcode2019/days/Day18.java index d4eb965b..6dd4cd0b 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day18.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day18.java @@ -14,6 +14,8 @@ import com.sbaars.adventofcode2019.common.Day; import com.sbaars.adventofcode2019.pathfinding.CharGrid2d; +import lombok.*; + public class Day18 implements Day { private final char[][] grid; @@ -35,89 +37,14 @@ public static void main(String[] args) throws IOException { new Day18().printParts(); } - class Route { + @Data @AllArgsConstructor class Route { Point start; Point end; - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((end == null) ? 0 : end.hashCode()); - result = prime * result + ((start == null) ? 0 : start.hashCode()); - return result; - } - public Route(Point start, Point end) { - super(); - this.start = start; - this.end = end; - } - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - Route other = (Route) obj; - if (end == null) { - if (other.end != null) - return false; - } else if (!end.equals(other.end)) - return false; - if (start == null) { - if (other.start != null) - return false; - } else if (!start.equals(other.start)) - return false; - return true; - } - @Override - public String toString() { - return "Route [start=" + start + ", end=" + end + "]"; - } - - } - class State{ + @Data @AllArgsConstructor class State{ List me; TreeSet keys; - public State(List me, TreeSet keys) { - super(); - this.me = me; - this.keys = keys; - } - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((keys == null) ? 0 : keys.hashCode()); - result = prime * result + ((me == null) ? 0 : me.hashCode()); - return result; - } - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - State other = (State) obj; - if (keys == null) { - if (other.keys != null) - return false; - } else if (!keys.equals(other.keys)) - return false; - if (me == null) { - if (other.me != null) - return false; - } else if (!me.equals(other.me)) - return false; - return true; - } - } @Override @@ -128,8 +55,6 @@ public Object part1() throws IOException { } private Object findRoutes(List me) { - //List collectedKeys = new ArrayList<>(); - //int keysToCollect = findPos('a', 'z').size(); List keys = findPos('a', 'z'); Map> routes = new HashMap<>(); List requiredRoutes = new ArrayList<>(keys); @@ -141,33 +66,6 @@ private Object findRoutes(List me) { routes.put(new Route(requiredRoutes.get(i), requiredRoutes.get(j)), r); } } - //List doors = findPos('A', 'Z'); - /*int steps = 0; - //while(collectedKeys.size()= 'a' && collected <= 'z') { - collectedKeys.add(Character.toUpperCase(collected)); - doors.stream().filter(e -> grid[e.y][e.x] == Character.toUpperCase(collected)).forEach(e -> grid[e.y][e.x] = '.'); - doors.removeIf(e -> grid[e.y][e.x] == Character.toUpperCase(collected)); - keys.remove(me); - } - grid[me.y][me.x] = '@'; - //} - if(steps<5992) - System.out.println(steps); - }*/ - //System.out.println(Arrays.toString(reachableKeys.toArray())); return findSteps(me, new TreeSet<>(), keys, routes); } @@ -187,44 +85,22 @@ public boolean canTakeRoute(List route, TreeSet keys) { return true; } - //int lowest = Integer.MAX_VALUE; Map cachedResult = new HashMap<>(); public int findSteps(List me, TreeSet collectedKeys, List keys, Map> routes) { Integer cachedRes = cachedResult.get(new State(me, collectedKeys)); - if(cachedRes!=null) - return cachedRes; - /*if(keys.isEmpty() && currentSteps=lowest) { - return currentSteps; - }*/ - List> possibleMoves = me.stream().flatMap(m -> keys.stream().map(p -> getRoute(routes, m, p))).filter(Objects::nonNull).filter(e -> canTakeRoute(e, collectedKeys)).collect(Collectors.toList());//keys.stream().map(e -> getRoute(routes, me, e)).filter(e -> canTakeRoute(e, collectedKeys)).collect(Collectors.toList()); - //System.out.println(Arrays.toString(collectedKeys.toArray())+possibleMoves.size()); - //System.out.println("moves "+possibleMoves.size()); - //possibleMoves.addAll(doors.stream().filter(e -> collectedKeys.contains(grid[e.y][e.x])).map(e -> charGrid.findPath(meNow, e)).filter(e -> !e.isEmpty()).collect(Collectors.toList())); - //List takenMove = possibleMoves.stream().reduce((a, b) -> a.size() keys.stream().map(p -> getRoute(routes, m, p))).filter(Objects::nonNull).filter(e -> canTakeRoute(e, collectedKeys)).collect(Collectors.toList()); List nSteps = new ArrayList<>(); for(List takenMove : possibleMoves) { - //List takenMove = possibleMoves.get(new Random().nextInt(possibleMoves.size())); - //grid[me.y][me.x] = '.'; - //me = takenMove.get(takenMove.size()-1); - TreeSet myKeys = new TreeSet<>(collectedKeys); - List keyLocs = new ArrayList<>(keys); + val myKeys = new TreeSet<>(collectedKeys); + val keyLocs = new ArrayList<>(keys); Point newLoc = me.contains(takenMove.get(0)) ? takenMove.get(takenMove.size()-1) : takenMove.get(0); Point oldLoc = me.contains(takenMove.get(0)) ? takenMove.get(0) : takenMove.get(takenMove.size()-1); char collected = grid[newLoc.y][newLoc.x]; - //System.out.println((takenMove.size()-1)+" steps to "+collected); myKeys.add(Character.toUpperCase(collected)); - //doors.stream().filter(e -> grid[e.y][e.x] == Character.toUpperCase(collected)).forEach(e -> grid[e.y][e.x] = '.'); - //doors.removeIf(e -> grid[e.y][e.x] == Character.toUpperCase(collected)); keyLocs.remove(newLoc); - List me2 = new ArrayList<>(me); + val me2 = new ArrayList<>(me); me2.set(me.indexOf(oldLoc), newLoc); - //System.out.println(collected); - //grid[newLoc.y][newLoc.x] = '@'; - //System.out.println("Taken move "+collected+" for "+(takenMove.size()-1)); nSteps.add(findSteps(me2, myKeys, keyLocs, routes) + takenMove.size()-1); } int res = nSteps.stream().mapToInt(e -> e).min().orElse(0); From 57bc27809e36a076f95516d647431efd30f149e0 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 18 Dec 2019 20:16:09 +0100 Subject: [PATCH 104/433] Refactor days --- .../sbaars/adventofcode2019/days/Day10.java | 24 ++---- .../sbaars/adventofcode2019/days/Day12.java | 3 +- .../sbaars/adventofcode2019/days/Day17.java | 29 +------ .../sbaars/adventofcode2019/days/Day2.java | 10 +-- .../sbaars/adventofcode2019/days/Day3.java | 20 ++--- .../sbaars/adventofcode2019/days/Day6.java | 12 +-- .../sbaars/adventofcode2019/days/Day7.java | 4 +- .../sbaars/adventofcode2019/days/Day8.java | 4 +- .../pathfinding/CharGrid2d.java | 2 +- .../adventofcode2019/pathfinding/Example.java | 77 ------------------- .../sbaars/adventofcode2019/util/Pair.java | 12 --- 11 files changed, 27 insertions(+), 170 deletions(-) delete mode 100644 src/main/java/com/sbaars/adventofcode2019/pathfinding/Example.java delete mode 100644 src/main/java/com/sbaars/adventofcode2019/util/Pair.java diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day10.java b/src/main/java/com/sbaars/adventofcode2019/days/Day10.java index 712aa57d..226b165c 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day10.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day10.java @@ -10,6 +10,8 @@ import com.sbaars.adventofcode2019.common.Day; +import lombok.EqualsAndHashCode; + public class Day10 implements Day { private final List asteroids; @@ -52,9 +54,9 @@ private long countNVisible(Point asteroid) { return asteroids.stream().map(e -> new Asteroid(asteroid, e)).mapToDouble(e -> e.rotation).distinct().count(); } - class Asteroid { - double rotation; - double distance; + @EqualsAndHashCode class Asteroid { + @EqualsAndHashCode.Exclude double rotation; + @EqualsAndHashCode.Exclude double distance; Point position; public Asteroid(Point center, Point me) { @@ -72,21 +74,5 @@ private double calcRotationAngleInDegrees(Point centerPt, Point targetPt) { double angle = Math.toDegrees(theta); return angle < 0 ? angle + 360 : angle; } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((position == null) ? 0 : position.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (!(obj instanceof Asteroid)) - return false; - Asteroid other = (Asteroid) obj; - return position.equals(other.position); - } } } diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day12.java b/src/main/java/com/sbaars/adventofcode2019/days/Day12.java index 50a92bbf..2d269051 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day12.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day12.java @@ -74,8 +74,7 @@ private void determineVelocity() { } private static long gcd(long a, long b) { - while (b > 0) - { + while (b > 0) { long temp = b; b = a % b; // % is remainder a = temp; diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day17.java b/src/main/java/com/sbaars/adventofcode2019/days/Day17.java index d205dcb0..9b180a8b 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day17.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day17.java @@ -11,6 +11,8 @@ import com.sbaars.adventofcode2019.common.Direction; import com.sbaars.adventofcode2019.intcode.IntcodeComputer; +import lombok.EqualsAndHashCode; + public class Day17 implements Day { char[][] grid = new char[48][48]; @@ -141,7 +143,7 @@ private List findPos(char[][] grid, char tile) { } enum Dir{L,R} - class Instruction{ + @EqualsAndHashCode class Instruction{ int amount; Dir dir; @@ -155,30 +157,5 @@ public Instruction(int amount, Dir dir) { public String toString() { return dir.name()+","+amount; } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + amount; - result = prime * result + ((dir == null) ? 0 : dir.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - Instruction other = (Instruction) obj; - if (amount != other.amount) - return false; - if (dir != other.dir) - return false; - return true; - } } } diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day2.java b/src/main/java/com/sbaars/adventofcode2019/days/Day2.java index 2f17263c..fea0cc37 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day2.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day2.java @@ -10,12 +10,12 @@ public class Day2 implements Day { public static void main(String[] args) throws IOException { new Day2().printParts(); } - + @Override public Object part1() throws IOException { return execute(12,2); } - + @Override public Object part2() throws IOException { return bruteForceFindingNumber(19690720, 99); @@ -24,10 +24,10 @@ public Object part2() throws IOException { private int bruteForceFindingNumber(int number, int bound) throws IOException { for(int i = 0; i intersect; @@ -84,27 +86,15 @@ public Walk(String code) { } } - class Step { + @EqualsAndHashCode class Step { private final Point point; - private int steps; - private boolean isCombined = false; + @EqualsAndHashCode.Exclude private int steps; + @EqualsAndHashCode.Exclude private boolean isCombined = false; public Step(Point point, int steps) { this.point = point; this.steps = steps + 1; } - - @Override - public int hashCode() { - return 31 + ((point == null) ? 0 : point.hashCode()); - } - - @Override - public boolean equals(Object obj) { - if (!(obj instanceof Step)) - return false; - return point.equals(((Step) obj).point); - } public void combine(Step step) { if(!isCombined) { diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day6.java b/src/main/java/com/sbaars/adventofcode2019/days/Day6.java index 50813c0e..9a31e4ba 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day6.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day6.java @@ -4,8 +4,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Map.Entry; import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; import com.sbaars.adventofcode2019.common.Day; import com.sbaars.adventofcode2019.util.ListMap; @@ -27,7 +27,7 @@ public Object part1() throws IOException { orbits.addTo(parts[0], parts[1]); } AtomicInteger o = new AtomicInteger(); - for(Entry> entry : orbits.entrySet()) + for(var entry : orbits.entrySet()) countOrbitsInList(orbits, o, entry.getValue()); return o.get(); } @@ -71,13 +71,7 @@ private List collectAll(String s1) { } public List findOrbit(String orbitValue) { - List orbit = new ArrayList<>(); - for(Entry> entry : orbits.entrySet()) { - if(entry.getValue().contains(orbitValue)) { - orbit.add(entry.getKey()); - } - } - return orbit; + return orbits.entrySet().stream().filter(e -> e.getValue().contains(orbitValue)).map(e -> e.getKey()).collect(Collectors.toList()); } private String[] createOrbitArray() throws IOException { diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day7.java b/src/main/java/com/sbaars/adventofcode2019/days/Day7.java index 46c0248c..433af6b0 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day7.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day7.java @@ -16,7 +16,7 @@ public static void main(String[] args) throws IOException { @Override public Object part1() throws IOException { - List> permutations = generatePerm(new ArrayList<>(Arrays.asList(0,1,2,3,4))); + var permutations = generatePerm(new ArrayList<>(Arrays.asList(0,1,2,3,4))); List results = new ArrayList<>(); for(List perm : permutations) { long lastVal = 0; @@ -30,7 +30,7 @@ public Object part1() throws IOException { @Override public Object part2() throws IOException { - List> permutations = generatePerm(new ArrayList<>(Arrays.asList(5,6,7,8,9))); + var permutations = generatePerm(new ArrayList<>(Arrays.asList(5,6,7,8,9))); List results = new ArrayList<>(); perms: for(List shuffle : permutations) { IntcodeComputer[] computers = new IntcodeComputer[5]; diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day8.java b/src/main/java/com/sbaars/adventofcode2019/days/Day8.java index 4887d8d8..c53be49f 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day8.java @@ -22,8 +22,8 @@ public static void main(String[] args) throws IOException { @Override public Object part1() throws IOException { int[] pixels = readPixels(); - List> pixelCounts = countPixels(pixels); - CountMap cm = pixelCounts.stream().reduce((e1, e2) -> e1.get(0) > e2.get(0) ? e2 : e1).get(); + var pixelCounts = countPixels(pixels); + var cm = pixelCounts.stream().reduce((e1, e2) -> e1.get(0) > e2.get(0) ? e2 : e1).get(); return cm.get(1) * cm.get(2); } diff --git a/src/main/java/com/sbaars/adventofcode2019/pathfinding/CharGrid2d.java b/src/main/java/com/sbaars/adventofcode2019/pathfinding/CharGrid2d.java index 929326ef..842824b3 100644 --- a/src/main/java/com/sbaars/adventofcode2019/pathfinding/CharGrid2d.java +++ b/src/main/java/com/sbaars/adventofcode2019/pathfinding/CharGrid2d.java @@ -66,7 +66,7 @@ public Set getNeighbours() { continue; } - if (map[j][i] == '#'/* || (map[j][i]>='A' && map[j][i]<='Z' && !collectedKeys.contains(map[j][i]))*/) { + if (map[j][i] == '#') { continue; } diff --git a/src/main/java/com/sbaars/adventofcode2019/pathfinding/Example.java b/src/main/java/com/sbaars/adventofcode2019/pathfinding/Example.java deleted file mode 100644 index cccb1cfc..00000000 --- a/src/main/java/com/sbaars/adventofcode2019/pathfinding/Example.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.sbaars.adventofcode2019.pathfinding; - -import java.awt.Point; -import java.util.Arrays; -import java.util.List; - -import com.sbaars.adventofcode2019.common.Direction; - -public class Example { - - static int[][] grid = {{3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 1, 1, 1, 1, 1, 0, 3, 3, 3, 3, 3, 0, 1, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 3, 3, 3, 3, 0, 1, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 0, 1, 1, 1, 1, 1, 1, 1, 1, 3, 0, 1, 1, 1, 0, 3, 3, 3, 0, 1, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 3, 3, 0, 1, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 1, 1, 1, 1, 1, 0, 1, 0, 3, 3, 3, 0, 1, 1, 1, 1, 1, 1, 1, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 1, 0, 0, 0, 1, 0, 1, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 1, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 1, 1, 1, 0, 1, 1, 1, 0, 3, 3, 3, 3, 3, 0, 1, 1, 1, 1, 1, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 1, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 1, 0, 3, 3, 3, 3, 3, 0, 1, 1, 1, 1, 1, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}}; - - public static void main(String[] args) { - Grid2d map2d = new Grid2d(grid, false); - Point start = new Point(7,27); - Point end = new Point(14,27); - grid[start.y][start.x] = 8; - List route = map2d.findPath(start, end); - System.out.println("Go from "+start+" to "+end+" by route "+route.subList(1, route.size())); - route.subList(1, route.size()).stream().forEach(p -> grid[p.y][p.x] = 9);//.peek(System.out::println); - for(Point p : route.subList(1, route.size())) { - System.out.println("Dir "+Direction.getByMove(start, p)); - start = p; - } - Arrays.stream(grid).map(e -> Arrays.toString(e)).forEach(System.out::println); - } - -} diff --git a/src/main/java/com/sbaars/adventofcode2019/util/Pair.java b/src/main/java/com/sbaars/adventofcode2019/util/Pair.java deleted file mode 100644 index d07dbc5f..00000000 --- a/src/main/java/com/sbaars/adventofcode2019/util/Pair.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.sbaars.adventofcode2019.util; - -public class Pair { - public final K fst; - public final V snd; - - public Pair(K key, V value) { - super(); - this.fst = key; - this.snd = value; - } -} From 80feb7d34d6ffe614cf97d9bb9dcdbee74585364 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 18 Dec 2019 20:17:52 +0100 Subject: [PATCH 105/433] Added day 18 to README --- README.md | 5 +++++ src/main/java/com/sbaars/adventofcode2019/Main.java | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ae02bed5..82baf5d7 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ Days: - [Day 15](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day15.java) - [Day 16](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day16.java) - [Day 17](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day17.java) +- [Day 18](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day18.java) Output of running [Main.java](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/Main.java): ``` @@ -101,4 +102,8 @@ Part 2: 62858988 Day 17: Part 1: 7404 Part 2: 929045 + +Day 18: +Part 1: 5402 +Part 2: 2138 ``` \ No newline at end of file diff --git a/src/main/java/com/sbaars/adventofcode2019/Main.java b/src/main/java/com/sbaars/adventofcode2019/Main.java index 5e7a3622..da3c23a0 100644 --- a/src/main/java/com/sbaars/adventofcode2019/Main.java +++ b/src/main/java/com/sbaars/adventofcode2019/Main.java @@ -7,7 +7,7 @@ public class Main { public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException, InvocationTargetException, NoSuchMethodException { - for(int day = 1; day<=17; day++) { + for(int day = 1; day<=18; day++) { System.out.println("Day "+day+":"); Day instance = (Day)Class.forName("com.sbaars.adventofcode2019.days.Day"+day).getDeclaredConstructor().newInstance(); instance.printParts(); From 738c20e84e9c2e838597b161d4e05ebe26e28c19 Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 19 Dec 2019 06:51:17 +0100 Subject: [PATCH 106/433] Day 19 Finally a relatively easy one again --- .../sbaars/adventofcode2019/days/Day19.java | 45 +++++++++++++++++++ .../intcode/IntcodeComputer.java | 2 +- src/main/resources/day19.txt | 6 +-- 3 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode2019/days/Day19.java diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day19.java b/src/main/java/com/sbaars/adventofcode2019/days/Day19.java new file mode 100644 index 00000000..f8d25001 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day19.java @@ -0,0 +1,45 @@ +package com.sbaars.adventofcode2019.days; + +import java.io.IOException; + +import com.sbaars.adventofcode2019.common.Day; +import com.sbaars.adventofcode2019.intcode.IntcodeComputer; + +public class Day19 implements Day { + + public static void main(String[] args) throws IOException { + new Day19().printParts(); + } + + @Override + public Object part1() throws IOException { + /*for(int i = 0; i<200;i++) { + for(int j = 0; j<100;j++) { + System.out.print(new IntcodeComputer(19, 1).run(i, j)); + } + System.out.println(); + }*/ + long res = 0; + for(int x = 0; x<50;x++) { + for(int y = 0; y<50;y++) { + res+=new IntcodeComputer(19).run(x, y); + } + } + return res; + } + + @Override + public Object part2() throws IOException { + int x = 500, y = 0; + while(true) { + if(beam(x, y)) { + if(beam(x-99, y+99)) return 10000 * (x - 99) + y; + x++; + } else y++; + } + } + + private boolean beam(int x, int y) throws IOException { + return new IntcodeComputer(19).run(x, y) == 1L; + } +} diff --git a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java index 430f373b..1100ec10 100644 --- a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java +++ b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java @@ -31,7 +31,7 @@ public IntcodeComputer(int day, long...input) throws IOException { } } - public long run(long input) { + public long run(long...input) { setInput(input); return run(); } diff --git a/src/main/resources/day19.txt b/src/main/resources/day19.txt index 7345fa09..4bdbeb34 100644 --- a/src/main/resources/day19.txt +++ b/src/main/resources/day19.txt @@ -1,5 +1 @@ -######################## -#f.D.E.e.C.b.A.@.a.B.c.# -######################.# -#d.....................# -######################## \ No newline at end of file +109,424,203,1,21102,11,1,0,1105,1,282,21101,0,18,0,1105,1,259,2101,0,1,221,203,1,21102,1,31,0,1105,1,282,21102,1,38,0,1105,1,259,20102,1,23,2,21201,1,0,3,21102,1,1,1,21102,57,1,0,1106,0,303,2102,1,1,222,21002,221,1,3,20101,0,221,2,21101,0,259,1,21101,0,80,0,1105,1,225,21101,44,0,2,21102,91,1,0,1105,1,303,1202,1,1,223,21002,222,1,4,21102,259,1,3,21102,1,225,2,21102,225,1,1,21101,118,0,0,1106,0,225,21002,222,1,3,21101,163,0,2,21101,0,133,0,1106,0,303,21202,1,-1,1,22001,223,1,1,21102,148,1,0,1106,0,259,1202,1,1,223,20101,0,221,4,21001,222,0,3,21102,1,24,2,1001,132,-2,224,1002,224,2,224,1001,224,3,224,1002,132,-1,132,1,224,132,224,21001,224,1,1,21101,195,0,0,105,1,108,20207,1,223,2,21002,23,1,1,21102,-1,1,3,21102,1,214,0,1106,0,303,22101,1,1,1,204,1,99,0,0,0,0,109,5,2101,0,-4,249,22102,1,-3,1,22101,0,-2,2,22101,0,-1,3,21102,250,1,0,1106,0,225,21202,1,1,-4,109,-5,2105,1,0,109,3,22107,0,-2,-1,21202,-1,2,-1,21201,-1,-1,-1,22202,-1,-2,-2,109,-3,2106,0,0,109,3,21207,-2,0,-1,1206,-1,294,104,0,99,22102,1,-2,-2,109,-3,2105,1,0,109,5,22207,-3,-4,-1,1206,-1,346,22201,-4,-3,-4,21202,-3,-1,-1,22201,-4,-1,2,21202,2,-1,-1,22201,-4,-1,1,21202,-2,1,3,21101,0,343,0,1106,0,303,1106,0,415,22207,-2,-3,-1,1206,-1,387,22201,-3,-2,-3,21202,-2,-1,-1,22201,-3,-1,3,21202,3,-1,-1,22201,-3,-1,2,21201,-4,0,1,21101,384,0,0,1105,1,303,1105,1,415,21202,-4,-1,-4,22201,-4,-3,-4,22202,-3,-2,-2,22202,-2,-4,-4,22202,-3,-2,-3,21202,-4,-1,-2,22201,-3,-2,1,21202,1,1,-4,109,-5,2105,1,0 \ No newline at end of file From ebb0c64a91c63cd4a74d04aa663d5d68d775570e Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 19 Dec 2019 06:58:37 +0100 Subject: [PATCH 107/433] Refactor day 19 --- .../com/sbaars/adventofcode2019/days/Day19.java | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day19.java b/src/main/java/com/sbaars/adventofcode2019/days/Day19.java index f8d25001..ce2485ca 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day19.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day19.java @@ -13,18 +13,10 @@ public static void main(String[] args) throws IOException { @Override public Object part1() throws IOException { - /*for(int i = 0; i<200;i++) { - for(int j = 0; j<100;j++) { - System.out.print(new IntcodeComputer(19, 1).run(i, j)); - } - System.out.println(); - }*/ long res = 0; - for(int x = 0; x<50;x++) { - for(int y = 0; y<50;y++) { + for(int x = 0; x<50;x++) + for(int y = 0; y<50;y++) res+=new IntcodeComputer(19).run(x, y); - } - } return res; } @@ -34,7 +26,7 @@ public Object part2() throws IOException { while(true) { if(beam(x, y)) { if(beam(x-99, y+99)) return 10000 * (x - 99) + y; - x++; + else x++; } else y++; } } From 684d7b93cf14446a5a841d7c654ac94c0ec69f5b Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 19 Dec 2019 07:00:03 +0100 Subject: [PATCH 108/433] Add day 19 to README --- README.md | 5 +++++ src/main/java/com/sbaars/adventofcode2019/Main.java | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 82baf5d7..1b4cf67c 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ Days: - [Day 16](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day16.java) - [Day 17](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day17.java) - [Day 18](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day18.java) +- [Day 19](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day19.java) Output of running [Main.java](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/Main.java): ``` @@ -106,4 +107,8 @@ Part 2: 929045 Day 18: Part 1: 5402 Part 2: 2138 + +Day 19: +Part 1: 179 +Part 2: 9760485 ``` \ No newline at end of file diff --git a/src/main/java/com/sbaars/adventofcode2019/Main.java b/src/main/java/com/sbaars/adventofcode2019/Main.java index da3c23a0..745d7c0d 100644 --- a/src/main/java/com/sbaars/adventofcode2019/Main.java +++ b/src/main/java/com/sbaars/adventofcode2019/Main.java @@ -7,7 +7,7 @@ public class Main { public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException, InvocationTargetException, NoSuchMethodException { - for(int day = 1; day<=18; day++) { + for(int day = 1; day<=19; day++) { System.out.println("Day "+day+":"); Day instance = (Day)Class.forName("com.sbaars.adventofcode2019.days.Day"+day).getDeclaredConstructor().newInstance(); instance.printParts(); From 122e9a25fd6ac9441608d3eabffa05d59e9efe2a Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 20 Dec 2019 07:39:08 +0100 Subject: [PATCH 109/433] Day 20 Part 1 --- .../sbaars/adventofcode2019/days/Day20.java | 182 ++++++++++++++++++ src/main/resources/day20.txt | 107 ++++++++++ 2 files changed, 289 insertions(+) create mode 100644 src/main/java/com/sbaars/adventofcode2019/days/Day20.java create mode 100644 src/main/resources/day20.txt diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day20.java b/src/main/java/com/sbaars/adventofcode2019/days/Day20.java new file mode 100644 index 00000000..57fbccf4 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day20.java @@ -0,0 +1,182 @@ +package com.sbaars.adventofcode2019.days; + +import java.awt.Point; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.TreeSet; +import java.util.stream.Collectors; + +import com.sbaars.adventofcode2019.common.Day; +import com.sbaars.adventofcode2019.pathfinding.CharGrid2d; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.val; + +public class Day20 implements Day { + char[][] grid; + CharGrid2d charGrid; + + public Day20() throws IOException { + grid = Arrays.stream(readDay(20).split(System.lineSeparator())).map(e -> e.toCharArray()).toArray(char[][]::new); + charGrid = new CharGrid2d(grid, false); + } + + public static void main(String[] args) throws IOException { + new Day20().printParts(); + } + + @Data @AllArgsConstructor class Portal { + String value; + Point location; + } + + @Override + public Object part1() throws IOException { + Arrays.stream(grid).forEach(e -> System.out.println(new String(e))); + int[] rows = {2, 26, 80, 104}; + List portals = new ArrayList<>(); + for(int row : rows) { + for(int i = 2; i e.location).findAny().get(), portals); + //System.out.println(Arrays.toString(portals.toArray())); + //return 0; + } + + @Override + public Object part2() throws IOException { + return 0; + } + + @Data @AllArgsConstructor class Route { + Point start; + Point end; + } + + @Data @AllArgsConstructor class State{ + Point me; + TreeSet portalsTaken; + } + + private Object findRoutes(Point me, List portals) { + Map> routes = new HashMap<>(); + List requiredRoutes = new ArrayList<>(portals.stream().map(e -> e.location).collect(Collectors.toList())); + requiredRoutes.add(me); + for(int i = 0; i r = charGrid.findPath(requiredRoutes.get(i), requiredRoutes.get(j)); + if(!r.isEmpty()) + routes.put(new Route(requiredRoutes.get(i), requiredRoutes.get(j)), r); + } + } + removePortal(portals, "AA"); + return findSteps(me, new TreeSet<>(), portals, routes); + } + + public List getRoute(Map> routes, Point p1, Point p2){ + List p = routes.get(new Route(p1, p2)); + if(p != null) return p; + else return routes.get(new Route(p2, p1)); + } + + public boolean canTakeRoute(List route, TreeSet keys) { + for(Point p : route) { + if(grid[p.y][p.x]>='A' && grid[p.y][p.x]<='Z' && !keys.contains(grid[p.y][p.x])) { + return false; + } + } + return true; + } + + Map cachedResult = new HashMap<>(); + public int findSteps(Point me, TreeSet collectedKeys, List portals, Map> routes) { + Integer cachedRes = cachedResult.get(new State(me, collectedKeys)); + if(cachedRes!=null) return cachedRes; + + var possibleMoves = portals.stream().filter(p -> !collectedKeys.contains(p.value)).map(p -> getRoute(routes, me, p.location)).filter(Objects::nonNull).collect(Collectors.toList()); + removeDuplicates(me, portals, possibleMoves); + + List nSteps = new ArrayList<>(); + for(List takenMove : possibleMoves) { + Point moveTo = me.equals(takenMove.get(0)) ? takenMove.get(takenMove.size()-1) : takenMove.get(0); + Portal thisPortal = getPortal(portals, moveTo); + if(thisPortal.value.equals("ZZ")) { + nSteps.add(takenMove.size()-1); + continue; + } + + List teleport = getPortal(portals, thisPortal.value); + Point newLoc = null; + for(Portal portal : teleport) { + if(!portal.location.equals(moveTo)) { + newLoc = portal.getLocation(); + } + } + val myKeys = new TreeSet<>(collectedKeys); + val keyLocs = new ArrayList<>(portals); + //Point newLoc = me.contains(takenMove.get(0)) ? moveTo : takenMove.get(0); + //Point oldLoc = me.equals(takenMove.get(0)) ? takenMove.get(0) : moveTo; + myKeys.add(thisPortal.value); + keyLocs.removeAll(teleport); + nSteps.add(findSteps(newLoc, myKeys, keyLocs, routes) + takenMove.size()-1); + } + int res = nSteps.stream().mapToInt(e -> e).min().orElse(0); + cachedResult.put(new State(me, collectedKeys), res); + return res; + } + + private void removeDuplicates(Point me, List portals, List> possibleMoves) { + Map pointIndices = new HashMap<>(); + for(int i = 0; i ps = getPortal(portals, p.value); + for(Portal por : ps) { + Point portal = por.location; + if(!portal.equals(moveTo) && pointIndices.containsKey(portal)) { + int moves = possibleMoves.get(i).size(); + int otherMoves = possibleMoves.get(pointIndices.get(portal)).size(); + if(moves > otherMoves) + possibleMoves.remove(i); + else possibleMoves.remove(pointIndices.get(portal).intValue()); + } + } + pointIndices.put(moveTo, 0); + } + + } + + public List getPortal(List portals, String key){ + return portals.stream().filter(e -> e.value.equals(key)).collect(Collectors.toList()); + } + + public boolean removePortal(List portals, String key){ + return portals.removeIf(e -> e.value.equals(key)); + } + + public Portal getPortal(List portals, Point key){ + return portals.stream().filter(e -> e.location.equals(key)).findAny().get(); + } +} diff --git a/src/main/resources/day20.txt b/src/main/resources/day20.txt new file mode 100644 index 00000000..b93543d5 --- /dev/null +++ b/src/main/resources/day20.txt @@ -0,0 +1,107 @@ + L S F Z O X Q W + T S P Z J J X L + #############################.#######.#####.#.#####.#####.#####.#####.################################# + #.#.....#.....#.#.#.#.....#.....#.#.......#...#.....#.#...#.#.#.#.......#...#.#.#...#.#...#.#...#.#.#.# + #.###.#.###.###.#.#.###.#####.###.###.#.#####.###.###.#.###.#.#.#####.###.#.#.#.#.###.#.###.#.#.#.#.#.# + #.....#.#...#.#.....#.#...#.....#.#.#.#.#...#.#.....#.......#...#...#.....#.#.............#.#.#.....#.# + #######.###.#.#.#####.###.#.#####.#.###.#.#.#.#####.#.#.#.#.#.#.#.###.#####.#.#.#########.#.#.#######.# + #...#.....#.....#...#.........#.......#.#.#.....#...#.#.#.#.#.#.#...#.#.......#.........#.......#.....# + #.#######.#####.###.#########.###.###.#.#.#######.#.###.###.###.###.#.#.#####.#.#####.#.#.#.#######.### + #.#...#.....#.......#.#.#.#...#...#...#.#...#...#.#...#...#.#.....#...#.....#.#.....#.#.#.#.#.#.#.....# + #.#.#####.#.###.###.#.#.#.#.#####.###.#.#.###.#####.#.#.#######.#####.#####.###########.###.#.#.#.###.# + #...#...#.#.......#...........#.....#.#.#...#...#...#.#.....#...#.....#...#.#.....#...#.#.#.#.....#.#.# + ###.#.#######.#############.#######.#.#.###.#.#####.#.#.#.###.#.#######.#.#.#.###.###.###.#####.###.### + #.........#.#.#.....#...#.......#...#...#.......#...#.#.#.#.#.#.....#...#.......#.#.......#.....#...#.# + #.###.###.#.#.#####.###.###.#####.###.#.###.#.#######.#.###.###.#.#.#.#.#.###.###.###.#####.###.#.###.# + #.#...#.........#...............#.#...#.#...#...#.....#...#...#.#.#.#.#.#...#.#.......#.#.#...#...#...# + ###.#######.#.#####.###.###.#####.#######.###########.#.###.###.#####.#################.#.#.#####.###.# + #.#...#.....#.....#...#.#.....#.......#.#...#.........#.....#.#.....#...........#.#.#.#...#.#.#.#.#...# + #.#######.###.#.###########.#########.#.###.###.###.#######.#.###.###.#.###.#####.#.#.#.#.###.#.#.#.### + #.#...#.#.#...#...#.............#.......#.....#...#...#.......#...#...#.#...#.#...#.#...#...#.#.#...#.# + #.###.#.#####.#####.#######.###.###.#####.###########.###.#####.#####.#######.#.###.###.#####.#.#.###.# + #.#.........#.....#.#.....#.#.....#.....#...#.#.....#.#.......#...#.#...........#.#.#...#.#.#.#...#...# + #.#.#####.#.#.#.###.#####.###.#####.#.#####.#.###.#.#.###.#####.#.#.#.#####.#####.#.###.#.#.#.###.#.#.# + #.#.#.#...#.#.#.#.#.#.....#.......#.#.#.#.....#...#...#...#.....#.#.#.#.....#.#.#.#.#.....#...#...#.#.# + #.###.###.#######.#####.#.#####.#####.#.#.#####.###.#.#.#######.###.#.#####.#.#.#.#.###.#####.###.#.### + #.#.#...#.#.#.....#...#.#.......#.......#.....#...#.#.#.......#.....#.#...........#...#...#.#.#.......# + #.#.#.###.#.#####.###.#######.#########.#####.#.#############.#####.#####.#########.###.###.#.###.###.# + #.#.....#.#.#.#.#...#.#.# U D P I Q L M #.#...#...#.......#.#...# + #.#####.#.#.#.#.#.###.#.# E R V Q X T X #.###.###.###.#######.#.# + #.#.........#.#.....#.#.# #...#.#.#.#.......#.#.#.# + #.###.#######.###.###.#.# #.###.#.#.###.#####.###.# + #.#.#...#.....#.#.......# TI......#.........#.#.....# + #.#.#.#######.#.###.###.# #.#.#.#.###.#.###.###.#.# + #.....#.....#...#.#.#...# #.#.#...#...#.....#...#..IQ + #.###.###.#####.#.#.###.# #.#.#.#.#.#####.#.#.#.### +TI..#...#.....#...#.#...#..WL #.#.#.#.#.#.....#.#.#...# + #.#.###.#.#####.#.###.#.# #############.#####.#.### + #.#.....#.............#.# #...#...#.#.........#.#.# + #######.#.#.#.#.#######.# ###.###.#.#####.#.#####.# + #.....#.#.#.#.#.#.#.....# #.............#.#.#.#....UE + #.###.###########.###.### ###.#.#######.#####.###.# + #...#...#.....#...#...#.# #...#.....#...........#.# + ###.###.#.#.#####.###.#.# #.#####.#.###.###.###.#.# +OG..#...#...#...#.#.#.#.#..OB #.#.....#.#.#...#.#...#.# + #.###.#####.###.#.#.###.# ###.###.#.#.#########.#.# + #.......#...............# VU....#...#.#.#...#...#...# + #.###.#.#.#.#.###.#.##### #.#########.#.#####.##### + #...#.#.#.#.#...#.#.#....ZH #...#...#...#.....#.....# + #####.#.###.#.#######.### #######.#.#.#.###.#.###.# + #...#.#.#.#.#...#.......# #.....#...#.....#.....#.# + ###.#####.###.#########.# #.#.###.#####.###.#.###.# +PV....#.#.....#.#.#.#.#...# #.#.......#.....#.#.#...# + #.#.#.#.#.#####.#.#.#.### ###.#.#############.#.#.# + #.#.....#.............#.# DS....#.#.#.....#.#.#.#.#..DR + #######################.# #######.###.###.#.####### + #.................#.....# #.#.#.................#.# + #.###.###.#.#.#.#.#.###.# #.#.#.#####.###.#####.#.# + #.#...#.#.#.#.#.#.#.#...# SB....#...#.....#.#...#...# + #####.#.#########.#.#.### #.###.###.#.###.###.###.# + #...#.......#...#...#...# #.......#.#.#...#.#.#...# + #.#.#.###.###.#####.###.# #.#.#.#####.#####.#.#.### +GU..#...#...#...#.#.....#..SS #.#.#.#.#.#.#.#.#.#......QN + #############.#.#######.# #####.#.#.###.#.#.####### + #.#.#...............#.#.# OJ..#.#.#...#.......#.#....PO + #.#.#.#######.#.###.#.### #.#.###.#.#.#####.#.###.# +AA....#.....#.#.#.#.#.....# #...#...#.....#.#...#...# + #.###.#.#.#.#####.#####.# #.#.#.#.#.#####.#.#.#.#.# + #...#.#.#.....#.........# #.#...#.#.#...#...#.#.#.# + #.#.#.#####.#####.#.##### #.#.###.#.#.###.#.#.#.#.# +MX..#.....#.#...#.#.#......OQ QN..#.#...#.#.#.#.#.#...#..MH + ###.#####.#####.###.##### ###########.#.########### + #.#.#.#.#.....#...#.#....MH PO......#.#................YJ + #.###.#.#.#######.#####.# #.#.###.#.#.#.###.###.#.# + #...#.........#.........# #.#.#.....#.#.#.....#.#.# + #.#.#.#.###############.# ###.#.#########.#.#.#.#.# +OB..#.#.#...#.#.#.#.....#.# #...#.....#.#.#.#.#.#.#.# + #.#.#.#.###.#.#.#.#.#.#.# #.#######.#.#.###.#.##### + #.#...#...........#.#...# #...............#.#.....# + ###.###.#.#.#.#.#####.#.# X D H O G F Y #.#.#.###.###.#####.###.# + #.....#.#.#.#.#...#...#.# J C Y G U P J #.#.#.#.....#.....#.#.#.# + ###.###.###.#.#.###.#.###########.#.#######.#######.#########.#.#########.#########.###.#######.###.### + #.#...#...#.#.#...#.#.#.#.#.....#.#...#.........#...#.........#.....#.......#.....#.#.........#.#.#...# + #.#.###.#####.#.#.#####.#.#.###.#.###.#########.#.#####.#########.#####.#######.#####.###.#.#####.###.# + #...#.....#.#.#.#...#.#.......#...#.......#.....#.#...........#...#.#.#.............#.#...#...........# + ###.###.###.###.#####.#.#.###.#######.#.#####.###.#.#####.###.###.#.#.###.#.###.#.###.#.###.#.#######.# + #.#...#...#.........#...#...#.......#.#.#...#...#.#.#...#.#.....#.#.....#.#...#.#.#...#.#...#...#.....# + #.#.#.#.###.###.#.#######.#.#.###.#.###.#.#####.#.###.#####.#####.#.#.###.###########.#####.###.###.#.# + #...#.#.#.....#.#...#.#...#.#.#.#.#.#.......#...#...#.......#.....#.#...#.......#.#.#.#.......#.#.#.#.# + #.#.###.#.#.#.#####.#.#.#.#####.#.#.###.###.###.#.###.#.###.#####.#.#.###.#######.#.#.#####.###.#.###.# + #.#...#.#.#.#.#.#.#.#.#.#...#.....#.#.....#.#.#.#...#.#...#...#.....#.#.......#.#.#...#...#.#...#.....# + #######.#####.#.#.###.###.#####.#.#####.#####.#.#.#####.#######.#####.###.#####.#.#####.#.#####.#.###.# + #.#.#.#.....#.#.#.......#.#.#...#.....#.#.#.....#.....#.#.#.#...#.....#.................#...#...#...#.# + #.#.#.#.#.#####.#####.#####.#####.#####.#.###.###.#####.#.#.#######.###.#.#######.###.#.#######.#.###.# + #.......#.#.#.#...#.......#.........#.....#.#...#.#.#.....#.#.#.#.#...#.#.....#.#...#.#.......#.#.#...# + #.#.###.###.#.###.###.#########.###.###.###.###.#.#.#.###.#.#.#.#.###.#.###.#.#.#######.#########.###.# + #.#.#.#...#.......................#.#...#.#.....#...#.#.......#.......#...#.#.#.#...#.#.#.....#...#...# + #.###.#.###.###.###.#######.#########.#.#.#.###.###.###.#######.###.#####.#####.#.###.#####.#####.###.# + #...#...#.#.#.....#.#...#...#.....#...#.#.....#.#.#.#.#.#.#.#.....#...#.....#...........#.......#.#...# + #.###.###.#########.###.###.#.#.###.#.#####.#####.#.#.#.#.#.#######.#.#.#######.###.#####.###########.# + #.#.....#.#.#.......#.....#...#...#.#.#.....#.........#.#.#.#...#...#.#...........#...#.#...#.....#...# + ###.###.#.#.#######.###.#######.#####.###.#########.#.#.#.#.#.#######.###.#.###.###.###.#.###.######### + #...#.......#.......#.#...........#.....#.#.....#...#.#...#...#...#...#...#...#.#.....................# + #.###.#.###.#.#.#####.#####.###########.#.#.###.#.###.#.###.#.###.#.###.#.###########.###.###.######### + #.#...#.#...#.#.#...................#...#...#...#.#...#.....#.#.....#...#...........#...#...#.........# + #################################.###.#########.#####.#######.###.#####.############################### + H V Z D S D O + Y U H C B S Q \ No newline at end of file From 8c0311e64c33e7a5aae7528006dc3a6a93bc8ffa Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 20 Dec 2019 08:51:55 +0100 Subject: [PATCH 110/433] Start rewriting day 20 --- src/main/java/com/sbaars/adventofcode2019/days/Day20.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day20.java b/src/main/java/com/sbaars/adventofcode2019/days/Day20.java index 57fbccf4..b7cea5fd 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day20.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day20.java @@ -117,6 +117,8 @@ public int findSteps(Point me, TreeSet collectedKeys, List porta var possibleMoves = portals.stream().filter(p -> !collectedKeys.contains(p.value)).map(p -> getRoute(routes, me, p.location)).filter(Objects::nonNull).collect(Collectors.toList()); removeDuplicates(me, portals, possibleMoves); + if(collectedKeys.size()>3) possibleMoves.clear(); + System.out.println(Arrays.toString(collectedKeys.toArray())+possibleMoves.size()); List nSteps = new ArrayList<>(); for(List takenMove : possibleMoves) { @@ -142,7 +144,7 @@ public int findSteps(Point me, TreeSet collectedKeys, List porta keyLocs.removeAll(teleport); nSteps.add(findSteps(newLoc, myKeys, keyLocs, routes) + takenMove.size()-1); } - int res = nSteps.stream().mapToInt(e -> e).min().orElse(0); + int res = nSteps.stream().mapToInt(e -> e).min().orElse(Integer.MAX_VALUE-10000); cachedResult.put(new State(me, collectedKeys), res); return res; } From cc8f65fb99d443d5666b014bc9f1fe94cbf5d803 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 20 Dec 2019 11:07:44 +0100 Subject: [PATCH 111/433] Stuff --- .../sbaars/adventofcode2019/days/Day18.java | 2 +- .../sbaars/adventofcode2019/days/Day20.java | 57 ++++++++++++------- 2 files changed, 38 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day18.java b/src/main/java/com/sbaars/adventofcode2019/days/Day18.java index 6dd4cd0b..34bd42a9 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day18.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day18.java @@ -20,6 +20,7 @@ public class Day18 implements Day { private final char[][] grid; private final CharGrid2d charGrid; + private final Map cachedResult = new HashMap<>(); private static final char[][] CHANGE_GRID = { {'@', '#', '@'}, {'#', '#', '#'}, @@ -85,7 +86,6 @@ public boolean canTakeRoute(List route, TreeSet keys) { return true; } - Map cachedResult = new HashMap<>(); public int findSteps(List me, TreeSet collectedKeys, List keys, Map> routes) { Integer cachedRes = cachedResult.get(new State(me, collectedKeys)); if(cachedRes!=null) return cachedRes; diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day20.java b/src/main/java/com/sbaars/adventofcode2019/days/Day20.java index b7cea5fd..a302a4f7 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day20.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day20.java @@ -21,45 +21,57 @@ public class Day20 implements Day { char[][] grid; CharGrid2d charGrid; + private final List outerRing = new ArrayList<>(); + private final List innerRing = new ArrayList<>(); + private Portal entry; + private Portal exit; public Day20() throws IOException { grid = Arrays.stream(readDay(20).split(System.lineSeparator())).map(e -> e.toCharArray()).toArray(char[][]::new); charGrid = new CharGrid2d(grid, false); - } - - public static void main(String[] args) throws IOException { - new Day20().printParts(); - } - - @Data @AllArgsConstructor class Portal { - String value; - Point location; - } - - @Override - public Object part1() throws IOException { - Arrays.stream(grid).forEach(e -> System.out.println(new String(e))); + int[] rows = {2, 26, 80, 104}; - List portals = new ArrayList<>(); for(int row : rows) { + boolean addPortal = row == rows[0] || row == rows[rows.length]; for(int i = 2; i System.out.println(new String(e))); return findRoutes(getPortal(portals, "AA").stream().map(e -> e.location).findAny().get(), portals); //System.out.println(Arrays.toString(portals.toArray())); //return 0; @@ -73,11 +85,16 @@ public Object part2() throws IOException { @Data @AllArgsConstructor class Route { Point start; Point end; + List route; + + public int steps() { + return route.size(); + } } @Data @AllArgsConstructor class State{ Point me; - TreeSet portalsTaken; + int depth; } private Object findRoutes(Point me, List portals) { From 827e196a56862bd9eb2f1b46aaaa3e582aaa875e Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 20 Dec 2019 20:40:05 +0100 Subject: [PATCH 112/433] Different approach --- .../sbaars/adventofcode2019/days/Day20.java | 237 ++++++++---------- 1 file changed, 101 insertions(+), 136 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day20.java b/src/main/java/com/sbaars/adventofcode2019/days/Day20.java index a302a4f7..c8040ed7 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day20.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day20.java @@ -2,200 +2,165 @@ import java.awt.Point; import java.io.IOException; +import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Objects; -import java.util.TreeSet; -import java.util.stream.Collectors; +import java.util.Queue; +import java.util.Set; import com.sbaars.adventofcode2019.common.Day; import com.sbaars.adventofcode2019.pathfinding.CharGrid2d; +import com.sbaars.adventofcode2019.util.ListMap; import lombok.AllArgsConstructor; import lombok.Data; -import lombok.val; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.ToString; public class Day20 implements Day { char[][] grid; CharGrid2d charGrid; - private final List outerRing = new ArrayList<>(); - private final List innerRing = new ArrayList<>(); + private final Map portals = new HashMap<>(); + private final Map portalLabel = new HashMap<>(); + private final ListMap routes = new ListMap<>(); + private final List portalsToTake = new ArrayList<>(); private Portal entry; private Portal exit; + @Data @AllArgsConstructor class Portal { + Point pos; + boolean isOuter; + } + + @Data @AllArgsConstructor class Route { + Portal goal; + int distance; + } + + @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) @AllArgsConstructor class State extends Visited { + int totalSteps; + String debug = ""; + + public State(String debug, int totalSteps, Visited vis) { + super(vis.pos, vis.level); + this.totalSteps = totalSteps; + this.debug = debug; + } + } + + @Data @AllArgsConstructor @NoArgsConstructor class Visited { + Portal pos; + int level; + } + public Day20() throws IOException { grid = Arrays.stream(readDay(20).split(System.lineSeparator())).map(e -> e.toCharArray()).toArray(char[][]::new); charGrid = new CharGrid2d(grid, false); int[] rows = {2, 26, 80, 104}; for(int row : rows) { - boolean addPortal = row == rows[0] || row == rows[rows.length]; + boolean addPortal = row == rows[0] || row == rows[rows.length-1]; for(int i = 2; i System.out.println(new String(e))); - return findRoutes(getPortal(portals, "AA").stream().map(e -> e.location).findAny().get(), portals); - //System.out.println(Arrays.toString(portals.toArray())); - //return 0; - } - - @Override - public Object part2() throws IOException { - return 0; - } - - @Data @AllArgsConstructor class Route { - Point start; - Point end; - List route; - - public int steps() { - return route.size(); - } - } - - @Data @AllArgsConstructor class State{ - Point me; - int depth; + return findRoutes(false); } - private Object findRoutes(Point me, List portals) { - Map> routes = new HashMap<>(); - List requiredRoutes = new ArrayList<>(portals.stream().map(e -> e.location).collect(Collectors.toList())); - requiredRoutes.add(me); - for(int i = 0; i r = charGrid.findPath(requiredRoutes.get(i), requiredRoutes.get(j)); - if(!r.isEmpty()) - routes.put(new Route(requiredRoutes.get(i), requiredRoutes.get(j)), r); + private int findRoutes(boolean b) { + final Queue queue = new ArrayDeque<>(); + final Set visited = new HashSet<>(); + queue.add(new State("", 0, new Visited(entry, 0))); + while(true) { + State s = queue.poll(); + //System.out.println(Arrays.toString(queue.toArray())); + //System.out.println("------"); + //System.out.println(s+", "+portalLabel.get(s.pos)); + if(s.level == 0 && s.pos.equals(exit)) { + System.out.println(s.debug); + return s.totalSteps; } - } - removePortal(portals, "AA"); - return findSteps(me, new TreeSet<>(), portals, routes); - } - - public List getRoute(Map> routes, Point p1, Point p2){ - List p = routes.get(new Route(p1, p2)); - if(p != null) return p; - else return routes.get(new Route(p2, p1)); - } - - public boolean canTakeRoute(List route, TreeSet keys) { - for(Point p : route) { - if(grid[p.y][p.x]>='A' && grid[p.y][p.x]<='Z' && !keys.contains(grid[p.y][p.x])) { - return false; - } - } - return true; - } - - Map cachedResult = new HashMap<>(); - public int findSteps(Point me, TreeSet collectedKeys, List portals, Map> routes) { - Integer cachedRes = cachedResult.get(new State(me, collectedKeys)); - if(cachedRes!=null) return cachedRes; - - var possibleMoves = portals.stream().filter(p -> !collectedKeys.contains(p.value)).map(p -> getRoute(routes, me, p.location)).filter(Objects::nonNull).collect(Collectors.toList()); - removeDuplicates(me, portals, possibleMoves); - if(collectedKeys.size()>3) possibleMoves.clear(); - System.out.println(Arrays.toString(collectedKeys.toArray())+possibleMoves.size()); - - List nSteps = new ArrayList<>(); - for(List takenMove : possibleMoves) { - Point moveTo = me.equals(takenMove.get(0)) ? takenMove.get(takenMove.size()-1) : takenMove.get(0); - Portal thisPortal = getPortal(portals, moveTo); - if(thisPortal.value.equals("ZZ")) { - nSteps.add(takenMove.size()-1); - continue; - } - - List teleport = getPortal(portals, thisPortal.value); - Point newLoc = null; - for(Portal portal : teleport) { - if(!portal.location.equals(moveTo)) { - newLoc = portal.getLocation(); + else if(s.level < 0) continue; + if(!routes.containsKey(s.pos)) determineRoutes(s.pos); + for(Route route : routes.get(s.pos)) { + //System.out.println(route); + int level = s.level; + if(b) level+=route.goal.isOuter ? -1 : 1; + Visited vis = new Visited(route.goal, level); + if(!visited.contains(vis)) { + //System.out.println("ADD!"); + visited.add(vis); + queue.add(new State(s.debug+" "+(route.goal.isOuter ? '-' : '+')+portalLabel.get(route.goal)+":"+(s.totalSteps + route.distance), s.totalSteps + route.distance, vis)); } } - val myKeys = new TreeSet<>(collectedKeys); - val keyLocs = new ArrayList<>(portals); - //Point newLoc = me.contains(takenMove.get(0)) ? moveTo : takenMove.get(0); - //Point oldLoc = me.equals(takenMove.get(0)) ? takenMove.get(0) : moveTo; - myKeys.add(thisPortal.value); - keyLocs.removeAll(teleport); - nSteps.add(findSteps(newLoc, myKeys, keyLocs, routes) + takenMove.size()-1); } - int res = nSteps.stream().mapToInt(e -> e).min().orElse(Integer.MAX_VALUE-10000); - cachedResult.put(new State(me, collectedKeys), res); - return res; } - - private void removeDuplicates(Point me, List portals, List> possibleMoves) { - Map pointIndices = new HashMap<>(); - for(int i = 0; i ps = getPortal(portals, p.value); - for(Portal por : ps) { - Point portal = por.location; - if(!portal.equals(moveTo) && pointIndices.containsKey(portal)) { - int moves = possibleMoves.get(i).size(); - int otherMoves = possibleMoves.get(pointIndices.get(portal)).size(); - if(moves > otherMoves) - possibleMoves.remove(i); - else possibleMoves.remove(pointIndices.get(portal).intValue()); - } + + private void determineRoutes(Portal p) { + for(Portal portal : portalsToTake) { + if(!portal.pos.equals(p.pos)) { + List route = charGrid.findPath(p.pos, portal.pos); + if(!route.isEmpty()) routes.addTo(p, new Route(teleport(portal), route.size()-1)); + //System.out.println("portal from "+portal+portalLabel.get(portal)+" to "+routes.get(p).get(routes.get(p).size()-1));} } - pointIndices.put(moveTo, 0); } - } - public List getPortal(List portals, String key){ - return portals.stream().filter(e -> e.value.equals(key)).collect(Collectors.toList()); + private Portal teleport(Portal portal) { + Portal[] thisPortal = portals.get(portalLabel.get(portal)); + if(portal.equals(exit)) return exit; + if(portal.equals(thisPortal[0])) return thisPortal[1]; + return thisPortal[0]; } - - public boolean removePortal(List portals, String key){ - return portals.removeIf(e -> e.value.equals(key)); - } - - public Portal getPortal(List portals, Point key){ - return portals.stream().filter(e -> e.location.equals(key)).findAny().get(); + + @Override + public Object part2() throws IOException { + return findRoutes(true); } } From aafea49622662e9a70e5b788ff1cc01b93775bb4 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 20 Dec 2019 20:58:52 +0100 Subject: [PATCH 113/433] Removed print stuff --- .../java/com/sbaars/adventofcode2019/days/Day20.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day20.java b/src/main/java/com/sbaars/adventofcode2019/days/Day20.java index c8040ed7..363874a5 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day20.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day20.java @@ -119,22 +119,17 @@ private int findRoutes(boolean b) { queue.add(new State("", 0, new Visited(entry, 0))); while(true) { State s = queue.poll(); - //System.out.println(Arrays.toString(queue.toArray())); - //System.out.println("------"); - //System.out.println(s+", "+portalLabel.get(s.pos)); if(s.level == 0 && s.pos.equals(exit)) { System.out.println(s.debug); - return s.totalSteps; + return s.totalSteps-1; } else if(s.level < 0) continue; if(!routes.containsKey(s.pos)) determineRoutes(s.pos); for(Route route : routes.get(s.pos)) { - //System.out.println(route); int level = s.level; if(b) level+=route.goal.isOuter ? -1 : 1; Visited vis = new Visited(route.goal, level); if(!visited.contains(vis)) { - //System.out.println("ADD!"); visited.add(vis); queue.add(new State(s.debug+" "+(route.goal.isOuter ? '-' : '+')+portalLabel.get(route.goal)+":"+(s.totalSteps + route.distance), s.totalSteps + route.distance, vis)); } @@ -146,8 +141,7 @@ private void determineRoutes(Portal p) { for(Portal portal : portalsToTake) { if(!portal.pos.equals(p.pos)) { List route = charGrid.findPath(p.pos, portal.pos); - if(!route.isEmpty()) routes.addTo(p, new Route(teleport(portal), route.size()-1)); - //System.out.println("portal from "+portal+portalLabel.get(portal)+" to "+routes.get(p).get(routes.get(p).size()-1));} + if(!route.isEmpty()) routes.addTo(p, new Route(teleport(portal), route.size())); } } } From 531de2a9bf55772d5ecf0aea678d4f4944716c82 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 Dec 2019 07:22:04 +0100 Subject: [PATCH 114/433] Day 21 --- .../sbaars/adventofcode2019/days/Day17.java | 3 +- .../sbaars/adventofcode2019/days/Day21.java | 47 +++++++++++++++++++ .../intcode/IntcodeComputer.java | 4 ++ src/main/resources/day21.txt | 1 + 4 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode2019/days/Day21.java create mode 100644 src/main/resources/day21.txt diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day17.java b/src/main/java/com/sbaars/adventofcode2019/days/Day17.java index 9b180a8b..85431b73 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day17.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day17.java @@ -68,9 +68,8 @@ public Object part2() throws IOException { robotDir = dir; } String patterns = findPatterns(instructions) + "\nn\n"; - long[] asciis = patterns.chars().mapToLong(e -> e).toArray(); IntcodeComputer ic = new IntcodeComputer(17, 2); - ic.setInput(asciis); + ic.setInput(patterns); while(true) { long res = ic.run(); if(res>255L) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day21.java b/src/main/java/com/sbaars/adventofcode2019/days/Day21.java new file mode 100644 index 00000000..c37e7a53 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day21.java @@ -0,0 +1,47 @@ +package com.sbaars.adventofcode2019.days; + +import java.io.IOException; + +import com.sbaars.adventofcode2019.common.Day; +import com.sbaars.adventofcode2019.intcode.IntcodeComputer; + +public class Day21 implements Day { + + public static void main(String[] args) throws IOException { + new Day21().printParts(); + } + + @Override + public Object part1() throws IOException { + IntcodeComputer ic = new IntcodeComputer(21); + ic.setInput("OR A T\n" + + "AND B T\n" + + "AND C T\n" + + "NOT T T\n" + //flip T + "AND D T\n" + + "OR T J\n" + + "WALK\n"); + long res; + while((res = ic.run()) != IntcodeComputer.STOP_CODE) + if(res>255) return res; + return 0; + } + + @Override + public Object part2() throws IOException { + IntcodeComputer ic = new IntcodeComputer(21); + ic.setInput("NOT A J\n" + + "NOT B T\n" + + "AND H T\n" + + "OR T J\n" + + "NOT C T\n" + + "AND H T\n" + + "OR T J\n" + + "AND D J\n" + + "RUN\n"); + long res; + while((res = ic.run()) != IntcodeComputer.STOP_CODE) + if(res>255) return res; + return 0; + } +} diff --git a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java index 1100ec10..38136371 100644 --- a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java +++ b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java @@ -148,4 +148,8 @@ private int nParams(int instruction) { public void setElement(int i, long j) { program[i] = j; } + + public void setInput(String patterns) { + setInput(patterns.chars().mapToLong(e -> e).toArray()); + } } diff --git a/src/main/resources/day21.txt b/src/main/resources/day21.txt new file mode 100644 index 00000000..445de007 --- /dev/null +++ b/src/main/resources/day21.txt @@ -0,0 +1 @@ +109,2050,21101,966,0,1,21102,1,13,0,1105,1,1378,21102,20,1,0,1106,0,1337,21101,0,27,0,1106,0,1279,1208,1,65,748,1005,748,73,1208,1,79,748,1005,748,110,1208,1,78,748,1005,748,132,1208,1,87,748,1005,748,169,1208,1,82,748,1005,748,239,21102,1041,1,1,21102,73,1,0,1105,1,1421,21101,78,0,1,21101,1041,0,2,21102,88,1,0,1106,0,1301,21102,1,68,1,21101,1041,0,2,21102,1,103,0,1105,1,1301,1101,0,1,750,1106,0,298,21102,82,1,1,21101,1041,0,2,21101,125,0,0,1106,0,1301,1101,2,0,750,1106,0,298,21102,79,1,1,21101,0,1041,2,21101,147,0,0,1105,1,1301,21101,84,0,1,21102,1041,1,2,21102,162,1,0,1106,0,1301,1101,3,0,750,1106,0,298,21102,65,1,1,21102,1,1041,2,21102,184,1,0,1105,1,1301,21102,1,76,1,21102,1,1041,2,21101,0,199,0,1106,0,1301,21102,75,1,1,21101,1041,0,2,21102,1,214,0,1106,0,1301,21101,0,221,0,1106,0,1337,21101,0,10,1,21102,1,1041,2,21102,236,1,0,1105,1,1301,1106,0,553,21102,1,85,1,21101,1041,0,2,21101,0,254,0,1105,1,1301,21102,78,1,1,21101,0,1041,2,21102,1,269,0,1105,1,1301,21101,276,0,0,1106,0,1337,21101,0,10,1,21101,0,1041,2,21102,1,291,0,1105,1,1301,1101,0,1,755,1105,1,553,21101,0,32,1,21101,1041,0,2,21101,0,313,0,1105,1,1301,21102,1,320,0,1106,0,1337,21102,1,327,0,1106,0,1279,2102,1,1,749,21101,0,65,2,21102,1,73,3,21101,0,346,0,1105,1,1889,1206,1,367,1007,749,69,748,1005,748,360,1101,0,1,756,1001,749,-64,751,1106,0,406,1008,749,74,748,1006,748,381,1102,-1,1,751,1106,0,406,1008,749,84,748,1006,748,395,1101,-2,0,751,1105,1,406,21101,1100,0,1,21102,406,1,0,1105,1,1421,21101,0,32,1,21102,1100,1,2,21102,1,421,0,1105,1,1301,21102,1,428,0,1105,1,1337,21102,1,435,0,1105,1,1279,2101,0,1,749,1008,749,74,748,1006,748,453,1101,0,-1,752,1106,0,478,1008,749,84,748,1006,748,467,1101,-2,0,752,1106,0,478,21102,1168,1,1,21101,0,478,0,1105,1,1421,21101,485,0,0,1105,1,1337,21102,10,1,1,21101,1168,0,2,21101,0,500,0,1105,1,1301,1007,920,15,748,1005,748,518,21101,0,1209,1,21102,518,1,0,1106,0,1421,1002,920,3,529,1001,529,921,529,1002,750,1,0,1001,529,1,537,1001,751,0,0,1001,537,1,545,101,0,752,0,1001,920,1,920,1106,0,13,1005,755,577,1006,756,570,21101,1100,0,1,21102,1,570,0,1105,1,1421,21102,1,987,1,1106,0,581,21101,1001,0,1,21101,588,0,0,1105,1,1378,1102,1,758,594,101,0,0,753,1006,753,654,21001,753,0,1,21102,610,1,0,1106,0,667,21101,0,0,1,21101,621,0,0,1105,1,1463,1205,1,647,21102,1015,1,1,21101,635,0,0,1105,1,1378,21102,1,1,1,21102,1,646,0,1105,1,1463,99,1001,594,1,594,1106,0,592,1006,755,664,1101,0,0,755,1106,0,647,4,754,99,109,2,1101,726,0,757,21201,-1,0,1,21101,9,0,2,21101,697,0,3,21102,1,692,0,1106,0,1913,109,-2,2106,0,0,109,2,101,0,757,706,1201,-1,0,0,1001,757,1,757,109,-2,2106,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,255,63,223,127,159,191,95,0,183,170,218,117,217,86,155,244,187,178,56,109,253,154,38,184,213,110,189,233,212,87,50,141,169,125,236,207,171,175,230,114,137,197,99,49,249,136,239,93,242,57,231,100,228,172,219,102,140,69,84,206,92,174,77,179,166,76,163,139,203,120,173,43,62,202,124,216,103,138,71,39,54,143,227,79,157,158,167,250,126,198,235,58,121,251,156,199,35,68,246,215,53,47,185,221,182,46,168,115,51,123,142,229,85,111,201,248,107,204,70,98,34,42,188,222,60,254,196,162,220,153,78,61,55,119,252,186,181,243,238,101,118,106,214,234,226,113,108,94,152,116,200,232,59,190,247,122,245,205,237,241,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,73,110,112,117,116,32,105,110,115,116,114,117,99,116,105,111,110,115,58,10,13,10,87,97,108,107,105,110,103,46,46,46,10,10,13,10,82,117,110,110,105,110,103,46,46,46,10,10,25,10,68,105,100,110,39,116,32,109,97,107,101,32,105,116,32,97,99,114,111,115,115,58,10,10,58,73,110,118,97,108,105,100,32,111,112,101,114,97,116,105,111,110,59,32,101,120,112,101,99,116,101,100,32,115,111,109,101,116,104,105,110,103,32,108,105,107,101,32,65,78,68,44,32,79,82,44,32,111,114,32,78,79,84,67,73,110,118,97,108,105,100,32,102,105,114,115,116,32,97,114,103,117,109,101,110,116,59,32,101,120,112,101,99,116,101,100,32,115,111,109,101,116,104,105,110,103,32,108,105,107,101,32,65,44,32,66,44,32,67,44,32,68,44,32,74,44,32,111,114,32,84,40,73,110,118,97,108,105,100,32,115,101,99,111,110,100,32,97,114,103,117,109,101,110,116,59,32,101,120,112,101,99,116,101,100,32,74,32,111,114,32,84,52,79,117,116,32,111,102,32,109,101,109,111,114,121,59,32,97,116,32,109,111,115,116,32,49,53,32,105,110,115,116,114,117,99,116,105,111,110,115,32,99,97,110,32,98,101,32,115,116,111,114,101,100,0,109,1,1005,1262,1270,3,1262,21002,1262,1,0,109,-1,2105,1,0,109,1,21102,1,1288,0,1105,1,1263,21001,1262,0,0,1102,1,0,1262,109,-1,2105,1,0,109,5,21101,0,1310,0,1106,0,1279,22101,0,1,-2,22208,-2,-4,-1,1205,-1,1332,22102,1,-3,1,21102,1332,1,0,1105,1,1421,109,-5,2105,1,0,109,2,21101,1346,0,0,1105,1,1263,21208,1,32,-1,1205,-1,1363,21208,1,9,-1,1205,-1,1363,1106,0,1373,21101,0,1370,0,1105,1,1279,1106,0,1339,109,-2,2105,1,0,109,5,2102,1,-4,1385,21001,0,0,-2,22101,1,-4,-4,21101,0,0,-3,22208,-3,-2,-1,1205,-1,1416,2201,-4,-3,1408,4,0,21201,-3,1,-3,1106,0,1396,109,-5,2105,1,0,109,2,104,10,22102,1,-1,1,21102,1436,1,0,1106,0,1378,104,10,99,109,-2,2105,1,0,109,3,20002,594,753,-1,22202,-1,-2,-1,201,-1,754,754,109,-3,2106,0,0,109,10,21101,0,5,-5,21102,1,1,-4,21102,0,1,-3,1206,-9,1555,21101,3,0,-6,21102,1,5,-7,22208,-7,-5,-8,1206,-8,1507,22208,-6,-4,-8,1206,-8,1507,104,64,1106,0,1529,1205,-6,1527,1201,-7,716,1515,21002,0,-11,-8,21201,-8,46,-8,204,-8,1106,0,1529,104,46,21201,-7,1,-7,21207,-7,22,-8,1205,-8,1488,104,10,21201,-6,-1,-6,21207,-6,0,-8,1206,-8,1484,104,10,21207,-4,1,-8,1206,-8,1569,21101,0,0,-9,1105,1,1689,21208,-5,21,-8,1206,-8,1583,21102,1,1,-9,1105,1,1689,1201,-5,716,1589,20102,1,0,-2,21208,-4,1,-1,22202,-2,-1,-1,1205,-2,1613,21201,-5,0,1,21101,0,1613,0,1106,0,1444,1206,-1,1634,22101,0,-5,1,21101,1627,0,0,1105,1,1694,1206,1,1634,21101,0,2,-3,22107,1,-4,-8,22201,-1,-8,-8,1206,-8,1649,21201,-5,1,-5,1206,-3,1663,21201,-3,-1,-3,21201,-4,1,-4,1106,0,1667,21201,-4,-1,-4,21208,-4,0,-1,1201,-5,716,1676,22002,0,-1,-1,1206,-1,1686,21101,1,0,-4,1106,0,1477,109,-10,2106,0,0,109,11,21101,0,0,-6,21102,0,1,-8,21101,0,0,-7,20208,-6,920,-9,1205,-9,1880,21202,-6,3,-9,1201,-9,921,1725,20101,0,0,-5,1001,1725,1,1732,21002,0,1,-4,21202,-4,1,1,21102,1,1,2,21101,9,0,3,21102,1,1754,0,1105,1,1889,1206,1,1772,2201,-10,-4,1766,1001,1766,716,1766,21001,0,0,-3,1105,1,1790,21208,-4,-1,-9,1206,-9,1786,22102,1,-8,-3,1105,1,1790,21202,-7,1,-3,1001,1732,1,1795,21002,0,1,-2,21208,-2,-1,-9,1206,-9,1812,21201,-8,0,-1,1106,0,1816,21202,-7,1,-1,21208,-5,1,-9,1205,-9,1837,21208,-5,2,-9,1205,-9,1844,21208,-3,0,-1,1106,0,1855,22202,-3,-1,-1,1106,0,1855,22201,-3,-1,-1,22107,0,-1,-1,1106,0,1855,21208,-2,-1,-9,1206,-9,1869,22101,0,-1,-8,1106,0,1873,21201,-1,0,-7,21201,-6,1,-6,1106,0,1708,22101,0,-8,-10,109,-11,2106,0,0,109,7,22207,-6,-5,-3,22207,-4,-6,-2,22201,-3,-2,-1,21208,-1,0,-6,109,-7,2106,0,0,0,109,5,2101,0,-2,1912,21207,-4,0,-1,1206,-1,1930,21101,0,0,-4,21201,-4,0,1,21202,-3,1,2,21101,0,1,3,21102,1,1949,0,1106,0,1954,109,-5,2105,1,0,109,6,21207,-4,1,-1,1206,-1,1977,22207,-5,-3,-1,1206,-1,1977,22101,0,-5,-5,1105,1,2045,21201,-5,0,1,21201,-4,-1,2,21202,-3,2,3,21101,1996,0,0,1106,0,1954,22101,0,1,-5,21102,1,1,-2,22207,-5,-3,-1,1206,-1,2015,21102,1,0,-2,22202,-3,-2,-3,22107,0,-4,-1,1206,-1,2037,21201,-2,0,1,21102,2037,1,0,106,0,1912,21202,-3,-1,-3,22201,-5,-3,-5,109,-6,2105,1,0 \ No newline at end of file From e255fa09953cd2b0ddfd24f276f6d0bf29388b22 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 Dec 2019 08:24:56 +0100 Subject: [PATCH 115/433] Added comments denoting the boolean logic --- .../java/com/sbaars/adventofcode2019/days/Day20.java | 10 +++++----- .../java/com/sbaars/adventofcode2019/days/Day21.java | 2 ++ 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day20.java b/src/main/java/com/sbaars/adventofcode2019/days/Day20.java index 363874a5..03680045 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day20.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day20.java @@ -119,14 +119,14 @@ private int findRoutes(boolean b) { queue.add(new State("", 0, new Visited(entry, 0))); while(true) { State s = queue.poll(); - if(s.level == 0 && s.pos.equals(exit)) { - System.out.println(s.debug); - return s.totalSteps-1; - } - else if(s.level < 0) continue; + if(s.level < 0) continue; if(!routes.containsKey(s.pos)) determineRoutes(s.pos); for(Route route : routes.get(s.pos)) { int level = s.level; + if(level == 0 && route.goal.equals(exit)) { + System.out.println(s.debug); + return route.distance + s.totalSteps - 1; + } else if(route.goal.equals(exit)) continue; if(b) level+=route.goal.isOuter ? -1 : 1; Visited vis = new Visited(route.goal, level); if(!visited.contains(vis)) { diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day21.java b/src/main/java/com/sbaars/adventofcode2019/days/Day21.java index c37e7a53..9b1a3a73 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day21.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day21.java @@ -14,6 +14,7 @@ public static void main(String[] args) throws IOException { @Override public Object part1() throws IOException { IntcodeComputer ic = new IntcodeComputer(21); + // !(A && B && C) || D ic.setInput("OR A T\n" + "AND B T\n" + "AND C T\n" + @@ -30,6 +31,7 @@ public Object part1() throws IOException { @Override public Object part2() throws IOException { IntcodeComputer ic = new IntcodeComputer(21); + // (((!B && H) || !A) || (!C && H)) && D ic.setInput("NOT A J\n" + "NOT B T\n" + "AND H T\n" + From d4c6b4272cdeea0a5f6a1d8472e17dd773eb0e63 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 Dec 2019 09:07:24 +0100 Subject: [PATCH 116/433] Day 20 debug --- .../java/com/sbaars/adventofcode2019/days/Day20.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day20.java b/src/main/java/com/sbaars/adventofcode2019/days/Day20.java index 03680045..607b178c 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day20.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day20.java @@ -116,22 +116,22 @@ public Object part1() throws IOException { private int findRoutes(boolean b) { final Queue queue = new ArrayDeque<>(); final Set visited = new HashSet<>(); - queue.add(new State("", 0, new Visited(entry, 0))); + queue.add(new State("", -1, new Visited(entry, 0))); while(true) { State s = queue.poll(); - if(s.level < 0) continue; if(!routes.containsKey(s.pos)) determineRoutes(s.pos); for(Route route : routes.get(s.pos)) { int level = s.level; if(level == 0 && route.goal.equals(exit)) { System.out.println(s.debug); - return route.distance + s.totalSteps - 1; + return route.distance + s.totalSteps; } else if(route.goal.equals(exit)) continue; - if(b) level+=route.goal.isOuter ? -1 : 1; + if(b) level+=route.goal.isOuter ? 1 : -1; + if(s.level < 0) continue; Visited vis = new Visited(route.goal, level); if(!visited.contains(vis)) { visited.add(vis); - queue.add(new State(s.debug+" "+(route.goal.isOuter ? '-' : '+')+portalLabel.get(route.goal)+":"+(s.totalSteps + route.distance), s.totalSteps + route.distance, vis)); + queue.add(new State(s.debug+" "+(route.goal.isOuter ? '-' : '+')+portalLabel.get(route.goal)+":"+(s.totalSteps + route.distance) + "(" + s.level + ")", s.totalSteps + route.distance, vis)); } } } From f3f1d66025680d9160b21b195fe2d3ae91a80f6d Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 21 Dec 2019 09:08:40 +0100 Subject: [PATCH 117/433] Day 20: removed debug --- .../com/sbaars/adventofcode2019/days/Day20.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day20.java b/src/main/java/com/sbaars/adventofcode2019/days/Day20.java index 607b178c..253b327b 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day20.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day20.java @@ -44,12 +44,10 @@ public class Day20 implements Day { @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) @AllArgsConstructor class State extends Visited { int totalSteps; - String debug = ""; - public State(String debug, int totalSteps, Visited vis) { + public State(int totalSteps, Visited vis) { super(vis.pos, vis.level); this.totalSteps = totalSteps; - this.debug = debug; } } @@ -116,22 +114,20 @@ public Object part1() throws IOException { private int findRoutes(boolean b) { final Queue queue = new ArrayDeque<>(); final Set visited = new HashSet<>(); - queue.add(new State("", -1, new Visited(entry, 0))); + queue.add(new State(-1, new Visited(entry, 0))); while(true) { State s = queue.poll(); if(!routes.containsKey(s.pos)) determineRoutes(s.pos); for(Route route : routes.get(s.pos)) { int level = s.level; - if(level == 0 && route.goal.equals(exit)) { - System.out.println(s.debug); - return route.distance + s.totalSteps; - } else if(route.goal.equals(exit)) continue; + if(level == 0 && route.goal.equals(exit)) return route.distance + s.totalSteps; + else if(route.goal.equals(exit)) continue; if(b) level+=route.goal.isOuter ? 1 : -1; if(s.level < 0) continue; Visited vis = new Visited(route.goal, level); if(!visited.contains(vis)) { visited.add(vis); - queue.add(new State(s.debug+" "+(route.goal.isOuter ? '-' : '+')+portalLabel.get(route.goal)+":"+(s.totalSteps + route.distance) + "(" + s.level + ")", s.totalSteps + route.distance, vis)); + queue.add(new State(s.totalSteps + route.distance, vis)); } } } From 7ff79d55eb9650c69b8bb39d361d5ee92e71bee3 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 22 Dec 2019 14:17:41 +0100 Subject: [PATCH 118/433] Day 22 --- .../sbaars/adventofcode2019/days/Day22.java | 125 ++++++++++++++++++ src/main/resources/day22.txt | 100 ++++++++++++++ 2 files changed, 225 insertions(+) create mode 100644 src/main/java/com/sbaars/adventofcode2019/days/Day22.java create mode 100644 src/main/resources/day22.txt diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day22.java b/src/main/java/com/sbaars/adventofcode2019/days/Day22.java new file mode 100644 index 00000000..32839a7b --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day22.java @@ -0,0 +1,125 @@ +package com.sbaars.adventofcode2019.days; + +import java.io.IOException; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import com.sbaars.adventofcode2019.common.Day; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Value; + +public class Day22 implements Day { + + Move[] moves; + + public Day22() throws IOException { + this.moves = Arrays.stream(readDay(22).split(System.lineSeparator())).map(Move::new).toArray(Move[]::new); + } + + public static void main(String[] args) throws IOException { + new Day22().printParts(); + } + + @AllArgsConstructor enum Action{ + DEAL_WITH_INCREMENT("deal with increment "), + DEAL_NEW_STACK("deal into new stack"), + CUT("cut "); + + String name; + + public static Action actionByText(String text) { + return Arrays.stream(values()).filter(a -> text.startsWith(a.name)).findAny().get(); + } + } + + @Value @Data class Move { + Action action; + int amount; + + public Move(String s) { + this.action = Action.actionByText(s); + s = s.replace(action.name, ""); + if(!s.isEmpty()) amount = Integer.parseInt(s); + else amount = 0; + } + + public List execute(List cards) { + switch(action) { + case DEAL_NEW_STACK: Collections.reverse(cards); break; + case CUT: { + int n = amount > 0 ? amount : cards.size()+amount; + List sub = new ArrayList<>(cards.subList(n, cards.size())); + sub.addAll(cards.subList(0, n)); + return sub; + } + case DEAL_WITH_INCREMENT: { + Integer[] deck = new Integer[cards.size()] ; + for(int i = 0, card = 0; i cards = IntStream.range(0, 10007).boxed().collect(Collectors.toList()); + for(Move move : moves) cards = move.execute(cards); + return cards.indexOf(2019); + } + + @Override + public Object part2() throws IOException { + long deckSize = 119315717514047L; + long timesShuffled = 101741582076661L; + long[] calc = new long[] {1, 0}; + System.out.println("Max long "+Long.MAX_VALUE); + for(Move move : reverseArray(moves)) { + System.out.println(move); + calc = move.execute(calc, deckSize); + //System.out.println("Before mod: "+Arrays.toString(calc)); + for(int i = 0; i T[] reverseArray(T[] arr) { + for(int i = 0; i < arr.length / 2; i++) { + T temp = arr[i]; + arr[i] = arr[arr.length - i - 1]; + arr[arr.length - i - 1] = temp; + } + return arr; + } +} diff --git a/src/main/resources/day22.txt b/src/main/resources/day22.txt new file mode 100644 index 00000000..55ab7933 --- /dev/null +++ b/src/main/resources/day22.txt @@ -0,0 +1,100 @@ +deal with increment 31 +deal into new stack +cut -7558 +deal with increment 49 +cut 194 +deal with increment 23 +cut -4891 +deal with increment 53 +cut 5938 +deal with increment 61 +cut 7454 +deal into new stack +deal with increment 31 +cut 3138 +deal with increment 53 +cut 3553 +deal with increment 61 +cut -5824 +deal with increment 42 +cut -889 +deal with increment 34 +cut 7128 +deal with increment 42 +cut -9003 +deal with increment 75 +cut 13 +deal with increment 75 +cut -3065 +deal with increment 74 +cut -8156 +deal with increment 39 +cut 4242 +deal with increment 24 +cut -405 +deal with increment 27 +cut 6273 +deal with increment 19 +cut -9826 +deal with increment 58 +deal into new stack +cut -6927 +deal with increment 65 +cut -9906 +deal with increment 31 +deal into new stack +deal with increment 42 +deal into new stack +deal with increment 39 +cut -4271 +deal into new stack +deal with increment 32 +cut -8799 +deal with increment 69 +cut 2277 +deal with increment 55 +cut 2871 +deal with increment 54 +cut -2118 +deal with increment 15 +cut 1529 +deal with increment 57 +cut -4745 +deal with increment 23 +cut -5959 +deal with increment 58 +deal into new stack +deal with increment 48 +deal into new stack +cut 2501 +deal into new stack +deal with increment 42 +deal into new stack +cut 831 +deal with increment 74 +cut -3119 +deal with increment 33 +cut 967 +deal with increment 69 +cut 9191 +deal with increment 9 +cut 5489 +deal with increment 62 +cut -9107 +deal with increment 14 +cut -7717 +deal with increment 56 +cut 7900 +deal with increment 49 +cut 631 +deal with increment 14 +deal into new stack +deal with increment 58 +cut -9978 +deal with increment 48 +deal into new stack +deal with increment 66 +cut -1554 +deal into new stack +cut 897 +deal with increment 36 \ No newline at end of file From d2a230aef9fea32ae9368ffe773a62a3787d416d Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 22 Dec 2019 14:49:17 +0100 Subject: [PATCH 119/433] Use big integers --- .../sbaars/adventofcode2019/days/Day22.java | 35 ++++++++++--------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day22.java b/src/main/java/com/sbaars/adventofcode2019/days/Day22.java index 32839a7b..dd074632 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day22.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day22.java @@ -71,23 +71,26 @@ public List execute(List cards) { return cards; } - public long[] execute(long[] input, long deckSize) { + public BigInteger[] execute(BigInteger[] input, BigInteger deckSize) { switch(action) { - case DEAL_NEW_STACK: return new long[] {-input[0], -(input[1]+1)}; - case CUT: input[1] += amount; break; + case DEAL_NEW_STACK: { + input[0] = input[0].multiply(num(-1)); + input[1] = input[1].add(num(1)).multiply(num(-1)); + } break; + case CUT: input[1] = input[1].add(num(amount)); break; case DEAL_WITH_INCREMENT: { - long p = pow(amount, deckSize-2, deckSize); - return new long[] {input[0]*p, input[1]*p}; - } + BigInteger p = num(amount).modPow(deckSize.min(num(2)), deckSize); + for(int i = 0; i cards = IntStream.range(0, 10007).boxed().collect(Collectors.toList()); @@ -97,21 +100,21 @@ public Object part1() throws IOException { @Override public Object part2() throws IOException { - long deckSize = 119315717514047L; - long timesShuffled = 101741582076661L; - long[] calc = new long[] {1, 0}; - System.out.println("Max long "+Long.MAX_VALUE); + BigInteger deckSize = num(119315717514047L); + BigInteger timesShuffled = num(101741582076661L); + BigInteger[] calc = new BigInteger[] {num(1), num(0)}; for(Move move : reverseArray(moves)) { System.out.println(move); calc = move.execute(calc, deckSize); //System.out.println("Before mod: "+Arrays.toString(calc)); - for(int i = 0; i T[] reverseArray(T[] arr) { From fec4a7e5247e163e0fa6edbf05938f335fe2e047 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 22 Dec 2019 14:56:56 +0100 Subject: [PATCH 120/433] Finish up day 22 --- .../sbaars/adventofcode2019/days/Day22.java | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day22.java b/src/main/java/com/sbaars/adventofcode2019/days/Day22.java index dd074632..4c6ad1e2 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day22.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day22.java @@ -27,7 +27,7 @@ public static void main(String[] args) throws IOException { new Day22().printParts(); } - @AllArgsConstructor enum Action{ + @AllArgsConstructor enum Action { DEAL_WITH_INCREMENT("deal with increment "), DEAL_NEW_STACK("deal into new stack"), CUT("cut "); @@ -79,7 +79,7 @@ public BigInteger[] execute(BigInteger[] input, BigInteger deckSize) { } break; case CUT: input[1] = input[1].add(num(amount)); break; case DEAL_WITH_INCREMENT: { - BigInteger p = num(amount).modPow(deckSize.min(num(2)), deckSize); + var p = num(amount).modPow(deckSize.subtract(num(2)), deckSize); for(int i = 0; i T[] reverseArray(T[] arr) { From a3b314a57d6d67b1c515b3da8d76dafc1f5e227b Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 22 Dec 2019 15:00:21 +0100 Subject: [PATCH 121/433] Updated README --- README.md | 15 +++++++++++++++ .../java/com/sbaars/adventofcode2019/Main.java | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1b4cf67c..fad0840a 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,9 @@ Days: - [Day 17](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day17.java) - [Day 18](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day18.java) - [Day 19](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day19.java) +- [Day 20](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day20.java) +- [Day 21](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day21.java) +- [Day 22](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day22.java) Output of running [Main.java](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/Main.java): ``` @@ -111,4 +114,16 @@ Part 2: 2138 Day 19: Part 1: 179 Part 2: 9760485 + +Day 20: +Part 1: 498 +Part 2: 5564 + +Day 21: +Part 1: 19352864 +Part 2: 1142488337 + +Day 22: +Part 1: 7860 +Part 2: 61256063148970 ``` \ No newline at end of file diff --git a/src/main/java/com/sbaars/adventofcode2019/Main.java b/src/main/java/com/sbaars/adventofcode2019/Main.java index 745d7c0d..221e5163 100644 --- a/src/main/java/com/sbaars/adventofcode2019/Main.java +++ b/src/main/java/com/sbaars/adventofcode2019/Main.java @@ -7,7 +7,7 @@ public class Main { public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException, InvocationTargetException, NoSuchMethodException { - for(int day = 1; day<=19; day++) { + for(int day = 1; day<=22; day++) { System.out.println("Day "+day+":"); Day instance = (Day)Class.forName("com.sbaars.adventofcode2019.days.Day"+day).getDeclaredConstructor().newInstance(); instance.printParts(); From 64a063b8a4913689ff259cee74113af814278608 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 22 Dec 2019 15:10:52 +0100 Subject: [PATCH 122/433] Minor refactor --- src/main/java/com/sbaars/adventofcode2019/days/Day22.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day22.java b/src/main/java/com/sbaars/adventofcode2019/days/Day22.java index 4c6ad1e2..1d45964e 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day22.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day22.java @@ -100,15 +100,17 @@ public Object part1() throws IOException { @Override public Object part2() throws IOException { - var deckSize = num(119315717514047L); - var timesShuffled = num(101741582076661L); + return seekPosition(num(119315717514047L), num(101741582076661L), 2020); + } + + private BigInteger seekPosition(BigInteger deckSize, BigInteger timesShuffled, int position) { var calc = new BigInteger[] {num(1), num(0)}; for(Move move : reverseArray(moves)) { calc = move.execute(calc, deckSize); for(int i = 0; i T[] reverseArray(T[] arr) { From 7fda5e8198e1f2299463ad8ec82af181d47be458 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 23 Dec 2019 06:47:12 +0100 Subject: [PATCH 123/433] Crappiest code evar --- .../sbaars/adventofcode2019/days/Day22.java | 5 +- .../sbaars/adventofcode2019/days/Day23.java | 114 ++++++++++++++++++ .../intcode/ComputerThread.java | 24 ++++ .../intcode/IntcodeComputer.java | 2 +- src/main/resources/day23.txt | 1 + 5 files changed, 142 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode2019/days/Day23.java create mode 100644 src/main/java/com/sbaars/adventofcode2019/intcode/ComputerThread.java create mode 100644 src/main/resources/day23.txt diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day22.java b/src/main/java/com/sbaars/adventofcode2019/days/Day22.java index 1d45964e..f174ed4f 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day22.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day22.java @@ -71,7 +71,7 @@ public List execute(List cards) { return cards; } - public BigInteger[] execute(BigInteger[] input, BigInteger deckSize) { + public void execute(BigInteger[] input, BigInteger deckSize) { switch(action) { case DEAL_NEW_STACK: { input[0] = input[0].multiply(num(-1)); @@ -83,7 +83,6 @@ public BigInteger[] execute(BigInteger[] input, BigInteger deckSize) { for(int i = 0; i { + try { + return new ComputerThread(new IntcodeComputer(23, i)); + } catch (IOException e) { + return null; + } + }).toArray(ComputerThread[]::new); + + + while(true) { + for(int i = 0; i2) { + int pc = Math.toIntExact(ic[i].output.poll()); + long x = ic[i].output.poll(); + long y = ic[i].output.poll(); + if(pc == 255) { + //System.out.println(x+", "+y+", "+pc); + //ic[pc].ic.addInput(x); + //ic[pc].ic.addInput(y); + //System.out.println(new IntcodeComputer(23, 255).run()); + //Arrays.stream(ic).forEach(e -> e.stop()); + return y; + } + ic[pc].ic.addInput(x); + ic[pc].ic.addInput(y); + } + /*while((pc = Math.toIntExact(ic[i].run()))!=-1) { + x = ic[i].run(); + y = ic[i].run(); + System.out.println(x+", "+y+", "+pc); + if(pc == 255) return y; + ic[pc].addInput(x); + ic[pc].addInput(y); + }*/ + } + + //x = ic[pc].run(); + //y = ic[pc].run(); + //pc = Math.toIntExact(ic[pc].run()); + } + } + + @Override + public Object part2() throws IOException { + ComputerThread[] ic = IntStream.range(0, 50).mapToObj(i -> { + try { + return new ComputerThread(new IntcodeComputer(23, i)); + } catch (IOException e) { + return null; + } + }).toArray(ComputerThread[]::new); + + IntcodeComputer nat = new IntcodeComputer(23, 255); + + long prev = -1; + while(true) { + for(int i = 0; i2) { + int pc = Math.toIntExact(ic[i].output.poll()); + long x = ic[i].output.poll(); + long y = ic[i].output.poll(); + if(pc == 255) { + nat.addInput(x); + nat.addInput(y); + pc = Math.toIntExact(nat.run()); + x = nat.run(); + y = nat.run(); + System.out.println(x+", "+y+", "+pc); + if(y == prev) + return y; + prev = y; + //ic[pc].ic.addInput(x); + //ic[pc].ic.addInput(y); + //System.out.println(new IntcodeComputer(23, 255).run()); + //Arrays.stream(ic).forEach(e -> e.stop()); + //return y; + } + ic[pc].ic.addInput(x); + ic[pc].ic.addInput(y); + } + /*while((pc = Math.toIntExact(ic[i].run()))!=-1) { + x = ic[i].run(); + y = ic[i].run(); + System.out.println(x+", "+y+", "+pc); + if(pc == 255) return y; + ic[pc].addInput(x); + ic[pc].addInput(y); + }*/ + } + + //x = ic[pc].run(); + //y = ic[pc].run(); + //pc = Math.toIntExact(ic[pc].run()); + } + } +} diff --git a/src/main/java/com/sbaars/adventofcode2019/intcode/ComputerThread.java b/src/main/java/com/sbaars/adventofcode2019/intcode/ComputerThread.java new file mode 100644 index 00000000..ca045b7a --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/intcode/ComputerThread.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode2019.intcode; + +import java.util.ArrayDeque; +import java.util.Queue; + +public class ComputerThread extends Thread { + public IntcodeComputer ic; + public final Queue output = new ArrayDeque<>(); + + public ComputerThread(IntcodeComputer ic) { + super(); + this.ic = ic; + start(); + } + + @Override + public void run() { + while(true) { + long res = ic.run(); + if(res!=-1) + output.add(res); + } + } +} diff --git a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java index 38136371..7bb134dc 100644 --- a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java +++ b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java @@ -69,7 +69,7 @@ private void transformParameters(int[] method, long[] args, int instruction) { private long readInput() { if(input.isEmpty()) - return lastInput; + return -1; lastInput = input.poll(); return lastInput; } diff --git a/src/main/resources/day23.txt b/src/main/resources/day23.txt new file mode 100644 index 00000000..c055880b --- /dev/null +++ b/src/main/resources/day23.txt @@ -0,0 +1 @@ +3,62,1001,62,11,10,109,2247,105,1,0,800,1531,734,2092,1445,1220,1572,1282,2121,769,1181,1865,1605,1047,1251,2032,608,952,874,1997,1706,1016,571,911,1966,1673,1150,2063,1480,1931,1311,1408,1770,841,670,2185,1640,1115,1080,1801,1373,1902,1342,2154,2216,1834,637,1739,983,701,0,0,0,0,0,0,0,0,0,0,0,0,3,64,1008,64,-1,62,1006,62,88,1006,61,170,1106,0,73,3,65,21002,64,1,1,20102,1,66,2,21102,105,1,0,1106,0,436,1201,1,-1,64,1007,64,0,62,1005,62,73,7,64,67,62,1006,62,73,1002,64,2,132,1,132,68,132,1002,0,1,62,1001,132,1,140,8,0,65,63,2,63,62,62,1005,62,73,1002,64,2,161,1,161,68,161,1101,1,0,0,1001,161,1,169,1001,65,0,0,1102,1,1,61,1102,0,1,63,7,63,67,62,1006,62,203,1002,63,2,194,1,68,194,194,1006,0,73,1001,63,1,63,1105,1,178,21101,210,0,0,106,0,69,2101,0,1,70,1101,0,0,63,7,63,71,62,1006,62,250,1002,63,2,234,1,72,234,234,4,0,101,1,234,240,4,0,4,70,1001,63,1,63,1105,1,218,1105,1,73,109,4,21102,0,1,-3,21102,0,1,-2,20207,-2,67,-1,1206,-1,293,1202,-2,2,283,101,1,283,283,1,68,283,283,22001,0,-3,-3,21201,-2,1,-2,1105,1,263,21202,-3,1,-3,109,-4,2105,1,0,109,4,21102,1,1,-3,21101,0,0,-2,20207,-2,67,-1,1206,-1,342,1202,-2,2,332,101,1,332,332,1,68,332,332,22002,0,-3,-3,21201,-2,1,-2,1105,1,312,22102,1,-3,-3,109,-4,2106,0,0,109,1,101,1,68,359,20101,0,0,1,101,3,68,366,21002,0,1,2,21101,0,376,0,1106,0,436,22101,0,1,0,109,-1,2105,1,0,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824,2147483648,4294967296,8589934592,17179869184,34359738368,68719476736,137438953472,274877906944,549755813888,1099511627776,2199023255552,4398046511104,8796093022208,17592186044416,35184372088832,70368744177664,140737488355328,281474976710656,562949953421312,1125899906842624,109,8,21202,-6,10,-5,22207,-7,-5,-5,1205,-5,521,21102,1,0,-4,21101,0,0,-3,21101,0,51,-2,21201,-2,-1,-2,1201,-2,385,471,20101,0,0,-1,21202,-3,2,-3,22207,-7,-1,-5,1205,-5,496,21201,-3,1,-3,22102,-1,-1,-5,22201,-7,-5,-7,22207,-3,-6,-5,1205,-5,515,22102,-1,-6,-5,22201,-3,-5,-3,22201,-1,-4,-4,1205,-2,461,1106,0,547,21101,0,-1,-4,21202,-6,-1,-6,21207,-7,0,-5,1205,-5,547,22201,-7,-6,-7,21201,-4,1,-4,1106,0,529,22102,1,-4,-7,109,-8,2105,1,0,109,1,101,1,68,564,20101,0,0,0,109,-1,2106,0,0,1101,0,101477,66,1101,0,4,67,1102,1,598,68,1102,302,1,69,1101,0,1,71,1101,0,606,72,1106,0,73,0,0,0,0,0,0,0,0,10,215836,1101,0,45281,66,1101,0,1,67,1102,635,1,68,1101,0,556,69,1101,0,0,71,1101,637,0,72,1106,0,73,1,1458,1102,1,881,66,1102,1,1,67,1102,1,664,68,1102,556,1,69,1102,2,1,71,1101,0,666,72,1105,1,73,1,7,11,231164,1,78697,1101,73369,0,66,1101,0,1,67,1101,0,697,68,1102,556,1,69,1102,1,1,71,1101,0,699,72,1106,0,73,1,160,23,314845,1101,0,75079,66,1102,1,2,67,1102,1,728,68,1102,302,1,69,1101,1,0,71,1101,732,0,72,1106,0,73,0,0,0,0,1,472182,1101,0,45569,66,1101,0,3,67,1102,1,761,68,1102,1,302,69,1101,1,0,71,1101,0,767,72,1106,0,73,0,0,0,0,0,0,12,55059,1101,0,27967,66,1102,1,1,67,1102,1,796,68,1101,556,0,69,1101,0,1,71,1101,0,798,72,1106,0,73,1,829,38,46353,1101,42283,0,66,1101,1,0,67,1101,0,827,68,1101,556,0,69,1102,1,6,71,1102,1,829,72,1105,1,73,1,19165,6,28162,12,18353,12,36706,4,53359,4,106718,4,160077,1101,0,38873,66,1102,1,1,67,1102,1,868,68,1101,0,556,69,1101,0,2,71,1101,870,0,72,1105,1,73,1,2,23,251876,23,377814,1101,0,52769,66,1102,4,1,67,1102,1,901,68,1101,253,0,69,1101,1,0,71,1102,1,909,72,1105,1,73,0,0,0,0,0,0,0,0,36,19073,1101,0,62969,66,1101,6,0,67,1102,938,1,68,1101,302,0,69,1101,0,1,71,1102,950,1,72,1106,0,73,0,0,0,0,0,0,0,0,0,0,0,0,36,38146,1102,91571,1,66,1102,1,1,67,1102,1,979,68,1102,1,556,69,1102,1,1,71,1101,981,0,72,1105,1,73,1,17,1,157394,1101,92693,0,66,1101,0,1,67,1101,1010,0,68,1102,556,1,69,1101,2,0,71,1101,0,1012,72,1106,0,73,1,1607,11,115582,2,136707,1102,1,2393,66,1102,1,1,67,1101,0,1043,68,1102,1,556,69,1102,1,1,71,1102,1,1045,72,1105,1,73,1,19,19,19961,1101,0,26561,66,1101,0,2,67,1101,0,1074,68,1101,302,0,69,1101,0,1,71,1101,1078,0,72,1106,0,73,0,0,0,0,49,75079,1102,15451,1,66,1102,3,1,67,1101,0,1107,68,1102,302,1,69,1102,1,1,71,1101,0,1113,72,1106,0,73,0,0,0,0,0,0,10,269795,1102,21673,1,66,1101,3,0,67,1101,0,1142,68,1102,302,1,69,1102,1,1,71,1102,1148,1,72,1106,0,73,0,0,0,0,0,0,10,107918,1102,1,56893,66,1101,1,0,67,1102,1177,1,68,1102,556,1,69,1102,1,1,71,1101,1179,0,72,1105,1,73,1,668,22,101477,1102,53959,1,66,1101,0,5,67,1101,0,1208,68,1101,0,253,69,1101,0,1,71,1101,1218,0,72,1105,1,73,0,0,0,0,0,0,0,0,0,0,11,57791,1102,1,29581,66,1101,1,0,67,1101,0,1247,68,1102,556,1,69,1101,1,0,71,1102,1249,1,72,1106,0,73,1,22291,25,187778,1102,27259,1,66,1102,1,1,67,1101,0,1278,68,1101,0,556,69,1101,0,1,71,1102,1,1280,72,1106,0,73,1,11,1,314788,1102,1,20873,66,1102,1,1,67,1101,1309,0,68,1101,556,0,69,1102,1,0,71,1101,1311,0,72,1106,0,73,1,1353,1101,0,80471,66,1102,1,1,67,1102,1,1338,68,1101,556,0,69,1102,1,1,71,1101,0,1340,72,1105,1,73,1,-82,38,30902,1102,1,85889,66,1101,0,1,67,1102,1,1369,68,1101,0,556,69,1101,0,1,71,1102,1371,1,72,1105,1,73,1,1151,37,65019,1102,1,13397,66,1102,3,1,67,1102,1,1400,68,1102,1,302,69,1102,1,1,71,1102,1406,1,72,1106,0,73,0,0,0,0,0,0,10,53959,1101,0,56659,66,1102,4,1,67,1101,0,1435,68,1102,302,1,69,1101,0,1,71,1101,0,1443,72,1105,1,73,0,0,0,0,0,0,0,0,23,62969,1101,0,53359,66,1101,0,3,67,1102,1,1472,68,1102,302,1,69,1102,1,1,71,1102,1,1478,72,1106,0,73,0,0,0,0,0,0,18,158307,1102,46591,1,66,1101,1,0,67,1102,1,1507,68,1102,1,556,69,1101,0,11,71,1102,1,1509,72,1105,1,73,1,1,37,43346,38,15451,40,26794,19,39922,22,304431,25,93889,39,7559,13,53122,49,150158,1,393485,2,91138,1101,0,78697,66,1102,6,1,67,1102,1558,1,68,1101,0,302,69,1101,1,0,71,1102,1570,1,72,1105,1,73,0,0,0,0,0,0,0,0,0,0,0,0,6,14081,1102,1,14081,66,1101,0,2,67,1102,1,1599,68,1102,1,302,69,1102,1,1,71,1101,0,1603,72,1106,0,73,0,0,0,0,18,105538,1101,0,18353,66,1102,3,1,67,1102,1,1632,68,1101,0,302,69,1102,1,1,71,1101,1638,0,72,1106,0,73,0,0,0,0,0,0,18,211076,1101,0,19073,66,1102,2,1,67,1101,0,1667,68,1101,351,0,69,1102,1,1,71,1102,1,1671,72,1106,0,73,0,0,0,0,255,42283,1101,93889,0,66,1101,2,0,67,1101,0,1700,68,1101,0,302,69,1102,1,1,71,1102,1704,1,72,1106,0,73,0,0,0,0,39,15118,1101,91457,0,66,1102,1,1,67,1102,1733,1,68,1102,1,556,69,1101,0,2,71,1102,1,1735,72,1106,0,73,1,37,22,202954,1,236091,1102,1,65167,66,1101,0,1,67,1102,1766,1,68,1101,556,0,69,1102,1,1,71,1101,1768,0,72,1106,0,73,1,-114,40,40191,1101,5591,0,66,1101,1,0,67,1101,1797,0,68,1101,556,0,69,1102,1,1,71,1102,1,1799,72,1106,0,73,1,1093,40,13397,1102,1,7559,66,1102,1,2,67,1101,0,1828,68,1101,302,0,69,1101,1,0,71,1102,1832,1,72,1106,0,73,0,0,0,0,13,26561,1101,76667,0,66,1102,1,1,67,1101,0,1861,68,1101,0,556,69,1102,1,1,71,1102,1863,1,72,1105,1,73,1,6563,19,59883,1102,1,57791,66,1101,4,0,67,1102,1,1892,68,1102,302,1,69,1102,1,1,71,1101,0,1900,72,1105,1,73,0,0,0,0,0,0,0,0,18,52769,1102,1,23687,66,1101,0,1,67,1101,1929,0,68,1102,1,556,69,1101,0,0,71,1102,1931,1,72,1106,0,73,1,1806,1102,35869,1,66,1102,1,1,67,1101,1958,0,68,1101,0,556,69,1101,3,0,71,1101,0,1960,72,1106,0,73,1,5,31,56659,31,169977,23,188907,1101,63199,0,66,1101,1,0,67,1102,1993,1,68,1102,556,1,69,1101,1,0,71,1101,0,1995,72,1105,1,73,1,21,22,405908,1102,19961,1,66,1101,3,0,67,1101,0,2024,68,1101,302,0,69,1101,1,0,71,1101,0,2030,72,1105,1,73,0,0,0,0,0,0,10,161877,1102,65579,1,66,1101,1,0,67,1102,1,2059,68,1101,0,556,69,1101,1,0,71,1101,2061,0,72,1106,0,73,1,421,11,173373,1101,44279,0,66,1102,1,1,67,1102,1,2090,68,1102,556,1,69,1101,0,0,71,1101,2092,0,72,1106,0,73,1,1762,1102,1,60353,66,1101,0,1,67,1101,2119,0,68,1101,0,556,69,1101,0,0,71,1101,0,2121,72,1106,0,73,1,1423,1102,1,70573,66,1102,1,1,67,1102,1,2148,68,1101,0,556,69,1101,2,0,71,1102,2150,1,72,1106,0,73,1,10,31,113318,23,125938,1101,40277,0,66,1101,0,1,67,1101,0,2181,68,1101,0,556,69,1101,0,1,71,1102,1,2183,72,1105,1,73,1,-34,37,21673,1101,0,50957,66,1102,1,1,67,1101,2212,0,68,1101,556,0,69,1102,1,1,71,1101,2214,0,72,1105,1,73,1,125,31,226636,1102,91961,1,66,1101,0,1,67,1101,2243,0,68,1101,0,556,69,1101,1,0,71,1102,2245,1,72,1106,0,73,1,-21,2,45569 \ No newline at end of file From 59cdda9124fd5c014449893fd24a4d70a7c88f90 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 23 Dec 2019 07:44:55 +0100 Subject: [PATCH 124/433] Refactored day 23 part 1 --- .../sbaars/adventofcode2019/days/Day23.java | 52 +++++-------------- .../intcode/ComputerThread.java | 24 --------- .../intcode/IntcodeComputer.java | 31 +++++++---- .../intcode/RetentionPolicy.java | 5 ++ .../util/DoesFileOperations.java | 5 ++ 5 files changed, 44 insertions(+), 73 deletions(-) delete mode 100644 src/main/java/com/sbaars/adventofcode2019/intcode/ComputerThread.java create mode 100644 src/main/java/com/sbaars/adventofcode2019/intcode/RetentionPolicy.java diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day23.java b/src/main/java/com/sbaars/adventofcode2019/days/Day23.java index 563a9b06..fc08a93a 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day23.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day23.java @@ -1,65 +1,39 @@ package com.sbaars.adventofcode2019.days; import java.io.IOException; -import java.util.Arrays; import java.util.stream.IntStream; import com.sbaars.adventofcode2019.common.Day; -import com.sbaars.adventofcode2019.intcode.ComputerThread; import com.sbaars.adventofcode2019.intcode.IntcodeComputer; +import com.sbaars.adventofcode2019.intcode.RetentionPolicy; public class Day23 implements Day { public static void main(String[] args) throws IOException { - System.out.println(new Day23().part2()); + System.out.println(new Day23().part1()); } @Override public Object part1() throws IOException { - ComputerThread[] ic = IntStream.range(0, 50).mapToObj(i -> { - try { - return new ComputerThread(new IntcodeComputer(23, i)); - } catch (IOException e) { - return null; - } - }).toArray(ComputerThread[]::new); - + long[] program = readLongArray(23); + IntcodeComputer[] ic = IntStream.range(0, 50).mapToObj(i -> new IntcodeComputer(RetentionPolicy.EXIT_ON_EMPTY_INPUT, program, i, -1)).toArray(IntcodeComputer[]::new); + long input; while(true) { for(int i = 0; i2) { - int pc = Math.toIntExact(ic[i].output.poll()); - long x = ic[i].output.poll(); - long y = ic[i].output.poll(); - if(pc == 255) { - //System.out.println(x+", "+y+", "+pc); - //ic[pc].ic.addInput(x); - //ic[pc].ic.addInput(y); - //System.out.println(new IntcodeComputer(23, 255).run()); - //Arrays.stream(ic).forEach(e -> e.stop()); - return y; - } - ic[pc].ic.addInput(x); - ic[pc].ic.addInput(y); - } - /*while((pc = Math.toIntExact(ic[i].run()))!=-1) { - x = ic[i].run(); - y = ic[i].run(); - System.out.println(x+", "+y+", "+pc); + while((input = ic[i].run())!=IntcodeComputer.STOP_CODE) { + int pc = Math.toIntExact(input); + long x = ic[i].run(), y = ic[i].run(); if(pc == 255) return y; - ic[pc].addInput(x); - ic[pc].addInput(y); - }*/ + ic[pc].addInput(x, y); + } } - - //x = ic[pc].run(); - //y = ic[pc].run(); - //pc = Math.toIntExact(ic[pc].run()); } } @Override public Object part2() throws IOException { + return 0;/* ComputerThread[] ic = IntStream.range(0, 50).mapToObj(i -> { try { return new ComputerThread(new IntcodeComputer(23, i)); @@ -104,11 +78,11 @@ public Object part2() throws IOException { ic[pc].addInput(x); ic[pc].addInput(y); }*/ - } + //} //x = ic[pc].run(); //y = ic[pc].run(); //pc = Math.toIntExact(ic[pc].run()); - } + //} } } diff --git a/src/main/java/com/sbaars/adventofcode2019/intcode/ComputerThread.java b/src/main/java/com/sbaars/adventofcode2019/intcode/ComputerThread.java deleted file mode 100644 index ca045b7a..00000000 --- a/src/main/java/com/sbaars/adventofcode2019/intcode/ComputerThread.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.sbaars.adventofcode2019.intcode; - -import java.util.ArrayDeque; -import java.util.Queue; - -public class ComputerThread extends Thread { - public IntcodeComputer ic; - public final Queue output = new ArrayDeque<>(); - - public ComputerThread(IntcodeComputer ic) { - super(); - this.ic = ic; - start(); - } - - @Override - public void run() { - while(true) { - long res = ic.run(); - if(res!=-1) - output.add(res); - } - } -} diff --git a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java index 7bb134dc..988cc8ef 100644 --- a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java +++ b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java @@ -4,7 +4,6 @@ import java.util.ArrayDeque; import java.util.Arrays; import java.util.Queue; -import java.util.stream.Collectors; import java.util.stream.IntStream; import com.sbaars.adventofcode2019.util.DoesFileOperations; @@ -18,17 +17,26 @@ public class IntcodeComputer implements DoesFileOperations { private static final int[] DO_NOT_TRANSFORM_FINAL_ARGUMENT = {1, 2, 3, 7, 8}; public static final long STOP_CODE = Long.MIN_VALUE+1; private static final long CONTINUE_CODE = Long.MIN_VALUE; + public RetentionPolicy policy; + + public IntcodeComputer(RetentionPolicy policy, long[] program, long...input) { + //this.program = Arrays.copyOf(this.program, 10000); // Quick hack to enlarge memory, should be refactored later(tm). + this.program = Arrays.copyOf(program, 10000); + setInput(input); + this.policy = policy; + } public IntcodeComputer(int day, long...input) throws IOException { - this.program = Arrays.stream(readDay(day).split(",")).mapToLong(Long::parseLong).toArray(); + this.program = readLongArray(day); this.program = Arrays.copyOf(this.program, 10000); // Quick hack to enlarge memory, should be refactored later(tm). - setInput(input); if(day == 2) { - program[1] = input[0]; - program[2] = input[1]; + this.program[1] = input[0]; + this.program[2] = input[1]; } else if(day == 17) { - program[0] = input[0]; + this.program[0] = input[0]; } + setInput(input); + this.policy = RetentionPolicy.EXIT_ON_OUTPUT; } public long run(long...input) { @@ -43,6 +51,8 @@ public long run() { } private long executeInstruction(int instruction) { + if(instruction == 3 && policy == RetentionPolicy.EXIT_ON_EMPTY_INPUT && input.size() == 0) + return STOP_CODE; if(instruction>99) return parseComplexInstruction(instruction); return execute(instruction); @@ -74,17 +84,18 @@ private long readInput() { return lastInput; } - public boolean addInput(long num) { - return input.add(num); + public void addInput(long...num) { + for(long n : num) + input.add(n); } public long firstElement() { return program[0]; } - public boolean setInput(long...input) { + public void setInput(long...input) { this.input.clear(); - return this.input.addAll(Arrays.stream(input).boxed().collect(Collectors.toList())); + addInput(input); } private long executeInstruction(long[] args, int instruction) { diff --git a/src/main/java/com/sbaars/adventofcode2019/intcode/RetentionPolicy.java b/src/main/java/com/sbaars/adventofcode2019/intcode/RetentionPolicy.java new file mode 100644 index 00000000..f7b366e2 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/intcode/RetentionPolicy.java @@ -0,0 +1,5 @@ +package com.sbaars.adventofcode2019.intcode; + +public enum RetentionPolicy { + EXIT_ON_EMPTY_INPUT, EXIT_ON_OUTPUT +} diff --git a/src/main/java/com/sbaars/adventofcode2019/util/DoesFileOperations.java b/src/main/java/com/sbaars/adventofcode2019/util/DoesFileOperations.java index 289ee81c..29eafacb 100644 --- a/src/main/java/com/sbaars/adventofcode2019/util/DoesFileOperations.java +++ b/src/main/java/com/sbaars/adventofcode2019/util/DoesFileOperations.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; +import java.util.Arrays; public interface DoesFileOperations { @@ -18,4 +19,8 @@ public default String getResourceAsString(String resource) throws IOException { public default String readDay(int day) throws IOException { return getResourceAsString("day"+day+".txt"); } + + public default long[] readLongArray(int day) throws IOException { + return Arrays.stream(readDay(day).split(",")).mapToLong(Long::parseLong).toArray(); + } } \ No newline at end of file From a6ba01b1130c632d22fe37b7bda2b8c6a029e18a Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 23 Dec 2019 07:55:29 +0100 Subject: [PATCH 125/433] Refactored part 2 --- .../sbaars/adventofcode2019/days/Day23.java | 72 +++++++------------ .../intcode/IntcodeComputer.java | 6 +- 2 files changed, 28 insertions(+), 50 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day23.java b/src/main/java/com/sbaars/adventofcode2019/days/Day23.java index fc08a93a..c6e65c18 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day23.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day23.java @@ -1,5 +1,6 @@ package com.sbaars.adventofcode2019.days; +import java.awt.Point; import java.io.IOException; import java.util.stream.IntStream; @@ -10,7 +11,7 @@ public class Day23 implements Day { public static void main(String[] args) throws IOException { - System.out.println(new Day23().part1()); + new Day23().printParts(); } @Override @@ -33,56 +34,33 @@ public Object part1() throws IOException { @Override public Object part2() throws IOException { - return 0;/* - ComputerThread[] ic = IntStream.range(0, 50).mapToObj(i -> { - try { - return new ComputerThread(new IntcodeComputer(23, i)); - } catch (IOException e) { - return null; - } - }).toArray(ComputerThread[]::new); - - IntcodeComputer nat = new IntcodeComputer(23, 255); + long[] program = readLongArray(23); + IntcodeComputer[] ic = IntStream.range(0, 50).mapToObj(i -> new IntcodeComputer(RetentionPolicy.EXIT_ON_EMPTY_INPUT, program, i, -1)).toArray(IntcodeComputer[]::new); + long[] nat = new long[2]; + long sentByNat = -1; - long prev = -1; + long input; while(true) { - for(int i = 0; i2) { - int pc = Math.toIntExact(ic[i].output.poll()); - long x = ic[i].output.poll(); - long y = ic[i].output.poll(); + boolean idle = true; + forloop: for(int i = 0; i e.stop()); - //return y; + nat[0] = x; + nat[1] = y; + continue forloop; } - ic[pc].ic.addInput(x); - ic[pc].ic.addInput(y); + ic[pc].addInput(x, y); + idle = false; } - /*while((pc = Math.toIntExact(ic[i].run()))!=-1) { - x = ic[i].run(); - y = ic[i].run(); - System.out.println(x+", "+y+", "+pc); - if(pc == 255) return y; - ic[pc].addInput(x); - ic[pc].addInput(y); - }*/ - //} - - //x = ic[pc].run(); - //y = ic[pc].run(); - //pc = Math.toIntExact(ic[pc].run()); - //} + } + if(idle) { + ic[0].addInput(nat[0], nat[1]); + if(sentByNat == nat[1]) + return nat[1]; + sentByNat = nat[1]; + } + } } } diff --git a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java index 988cc8ef..7026e865 100644 --- a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java +++ b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java @@ -21,14 +21,14 @@ public class IntcodeComputer implements DoesFileOperations { public IntcodeComputer(RetentionPolicy policy, long[] program, long...input) { //this.program = Arrays.copyOf(this.program, 10000); // Quick hack to enlarge memory, should be refactored later(tm). - this.program = Arrays.copyOf(program, 10000); + this.program = Arrays.copyOf(program, 50000); setInput(input); this.policy = policy; } public IntcodeComputer(int day, long...input) throws IOException { this.program = readLongArray(day); - this.program = Arrays.copyOf(this.program, 10000); // Quick hack to enlarge memory, should be refactored later(tm). + this.program = Arrays.copyOf(this.program, 50000); // Quick hack to enlarge memory, should be refactored later(tm). if(day == 2) { this.program[1] = input[0]; this.program[2] = input[1]; @@ -79,7 +79,7 @@ private void transformParameters(int[] method, long[] args, int instruction) { private long readInput() { if(input.isEmpty()) - return -1; + return lastInput; lastInput = input.poll(); return lastInput; } From 3864d63045399b7bcb786c7254947b436bdc0015 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 23 Dec 2019 08:00:47 +0100 Subject: [PATCH 126/433] Day 23 refactoring --- .../sbaars/adventofcode2019/days/Day23.java | 29 ++++++------------- .../intcode/IntcodeComputer.java | 5 ++-- 2 files changed, 11 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day23.java b/src/main/java/com/sbaars/adventofcode2019/days/Day23.java index c6e65c18..ae54a80d 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day23.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day23.java @@ -16,24 +16,15 @@ public static void main(String[] args) throws IOException { @Override public Object part1() throws IOException { - long[] program = readLongArray(23); - IntcodeComputer[] ic = IntStream.range(0, 50).mapToObj(i -> new IntcodeComputer(RetentionPolicy.EXIT_ON_EMPTY_INPUT, program, i, -1)).toArray(IntcodeComputer[]::new); - - long input; - while(true) { - for(int i = 0; i new IntcodeComputer(RetentionPolicy.EXIT_ON_EMPTY_INPUT, program, i, -1)).toArray(IntcodeComputer[]::new); long[] nat = new long[2]; @@ -42,23 +33,21 @@ public Object part2() throws IOException { long input; while(true) { boolean idle = true; - forloop: for(int i = 0; i Date: Mon, 23 Dec 2019 08:01:50 +0100 Subject: [PATCH 127/433] Minor refactoring --- src/main/java/com/sbaars/adventofcode2019/days/Day23.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day23.java b/src/main/java/com/sbaars/adventofcode2019/days/Day23.java index ae54a80d..db2f43c2 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day23.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day23.java @@ -1,6 +1,5 @@ package com.sbaars.adventofcode2019.days; -import java.awt.Point; import java.io.IOException; import java.util.stream.IntStream; @@ -24,7 +23,7 @@ public Object part2() throws IOException { return getNetworkNumber(false); } - private Object getNetworkNumber(boolean returnNatY) throws IOException { + private long getNetworkNumber(boolean returnNatY) throws IOException { long[] program = readLongArray(23); IntcodeComputer[] ic = IntStream.range(0, 50).mapToObj(i -> new IntcodeComputer(RetentionPolicy.EXIT_ON_EMPTY_INPUT, program, i, -1)).toArray(IntcodeComputer[]::new); long[] nat = new long[2]; From 1302da2e28dc4903d6b114844f2f80df7babf26e Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 24 Dec 2019 06:34:56 +0100 Subject: [PATCH 128/433] Day 24 Part 1 --- .../sbaars/adventofcode2019/days/Day24.java | 87 +++++++++++++++++++ src/main/resources/day24.txt | 5 ++ 2 files changed, 92 insertions(+) create mode 100644 src/main/java/com/sbaars/adventofcode2019/days/Day24.java create mode 100644 src/main/resources/day24.txt diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day24.java b/src/main/java/com/sbaars/adventofcode2019/days/Day24.java new file mode 100644 index 00000000..5c3192fd --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day24.java @@ -0,0 +1,87 @@ +package com.sbaars.adventofcode2019.days; + +import java.awt.Point; +import java.io.IOException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +import com.sbaars.adventofcode2019.common.Day; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; + +public class Day24 implements Day { + + Set grids = new HashSet<>(); + + public static void main(String[] args) throws IOException { + new Day24().printParts(); + } + + @Override + public Object part1() throws IOException { + char[][] grid = Arrays.stream(readDay(24).split(System.lineSeparator())).map(e -> e.toCharArray()).toArray(char[][]::new); + while(true) { + //Arrays.stream(grid).forEach(e -> System.out.println(Arrays.toString(e))); + if(!grids.add(new Hello(grid))) { + return calcRes(grid); + } + char[][] newGrid = copy(grid); + for(int y = 0; y System.out.println(Arrays.toString(e))); + long res = 0; + long multiplier = 1; + for(int y = 0; y=grid.length || y>=grid.length) + return 0; + return grid[y][x] == '#' ? 1 : 0; + } + + @Override + public Object part2() throws IOException { + return 0; + } +} diff --git a/src/main/resources/day24.txt b/src/main/resources/day24.txt new file mode 100644 index 00000000..feaf92c5 --- /dev/null +++ b/src/main/resources/day24.txt @@ -0,0 +1,5 @@ +##.#. +#..#. +..... +....# +#.### \ No newline at end of file From a7a709578d286133854e200b17068478eb7e3bb5 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 24 Dec 2019 07:59:02 +0100 Subject: [PATCH 129/433] Day 24 Part 2 --- .../sbaars/adventofcode2019/days/Day24.java | 110 +++++++++++++++--- 1 file changed, 96 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day24.java b/src/main/java/com/sbaars/adventofcode2019/days/Day24.java index 5c3192fd..c993f784 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day24.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day24.java @@ -3,8 +3,11 @@ import java.awt.Point; import java.io.IOException; import java.util.Arrays; +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.Set; +import java.util.stream.IntStream; import com.sbaars.adventofcode2019.common.Day; @@ -29,26 +32,28 @@ public Object part1() throws IOException { return calcRes(grid); } char[][] newGrid = copy(grid); - for(int y = 0; y System.out.println(Arrays.toString(e))); + // Arrays.stream(grid).forEach(e -> System.out.println(Arrays.toString(e))); long res = 0; long multiplier = 1; for(int y = 0; y=grid.length || y>=grid.length) - return 0; + if(x<0 || y<0 || x>=grid.length || y>=grid.length) return 0; return grid[y][x] == '#' ? 1 : 0; } + + Map layers = new HashMap<>(); @Override public Object part2() throws IOException { - return 0; + char[][] grid = Arrays.stream(readDay(24).split(System.lineSeparator())).map(e -> e.toCharArray()).toArray(char[][]::new); + for(int i = -200; i<=200; i++) + layers.put(i, fill(new char[grid.length][grid[0].length], '.')); + layers.put(0, grid); + for(int i =0; i<200; i++) { + final Map layers2 = new HashMap<>(); + for(int layer = -200; layer<=200; layer++) { + char[][] newGrid = copy(layers.get(layer)); + for(int y = 0; y System.out.println(Arrays.toString(e))); + } + return layers.values().stream().mapToInt(e -> count(e, '#')).sum(); + } + + private int count(char[][] grid, char c) { + int total = 0; + for(int y = 0; y num(layers.get(layer-1), i, 0)).sum(); + } + if(pos.equals(new Point(1, 2))) { + res+=IntStream.range(0,5).map(i -> num(layers.get(layer-1), 0, i)).sum(); + } + if(pos.equals(new Point(2, 3))) { + res+=IntStream.range(0,5).map(i -> num(layers.get(layer-1), i, 4)).sum(); + } + if(pos.equals(new Point(3, 2))) { + res+=IntStream.range(0,5).map(i -> num(layers.get(layer-1), 4, i)).sum(); + } + } + return res + nAdjecent(layers.get(layer), pos); + } + + public char[][] fill(char[][] arr, char el) { + for (char[] row: arr) Arrays.fill(row, el); + return arr; } } From 7649de650d90701112009da4afb557b8f0a52930 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 24 Dec 2019 08:37:52 +0100 Subject: [PATCH 130/433] Day 24 refactor --- .../sbaars/adventofcode2019/days/Day24.java | 109 +++++++----------- 1 file changed, 40 insertions(+), 69 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day24.java b/src/main/java/com/sbaars/adventofcode2019/days/Day24.java index c993f784..d9436ef1 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day24.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day24.java @@ -5,8 +5,11 @@ import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; +import java.util.function.Function; +import java.util.function.Supplier; import java.util.stream.IntStream; import com.sbaars.adventofcode2019.common.Day; @@ -17,7 +20,17 @@ public class Day24 implements Day { - Set grids = new HashSet<>(); + private final Set grids = new HashSet<>(); + private Map layers = new HashMap<>(); + private final char[][] initialGrid; + + @EqualsAndHashCode @AllArgsConstructor @Data class Grid{ + char[][] grid; + } + + public Day24() throws IOException { + this.initialGrid = Arrays.stream(readDay(24).split(System.lineSeparator())).map(e -> e.toCharArray()).toArray(char[][]::new); + } public static void main(String[] args) throws IOException { new Day24().printParts(); @@ -25,72 +38,49 @@ public static void main(String[] args) throws IOException { @Override public Object part1() throws IOException { - char[][] grid = Arrays.stream(readDay(24).split(System.lineSeparator())).map(e -> e.toCharArray()).toArray(char[][]::new); + char[][] grid = initialGrid; while(true) { - //Arrays.stream(grid).forEach(e -> System.out.println(Arrays.toString(e))); - if(!grids.add(new Hello(grid))) { - return calcRes(grid); - } + if(!grids.add(new Grid(grid))) return calcRes(grid); char[][] newGrid = copy(grid); for(int y = 0; y System.out.println(Arrays.toString(e))); - long res = 0; - long multiplier = 1; - for(int y = 0; y IntStream.range(0, grid[y].length).mapToObj(x -> new Point(x,y))).filter(p -> grid[p.y][p.x] == '#').mapToDouble(p -> Math.pow(2, (p.y*grid.length)+p.x)).sum(); } public char[][] copy(char[][] grid){ char[][] g2 = new char[grid.length][]; - for(int i = 0; i=grid.length || y>=grid.length) return 0; - return grid[y][x] == '#' ? 1 : 0; + private int num(char[][] grid, Point p) { + if(p.x<0 || p.y<0 || p.x>=grid.length || p.y>=grid.length) return 0; + return grid[p.y][p.x] == '#' ? 1 : 0; } - - Map layers = new HashMap<>(); @Override public Object part2() throws IOException { char[][] grid = Arrays.stream(readDay(24).split(System.lineSeparator())).map(e -> e.toCharArray()).toArray(char[][]::new); - for(int i = -200; i<=200; i++) - layers.put(i, fill(new char[grid.length][grid[0].length], '.')); + for(int i = -200; i<=200; i++) layers.put(i, fill(new char[grid.length][grid[0].length], '.')); layers.put(0, grid); for(int i =0; i<200; i++) { final Map layers2 = new HashMap<>(); @@ -99,15 +89,11 @@ public Object part2() throws IOException { for(int y = 0; y System.out.println(Arrays.toString(e))); - } return layers.values().stream().mapToInt(e -> count(e, '#')).sum(); } @@ -131,37 +117,22 @@ private void simulate(int layer, char[][] newGrid, int y, int x) { public int nAdjecent(int layer, Point pos) { int res = 0; + Point[] surround = new Point[] {new Point(2, 1), new Point(1, 2), new Point(2, 3), new Point(3, 2)}; if(layers.containsKey(layer+1)) { - if(pos.y == 0) { - res+=num(layers.get(layer + 1), 2 , 1); - } - if(pos.x == 0) { - res+=num(layers.get(layer + 1), 1 , 2); - } - if(pos.y == 4) { - res+=num(layers.get(layer + 1), 2 , 3); - } - if(pos.x == 4) { - res+=num(layers.get(layer + 1), 3 , 2); - } + List> conditions = Arrays.asList(() -> pos.y == 0, () -> pos.x == 0, () -> pos.y == 4, () -> pos.x == 4); + res += IntStream.range(0, conditions.size()).filter(i -> conditions.get(i).get()).map(i -> num(layers.get(layer + 1), surround[i])).sum(); } if(layers.containsKey(layer-1)) { - if(pos.equals(new Point(2, 1))) { - res+=IntStream.range(0,5).map(i -> num(layers.get(layer-1), i, 0)).sum(); - } - if(pos.equals(new Point(1, 2))) { - res+=IntStream.range(0,5).map(i -> num(layers.get(layer-1), 0, i)).sum(); - } - if(pos.equals(new Point(2, 3))) { - res+=IntStream.range(0,5).map(i -> num(layers.get(layer-1), i, 4)).sum(); - } - if(pos.equals(new Point(3, 2))) { - res+=IntStream.range(0,5).map(i -> num(layers.get(layer-1), 4, i)).sum(); - } + List> fs = Arrays.asList(i -> new Point(i, 0), i -> new Point(0, i), i -> new Point(i, 4), i -> new Point(4, i)); + res += IntStream.range(0, fs.size()).filter(i -> pos.equals(surround[i])).map(i -> nLayer(layer, fs.get(i))).sum(); } return res + nAdjecent(layers.get(layer), pos); } + public int nLayer(int layer, Function f) { + return IntStream.range(0,5).map(i -> num(layers.get(layer-1), f.apply(i))).sum(); + } + public char[][] fill(char[][] arr, char el) { for (char[] row: arr) Arrays.fill(row, el); return arr; From 93e4502222e3788449f208707513fe2edc0ec1e6 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 24 Dec 2019 08:49:46 +0100 Subject: [PATCH 131/433] Stream grid --- .../sbaars/adventofcode2019/days/Day24.java | 45 ++++++++++--------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day24.java b/src/main/java/com/sbaars/adventofcode2019/days/Day24.java index d9436ef1..696a435f 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day24.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day24.java @@ -11,6 +11,7 @@ import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.IntStream; +import java.util.stream.Stream; import com.sbaars.adventofcode2019.common.Day; @@ -42,9 +43,8 @@ public Object part1() throws IOException { while(true) { if(!grids.add(new Grid(grid))) return calcRes(grid); char[][] newGrid = copy(grid); - for(int y = 0; y simulate(g, newGrid, p)); grid = newGrid; } } @@ -59,7 +59,7 @@ private void simulate(char[][] grid, char[][] newGrid, Point p) { } private long calcRes(char[][] grid) { - return (long)IntStream.range(0, grid.length).boxed().flatMap(y -> IntStream.range(0, grid[y].length).mapToObj(x -> new Point(x,y))).filter(p -> grid[p.y][p.x] == '#').mapToDouble(p -> Math.pow(2, (p.y*grid.length)+p.x)).sum(); + return (long)streamGrid(grid).filter(p -> grid[p.y][p.x] == '#').mapToDouble(p -> Math.pow(2, (p.y*grid.length)+p.x)).sum(); } public char[][] copy(char[][] grid){ @@ -86,32 +86,33 @@ public Object part2() throws IOException { final Map layers2 = new HashMap<>(); for(int layer = -200; layer<=200; layer++) { char[][] newGrid = copy(layers.get(layer)); - for(int y = 0; y p.x != 2 || p.y!=2).forEach(p -> simulate(l, newGrid, p)); layers2.put(layer, newGrid); } layers = layers2; } - return layers.values().stream().mapToInt(e -> count(e, '#')).sum(); + return layers.values().stream().mapToLong(e -> count(e, '#')).sum(); } - private int count(char[][] grid, char c) { - int total = 0; - for(int y = 0; y streamGrid(int sizex, int sizey) { + return IntStream.range(0, sizey).boxed().flatMap(y -> IntStream.range(0, sizex).mapToObj(x -> new Point(x,y))); + } + + public Stream streamGrid(char[][] grid) { + return streamGrid(grid[0].length, grid.length); + } + + private long count(char[][] grid, char c) { + return streamGrid(grid).filter(p -> grid[p.y][p.x] == '#').count(); } - private void simulate(int layer, char[][] newGrid, int y, int x) { - int adj = nAdjecent(layer, new Point(x,y)); - if(layers.get(layer)[y][x] == '#' && adj != 1) { - newGrid[y][x] = '.'; - } else if(layers.get(layer)[y][x] == '.' && (adj == 1 || adj == 2)) { - newGrid[y][x] = '#'; + private void simulate(int layer, char[][] newGrid, Point p) { + int adj = nAdjecent(layer, p); + if(layers.get(layer)[p.y][p.x] == '#' && adj != 1) { + newGrid[p.y][p.x] = '.'; + } else if(layers.get(layer)[p.y][p.x] == '.' && (adj == 1 || adj == 2)) { + newGrid[p.y][p.x] = '#'; } } From a41d24438b543049bec196ac5483d9ddebaeaec2 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 24 Dec 2019 08:59:14 +0100 Subject: [PATCH 132/433] Final Day 24 Refactor --- .../sbaars/adventofcode2019/days/Day24.java | 34 ++++++++++++------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day24.java b/src/main/java/com/sbaars/adventofcode2019/days/Day24.java index 696a435f..2cd7c598 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day24.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day24.java @@ -51,15 +51,15 @@ public Object part1() throws IOException { private void simulate(char[][] grid, char[][] newGrid, Point p) { int adj = nAdjecent(grid, p); - if(grid[p.y][p.x] == '#' && adj != 1) { - newGrid[p.y][p.x] = '.'; - } else if(grid[p.y][p.x] == '.' && (adj == 1 || adj == 2)) { - newGrid[p.y][p.x] = '#'; + if(get(grid, p) == '#' && adj != 1) { + set(newGrid, p, '.'); + } else if(get(grid, p) == '.' && (adj == 1 || adj == 2)) { + set(newGrid, p, '#'); } } private long calcRes(char[][] grid) { - return (long)streamGrid(grid).filter(p -> grid[p.y][p.x] == '#').mapToDouble(p -> Math.pow(2, (p.y*grid.length)+p.x)).sum(); + return (long)streamGrid(grid).filter(p -> get(grid, p) == '#').mapToDouble(p -> Math.pow(2, (p.y*grid.length)+p.x)).sum(); } public char[][] copy(char[][] grid){ @@ -74,7 +74,7 @@ public int nAdjecent(char[][] grid, Point pos) { private int num(char[][] grid, Point p) { if(p.x<0 || p.y<0 || p.x>=grid.length || p.y>=grid.length) return 0; - return grid[p.y][p.x] == '#' ? 1 : 0; + return get(grid, p) == '#' ? 1 : 0; } @Override @@ -104,19 +104,27 @@ public Stream streamGrid(char[][] grid) { } private long count(char[][] grid, char c) { - return streamGrid(grid).filter(p -> grid[p.y][p.x] == '#').count(); + return streamGrid(grid).filter(p -> get(grid, p) == '#').count(); } private void simulate(int layer, char[][] newGrid, Point p) { int adj = nAdjecent(layer, p); - if(layers.get(layer)[p.y][p.x] == '#' && adj != 1) { - newGrid[p.y][p.x] = '.'; - } else if(layers.get(layer)[p.y][p.x] == '.' && (adj == 1 || adj == 2)) { - newGrid[p.y][p.x] = '#'; + if(get(layers.get(layer), p) == '#' && adj != 1) { + set(newGrid, p, '.'); + } else if(get(layers.get(layer), p) == '.' && (adj == 1 || adj == 2)) { + set(newGrid, p, '#'); } } - public int nAdjecent(int layer, Point pos) { + private char get(char[][] grid, Point pos) { + return grid[pos.y][pos.x]; + } + + private void set(char[][] grid, Point pos, char c) { + grid[pos.y][pos.x] = c; + } + + private int nAdjecent(int layer, Point pos) { int res = 0; Point[] surround = new Point[] {new Point(2, 1), new Point(1, 2), new Point(2, 3), new Point(3, 2)}; if(layers.containsKey(layer+1)) { @@ -135,7 +143,7 @@ public int nLayer(int layer, Function f) { } public char[][] fill(char[][] arr, char el) { - for (char[] row: arr) Arrays.fill(row, el); + streamGrid(arr).forEach(p -> set(arr, p, el)); return arr; } } From 37f64751771ba6a3e27118a914030dccbde21c3d Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 25 Dec 2019 06:21:47 +0100 Subject: [PATCH 133/433] Day 25 Part 1 --- .../sbaars/adventofcode2019/days/Day25.java | 36 +++++++++++++++++++ .../intcode/IntcodeComputer.java | 4 +-- src/main/resources/day25.txt | 1 + 3 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode2019/days/Day25.java create mode 100644 src/main/resources/day25.txt diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day25.java b/src/main/java/com/sbaars/adventofcode2019/days/Day25.java new file mode 100644 index 00000000..6865da8d --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day25.java @@ -0,0 +1,36 @@ +package com.sbaars.adventofcode2019.days; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +import com.sbaars.adventofcode2019.common.Day; +import com.sbaars.adventofcode2019.intcode.IntcodeComputer; +import com.sbaars.adventofcode2019.intcode.RetentionPolicy; + +public class Day25 implements Day { + + public static void main(String[] args) throws IOException { + new Day25().printParts(); + } + + @Override + public Object part1() throws IOException { + IntcodeComputer ic = new IntcodeComputer(RetentionPolicy.EXIT_ON_EMPTY_INPUT, readLongArray(25)); + while(true) { + long res; + while((res = ic.run()) != IntcodeComputer.STOP_CODE) { + System.out.print((char)res); + } + BufferedReader reader = + new BufferedReader(new InputStreamReader(System.in)); + String name = reader.readLine(); + ic.setInput(name+"\n"); + } + } + + @Override + public Object part2() throws IOException { + return new IntcodeComputer(9, 2).run(); + } +} diff --git a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java index d94f2927..64155b31 100644 --- a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java +++ b/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java @@ -50,8 +50,6 @@ public long run() { } private long executeInstruction(int instruction) { - if(instruction == 3 && policy == RetentionPolicy.EXIT_ON_EMPTY_INPUT && input.size() == 0) - return STOP_CODE; if(instruction>99) return parseComplexInstruction(instruction); return execute(instruction); @@ -98,6 +96,8 @@ public void setInput(long...input) { } private long executeInstruction(long[] args, int instruction) { + if(instruction == 3 && policy == RetentionPolicy.EXIT_ON_EMPTY_INPUT && input.size() == 0) + return STOP_CODE; instructionCounter+=nParams(instruction) + 1; switch(instruction) { case 1: program[Math.toIntExact(args[2])] = args[0] + args[1]; break; diff --git a/src/main/resources/day25.txt b/src/main/resources/day25.txt new file mode 100644 index 00000000..6a04e22b --- /dev/null +++ b/src/main/resources/day25.txt @@ -0,0 +1 @@ +109,4808,21101,0,3124,1,21102,1,13,0,1106,0,1424,21101,166,0,1,21102,24,1,0,1105,1,1234,21101,31,0,0,1105,1,1984,1106,0,13,6,4,3,2,52,51,21,4,28,56,55,3,19,-9,-10,47,89,88,90,90,6,77,73,85,71,1,76,68,63,65,22,-27,70,76,81,87,5,105,105,107,108,95,4,97,92,109,109,5,110,105,110,108,95,4,115,96,109,109,13,-3,59,101,85,92,97,13,84,80,92,78,34,-15,26,-16,46,88,72,79,84,0,72,76,-3,85,74,79,75,-8,64,68,75,57,65,70,64,66,72,8,-41,32,-22,56,77,82,-4,60,76,62,70,-2,74,-11,55,52,68,67,73,56,60,52,-20,44,56,66,-24,48,58,42,49,54,-16,-53,10,0,56,99,96,95,82,94,83,45,-9,23,-13,61,85,88,74,71,82,73,79,73,89,67,65,-4,62,73,70,69,56,68,57,2,-35,24,-14,64,85,90,4,70,67,79,7,83,-2,68,75,-5,78,65,57,75,-10,76,53,76,0,-37,31,-21,57,78,83,-3,64,74,72,0,76,-9,73,58,57,-13,70,57,49,67,-18,54,64,48,55,-23,48,44,56,42,-14,-51,14,-4,74,95,100,14,97,77,86,79,9,92,79,75,5,27,-17,61,82,87,1,68,78,76,4,80,-5,66,58,78,60,-10,73,60,52,70,-15,57,67,51,58,-6,-43,14,-4,74,95,100,14,81,94,90,90,9,92,79,75,5,60,-50,23,42,38,-32,38,39,30,42,47,-38,30,36,28,25,41,38,34,31,18,23,29,19,33,-52,20,29,-55,27,27,27,8,15,-61,22,16,-64,24,13,18,-54,-69,-70,-14,7,12,-74,-8,-11,1,-71,5,-80,-4,-3,3,-15,-84,-85,-109,29,-19,59,80,85,-1,82,62,71,64,-6,77,64,60,-10,62,66,57,59,63,57,67,51,-19,56,58,57,57,-10,-47,44,-34,39,58,54,-16,60,61,57,64,48,56,-23,52,40,60,38,-28,44,53,-31,55,32,55,-35,48,42,41,-39,32,38,42,-42,-44,12,33,38,-48,28,19,25,32,-52,-76,-77,59,-49,13,55,-30,42,51,-33,49,50,32,31,31,39,36,48,-42,24,35,32,34,29,21,35,19,25,37,-53,14,10,26,18,-57,-59,-3,18,23,-63,1,17,3,-67,1,-4,14,-2,6,-73,-8,14,-76,-12,-78,-40,2,4,-13,-82,-106,-107,35,-25,53,74,79,0,74,60,-10,65,53,72,64,52,56,52,50,-19,53,57,62,56,-24,58,54,38,39,40,-29,-31,2,56,35,-34,-58,-59,138,-128,-74,-108,-33,-31,-26,-44,-101,-114,-33,-37,-51,-39,-35,-47,-54,-122,-37,-45,-52,-59,-58,-128,-46,-65,-42,-49,-133,-132,-102,-60,-68,-56,-55,-139,-141,-106,-61,-65,-72,-78,-64,-148,-70,-72,-151,-68,-81,-81,-72,-156,-74,-86,-86,-80,-161,-97,-81,-95,-165,-94,-98,-103,-83,-97,-102,-90,-173,-90,-103,-111,-99,-178,-95,-108,-112,-182,-115,-115,-101,-117,-120,-104,-120,-122,-191,-106,-128,-118,-110,-127,-196,-196,-199,-135,-123,-134,-203,-115,-126,-121,-207,-143,-127,-141,-211,-143,-139,-145,-148,-132,-148,-150,-219,-154,-156,-155,-148,-224,-141,-147,-227,-144,-157,-161,-231,-165,-161,-165,-168,-161,-157,-159,-166,-162,-157,-228,-265,138,-128,-74,-108,-33,-31,-26,-44,-101,-114,-33,-37,-51,-39,-35,-47,-54,-122,-37,-45,-52,-59,-58,-128,-46,-65,-42,-49,-133,-132,-102,-60,-68,-56,-55,-139,-141,-106,-61,-65,-72,-78,-64,-148,-70,-72,-151,-68,-81,-81,-72,-156,-74,-86,-86,-80,-161,-97,-81,-95,-165,-90,-94,-97,-97,-86,-102,-90,-173,-90,-103,-111,-99,-178,-95,-108,-112,-182,-115,-115,-101,-117,-120,-104,-120,-122,-191,-106,-128,-118,-110,-127,-196,-196,-199,-135,-123,-134,-203,-115,-126,-121,-207,-143,-127,-141,-211,-143,-139,-145,-148,-132,-148,-150,-219,-154,-156,-155,-148,-224,-141,-147,-227,-144,-157,-161,-231,-165,-161,-165,-168,-161,-157,-159,-166,-162,-157,-228,-265,263,-253,-199,-233,-158,-156,-151,-169,-226,-239,-158,-162,-176,-164,-160,-172,-179,-247,-162,-170,-177,-184,-183,-253,-171,-190,-167,-174,-258,-257,-227,-183,-197,-187,-175,-182,-193,-184,-268,-202,-191,-194,-192,-197,-205,-191,-207,-276,-278,-222,-201,-196,-282,-206,-219,-196,-286,-207,-206,-210,-223,-222,-223,-225,-280,-293,-296,-232,-220,-231,-300,-212,-223,-218,-304,-236,-228,-223,-239,-227,-310,-227,-240,-244,-314,-248,-237,-250,-243,-239,-247,-237,-308,-345,-273,-260,-248,-243,-263,-329,-252,-252,-248,-260,-267,-266,-253,-337,-249,-260,-255,-259,-342,-260,-267,-280,-270,-271,-348,-281,-268,-272,-279,-285,-342,-355,-280,-278,-279,-284,-277,-361,-282,-278,-274,-275,-290,-298,-300,-369,-300,-292,-290,-373,-309,-375,-299,-298,-301,-310,-302,-297,-370,-383,-302,-316,-321,-311,-315,-299,-321,-308,-392,-306,-322,-330,-312,-397,-326,-334,-317,-401,-330,-338,-324,-325,-337,-329,-339,-341,-398,-411,-347,-335,-346,-415,-334,-352,-350,-346,-341,-338,-422,-334,-345,-340,-344,-427,-345,-357,-357,-351,-432,-365,-361,-353,-367,-370,-354,-363,-351,-427,-464,-441,-397,-373,-434,-447,-376,-380,-374,-375,-373,-452,-454,-398,-377,-372,-458,-376,-388,-382,-377,-387,-396,-465,-400,-398,-468,-404,-404,-395,-403,-473,-390,-396,-476,-406,-409,-395,-480,-408,-404,-483,-418,-396,-486,-403,-399,-409,-417,-413,-421,-493,37,-5,73,71,-8,75,62,58,-12,62,55,74,64,48,50,-19,45,63,-22,61,48,44,-26,50,37,44,48,-31,33,40,48,41,43,30,37,-25,-38,-63,0,0,109,7,21102,0,1,-2,22208,-2,-5,-1,1205,-1,1169,22202,-2,-4,1,22201,1,-6,1,22101,0,-2,2,21101,0,1162,0,2105,1,-3,21201,-2,1,-2,1106,0,1136,109,-7,2106,0,0,109,6,2101,0,-5,1181,21001,0,0,-2,21101,0,0,-3,21201,-5,1,-5,22208,-3,-2,-1,1205,-1,1229,2201,-5,-3,1205,20101,0,0,1,21202,-3,1,2,21201,-2,0,3,21102,1,1222,0,2106,0,-4,21201,-3,1,-3,1106,0,1192,109,-6,2106,0,0,109,2,22101,0,-1,1,21102,1,1256,2,21101,1251,0,0,1105,1,1174,109,-2,2105,1,0,109,5,22201,-4,-3,-1,22201,-2,-1,-1,204,-1,109,-5,2105,1,0,109,3,1201,-2,0,1280,1006,0,1303,104,45,104,32,1201,-1,66,1291,21001,0,0,1,21102,1301,1,0,1106,0,1234,104,10,109,-3,2106,0,0,0,0,109,2,2101,0,-1,1309,1102,1,0,1308,21102,4601,1,1,21101,0,13,2,21101,0,4,3,21101,0,1353,4,21101,0,1343,0,1105,1,1130,21002,1308,1,-1,109,-2,2105,1,0,69,109,3,2101,0,-2,1360,20008,0,1309,-1,1206,-1,1419,1005,1308,1398,1101,1,0,1308,21008,1309,-1,-1,1206,-1,1387,21102,106,1,1,1106,0,1391,21102,92,1,1,21101,1398,0,0,1106,0,1234,104,45,104,32,1201,-2,1,1408,20101,0,0,1,21102,1,1417,0,1105,1,1234,104,10,109,-3,2105,1,0,109,3,2101,0,-2,1128,21102,1,34,1,21102,1,1441,0,1105,1,1234,1001,1128,0,1447,20102,1,0,1,21102,1456,1,0,1106,0,1234,21102,1,41,1,21101,0,1467,0,1106,0,1234,1001,1128,1,1473,20101,0,0,1,21102,1,1482,0,1105,1,1234,21101,46,0,1,21101,0,1493,0,1106,0,1234,21001,1128,3,1,21101,0,4,2,21102,1,1,3,21101,0,1273,4,21101,1516,0,0,1105,1,1130,20102,1,1128,1,21102,1527,1,0,1106,0,1310,1001,1128,2,1532,21002,0,1,-1,1206,-1,1545,21101,0,1545,0,2106,0,-1,109,-3,2105,1,0,109,0,99,109,2,1101,0,0,1550,21102,1,4601,1,21101,13,0,2,21101,0,4,3,21101,0,1664,4,21101,1582,0,0,1106,0,1130,2,2486,1352,1551,1101,0,0,1552,20102,1,1550,1,21102,33,1,2,21102,1,1702,3,21102,1609,1,0,1105,1,2722,21007,1552,0,-1,1205,-1,1630,20107,0,1552,-1,1205,-1,1637,21102,1,1630,0,1105,1,1752,21102,1,548,1,1105,1,1641,21102,687,1,1,21102,1,1648,0,1106,0,1234,21102,4457,1,1,21101,0,1659,0,1106,0,1424,109,-2,2105,1,0,109,4,21202,-2,-1,-2,1202,-3,1,1675,21008,0,-1,-1,1206,-1,1697,1201,-3,2,1687,20101,-27,0,-3,22201,-3,-2,-3,2001,1550,-3,1550,109,-4,2106,0,0,109,5,21008,1552,0,-1,1206,-1,1747,1201,-3,1901,1716,21002,0,1,-2,1205,-4,1736,20207,-2,1551,-1,1205,-1,1747,1102,-1,1,1552,1106,0,1747,22007,1551,-2,-1,1205,-1,1747,1101,0,1,1552,109,-5,2106,0,0,109,1,21102,1,826,1,21102,1,1765,0,1106,0,1234,21001,1550,0,1,21101,1776,0,0,1105,1,2863,21101,0,1090,1,21102,1787,1,0,1105,1,1234,99,1105,1,1787,109,-1,2105,1,0,109,1,21101,0,512,1,21102,1809,1,0,1105,1,1234,99,1105,1,1809,109,-1,2105,1,0,109,1,1102,1,1,1129,109,-1,2105,1,0,109,1,21102,1,377,1,21101,0,1842,0,1105,1,1234,1106,0,1831,109,-1,2105,1,0,109,1,21101,0,407,1,21101,1863,0,0,1106,0,1234,99,1105,1,1863,109,-1,2106,0,0,109,1,21101,0,452,1,21102,1885,1,0,1106,0,1234,99,1105,1,1885,109,-1,2105,1,0,1941,1947,1953,1958,1965,1972,1978,3080,3033,2925,3168,2951,2970,2941,3583,3044,3158,3308,3354,3115,3611,2912,2916,3243,3443,3533,3336,2836,3353,2959,3277,3431,3142,3355,3272,3557,3069,3397,3052,3368,2281,2468,2418,2450,2487,2125,2505,5,95,108,104,104,23,5,96,91,108,108,1,4,101,105,112,3,6,104,104,106,107,94,-1,6,109,104,109,107,94,-1,5,111,91,100,93,23,5,114,95,108,108,1,109,3,21101,0,1993,0,1106,0,2634,1006,1129,2010,21102,1,316,1,21102,1,2007,0,1105,1,1234,1105,1,2076,21102,0,1,-1,1201,-1,1894,2020,20101,0,0,1,21101,0,0,2,21101,0,0,3,21102,2037,1,0,1106,0,2525,1206,1,2054,1201,-1,1934,2050,21101,2051,0,0,105,1,0,1105,1,2076,21201,-1,1,-1,21207,-1,7,-2,1205,-2,2014,21102,177,1,1,21101,0,2076,0,1105,1,1234,109,-3,2105,1,0,109,3,2001,1128,-2,2089,20102,1,0,-1,1205,-1,2108,21102,201,1,1,21102,2105,1,0,1105,1,1234,1105,1,2119,21202,-1,1,1,21101,0,2119,0,1106,0,1424,109,-3,2105,1,0,0,109,1,1102,0,1,2124,21101,4601,0,1,21101,13,0,2,21102,1,4,3,21102,1,2173,4,21102,1,2154,0,1105,1,1130,1005,2124,2168,21102,226,1,1,21101,0,2168,0,1106,0,1234,109,-1,2105,1,0,109,3,1005,2124,2275,1201,-2,0,2183,20008,0,1128,-1,1206,-1,2275,1201,-2,1,2195,20102,1,0,-1,22102,1,-1,1,21102,5,1,2,21102,1,1,3,21101,2216,0,0,1105,1,2525,1206,1,2275,21101,0,258,1,21101,0,2230,0,1105,1,1234,22102,1,-1,1,21101,2241,0,0,1106,0,1234,104,46,104,10,1102,1,1,2124,1201,-2,0,2256,1102,1,-1,0,1201,-2,3,2263,20101,0,0,-1,1206,-1,2275,21102,1,2275,0,2106,0,-1,109,-3,2105,1,0,0,109,1,1102,0,1,2280,21102,4601,1,1,21102,1,13,2,21101,0,4,3,21101,0,2329,4,21102,2310,1,0,1105,1,1130,1005,2280,2324,21102,273,1,1,21102,2324,1,0,1106,0,1234,109,-1,2105,1,0,109,3,1005,2280,2413,1201,-2,0,2339,21008,0,-1,-1,1206,-1,2413,1201,-2,1,2350,21002,0,1,-1,22102,1,-1,1,21101,0,5,2,21102,1,1,3,21101,2372,0,0,1106,0,2525,1206,1,2413,21101,301,0,1,21101,0,2386,0,1106,0,1234,22102,1,-1,1,21101,0,2397,0,1106,0,1234,104,46,104,10,1101,0,1,2280,1201,-2,0,2412,1002,1128,1,0,109,-3,2105,1,0,109,1,21102,-1,1,1,21101,0,2431,0,1105,1,1310,1205,1,2445,21102,133,1,1,21102,2445,1,0,1106,0,1234,109,-1,2105,1,0,109,1,21102,1,3,1,21101,2463,0,0,1106,0,2081,109,-1,2106,0,0,109,1,21101,4,0,1,21101,2481,0,0,1106,0,2081,109,-1,2106,0,0,51,109,1,21101,0,5,1,21102,1,2500,0,1105,1,2081,109,-1,2106,0,0,109,1,21101,0,6,1,21102,1,2518,0,1105,1,2081,109,-1,2106,0,0,0,0,109,5,1201,-3,0,2523,1102,1,1,2524,22102,1,-4,1,21101,0,2585,2,21101,0,2550,0,1106,0,1174,1206,-2,2576,2102,1,-4,2558,2001,0,-3,2566,101,3094,2566,2566,21008,0,-1,-1,1205,-1,2576,1101,0,0,2524,21002,2524,1,-4,109,-5,2105,1,0,109,5,22201,-4,-3,-4,22201,-4,-2,-4,21208,-4,10,-1,1206,-1,2606,21101,0,-1,-4,201,-3,2523,2615,1001,2615,3094,2615,21002,0,1,-1,22208,-4,-1,-1,1205,-1,2629,1102,1,0,2524,109,-5,2106,0,0,109,4,21102,1,3094,1,21102,1,30,2,21102,1,1,3,21101,2706,0,4,21101,2659,0,0,1106,0,1130,21102,0,1,-3,203,-2,21208,-2,10,-1,1205,-1,2701,21207,-2,0,-1,1205,-1,2663,21207,-3,29,-1,1206,-1,2663,2101,3094,-3,2693,2102,1,-2,0,21201,-3,1,-3,1105,1,2663,109,-4,2105,1,0,109,2,1202,-1,1,2715,1102,1,-1,0,109,-2,2105,1,0,0,109,5,2101,0,-2,2721,21207,-4,0,-1,1206,-1,2739,21101,0,0,-4,22101,0,-4,1,22101,0,-3,2,21102,1,1,3,21102,2758,1,0,1105,1,2763,109,-5,2105,1,0,109,6,21207,-4,1,-1,1206,-1,2786,22207,-5,-3,-1,1206,-1,2786,22102,1,-5,-5,1106,0,2858,22101,0,-5,1,21201,-4,-1,2,21202,-3,2,3,21102,1,2805,0,1106,0,2763,22102,1,1,-5,21102,1,1,-2,22207,-5,-3,-1,1206,-1,2824,21102,1,0,-2,22202,-3,-2,-3,22107,0,-4,-1,1206,-1,2850,21202,-2,1,1,21201,-4,-1,2,21101,0,2850,0,105,1,2721,21202,-3,-1,-3,22201,-5,-3,-5,109,-6,2106,0,0,109,3,21208,-2,0,-1,1205,-1,2902,21207,-2,0,-1,1205,-1,2882,1105,1,2888,104,45,21202,-2,-1,-2,22101,0,-2,1,21102,1,2899,0,1106,0,2909,1106,0,2904,104,48,109,-3,2105,1,0,109,4,21201,-3,0,1,21102,1,10,2,21101,2926,0,0,1106,0,3010,22101,0,1,-2,21201,2,0,-1,1206,-2,2948,22102,1,-2,1,21102,2948,1,0,1106,0,2909,22101,48,-1,-1,204,-1,109,-4,2106,0,0,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824,2147483648,4294967296,8589934592,17179869184,34359738368,68719476736,137438953472,274877906944,549755813888,1099511627776,2199023255552,4398046511104,8796093022208,17592186044416,35184372088832,70368744177664,140737488355328,281474976710656,562949953421312,1125899906842624,109,8,21102,0,1,-4,21102,1,0,-3,21101,0,51,-2,21201,-2,-1,-2,1201,-2,2959,3033,21001,0,0,-1,21202,-3,2,-3,22207,-7,-1,-5,1205,-5,3059,21201,-3,1,-3,22102,-1,-1,-5,22201,-7,-5,-7,22207,-3,-6,-5,1205,-5,3078,22102,-1,-6,-5,22201,-3,-5,-3,22201,-1,-4,-4,1205,-2,3024,21201,-4,0,-7,22102,1,-3,-6,109,-8,2105,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3131,3143,0,0,0,0,3252,11,61,105,95,94,17,50,97,83,78,79,83,108,-19,2,7,-79,-9,-2,2,-83,-11,-7,-86,-3,-16,-7,-11,-6,-21,-21,-94,-30,-96,-25,-19,-23,-31,-101,-29,-25,-104,-21,-34,-38,-108,-39,-34,-32,-33,-31,-114,-43,-47,-35,-49,-105,-120,-69,-43,-123,-49,-56,-57,-47,-128,-40,-51,-46,-50,-133,-51,-63,-63,-57,-138,-69,-58,-62,-65,-143,-79,-69,-63,-68,-148,-79,-68,-82,-83,-63,-81,-77,-85,-145,-158,-75,-88,-92,-162,-91,-85,-89,-97,-167,-96,-104,-87,-171,-106,-104,-105,-97,-176,-94,-109,-114,-104,-112,-114,-169,3259,3267,0,0,3124,0,3302,7,76,108,88,88,97,89,102,34,48,66,69,73,62,62,61,73,3,72,61,77,55,53,-2,-17,34,53,49,68,-15,59,45,-25,39,49,48,-29,39,46,48,51,55,-21,3309,3321,0,0,3252,3583,3382,11,68,86,102,87,99,102,80,98,92,94,100,60,24,43,39,51,37,-33,31,47,33,-37,27,-39,30,28,45,-43,40,24,30,22,35,18,29,29,17,30,-27,-55,28,15,11,30,-53,21,7,-63,1,11,10,-67,-2,10,6,13,-3,-5,-74,-7,3,10,0,-67,-80,3,-10,-4,1,-14,-14,-73,3389,3403,0,0,3302,3852,3439,13,54,100,86,103,15,63,98,77,93,94,78,90,90,35,49,68,64,-6,59,61,59,73,-11,53,69,55,-15,49,59,58,-19,64,58,57,-23,59,52,39,49,48,-29,40,48,50,-33,55,44,49,-23,3446,3455,0,0,3382,3528,3780,8,75,96,89,96,20,53,83,106,72,11,44,38,37,35,37,38,36,-48,17,29,33,20,-53,-4,14,12,-44,-12,20,23,8,6,-63,-14,4,7,11,0,0,-1,11,-72,4,-5,-7,-3,-10,-5,-1,-11,-81,-17,-5,-16,-85,-4,-18,-17,-4,-14,-26,-10,-93,-12,-26,-23,-19,-30,-30,-31,-19,-102,-26,-35,-37,-33,-40,-35,-31,-41,-97,3535,3542,0,3439,0,0,4064,6,59,107,91,88,90,90,40,38,70,68,58,-12,66,56,-15,68,55,51,-19,47,44,44,50,54,44,58,56,-28,54,39,38,45,-33,50,44,-36,35,27,47,29,-41,38,36,43,24,36,-33,3590,3598,0,3302,3916,3625,0,7,68,97,107,89,93,89,97,26,43,91,73,85,91,85,72,72,76,68,3,78,-6,63,74,60,59,79,57,0,54,67,57,52,50,-5,3632,3643,0,3583,0,3721,3989,10,68,86,106,92,89,82,100,88,93,91,77,6,38,18,36,36,33,-25,-52,-2,30,27,9,21,10,10,8,-47,-62,-15,12,4,-1,16,1,-69,13,14,8,7,2,14,-76,0,-9,-14,3,4,0,-14,-7,-16,-8,-3,-5,-89,-20,-9,-13,-16,-94,-25,-23,-27,-14,-10,-100,-18,-18,-38,-22,-22,-106,-23,-29,-109,-28,-42,-45,-48,-38,-42,-50,-35,-53,-35,-51,-107,3728,3751,0,3625,0,0,0,22,50,88,92,7,41,77,83,70,81,77,65,83,67,-3,34,74,79,71,76,56,63,67,28,55,82,79,70,72,78,85,9,-4,68,78,0,75,-9,73,73,61,63,62,-15,71,62,64,56,53,57,49,-9,3787,3796,0,0,3439,0,0,8,72,88,105,104,85,90,87,100,55,29,48,44,63,-20,54,40,-30,34,-32,43,39,49,48,39,31,-39,44,46,31,40,40,44,-46,18,30,19,-50,32,32,12,28,29,17,21,13,-59,24,18,-62,13,15,14,9,-67,-3,7,6,-71,-7,3,-1,0,-7,-63,3859,3867,0,3382,0,0,0,7,76,108,102,104,86,91,88,48,36,55,51,-19,46,58,66,46,59,-25,48,58,55,55,-30,36,47,45,50,30,37,41,-38,38,39,41,27,-43,22,34,42,22,35,-35,-50,-51,-2,16,13,30,26,26,15,27,9,15,27,-49,3923,3932,0,4200,4129,0,3583,8,64,102,98,100,88,88,85,92,56,27,54,51,42,51,49,39,-31,51,36,35,42,47,-37,46,40,-40,31,23,43,25,-45,30,22,22,35,-50,22,32,-53,25,23,-56,27,14,10,-60,-22,11,2,14,19,-66,-28,14,4,-2,-71,11,-4,10,9,-3,1,-7,-65,3996,4008,0,0,3625,0,0,11,72,87,92,87,95,83,84,14,57,77,77,55,34,55,60,-26,56,41,40,-30,38,54,40,34,34,42,30,31,-39,32,28,40,26,-44,34,24,-47,32,33,29,33,27,31,35,25,13,-57,22,20,16,28,15,6,18,-65,2,2,15,4,1,7,-72,14,5,7,-1,-63,4071,4094,0,0,3528,0,0,22,65,74,90,87,6,41,86,76,88,70,0,44,63,70,74,79,63,71,57,69,57,58,34,39,81,-4,60,74,73,61,56,72,72,-12,71,65,-15,50,52,-18,68,59,61,53,50,54,46,-26,51,51,53,47,34,44,43,55,-21,4136,4148,0,4388,0,4292,3916,11,58,98,90,91,95,85,84,96,86,90,82,51,38,59,64,-22,60,45,44,-26,38,-28,58,42,42,52,36,32,44,29,45,30,-39,47,32,42,29,-44,35,30,18,30,34,-50,19,27,29,-54,-4,24,25,15,19,11,7,20,16,9,3,-66,19,-50,-55,4207,4215,0,0,0,3916,0,7,65,89,99,98,108,85,108,76,8,27,27,36,-48,16,32,18,13,-53,18,10,27,-57,8,10,9,17,-62,16,16,19,7,10,5,21,-1,-3,-72,-3,5,7,-76,6,1,-2,-11,3,-10,-10,-6,-14,-59,-87,1,-10,-5,-84,-10,-24,-94,-21,-11,-14,-14,-99,-22,-22,-18,-103,-23,-20,-33,-23,-39,-109,-27,-26,-30,-44,-114,-28,-44,-52,-34,-105,4299,4308,0,4129,0,0,0,8,59,102,104,103,93,87,97,99,79,5,24,20,-50,26,17,31,11,21,-56,30,7,17,16,22,-62,2,14,3,-66,17,4,0,-70,6,-3,11,-9,1,-76,-7,-2,0,-1,1,-82,-18,-2,-16,-86,-4,-12,-16,-19,-19,-8,-17,-5,-95,-28,-24,-28,-29,-31,-19,-33,-25,-20,-105,-39,-28,-32,-30,-28,-28,-98,-113,-67,-33,-116,-52,-36,-50,-120,-37,-50,-54,-35,-94,4395,4416,0,0,4457,4129,0,20,51,84,80,93,8,62,88,70,84,83,75,79,71,-1,33,66,74,79,63,75,40,32,70,77,-11,57,63,69,54,-16,51,61,-19,69,58,63,-23,63,57,39,53,-28,51,52,38,51,36,44,49,47,-37,41,39,-40,43,30,26,-44,26,33,-16,4464,4484,0,4556,0,0,4388,19,64,81,78,95,91,81,91,95,5,39,75,71,68,75,79,77,70,74,79,71,2,38,-41,42,29,25,-45,32,22,40,35,-50,31,27,26,23,-43,-56,8,-58,21,22,8,21,20,21,17,3,-54,15,0,8,12,1,11,-1,11,-7,-77,-8,-3,-1,-2,0,-83,3,-12,-10,-11,-88,-3,-21,-9,-19,-23,-5,-95,-7,-18,-13,-17,-100,-28,-34,-34,-26,-21,-33,-23,-19,-95,4563,4588,1553,0,0,4457,0,24,56,89,75,88,87,88,84,70,13,50,67,75,79,68,78,66,78,60,-10,27,64,66,65,67,12,53,97,83,93,105,105,87,91,83,25,24,23,4292,4653,27,1850,3989,4665,28,1829,3382,4679,16413,0,3439,4691,46,0,4064,4703,536870943,0,4200,4719,32,1796,3252,4730,33554465,0,3583,4744,34,1818,3302,4764,524323,0,3916,4774,292,0,4129,4779,37,1872,3721,4787,102,0,3780,4795,41,0,11,98,99,95,102,86,94,15,90,78,98,76,13,92,96,87,89,93,87,97,81,11,86,88,87,87,11,91,99,98,86,17,98,80,98,86,91,89,11,91,93,107,87,85,16,95,93,86,90,95,15,104,85,80,98,85,81,93,10,86,73,74,78,78,82,72,10,91,104,87,84,98,86,16,95,93,81,13,102,87,94,89,82,93,91,80,96,77,93,87,89,19,84,85,76,88,93,8,76,82,74,71,87,84,80,77,64,69,75,65,79,9,103,98,86,98,88,102,96,89,83,4,95,106,99,103,7,105,96,102,106,100,98,102,7,105,103,96,100,105,89,101,12,95,95,87,90,94,15,80,92,96,95,86,78 \ No newline at end of file From 7ad6781aaadbb4f48e165791285cad9a65b9b969 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 25 Dec 2019 07:03:42 +0100 Subject: [PATCH 134/433] Auto solver for Day 25 --- .../sbaars/adventofcode2019/days/Day25.java | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day25.java b/src/main/java/com/sbaars/adventofcode2019/days/Day25.java index 6865da8d..5eb7e1dd 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day25.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day25.java @@ -11,26 +11,42 @@ public class Day25 implements Day { public static void main(String[] args) throws IOException { - new Day25().printParts(); + new Day25().play(); } - @Override - public Object part1() throws IOException { + private void play() throws IOException { IntcodeComputer ic = new IntcodeComputer(RetentionPolicy.EXIT_ON_EMPTY_INPUT, readLongArray(25)); while(true) { long res; while((res = ic.run()) != IntcodeComputer.STOP_CODE) { System.out.print((char)res); } - BufferedReader reader = - new BufferedReader(new InputStreamReader(System.in)); + BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String name = reader.readLine(); ic.setInput(name+"\n"); } } + + @Override + public Object part1() throws IOException { + IntcodeComputer ic = new IntcodeComputer(RetentionPolicy.EXIT_ON_EMPTY_INPUT, readLongArray(25)); + String[] inputs = new String [] {"west", "take semiconductor", "west", "take planetoid", "west", "take food ration", "west", "take fixed point", "east", "east", "south", "east", "east", "north", "east", "north"}; + String numbers = ""; + for(int i = 0; i<=inputs.length; i++) { + long res; + while((res = ic.run()) != IntcodeComputer.STOP_CODE) { + //System.out.print((char)res); + if(Character.isDigit((char)res)) numbers += (char)res; + } + if(i == inputs.length) + return numbers.substring(1); + ic.setInput(inputs[i]+"\n"); + } + return 0; + } @Override public Object part2() throws IOException { - return new IntcodeComputer(9, 2).run(); + return "MERRY CHRISTMAS!!"; } } From 304d3ad175c6f93d6d6f33cd411fa93b6e42abbe Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 25 Dec 2019 07:11:22 +0100 Subject: [PATCH 135/433] Update README --- README.md | 15 +++++++++++++++ .../java/com/sbaars/adventofcode2019/Main.java | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fad0840a..0452f35c 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,9 @@ Days: - [Day 20](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day20.java) - [Day 21](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day21.java) - [Day 22](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day22.java) +- [Day 23](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day23.java) +- [Day 24](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day24.java) +- [Day 25](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/days/Day25.java) Output of running [Main.java](https://github.com/SimonBaars/adventOfCode-2019/blob/master/src/main/java/com/sbaars/adventofcode2019/Main.java): ``` @@ -126,4 +129,16 @@ Part 2: 1142488337 Day 22: Part 1: 7860 Part 2: 61256063148970 + +Day 23: +Part 1: 17286 +Part 2: 11249 + +Day 24: +Part 1: 32506911 +Part 2: 2025 + +Day 25: +Part 1: 34095120 +Part 2: MERRY CHRISTMAS!! ``` \ No newline at end of file diff --git a/src/main/java/com/sbaars/adventofcode2019/Main.java b/src/main/java/com/sbaars/adventofcode2019/Main.java index 221e5163..2748a487 100644 --- a/src/main/java/com/sbaars/adventofcode2019/Main.java +++ b/src/main/java/com/sbaars/adventofcode2019/Main.java @@ -7,7 +7,7 @@ public class Main { public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException, InvocationTargetException, NoSuchMethodException { - for(int day = 1; day<=22; day++) { + for(int day = 1; day<=25; day++) { System.out.println("Day "+day+":"); Day instance = (Day)Class.forName("com.sbaars.adventofcode2019.days.Day"+day).getDeclaredConstructor().newInstance(); instance.printParts(); From 0d7b48795ee181d0fc639250b60986842088684f Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 25 Dec 2019 08:14:11 +0100 Subject: [PATCH 136/433] Formatting --- .../sbaars/adventofcode2019/days/Day1.java | 16 ++-- .../sbaars/adventofcode2019/days/Day10.java | 21 +++-- .../sbaars/adventofcode2019/days/Day11.java | 4 +- .../sbaars/adventofcode2019/days/Day12.java | 30 ++++---- .../sbaars/adventofcode2019/days/Day13.java | 2 +- .../sbaars/adventofcode2019/days/Day14.java | 24 +++--- .../sbaars/adventofcode2019/days/Day15.java | 8 +- .../sbaars/adventofcode2019/days/Day16.java | 4 +- .../sbaars/adventofcode2019/days/Day18.java | 20 ++--- .../sbaars/adventofcode2019/days/Day19.java | 2 +- .../sbaars/adventofcode2019/days/Day20.java | 20 ++--- .../sbaars/adventofcode2019/days/Day21.java | 2 +- .../sbaars/adventofcode2019/days/Day22.java | 76 +++++++++---------- .../sbaars/adventofcode2019/days/Day23.java | 4 +- .../sbaars/adventofcode2019/days/Day24.java | 28 +++---- .../sbaars/adventofcode2019/days/Day25.java | 3 +- .../sbaars/adventofcode2019/days/Day3.java | 32 ++++---- .../sbaars/adventofcode2019/days/Day4.java | 40 +++++----- .../sbaars/adventofcode2019/days/Day5.java | 6 +- .../sbaars/adventofcode2019/days/Day6.java | 72 +++++++++--------- .../sbaars/adventofcode2019/days/Day8.java | 4 +- .../sbaars/adventofcode2019/days/Day9.java | 2 +- 22 files changed, 209 insertions(+), 211 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day1.java b/src/main/java/com/sbaars/adventofcode2019/days/Day1.java index 2aede117..a8e5fb9c 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day1.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day1.java @@ -8,17 +8,17 @@ public class Day1 implements Day { - public static void main(String[] args) throws IOException - { - new Day1().printParts(); - } + public static void main(String[] args) throws IOException + { + new Day1().printParts(); + } - @Override + @Override public Object part1() throws IOException { return createNumberStream().map(this::getFuel).sum(); } - - @Override + + @Override public Object part2() throws IOException { return createNumberStream().map(this::getRequiredFuel).sum(); } @@ -26,7 +26,7 @@ public Object part2() throws IOException { private IntStream createNumberStream() throws IOException { return Arrays.stream(readDay(1).split(System.lineSeparator())).mapToInt(Integer::parseInt); } - + private int getRequiredFuel(int mass) { int fuel = getFuel(mass); return fuel>0 ? fuel+getRequiredFuel(fuel) : 0; diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day10.java b/src/main/java/com/sbaars/adventofcode2019/days/Day10.java index 226b165c..85edd36e 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day10.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day10.java @@ -13,10 +13,9 @@ import lombok.EqualsAndHashCode; public class Day10 implements Day { - private final List asteroids; private Point baseLocation; - + public Day10() throws IOException { String[] mapString = Arrays.stream(readDay(10).split(System.lineSeparator())).toArray(String[]::new); this.asteroids = IntStream.range(0, mapString.length).boxed().flatMap(i -> IntStream.range(0, mapString[i].length()).mapToObj(j -> new Point(j, i))).filter(p -> mapString[p.y].charAt(p.x) == '#').collect(Collectors.toList()); @@ -33,7 +32,7 @@ public Object part1() throws IOException { baseLocation = asteroids.get(IntStream.range(0, nVisible.length).reduce((i, j) -> nVisible[i] > nVisible[j] ? i : j).getAsInt()); return Arrays.stream(nVisible).max().getAsLong(); } - + @Override public Object part2() throws IOException { List asteroidList = asteroids.stream().map(e -> new Asteroid(baseLocation, e)).collect(Collectors.toList()); @@ -49,30 +48,30 @@ public Object part2() throws IOException { } return prevDestroyed.position.x*100+prevDestroyed.position.y; } - + private long countNVisible(Point asteroid) { return asteroids.stream().map(e -> new Asteroid(asteroid, e)).mapToDouble(e -> e.rotation).distinct().count(); } - + @EqualsAndHashCode class Asteroid { @EqualsAndHashCode.Exclude double rotation; @EqualsAndHashCode.Exclude double distance; Point position; - + public Asteroid(Point center, Point me) { this.rotation = calcRotationAngleInDegrees(center, me); this.distance = me.distance(center); this.position = me; } - + public Asteroid() { this.rotation = Double.MIN_VALUE; } - + private double calcRotationAngleInDegrees(Point centerPt, Point targetPt) { - double theta = Math.atan2(targetPt.y - centerPt.y, targetPt.x - centerPt.x) + Math.PI/2.0; - double angle = Math.toDegrees(theta); - return angle < 0 ? angle + 360 : angle; + double theta = Math.atan2(targetPt.y - centerPt.y, targetPt.x - centerPt.x) + Math.PI/2.0; + double angle = Math.toDegrees(theta); + return angle < 0 ? angle + 360 : angle; } } } diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day11.java b/src/main/java/com/sbaars/adventofcode2019/days/Day11.java index 934b1201..e9802826 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day11.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day11.java @@ -41,13 +41,13 @@ private Object robotWalk(boolean startWhite) throws IOException { } else if(paintColor == 0L) { whitePlaces.remove(currentLocation); } - + dir = dir.turn(turn == 1L); currentLocation = dir.move(currentLocation); } return startWhite ? constructImage(whitePlaces) : paintedOnce.size(); } - + private String constructImage(Set whitePlaces) { int cornerX = whitePlaces.stream().mapToInt(e -> e.x).min().getAsInt(); int cornerY = whitePlaces.stream().mapToInt(e -> e.y).min().getAsInt(); diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day12.java b/src/main/java/com/sbaars/adventofcode2019/days/Day12.java index 2d269051..783ef998 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day12.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day12.java @@ -36,7 +36,7 @@ public Object part2() throws IOException { for(long n = 0; true; n++) { determineVelocity(); moveMoonsUsingVelocity(); - + for(int i = 0; i 0) { - long temp = b; - b = a % b; // % is remainder - a = temp; - } - return a; + while (b > 0) { + long temp = b; + b = a % b; // % is remainder + a = temp; + } + return a; } - + private static long lcm(long a, long b) { - return a * (b / gcd(a, b)); + return a * (b / gcd(a, b)); } private static long lcm(long[] input) { - long result = input[0]; - for(int i = 1; i < input.length; i++) result = lcm(result, input[i]); - return result; + long result = input[0]; + for(int i = 1; i < input.length; i++) result = lcm(result, input[i]); + return result; } - + short[][] copy(short[][] arr){ short [][] myInt = new short[arr.length][]; for(int i = 0; i < arr.length; i++) - myInt[i] = arr[i].clone(); + myInt[i] = arr[i].clone(); return myInt; } } diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day13.java b/src/main/java/com/sbaars/adventofcode2019/days/Day13.java index dc288e2b..0fba65f3 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day13.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day13.java @@ -28,7 +28,7 @@ public Object part1() throws IOException { n.add(new Point(Math.toIntExact(x), Math.toIntExact(y))); } } - + @Override public Object part2() throws IOException { IntcodeComputer cp = new IntcodeComputer(13, 1); diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day14.java b/src/main/java/com/sbaars/adventofcode2019/days/Day14.java index 5ededc12..c13f6b23 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day14.java @@ -8,11 +8,11 @@ public class Day14 implements Day { private Trade[] trades; - + public Day14() throws IOException { this.trades = Arrays.stream(readDay(14).split(System.lineSeparator())).map(Trade::new).toArray(Trade[]::new); } - + public static void main(String[] args) throws IOException { new Day14().printParts(); } @@ -35,7 +35,7 @@ else if(buyingItem.amount <= leftOver.get(buyingItem.item)) { } buyingItem.amount-=leftOver.get(buyingItem.item); leftOver.put(buyingItem.item, 0L); - + return performTrade(buyingItem, leftOver); } @@ -48,7 +48,7 @@ private long performTrade(Item buyingItem, LongCountMap leftOver) { leftOver.increment(buyingItem.item, fuelTrade.output.amount * timesApplied - buyingItem.amount); return totalCost; } - + @Override public Object part2() throws IOException { long oreLeft = 1000000000000L; @@ -56,28 +56,28 @@ public Object part2() throws IOException { while(true) { long cost = findCost(new Item(fuel + 1, "FUEL"), new LongCountMap<>()); if (cost > oreLeft) { - return fuel; - } else { - fuel = Math.max(fuel + 1, (fuel + 1) * oreLeft / cost); - } + return fuel; + } else { + fuel = Math.max(fuel + 1, (fuel + 1) * oreLeft / cost); + } } } - + class Trade { private final Item[] input; private final Item output; - + public Trade(String trade) { String[] inputOutput = trade.split(" => "); input = Arrays.stream(inputOutput[0].split(", ")).map(Item::new).toArray(Item[]::new); output = new Item(inputOutput[1]); } } - + class Item { private long amount; private final String item; - + public Item(String item) { String[] i = item.split(" "); amount = Integer.parseInt(i[0]); diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day15.java b/src/main/java/com/sbaars/adventofcode2019/days/Day15.java index 4e3c10ed..55c392b4 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day15.java @@ -12,7 +12,7 @@ import com.sbaars.adventofcode2019.pathfinding.Grid2d; public class Day15 implements Day { - + public static final int UNEXPLORED = 3; public static final int WALL = 0; private static final int PATH = 1; @@ -40,7 +40,7 @@ public Object part1() throws IOException { } } } - + private Point moveToUnexploredPlace(Point pos, IntcodeComputer ic) { List corridorSpaces = findPos(PATH); for(Point p : corridorSpaces) { @@ -53,7 +53,7 @@ private Point moveToUnexploredPlace(Point pos, IntcodeComputer ic) { } return null; } - + private void traverseRoute(IntcodeComputer ic, Point pos, List route) { for(Point p : route) { if(ic.run(Direction.getByMove(pos, p).num)!=1L) @@ -90,7 +90,7 @@ private void explore(Point pos, IntcodeComputer ic) { dir = dir.turn(true); } } - + @Override public Object part2() throws IOException { Point oxygenLeak = findPos(FINISH).get(0); diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day16.java b/src/main/java/com/sbaars/adventofcode2019/days/Day16.java index f2023f91..43f4782a 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day16.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day16.java @@ -11,7 +11,7 @@ public class Day16 implements Day { private static final int TARGET_POS = 5977341; private final int[] input; - + public Day16() throws IOException { input = readDay(16).chars().map(e -> Character.getNumericValue(e)).toArray(); } @@ -42,7 +42,7 @@ private Object calcRes(int[] nums, final int offset) { for(int i = 0; i= res.length) break; diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day18.java b/src/main/java/com/sbaars/adventofcode2019/days/Day18.java index 34bd42a9..ee40b6cb 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day18.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day18.java @@ -17,7 +17,7 @@ import lombok.*; public class Day18 implements Day { - + private final char[][] grid; private final CharGrid2d charGrid; private final Map cachedResult = new HashMap<>(); @@ -27,7 +27,7 @@ public class Day18 implements Day { {'@', '#', '@'} }; private final Point middle; - + public Day18() throws IOException { grid = Arrays.stream(readDay(18).split(System.lineSeparator())).map(e -> e.toCharArray()).toArray(char[][]::new); charGrid = new CharGrid2d(grid, false); @@ -37,12 +37,12 @@ public Day18() throws IOException { public static void main(String[] args) throws IOException { new Day18().printParts(); } - + @Data @AllArgsConstructor class Route { Point start; Point end; } - + @Data @AllArgsConstructor class State{ List me; TreeSet keys; @@ -69,14 +69,14 @@ private Object findRoutes(List me) { } return findSteps(me, new TreeSet<>(), keys, routes); } - + public List getRoute(Map> routes, Point p1, Point p2){ List p = routes.get(new Route(p1, p2)); if(p != null) return p; else return routes.get(new Route(p2, p1)); } - + public boolean canTakeRoute(List route, TreeSet keys) { for(Point p : route) { if(grid[p.y][p.x]>='A' && grid[p.y][p.x]<='Z' && !keys.contains(grid[p.y][p.x])) { @@ -85,7 +85,7 @@ public boolean canTakeRoute(List route, TreeSet keys) { } return true; } - + public int findSteps(List me, TreeSet collectedKeys, List keys, Map> routes) { Integer cachedRes = cachedResult.get(new State(me, collectedKeys)); if(cachedRes!=null) return cachedRes; @@ -107,7 +107,7 @@ public int findSteps(List me, TreeSet collectedKeys, List findPos(char tile) { List positions = new ArrayList<>(); for(int y = 0; y findPos(char tile) { } return positions; } - + private List findPos(char tile, char tile2) { List positions = new ArrayList<>(); for(int y = 0; y findPos(char tile, char tile2) { } return positions; } - + @Override public Object part2() throws IOException { for(int y = 0; y portalsToTake = new ArrayList<>(); private Portal entry; private Portal exit; - + @Data @AllArgsConstructor class Portal { Point pos; boolean isOuter; } - + @Data @AllArgsConstructor class Route { Portal goal; int distance; } - + @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) @AllArgsConstructor class State extends Visited { int totalSteps; - + public State(int totalSteps, Visited vis) { super(vis.pos, vis.level); this.totalSteps = totalSteps; } } - + @Data @AllArgsConstructor @NoArgsConstructor class Visited { Portal pos; int level; } - + public Day20() throws IOException { grid = Arrays.stream(readDay(20).split(System.lineSeparator())).map(e -> e.toCharArray()).toArray(char[][]::new); charGrid = new CharGrid2d(grid, false); - + int[] rows = {2, 26, 80, 104}; for(int row : rows) { boolean addPortal = row == rows[0] || row == rows[rows.length-1]; @@ -87,7 +87,7 @@ public Day20() throws IOException { portalsToTake.addAll(portalLabel.keySet()); portalsToTake.add(exit); } - + public void addPortal(String label, Point pos, boolean outerRing) { Portal p = new Portal(pos, outerRing); if(label.equals("AA")) this.entry = p; @@ -99,7 +99,7 @@ public void addPortal(String label, Point pos, boolean outerRing) { } else portal[1] = p; portalLabel.put(p, label); } - + } public static void main(String[] args) throws IOException { @@ -110,7 +110,7 @@ public static void main(String[] args) throws IOException { public Object part1() throws IOException { return findRoutes(false); } - + private int findRoutes(boolean b) { final Queue queue = new ArrayDeque<>(); final Set visited = new HashSet<>(); diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day21.java b/src/main/java/com/sbaars/adventofcode2019/days/Day21.java index 9b1a3a73..1736d343 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day21.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day21.java @@ -27,7 +27,7 @@ public Object part1() throws IOException { if(res>255) return res; return 0; } - + @Override public Object part2() throws IOException { IntcodeComputer ic = new IntcodeComputer(21); diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day22.java b/src/main/java/com/sbaars/adventofcode2019/days/Day22.java index f174ed4f..61a46b2a 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day22.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day22.java @@ -16,33 +16,33 @@ import lombok.Value; public class Day22 implements Day { - + Move[] moves; public Day22() throws IOException { this.moves = Arrays.stream(readDay(22).split(System.lineSeparator())).map(Move::new).toArray(Move[]::new); } - + public static void main(String[] args) throws IOException { new Day22().printParts(); } - + @AllArgsConstructor enum Action { DEAL_WITH_INCREMENT("deal with increment "), DEAL_NEW_STACK("deal into new stack"), CUT("cut "); - + String name; - + public static Action actionByText(String text) { return Arrays.stream(values()).filter(a -> text.startsWith(a.name)).findAny().get(); } } - + @Value @Data class Move { Action action; int amount; - + public Move(String s) { this.action = Action.actionByText(s); s = s.replace(action.name, ""); @@ -52,51 +52,51 @@ public Move(String s) { public List execute(List cards) { switch(action) { - case DEAL_NEW_STACK: Collections.reverse(cards); break; - case CUT: { - int n = amount > 0 ? amount : cards.size()+amount; - List sub = new ArrayList<>(cards.subList(n, cards.size())); - sub.addAll(cards.subList(0, n)); - return sub; - } - case DEAL_WITH_INCREMENT: { - Integer[] deck = new Integer[cards.size()] ; - for(int i = 0, card = 0; i 0 ? amount : cards.size()+amount; + List sub = new ArrayList<>(cards.subList(n, cards.size())); + sub.addAll(cards.subList(0, n)); + return sub; + } + case DEAL_WITH_INCREMENT: { + Integer[] deck = new Integer[cards.size()] ; + for(int i = 0, card = 0; i cards = IntStream.range(0, 10007).boxed().collect(Collectors.toList()); for(Move move : moves) cards = move.execute(cards); return cards.indexOf(2019); } - + @Override public Object part2() throws IOException { return seekPosition(num(119315717514047L), num(101741582076661L), 2020); @@ -111,12 +111,12 @@ private BigInteger seekPosition(BigInteger deckSize, BigInteger timesShuffled, i var pow = calc[0].modPow(timesShuffled, deckSize); return pow.multiply(num(position)).add(calc[1].multiply(pow.add(deckSize).subtract(num(1))).multiply(calc[0].subtract(num(1)).modPow(deckSize.subtract(num(2)), deckSize))).mod(deckSize); } - + private T[] reverseArray(T[] arr) { for(int i = 0; i < arr.length / 2; i++) { - T temp = arr[i]; - arr[i] = arr[arr.length - i - 1]; - arr[arr.length - i - 1] = temp; + T temp = arr[i]; + arr[i] = arr[arr.length - i - 1]; + arr[arr.length - i - 1] = temp; } return arr; } diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day23.java b/src/main/java/com/sbaars/adventofcode2019/days/Day23.java index db2f43c2..65ff7fe5 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day23.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day23.java @@ -17,7 +17,7 @@ public static void main(String[] args) throws IOException { public Object part1() throws IOException { return getNetworkNumber(true); } - + @Override public Object part2() throws IOException { return getNetworkNumber(false); @@ -28,7 +28,7 @@ private long getNetworkNumber(boolean returnNatY) throws IOException { IntcodeComputer[] ic = IntStream.range(0, 50).mapToObj(i -> new IntcodeComputer(RetentionPolicy.EXIT_ON_EMPTY_INPUT, program, i, -1)).toArray(IntcodeComputer[]::new); long[] nat = new long[2]; long sentByNat = -1; - + long input; while(true) { boolean idle = true; diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day24.java b/src/main/java/com/sbaars/adventofcode2019/days/Day24.java index 2cd7c598..d0838db5 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day24.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day24.java @@ -20,15 +20,15 @@ import lombok.EqualsAndHashCode; public class Day24 implements Day { - + private final Set grids = new HashSet<>(); private Map layers = new HashMap<>(); private final char[][] initialGrid; - + @EqualsAndHashCode @AllArgsConstructor @Data class Grid{ char[][] grid; } - + public Day24() throws IOException { this.initialGrid = Arrays.stream(readDay(24).split(System.lineSeparator())).map(e -> e.toCharArray()).toArray(char[][]::new); } @@ -57,7 +57,7 @@ private void simulate(char[][] grid, char[][] newGrid, Point p) { set(newGrid, p, '#'); } } - + private long calcRes(char[][] grid) { return (long)streamGrid(grid).filter(p -> get(grid, p) == '#').mapToDouble(p -> Math.pow(2, (p.y*grid.length)+p.x)).sum(); } @@ -67,11 +67,11 @@ public char[][] copy(char[][] grid){ for(int i = 0; i=grid.length || p.y>=grid.length) return 0; return get(grid, p) == '#' ? 1 : 0; @@ -94,15 +94,15 @@ public Object part2() throws IOException { } return layers.values().stream().mapToLong(e -> count(e, '#')).sum(); } - + public Stream streamGrid(int sizex, int sizey) { return IntStream.range(0, sizey).boxed().flatMap(y -> IntStream.range(0, sizex).mapToObj(x -> new Point(x,y))); } - + public Stream streamGrid(char[][] grid) { return streamGrid(grid[0].length, grid.length); } - + private long count(char[][] grid, char c) { return streamGrid(grid).filter(p -> get(grid, p) == '#').count(); } @@ -115,15 +115,15 @@ private void simulate(int layer, char[][] newGrid, Point p) { set(newGrid, p, '#'); } } - + private char get(char[][] grid, Point pos) { return grid[pos.y][pos.x]; } - + private void set(char[][] grid, Point pos, char c) { grid[pos.y][pos.x] = c; } - + private int nAdjecent(int layer, Point pos) { int res = 0; Point[] surround = new Point[] {new Point(2, 1), new Point(1, 2), new Point(2, 3), new Point(3, 2)}; @@ -137,11 +137,11 @@ private int nAdjecent(int layer, Point pos) { } return res + nAdjecent(layers.get(layer), pos); } - + public int nLayer(int layer, Function f) { return IntStream.range(0,5).map(i -> num(layers.get(layer-1), f.apply(i))).sum(); } - + public char[][] fill(char[][] arr, char el) { streamGrid(arr).forEach(p -> set(arr, p, el)); return arr; diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day25.java b/src/main/java/com/sbaars/adventofcode2019/days/Day25.java index 5eb7e1dd..b11c77e1 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day25.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day25.java @@ -35,7 +35,6 @@ public Object part1() throws IOException { for(int i = 0; i<=inputs.length; i++) { long res; while((res = ic.run()) != IntcodeComputer.STOP_CODE) { - //System.out.print((char)res); if(Character.isDigit((char)res)) numbers += (char)res; } if(i == inputs.length) @@ -44,7 +43,7 @@ public Object part1() throws IOException { } return 0; } - + @Override public Object part2() throws IOException { return "MERRY CHRISTMAS!!"; diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day3.java b/src/main/java/com/sbaars/adventofcode2019/days/Day3.java index 27b93927..90856b60 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day3.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day3.java @@ -14,7 +14,7 @@ public class Day3 implements Day { private Set intersect; - + public Day3() throws IOException { String[] strings = Arrays.stream(readDay(3).split(System.lineSeparator())).toArray(String[]::new); Walk[] walks1 = mapToWalks(strings[0]), walks2 = mapToWalks(strings[1]); @@ -22,16 +22,16 @@ public Day3() throws IOException { calculateDistance(walks1, walkedLocations, false); this.intersect = calculateDistance(walks2, walkedLocations, true); } - + public static void main(String[] args) throws IOException { - new Day3().printParts(); - } + new Day3().printParts(); + } @Override public Object part1() throws IOException { return intersect.stream().mapToInt(e -> distance(e.point)).min().orElse(Integer.MAX_VALUE); } - + @Override public Object part2() throws IOException { return intersect.stream().mapToInt(e -> e.steps).min().orElse(Integer.MAX_VALUE); @@ -43,10 +43,10 @@ private Set calculateDistance(Walk[] walks1, Set walkedLocations, bo for(Walk walk : walks1) { for(;walk.distance>0;walk.distance--) { switch(walk.dir) { - case NORTH: y++; break; - case SOUTH: y--; break; - case WEST: x--; break; - case EAST: x++; break; + case NORTH: y++; break; + case SOUTH: y--; break; + case WEST: x--; break; + case EAST: x++; break; } performStep(walkedLocations, collect, intersectingLocations, x, y, steps); steps++; @@ -67,35 +67,35 @@ private void performStep(Set walkedLocations, boolean collect, Set i walkedLocations.add(currentStep); } } - + public int distance(Point p) { return Math.abs(p.x) + Math.abs(p.y); } - + private Walk[] mapToWalks(String string) { return Arrays.stream(string.split(",")).map(Walk::new).toArray(Walk[]::new); } - + class Walk { private final Direction dir; private int distance; - + public Walk(String code) { this.dir = Direction.getByDirCode(code.charAt(0)); this.distance = Integer.parseInt(code.substring(1)); } } - + @EqualsAndHashCode class Step { private final Point point; @EqualsAndHashCode.Exclude private int steps; @EqualsAndHashCode.Exclude private boolean isCombined = false; - + public Step(Point point, int steps) { this.point = point; this.steps = steps + 1; } - + public void combine(Step step) { if(!isCombined) { steps+=step.steps; diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day4.java b/src/main/java/com/sbaars/adventofcode2019/days/Day4.java index 5031388b..c2678316 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day4.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day4.java @@ -8,7 +8,7 @@ public class Day4 implements Day { public Day4() {} - + public static void main(String[] args) throws IOException { new Day4().printParts(); } @@ -17,12 +17,12 @@ public static void main(String[] args) throws IOException { public Object part1() throws IOException { return checkPasswords(false); } - + @Override public Object part2() throws IOException { return checkPasswords(true); } - + public long meetsCriteria(int lowerBound, int higherBound, boolean checkGroup) { return IntStream.range(lowerBound, higherBound+1).filter(e -> meetsCriteria(e, checkGroup)).count(); } @@ -31,23 +31,23 @@ public boolean meetsCriteria(int input, boolean checkGroup) { int lastSeen = 10, current, adjacentTheSame = -2, skip = 10; - for (int i = 0; input > 0; i++) { - current = input % 10; - if(skip != current && current == lastSeen) { - if(checkGroup && adjacentTheSame+1 == i) { - adjacentTheSame = -2; - skip = current; - } else if(adjacentTheSame == -2) { - adjacentTheSame = i; - } - } - if (lastSeen < current) - return false; - lastSeen = current; - input /= 10; - } - - return adjacentTheSame!=-2; + for (int i = 0; input > 0; i++) { + current = input % 10; + if(skip != current && current == lastSeen) { + if(checkGroup && adjacentTheSame+1 == i) { + adjacentTheSame = -2; + skip = current; + } else if(adjacentTheSame == -2) { + adjacentTheSame = i; + } + } + if (lastSeen < current) + return false; + lastSeen = current; + input /= 10; + } + + return adjacentTheSame!=-2; } private int checkPasswords(boolean checkGroup) { diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day5.java b/src/main/java/com/sbaars/adventofcode2019/days/Day5.java index 0e5b4006..eb38ed3b 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day5.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day5.java @@ -6,11 +6,11 @@ import com.sbaars.adventofcode2019.intcode.IntcodeComputer; public class Day5 implements Day { - + public static void main(String[] args) throws IOException { new Day5().printParts(); } - + @Override public Object part1() throws IOException { long res; @@ -18,7 +18,7 @@ public Object part1() throws IOException { while((res = intcodeComputer.run()) == 0); return res; } - + @Override public Object part2() throws IOException { return new IntcodeComputer(5, 5).run(); diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day6.java b/src/main/java/com/sbaars/adventofcode2019/days/Day6.java index 9a31e4ba..6cf03933 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day6.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day6.java @@ -11,24 +11,24 @@ import com.sbaars.adventofcode2019.util.ListMap; public class Day6 implements Day { - + ListMap orbits = new ListMap<>(); - - public static void main(String[] args) throws IOException - { - new Day6().printParts(); - } - @Override + public static void main(String[] args) throws IOException + { + new Day6().printParts(); + } + + @Override public Object part1() throws IOException { - String[] nums = createOrbitArray(); - for(String num : nums) { - String[] parts = num.split("\\)"); - orbits.addTo(parts[0], parts[1]); - } - AtomicInteger o = new AtomicInteger(); - for(var entry : orbits.entrySet()) - countOrbitsInList(orbits, o, entry.getValue()); + String[] nums = createOrbitArray(); + for(String num : nums) { + String[] parts = num.split("\\)"); + orbits.addTo(parts[0], parts[1]); + } + AtomicInteger o = new AtomicInteger(); + for(var entry : orbits.entrySet()) + countOrbitsInList(orbits, o, entry.getValue()); return o.get(); } @@ -40,39 +40,39 @@ private void countOrbitsInList(ListMap orbits, AtomicInteger o, } } } - - @Override + + @Override public Object part2() throws IOException { return findRoute("YOU", "SAN"); } - - private int findRoute(String from, String to) { - return findRoute(from, to, new ArrayList<>(), 0); - } - - private int findRoute(String from, String to, List visited, int depth) { - if(visited.contains(from)) - return 0; - visited.add(from); - List str = collectAll(from); - if(str.contains(to)) - return depth-1; - for(String s : str) { - int findRoute = findRoute(s, to, visited, depth + 1); + + private int findRoute(String from, String to) { + return findRoute(from, to, new ArrayList<>(), 0); + } + + private int findRoute(String from, String to, List visited, int depth) { + if(visited.contains(from)) + return 0; + visited.add(from); + List str = collectAll(from); + if(str.contains(to)) + return depth-1; + for(String s : str) { + int findRoute = findRoute(s, to, visited, depth + 1); if(findRoute>0) return findRoute; - } - return -1; + } + return -1; } private List collectAll(String s1) { - List s = findOrbit(s1); - s.addAll(orbits.get(s1)); + List s = findOrbit(s1); + s.addAll(orbits.get(s1)); return s; } public List findOrbit(String orbitValue) { return orbits.entrySet().stream().filter(e -> e.getValue().contains(orbitValue)).map(e -> e.getKey()).collect(Collectors.toList()); - } + } private String[] createOrbitArray() throws IOException { return Arrays.stream(readDay(6).split(System.lineSeparator())).toArray(String[]::new); diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day8.java b/src/main/java/com/sbaars/adventofcode2019/days/Day8.java index c53be49f..5db8f47a 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day8.java @@ -10,7 +10,7 @@ import com.sbaars.adventofcode2019.util.CountMap; public class Day8 implements Day, ProcessesImages { - + private static final int DIM_X = 6; private static final int DIM_Y = 25; private static final int SIZE = DIM_X*DIM_Y; @@ -59,7 +59,7 @@ private int[] determineFinalImage(int[][] pixelArrays) { finalPixels[j] = pixelArrays[i][j]; return finalPixels; } - + int[][] splitArray(int[] arr, int x, int y){ int[][] pixelArrays = new int[x][y]; for(int i = 0; i Date: Wed, 25 Dec 2019 22:27:40 +0100 Subject: [PATCH 137/433] Day 25 Concise --- .../java/com/sbaars/adventofcode2019/days/Day25.java | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day25.java b/src/main/java/com/sbaars/adventofcode2019/days/Day25.java index b11c77e1..2db9955c 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day25.java +++ b/src/main/java/com/sbaars/adventofcode2019/days/Day25.java @@ -18,12 +18,8 @@ private void play() throws IOException { IntcodeComputer ic = new IntcodeComputer(RetentionPolicy.EXIT_ON_EMPTY_INPUT, readLongArray(25)); while(true) { long res; - while((res = ic.run()) != IntcodeComputer.STOP_CODE) { - System.out.print((char)res); - } - BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); - String name = reader.readLine(); - ic.setInput(name+"\n"); + while((res = ic.run()) != IntcodeComputer.STOP_CODE) System.out.print((char)res); + ic.setInput(new BufferedReader(new InputStreamReader(System.in)).readLine()+"\n"); } } @@ -37,8 +33,7 @@ public Object part1() throws IOException { while((res = ic.run()) != IntcodeComputer.STOP_CODE) { if(Character.isDigit((char)res)) numbers += (char)res; } - if(i == inputs.length) - return numbers.substring(1); + if(i == inputs.length) return numbers.substring(1); ic.setInput(inputs[i]+"\n"); } return 0; From 610dd08c06be8e816e547c48af5692f9cdfa2d9e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Oct 2020 17:56:14 +0000 Subject: [PATCH 138/433] Bump junit from 3.8.2 to 4.13.1 Bumps [junit](https://github.com/junit-team/junit4) from 3.8.2 to 4.13.1. - [Release notes](https://github.com/junit-team/junit4/releases) - [Changelog](https://github.com/junit-team/junit4/blob/main/doc/ReleaseNotes4.13.1.md) - [Commits](https://github.com/junit-team/junit4/compare/r3.8.2...r4.13.1) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9f19708b..9077d9ac 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ junit junit - 3.8.2 + 4.13.1 test From 823a544531c9ab52b6e79c87641d81c55208bbff Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Mon, 30 Nov 2020 17:59:31 +0100 Subject: [PATCH 139/433] Move stuff around --- .idea/.gitignore | 0 .idea/.name | 1 + .idea/checkstyle-idea.xml | 16 + .idea/codeStyles/Project.xml | 61 +++ .idea/codeStyles/codeStyleConfig.xml | 5 + .idea/compiler.xml | 16 + .idea/dbnavigator.xml | 468 ++++++++++++++++++ .idea/encodings.xml | 7 + .idea/google-java-format.xml | 6 + .idea/jarRepositories.xml | 25 + ..._com_google_code_findbugs_jsr305_3_0_2.xml | 13 + ...rorprone_error_prone_annotations_2_3_4.xml | 13 + ...__com_google_guava_failureaccess_1_0_1.xml | 13 + ...Maven__com_google_guava_guava_30_0_jre.xml | 13 + ...9_0_empty_to_avoid_conflict_with_guava.xml | 13 + ...m_google_j2objc_j2objc_annotations_1_3.xml | 13 + .../Maven__commons_io_commons_io_1_3_2.xml | 13 + ...n__commons_logging_commons_logging_1_2.xml | 13 + .idea/libraries/Maven__junit_junit_4_13_1.xml | 13 + ...pache_commons_commons_collections4_4_4.xml | 13 + ...che_commons_commons_configuration2_2_7.xml | 13 + ...en__org_apache_commons_commons_csv_1_8.xml | 11 + ..._org_apache_commons_commons_lang3_3_11.xml | 13 + ...org_apache_commons_commons_math3_3_6_1.xml | 13 + ...n__org_apache_commons_commons_text_1_9.xml | 13 + ...rg_checkerframework_checker_qual_3_5_0.xml | 13 + .../Maven__org_hamcrest_hamcrest_core_1_3.xml | 13 + ...Maven__org_projectlombok_lombok_1_18_8.xml | 13 + .idea/misc.xml | 11 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + .idea/workspace.xml | 171 +++++++ adventofcode2019.iml | 38 ++ pom.xml | 66 ++- .../common/Day.java | 5 +- .../common/Direction.java | 2 +- .../common/ProcessesImages.java | 2 +- .../year19}/Main.java | 6 +- .../year19}/days/Day1.java | 4 +- .../year19}/days/Day10.java | 4 +- .../year19}/days/Day11.java | 11 +- .../year19}/days/Day12.java | 5 +- .../year19}/days/Day13.java | 7 +- .../year19}/days/Day14.java | 6 +- .../year19}/days/Day15.java | 10 +- .../year19}/days/Day16.java | 5 +- .../year19}/days/Day17.java | 9 +- .../year19}/days/Day18.java | 6 +- .../year19}/days/Day19.java | 7 +- .../year19}/days/Day2.java | 6 +- .../year19}/days/Day20.java | 9 +- .../year19}/days/Day21.java | 7 +- .../year19}/days/Day22.java | 5 +- .../year19}/days/Day23.java | 9 +- .../year19}/days/Day24.java | 4 +- .../year19}/days/Day25.java | 8 +- .../year19}/days/Day3.java | 7 +- .../year19}/days/Day4.java | 4 +- .../year19}/days/Day5.java | 6 +- .../year19}/days/Day6.java | 9 +- .../year19}/days/Day7.java | 6 +- .../year19}/days/Day8.java | 9 +- .../year19}/days/Day9.java | 7 +- .../year19}/intcode/IntcodeComputer.java | 5 +- .../year19}/intcode/RetentionPolicy.java | 2 +- .../year19}/pathfinding/CharGrid2d.java | 2 +- .../year19}/pathfinding/Grid2d.java | 5 +- .../year19}/pathfinding/Node.java | 2 +- .../year19}/pathfinding/PathFinding.java | 2 +- .../year19}/util/CountMap.java | 2 +- .../year19}/util/DoesFileOperations.java | 2 +- .../year19}/util/ListMap.java | 2 +- .../year19}/util/LongCountMap.java | 2 +- .../com/sbaars/adventofcode/year20/Main.java | 4 + .../sbaars/adventofcode/year20/days/Day1.java | 22 + .../year19}/IntcodeTest.java | 14 +- 76 files changed, 1256 insertions(+), 132 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/.name create mode 100644 .idea/checkstyle-idea.xml create mode 100644 .idea/codeStyles/Project.xml create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 .idea/compiler.xml create mode 100644 .idea/dbnavigator.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/google-java-format.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/libraries/Maven__com_google_code_findbugs_jsr305_3_0_2.xml create mode 100644 .idea/libraries/Maven__com_google_errorprone_error_prone_annotations_2_3_4.xml create mode 100644 .idea/libraries/Maven__com_google_guava_failureaccess_1_0_1.xml create mode 100644 .idea/libraries/Maven__com_google_guava_guava_30_0_jre.xml create mode 100644 .idea/libraries/Maven__com_google_guava_listenablefuture_9999_0_empty_to_avoid_conflict_with_guava.xml create mode 100644 .idea/libraries/Maven__com_google_j2objc_j2objc_annotations_1_3.xml create mode 100644 .idea/libraries/Maven__commons_io_commons_io_1_3_2.xml create mode 100644 .idea/libraries/Maven__commons_logging_commons_logging_1_2.xml create mode 100644 .idea/libraries/Maven__junit_junit_4_13_1.xml create mode 100644 .idea/libraries/Maven__org_apache_commons_commons_collections4_4_4.xml create mode 100644 .idea/libraries/Maven__org_apache_commons_commons_configuration2_2_7.xml create mode 100644 .idea/libraries/Maven__org_apache_commons_commons_csv_1_8.xml create mode 100644 .idea/libraries/Maven__org_apache_commons_commons_lang3_3_11.xml create mode 100644 .idea/libraries/Maven__org_apache_commons_commons_math3_3_6_1.xml create mode 100644 .idea/libraries/Maven__org_apache_commons_commons_text_1_9.xml create mode 100644 .idea/libraries/Maven__org_checkerframework_checker_qual_3_5_0.xml create mode 100644 .idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml create mode 100644 .idea/libraries/Maven__org_projectlombok_lombok_1_18_8.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 .idea/workspace.xml create mode 100644 adventofcode2019.iml rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode}/common/Day.java (74%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode}/common/Direction.java (97%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode}/common/ProcessesImages.java (89%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/Main.java (67%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/days/Day1.java (89%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/days/Day10.java (96%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/days/Day11.java (87%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/days/Day12.java (96%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/days/Day13.java (92%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/days/Day14.java (94%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/days/Day15.java (91%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/days/Day16.java (95%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/days/Day17.java (95%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/days/Day18.java (96%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/days/Day19.java (81%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/days/Day2.java (83%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/days/Day20.java (95%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/days/Day21.java (86%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/days/Day22.java (97%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/days/Day23.java (85%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/days/Day24.java (98%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/days/Day25.java (86%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/days/Day3.java (95%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/days/Day4.java (93%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/days/Day5.java (75%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/days/Day6.java (89%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/days/Day7.java (92%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/days/Day8.java (90%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/days/Day9.java (70%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/intcode/IntcodeComputer.java (97%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/intcode/RetentionPolicy.java (59%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/pathfinding/CharGrid2d.java (98%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/pathfinding/Grid2d.java (96%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/pathfinding/Node.java (94%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/pathfinding/PathFinding.java (97%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/util/CountMap.java (96%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/util/DoesFileOperations.java (94%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/util/ListMap.java (97%) rename src/main/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/util/LongCountMap.java (96%) create mode 100644 src/main/java/com/sbaars/adventofcode/year20/Main.java create mode 100644 src/main/java/com/sbaars/adventofcode/year20/days/Day1.java rename src/test/java/com/sbaars/{adventofcode2019 => adventofcode/year19}/IntcodeTest.java (76%) diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 00000000..ccf03486 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +adventofcode2019 \ No newline at end of file diff --git a/.idea/checkstyle-idea.xml b/.idea/checkstyle-idea.xml new file mode 100644 index 00000000..9f040005 --- /dev/null +++ b/.idea/checkstyle-idea.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 00000000..ae836f67 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 00000000..a55e7a17 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 00000000..67ac3953 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/dbnavigator.xml b/.idea/dbnavigator.xml new file mode 100644 index 00000000..c2280278 --- /dev/null +++ b/.idea/dbnavigator.xml @@ -0,0 +1,468 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 00000000..aa00ffab --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/google-java-format.xml b/.idea/google-java-format.xml new file mode 100644 index 00000000..2aa056da --- /dev/null +++ b/.idea/google-java-format.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 00000000..b15554c4 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_code_findbugs_jsr305_3_0_2.xml b/.idea/libraries/Maven__com_google_code_findbugs_jsr305_3_0_2.xml new file mode 100644 index 00000000..1c380d0b --- /dev/null +++ b/.idea/libraries/Maven__com_google_code_findbugs_jsr305_3_0_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_errorprone_error_prone_annotations_2_3_4.xml b/.idea/libraries/Maven__com_google_errorprone_error_prone_annotations_2_3_4.xml new file mode 100644 index 00000000..848cecd7 --- /dev/null +++ b/.idea/libraries/Maven__com_google_errorprone_error_prone_annotations_2_3_4.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_guava_failureaccess_1_0_1.xml b/.idea/libraries/Maven__com_google_guava_failureaccess_1_0_1.xml new file mode 100644 index 00000000..36e948e2 --- /dev/null +++ b/.idea/libraries/Maven__com_google_guava_failureaccess_1_0_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_guava_guava_30_0_jre.xml b/.idea/libraries/Maven__com_google_guava_guava_30_0_jre.xml new file mode 100644 index 00000000..1ca3e3ea --- /dev/null +++ b/.idea/libraries/Maven__com_google_guava_guava_30_0_jre.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_guava_listenablefuture_9999_0_empty_to_avoid_conflict_with_guava.xml b/.idea/libraries/Maven__com_google_guava_listenablefuture_9999_0_empty_to_avoid_conflict_with_guava.xml new file mode 100644 index 00000000..4e15702e --- /dev/null +++ b/.idea/libraries/Maven__com_google_guava_listenablefuture_9999_0_empty_to_avoid_conflict_with_guava.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_j2objc_j2objc_annotations_1_3.xml b/.idea/libraries/Maven__com_google_j2objc_j2objc_annotations_1_3.xml new file mode 100644 index 00000000..bacaa456 --- /dev/null +++ b/.idea/libraries/Maven__com_google_j2objc_j2objc_annotations_1_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__commons_io_commons_io_1_3_2.xml b/.idea/libraries/Maven__commons_io_commons_io_1_3_2.xml new file mode 100644 index 00000000..7b5b3b75 --- /dev/null +++ b/.idea/libraries/Maven__commons_io_commons_io_1_3_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__commons_logging_commons_logging_1_2.xml b/.idea/libraries/Maven__commons_logging_commons_logging_1_2.xml new file mode 100644 index 00000000..eab40b32 --- /dev/null +++ b/.idea/libraries/Maven__commons_logging_commons_logging_1_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__junit_junit_4_13_1.xml b/.idea/libraries/Maven__junit_junit_4_13_1.xml new file mode 100644 index 00000000..9fa24fcb --- /dev/null +++ b/.idea/libraries/Maven__junit_junit_4_13_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_commons_commons_collections4_4_4.xml b/.idea/libraries/Maven__org_apache_commons_commons_collections4_4_4.xml new file mode 100644 index 00000000..5871c958 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_commons_commons_collections4_4_4.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_commons_commons_configuration2_2_7.xml b/.idea/libraries/Maven__org_apache_commons_commons_configuration2_2_7.xml new file mode 100644 index 00000000..3eacd992 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_commons_commons_configuration2_2_7.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_commons_commons_csv_1_8.xml b/.idea/libraries/Maven__org_apache_commons_commons_csv_1_8.xml new file mode 100644 index 00000000..d7c9e96e --- /dev/null +++ b/.idea/libraries/Maven__org_apache_commons_commons_csv_1_8.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_commons_commons_lang3_3_11.xml b/.idea/libraries/Maven__org_apache_commons_commons_lang3_3_11.xml new file mode 100644 index 00000000..7a30e6e3 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_commons_commons_lang3_3_11.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_commons_commons_math3_3_6_1.xml b/.idea/libraries/Maven__org_apache_commons_commons_math3_3_6_1.xml new file mode 100644 index 00000000..ebfe0a86 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_commons_commons_math3_3_6_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_commons_commons_text_1_9.xml b/.idea/libraries/Maven__org_apache_commons_commons_text_1_9.xml new file mode 100644 index 00000000..c23dddc2 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_commons_commons_text_1_9.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_checkerframework_checker_qual_3_5_0.xml b/.idea/libraries/Maven__org_checkerframework_checker_qual_3_5_0.xml new file mode 100644 index 00000000..a5200836 --- /dev/null +++ b/.idea/libraries/Maven__org_checkerframework_checker_qual_3_5_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml new file mode 100644 index 00000000..f58bbc11 --- /dev/null +++ b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_projectlombok_lombok_1_18_8.xml b/.idea/libraries/Maven__org_projectlombok_lombok_1_18_8.xml new file mode 100644 index 00000000..9843fa42 --- /dev/null +++ b/.idea/libraries/Maven__org_projectlombok_lombok_1_18_8.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..972ec8d7 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 00000000..1f102bb9 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..35eb1ddf --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 00000000..14893ec8 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1606754454120 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/adventofcode2019.iml b/adventofcode2019.iml new file mode 100644 index 00000000..4043a43c --- /dev/null +++ b/adventofcode2019.iml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 9077d9ac..fcd7a28c 100644 --- a/pom.xml +++ b/pom.xml @@ -6,6 +6,18 @@ com.sbaars adventofcode2019 0.0.1-SNAPSHOT + + + + org.apache.maven.plugins + maven-compiler-plugin + + 10 + 10 + + + + jar adventofcode2019 @@ -14,8 +26,8 @@ UTF-8 8 - 13 - 13 + 11 + 11 @@ -31,15 +43,45 @@ 1.18.8 compile + + com.google.guava + guava + 30.0-jre + + + org.apache.commons + commons-lang3 + 3.11 + + + org.apache.commons + commons-collections4 + 4.4 + + + org.apache.commons + commons-math3 + 3.6.1 + + + org.apache.commons + commons-text + 1.9 + + + org.apache.commons + commons-io + 1.3.2 + + + org.apache.commons + commons-csv + 1.8 + + + org.apache.commons + commons-configuration2 + 2.7 + - - - - maven-compiler-plugin - - 13 - - - - diff --git a/src/main/java/com/sbaars/adventofcode2019/common/Day.java b/src/main/java/com/sbaars/adventofcode/common/Day.java similarity index 74% rename from src/main/java/com/sbaars/adventofcode2019/common/Day.java rename to src/main/java/com/sbaars/adventofcode/common/Day.java index badd6819..12e0c716 100644 --- a/src/main/java/com/sbaars/adventofcode2019/common/Day.java +++ b/src/main/java/com/sbaars/adventofcode/common/Day.java @@ -1,9 +1,8 @@ -package com.sbaars.adventofcode2019.common; +package com.sbaars.adventofcode.common; +import com.sbaars.adventofcode.year19.util.DoesFileOperations; import java.io.IOException; -import com.sbaars.adventofcode2019.util.DoesFileOperations; - public interface Day extends DoesFileOperations { public Object part1() throws IOException; public Object part2() throws IOException; diff --git a/src/main/java/com/sbaars/adventofcode2019/common/Direction.java b/src/main/java/com/sbaars/adventofcode/common/Direction.java similarity index 97% rename from src/main/java/com/sbaars/adventofcode2019/common/Direction.java rename to src/main/java/com/sbaars/adventofcode/common/Direction.java index fafe9ff1..486afaac 100644 --- a/src/main/java/com/sbaars/adventofcode2019/common/Direction.java +++ b/src/main/java/com/sbaars/adventofcode/common/Direction.java @@ -1,4 +1,4 @@ -package com.sbaars.adventofcode2019.common; +package com.sbaars.adventofcode.common; import java.awt.Point; import java.util.Arrays; diff --git a/src/main/java/com/sbaars/adventofcode2019/common/ProcessesImages.java b/src/main/java/com/sbaars/adventofcode/common/ProcessesImages.java similarity index 89% rename from src/main/java/com/sbaars/adventofcode2019/common/ProcessesImages.java rename to src/main/java/com/sbaars/adventofcode/common/ProcessesImages.java index e4de03c2..6de44f43 100644 --- a/src/main/java/com/sbaars/adventofcode2019/common/ProcessesImages.java +++ b/src/main/java/com/sbaars/adventofcode/common/ProcessesImages.java @@ -1,4 +1,4 @@ -package com.sbaars.adventofcode2019.common; +package com.sbaars.adventofcode.common; import java.util.Arrays; import java.util.stream.Collectors; diff --git a/src/main/java/com/sbaars/adventofcode2019/Main.java b/src/main/java/com/sbaars/adventofcode/year19/Main.java similarity index 67% rename from src/main/java/com/sbaars/adventofcode2019/Main.java rename to src/main/java/com/sbaars/adventofcode/year19/Main.java index 2748a487..7e110282 100644 --- a/src/main/java/com/sbaars/adventofcode2019/Main.java +++ b/src/main/java/com/sbaars/adventofcode/year19/Main.java @@ -1,15 +1,15 @@ -package com.sbaars.adventofcode2019; +package com.sbaars.adventofcode.year19; import java.io.IOException; import java.lang.reflect.InvocationTargetException; -import com.sbaars.adventofcode2019.common.Day; +import com.sbaars.adventofcode.common.Day; public class Main { public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException, InvocationTargetException, NoSuchMethodException { for(int day = 1; day<=25; day++) { System.out.println("Day "+day+":"); - Day instance = (Day)Class.forName("com.sbaars.adventofcode2019.days.Day"+day).getDeclaredConstructor().newInstance(); + Day instance = (Day)Class.forName("com.sbaars.adventofcode.year19.days.Day"+day).getDeclaredConstructor().newInstance(); instance.printParts(); System.out.println(); } diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day1.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day1.java similarity index 89% rename from src/main/java/com/sbaars/adventofcode2019/days/Day1.java rename to src/main/java/com/sbaars/adventofcode/year19/days/Day1.java index a8e5fb9c..8b48f91d 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day1.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day1.java @@ -1,10 +1,10 @@ -package com.sbaars.adventofcode2019.days; +package com.sbaars.adventofcode.year19.days; import java.io.IOException; import java.util.Arrays; import java.util.stream.IntStream; -import com.sbaars.adventofcode2019.common.Day; +import com.sbaars.adventofcode.common.Day; public class Day1 implements Day { diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day10.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day10.java similarity index 96% rename from src/main/java/com/sbaars/adventofcode2019/days/Day10.java rename to src/main/java/com/sbaars/adventofcode/year19/days/Day10.java index 85edd36e..60871fb7 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day10.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day10.java @@ -1,4 +1,4 @@ -package com.sbaars.adventofcode2019.days; +package com.sbaars.adventofcode.year19.days; import java.awt.Point; import java.io.IOException; @@ -8,7 +8,7 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -import com.sbaars.adventofcode2019.common.Day; +import com.sbaars.adventofcode.common.Day; import lombok.EqualsAndHashCode; diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day11.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day11.java similarity index 87% rename from src/main/java/com/sbaars/adventofcode2019/days/Day11.java rename to src/main/java/com/sbaars/adventofcode/year19/days/Day11.java index e9802826..7d0f9f43 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day11.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day11.java @@ -1,15 +1,14 @@ -package com.sbaars.adventofcode2019.days; +package com.sbaars.adventofcode.year19.days; +import com.sbaars.adventofcode.common.Day; +import com.sbaars.adventofcode.common.Direction; +import com.sbaars.adventofcode.common.ProcessesImages; +import com.sbaars.adventofcode.year19.intcode.IntcodeComputer; import java.awt.Point; import java.io.IOException; import java.util.HashSet; import java.util.Set; -import com.sbaars.adventofcode2019.common.Day; -import com.sbaars.adventofcode2019.common.Direction; -import com.sbaars.adventofcode2019.common.ProcessesImages; -import com.sbaars.adventofcode2019.intcode.IntcodeComputer; - public class Day11 implements Day, ProcessesImages { public static void main(String[] args) throws IOException { diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day12.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day12.java similarity index 96% rename from src/main/java/com/sbaars/adventofcode2019/days/Day12.java rename to src/main/java/com/sbaars/adventofcode/year19/days/Day12.java index 783ef998..da8cda27 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day12.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day12.java @@ -1,12 +1,11 @@ -package com.sbaars.adventofcode2019.days; +package com.sbaars.adventofcode.year19.days; +import com.sbaars.adventofcode.common.Day; import java.io.IOException; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; -import com.sbaars.adventofcode2019.common.Day; - public class Day12 implements Day { int[][] moons = {{-5,6,-11},{-8,-4,-2},{1,16,4},{11,11,-4}}; diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day13.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day13.java similarity index 92% rename from src/main/java/com/sbaars/adventofcode2019/days/Day13.java rename to src/main/java/com/sbaars/adventofcode/year19/days/Day13.java index 0fba65f3..7b244381 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day13.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day13.java @@ -1,14 +1,13 @@ -package com.sbaars.adventofcode2019.days; +package com.sbaars.adventofcode.year19.days; +import com.sbaars.adventofcode.common.Day; +import com.sbaars.adventofcode.year19.intcode.IntcodeComputer; import java.awt.Point; import java.io.IOException; import java.util.HashSet; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; -import com.sbaars.adventofcode2019.common.Day; -import com.sbaars.adventofcode2019.intcode.IntcodeComputer; - public class Day13 implements Day { public static void main(String[] args) throws IOException { diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day14.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day14.java similarity index 94% rename from src/main/java/com/sbaars/adventofcode2019/days/Day14.java rename to src/main/java/com/sbaars/adventofcode/year19/days/Day14.java index c13f6b23..782b0900 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day14.java @@ -1,10 +1,10 @@ -package com.sbaars.adventofcode2019.days; +package com.sbaars.adventofcode.year19.days; import java.io.IOException; import java.util.Arrays; -import com.sbaars.adventofcode2019.common.Day; -import com.sbaars.adventofcode2019.util.LongCountMap; +import com.sbaars.adventofcode.common.Day; +import com.sbaars.adventofcode.year19.util.LongCountMap; public class Day14 implements Day { private Trade[] trades; diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day15.java similarity index 91% rename from src/main/java/com/sbaars/adventofcode2019/days/Day15.java rename to src/main/java/com/sbaars/adventofcode/year19/days/Day15.java index 55c392b4..2bbe09ce 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day15.java @@ -1,4 +1,4 @@ -package com.sbaars.adventofcode2019.days; +package com.sbaars.adventofcode.year19.days; import java.awt.Point; import java.io.IOException; @@ -6,10 +6,10 @@ import java.util.Arrays; import java.util.List; -import com.sbaars.adventofcode2019.common.Day; -import com.sbaars.adventofcode2019.common.Direction; -import com.sbaars.adventofcode2019.intcode.IntcodeComputer; -import com.sbaars.adventofcode2019.pathfinding.Grid2d; +import com.sbaars.adventofcode.common.Day; +import com.sbaars.adventofcode.common.Direction; +import com.sbaars.adventofcode.year19.intcode.IntcodeComputer; +import com.sbaars.adventofcode.year19.pathfinding.Grid2d; public class Day15 implements Day { diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day16.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day16.java similarity index 95% rename from src/main/java/com/sbaars/adventofcode2019/days/Day16.java rename to src/main/java/com/sbaars/adventofcode/year19/days/Day16.java index 43f4782a..649b4caa 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day16.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day16.java @@ -1,12 +1,11 @@ -package com.sbaars.adventofcode2019.days; +package com.sbaars.adventofcode.year19.days; +import com.sbaars.adventofcode.common.Day; import java.io.IOException; import java.util.Arrays; import java.util.stream.Collectors; import java.util.stream.IntStream; -import com.sbaars.adventofcode2019.common.Day; - public class Day16 implements Day { private static final int TARGET_POS = 5977341; diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day17.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day17.java similarity index 95% rename from src/main/java/com/sbaars/adventofcode2019/days/Day17.java rename to src/main/java/com/sbaars/adventofcode/year19/days/Day17.java index 85431b73..cef6af3f 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day17.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day17.java @@ -1,5 +1,8 @@ -package com.sbaars.adventofcode2019.days; +package com.sbaars.adventofcode.year19.days; +import com.sbaars.adventofcode.common.Day; +import com.sbaars.adventofcode.common.Direction; +import com.sbaars.adventofcode.year19.intcode.IntcodeComputer; import java.awt.Point; import java.io.IOException; import java.util.ArrayList; @@ -7,10 +10,6 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -import com.sbaars.adventofcode2019.common.Day; -import com.sbaars.adventofcode2019.common.Direction; -import com.sbaars.adventofcode2019.intcode.IntcodeComputer; - import lombok.EqualsAndHashCode; public class Day17 implements Day { diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day18.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day18.java similarity index 96% rename from src/main/java/com/sbaars/adventofcode2019/days/Day18.java rename to src/main/java/com/sbaars/adventofcode/year19/days/Day18.java index ee40b6cb..1c720659 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day18.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day18.java @@ -1,4 +1,4 @@ -package com.sbaars.adventofcode2019.days; +package com.sbaars.adventofcode.year19.days; import java.awt.Point; import java.io.IOException; @@ -11,8 +11,8 @@ import java.util.TreeSet; import java.util.stream.Collectors; -import com.sbaars.adventofcode2019.common.Day; -import com.sbaars.adventofcode2019.pathfinding.CharGrid2d; +import com.sbaars.adventofcode.common.Day; +import com.sbaars.adventofcode.year19.pathfinding.CharGrid2d; import lombok.*; diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day19.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day19.java similarity index 81% rename from src/main/java/com/sbaars/adventofcode2019/days/Day19.java rename to src/main/java/com/sbaars/adventofcode/year19/days/Day19.java index 610bc656..d4ad097e 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day19.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day19.java @@ -1,10 +1,9 @@ -package com.sbaars.adventofcode2019.days; +package com.sbaars.adventofcode.year19.days; +import com.sbaars.adventofcode.common.Day; +import com.sbaars.adventofcode.year19.intcode.IntcodeComputer; import java.io.IOException; -import com.sbaars.adventofcode2019.common.Day; -import com.sbaars.adventofcode2019.intcode.IntcodeComputer; - public class Day19 implements Day { public static void main(String[] args) throws IOException { diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day2.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day2.java similarity index 83% rename from src/main/java/com/sbaars/adventofcode2019/days/Day2.java rename to src/main/java/com/sbaars/adventofcode/year19/days/Day2.java index fea0cc37..f429548d 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day2.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day2.java @@ -1,9 +1,9 @@ -package com.sbaars.adventofcode2019.days; +package com.sbaars.adventofcode.year19.days; import java.io.IOException; -import com.sbaars.adventofcode2019.common.Day; -import com.sbaars.adventofcode2019.intcode.IntcodeComputer; +import com.sbaars.adventofcode.common.Day; +import com.sbaars.adventofcode.year19.intcode.IntcodeComputer; public class Day2 implements Day { diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day20.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day20.java similarity index 95% rename from src/main/java/com/sbaars/adventofcode2019/days/Day20.java rename to src/main/java/com/sbaars/adventofcode/year19/days/Day20.java index 584cf68f..712c6e35 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day20.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day20.java @@ -1,5 +1,8 @@ -package com.sbaars.adventofcode2019.days; +package com.sbaars.adventofcode.year19.days; +import com.sbaars.adventofcode.common.Day; +import com.sbaars.adventofcode.year19.pathfinding.CharGrid2d; +import com.sbaars.adventofcode.year19.util.ListMap; import java.awt.Point; import java.io.IOException; import java.util.ArrayDeque; @@ -12,10 +15,6 @@ import java.util.Queue; import java.util.Set; -import com.sbaars.adventofcode2019.common.Day; -import com.sbaars.adventofcode2019.pathfinding.CharGrid2d; -import com.sbaars.adventofcode2019.util.ListMap; - import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day21.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day21.java similarity index 86% rename from src/main/java/com/sbaars/adventofcode2019/days/Day21.java rename to src/main/java/com/sbaars/adventofcode/year19/days/Day21.java index 1736d343..72ecf70c 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day21.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day21.java @@ -1,10 +1,9 @@ -package com.sbaars.adventofcode2019.days; +package com.sbaars.adventofcode.year19.days; +import com.sbaars.adventofcode.common.Day; +import com.sbaars.adventofcode.year19.intcode.IntcodeComputer; import java.io.IOException; -import com.sbaars.adventofcode2019.common.Day; -import com.sbaars.adventofcode2019.intcode.IntcodeComputer; - public class Day21 implements Day { public static void main(String[] args) throws IOException { diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day22.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day22.java similarity index 97% rename from src/main/java/com/sbaars/adventofcode2019/days/Day22.java rename to src/main/java/com/sbaars/adventofcode/year19/days/Day22.java index 61a46b2a..7e116593 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day22.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day22.java @@ -1,5 +1,6 @@ -package com.sbaars.adventofcode2019.days; +package com.sbaars.adventofcode.year19.days; +import com.sbaars.adventofcode.common.Day; import java.io.IOException; import java.math.BigInteger; import java.util.ArrayList; @@ -9,8 +10,6 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -import com.sbaars.adventofcode2019.common.Day; - import lombok.AllArgsConstructor; import lombok.Data; import lombok.Value; diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day23.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day23.java similarity index 85% rename from src/main/java/com/sbaars/adventofcode2019/days/Day23.java rename to src/main/java/com/sbaars/adventofcode/year19/days/Day23.java index 65ff7fe5..d3e1cb52 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day23.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day23.java @@ -1,12 +1,11 @@ -package com.sbaars.adventofcode2019.days; +package com.sbaars.adventofcode.year19.days; +import com.sbaars.adventofcode.common.Day; +import com.sbaars.adventofcode.year19.intcode.IntcodeComputer; +import com.sbaars.adventofcode.year19.intcode.RetentionPolicy; import java.io.IOException; import java.util.stream.IntStream; -import com.sbaars.adventofcode2019.common.Day; -import com.sbaars.adventofcode2019.intcode.IntcodeComputer; -import com.sbaars.adventofcode2019.intcode.RetentionPolicy; - public class Day23 implements Day { public static void main(String[] args) throws IOException { diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day24.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day24.java similarity index 98% rename from src/main/java/com/sbaars/adventofcode2019/days/Day24.java rename to src/main/java/com/sbaars/adventofcode/year19/days/Day24.java index d0838db5..7f6975c2 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day24.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day24.java @@ -1,4 +1,4 @@ -package com.sbaars.adventofcode2019.days; +package com.sbaars.adventofcode.year19.days; import java.awt.Point; import java.io.IOException; @@ -13,7 +13,7 @@ import java.util.stream.IntStream; import java.util.stream.Stream; -import com.sbaars.adventofcode2019.common.Day; +import com.sbaars.adventofcode.common.Day; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day25.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day25.java similarity index 86% rename from src/main/java/com/sbaars/adventofcode2019/days/Day25.java rename to src/main/java/com/sbaars/adventofcode/year19/days/Day25.java index 2db9955c..0edbd63c 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day25.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day25.java @@ -1,12 +1,12 @@ -package com.sbaars.adventofcode2019.days; +package com.sbaars.adventofcode.year19.days; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; -import com.sbaars.adventofcode2019.common.Day; -import com.sbaars.adventofcode2019.intcode.IntcodeComputer; -import com.sbaars.adventofcode2019.intcode.RetentionPolicy; +import com.sbaars.adventofcode.common.Day; +import com.sbaars.adventofcode.year19.intcode.IntcodeComputer; +import com.sbaars.adventofcode.year19.intcode.RetentionPolicy; public class Day25 implements Day { diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day3.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day3.java similarity index 95% rename from src/main/java/com/sbaars/adventofcode2019/days/Day3.java rename to src/main/java/com/sbaars/adventofcode/year19/days/Day3.java index 90856b60..c794c4c2 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day3.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day3.java @@ -1,14 +1,13 @@ -package com.sbaars.adventofcode2019.days; +package com.sbaars.adventofcode.year19.days; +import com.sbaars.adventofcode.common.Day; +import com.sbaars.adventofcode.common.Direction; import java.awt.Point; import java.io.IOException; import java.util.Arrays; import java.util.HashSet; import java.util.Set; -import com.sbaars.adventofcode2019.common.Day; -import com.sbaars.adventofcode2019.common.Direction; - import lombok.EqualsAndHashCode; public class Day3 implements Day diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day4.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day4.java similarity index 93% rename from src/main/java/com/sbaars/adventofcode2019/days/Day4.java rename to src/main/java/com/sbaars/adventofcode/year19/days/Day4.java index c2678316..ed7a53c9 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day4.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day4.java @@ -1,9 +1,9 @@ -package com.sbaars.adventofcode2019.days; +package com.sbaars.adventofcode.year19.days; import java.io.IOException; import java.util.stream.IntStream; -import com.sbaars.adventofcode2019.common.Day; +import com.sbaars.adventofcode.common.Day; public class Day4 implements Day { diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day5.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day5.java similarity index 75% rename from src/main/java/com/sbaars/adventofcode2019/days/Day5.java rename to src/main/java/com/sbaars/adventofcode/year19/days/Day5.java index eb38ed3b..c08ca13a 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day5.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day5.java @@ -1,9 +1,9 @@ -package com.sbaars.adventofcode2019.days; +package com.sbaars.adventofcode.year19.days; import java.io.IOException; -import com.sbaars.adventofcode2019.common.Day; -import com.sbaars.adventofcode2019.intcode.IntcodeComputer; +import com.sbaars.adventofcode.common.Day; +import com.sbaars.adventofcode.year19.intcode.IntcodeComputer; public class Day5 implements Day { diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day6.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day6.java similarity index 89% rename from src/main/java/com/sbaars/adventofcode2019/days/Day6.java rename to src/main/java/com/sbaars/adventofcode/year19/days/Day6.java index 6cf03933..7da6d190 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day6.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day6.java @@ -1,14 +1,15 @@ -package com.sbaars.adventofcode2019.days; +package com.sbaars.adventofcode.year19.days; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map.Entry; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; -import com.sbaars.adventofcode2019.common.Day; -import com.sbaars.adventofcode2019.util.ListMap; +import com.sbaars.adventofcode.common.Day; +import com.sbaars.adventofcode.year19.util.ListMap; public class Day6 implements Day { @@ -27,7 +28,7 @@ public Object part1() throws IOException { orbits.addTo(parts[0], parts[1]); } AtomicInteger o = new AtomicInteger(); - for(var entry : orbits.entrySet()) + for(Entry> entry : orbits.entrySet()) countOrbitsInList(orbits, o, entry.getValue()); return o.get(); } diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day7.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day7.java similarity index 92% rename from src/main/java/com/sbaars/adventofcode2019/days/Day7.java rename to src/main/java/com/sbaars/adventofcode/year19/days/Day7.java index 433af6b0..6608f7a4 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day7.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day7.java @@ -1,12 +1,12 @@ -package com.sbaars.adventofcode2019.days; +package com.sbaars.adventofcode.year19.days; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import com.sbaars.adventofcode2019.common.Day; -import com.sbaars.adventofcode2019.intcode.IntcodeComputer; +import com.sbaars.adventofcode.common.Day; +import com.sbaars.adventofcode.year19.intcode.IntcodeComputer; public class Day7 implements Day { diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day8.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day8.java similarity index 90% rename from src/main/java/com/sbaars/adventofcode2019/days/Day8.java rename to src/main/java/com/sbaars/adventofcode/year19/days/Day8.java index 5db8f47a..d6fd30d9 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day8.java @@ -1,14 +1,13 @@ -package com.sbaars.adventofcode2019.days; +package com.sbaars.adventofcode.year19.days; +import com.sbaars.adventofcode.common.Day; +import com.sbaars.adventofcode.common.ProcessesImages; +import com.sbaars.adventofcode.year19.util.CountMap; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.stream.IntStream; -import com.sbaars.adventofcode2019.common.Day; -import com.sbaars.adventofcode2019.common.ProcessesImages; -import com.sbaars.adventofcode2019.util.CountMap; - public class Day8 implements Day, ProcessesImages { private static final int DIM_X = 6; diff --git a/src/main/java/com/sbaars/adventofcode2019/days/Day9.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day9.java similarity index 70% rename from src/main/java/com/sbaars/adventofcode2019/days/Day9.java rename to src/main/java/com/sbaars/adventofcode/year19/days/Day9.java index 9d8e3ddf..5f8be43d 100644 --- a/src/main/java/com/sbaars/adventofcode2019/days/Day9.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day9.java @@ -1,10 +1,9 @@ -package com.sbaars.adventofcode2019.days; +package com.sbaars.adventofcode.year19.days; +import com.sbaars.adventofcode.common.Day; +import com.sbaars.adventofcode.year19.intcode.IntcodeComputer; import java.io.IOException; -import com.sbaars.adventofcode2019.common.Day; -import com.sbaars.adventofcode2019.intcode.IntcodeComputer; - public class Day9 implements Day { public static void main(String[] args) throws IOException { diff --git a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java b/src/main/java/com/sbaars/adventofcode/year19/intcode/IntcodeComputer.java similarity index 97% rename from src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java rename to src/main/java/com/sbaars/adventofcode/year19/intcode/IntcodeComputer.java index 64155b31..1a7576c6 100644 --- a/src/main/java/com/sbaars/adventofcode2019/intcode/IntcodeComputer.java +++ b/src/main/java/com/sbaars/adventofcode/year19/intcode/IntcodeComputer.java @@ -1,13 +1,12 @@ -package com.sbaars.adventofcode2019.intcode; +package com.sbaars.adventofcode.year19.intcode; +import com.sbaars.adventofcode.year19.util.DoesFileOperations; import java.io.IOException; import java.util.ArrayDeque; import java.util.Arrays; import java.util.Queue; import java.util.stream.IntStream; -import com.sbaars.adventofcode2019.util.DoesFileOperations; - public class IntcodeComputer implements DoesFileOperations { private long[] program; private int instructionCounter = 0; diff --git a/src/main/java/com/sbaars/adventofcode2019/intcode/RetentionPolicy.java b/src/main/java/com/sbaars/adventofcode/year19/intcode/RetentionPolicy.java similarity index 59% rename from src/main/java/com/sbaars/adventofcode2019/intcode/RetentionPolicy.java rename to src/main/java/com/sbaars/adventofcode/year19/intcode/RetentionPolicy.java index f7b366e2..48820c45 100644 --- a/src/main/java/com/sbaars/adventofcode2019/intcode/RetentionPolicy.java +++ b/src/main/java/com/sbaars/adventofcode/year19/intcode/RetentionPolicy.java @@ -1,4 +1,4 @@ -package com.sbaars.adventofcode2019.intcode; +package com.sbaars.adventofcode.year19.intcode; public enum RetentionPolicy { EXIT_ON_EMPTY_INPUT, EXIT_ON_OUTPUT diff --git a/src/main/java/com/sbaars/adventofcode2019/pathfinding/CharGrid2d.java b/src/main/java/com/sbaars/adventofcode/year19/pathfinding/CharGrid2d.java similarity index 98% rename from src/main/java/com/sbaars/adventofcode2019/pathfinding/CharGrid2d.java rename to src/main/java/com/sbaars/adventofcode/year19/pathfinding/CharGrid2d.java index 842824b3..813e6b9b 100644 --- a/src/main/java/com/sbaars/adventofcode2019/pathfinding/CharGrid2d.java +++ b/src/main/java/com/sbaars/adventofcode/year19/pathfinding/CharGrid2d.java @@ -1,4 +1,4 @@ -package com.sbaars.adventofcode2019.pathfinding; +package com.sbaars.adventofcode.year19.pathfinding; import java.awt.Point; import java.util.HashSet; diff --git a/src/main/java/com/sbaars/adventofcode2019/pathfinding/Grid2d.java b/src/main/java/com/sbaars/adventofcode/year19/pathfinding/Grid2d.java similarity index 96% rename from src/main/java/com/sbaars/adventofcode2019/pathfinding/Grid2d.java rename to src/main/java/com/sbaars/adventofcode/year19/pathfinding/Grid2d.java index 461e50f1..3c2e98ee 100644 --- a/src/main/java/com/sbaars/adventofcode2019/pathfinding/Grid2d.java +++ b/src/main/java/com/sbaars/adventofcode/year19/pathfinding/Grid2d.java @@ -1,13 +1,12 @@ -package com.sbaars.adventofcode2019.pathfinding; +package com.sbaars.adventofcode.year19.pathfinding; +import com.sbaars.adventofcode.year19.days.Day15; import java.awt.Point; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; -import com.sbaars.adventofcode2019.days.Day15; - /** * Creates nodes and neighbours from a 2d grid. Each point in the map has an * integer value that specifies the cost of crossing that point. If this value diff --git a/src/main/java/com/sbaars/adventofcode2019/pathfinding/Node.java b/src/main/java/com/sbaars/adventofcode/year19/pathfinding/Node.java similarity index 94% rename from src/main/java/com/sbaars/adventofcode2019/pathfinding/Node.java rename to src/main/java/com/sbaars/adventofcode/year19/pathfinding/Node.java index d99e59f6..f7f9294a 100644 --- a/src/main/java/com/sbaars/adventofcode2019/pathfinding/Node.java +++ b/src/main/java/com/sbaars/adventofcode/year19/pathfinding/Node.java @@ -1,4 +1,4 @@ -package com.sbaars.adventofcode2019.pathfinding; +package com.sbaars.adventofcode.year19.pathfinding; import java.util.Set; /** diff --git a/src/main/java/com/sbaars/adventofcode2019/pathfinding/PathFinding.java b/src/main/java/com/sbaars/adventofcode/year19/pathfinding/PathFinding.java similarity index 97% rename from src/main/java/com/sbaars/adventofcode2019/pathfinding/PathFinding.java rename to src/main/java/com/sbaars/adventofcode/year19/pathfinding/PathFinding.java index 7c13a084..8f17862f 100644 --- a/src/main/java/com/sbaars/adventofcode2019/pathfinding/PathFinding.java +++ b/src/main/java/com/sbaars/adventofcode/year19/pathfinding/PathFinding.java @@ -1,4 +1,4 @@ -package com.sbaars.adventofcode2019.pathfinding; +package com.sbaars.adventofcode.year19.pathfinding; import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; diff --git a/src/main/java/com/sbaars/adventofcode2019/util/CountMap.java b/src/main/java/com/sbaars/adventofcode/year19/util/CountMap.java similarity index 96% rename from src/main/java/com/sbaars/adventofcode2019/util/CountMap.java rename to src/main/java/com/sbaars/adventofcode/year19/util/CountMap.java index 5eb6543b..8e6e779d 100644 --- a/src/main/java/com/sbaars/adventofcode2019/util/CountMap.java +++ b/src/main/java/com/sbaars/adventofcode/year19/util/CountMap.java @@ -1,4 +1,4 @@ -package com.sbaars.adventofcode2019.util; +package com.sbaars.adventofcode.year19.util; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/com/sbaars/adventofcode2019/util/DoesFileOperations.java b/src/main/java/com/sbaars/adventofcode/year19/util/DoesFileOperations.java similarity index 94% rename from src/main/java/com/sbaars/adventofcode2019/util/DoesFileOperations.java rename to src/main/java/com/sbaars/adventofcode/year19/util/DoesFileOperations.java index 29eafacb..c20eb3a5 100644 --- a/src/main/java/com/sbaars/adventofcode2019/util/DoesFileOperations.java +++ b/src/main/java/com/sbaars/adventofcode/year19/util/DoesFileOperations.java @@ -1,4 +1,4 @@ -package com.sbaars.adventofcode2019.util; +package com.sbaars.adventofcode.year19.util; import java.io.File; import java.io.IOException; diff --git a/src/main/java/com/sbaars/adventofcode2019/util/ListMap.java b/src/main/java/com/sbaars/adventofcode/year19/util/ListMap.java similarity index 97% rename from src/main/java/com/sbaars/adventofcode2019/util/ListMap.java rename to src/main/java/com/sbaars/adventofcode/year19/util/ListMap.java index 0ae585d9..a6c90a9f 100644 --- a/src/main/java/com/sbaars/adventofcode2019/util/ListMap.java +++ b/src/main/java/com/sbaars/adventofcode/year19/util/ListMap.java @@ -1,4 +1,4 @@ -package com.sbaars.adventofcode2019.util; +package com.sbaars.adventofcode.year19.util; import java.util.ArrayList; import java.util.Arrays; diff --git a/src/main/java/com/sbaars/adventofcode2019/util/LongCountMap.java b/src/main/java/com/sbaars/adventofcode/year19/util/LongCountMap.java similarity index 96% rename from src/main/java/com/sbaars/adventofcode2019/util/LongCountMap.java rename to src/main/java/com/sbaars/adventofcode/year19/util/LongCountMap.java index 1762fbf5..7943e574 100644 --- a/src/main/java/com/sbaars/adventofcode2019/util/LongCountMap.java +++ b/src/main/java/com/sbaars/adventofcode/year19/util/LongCountMap.java @@ -1,4 +1,4 @@ -package com.sbaars.adventofcode2019.util; +package com.sbaars.adventofcode.year19.util; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/com/sbaars/adventofcode/year20/Main.java b/src/main/java/com/sbaars/adventofcode/year20/Main.java new file mode 100644 index 00000000..0e3f28f1 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year20/Main.java @@ -0,0 +1,4 @@ +package com.sbaars.adventofcode.year20; + +public class Main { +} diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day1.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day1.java new file mode 100644 index 00000000..612fc4d4 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day1.java @@ -0,0 +1,22 @@ +package com.sbaars.adventofcode.year20.days; + +import com.sbaars.adventofcode.common.Day; +import java.io.IOException; + +public class Day1 implements Day +{ + public static void main(String[] args) throws IOException + { + new Day1().printParts(); + } + + @Override + public Object part1() throws IOException { + return ""; + } + + @Override + public Object part2() throws IOException { + return ""; + } +} diff --git a/src/test/java/com/sbaars/adventofcode2019/IntcodeTest.java b/src/test/java/com/sbaars/adventofcode/year19/IntcodeTest.java similarity index 76% rename from src/test/java/com/sbaars/adventofcode2019/IntcodeTest.java rename to src/test/java/com/sbaars/adventofcode/year19/IntcodeTest.java index 760ce827..54a99285 100644 --- a/src/test/java/com/sbaars/adventofcode2019/IntcodeTest.java +++ b/src/test/java/com/sbaars/adventofcode/year19/IntcodeTest.java @@ -1,13 +1,13 @@ -package com.sbaars.adventofcode2019; +package com.sbaars.adventofcode.year19; +import com.sbaars.adventofcode.year19.days.Day5; +import com.sbaars.adventofcode.year19.days.Day7; import java.io.IOException; -import com.sbaars.adventofcode2019.days.Day11; -import com.sbaars.adventofcode2019.days.Day13; -import com.sbaars.adventofcode2019.days.Day2; -import com.sbaars.adventofcode2019.days.Day5; -import com.sbaars.adventofcode2019.days.Day7; -import com.sbaars.adventofcode2019.days.Day9; +import com.sbaars.adventofcode.year19.days.Day11; +import com.sbaars.adventofcode.year19.days.Day13; +import com.sbaars.adventofcode.year19.days.Day2; +import com.sbaars.adventofcode.year19.days.Day9; import junit.framework.Assert; import junit.framework.TestCase; From 3439cdd535914eeabed9bcf8da606342d8aa33f1 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Mon, 30 Nov 2020 18:38:56 +0100 Subject: [PATCH 140/433] More random stuff --- ...en__org_apache_commons_commons_csv_1_8.xml | 4 +- ...ven__org_projectlombok_lombok_1_18_16.xml} | 8 +- .../3b958ff795cedc0f979c4605b123e3f06fdbf53c | 3 + .../442292b8a7efeabbe4cc176709b833b1792140ec | 0 .../4d4b6e693ae645a020fb71d740afe99e9506ccc9 | 0 .../659b4ec94a1ae32e8511c4ea208e89613376dbf6 | 0 .../7d5c368f69ee4bb93748e18637683330bea8a523 | 10 +++ .../821d189e8f8bfdeb5f70c11910cff0b4777e0a2f | 3 + .../92328fcec51c42e3fb52187180a4f4a502ebba2c | 3 + .../94f3e3cfe59a184450809321311bf3609217a96d | 5 ++ .../9c45c172d58a9940cda7b5e76b337d7c1afa53de | 0 .../cd0f342a75021aa326cd024d52b3eca647aec223 | 14 +++ .../e7ebe488706586d5ce697c51ca61d3eb1181465c | 5 ++ .../f2357216b819eab5aa6bdbe48528b65abb2f6dfa | 3 + .idea/sonarlint/issuestore/index.pb | 25 ++++++ .idea/workspace.xml | 89 +++++++++---------- adventofcode2019.iml | 2 +- pom.xml | 17 +++- .../adventofcode/year19/days/Day16.java | 2 +- .../adventofcode/year19/days/Day22.java | 6 +- .../adventofcode/year19/IntcodeTest.java | 45 ---------- 21 files changed, 137 insertions(+), 107 deletions(-) rename .idea/libraries/{Maven__org_projectlombok_lombok_1_18_8.xml => Maven__org_projectlombok_lombok_1_18_16.xml} (64%) create mode 100644 .idea/sonarlint/issuestore/3/b/3b958ff795cedc0f979c4605b123e3f06fdbf53c create mode 100644 .idea/sonarlint/issuestore/4/4/442292b8a7efeabbe4cc176709b833b1792140ec create mode 100644 .idea/sonarlint/issuestore/4/d/4d4b6e693ae645a020fb71d740afe99e9506ccc9 create mode 100644 .idea/sonarlint/issuestore/6/5/659b4ec94a1ae32e8511c4ea208e89613376dbf6 create mode 100644 .idea/sonarlint/issuestore/7/d/7d5c368f69ee4bb93748e18637683330bea8a523 create mode 100644 .idea/sonarlint/issuestore/8/2/821d189e8f8bfdeb5f70c11910cff0b4777e0a2f create mode 100644 .idea/sonarlint/issuestore/9/2/92328fcec51c42e3fb52187180a4f4a502ebba2c create mode 100644 .idea/sonarlint/issuestore/9/4/94f3e3cfe59a184450809321311bf3609217a96d create mode 100644 .idea/sonarlint/issuestore/9/c/9c45c172d58a9940cda7b5e76b337d7c1afa53de create mode 100644 .idea/sonarlint/issuestore/c/d/cd0f342a75021aa326cd024d52b3eca647aec223 create mode 100644 .idea/sonarlint/issuestore/e/7/e7ebe488706586d5ce697c51ca61d3eb1181465c create mode 100644 .idea/sonarlint/issuestore/f/2/f2357216b819eab5aa6bdbe48528b65abb2f6dfa create mode 100644 .idea/sonarlint/issuestore/index.pb delete mode 100644 src/test/java/com/sbaars/adventofcode/year19/IntcodeTest.java diff --git a/.idea/libraries/Maven__org_apache_commons_commons_csv_1_8.xml b/.idea/libraries/Maven__org_apache_commons_commons_csv_1_8.xml index d7c9e96e..c88f83f8 100644 --- a/.idea/libraries/Maven__org_apache_commons_commons_csv_1_8.xml +++ b/.idea/libraries/Maven__org_apache_commons_commons_csv_1_8.xml @@ -1,6 +1,8 @@ - + + + diff --git a/.idea/libraries/Maven__org_projectlombok_lombok_1_18_8.xml b/.idea/libraries/Maven__org_projectlombok_lombok_1_18_16.xml similarity index 64% rename from .idea/libraries/Maven__org_projectlombok_lombok_1_18_8.xml rename to .idea/libraries/Maven__org_projectlombok_lombok_1_18_16.xml index 9843fa42..33d4265f 100644 --- a/.idea/libraries/Maven__org_projectlombok_lombok_1_18_8.xml +++ b/.idea/libraries/Maven__org_projectlombok_lombok_1_18_16.xml @@ -1,13 +1,13 @@ - + - + - + - + \ No newline at end of file diff --git a/.idea/sonarlint/issuestore/3/b/3b958ff795cedc0f979c4605b123e3f06fdbf53c b/.idea/sonarlint/issuestore/3/b/3b958ff795cedc0f979c4605b123e3f06fdbf53c new file mode 100644 index 00000000..5a46a1bd --- /dev/null +++ b/.idea/sonarlint/issuestore/3/b/3b958ff795cedc0f979c4605b123e3f06fdbf53c @@ -0,0 +1,3 @@ + +V +java:S2094"BRemove this empty class, write its code or make it an "interface".(àªÅö \ No newline at end of file diff --git a/.idea/sonarlint/issuestore/4/4/442292b8a7efeabbe4cc176709b833b1792140ec b/.idea/sonarlint/issuestore/4/4/442292b8a7efeabbe4cc176709b833b1792140ec new file mode 100644 index 00000000..e69de29b diff --git a/.idea/sonarlint/issuestore/4/d/4d4b6e693ae645a020fb71d740afe99e9506ccc9 b/.idea/sonarlint/issuestore/4/d/4d4b6e693ae645a020fb71d740afe99e9506ccc9 new file mode 100644 index 00000000..e69de29b diff --git a/.idea/sonarlint/issuestore/6/5/659b4ec94a1ae32e8511c4ea208e89613376dbf6 b/.idea/sonarlint/issuestore/6/5/659b4ec94a1ae32e8511c4ea208e89613376dbf6 new file mode 100644 index 00000000..e69de29b diff --git a/.idea/sonarlint/issuestore/7/d/7d5c368f69ee4bb93748e18637683330bea8a523 b/.idea/sonarlint/issuestore/7/d/7d5c368f69ee4bb93748e18637683330bea8a523 new file mode 100644 index 00000000..5c809696 --- /dev/null +++ b/.idea/sonarlint/issuestore/7/d/7d5c368f69ee4bb93748e18637683330bea8a523 @@ -0,0 +1,10 @@ + +> +java:S1659)"#Declare "steps" on a separate line.(ÎÉÞªúÿÿÿÿ +7 java:S131,""Add a default case to this switch.(ÍÉØ +: +java:S1659"$Declare "walks2" on a separate line.(úì  +R +java:S3655="7Call "Optional#isPresent()" before accessing the value.(‰©Ûóûÿÿÿÿ +: +java:S1659)"Declare "y" on a separate line.(ÎÉÞªúÿÿÿÿ \ No newline at end of file diff --git a/.idea/sonarlint/issuestore/8/2/821d189e8f8bfdeb5f70c11910cff0b4777e0a2f b/.idea/sonarlint/issuestore/8/2/821d189e8f8bfdeb5f70c11910cff0b4777e0a2f new file mode 100644 index 00000000..a2f5656b --- /dev/null +++ b/.idea/sonarlint/issuestore/8/2/821d189e8f8bfdeb5f70c11910cff0b4777e0a2f @@ -0,0 +1,3 @@ + +X java:S106"9Replace this use of System.out or System.err by a logger.(Ù´¨‚ÿÿÿÿÿ8ΚÁÐá. +X java:S106"9Replace this use of System.out or System.err by a logger.(ªÓ¼áþÿÿÿÿ8ΚÁÐá. \ No newline at end of file diff --git a/.idea/sonarlint/issuestore/9/2/92328fcec51c42e3fb52187180a4f4a502ebba2c b/.idea/sonarlint/issuestore/9/2/92328fcec51c42e3fb52187180a4f4a502ebba2c new file mode 100644 index 00000000..c4ae38da --- /dev/null +++ b/.idea/sonarlint/issuestore/9/2/92328fcec51c42e3fb52187180a4f4a502ebba2c @@ -0,0 +1,3 @@ + +G +java:S1612L",Replace this lambda with a method reference.(¯ðå·úÿÿÿÿ \ No newline at end of file diff --git a/.idea/sonarlint/issuestore/9/4/94f3e3cfe59a184450809321311bf3609217a96d b/.idea/sonarlint/issuestore/9/4/94f3e3cfe59a184450809321311bf3609217a96d new file mode 100644 index 00000000..e914dea6 --- /dev/null +++ b/.idea/sonarlint/issuestore/9/4/94f3e3cfe59a184450809321311bf3609217a96d @@ -0,0 +1,5 @@ + +d +java:S1192"IDefine a constant instead of duplicating this literal "OR T J\n" 3 times.(©ŽðŸúÿÿÿÿ +V java:S125"").(ÊØŠûÿÿÿÿÿ \ No newline at end of file diff --git a/.idea/sonarlint/issuestore/f/2/f2357216b819eab5aa6bdbe48528b65abb2f6dfa b/.idea/sonarlint/issuestore/f/2/f2357216b819eab5aa6bdbe48528b65abb2f6dfa new file mode 100644 index 00000000..74b1c2ea --- /dev/null +++ b/.idea/sonarlint/issuestore/f/2/f2357216b819eab5aa6bdbe48528b65abb2f6dfa @@ -0,0 +1,3 @@ + +9 +java:S1659>"#Declare "moon2" on a separate line.(¶–ü· \ No newline at end of file diff --git a/.idea/sonarlint/issuestore/index.pb b/.idea/sonarlint/issuestore/index.pb new file mode 100644 index 00000000..ae35228f --- /dev/null +++ b/.idea/sonarlint/issuestore/index.pb @@ -0,0 +1,25 @@ + +f +6src/main/java/com/sbaars/adventofcode/year20/Main.java,3/b/3b958ff795cedc0f979c4605b123e3f06fdbf53c +f +6src/main/java/com/sbaars/adventofcode/year19/Main.java,8/2/821d189e8f8bfdeb5f70c11910cff0b4777e0a2f +k +;src/main/java/com/sbaars/adventofcode/year20/days/Day1.java,9/c/9c45c172d58a9940cda7b5e76b337d7c1afa53de +k +;src/main/java/com/sbaars/adventofcode/year19/days/Day3.java,7/d/7d5c368f69ee4bb93748e18637683330bea8a523 +l + - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - + @@ -122,13 +100,15 @@ @@ -163,9 +144,21 @@ - + - + + + + + + + + + + + + + \ No newline at end of file diff --git a/adventofcode2019.iml b/adventofcode2019.iml index 4043a43c..1cdc9bbc 100644 --- a/adventofcode2019.iml +++ b/adventofcode2019.iml @@ -18,7 +18,7 @@ - + diff --git a/pom.xml b/pom.xml index fcd7a28c..7b22db75 100644 --- a/pom.xml +++ b/pom.xml @@ -1,6 +1,7 @@ + + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.sbaars @@ -8,6 +9,14 @@ 0.0.1-SNAPSHOT + + org.apache.maven.plugins + maven-compiler-plugin + + 11 + 11 + + org.apache.maven.plugins maven-compiler-plugin @@ -40,8 +49,8 @@ org.projectlombok lombok - 1.18.8 - compile + 1.18.16 + provided com.google.guava diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day16.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day16.java index 649b4caa..fdcf5e7b 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day16.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day16.java @@ -52,7 +52,7 @@ private Object calcRes(int[] nums, final int offset) { System.arraycopy(res, 0, nums, 0, res.length); } - return IntStream.range(offset, offset+8).map(i -> res[i]).mapToObj(Integer::toString).collect(Collectors.joining()); + return Arrays.stream(res, offset, offset + 8).mapToObj(Integer::toString).collect(Collectors.joining()); } public static int[] repeat(int[] arr, int newLength) { diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day22.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day22.java index 7e116593..0c4ecff0 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day22.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day22.java @@ -78,7 +78,7 @@ public void execute(BigInteger[] input, BigInteger deckSize) { } break; case CUT: input[1] = input[1].add(num(amount)); break; case DEAL_WITH_INCREMENT: { - var p = num(amount).modPow(deckSize.subtract(num(2)), deckSize); + BigInteger p = num(amount).modPow(deckSize.subtract(num(2)), deckSize); for(int i = 0; i Date: Mon, 30 Nov 2020 18:42:47 +0100 Subject: [PATCH 141/433] Prepare for 2020 day one --- .idea/workspace.xml | 38 +++++++++---------- .../com/sbaars/adventofcode/year20/Main.java | 12 ++++++ 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index db549693..02143ea3 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -5,26 +5,8 @@ - - - - - - - - - - - - - - - - - - - + - + + + + @@ -128,7 +124,7 @@ diff --git a/src/main/java/com/sbaars/adventofcode/year20/Main.java b/src/main/java/com/sbaars/adventofcode/year20/Main.java index 0e3f28f1..ba9d7e2a 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/Main.java +++ b/src/main/java/com/sbaars/adventofcode/year20/Main.java @@ -1,4 +1,16 @@ package com.sbaars.adventofcode.year20; +import com.sbaars.adventofcode.common.Day; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; + public class Main { + public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException, InvocationTargetException, NoSuchMethodException { + for(int day = 1; day<=1; day++) { + System.out.println("Day "+day+":"); + Day instance = (Day)Class.forName("com.sbaars.adventofcode.year20.days.Day"+day).getDeclaredConstructor().newInstance(); + instance.printParts(); + System.out.println(); + } + } } From f6044633d3765c6dee94ae1cff1173e0dae810b1 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Mon, 30 Nov 2020 18:56:08 +0100 Subject: [PATCH 142/433] Simplify some things with commons/guava --- .idea/workspace.xml | 45 +++++++++++-- .../adventofcode/year19/days/Day20.java | 6 +- .../sbaars/adventofcode/year19/days/Day6.java | 19 ++++-- .../year19/util/DoesFileOperations.java | 15 ++--- .../adventofcode/year19/util/ListMap.java | 65 ------------------- 5 files changed, 63 insertions(+), 87 deletions(-) delete mode 100644 src/main/java/com/sbaars/adventofcode/year19/util/ListMap.java diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 02143ea3..a2249eea 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -6,7 +6,10 @@ - + + + + - + + + - + + @@ -124,7 +141,7 @@ @@ -140,10 +157,30 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day20.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day20.java index 712c6e35..a9243538 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day20.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day20.java @@ -1,8 +1,8 @@ package com.sbaars.adventofcode.year19.days; +import com.google.common.collect.ArrayListMultimap; import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year19.pathfinding.CharGrid2d; -import com.sbaars.adventofcode.year19.util.ListMap; import java.awt.Point; import java.io.IOException; import java.util.ArrayDeque; @@ -26,7 +26,7 @@ public class Day20 implements Day { CharGrid2d charGrid; private final Map portals = new HashMap<>(); private final Map portalLabel = new HashMap<>(); - private final ListMap routes = new ListMap<>(); + private final ArrayListMultimap routes = ArrayListMultimap.create(); private final List portalsToTake = new ArrayList<>(); private Portal entry; private Portal exit; @@ -136,7 +136,7 @@ private void determineRoutes(Portal p) { for(Portal portal : portalsToTake) { if(!portal.pos.equals(p.pos)) { List route = charGrid.findPath(p.pos, portal.pos); - if(!route.isEmpty()) routes.addTo(p, new Route(teleport(portal), route.size())); + if(!route.isEmpty()) routes.put(p, new Route(teleport(portal), route.size())); } } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day6.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day6.java index 7da6d190..adf0f9ab 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day6.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day6.java @@ -1,19 +1,24 @@ package com.sbaars.adventofcode.year19.days; +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.ImmutableListMultimap; +import com.google.common.collect.ListMultimap; +import com.google.common.collect.Multimaps; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.List; +import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; import com.sbaars.adventofcode.common.Day; -import com.sbaars.adventofcode.year19.util.ListMap; -public class Day6 implements Day { +public class Day6 implements Day { - ListMap orbits = new ListMap<>(); + ArrayListMultimap orbits = ArrayListMultimap.create(); public static void main(String[] args) throws IOException { @@ -25,15 +30,15 @@ public Object part1() throws IOException { String[] nums = createOrbitArray(); for(String num : nums) { String[] parts = num.split("\\)"); - orbits.addTo(parts[0], parts[1]); + orbits.put(parts[0], parts[1]); } AtomicInteger o = new AtomicInteger(); - for(Entry> entry : orbits.entrySet()) + for(Entry> entry : orbits.asMap().entrySet()) countOrbitsInList(orbits, o, entry.getValue()); return o.get(); } - private void countOrbitsInList(ListMap orbits, AtomicInteger o, List entry) { + private void countOrbitsInList(ArrayListMultimap orbits, AtomicInteger o, Collection entry) { for(String str : entry) { o.incrementAndGet(); if(orbits.containsKey(str)) { @@ -72,7 +77,7 @@ private List collectAll(String s1) { } public List findOrbit(String orbitValue) { - return orbits.entrySet().stream().filter(e -> e.getValue().contains(orbitValue)).map(e -> e.getKey()).collect(Collectors.toList()); + return orbits.asMap().entrySet().stream().filter(e -> e.getValue().contains(orbitValue)).map(e -> e.getKey()).collect(Collectors.toList()); } private String[] createOrbitArray() throws IOException { diff --git a/src/main/java/com/sbaars/adventofcode/year19/util/DoesFileOperations.java b/src/main/java/com/sbaars/adventofcode/year19/util/DoesFileOperations.java index c20eb3a5..9bc8a005 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/util/DoesFileOperations.java +++ b/src/main/java/com/sbaars/adventofcode/year19/util/DoesFileOperations.java @@ -1,26 +1,25 @@ package com.sbaars.adventofcode.year19.util; +import static org.apache.commons.io.FileUtils.readFileToString; + import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.util.Arrays; +import org.apache.commons.io.FileUtils; public interface DoesFileOperations { - - public default String getFileAsString(File file) throws IOException { - return new String(Files.readAllBytes(file.toPath()), StandardCharsets.UTF_8); - } - public default String getResourceAsString(String resource) throws IOException { - return getFileAsString(new File(DoesFileOperations.class.getClassLoader().getResource(resource).getFile())); + default String getResourceAsString(String resource) throws IOException { + return readFileToString(new File(DoesFileOperations.class.getClassLoader().getResource(resource).getFile())); } - public default String readDay(int day) throws IOException { + default String readDay(int day) throws IOException { return getResourceAsString("day"+day+".txt"); } - public default long[] readLongArray(int day) throws IOException { + default long[] readLongArray(int day) throws IOException { return Arrays.stream(readDay(day).split(",")).mapToLong(Long::parseLong).toArray(); } } \ No newline at end of file diff --git a/src/main/java/com/sbaars/adventofcode/year19/util/ListMap.java b/src/main/java/com/sbaars/adventofcode/year19/util/ListMap.java deleted file mode 100644 index a6c90a9f..00000000 --- a/src/main/java/com/sbaars/adventofcode/year19/util/ListMap.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.sbaars.adventofcode.year19.util; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -public class ListMap extends HashMap> { - /** - * - */ - private static final long serialVersionUID = 1L; - - public ListMap() { - } - - public ListMap(int initialCapacity, float loadFactor) { - super(initialCapacity, loadFactor); - } - - public ListMap(int initialCapacity) { - super(initialCapacity); - } - - public ListMap(Map> m) { - super(m); - } - - public List addTo(K key, V value) { - List l; - if(super.containsKey(key)) { - l = super.get(key); - } else l = new ArrayList<>(); - l.add(value); - return super.put(key, l); - } - - public List addTo(K key, V[] value) { - List l; - if(super.containsKey(key)) { - l = super.get(key); - } else l = new ArrayList<>(); - Collections.addAll(l, value); - return super.put(key, l); - } - - @SuppressWarnings("unchecked") - @Override - public List get(Object key){ - if(!super.containsKey(key)) - super.put((K) key, new ArrayList<>()); - return super.get(key); - } - - public Entry> getEntryForValue(V i) { - System.out.println(Arrays.toString(values().toArray())); - Optional>> findAny = entrySet().stream().filter(e -> e.getValue().contains(i)).findAny(); - if(!findAny.isPresent()) - throw new IllegalAccessError("Value "+i+" does not exist in this map!"); - return findAny.get(); - } -} From 0f5911bb829dad96ecf43d8f18c14e2136fb8744 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Mon, 30 Nov 2020 19:36:08 +0100 Subject: [PATCH 143/433] 2018 part 1 --- .idea/uiDesigner.xml | 124 +++ .idea/workspace.xml | 118 ++- .../com/sbaars/adventofcode/common/Day.java | 7 +- .../common/DoesFileOperations.java | 42 + .../adventofcode/common/ProcessesImages.java | 2 +- .../com/sbaars/adventofcode/year18/Main.java | 16 + .../sbaars/adventofcode/year18/days/Day1.java | 23 + .../sbaars/adventofcode/year19/days/Day1.java | 2 +- .../adventofcode/year19/days/Day10.java | 2 +- .../adventofcode/year19/days/Day14.java | 2 +- .../adventofcode/year19/days/Day16.java | 3 +- .../adventofcode/year19/days/Day18.java | 2 +- .../adventofcode/year19/days/Day20.java | 2 +- .../adventofcode/year19/days/Day22.java | 2 +- .../adventofcode/year19/days/Day23.java | 2 +- .../adventofcode/year19/days/Day24.java | 4 +- .../adventofcode/year19/days/Day25.java | 4 +- .../sbaars/adventofcode/year19/days/Day3.java | 2 +- .../sbaars/adventofcode/year19/days/Day6.java | 6 +- .../sbaars/adventofcode/year19/days/Day8.java | 2 +- .../year19/intcode/IntcodeComputer.java | 4 +- .../year19/util/DoesFileOperations.java | 25 - .../sbaars/adventofcode/year20/days/Day1.java | 4 +- src/main/resources/2018/day1.txt | 990 ++++++++++++++++++ src/main/resources/{ => 2019}/day1.txt | 0 src/main/resources/{ => 2019}/day10.txt | 0 src/main/resources/{ => 2019}/day11.txt | 0 src/main/resources/{ => 2019}/day12.txt | 0 src/main/resources/{ => 2019}/day13.txt | 0 src/main/resources/{ => 2019}/day14.txt | 0 src/main/resources/{ => 2019}/day15.txt | 0 src/main/resources/{ => 2019}/day16.txt | 0 src/main/resources/{ => 2019}/day17.txt | 0 src/main/resources/{ => 2019}/day18.txt | 0 src/main/resources/{ => 2019}/day19.txt | 0 src/main/resources/{ => 2019}/day2.txt | 0 src/main/resources/{ => 2019}/day20.txt | 0 src/main/resources/{ => 2019}/day21.txt | 0 src/main/resources/{ => 2019}/day22.txt | 0 src/main/resources/{ => 2019}/day23.txt | 0 src/main/resources/{ => 2019}/day24.txt | 0 src/main/resources/{ => 2019}/day25.txt | 0 src/main/resources/{ => 2019}/day3.txt | 0 src/main/resources/{ => 2019}/day4.txt | 0 src/main/resources/{ => 2019}/day5.txt | 0 src/main/resources/{ => 2019}/day6.txt | 0 src/main/resources/{ => 2019}/day7.txt | 0 src/main/resources/{ => 2019}/day8.txt | 0 src/main/resources/{ => 2019}/day9.txt | 0 src/main/resources/2020/day1.txt | 0 50 files changed, 1323 insertions(+), 67 deletions(-) create mode 100644 .idea/uiDesigner.xml create mode 100644 src/main/java/com/sbaars/adventofcode/common/DoesFileOperations.java create mode 100644 src/main/java/com/sbaars/adventofcode/year18/Main.java create mode 100644 src/main/java/com/sbaars/adventofcode/year18/days/Day1.java delete mode 100644 src/main/java/com/sbaars/adventofcode/year19/util/DoesFileOperations.java create mode 100644 src/main/resources/2018/day1.txt rename src/main/resources/{ => 2019}/day1.txt (100%) rename src/main/resources/{ => 2019}/day10.txt (100%) rename src/main/resources/{ => 2019}/day11.txt (100%) rename src/main/resources/{ => 2019}/day12.txt (100%) rename src/main/resources/{ => 2019}/day13.txt (100%) rename src/main/resources/{ => 2019}/day14.txt (100%) rename src/main/resources/{ => 2019}/day15.txt (100%) rename src/main/resources/{ => 2019}/day16.txt (100%) rename src/main/resources/{ => 2019}/day17.txt (100%) rename src/main/resources/{ => 2019}/day18.txt (100%) rename src/main/resources/{ => 2019}/day19.txt (100%) rename src/main/resources/{ => 2019}/day2.txt (100%) rename src/main/resources/{ => 2019}/day20.txt (100%) rename src/main/resources/{ => 2019}/day21.txt (100%) rename src/main/resources/{ => 2019}/day22.txt (100%) rename src/main/resources/{ => 2019}/day23.txt (100%) rename src/main/resources/{ => 2019}/day24.txt (100%) rename src/main/resources/{ => 2019}/day25.txt (100%) rename src/main/resources/{ => 2019}/day3.txt (100%) rename src/main/resources/{ => 2019}/day4.txt (100%) rename src/main/resources/{ => 2019}/day5.txt (100%) rename src/main/resources/{ => 2019}/day6.txt (100%) rename src/main/resources/{ => 2019}/day7.txt (100%) rename src/main/resources/{ => 2019}/day8.txt (100%) rename src/main/resources/{ => 2019}/day9.txt (100%) create mode 100644 src/main/resources/2020/day1.txt diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 00000000..e96534fb --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml index a2249eea..4597bc35 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -5,11 +5,55 @@ + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + @@ -141,7 +217,7 @@ @@ -165,22 +241,38 @@ - + + + + + + + + + + + + + + + + + - - + + - - + + - - + + - + diff --git a/src/main/java/com/sbaars/adventofcode/common/Day.java b/src/main/java/com/sbaars/adventofcode/common/Day.java index 12e0c716..cba06e20 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Day.java +++ b/src/main/java/com/sbaars/adventofcode/common/Day.java @@ -1,13 +1,12 @@ package com.sbaars.adventofcode.common; -import com.sbaars.adventofcode.year19.util.DoesFileOperations; import java.io.IOException; public interface Day extends DoesFileOperations { - public Object part1() throws IOException; - public Object part2() throws IOException; + Object part1() throws IOException; + Object part2() throws IOException; - public default void printParts() throws IOException { + default void printParts() throws IOException { System.out.println("Part 1: "+part1()); System.out.println("Part 2: "+part2()); } diff --git a/src/main/java/com/sbaars/adventofcode/common/DoesFileOperations.java b/src/main/java/com/sbaars/adventofcode/common/DoesFileOperations.java new file mode 100644 index 00000000..9ddecb88 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/common/DoesFileOperations.java @@ -0,0 +1,42 @@ +package com.sbaars.adventofcode.common; + +import static org.apache.commons.io.FileUtils.readFileToString; + +import java.io.File; +import java.io.IOException; +import java.util.Arrays; + +public interface DoesFileOperations { + + default String getResourceAsString(String resource) throws IOException { + return readFileToString(new File(DoesFileOperations.class.getClassLoader().getResource(resource).getFile())); + } + + default String day2019(int day) throws IOException { + return getResourceAsString("2019/day"+day+".txt"); + } + + default String day2018(int day) throws IOException { + return getResourceAsString("2018/day"+day+".txt"); + } + + default String day(int day) throws IOException { + return getResourceAsString("2020/day"+day+".txt"); + } + + default String[] dayStrings(int day) throws IOException { + return Arrays.stream(day(day).split(System.lineSeparator())).toArray(String[]::new); + } + + default long[] dayNumbers2019(int day) throws IOException { + return Arrays.stream(day2019(day).split(",")).mapToLong(Long::parseLong).toArray(); + } + + default long[] dayNumbers(int day, String split) throws IOException { + return Arrays.stream(day(day).split(split)).mapToLong(Long::parseLong).toArray(); + } + + default long[] dayNumbers2018(int day, String split) throws IOException { + return Arrays.stream(day2018(day).split(split)).mapToLong(Long::parseLong).toArray(); + } +} \ No newline at end of file diff --git a/src/main/java/com/sbaars/adventofcode/common/ProcessesImages.java b/src/main/java/com/sbaars/adventofcode/common/ProcessesImages.java index 6de44f43..752a4e47 100644 --- a/src/main/java/com/sbaars/adventofcode/common/ProcessesImages.java +++ b/src/main/java/com/sbaars/adventofcode/common/ProcessesImages.java @@ -4,7 +4,7 @@ import java.util.stream.Collectors; public interface ProcessesImages { - public default String printAsciiArray(int[][] pixels) { + default String printAsciiArray(int[][] pixels) { return System.lineSeparator()+Arrays.stream(pixels).map(a -> Arrays.stream(a).boxed().map(x -> x == 0 ? " " : "â–ˆ").collect(Collectors.joining())).collect(Collectors.joining(System.lineSeparator())); } } diff --git a/src/main/java/com/sbaars/adventofcode/year18/Main.java b/src/main/java/com/sbaars/adventofcode/year18/Main.java new file mode 100644 index 00000000..7d375a0e --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year18/Main.java @@ -0,0 +1,16 @@ +package com.sbaars.adventofcode.year18; + +import com.sbaars.adventofcode.common.Day; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; + +public class Main { + public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException, InvocationTargetException, NoSuchMethodException { + for(int day = 1; day<=1; day++) { + System.out.println("Day "+day+":"); + Day instance = (Day)Class.forName("com.sbaars.adventofcode.year18.days.Day"+day).getDeclaredConstructor().newInstance(); + instance.printParts(); + System.out.println(); + } + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year18/days/Day1.java b/src/main/java/com/sbaars/adventofcode/year18/days/Day1.java new file mode 100644 index 00000000..4ce11ed7 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year18/days/Day1.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year18.days; + +import com.sbaars.adventofcode.common.Day; +import java.io.IOException; +import java.util.stream.LongStream; + +public class Day1 implements Day +{ + public static void main(String[] args) throws IOException + { + new Day1().printParts(); + } + + @Override + public Object part1() throws IOException { + return LongStream.of(dayNumbers2018(1, "\n")).sum(); + } + + @Override + public Object part2() throws IOException { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day1.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day1.java index 8b48f91d..bf594021 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day1.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day1.java @@ -24,7 +24,7 @@ public Object part2() throws IOException { } private IntStream createNumberStream() throws IOException { - return Arrays.stream(readDay(1).split(System.lineSeparator())).mapToInt(Integer::parseInt); + return Arrays.stream(day2019(1).split(System.lineSeparator())).mapToInt(Integer::parseInt); } private int getRequiredFuel(int mass) { diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day10.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day10.java index 60871fb7..32e59a49 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day10.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day10.java @@ -17,7 +17,7 @@ public class Day10 implements Day { private Point baseLocation; public Day10() throws IOException { - String[] mapString = Arrays.stream(readDay(10).split(System.lineSeparator())).toArray(String[]::new); + String[] mapString = Arrays.stream(day2019(10).split(System.lineSeparator())).toArray(String[]::new); this.asteroids = IntStream.range(0, mapString.length).boxed().flatMap(i -> IntStream.range(0, mapString[i].length()).mapToObj(j -> new Point(j, i))).filter(p -> mapString[p.y].charAt(p.x) == '#').collect(Collectors.toList()); } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day14.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day14.java index 782b0900..0c5320aa 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day14.java @@ -10,7 +10,7 @@ public class Day14 implements Day { private Trade[] trades; public Day14() throws IOException { - this.trades = Arrays.stream(readDay(14).split(System.lineSeparator())).map(Trade::new).toArray(Trade[]::new); + this.trades = Arrays.stream(day2019(14).split(System.lineSeparator())).map(Trade::new).toArray(Trade[]::new); } public static void main(String[] args) throws IOException { diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day16.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day16.java index fdcf5e7b..5ed7d3cc 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day16.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day16.java @@ -4,7 +4,6 @@ import java.io.IOException; import java.util.Arrays; import java.util.stream.Collectors; -import java.util.stream.IntStream; public class Day16 implements Day { @@ -12,7 +11,7 @@ public class Day16 implements Day { private final int[] input; public Day16() throws IOException { - input = readDay(16).chars().map(e -> Character.getNumericValue(e)).toArray(); + input = day2019(16).chars().map(e -> Character.getNumericValue(e)).toArray(); } public static void main(String[] args) throws IOException { diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day18.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day18.java index 1c720659..d2ab5cc1 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day18.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day18.java @@ -29,7 +29,7 @@ public class Day18 implements Day { private final Point middle; public Day18() throws IOException { - grid = Arrays.stream(readDay(18).split(System.lineSeparator())).map(e -> e.toCharArray()).toArray(char[][]::new); + grid = Arrays.stream(day2019(18).split(System.lineSeparator())).map(e -> e.toCharArray()).toArray(char[][]::new); charGrid = new CharGrid2d(grid, false); middle = findPos('@').get(0); } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day20.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day20.java index a9243538..7427394f 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day20.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day20.java @@ -56,7 +56,7 @@ public State(int totalSteps, Visited vis) { } public Day20() throws IOException { - grid = Arrays.stream(readDay(20).split(System.lineSeparator())).map(e -> e.toCharArray()).toArray(char[][]::new); + grid = Arrays.stream(day2019(20).split(System.lineSeparator())).map(e -> e.toCharArray()).toArray(char[][]::new); charGrid = new CharGrid2d(grid, false); int[] rows = {2, 26, 80, 104}; diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day22.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day22.java index 0c4ecff0..7039c107 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day22.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day22.java @@ -19,7 +19,7 @@ public class Day22 implements Day { Move[] moves; public Day22() throws IOException { - this.moves = Arrays.stream(readDay(22).split(System.lineSeparator())).map(Move::new).toArray(Move[]::new); + this.moves = Arrays.stream(day2019(22).split(System.lineSeparator())).map(Move::new).toArray(Move[]::new); } public static void main(String[] args) throws IOException { diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day23.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day23.java index d3e1cb52..c2ada1ad 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day23.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day23.java @@ -23,7 +23,7 @@ public Object part2() throws IOException { } private long getNetworkNumber(boolean returnNatY) throws IOException { - long[] program = readLongArray(23); + long[] program = dayNumbers2019(23); IntcodeComputer[] ic = IntStream.range(0, 50).mapToObj(i -> new IntcodeComputer(RetentionPolicy.EXIT_ON_EMPTY_INPUT, program, i, -1)).toArray(IntcodeComputer[]::new); long[] nat = new long[2]; long sentByNat = -1; diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day24.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day24.java index 7f6975c2..912f9870 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day24.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day24.java @@ -30,7 +30,7 @@ public class Day24 implements Day { } public Day24() throws IOException { - this.initialGrid = Arrays.stream(readDay(24).split(System.lineSeparator())).map(e -> e.toCharArray()).toArray(char[][]::new); + this.initialGrid = Arrays.stream(day2019(24).split(System.lineSeparator())).map(e -> e.toCharArray()).toArray(char[][]::new); } public static void main(String[] args) throws IOException { @@ -79,7 +79,7 @@ private int num(char[][] grid, Point p) { @Override public Object part2() throws IOException { - char[][] grid = Arrays.stream(readDay(24).split(System.lineSeparator())).map(e -> e.toCharArray()).toArray(char[][]::new); + char[][] grid = Arrays.stream(day2019(24).split(System.lineSeparator())).map(e -> e.toCharArray()).toArray(char[][]::new); for(int i = -200; i<=200; i++) layers.put(i, fill(new char[grid.length][grid[0].length], '.')); layers.put(0, grid); for(int i =0; i<200; i++) { diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day25.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day25.java index 0edbd63c..2a6e6372 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day25.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day25.java @@ -15,7 +15,7 @@ public static void main(String[] args) throws IOException { } private void play() throws IOException { - IntcodeComputer ic = new IntcodeComputer(RetentionPolicy.EXIT_ON_EMPTY_INPUT, readLongArray(25)); + IntcodeComputer ic = new IntcodeComputer(RetentionPolicy.EXIT_ON_EMPTY_INPUT, dayNumbers2019(25)); while(true) { long res; while((res = ic.run()) != IntcodeComputer.STOP_CODE) System.out.print((char)res); @@ -25,7 +25,7 @@ private void play() throws IOException { @Override public Object part1() throws IOException { - IntcodeComputer ic = new IntcodeComputer(RetentionPolicy.EXIT_ON_EMPTY_INPUT, readLongArray(25)); + IntcodeComputer ic = new IntcodeComputer(RetentionPolicy.EXIT_ON_EMPTY_INPUT, dayNumbers2019(25)); String[] inputs = new String [] {"west", "take semiconductor", "west", "take planetoid", "west", "take food ration", "west", "take fixed point", "east", "east", "south", "east", "east", "north", "east", "north"}; String numbers = ""; for(int i = 0; i<=inputs.length; i++) { diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day3.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day3.java index c794c4c2..f51b4996 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day3.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day3.java @@ -15,7 +15,7 @@ public class Day3 implements Day private Set intersect; public Day3() throws IOException { - String[] strings = Arrays.stream(readDay(3).split(System.lineSeparator())).toArray(String[]::new); + String[] strings = Arrays.stream(day2019(3).split(System.lineSeparator())).toArray(String[]::new); Walk[] walks1 = mapToWalks(strings[0]), walks2 = mapToWalks(strings[1]); Set walkedLocations = new HashSet<>(); calculateDistance(walks1, walkedLocations, false); diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day6.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day6.java index adf0f9ab..22dab707 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day6.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day6.java @@ -1,15 +1,11 @@ package com.sbaars.adventofcode.year19.days; import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.ImmutableListMultimap; -import com.google.common.collect.ListMultimap; -import com.google.common.collect.Multimaps; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; -import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; @@ -81,6 +77,6 @@ public List findOrbit(String orbitValue) { } private String[] createOrbitArray() throws IOException { - return Arrays.stream(readDay(6).split(System.lineSeparator())).toArray(String[]::new); + return Arrays.stream(day2019(6).split(System.lineSeparator())).toArray(String[]::new); } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day8.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day8.java index d6fd30d9..1b2b234d 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day8.java @@ -27,7 +27,7 @@ public Object part1() throws IOException { } private int[] readPixels() throws IOException { - char[] chars = readDay(8).toCharArray(); + char[] chars = day2019(8).toCharArray(); return IntStream.range(0, chars.length).map(i -> Character.getNumericValue(chars[i])).toArray(); } diff --git a/src/main/java/com/sbaars/adventofcode/year19/intcode/IntcodeComputer.java b/src/main/java/com/sbaars/adventofcode/year19/intcode/IntcodeComputer.java index 1a7576c6..5915eb47 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/intcode/IntcodeComputer.java +++ b/src/main/java/com/sbaars/adventofcode/year19/intcode/IntcodeComputer.java @@ -1,6 +1,6 @@ package com.sbaars.adventofcode.year19.intcode; -import com.sbaars.adventofcode.year19.util.DoesFileOperations; +import com.sbaars.adventofcode.common.DoesFileOperations; import java.io.IOException; import java.util.ArrayDeque; import java.util.Arrays; @@ -25,7 +25,7 @@ public IntcodeComputer(RetentionPolicy policy, long[] program, long...input) { } public IntcodeComputer(int day, long...input) throws IOException { - this.program = readLongArray(day); + this.program = dayNumbers2019(day); this.program = Arrays.copyOf(this.program, 10000); if(day == 2) { this.program[1] = input[0]; diff --git a/src/main/java/com/sbaars/adventofcode/year19/util/DoesFileOperations.java b/src/main/java/com/sbaars/adventofcode/year19/util/DoesFileOperations.java deleted file mode 100644 index 9bc8a005..00000000 --- a/src/main/java/com/sbaars/adventofcode/year19/util/DoesFileOperations.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.sbaars.adventofcode.year19.util; - -import static org.apache.commons.io.FileUtils.readFileToString; - -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.util.Arrays; -import org.apache.commons.io.FileUtils; - -public interface DoesFileOperations { - - default String getResourceAsString(String resource) throws IOException { - return readFileToString(new File(DoesFileOperations.class.getClassLoader().getResource(resource).getFile())); - } - - default String readDay(int day) throws IOException { - return getResourceAsString("day"+day+".txt"); - } - - default long[] readLongArray(int day) throws IOException { - return Arrays.stream(readDay(day).split(",")).mapToLong(Long::parseLong).toArray(); - } -} \ No newline at end of file diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day1.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day1.java index 612fc4d4..6fa1e8e2 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day1.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day1.java @@ -5,13 +5,13 @@ public class Day1 implements Day { - public static void main(String[] args) throws IOException - { + public static void main(String[] args) throws IOException { new Day1().printParts(); } @Override public Object part1() throws IOException { + String[] s = dayStrings(1); return ""; } diff --git a/src/main/resources/2018/day1.txt b/src/main/resources/2018/day1.txt new file mode 100644 index 00000000..c1aec986 --- /dev/null +++ b/src/main/resources/2018/day1.txt @@ -0,0 +1,990 @@ +13 +-16 +18 +11 +15 +10 +-4 +-19 +14 +-19 +-17 +-19 +-2 +6 +2 +21 +5 +12 +-10 +-10 +18 +-11 +2 +17 +-5 +14 +14 +-3 +-12 +10 +7 +-3 +6 +-2 +8 +-17 +-18 +-19 +-14 +9 +-16 +-1 +-1 +11 +-3 +8 +-12 +10 +14 +12 +-18 +19 +-5 +13 +1 +4 +2 +11 +-3 +-2 +18 +8 +-4 +15 +-7 +-3 +18 +16 +2 +-4 +-12 +-19 +-4 +12 +15 +-17 +1 +-16 +-5 +15 +26 +9 +9 +-3 +-5 +3 +3 +-11 +-8 +-11 +-16 +14 +14 +14 +17 +14 +11 +-9 +18 +-10 +-4 +-11 +-10 +-9 +8 +12 +-6 +-1 +-2 +12 +-17 +-1 +17 +-10 +9 +11 +6 +3 +18 +19 +11 +-3 +15 +-3 +-2 +18 +17 +13 +13 +-6 +16 +10 +7 +-6 +-15 +-15 +-1 +15 +6 +-2 +-12 +19 +-1 +17 +18 +-8 +-11 +-18 +12 +-3 +-14 +6 +-12 +1 +-11 +-9 +13 +-3 +-15 +-19 +-16 +-3 +7 +7 +-17 +-18 +3 +-2 +-12 +-1 +16 +15 +10 +7 +-13 +7 +13 +14 +5 +18 +-14 +-8 +-4 +15 +-20 +-17 +-17 +11 +-15 +-14 +-10 +-1 +5 +-11 +18 +-4 +-19 +15 +-8 +14 +-20 +-12 +10 +-11 +-12 +16 +-7 +-7 +4 +-18 +-8 +11 +13 +-6 +24 +8 +4 +-19 +11 +15 +3 +-17 +30 +9 +10 +6 +-2 +3 +14 +8 +-3 +-12 +1 +5 +-8 +11 +10 +16 +6 +16 +1 +21 +19 +18 +18 +15 +15 +8 +2 +-6 +-16 +5 +-10 +18 +-12 +16 +6 +18 +-6 +-2 +5 +-14 +-17 +-14 +-13 +-7 +16 +-8 +-11 +-3 +8 +-13 +6 +3 +-5 +6 +5 +1 +12 +14 +10 +12 +-20 +12 +-15 +8 +4 +-7 +-9 +-1 +11 +-22 +-4 +-14 +-4 +-18 +6 +2 +8 +-4 +-1 +16 +-17 +-1 +-2 +-10 +-10 +-10 +16 +3 +-12 +2 +-1 +4 +-15 +18 +-2 +-9 +-6 +-22 +7 +16 +-5 +17 +13 +2 +-1 +3 +-11 +10 +-25 +-14 +17 +-15 +3 +43 +19 +12 +1 +-8 +4 +8 +-11 +-40 +-29 +-30 +-12 +18 +-15 +-5 +-14 +10 +-16 +1 +-34 +-13 +-20 +-7 +12 +9 +16 +-2 +-2 +9 +23 +15 +-8 +-38 +-37 +-8 +-20 +11 +-24 +-2 +14 +-24 +-18 +2 +-7 +14 +1 +19 +-5 +-23 +-11 +-15 +23 +8 +-14 +16 +-25 +-19 +8 +-3 +-20 +11 +-15 +-11 +-14 +16 +-31 +18 +25 +20 +-6 +11 +48 +-7 +-18 +-2 +-31 +21 +-49 +50 +-20 +-44 +8 +-81 +24 +-16 +-18 +26 +-60 +19 +-36 +-14 +-41 +25 +-72 +-46 +1 +-46 +-61361 +12 +-18 +-7 +-9 +6 +14 +-13 +-8 +19 +19 +11 +9 +2 +9 +-18 +-3 +20 +-4 +-11 +4 +14 +3 +-11 +2 +2 +-13 +-17 +3 +19 +-13 +-16 +11 +14 +-5 +12 +16 +17 +15 +6 +6 +2 +-1 +15 +6 +-3 +-5 +-6 +20 +16 +7 +1 +-5 +9 +12 +-2 +11 +-16 +6 +-14 +-3 +-11 +-8 +-18 +-9 +2 +12 +-15 +20 +1 +1 +10 +5 +17 +7 +-2 +-14 +1 +10 +-1 +12 +12 +-37 +-13 +-3 +5 +3 +18 +-14 +-26 +11 +-14 +-3 +-14 +-6 +-21 +2 +-8 +-3 +18 +-3 +18 +-10 +-15 +-6 +10 +5 +17 +14 +-16 +-10 +6 +-2 +-1 +-6 +-12 +14 +-5 +-11 +-11 +7 +-6 +9 +20 +-11 +-21 +14 +-7 +-8 +-29 +-12 +-2 +-3 +-17 +9 +-7 +13 +18 +-9 +-11 +12 +11 +-1 +-24 +-7 +-14 +-13 +-18 +9 +-16 +19 +18 +16 +2 +-13 +-19 +7 +-19 +-1 +-8 +-16 +2 +15 +-16 +18 +13 +-19 +-3 +-2 +-4 +-14 +9 +10 +-14 +-15 +6 +8 +-12 +-11 +-3 +-12 +-4 +-18 +14 +-13 +-10 +-14 +15 +3 +-15 +2 +1 +-9 +-11 +-1 +-17 +16 +-5 +-2 +19 +-8 +-19 +-3 +-19 +12 +-17 +6 +16 +19 +4 +-5 +-4 +-11 +13 +15 +7 +-11 +16 +4 +-1 +18 +-15 +20 +-11 +8 +-13 +19 +7 +11 +19 +-1 +-7 +-17 +-2 +-19 +-11 +15 +-11 +-16 +15 +-10 +25 +-5 +9 +17 +-16 +12 +10 +5 +-2 +-17 +11 +16 +-4 +-3 +-4 +-4 +-3 +-7 +4 +-9 +-19 +1 +-5 +29 +2 +28 +15 +20 +-15 +-13 +20 +20 +3 +-10 +-11 +20 +5 +14 +6 +-18 +-13 +1 +15 +30 +-23 +28 +-7 +-10 +-19 +-21 +20 +-5 +12 +-9 +-10 +-9 +-15 +-23 +-1 +17 +-2 +-10 +-1 +-13 +28 +22 +-6 +-8 +43 +42 +-8 +27 +4 +-18 +49 +19 +-8 +9 +-2 +-1 +37 +-12 +-11 +17 +15 +-6 +24 +19 +6 +-74 +6 +26 +-317 +4 +-23 +-9 +-17 +-17 +13 +-19 +8 +14 +-6 +-6 +1 +10 +10 +-1 +9 +-7 +18 +-9 +-8 +-4 +7 +18 +-3 +-16 +18 +-5 +11 +12 +-1 +9 +11 +-14 +-9 +19 +24 +30 +-27 +76 +-35 +-34 +-82 +14 +-25 +-10 +-3 +-7 +-14 +16 +-4 +-2 +-5 +-18 +9 +-7 +-1 +6 +-15 +11 +18 +-4 +16 +-9 +11 +-16 +-25 +-11 +21 +6 +5 +-10 +7 +20 +22 +-10 +4 +-10 +-16 +-6 +-18 +-31 +-69 +-12 +-18 +-25 +-8 +49 +50 +-19 +60 +-16 +-96 +200 +34 +-148 +-153 +-45 +-1 +-45 +-61788 +-16 +-5 +-8 +-6 +3 +-6 +16 +18 +10 +-14 +9 +-20 +6 +18 +9 +13 +7 +11 +-5 +-11 +17 +13 +-4 +-4 +-3 +-11 +-17 +-2 +4 +9 +-15 +-3 +19 +-9 +-12 +-17 +5 +-14 +17 +-7 +-23 +-11 +3 +-13 +4 +19 +-14 +-17 +10 +1 +4 +-11 +9 +-17 +7 +-16 +12 +-8 +1 +-9 +-9 +-7 +-7 +1 +1 +4 +2 +-16 +7 +4 +-18 +-7 +12 +7 +-1 +-14 +9 +-17 +-8 +13 +19 +-18 +-17 +-14 +-10 +-9 +-12 +-19 +-17 +14 +-16 +18 +-15 +-14 +-17 +-9 +-14 +-15 +-19 +-19 +10 +-17 +-2 +11 +15 +9 +1 +17 +17 +-10 +-16 +15 +4 +-7 +10 +5 +-16 +-5 +-5 +-3 +-8 +17 +-5 +124726 \ No newline at end of file diff --git a/src/main/resources/day1.txt b/src/main/resources/2019/day1.txt similarity index 100% rename from src/main/resources/day1.txt rename to src/main/resources/2019/day1.txt diff --git a/src/main/resources/day10.txt b/src/main/resources/2019/day10.txt similarity index 100% rename from src/main/resources/day10.txt rename to src/main/resources/2019/day10.txt diff --git a/src/main/resources/day11.txt b/src/main/resources/2019/day11.txt similarity index 100% rename from src/main/resources/day11.txt rename to src/main/resources/2019/day11.txt diff --git a/src/main/resources/day12.txt b/src/main/resources/2019/day12.txt similarity index 100% rename from src/main/resources/day12.txt rename to src/main/resources/2019/day12.txt diff --git a/src/main/resources/day13.txt b/src/main/resources/2019/day13.txt similarity index 100% rename from src/main/resources/day13.txt rename to src/main/resources/2019/day13.txt diff --git a/src/main/resources/day14.txt b/src/main/resources/2019/day14.txt similarity index 100% rename from src/main/resources/day14.txt rename to src/main/resources/2019/day14.txt diff --git a/src/main/resources/day15.txt b/src/main/resources/2019/day15.txt similarity index 100% rename from src/main/resources/day15.txt rename to src/main/resources/2019/day15.txt diff --git a/src/main/resources/day16.txt b/src/main/resources/2019/day16.txt similarity index 100% rename from src/main/resources/day16.txt rename to src/main/resources/2019/day16.txt diff --git a/src/main/resources/day17.txt b/src/main/resources/2019/day17.txt similarity index 100% rename from src/main/resources/day17.txt rename to src/main/resources/2019/day17.txt diff --git a/src/main/resources/day18.txt b/src/main/resources/2019/day18.txt similarity index 100% rename from src/main/resources/day18.txt rename to src/main/resources/2019/day18.txt diff --git a/src/main/resources/day19.txt b/src/main/resources/2019/day19.txt similarity index 100% rename from src/main/resources/day19.txt rename to src/main/resources/2019/day19.txt diff --git a/src/main/resources/day2.txt b/src/main/resources/2019/day2.txt similarity index 100% rename from src/main/resources/day2.txt rename to src/main/resources/2019/day2.txt diff --git a/src/main/resources/day20.txt b/src/main/resources/2019/day20.txt similarity index 100% rename from src/main/resources/day20.txt rename to src/main/resources/2019/day20.txt diff --git a/src/main/resources/day21.txt b/src/main/resources/2019/day21.txt similarity index 100% rename from src/main/resources/day21.txt rename to src/main/resources/2019/day21.txt diff --git a/src/main/resources/day22.txt b/src/main/resources/2019/day22.txt similarity index 100% rename from src/main/resources/day22.txt rename to src/main/resources/2019/day22.txt diff --git a/src/main/resources/day23.txt b/src/main/resources/2019/day23.txt similarity index 100% rename from src/main/resources/day23.txt rename to src/main/resources/2019/day23.txt diff --git a/src/main/resources/day24.txt b/src/main/resources/2019/day24.txt similarity index 100% rename from src/main/resources/day24.txt rename to src/main/resources/2019/day24.txt diff --git a/src/main/resources/day25.txt b/src/main/resources/2019/day25.txt similarity index 100% rename from src/main/resources/day25.txt rename to src/main/resources/2019/day25.txt diff --git a/src/main/resources/day3.txt b/src/main/resources/2019/day3.txt similarity index 100% rename from src/main/resources/day3.txt rename to src/main/resources/2019/day3.txt diff --git a/src/main/resources/day4.txt b/src/main/resources/2019/day4.txt similarity index 100% rename from src/main/resources/day4.txt rename to src/main/resources/2019/day4.txt diff --git a/src/main/resources/day5.txt b/src/main/resources/2019/day5.txt similarity index 100% rename from src/main/resources/day5.txt rename to src/main/resources/2019/day5.txt diff --git a/src/main/resources/day6.txt b/src/main/resources/2019/day6.txt similarity index 100% rename from src/main/resources/day6.txt rename to src/main/resources/2019/day6.txt diff --git a/src/main/resources/day7.txt b/src/main/resources/2019/day7.txt similarity index 100% rename from src/main/resources/day7.txt rename to src/main/resources/2019/day7.txt diff --git a/src/main/resources/day8.txt b/src/main/resources/2019/day8.txt similarity index 100% rename from src/main/resources/day8.txt rename to src/main/resources/2019/day8.txt diff --git a/src/main/resources/day9.txt b/src/main/resources/2019/day9.txt similarity index 100% rename from src/main/resources/day9.txt rename to src/main/resources/2019/day9.txt diff --git a/src/main/resources/2020/day1.txt b/src/main/resources/2020/day1.txt new file mode 100644 index 00000000..e69de29b From addefa2b83986f11dcd01be031159e44ed0b2675 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 1 Dec 2020 08:43:26 +0100 Subject: [PATCH 144/433] 2020 day 1 --- .../sbaars/adventofcode/year20/days/Day1.java | 45 ++-- src/main/resources/2020/day1.txt | 200 ++++++++++++++++++ 2 files changed, 231 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day1.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day1.java index 6fa1e8e2..14b93ef6 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day1.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day1.java @@ -1,22 +1,39 @@ package com.sbaars.adventofcode.year20.days; import com.sbaars.adventofcode.common.Day; + import java.io.IOException; -public class Day1 implements Day -{ - public static void main(String[] args) throws IOException { - new Day1().printParts(); - } +public class Day1 implements Day { + public static void main(String[] args) throws IOException { + new Day1().printParts(); + } - @Override - public Object part1() throws IOException { - String[] s = dayStrings(1); - return ""; - } + @Override + public Object part1() throws IOException { + long[] s = dayNumbers(1, "\n"); + for (long a : s) { + for (long b : s) { + if (a != b && a + b == 2020L) { + return a * b; + } + } + } + return 0; + } - @Override - public Object part2() throws IOException { - return ""; - } + @Override + public Object part2() throws IOException { + long[] s = dayNumbers(1, "\n"); + for (long a : s) { + for (long b : s) { + for (long c : s) { + if (a != b && b != c && a + b + c == 2020L) { + return a * b * c; + } + } + } + } + return 0; + } } diff --git a/src/main/resources/2020/day1.txt b/src/main/resources/2020/day1.txt index e69de29b..804bf4ef 100644 --- a/src/main/resources/2020/day1.txt +++ b/src/main/resources/2020/day1.txt @@ -0,0 +1,200 @@ +1446 +1893 +1827 +1565 +1728 +497 +1406 +1960 +1986 +1945 +1731 +1925 +1550 +1841 +1789 +1952 +1610 +1601 +1776 +1808 +1812 +1834 +1454 +1729 +513 +1894 +1703 +1587 +1788 +1690 +1655 +1473 +1822 +1437 +1626 +1447 +1400 +1396 +1715 +1720 +1469 +1388 +1874 +1641 +518 +1664 +1552 +1800 +512 +1506 +1806 +1857 +1802 +1843 +1956 +1678 +1560 +1971 +1940 +1847 +1902 +1500 +1383 +1386 +1398 +1535 +1713 +1931 +1619 +1519 +1897 +1767 +1548 +1976 +1984 +1426 +914 +2000 +1585 +1634 +1832 +1849 +1665 +1609 +1670 +1520 +1490 +1746 +1608 +1829 +1431 +1762 +1384 +1504 +1434 +1356 +1654 +1719 +1599 +1686 +1489 +1377 +1531 +1912 +144 +1875 +1532 +1439 +1482 +1420 +1529 +1554 +1826 +1546 +1589 +1993 +1518 +1708 +1733 +1876 +1953 +1741 +1689 +773 +1455 +1613 +2004 +1819 +1725 +1617 +1498 +1651 +2007 +1402 +728 +1475 +1928 +1904 +1969 +1851 +1296 +1558 +1817 +1663 +1750 +1780 +1501 +1443 +1734 +1977 +1901 +1547 +1631 +1644 +1815 +1949 +1586 +1697 +1435 +1783 +1772 +1987 +1483 +1372 +1999 +1848 +1512 +1541 +1861 +2008 +1607 +1622 +1629 +1763 +1656 +1661 +1581 +1968 +1985 +1974 +1882 +995 +1704 +1896 +1611 +1888 +1773 +1810 +1650 +1712 +1410 +1796 +1691 +1671 +1947 +1775 +1593 +656 +1530 +1743 \ No newline at end of file From 5f1549152e71fd0dadd604e25f71b353d8871005 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 1 Dec 2020 19:57:46 +0100 Subject: [PATCH 145/433] Day 2 stub --- .idea/aws.xml | 11 ++ .idea/compiler.xml | 2 +- .idea/jarRepositories.xml | 10 ++ .idea/misc.xml | 2 +- .idea/workspace.xml | 138 +++++++++--------- pom.xml | 8 - .../sbaars/adventofcode/year20/days/Day2.java | 22 +++ 7 files changed, 113 insertions(+), 80 deletions(-) create mode 100644 .idea/aws.xml create mode 100644 src/main/java/com/sbaars/adventofcode/year20/days/Day2.java diff --git a/.idea/aws.xml b/.idea/aws.xml new file mode 100644 index 00000000..b63b642c --- /dev/null +++ b/.idea/aws.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 67ac3953..05810ced 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -10,7 +10,7 @@ - + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml index b15554c4..fba9a595 100644 --- a/.idea/jarRepositories.xml +++ b/.idea/jarRepositories.xml @@ -1,6 +1,16 @@ + + + + - + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 4597bc35..7af54c94 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -3,57 +3,33 @@ + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -270,25 +234,25 @@ - + - + - + - + - + - + - + - + diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day23.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day23.java index d7935833..a13f89e2 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day23.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day23.java @@ -26,7 +26,7 @@ public Object part2() throws IOException { } private long getNetworkNumber(boolean returnNatY) throws IOException { - long[] program = dayNumbers(); + long[] program = dayNumbers(","); IntcodeComputer[] ic = IntStream.range(0, 50).mapToObj(i -> new IntcodeComputer(RetentionPolicy.EXIT_ON_EMPTY_INPUT, program, i, -1)).toArray(IntcodeComputer[]::new); long[] nat = new long[2]; long sentByNat = -1; From 61c35481054400d52ed1e1e86d2dcd874c828548 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 2 Dec 2020 06:19:28 +0100 Subject: [PATCH 148/433] 2020 Day 2 --- .idea/workspace.xml | 29 +- .../sbaars/adventofcode/year20/days/Day2.java | 46 +- src/main/resources/2020/day2.txt | 1000 +++++++++++++++++ 3 files changed, 1062 insertions(+), 13 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index e2e47d86..1fc89114 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -22,7 +22,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1606754454120 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From 1d2936fbe062b4306337216ca6d4718be2485491 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Wed, 9 Dec 2020 18:28:29 +0100 Subject: [PATCH 186/433] Import non-user specific stuff --- .idea/.gitignore | 0 .idea/.name | 1 + .idea/checkstyle-idea.xml | 16 +++++++++++ .idea/codeStyles/Project.xml | 43 ++++++++++++++++++++++++++++ .idea/codeStyles/codeStyleConfig.xml | 5 ++++ .idea/compiler.xml | 16 +++++++++++ .idea/encodings.xml | 7 +++++ .idea/google-java-format.xml | 6 ++++ .idea/jarRepositories.xml | 25 ++++++++++++++++ .idea/misc.xml | 11 +++++++ .idea/modules.xml | 8 ++++++ .idea/sonarlint/issuestore/index.pb | 0 .idea/vcs.xml | 6 ++++ adventofcode2019.iml | 1 - 14 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/.name create mode 100644 .idea/checkstyle-idea.xml create mode 100644 .idea/codeStyles/Project.xml create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 .idea/compiler.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/google-java-format.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/sonarlint/issuestore/index.pb create mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 00000000..ccf03486 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +adventofcode2019 \ No newline at end of file diff --git a/.idea/checkstyle-idea.xml b/.idea/checkstyle-idea.xml new file mode 100644 index 00000000..9f040005 --- /dev/null +++ b/.idea/checkstyle-idea.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 00000000..38b3ad24 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 00000000..a55e7a17 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 00000000..05810ced --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 00000000..aa00ffab --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/google-java-format.xml b/.idea/google-java-format.xml new file mode 100644 index 00000000..2aa056da --- /dev/null +++ b/.idea/google-java-format.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 00000000..b15554c4 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..972ec8d7 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 00000000..1f102bb9 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/sonarlint/issuestore/index.pb b/.idea/sonarlint/issuestore/index.pb new file mode 100644 index 00000000..e69de29b diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..35eb1ddf --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/adventofcode2019.iml b/adventofcode2019.iml index 1cdc9bbc..cdd577cd 100644 --- a/adventofcode2019.iml +++ b/adventofcode2019.iml @@ -11,7 +11,6 @@ - From 3b38301ff1fb2b4e3cc72906d3ba2735c0484fa2 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Thu, 10 Dec 2020 08:20:04 +0100 Subject: [PATCH 187/433] Day 10 --- .../haskell/year20/days/Day10.java | 23 ++++ .../adventofcode/year20/days/Day10.java | 39 +++++- .../adventofcode/year20/days/Day11.java | 29 +++++ src/main/resources/2020/day10.txt | 112 ++++++++++++++++++ src/main/resources/2020/day11.txt | 0 5 files changed, 200 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day10.java create mode 100644 src/main/java/com/sbaars/adventofcode/year20/days/Day11.java create mode 100644 src/main/resources/2020/day11.txt diff --git a/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day10.java b/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day10.java new file mode 100644 index 00000000..60240e9e --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day10.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.haskell.year20.days; + +import com.sbaars.adventofcode.haskell.year20.HaskellDay2020; + +public class Day10 extends HaskellDay2020 { + public Day10() { + super(10); + } + + public static void main(String[] args) { + new Day10().printParts(); + } + + @Override + public Object part1() { + return dayNumberStream().mapToObj(Long::toString).collect(haskellList()); + } + + @Override + public Object part2() { + return null; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day10.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day10.java index bad42b45..cfcf52e6 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day10.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day10.java @@ -1,11 +1,22 @@ package com.sbaars.adventofcode.year20.days; +import static java.lang.Math.pow; import static java.util.Arrays.copyOfRange; +import static java.util.Arrays.sort; import static java.util.Arrays.stream; +import static java.util.Comparator.reverseOrder; +import static java.util.stream.LongStream.range; +import com.sbaars.adventofcode.year19.util.CountMap; +import com.sbaars.adventofcode.year19.util.LongCountMap; import com.sbaars.adventofcode.year20.Day2020; +import java.util.Arrays; import java.util.HashSet; import java.util.Set; +import java.util.List; +import java.util.ArrayList; +import org.apache.commons.lang3.ArrayUtils; +import org.checkerframework.checker.units.qual.C; public class Day10 extends Day2020 { public Day10() { @@ -18,12 +29,34 @@ public static void main(String[] args) { @Override public Object part1() { - String input = day(); - return input; + long[] input = getInput(); + CountMap diffs = new CountMap<>(); + for(int i = 1; i nRoutes = new LongCountMap<>(); + nRoutes.increment(input[input.length - 1]); + for (int i = input.length - 2; i >= 0; i--) { + for (int j = i + 1; j < input.length && j <= i + 3; j++) { + if (input[j] - input[i] <= 3) { + nRoutes.increment(input[i], nRoutes.get(input[j])); + } + } + } + return nRoutes.get(0L); + } + + private long[] getInput() { + long[] input = dayNumbers(); + sort(input); + input = ArrayUtils.add( input, input[input.length-1]+3); + input = ArrayUtils.addFirst(input, 0L); + return input; } } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day11.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day11.java new file mode 100644 index 00000000..25d6ccb0 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day11.java @@ -0,0 +1,29 @@ +package com.sbaars.adventofcode.year20.days; + +import static java.util.Arrays.sort; + +import com.sbaars.adventofcode.year19.util.CountMap; +import com.sbaars.adventofcode.year19.util.LongCountMap; +import com.sbaars.adventofcode.year20.Day2020; +import org.apache.commons.lang3.ArrayUtils; + +public class Day11 extends Day2020 { + public Day11() { + super(11); + } + + public static void main(String[] args) { + new Day11().printParts(); + } + + @Override + public Object part1() { + String input = day(); + return input; + } + + @Override + public Object part2() { + return 0; + } +} diff --git a/src/main/resources/2020/day10.txt b/src/main/resources/2020/day10.txt index e69de29b..aa35dabc 100644 --- a/src/main/resources/2020/day10.txt +++ b/src/main/resources/2020/day10.txt @@ -0,0 +1,112 @@ +111 +56 +160 +128 +25 +182 +131 +174 +87 +52 +23 +30 +93 +157 +36 +155 +183 +167 +130 +50 +71 +98 +42 +129 +18 +13 +99 +146 +81 +184 +1 +51 +137 +8 +9 +43 +115 +121 +171 +77 +97 +149 +83 +89 +2 +38 +139 +152 +29 +180 +10 +165 +114 +75 +82 +104 +108 +156 +96 +150 +105 +44 +100 +69 +72 +143 +32 +172 +84 +161 +118 +47 +17 +177 +7 +61 +4 +103 +66 +76 +138 +53 +88 +122 +22 +123 +37 +90 +134 +41 +64 +127 +166 +173 +168 +58 +26 +24 +33 +151 +57 +181 +31 +124 +140 +3 +19 +16 +80 +164 +70 +65 \ No newline at end of file diff --git a/src/main/resources/2020/day11.txt b/src/main/resources/2020/day11.txt new file mode 100644 index 00000000..e69de29b From 555b6c32984ee8bae96cb9bd69a6e10ffcbc3809 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Thu, 10 Dec 2020 21:03:45 +0100 Subject: [PATCH 188/433] Refactor day 8 solution --- .../sbaars/adventofcode/year20/days/Day8.java | 67 +++---------------- .../adventofcode/year20/gamepad/Gamepad.java | 55 +++++++++++++++ 2 files changed, 65 insertions(+), 57 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode/year20/gamepad/Gamepad.java diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day8.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day8.java index bc2219c4..257df0d1 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day8.java @@ -3,6 +3,7 @@ import static java.util.Arrays.stream; import com.sbaars.adventofcode.year20.Day2020; +import com.sbaars.adventofcode.year20.gamepad.Gamepad; import java.util.HashSet; import java.util.Set; import lombok.AllArgsConstructor; @@ -20,73 +21,25 @@ public Day8() { @Override public Object part1() { - Instruction[] input = dayStream().map(s -> s.replace("+", "")).map(s -> s.split(" ")).map(s -> new Instruction(s[0], Long.parseLong(s[1]))).toArray(Instruction[]::new); - long acc = 0L; + Gamepad gamepad = new Gamepad(dayStream()); Set visited = new HashSet<>(); - int op = 0; - while (visited.add(op)) { - String operation = input[op].operation; - long number = input[op].number; - switch (operation) { - case "acc": - acc += number; - op++; - break; - case "jmp": - op += number; - break; - case "nop": - op++; - break; - default: - throw new IllegalStateException(); - } - } - return acc; - } - - @Data - @AllArgsConstructor - public static class Instruction { - String operation; - long number; + while (visited.add(gamepad.executeInstruction())); + return gamepad.getAccumulator(); } @Override public Object part2() { for (int i = 0; i < 223; i++) { - Instruction[] input = dayStream().map(s -> s.replace("+", "")).map(s -> s.split(" ")).map(s -> new Instruction(s[0], Long.parseLong(s[1]))).toArray(Instruction[]::new); - replace(input, "jmp", "nop", i); - long acc = 0L; + Gamepad gamepad = new Gamepad(dayStream()); + gamepad.replaceInstruction("jmp", "nop", i); Set visited = new HashSet<>(); - int op = 0; - while (visited.add(op)) { - String operation = input[op].operation; - long number = input[op].number; - switch (operation) { - case "acc": - acc += number; - op++; - break; - case "jmp": - op += number; - break; - case "nop": - op++; - break; - default: - throw new IllegalStateException(); + while (visited.add(gamepad.executeInstruction())){ + if (gamepad.getCurrent() == gamepad.getSize()){ + return gamepad.getAccumulator(); } - if (op == input.length) return acc; - if (op > input.length) break; } } - return "FAIL"; - } - - public void replace(Instruction[] input, String instruction, String replacement, int occurrence) { - Instruction[] those = stream(input).filter(e -> e.operation.equals(instruction)).toArray(Instruction[]::new); - those[occurrence].operation = replacement; + throw new IllegalStateException(); } } diff --git a/src/main/java/com/sbaars/adventofcode/year20/gamepad/Gamepad.java b/src/main/java/com/sbaars/adventofcode/year20/gamepad/Gamepad.java new file mode 100644 index 00000000..fb8e02ff --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year20/gamepad/Gamepad.java @@ -0,0 +1,55 @@ +package com.sbaars.adventofcode.year20.gamepad; + +import static java.util.Arrays.stream; + +import java.util.stream.Stream; +import lombok.AllArgsConstructor; +import lombok.Data; + +public class Gamepad { + private final Instruction[] instructions; + private long acc = 0; + private int current = 0; + + public Gamepad(Stream input){ + this.instructions = input.map(s -> s.replace("+", "")) + .map(s -> s.split(" ")) + .map(s -> new Instruction(s[0], Long.parseLong(s[1]))) + .toArray(Instruction[]::new); + } + + public int executeInstruction(){ + Instruction instruction = instructions[current]; + switch (instruction.operation) { + case "acc": acc += instruction.number; break; + case "jmp": current += instruction.number - 1; break; + case "nop": break; + default: throw new IllegalStateException(); + } + return current++; + } + + public void replaceInstruction(String instruction, String replacement, int occurrence) { + Instruction[] those = stream(instructions).filter(e -> e.operation.equals(instruction)).toArray(Instruction[]::new); + those[occurrence].operation = replacement; + } + + public long getAccumulator(){ + return acc; + } + + public int getCurrent(){ + return current; + } + + public int getSize(){ + return instructions.length; + } + + @Data + @AllArgsConstructor + public static class Instruction { + String operation; + long number; + } +} From 3c26a14ac6c4693909bdf07df18e45040d43df0a Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Thu, 10 Dec 2020 21:07:28 +0100 Subject: [PATCH 189/433] Day 8 Haskell converter --- .../haskell/year20/days/Day8.java | 30 +++++++++++++++++++ .../sbaars/adventofcode/year20/days/Day8.java | 1 - .../adventofcode/year20/gamepad/Gamepad.java | 4 +++ 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day8.java diff --git a/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day8.java b/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day8.java new file mode 100644 index 00000000..61e7d61c --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day8.java @@ -0,0 +1,30 @@ +package com.sbaars.adventofcode.haskell.year20.days; + +import static java.util.Arrays.stream; + +import com.sbaars.adventofcode.haskell.year20.HaskellDay2020; +import com.sbaars.adventofcode.year20.days.Day7.Item; +import com.sbaars.adventofcode.year20.days.Day7.Trade; +import com.sbaars.adventofcode.year20.gamepad.Gamepad; + +public class Day8 extends HaskellDay2020 { + public Day8() { + super(8); + } + + public static void main(String[] args) { + new Day8().printParts(); + } + + @Override + public Object part1() { + return stream(new Gamepad(dayStream()).getInstructions()) + .map(i -> tup(i.getOperation(), i.getNumber())) + .collect(haskellList()); + } + + @Override + public Object part2() { + return null; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day8.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day8.java index 257df0d1..2207c792 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day8.java @@ -38,7 +38,6 @@ public Object part2() { return gamepad.getAccumulator(); } } - } throw new IllegalStateException(); } diff --git a/src/main/java/com/sbaars/adventofcode/year20/gamepad/Gamepad.java b/src/main/java/com/sbaars/adventofcode/year20/gamepad/Gamepad.java index fb8e02ff..9cf12607 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/gamepad/Gamepad.java +++ b/src/main/java/com/sbaars/adventofcode/year20/gamepad/Gamepad.java @@ -34,6 +34,10 @@ public void replaceInstruction(String instruction, String replacement, int occur those[occurrence].operation = replacement; } + public Instruction[] getInstructions(){ + return instructions; + } + public long getAccumulator(){ return acc; } From 54f19b9b8e1425ef679438c18421277a052cf35c Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Fri, 11 Dec 2020 07:09:01 +0100 Subject: [PATCH 190/433] Day 11 --- .../sbaars/adventofcode/common/Direction.java | 26 +++++- .../adventofcode/year20/days/Day11.java | 73 ++++++++++++++- src/main/resources/2020/day11.txt | 90 +++++++++++++++++++ 3 files changed, 185 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/common/Direction.java b/src/main/java/com/sbaars/adventofcode/common/Direction.java index 486afaac..97cf9b04 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Direction.java +++ b/src/main/java/com/sbaars/adventofcode/common/Direction.java @@ -4,7 +4,8 @@ import java.util.Arrays; public enum Direction { - NORTH(1, 'U'), EAST(4, 'R'), SOUTH(2, 'D'), WEST(3, 'L'); + NORTH(1, 'U'), EAST(4, 'R'), SOUTH(2, 'D'), WEST(3, 'L'), + NORTHEAST(4, 'E'), EASTSOUTH(5, 'E'), SOUTHWEST(6, 'E'), WESTNORTH(7, 'E'); public final int num; public final int code; @@ -31,9 +32,24 @@ public Point move(Point currentLocation, int amount) { case NORTH: return new Point(currentLocation.x, currentLocation.y-amount); case EAST: return new Point(currentLocation.x+amount, currentLocation.y); case WEST: return new Point(currentLocation.x-amount, currentLocation.y); + case SOUTHWEST: return new Point(currentLocation.x-amount, currentLocation.y+amount); + case NORTHEAST: return new Point(currentLocation.x+amount, currentLocation.y-amount); + case EASTSOUTH: return new Point(currentLocation.x+amount, currentLocation.y+amount); + case WESTNORTH: return new Point(currentLocation.x-amount, currentLocation.y-amount); } throw new IllegalStateException("Non-existent Direction: "+this); } + + public char getInGrid(char[][] grid, Point p, char none){ + if(p.x>=0 && p.x=0 && p.y + d.getInGrid(finalInput, d.move(p)) == '#' + ).count(); + changes = getChanges(input, changes, newGrid, i, j, occupied, 4L); + } + } + input = newGrid; + } while(changes > 0); + return getCount(input, '#'); + } + + private int getChanges(char[][] input, int changes, char[][] newGrid, int i, int j, long occupied, long numOccupied) { + if(occupied == 0L && input[i][j] == 'L'){ + newGrid[i][j] = '#'; + changes++; + } else if(occupied >= numOccupied && input[i][j] == '#'){ + newGrid[i][j] = 'L'; + changes++; + } else { + newGrid[i][j] = input[i][j]; + } + return changes; + } + + private long getCount(char[][] input, char ch) { + return stream(input).flatMapToInt(c -> new String(c).chars()).filter(c -> c == ch).count(); } @Override public Object part2() { - return 0; + char[][] input = dayGrid(); + int changes; + do{ + changes = 0; + char[][] newGrid = new char[input.length][input[0].length]; + for(int i = 0; i 0); + return getCount(input, '#'); + } + + private int countOccupied(char[][] input, int i, int j) { + int occupied = 0; + Direction[] dirs = Direction.values(); + for(Direction dir : dirs){ + Point p = new Point(i, j); + p = dir.move(p, 1); + while(p.x>=0 && p.x< input.length && p.y>=0 && p.y< input[0].length && input[p.x][p.y] != 'L'){ + if(input[p.x][p.y] == '#'){ + occupied++; + break; + } + p = dir.move(p, 1); + } + } + return occupied; } } diff --git a/src/main/resources/2020/day11.txt b/src/main/resources/2020/day11.txt index e69de29b..bb233d3b 100644 --- a/src/main/resources/2020/day11.txt +++ b/src/main/resources/2020/day11.txt @@ -0,0 +1,90 @@ +LLLLL.LLLLLL.LLLLLLLLL.LLL.LL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLLL.LLLLLLL +LLLLL.LLLLLL.LLLLLLLLLLLLLLL.LLLLLLLL.LLLLL.LLL.LLLLLL.LLLL.LLLLL.LLLLLLLLLLL.LLLLLLLL.LLLLLLLLL +LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLL +LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLL.L.LLLLLLLLLLLLLLLLLLLLLLLLL.LLL.LLLL +LLLLL.L.LLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLL.LLLL.L.LLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLL +LLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL +L.LL.L.L.LL.....L.L..L.LL.L.L.L.....L..LLL.L.....L.L...LL..L.....L...L..L.LLLL..L.LL......L.L.L. +LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL +LLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL +LLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.L.LLLLLLLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLL. +LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +......LL..LLLL.L...LL.....L.L.......L..L.LL....L.LLL........L.L.L.LL.....L.........L....L......L +LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLL.LL.LLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL..LLLLLLL..LLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLL.LLL.LLLL.LLLLLLLLLLLLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.L.LLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.L.LLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLL +LLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLL..LLLLL.LLL.LLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLL.L.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL +LLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL +.L...L...L.....L...L....L.LL.LLL.LL...LL.L..L...L......L..LL..L..LL..L.L......L.L.LLL......L.L.. +LLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLL +LLLLL.LLLLL.LLLLLLLLLLLLLLLLL.L.LLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL +LLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLL.L.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLL.LLL.LLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LL.LL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +...........LLL.....LLL.....LL.L..........L..L.L.L...L.L.....L........L......L..L..L...LL....L.L. +LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLL.LLLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLL.LLLL.L.LLLL.LLLLLL.LLLLLL.LLLL.LLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLLLLLLLL.LLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLL.LLLL.LLLLLLL.L.LLLLLLLL +LLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLL +LLLLL.LLLLLL.L.LLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +.LLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLLL.LLLL.LLLL.LLLLLLLLLLLLL +L.......LL...LL...L..L.....L..LL..L.L.LLL.L.L..L.LL.L.........L....LLLL..LL..L.L..L..LLLL..LL.L. +LLLLL.LLLLLL.LLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLLL..LLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LL.LLLLLLLL +LLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL +....LLL.LL....L.L.........L.L............L..L...L.LLLL......L...L.L..L....L.......L..L.......... +LLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL..LLLLLLLL.LLLLLL.LL.L.LLLLL.LLLLLL.LLLLLL.LLLLLLL.LLLLLLLL +LLLLLLLLLLLL.LL.L.LLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLLLLLLLLL.L..LLL..LLLLLLLLL.LLLLLL.LLLL.L.LLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLL..LLLLL.LLLLLLLLL.LLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL +.L..LLLL..L.L.LLL.......LL.LL.LL......L.L....L.LLL.......L...L.L.LL...LL.....L.L....L.L...L.L... +LLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLL.LLLL +LLLLL.LL.LLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLL..LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL +LLLLL.LLLLLL..LLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLL.LL +LLL.LLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLL +LLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLLLLL +.L..L..LLL....LL......LL.L.L..LL..LL....L...L..L.L.L...L..L..L.LLLL.L....L.....L..L...L...LLL... +LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL +LLLLLLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLLLLLLLLL.L.LLLLLL.LLLL.LLL.LLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LL.LLL.LLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLL +LLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLLL.LLLLL.LLLLLLLL +LLLLL.LLLLLLLLLLLLLLL..LLLLLLLLLLLLLL.LLLLLL.LL.LLLLLLLLLLL.L.LLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL +..LL.LL.L.LL.L...L..L..L..L...LL........L......LL.LLLL.......L..LLL.L.L....L.....L..LL..L.LL.LL. +LLLLL.LLLL.L.LLLLL.LLL.LLLLLL.LLLLLLL.LL.LLLLLL.LLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL..LLLLL.LLLLLLL.LLLL.LLLLLLLLLLL.LLLL..LLLL.LLLLLLLLLLL.LLLLLLLLLLLLL.LLLL +LLLLL.LLLLLLLLLLLLLLL.L.LLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLL..LLLLLLLLLLLLLLL.L.LLLLLLLLLLL.LLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLL +LLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LL.LL.LLL.LL.LLLLLLLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLL..LLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL..LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL +.LL..LL.L.LL......L.L.LL...L..LL..LL...L..L.L..LL...L.L..L.....L.LLL..L..LL.L..L.......L..LLL... +LLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLL +LLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLLL.LLLLLLLLLLLLLLLLL +LLLLL.LLLLLLLLLLLLLLLL.LLLLLLLL.LLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL +LLLLL..LLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL..LLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLL.LLLLLLLLL.LLLL.LLL.L.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL +LLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL +LLLLL.LLL.LL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LL.LLL.LLLL.LLLLL.LLLLLL.LL.L.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.L.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +.L.L....LLL.L.L........L..L....L..L...LL..L..LLL..L.L....L..L.LL....LL.L.L.....L........L..L.L.. +LLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLL.LL.LLLLLLLLLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLL.LLL +LLLLL.LLLLLL.LLLLLLLLLLLLLL.L.LLLLLLL.LLLLLLLL.LLLLLLL.LLLL.LLLLL.LLLLLL.LLLL.LLLLL.LL..LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.L.LLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL +LLLLLLLLLLLL.LLLLLLLLLLLLL.LL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLL +LLLL..L.LLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL +LLLLL..LLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLL..LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLLL.L.LL..LLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL \ No newline at end of file From 7ba0b26d05075069214b3652e34b702eb3f72932 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Fri, 11 Dec 2020 08:32:15 +0100 Subject: [PATCH 191/433] Haskell converter day 11 --- .../haskell/year20/days/Day11.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day11.java diff --git a/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day11.java b/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day11.java new file mode 100644 index 00000000..d33c5e81 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day11.java @@ -0,0 +1,27 @@ +package com.sbaars.adventofcode.haskell.year20.days; + +import com.sbaars.adventofcode.haskell.year20.HaskellDay2020; +import java.util.Arrays; + +public class Day11 extends HaskellDay2020 { + public Day11() { + super(11); + } + + public static void main(String[] args) { + new Day11().printParts(); + } + + @Override + public Object part1() { + return Arrays.stream(dayGrid()).map(Arrays::toString) + .map(s -> s.replace(".", "False")) + .map(s -> s.replace("L", "True")) + .collect(haskellList()); + } + + @Override + public Object part2() { + return null; + } +} From 83ebceeabaef782f068f460ad78590a4897aea18 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 12 Dec 2020 06:50:27 +0100 Subject: [PATCH 192/433] Day 12 --- .../sbaars/adventofcode/common/Direction.java | 10 +- .../adventofcode/year20/days/Day12.java | 91 +++ src/main/resources/2020/day12.txt | 747 ++++++++++++++++++ 3 files changed, 845 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode/year20/days/Day12.java create mode 100644 src/main/resources/2020/day12.txt diff --git a/src/main/java/com/sbaars/adventofcode/common/Direction.java b/src/main/java/com/sbaars/adventofcode/common/Direction.java index 97cf9b04..30f54112 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Direction.java +++ b/src/main/java/com/sbaars/adventofcode/common/Direction.java @@ -10,7 +10,7 @@ public enum Direction { public final int num; public final int code; - private Direction(int num, char code) { + Direction(int num, char code) { this.num = num; this.code = code; } @@ -18,12 +18,16 @@ private Direction(int num, char code) { public static Direction getByDirCode(char code) { return Arrays.stream(values()).filter(e -> e.code == code).findAny().get(); } + + public static Direction getByDir(char code) { + return Arrays.stream(values()).filter(e -> e.name().charAt(0) == code).findAny().get(); + } public Direction turn(boolean right) { int cur = ordinal() + (right ? 1 : -1); - if(cur == Direction.values().length) cur = 0; + if(cur == Direction.fourDirections().length) cur = 0; else if(cur == -1) cur = 3; - return Direction.values()[cur]; + return Direction.fourDirections()[cur]; } public Point move(Point currentLocation, int amount) { diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day12.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day12.java new file mode 100644 index 00000000..de2028dd --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day12.java @@ -0,0 +1,91 @@ +package com.sbaars.adventofcode.year20.days; + +import com.sbaars.adventofcode.common.Direction; +import com.sbaars.adventofcode.year20.Day2020; +import lombok.Data; +import lombok.Value; + +import java.awt.*; +import java.util.List; + +import static com.sbaars.adventofcode.common.Direction.EAST; +import static java.util.stream.Collectors.toList; + +public class Day12 extends Day2020 { + public static void main(String[] args) { + new Day12().printParts(); + } + + public Day12() { + super(12); + } + + @Override + public Object part1() { + List input = dayStream().map(e -> new Flight(e.charAt(0), Integer.parseInt(e.substring(1)))).collect(toList()); + Direction face = EAST; + Point location = new Point(0, 0); + for(Flight f : input){ + switch(f.dir){ + case 'L':case 'R': + { + int num = f.distance; + while(num>0){ + face = face.turn(f.dir == 'R'); + num-=90; + } + break; + } + case 'F': { + location = face.move(location, f.distance); + break; + } + default: { + location = Direction.getByDir(f.dir).move(location, f.distance); + break; + } + } + } + return Math.abs(location.x) + Math.abs(location.y); + } + + @Data + @Value + class Flight { + char dir; + int distance; + } + + @Override + public Object part2() { + List input = dayStream().map(e -> new Flight(e.charAt(0), Integer.parseInt(e.substring(1)))).collect(toList()); + Point waypoint = new Point(10, -1); + Point location = new Point(0, 0); + for(Flight f : input){ + switch(f.dir){ + case 'L':case 'R': + { + int num = f.distance; + while(num>0){ + waypoint = turn(waypoint, f.dir == 'R'); + num-=90; + } + break; + } + case 'F': { + location = new Point(location.x+(waypoint.x*f.distance), location.y+(waypoint.y*f.distance)); + break; + } + default: { + waypoint = Direction.getByDir(f.dir).move(waypoint, f.distance); + break; + } + } + } + return Math.abs(location.x) + Math.abs(location.y); + } + + private Point turn(Point w, boolean b) { + return b ? new Point(-w.y, w.x) : new Point(w.y, -w.x); + } +} diff --git a/src/main/resources/2020/day12.txt b/src/main/resources/2020/day12.txt new file mode 100644 index 00000000..5299f07e --- /dev/null +++ b/src/main/resources/2020/day12.txt @@ -0,0 +1,747 @@ +S2 +W4 +F31 +N2 +E4 +F98 +R180 +W2 +N4 +E1 +L180 +W2 +S5 +F69 +W5 +F12 +E3 +F91 +R90 +E1 +L90 +F73 +W4 +N3 +R90 +F76 +R90 +F33 +W2 +L90 +F51 +E1 +S3 +L180 +F62 +N5 +L180 +N3 +E1 +L90 +F83 +R180 +W4 +F29 +E2 +L90 +L90 +N3 +W1 +S1 +E2 +L270 +L180 +N2 +E1 +F77 +N2 +F11 +L180 +E2 +F45 +N4 +W5 +S2 +L90 +N2 +F14 +L90 +W3 +F6 +N5 +E2 +R90 +E2 +L90 +F39 +L90 +F45 +W2 +F67 +W4 +F50 +E1 +F92 +W5 +F75 +N2 +W1 +S3 +R90 +W5 +F51 +L90 +E3 +F71 +N3 +E3 +F74 +E4 +S3 +W2 +L180 +E2 +S5 +L270 +R90 +N2 +R90 +E4 +L270 +S5 +E4 +W3 +L90 +N2 +F32 +E3 +N5 +E2 +R180 +F27 +S1 +R90 +F94 +E2 +F82 +N3 +L90 +F100 +W4 +L90 +S1 +E4 +F26 +R90 +R90 +F12 +W4 +F70 +L90 +F100 +W4 +S2 +R90 +E3 +F11 +L90 +F32 +L180 +S2 +F11 +S2 +L90 +S3 +E4 +F93 +S1 +R90 +S2 +F20 +E2 +F9 +S5 +F23 +E4 +S2 +F38 +L90 +N3 +F3 +E2 +F37 +N2 +F89 +E5 +F43 +R90 +F88 +N5 +F52 +W5 +F24 +E4 +L180 +S4 +E3 +F14 +L90 +S2 +E5 +L180 +N4 +F98 +N4 +W2 +S2 +W1 +S3 +R90 +F98 +E4 +R270 +E2 +F45 +L90 +F75 +R180 +W3 +L180 +F42 +E2 +N4 +L90 +F2 +R180 +W5 +E5 +N5 +R180 +F92 +L90 +F95 +E3 +F61 +S5 +E2 +L180 +E1 +E2 +F27 +S3 +W2 +S1 +F86 +R270 +S1 +L90 +R90 +E5 +S2 +S2 +F93 +E2 +R270 +N3 +W3 +F74 +R90 +F94 +E2 +F88 +S1 +R90 +W4 +L90 +N5 +F59 +R90 +N1 +F24 +S2 +F10 +L90 +F72 +L90 +F55 +N2 +E1 +R90 +N1 +E1 +F12 +L90 +S5 +E5 +F44 +L180 +S4 +E2 +E5 +S1 +E5 +R180 +S1 +R90 +N3 +L90 +E2 +S4 +L90 +R90 +W1 +R90 +E5 +N1 +L90 +N1 +E3 +S5 +W1 +S1 +L270 +E2 +E4 +F31 +S2 +E4 +N2 +W3 +L90 +F7 +S3 +F23 +S3 +E1 +F15 +S1 +L90 +E4 +S1 +L90 +N3 +W1 +F13 +R180 +S3 +F37 +N3 +W5 +S5 +L90 +F55 +F54 +R90 +E1 +N4 +F68 +S5 +F3 +L180 +F75 +N3 +R90 +W4 +F78 +S4 +S3 +R180 +N2 +R90 +N1 +F20 +L180 +F12 +S4 +E4 +L180 +F10 +E2 +N5 +E3 +F13 +E3 +L90 +F55 +E5 +F96 +W1 +F100 +R90 +F97 +W4 +W2 +N4 +W4 +N3 +E4 +R90 +S1 +W4 +F80 +W2 +L90 +F64 +W5 +S2 +W3 +R180 +W1 +S2 +F83 +R180 +F37 +W4 +N4 +F57 +E3 +R90 +F37 +S4 +R180 +F62 +R90 +S5 +F9 +E3 +N4 +L90 +W4 +R90 +F97 +W4 +R180 +F2 +W4 +S1 +F77 +L180 +R90 +E4 +F58 +S2 +L90 +E1 +N3 +L90 +N2 +W4 +N1 +L90 +F94 +E1 +R90 +F29 +S3 +L180 +E2 +R180 +S5 +F62 +L90 +N2 +R90 +E4 +F93 +L90 +E5 +N4 +L180 +N3 +F20 +R90 +E3 +L90 +S3 +F24 +E4 +R90 +E4 +F89 +N1 +F13 +R180 +W1 +L90 +S3 +W5 +S4 +L180 +W3 +F90 +S4 +E3 +F36 +S3 +E2 +F37 +E5 +F31 +L90 +F68 +S5 +F74 +L90 +F59 +R180 +F20 +N1 +L180 +N5 +L90 +E3 +N2 +W4 +F54 +L90 +F77 +R270 +S5 +F82 +R90 +E2 +L180 +F59 +R90 +E5 +R90 +F26 +E4 +F91 +R90 +W4 +F6 +W5 +F34 +S4 +F61 +W2 +S2 +R270 +F45 +R180 +N5 +L90 +F26 +L90 +R90 +S1 +W3 +N5 +W5 +L90 +N3 +L90 +N3 +E3 +L90 +F1 +E4 +L90 +F60 +N3 +F7 +S1 +E1 +F68 +L90 +N5 +E5 +F36 +W3 +S5 +L270 +N2 +E1 +R90 +F8 +S3 +E1 +R90 +N1 +E2 +R90 +N1 +F90 +E2 +F63 +S2 +F17 +S1 +E3 +L90 +E4 +L180 +N4 +W1 +S4 +L90 +S5 +F15 +W1 +N5 +W3 +F97 +S3 +L90 +S2 +F78 +N3 +W5 +L90 +F68 +E3 +F24 +S3 +L90 +W2 +L90 +F49 +W4 +R90 +F82 +R270 +S1 +N3 +L90 +S4 +R90 +S2 +F46 +L180 +E4 +L180 +W2 +R90 +L90 +N1 +F88 +L180 +S5 +R90 +S4 +L90 +F68 +W5 +F13 +E4 +S3 +F91 +W3 +F85 +L180 +N4 +W5 +S3 +F89 +W1 +L180 +S2 +E3 +F82 +L90 +S4 +W5 +N5 +W2 +S4 +S2 +F82 +E2 +N4 +L90 +F80 +E2 +F49 +W5 +S3 +F76 +L90 +S1 +F41 +S3 +E1 +F26 +E3 +F53 +E2 +F73 +W3 +R180 +N2 +R90 +N3 +R90 +F16 +L90 +N3 +N1 +W5 +F19 +R90 +N4 +W5 +F6 +E3 +N5 +W2 +N3 +E4 +S4 +L90 +E3 +S2 +F9 +L180 +F70 +N5 +S4 +F63 +N3 +E1 +R180 +S3 +L90 +E5 +L90 +F76 +R180 +E2 +L180 +L90 +F24 +E5 +S5 +F98 +S3 +F97 +N5 +R90 +N5 +F43 +W1 +R180 +F38 +R180 +F13 +W2 +F16 +R90 +F6 +N1 +F98 +R180 +N2 +E1 +F19 +L90 +S1 +F33 +R90 +N3 +F75 +N4 +L180 +F35 +W1 +F61 \ No newline at end of file From e46fea35fc45246e48c6cc6f1e749071d648f6ed Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Sat, 12 Dec 2020 21:44:00 +0100 Subject: [PATCH 193/433] Prepare day 13 --- .../adventofcode/year20/days/Day13.java | 32 +++++++++++++++++++ src/main/resources/2020/day13.txt | 0 2 files changed, 32 insertions(+) create mode 100644 src/main/java/com/sbaars/adventofcode/year20/days/Day13.java create mode 100644 src/main/resources/2020/day13.txt diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day13.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day13.java new file mode 100644 index 00000000..922356ae --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day13.java @@ -0,0 +1,32 @@ +package com.sbaars.adventofcode.year20.days; + +import static com.sbaars.adventofcode.common.Direction.EAST; +import static java.util.stream.Collectors.toList; + +import com.sbaars.adventofcode.common.Direction; +import com.sbaars.adventofcode.year20.Day2020; +import java.awt.*; +import java.util.List; +import lombok.Data; +import lombok.Value; + +public class Day13 extends Day2020 { + public static void main(String[] args) { + new Day13().printParts(); + } + + public Day13() { + super(13); + } + + @Override + public Object part1() { + String input = day(); + return input; + } + + @Override + public Object part2() { + return 0; + } +} diff --git a/src/main/resources/2020/day13.txt b/src/main/resources/2020/day13.txt new file mode 100644 index 00000000..e69de29b From b6e2327e13d70acbca1d8dae366cf5047cec8db8 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Sun, 13 Dec 2020 06:54:45 +0100 Subject: [PATCH 194/433] Day 13 --- .../adventofcode/year20/days/Day13.java | 20 ++++++++++++++++--- src/main/resources/2020/day13.txt | 2 ++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day13.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day13.java index 922356ae..71161d2d 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day13.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day13.java @@ -2,6 +2,7 @@ import static com.sbaars.adventofcode.common.Direction.EAST; import static java.util.stream.Collectors.toList; +import static java.util.stream.IntStream.range; import com.sbaars.adventofcode.common.Direction; import com.sbaars.adventofcode.year20.Day2020; @@ -21,12 +22,25 @@ public Day13() { @Override public Object part1() { - String input = day(); - return input; + int timestamp = 1005526; + int[] times = {37,41,587,13,19,23,29,733,17}; + for(int i = timestamp; true; i++){ + for(int j : times){ + if(i%j == 0){ + return j * (i-timestamp); + } + } + } } @Override public Object part2() { - return 0; + int[] nums = {37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,587,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,19,0,0,0,23,0,0,0,0,0,29,0,733,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17}; + for(long match = 100000000000000L; true; match++){ + long finalMatch = match; + if(range(0, nums.length).filter(j -> nums[j] != 0).allMatch(j -> (finalMatch + j) % nums[j] == 0)) { + return match; + } + } } } diff --git a/src/main/resources/2020/day13.txt b/src/main/resources/2020/day13.txt index e69de29b..69d7868d 100644 --- a/src/main/resources/2020/day13.txt +++ b/src/main/resources/2020/day13.txt @@ -0,0 +1,2 @@ +1005526 +37,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,41,x,x,x,x,x,x,x,x,x,587,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,13,19,x,x,x,23,x,x,x,x,x,29,x,733,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,17 \ No newline at end of file From f3719acecb508691e86328b4a2fce0316d5f6120 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 13 Dec 2020 10:44:00 +0100 Subject: [PATCH 195/433] Day 12 refactoring --- .../sbaars/adventofcode/common/Direction.java | 37 +++++++++++- .../adventofcode/year20/days/Day12.java | 60 ++++++------------- 2 files changed, 53 insertions(+), 44 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/common/Direction.java b/src/main/java/com/sbaars/adventofcode/common/Direction.java index 30f54112..70167cd8 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Direction.java +++ b/src/main/java/com/sbaars/adventofcode/common/Direction.java @@ -3,6 +3,8 @@ import java.awt.Point; import java.util.Arrays; +import static java.lang.Math.abs; + public enum Direction { NORTH(1, 'U'), EAST(4, 'R'), SOUTH(2, 'D'), WEST(3, 'L'), NORTHEAST(4, 'E'), EASTSOUTH(5, 'E'), SOUTHWEST(6, 'E'), WESTNORTH(7, 'E'); @@ -25,9 +27,9 @@ public static Direction getByDir(char code) { public Direction turn(boolean right) { int cur = ordinal() + (right ? 1 : -1); - if(cur == Direction.fourDirections().length) cur = 0; + if(cur == fourDirections().length) cur = 0; else if(cur == -1) cur = 3; - return Direction.fourDirections()[cur]; + return fourDirections()[cur]; } public Point move(Point currentLocation, int amount) { @@ -87,6 +89,37 @@ public boolean leftOf(Direction robotDir) { return robotDir.ordinal() == n; } + public Direction turnDegrees(int degrees, boolean right){ + int num = degrees % 360; + Direction dir = this; + while(num>0){ + dir = turn(right); + num-=90; + } + return dir; + } + + public Direction turnDegrees(int degrees){ + return turnDegrees(abs(degrees), degrees > 0); + } + + public static Point turn(Point w, boolean b) { + return b ? new Point(-w.y, w.x) : new Point(w.y, -w.x); + } + + public static Point turnDegrees(Point w, int distance, boolean b) { + int num = distance % 360; + while(num>0){ + w = turn(w, b); + num-=90; + } + return w; + } + + public static Point turnDegrees(Point w, int distance) { + return turnDegrees(w, abs(distance), distance > 0); + } + public static Direction[] fourDirections(){ return new Direction[]{NORTH, EAST, SOUTH, WEST}; } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day12.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day12.java index de2028dd..efe7a285 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day12.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day12.java @@ -8,7 +8,8 @@ import java.awt.*; import java.util.List; -import static com.sbaars.adventofcode.common.Direction.EAST; +import static com.sbaars.adventofcode.common.Direction.*; +import static java.lang.Math.abs; import static java.util.stream.Collectors.toList; public class Day12 extends Day2020 { @@ -22,31 +23,22 @@ public Day12() { @Override public Object part1() { - List input = dayStream().map(e -> new Flight(e.charAt(0), Integer.parseInt(e.substring(1)))).collect(toList()); + List input = convertInput(); Direction face = EAST; Point location = new Point(0, 0); for(Flight f : input){ switch(f.dir){ - case 'L':case 'R': - { - int num = f.distance; - while(num>0){ - face = face.turn(f.dir == 'R'); - num-=90; - } - break; - } - case 'F': { - location = face.move(location, f.distance); - break; - } - default: { - location = Direction.getByDir(f.dir).move(location, f.distance); - break; - } + case 'L': + case 'R': face = face.turnDegrees(f.distance, f.dir == 'R'); break; + case 'F': location = face.move(location, f.distance); break; + default: location = Direction.getByDir(f.dir).move(location, f.distance); break; } } - return Math.abs(location.x) + Math.abs(location.y); + return abs(location.x) + abs(location.y); + } + + private List convertInput() { + return dayStream().map(e -> new Flight(e.charAt(0), Integer.parseInt(e.substring(1)))).collect(toList()); } @Data @@ -58,34 +50,18 @@ class Flight { @Override public Object part2() { - List input = dayStream().map(e -> new Flight(e.charAt(0), Integer.parseInt(e.substring(1)))).collect(toList()); + List input = convertInput(); Point waypoint = new Point(10, -1); Point location = new Point(0, 0); for(Flight f : input){ switch(f.dir){ - case 'L':case 'R': - { - int num = f.distance; - while(num>0){ - waypoint = turn(waypoint, f.dir == 'R'); - num-=90; - } - break; - } - case 'F': { - location = new Point(location.x+(waypoint.x*f.distance), location.y+(waypoint.y*f.distance)); - break; - } - default: { - waypoint = Direction.getByDir(f.dir).move(waypoint, f.distance); - break; - } + case 'L':case 'R': waypoint = turnDegrees(waypoint, f.distance, f.dir == 'R'); break; + case 'F': location = new Point(location.x+(waypoint.x*f.distance), location.y+(waypoint.y*f.distance)); break; + default: waypoint = Direction.getByDir(f.dir).move(waypoint, f.distance); break; } } - return Math.abs(location.x) + Math.abs(location.y); + return abs(location.x) + abs(location.y); } - private Point turn(Point w, boolean b) { - return b ? new Point(-w.y, w.x) : new Point(w.y, -w.x); - } + } From 022524705fcc95f074a7c6202c5df85853117953 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 13 Dec 2020 11:32:09 +0100 Subject: [PATCH 196/433] Day 13, non-bruteforce --- .idea/aws.xml | 11 ++++++ .../adventofcode/year20/days/Day13.java | 36 +++++++++++-------- 2 files changed, 32 insertions(+), 15 deletions(-) create mode 100644 .idea/aws.xml diff --git a/.idea/aws.xml b/.idea/aws.xml new file mode 100644 index 00000000..b63b642c --- /dev/null +++ b/.idea/aws.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day13.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day13.java index 71161d2d..0b8a737c 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day13.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day13.java @@ -1,15 +1,11 @@ package com.sbaars.adventofcode.year20.days; -import static com.sbaars.adventofcode.common.Direction.EAST; -import static java.util.stream.Collectors.toList; +import static java.lang.Integer.parseInt; +import static java.lang.Long.parseLong; +import static java.util.Arrays.stream; import static java.util.stream.IntStream.range; -import com.sbaars.adventofcode.common.Direction; import com.sbaars.adventofcode.year20.Day2020; -import java.awt.*; -import java.util.List; -import lombok.Data; -import lombok.Value; public class Day13 extends Day2020 { public static void main(String[] args) { @@ -22,8 +18,10 @@ public Day13() { @Override public Object part1() { - int timestamp = 1005526; - int[] times = {37,41,587,13,19,23,29,733,17}; + String[] day = dayStrings(); + int timestamp = parseInt(day[0]); + int[] times = stream(day[1].replace(",x", "").split(",")) + .mapToInt(Integer::parseInt).toArray(); for(int i = timestamp; true; i++){ for(int j : times){ if(i%j == 0){ @@ -35,12 +33,20 @@ public Object part1() { @Override public Object part2() { - int[] nums = {37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,587,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,19,0,0,0,23,0,0,0,0,0,29,0,733,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17}; - for(long match = 100000000000000L; true; match++){ - long finalMatch = match; - if(range(0, nums.length).filter(j -> nums[j] != 0).allMatch(j -> (finalMatch + j) % nums[j] == 0)) { - return match; - } + String[] s = dayStrings()[1].split(","); + long[][] nums = range(0, s.length).filter(i -> !s[i].equals("x")) + .mapToObj(i -> new long[]{parseLong(s[i]), i}) + .toArray(long[][]::new); + long product = stream(nums).mapToLong(a -> a[0]).reduce((a, b) -> a * b).getAsLong(); + long sum = stream(nums).mapToLong(a -> a[1] * (product/a[0]) * inverseModulo(product/a[0], a[0])).sum(); + return product - sum % product; + } + + long inverseModulo(long x, long y){ + if(x!=0){ + long modulo = y % x; + return modulo == 0 ? 1 : y - inverseModulo(modulo, x) * y / x; } + return 0; } } From 2ba5c9ad50cd9ad09d234417ef92d3d718307363 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 13 Dec 2020 21:10:16 +0100 Subject: [PATCH 197/433] Prepare day 14 --- .../adventofcode/year20/days/Day14.java | 29 +++++++++++++++++++ src/main/resources/2020/day14.txt | 0 2 files changed, 29 insertions(+) create mode 100644 src/main/java/com/sbaars/adventofcode/year20/days/Day14.java create mode 100644 src/main/resources/2020/day14.txt diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day14.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day14.java new file mode 100644 index 00000000..79db60e0 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day14.java @@ -0,0 +1,29 @@ +package com.sbaars.adventofcode.year20.days; + +import com.sbaars.adventofcode.year20.Day2020; + +import static java.lang.Integer.parseInt; +import static java.lang.Long.parseLong; +import static java.util.Arrays.stream; +import static java.util.stream.IntStream.range; + +public class Day14 extends Day2020 { + public static void main(String[] args) { + new Day14().printParts(); + } + + public Day14() { + super(14); + } + + @Override + public Object part1() { + String input = day(); + return input; + } + + @Override + public Object part2() { + return 0; + } +} diff --git a/src/main/resources/2020/day14.txt b/src/main/resources/2020/day14.txt new file mode 100644 index 00000000..e69de29b From 24fae0434c3e7e33d9f5017400432053fc8e06ab Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 14 Dec 2020 06:47:22 +0100 Subject: [PATCH 198/433] Day 14 --- .../adventofcode/year20/days/Day14.java | 95 ++- src/main/resources/2020/day14.txt | 586 ++++++++++++++++++ 2 files changed, 678 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day14.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day14.java index 79db60e0..7f3d97bf 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day14.java @@ -1,10 +1,19 @@ package com.sbaars.adventofcode.year20.days; +import com.sbaars.adventofcode.common.ReadsFormattedString; import com.sbaars.adventofcode.year20.Day2020; +import lombok.Data; +import lombok.Value; +import java.util.*; + +import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; import static java.lang.Integer.parseInt; import static java.lang.Long.parseLong; +import static java.lang.Long.toBinaryString; import static java.util.Arrays.stream; +import static java.util.Optional.empty; +import static java.util.Optional.of; import static java.util.stream.IntStream.range; public class Day14 extends Day2020 { @@ -18,12 +27,92 @@ public Day14() { @Override public Object part1() { - String input = day(); - return input; + Instruction[] input = dayStream().map(s -> readString(s, "%s = %s", Instruction.class)).toArray(Instruction[]::new); + Map memory = new HashMap<>(); + String currentMask = ""; + for(Instruction i : input){ + Optional mem = i.getMem(); + if(mem.isPresent()){ + long val = mem.get().value; + StringBuilder bin = new StringBuilder(toBinaryString(val)); + while(bin.length() e).sum(); + } + + @Data + @Value + public static class Instruction { + String mem; + String value; + + public Optional getMem(){ + return mem.startsWith("mem") ? of(readString(mem+value, "mem[%n]%n", Mem.class)) : empty(); + } + } + + @Data + @Value + public static class Mem { + long index; + long value; } @Override public Object part2() { - return 0; + Instruction[] input = dayStream().map(s -> readString(s, "%s = %s", Instruction.class)).toArray(Instruction[]::new); + Map memory = new HashMap<>(); + String currentMask = ""; + for(Instruction i : input){ + Optional mem = i.getMem(); + if(mem.isPresent()){ + long val = mem.get().index; + StringBuilder bin = binWithLength(val, currentMask.length()); + List floaters = new ArrayList<>(); + for(int j = 1; j<=bin.length(); j++){ + char c = currentMask.charAt(currentMask.length()-j); + char c2 = bin.charAt(bin.length()-j); + if(c!='X'){ + if(c == c2){ + floaters.add(j); + } else if(c == '1'){ + bin.setCharAt(bin.length()-j, c); + } + } + } + StringBuilder binary; + long j = 0; + while((binary = binWithLength(j, floaters.size())).length() == floaters.size()){ + for(int k = 0; k e).sum(); + } + + private StringBuilder binWithLength(long val, int s) { + StringBuilder bin = new StringBuilder(toBinaryString(val)); + while (bin.length() < s) { + bin.insert(0, '0'); + } + return bin; } } diff --git a/src/main/resources/2020/day14.txt b/src/main/resources/2020/day14.txt index e69de29b..0d478a98 100644 --- a/src/main/resources/2020/day14.txt +++ b/src/main/resources/2020/day14.txt @@ -0,0 +1,586 @@ +mask = X1011100000X111X01001000001110X00000 +mem[4616] = 8311689 +mem[8936] = 240 +mem[58007] = 369724 +mask = 10X0111X01X0XX110X10100X1001X000010X +mem[41137] = 232605 +mem[33757] = 1437435 +mask = X0011110100X011X01000X1000X1000X0100 +mem[12518] = 27521105 +mem[25203] = 3177 +mem[33089] = 636515 +mem[39100] = 494341 +mem[59321] = 16252 +mem[55061] = 1075 +mask = 1000X11X01X0X01111XX10110001X1110111 +mem[16129] = 15646 +mem[35714] = 30634 +mem[14485] = 6847 +mask = 10011110110000X10X0X1010XX1010100X00 +mem[2308] = 704945037 +mem[41472] = 19000 +mem[34542] = 334200 +mask = 11011X00X000001X0X00XX000011X001000X +mem[49552] = 397346 +mem[52482] = 244619 +mem[40387] = 339372 +mem[24387] = 1184014 +mask = 1000101XXXX100X1X1X10001X01000111101 +mem[42901] = 58252697 +mem[3604] = 2970 +mem[38806] = 78120216 +mask = 1XX01X1111000010011101001X1110XXXX11 +mem[16713] = 3710 +mem[47208] = 490 +mem[2864] = 835240 +mem[30001] = 92649470 +mask = 1X1101XX0XX1X011010X1000100011010X01 +mem[12306] = 9094 +mem[50276] = 737 +mem[44950] = 312069 +mask = 100X11101X00001X010X11XX00011010011X +mem[9068] = 2331 +mem[34800] = 29860461 +mem[18114] = 4912 +mem[38010] = 2912 +mem[59634] = 2460 +mem[18826] = 3632988 +mem[24839] = 87354329 +mask = 0100X1101X01001101010X11000XX01000X0 +mem[45994] = 1032 +mem[15104] = 353 +mem[43012] = 3302 +mem[3101] = 3195 +mem[58848] = 504541 +mem[48036] = 3990 +mask = 101011111100X010010X0X0X110111X10110 +mem[55860] = 425881800 +mem[49212] = 127188344 +mem[16320] = 45285651 +mask = 10X01110010X000X11000001000X0010X100 +mem[10403] = 4668 +mem[64] = 79964 +mem[52226] = 263 +mask = 1001X110110X0011010110001X01X0X01100 +mem[13086] = 15318901 +mem[14412] = 75226298 +mask = XX0011XX010000X11100000100010X1X0100 +mem[23984] = 1042686 +mem[43191] = 960403 +mem[304] = 17453 +mem[43446] = 312310 +mem[3612] = 7039 +mem[24387] = 1076710 +mem[35072] = 35503 +mask = 10001X10110X0XXX01010101X00110000X0X +mem[40240] = 74221428 +mem[19881] = 1055 +mem[61105] = 2705392 +mem[36207] = 117170 +mem[34315] = 1069384 +mem[24067] = 9021444 +mask = 100X1X1111000001X0010XX11X01101001X0 +mem[33794] = 809 +mem[62607] = 265070 +mem[59634] = 49282 +mem[61442] = 364 +mem[37003] = 628813 +mem[7946] = 644992 +mask = 1101X1000X0X001111X00111000100101001 +mem[31631] = 5264178 +mem[54754] = 1554399 +mem[23468] = 4729 +mask = 000111XX10X0001101X0X1001010X1XXX110 +mem[50043] = 4139464 +mem[49775] = 61509506 +mem[53862] = 156448 +mem[13334] = 87 +mem[18854] = 9282 +mem[34330] = 30468246 +mask = 00011110100X00X1X1X000X11001101001X0 +mem[31487] = 906990 +mem[52518] = 305801 +mem[49859] = 295219 +mem[31776] = 1816407 +mem[1947] = 7357561 +mem[46508] = 4130 +mem[17050] = 30862 +mask = 10001110110X000X0X01X10X00111000101X +mem[9293] = 1384 +mem[38283] = 2143609 +mem[34969] = 5179 +mem[63542] = 11640 +mem[27523] = 1345 +mask = 100111X0000000X1X10000100010100000X0 +mem[10736] = 216826655 +mem[45201] = 17886838 +mem[10901] = 638 +mem[32804] = 195074 +mask = 1101X1X0XX00111101X0000111111X110001 +mem[39181] = 416963 +mem[9249] = 23378 +mem[31817] = 28320828 +mem[2935] = 456520 +mem[13116] = 502217 +mem[43105] = 1629110 +mask = 1XXX111X1100X01X010110001X01101X1100 +mem[50732] = 3451 +mem[15501] = 841008 +mem[17518] = 59713011 +mem[20719] = 597200 +mem[304] = 4690251 +mem[54185] = 1478 +mem[64845] = 15752175 +mask = 110111000000X0X00X001X111000X1100010 +mem[8552] = 30412318 +mem[13116] = 1108685 +mem[6392] = 779855579 +mem[37617] = 3473324 +mem[51729] = 51848 +mem[57424] = 23802 +mem[15479] = 17 +mask = X00111101XX001111010011110X001000X01 +mem[25195] = 129734 +mem[11914] = 2701 +mem[2864] = 25833 +mask = 1001111X11X10XXX0X00101010110X00X001 +mem[41424] = 106207900 +mem[48133] = 43924223 +mem[49702] = 179742 +mask = 10011X111101000X00XX1X0X101110001001 +mem[34101] = 640437195 +mem[41745] = 203723 +mask = 110111X011011011X100101X10100100000X +mem[348] = 627305 +mem[12497] = 7501 +mem[805] = 3988 +mem[60636] = 184971943 +mask = 100111001000001X0100X10011X00001XXX0 +mem[50944] = 202043 +mem[34140] = 15663180 +mem[2200] = 1479 +mem[27465] = 82898391 +mask = 000X11111X10001101X00X01101X0001011X +mem[37944] = 6895727 +mem[61573] = 409349871 +mem[50342] = 61513 +mem[13583] = 22407 +mem[59968] = 102419 +mem[2136] = 114207754 +mem[30421] = 997 +mask = 100111101X0X0011010X1XX01XX1X010010X +mem[13083] = 207 +mem[10383] = 31056 +mem[59321] = 402034 +mem[22966] = 20228 +mem[23372] = 779 +mem[25895] = 1614 +mem[11288] = 3047 +mask = 1101110000000001XX0X111X1001XXX1110X +mem[31200] = 6875882 +mem[26216] = 947 +mem[5932] = 72207364 +mem[64126] = 1260 +mem[24890] = 3898 +mem[61396] = 2240803 +mask = 10001X101X0XX0110X01010011011X001110 +mem[27866] = 740 +mem[19123] = 32418 +mem[23286] = 13542 +mem[50342] = 34812801 +mem[19362] = 12615968 +mem[23756] = 107442819 +mask = 100X111X1100X11X0X0X000X1X1001110110 +mem[2772] = 3055 +mem[8755] = 581 +mem[60512] = 906058 +mem[22390] = 3925820 +mem[15876] = 280704 +mem[40784] = 1550 +mask = X000101X1100001011X10001000110010X00 +mem[182] = 466813 +mem[15844] = 21827 +mem[4813] = 19124 +mem[49362] = 2261 +mask = 11011X00110X1X10010X0X110111101010XX +mem[37402] = 839 +mem[35835] = 3289 +mem[21867] = 10856 +mem[32498] = 1600115 +mem[35408] = 547736 +mask = 1111110000010X1X11X00100X0X110101X01 +mem[1140] = 1767723 +mem[18180] = 11108349 +mem[19129] = 115 +mem[7955] = 103275871 +mask = 1000101X1X00000X0XX1100001X11X1100X0 +mem[39668] = 7209001 +mem[57657] = 873105 +mem[21665] = 441551 +mem[20895] = 390 +mem[42377] = 98696816 +mem[38513] = 18489 +mask = 1001101X110X000XX001110X10011X10110X +mem[63570] = 15065690 +mem[3660] = 49298 +mem[27417] = 427585 +mem[37005] = 58080842 +mem[21145] = 45587769 +mem[59405] = 235561467 +mask = 1XX100000000X001010X0001010X00010010 +mem[61696] = 13179282 +mem[60388] = 14504403 +mem[54528] = 139910709 +mem[10543] = 2877271 +mem[44950] = 1250 +mask = 100111100X000111110000X0000X00X001X1 +mem[34901] = 4089 +mem[7491] = 4875619 +mem[30899] = 358791983 +mem[63542] = 48357 +mem[55865] = 289 +mask = XX0X1110100100X10100010010XX00100100 +mem[1939] = 9240 +mem[13700] = 884 +mem[56638] = 5690182 +mem[38174] = 2173 +mem[52518] = 54887 +mask = 1X001X111100X0X10X01XX001X11101X1100 +mem[13834] = 15183481 +mem[65481] = 29968 +mem[23863] = 467501 +mem[19360] = 167115 +mem[7268] = 8208487 +mem[14485] = 158 +mask = 100111101100001XX1011000001X0X100000 +mem[8868] = 484089989 +mem[53350] = 4089002 +mem[57545] = 6025444 +mem[28491] = 45516050 +mask = 1000111XX10000X00111X101X0X010101XXX +mem[39822] = 451680949 +mem[57061] = 370534242 +mask = 10001X10110X0010X111XX0100X11010X11X +mem[16975] = 239223476 +mem[21172] = 15004 +mem[14883] = 71129165 +mask = 10X0X1111100X0100111010101X110000110 +mem[20805] = 1015445496 +mem[14229] = 217524 +mem[40036] = 2501 +mem[41119] = 17208160 +mem[56826] = 349928 +mem[57555] = 884 +mask = 000X11101000001101XX1000000000100X00 +mem[35523] = 32624 +mem[36012] = 9499537 +mem[38756] = 421 +mem[14024] = 190459520 +mem[13308] = 1286846 +mem[37150] = 4205580 +mask = 1X01111011000X1X0100100X011001110100 +mem[40710] = 2279 +mem[34963] = 2267645 +mem[12759] = 643 +mem[17704] = 5597582 +mem[30411] = 351996998 +mem[16505] = 272444 +mask = 10X111101X010X1X0X0010011001000X0110 +mem[39356] = 22255 +mem[48815] = 1638 +mem[34690] = 420690 +mem[16320] = 104253 +mem[53422] = 477 +mask = 100011X0XX01XX10111111010X0010011111 +mem[54065] = 24449 +mem[10993] = 12705817 +mem[47121] = 284443 +mem[36383] = 512188 +mem[18814] = 159439379 +mem[17770] = 99104 +mask = 110111000X000X010101X11X101X00000X11 +mem[51615] = 735360 +mem[62469] = 15939 +mask = 100X1110XX000X11X100100X00000X00X10X +mem[14772] = 38635 +mem[29236] = 13420 +mem[62613] = 47790 +mem[39212] = 167702 +mem[8936] = 106407539 +mem[38934] = 332 +mask = 0X00111010010011X10X0X0XX001X010000X +mem[63621] = 996 +mem[56538] = 52673058 +mem[37764] = 995346 +mem[32132] = 103636989 +mem[15733] = 13086 +mem[44188] = 194198 +mask = 0101010010000011X11010011X1X0X101X01 +mem[46447] = 784 +mem[13324] = 3401 +mem[22200] = 165702 +mem[7955] = 649 +mem[15844] = 2690647 +mem[64010] = 1096 +mask = 11X1X1X001X11X11010XX01000X011010010 +mem[24806] = 1221 +mem[53291] = 1348383 +mem[55875] = 25945782 +mem[4492] = 1904 +mem[59333] = 2401690 +mem[47121] = 1839078 +mask = 10011110X10100X1X10X0010110010110110 +mem[40541] = 11787096 +mem[62086] = 2967 +mem[28799] = 4008988 +mem[64917] = 268674 +mem[18114] = 2655847 +mem[45757] = 57333538 +mem[44645] = 644597 +mask = X000111000000X1111XX10X1000X0111X100 +mem[10448] = 1060 +mem[31631] = 77787880 +mem[42148] = 6070584 +mem[57082] = 485245396 +mem[52482] = 21478 +mask = 100XX11011000X11010X0010X00X10X0110X +mem[2017] = 14320 +mem[3101] = 714880 +mem[33316] = 105398 +mem[28361] = 127078137 +mem[23616] = 10309 +mem[16594] = 13326311 +mask = X001111001X0XX1101X01011X0110X1X1100 +mem[43153] = 29487947 +mem[46646] = 3335247 +mem[17123] = 27270587 +mem[5225] = 16921674 +mem[30789] = 418871729 +mask = 110X011010001111011000X111011XXX0100 +mem[10985] = 214477 +mem[13116] = 27310 +mem[5115] = 1416 +mem[12596] = 453023 +mem[11737] = 24916 +mem[14311] = 6470 +mem[10361] = 300 +mask = 000X11XX100000110110111110100X1101XX +mem[22040] = 1941817 +mem[38002] = 7734399 +mem[48736] = 31798852 +mem[47426] = 204659941 +mem[11288] = 15341 +mask = 10X10X000001001X1100X010X011100X1001 +mem[42377] = 129247876 +mem[27828] = 50890049 +mask = 10001110010000X1110010101011X101X01X +mem[57528] = 3471 +mem[23114] = 96086679 +mem[8446] = 38698 +mem[14844] = 792092 +mem[42506] = 31779 +mem[64009] = 10029 +mem[42731] = 172808 +mask = 1101XX000000X0X1010010000001000X00XX +mem[426] = 11039 +mem[23258] = 556641472 +mem[51919] = 15137974 +mem[21761] = 530 +mem[21377] = 850024656 +mem[59501] = 531065557 +mask = 10001X10010X0X1101X00010100X1011X001 +mem[43269] = 9515743 +mem[426] = 5602 +mem[2308] = 381075 +mem[57933] = 56242190 +mem[48133] = 597263 +mask = 10X111X010X10011X1011000100100111100 +mem[53350] = 383807 +mem[37410] = 1044 +mem[62086] = 14451 +mask = X001111010XXX01101001001XX1001101000 +mem[12756] = 551 +mem[1027] = 656489115 +mem[60702] = 336416 +mem[42396] = 60622 +mem[3436] = 1377859 +mem[17518] = 1451 +mask = 10011110100X00110100100X000XX00001XX +mem[42037] = 79130078 +mem[34850] = 3303 +mask = XX011X1010010011010110000X0100100X1X +mem[30581] = 949124 +mem[18437] = 1990679 +mem[2340] = 174075070 +mem[46975] = 5827 +mem[9421] = 107926 +mem[28836] = 6636869 +mask = 1X01X100X00X001XX1000X0X000110X00001 +mem[53904] = 2238757 +mem[22157] = 13388 +mem[59321] = 31451373 +mem[31277] = 110705865 +mask = 100X1111X100001101X1X11100X010101101 +mem[64929] = 5596232 +mem[42822] = 12360220 +mem[49391] = 650 +mem[527] = 1337719 +mem[56173] = 44948559 +mem[64845] = 51705729 +mask = 100X11X0X10X0XX101000000101X0010X11X +mem[63581] = 62572875 +mem[52795] = 23120259 +mem[38228] = 737964538 +mem[45105] = 480 +mem[33059] = 273619504 +mem[60636] = 73 +mask = 1X0111X01100001101001X00X00000100110 +mem[2592] = 114883 +mem[61691] = 2066 +mem[51873] = 208 +mask = 110X100X110X10XX1100101XX01X10111X01 +mem[28341] = 144281151 +mem[36729] = 56472321 +mem[63409] = 10778 +mem[21172] = 63301 +mem[1101] = 3785 +mask = 100111100X00001101X01X00001110X01XX1 +mem[36813] = 990295316 +mem[44821] = 179862368 +mem[45561] = 12722 +mem[54859] = 19017266 +mem[50564] = 167811030 +mem[43704] = 126046154 +mask = 10001X10X1000011X1000X00100100110010 +mem[42747] = 1659054 +mem[10403] = 568236 +mem[45045] = 43419 +mem[31809] = 59431 +mem[49382] = 16398 +mem[56638] = 387921470 +mask = 11X1X1000001X01011X0X1X0XX1010001001 +mem[15844] = 133202 +mem[59321] = 81765 +mem[19566] = 8456988 +mem[51120] = 1362 +mask = 1001X11XX0000011X10011100X0010000001 +mem[49173] = 1284 +mem[3884] = 8094 +mem[32207] = 12943 +mem[32916] = 43847 +mem[45] = 78615226 +mem[47659] = 4559 +mask = 10011X101X000111X0X000101010001X0X01 +mem[47504] = 3997682 +mem[630] = 49259614 +mem[23114] = 688 +mem[62188] = 12822166 +mem[65077] = 459034 +mask = X101010XX000X01101X010X0011100101000 +mem[26001] = 1543 +mem[48133] = 288946 +mem[53422] = 18943982 +mask = 1X00XXX1110X00110101X0111100X010000X +mem[33738] = 196926637 +mem[37664] = 623 +mem[48029] = 5133 +mem[23732] = 23735 +mem[30329] = 212916554 +mem[8552] = 119946627 +mem[6631] = 1907 +mask = 1XX11100X000001X01X01100X10X000100X0 +mem[1703] = 775689020 +mem[2780] = 3545 +mem[2818] = 234302 +mask = 1001X1XX100000110100000001X0001X0101 +mem[61417] = 120523 +mem[13083] = 2308 +mem[32789] = 3997976 +mem[50116] = 778868811 +mem[8936] = 61495467 +mem[12206] = 208 +mask = 100111X0X00000X1010000100000001011XX +mem[9421] = 2972812 +mem[34256] = 2423170 +mem[36762] = 36668 +mem[19241] = 64537 +mem[31618] = 1055988588 +mask = X00X101111000X0100010XX0X111X01010X0 +mem[49552] = 27782759 +mem[9251] = 4816 +mem[14980] = 3017 +mask = X0X10000X000X00X01X1010111111X11X110 +mem[40421] = 51130 +mem[60996] = 34278 +mem[64961] = 414 +mask = 1000111X1100001001X1X10XX0010X0XXX00 +mem[52359] = 763212311 +mem[44171] = 9117448 +mem[49702] = 8926626 +mem[2466] = 2011885 +mem[10736] = 383225 +mem[38555] = 14408818 +mem[19362] = 677100 +mask = 100011X1110XX010011X1100X001X001X11X +mem[60702] = 1681285 +mem[33941] = 249 +mem[33060] = 48065 +mem[6660] = 11635 +mask = 10X1111X1X000011010X1X0XX10000110X00 +mem[33592] = 7818 +mem[20643] = 5562857 +mem[61417] = 482 +mem[25002] = 18611 +mask = 1X011000110010X0X100101XX111X1X100X1 +mem[15042] = 1048663 +mem[46450] = 906445926 +mem[65481] = 325 +mem[8090] = 145570 +mem[46447] = 2513 +mask = 11X101X01X00XX11X10000000X11X00X0000 +mem[9686] = 6175651 +mem[55574] = 42723 +mem[37505] = 2089 +mem[64151] = 6581 +mem[24387] = 3109 +mem[56931] = 0 +mask = 11011100XX0X1X1X010010010X1X10X000X0 +mem[42506] = 1351 +mem[15066] = 30271 +mem[426] = 4269668 +mem[20864] = 120804232 +mem[14675] = 1430376 +mask = X00X111X110000110100X000101100101000 +mem[16379] = 14955 +mem[63542] = 294779946 +mem[43782] = 14023312 +mem[50116] = 68098604 +mem[6346] = 2828888 +mask = 1XX0X1100110XX11X0101011100000100100 +mem[27465] = 802232 +mem[46780] = 18542342 +mem[19044] = 4213 +mem[39202] = 76554568 +mem[33173] = 68587 +mask = 10X1111111110101X100001010X1000001X1 +mem[57043] = 971606118 +mem[46661] = 8089 +mem[38403] = 32188546 +mem[18704] = 630312774 +mem[16594] = 54138487 +mask = 1XX1100X00X0001001000000000X000100X1 +mem[33536] = 5526445 +mem[3755] = 929 +mem[5733] = 77809 +mem[14065] = 15212249 +mem[34315] = 1058941 +mask = X00111101X000011010XX0X110100X01X00X +mem[33910] = 15336 +mem[29561] = 16371540 +mem[10901] = 273 +mask = 100011X101000001110X01001X0011X001X0 +mem[23567] = 675387 +mem[7604] = 2997382 +mem[16594] = 858806 +mem[47216] = 549 +mem[15386] = 126092 \ No newline at end of file From a37f90515046ee46e0c6bb8a4c4931218046f7d0 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 14 Dec 2020 07:06:47 +0100 Subject: [PATCH 199/433] Refactor solution --- .../adventofcode/year20/days/Day14.java | 74 +++++++++---------- 1 file changed, 35 insertions(+), 39 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day14.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day14.java index 7f3d97bf..5a540e34 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day14.java @@ -27,26 +27,19 @@ public Day14() { @Override public Object part1() { - Instruction[] input = dayStream().map(s -> readString(s, "%s = %s", Instruction.class)).toArray(Instruction[]::new); + Instruction[] input = getInput(); Map memory = new HashMap<>(); String currentMask = ""; for(Instruction i : input){ Optional mem = i.getMem(); if(mem.isPresent()){ - long val = mem.get().value; - StringBuilder bin = new StringBuilder(toBinaryString(val)); - while(bin.length() finalCurrentMask.charAt(j) != 'X') + .forEach(j -> bin.setCharAt(j, finalCurrentMask.charAt(j))); memory.put(mem.get().index, parseLong(bin.toString(), 2)); - } else { - currentMask = i.value; - } + } else currentMask = i.value; } return memory.values().stream().mapToLong(e -> e).sum(); } @@ -71,36 +64,15 @@ public static class Mem { @Override public Object part2() { - Instruction[] input = dayStream().map(s -> readString(s, "%s = %s", Instruction.class)).toArray(Instruction[]::new); + Instruction[] input = getInput(); Map memory = new HashMap<>(); String currentMask = ""; for(Instruction i : input){ Optional mem = i.getMem(); if(mem.isPresent()){ - long val = mem.get().index; - StringBuilder bin = binWithLength(val, currentMask.length()); - List floaters = new ArrayList<>(); - for(int j = 1; j<=bin.length(); j++){ - char c = currentMask.charAt(currentMask.length()-j); - char c2 = bin.charAt(bin.length()-j); - if(c!='X'){ - if(c == c2){ - floaters.add(j); - } else if(c == '1'){ - bin.setCharAt(bin.length()-j, c); - } - } - } - StringBuilder binary; - long j = 0; - while((binary = binWithLength(j, floaters.size())).length() == floaters.size()){ - for(int k = 0; k floaters = applyMask(currentMask, bin); + fillMemory(memory, mem, bin, floaters); } else { currentMask = i.value; } @@ -108,6 +80,30 @@ public Object part2() { return memory.values().stream().mapToLong(e -> e).sum(); } + private Instruction[] getInput() { + return dayStream().map(s -> readString(s, "%s = %s", Instruction.class)).toArray(Instruction[]::new); + } + + private void fillMemory(Map memory, Optional mem, StringBuilder bin, List floaters) { + StringBuilder binary; + for(long j = 0; (binary = binWithLength(j, floaters.size())).length() == floaters.size(); j++){ + for(int k = 0; k< floaters.size(); k++){ + bin.setCharAt(floaters.get(k), binary.charAt(k)); + } + memory.put(parseLong(bin.toString(), 2), mem.get().value); + } + } + + private List applyMask(String currentMask, StringBuilder bin) { + List floaters = new ArrayList<>(); + for(int j = 0; j< bin.length(); j++){ + char c = currentMask.charAt(j); + if(c=='X') floaters.add(j); + else if(c == '1') bin.setCharAt(j, c); + } + return floaters; + } + private StringBuilder binWithLength(long val, int s) { StringBuilder bin = new StringBuilder(toBinaryString(val)); while (bin.length() < s) { From b4c3c6a8c5d59433a05b5a6452557ab5f1d1d8c5 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Mon, 14 Dec 2020 11:03:24 +0100 Subject: [PATCH 200/433] Made the solution WAY shorter with bitwise OR --- .../com/sbaars/adventofcode/year20/days/Day14.java | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day14.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day14.java index 5a540e34..7ad80751 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day14.java @@ -6,6 +6,7 @@ import lombok.Value; import java.util.*; +import org.apache.commons.text.TextStringBuilder; import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; import static java.lang.Integer.parseInt; @@ -29,17 +30,10 @@ public Day14() { public Object part1() { Instruction[] input = getInput(); Map memory = new HashMap<>(); - String currentMask = ""; + final TextStringBuilder currentMask = new TextStringBuilder(); for(Instruction i : input){ - Optional mem = i.getMem(); - if(mem.isPresent()){ - StringBuilder bin = binWithLength(mem.get().value, currentMask.length()); - String finalCurrentMask = currentMask; - range(0, bin.length()) - .filter(j -> finalCurrentMask.charAt(j) != 'X') - .forEach(j -> bin.setCharAt(j, finalCurrentMask.charAt(j))); - memory.put(mem.get().index, parseLong(bin.toString(), 2)); - } else currentMask = i.value; + i.getMem().ifPresentOrElse(m -> memory.put(m.index, m.value | parseLong(currentMask.toString(), 2)), + () -> currentMask.set(i.value).replaceAll("X", "0")); } return memory.values().stream().mapToLong(e -> e).sum(); } From bb34e813cca1fedcd2f7354c4ddd615bd6028d70 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 15 Dec 2020 06:52:50 +0100 Subject: [PATCH 201/433] Day 15 --- .../adventofcode/year20/days/Day15.java | 48 +++++++++++++++++++ src/main/resources/2020/day15.txt | 1 + 2 files changed, 49 insertions(+) create mode 100644 src/main/java/com/sbaars/adventofcode/year20/days/Day15.java create mode 100644 src/main/resources/2020/day15.txt diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day15.java new file mode 100644 index 00000000..52e00d16 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day15.java @@ -0,0 +1,48 @@ +package com.sbaars.adventofcode.year20.days; + +import com.sbaars.adventofcode.year20.Day2020; +import lombok.Data; +import lombok.Value; + +import java.util.*; + +import static com.google.common.primitives.Longs.asList; +import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; +import static java.lang.Long.parseLong; +import static java.lang.Long.toBinaryString; +import static java.util.Optional.empty; +import static java.util.Optional.of; +import static java.util.stream.IntStream.range; + +public class Day15 extends Day2020 { + public static void main(String[] args) { + new Day15().printParts(); + } + + public Day15() { + super(15); + } + + @Override + public Object part1() { + return getSolution(2020L); + } + + @Override + public Object part2() { + return getSolution(30000000L); + } + + private long getSolution(long offset) { + Map turnNumbers = new HashMap<>(); + long[] nums = dayNumbers(","); + range(0, nums.length-1).forEach(i -> turnNumbers.put(nums[i], (long)i)); + long lastNumber = nums[nums.length-1]; + for(long turnNumber = turnNumbers.size(); turnNumber <= offset -2L; turnNumber++){ + long newLastNumber = turnNumbers.containsKey(lastNumber) ? turnNumber - turnNumbers.get(lastNumber) : 0; + turnNumbers.put(lastNumber, turnNumber); + lastNumber = newLastNumber; + } + return lastNumber; + } +} diff --git a/src/main/resources/2020/day15.txt b/src/main/resources/2020/day15.txt new file mode 100644 index 00000000..2c21f449 --- /dev/null +++ b/src/main/resources/2020/day15.txt @@ -0,0 +1 @@ +1,0,16,5,17,4 \ No newline at end of file From a1c7988332930b8297cf796b8a11a5d33115341a Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Tue, 15 Dec 2020 21:27:04 +0100 Subject: [PATCH 202/433] Simplify loop condition --- src/main/java/com/sbaars/adventofcode/year20/days/Day15.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day15.java index 52e00d16..9b40156b 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day15.java @@ -38,7 +38,7 @@ private long getSolution(long offset) { long[] nums = dayNumbers(","); range(0, nums.length-1).forEach(i -> turnNumbers.put(nums[i], (long)i)); long lastNumber = nums[nums.length-1]; - for(long turnNumber = turnNumbers.size(); turnNumber <= offset -2L; turnNumber++){ + for(long turnNumber = turnNumbers.size(); turnNumber < offset - 1; turnNumber++){ long newLastNumber = turnNumbers.containsKey(lastNumber) ? turnNumber - turnNumbers.get(lastNumber) : 0; turnNumbers.put(lastNumber, turnNumber); lastNumber = newLastNumber; From de4c25aa0cc8b271b80aa4398d866081f0a36c8e Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Tue, 15 Dec 2020 21:30:00 +0100 Subject: [PATCH 203/433] Skeletons for some upcoming days --- .../adventofcode/year20/days/Day16.java | 28 +++++++++++++++++++ .../adventofcode/year20/days/Day17.java | 24 ++++++++++++++++ .../adventofcode/year20/days/Day18.java | 24 ++++++++++++++++ .../adventofcode/year20/days/Day19.java | 24 ++++++++++++++++ .../adventofcode/year20/days/Day20.java | 24 ++++++++++++++++ src/main/resources/2020/day16.txt | 0 src/main/resources/2020/day17.txt | 0 src/main/resources/2020/day18.txt | 0 src/main/resources/2020/day19.txt | 0 src/main/resources/2020/day20.txt | 0 10 files changed, 124 insertions(+) create mode 100644 src/main/java/com/sbaars/adventofcode/year20/days/Day16.java create mode 100644 src/main/java/com/sbaars/adventofcode/year20/days/Day17.java create mode 100644 src/main/java/com/sbaars/adventofcode/year20/days/Day18.java create mode 100644 src/main/java/com/sbaars/adventofcode/year20/days/Day19.java create mode 100644 src/main/java/com/sbaars/adventofcode/year20/days/Day20.java create mode 100644 src/main/resources/2020/day16.txt create mode 100644 src/main/resources/2020/day17.txt create mode 100644 src/main/resources/2020/day18.txt create mode 100644 src/main/resources/2020/day19.txt create mode 100644 src/main/resources/2020/day20.txt diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day16.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day16.java new file mode 100644 index 00000000..977d065c --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day16.java @@ -0,0 +1,28 @@ +package com.sbaars.adventofcode.year20.days; + +import static java.util.stream.IntStream.range; + +import com.sbaars.adventofcode.year20.Day2020; +import java.util.HashMap; +import java.util.Map; + +public class Day16 extends Day2020 { + public static void main(String[] args) { + new Day16().printParts(); + } + + public Day16() { + super(16); + } + + @Override + public Object part1() { + String input = day(); + return input; + } + + @Override + public Object part2() { + return 0; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day17.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day17.java new file mode 100644 index 00000000..13f5104f --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day17.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year20.days; + +import com.sbaars.adventofcode.year20.Day2020; + +public class Day17 extends Day2020 { + public static void main(String[] args) { + new Day17().printParts(); + } + + public Day17() { + super(17); + } + + @Override + public Object part1() { + String input = day(); + return input; + } + + @Override + public Object part2() { + return 0; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day18.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day18.java new file mode 100644 index 00000000..fa1db874 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day18.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year20.days; + +import com.sbaars.adventofcode.year20.Day2020; + +public class Day18 extends Day2020 { + public static void main(String[] args) { + new Day18().printParts(); + } + + public Day18() { + super(18); + } + + @Override + public Object part1() { + String input = day(); + return input; + } + + @Override + public Object part2() { + return 0; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day19.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day19.java new file mode 100644 index 00000000..703836f5 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day19.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year20.days; + +import com.sbaars.adventofcode.year20.Day2020; + +public class Day19 extends Day2020 { + public static void main(String[] args) { + new Day19().printParts(); + } + + public Day19() { + super(19); + } + + @Override + public Object part1() { + String input = day(); + return input; + } + + @Override + public Object part2() { + return 0; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day20.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day20.java new file mode 100644 index 00000000..c96de7eb --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day20.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year20.days; + +import com.sbaars.adventofcode.year20.Day2020; + +public class Day20 extends Day2020 { + public static void main(String[] args) { + new Day20().printParts(); + } + + public Day20() { + super(20); + } + + @Override + public Object part1() { + String input = day(); + return input; + } + + @Override + public Object part2() { + return 0; + } +} diff --git a/src/main/resources/2020/day16.txt b/src/main/resources/2020/day16.txt new file mode 100644 index 00000000..e69de29b diff --git a/src/main/resources/2020/day17.txt b/src/main/resources/2020/day17.txt new file mode 100644 index 00000000..e69de29b diff --git a/src/main/resources/2020/day18.txt b/src/main/resources/2020/day18.txt new file mode 100644 index 00000000..e69de29b diff --git a/src/main/resources/2020/day19.txt b/src/main/resources/2020/day19.txt new file mode 100644 index 00000000..e69de29b diff --git a/src/main/resources/2020/day20.txt b/src/main/resources/2020/day20.txt new file mode 100644 index 00000000..e69de29b From 3966faee2a2827cd0a5ddc21922d79a8b79c07c5 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Wed, 16 Dec 2020 07:41:00 +0100 Subject: [PATCH 204/433] Day 16 --- .../adventofcode/year19/days/Day12.java | 1 - .../sbaars/adventofcode/year19/days/Day7.java | 1 - .../sbaars/adventofcode/year19/days/Day8.java | 1 - .../adventofcode/year20/days/Day16.java | 75 ++++- src/main/resources/2020/day16.txt | 270 ++++++++++++++++++ 5 files changed, 340 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day12.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day12.java index 4a5cb9ce..9b21b8ea 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day12.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day12.java @@ -7,7 +7,6 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashSet; -import lombok.var; public class Day12 extends Day2019 { public Day12(){ diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day7.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day7.java index 83d6b8c9..d7292cec 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day7.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day7.java @@ -8,7 +8,6 @@ import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year19.Day2019; import com.sbaars.adventofcode.year19.intcode.IntcodeComputer; -import lombok.var; public class Day7 extends Day2019 { public Day7(){ diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day8.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day8.java index 8d23e3ea..e7761225 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day8.java @@ -8,7 +8,6 @@ import java.util.ArrayList; import java.util.List; import java.util.stream.IntStream; -import lombok.var; public class Day8 extends Day2019 implements ProcessesImages { public Day8(){ diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day16.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day16.java index 977d065c..1dab0925 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day16.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day16.java @@ -1,28 +1,93 @@ package com.sbaars.adventofcode.year20.days; -import static java.util.stream.IntStream.range; +import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; +import static java.util.Arrays.stream; +import static java.util.stream.Collectors.toList; +import static org.apache.commons.lang3.ArrayUtils.subarray; +import com.google.common.collect.Multimap; +import com.google.common.collect.MultimapBuilder; import com.sbaars.adventofcode.year20.Day2020; -import java.util.HashMap; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; import java.util.Map; +import java.util.Optional; +import java.util.Set; +import lombok.Data; +import lombok.Value; public class Day16 extends Day2020 { public static void main(String[] args) { new Day16().printParts(); } + private final Rule[] rules; + private final long[] myTicket; + private final List> tickets; + public Day16() { super(16); + String[] input = day().split("\n\n"); + this.rules = stream(input[0].split("\n")).map(s -> readString(s, "%s: %n-%n or %n-%n", Rule.class)).toArray(Rule[]::new); + this.myTicket = stream(input[1].split("\n")[1].split(",")).mapToLong(Long::parseLong).toArray(); + String[] ticketStrings = input[2].split("\n"); + this.tickets = stream(subarray(ticketStrings, 1, ticketStrings.length)).map(s -> stream(s.split(",")).map(Long::parseLong).collect(toList())).collect(toList()); } @Override public Object part1() { - String input = day(); - return input; + return tickets.stream().flatMapToLong(t -> t.stream().filter(n -> stream(rules).noneMatch(r -> r.check(n))).mapToLong(e -> e)).sum(); + } + + @Data + @Value + public static class Rule { + String name; + long lower1; + long upper1; + long lower2; + long upper2; + + public boolean check(long val) { + return (val >= lower1 && val <= upper1) || (val >= lower2 && val <= upper2); + } + + public boolean isDeparture() { + return name.startsWith("departure"); + } } @Override public Object part2() { - return 0; + List> valid = tickets.stream().filter(t -> t.stream().allMatch(n -> stream(rules).anyMatch(r -> r.check(n)))).collect(toList()); + + Multimap ruleIndex = MultimapBuilder.hashKeys().arrayListValues().build(); + for (Rule r : rules) { + for (int j = 0; j < valid.get(0).size(); j++) { + int finalJ = j; + if (valid.stream().allMatch(t -> r.check(t.get(finalJ)))) { + ruleIndex.put(j, r); + } + } + } + + Optional>> rs; + Set indices = new HashSet<>(); + while ((rs = ruleIndex.asMap().entrySet().stream().filter(e -> e.getValue().size() == 1 && !indices.contains(e.getKey())).findAny()).isPresent()) { + Map.Entry> r = rs.get(); + int index = r.getKey(); + Rule rule = ((List) r.getValue()).get(0); + for (int i = 0; i < rules.length; i++) { + Map.Entry> t = new ArrayList<>(ruleIndex.asMap().entrySet()).get(i); + if (t.getKey() != index) { + t.getValue().remove(rule); + } + } + indices.add(index); + } + + return ruleIndex.asMap().entrySet().stream().filter(e -> e.getValue().stream().anyMatch(Rule::isDeparture)).mapToLong(e -> myTicket[e.getKey()]).reduce((a, b) -> a * b).getAsLong(); } } diff --git a/src/main/resources/2020/day16.txt b/src/main/resources/2020/day16.txt index e69de29b..b07d0c2b 100644 --- a/src/main/resources/2020/day16.txt +++ b/src/main/resources/2020/day16.txt @@ -0,0 +1,270 @@ +departure location: 41-598 or 605-974 +departure station: 30-617 or 625-957 +departure platform: 29-914 or 931-960 +departure track: 39-734 or 756-972 +departure date: 37-894 or 915-956 +departure time: 48-54 or 70-955 +arrival location: 39-469 or 491-955 +arrival station: 47-269 or 282-949 +arrival platform: 26-500 or 521-960 +arrival track: 26-681 or 703-953 +class: 49-293 or 318-956 +duration: 25-861 or 873-973 +price: 30-446 or 465-958 +route: 50-525 or 551-973 +row: 39-129 or 141-972 +seat: 37-566 or 573-953 +train: 43-330 or 356-969 +type: 32-770 or 792-955 +wagon: 47-435 or 446-961 +zone: 30-155 or 179-957 + +your ticket: +71,127,181,179,113,109,79,151,97,107,53,193,73,83,191,101,89,149,103,197 + +nearby tickets: +909,469,709,246,389,667,389,288,817,242,942,255,428,712,187,861,821,552,229,253 +373,887,919,576,884,946,794,434,376,843,327,658,587,232,796,228,671,878,947,559 +554,199,222,610,427,81,235,884,947,81,670,672,643,369,805,611,892,615,274,658 +261,378,571,124,111,153,801,196,830,759,257,189,361,382,942,889,613,493,496,320 +98,265,894,196,859,594,267,99,7,286,616,665,97,356,524,382,641,290,563,813 +947,259,423,939,155,608,282,150,890,147,140,323,808,284,466,725,214,799,96,86 +631,265,836,523,86,147,557,542,610,647,398,730,242,243,717,705,72,811,734,556 +746,577,386,713,646,127,433,399,243,218,949,225,933,244,827,726,189,625,358,859 +90,670,369,154,97,110,188,829,585,383,828,469,190,837,199,245,668,585,400,136 +221,855,756,92,86,207,414,395,183,731,591,239,114,798,212,609,708,252,594,602 +401,816,196,703,822,792,522,605,119,793,259,254,384,815,552,83,874,582,137,812 +186,677,891,259,730,424,653,655,397,947,689,107,363,711,182,415,757,667,70,860 +933,401,208,402,388,358,552,713,720,185,307,183,834,141,433,596,641,394,358,665 +193,239,553,809,250,466,801,124,776,200,430,376,143,580,367,51,764,576,824,390 +378,658,705,644,657,561,521,703,854,375,679,320,500,216,138,614,254,758,124,287 +70,808,469,189,323,847,393,833,830,234,883,188,229,830,853,986,673,641,83,406 +421,703,741,78,586,116,833,628,182,662,629,258,202,495,674,96,670,101,328,287 +608,821,634,155,117,661,103,781,84,756,770,321,119,362,816,681,879,878,759,420 +626,239,647,839,2,228,265,293,576,949,592,410,659,885,434,379,257,947,794,671 +666,252,811,370,328,54,716,241,874,757,50,495,652,75,933,935,144,1,143,101 +594,283,842,605,894,98,368,803,114,797,5,98,379,932,330,200,680,584,645,824 +492,290,76,579,100,762,856,812,148,617,183,833,380,757,52,293,68,875,366,873 +792,582,392,329,210,846,662,388,310,183,705,410,100,769,125,719,251,366,71,87 +558,669,801,80,881,497,981,112,582,597,97,804,652,938,671,842,617,287,708,422 +376,802,398,708,389,581,403,212,851,651,225,848,150,791,118,834,857,83,680,592 +358,803,629,933,416,944,226,706,795,5,936,129,467,849,253,829,179,734,228,244 +433,825,67,236,388,858,880,427,943,400,842,723,564,633,408,79,836,592,704,328 +366,402,988,892,469,941,829,90,876,662,879,556,200,590,86,733,229,768,421,409 +316,397,806,848,148,382,641,92,850,366,633,392,373,642,793,635,240,826,144,389 +318,647,154,382,597,672,321,238,220,88,674,472,402,521,121,769,326,795,890,221 +946,385,361,855,598,399,361,409,595,852,225,588,368,556,826,853,721,232,6,850 +847,323,626,254,719,938,122,656,806,578,88,556,229,894,579,105,554,266,152,342 +207,396,152,390,704,854,563,128,658,254,610,801,221,302,398,89,149,845,403,847 +793,180,225,427,723,721,793,811,212,380,270,817,180,770,359,196,415,494,229,383 +894,815,641,356,239,143,384,759,469,586,772,598,800,633,606,358,651,109,805,796 +551,102,940,715,831,560,399,599,591,250,816,246,587,852,382,416,284,636,585,420 +858,643,758,564,84,821,388,183,259,627,647,523,404,251,779,551,731,73,733,185 +647,948,663,241,837,219,687,522,521,796,122,756,418,876,887,942,795,74,762,244 +500,224,845,426,800,388,492,11,829,183,393,804,889,838,181,807,586,417,829,98 +77,936,231,116,211,874,385,572,357,248,825,374,833,236,384,769,764,855,71,794 +268,856,941,677,449,384,242,187,218,236,821,655,811,400,197,798,415,198,219,211 +664,183,420,189,400,846,584,611,82,204,585,263,614,498,608,278,425,680,612,707 +111,270,420,838,196,844,616,392,415,107,652,153,729,757,664,522,183,499,805,499 +651,467,949,825,628,798,149,876,245,765,936,653,292,523,640,247,403,389,230,507 +717,627,678,145,826,195,197,402,981,240,885,524,207,521,287,647,680,232,208,408 +108,648,823,724,267,212,625,644,363,222,880,894,230,397,560,138,217,384,888,933 +235,403,659,13,841,429,262,769,363,180,359,262,392,236,823,492,266,566,658,389 +429,771,609,126,288,382,415,93,420,252,804,282,879,588,805,384,231,830,379,263 +318,82,815,648,290,414,793,558,369,946,646,721,196,7,931,798,637,820,117,204 +673,265,664,850,556,627,194,50,84,431,403,895,705,597,820,76,893,628,360,129 +940,419,618,70,435,816,586,837,51,117,210,881,836,846,664,194,88,676,885,643 +96,104,646,363,700,676,246,859,362,607,643,97,817,521,831,491,612,214,375,875 +828,935,727,762,568,237,122,819,235,710,234,816,834,856,634,713,222,419,934,326 +636,107,591,594,264,879,850,658,825,148,606,659,223,629,70,806,224,606,914,179 +776,617,116,650,576,105,556,625,142,770,363,360,722,108,389,72,124,109,888,320 +678,587,498,841,54,712,200,271,631,368,265,766,330,830,97,816,587,798,242,369 +418,938,606,580,433,494,716,909,150,633,797,369,887,51,255,593,197,256,720,891 +873,239,817,522,71,575,800,117,935,891,640,668,579,255,887,152,771,393,807,817 +236,150,433,405,52,728,631,136,856,616,122,844,524,814,413,525,418,815,71,814 +89,392,497,939,655,669,403,880,697,226,887,860,525,667,796,666,109,105,561,401 +638,576,615,708,621,655,391,491,652,616,126,225,656,230,937,398,839,728,398,249 +238,392,798,235,667,493,119,149,827,715,98,112,800,200,51,398,125,260,13,465 +195,86,416,949,235,468,666,181,541,936,431,212,145,573,625,418,847,325,596,187 +230,724,371,256,733,205,101,715,403,126,675,883,730,519,767,885,151,875,893,650 +666,330,480,201,827,402,644,796,946,141,625,119,823,598,758,665,894,121,945,73 +255,989,840,121,806,86,193,264,611,812,84,813,560,793,664,323,108,707,627,375 +219,630,225,129,823,591,809,824,881,938,798,357,887,75,661,247,620,207,795,378 +454,635,500,426,98,942,617,126,647,230,122,887,637,269,375,391,290,125,129,231 +328,830,460,630,242,219,252,763,657,719,210,767,587,372,243,730,259,616,182,379 +525,576,118,596,101,221,75,320,804,617,206,763,637,762,575,858,594,703,603,826 +947,884,363,408,607,810,498,817,421,617,566,109,291,605,800,832,812,679,690,51 +84,823,636,139,521,242,947,639,880,263,559,248,211,655,816,801,573,78,713,207 +666,50,325,118,578,578,822,885,919,837,229,830,407,670,79,359,243,598,495,428 +848,86,673,946,239,803,209,401,882,105,144,90,324,227,629,207,87,851,650,976 +616,202,825,707,941,645,402,433,425,660,891,566,86,380,503,418,595,385,680,941 +815,264,268,874,54,839,84,74,10,944,803,143,422,411,760,812,833,186,672,557 +800,93,2,793,427,420,435,856,556,842,369,832,639,364,704,809,469,115,859,426 +884,381,725,841,249,321,105,588,845,579,219,513,255,431,651,584,825,252,370,936 +98,725,770,875,417,406,991,681,725,931,644,590,523,54,932,378,418,858,284,321 +330,415,503,521,598,209,384,761,669,426,241,879,499,576,190,88,218,380,811,102 +182,386,102,769,317,561,828,85,142,363,497,734,419,412,756,384,711,646,153,193 +233,609,141,615,731,239,768,402,359,575,984,861,681,677,213,560,412,674,560,264 +269,586,889,670,633,919,289,123,640,208,428,326,725,467,629,556,615,219,155,146 +222,801,987,415,325,283,721,657,947,941,850,847,559,146,641,679,81,73,794,206 +222,940,822,395,770,187,233,852,830,431,631,221,660,758,91,948,913,244,882,105 +256,766,364,586,148,892,260,122,710,659,80,387,631,407,701,129,213,236,76,393 +719,540,235,70,617,286,836,617,72,575,554,838,51,287,186,241,660,558,880,404 +244,844,374,727,255,579,891,195,681,575,645,581,936,552,369,79,134,367,196,324 +870,573,591,894,325,54,287,625,833,732,397,847,383,220,522,193,285,581,665,817 +724,667,582,100,677,412,318,19,108,292,632,412,734,155,635,761,939,583,223,650 +541,255,882,555,673,219,396,756,656,414,803,626,655,388,947,706,942,231,86,121 +330,662,885,220,405,886,107,114,192,356,667,222,884,368,921,837,607,937,848,495 +184,145,617,426,467,767,78,919,705,378,828,381,98,932,888,109,433,434,728,770 +234,730,230,122,155,196,384,683,667,420,805,327,249,670,886,239,947,761,91,716 +602,725,389,629,933,398,605,120,631,381,221,199,191,757,844,607,947,575,727,323 +681,52,777,184,321,768,213,104,76,667,372,826,721,80,665,880,187,195,759,834 +805,95,860,221,713,231,855,375,996,718,889,632,411,78,851,266,91,609,844,935 +579,111,185,792,648,325,265,121,716,551,411,124,655,648,324,106,503,215,662,939 +794,825,809,564,217,626,637,673,661,205,762,849,385,118,879,219,433,646,531,109 +792,873,760,194,240,773,363,573,564,609,78,289,812,432,390,556,206,402,802,251 +248,223,839,611,921,267,241,582,241,109,287,639,613,838,874,658,86,118,813,673 +127,758,940,561,837,212,114,841,129,289,662,497,371,293,591,758,269,1,228,182 +498,322,703,499,826,535,432,626,262,414,70,625,469,201,285,391,194,195,726,193 +221,734,399,556,731,820,497,752,127,818,606,845,680,941,221,105,469,383,730,405 +161,125,216,50,551,649,607,86,811,77,799,594,759,852,435,111,672,381,758,231 +393,78,200,360,828,125,122,208,122,803,837,450,590,242,938,629,83,809,214,51 +802,677,732,560,105,664,934,943,637,288,636,528,628,820,207,813,254,731,860,667 +214,630,434,561,710,726,808,88,851,797,647,673,126,113,0,647,727,415,365,266 +664,818,762,706,209,145,980,209,940,193,940,430,128,86,836,465,365,937,111,180 +795,551,84,838,367,387,609,732,837,369,720,129,468,695,665,805,573,835,97,85 +396,838,912,154,257,825,369,876,119,111,813,260,813,221,393,185,222,726,808,416 +560,762,189,84,563,237,434,706,660,820,124,589,652,824,996,147,612,641,521,369 +792,251,523,844,839,680,657,797,277,606,114,850,52,322,410,627,500,650,716,144 +598,301,154,606,414,403,385,365,888,122,647,877,102,861,145,659,861,525,593,197 +490,882,643,714,651,365,642,81,118,674,655,942,99,677,153,145,833,427,934,128 +855,185,536,426,642,826,422,403,931,829,385,641,432,858,238,285,466,640,831,818 +232,757,325,288,879,369,54,820,715,387,845,415,150,643,64,651,425,595,250,81 +836,397,399,670,392,758,674,111,395,497,876,849,799,328,100,306,883,555,222,491 +320,579,117,391,220,102,411,632,670,239,219,608,93,71,824,700,361,809,365,560 +838,113,198,851,410,628,254,117,766,734,145,618,467,948,237,840,761,75,375,231 +931,247,409,714,54,705,812,389,634,193,111,813,828,237,525,675,389,628,412,7 +567,766,198,219,878,598,705,847,933,656,649,239,730,709,318,607,153,216,810,588 +666,843,405,322,847,404,931,150,140,144,616,881,188,681,113,244,730,558,858,523 +857,656,226,231,580,940,842,618,663,579,611,551,876,850,565,389,406,284,521,144 +270,564,573,729,491,946,707,837,198,420,111,125,103,427,406,497,845,466,225,642 +520,631,552,832,380,590,813,716,290,605,711,231,551,629,214,323,383,91,574,254 +384,645,714,763,678,768,256,179,225,256,216,206,611,377,24,674,614,395,206,553 +429,762,122,894,591,716,244,638,882,129,252,421,795,144,281,413,560,558,256,94 +384,390,18,381,756,110,714,90,225,211,836,559,671,946,330,719,110,858,827,841 +692,329,575,589,892,396,116,124,709,645,720,366,209,224,717,616,255,629,234,845 +587,891,656,495,96,605,677,846,850,99,223,123,936,636,434,425,893,424,988,758 +613,734,99,611,200,792,580,630,881,247,815,363,829,874,360,425,673,799,941,691 +265,654,216,393,77,823,419,635,196,144,663,634,724,90,631,423,792,851,228,56 +245,426,127,525,711,727,411,814,944,713,77,823,523,225,839,498,224,275,84,468 +381,678,323,284,668,143,797,409,938,89,73,812,796,883,807,82,80,434,427,906 +89,804,653,653,112,633,221,184,98,416,610,102,106,253,538,814,424,417,554,327 +644,92,707,70,58,945,859,821,404,372,183,409,325,247,705,434,184,582,859,229 +203,810,875,841,732,795,823,22,497,610,260,661,499,376,880,666,236,594,426,593 +217,132,102,93,807,840,406,827,586,262,657,84,833,101,53,469,584,384,948,419 +184,430,932,362,404,845,809,247,881,204,50,404,725,854,908,793,203,833,372,797 +428,370,84,626,777,856,152,129,812,635,373,876,666,825,577,191,112,894,293,51 +820,591,649,326,130,670,265,932,893,664,838,151,611,207,241,725,585,369,656,240 +521,760,137,417,829,413,492,822,649,329,108,392,731,420,663,412,818,606,499,726 +827,427,827,420,179,146,492,126,183,226,804,712,651,275,321,593,556,121,845,99 +255,235,241,149,255,706,127,370,446,84,17,367,375,808,155,375,122,882,229,75 +430,803,995,391,886,424,257,152,196,566,893,851,380,429,934,254,671,148,153,384 +805,578,943,412,663,268,123,366,605,208,205,10,432,723,803,615,414,769,109,232 +232,668,852,389,743,556,123,820,716,118,848,389,949,947,78,582,377,792,77,374 +267,939,733,103,224,759,892,429,857,674,703,861,192,238,619,116,804,726,75,850 +936,211,115,143,155,839,18,848,95,610,431,626,143,873,328,256,249,525,194,561 +422,851,396,242,226,582,224,523,724,705,719,712,404,885,615,807,922,71,374,809 +384,268,241,575,708,253,320,840,610,575,363,216,240,892,283,144,129,356,269,163 +58,188,717,374,408,627,729,615,934,292,825,497,598,564,207,888,410,943,770,727 +999,887,184,404,766,423,610,396,854,213,77,78,432,845,644,936,325,321,644,655 +854,197,73,496,87,658,392,515,626,949,766,498,822,938,398,652,846,707,106,182 +590,114,96,654,522,882,216,853,947,73,797,568,607,556,939,715,565,154,239,100 +619,636,121,128,326,407,229,681,833,415,204,54,247,358,731,288,378,377,386,495 +646,418,859,653,882,558,807,643,381,886,209,220,598,703,118,245,406,70,124,619 +803,74,835,361,494,717,423,726,522,807,8,626,611,240,668,892,396,673,227,595 +422,584,563,146,263,318,72,727,934,125,555,142,722,641,947,372,366,999,662,116 +214,557,379,556,713,151,561,616,191,241,806,688,554,390,79,236,816,433,359,887 +712,148,218,229,468,840,183,112,501,552,321,728,714,427,605,71,188,636,573,767 +598,318,106,154,253,799,580,252,998,394,258,802,819,405,837,383,720,208,201,51 +195,234,874,673,241,515,793,650,144,580,233,109,658,123,148,53,264,392,193,672 +584,876,364,611,284,263,53,108,188,654,873,280,734,718,113,708,636,74,434,595 +628,948,792,678,81,636,118,563,293,103,514,421,386,834,607,706,100,573,202,398 +252,385,555,626,269,15,326,88,73,360,247,813,658,681,725,793,430,195,319,834 +253,189,814,654,148,765,586,822,262,616,767,73,666,527,290,78,412,402,731,202 +128,673,236,726,662,717,330,832,840,722,372,364,383,406,237,996,648,843,389,668 +396,108,371,149,843,830,181,416,626,762,387,887,815,616,366,228,215,404,150,461 +210,819,141,658,211,214,106,400,371,215,704,936,936,86,601,847,861,216,583,841 +605,985,676,319,636,291,428,630,414,890,426,886,108,706,574,72,246,377,576,843 +94,670,161,323,665,369,610,403,523,497,587,392,200,427,196,199,123,193,233,70 +607,422,889,803,361,74,645,230,583,873,238,217,90,681,316,409,794,151,74,886 +113,705,767,721,765,713,838,182,581,376,765,946,940,191,188,936,611,289,916,615 +497,381,103,362,71,11,819,287,663,90,656,205,265,853,817,378,650,794,495,384 +578,257,858,263,758,94,254,320,902,100,810,401,657,241,318,657,894,656,498,106 +245,387,628,639,392,852,650,425,414,840,536,100,235,73,580,149,942,179,673,524 +400,199,383,417,676,146,878,894,435,293,991,146,835,715,493,112,894,326,492,384 +844,725,78,607,127,603,655,574,230,825,361,817,212,636,95,152,250,707,384,191 +586,202,670,155,577,847,646,403,469,893,206,731,811,591,635,236,391,820,509,644 +409,798,698,565,552,201,841,854,103,583,859,495,630,254,226,288,223,83,390,406 +808,407,657,282,320,654,573,251,404,319,756,795,876,579,203,407,465,207,244,315 +858,491,713,244,282,946,323,716,106,677,811,628,84,889,890,707,493,709,767,548 +93,857,304,196,836,82,367,416,703,50,948,607,102,83,400,256,80,635,663,716 +585,723,108,316,581,647,582,468,187,496,799,757,814,887,638,376,117,491,590,948 +640,694,760,948,218,642,853,642,805,243,410,402,933,380,88,882,931,560,836,761 +850,554,893,187,857,718,190,767,562,989,720,949,422,108,941,853,291,190,801,676 +92,90,556,94,118,587,714,592,659,609,181,890,106,792,654,83,218,245,371,863 +630,597,792,121,360,193,104,241,855,609,386,789,617,937,585,705,580,586,391,825 +679,562,795,263,892,446,607,942,824,408,400,679,429,218,653,548,800,823,103,191 +182,588,424,199,51,851,722,606,607,593,588,715,193,728,129,434,112,576,106,568 +582,5,98,206,733,846,632,366,552,713,494,585,640,416,793,466,891,146,596,827 +650,715,234,73,418,728,89,293,82,830,860,139,199,673,648,940,662,672,765,563 +182,617,435,678,379,714,842,770,707,113,91,812,229,132,675,846,259,947,122,713 +637,795,600,715,837,376,286,936,142,564,194,806,663,827,418,728,243,92,365,368 +468,194,186,756,117,290,209,126,616,380,948,312,648,269,495,129,114,190,329,222 +187,212,795,659,401,673,323,583,575,272,366,646,234,246,629,103,766,379,248,235 +760,659,768,78,379,393,150,435,383,192,287,703,674,605,187,194,467,666,657,3 +665,850,497,497,543,806,705,203,663,717,843,123,102,562,150,93,658,252,254,496 +402,187,947,555,757,103,282,675,432,50,942,714,856,891,648,293,583,767,780,641 +639,330,193,318,114,644,282,803,728,141,254,598,409,615,725,639,549,770,289,257 +999,154,128,206,123,221,141,734,627,877,116,285,374,446,663,246,431,108,817,587 +675,408,280,726,706,392,286,435,196,669,288,93,254,207,839,793,287,364,319,716 +186,75,148,643,120,931,271,665,374,209,429,366,804,386,759,555,114,221,122,760 +671,761,234,560,362,446,114,944,553,729,524,659,894,210,229,388,728,818,142,742 +832,885,253,418,716,648,657,396,205,650,394,604,151,208,252,386,833,423,182,859 +854,78,120,668,272,400,206,703,722,126,678,428,211,943,242,220,251,198,256,493 +422,585,229,703,77,902,97,188,268,263,792,206,639,634,875,805,123,559,468,213 +291,231,407,885,601,73,383,934,398,838,414,122,118,671,360,839,329,106,648,938 +940,90,730,422,655,271,617,210,708,818,185,214,129,109,733,418,401,797,200,217 +219,719,792,54,319,561,388,768,250,125,605,243,613,496,123,677,153,267,195,786 +362,413,213,402,74,412,804,643,118,324,878,615,890,994,937,95,378,433,493,214 +406,671,84,889,884,186,564,564,372,769,119,561,385,802,82,757,270,555,632,383 +669,731,949,834,494,685,425,187,551,188,574,876,212,949,804,831,356,261,416,382 +886,680,239,430,820,258,367,310,717,803,803,328,420,726,844,224,851,678,78,724 +629,228,759,595,124,846,421,554,186,840,266,665,814,183,221,91,687,250,852,553 +893,223,586,767,850,125,378,71,807,694,227,103,766,665,366,831,197,237,390,842 +821,679,265,73,368,412,327,396,884,79,627,149,940,525,87,106,124,931,995,287 +818,591,823,617,187,310,75,816,151,716,609,200,703,889,500,580,726,381,396,396 +824,90,434,765,358,399,265,563,613,363,826,597,710,704,384,107,91,590,423,919 +138,565,257,84,807,199,119,667,667,235,932,634,220,244,814,841,254,931,385,943 +389,806,51,839,880,522,643,651,411,129,575,561,652,706,828,767,307,656,803,407 +76,759,388,667,99,401,147,885,598,229,226,82,946,714,746,237,397,597,427,722 +102,644,193,725,107,466,243,641,491,180,844,925,823,204,712,91,81,641,836,266 +330,638,588,278,837,218,638,715,231,654,713,703,247,664,328,885,826,378,713,852 +849,115,946,323,413,413,330,233,861,302,727,592,91,225,187,709,402,672,375,723 +322,195,841,248,465,137,212,86,240,289,848,362,446,406,426,551,116,285,467,632 +414,87,845,118,50,417,941,608,215,797,652,237,421,860,53,199,70,551,307,661 +129,764,839,191,225,183,663,760,249,389,199,803,884,325,725,126,975,590,233,552 +468,291,644,98,873,412,849,67,257,707,98,292,719,435,662,803,878,430,638,734 +734,944,656,816,905,257,946,268,655,376,195,574,626,795,880,236,592,109,946,595 +854,722,287,792,378,117,371,198,728,574,844,798,732,202,824,656,563,497,768,483 +186,142,887,760,179,108,320,329,428,880,155,741,818,142,521,609,579,645,616,874 +422,810,323,259,211,431,728,120,522,715,429,667,143,891,831,579,833,401,729,279 +4,610,73,933,935,226,889,756,652,562,802,500,237,939,834,656,381,892,241,813 +565,798,613,689,574,221,106,552,382,674,330,655,608,242,819,246,231,944,431,239 +799,820,390,876,72,196,73,234,197,712,629,239,997,422,126,141,649,403,432,717 +878,837,121,434,292,879,828,989,661,397,196,646,857,813,680,446,767,148,253,128 +254,630,265,428,877,654,581,662,86,798,430,58,850,90,365,423,577,805,320,760 +818,388,467,424,887,799,933,843,651,708,366,388,522,905,817,220,89,933,879,941 +879,153,236,255,78,60,729,419,644,326,654,142,665,947,561,521,842,291,936,496 +915,220,290,499,248,719,595,596,885,214,105,638,589,110,607,204,226,119,885,410 +141,193,402,414,816,466,255,822,51,191,361,416,290,822,893,799,604,153,401,231 +93,372,942,874,520,630,247,129,657,102,614,521,675,93,141,763,500,368,756,52 \ No newline at end of file From 05a7c3d5b9f33e665fb04c4efa9da15d5494de53 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Wed, 16 Dec 2020 13:38:52 +0100 Subject: [PATCH 205/433] Change some project settings --- adventofcode2019.iml | 2 +- pom.xml | 13 +++---------- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/adventofcode2019.iml b/adventofcode2019.iml index cdd577cd..873f0da3 100644 --- a/adventofcode2019.iml +++ b/adventofcode2019.iml @@ -5,7 +5,7 @@ - + diff --git a/pom.xml b/pom.xml index dbad85ff..d65e6128 100644 --- a/pom.xml +++ b/pom.xml @@ -5,8 +5,8 @@ 4.0.0 com.sbaars - adventofcode2019 - 0.0.1-SNAPSHOT + adventofcode + 1.0 @@ -21,16 +21,9 @@ jar - adventofcode2019 + adventofcode http://maven.apache.org - - UTF-8 - 8 - 11 - 11 - - junit From 03ca7d50cfadc6d38ca1ee64a250d850476c42a3 Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 17 Dec 2020 22:22:42 +0100 Subject: [PATCH 206/433] Day 17 --- .../adventofcode/year20/days/Day17.java | 114 +++++++++++++++++- src/main/resources/2020/day17.txt | 8 ++ 2 files changed, 119 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day17.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day17.java index 13f5104f..6efaeed2 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day17.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day17.java @@ -1,6 +1,15 @@ package com.sbaars.adventofcode.year20.days; import com.sbaars.adventofcode.year20.Day2020; +import lombok.Data; +import lombok.Value; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import static java.util.Arrays.stream; public class Day17 extends Day2020 { public static void main(String[] args) { @@ -13,12 +22,111 @@ public Day17() { @Override public Object part1() { - String input = day(); - return input; + Set pos = new HashSet<>(); + char[][] input = dayGrid(); + for(int i = 0; i newPos = new HashSet<>(); + Set checkedPos = new HashSet<>(); + for(Pos p : pos) { + addNeighbors(pos, newPos, checkedPos, p, true); + } + pos = newPos; + } + return pos.size(); + } + + public void addNeighbors(Set pos, Set newPos, Set checkedPos, Pos p, boolean active){ + if(!checkedPos.contains(p)) { + long neighbours = active ? -1 : 0; + checkedPos.add(p); + for (int a = -1; a <= 1; a++) { + for (int b = -1; b <= 1; b++) { + for (int c = -1; c <= 1; c++) { + Pos x = new Pos(p.x + a, p.y + b, p.z + c); + if (pos.contains(x)) { + neighbours++; + } else if(active) { + addNeighbors(pos, newPos, checkedPos, x, false); + } + } + } + } + if((active && (neighbours == 2 || neighbours == 3)) || + (!active && neighbours == 3)){ + newPos.add(p); + } + } + } + + @Data + @Value + public static class Pos { + long x; + long y; + long z; + } + + + @Data + @Value + public static class Pos4 { + long x; + long y; + long z; + long w; } @Override public Object part2() { - return 0; + Set pos = new HashSet<>(); + char[][] input = dayGrid(); + for(int i = 0; i newPos = new HashSet<>(); + Set checkedPos = new HashSet<>(); + for(Pos4 p : pos) { + addNeighbors(pos, newPos, checkedPos, p, true); + } + pos = newPos; + } + return pos.size(); + } + + public void addNeighbors(Set pos, Set newPos, Set checkedPos, Pos4 p, boolean active){ + if(!checkedPos.contains(p)) { + long neighbours = active ? -1 : 0; + checkedPos.add(p); + for (int a = -1; a <= 1; a++) { + for (int b = -1; b <= 1; b++) { + for (int c = -1; c <= 1; c++) { + for (int d = -1; d <= 1; d++) { + Pos4 x = new Pos4(p.x + a, p.y + b, p.z + c, p.w + d); + if (pos.contains(x)) { + neighbours++; + } else if (active) { + addNeighbors(pos, newPos, checkedPos, x, false); + } + } + } + } + } + if((active && (neighbours == 2 || neighbours == 3)) || + (!active && neighbours == 3)){ + newPos.add(p); + } + } } } diff --git a/src/main/resources/2020/day17.txt b/src/main/resources/2020/day17.txt index e69de29b..9f62ccd4 100644 --- a/src/main/resources/2020/day17.txt +++ b/src/main/resources/2020/day17.txt @@ -0,0 +1,8 @@ +##...#.# +#..##..# +..#.#### +.#..#... +######## +######.# +.####..# +.###.#.. \ No newline at end of file From 72535045cb1bdce59a48ec647173695e756a5021 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Fri, 18 Dec 2020 07:37:59 +0100 Subject: [PATCH 207/433] Day 18 --- .../adventofcode/year20/days/Day18.java | 59 ++- src/main/resources/2020/day18.txt | 379 ++++++++++++++++++ 2 files changed, 435 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day18.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day18.java index fa1db874..4593f727 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day18.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day18.java @@ -1,6 +1,12 @@ package com.sbaars.adventofcode.year20.days; +import static java.util.Arrays.stream; +import static java.util.stream.IntStream.range; + import com.sbaars.adventofcode.year20.Day2020; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.apache.commons.lang3.tuple.Pair; public class Day18 extends Day2020 { public static void main(String[] args) { @@ -13,12 +19,59 @@ public Day18() { @Override public Object part1() { - String input = day(); - return input; + return getSolution(true); } @Override public Object part2() { - return 0; + return getSolution(false); + } + + public long resolveExpression(StringBuilder s, boolean part1){ + var a = solve(s, part1); + return getSolution(a.getRight(), s, a.getLeft(), part1); + } + + private long getSolution(boolean part1){ + return stream(dayStrings()).mapToLong(i -> resolveExpression(new StringBuilder(i), part1)).sum(); + } + + private Pair solve(StringBuilder s, boolean part1){ + long leftHand; + int i = s.length()-2; + if(s.charAt(s.length()-1) == ')'){ + for(int nBrackets = 1; nBrackets>0; i--){ + if(s.charAt(i) == '(') nBrackets--; + else if(s.charAt(i) == ')') nBrackets++; + } + i++; + leftHand = resolveExpression(new StringBuilder(s.substring(i+1, s.length()-1)), part1); + s.replace(i, s.length(), "x"); + } else { + leftHand = Long.parseLong(s.substring(s.length()-1, s.length())); + i = s.length()-1; + } + return Pair.of(leftHand, i); + } + + private long getSolution(int i, StringBuilder s, long leftHand, boolean part1){ + if(i>0) { + char operator = s.charAt(i-2); + StringBuilder leftSide = new StringBuilder(s.substring(0, i-3)); + if (operator == '*'){ + return resolveExpression(new StringBuilder(s.substring(0, i-3)), part1) * leftHand; + } + else if (operator == '+'){ + if(part1) { + return resolveExpression(new StringBuilder(s.substring(0, i-3)), true) + leftHand; + } else { + var sol = solve(leftSide, false); + return getSolution(sol.getRight(), leftSide, sol.getKey() + leftHand, false); + } + } + } else if(i == 0){ + return leftHand; + } + throw new IllegalStateException(); } } diff --git a/src/main/resources/2020/day18.txt b/src/main/resources/2020/day18.txt index e69de29b..9e505d4d 100644 --- a/src/main/resources/2020/day18.txt +++ b/src/main/resources/2020/day18.txt @@ -0,0 +1,379 @@ +((5 + 8 + 3) + 3) + (3 + 9 * 7) +((5 + 3) * 9 * (9 * 6 + 6 * 4) + (5 + 5)) * 8 * 9 +(7 + (6 * 3 + 6 * 4 * 9 + 3) * 4 + 6 + 8) + ((5 + 6 + 5 * 3 * 3) * (6 * 8 * 8 * 5 + 4)) * 7 + 9 * 6 +3 * 6 * 3 * 8 + (4 * 6 + 8 * (8 * 4 * 6 + 4) + (4 * 3 + 4 + 8 + 8 * 9) * 8) + 3 +6 * 4 + (9 * 9 + 5) + 5 * 4 + 9 +7 + 4 + 4 + 5 + (2 + (9 * 3 * 2) * 6) + 9 +2 + 4 + (2 * 9) + 3 * 9 + 9 +9 + ((6 + 2 * 3 * 2) + 7 + 7 * (7 * 9 * 5 * 9) + 3) * 6 +9 * 7 + 4 * 5 * ((7 * 6) * 3 + 4) * (4 * 2 + 7 * 2 + (7 * 8 * 9 * 8) + 2) +3 + 8 + ((2 * 7) * 5 * 2 + (5 * 7 + 9 * 8 * 2)) +(8 * 6) * 4 + 4 + 5 * 9 * (5 + 4 + 4 + 9 * 6) +8 * (9 + (6 * 7 * 2 * 5) + 7) + 3 +2 * 5 * 8 +5 + 2 + 6 * 5 * (3 * 4 + 7 + 2 * 2 * 3) +7 * 8 + 6 * 6 +(7 * 3 + 8 + (7 + 2 * 4 * 2 + 2 * 9) * (4 * 7 + 9 * 8) * 7) * 8 + (6 + 2 * 3 + 6 * 4) + (6 + 9) + 8 * 3 +(2 * 5 + 7 + (5 * 4 * 7 * 6) + (9 * 8 + 9 * 9 * 6)) + 8 + (8 + 5) * 8 + 6 + 8 +6 + (9 + 3 * 5) + 5 +(8 * (3 * 3 * 5 + 6 * 8) + 6 * 8) + 5 +2 + 8 + 3 * (3 + 5) * (5 * (9 + 4) + 6 * 2) +3 + ((9 * 4) + 8 + 4 * 4) * ((6 * 8 * 5 + 6) * 2 + (2 + 2) + 6 * (8 + 7)) * 2 * 6 + 9 +(8 + 9 * 8) + 4 * 5 * 6 * (5 + 7 * 7 * 6 + 5 + 6) +(8 + 7 * 3 + 3 + 2 + 5) + 7 +(9 + 2 * (3 * 4 * 6) * 3) + 5 + (4 + (4 + 4 + 8) + 7) * 8 * (9 + 7 + 8 + 2) + 7 +(2 + 2 * (4 + 6) * 2) * 5 + 8 * 4 + 8 +4 * ((3 + 2 + 2) * 2) * ((8 + 8 * 9 * 7 + 3 * 2) + (9 + 2 + 3)) + 7 * 8 + 5 +7 + (5 + (5 * 9 * 4 * 4 * 7) + (2 * 7 + 8) * 6 * 7 + 4) * 2 * 5 * 4 +(7 + (9 + 6) + 3 + 7 + (6 + 7 + 4 + 4 + 9)) * 6 + 5 +(9 * 4 + 2 * 5) * 6 + ((5 + 3 + 9 + 5 * 2 * 6) + 3 + (2 * 7 * 2 * 7 * 7 + 7) * 7 * 5) * 4 +2 * 3 * (5 + (9 + 2 * 4 + 8) + 9 * 7) * (6 * 4 * (9 + 8 + 2 * 8) + 9 * (9 + 4 + 6 * 4) + 9) * 7 +(4 * 8 + (9 + 4) + 2 * 7 + 5) * 6 +2 * 8 * (8 + 5 + 8 + (7 * 7 * 2 * 4) * 4) + ((4 + 3) + 7 * 9 + 3) +6 + 8 * (3 * (7 * 9 + 2 + 6) * 6 + 8) * 9 * 2 +6 * 8 + 6 + (7 + 8 + 2 * 2 * 8) +((7 * 3) * 6) * 4 + 4 * 7 * 4 * 6 +6 * 5 * (7 + (9 * 6) * 6) + 8 +5 * 3 + (4 * 9 * 5 * (6 * 6 + 2 + 7 * 3 + 6)) +9 * (3 + 3 * 8 * 6 + 2 + (9 * 2)) * 3 * 3 + 5 +(4 * (2 * 7 * 8 * 9) + 7) * 4 * 5 + 4 +8 * (5 + (4 + 6) * (9 + 2 * 8 + 2 * 4)) +7 + (9 * 9 + 7 + 2) + 9 + 4 +9 + (7 + 6 * 8 + 5 + 2 + (2 + 8 * 6 * 6 + 6)) +6 + 4 + 8 * 4 + 3 * (9 + 9 * 3 * 4 * 9) +9 * 6 * (7 + (8 + 2 * 9 * 2 * 8)) +4 * (8 * 9 * (6 * 5 + 4) + 7) + (9 * (5 + 7 * 3 * 7 + 9 + 4)) +3 + (5 + (3 + 4 + 6 + 6 * 8) + 9) * 8 * 3 * 9 +5 * (6 * 9 + 2 + 4 * 7 * 7) + (3 * 5 * (9 + 2 + 5 * 9 + 6) * (2 + 5 + 4) * 4 * 2) + ((9 + 9 * 8) + 2 + 4) + 3 * 5 +5 * (9 * 2 + 5 + 3 * (4 + 5 + 7 * 8)) + 6 + 8 + 5 + 8 +(8 + 5 * 6 + 6 * 5) + 9 + (2 + 8 * (9 * 5 * 3 * 7)) +4 * 3 + 9 + 7 + (3 + 3 * (4 + 8 * 2 * 8)) +(4 * (5 * 6 * 5 + 5 + 8) + 7 * (4 + 6 * 2 + 6) * 7) + ((9 + 4 + 7 + 3 + 6) + 4 * (2 + 6 + 2 * 5 + 6 * 6) * 8 * 5 + 6) * 3 +7 * ((9 * 6) + (3 + 3 * 8 + 2 * 7) + (8 + 7 * 4)) * 3 +8 + ((2 + 5 * 4 + 4) + 6 * 4 + (7 + 5 + 6 * 7) + 3 + (3 * 9 * 6 * 9 * 7)) * 2 + (4 + 2) + 2 + 8 +2 * 2 + (8 + (5 + 4) + (7 * 9) * (4 * 3 + 8 * 6 * 8) + (4 + 5 * 7 + 4 * 2) + (9 + 5 * 9 + 9 * 8 * 4)) * 7 +2 * (6 * 4 * (5 + 7 * 3 * 3) + 8 + 6) + 7 * ((2 + 7 * 4 + 4) + (7 + 6 + 9 + 6 + 4) * 8 + 4 * 3) + 2 * 9 +2 * 4 + 4 * 3 * 7 * 4 +9 + ((7 + 3 + 6 + 9) + 2 + (3 + 3 + 5 * 6)) +4 * 4 +3 * 9 + 7 +7 + 5 * (3 + 4 + 4) * 9 * 5 +2 + (9 + 5) + 5 * 8 + 3 +(5 * 4 * 8 + 6) + 9 * 3 * (5 + 8 + 9 * 7) +((6 * 5 * 9 * 4) * 4 * 8) + 8 + 7 * 4 +((4 + 6) * 5 * 5 + 2 + 5 * 6) * 2 * 4 * 8 + 8 +(7 * (3 + 5)) + 8 +2 + 2 + 8 * 4 + (4 + 4) * 5 +(2 * (4 + 4 * 7 * 8 * 9 * 2) + 7 * 6 * 2) * 2 + 9 +(9 + 7 + 9) + 6 * (5 + 7 + 8 + 7) * 9 * ((5 * 6 + 3 * 3 * 5 * 6) * 6 + 3) +3 * 7 * 8 * 8 + (6 * 4 * 4) * 2 +9 * 3 * (6 * (9 + 5 + 8 + 5)) * 3 +((9 + 8 * 3 * 9) * 9 * 8 + 8) + 3 +8 * (9 * 8 + 6 * (2 * 5 + 2 + 9 + 4)) + 3 * 8 + 3 +((3 + 7 + 6 * 7 + 4) + 6 + (8 * 5) * 3 + 7 * 8) * 2 * (6 + (2 + 5 * 2 * 4 * 4) * 7 * 2 + 3 * (5 + 5 + 2 * 5 * 7 * 8)) +9 * 5 + 6 * (9 * 2 + 2) + 3 * 5 +3 * 6 + 6 + 2 * 5 +3 + 9 + 5 + (4 * (3 * 8 * 7)) * 9 + ((6 + 7 * 2 * 3 + 4 * 2) * 6 + 5 + 7) +(8 * (4 * 5 + 3 + 3 * 7)) + 5 * 8 * 3 * 3 * (7 + 8) +(4 + 9 * 9 * 6) * (7 * 7 * 3 * 7 + 6) * (6 + 9) + 6 +5 * 6 * ((6 * 6 * 6 + 4 * 2) + 9 + (6 + 9 + 8) + 3 * 2) * 5 * (3 + 8 + 3) +6 * 6 + (3 + 4 * 8) * (2 + 4 + (6 + 7 * 7 + 8)) +8 * (9 * 6 * 7 + (6 * 6) + 9) + 6 + ((6 + 4) * (6 * 3 * 6 + 2 * 9 * 8) + 8) + ((8 + 2 + 6 + 2 + 2 * 5) * 4) +8 + 8 + 5 + ((9 * 9 * 5 * 8) + 7 * (8 + 5) * (6 + 3)) * 4 * (2 + (5 * 9)) +4 * 3 * 7 * 4 * 5 + (6 * 9) +(2 + (6 * 3 + 7 + 3 + 4) * (4 + 3) * 5 * 7 + 8) + 5 * 7 + 8 + (4 * 8 + 8) +(8 + 8 + 5 * 4 * 2 * 8) + (4 * 6) +9 * (8 + 4 * 3 * 9 + 6 * 5) + (8 + 5 * 4 + 5 + 9 + 6) * 4 + 7 * 5 +(3 + 3 * (2 * 9 + 8 + 6) * 5) * 4 * 7 * 8 + 6 +7 + (6 + 7 * (4 + 4 + 8 * 5) * 2 * 4 + 8) * 4 +4 * 5 * 4 + 7 + 7 +2 * 6 + (6 * 7 + (4 + 8 + 5 * 5 * 4 + 4) * (8 + 5) + 4) +5 + 2 * (5 + (5 * 7 * 8) * 7 * (5 * 4) * (3 * 3 * 9)) * 6 + 9 +9 + (3 + 8 * (7 + 2 * 3 * 3 + 2) * 4) * (5 + 4) + 2 +(4 * 6 * (6 + 3 + 3) + (4 * 2 + 6 + 5 + 8 * 8)) + 2 + 7 * 9 + 2 + 7 +(9 + 3 * 6 + 4 + 6) * 4 +(3 * 9 + 7 * 6 + (6 + 3) * 2) * 6 + 4 + 5 + 7 * 6 +8 * (7 * 8 + (2 * 8 + 2 + 8) + (9 * 3 * 3 + 8)) + 2 +(9 + 6 + 4 * (8 * 7 + 5 * 3 + 5 * 5) + 3) * 3 * (3 + 2 * (3 * 8 * 9 * 5)) + 2 + 9 * 5 +9 * 8 + ((3 * 2 + 5) * 9 + 5 * 2) * 3 * 5 +(9 + (8 * 5 + 8)) * (5 * 8 * 5 * 3 * (9 + 3 * 7 + 3 + 9)) * 3 + ((4 * 3 + 9 * 3 + 8) * 6) * 4 +((4 + 2 * 3 + 4 + 4 * 6) + 7 * 3 * 5) + 5 * 6 * 2 +2 * (2 * 2 * 5 + (2 * 8 + 6 * 4 * 3 * 2) * 3 + 9) +8 + 7 + 2 + 3 + (9 * 5 + 2) +(3 + 4 * (7 + 4 + 9) + 8) * (6 * 9) + ((4 * 3 * 2 * 2 * 5 * 9) * 6 + (8 + 9)) + 2 * 6 +6 * 7 + (3 + (5 * 6 * 2 * 2 + 9)) * 8 + 8 +8 * (6 * 5 * 2 + (2 * 8 * 5 * 6) * (6 * 7 * 9 * 7 * 5 + 2)) + 6 + 4 * 3 +7 + ((3 + 3 * 6 * 8) * 3 + 3 + 8) * 8 + (2 * 5 * 4 * 6 * 5 * 8) * 2 * 5 +7 + 6 + (4 + 9) + 5 * 2 * ((5 * 2) * 7 + 7 * (3 + 9 + 4 + 9) + 9 * 4) +5 + 5 * (4 + 5 * 8 + 5 * 7 + 9) + 8 +(4 * 2 * 6) * 9 + 5 +(4 + 9 + 3 + 6) * 2 * 6 +(5 + 6) * ((2 + 4 + 7 + 5 * 3 * 3) + 4 + 2 + 4 + 9 * 6) * (7 + 7 * (4 * 4 + 3 + 6 * 7) * 7 + 5) * (9 + 6 * 7 * 6 + 5 * 4) +((3 * 9) * 8 * 2) * (5 + 5 * 6 + 5 + 9) + 6 * (3 * 8 * 5 + 7 + 4) * (2 + 3 * 9 + 9 * 4 * 6) +8 + 8 + (7 * 6 * (4 + 3 + 3) + 2 + 3) +8 * 4 * 7 * (9 * 3 + 8 * 8 + 5) + 7 +2 + ((7 + 7 + 4 + 4) * 5 + 5) + 7 * (5 * 9) * 4 +7 + (3 + 8) +9 * 5 + 9 + (8 + (4 + 4 + 8) * 5 * 9 + (2 + 4 + 6)) +4 * (7 * 3 * (9 + 8 + 6 + 6) + 5 + 3 + (9 + 9 * 5 * 3)) * 6 +6 * 5 * 9 + (8 + (5 * 9 * 5) + 6 + 2 + 2) * (7 * 8) +((5 * 4 + 7 * 2) * 5 + 4 + (2 + 8 * 7)) * (3 + 5) +(5 + 3 * 5 * (8 * 8) * 8 * 9) + 9 + 9 * ((4 + 2 * 8) * 7) + 7 +9 * 4 + (9 * 3 + 4 * 3 * 8) +6 + (5 + 5 + 2 * 5 * 3) * 3 + 8 + 7 +3 + 4 + 7 * (4 * 5) + 2 +8 + 7 + 5 * 3 +5 * (2 + 7) + ((9 * 3) * 2 + 3 * 4) + 8 + 4 +6 + 7 + 2 + 2 + (8 * (9 + 2 + 4 + 2 * 9)) +8 * 7 * (8 + (4 + 5 * 8 + 4)) +(4 * (6 * 7 * 7 * 9 + 5 * 7) * 9 * (6 + 7) * 8 * 2) + (5 * 5) +(2 * 6 + 5 + 6 * 8) * 5 * 5 + 5 * 3 + (7 + 2 * 5) +2 * (7 + 4 + 3 * 6 + 5 + 9) + 5 * 8 * (9 + 7) +3 * (4 * (6 + 5 * 2 * 6 + 4 + 6) * (6 * 9 + 6) * 7 + (7 + 2 * 3 + 4 + 4 + 8) * 3) +((9 + 7 + 6 + 3 * 5 + 6) + 7) + 4 + 9 * 8 +(8 + 8) * 6 + 9 * 3 * (3 + 4 + 8 + 6) +6 + (3 + (3 + 7 * 8)) +9 * 6 + 5 + ((7 * 9 * 7 * 7) * 9 + 5 * 8 + 2 * 3) + 5 +(6 + (2 * 6 * 7 * 9) + 3 + (9 * 3) * (4 * 7 + 5 + 6 + 5 * 9)) + 7 + 7 +3 + 3 + (3 * (7 * 6 * 4) + 2 + 6 * 8 * 4) + 7 +2 + (3 + 8 + 6 * 7 + 4) * 2 * 8 +2 + 4 + 9 * 6 + 4 + (4 * 7 + 9) +(7 * 6 + 6 * 7 + (7 * 5 + 8) * 8) * 2 * 2 +2 + 6 +4 + ((5 + 7 + 2 * 8) + (5 * 5 * 7 + 3 * 3)) * 3 * 2 +9 + (3 * 7 * 7 * (5 + 7) + 4 + (7 + 6)) * 2 +2 * 5 + ((8 + 5 * 2 + 4 * 2) * 7 * 3) +(8 + 3) * 6 * 7 +3 + 8 + 9 * (6 + 9 * 3 * (5 * 4) + (7 + 8 + 2) + 8) +7 + 6 + ((3 + 2 * 5 + 4 + 8) * 5) * 5 +(2 * 8 + 4 * 6 * (3 + 3 * 2 + 2 * 5 * 2) * 8) * 4 * 8 * 7 + 2 +4 * ((2 * 3 * 3 + 3 + 7) * 9) + 5 +9 * 3 + 6 + 3 +6 + 9 + (3 + 8 * 5 + 8 + (3 + 3 * 3 + 5 * 8 * 4)) +3 + 7 + 7 * (6 * 9 + 7 * 4 + (5 * 7 + 2 * 4)) + 3 + 3 +(2 * (8 + 3 + 6) + 2) * 4 +9 * 7 * (8 * 2 + 2 * (4 + 9 * 4 * 7 * 4)) + 4 * 2 * 9 +7 * 8 + (3 * 2 + 2 + 9 + 8) + (6 + 8 * 4 * (5 + 5 + 6) + 7) +3 + (6 + 2 + 9 + 6 + 5) +9 * (2 * 6) * 8 * 7 +(7 * 5) + (8 + 3 * (2 + 4 + 7 + 4 + 6) * 7 + 6) + (7 * 2 + (6 + 6 * 3) + 3) + 6 * 7 +7 + 7 + (5 + 8 * 4) +(2 * 7 + 4 * 7) * (9 * 2 + (6 + 9 + 5 * 3 + 3 + 3) * (8 * 2) + 9) * 9 * 7 +(6 * 5 + 9 + 7) + 9 + 2 + 3 +2 + 2 * (9 * 9 * 3 + (7 + 4) * (9 + 9 * 9 + 3 + 2) * 5) + 5 * (7 + (6 + 5) + 2) * 7 +4 * 5 * 2 * 3 * 8 + (8 + 3 * 6 * 9 * 4 + 6) +5 + ((3 * 4 * 8) + 6) + 5 +4 + 5 + 3 * (8 * 3 + 7 * 9 * 6 * 4) * 7 +(7 * 6 + 5 * 2 + 3 + 5) * 2 + 8 * 9 * ((3 + 5 + 7 + 8 + 8 * 2) + 9 * 3 + 2 * 6 * 2) * (4 * 9 * (2 + 3 + 9) * 5 + 7) +3 + 2 * 6 + 9 * 6 * (2 * 2 + 7 * 7) +(6 + 3 + 5 * 6 * 6 * 7) * (6 + 8 + 8 * 3 * 7) +(7 + 3) * 3 * (4 + 9 + (7 + 8 * 6 + 4 * 3 * 3) * 7) * 2 + (3 * 9 * 2) +3 * 7 + 9 * 9 * 3 + 8 +4 * 5 + 9 + 7 * 6 * (4 + 4 + 9 + 2 * 5 * (5 + 6 * 4 * 3)) +8 * ((2 * 3) + (4 * 3 + 5) + (2 + 5 + 3 + 7 + 2 + 6)) * 8 + 8 +4 + ((7 + 7 + 5) * 2 * 6) + (3 + 6 + 9 * 3) + ((2 + 4 + 3) * (4 + 6 * 6) * 6) +7 * 4 + (5 + 7 * (6 + 2) * 6 + 4 * 3) + 5 +8 + (4 * 4 + 5 + 2 * (9 + 9 + 3 * 6)) + 8 * (3 + 8 + (9 + 5 + 4 * 7 * 2 * 6) * 7 + (9 * 4 + 9) * 3) +8 * 8 * 2 * 5 + 4 * ((5 * 4 + 2) + 6 * 8 * 9 + 4) +3 * 9 * 3 + 5 * 2 +2 * 3 + 2 * ((9 + 7) + 2 + 2 + (8 * 4 + 9 * 6 * 8 + 7) + 7 * 9) + 9 * 7 +6 + 4 * (3 + (9 * 6 * 2 * 6 + 9) + 7) + 3 + 5 +3 * 4 * (4 + 2 * 4 + 7 + 7) * 8 + 8 + (2 + 4 + 2 * 9) +4 * (7 * 3 * 5 * 7 + (9 * 7)) * (2 * 5 + (2 * 5 + 9) * 4 * 6 * (3 + 9 + 5 + 6)) * ((2 + 6 + 5 + 8) * (5 * 3 + 9 * 6 * 6) * 9) + 3 + 8 +(5 + 8 + 8 + 6 * 4 * 4) * 6 * 2 +7 + (8 * 6 * 2) + (3 * 6 + 4 + 7 * 9) +2 + 2 + ((6 * 8) + 4) +(5 + 5 * 8 * 3 * 8) + 5 * 4 + 2 * 9 +((8 * 9 * 5 * 6) * 6 * 2 * 5 + 5 + 4) + 8 +9 * 6 * 2 + (5 * 7 + 2 + 7 * 4) * (6 * 3 + 5) +2 + (7 * (9 * 3 * 5 * 7)) +6 * 9 * ((9 + 8) * (3 * 9 + 9) + 6 + 3) + 7 + 5 * 5 +((3 + 8) + 7 * 3 + (9 * 3 * 4 + 5)) * 3 +(2 + 6) + (4 * 6 * 5) * 8 + 3 +3 * 7 + (4 + 7 * 7) * 7 * 5 * (4 * (5 * 8 + 7) * 2) +8 * 6 * 9 + 2 * 8 +3 * 4 + 5 * (7 * 4 + 2 + 2) +4 * 2 + 5 * (2 * 5 * 9) +5 + 3 +6 * ((3 + 6 * 8) + (2 * 3 + 7 * 3 + 6) * 3 * 6 * (7 * 6 + 7)) + 3 * 9 * 6 +4 + 9 + 9 * (6 * 2 * 5 + 2 * (6 + 7 + 2 * 6)) + (4 + 2) + 2 +7 + 6 * (9 * 7 * 4 * 5 * 2 + 6) + 3 * 4 +(8 * 3 + (6 * 2)) + ((3 + 7 + 5 * 9 + 6 + 8) + 9 * 7 + 8) * 9 +7 + ((4 + 7) * 7 * 8 * 3 * 4 + (7 * 5)) * 8 +5 + 9 * 3 + 2 + (7 * 6 * 9 + 4 + (5 + 7 * 9) * 8) +8 * 3 + 6 + (3 * (3 + 5) + 6 * 5 * (4 + 6 * 6 * 7 + 5) + 3) * 2 * (3 + 8) +4 * 7 + 2 * 7 + (7 + (3 * 4 * 6 + 5 * 7)) * ((6 * 4 + 8 * 9) + (3 * 7 * 9 * 6 + 6) * 4 * (4 * 9)) +(6 + 8 + 5 * 7 + (4 * 5 * 9 + 2 * 5)) + (6 * 3 * 6) +5 + (7 + 6) * 4 + ((9 * 7 + 6) + (5 * 5 * 9 + 7 * 7 + 3)) +4 * (9 + 8) + 5 + 5 + 8 + 2 +(4 + (9 + 5 * 8 * 3 + 2) * (6 * 6 * 4 + 4) * 2) * 6 +9 * 4 * 3 + (5 + 8 + 4 * 6 * 7) + 6 * (3 * 3 + (8 + 6 + 2)) +(4 * (3 + 6 * 3 + 5 + 2 + 8) * 8) + 4 * 2 + (7 * (9 + 9 * 4 * 5 * 3 * 9)) * 8 +3 * 5 + (2 + (3 + 8 * 5 * 5 * 8 * 3) * 5 * 5 + 5 + 7) * 8 +8 + 3 + (6 * 6 + 6 + (8 * 4 + 3 + 2 + 4) + 5 + 2) + 8 + 3 +4 + 6 + 7 * (6 * 5 + 4 + (9 * 8 + 7 * 5) * 5) + (3 * 3) * (6 + 7 * 3 * 3 + (2 + 9 + 8 + 5)) +(8 * 3 * (8 + 8 * 2 + 9)) * 8 + 7 +8 * 2 * (9 + 2 + 4 * 4 * 2) + 8 * 6 + 8 +2 * (3 + 9) * (6 + 5) * 7 + 9 +8 + 4 * 3 * (2 + (9 + 2) + 8 + 8 + (3 * 3 + 5)) + 4 * (6 + 3 + 4 + 9 * 7) +8 + 8 * ((4 * 8 * 7 + 8) + 3 * 2 + 7 * (9 * 9 * 4)) + 4 +(6 * 3 + 9 + 5 * 9 + (4 + 3 * 5 * 3 * 3)) + 8 +(8 * 6 * 2) * 7 + 4 * (9 + 3 * 5 * 6 + 6 * 3) * 4 +2 + (9 + 9) * (9 + 5 + 3 + 8 + 2) + (5 * (9 + 6 + 7 + 2 * 2) * 8 + (6 * 9)) +8 * 3 * 2 + 2 +3 * 5 + (9 + 8 * 9 + (2 * 2 * 9 + 2) + (7 + 3 * 5)) +3 * (5 + 4 + 9) * 2 * 6 + 2 +2 * (8 * 7 * (7 + 3 * 6 + 4 + 2 + 6) + 3 + 2) * 4 +3 * 9 * (7 + 5 * 3 + (7 + 4) * 2) * 7 + 8 + 5 +7 * (8 * 7 * 3 * (8 + 2 * 3 * 6) * (3 * 6 * 4 + 3 + 8)) +6 + 5 + 7 * (4 * 7 + 8 + 6 * (5 + 5)) * 4 +9 + 6 * 4 * 7 + (8 + 6 + (7 * 5)) * 8 +8 + (7 + 7 + 6 * 3 * 9 * (6 + 3 + 9)) * 7 +(7 + 7 + 7 * 7 + 9) + 8 + 9 + 5 +2 + 2 + 4 * (5 * (5 * 7) + (7 * 6 + 4 + 5 + 3 + 3) * 7 * 8) + 7 * 3 +5 * 5 + 7 + (9 + 4) * 2 * 7 +2 * 8 * ((8 + 9) * 4 + 8 + 4 * (5 + 2 + 3 + 2 * 3 + 6) + 6) * 2 * (6 + 6 * 9 + 5) + 5 +8 + 6 * (6 + 5 + 6 + 2 + 2) * 7 +6 * (3 + 8 + 7 * 9) +2 * (9 + 5 + 2 + (3 * 7) + 5) + ((6 * 8 + 8 + 5 * 4) + (7 + 4 + 4 * 4 + 4 + 2) + 8 * 8 * 5) +(4 * 8 + 6 + 7 + (9 * 9) + (4 * 4 * 2)) * (7 * 2 * 7 * 6 + 8 * 5) + 7 * (2 * (6 * 6 + 8 + 9 * 7) + (5 + 6 * 9 * 9 * 3 * 5) + 7 * 8) * (2 + 2) +(4 * 8 + 5 * 2 + 3) + 4 + (9 + 7) +((9 * 6) * 8 + 2 + (3 * 6 * 7) + 2) * 9 + (7 * 2 + 8 * 4) * 6 * 9 * 4 +4 + 6 + ((7 + 4 * 6) * 4 * 9 + 5 * 5) + 9 + 3 * 4 +6 * (9 + 3 * (4 * 2) * (4 * 8 + 4 + 8) + 9) +7 + 7 + 7 + 8 * 5 * 6 +4 * 2 +8 + 3 + (6 + 8 + (9 * 7 * 3 * 7) * 7 + 7 * 7) * 4 +9 * ((2 * 7 + 4 * 9) + 2 * 5 * 5 * (7 + 3 * 2) + 4) + (4 + 5 + 5 + 7 + (9 * 2 * 6) * 5) + 2 +2 * (6 * 8 * 3) * (7 + 7 * 6 + 6 * 5) + 6 +7 + 5 + ((6 * 4) * 7 + (3 + 2 + 8 + 5 * 2 + 9)) * 5 +5 + 8 + 3 * 6 * ((5 * 3) * 8 + (4 * 6 * 2 + 2 * 4) * 5) + 4 +4 * 6 + (3 * 9 * (6 + 6 + 8 * 4 + 2 + 2) + (2 * 7) * (8 * 9 + 4 + 5)) * 7 +(9 * (3 * 8 + 3 + 5) * 6 * 4 + 9 * 5) + 6 * 9 +(9 + 2 + 2) + 3 + (8 * 5 * 8 + 7 + 4) + 8 * 6 * (6 * 7 + 6 + 3 * 2) +9 + ((7 + 2 * 7 * 9 * 7) + 3 * 4) * 8 +(9 + 5 * (5 + 4 + 7 + 6 + 9)) + 5 + 7 +2 + (8 + 6) * (7 * 5 + 8 + 8 * 9 + (8 + 9)) +5 * (2 + 5 * 4 * 2 + 6 + 4) * 3 +(3 + 6 * 9 + 3) * 2 + 2 + 2 + 2 +(2 * 7 * 5 + (9 * 6 + 8) + 4) + ((9 * 3 + 8 * 6 + 6) * 6) + 2 + 3 +4 + (3 + 9 + 5 + 9 * (3 * 9 + 4) * 4) +8 * 4 * 7 +(4 + 8) * 4 +((9 * 4 + 2) + 4 + 6 * (7 * 9) * (8 * 3 * 6 * 7) * 4) + (4 * 2 + 4 + 7) + (6 + (8 + 5 * 6 + 9) + 6 + 2 + 2) +(4 * 7 * 4) * 7 * 3 + 8 + 3 +3 * 6 + ((8 * 5 + 3 * 6 * 9) + 3 * 8 + 6 + 5 + 4) * 3 * 5 * ((2 * 7 * 6) * (5 + 5 * 9 * 7)) +(4 * 5 + 9) * 4 * 8 * 9 + 2 * 3 +(2 * 9 * 7 * 6 * 4 + 4) + 3 + 3 * 9 * 2 +9 * ((8 + 3 * 3 * 8 * 2 * 4) * 4 * 9 * (4 * 4 * 9 + 9 * 9) + 4) + (6 + (9 * 2 * 7 * 2) + 6 * 7 + (9 * 7)) + 6 * 7 +5 * 9 * 7 * 7 +2 * 3 + 2 * 3 + (5 + (2 * 7) * 3) +8 + 8 + ((7 + 4 + 2 * 6 + 9 * 9) * (5 * 8 * 3 * 6 + 5) * 6 + 3 * (8 * 6)) * 2 + 9 +(2 + (6 + 6 + 4 + 5) * 8) * (4 + 3 * 8 * 3 * 5) * 2 + (2 * 7 * 6 * 6) +6 * (4 + 3 + (7 + 8 * 2 + 2 * 7)) * 5 +(8 + 4 + (2 * 5 * 6 * 4 * 8) + 7 * (3 * 5) + (9 + 8 + 3)) + 5 * 2 + 7 + 3 + ((7 + 8) + 7 + (6 * 7)) +8 + 7 +2 + 8 + 4 * (3 + 4 * 7 + 3 * (7 + 7 + 9 + 7) + 4) * 4 +(4 * 2 * 2) + (4 * 7 * (2 * 2 + 9 * 6) * 9 + 7) + 6 + (8 * 6 + 6 * 5 + 9 + (7 + 2 + 7)) +5 + 7 * 7 * (2 * (7 * 3 + 6 + 8) * 9) + 8 * (8 + 5 + 2 * 4 * 8) +(7 + 2 * 6 + 2 * 2) + 2 * 5 + 2 * 3 * 4 +((6 + 2 + 4) + (6 + 4 * 8 * 2 + 3 * 7) + 4 + 3) + 9 * 8 + 9 + 2 * 5 +(9 + 6 * 9 + 4 + (3 + 2)) * 6 +5 + 5 + (8 * 7 * (8 * 9 + 7 + 8 * 6 * 6) + 7) + 6 +(3 * 6 + 2 * 7) * 6 + (2 * 4 + 4) + 8 * (8 * (4 * 9) + 2 * 2 * 4) +9 + ((6 * 7 * 4 + 3 * 3 * 6) + 9 * 9 * 5) * 3 * (3 * 7 + 4 * 5) + 5 + 9 +6 + 8 + 2 + (5 + (8 * 9) + 4) + 3 +(2 * 3 + 8 * 5 * (2 + 6 * 5 * 6 + 8 + 3)) * 6 * 6 + 5 * 2 +(7 * (7 + 7 + 7 * 3 + 3 + 8) + 2 * 6) * 5 * 2 +5 * 8 * (7 + 7) * 8 +(5 * 5) + 6 * ((7 + 4 + 7 + 3 * 4) * (7 + 9 * 7 + 7) * 6) * 5 * (6 + 4) + (6 + 7) +8 * 7 + 8 * (4 + (5 + 9 + 3 + 3) * 9) +3 * 6 + 2 + (3 * 9 + 8 * 6 * 4 * 5) + 4 * 9 +((3 + 3 + 3 * 4 * 8 + 4) + 9) * (6 * 5 + 2 + 7 + (8 + 8 * 3) + 8) + 2 + (9 * (2 + 6 * 6) * 5 + 9) * 8 + (4 + (9 * 2 + 3 + 5) * 8 + 6 + 8) +2 * (7 * (2 + 9 * 6) * (8 + 8 + 6 + 7 + 4) + (9 * 3 * 7 + 2 * 3) * (8 + 4 + 5)) * 3 + 3 + 9 * 3 +2 + (6 * (3 * 3 * 3 * 3) + 5) * 6 * 3 + 2 +(8 + 6 * (5 * 4) * 3) * 8 + 7 + 6 +3 + 7 + (5 + (4 * 7 * 4)) + (9 * 5 * (6 + 6 * 8) * 7 * 7) + 6 +8 * 2 + 5 + 4 + 2 * ((7 * 2 + 5) * 9 * (6 + 4 * 8 + 2) + (5 * 7 * 5 * 7 * 2 + 5) + 2) +(7 * 6 * (3 * 3 + 4) * 9) * 3 +9 * 8 + 9 + 7 + (8 * 3 + 7 * 2) * (7 * (5 + 2) * (2 + 5 + 2 + 9 + 3) * 8 * (5 * 2 + 3) * 7) +4 * 9 + (6 + (2 + 7 + 7 * 3) + (5 * 7)) + 2 +9 + 2 * 2 + 7 * 7 + 5 +8 * 7 + 2 * 9 * 4 +4 * 9 + (9 * 5 * 4 * 7 * 3 + 6) +8 + 3 * 3 * (9 * (9 + 5 + 6)) +6 + (6 + 5 + 6 + 7) + (5 + 6 * (8 + 5 * 6 * 6 * 2)) * 6 + 7 +6 + ((3 * 9 + 9 * 6) + 5 * 6 + 5) +(2 + 6 + 5 * 8 + 9) * 4 + (7 * 6 + 2 + 9 + 2) + 2 +4 * (9 * 7 * 7 + 8 * 7) + 6 + 8 * 2 * 7 +8 + (7 + 4 * (8 * 9) + 8 * (9 * 2 + 9) * 8) * 2 * 7 +6 * 9 + (9 * (9 + 6 * 2 * 6 * 5 + 2) * (2 * 8)) * 8 + (5 * 3 + 4 + (2 * 9 * 2 + 3 + 2 * 9) * (2 * 2 + 7 * 8 + 8) * 9) +(9 * (8 + 2 + 3 * 5 + 6) + 7 * 3) * (6 * 7 + 8 + (7 + 4) * 3 + 2) * 6 + (3 * 8 * 3 * 3 * 7) + 7 +2 + 2 + (3 + 7 * 5 + 7 * (4 + 9 + 8 * 3) + 3) + (2 * 6 * (6 + 8 + 9 + 4 * 7) * 9 * (2 + 9 * 9 + 9 + 9) + 8) * 6 * 8 +(7 + (6 * 6 + 5 * 9 * 7 + 9) + 7 * 8 * 9 + (9 * 5 + 7 * 7)) + 8 * 6 +8 + 8 + 6 + 8 * 3 + (7 * (5 + 3 + 6 * 6 * 9) * 9 + (7 + 7 + 8 + 8 * 6 * 3) + 7) +3 * ((4 + 2 * 8 + 6) * 7 + (2 * 7) + (9 + 4 * 7 + 3 * 8) * 2 + 4) + 7 + 5 + 6 +2 * 9 + 6 + 3 + ((5 * 8 + 4 + 2 + 7) + 7 * 4 * 8) * 9 +9 + 6 * (6 + 5 * (8 + 4) + 6 + (4 * 7 * 7 * 7)) * 7 + 9 + 3 +4 + (2 * 5 * 9) +6 + (6 * 2 + (2 * 2 * 2 + 8 + 3) + 5) + 7 + (2 + 3 * (9 + 2 + 5 + 4 + 2 + 3) + 8 * 2 * (9 + 6 + 3)) +6 + 2 + (2 + 7 + 7) + 2 +6 + (6 + 6 + 7) * (5 + 8 * (2 * 6 + 6 + 9 * 7) * 5 + 4 + 7) * 7 +4 * 5 + 9 + 7 + ((6 * 3) + 3 * 2 + 6 * 3 * 8) * (3 + 8 * (7 * 7 * 9 * 2 * 8) * (8 + 2 + 7 + 8 + 9) + (5 * 9 * 6 + 5 * 3 + 9)) +5 + (5 + 5) * 5 +7 * (6 + (7 + 8 + 3 * 3) + 9 + 5 * 7) + 8 + 6 +(8 + (3 * 5 + 6 + 5 + 3 * 8)) * 4 +7 * 7 * 9 * (2 * 7 * 2 * 8) * 6 +5 * ((5 + 6) + (9 * 3 + 9)) * 5 + 6 + 6 + (4 + (9 * 3 * 5 + 6) + 5 * 4 * 7) +8 * 6 + (9 * 9 + 2 + 3 * 6 + (8 * 7 + 8 * 2 * 7 + 2)) + 9 +(7 + 2 * (2 + 9) + (3 * 4 * 7) + 7 + 6) + 8 + 4 * (6 * 2) + 4 * (7 + 5) +5 * 9 * 7 * 5 + (6 + 8) +(3 * 7 + 7 * 9 + (8 + 8) + 8) + (5 * 5 * 8 * 2) * 5 * (5 + 9 * 5 + 2 + (5 * 4)) * 9 * (8 * 2 * 7 * 7) +(4 + 7 * 9 + 5) + ((6 + 3 + 8 + 7) * 6 * 6 + 4 + 5) * 4 * 7 + (4 + 4 + (6 * 2 * 5 + 3)) +2 + 9 * 4 * 7 * (8 * (4 + 8 + 4) * (5 + 7 + 4) * 3) +(3 + 3 + 3 * 8) * 8 * ((3 + 9) + 9 * 2 * 3 + 9) * (5 + 8) + (9 * 2) + 9 +4 + 5 * ((7 * 3 + 6 * 9) * 9) + (5 * 9) * 3 +5 * 5 + (5 * 7 * (5 + 9) + 4) +7 * (6 + 7 + 6 + 5) * 5 + (9 + (2 * 4 + 4 + 6 + 2) * 5 + 5 * 3 * 6) +6 * (9 * 7 + 5 + 4) + 4 + 9 + 6 +6 + (3 + 8 + 5 * 9 + (3 + 6 + 5)) +7 + 3 + (2 + 5) +(5 * (5 + 3) * 3 + 2) * (4 * 6) + 6 +2 + ((6 * 7 * 6) * (7 + 7 + 9 * 2) * (2 * 3 + 9 * 9)) * 3 * (6 + 3 * 5 * (2 * 5 * 7 * 7 + 4 + 5) + 4 + 3) + 7 * 3 +6 + 7 * (3 * 3) + (9 + 9) * 2 +2 + 8 * (4 + 8 + (6 * 3 + 8 * 2 * 3 * 4)) * (2 * 9 + (2 + 6) * 8 + 3) * 3 +2 * (5 + 4 * 6 + (2 * 8 * 4) + 6) + 2 +(9 + 6) * 8 + 8 + 6 + 8 +8 + (2 * 2 + (7 * 6 + 3 * 8 * 5 * 7) * 3) + (8 + 4 * 4 * 9) +6 * (9 + 6 * 7 + 2) * 2 * (6 + (5 + 8) + 4 + 7 * 6 * (9 * 5 + 7 * 7)) * 2 * 5 +9 + (7 * 3 + (2 + 8 + 8 + 8) + 3) + 7 + 8 * ((4 * 6 * 2 * 5 * 3) * 5 * 6 + (4 + 3 + 9 * 5 + 3)) * 5 +8 * 6 * (2 * 3 + 2 * (8 * 7 + 5 + 5 + 2 + 2) + 6 + 6) + 6 * 2 * 2 +7 * (7 * 9 * 2 * 7 + (3 * 5 + 6)) + 9 +6 * (9 * 4 * 6 * (9 + 6 * 6 * 6) + 9) * 8 +7 + 3 * (3 + 2 * (9 * 6 * 6 * 7 + 5 * 5) + 3 * 2 * (4 * 7)) * 7 + 9 * 3 +(7 * 5 * 5 + 7 * 2) * 6 + (7 * (2 + 5 * 3 + 8 * 4 * 5) + 4 * 8 + 9) +4 * 4 + 9 + 4 * 4 + 8 +8 * 8 * (6 + 6 * 8 + 9) + 7 + 7 + 4 +(8 + 3 + 4 + 7 + 7) * 5 * 3 +2 + 4 + (9 + 6 + 5 + (3 * 4 + 2) + 5) + 2 + 7 + 8 +(6 * 3 * 5) * 9 + (6 * 3 * 8) +((2 * 5 + 4 * 6 + 2 * 6) * 7 * 5) * 6 * 9 * 2 +7 * 3 * ((5 * 5 * 4 + 5 * 8 + 4) * 9 * 4 + 7 + (3 + 6 * 2 * 6 + 4) + 3) + 7 + 9 +7 * 6 * (6 * 9 + 5) + 2 + 7 + (6 + 3) +((6 + 2 + 7 + 5 + 7) + 9 * 9) * (4 * (2 + 6 * 7 * 7) * 5) + 9 * 9 * (8 * 6 + 2) +6 + 4 * 7 * (9 * 5 * 6 * 2 + 6) + 8 * 4 +4 * 5 * 9 + ((8 + 3 + 7) + 2 + 5) + 8 +7 * 4 * (7 + 8 * (6 * 7) * 9 * 7 * 6) +2 + 4 + 3 +(7 + 8 * 2) + 2 + (2 * 9 + 6) + 4 * 5 * (2 * 4) +(8 * 8) * 2 + 5 + 7 +7 + (8 + 8 * 6 * 8) + 2 * 7 * 7 * 3 +4 * (9 * 5 + 9) * 3 * 7 +9 + 7 + 9 + 6 + (9 * 9 + 6 + 9) +(9 * 3 * 6) * 7 +2 + (2 + (4 * 2 * 7 + 6) * 7 * 9 * 9 * 9) * 6 + 3 + (3 + 8 * 8 * 7) * 2 +8 + 4 + 6 +7 * (2 * 2 * (8 + 3 + 8) * (3 + 6 * 8 * 3) * 9 + (9 + 9)) * (3 + 5 * 9) +((5 + 9 * 7) * (3 + 9 * 5) * 7 * 4 * 4 * 6) * 9 * 9 + 5 + 9 + 2 +(5 + 6 + (5 + 9) + 7 + 4 * 3) + 2 * (9 + 8 * 5 * 8 * 9) + 8 * (5 * 2 + 6) * 3 +8 + (6 * (3 * 7 + 8 + 8 * 7)) \ No newline at end of file From d51fd11692106064358dceb28baf946b7eb7563b Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Fri, 18 Dec 2020 07:48:16 +0100 Subject: [PATCH 208/433] Remove useless line --- src/main/java/com/sbaars/adventofcode/year20/days/Day18.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day18.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day18.java index 4593f727..9df12287 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day18.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day18.java @@ -46,7 +46,6 @@ private Pair solve(StringBuilder s, boolean part1){ } i++; leftHand = resolveExpression(new StringBuilder(s.substring(i+1, s.length()-1)), part1); - s.replace(i, s.length(), "x"); } else { leftHand = Long.parseLong(s.substring(s.length()-1, s.length())); i = s.length()-1; From ff9da5ca1a2dc815f73b4f5f0a9e824a81a70f4b Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 19 Dec 2020 17:45:30 +0100 Subject: [PATCH 209/433] Day 19 --- .../adventofcode/year20/days/Day19.java | 87 ++++++++++++++++++- src/main/resources/2020/day19.txt | 47 ++++++++++ 2 files changed, 131 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day19.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day19.java index 703836f5..a3f356b5 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day19.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day19.java @@ -1,6 +1,16 @@ package com.sbaars.adventofcode.year20.days; import com.sbaars.adventofcode.year20.Day2020; +import lombok.Data; +import lombok.Value; + +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static java.lang.Long.parseLong; +import static java.util.Arrays.asList; +import static java.util.Arrays.stream; public class Day19 extends Day2020 { public static void main(String[] args) { @@ -13,12 +23,83 @@ public Day19() { @Override public Object part1() { - String input = day(); - return input; + return getSolution(day()); + } + + private long getSolution(String inputFile) { + String[] input = inputFile.split("\n\n"); + int longest = stream(input[1].split("\n")).mapToInt(e -> e.length()).max().getAsInt(); + Map rules = Arrays.stream(input[0].split("\n")).map(e -> e.split(": ")).collect(Collectors.toMap(e -> parseLong(e[0]), e -> new Rule(parseLong(e[0]), e[1]))); + Map> sol = new HashMap<>(); + rules.values().stream().peek(e -> System.out.println(e.id)).forEach(e -> e.getPossibilities(rules, sol, longest, 0)); + return stream(input[1].split("\n")).peek(System.out::println).filter(e -> sol.values().stream().anyMatch(r -> r.contains(e))).count(); + } + + @Data + @Value + public static class Rule{ + long id; + Optional letter; + long[] rule1; + long[] rule2; + + public Rule(long id, String rule){ + this.id = id; + if(rule.startsWith("\"")){ + letter = Optional.of(rule.charAt(1)+""); + rule2 = new long[]{}; + rule1 = new long[]{}; + } else { + letter = Optional.empty(); + String[] r = rule.split(" \\| "); + rule1 = Arrays.stream(r[0].split(" ")).mapToLong(Long::parseLong).toArray(); + if (r.length > 1) { + rule2 = Arrays.stream(r[1].split(" ")).mapToLong(Long::parseLong).toArray(); + } else { + rule2 = new long[]{}; + } + } + } + + public Set getPossibilities(Map m, Map> sol, int longest, int depth){ + if(sol.containsKey(id)) return sol.get(id); + if(!letter.isPresent()){ + Rule[] r = stream(rule1).mapToObj(n -> m.get(n)).toArray(Rule[]::new); + Rule[] orRule = stream(rule2).mapToObj(n -> m.get(n)).toArray(Rule[]::new); + Set output = r[0].getPossibilities(m, sol, longest, depth); + for(int i = 1; i output2 = r[i].getPossibilities(m, sol, longest, depth); + Set newOne = new HashSet<>(); + for(String o : output){ + for(String o2 : output2){ + newOne.add(o+o2); + } + } + output = newOne; + } + if(orRule.length>0 && output.stream().findFirst().get().length()<=longest && depth<4){ + Set outputOr = orRule[0].getPossibilities(m, sol, longest, depth); + for(int i = 1; i outputOr2 = orRule[i].getPossibilities(m, sol, longest, id == orRule[i].id ? depth + 1 : depth); + Set newOne = new HashSet<>(); + for(String o : outputOr){ + for(String o2 : outputOr2){ + newOne.add(o+o2); + } + } + outputOr = newOne; + } + output.addAll(outputOr); + } + sol.put(id, output); + return output; + } + return new HashSet<>(asList(letter.get())); + } } @Override public Object part2() { - return 0; + return getSolution(day().replace("8: 42", "8: 42 | 42 8").replace("11: 42 31", "11: 42 31 | 42 11 31")); } } diff --git a/src/main/resources/2020/day19.txt b/src/main/resources/2020/day19.txt index e69de29b..09629912 100644 --- a/src/main/resources/2020/day19.txt +++ b/src/main/resources/2020/day19.txt @@ -0,0 +1,47 @@ +42: 9 14 | 10 1 +9: 14 27 | 1 26 +10: 23 14 | 28 1 +1: "a" +11: 42 31 +5: 1 14 | 15 1 +19: 14 1 | 14 14 +12: 24 14 | 19 1 +16: 15 1 | 14 14 +31: 14 17 | 1 13 +6: 14 14 | 1 14 +2: 1 24 | 14 4 +0: 8 11 +13: 14 3 | 1 12 +15: 1 | 14 +17: 14 2 | 1 7 +23: 25 1 | 22 14 +28: 16 1 +4: 1 1 +20: 14 14 | 1 15 +3: 5 14 | 16 1 +27: 1 6 | 14 18 +14: "b" +21: 14 1 | 1 14 +25: 1 1 | 1 14 +22: 14 14 +8: 42 +26: 14 22 | 1 20 +18: 15 15 +7: 14 5 | 1 21 +24: 14 1 + +abbbbbabbbaaaababbaabbbbabababbbabbbbbbabaaaa +bbabbbbaabaabba +babbbbaabbbbbabbbbbbaabaaabaaa +aaabbbbbbaaaabaababaabababbabaaabbababababaaa +bbbbbbbaaaabbbbaaabbabaaa +bbbababbbbaaaaaaaabbababaaababaabab +ababaaaaaabaaab +ababaaaaabbbaba +baabbaaaabbaaaababbaababb +abbbbabbbbaaaababbbbbbaaaababb +aaaaabbaabaaaaababaa +aaaabbaaaabbaaa +aaaabbaabbaaaaaaabbbabbbaaabbaabaaa +babaaabbbaaabaababbaabababaaab +aabbbbbaabbbaaaaaabbbbbababaaaaabbaaabba \ No newline at end of file From 2308b7069c5b7348cda62abffd6628af62a713f5 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Sun, 20 Dec 2020 09:17:21 +0100 Subject: [PATCH 210/433] Day 20 --- .../adventofcode/year20/days/Day20.java | 132 +- .../adventofcode/year20/days/Day21.java | 24 + .../adventofcode/year20/days/Day22.java | 24 + .../adventofcode/year20/days/Day23.java | 24 + .../adventofcode/year20/days/Day24.java | 24 + .../adventofcode/year20/days/Day25.java | 24 + src/main/resources/2020/day20.txt | 1727 +++++++++++++++++ src/main/resources/2020/day21.txt | 0 src/main/resources/2020/day22.txt | 0 src/main/resources/2020/day23.txt | 0 src/main/resources/2020/day24.txt | 0 src/main/resources/2020/day25.txt | 0 12 files changed, 1976 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode/year20/days/Day21.java create mode 100644 src/main/java/com/sbaars/adventofcode/year20/days/Day22.java create mode 100644 src/main/java/com/sbaars/adventofcode/year20/days/Day23.java create mode 100644 src/main/java/com/sbaars/adventofcode/year20/days/Day24.java create mode 100644 src/main/java/com/sbaars/adventofcode/year20/days/Day25.java create mode 100644 src/main/resources/2020/day21.txt create mode 100644 src/main/resources/2020/day22.txt create mode 100644 src/main/resources/2020/day23.txt create mode 100644 src/main/resources/2020/day24.txt create mode 100644 src/main/resources/2020/day25.txt diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day20.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day20.java index c96de7eb..599019d9 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day20.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day20.java @@ -1,6 +1,30 @@ package com.sbaars.adventofcode.year20.days; +import static com.sbaars.adventofcode.common.Direction.EAST; +import static com.sbaars.adventofcode.common.Direction.NORTH; +import static com.sbaars.adventofcode.common.Direction.SOUTH; +import static com.sbaars.adventofcode.common.Direction.WEST; +import static java.lang.Long.parseLong; +import static java.util.Arrays.stream; + +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Multimap; +import com.google.common.collect.Streams; +import com.sbaars.adventofcode.common.Direction; import com.sbaars.adventofcode.year20.Day2020; +import java.awt.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.EnumMap; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import lombok.Data; +import lombok.Value; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; public class Day20 extends Day2020 { public static void main(String[] args) { @@ -13,12 +37,114 @@ public Day20() { @Override public Object part1() { - String input = day(); - return input; + Grid[] input = stream(day().split("\n\n")).map(Grid::new).toArray(Grid[]::new); + Multimap map = ArrayListMultimap.create(); + stream(input).forEach(e -> e.getSides(map)); + Map> map2 = map.asMap(); + List answer = new ArrayList<>(); + for(Grid g : input){ + List possibleSides = Streams.concat(g.findSides(false).values().stream(), g.findSides(true).values().stream()).collect(Collectors.toList()); + if(possibleSides.stream().filter(e -> map2.get(e).size() > 1).count() == 4L){ + answer.add(g.id); + } + } + return answer.stream().mapToLong(e -> e).reduce((a,b) -> a * b).getAsLong(); + } + + @Data + @Value + public static class Grid{ + long id; + char[][] grid; + + public Grid(String s){ + this.id = parseLong(s.substring(5,9)); + this.grid = stream(s.substring(11).split("\n")).map(String::toCharArray).toArray(char[][]::new); + } + + public Multimap getSides(Multimap map){ + findSides(map, false); + findSides(map, true); + return map; + } + + private void findSides(Multimap map, boolean flipped) { + Point p = new Point(flipped ? grid.length-1 : 0, flipped ? 0 : grid.length-1); + Direction[] d = Direction.fourDirections(); + if(flipped) ArrayUtils.reverse(d); + for(Direction dir : d){ + StringBuilder res = new StringBuilder(); + for(int i = 0; i findSides(boolean flipped) { + Map map = new HashMap<>(); + Point p = new Point(flipped ? grid.length-1 : 0, flipped ? 0 : grid.length-1); + Direction[] d = Direction.fourDirections(); + if(flipped) ArrayUtils.reverse(d); + for(Direction dir : d){ + StringBuilder res = new StringBuilder(); + for(int i = 0; i l){ + Map map = new EnumMap(Direction.class); + for(Metadata m : l){ + map.put(m.dir, m.flipped); + } + return l.size() == 4 && + map.size() == 4 && + l.stream().map(n -> n.id).distinct().count() == 4L && + map.get(NORTH).equals(map.get(SOUTH)) && + map.get(EAST).equals(map.get(WEST)) && + map.get(NORTH).equals(map.get(EAST)); + } } @Override public Object part2() { - return 0; + Grid[] input = stream(day().split("\n\n")).map(Grid::new).toArray(Grid[]::new); + long total = 0; + for(Grid g : input){ + total+=g.countWithoutSides(); + } + long seaMonsterSize = 15; + for(long n = 0; total-n>0; n+=seaMonsterSize){ + System.out.println((n/15)+". "+(total-n)); + } + return total-(35*seaMonsterSize); } } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day21.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day21.java new file mode 100644 index 00000000..6e8ac37d --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day21.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year20.days; + +import com.sbaars.adventofcode.year20.Day2020; + +public class Day21 extends Day2020 { + public static void main(String[] args) { + new Day21().printParts(); + } + + public Day21() { + super(21); + } + + @Override + public Object part1() { + String input = day(); + return input; + } + + @Override + public Object part2() { + return 0; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day22.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day22.java new file mode 100644 index 00000000..080cfe25 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day22.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year20.days; + +import com.sbaars.adventofcode.year20.Day2020; + +public class Day22 extends Day2020 { + public static void main(String[] args) { + new Day22().printParts(); + } + + public Day22() { + super(22); + } + + @Override + public Object part1() { + String input = day(); + return input; + } + + @Override + public Object part2() { + return 0; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java new file mode 100644 index 00000000..8c7eb4a1 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year20.days; + +import com.sbaars.adventofcode.year20.Day2020; + +public class Day23 extends Day2020 { + public static void main(String[] args) { + new Day23().printParts(); + } + + public Day23() { + super(23); + } + + @Override + public Object part1() { + String input = day(); + return input; + } + + @Override + public Object part2() { + return 0; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day24.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day24.java new file mode 100644 index 00000000..539ab8f9 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day24.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year20.days; + +import com.sbaars.adventofcode.year20.Day2020; + +public class Day24 extends Day2020 { + public static void main(String[] args) { + new Day24().printParts(); + } + + public Day24() { + super(24); + } + + @Override + public Object part1() { + String input = day(); + return input; + } + + @Override + public Object part2() { + return 0; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day25.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day25.java new file mode 100644 index 00000000..0a79ae91 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day25.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year20.days; + +import com.sbaars.adventofcode.year20.Day2020; + +public class Day25 extends Day2020 { + public static void main(String[] args) { + new Day25().printParts(); + } + + public Day25() { + super(25); + } + + @Override + public Object part1() { + String input = day(); + return input; + } + + @Override + public Object part2() { + return 0; + } +} diff --git a/src/main/resources/2020/day20.txt b/src/main/resources/2020/day20.txt index e69de29b..b491df60 100644 --- a/src/main/resources/2020/day20.txt +++ b/src/main/resources/2020/day20.txt @@ -0,0 +1,1727 @@ +Tile 2141: +#.#...#... +###..#...# +.....##... +..#.##..#. +.#....#..# +...####### +.....#...# +#.#......# +##........ +########.# + +Tile 3467: +..#.#....# +#.....#..# +....#....# +...#...... +#.#....### +.#....#..# +#......... +.....#...# +.##...#... +##.#..#.#. + +Tile 3389: +......##.. +.##...#... +.#..###... +....##.#.. +#..#.#.... +.#.##..#.. +#....##... +.#...#..## +..##.#...# +####..#..# + +Tile 2797: +#..###..## +#......... +#......... +##.#....#. +.........# +.#...#...# +.........# +..#.#....# +..#...##.. +...##..##. + +Tile 1321: +.#....#..# +......#..# +#.#......# +#..#.#...# +.........# +.#..##.... +...#.....# +#....#..#. +..##.##... +##.###.### + +Tile 2741: +..#.#.#### +#......##. +#.#...#.## +.##......# +..#.#....# +.#.#.....# +#........# +..#......# +#...#....# +...#..#..# + +Tile 3169: +.##.#.#... +#.#..#...# +#...###... +..#...##.. +.#..#.#.## +..#....... +...#...... +.......#.. +#.#....... +#.#.##..## + +Tile 1097: +.##.#..#.. +..#...##.. +###.#.#... +..#..##... +......##.# +...#..#..# +#.#..#..## +.##.#...#. +##.#..#... +##..#...## + +Tile 3457: +#.#.#.#### +..#.#.#... +..#....... +##.....#.. +#........# +.......#.# +#........# +#.......## +#..#.#..## +.##.##.#.. + +Tile 1471: +##.#.#.##. +.......... +...#...#.# +#...#...#. +.....#..## +.......#.# +........## +...#...#.# +.#....#### +.#.##.##.# + +Tile 1531: +#....#..#. +#.#....#.. +.......#.. +.##.####.# +#..#.##..# +#........# +##.#.#...# +#...#....# +.......... +...##..### + +Tile 1523: +##..##.##. +...#..##.. +#....#.#.. +....#.#### +#.#....#.# +....##..#. +#..#....#. +#..#..##.# +..#...##.. +.#..####.. + +Tile 1447: +.#..#...## +.........# +.......... +#.#....#.# +..#....##. +#......#.# +#.....#..# +#......#.# +.......... +######.... + +Tile 2179: +#..#...#.# +..#......# +........#. +#.....#..# +......##.. +#..#.##..# +#.##..#.#. +###.#..##. +...#..#..# +#.##..#.#. + +Tile 1789: +#.#.#.##.# +#..#.#.... +.#.#...... +#.#....#.. +##..#...#. +##..#....# +#.###..... +#..#.#.#.. +#.......#. +#.##..#### + +Tile 2521: +.###..##.. +..#.##.... +##.#.....# +..##...#.# +#.###.#..# +.........# +.........# +#......... +.....#.#.# +.#....#.#. + +Tile 3583: +..#..#.#.. +..#.....## +#......#.. +.........# +#...##.#.# +..#..#.... +....#....# +#..#..#..# +#..#..###. +##...#.#.# + +Tile 2633: +..#..#...# +.......... +#..###..## +###......# +..#...#..# +#.###..### +##..#.##.. +###.#.#..# +#....#.... +#.#.###### + +Tile 1667: +###.##..#. +........#. +..#...##.# +........#. +#..##....# +#.#..#..## +.##......# +..#....... +#..#..#..# +.###..##.# + +Tile 2003: +......#... +#.#....... +#..#...... +#.....#..# +##.......# +.....##.## +#.###..... +#..#.#...# +......#... +#.##...#.. + +Tile 1103: +###.###### +...######. +........#. +#....##..# +#.....#..# +#....#.... +#..##..#.# +...##....# +#......#.. +##...#.#.# + +Tile 3167: +..##...##. +##.......# +...#...#.# +.......#.. +.........# +........#. +##.......# +##.#.....# +..#.#..... +.#.####.## + +Tile 1031: +#.##....## +#.#..#...# +#...#..... +#.#....... +#.#..##... +#...#....# +##..#....# +.#.#.....# +#.......## +...#####.# + +Tile 2539: +##...#..## +..#....#.. +......#..# +#...###..# +...#...#.. +##....#### +#.......## +#......#.# +.........# +.##.#..### + +Tile 1871: +.#..#.#.## +...###...# +.........# +#...##.... +...###...# +###.#..#.# +#..##....# +##.....#.. +#....#..## +#####.##.. + +Tile 2383: +.#.....### +#.#....... +#.....#..# +.#...##..# +...#...#.# +#....#.#.# +...#....## +##.#..#### +...#.....# +###.##.#.. + +Tile 1237: +##.#.#.##. +.##...#### +#...#..#.. +##.#..#.#. +##....#.#. +....#..### +....#....# +#.......## +..##...#.# +#.#..#..## + +Tile 1093: +..##.###.. +....###... +#..#.#.... +#......... +.......... +..#....#.# +#.....#... +........#. +......##.# +.#...#..## + +Tile 1583: +..###.#..# +.........# +......##.. +#....#..## +.###...### +..##..#.#. +....##.#.# +#.....#.#. +##.......# +#.#.##..#. + +Tile 2243: +..#..##### +...#....## +#.....#..# +#......#.# +..#.#..#.# +.#...#...# +##.....#.. +##.##.###. +#........# +#..#...#.# + +Tile 1297: +..#......# +##..#..... +.##.#..... +.....##..# +.#....##.. +#.#.#...## +.#........ +.##.##.#.# +..#.###..# +#..#...#.. + +Tile 1877: +....###.#. +#....#.... +.##...#..# +.........# +.........# +.#..##.#.. +...#.....# +#.....#..# +...##..... +#.#.#.#... + +Tile 3779: +.#...##..# +.#.......# +#......... +#.......## +.....#...# +.........# +...#.#...# +#......... +..#..#.### +#.#####.#. + +Tile 2029: +....##..## +#..###...# +.....#..## +#...#.#... +##..###..# +#.#..##.#. +.......#.# +..##..#..# +..#....#.# +.##..##### + +Tile 3221: +.#..#..##. +.###..#... +....#.##.. +#.#.#.#.#. +#..#...#.. +.......... +#.#.....## +###....#.# +..###...#. +#......#.. + +Tile 3463: +.#.#...... +#...#..#.. +......#..# +#..#.##..# +#.....#..# +.#..###.#. +#####...#. +#.#....#.. +#......... +##.###.#.# + +Tile 3331: +##.###..## +##..#..#.. +.....##... +..#...#.#. +#..#.#...# +...###.... +.........# +.###....## +#...####.# +..#.##.... + +Tile 2473: +..####.#.# +##.#....## +......#.## +##.......# +##...##..# +##....#..# +.#.#.#.... +......##.# +..#.##.... +#..###...# + +Tile 2459: +##.##....# +.......... +#.#....### +#......... +##....##.# +...#...... +###....... +.......... +#.....#... +.#.###.#.# + +Tile 3877: +...#.#.#.. +#....#...# +.#......#. +......##.# +....#.##.# +.#.#..#.## +##........ +....#.#### +###...#.## +######..## + +Tile 2161: +..##...#.. +#....#...# +#.#.#.#..# +.##....### +...#..#... +#......... +.##....##. +.........# +#........# +.#.#.###.. + +Tile 3361: +#..##..... +.##.....#. +#........# +#..#...... +#......... +##...##..# +..#..#.... +#.#....... +...#.....# +###.#.##.. + +Tile 2089: +.##.####.# +...#....## +.###.#.#.. +.........# +..#.##..#. +.###..##.. +.......... +...##.#..# +#..#....## +#...####.# + +Tile 2711: +.##.#..### +#.#.....## +#..###.#.# +.##.....## +...#....#. +##......#. +#........# +..#....... +###..#.#.# +...#.##..# + +Tile 1753: +....##.### +#........# +#...#...#. +..##.#.... +#..#..#.## +#.....#..# +#......... +...#...... +##.....#.. +##..#..... + +Tile 2953: +.#.####..# +...#.....# +.##.....## +#...#..... +##........ +###.#..#.# +#..#.##... +#..#...#.. +#.#......# +..#.#...#. + +Tile 3593: +#..#.#..#. +#.#.....#. +#.#....... +#..#.....# +...#..#... +#........# +#....#.#.# +#..#...... +..#......# +...#..#.## + +Tile 1483: +..#.####.. +.#.......# +##........ +.......#.. +##..#....# +#........# +..#...#... +#......... +###....#.. +..#.#..##. + +Tile 1657: +#####..##. +.###....#. +...#...#.# +#..#....#. +#.#...#.#. +.....##.## +.......#.# +####...... +#..##....# +..#...#..# + +Tile 3307: +.#..##.### +....#..#.. +###..#..## +#.###..... +..###....# +#..#...#.# +.........# +....#.###. +..#......# +#.##.#.### + +Tile 3617: +...#.#.#.. +.......... +.#....#.## +.#.#...#.. +.#.....#.. +.##.#..### +#..#...... +#......#.. +.#..#...#. +#.##..#..# + +Tile 3001: +##...##### +..##.....# +#.....#.## +##........ +....#..... +#....#..#. +...##.#... +.......#.# +#.....#..# +#.####.... + +Tile 1013: +.##..#.... +#....##... +#...#...## +.#.###...# +....#..#.. +##...#..#. +..#....#.. +#...#..#.# +...#.....# +####.##### + +Tile 2801: +#...##.##. +#.....#... +......#... +#....#...# +...##..... +.#......#. +....##..## +#....##### +....##...# +..#..###.. + +Tile 3079: +..##.#...# +#.....#... +...#.....# +..#..#...# +#..#...### +#.##...... +#.###..... +#........# +#.....#.#. +..#.#...#. + +Tile 1231: +####.##### +..#.#....# +.#....#... +.#..#....# +..#......# +#..#.###.# +.#.......# +#.##...#.# +.....#.### +.###.###.# + +Tile 1171: +..#..#..## +#...#....# +#....#...# +#......... +###......# +#...#..#.. +..#..#.#.. +...#...#.. +.....#.... +###..#.### + +Tile 3319: +###.#####. +.......... +..##...... +#.......#. +#..#.#..#. +.#.##..... +..###..#.# +#...#...## +##.#.#.... +...##...## + +Tile 2129: +##...#.### +#........# +.....#...# +##.......# +#.#.#.#... +......#... +#....#..#. +.......... +.......#.# +.###.###.# + +Tile 3371: +.##....... +#....#.#.# +..#.#...## +#......... +.#.....#.. +#.....#.## +...#...... +##....#... +..#..##..# +#..#.##### + +Tile 1129: +#.##..#.#. +#......### +#.#....#.. +.####...## +#...#..#.# +#..#...... +.##.....## +#..#.....# +.......... +#.###..#.. + +Tile 1399: +#.....#.## +#........# +.....##... +........## +...#...#.. +#.###..##. +#..#.#.#.# +....##.#.# +#.##.....# +.#..###.## + +Tile 2503: +#...#...## +#..#.#.... +.....#.#.# +...#.....# +..#......# +..##.....# +.....#.... +...#...#.# +.#........ +#.###...#. + +Tile 3529: +.##...#### +.#.....### +#..#..##.. +....##.#.# +.......##. +#........# +.........# +#.##...... +##....#..# +....#.##.# + +Tile 1181: +.#.##.#.## +#..#...... +#........# +..##...... +##.#...#.# +.#.##..#.# +##........ +#..#..#..# +#.#...#..# +..#.#.##.. + +Tile 1759: +...#..#..# +..#...#... +##....#... +#.#..#.#.. +#.......## +#...#...## +##......#. +##...#.### +##...#.... +.##...#... + +Tile 2543: +######.### +####....## +##.#..#.#. +##...#.... +.......... +..#......# +#.......## +##........ +..###..##. +##....#### + +Tile 3613: +.##..#.... +......#..# +#......... +....##...# +....#....# +.#..#..... +....##...# +#.#..#..#. +#..#.....# +##.##...## + +Tile 3853: +....###### +.####....# +..###..... +#.#....... +#..#..#... +....#...## +##....##.# +#..##..#.. +#.#..#...# +..#######. + +Tile 3187: +.#..#.#### +#.##....#. +.....#.... +##....#... +.#.##.#... +#...##...# +#....#...# +......#... +#....#..#. +#..###.... + +Tile 2437: +#..#.##.#. +##...###.# +.....#.... +.#......#. +...##.#... +#..###...# +#....#.... +.#....#..# +.......... +.##.#.#..# + +Tile 2917: +#.....#... +.#.#...#.. +#.##.##..# +......#..# +...###.... +##.#...... +....#....# +###.....## +.#.#....## +####.#..## + +Tile 1511: +#...###.#. +..##.#..## +..#...#... +##.#..#.## +##....#..# +#......... +#........# +........#. +#.....##.# +.#.....##. + +Tile 2699: +.#.#...... +#........# +..##...#.. +......##.. +..##..#..# +#.###..#.# +#.#..#...# +#.##.....# +..###..... +###..##.## + +Tile 3259: +###.###..# +.........# +#.#.....#. +...#..#... +.##....### +##.......# +...#.#...# +...##...## +#......... +......#... + +Tile 1429: +....##.##. +.###...#.. +##.#...### +#......... +#....#...# +#.....#... +...#.##... +#.......## +.#......## +###.#.##.. + +Tile 2039: +#....###.# +.#..#.#..# +#.#.#...#. +..#....... +##...#..## +#.#....... +#......##. +..#....#.# +#.#....... +..####.#.. + +Tile 3637: +#.###.#.## +#......### +#......... +.....#...# +..#..#.##. +#..#....#. +........#. +..#....... +...#...... +...#.###.# + +Tile 1163: +##.###.##. +#.##.#.... +..#.#..... +#..####.#. +#..#...... +#......#.# +.#........ +.#.##..... +#.##....## +##.#...... + +Tile 3761: +...##.###. +.........# +....#..... +##.......# +#.......#. +...##..... +#.#....... +.........# +#.#......# +.##.###... + +Tile 1777: +##...##.## +....#..... +.#...#.... +#....#.#.# +..#.#....# +#....###.# +##...#.... +#...###..# +#...##..#. +......#.## + +Tile 2857: +.#..#.##.. +#..#.....# +##........ +...#.#..#. +.##..#..#. +#####.##.# +#..##..... +##...#.#.# +#...#..... +...##.##.# + +Tile 3061: +.#.#.###.# +#........# +.###.###.. +..##.....# +#...#....# +#.#.#..### +.##......# +.....##... +....#..... +.#..#..#.. + +Tile 1721: +..#..##### +.#....###. +#..#...#.. +#......... +#....#...# +...##..##. +#........# +#......#.. +#......... +....##.### + +Tile 2693: +.....#.#.. +.#......#. +.#.....#.# +#....##..# +#..#...... +####.##..# +#.#.....#. +.......... +#.#....#.# +#.##..#... + +Tile 1259: +#...#..### +#...#...## +##..#.#..# +#.#....... +#......#.# +###....... +#...#..... +...#.....# +.#...#...# +.#...##.## + +Tile 1291: +#..##.#... +#.....##.# +.#..#....# +#...#...#. +..###.#... +###......# +#..#...#.# +#....#.... +..##...... +#..#..#.#. + +Tile 1051: +#...####.# +##..#..... +.........# +.#..#..#.. +##...#..## +...##....# +##........ +.#......#. +...#.....# +###.###..# + +Tile 2719: +.#.##..##. +.#.....#.. +#.....#... +##.#.....# +#######... +##...##.#. +......##.. +........## +..#....### +#..#..#.## + +Tile 3533: +...##....# +##.......# +#....#.... +....##...# +.....##.## +....#..##. +#......... +###...#.#. +#......... +#..####... + +Tile 2659: +.##.#...#. +.#..#...#. +....#...## +.#..#.#..# +#.##.##..# +..##.....# +..#..#..## +..#....... +.........# +#....####. + +Tile 3517: +#..##.#.#. +.#...#...# +.#.#.....# +##.......# +..#....... +#......#.. +.........# +...##...#. +......#.## +..##...#.. + +Tile 2371: +###.##.##. +.#.#.##..# +.....#...# +#.#.#..#.# +####...#.# +#.#.#.##.. +..#.#..... +##........ +..#..#...# +#...#.###. + +Tile 1601: +.####..##. +#......... +......#... +#.#..##.#. +..##.#.#.# +#.......#. +#..#.....# +#.....#.#. +..###....# +.#..###### + +Tile 2273: +..###.###. +....#..... +.##...#... +#.#...#... +....#..... +.#.....#.# +.#......#. +.#.#..#... +........## +##..###... + +Tile 3917: +####.#...# +#...#...## +#.##...### +#..#...##. +....#....# +.........# +......#..# +###.#.#... +...##...## +#..#####.# + +Tile 3701: +#..###...# +###..#...# +#.#...##.# +.##.#.#..# +.##..#..## +##..#.#... +.##.#.#.## +....##.#.. +#.....#... +..##.##.#. + +Tile 2081: +...####.#. +........## +#.#...#..# +.###...##. +#..#.##... +#....#.... +#.#..###.. +........## +..#......# +...##..### + +Tile 2339: +#.#..#..## +.#..#...#. +........## +.##....#.. +#.....#.#. +........#. +....#...## +.#....##.. +#........# +#.##.#...# + +Tile 1373: +###.###... +.........# +#......### +#...##...# +.###....#. +#..#.....# +.......... +##..#..#.# +.###.#..## +###...##.. + +Tile 2837: +##....#... +...#...#.# +#......... +..#....... +##.#...... +.#....#... +.###....#. +##......## +.....#.... +.#.##..... + +Tile 3803: +#..#..##.. +.......#.. +##.###.... +#.#.#.#... +....##.... +#.###..#.# +....#...## +........#. +..##.....# +..#..###.. + +Tile 3559: +#....##.## +...##..... +..#..#...# +#........# +##........ +#.#....... +#.#..#.#.# +#....#..#. +#...#..... +##.#.#.... + +Tile 1549: +####.##.#. +......#... +#..#.#..## +#..#..#.#. +.#.....#.# +.........# +.........# +#....#...# +#.......#. +#####....# + +Tile 1699: +.#.##.#.#. +.#..####.. +.#.#...... +.###..##.# +#........# +##.#...... +.#.#.##..# +#.#..#.... +#.......#. +.###.##..# + +Tile 2647: +###....... +.......#.# +..#.#...#. +#..#...#.. +..##...... +#.#.#....# +....#.#.#. +#......... +#...#..... +#.###...## + +Tile 1361: +...##.#.#. +.......... +#......... +#.#....#.. +##..##...# +....#..... +#.......#. +.......... +#.##.#.#.. +#..##.#.## + +Tile 3851: +##........ +...##.#... +....#..... +....####.. +#.....#..# +#...#.##.# +#..#.....# +...#..##.# +#.#....#.. +#..####... + +Tile 3911: +##..##.##. +#.#.....## +...#.#...# +.....#.... +.#...#..#. +...##.##.. +#.#.#.#### +.......#.# +...#.#.... +##..#.##.# + +Tile 3719: +##.##.###. +....#..#.. +...#...... +#......### +.#.#....## +..###...#. +....#..#.# +.......... +#..#....#. +#####..### + +Tile 2239: +###.##.##. +###......# +#.##.#..#. +..#....#.. +......##.. +.....#..#. +...#...... +#......... +.......... +.#.....### + +Tile 1249: +#.#..####. +...#.....# +....#....# +.........# +.#.##...## +..#.####.# +...###.... +#......... +#.....#... +.#..#.#... + +Tile 2707: +.##.#..... +#.....##.# +.#..#...## +...#.#.#.. +..#....... +.#.#...#.. +#.....#... +#.##...... +.#........ +.###.#..## + +Tile 2897: +..###...#. +...#..#..# +#......#.. +#..#.....# +.....#.... +..##..#### +#...##...# +#.#......# +##......## +......#..# + +Tile 3623: +#..#.....# +##.#...##. +##.......# +#.#....#.# +.#....#..# +#.##..#... +.##....#.# +.#.......# +#.#.#..#.# +#..#.###.# + +Tile 2617: +.######... +#..#.....# +.......... +#####....# +....#....# +##.###..## +......##.. +.....##..# +#......... +...####.#. + +Tile 1049: +..#.##...# +.#.....#.# +......#..# +#####.#... +......#... +....#..... +#......... +#......... +##.......# +..#..#.#.# + +Tile 3019: +##.##..#.. +##...#..## +...#....#. +.......... +...#...... +#...#...#. +####.##.#. +###......# +.....#.... +######...# + +Tile 3067: +#...#.#..# +#.#.##...# +....#.#..# +##.#...... +....###..# +.#.....#.. +.#.......# +......#..# +##.#.....# +.#####.### + +Tile 3203: +#...###.## +#.#......# +..#..#..#. +.##...##.# +#.....###. +...##....# +#......#.# +.#........ +.#.#....## +##.#####.# + +Tile 2113: +.#.#.#..#. +#...#..... +###.....## +#.###..... +##........ +#...##.... +......#### +......#..# +#..###.##. +..#.###.## + +Tile 2591: +##..###... +........## +#........# +.....##..# +.........# +..#...#... +....#..#.# +#......#.. +...#...... +.##.##.#.# + +Tile 1499: +.....##..# +...#...... +.##.....#. +......##.# +.#........ +#..##.#... +....##...# +#........# +....#..... +.#.##.#..# + +Tile 3413: +#..#..##.. +.#..#..### +#..#....## +##.......# +#.###..... +#....#..## +#........# +.....#...# +#...#....# +#.#..#..#. + +Tile 3923: +.#...##### +#..####... +#.##....#. +#....##..# +#.#...##.# +..#..#.... +#.#......# +.#..#..#.# +#.##....#. +###.###... + +Tile 3527: +#.##...### +#......##. +#..#..#..# +....#....# +#.....#.## +.......... +#........# +#..#.#...# +.##..#...# +#.#.##.### + +Tile 2957: +###.#...#. +#.#..#.... +...#.....# +#.#......# +.##.....#. +.........# +....#..... +#......#.# +...#...... +#..##.##.. + +Tile 1481: +##....#... +...#...#.# +#.##...... +.......#.. +.#..#..#.# +.....###.# +#......... +.......##. +......#... +..###....# + +Tile 1747: +###..##### +..#.##.... +##.......# +.#........ +#.##.....# +...#...... +#........# +#.##...#.# +####...... +##.##...#. + +Tile 3659: +.##.###... +##..##.##. +####..#.## +....##.### +#......... +.##.#.#..# +.#...#..## +..####.##. +#..#..#... +..###...#. + +Tile 2621: +#####....# +...#....#. +.##......# +..###....# +...#..#... +.........# +#......... +.#..#..#.. +.#...##... +#......#.# + +Tile 2927: +.#..####.. +......#.## +.......#.# +#...#.##.# +##...#..## +#.....##.# +#.......#. +##........ +#.....#... +##.#.##... + +Tile 3727: +..#.....#. +#........# +####..#..# +##.#....## +...#...... +###....#.. +#..##..#.# +#.#.#...## +#...#..... +.####.##.# + +Tile 2803: +##.##..### +#....###.# +#.....##.. +#.#...#... +.#.#...... +#...##..## +......#... +##.....#.# +.##.#..##. +..##.##... + +Tile 2593: +.##.#....# +#.#.#.#... +#.......## +.......... +...####... +....##.... +#...##.#.# +#...##..## +.##......# +##....##.# + +Tile 3109: +.###.#..## +#......... +.#...#..## +##...#...# +#..#....#. +#......... +#........# +#.##..#... +.#.......# +#.#####..# + +Tile 3797: +#...##.##. +.....#..#. +##..##.#.. +#........# +.#...#.... +##..#.#... +##....#... +###.##...# +#......#.# +##.###..#. + +Tile 1367: +##.#..##.# +..#....... +.#.......# +...#..##.. +.##....##. +#..#.##..# +..#...#..# +#.#......# +#..#....## +...##..#.. + +Tile 2309: +##.#.####. +..###..... +...#....## +..#....#.. +.#....#..# +##....#..# +..#......# +..##..##.# +.....###.# +#..##.##.# + +Tile 2087: +.#.#.#.#.# +#.##....#. +#..#....#. +...#...... +#.......## +...#..#... +#...###..# +.#....#..# +.#.###...# +.#.####### + +Tile 2441: +....####.# +.........# +#.....##.. +.#..##.#.# +####.#..## +#.#.....#. +#.#.#.##.# +....#...## +###..###.# +.#.....##. + +Tile 3643: +##.#...### +..##....## +.....#.... +#.#.#.#... +...#.#.#.. +....##.... +....##.... +#.....##.# +#.......## +.......##. + +Tile 3251: +##...#.#.. +.#.......# +.#....##.. +..#.....## +.#.#...... +..#..##.## +.##..###.# +....#....# +##..##...# +#.#..###.# + +Tile 1787: +#.#.#..#.# +.......... +..#......# +.......... +.#......#. +..#....#.. +........#. +##....#..# +..##...... +###.#...#. \ No newline at end of file diff --git a/src/main/resources/2020/day21.txt b/src/main/resources/2020/day21.txt new file mode 100644 index 00000000..e69de29b diff --git a/src/main/resources/2020/day22.txt b/src/main/resources/2020/day22.txt new file mode 100644 index 00000000..e69de29b diff --git a/src/main/resources/2020/day23.txt b/src/main/resources/2020/day23.txt new file mode 100644 index 00000000..e69de29b diff --git a/src/main/resources/2020/day24.txt b/src/main/resources/2020/day24.txt new file mode 100644 index 00000000..e69de29b diff --git a/src/main/resources/2020/day25.txt b/src/main/resources/2020/day25.txt new file mode 100644 index 00000000..e69de29b From 71353d5f27fe192948ca38403dd1a95fcccb8638 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Mon, 21 Dec 2020 07:08:41 +0100 Subject: [PATCH 211/433] Day 21 --- .../adventofcode/year20/days/Day21.java | 110 +++++++++++++++++- src/main/resources/2020/day21.txt | 48 ++++++++ 2 files changed, 155 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day21.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day21.java index 6e8ac37d..e17ffa02 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day21.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day21.java @@ -1,6 +1,22 @@ package com.sbaars.adventofcode.year20.days; +import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; +import static java.util.Arrays.asList; + +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Multimap; import com.sbaars.adventofcode.year20.Day2020; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Comparator; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import lombok.Data; +import lombok.Value; public class Day21 extends Day2020 { public static void main(String[] args) { @@ -13,12 +29,100 @@ public Day21() { @Override public Object part1() { - String input = day(); - return input; +// Rule[] input = Arrays.stream(day().split("\n")).map(Rule::new).toArray(Rule[]::new); +// Multimap allergens = ArrayListMultimap.create(); +// Set found = new HashSet<>(); +// for(Rule r : input){ +// for(String ingredient : r.ingredients){ +// if(!found.contains(ingredient)){ +// allergens.putAll(ingredient, asList(r.allergens)); +// } else if(allergens.containsKey(ingredient)) { +// Collection a = new ArrayList<>(allergens.get(ingredient)); +// for(String s : a){ +// if(!asList(r.allergens).contains(s)){ +// allergens.remove(ingredient, s); +// } +// } +// } +// found.add(ingredient); +// System.out.println(allergens.size()); +// } +// } +// +// long total = 0; +// for(Rule r : input) { +// for (String ingredient : r.ingredients) { +// if(!allergens.containsKey(ingredient)){ +// total++; +// } +// } +// } + + Rule[] input = Arrays.stream(day().split("\n")).map(Rule::new).toArray(Rule[]::new); + Multimap allergens = ArrayListMultimap.create(); + Set found = new HashSet<>(); + for(Rule r : input){ + for(String allergen : r.allergens){ + if(!found.contains(allergen)){ + allergens.putAll(allergen, asList(r.ingredients)); + } else if(allergens.containsKey(allergen)) { + Collection a = new ArrayList<>(allergens.get(allergen)); + for(String s : a){ + if(!asList(r.ingredients).contains(s)){ + allergens.remove(allergen, s); + } + } + } + found.add(allergen); + } + } + + long total = 0; + for(Rule r : input) { + for (String ingredient : r.ingredients) { + if(!allergens.containsValue(ingredient)){ + total++; + } + } + } + return total; + } + + @Data + @Value + public static class Rule { + String[] ingredients; + String[] allergens; + + public Rule (String s){ + String[] split = s.substring(0, s.length()-1).split(" \\(contains "); + this.ingredients = split[0].split(" "); + this.allergens = split[1].split(", "); + } } @Override public Object part2() { - return 0; + Rule[] input = Arrays.stream(day().split("\n")).map(Rule::new).toArray(Rule[]::new); + Multimap allergens = ArrayListMultimap.create(); + Set found = new HashSet<>(); + for(Rule r : input){ + for(String allergen : r.allergens){ + if(!found.contains(allergen)){ + allergens.putAll(allergen, asList(r.ingredients)); + } else if(allergens.containsKey(allergen)) { + Collection a = new ArrayList<>(allergens.get(allergen)); + for(String s : a){ + if(!asList(r.ingredients).contains(s)){ + allergens.remove(allergen, s); + } + } + } + found.add(allergen); + } + } + + + return allergens.asMap().entrySet().stream().sorted(Comparator.comparing(Map.Entry::getKey)).map(e -> e.getValue().stream().findAny().get()).collect(Collectors.joining(",")); } } diff --git a/src/main/resources/2020/day21.txt b/src/main/resources/2020/day21.txt index e69de29b..79091fe8 100644 --- a/src/main/resources/2020/day21.txt +++ b/src/main/resources/2020/day21.txt @@ -0,0 +1,48 @@ +qgct fxctfc zbqfz zxdkrx hrqbs hgmsn ndqtf rmn cxfz slzctfh xvj xrqj nslqr bnxl rsprgcj vvchk gfhdct xsbt qbkjvg xtpdql mpvnt ssffbt gtl lxjtns prxmdlz mjlqj clg mrjqg qdtjjz fkxf vzzz qdfpq cqkrhx vbmz ljcvh mvdgf clmxkbn nmqlz vjzc bqrqj sqnbsg tn knprxg rbxz qzqzj qmcrpm grzv (contains wheat, eggs) +jthsmn qdtjjz qkhft slzctfh ksfbnhz rsprgcj tn clg zjtlrq ttqgh rclxmm llqfr kl qdfpq lxjtns cxfz mgx vjzc ncjv vrqb jmrx qmcrpm prxmdlz zsgnd vhbmztr gscdgj mrjqg sxxnb rkgbgn dxzmr nnxmgx cjp qzdpffs tbvh dxldm rxhrpjv jtgsn khqt jgdf jtlfh pdvqs kzpmt nslqr vzzz rmsgmj nkjcr bnxl lqtqm xlkgtc jcs cqkrhx xxhtdkp qnljhd kkhq gmdldb (contains soy, peanuts, sesame) +glx bzxh slrc qhzqq vdlj xmm vjzc dsksm qrnkl xpjd ttqgh qdfpq dtnzp tfrpccb lchdf sjg mgx xkzk qmcrpm jlfm knprxg xngkf mpvnt gfhdct vmcsb cjp zdvr ncjv ssffbt dxzmr xkkjl ltcxqdbm rxdns qdtjjz qpfh clg vzzz gtl prxmdlz jcs mct xsbt lxjtns hgmsn jbpz rxhrpjv fkxf vqbb qckgcc (contains peanuts, fish, sesame) +txhkk mvdgf llqfr clg vbmz tfrpccb rjmk bkzgpg cxfz qdfpq prxmdlz vqbb jmrx kl mjlqj zbqfz sfkf pgzgn qjtrpj jpdxvmv qpfh vrhj zpsbc vjzc ncjv crbxx cklx lxjtns zxdkrx gmdldb jgdf kvzpzvt fkhcbzbk rsprgcj rkgbgn mbllkbf grzv qc pdvqs jrbfkg kkhq qckgcc dxzmr qzdpffs hfjrp ljcvh vzzz fsjbdt qzqzj vsbttl qmcrpm tcnhp qrnkl hlsbn mgx (contains soy, eggs, sesame) +qzdpffs vvchk xtzt drqg tn mzr lxjtns grzv hjg hsfx qnljhd mpvnt zkvlf mmdmtg knprxg xjjk llqfr cklx rmc cxfz gpjkqrq zxjksd zpsbc xkkjl nkjcr mtzqr zsgnd jlrtmv vjzc qdtjjz fpqc crbxx ncjv cqkrhx lzkmdq vhcqpn mct fhtn qqgq xxhtdkp dsksm rxdns vrhj qgct mgx nslqr slg qhzqq jcs vzzz prxmdlz sskfj pgzgn gfhvs kcncjpk pbblp hbkmd clg fsjbdt qckgcc zjtlrq nnxmgx rkgbgn sxxnb tcnhp qmzzgr slzctfh vbmz bqrqj sjg zdxn rxhrpjv tfrpccb bkzgpg rgmlds ltcxqdbm rpmf (contains eggs, sesame) +zdvr zxdkrx gmcm xmm tbvh mct jlfm sfxsj qpfh ltcxqdbm jtlfh qmzzgr fkhcbzbk tfbpk lqkxpxr ssfb knprxg gxnjk dsksm mgx cjjd qckgcc tn gfhvs zjtlrq fhtn cqkrhx tcnhp qc qdfpq bkzgpg bzxh hbkmd rkgbgn lzkmdq hbpsp xkzk pdvqs vhbmztr ssffbt nfzz zsgnd dqf sdcdmn cklx xsrk pjlz ncjv vdlj hfjrp dxldm lxjtns gmdldb qzdpffs xtpdql slg pdfv jncfpc clg qhzqq prxmdlz vzzz dxzmr vvchk pgzgn (contains eggs, nuts, fish) +drqg sfkf kl pjlz bqrqj tcnhp gfhvs bnxl llqfr csdslq jglqz qbkjvg fsrmcx ffpfsv mgx bbltf xqpph ssb vzzz xrqj zdxn dsksm gmcm xngkf lqkxpxr xsbt cxfz xxhtdkp lxjtns vdlj rxdns rmsgmj qmzzgr rbxz jbpz vrhj rkms gtl clg pdfv prhkvr knprxg bqdtr qrnkl mzr gscdgj zpsbc zkvlf fkhcbzbk qzqzj prxmdlz qdfpq txhkk xvj jpdxvmv mjlqj mct rtkk mrjqg mpvnt fxctfc qjtrpj jmrx vbmz hfjrp zxjksd qmcrpm sjg vvchk xmm hlsbn sbkksv cklx jlrtmv sxxnb glx vsbttl jrbfkg mvdgf xsrk vjzc (contains eggs, sesame, nuts) +rmsgmj pdvqs xxhtdkp nmqlz sskfj cxfz xlkgtc jrbfkg ttjvqs tfrpccb xjjk knprxg mct qqgq ltcxqdbm zdvr dsksm pbblp mtzqr slg ncjv ssfb rbxz bnkss zjtlrq gxnjk gpjkqrq tcnhp xctvtxzl lqkxpxr fpqc ffpfsv vrqb jbpz slzctfh cjjd tn qdfpq hlsbn vzzz rtkk lzkmdq gfhdct rkms zkvlf pgzgn vqbb vrhj txhkk bqrqj mjlqj vjzc rmc ksfbnhz dtkcj nzqlgz jcs zdxn xngkf fhtn nkjcr sdcdmn gscdgj jthsmn dqf hrqbs jncfpc bbltf zbqfz clg jpdxvmv xsrk lxjtns khqt mmdmtg lchdf vbmz jmrx sbkksv sqnbsg drqg gmcm nnxmgx rxdns kkhq mzr rxhrpjv ssb bqdtr vvchk (contains shellfish) +mjlqj dxldm bqrqj zxdkrx lxjtns xctvtxzl kvzpzvt jncfpc nnxmgx xtzt ssfb mmdmtg mct ktzlr bzxh xjjk cxfz qmzzgr hlsbn jrbfkg vqbb gmdldb ndqtf zxjksd sqnbsg bnkss sfkf vrhj qnljhd ncjv nmqlz gpjkqrq slg kzpmt drqg xqpph cjp bnxl zpsbc rmsgmj zjtlrq qdfpq clg mvdgf rbxz jmrx qmcrpm jtlfh prxmdlz gtl ssffbt ktgqpk vhbmztr vzzz (contains eggs, sesame, peanuts) +vqbb xngkf nkjcr drqg sfkf xsbt jthsmn prxmdlz clg sqnbsg clmxkbn zdxn tbvh cqkrhx kvzpzvt rxhrpjv vmcsb dtnzp mvdgf qnljhd txhkk lxjtns mmdmtg ttqgh qdfpq pgzgn dqf ssb kkhq ncjv cxfz vzzz rmsgmj ssfb ltcxqdbm jncfpc vjzc csdslq bqdtr prhkvr rkms (contains soy, sesame) +qdfpq hgmsn jbpz sskfj xtpdql ljcvh mct qrnkl qmzzgr lqtqm xxhtdkp rxhrpjv ttjvqs bbltf rxdns vzzz prxmdlz hrqbs vdlj xmm drqg nfzz qckgcc gmcm hbpsp dsksm ffpfsv vqbb mjlqj mmdmtg jlrtmv ktgqpk hbkmd fpqc sfkf dqf ktzlr xkkjl rbxz tfbpk vmcsb tbvh kl gfhvs knprxg nnxmgx ksfbnhz fkxf bqrqj qhzqq bqdtr qjtrpj mbllkbf xsrk qbkjvg lzkmdq ttqgh rjmk gmltxp xjjk lqkxpxr cqkrhx cxfz crbxx vbmz zsgnd lxjtns jgdf hfjrp pdfv clg mpvnt bnkss gbk zxjksd nkjcr sdcdmn (contains wheat) +kl bqdtr mgx jcs nfzz knprxg lqtqm clg slg jglqz gmdldb sqnbsg qmcrpm pgzgn tbvh nzqlgz llqfr tfbpk fxctfc qnljhd cxfz vzzz nkjcr pbblp hfjrp clmxkbn rxhrpjv ncjv bnkss slrc prhkvr qpfh tcnhp xsrk kkhq hrqbs qgct gscdgj vbmz xrqj pdfv sfkf khqt xpjd rjmk lxjtns qdfpq vhcqpn ttqgh bnxl zjtlrq qqgq lchdf jgdf jpdxvmv mmdmtg sdcdmn (contains nuts, peanuts) +vrhj bnxl vsbttl qdtjjz ncjv bbltf mgx xpjd mbllkbf hgmsn xqpph vzzz dxldm tcnhp vhbmztr jthsmn mpvnt prhkvr gbk rxhrpjv ffpfsv clmxkbn rsprgcj qbkjvg tbvh rmc kvzpzvt qsgcg nnxmgx qdfpq xlkgtc rgmlds pgzgn bqdtr vdlj kkhq sqnbsg cqkrhx qgct ttqgh rkms xtzt nmqlz vbmz vmcsb mtzqr nslqr llqfr zxjksd cxfz fxctfc dtnzp slrc grzv nkjcr sdcdmn xtpdql gxnjk lxjtns mvdgf qzdpffs mct csdslq knprxg zkvlf vvchk nzqlgz crbxx pdvqs prxmdlz bnkss ktgqpk ltcxqdbm qrnkl gtl gmdldb jncfpc tn jmrx qckgcc gpjkqrq dxzmr rclxmm rkgbgn bqrqj xjjk (contains sesame, fish) +nzqlgz ffpfsv qjtrpj vjzc mzr bqdtr gmcm kkhq vmcsb vhbmztr ssfb hbkmd rxdns mjlqj knprxg qmzzgr qc tfrpccb cjp vzzz ltcxqdbm tqgjg mbllkbf sfxsj xngkf jtlfh ncjv hfjrp jmrx vvchk rclxmm dtnzp fsjbdt sfkf qbkjvg gmltxp jncfpc clg bzxh xxhtdkp xjjk dtkcj qdfpq bqrqj drqg gfhvs nfzz tfbpk jlrtmv prxmdlz zdvr fhtn sskfj qsgcg lxjtns (contains fish, eggs) +llqfr zsgnd vvchk hjg qmzzgr vzzz jncfpc gxnjk sfxsj fsrmcx zbqfz glx qzdpffs bbltf rkgbgn qc gbk xkkjl xxhtdkp tqgjg jmrx nkjcr slg rjmk vrhj nnxmgx gmcm rxhrpjv ltcxqdbm bqrqj ksfbnhz hbkmd rtkk mbllkbf bkzgpg ssb qjtrpj vbmz zjtlrq kzpmt clg qsgcg bqdtr mgx lxjtns crbxx qhzqq pgzgn sbkksv rgmlds jgdf jlrtmv ncjv ktzlr gpjkqrq cxfz qzqzj bqg dxzmr vhcqpn jpdxvmv pdvqs hrqbs rxdns kvzpzvt fsjbdt lzkmdq jbpz knprxg xsbt kkhq dtnzp qdfpq gfhdct sfkf tbvh cjjd vqbb xjjk (contains sesame, nuts) +qqgq xmm fhtn tcnhp prxmdlz sskfj ksfbnhz tbvh ncjv rkms nkjcr sjg grzv jmrx vhbmztr knprxg pdfv khqt qhzqq cjp zsgnd txhkk xpjd ltcxqdbm cqkrhx fkhcbzbk hbpsp slzctfh qsgcg gmcm tfrpccb jlrtmv qdfpq tfbpk vdlj fxctfc jpdxvmv gpjkqrq clg vhcqpn zkvlf crbxx zjtlrq ssfb ttqgh xqpph qjtrpj rpmf vqbb pgzgn hfjrp vzzz gtl vjzc mjlqj qdtjjz lxjtns qpfh zdxn xtpdql (contains fish, peanuts) +grzv pbblp vhbmztr qjtrpj zsgnd dxldm pdfv rxdns vrhj cqkrhx clmxkbn vsbttl lchdf slzctfh bqrqj vdlj mgx zxjksd ssffbt ncjv mmdmtg sqnbsg vzzz qckgcc jrbfkg lxjtns slg cklx zpsbc jlrtmv pdvqs ffpfsv jncfpc vrqb knprxg qdfpq rtkk dqf rbxz xpjd qc rmn ttqgh zjtlrq tbvh clg hfjrp bqg sdcdmn bkzgpg zdvr mct csdslq qgct gmdldb bnkss qsgcg prxmdlz xrqj dsksm (contains nuts, shellfish, fish) +rtkk jncfpc zxjksd zsgnd clg crbxx sdcdmn vbmz rkms hlsbn xsbt tfrpccb zdvr prhkvr vzzz slzctfh txhkk knprxg drqg slrc rgmlds xxhtdkp lxjtns mct qqgq grzv zpsbc gbk qmzzgr fpqc nnxmgx kl hjg jlfm kzpmt lqtqm xtpdql rmc hbkmd rxdns rmsgmj sqnbsg xqpph rclxmm zkvlf jmrx cklx mrjqg qmcrpm kcncjpk pbblp fkxf ncjv fsrmcx pgzgn xvj sjg rkgbgn cjp dsksm nmqlz zxdkrx sbkksv tcnhp ljcvh prxmdlz gfhvs mjlqj qc ssb cxfz bzxh dtkcj ksfbnhz hfjrp mgx mtzqr bqdtr sskfj cjjd ltcxqdbm fxctfc ktzlr nfzz dqf kvzpzvt (contains shellfish) +rtkk xrqj xctvtxzl gmltxp qzdpffs bqrqj gpjkqrq xpjd xngkf jcs nslqr slzctfh rsprgcj ksfbnhz qdtjjz jthsmn ttjvqs nkjcr xjjk qgct ncjv xkzk ktgqpk mct xlkgtc xsrk sdcdmn hrqbs jrbfkg jglqz vdlj slrc vqbb nzqlgz prxmdlz tcnhp qckgcc zxjksd vzzz bqdtr slg ffpfsv qkhft lqtqm clg dxzmr cxfz jtlfh jncfpc lxjtns gfhdct sjg ljcvh hjg qzqzj dsksm ktzlr knprxg rclxmm kzpmt vrqb rkgbgn sfxsj cqkrhx vhbmztr (contains fish, eggs, peanuts) +kkhq tbvh knprxg qdfpq rpmf rkms mct cjp ttqgh qjtrpj cklx rxdns tn rgmlds mrjqg mbllkbf qnljhd pdfv pdvqs jgdf pjlz ssfb xsbt clg crbxx qrnkl rsprgcj llqfr fxctfc clmxkbn jlfm txhkk hbpsp fsjbdt gmcm lzkmdq nslqr xjjk vzzz kl ssb ktgqpk prxmdlz nmqlz sfkf rmsgmj rkgbgn ssffbt gscdgj lchdf lxjtns gfhvs jncfpc csdslq xpjd qdtjjz hgmsn cxfz (contains peanuts, shellfish) +jlfm knprxg nkjcr slg vzzz fkxf ffpfsv rclxmm rmn ncjv cjjd mbllkbf xxhtdkp rtkk txhkk hsfx mvdgf clg qbkjvg fkhcbzbk sskfj fpqc khqt zjtlrq dqf cqkrhx hrqbs sfkf qdfpq vjzc vsbttl vrqb lqkxpxr cxfz bnxl xsrk hbpsp vqbb kkhq bnkss hfjrp qrnkl lzkmdq zkvlf drqg gfhdct lchdf pjlz lxjtns fsrmcx dxzmr (contains sesame, peanuts) +rxdns qhzqq clg mrjqg ndqtf jrbfkg cqkrhx sdcdmn qdfpq cxfz xvj fpqc xkkjl dxldm bnxl dxzmr fkhcbzbk vjzc hjg qpfh rpmf xpjd mpvnt nkjcr qzqzj drqg jbpz gbk fxctfc jlfm xtpdql bzxh sfxsj zxdkrx ffpfsv hfjrp tfrpccb khqt qc rkgbgn nmqlz rmn ssffbt slzctfh mzr xsbt qckgcc knprxg lxjtns prxmdlz gfhvs bnkss kcncjpk vzzz gscdgj mmdmtg ssfb zsgnd xxhtdkp (contains eggs, nuts, peanuts) +xtzt tfrpccb vrqb rxhrpjv cxfz gfhvs llqfr sqnbsg jlfm rsprgcj tn jncfpc rgmlds csdslq ssfb qdtjjz qmzzgr nslqr rmn fsrmcx gbk rjmk vbmz rkgbgn zsgnd prxmdlz qpfh dqf pdvqs vdlj zjtlrq rclxmm qrnkl qgct vqbb qzqzj rxdns zkvlf zdxn knprxg bzxh gmdldb cklx zxjksd vvchk zpsbc sxxnb lxjtns qdfpq ljcvh jthsmn ksfbnhz gfhdct zbqfz mjlqj ssb kzpmt vzzz fxctfc xngkf nkjcr sfkf kkhq jgdf clg bqdtr xxhtdkp (contains wheat, nuts) +cjjd ttqgh jthsmn cxfz dtnzp ksfbnhz slrc rtkk rbxz hjg clg tfbpk tqgjg kl lxjtns tn ncjv bnkss jtlfh xkzk vrhj crbxx ssfb zpsbc gmcm qc jncfpc mzr vbmz gscdgj qsgcg knprxg xqpph bnxl hfjrp nzqlgz qnljhd pgzgn vmcsb xmm qdfpq cklx ffpfsv sxxnb vzzz (contains nuts) +pjlz zbqfz xsbt cxfz vsbttl sbkksv mtzqr dxldm lqkxpxr vqbb gtl mjlqj vhbmztr slg glx khqt mmdmtg nslqr zkvlf cjjd ncjv tfrpccb xkzk xlkgtc kcncjpk jgdf hbkmd mbllkbf prhkvr kl vzzz rgmlds rsprgcj gbk lxjtns dtkcj bbltf rkgbgn knprxg prxmdlz qdfpq rpmf jtlfh xvj jtgsn vrhj bqdtr vvchk bqrqj jlrtmv gfhvs hsfx xtpdql cqkrhx xjjk (contains soy) +rmsgmj txhkk slg nfzz mmdmtg ssb lchdf mct csdslq pgzgn qgct xmm bnkss ljcvh gbk jmrx clg zsgnd vvchk ktgqpk bzxh fxctfc slzctfh tcnhp kcncjpk vrhj nkjcr cqkrhx clmxkbn gmltxp fpqc xtzt rclxmm sdcdmn qbkjvg dxldm dxzmr fkxf vqbb vhcqpn qsgcg lqtqm jbpz lzkmdq mtzqr xtpdql qc cjp sjg bkzgpg bqg rgmlds qdtjjz qckgcc prxmdlz mpvnt knprxg xngkf mjlqj nmqlz xxhtdkp zpsbc mrjqg qdfpq rmn cklx jpdxvmv glx xctvtxzl sfkf bqrqj zbqfz zkvlf rxdns gfhdct sskfj mgx qhzqq kvzpzvt cxfz gpjkqrq gmcm jglqz xkzk lxjtns xpjd rbxz xvj grzv hbkmd slrc dtkcj ncjv xqpph zdxn (contains shellfish, wheat, fish) +ttqgh qzqzj lxjtns rbxz xpjd dxldm fsrmcx pjlz nslqr khqt crbxx pbblp pdfv hrqbs mbllkbf rmc zbqfz prxmdlz ncjv llqfr gxnjk ltcxqdbm qdfpq gfhdct dsksm vhcqpn ssb cjp nmqlz vrqb cjjd slzctfh vqbb zsgnd rmsgmj ktzlr hfjrp cxfz vvchk qbkjvg gscdgj txhkk kcncjpk zpsbc mtzqr sxxnb jmrx knprxg nfzz vzzz fhtn rkms jncfpc nzqlgz jgdf ksfbnhz qgct (contains nuts) +ltcxqdbm clg xkzk jgdf clmxkbn bnxl pdfv nslqr ncjv rpmf ttjvqs lzkmdq vzzz jcs qnljhd hrqbs gscdgj txhkk tqgjg kvzpzvt knprxg fxctfc drqg dsksm ttqgh fkhcbzbk xsrk sjg gmcm xtpdql prxmdlz gfhvs qdfpq kcncjpk ktzlr qjtrpj cklx gpjkqrq jtgsn cxfz dxzmr qzdpffs sbkksv ssb sfkf jmrx nfzz vvchk xngkf gfhdct vhbmztr tn vrhj fkxf xkkjl mmdmtg mct kl lqkxpxr (contains soy, shellfish) +lzkmdq dsksm qzdpffs xctvtxzl nmqlz xxhtdkp lqkxpxr hjg zpsbc nkjcr qhzqq bzxh rsprgcj zxdkrx nzqlgz hbpsp dqf xsbt jpdxvmv qkhft csdslq xmm mbllkbf xsrk jbpz prxmdlz slrc qdfpq gmcm glx prhkvr zsgnd bqg fpqc clg zjtlrq nnxmgx pgzgn mzr mvdgf ncjv rgmlds knprxg dxzmr xvj gmltxp lxjtns mpvnt xtzt xtpdql zdxn kcncjpk gbk cxfz fxctfc sskfj sdcdmn bbltf vvchk jthsmn jmrx gmdldb cklx (contains peanuts, wheat) +rtkk kl fsrmcx prxmdlz lqkxpxr hfjrp fpqc jmrx vzzz xtpdql gscdgj ltcxqdbm zxjksd bnxl lxjtns bqdtr mrjqg qgct xlkgtc bnkss txhkk qkhft hsfx cjjd csdslq kzpmt gmdldb ljcvh clmxkbn xmm jglqz vrhj rmc xkkjl knprxg tfrpccb jtlfh lchdf rxhrpjv vjzc qqgq sxxnb qckgcc fxctfc tbvh xkzk jlrtmv qbkjvg rbxz hbkmd jthsmn bbltf nslqr mgx clg cxfz jlfm gtl kcncjpk cjp gpjkqrq qzdpffs xsbt xjjk qdfpq tfbpk ktzlr nnxmgx xxhtdkp prhkvr qrnkl fhtn cklx sqnbsg slg glx (contains wheat) +prhkvr tfbpk prxmdlz sdcdmn xrqj mvdgf sbkksv lxjtns hbpsp fsjbdt llqfr rpmf zpsbc rbxz mjlqj fsrmcx gmltxp mrjqg jtlfh bqdtr jpdxvmv tbvh bqrqj ndqtf bnkss sfxsj nkjcr xvj rclxmm sxxnb hgmsn knprxg qdfpq mmdmtg mgx jlfm cqkrhx fpqc zxjksd bkzgpg fkxf xpjd clmxkbn ncjv clg xqpph xsbt fhtn qzqzj nnxmgx lchdf bnxl gmdldb qnljhd khqt rmn vzzz dxzmr (contains nuts) +cxfz mjlqj lxjtns kvzpzvt mrjqg qmcrpm clg ssffbt ndqtf rmsgmj dqf ttjvqs ksfbnhz tcnhp gmcm zsgnd hbpsp xtzt qjtrpj jbpz slzctfh qpfh hjg xjjk knprxg fkhcbzbk prhkvr cqkrhx lqkxpxr zpsbc qnljhd xkkjl lchdf xtpdql vzzz sjg ncjv bkzgpg pdfv sdcdmn cjjd ltcxqdbm vdlj csdslq nnxmgx mct jtgsn qckgcc bbltf jlfm bzxh dtnzp tfbpk gpjkqrq xqpph qc bqrqj vvchk ssfb glx lqtqm xngkf nslqr qzqzj gbk sfxsj prxmdlz xkzk (contains soy, nuts, peanuts) +slzctfh mbllkbf xvj sfxsj xtzt rmc rkms qmcrpm hgmsn dsksm knprxg rsprgcj jpdxvmv qrnkl rxhrpjv rbxz xqpph sjg xctvtxzl mzr lxjtns ncjv dqf prxmdlz nkjcr nmqlz hrqbs gmltxp gxnjk sbkksv mtzqr mvdgf clg ndqtf jbpz kvzpzvt cjjd hfjrp gmcm jrbfkg xrqj zpsbc gpjkqrq bzxh qzqzj qdfpq qsgcg hbpsp hjg qmzzgr mct mgx qbkjvg jgdf drqg fxctfc dxzmr cklx qpfh jtlfh rxdns dtnzp xxhtdkp jtgsn zbqfz jlfm lzkmdq vzzz nnxmgx xtpdql xkzk vhbmztr dxldm gfhvs jncfpc qjtrpj ttjvqs ssfb bqg (contains fish) +prxmdlz mtzqr tfbpk xqpph hrqbs clg zxdkrx lchdf vzzz gmcm ksfbnhz dtkcj mbllkbf tbvh sqnbsg dtnzp qdfpq kkhq dxldm mzr xngkf qkhft jglqz hbkmd zkvlf ncjv cqkrhx xmm kzpmt gbk qhzqq mmdmtg xxhtdkp jpdxvmv kcncjpk mgx cxfz ktzlr hlsbn prhkvr lxjtns xpjd cjjd gpjkqrq sxxnb qjtrpj qqgq sbkksv mvdgf jtgsn slg ktgqpk fhtn rtkk rxdns qrnkl ssb dxzmr mct lzkmdq fsjbdt sjg rxhrpjv rkgbgn xctvtxzl mpvnt (contains wheat) +pdvqs rjmk clg mgx zdxn qzqzj qzdpffs rpmf jcs zxdkrx jtlfh rbxz kkhq rgmlds ljcvh sqnbsg dsksm zkvlf bqg qhzqq tn hsfx lchdf qgct lqtqm jthsmn lxjtns xctvtxzl nfzz hbkmd slrc pjlz jtgsn vzzz mjlqj kzpmt pbblp knprxg mrjqg txhkk mct ssfb bqrqj clmxkbn rmsgmj jlfm mmdmtg xsrk pgzgn prxmdlz jncfpc hrqbs bnxl nkjcr zjtlrq xrqj mvdgf gmcm tcnhp lqkxpxr zbqfz zpsbc gxnjk fsjbdt gbk kl hgmsn dqf rsprgcj vqbb qmcrpm jmrx qsgcg tbvh fsrmcx hlsbn lzkmdq slzctfh ssffbt gfhdct qc xkzk vvchk cxfz qmzzgr fhtn vrqb rkms kcncjpk pdfv gscdgj xtpdql cjp sfkf vsbttl sjg qdfpq (contains sesame, soy, nuts) +cklx vzzz fhtn ncjv hgmsn xkzk nslqr rmn ffpfsv fpqc qmcrpm zxdkrx gfhvs sskfj rxdns cqkrhx qjtrpj mvdgf xmm jncfpc vsbttl kl ssfb xsbt zjtlrq gmltxp mzr jtlfh ktgqpk knprxg xxhtdkp nzqlgz clg pdfv drqg qmzzgr lxjtns kkhq rgmlds glx bnxl qsgcg jbpz hlsbn qdfpq cxfz (contains shellfish) +kvzpzvt qgct mvdgf hgmsn jrbfkg qdfpq ssffbt gfhvs prhkvr clg bbltf rbxz lxjtns vzzz dsksm tqgjg txhkk slg gbk crbxx rsprgcj qnljhd qzqzj rmc vrhj hrqbs jgdf qbkjvg vqbb gmcm zxjksd khqt rclxmm ksfbnhz jtgsn mjlqj ssb gmdldb xlkgtc ktzlr ssfb qdtjjz cxfz knprxg rmn xmm ffpfsv vdlj qqgq bnkss xkzk ncjv glx mrjqg bqdtr pdfv lqtqm bqrqj dxldm nzqlgz gfhdct xpjd tfbpk vbmz jncfpc lchdf kkhq (contains nuts, fish) +bqrqj bqdtr vzzz jthsmn vmcsb fsrmcx ncjv xkkjl xqpph slg sdcdmn ssffbt gscdgj gfhvs xlkgtc zkvlf drqg mvdgf hbkmd nzqlgz dxldm slrc qc cjjd vjzc lxjtns zdxn rpmf vdlj xctvtxzl xvj tfrpccb jtgsn sxxnb bbltf kkhq fpqc clg kvzpzvt xtzt qdfpq nnxmgx cklx mrjqg xsrk ttjvqs lchdf qmcrpm kcncjpk nslqr rmc vhcqpn cqkrhx prxmdlz jrbfkg lqkxpxr rsprgcj bzxh lzkmdq ffpfsv vrhj cjp qrnkl qzdpffs vhbmztr hfjrp tcnhp dxzmr fxctfc jgdf rmn mgx rkgbgn gmltxp lqtqm jmrx kl vrqb ltcxqdbm fhtn knprxg (contains peanuts) +gmcm xxhtdkp cqkrhx lqtqm vzzz jpdxvmv grzv ncjv sskfj dxldm kzpmt zdxn zbqfz rclxmm fkhcbzbk vvchk cxfz prxmdlz lqkxpxr vjzc clg jgdf vrqb rsprgcj nzqlgz fhtn jmrx pjlz bnxl bnkss qmzzgr fxctfc qrnkl lxjtns qdfpq slrc slg tcnhp nfzz mbllkbf hlsbn kkhq zxdkrx gmdldb gscdgj (contains sesame, wheat, shellfish) +gxnjk lqkxpxr kvzpzvt vzzz cqkrhx jrbfkg lxjtns xtzt jcs qzdpffs txhkk kzpmt xkkjl vrqb mtzqr fkhcbzbk jtgsn mct prhkvr rmsgmj sdcdmn qkhft ndqtf mjlqj gtl tfbpk mgx jglqz ktgqpk zxjksd xrqj gfhvs knprxg clg hbkmd xmm vjzc rxhrpjv rmc vmcsb nfzz xpjd cjjd sjg ssb fpqc qdfpq llqfr jthsmn vqbb rkms ktzlr ncjv jncfpc qsgcg sfkf cxfz xngkf xxhtdkp glx qmzzgr hrqbs zpsbc bnkss dxldm vbmz tbvh cjp qzqzj (contains soy) +pdfv bkzgpg lchdf dsksm rkms vhbmztr ttjvqs slrc csdslq mtzqr mzr qrnkl slzctfh vhcqpn ndqtf bqdtr ncjv gfhvs dxldm qdfpq bqg sdcdmn nmqlz xtpdql prxmdlz dtkcj rbxz rjmk qc qkhft kkhq ffpfsv jtlfh vrhj vzzz fxctfc rmc mct sqnbsg pdvqs xkkjl dqf rmsgmj lxjtns rtkk jlrtmv jbpz jrbfkg zdvr nslqr hlsbn fsjbdt jncfpc nzqlgz llqfr sfkf ttqgh gmcm qnljhd pjlz ljcvh mgx fkhcbzbk gpjkqrq clg qsgcg vrqb xrqj cxfz jgdf dxzmr tcnhp rxhrpjv tbvh ktzlr (contains wheat, soy, shellfish) +tn bzxh bqrqj csdslq jlfm jtlfh qdtjjz bnxl jthsmn gmcm lxjtns kvzpzvt jpdxvmv xjjk nmqlz rgmlds hlsbn khqt jlrtmv qbkjvg prxmdlz bqg nkjcr vzzz jbpz knprxg qckgcc nfzz pbblp hgmsn hfjrp ktzlr ktgqpk hbkmd qmcrpm gxnjk xsbt qjtrpj fsrmcx gmdldb xctvtxzl cjp cxfz jtgsn rkms vvchk qdfpq rjmk sfkf rmsgmj xngkf zxdkrx mvdgf clg bkzgpg lzkmdq hjg (contains sesame) +kkhq crbxx bqg rkms ncjv rclxmm gfhvs lxjtns vzzz bbltf kcncjpk jncfpc jlrtmv dsksm slg mjlqj xngkf fpqc kl cjjd sdcdmn knprxg grzv rmc lqkxpxr clmxkbn vvchk qzdpffs ksfbnhz zjtlrq bqdtr bnkss xsbt fsjbdt rxdns rjmk slrc zsgnd cxfz xjjk bqrqj bkzgpg vdlj qbkjvg xpjd clg prxmdlz vjzc rbxz sjg rtkk ktzlr sfxsj jbpz khqt qjtrpj pjlz fkhcbzbk ttqgh ssfb ffpfsv xctvtxzl mpvnt rmn ssb hlsbn vrhj rxhrpjv qmzzgr rkgbgn (contains fish, soy) +rmsgmj ttqgh jmrx vrqb xlkgtc csdslq rjmk jncfpc vjzc qnljhd knprxg ssffbt zxjksd ltcxqdbm slzctfh vdlj pbblp rgmlds xrqj fsrmcx sdcdmn lchdf xkzk sbkksv cjp sxxnb cxfz jtlfh clg bzxh gscdgj khqt cqkrhx pdfv nmqlz pgzgn vsbttl gfhdct qc qhzqq xmm gxnjk zkvlf rkgbgn jgdf xctvtxzl zxdkrx rmn nkjcr mgx vqbb mzr prxmdlz bnxl cklx ncjv dqf qpfh rmc hbpsp lxjtns clmxkbn mct ljcvh ttjvqs xxhtdkp pdvqs vzzz qdtjjz (contains shellfish, fish) +cjp clg xsrk gxnjk hbkmd qzqzj mzr rmsgmj mtzqr qgct qmzzgr vdlj hjg bzxh nslqr drqg dtkcj prxmdlz fpqc fkxf tfrpccb csdslq mbllkbf mgx hlsbn knprxg gfhvs vzzz txhkk cqkrhx xjjk jlfm rpmf kl ncjv lxjtns nkjcr rmn qrnkl hsfx qpfh qdfpq fhtn zkvlf qbkjvg rxhrpjv qqgq hfjrp xctvtxzl rkgbgn ttjvqs jtgsn (contains nuts) +zkvlf rclxmm hlsbn gpjkqrq qqgq dxzmr xlkgtc hbpsp zpsbc tfrpccb gscdgj sxxnb ttqgh rxdns lqkxpxr fkhcbzbk mct bnkss prxmdlz rmsgmj qmcrpm kzpmt jrbfkg ncjv vzzz slzctfh xctvtxzl dxldm hsfx ssfb qsgcg cxfz sskfj xkkjl fhtn gxnjk xtpdql nmqlz vbmz ffpfsv jtlfh cklx gmcm nslqr llqfr qzdpffs rkgbgn sbkksv rtkk tqgjg clg nkjcr pgzgn pdvqs vrqb sfxsj lxjtns jgdf qdtjjz prhkvr pbblp knprxg vqbb qnljhd khqt jbpz vsbttl drqg qhzqq (contains soy, sesame, peanuts) +vhbmztr bqrqj jtlfh gmdldb xjjk jlrtmv tqgjg gfhvs ndqtf rgmlds sdcdmn fsjbdt zbqfz ltcxqdbm hbpsp jbpz dqf sxxnb rtkk ncjv prxmdlz sfxsj llqfr rkms cxfz xtzt glx mpvnt xctvtxzl zxjksd gtl zxdkrx knprxg kzpmt pjlz khqt qdfpq tcnhp bqdtr fkxf vjzc mjlqj fxctfc lzkmdq zsgnd clg pbblp kvzpzvt qjtrpj jncfpc nmqlz ljcvh vzzz fsrmcx (contains soy, nuts) +rxdns mtzqr ttqgh dtkcj tn knprxg xqpph qbkjvg nzqlgz hbpsp ncjv dtnzp rbxz jrbfkg ssfb gmcm qckgcc xsrk pbblp qmzzgr sfkf jmrx cjjd rkgbgn fpqc zxjksd gmltxp cqkrhx glx xkkjl sdcdmn gbk jtlfh gscdgj cxfz lxjtns gfhvs jgdf tqgjg xvj vsbttl qc qgct mgx rxhrpjv gpjkqrq qzdpffs prxmdlz xsbt qzqzj xtzt ssb zkvlf vzzz mrjqg qdfpq qrnkl dsksm ljcvh nfzz xngkf bnxl lchdf kvzpzvt rmn khqt ndqtf hrqbs xjjk qnljhd ksfbnhz mmdmtg mvdgf xlkgtc bkzgpg mbllkbf (contains wheat, soy, nuts) \ No newline at end of file From da10a9e0e4f7e7c072346199e8698366fcc1de20 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Mon, 21 Dec 2020 07:39:26 +0100 Subject: [PATCH 212/433] Little bit cleanup --- .../adventofcode/year20/days/Day21.java | 87 +++++-------------- 1 file changed, 22 insertions(+), 65 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day21.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day21.java index e17ffa02..98fcf25b 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day21.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day21.java @@ -29,53 +29,8 @@ public Day21() { @Override public Object part1() { -// Rule[] input = Arrays.stream(day().split("\n")).map(Rule::new).toArray(Rule[]::new); -// Multimap allergens = ArrayListMultimap.create(); -// Set found = new HashSet<>(); -// for(Rule r : input){ -// for(String ingredient : r.ingredients){ -// if(!found.contains(ingredient)){ -// allergens.putAll(ingredient, asList(r.allergens)); -// } else if(allergens.containsKey(ingredient)) { -// Collection a = new ArrayList<>(allergens.get(ingredient)); -// for(String s : a){ -// if(!asList(r.allergens).contains(s)){ -// allergens.remove(ingredient, s); -// } -// } -// } -// found.add(ingredient); -// System.out.println(allergens.size()); -// } -// } -// -// long total = 0; -// for(Rule r : input) { -// for (String ingredient : r.ingredients) { -// if(!allergens.containsKey(ingredient)){ -// total++; -// } -// } -// } - Rule[] input = Arrays.stream(day().split("\n")).map(Rule::new).toArray(Rule[]::new); - Multimap allergens = ArrayListMultimap.create(); - Set found = new HashSet<>(); - for(Rule r : input){ - for(String allergen : r.allergens){ - if(!found.contains(allergen)){ - allergens.putAll(allergen, asList(r.ingredients)); - } else if(allergens.containsKey(allergen)) { - Collection a = new ArrayList<>(allergens.get(allergen)); - for(String s : a){ - if(!asList(r.ingredients).contains(s)){ - allergens.remove(allergen, s); - } - } - } - found.add(allergen); - } - } + Multimap allergens = getAllergens(input); long total = 0; for(Rule r : input) { @@ -88,6 +43,26 @@ public Object part1() { return total; } + private Multimap getAllergens(Rule[] input) { + Multimap allergens = ArrayListMultimap.create(); + Set found = new HashSet<>(); + for (Rule r : input) { + for (String allergen : r.allergens) { + if (!found.contains(allergen)) { + allergens.putAll(allergen, asList(r.ingredients)); + } else if (allergens.containsKey(allergen)) { + for (String s : new HashSet<>(allergens.get(allergen))) { + if (!asList(r.ingredients).contains(s)) { + allergens.remove(allergen, s); + } + } + } + found.add(allergen); + } + } + return allergens; + } + @Data @Value public static class Rule { @@ -104,25 +79,7 @@ public Rule (String s){ @Override public Object part2() { Rule[] input = Arrays.stream(day().split("\n")).map(Rule::new).toArray(Rule[]::new); - Multimap allergens = ArrayListMultimap.create(); - Set found = new HashSet<>(); - for(Rule r : input){ - for(String allergen : r.allergens){ - if(!found.contains(allergen)){ - allergens.putAll(allergen, asList(r.ingredients)); - } else if(allergens.containsKey(allergen)) { - Collection a = new ArrayList<>(allergens.get(allergen)); - for(String s : a){ - if(!asList(r.ingredients).contains(s)){ - allergens.remove(allergen, s); - } - } - } - found.add(allergen); - } - } - - + Multimap allergens = getAllergens(input); return allergens.asMap().entrySet().stream().sorted(Comparator.comparing(Map.Entry::getKey)).map(e -> e.getValue().stream().findAny().get()).collect(Collectors.joining(",")); } } From c24ecc0c5f1d0c85b185c2f013bb99aed6a0189d Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 22 Dec 2020 08:15:45 +0100 Subject: [PATCH 213/433] Day 22 --- .../adventofcode/year20/days/Day22.java | 75 ++++++++++++++++++- src/main/resources/2020/day22.txt | 53 +++++++++++++ 2 files changed, 125 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day22.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day22.java index 080cfe25..d5b6e4ad 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day22.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day22.java @@ -1,7 +1,19 @@ package com.sbaars.adventofcode.year20.days; +import com.google.common.collect.Comparators; import com.sbaars.adventofcode.year20.Day2020; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.PrintStream; +import java.util.*; +import java.util.stream.LongStream; + +import static java.lang.Math.toIntExact; +import static java.util.Arrays.asList; +import static java.util.stream.Collectors.toCollection; +import static org.apache.commons.lang3.ArrayUtils.subarray; + public class Day22 extends Day2020 { public static void main(String[] args) { new Day22().printParts(); @@ -13,12 +25,69 @@ public Day22() { @Override public Object part1() { - String input = day(); - return input; + String[] input = day().split("\n\n"); + Deque p1 = Arrays.stream(input[0].split("\n")).filter(e -> !e.startsWith("Player")).map(Long::parseLong).collect(toCollection(ArrayDeque::new)); + Deque p2 = Arrays.stream(input[1].split("\n")).filter(e -> !e.startsWith("Player")).map(Long::parseLong).collect(toCollection(ArrayDeque::new)); + + while(p1.size()>0 && p2.size() > 0){ + long l1 = p1.pop(); + long l2 = p2.pop(); + if(l1 > l2){ + p1.add(l1); + p1.add(l2); + } else { + p2.add(l2); + p2.add(l1); + } + } + Deque winner = p1.size()>0 ? p1 : p2; + return calcScore(winner); + } + + private long calcScore(Deque winner) { + return LongStream.rangeClosed(1, winner.size()).boxed().sorted(Comparator.reverseOrder()).mapToLong(l -> winner.pop() * l).sum(); } @Override public Object part2() { - return 0; + String[] input = day().split("\n\n"); + Deque p1 = Arrays.stream(input[0].split("\n")).filter(e -> !e.startsWith("Player")).map(Long::parseLong).collect(toCollection(ArrayDeque::new)); + Deque p2 = Arrays.stream(input[1].split("\n")).filter(e -> !e.startsWith("Player")).map(Long::parseLong).collect(toCollection(ArrayDeque::new)); + + + Deque winner = playGame(p1, p2) == Player.P1 ? p1 : p2; + return calcScore(winner); } + + public Player playGame(Deque p1, Deque p2){ + Set> playedGames = new HashSet<>(); + while(p1.size()>0 && p2.size() > 0){ + if(!playedGames.add(new ArrayList<>(p1))){ + return Player.P1; + } + + long l1 = p1.pop(); + long l2 = p2.pop(); + if(p1.size() < l1 || p2.size() < l2){ + if(l1 > l2){ + p1.add(l1); + p1.add(l2); + } else { + p2.add(l2); + p2.add(l1); + } + } else { + if(playGame(new ArrayDeque<>(new ArrayList<>(p1).subList(0, toIntExact(l1))), new ArrayDeque<>(new ArrayList<>(p2).subList(0, toIntExact(l2)))) == Player.P1){ + p1.add(l1); + p1.add(l2); + } else { + p2.add(l2); + p2.add(l1); + } + } + } + return p1.size()>0 ? Player.P1 : Player.P2; + } + + enum Player{P1, P2} } diff --git a/src/main/resources/2020/day22.txt b/src/main/resources/2020/day22.txt index e69de29b..bdf290ea 100644 --- a/src/main/resources/2020/day22.txt +++ b/src/main/resources/2020/day22.txt @@ -0,0 +1,53 @@ +Player 1: +43 +21 +2 +20 +36 +31 +32 +37 +38 +26 +48 +47 +17 +16 +42 +12 +45 +19 +23 +14 +50 +44 +29 +34 +1 + +Player 2: +40 +24 +49 +10 +22 +35 +28 +46 +7 +41 +15 +5 +39 +33 +11 +8 +3 +18 +4 +13 +6 +25 +30 +27 +9 \ No newline at end of file From 3f6ba0380eb9c79aa1f923180b21835c6e8bc99d Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 22 Dec 2020 08:25:16 +0100 Subject: [PATCH 214/433] Minor refactoring --- .../sbaars/adventofcode/year20/days/Day22.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day22.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day22.java index d5b6e4ad..1c257d8e 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day22.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day22.java @@ -26,8 +26,8 @@ public Day22() { @Override public Object part1() { String[] input = day().split("\n\n"); - Deque p1 = Arrays.stream(input[0].split("\n")).filter(e -> !e.startsWith("Player")).map(Long::parseLong).collect(toCollection(ArrayDeque::new)); - Deque p2 = Arrays.stream(input[1].split("\n")).filter(e -> !e.startsWith("Player")).map(Long::parseLong).collect(toCollection(ArrayDeque::new)); + Deque p1 = getInput(0, input); + Deque p2 = getInput(1, input); while(p1.size()>0 && p2.size() > 0){ long l1 = p1.pop(); @@ -51,12 +51,13 @@ private long calcScore(Deque winner) { @Override public Object part2() { String[] input = day().split("\n\n"); - Deque p1 = Arrays.stream(input[0].split("\n")).filter(e -> !e.startsWith("Player")).map(Long::parseLong).collect(toCollection(ArrayDeque::new)); - Deque p2 = Arrays.stream(input[1].split("\n")).filter(e -> !e.startsWith("Player")).map(Long::parseLong).collect(toCollection(ArrayDeque::new)); - + Deque p1 = getInput(0, input); + Deque p2 = getInput(1, input); + return calcScore(playGame(p1, p2) == Player.P1 ? p1 : p2); + } - Deque winner = playGame(p1, p2) == Player.P1 ? p1 : p2; - return calcScore(winner); + private ArrayDeque getInput(int i, String[] input) { + return Arrays.stream(input[i].split("\n")).filter(e -> !e.startsWith("Player")).map(Long::parseLong).collect(toCollection(ArrayDeque::new)); } public Player playGame(Deque p1, Deque p2){ From aa6bb2cf980a706994f80eee98282337cd9e73b3 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 23 Dec 2020 10:57:07 +0100 Subject: [PATCH 215/433] The algorithm --- .../common/CircularLinkedList.java | 89 +++++++++++++++++++ .../adventofcode/common/SmartArray.java | 51 +++++++++++ .../adventofcode/year20/days/Day23.java | 87 +++++++++++++++++- src/main/resources/2020/day23.txt | 1 + 4 files changed, 224 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode/common/CircularLinkedList.java create mode 100644 src/main/java/com/sbaars/adventofcode/common/SmartArray.java diff --git a/src/main/java/com/sbaars/adventofcode/common/CircularLinkedList.java b/src/main/java/com/sbaars/adventofcode/common/CircularLinkedList.java new file mode 100644 index 00000000..cb167638 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/common/CircularLinkedList.java @@ -0,0 +1,89 @@ +package com.sbaars.adventofcode.common; + +import java.util.HashMap; +import java.util.Map; + +import static java.util.stream.IntStream.range; + +/** + * A circular linked list of fixed length where all operations are O(1) + */ +public class CircularLinkedList { + public class Node{ + private int value; + private Node prev; + private Node next; + } + + private Node current; + private final Map valueMap = new HashMap<>(); + + public CircularLinkedList(int[] elements){ + Node prev = null; + Node first = null; + for (int element : elements) { + Node n = new Node(); + n.value = element; + n.prev = prev; + valueMap.put(element, n); + if (prev != null) prev.next = n; + else first = n; + prev = n; + } + prev.next = first; + first.prev = prev; + this.current = first; + } + + public int current(){ + return current.value; + } + + public void next(){ + current = current.next; + } + + public int[] next(int n){ + int[] arr = new int[n]; + Node node = current; + for(int i = 0; i=0; i--){ + node = node.next; + arr[i] = node.value; + } + return arr; + } + + public void insertAfter(int src, int dest){ + Node s = valueMap.get(src); + Node d = valueMap.get(dest); + Node oldNext = d.next; + s.prev.next = s.next; + s.next.prev = s.prev; + d.next = s; + s.next = oldNext; + oldNext.prev = s; + s.prev = d; + } + + public int size(){ + return valueMap.size(); + } + + public int[] toArray(){ + return next(size()); + } + + public void setCurrent(int value){ + current = valueMap.get(value); + } +} diff --git a/src/main/java/com/sbaars/adventofcode/common/SmartArray.java b/src/main/java/com/sbaars/adventofcode/common/SmartArray.java new file mode 100644 index 00000000..6e1d7fed --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/common/SmartArray.java @@ -0,0 +1,51 @@ +package com.sbaars.adventofcode.common; + +import java.util.*; + +import static com.google.common.primitives.Ints.asList; +import static java.util.stream.IntStream.range; + +/** + * A set of fixed length where all operations are O(1) + */ +public class SmartArray { + private final int[] order; + private final int[] elements; + private final Map elementIndex = new HashMap<>(); + + public SmartArray(int[] elements){ + this.elements = elements; + this.order = range(0, elements.length).toArray(); + for(int i = 0; i cups = Arrays.stream(input).boxed().collect(Collectors.toCollection(LinkedList::new)); +// int index = 0; +// for(int i = 0; i<100; i++){ +// System.out.println("\nRound "+(i+1)); +// int current = cups.get(index); +// System.out.println(Arrays.toString(cups.toArray()).replace(Integer.toString(current), "("+current+")")); +// int rem1 = cups.remove((index+1)%cups.size()); +// index = cups.indexOf(current); +// int rem2 = cups.remove((index+1)%cups.size()); +// index = cups.indexOf(current); +// int rem3 = cups.remove((index+1)%cups.size()); +// System.out.println("Pick up "+rem1+", "+rem2+", "+rem3); +// int j; +// for(j = current - 2 + input.length; j>0; j--){ +// if(cups.contains(j % input.length + 1)){ +// break; +// } +// } +// int dest = cups.indexOf(j % input.length + 1); +// System.out.println("Dest: "+(j % input.length + 1)+", "+dest); +// cups.add(dest+1, rem3); +// cups.add(dest+1, rem2); +// cups.add(dest+1, rem1); +// index = cups.indexOf(current); +// index = (index + 1) % cups.size(); +// } + return getSolution(true); + + //return 0; } @Override public Object part2() { - return 0; + return getSolution(false); + } + + private String getSolution(boolean part1) { + //int[] input = {4,9,6,1,3,8,5,2,7}; + int[] input = {3,8,9,1,2,5,4,6,7}; + CircularLinkedList cups = new CircularLinkedList(Streams.concat(Arrays.stream(input), part1 ? IntStream.empty() : IntStream.rangeClosed(10,1000000)).toArray()); + for(int i = 0; i<=(part1 ? 100 : 10000000); i++){ + System.out.println("\nRound "+(i+1)); + int current = cups.current(); + System.out.println(Arrays.toString(cups.toArray()).replace(Integer.toString(current), "("+current+")")); + int j; + int[] toMove = cups.nextRev(3); + System.out.println("Pick up "+Arrays.toString(cups.next(3))); + for(j = current - 2 + cups.size(); j>0; j--){ + if(!asList(toMove).contains(j % cups.size() + 1)){ + break; + } + } + int d = j % cups.size() + 1; + System.out.println("Dest: "+(j % cups.size() + 1)); + for(int move : toMove) { + cups.insertAfter(move, d); + } +// cups.move(index.in, dest+1); +// cups.move((index+2)%cups.size(), dest+1); +// cups.move((index+1)%cups.size(), dest+1); +// index = cups.indexOf(current); +// index = (index + 1) % cups.size(); + cups.next(); +// if(i%100000==0){ +// System.out.println(i); +// } +// if(i>9999998){ +// System.out.println("\nRound "+(i+1)); +// System.out.println(Arrays.toString(cups.toArray()).replace(Integer.toString(current), "("+current+")")); +// } + } + cups.setCurrent(1); + return Arrays.stream(cups.next(part1 ? 8 : 2)).mapToObj(Integer::toString).collect(Collectors.joining()); } } diff --git a/src/main/resources/2020/day23.txt b/src/main/resources/2020/day23.txt index e69de29b..297c758d 100644 --- a/src/main/resources/2020/day23.txt +++ b/src/main/resources/2020/day23.txt @@ -0,0 +1 @@ +496138527 \ No newline at end of file From aa7a10d8dae097980f6ddb2aa2716ad3c1c07227 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 23 Dec 2020 10:58:16 +0100 Subject: [PATCH 216/433] Remove commented code --- .../adventofcode/year20/days/Day23.java | 41 ------------------- 1 file changed, 41 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java index 200bb9e3..076d5e96 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java @@ -25,36 +25,7 @@ public Day23() { @Override public Object part1() { -// int[] input = {4,9,6,1,3,8,5,2,7}; -// LinkedList cups = Arrays.stream(input).boxed().collect(Collectors.toCollection(LinkedList::new)); -// int index = 0; -// for(int i = 0; i<100; i++){ -// System.out.println("\nRound "+(i+1)); -// int current = cups.get(index); -// System.out.println(Arrays.toString(cups.toArray()).replace(Integer.toString(current), "("+current+")")); -// int rem1 = cups.remove((index+1)%cups.size()); -// index = cups.indexOf(current); -// int rem2 = cups.remove((index+1)%cups.size()); -// index = cups.indexOf(current); -// int rem3 = cups.remove((index+1)%cups.size()); -// System.out.println("Pick up "+rem1+", "+rem2+", "+rem3); -// int j; -// for(j = current - 2 + input.length; j>0; j--){ -// if(cups.contains(j % input.length + 1)){ -// break; -// } -// } -// int dest = cups.indexOf(j % input.length + 1); -// System.out.println("Dest: "+(j % input.length + 1)+", "+dest); -// cups.add(dest+1, rem3); -// cups.add(dest+1, rem2); -// cups.add(dest+1, rem1); -// index = cups.indexOf(current); -// index = (index + 1) % cups.size(); -// } return getSolution(true); - - //return 0; } @Override @@ -83,19 +54,7 @@ private String getSolution(boolean part1) { for(int move : toMove) { cups.insertAfter(move, d); } -// cups.move(index.in, dest+1); -// cups.move((index+2)%cups.size(), dest+1); -// cups.move((index+1)%cups.size(), dest+1); -// index = cups.indexOf(current); -// index = (index + 1) % cups.size(); cups.next(); -// if(i%100000==0){ -// System.out.println(i); -// } -// if(i>9999998){ -// System.out.println("\nRound "+(i+1)); -// System.out.println(Arrays.toString(cups.toArray()).replace(Integer.toString(current), "("+current+")")); -// } } cups.setCurrent(1); return Arrays.stream(cups.next(part1 ? 8 : 2)).mapToObj(Integer::toString).collect(Collectors.joining()); From 02516345c4d675d5e8396c581545f6449501190b Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 23 Dec 2020 12:02:50 +0100 Subject: [PATCH 217/433] Day 23 --- .../adventofcode/year20/days/Day23.java | 49 ++++++++++++++----- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java index 076d5e96..56fa1920 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java @@ -12,11 +12,12 @@ import static com.google.common.collect.ImmutableSet.toImmutableSet; import static com.google.common.primitives.Ints.asList; +import static java.lang.Long.parseLong; public class Day23 extends Day2020 { public static void main(String[] args) { - //new Day23().printParts(); - System.out.println(new Day23().part1()); + new Day23().printParts(); +// System.out.println(new Day23().part1()); } public Day23() { @@ -25,6 +26,35 @@ public Day23() { @Override public Object part1() { +// int[] input = {4,9,6,1,3,8,5,2,7}; +// int[] input = {3,8,9,1,2,5,4,6,7}; +// LinkedList cups = Arrays.stream(input).boxed().collect(Collectors.toCollection(LinkedList::new)); +// int index = 0; +// for(int i = 0; i<=100; i++){ +// System.out.println("\nRound "+(i+1)); +// int current = cups.get(index); +// System.out.println(Arrays.toString(cups.toArray()).replace(Integer.toString(current), "("+current+")")); +// int rem1 = cups.remove((index+1)%cups.size()); +// index = cups.indexOf(current); +// int rem2 = cups.remove((index+1)%cups.size()); +// index = cups.indexOf(current); +// int rem3 = cups.remove((index+1)%cups.size()); +// System.out.println("Pick up "+rem1+", "+rem2+", "+rem3); +// int j; +// for(j = current - 2 + input.length; j>0; j--){ +// if(cups.contains(j % input.length + 1)){ +// break; +// } +// } +// int dest = cups.indexOf(j % input.length + 1); +// System.out.println("Dest: "+(j % input.length + 1)+", "+dest); +// cups.add(dest+1, rem3); +// cups.add(dest+1, rem2); +// cups.add(dest+1, rem1); +// index = cups.indexOf(current); +// index = (index + 1) % cups.size(); +// } +// return 0; return getSolution(true); } @@ -33,30 +63,27 @@ public Object part2() { return getSolution(false); } - private String getSolution(boolean part1) { - //int[] input = {4,9,6,1,3,8,5,2,7}; - int[] input = {3,8,9,1,2,5,4,6,7}; + private long getSolution(boolean part1) { + int[] input = day().chars().map(Character::getNumericValue).toArray(); CircularLinkedList cups = new CircularLinkedList(Streams.concat(Arrays.stream(input), part1 ? IntStream.empty() : IntStream.rangeClosed(10,1000000)).toArray()); - for(int i = 0; i<=(part1 ? 100 : 10000000); i++){ - System.out.println("\nRound "+(i+1)); + for(int i = 0; i<(part1 ? 100 : 10000000); i++){ int current = cups.current(); - System.out.println(Arrays.toString(cups.toArray()).replace(Integer.toString(current), "("+current+")")); int j; int[] toMove = cups.nextRev(3); - System.out.println("Pick up "+Arrays.toString(cups.next(3))); for(j = current - 2 + cups.size(); j>0; j--){ if(!asList(toMove).contains(j % cups.size() + 1)){ break; } } int d = j % cups.size() + 1; - System.out.println("Dest: "+(j % cups.size() + 1)); for(int move : toMove) { cups.insertAfter(move, d); } cups.next(); } cups.setCurrent(1); - return Arrays.stream(cups.next(part1 ? 8 : 2)).mapToObj(Integer::toString).collect(Collectors.joining()); + if(part1) return parseLong(Arrays.stream(cups.next(8)).mapToObj(Integer::toString).collect(Collectors.joining())); + int[] next = cups.next(2); + return (long)next[0] * next[1]; } } From 2b8ac1553d5d60795d57a79edcae6d29a14bf659 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 23 Dec 2020 12:14:34 +0100 Subject: [PATCH 218/433] Opt for a slightly faster approach --- .../adventofcode/year20/days/Day23.java | 43 +++---------------- 1 file changed, 7 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java index 56fa1920..5a1903d0 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java @@ -1,8 +1,6 @@ package com.sbaars.adventofcode.year20.days; -import com.google.common.collect.ImmutableList; import com.google.common.collect.Streams; -import com.sbaars.adventofcode.common.SmartArray; import com.sbaars.adventofcode.common.CircularLinkedList; import com.sbaars.adventofcode.year20.Day2020; @@ -10,14 +8,13 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -import static com.google.common.collect.ImmutableSet.toImmutableSet; import static com.google.common.primitives.Ints.asList; import static java.lang.Long.parseLong; +import static java.util.Arrays.stream; public class Day23 extends Day2020 { public static void main(String[] args) { new Day23().printParts(); -// System.out.println(new Day23().part1()); } public Day23() { @@ -26,35 +23,6 @@ public Day23() { @Override public Object part1() { -// int[] input = {4,9,6,1,3,8,5,2,7}; -// int[] input = {3,8,9,1,2,5,4,6,7}; -// LinkedList cups = Arrays.stream(input).boxed().collect(Collectors.toCollection(LinkedList::new)); -// int index = 0; -// for(int i = 0; i<=100; i++){ -// System.out.println("\nRound "+(i+1)); -// int current = cups.get(index); -// System.out.println(Arrays.toString(cups.toArray()).replace(Integer.toString(current), "("+current+")")); -// int rem1 = cups.remove((index+1)%cups.size()); -// index = cups.indexOf(current); -// int rem2 = cups.remove((index+1)%cups.size()); -// index = cups.indexOf(current); -// int rem3 = cups.remove((index+1)%cups.size()); -// System.out.println("Pick up "+rem1+", "+rem2+", "+rem3); -// int j; -// for(j = current - 2 + input.length; j>0; j--){ -// if(cups.contains(j % input.length + 1)){ -// break; -// } -// } -// int dest = cups.indexOf(j % input.length + 1); -// System.out.println("Dest: "+(j % input.length + 1)+", "+dest); -// cups.add(dest+1, rem3); -// cups.add(dest+1, rem2); -// cups.add(dest+1, rem1); -// index = cups.indexOf(current); -// index = (index + 1) % cups.size(); -// } -// return 0; return getSolution(true); } @@ -65,13 +33,15 @@ public Object part2() { private long getSolution(boolean part1) { int[] input = day().chars().map(Character::getNumericValue).toArray(); - CircularLinkedList cups = new CircularLinkedList(Streams.concat(Arrays.stream(input), part1 ? IntStream.empty() : IntStream.rangeClosed(10,1000000)).toArray()); + CircularLinkedList cups = new CircularLinkedList(Streams.concat(stream(input), part1 ? IntStream.empty() : IntStream.rangeClosed(10,1000000)).toArray()); + long mil = System.currentTimeMillis(); for(int i = 0; i<(part1 ? 100 : 10000000); i++){ int current = cups.current(); int j; int[] toMove = cups.nextRev(3); for(j = current - 2 + cups.size(); j>0; j--){ - if(!asList(toMove).contains(j % cups.size() + 1)){ + int n = j % cups.size() + 1; + if(toMove[0] != n && toMove[1] != n && toMove[2] != n){ break; } } @@ -81,8 +51,9 @@ private long getSolution(boolean part1) { } cups.next(); } + System.out.println((System.currentTimeMillis() - mil)); cups.setCurrent(1); - if(part1) return parseLong(Arrays.stream(cups.next(8)).mapToObj(Integer::toString).collect(Collectors.joining())); + if(part1) return parseLong(stream(cups.next(8)).mapToObj(Integer::toString).collect(Collectors.joining())); int[] next = cups.next(2); return (long)next[0] * next[1]; } From bd58322daaaec15cc1e010ab9ced480fbbc40804 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 23 Dec 2020 12:17:48 +0100 Subject: [PATCH 219/433] Even faster --- .../adventofcode/common/CircularLinkedList.java | 13 +++++++++++++ .../com/sbaars/adventofcode/year20/days/Day23.java | 4 +--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/common/CircularLinkedList.java b/src/main/java/com/sbaars/adventofcode/common/CircularLinkedList.java index cb167638..78eaa525 100644 --- a/src/main/java/com/sbaars/adventofcode/common/CircularLinkedList.java +++ b/src/main/java/com/sbaars/adventofcode/common/CircularLinkedList.java @@ -75,6 +75,19 @@ public void insertAfter(int src, int dest){ s.prev = d; } + public void insertAfter(int rangeStart, int rangeEnd, int dest){ + Node s1 = valueMap.get(rangeStart); + Node s2 = valueMap.get(rangeEnd); + Node d = valueMap.get(dest); + Node oldNext = d.next; + s1.prev.next = s2.next; + s2.next.prev = s1.prev; + d.next = s1; + s2.next = oldNext; + oldNext.prev = s2; + s1.prev = d; + } + public int size(){ return valueMap.size(); } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java index 5a1903d0..253cf9a8 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java @@ -46,9 +46,7 @@ private long getSolution(boolean part1) { } } int d = j % cups.size() + 1; - for(int move : toMove) { - cups.insertAfter(move, d); - } + cups.insertAfter(toMove[2], toMove[0], d); cups.next(); } System.out.println((System.currentTimeMillis() - mil)); From f517b78a95e8e8e49ff50d53cd555ea88324c97b Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 23 Dec 2020 12:37:50 +0100 Subject: [PATCH 220/433] Play around even more --- .../common/CircularLinkedList.java | 24 +++++++++++-------- .../adventofcode/year20/days/Day23.java | 7 +++--- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/common/CircularLinkedList.java b/src/main/java/com/sbaars/adventofcode/common/CircularLinkedList.java index 78eaa525..52da3c9a 100644 --- a/src/main/java/com/sbaars/adventofcode/common/CircularLinkedList.java +++ b/src/main/java/com/sbaars/adventofcode/common/CircularLinkedList.java @@ -10,9 +10,9 @@ */ public class CircularLinkedList { public class Node{ - private int value; - private Node prev; - private Node next; + public int value; + public Node prev; + public Node next; } private Node current; @@ -53,16 +53,20 @@ public int[] next(int n){ return arr; } - public int[] nextRev(int n){ - int[] arr = new int[n]; + public Node[] nextNodes(int n){ + Node[] arr = new Node[n]; Node node = current; - for(int i = n-1; i>=0; i--){ + for(int i = 0; i0; j--){ int n = j % cups.size() + 1; - if(toMove[0] != n && toMove[1] != n && toMove[2] != n){ + if(next.value != n && next.next.value != n && last.value != n){ break; } } int d = j % cups.size() + 1; - cups.insertAfter(toMove[2], toMove[0], d); + cups.insertAfter(next, last, d); cups.next(); } System.out.println((System.currentTimeMillis() - mil)); From fdbbc84d33ab14d16b3dedaeee02ede10a5f71e4 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Wed, 23 Dec 2020 13:41:10 +0100 Subject: [PATCH 221/433] Remove performance profiling --- src/main/java/com/sbaars/adventofcode/year20/days/Day23.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java index 1cedfb9e..f83adb4d 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java @@ -34,7 +34,6 @@ public Object part2() { private long getSolution(boolean part1) { int[] input = day().chars().map(Character::getNumericValue).toArray(); CircularLinkedList cups = new CircularLinkedList(Streams.concat(stream(input), part1 ? IntStream.empty() : IntStream.rangeClosed(10,1000000)).toArray()); - long mil = System.currentTimeMillis(); for(int i = 0; i<(part1 ? 100 : 10000000); i++){ int current = cups.current(); int j; @@ -50,7 +49,6 @@ private long getSolution(boolean part1) { cups.insertAfter(next, last, d); cups.next(); } - System.out.println((System.currentTimeMillis() - mil)); cups.setCurrent(1); if(part1) return parseLong(stream(cups.next(8)).mapToObj(Integer::toString).collect(Collectors.joining())); int[] next = cups.next(2); From d4569b7ad40b97b985795120d54c6597a5416705 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Wed, 23 Dec 2020 13:44:18 +0100 Subject: [PATCH 222/433] Remove unused imports --- src/main/java/com/sbaars/adventofcode/year20/days/Day23.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java index f83adb4d..a69b033a 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java @@ -4,11 +4,9 @@ import com.sbaars.adventofcode.common.CircularLinkedList; import com.sbaars.adventofcode.year20.Day2020; -import java.util.*; import java.util.stream.Collectors; import java.util.stream.IntStream; -import static com.google.common.primitives.Ints.asList; import static java.lang.Long.parseLong; import static java.util.Arrays.stream; From 85df8f6d86f534b84cfafc481ea89fb233218b70 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Wed, 23 Dec 2020 14:07:33 +0100 Subject: [PATCH 223/433] Cleanup day 23 --- .../common/CircularLinkedList.java | 24 ------------------- .../adventofcode/year20/days/Day23.java | 9 ++++--- 2 files changed, 6 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/common/CircularLinkedList.java b/src/main/java/com/sbaars/adventofcode/common/CircularLinkedList.java index 52da3c9a..98a76518 100644 --- a/src/main/java/com/sbaars/adventofcode/common/CircularLinkedList.java +++ b/src/main/java/com/sbaars/adventofcode/common/CircularLinkedList.java @@ -53,35 +53,11 @@ public int[] next(int n){ return arr; } - public Node[] nextNodes(int n){ - Node[] arr = new Node[n]; - Node node = current; - for(int i = 0; i0; j--){ int n = j % cups.size() + 1; if(next.value != n && next.next.value != n && last.value != n){ From ccaefe670116702641bbb94c18ce850d57899c0e Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 23 Dec 2020 21:29:10 +0100 Subject: [PATCH 224/433] Different approach for day 19 --- README.md | 15 + .../com/sbaars/adventofcode/year20/Main.java | 2 +- .../adventofcode/year20/days/Day19.java | 87 ++- src/main/resources/2020/day19.txt | 571 ++++++++++++++++-- 4 files changed, 614 insertions(+), 61 deletions(-) diff --git a/README.md b/README.md index d87ff3ea..a7366463 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,21 @@ - [Day 8](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year20/days/Day8.java) - [Day 9](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year20/days/Day9.java) - [Day 10](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year20/days/Day10.java) +- [Day 11](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year20/days/Day11.java) +- [Day 12](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year20/days/Day12.java) +- [Day 13](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year20/days/Day13.java) +- [Day 14](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year20/days/Day14.java) +- [Day 15](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year20/days/Day15.java) +- [Day 16](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year20/days/Day16.java) +- [Day 17](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year20/days/Day17.java) +- [Day 18](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year20/days/Day18.java) +- [Day 19](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year20/days/Day19.java) +- [Day 20](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year20/days/Day20.java) +- [Day 21](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year20/days/Day21.java) +- [Day 22](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year20/days/Day22.java) +- [Day 23](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java) +- [Day 24](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year20/days/Day24.java) +- [Day 25](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year20/days/Day25.java) ### Console output ``` diff --git a/src/main/java/com/sbaars/adventofcode/year20/Main.java b/src/main/java/com/sbaars/adventofcode/year20/Main.java index 7a936660..db28f944 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/Main.java +++ b/src/main/java/com/sbaars/adventofcode/year20/Main.java @@ -8,7 +8,7 @@ public class Main { public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException, InvocationTargetException, NoSuchMethodException { - for(int day = 1; day<=10; day++) { + for(int day = 1; day<=25; day++) { System.out.println("Day "+day+":"); Day instance = (Day)Class.forName("com.sbaars.adventofcode.year20.days.Day"+day).getDeclaredConstructor().newInstance(); instance.printParts(); diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day19.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day19.java index a3f356b5..69a8a2b3 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day19.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day19.java @@ -11,12 +11,15 @@ import static java.lang.Long.parseLong; import static java.util.Arrays.asList; import static java.util.Arrays.stream; +import static java.util.Collections.singletonList; public class Day19 extends Day2020 { public static void main(String[] args) { new Day19().printParts(); } + Map> sol = new HashMap<>(); + public Day19() { super(19); } @@ -28,11 +31,14 @@ public Object part1() { private long getSolution(String inputFile) { String[] input = inputFile.split("\n\n"); - int longest = stream(input[1].split("\n")).mapToInt(e -> e.length()).max().getAsInt(); - Map rules = Arrays.stream(input[0].split("\n")).map(e -> e.split(": ")).collect(Collectors.toMap(e -> parseLong(e[0]), e -> new Rule(parseLong(e[0]), e[1]))); - Map> sol = new HashMap<>(); - rules.values().stream().peek(e -> System.out.println(e.id)).forEach(e -> e.getPossibilities(rules, sol, longest, 0)); - return stream(input[1].split("\n")).peek(System.out::println).filter(e -> sol.values().stream().anyMatch(r -> r.contains(e))).count(); + Map rules = Arrays.stream(input[0].split("\n")) + .map(e -> e.split(": ")) + .collect(Collectors.toMap(e -> parseLong(e[0]), e -> new Rule(parseLong(e[0]), e[1]))); + + rules.values().forEach(e -> e.getPossibilities(rules, sol)); + return stream(input[1].split("\n")) + .filter(e -> sol.values().stream().anyMatch(r -> r.contains(e))) + .count(); } @Data @@ -61,14 +67,19 @@ public Rule(long id, String rule){ } } - public Set getPossibilities(Map m, Map> sol, int longest, int depth){ + public Set getPossibilities(Map m, Map> sol){ if(sol.containsKey(id)) return sol.get(id); - if(!letter.isPresent()){ - Rule[] r = stream(rule1).mapToObj(n -> m.get(n)).toArray(Rule[]::new); - Rule[] orRule = stream(rule2).mapToObj(n -> m.get(n)).toArray(Rule[]::new); - Set output = r[0].getPossibilities(m, sol, longest, depth); +// if(id == 8){ +// System.out.println("hi"); +// } + if(letter.isEmpty()){ + Rule[] r = stream(rule1).mapToObj(m::get).toArray(Rule[]::new); + Rule[] orRule = stream(rule2).mapToObj(m::get).toArray(Rule[]::new); + Set output = r[0].getPossibilities(m, sol); + if(sol.containsKey(id)) return sol.get(id); for(int i = 1; i output2 = r[i].getPossibilities(m, sol, longest, depth); + Set output2 = r[i].getPossibilities(m, sol); + if(sol.containsKey(id)) return sol.get(id); Set newOne = new HashSet<>(); for(String o : output){ for(String o2 : output2){ @@ -77,10 +88,12 @@ public Set getPossibilities(Map m, Map> so } output = newOne; } - if(orRule.length>0 && output.stream().findFirst().get().length()<=longest && depth<4){ - Set outputOr = orRule[0].getPossibilities(m, sol, longest, depth); + if(orRule.length>0){ + Set outputOr = orRule[0].getPossibilities(m, sol); + if(sol.containsKey(id)) return sol.get(id); for(int i = 1; i outputOr2 = orRule[i].getPossibilities(m, sol, longest, id == orRule[i].id ? depth + 1 : depth); + Set outputOr2 = orRule[i].getPossibilities(m, sol); + if(sol.containsKey(id)) return sol.get(id); Set newOne = new HashSet<>(); for(String o : outputOr){ for(String o2 : outputOr2){ @@ -94,12 +107,54 @@ public Set getPossibilities(Map m, Map> so sol.put(id, output); return output; } - return new HashSet<>(asList(letter.get())); + return new HashSet<>(singletonList(letter.get())); } } @Override public Object part2() { - return getSolution(day().replace("8: 42", "8: 42 | 42 8").replace("11: 42 31", "11: 42 31 | 42 11 31")); +// int maxDepth = 2; +// StringBuilder s = new StringBuilder("8: 42 "); +// StringBuilder s2 = new StringBuilder("11: 42 31 "); +// for(int i = 2; i<=maxDepth; i++){ +// s.append("| ").append(i + 198).append("\n").append(i + 198).append(": ").append("42 ".repeat(i)); +// s2.append("| ").append(i + 298).append("\n").append(i + 298).append(": ").append("42 ".repeat(i)).append("31 ".repeat(i)); +// +// } +// return getSolution(day() +// .replace("8: 42", s.toString().trim()) +// .replace("11: 42 31", s2.toString().trim())); + int maxDepth = 10; + String[] input = day().split("\n\n"); + Set all = sol.values().stream().flatMap(e -> e.stream()).collect(Collectors.toUnmodifiableSet()); + Set s42 = sol.get(42L); + Set s31 = sol.get(31L); + Set s11 = sol.get(11L); + for(int i = 2; i<=maxDepth; i++){ + Set add = new HashSet<>(s42.size() * s31.size()); + Set add2 = new HashSet<>(s42.size() * s31.size() * s11.size()); +// for(int i = 0; i sol.values().stream().anyMatch(r -> r.contains(e))) + .count(); } } diff --git a/src/main/resources/2020/day19.txt b/src/main/resources/2020/day19.txt index 09629912..795498f5 100644 --- a/src/main/resources/2020/day19.txt +++ b/src/main/resources/2020/day19.txt @@ -1,47 +1,530 @@ -42: 9 14 | 10 1 -9: 14 27 | 1 26 -10: 23 14 | 28 1 -1: "a" +3: 97 29 | 2 104 +45: 97 10 | 2 73 +114: 44 97 | 90 2 +78: 2 95 | 97 32 +7: 97 64 | 2 119 +118: 97 81 | 2 58 +64: 97 29 | 2 14 +106: 53 121 +4: 2 103 | 97 55 +54: 2 53 | 97 44 +58: 33 97 | 130 2 +91: 104 97 +102: 104 97 | 83 2 +128: 2 59 | 97 3 +79: 98 2 | 124 97 +117: 2 65 | 97 92 +1: 75 2 | 115 97 +40: 2 96 | 97 119 +8: 42 +92: 102 97 | 57 2 +97: "a" +93: 2 66 | 97 103 +36: 2 104 | 97 32 +2: "b" +108: 43 2 | 68 97 +46: 44 2 | 90 97 +31: 97 5 | 2 132 +110: 14 2 | 90 97 +61: 38 2 | 9 97 +10: 63 2 | 34 97 +32: 2 2 | 97 121 11: 42 31 -5: 1 14 | 15 1 -19: 14 1 | 14 14 -12: 24 14 | 19 1 -16: 15 1 | 14 14 -31: 14 17 | 1 13 -6: 14 14 | 1 14 -2: 1 24 | 14 4 +103: 121 121 +131: 75 97 | 60 2 +74: 2 112 | 97 47 +20: 93 2 | 69 97 +53: 97 2 | 97 97 +23: 125 121 +9: 97 66 | 2 25 +101: 83 97 | 95 2 +35: 25 2 | 104 97 +76: 97 55 | 2 104 +125: 83 2 | 32 97 +22: 59 97 | 76 2 +127: 6 97 | 55 2 +126: 97 119 | 2 17 +113: 59 97 | 35 2 +81: 46 2 | 72 97 +104: 2 2 | 97 2 +100: 25 2 | 95 97 +95: 97 2 +132: 97 27 | 2 45 +107: 97 90 | 2 32 +34: 98 97 | 50 2 +33: 2 95 | 97 83 +119: 32 97 | 66 2 +90: 2 2 | 97 97 +77: 126 2 | 22 97 +6: 2 97 +14: 97 2 | 2 121 +94: 2 110 | 97 129 +21: 56 97 | 105 2 +65: 2 96 | 97 98 +122: 2 71 | 97 86 +87: 101 97 | 91 2 +15: 107 97 | 120 2 +120: 103 2 | 66 97 +56: 128 2 | 20 97 +129: 2 66 | 97 83 +41: 97 48 | 2 122 +13: 39 97 | 26 2 +30: 97 88 | 2 54 +84: 55 97 | 53 2 +86: 84 2 | 59 97 +96: 55 2 | 104 97 +83: 97 121 | 2 97 +50: 53 97 | 95 2 +19: 2 70 | 97 78 +121: 2 | 97 +57: 53 2 | 83 97 +37: 6 97 | 6 2 +68: 97 53 | 2 83 +112: 97 23 | 2 19 +66: 2 97 | 2 2 +49: 97 90 | 2 103 +80: 2 97 | 97 97 +85: 83 97 | 55 2 +12: 2 35 | 97 51 +116: 97 67 | 2 77 +123: 4 2 | 85 97 +82: 21 2 | 111 97 +105: 30 97 | 87 2 +72: 25 97 | 95 2 +115: 104 2 | 29 97 +63: 97 37 | 2 36 +42: 24 2 | 82 97 0: 8 11 -13: 14 3 | 1 12 -15: 1 | 14 -17: 14 2 | 1 7 -23: 25 1 | 22 14 -28: 16 1 -4: 1 1 -20: 14 14 | 1 15 -3: 5 14 | 16 1 -27: 1 6 | 14 18 -14: "b" -21: 14 1 | 1 14 -25: 1 1 | 1 14 -22: 14 14 -8: 42 -26: 14 22 | 1 20 -18: 15 15 -7: 14 5 | 1 21 -24: 14 1 +70: 2 80 | 97 25 +5: 2 74 | 97 116 +52: 16 97 | 94 2 +62: 35 97 | 114 2 +18: 123 2 | 61 97 +25: 97 97 +88: 83 97 | 66 2 +124: 2 6 | 97 80 +89: 114 97 | 100 2 +44: 97 2 | 2 97 +71: 49 97 | 106 2 +38: 2 104 | 97 90 +75: 53 2 | 104 97 +98: 53 2 | 25 97 +69: 97 95 | 2 95 +73: 2 1 | 97 7 +24: 41 97 | 109 2 +48: 2 40 | 97 113 +39: 103 2 | 104 97 +67: 2 15 | 97 62 +55: 2 2 +47: 2 79 | 97 108 +51: 6 2 | 95 97 +17: 95 2 | 90 97 +59: 53 97 | 66 2 +28: 2 12 | 97 131 +27: 2 52 | 97 28 +29: 97 97 | 2 121 +16: 4 2 | 127 97 +109: 2 117 | 97 18 +43: 104 97 | 6 2 +99: 97 89 | 2 13 +130: 83 121 +111: 99 2 | 118 97 +60: 97 44 | 2 25 +26: 121 44 -abbbbbabbbaaaababbaabbbbabababbbabbbbbbabaaaa -bbabbbbaabaabba -babbbbaabbbbbabbbbbbaabaaabaaa -aaabbbbbbaaaabaababaabababbabaaabbababababaaa -bbbbbbbaaaabbbbaaabbabaaa -bbbababbbbaaaaaaaabbababaaababaabab -ababaaaaaabaaab -ababaaaaabbbaba -baabbaaaabbaaaababbaababb -abbbbabbbbaaaababbbbbbaaaababb -aaaaabbaabaaaaababaa -aaaabbaaaabbaaa -aaaabbaabbaaaaaaabbbabbbaaabbaabaaa -babaaabbbaaabaababbaabababaaab -aabbbbbaabbbaaaaaabbbbbababaaaaabbaaabba \ No newline at end of file +abbbbababababbaabbbbbbab +bababababaabbbaaaabaabaaaaabaabaaabbbbab +baaaabbbabbbbababbbbaabababaaababbaaaabbbbabbbbb +abbababaaabbabbaabaaaaaaaaaabaabaaabaabb +aabbaababaabbabbaaabaababaaaabab +baabaaaaabbabaabaaabaaabbaaabbabbaaabbbbbabbbaba +babaabaaabaabaababaabbab +bbbbbababbbaaaababaaaaabbaabaaba +bbaabaaaaaaabbabbababaabbabbaaaa +aabbababaaaabababbbbaabbaaabbaba +bbaaababbbbaababbbbabababbaaabaaaaababba +bbbbababaabbbabaabbaabbaaaaabbbabbbbbbbbbaaaabaabbbaaababbaaaaababbbabbabbabaaab +bbbabbbabbaaabaaabaababbbaabaabaaabbbbba +abbbbbabbaabbbbbbaaaabbbbaaaaabb +aabbababbabbababbbbbaaabaababbaabbaabbaa +bbbbbabaaabbaaaaabaaabbbabbaaaba +baaabbbbbaabbaaabbbaabaaaaaabbbbaabaaaab +bbabbbaaaabaabbaabbbabab +bbbbbabbbabbbababbabaabaabbbbaab +aaaabbabbbababbabbaabaaaaabbbaaaabbabbababbbaabbbbbbaaaa +bbaabbabbaaabbabababbbbbbbbbabbbaabaaaaaabbababbbbbaaaba +bbbaabbbaaabbaabbbbbbaaa +bbabbabbbababbbbababbbaa +baabbbabaabaaabaabbbbbbbaaabbaaaabbababa +aabbaabaabaabbbabbbbabaaabbabbbbabbabaabbbabbbaababbbbba +aaabababbbbaaabbbaaaaaabaaaaabaabaabababbbbabaaaabaaaaabbbbbbbba +babaaabaaabbbabaabaaabbbababbabbbabbabaaaaabbaba +aabbaaaabbbbbabbbbaaabbbaabaabbbbbaaabbbabaabbbbbbbababaabbaaabbabbaaaba +aaaabababbaabaaaaaaaaaba +babbbbaababaaaabbbabbbabaaababaaabababaaaaabbaababaaaaba +abbbabaababababbabbaaaab +babaabbbbabababaabaaaabbbababababbaaaabbaabbabba +bbabbababbbababbabbaaabb +bbabababbbbababbbbbbaaaa +bbaaababaaaababbbabbbaba +aabbbabababbababbababaaaababbaabbbabbaabaabbabbbbaaaaabb +bbbbbababbaabbababaabbbbababbbaabbbabbba +abbbbaabbbaaababaaababaaababbbbbbbaaaaaabbbaababaabababb +baaaaabbbaabaaabbbbbbaaaaabbaabaaabbaaaabbbbbbbbbbaaaaabbabbbababbabbbba +abaabbbaaabaabbbbaaabbababaabbab +abbbbababbbbaaababbbbbabbababbaaababbabaabbaabbb +babbababaabbbaaabaaabbabbbbaabaabaaaabbbabaabbaaabbbbbba +babbabaabaababbabbaabbbbbaabaaabbaabaabbbbaaabbaaabababb +babaaaaababbbaaabbabbabb +baabaaabbbbababbbabababbabbabaabbbaabababbbbbbabaabaaaab +aaaaabbbaababaababbbbababbbabbaaabbbabbbabbaaabbababaabbbaaabbaaaaaabbaa +bababaaaabbbbbbbababbbababbbbbaabaabbaab +baaabbbbaaaaabbabbababaaabbabbab +aaaaabbbaabbbaaabaaaaaabbabbbbbb +aababbaabbbabbaaabbbbabbaaaabbbb +aabbababbbbbbaabbaaaaaaaabbbbaabbbabaabb +bbbbbaabbbbbabaaabbbbbaa +babababaabaaaaaabbaaabbaaaaabbbaabbbbbababaaababbbabaaabbaabbabb +bababababbaaabbbababaabb +bbabaababbaaaaabbabbbaaabbbaaaababaaaaaaaabbbbab +bbabbbabbbbbabaabbbabaaa +aaabbbaabbaaaaabbbabbabababababbabbababb +aabbaaaabaabaabbbbbbaabaaaaabaaabaabbaab +aaaabbbabbbbaaababbabbab +abbaaaaabaabbbaaaaabbbbbbbababaabbbbaabbabbbababbaaaabaa +aaaabbbababababbbaaababaabbabbbabbabbbbb +baaaaaabbaababbbabbaabaa +aaaabbbaabaaabbbbaaaabbababaaabaaaabbaaabbababaa +bbaaaaabbabbaabbbabbbaba +aaaabbbababababbababbaababaabaabaaabbaab +baaaaaababaaabbabbabbaabaaaabbbb +bbbbaaabaaabaabaaabababaabbabaabbbbaaabb +aaabbababbbbaabbbbaababbaaababba +aabaabaaaaaababbbabbaaaabaaaaabaabbabaaabbabaaabaaabbbababaaabaa +aabaaabbabbabbbaaaabbbab +bbaaaaaabaabaaaababbaaaaaabaababbbbbbabbbabbbaaabbbabbbbbabbbaab +bbbbabaabbabbaaabaaaaaaabbbaaaabaaaabbababbaabbbbbabaabaaaabbbbaaaababaa +aaababaabaababbabbaabbbbbbbabaabaaaabaaabaaabbabaaaabaab +ababababbbbbbabaababbbabbbbaaabbabbababaaaabbbba +babbbbabbaabaababbabbbaabbbaabbbbaabbaab +aabaaababbbbaaabbabaabbaababaababbbabaab +aabaaabbbbaabbbbbbbaabbababbabaabbaaabaa +abbbbbbbaabbbaabbbabbbabbababbaabbababbb +aabababababaaaaabbbababbbaabbbba +aaaababbabaaaabbaabaabbaaaabaaaa +bbbbbabbababbaaaabbbbbabbaabaababbbbbaaa +aabbaaaababbbaaaaaaabbaa +aaaaaaabaabaaabbabbaaaaa +babaaababbaaabbabaabbbbbbaaaababbbaabaab +abbabbbaaaababbbababbbabaabaababbbababab +baabbbaabbabbbabaabbbaaabbaaaabbbbaaabaaabbaabbb +babaabaaaaababababbbbabbbabaabaaaabaaabaababababbbaabbbabbaaaaaababaaaab +aabaaabbaababbaaabbbbbaa +aaababaaaaaaabbabbbbbbba +ababbbabbabaabbabbabbbbababbaabbaabababb +baabaaabbaaaaaabababbaababaaabaaabbbbbbbbaabababbbbabbba +bbababbababbababbbaabbbbbbbababbabbaaabbbbbbaabbaababbba +ababbaaaaaabbbaaababbbaa +ababbaabababbaabbaabbaba +aaaaabbabbabbbabbbaaabbbababababaaababbabababbabaaabbbabbbaaaaba +aabaabaaabbbbabbababbaababaabaaabaababab +bbabbaaaaabbbabababababbababbbaaabbbaaaababbbabbbbbbbbabaababaaa +aabaaabbbbbbababaaabaaaaaababbaaabaaabaaaabaabaabababaabbbbaaaaabbbabaaa +aaabaabaabaabbbabbbbabba +aaabbbaabaabbbabbbababbb +bbbbbaababbbbaabbbabbaabbbbaaaaa +baaaabbbbbabbbababaaaaababbbabab +bbaaaaabbaabaabbaabbaaaaabaaabaaaaababbbabaababa +babaabbaabaaabbabaababbaababaaaa +abbbaababaaabbababbbbaabaaababbbbbbbbbab +abbbbbbbbbaaabbbaabbabaa +baababbabaaababaababbabababbbbabaababbbaaaabaabbabbaaabb +bbababaabbaabbbbbabaabaababbabba +bbbaabaaababababbaabaaba +aaabaaaaaaaaabaabbabaaabbbaabbab +aaaaabbaababbabababaabaabbbaaaaa +ababbabaaaaaaaaabaabbbaaaaaaaaabaaaaaaaababbaaaa +aabaabababbaababaababbabbaabbaabbbaaaabbababbabbbaaabbba +babaaaaababbaabbbbbbabaabaaababababbbabbaabbaaab +bbabbbabbbbaaaabaaaabbaaabbaabaabaaaabaa +baababbabbabbbaabaabbaab +babaabbbabaabbbaabaaabaaabaaabab +abaababbbababbbaaaaaabbababaaabbbaaabbbb +aaaababbaabaabbabbaaaaaa +baabbbbaabababababbbbaaababbaaaabbbbaaababaabbaaaaabbbbbaabbabbbbbaaaaaa +bbbbaaabbabbbaaaaabbbbba +aaabbbaaaabababaababbaabbbbabaaa +baabbbbbbaabaabbbababbaabbbabbabaabbbbab +baaababbaabaaabbbbbaaaaaaabbabbaaaaabaab +ababbabbabbbbbbbabababbaaaabababbaaabbaa +baaabbbababaabbbbaaaaabb +bbaabbbbababaabaaaaaaaba +aabbbabbbbabbbabbbbbabba +abbabbbbaabaaabaaabaabab +aaaaaaaaaaabaababbaaaabbaabbbaabbbbabbaabbabbabbababbbaabbaababbaaaaaaba +abaabbbbaabbbabbabbbbabaabbabbab +bbaabbabbbabbbbaabbbbaabababbbbaaaaaabbabbabbbbb +bababaaabaabbbbbbbaabbbaaaabbbab +abbbabaabaabaabbbaabbababbbababababbbabb +ababaabababababaababbbabbababaabbabbbaababababbb +baabbbbbabaabbbbabbbabab +ababbabbbabababbbbabbaaaaabbabbb +baabbabbbbaabaaabbabbaabbbabaabb +babababbbabaabbaabbbbbba +abaaaaabbbababaaaabaabbbaaaabaab +baaaaaabbabbababbaababbbbaabbabbaabbbbab +abbbabaabbaaababaabbbaabaababaabbababbabaababbba +bbabababaabbbbaaaabaabaaabaababbaabaaaaababbbbabbbaaaaabbabababaaabababababbaabb +aaababaaababababbbbbbababaabbabbabbbbabababbbaba +aabaabbbaaaaaabbbbbaababbabbbbba +bbabbbabbbaaabbbabaabbbababbababbbbaaabaaaaaabaabaaabaabaabbbbaaabbbabab +bbaabbbbbbaabbbbbaaababaaababbabbaaaabba +ababbbbbabbbbaabaabaabbaabaabbab +bbabbbaaaabbbaabbbababbaaaabbbba +baabbbbbababbabababbbaababbabbbaaaaaaaba +abbabbbaaabbbaaabbabaabababbabaaabbaaaaaaaaabaabbbabbbbb +aaabaaabbaabaabbbaababaabababbbbaabaaaab +baabbbaabaabaabbaababaabbbaaabba +abaaabbbbbbbabaababaabaaababbbbaaababbaaaabbbabaabaaaabababbbbbbabbaabab +abaaaabbaaaaaaabbbbbabaaababbabbabaaabaabbaabbba +bbaabbabbbbaabaabbaabbaa +abbbbababaabbbaabbbbbabaababbbaabbbbbaaa +babaaaaabbbbbbbbbbbbbababbbaabaabaaaaaabbbabaaabaabbabaa +bbaaababbabaabbabaabbbbbbababaabaabababbbabbbbba +baaaaaababbabaabaaaababaababbaabaaaaabab +aabaaaaabababaababaaababaaaabbabaabaaabaabbababbbaaabaaabaababaa +babababbababababaaababbb +aaabaaabbbababaaaabaabbabaaabbbabaaaabab +abbabbbaaaabbbaabbaaaabbbabbbabbabaabbaa +bbbbbabbabaaabaabbababaabaabbabbbabbaabbbbbbabbbabbaaaaa +bbbbbabaaabbbabaababbbbbabaabbbbbbaaaabbbbbaabbbabaaabab +bbabababbababaabababbbbbbbbaaabbabbaabbb +aaaaaabbbbbaababbbaaabaabbbaaaaa +aaababbabbabbbaababbabbaabbabaabaaabaababbbabbabbbbbbbbbaabaaaab +abbbbbbbbaaabababaaaaaabbbabbabb +babaabaabaaabababaabbabbbabaabaabbbaabaabbabbbaabbbabaaa +bbaabbabbbabaaabaaaaaabbbbabaaab +baaababbababbaaaabbbbbba +baaababbaaaabaaaaababbaabaabbbbbabaaaaababbaabaaaabbbbaaaaabaaaa +aabaabbbbababaaababbabaabaabbaaabbaaabbbbbbbbbbbabbababb +aabbbaaababaabbabaabaaaaaabaaabbbabbaaabbababbbbabaababb +baaabbabbaaaabaaaabaaababbbbabaaaaabaaba +ababbaabbaabbbabbabbababaaaabbbbaabbabba +abaabbbbbababaaabaababab +baabaaaaabaaabbbaabbaabbaaabbbbb +bbbbbbaaaaabbaababbabbabbbbbbbaa +abaaabaabaabbbbbbabababbbabbbaaaabaabbbaabbbabbbaabaaaaa +bababbaabaaabbababaababb +bbbabaabbababbaabbbabbaababbbbbbbbbbbbab +bbbbbbbbaabaabbaaaabaaabbbaaabbbbbabbbbb +abbabbbabbbbbaabbbaaabbbbaabbbaaabaabbbbbabbabbb +baaabaaababaaaaaaabbbabbbaabbaaababbbbbbbaaaabba +abaaabbaabaabbbabbaaabbbabaaabbbaababaaa +aaaaabbbaabaabbabaabbbbbbbaabbaa +aaaabbbaabbbbabaabbabaaaaaabaabb +aaabaaabaaabaaabbaabbaaababbbbabbabaaaab +aabaaabaaabababaabaaabaaababbaaa +bbbabbaabbabaababaaabbbabbbbaabb +bbaabbbbbaaabaaaaaaaabbaaaabbbbb +abbbabbaababbbbbbbbabaaa +bbbababbababbbabaabaabba +babbbaaababaabbbbbababababbbabaaabbbbaaa +abaaaaabbaaaaaabbabbabbb +ababaababbbbbabaaababbab +abbbabbbaaaaaaababbbaaaa +babaaaaabbaaabbbabbabbbbaabbaaaaabaabbabaaabbabb +babbaabbbbbbabaaabaaabbaabaabaaabababbba +ababbbbbaaabababbbbabbaaabaaaaaa +bbaaaabbbaabbbaababbbbbb +abaabbbaabbbbbbbaaabababbbbbababaaaabbaa +abaaabaaabbabbbbbabbababbabbbaabaaaaaabaaaaaabaabaababab +abaabaabbaaabbbbbbbbbabbaaabababbbaabaaaaaaaabab +aaabbbaabaabbbbbbabaabbabbbbaabb +bababaaabaabbbaabbaaabbababbbaabbbbabaababaabbaababaaaab +aaabaabaaababababbabbbbb +bbbababbaabbbaaaaabbbaabbababbba +baabbbaaabbabbbbbbbbabaaabbbbaabbababbbb +baabaaaaaaabababaaabbbab +babababbaabbbabaabbbbaaa +babaaababbaabbbbbababaaaabbbaababbaaabaa +aabbbabbbabbababaaaabababbbaabba +aabbbaaabbabaabbbbbbabbabbbbbbaaaababaaaabbbaaabbaabbabaabbbabaaababaaaa +ababaabaaaaababbbaaaaaba +bbabbbbaababaababbabbaabbbabbaaaaaaaaaababbbbbbabbabaaababbbbaaabbabbbbb +bbaabbabbaaabaaaaaabbbaabaababbbbaababbabababbababaabaaa +bbbbbaabbababaabbbabbaabbbababaabababbab +baaabbabaababbaaaaabbbaabbbbbaabbabbbaaaabbaaaabaabbbbaa +aababababababbaaabaaaaababbabaabaaaabbbaabaaabaaabbaababbbbabbbbbbbaaaaababbbbab +aaabababaabaaabbaabaaabbaaabbabbaabbaaab +baaabaaabbbbbbbbaaaaaaba +abbbabbbbbbbaababbbabaaa +babababbbbbbbabbaabaabbababbbbba +aaaaabbaaabbbaababaaabbbaabbbbab +bbbaaaaaabbabababaabbbaaaaaabbaaaababbbaaaaabababbabaaaaaaaaababbbbbbaabbbabaaab +aabaabbabababbbaabbaabbbbbabaabbbbabaabb +aaaaaaababbbabbbbababaaababababbaabbbaaabbbabbba +babbabaababbaabbbaabaaaabbaaaaababaaabaabaabbaab +abbbbbbbabbbbabbaabbbaaaabbbbbaa +bbaaaabbbaaabbbbbbbbabbb +aaababaababaabbbababbabbabaabbbabaabbaaabbbbbaaa +bbbababbbaabbaaabbabaaaababbbaaabbabbaba +abbabbbbbbbbbaabaabbaabaababbbaa +baababbabaaaaaaaaabbbbaa +baaabbabaabbbbbbaaaabbabbbbaaabb +bababbaabaabbaaabaabbabbabababbb +bbbbbababbbabbaabaababab +aaaabbababbabbbabbbbbbbbaaabbaab +bbababbaaababbaabbbbbbbbaaaaaababaaaaaba +ababbababaabbabbaaabaaaa +bbabbbaaaaaabbabaaaaaaabbbabaababbbbbbaababbbaba +aaaaabaaababbbaabbbbabba +ababbbbaaabbbbbbbaaaabbbbbaaabbbbbbbbbaa +babbaaaaabbbabbbaabbbababaaaaabaaaabaababababbab +baabaaabbabababbbbbaabbabbbbbbabbbbbbbaa +bbabbabaaaaababbaabaabaaaabbabbabbaaaaaa +aabbbababaabbabbbabaaabaabbaaababbbbaabb +aabbbaabaabaabaaaaaababbbbbababa +abaaaaaaabababbbaaabbaabaaabaabb +abbbbabbaaaaabbbababbabbbabbbaaaabaabbbbabaabbbabbbaaaba +aabbbaaaaaabbbaaaaaaabbbbababaabbbaababaaaabbaaaababaabb +aaababaaababbaaaabbbabaaabbababb +baaabbbabaaaaaababbbabbbbbbbababbbaabaabbabbabbababbbbabbbabaaab +bbabbabaaabbababbaabbbabaabbabab +abaabbbabbbbabaabbbaabba +babaabbbababaababaabbbbbaababbba +abaabbbbabbbabaabbababbb +baaabaaaaaaabaaabbbbbaabaaaabbbb +bbaaabaaababbaabbbaaababaaaabbbbabbaaabaaaaaababbabaaaaa +babbabaaaabbababaabbbaaaabaabbbbbbbaabab +bbabaabaaababaababaababb +aabbaaaabaabbbaabaaababaabbbbbabbbabbabaaaabaabb +baabbbabbaabaabbabaabaabbaabbbbbabababaa +abaabbbaabbaabbaaaabbbbababaaabb +bbbbaaabbbbbbabaaaaabaaabbbabbab +ababbbbaabbbabaabababbbabbababbaaaabaaabaaabaaaabbaaababaaaabbaabbbbaaaa +bbaabbababababbaaabbabbb +babaaababbaaaabbaabbbbab +bbabbbaabaabbabbaabbaaaaaabbbaabaaabbbab +abaabbbbabaaaabbaabbababaaaababaabaabbbabbaababbbbbaaaba +abbbbaabbbaaababbbabbbaaaaaaabaabababaaababbaabb +aabbbabbaaabaaabaabbabba +ababbabbababbaababbbbabaabbbaaab +ababbbbaabaaaaabaabbaaab +babbbaababababbaaaabaaabbaabaaaabbaabaaabbaaabbaaabaabababbaaaba +bbbbbbbbbaabbbababbaabba +aabbababbaabaaaaababbbaa +aabbbbbbababaabaaabaaabbbbabbabaaaaaababaaabbbba +aabaabbaaabaabaabbbaabaaaaaabbbb +abaaaabbbbbbaaabaaaaabaa +baaabbbbbabbabaaababbbaa +baaababaababaaababbaaabbabaabbba +ababaababbabbbabababbababbaababb +baaaaabbbaaababbbabaaaabbabbbababaaababbaaaababbbbaaababbaabababaababaab +baabaaaabaaababbbbabbbabababbabababbabba +aabbbabbababbabbaabbaaaaaabbbbaa +aaaaaaabbbbbaaaabbbabbabbaabababbbaaaaba +aabbbbbbaaaabbbabbbabaaa +aaaabaaaabbbbbbbbbaabbaa +baaaabbbabbbbabbbbbababa +ababaabaaabbaaaaabaabaabbbbbaabb +babaabbbbabbababbbbbabaaaabbaaabbbbaababaabbaaabbbabaabb +baabbbbbbbabbbbabaabbbba +aaababaaababaababbaaababbbababbaabbbbbabbbbaabbabbbbbbab +baaababbbbaabbbbbbaabaaabbbaabbb +baabaabbaaaaabbabaaabbababbaabbb +bbabaaaabbbababbaabbbababaaabbabbbaabbabaababbabbaaaabab +baabaaaabaaabbabbabbabaabbabbbababbbbbababaabaababbbaaaababaabab +abaaabbabaaabaabbbaaaabababbbbaabaaaabba +aaaaaabaaabaaabbaaabbaaaaabbbaabaabbaaaaaaababaa +bbbbabaaaababbaabaaabbaa +ababababbaaaaaaaaaaaaabb +aabbaabaaaabbaababaaaabaabaabbabaaaaabaabbbabbba +aaaababababbababababbbaa +abaaaaaababbbaabaaababbaababbaabbabbabababbbabbabbabbaab +bbabaabaabbbabaabaaabaaababaabbbabaaaabababbaabaaabbabaa +baabaaaabababaaabbbababa +aaaababaabbabaababaaabab +baaaaaaaaabbbabababbabba +abaababbbabbbaaaaaaaabbbbaaabababaababaaabbbbabaabbbaaaaabbaaaababbaaabb +ababbabbaabaabbbababbabaaabaabab +aaaaaaabbbabaaaababaabbaabbababa +bbbabaabbbbbabaaaaaaaaabbbbaabaabbabaaabaabbaaab +ababbabbaabaaabaababababaaaabbbb +aaabaaabaabaabaaaabaaabaaabaabab +abaaabbbaabbbbbbaaaaabaa +bbababababaabbbbbbbbbbbbababaaabaaabbaba +babbabaababababbabbbbbbbbaabbabbaaabbaab +aaabbbbabbbbbbbababaababbabbaaaaaaababbb +bbaaababbbaaabbbababbabbbbbbbbbbaabbabba +babaaabaaabbbabbaaaabbabbaaabaab +babaaaaaaabaabbbabaaabab +baaabbbbababbbbbbabbbaabbabaaaab +abababbbababbaaabbaaabababababaaaabaaabb +babaabbbababaabaabaabbbb +baabbaaaaaabbbaaaabababaaabbbaabbbbaabbababbbbab +bbababaaabaaaaabbabbbaaaaaababbb +bababbaababababbbbbbaabb +babbbaaababbbaaababababababbaaabbbaabaab +aaaabbbabbaaabbbbaabbbbbbbaabaaabaaabaab +baaaabbbababbaaaaabbbabbbabbbabbbabbbbab +bbabbbabaaaaabbbbabaabbbabbabbaa +abbbbaababaababbbaaabababbbbaabababaaaaabbabbbaaaaaabbaaabbbbaab +ababbbbabbabbbaaaabbbaaababaabaabaababbaaaaabbbbaaaabbbbbabaaaab +bababababaaababaababbabbabaabbaaaaabaabb +bbaaaabbabbabbbabbaabaaaaaaaabbbaaaabbababbabbabbabbbabaabbbaaabaabaaaab +bbaaabbbbaaaabbbbabaaaaaabbbaabb +babaabbaaaabbbaaaaabaaababbbabbaabbbbbabaaabbababbaaaababbbaaaaa +ababbabbbaabbbaabaaaabaa +aabaaabaaaaaaaaabbbbbaaa +baabaaabbabaabbbababbabbbababbab +abaaabbaaaaaabbabbaababa +babbabaabaaaabbbbababbab +aaabbbaaaabbbabbababbaaababababbabbbaabbabaababb +aabaaabaaabbbabaabbaaabb +abaaaabbbaaabbbaababbbbabaababab +bbababaabbbbaaabaabbbabbabbbaababbabaaab +abababbabbabbabbaabbabaabbaabbaa +abaaabbbababbbabbbaababa +ababbbabababbabaaaaabbbaabbababa +baababbabaababaabbaaaaaa +bbbbbaabaaababababaabaaa +babbaabbaabbbaaaabbbabbaabbabaaabbabbabaaaaaaaaababbbbaaaabaabab +aabababaababaabababbbaaabbaabaaabaaaabab +bbabaabababababbbabbbaba +aaababbbaabaabaabbaaaabbbbabaaabbbaababb +baaaabbbbababaabbabababaaabbbbbbaaabaaaa +abbbbabbaabbbabbabababaa +aabbbaaabbbababbbbaaaabaabbbaabb +ababbbabaababababaaaabab +bbaaabbabbabbbaaabbbaaaa +bbaabbbbabaaabbaabababbb +abbbaababbaabaaaaabbaaaaaaaaabaa +baabbabbabaaaaabaaabaaaa +aaabababababbbbabbbbbabaabababaa +aaaaabbbaabaaabbbbbabaabaaaabbaa +aaaaabbbababbbabbababbba +ababbbabababbaabbbaaaaabbbbbbbaa +bbbaaaabaababaabbaababbaabababaa +baaaaaabbbbaaaababbabbaa +baabbabbbbababaaabbabaababbbabbaabaaaaababababbb +abaaaaabbbbaaaababbabbaa +abbabaabbaabbbaaaabbaabbaabaabaaaaababbabaabbabababaabaabbbbbbbbbaaaaabbababbbba +aaabaaabbbbabaabbaababaaabbbbbabbaaaaaaaaababaaaaaababbabaaabbaa +aaaaaaabbaabbaaababbbaababaabaaababbbbaa +bababababbbbbabbaabababbbaaabaaaaaaaaaaaaabbbaaa +babababaaaaabaaabbaaabaa +abbbbabbbababbaababbbaabbababbbb +bbabbbabaabaaabaabbabbbbabbaaaaabbbabbba +aabbaaaabaaabaaaabbbbabaaaaaaaba +baabbbbbbaaabaabababaabaababaaaaaabbaaaabbbbaabbabbabbaa +bbaaaabbbbaaabbabaaabaab +bbbbbababaabbaaabbbbbaba +bbabbababaabbabbaaaababbbbbbbabaaaaaabaa +aaabababaabaabbbabbbabbaaaababaabbbabaaabbabbbbbabaaabab +bbbabbaababbababaaaaaaba +bbbbbababbabbaabbbbaaaba +aabaabbbbbabaaaabbaaababababababbabaaaab +baaabbbabbbababbabababaa +bbaaababbabaaaaaabababbb +bbabbaababbbabbaaaababbb +bbabbbbaabababbababaaaab \ No newline at end of file From dba8ff64cf9db83734d9607599fa0d143d0deba5 Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 24 Dec 2020 06:47:52 +0100 Subject: [PATCH 225/433] Day 24 --- .../adventofcode/common/HexDirection.java | 52 ++ .../adventofcode/year20/days/Day19.java | 2 +- .../adventofcode/year20/days/Day24.java | 71 ++- src/main/resources/2020/day24.txt | 539 ++++++++++++++++++ 4 files changed, 660 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode/common/HexDirection.java diff --git a/src/main/java/com/sbaars/adventofcode/common/HexDirection.java b/src/main/java/com/sbaars/adventofcode/common/HexDirection.java new file mode 100644 index 00000000..2e00c9e4 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/common/HexDirection.java @@ -0,0 +1,52 @@ +package com.sbaars.adventofcode.common; + +import java.awt.*; +import java.util.Arrays; +import java.util.Optional; + +import static java.lang.Math.abs; + +public enum HexDirection { + NORTHWEST(1, "nw"), EAST(4, "e"), SOUTHEAST(2, "se"), WEST(3, "w"), + NORTHEAST(4, "ne"), SOUTHWEST(5, "sw"); + + public final int num; + public final String code; + + HexDirection(int num, String code) { + this.num = num; + this.code = code; + } + + public static Optional get(String code) { + return Arrays.stream(values()).filter(e -> e.code.equals(code)).findAny(); + } + + public Point move(Point currentLocation, int amount) { + switch (this) { + case EAST: return new Point(currentLocation.x+(amount*2), currentLocation.y); + case WEST: return new Point(currentLocation.x-(amount*2), currentLocation.y); + case SOUTHWEST: return new Point(currentLocation.x-amount, currentLocation.y+amount); + case NORTHEAST: return new Point(currentLocation.x+amount, currentLocation.y-amount); + case SOUTHEAST: return new Point(currentLocation.x+amount, currentLocation.y+amount); + case NORTHWEST: return new Point(currentLocation.x-amount, currentLocation.y-amount); + } + throw new IllegalStateException("Non-existent Direction: "+this); + } + + public Point move(Point currentLocation) { + return move(currentLocation, 1); + } + + public HexDirection opposite() { + switch (this) { + case EAST: return WEST; + case WEST: return EAST; + case NORTHEAST: return SOUTHWEST; + case SOUTHWEST: return NORTHEAST; + case SOUTHEAST: return NORTHWEST; + case NORTHWEST: return SOUTHEAST; + } + throw new IllegalStateException("Non-existent Direction: "+this); + } +} \ No newline at end of file diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day19.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day19.java index 69a8a2b3..8ee2fb0b 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day19.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day19.java @@ -126,7 +126,7 @@ public Object part2() { // .replace("11: 42 31", s2.toString().trim())); int maxDepth = 10; String[] input = day().split("\n\n"); - Set all = sol.values().stream().flatMap(e -> e.stream()).collect(Collectors.toUnmodifiableSet()); + Set all = sol.values().stream().flatMap(Collection::stream).collect(Collectors.toUnmodifiableSet()); Set s42 = sol.get(42L); Set s31 = sol.get(31L); Set s11 = sol.get(11L); diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day24.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day24.java index 539ab8f9..f3404144 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day24.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day24.java @@ -1,24 +1,89 @@ package com.sbaars.adventofcode.year20.days; +import com.sbaars.adventofcode.common.HexDirection; import com.sbaars.adventofcode.year20.Day2020; +import java.awt.*; +import java.util.*; +import java.util.List; + +import static java.util.stream.Collectors.toList; + public class Day24 extends Day2020 { public static void main(String[] args) { new Day24().printParts(); } + Set visited = new HashSet<>(); + public Day24() { super(24); } @Override public Object part1() { - String input = day(); - return input; + var input = Arrays.stream(dayStrings()).map(this::read).collect(toList()); + for(List dirs : input){ + Point pos = new Point(0,0); + for(HexDirection dir : dirs){ + pos = dir.move(pos); + } + if(visited.contains(pos)){ + visited.remove(pos); + } else { + visited.add(pos); + } + } + return visited.size(); + } + + public List read(String dirs){ + List res = new ArrayList<>(dirs.length()); + while(dirs.length()>0){ + Optional direction; + if(dirs.length()>1 && (direction = HexDirection.get(dirs.substring(0,2))).isPresent()){ + res.add(direction.get()); + dirs = dirs.substring(2); + } else if ((direction = HexDirection.get(dirs.substring(0,1))).isPresent()){ + res.add(direction.get()); + dirs = dirs.substring(1); + }else { + throw new IllegalStateException("Panik!"); + } + + } + return res; } @Override public Object part2() { - return 0; + for(int i = 0; i<100; i++){ + Set newPos = new HashSet<>(); + Set checkedPos = new HashSet<>(); + for(Point p : visited) { + addNeighbors(visited, newPos, checkedPos, p, true); + } + visited = newPos; + } + return visited.size(); + } + + public void addNeighbors(Set pos, Set newPos, Set checkedPos, Point p, boolean active){ + if(!checkedPos.contains(p)) { + int neighbours = 0; + checkedPos.add(p); + for(HexDirection dir : HexDirection.values()) { + Point x = dir.move(p); + if (pos.contains(x)) { + neighbours++; + } else if (active) { + addNeighbors(pos, newPos, checkedPos, x, false); + } + } + if((active && (neighbours == 1 || neighbours == 2)) || + (!active && neighbours == 2)){ + newPos.add(p); + } + } } } diff --git a/src/main/resources/2020/day24.txt b/src/main/resources/2020/day24.txt index e69de29b..30438c4d 100644 --- a/src/main/resources/2020/day24.txt +++ b/src/main/resources/2020/day24.txt @@ -0,0 +1,539 @@ +swswswswseswswseseswswnwsesw +nwewsewneswenwesenesenw +neeeenwseseewwnenenesweeeeene +seseewnwseseseneswseeseseseesesesese +swseswswswswswswswswweneswswsw +seswsesesenwsesenesenwseseseseseseseesew +nwneenwneswnwneneneseneswnwnewnwsenene +wswswwwswswsewneswnwnwsenwswswewesw +eeseeneeneeeneew +swnewnwneneeneneseneneneneneneenenenene +seewswnwseneswnenenwww +eneneswnenenwnwwneneneseneneneswneswne +nwewswesewseseeewneseseseseeese +enwsenesweswwsesewsesesesesewnewsene +wseeseseseseseseseseswsesenesesesesesese +nenewnenenesenwsenewneneneswneesw +eseeneseneesesesesweseseeseewsewe +nenenenenenewneneneneneseeneswnenenenenee +nwsenwnwnwnwnweneeswnwenenwwnwnwwnw +neewnewneeeneneseeneseneeneneneeww +neswswswneswseswwwnwwwwswseswsewnene +wnwnwenwwewswwnwnwwneswwsenwese +wnwsewewwwnenwwwwnwnwnwswnwnwnwnw +wewwwwwwswwnwsewwnwnw +wsenenewsewwnese +wnenenwswseesweene +nwnwnwnenenwnwnwnwnwnwnwnweswnwswnenwnwnenw +swseeewnenweenwenenwswsenesw +wswswswswnwsewswneswswseswneswneswsesww +seswneseswswswseswwwseswswneseswswswnesw +sesweseswnwswsweseswswwnenwnesenwsew +newwseneseeseeseseseseseesesesewse +swswewwswsweswswswwwwswwnwswsewnesw +seneeeeeseeseeseseeeesesesw +swsesenwnwseswwseswswseseseseseswseseswne +wswwwneesewnesenwwswwnwwswnw +eneeeneeeeeneneneneneneeesewwnene +swswswsweswnwswswswswswswswswswneswswsw +sweswwswswwswswswswswswswswswneneswwsw +wswwswswenenwewnesweesenesesenenwe +sweneneswnwnweswneneeneeneswneeee +swwsweswswnwswswswswsw +nenewnwsenenenenenenenesewnenenenenene +nwenenenenwnwneneenenwnwswswnenewnenw +seswwsweswseneswswnwswwnenenenwswsewswse +seneswsenwnwnwnenwnwnew +esweseneeewseweeseenesenwnwswe +wswswsenewenwswwwwwnewswswesewwsw +seesewenweeeweseswwseseeneese +wwwswwnewswwewwsenwneswwwwsesw +wseseseseneneseswswseseseseswe +enenenenenewswneneneeneneneenweew +ewseneseenwneseneswsewnww +ewwwwswwwswwswwwwswwswwwnw +neewseswesesesewsewwnwseseseeswe +swwswwswswwwswswswwswswnwwswswsewe +wneesenesweenwsenwsweneeeeseew +wseneseenenwwwneesweewnenenenese +seenwwneneenesenewswnenesewnesenesew +nwnenwsenwnwenenwnenww +nwnwneeswnwnwewnwwswswnwnewnwsenwnenw +swswwwwneswswsweswswneswswsewswswwsw +eneneeeeewneee +seswswswesweswwswswswswsenwsw +wswswseswwwnesweswsweswswwswwwsww +eeesweeneeewnwneeseeesweneeee +nenenenenenenwneswnenenenwnenenenenesenene +nwwnwwwwwwwwwwew +eseseseswswsewswsesenwswswseswsweseswse +nwwswnenenenwneneneneenesenenenenenesene +seseseseswneseswswnwseneseneweeneswse +nenewnwnwnwwnwwnwwwnwsenwnwsenwnwnw +wwwswnwnwwnwnwewnw +neswsenesewsesesesesesesesesesewsesese +esesesweseeseeeseseeeenwesewese +wnewewnwwnwswnenwswwswwnw +wnenesenwnenenenwsenenwswnesenenenenene +eneseeeeneeneenwneneneeweswenee +seswnwwswneswseswseswseseswswswesesesw +nwswseseeswswewswswsesenwwswwswesesw +wewsenwnwwnwnwnwnwwenwwwwnwew +enwwnwnwnwnwnwnwnwnwwnwswnwnwnwnenwsenw +nwsewewwnwnwswnwnwswwnwsenwnwneee +wwewwswsesenwwwswewwneeeneww +wnewsewsenwwwnwwwnwnwwwwwwnewsw +wnewnwnweewnwsenwnwnewswswnenwswenwnw +wnwwswswwwnwwwwwnewnweww +wwswseswwwswwswnwwwnenewwenww +wswwswwenwwswwswwswswwswswswesw +ewswwwwenwwsenewnwwww +sewnwneswseswseswwswsewswneswnwswseswnee +neenwswewsenwwswnwswswwswneewswwe +wwwnwwwwnewewwwnwwwswwww +esesenwseseeeswseeeseenweseesesese +esesesewseseseneseeseeswseesesesesese +seseseseseseseneseswseseseswsesesesewse +sesesewseeseseneeseseseeeewnesesese +swswswswswswswnwswswswwnwswweeswswsw +seseseswwseseseseseseseenesewseeenew +neeswnwswneewnenenenenenenwneswne +nenwnwenwnwnwnwnwnwnwnwnwnwnwswnwnwnwnw +sweeeeseeeeenweeeseenweseeee +nenwseneneeenenesweneesenenenwneenene +wwneswswwwwwswwswnewwseswwwwsw +swsenenwseswnwseseseneswnesesesesenewsenww +nweswwseseseseswnwnwsesesesenesesesesesw +eneseseswwsweseswswsesewseeswswswnw +nwnwnwwnwwnewwnenwnwsewnwseesewnw +seseeeeeesewnweeeeesweesese +eeeswneneneneswnenenenenenenwneeene +nwseseseseseseseseseeseseswseseseseesenw +swewwwnwswsweeswnwwwnwwwseww +nenenewewseswneneeneneswneenenene +sewnewwwwwwwwnwwwwnwwwsweww +nesenewneneneneneneneneswenwweeenesw +swswwwneswnesewseswswwswswnwwswsww +nenwnwnenwsenwnwnenwnwnwnwnwwnwnwneewswne +eenweeeeswseeenwseeseseseeesee +seewenenenenwswseneeneenwwneewnee +seseseeeeeseneseseseesesesewseese +wwwenwseswswswswswswewswswswwnew +swwwsewnwesewswneewwesenwnwwne +neseesenwneswenweeesew +nenwesewwneswseseeswseeseeeseese +wwwnwnwwswnewwnwww +eseseseeenwseeeeeeseeeseenewee +nwsenenewnwnwnwnenwnene +swswswswswseswswwweswseswseneseswswsw +nwnenwnenesenwnwnwsenenenwsenwwenwww +neswwwwwwswswnewswswsww +nenwsenenewwnwnwnenwnenwseseenwnenewne +wnwwwwsewnwnwnwnwewwwswnenwww +nwnwwnwnwnwsesenwnwnwnese +wwwnwwwewwwnwweswnwwswnwwnwnwnw +nwnenwnwnwneenwneswnwnwnenwneeswnenenwnw +sesewswswswneneswnwwsewswswnwswwnee +nwneneneneenenesweneeneneneeswnenee +neeswenenwweesenwseneswee +nenenwneswnenwnenenesw +nwwwnwswsewwnwwewewsenwnwnwwnw +nwnenwenenenenenwwnenenwnenwnwswneenene +wwnwwwwwwnwnwwwwwwewwwwe +eeneeeeeeeeweseeesweswnwnene +enenenenenenenenenwwnewnenenenenenwe +esweeswsenenenwswswswwwseswneswswsww +eeeesweneeneeweeeneeee +nwseseswswswwwnwenewnenwsw +sweeeswnwseneeeeeesweeneseweee +swswswswneweswswswswswsw +swwsewnwsweneswweswnwswwseswswswww +nwnenenenenenenenwnwnwsenenenwnesewnwnenw +swseeeseweseseseseseesesesenwsewnee +neneneswnenenwnenenenwnwsenewenwswseswsw +sweseseswnwswenwsesweseeeseesenenese +seewenwsesenweeeseeneseeseseeswee +eneeeseseeeeeseeswweeseeeswenw +wwswswswneswswswwwswwswswswswsw +eeneenenwneeeneneeeeneeswenene +swwswwwnwswwseewswswwswswwswswswwnw +nenenwnenenewnwnenwnenwnesenenenene +neeswnweswneneewneeneeeeeee +swneneswseswswseswswwswswswswswnwneswsw +enwenwnweeseeweswswnwsweeenweswe +newswnenesewwwsweswwswswwswswswsww +nwwwwwnewwwwwsewwwwwwewse +eneeenenenwneneeeneseswnenenenenene +wswwneswnwwsewswseww +nwnwnwnwsenwsenwnwenwwnwwnwewnwnwwnw +wseneneenewnweenewwnenenenwsenwne +eswneneneneenenenenwnenwnenwnenwnwwnenene +swseneseseswsweswseswsewseseseseseswsese +swswswwswwwswswswsewswwswswswsweswnw +swneewenenwneewnweseswnwwnw +wswwwwwewwwwwwwww +nenenenenenenenwswnenewswnwneneneneese +sewsesewsesesenwseneneseseeesesewe +swswswswewswswswswswswswnwswswswwwsw +wnwsenenesewnenenesewnwnenenenenenenenene +newwwsewsenwnwnwwwnwnw +neswswwswneswswswneswswseswswswwswww +nwsewwwswweswswwwwswnewswswwwwsw +seseseswseseswneswswseseseseswsesesesenw +senwwwseswswseseswwswnesewnwnenene +eneeeeeswneneeneesweeneenenene +eeeeeeeeeneeweeeeesee +nesenwneneenenenwnenwswnenenenenwnwnene +neenwnenenwwnwswnwnenwwswenwnwnwswnw +neeneneeneeneeeneeneneenwewenesw +nwseswswnweenewwnenwnwnwswneeswwnw +swnewwwnwnwseewweswwnwwsww +nwsesweweewwnwwwsenewnewwwnwwsw +seeswsenwnwwswseswswsenwesweenwsese +nwwseeeeeeeeeeeeeeeeeene +swneswswswseswswwseswneswswswseseswswsww +esesesesesesenwseseswsesenesewwsesesw +eneeneneneneeneewneeneneneneene +wwnwnwnwwnwnwsewnwnwenwwnwww +seeseseesesesesesesesenwnwseseswse +nwwnwewseswnwwswwnwnwwnwsenenwsese +nwneswnwnenwnwnwnwwnwnwwnwnwnwnwnwseenw +wsenwnewswwwneseweswnwwwsenenwnew +swesesewsewswswsweswswswenwswseswswsw +eweeseneeeeseeeseeeeee +swwwsweweewneswswnwsenwswswwswswsw +sweswnewnwneenwswweseeeneseseseew +nenenesenenenwneneseneneswnenenwnenenenwnw +swswswsweswwswswswswswseswswswnwswswnwsw +eeweeeseneeneeneeeneswwsee +ewwwwwnenwwwwwwwsewwwwnww +nenwswnenenenenenenenwnwnenweseneswnewnw +wswwnwwswwswnwwwwwwwswesesw +sweeneneswsewneeeneneneneneenenene +enenwnwsenwwnwswnwnenenweswne +eenwswwnwenwenwesweswnweswswsesww +swwseseswnwsesweseswseseswswswnwnesesese +seeeeeeeeeeswnee +newsesesenesesweswsesesesesewne +enwnenwnwnwwnwwswwnwsenenwnwnwnwnwsw +nwswseneeseswwnwswnwsweenwneswnene +neswswswseswswswwewsww +seseseseseseswseseseseseswnenwseseseesesese +seswseeneswnwswsewswseswseneswswswseswnw +neneesweeneenenwneseesweneeneneenw +swsenwswsenwseneesw +wnwwwswwswwwswswswswsewwneswswsw +wswwwswwwnwwwwwnesewswwwwe +swseswseneswsenesesewswseswseswwsenwe +newnweneneneneneneneseeneneneneneewe +eseseseseneeseswsenwsesesesesewenwew +wseeenwseseneseewswseenwseseseseese +wswwnewewseswwswwswnewwwneswsww +wsenenenwesenewewnwewseeeseswswsese +nenenenenesenenenesenenenenenwenwnenenene +eweseneneeewewne +seseswsenwesesesenwweeeseseeeesese +swenwwneseseweseneweswswseseswnwswswse +seeewnwnenwwswnwnwnwenewnwwswsene +seneswswneseeswnesesesenesesewnewseesese +swnenwnweneeswnwnwnwnw +nenenenwneenesenene +swsweswsenwseseswnwseneseseseswseseseswse +swneswswswswwswwswswnwewswsweswnwsw +nwenenewnwnwseeeseseswewnenenwswswnew +eeneseweseseseseewee +nwseseseswswwseswneseseseseseswse +nwwswswswwswwwwswnwswewwsewswe +eeeseewseeeeeeeeeeneeee +eweeeeseneeneneeneeneneeewew +nwsenwnenenenwnwnenenenwnwnwnwnenenewne +swswswswseswswseswswswswswswswswswnwnwswsw +swswswseswseseswseswswseswsenwnwswsesesesw +swnenenenenwneneneneneneneswneneneneneenene +neneneeeenenesenewneeneeneenenee +eesesesesesesesenwwnwseeesenwswswse +senwswnenwseneeswwseswe +eeeweeewseneneneeeeneeneee +eeeeneeenesweewenew +nwswwwenwsenwsenenwswwweswsewwnwne +swswswseswneseseneswnwseseswsesesweswswswsw +eneenwneneeeneseneneneeeesenwnee +swwnwwnwsenwswwswseenesewseenewwe +eeseseweeeewsenesesesewee +nwsenwnwnwnwnwnwnwwwwnwwwnwnwnwwenw +neneswneenenenesenenenenenenwnenwnwnesew +eseseeeseswswweesweeeneesenwne +swswswseswwswsenwneneseseseeswseswnwsw +nwnwnwnwwnwwnwnwwswnwnwnwnwnwnwenwnwe +wnenwnwnesenwnwswneneenenwwneenwnwnene +seewseseseseeeenweeeeneseseswsee +swsenwsenwnwseseseswesweseswnw +swseswswswsweswswseswswswswseswsenewswsw +seswseseseswwesesesesesesesesesenwswnese +wswnewwseswswwswwwswswneswswwseswsw +nwwsesweeseseeseenesesenweeeesesese +neseeeseewseeseseesewseeese +nwnwnenwnenenenwnenwnenenenwswnwsenenenw +eseeseeseeswseneseseseeeseew +swswswswsesweswsesesenwswseswsesesesesw +wnenwneseseesenwwnenwswswneneweee +newnenenenwnwenwenwswneneseneneswnene +nwwnenwneneneswnwneenenwnenenwnese +eweewwwwwnewwwewwwwnwwswse +ewsweenenwnwswswnwnwnwswwnwnw +esenwnwnenwnwwnwnwwwwewseswwwnwsene +wseeeeeeseseseenwseeeseeseswee +sesesesesenwnwsewswseswseeeseseswnewne +neneneeneswnenenenenewnenwnenenesenenene +wseneseweneeeeew +sesewseseeseswsenewsesewsesenesese +neeneneswseneesweeseeneneneenwnwe +swswseswswswswwneswswswswswswswswswsw +wwwwsewswwswswwswneswwwwswww +seseseseswneseseseseseeseseswsesewsesesew +nwnwnwswnwnwnwnwnesenwnwnwsweenwnwnwswnwnw +seesewnwswneweeenweeseeeseseneswe +seesesesesesewseneewesesesesesesese +nwneeeewewneneeenenesenwswswswe +seseewneneeneneneneneneswwnwneewse +sesweeswwnweseeeenweeeenwee +wwswwswwwnewsewwwnewswweww +swswswnwswnenweseseswswswnenwswswseswswsw +eseswneeeeeneseeenenweeswesesesw +seseseseswswseswseswswswsenwswesesesesw +sweeenenenenwswnwsweeneneswnweeesee +wnenwnwnenwnwwswnenwnwseee +newweneeeeeseneeneswneweneenee +wswswsweseeswneseswswswenewnewwse +swswswweeneswenwswnw +swswsenwswseswswsesenwsesesesesesesesee +nwnwsenwnwnwnwnwwnwnwnwnwnenwnwsenwnw +seswenwnenwsewnwwnenwsewwnwnwesene +enwseweenweseseseeswswseneswesene +newnesenewneneseneneneneswnewneneneenee +swwwswwnwewneswwwwswswwseswww +sesenwweneneeswesenwwewnenw +seneseeseswseseneseswsesesesesesesesee +neneeeeneseneweneneneseseewewwe +eseeseseseseseeswswseseneseneseesee +eseneswnewswneswwsenenenwnwsenwwsww +nwnwsenenenwnwnwnwnenwnwnwswnenwnwnenenenw +nenwenwnwnwswnenenenwnenenwwnenwesenenenw +swswswseswswswswswswneneseswswswseswwnwnw +eeeewneeeeeneeneswnwesesw +eneneneeesenenesenwnwneeeeseeenew +seswseswsweswswswswseswswnwseswswse +nenwswwswswswswwswnewswwswswwwswwe +nwwnwswseewwwwnwwnewswweenwnwnw +wsenwnwswnwnwwnwsenwenwwnwnwnwnwwwnenw +swsweswswseswswswnwswswswswswnwseeswneswsw +swneswswwswwswswneswswwseswseswswneswswsw +wwwnwwwnwwseewewwnwwswweswne +wwnwnewsenwnwwwwwnwnwnwnwnwnwnwnw +swnwnwnwneneneneeneenwswnwnenwnenenese +nenwsenenenenenewnenwnenenenenene +swswswwwwswswene +neneeneeneneswneswnwnesewneenwnwnenesw +wswwwwswwswneswswwseeswswwwww +nenenwswsenwnwsesenwnenenenwnwnwsene +nwenwseeeenesweswseweseseseenwnesee +esenwsesesewseseneseseseseswseseseswsese +eeeweenwnewseeeeseswsenenwesesese +weeeeneewseeneeeeesweeswne +seseswsenesesesesesewsesesesesesesesese +neneenwneweseseeeeweeeeeneeee +eeesweeenwneeswnenweeeeeeenee +ewwnwwnewweswnwwsewewwnweww +eseneeeweeeeeeeeenesweenene +swswswswswwwwwswwneswneswswswswswww +sweeeeeneeeeeeeeeeneswsee +swseswseswneswswswseswswswswswswswswwsw +swnwsenwnenwnwwnwnwnwnwwsenenwenenwnenenw +nwseseswseseseeswnwswseswseswseswsenwse +swswenwnwswwseswnwsewseeneswseneswswnw +newseseesewnwsweneseeseseewseseew +wwwwnwwwwwwwwwewewwwww +nwswnenwwnwwnwnweesewnwnenwnenwnwnwnw +swneeseewsesewseewseseneneseseeeee +senweswnwswesesweswsewseeswswnwse +neeneeeeeeneswneneeweeseeneee +nwwnwwnwwswwwnesenwnwwwwwnwwnwse +nenwnewnwnenenwsenenenwnwnwnwewnwnwne +wnenwnwwnwwwewswswnwwwwnwnwwwww +neneseneneswnenenwwneneneeeneeneeenew +swswwswswswneseswswswswswnwswnwesweswsw +eweweeeeeeneseeewee +nwwswwwsenwnewswwseswnewswnweww +swswsesewsweseneeswswswsweswnwnwnwswwsw +swseswswswswseseseseswswseseswnwnesesesw +nwsenesweswnwnwsesweeswewsesesenesese +nwseseswseseneswsesenwseseseswsesesesenwe +seseeseseseseseseeseseesew +nenwnenenewnenenwnenwneneeneswenenwnenw +wnewwswswseswnenweswswswswswnwswswswswe +neenwswwnenenenwnwswenwenwnene +nwnwnwenwnwnwnwnwnenwswnwnwswnwnwnwnwne +seewwsenwwwwweswswwnwwwwswww +nwnwwwnwnwsesenwneenwsenenwswwnwsenwne +nwnewnwenwwneswwnewwswswwnwwnwswnwnw +seeeeeeeswseseseseeseeenwsesee +wnesenwwwwwnewwwsewwswwwwww +nwnwnenwnenwnwnwnwnwnwwnwnwnesenwnwne +nenewnwnenwswsenwenwnwnwnwneewnenwne +neeenwneneeneswweeeeneeeneeeee +nwswenenwnwnwswnenenwnwnwnwnenwnenwnwne +neeswswswswswswswwswnwswwswswswswesw +nwnwnwnwnwnwswnwenwnwswnwnenwnwnwnwnwnwnwnw +newwnwwsewwwwsewwewwwswsenwsw +nwseswneswwswswwswwwswswwwwseswwsw +wwswswwwwwwsewswwnewwwwww +seseseesesesesewsesewsene +wswswswewswswwewwwswswnwwswnwww +swswseswswswnwswswswswwswswswswswswsw +nwsesesweewnwneswwnenwnwnwsenenwswsenw +swswseseseswswseseseseseswswsesesene +nwesewwnwneseeseneswsesesweneseenwswsw +eeseeesenwnweesweeeseeeesesw +neeswwnenwnenenenwneenenenenwneswsesw +nwwwesenwwnwnwwwnwwnw +nwwswwwwenwwnesesesewenewswsww +swswwwwswsewwswneswswswwwsewneswswsw +eneeneneswnwnenewseeneseneesenenewene +nwwswwnwnwwnwnwnwewwnewnwnwnwwnwe +nwsweswnewwwwsweswswwesw +nwneenenenenenenewswsewenenewsenenene +seswseeseseseneewsesweseseneseesesese +swswswsweeneeewewnewwnwswnewsw +wneswswwsewswneseswswswswwsw +eneneeneeeneseneneswneenwneneenene +enwnenwswsweneeswenwwseeee +nwnwnwnwnenenwenwnwswnenwnwnwsenwnwnwnenwnw +sesewsenwseseesewnwsenesesesesesesese +nesenwneneswenenenenewnesesenwewsenew +seseswnewswesenwneswwewwneeseeswse +wseeseenweeeeeeeewswneeee +nwsesesweswsewseseswsesesesewswseneese +nwnwwwwswwwnesewneewsw +nwwnwsenenwneneneswnenenwnwnwswnwnw +swnwnesewwwnwwwwnwwneenwswwwwww +seseseswwneswswsenewneswswwswseswswse +eseseweenenewseneseseseseswseesew +seswswswnwseseswswseseswswswswsenwsenwnwe +swswswwweswwswswwswswwwswswswsw +wnwwnwwwnwwseenwesenwwnwswnwnenw +nwnwnwnwenwnwnenwnwnwwnenwneenwnenwswnenw +nwwsesesenwweesese +nwswnwnwnenewsewse +eswswneswwwwwwwwwnewwwwswnew +wwwswsewwwwwnww +swswswwwwwewnwwsewswwnwewswnee +nenwewneswnenwswnwswewneneneseswenwene +wnewwwewswsewwwwswnwwwwwwwsw +seeseseesenwewseseseseseseseesesee +wwnwwwnwwwwsewnwwwswwnwnwwe +ewsenenenwswswswswnweseewnwswsesenwsw +wwewwwwwsewswwwnwswwnwwwww +neswsweneseneswwwenesewswswewwsw +neneenenwnwnwswneswneswneneneneswneene +seswnwsesweswsewswnwnwneswnwswnwseswnesw +neswnwnwnenwnwnenenenesenwneneenenenwswne +esenwsesweseneswesewswenweswnesewne +enwnwnwnwnwnwswnwnwnwnwnwswnwneneenene +eneeneswnwneeweneseeesweneneenene +seseweeneswnwseseenwseseseseseeese +eswenwneeenwneseeneeneee +seseswseseseseneeseseswwswwswseseesese +nwseswswswswseseseseneswseseseseseseswswse +nenwswnwswnwnwnwnenwnwnwnenwenwnwnwnwsene +seswwesesweswswswsenwnewwsweswsww +eeeeseseeseeeeesenweesweese +eesenwesweeeeneenweeseeeeee +esesesesweseeesesenesewseseeesee +neneeeneenewnenenenenenesewse +nenwsenwnwwnwenwnenwnwswnwenwnwnwnwnw +wwseneneswnenwneswnwsesenwweseenewnw +swwswnwswwsewswswswswwswsewswswnesw +seeeeneesweweeneeeeneneneeenee +swswswnwseswswswswswnwswswswneswseswesw +wnenwwnesewwswwwsewwwnw +nwsenenwnwwnesweseswnesenwnwnenewsew +ewnwswswwwswwswwnwswesweewww +seeseswsesenwsesenwnweswswswswsewswsene +nwnwnwswnenwnenwnwnenenwnesenwesenwwnew +nwnwwnwnwnwnwwenwsenwnwwwnwnwwnwnwnw +wwwnwwwwseewwwwewewnewww +neswwwswwwswswsenewswswwwwwswwsw +swsewseeseeswseswwswswsesw +swswwswesewswnwswswswwsww +swseswswseswswsweseseseseswnwseswswswsw +wsesesesesesesesesesesesesesee +wnwwswseseneneneenesenenenenenenwee +ewsweswsenwseswwwnweenwnewnwnesew +nwsewneswwwwswneeswwsw +nwnwnwnwnenwnwenwnwneeswnwnwnwnwswnwnwnwnw +ewneneswesenesenwnwnewseww +nwnenwnwnwnenwnwsenwnwnwnenenw +eeeeeeenweseenweeeenwseseesw +wswwswewswwswwswwsw +nweesewseweseenwseseee +nwnenwnwnenenenwnwswnenwsenwnenwnwnwwnenw +nwnenwnwnwnwsenwnwnwsewnwnwnwnwnwnwnwnw +nenwnwnwnwswnenwnwnwnwenwnwnwnwnwnenenw +sweeeeeneneweeeeeeneeeenw +neswsewnenwneswnenenenenwnwenenwnwnenwne +nwwnwswnwswnwnwnwnwnwnwnwnwnenwnwnwnenw +wsweenwenwewneeweeswswwewee +sweswnwwswswswnweswswneswseswswswsesw +swneswswwwswwswewewwswwwwwnese +nwswswswswswswswswswseswswnewswswswsw +nenwnewweewnwnwswnwwsewwwswsenw +seseeewewseseseseseseesesesesesesese +swseswseswswseseswnwseneseeswnweswsesw +wenwnwnwnwnwnwsenwnwnwwwwnwwnwnwswne +nenenenenwnenwnewnenwswnwneneneneneenenw +nwnenenenesenwsenewnewnenwnesenenwnenenw +neneneneeneesweeeneneneneeswenwne +neneenwneeneneeswneeeeenenenenene +swseswseswneswswseseswsesesewnesewneseswsw +swneseewneseswnwneenwswseseseeswese +nwswnwnwnwwnwnwnwnwnwwnwnwewnwnwnwse +nwswnwwnwwnwwwewwnwwwewseenwnw +eeewneneneneeeswseneeweneenew +nwswswswswswswswswswswswwswneseeneswswsw +nwwwnwnwwnwswswnwneewwnwnwnwnwnwnwnw +swswseseeswseswseswswsesew +seesesesesesesesesewseswseseseseene +eesweseeneseswnweseweenwseesesee +enwenwswnenwnwnenwwnenenenewnwswesenwnw +enwweeseenweseeeeswesweeeneee +nwnwseswnewenwnewwsesenwnewnwnwnenwnw +swswswseswweswswswswseeseswneseswsenwne +nenwnwnenwnwnenenesenewneenenenwnewne +swnwwnwswewnwwnenwsewewwwnwnwwww +swneswswwwswnesww +eeeswwnweseweseneeeswsesesesesee +swswwseeseswswswswswsenesenwswswsesenesw +swnewwesenwneswenwenwe +wnwnewwwsewwwwswseswwwswwwsww +swwnwenwnwwnwnwsewwnenwnwwnwwww +nwnwnwnwnenenewnwnenwnwsenenwnwnwnenwne +nwnwnwnwswnwnwnwnwswnwwwenwnwnwsenenwnw +neneneswneseswneeneswnwnenewenwenwswnwne +sweeneseseeseseeneswnweeseseseeee +enesesewwenwwwnewneswsewsewnwnw +swseseseseseseeseseseenwenwswswenwnw +swseseseeneseseswswseseseseswsewsesesese +nweseneswseesenwseswseseswse +swewswseseswwwseneswnesesene +sesesesweseseeneeseeseseseswenwsese +nenwwnenwnwwswwswswwnwnewnwwwnwnww +swswswswwsweswswewswswwswswnwswsww +swwnwswseswsweseswswnwnenwnwsweswee +nesewnwnwnwenwnwwnwwswnwnwnwnwnwnwnwnw +newnenenenenwnenenenenenenwnenenesenene +wwswewwwwswswwwswwnwwwewsw +seeeseeseeeseeseeseeesenwsesesw +neneswseeneneenenwnwnenwnenesenenenewne +nwwneneseswnenenesw +nwnwnwswnwnwnwnenenenwnwnwnwnwnwnwsenwsw +swnwwwnwewwwnwnwwnewwwwnwwnw \ No newline at end of file From 92396caec9cdca0bac529c4281be017f140455e0 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Thu, 24 Dec 2020 10:54:17 +0100 Subject: [PATCH 226/433] Slight cleanup --- .../sbaars/adventofcode/year20/days/Day24.java | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day24.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day24.java index f3404144..82dca1f5 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day24.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day24.java @@ -7,6 +7,7 @@ import java.util.*; import java.util.List; +import static java.util.Arrays.stream; import static java.util.stream.Collectors.toList; public class Day24 extends Day2020 { @@ -22,16 +23,14 @@ public Day24() { @Override public Object part1() { - var input = Arrays.stream(dayStrings()).map(this::read).collect(toList()); + var input = stream(dayStrings()).map(this::read).collect(toList()); for(List dirs : input){ Point pos = new Point(0,0); for(HexDirection dir : dirs){ pos = dir.move(pos); } - if(visited.contains(pos)){ + if(!visited.add(pos)){ visited.remove(pos); - } else { - visited.add(pos); } } return visited.size(); @@ -47,10 +46,7 @@ public List read(String dirs){ } else if ((direction = HexDirection.get(dirs.substring(0,1))).isPresent()){ res.add(direction.get()); dirs = dirs.substring(1); - }else { - throw new IllegalStateException("Panik!"); } - } return res; } @@ -59,10 +55,7 @@ public List read(String dirs){ public Object part2() { for(int i = 0; i<100; i++){ Set newPos = new HashSet<>(); - Set checkedPos = new HashSet<>(); - for(Point p : visited) { - addNeighbors(visited, newPos, checkedPos, p, true); - } + visited.forEach(p -> addNeighbors(visited, newPos, new HashSet<>(), p, true)); visited = newPos; } return visited.size(); From fa6c6d664c17cbe8b049cf1ef26bd810ae01ba8c Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Fri, 25 Dec 2020 06:48:53 +0100 Subject: [PATCH 227/433] Day 25 --- .../adventofcode/year20/days/Day25.java | 21 ++++++++++++++++--- src/main/resources/2020/day25.txt | 2 ++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day25.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day25.java index 0a79ae91..3cbf49ae 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day25.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day25.java @@ -6,6 +6,8 @@ public class Day25 extends Day2020 { public static void main(String[] args) { new Day25().printParts(); } + long cardPublicKey = 1965712L; + long doorPublicKey = 19072108L; public Day25() { super(25); @@ -13,12 +15,25 @@ public Day25() { @Override public Object part1() { - String input = day(); - return input; + long value = 1; + for(int loopSize = 1; true; loopSize++) { + value = transform(value, loopSize-1, loopSize, 7); + if(value == cardPublicKey) { + return transform(1, 0, loopSize, doorPublicKey); + } + } + } + + public long transform (long value, int start, int loopSize, long subjectNumber){ + for (int i = start; i < loopSize; i++) { + value *= subjectNumber; + value %= 20201227; + } + return value; } @Override public Object part2() { - return 0; + return "That's all folks"; } } diff --git a/src/main/resources/2020/day25.txt b/src/main/resources/2020/day25.txt index e69de29b..cb56879d 100644 --- a/src/main/resources/2020/day25.txt +++ b/src/main/resources/2020/day25.txt @@ -0,0 +1,2 @@ +1965712 +19072108 \ No newline at end of file From 30c4daf6fef8e1c7bc867a238d39a852a82f850d Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Fri, 25 Dec 2020 06:54:11 +0100 Subject: [PATCH 228/433] Minor refactoring --- src/main/java/com/sbaars/adventofcode/year20/days/Day25.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day25.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day25.java index 3cbf49ae..2c53535f 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day25.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day25.java @@ -6,8 +6,6 @@ public class Day25 extends Day2020 { public static void main(String[] args) { new Day25().printParts(); } - long cardPublicKey = 1965712L; - long doorPublicKey = 19072108L; public Day25() { super(25); @@ -15,6 +13,8 @@ public Day25() { @Override public Object part1() { + long cardPublicKey = 1965712L; + long doorPublicKey = 19072108L; long value = 1; for(int loopSize = 1; true; loopSize++) { value = transform(value, loopSize-1, loopSize, 7); From 560fd08d1a139b1352ae879387b2108d4f827c13 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Fri, 5 Nov 2021 16:05:20 +0100 Subject: [PATCH 229/433] Input fetcher --- .../com/sbaars/adventofcode/common/Day.java | 2 +- .../sbaars/adventofcode/util/FetchInput.java | 126 ++++++++++++++++++ 2 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/sbaars/adventofcode/util/FetchInput.java diff --git a/src/main/java/com/sbaars/adventofcode/common/Day.java b/src/main/java/com/sbaars/adventofcode/common/Day.java index 200bb134..4b977747 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Day.java +++ b/src/main/java/com/sbaars/adventofcode/common/Day.java @@ -27,7 +27,7 @@ public void printParts() { System.out.println("Part 2: "+part2()); } - protected String getResourceAsString(String resource) { + public static String getResourceAsString(String resource) { try { return readFileToString(new File(Day.class.getClassLoader().getResource(resource).getFile())); } catch (IOException e) { diff --git a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java new file mode 100644 index 00000000..a76d6458 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java @@ -0,0 +1,126 @@ +package com.sbaars.adventofcode.util; + +import java.io.File; +import java.io.IOException; +import java.net.CookieHandler; +import java.net.CookieManager; +import java.net.HttpCookie; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.time.Duration; +import java.util.List; +import java.util.stream.IntStream; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathFactory; +import org.apache.commons.io.FileUtils; +import org.htmlcleaner.CleanerProperties; +import org.htmlcleaner.DomSerializer; +import org.htmlcleaner.HtmlCleaner; +import org.htmlcleaner.TagNode; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +public class FetchInput { + private final HttpClient client; + + private FetchInput(String session) { + CookieHandler.setDefault(new CookieManager()); + + HttpCookie sessionCookie = new HttpCookie("session", session); + sessionCookie.setPath("/"); + sessionCookie.setVersion(0); + + try { + ((CookieManager) CookieHandler.getDefault()).getCookieStore().add(new URI("https://adventofcode.com"), sessionCookie); + } catch (URISyntaxException e) { + throw new IllegalStateException(e); + } + + this.client = HttpClient.newBuilder() + .cookieHandler(CookieHandler.getDefault()) + .connectTimeout(Duration.ofSeconds(10)) + .build(); + } + + public static void main(String[] args) throws Exception { + String year = args[0]; + String day = args[1]; + String session = System.getenv("AOCSESSION"); + new FetchInput(session).runForYear(year); + + } + + private void retrieveDay(String day, String year) { + retrieveInput(day, year); + retrieveExamples(day, year); + } + + private void retrieveExamples(String day, String year) { + var matches = getMatchesByXpath(doRequest(year + "/day/" + day), "//pre/code"); + for(int i = 0; i< matches.size(); i++){ + File file = getFile(day + "-" + (i + 1), year); + if(!file.exists()) { + writeFile(file, matches.get(i)); + } + } + } + + private void runForYear(String year) { + for(int day = 1; day<=25; day++){ + retrieveDay(Integer.toString(day), year); + } + } + + private void retrieveInput(String day, String year) { + File dayFile = getFile(day, year); + if(!dayFile.exists()){ + writeFile(dayFile, doRequest(year + "/day/" + day + "/input")); + } + } + + private File getFile(String day, String year) { + return getResource(year + "/day" + day + ".txt"); + } + + private void writeFile(File file, String content) { + try { + FileUtils.writeStringToFile(file, content); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private File getResource(String path) { + return new File("src/main/resources/"+path); + } + + private List getMatchesByXpath(String html, String xpath){ + try{ + TagNode tagNode = new HtmlCleaner().clean(html); + org.w3c.dom.Document doc = new DomSerializer( + new CleanerProperties()).createDOM(tagNode); + + XPath xpathObj = XPathFactory.newInstance().newXPath(); + NodeList matches = (NodeList) xpathObj.evaluate(xpath, doc, XPathConstants.NODESET); + return IntStream.range(0, matches.getLength()).mapToObj(matches::item).map(Node::getTextContent).toList(); + } catch (Exception e) { + throw new IllegalStateException(e); + } + } + + private String doRequest(String path) { + try { + HttpRequest req = HttpRequest.newBuilder() + .uri(URI.create("https://adventofcode.com/" + path)) + .GET().build(); + return client.send(req, HttpResponse.BodyHandlers.ofString()).body(); + } catch (Exception e) { + throw new IllegalStateException(e); + } + } +} From 4e03a41460b1ff61be4d8696c95443bc39d1fd95 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Fri, 5 Nov 2021 23:17:57 +0100 Subject: [PATCH 230/433] Store everything locally --- .idea/compiler.xml | 3 +- .idea/misc.xml | 2 +- .idea/runConfigurations.xml | 10 + adventofcode2019.iml | 16 +- pom.xml | 17 +- .../sbaars/adventofcode/util/FetchInput.java | 7 +- src/main/resources/2015-examples/day13-1.txt | 12 + src/main/resources/2015-examples/day13-2.txt | 5 + src/main/resources/2015-examples/day15-1.txt | 2 + src/main/resources/2015-examples/day16-1.txt | 10 + src/main/resources/2015-examples/day18-1.txt | 6 + src/main/resources/2015-examples/day18-2.txt | 39 + src/main/resources/2015-examples/day19-1.txt | 3 + src/main/resources/2015-examples/day20-1.txt | 9 + src/main/resources/2015-examples/day21-1.txt | 21 + src/main/resources/2015-examples/day22-1.txt | 21 + src/main/resources/2015-examples/day22-2.txt | 64 + src/main/resources/2015-examples/day23-1.txt | 4 + src/main/resources/2015-examples/day24-1.txt | 14 + src/main/resources/2015-examples/day25-1.txt | 8 + src/main/resources/2015-examples/day25-2.txt | 8 + src/main/resources/2015-examples/day7-1.txt | 8 + src/main/resources/2015-examples/day7-2.txt | 8 + src/main/resources/2015-examples/day9-1.txt | 3 + src/main/resources/2015-examples/day9-2.txt | 6 + src/main/resources/2015/day1.txt | 1 + src/main/resources/2015/day10.txt | 1 + src/main/resources/2015/day11.txt | 1 + src/main/resources/2015/day12.txt | 1 + src/main/resources/2015/day13.txt | 56 + src/main/resources/2015/day14.txt | 9 + src/main/resources/2015/day15.txt | 4 + src/main/resources/2015/day16.txt | 500 +++ src/main/resources/2015/day17.txt | 20 + src/main/resources/2015/day18.txt | 100 + src/main/resources/2015/day19.txt | 45 + src/main/resources/2015/day2.txt | 1000 +++++ src/main/resources/2015/day20.txt | 1 + src/main/resources/2015/day21.txt | 3 + src/main/resources/2015/day22.txt | 2 + src/main/resources/2015/day23.txt | 47 + src/main/resources/2015/day24.txt | 29 + src/main/resources/2015/day25.txt | 1 + src/main/resources/2015/day3.txt | 1 + src/main/resources/2015/day4.txt | 1 + src/main/resources/2015/day5.txt | 1000 +++++ src/main/resources/2015/day6.txt | 300 ++ src/main/resources/2015/day7.txt | 339 ++ src/main/resources/2015/day8.txt | 300 ++ src/main/resources/2015/day9.txt | 28 + src/main/resources/2016-examples/day10-1.txt | 6 + src/main/resources/2016-examples/day11-1.txt | 4 + src/main/resources/2016-examples/day11-10.txt | 4 + src/main/resources/2016-examples/day11-11.txt | 4 + src/main/resources/2016-examples/day11-12.txt | 4 + src/main/resources/2016-examples/day11-13.txt | 4 + src/main/resources/2016-examples/day11-2.txt | 4 + src/main/resources/2016-examples/day11-3.txt | 4 + src/main/resources/2016-examples/day11-4.txt | 4 + src/main/resources/2016-examples/day11-5.txt | 4 + src/main/resources/2016-examples/day11-6.txt | 4 + src/main/resources/2016-examples/day11-7.txt | 4 + src/main/resources/2016-examples/day11-8.txt | 4 + src/main/resources/2016-examples/day11-9.txt | 4 + src/main/resources/2016-examples/day12-1.txt | 6 + src/main/resources/2016-examples/day13-1.txt | 8 + src/main/resources/2016-examples/day13-2.txt | 8 + src/main/resources/2016-examples/day15-1.txt | 2 + src/main/resources/2016-examples/day17-1.txt | 9 + src/main/resources/2016-examples/day18-1.txt | 2 + src/main/resources/2016-examples/day18-2.txt | 3 + src/main/resources/2016-examples/day18-3.txt | 10 + src/main/resources/2016-examples/day19-1.txt | 3 + src/main/resources/2016-examples/day2-1.txt | 3 + src/main/resources/2016-examples/day2-2.txt | 4 + src/main/resources/2016-examples/day20-1.txt | 3 + src/main/resources/2016-examples/day23-1.txt | 7 + src/main/resources/2016-examples/day24-1.txt | 5 + src/main/resources/2016-examples/day6-1.txt | 16 + src/main/resources/2016-examples/day8-1.txt | 3 + src/main/resources/2016-examples/day8-2.txt | 3 + src/main/resources/2016-examples/day8-3.txt | 3 + src/main/resources/2016-examples/day8-4.txt | 3 + src/main/resources/2016/day1.txt | 1 + src/main/resources/2016/day10.txt | 231 + src/main/resources/2016/day11.txt | 4 + src/main/resources/2016/day12.txt | 23 + src/main/resources/2016/day13.txt | 1 + src/main/resources/2016/day14.txt | 1 + src/main/resources/2016/day15.txt | 6 + src/main/resources/2016/day16.txt | 1 + src/main/resources/2016/day17.txt | 1 + src/main/resources/2016/day18.txt | 1 + src/main/resources/2016/day19.txt | 1 + src/main/resources/2016/day2.txt | 5 + src/main/resources/2016/day20.txt | 1005 +++++ src/main/resources/2016/day21.txt | 100 + src/main/resources/2016/day22.txt | 1066 +++++ src/main/resources/2016/day23.txt | 26 + src/main/resources/2016/day24.txt | 39 + src/main/resources/2016/day25.txt | 30 + src/main/resources/2016/day3.txt | 1908 ++++++++ src/main/resources/2016/day4.txt | 980 ++++ src/main/resources/2016/day5.txt | 1 + src/main/resources/2016/day6.txt | 572 +++ src/main/resources/2016/day7.txt | 2000 +++++++++ src/main/resources/2016/day8.txt | 194 + src/main/resources/2016/day9.txt | 1 + src/main/resources/2017-examples/day10-1.txt | 5 + src/main/resources/2017-examples/day11-1.txt | 7 + src/main/resources/2017-examples/day12-1.txt | 7 + src/main/resources/2017-examples/day13-1.txt | 4 + src/main/resources/2017-examples/day13-2.txt | 5 + src/main/resources/2017-examples/day13-3.txt | 28 + src/main/resources/2017-examples/day13-4.txt | 103 + src/main/resources/2017-examples/day14-1.txt | 10 + src/main/resources/2017-examples/day15-1.txt | 6 + src/main/resources/2017-examples/day15-2.txt | 14 + src/main/resources/2017-examples/day17-1.txt | 1 + src/main/resources/2017-examples/day18-1.txt | 10 + src/main/resources/2017-examples/day19-1.txt | 7 + src/main/resources/2017-examples/day2-1.txt | 3 + src/main/resources/2017-examples/day20-1.txt | 11 + src/main/resources/2017-examples/day21-1.txt | 3 + src/main/resources/2017-examples/day21-2.txt | 11 + src/main/resources/2017-examples/day21-3.txt | 3 + src/main/resources/2017-examples/day21-4.txt | 2 + src/main/resources/2017-examples/day21-5.txt | 3 + src/main/resources/2017-examples/day21-6.txt | 4 + src/main/resources/2017-examples/day21-7.txt | 5 + src/main/resources/2017-examples/day21-8.txt | 7 + src/main/resources/2017-examples/day21-9.txt | 6 + src/main/resources/2017-examples/day22-1.txt | 3 + src/main/resources/2017-examples/day22-2.txt | 8 + src/main/resources/2017-examples/day22-3.txt | 8 + src/main/resources/2017-examples/day22-4.txt | 8 + src/main/resources/2017-examples/day22-5.txt | 8 + src/main/resources/2017-examples/day22-6.txt | 8 + src/main/resources/2017-examples/day22-7.txt | 8 + src/main/resources/2017-examples/day24-1.txt | 8 + src/main/resources/2017-examples/day25-1.txt | 22 + src/main/resources/2017-examples/day25-2.txt | 7 + src/main/resources/2017-examples/day3-1.txt | 5 + src/main/resources/2017-examples/day5-1.txt | 5 + src/main/resources/2017-examples/day7-1.txt | 13 + src/main/resources/2017-examples/day7-2.txt | 17 + src/main/resources/2017-examples/day8-1.txt | 4 + src/main/resources/2017/day1.txt | 1 + src/main/resources/2017/day10.txt | 1 + src/main/resources/2017/day11.txt | 1 + src/main/resources/2017/day12.txt | 2000 +++++++++ src/main/resources/2017/day13.txt | 43 + src/main/resources/2017/day14.txt | 1 + src/main/resources/2017/day15.txt | 2 + src/main/resources/2017/day16.txt | 1 + src/main/resources/2017/day17.txt | 1 + src/main/resources/2017/day18.txt | 41 + src/main/resources/2017/day19.txt | 201 + src/main/resources/2017/day2.txt | 16 + src/main/resources/2017/day20.txt | 1000 +++++ src/main/resources/2017/day21.txt | 108 + src/main/resources/2017/day22.txt | 25 + src/main/resources/2017/day23.txt | 32 + src/main/resources/2017/day24.txt | 57 + src/main/resources/2017/day25.txt | 62 + src/main/resources/2017/day3.txt | 1 + src/main/resources/2017/day4.txt | 512 +++ src/main/resources/2017/day5.txt | 1092 +++++ src/main/resources/2017/day6.txt | 1 + src/main/resources/2017/day7.txt | 1512 +++++++ src/main/resources/2017/day8.txt | 1000 +++++ src/main/resources/2017/day9.txt | 1 + src/main/resources/2018-examples/day10-1.txt | 31 + src/main/resources/2018-examples/day10-2.txt | 89 + src/main/resources/2018-examples/day11-1.txt | 5 + src/main/resources/2018-examples/day11-2.txt | 5 + src/main/resources/2018-examples/day12-1.txt | 16 + src/main/resources/2018-examples/day12-2.txt | 23 + src/main/resources/2018-examples/day13-1.txt | 4 + src/main/resources/2018-examples/day13-2.txt | 7 + src/main/resources/2018-examples/day13-3.txt | 7 + src/main/resources/2018-examples/day13-4.txt | 104 + src/main/resources/2018-examples/day13-5.txt | 8 + src/main/resources/2018-examples/day14-1.txt | 16 + src/main/resources/2018-examples/day15-1.txt | 7 + src/main/resources/2018-examples/day15-10.txt | 11 + src/main/resources/2018-examples/day15-11.txt | 13 + src/main/resources/2018-examples/day15-2.txt | 6 + src/main/resources/2018-examples/day15-3.txt | 6 + src/main/resources/2018-examples/day15-4.txt | 43 + src/main/resources/2018-examples/day15-5.txt | 6 + src/main/resources/2018-examples/day15-6.txt | 93 + src/main/resources/2018-examples/day15-7.txt | 11 + src/main/resources/2018-examples/day15-8.txt | 11 + src/main/resources/2018-examples/day15-9.txt | 11 + src/main/resources/2018-examples/day16-1.txt | 3 + src/main/resources/2018-examples/day17-1.txt | 8 + src/main/resources/2018-examples/day17-2.txt | 17 + src/main/resources/2018-examples/day17-3.txt | 14 + src/main/resources/2018-examples/day17-4.txt | 14 + src/main/resources/2018-examples/day17-5.txt | 14 + src/main/resources/2018-examples/day17-6.txt | 14 + src/main/resources/2018-examples/day17-7.txt | 14 + src/main/resources/2018-examples/day17-8.txt | 17 + src/main/resources/2018-examples/day18-1.txt | 131 + src/main/resources/2018-examples/day19-1.txt | 8 + src/main/resources/2018-examples/day19-2.txt | 5 + src/main/resources/2018-examples/day20-1.txt | 5 + src/main/resources/2018-examples/day20-2.txt | 5 + src/main/resources/2018-examples/day20-3.txt | 7 + src/main/resources/2018-examples/day20-4.txt | 9 + src/main/resources/2018-examples/day20-5.txt | 9 + src/main/resources/2018-examples/day20-6.txt | 13 + src/main/resources/2018-examples/day20-7.txt | 16 + src/main/resources/2018-examples/day20-8.txt | 18 + src/main/resources/2018-examples/day22-1.txt | 16 + src/main/resources/2018-examples/day23-1.txt | 9 + src/main/resources/2018-examples/day24-1.txt | 2 + src/main/resources/2018-examples/day24-10.txt | 12 + src/main/resources/2018-examples/day24-11.txt | 5 + src/main/resources/2018-examples/day24-2.txt | 11 + src/main/resources/2018-examples/day24-3.txt | 18 + src/main/resources/2018-examples/day24-4.txt | 12 + src/main/resources/2018-examples/day24-5.txt | 12 + src/main/resources/2018-examples/day24-6.txt | 12 + src/main/resources/2018-examples/day24-7.txt | 12 + src/main/resources/2018-examples/day24-8.txt | 12 + src/main/resources/2018-examples/day24-9.txt | 12 + src/main/resources/2018-examples/day25-1.txt | 8 + src/main/resources/2018-examples/day25-2.txt | 10 + src/main/resources/2018-examples/day25-3.txt | 10 + src/main/resources/2018-examples/day25-4.txt | 10 + src/main/resources/2018-examples/day3-1.txt | 9 + src/main/resources/2018-examples/day3-2.txt | 3 + src/main/resources/2018-examples/day3-3.txt | 8 + src/main/resources/2018-examples/day4-1.txt | 17 + src/main/resources/2018-examples/day4-2.txt | 8 + src/main/resources/2018-examples/day5-1.txt | 4 + src/main/resources/2018-examples/day6-1.txt | 6 + src/main/resources/2018-examples/day6-2.txt | 10 + src/main/resources/2018-examples/day6-3.txt | 10 + src/main/resources/2018-examples/day7-1.txt | 7 + src/main/resources/2018-examples/day7-2.txt | 5 + src/main/resources/2018-examples/day8-1.txt | 4 + src/main/resources/2018-examples/day9-1.txt | 26 + src/main/resources/2018/day10.txt | 318 ++ src/main/resources/2018/day11.txt | 1 + src/main/resources/2018/day12.txt | 34 + src/main/resources/2018/day13.txt | 150 + src/main/resources/2018/day14.txt | 1 + src/main/resources/2018/day15.txt | 32 + src/main/resources/2018/day16.txt | 3938 +++++++++++++++++ src/main/resources/2018/day17.txt | 2166 +++++++++ src/main/resources/2018/day18.txt | 50 + src/main/resources/2018/day19.txt | 37 + src/main/resources/2018/day2.txt | 250 ++ src/main/resources/2018/day20.txt | 1 + src/main/resources/2018/day21.txt | 32 + src/main/resources/2018/day22.txt | 2 + src/main/resources/2018/day23.txt | 1000 +++++ src/main/resources/2018/day24.txt | 23 + src/main/resources/2018/day25.txt | 1006 +++++ src/main/resources/2018/day3.txt | 1307 ++++++ src/main/resources/2018/day4.txt | 1267 ++++++ src/main/resources/2018/day5.txt | 1 + src/main/resources/2018/day6.txt | 50 + src/main/resources/2018/day7.txt | 101 + src/main/resources/2018/day8.txt | 1 + src/main/resources/2018/day9.txt | 1 + src/main/resources/2019-examples/day10-1.txt | 5 + src/main/resources/2019-examples/day10-10.txt | 5 + src/main/resources/2019-examples/day10-11.txt | 5 + src/main/resources/2019-examples/day10-12.txt | 5 + src/main/resources/2019-examples/day10-2.txt | 5 + src/main/resources/2019-examples/day10-3.txt | 10 + src/main/resources/2019-examples/day10-4.txt | 10 + src/main/resources/2019-examples/day10-5.txt | 10 + src/main/resources/2019-examples/day10-6.txt | 10 + src/main/resources/2019-examples/day10-7.txt | 20 + src/main/resources/2019-examples/day10-8.txt | 5 + src/main/resources/2019-examples/day10-9.txt | 5 + src/main/resources/2019-examples/day11-1.txt | 5 + src/main/resources/2019-examples/day11-2.txt | 5 + src/main/resources/2019-examples/day11-3.txt | 5 + src/main/resources/2019-examples/day11-4.txt | 5 + src/main/resources/2019-examples/day11-5.txt | 5 + src/main/resources/2019-examples/day12-1.txt | 4 + src/main/resources/2019-examples/day12-2.txt | 65 + src/main/resources/2019-examples/day12-3.txt | 6 + src/main/resources/2019-examples/day12-4.txt | 4 + src/main/resources/2019-examples/day12-5.txt | 72 + src/main/resources/2019-examples/day12-6.txt | 23 + src/main/resources/2019-examples/day12-7.txt | 4 + src/main/resources/2019-examples/day14-1.txt | 6 + src/main/resources/2019-examples/day14-2.txt | 7 + src/main/resources/2019-examples/day14-3.txt | 9 + src/main/resources/2019-examples/day14-4.txt | 12 + src/main/resources/2019-examples/day14-5.txt | 17 + src/main/resources/2019-examples/day15-1.txt | 5 + src/main/resources/2019-examples/day15-10.txt | 5 + src/main/resources/2019-examples/day15-11.txt | 5 + src/main/resources/2019-examples/day15-2.txt | 5 + src/main/resources/2019-examples/day15-3.txt | 5 + src/main/resources/2019-examples/day15-4.txt | 5 + src/main/resources/2019-examples/day15-5.txt | 5 + src/main/resources/2019-examples/day15-6.txt | 5 + src/main/resources/2019-examples/day15-7.txt | 5 + src/main/resources/2019-examples/day15-8.txt | 5 + src/main/resources/2019-examples/day15-9.txt | 5 + src/main/resources/2019-examples/day16-1.txt | 45 + src/main/resources/2019-examples/day17-1.txt | 7 + src/main/resources/2019-examples/day17-2.txt | 7 + src/main/resources/2019-examples/day17-3.txt | 15 + src/main/resources/2019-examples/day17-4.txt | 1 + src/main/resources/2019-examples/day17-5.txt | 18 + src/main/resources/2019-examples/day18-1.txt | 3 + src/main/resources/2019-examples/day18-10.txt | 9 + src/main/resources/2019-examples/day18-11.txt | 6 + src/main/resources/2019-examples/day18-12.txt | 3 + src/main/resources/2019-examples/day18-13.txt | 3 + src/main/resources/2019-examples/day18-14.txt | 7 + src/main/resources/2019-examples/day18-15.txt | 7 + src/main/resources/2019-examples/day18-16.txt | 7 + src/main/resources/2019-examples/day18-17.txt | 7 + src/main/resources/2019-examples/day18-18.txt | 7 + src/main/resources/2019-examples/day18-19.txt | 7 + src/main/resources/2019-examples/day18-2.txt | 3 + src/main/resources/2019-examples/day18-20.txt | 7 + src/main/resources/2019-examples/day18-21.txt | 9 + src/main/resources/2019-examples/day18-3.txt | 3 + src/main/resources/2019-examples/day18-4.txt | 5 + src/main/resources/2019-examples/day18-5.txt | 5 + src/main/resources/2019-examples/day18-6.txt | 5 + src/main/resources/2019-examples/day18-7.txt | 5 + src/main/resources/2019-examples/day18-8.txt | 5 + src/main/resources/2019-examples/day18-9.txt | 5 + src/main/resources/2019-examples/day19-1.txt | 12 + src/main/resources/2019-examples/day19-2.txt | 35 + src/main/resources/2019-examples/day2-1.txt | 1 + src/main/resources/2019-examples/day2-2.txt | 4 + src/main/resources/2019-examples/day2-3.txt | 4 + src/main/resources/2019-examples/day2-4.txt | 4 + src/main/resources/2019-examples/day20-1.txt | 19 + src/main/resources/2019-examples/day20-2.txt | 37 + src/main/resources/2019-examples/day20-3.txt | 37 + src/main/resources/2019-examples/day21-1.txt | 6 + src/main/resources/2019-examples/day21-2.txt | 2 + src/main/resources/2019-examples/day21-3.txt | 34 + src/main/resources/2019-examples/day22-1.txt | 20 + src/main/resources/2019-examples/day22-2.txt | 10 + src/main/resources/2019-examples/day22-3.txt | 10 + src/main/resources/2019-examples/day22-4.txt | 44 + src/main/resources/2019-examples/day22-5.txt | 4 + src/main/resources/2019-examples/day22-6.txt | 4 + src/main/resources/2019-examples/day22-7.txt | 4 + src/main/resources/2019-examples/day22-8.txt | 11 + src/main/resources/2019-examples/day24-1.txt | 34 + src/main/resources/2019-examples/day24-2.txt | 5 + src/main/resources/2019-examples/day24-3.txt | 25 + src/main/resources/2019-examples/day24-4.txt | 25 + src/main/resources/2019-examples/day24-5.txt | 5 + src/main/resources/2019-examples/day24-6.txt | 76 + src/main/resources/2019-examples/day3-1.txt | 10 + src/main/resources/2019-examples/day3-2.txt | 10 + src/main/resources/2019-examples/day3-3.txt | 10 + src/main/resources/2019-examples/day5-1.txt | 8 + src/main/resources/2019-examples/day5-2.txt | 3 + src/main/resources/2019-examples/day6-1.txt | 9 + src/main/resources/2019-examples/day6-2.txt | 11 + src/main/resources/2019-examples/day6-3.txt | 5 + src/main/resources/2019-examples/day6-4.txt | 13 + src/main/resources/2019-examples/day6-5.txt | 7 + src/main/resources/2019-examples/day6-6.txt | 7 + src/main/resources/2019-examples/day7-1.txt | 3 + src/main/resources/2019-examples/day7-2.txt | 1 + src/main/resources/2019-examples/day7-3.txt | 1 + src/main/resources/2019-examples/day7-4.txt | 1 + src/main/resources/2019-examples/day7-5.txt | 8 + src/main/resources/2019-examples/day7-6.txt | 1 + src/main/resources/2019-examples/day7-7.txt | 1 + src/main/resources/2019-examples/day8-1.txt | 5 + src/main/resources/2019-examples/day8-2.txt | 11 + src/main/resources/2019-examples/day8-3.txt | 2 + src/main/resources/2020-examples/day1-1.txt | 6 + src/main/resources/2020-examples/day10-1.txt | 11 + src/main/resources/2020-examples/day10-2.txt | 31 + src/main/resources/2020-examples/day10-3.txt | 8 + src/main/resources/2020-examples/day10-4.txt | 29 + src/main/resources/2020-examples/day11-1.txt | 10 + src/main/resources/2020-examples/day11-10.txt | 10 + src/main/resources/2020-examples/day11-11.txt | 10 + src/main/resources/2020-examples/day11-12.txt | 10 + src/main/resources/2020-examples/day11-13.txt | 10 + src/main/resources/2020-examples/day11-14.txt | 10 + src/main/resources/2020-examples/day11-15.txt | 10 + src/main/resources/2020-examples/day11-16.txt | 10 + src/main/resources/2020-examples/day11-2.txt | 10 + src/main/resources/2020-examples/day11-3.txt | 10 + src/main/resources/2020-examples/day11-4.txt | 10 + src/main/resources/2020-examples/day11-5.txt | 10 + src/main/resources/2020-examples/day11-6.txt | 10 + src/main/resources/2020-examples/day11-7.txt | 9 + src/main/resources/2020-examples/day11-8.txt | 3 + src/main/resources/2020-examples/day11-9.txt | 7 + src/main/resources/2020-examples/day12-1.txt | 5 + src/main/resources/2020-examples/day13-1.txt | 2 + src/main/resources/2020-examples/day13-2.txt | 22 + src/main/resources/2020-examples/day13-3.txt | 1 + src/main/resources/2020-examples/day13-4.txt | 26 + src/main/resources/2020-examples/day14-1.txt | 4 + src/main/resources/2020-examples/day14-2.txt | 3 + src/main/resources/2020-examples/day14-3.txt | 3 + src/main/resources/2020-examples/day14-4.txt | 3 + src/main/resources/2020-examples/day14-5.txt | 4 + src/main/resources/2020-examples/day14-6.txt | 3 + src/main/resources/2020-examples/day14-7.txt | 4 + src/main/resources/2020-examples/day14-8.txt | 3 + src/main/resources/2020-examples/day14-9.txt | 8 + src/main/resources/2020-examples/day16-1.txt | 6 + src/main/resources/2020-examples/day16-2.txt | 12 + src/main/resources/2020-examples/day16-3.txt | 11 + src/main/resources/2020-examples/day17-1.txt | 3 + src/main/resources/2020-examples/day17-2.txt | 110 + src/main/resources/2020-examples/day17-3.txt | 232 + src/main/resources/2020-examples/day18-1.txt | 6 + src/main/resources/2020-examples/day18-2.txt | 6 + src/main/resources/2020-examples/day18-3.txt | 6 + src/main/resources/2020-examples/day19-1.txt | 4 + src/main/resources/2020-examples/day19-2.txt | 6 + src/main/resources/2020-examples/day19-3.txt | 12 + src/main/resources/2020-examples/day19-4.txt | 2 + src/main/resources/2020-examples/day19-5.txt | 47 + src/main/resources/2020-examples/day2-1.txt | 3 + src/main/resources/2020-examples/day20-1.txt | 107 + src/main/resources/2020-examples/day20-2.txt | 32 + src/main/resources/2020-examples/day20-3.txt | 3 + src/main/resources/2020-examples/day20-4.txt | 26 + src/main/resources/2020-examples/day20-5.txt | 24 + src/main/resources/2020-examples/day20-6.txt | 3 + src/main/resources/2020-examples/day20-7.txt | 24 + src/main/resources/2020-examples/day21-1.txt | 4 + src/main/resources/2020-examples/day22-1.txt | 13 + src/main/resources/2020-examples/day22-2.txt | 62 + src/main/resources/2020-examples/day22-3.txt | 11 + src/main/resources/2020-examples/day22-4.txt | 8 + src/main/resources/2020-examples/day22-5.txt | 234 + src/main/resources/2020-examples/day23-1.txt | 52 + src/main/resources/2020-examples/day24-1.txt | 20 + src/main/resources/2020-examples/day24-2.txt | 20 + src/main/resources/2020-examples/day3-1.txt | 11 + src/main/resources/2020-examples/day3-2.txt | 11 + src/main/resources/2020-examples/day3-3.txt | 11 + src/main/resources/2020-examples/day4-1.txt | 13 + src/main/resources/2020-examples/day4-2.txt | 17 + src/main/resources/2020-examples/day4-3.txt | 13 + src/main/resources/2020-examples/day4-4.txt | 12 + src/main/resources/2020-examples/day6-1.txt | 3 + src/main/resources/2020-examples/day6-2.txt | 15 + src/main/resources/2020-examples/day6-3.txt | 15 + src/main/resources/2020-examples/day7-1.txt | 9 + src/main/resources/2020-examples/day7-2.txt | 7 + src/main/resources/2020-examples/day8-1.txt | 9 + src/main/resources/2020-examples/day8-2.txt | 9 + src/main/resources/2020-examples/day8-3.txt | 9 + src/main/resources/2020-examples/day8-4.txt | 9 + src/main/resources/2020-examples/day9-1.txt | 20 + src/main/resources/2020-examples/day9-2.txt | 20 + 467 files changed, 36348 insertions(+), 18 deletions(-) create mode 100644 .idea/runConfigurations.xml create mode 100644 src/main/resources/2015-examples/day13-1.txt create mode 100644 src/main/resources/2015-examples/day13-2.txt create mode 100644 src/main/resources/2015-examples/day15-1.txt create mode 100644 src/main/resources/2015-examples/day16-1.txt create mode 100644 src/main/resources/2015-examples/day18-1.txt create mode 100644 src/main/resources/2015-examples/day18-2.txt create mode 100644 src/main/resources/2015-examples/day19-1.txt create mode 100644 src/main/resources/2015-examples/day20-1.txt create mode 100644 src/main/resources/2015-examples/day21-1.txt create mode 100644 src/main/resources/2015-examples/day22-1.txt create mode 100644 src/main/resources/2015-examples/day22-2.txt create mode 100644 src/main/resources/2015-examples/day23-1.txt create mode 100644 src/main/resources/2015-examples/day24-1.txt create mode 100644 src/main/resources/2015-examples/day25-1.txt create mode 100644 src/main/resources/2015-examples/day25-2.txt create mode 100644 src/main/resources/2015-examples/day7-1.txt create mode 100644 src/main/resources/2015-examples/day7-2.txt create mode 100644 src/main/resources/2015-examples/day9-1.txt create mode 100644 src/main/resources/2015-examples/day9-2.txt create mode 100644 src/main/resources/2015/day1.txt create mode 100644 src/main/resources/2015/day10.txt create mode 100644 src/main/resources/2015/day11.txt create mode 100644 src/main/resources/2015/day12.txt create mode 100644 src/main/resources/2015/day13.txt create mode 100644 src/main/resources/2015/day14.txt create mode 100644 src/main/resources/2015/day15.txt create mode 100644 src/main/resources/2015/day16.txt create mode 100644 src/main/resources/2015/day17.txt create mode 100644 src/main/resources/2015/day18.txt create mode 100644 src/main/resources/2015/day19.txt create mode 100644 src/main/resources/2015/day2.txt create mode 100644 src/main/resources/2015/day20.txt create mode 100644 src/main/resources/2015/day21.txt create mode 100644 src/main/resources/2015/day22.txt create mode 100644 src/main/resources/2015/day23.txt create mode 100644 src/main/resources/2015/day24.txt create mode 100644 src/main/resources/2015/day25.txt create mode 100644 src/main/resources/2015/day3.txt create mode 100644 src/main/resources/2015/day4.txt create mode 100644 src/main/resources/2015/day5.txt create mode 100644 src/main/resources/2015/day6.txt create mode 100644 src/main/resources/2015/day7.txt create mode 100644 src/main/resources/2015/day8.txt create mode 100644 src/main/resources/2015/day9.txt create mode 100644 src/main/resources/2016-examples/day10-1.txt create mode 100644 src/main/resources/2016-examples/day11-1.txt create mode 100644 src/main/resources/2016-examples/day11-10.txt create mode 100644 src/main/resources/2016-examples/day11-11.txt create mode 100644 src/main/resources/2016-examples/day11-12.txt create mode 100644 src/main/resources/2016-examples/day11-13.txt create mode 100644 src/main/resources/2016-examples/day11-2.txt create mode 100644 src/main/resources/2016-examples/day11-3.txt create mode 100644 src/main/resources/2016-examples/day11-4.txt create mode 100644 src/main/resources/2016-examples/day11-5.txt create mode 100644 src/main/resources/2016-examples/day11-6.txt create mode 100644 src/main/resources/2016-examples/day11-7.txt create mode 100644 src/main/resources/2016-examples/day11-8.txt create mode 100644 src/main/resources/2016-examples/day11-9.txt create mode 100644 src/main/resources/2016-examples/day12-1.txt create mode 100644 src/main/resources/2016-examples/day13-1.txt create mode 100644 src/main/resources/2016-examples/day13-2.txt create mode 100644 src/main/resources/2016-examples/day15-1.txt create mode 100644 src/main/resources/2016-examples/day17-1.txt create mode 100644 src/main/resources/2016-examples/day18-1.txt create mode 100644 src/main/resources/2016-examples/day18-2.txt create mode 100644 src/main/resources/2016-examples/day18-3.txt create mode 100644 src/main/resources/2016-examples/day19-1.txt create mode 100644 src/main/resources/2016-examples/day2-1.txt create mode 100644 src/main/resources/2016-examples/day2-2.txt create mode 100644 src/main/resources/2016-examples/day20-1.txt create mode 100644 src/main/resources/2016-examples/day23-1.txt create mode 100644 src/main/resources/2016-examples/day24-1.txt create mode 100644 src/main/resources/2016-examples/day6-1.txt create mode 100644 src/main/resources/2016-examples/day8-1.txt create mode 100644 src/main/resources/2016-examples/day8-2.txt create mode 100644 src/main/resources/2016-examples/day8-3.txt create mode 100644 src/main/resources/2016-examples/day8-4.txt create mode 100644 src/main/resources/2016/day1.txt create mode 100644 src/main/resources/2016/day10.txt create mode 100644 src/main/resources/2016/day11.txt create mode 100644 src/main/resources/2016/day12.txt create mode 100644 src/main/resources/2016/day13.txt create mode 100644 src/main/resources/2016/day14.txt create mode 100644 src/main/resources/2016/day15.txt create mode 100644 src/main/resources/2016/day16.txt create mode 100644 src/main/resources/2016/day17.txt create mode 100644 src/main/resources/2016/day18.txt create mode 100644 src/main/resources/2016/day19.txt create mode 100644 src/main/resources/2016/day2.txt create mode 100644 src/main/resources/2016/day20.txt create mode 100644 src/main/resources/2016/day21.txt create mode 100644 src/main/resources/2016/day22.txt create mode 100644 src/main/resources/2016/day23.txt create mode 100644 src/main/resources/2016/day24.txt create mode 100644 src/main/resources/2016/day25.txt create mode 100644 src/main/resources/2016/day3.txt create mode 100644 src/main/resources/2016/day4.txt create mode 100644 src/main/resources/2016/day5.txt create mode 100644 src/main/resources/2016/day6.txt create mode 100644 src/main/resources/2016/day7.txt create mode 100644 src/main/resources/2016/day8.txt create mode 100644 src/main/resources/2016/day9.txt create mode 100644 src/main/resources/2017-examples/day10-1.txt create mode 100644 src/main/resources/2017-examples/day11-1.txt create mode 100644 src/main/resources/2017-examples/day12-1.txt create mode 100644 src/main/resources/2017-examples/day13-1.txt create mode 100644 src/main/resources/2017-examples/day13-2.txt create mode 100644 src/main/resources/2017-examples/day13-3.txt create mode 100644 src/main/resources/2017-examples/day13-4.txt create mode 100644 src/main/resources/2017-examples/day14-1.txt create mode 100644 src/main/resources/2017-examples/day15-1.txt create mode 100644 src/main/resources/2017-examples/day15-2.txt create mode 100644 src/main/resources/2017-examples/day17-1.txt create mode 100644 src/main/resources/2017-examples/day18-1.txt create mode 100644 src/main/resources/2017-examples/day19-1.txt create mode 100644 src/main/resources/2017-examples/day2-1.txt create mode 100644 src/main/resources/2017-examples/day20-1.txt create mode 100644 src/main/resources/2017-examples/day21-1.txt create mode 100644 src/main/resources/2017-examples/day21-2.txt create mode 100644 src/main/resources/2017-examples/day21-3.txt create mode 100644 src/main/resources/2017-examples/day21-4.txt create mode 100644 src/main/resources/2017-examples/day21-5.txt create mode 100644 src/main/resources/2017-examples/day21-6.txt create mode 100644 src/main/resources/2017-examples/day21-7.txt create mode 100644 src/main/resources/2017-examples/day21-8.txt create mode 100644 src/main/resources/2017-examples/day21-9.txt create mode 100644 src/main/resources/2017-examples/day22-1.txt create mode 100644 src/main/resources/2017-examples/day22-2.txt create mode 100644 src/main/resources/2017-examples/day22-3.txt create mode 100644 src/main/resources/2017-examples/day22-4.txt create mode 100644 src/main/resources/2017-examples/day22-5.txt create mode 100644 src/main/resources/2017-examples/day22-6.txt create mode 100644 src/main/resources/2017-examples/day22-7.txt create mode 100644 src/main/resources/2017-examples/day24-1.txt create mode 100644 src/main/resources/2017-examples/day25-1.txt create mode 100644 src/main/resources/2017-examples/day25-2.txt create mode 100644 src/main/resources/2017-examples/day3-1.txt create mode 100644 src/main/resources/2017-examples/day5-1.txt create mode 100644 src/main/resources/2017-examples/day7-1.txt create mode 100644 src/main/resources/2017-examples/day7-2.txt create mode 100644 src/main/resources/2017-examples/day8-1.txt create mode 100644 src/main/resources/2017/day1.txt create mode 100644 src/main/resources/2017/day10.txt create mode 100644 src/main/resources/2017/day11.txt create mode 100644 src/main/resources/2017/day12.txt create mode 100644 src/main/resources/2017/day13.txt create mode 100644 src/main/resources/2017/day14.txt create mode 100644 src/main/resources/2017/day15.txt create mode 100644 src/main/resources/2017/day16.txt create mode 100644 src/main/resources/2017/day17.txt create mode 100644 src/main/resources/2017/day18.txt create mode 100644 src/main/resources/2017/day19.txt create mode 100644 src/main/resources/2017/day2.txt create mode 100644 src/main/resources/2017/day20.txt create mode 100644 src/main/resources/2017/day21.txt create mode 100644 src/main/resources/2017/day22.txt create mode 100644 src/main/resources/2017/day23.txt create mode 100644 src/main/resources/2017/day24.txt create mode 100644 src/main/resources/2017/day25.txt create mode 100644 src/main/resources/2017/day3.txt create mode 100644 src/main/resources/2017/day4.txt create mode 100644 src/main/resources/2017/day5.txt create mode 100644 src/main/resources/2017/day6.txt create mode 100644 src/main/resources/2017/day7.txt create mode 100644 src/main/resources/2017/day8.txt create mode 100644 src/main/resources/2017/day9.txt create mode 100644 src/main/resources/2018-examples/day10-1.txt create mode 100644 src/main/resources/2018-examples/day10-2.txt create mode 100644 src/main/resources/2018-examples/day11-1.txt create mode 100644 src/main/resources/2018-examples/day11-2.txt create mode 100644 src/main/resources/2018-examples/day12-1.txt create mode 100644 src/main/resources/2018-examples/day12-2.txt create mode 100644 src/main/resources/2018-examples/day13-1.txt create mode 100644 src/main/resources/2018-examples/day13-2.txt create mode 100644 src/main/resources/2018-examples/day13-3.txt create mode 100644 src/main/resources/2018-examples/day13-4.txt create mode 100644 src/main/resources/2018-examples/day13-5.txt create mode 100644 src/main/resources/2018-examples/day14-1.txt create mode 100644 src/main/resources/2018-examples/day15-1.txt create mode 100644 src/main/resources/2018-examples/day15-10.txt create mode 100644 src/main/resources/2018-examples/day15-11.txt create mode 100644 src/main/resources/2018-examples/day15-2.txt create mode 100644 src/main/resources/2018-examples/day15-3.txt create mode 100644 src/main/resources/2018-examples/day15-4.txt create mode 100644 src/main/resources/2018-examples/day15-5.txt create mode 100644 src/main/resources/2018-examples/day15-6.txt create mode 100644 src/main/resources/2018-examples/day15-7.txt create mode 100644 src/main/resources/2018-examples/day15-8.txt create mode 100644 src/main/resources/2018-examples/day15-9.txt create mode 100644 src/main/resources/2018-examples/day16-1.txt create mode 100644 src/main/resources/2018-examples/day17-1.txt create mode 100644 src/main/resources/2018-examples/day17-2.txt create mode 100644 src/main/resources/2018-examples/day17-3.txt create mode 100644 src/main/resources/2018-examples/day17-4.txt create mode 100644 src/main/resources/2018-examples/day17-5.txt create mode 100644 src/main/resources/2018-examples/day17-6.txt create mode 100644 src/main/resources/2018-examples/day17-7.txt create mode 100644 src/main/resources/2018-examples/day17-8.txt create mode 100644 src/main/resources/2018-examples/day18-1.txt create mode 100644 src/main/resources/2018-examples/day19-1.txt create mode 100644 src/main/resources/2018-examples/day19-2.txt create mode 100644 src/main/resources/2018-examples/day20-1.txt create mode 100644 src/main/resources/2018-examples/day20-2.txt create mode 100644 src/main/resources/2018-examples/day20-3.txt create mode 100644 src/main/resources/2018-examples/day20-4.txt create mode 100644 src/main/resources/2018-examples/day20-5.txt create mode 100644 src/main/resources/2018-examples/day20-6.txt create mode 100644 src/main/resources/2018-examples/day20-7.txt create mode 100644 src/main/resources/2018-examples/day20-8.txt create mode 100644 src/main/resources/2018-examples/day22-1.txt create mode 100644 src/main/resources/2018-examples/day23-1.txt create mode 100644 src/main/resources/2018-examples/day24-1.txt create mode 100644 src/main/resources/2018-examples/day24-10.txt create mode 100644 src/main/resources/2018-examples/day24-11.txt create mode 100644 src/main/resources/2018-examples/day24-2.txt create mode 100644 src/main/resources/2018-examples/day24-3.txt create mode 100644 src/main/resources/2018-examples/day24-4.txt create mode 100644 src/main/resources/2018-examples/day24-5.txt create mode 100644 src/main/resources/2018-examples/day24-6.txt create mode 100644 src/main/resources/2018-examples/day24-7.txt create mode 100644 src/main/resources/2018-examples/day24-8.txt create mode 100644 src/main/resources/2018-examples/day24-9.txt create mode 100644 src/main/resources/2018-examples/day25-1.txt create mode 100644 src/main/resources/2018-examples/day25-2.txt create mode 100644 src/main/resources/2018-examples/day25-3.txt create mode 100644 src/main/resources/2018-examples/day25-4.txt create mode 100644 src/main/resources/2018-examples/day3-1.txt create mode 100644 src/main/resources/2018-examples/day3-2.txt create mode 100644 src/main/resources/2018-examples/day3-3.txt create mode 100644 src/main/resources/2018-examples/day4-1.txt create mode 100644 src/main/resources/2018-examples/day4-2.txt create mode 100644 src/main/resources/2018-examples/day5-1.txt create mode 100644 src/main/resources/2018-examples/day6-1.txt create mode 100644 src/main/resources/2018-examples/day6-2.txt create mode 100644 src/main/resources/2018-examples/day6-3.txt create mode 100644 src/main/resources/2018-examples/day7-1.txt create mode 100644 src/main/resources/2018-examples/day7-2.txt create mode 100644 src/main/resources/2018-examples/day8-1.txt create mode 100644 src/main/resources/2018-examples/day9-1.txt create mode 100644 src/main/resources/2018/day10.txt create mode 100644 src/main/resources/2018/day11.txt create mode 100644 src/main/resources/2018/day12.txt create mode 100644 src/main/resources/2018/day13.txt create mode 100644 src/main/resources/2018/day14.txt create mode 100644 src/main/resources/2018/day15.txt create mode 100644 src/main/resources/2018/day16.txt create mode 100644 src/main/resources/2018/day17.txt create mode 100644 src/main/resources/2018/day18.txt create mode 100644 src/main/resources/2018/day19.txt create mode 100644 src/main/resources/2018/day2.txt create mode 100644 src/main/resources/2018/day20.txt create mode 100644 src/main/resources/2018/day21.txt create mode 100644 src/main/resources/2018/day22.txt create mode 100644 src/main/resources/2018/day23.txt create mode 100644 src/main/resources/2018/day24.txt create mode 100644 src/main/resources/2018/day25.txt create mode 100644 src/main/resources/2018/day3.txt create mode 100644 src/main/resources/2018/day4.txt create mode 100644 src/main/resources/2018/day5.txt create mode 100644 src/main/resources/2018/day6.txt create mode 100644 src/main/resources/2018/day7.txt create mode 100644 src/main/resources/2018/day8.txt create mode 100644 src/main/resources/2018/day9.txt create mode 100644 src/main/resources/2019-examples/day10-1.txt create mode 100644 src/main/resources/2019-examples/day10-10.txt create mode 100644 src/main/resources/2019-examples/day10-11.txt create mode 100644 src/main/resources/2019-examples/day10-12.txt create mode 100644 src/main/resources/2019-examples/day10-2.txt create mode 100644 src/main/resources/2019-examples/day10-3.txt create mode 100644 src/main/resources/2019-examples/day10-4.txt create mode 100644 src/main/resources/2019-examples/day10-5.txt create mode 100644 src/main/resources/2019-examples/day10-6.txt create mode 100644 src/main/resources/2019-examples/day10-7.txt create mode 100644 src/main/resources/2019-examples/day10-8.txt create mode 100644 src/main/resources/2019-examples/day10-9.txt create mode 100644 src/main/resources/2019-examples/day11-1.txt create mode 100644 src/main/resources/2019-examples/day11-2.txt create mode 100644 src/main/resources/2019-examples/day11-3.txt create mode 100644 src/main/resources/2019-examples/day11-4.txt create mode 100644 src/main/resources/2019-examples/day11-5.txt create mode 100644 src/main/resources/2019-examples/day12-1.txt create mode 100644 src/main/resources/2019-examples/day12-2.txt create mode 100644 src/main/resources/2019-examples/day12-3.txt create mode 100644 src/main/resources/2019-examples/day12-4.txt create mode 100644 src/main/resources/2019-examples/day12-5.txt create mode 100644 src/main/resources/2019-examples/day12-6.txt create mode 100644 src/main/resources/2019-examples/day12-7.txt create mode 100644 src/main/resources/2019-examples/day14-1.txt create mode 100644 src/main/resources/2019-examples/day14-2.txt create mode 100644 src/main/resources/2019-examples/day14-3.txt create mode 100644 src/main/resources/2019-examples/day14-4.txt create mode 100644 src/main/resources/2019-examples/day14-5.txt create mode 100644 src/main/resources/2019-examples/day15-1.txt create mode 100644 src/main/resources/2019-examples/day15-10.txt create mode 100644 src/main/resources/2019-examples/day15-11.txt create mode 100644 src/main/resources/2019-examples/day15-2.txt create mode 100644 src/main/resources/2019-examples/day15-3.txt create mode 100644 src/main/resources/2019-examples/day15-4.txt create mode 100644 src/main/resources/2019-examples/day15-5.txt create mode 100644 src/main/resources/2019-examples/day15-6.txt create mode 100644 src/main/resources/2019-examples/day15-7.txt create mode 100644 src/main/resources/2019-examples/day15-8.txt create mode 100644 src/main/resources/2019-examples/day15-9.txt create mode 100644 src/main/resources/2019-examples/day16-1.txt create mode 100644 src/main/resources/2019-examples/day17-1.txt create mode 100644 src/main/resources/2019-examples/day17-2.txt create mode 100644 src/main/resources/2019-examples/day17-3.txt create mode 100644 src/main/resources/2019-examples/day17-4.txt create mode 100644 src/main/resources/2019-examples/day17-5.txt create mode 100644 src/main/resources/2019-examples/day18-1.txt create mode 100644 src/main/resources/2019-examples/day18-10.txt create mode 100644 src/main/resources/2019-examples/day18-11.txt create mode 100644 src/main/resources/2019-examples/day18-12.txt create mode 100644 src/main/resources/2019-examples/day18-13.txt create mode 100644 src/main/resources/2019-examples/day18-14.txt create mode 100644 src/main/resources/2019-examples/day18-15.txt create mode 100644 src/main/resources/2019-examples/day18-16.txt create mode 100644 src/main/resources/2019-examples/day18-17.txt create mode 100644 src/main/resources/2019-examples/day18-18.txt create mode 100644 src/main/resources/2019-examples/day18-19.txt create mode 100644 src/main/resources/2019-examples/day18-2.txt create mode 100644 src/main/resources/2019-examples/day18-20.txt create mode 100644 src/main/resources/2019-examples/day18-21.txt create mode 100644 src/main/resources/2019-examples/day18-3.txt create mode 100644 src/main/resources/2019-examples/day18-4.txt create mode 100644 src/main/resources/2019-examples/day18-5.txt create mode 100644 src/main/resources/2019-examples/day18-6.txt create mode 100644 src/main/resources/2019-examples/day18-7.txt create mode 100644 src/main/resources/2019-examples/day18-8.txt create mode 100644 src/main/resources/2019-examples/day18-9.txt create mode 100644 src/main/resources/2019-examples/day19-1.txt create mode 100644 src/main/resources/2019-examples/day19-2.txt create mode 100644 src/main/resources/2019-examples/day2-1.txt create mode 100644 src/main/resources/2019-examples/day2-2.txt create mode 100644 src/main/resources/2019-examples/day2-3.txt create mode 100644 src/main/resources/2019-examples/day2-4.txt create mode 100644 src/main/resources/2019-examples/day20-1.txt create mode 100644 src/main/resources/2019-examples/day20-2.txt create mode 100644 src/main/resources/2019-examples/day20-3.txt create mode 100644 src/main/resources/2019-examples/day21-1.txt create mode 100644 src/main/resources/2019-examples/day21-2.txt create mode 100644 src/main/resources/2019-examples/day21-3.txt create mode 100644 src/main/resources/2019-examples/day22-1.txt create mode 100644 src/main/resources/2019-examples/day22-2.txt create mode 100644 src/main/resources/2019-examples/day22-3.txt create mode 100644 src/main/resources/2019-examples/day22-4.txt create mode 100644 src/main/resources/2019-examples/day22-5.txt create mode 100644 src/main/resources/2019-examples/day22-6.txt create mode 100644 src/main/resources/2019-examples/day22-7.txt create mode 100644 src/main/resources/2019-examples/day22-8.txt create mode 100644 src/main/resources/2019-examples/day24-1.txt create mode 100644 src/main/resources/2019-examples/day24-2.txt create mode 100644 src/main/resources/2019-examples/day24-3.txt create mode 100644 src/main/resources/2019-examples/day24-4.txt create mode 100644 src/main/resources/2019-examples/day24-5.txt create mode 100644 src/main/resources/2019-examples/day24-6.txt create mode 100644 src/main/resources/2019-examples/day3-1.txt create mode 100644 src/main/resources/2019-examples/day3-2.txt create mode 100644 src/main/resources/2019-examples/day3-3.txt create mode 100644 src/main/resources/2019-examples/day5-1.txt create mode 100644 src/main/resources/2019-examples/day5-2.txt create mode 100644 src/main/resources/2019-examples/day6-1.txt create mode 100644 src/main/resources/2019-examples/day6-2.txt create mode 100644 src/main/resources/2019-examples/day6-3.txt create mode 100644 src/main/resources/2019-examples/day6-4.txt create mode 100644 src/main/resources/2019-examples/day6-5.txt create mode 100644 src/main/resources/2019-examples/day6-6.txt create mode 100644 src/main/resources/2019-examples/day7-1.txt create mode 100644 src/main/resources/2019-examples/day7-2.txt create mode 100644 src/main/resources/2019-examples/day7-3.txt create mode 100644 src/main/resources/2019-examples/day7-4.txt create mode 100644 src/main/resources/2019-examples/day7-5.txt create mode 100644 src/main/resources/2019-examples/day7-6.txt create mode 100644 src/main/resources/2019-examples/day7-7.txt create mode 100644 src/main/resources/2019-examples/day8-1.txt create mode 100644 src/main/resources/2019-examples/day8-2.txt create mode 100644 src/main/resources/2019-examples/day8-3.txt create mode 100644 src/main/resources/2020-examples/day1-1.txt create mode 100644 src/main/resources/2020-examples/day10-1.txt create mode 100644 src/main/resources/2020-examples/day10-2.txt create mode 100644 src/main/resources/2020-examples/day10-3.txt create mode 100644 src/main/resources/2020-examples/day10-4.txt create mode 100644 src/main/resources/2020-examples/day11-1.txt create mode 100644 src/main/resources/2020-examples/day11-10.txt create mode 100644 src/main/resources/2020-examples/day11-11.txt create mode 100644 src/main/resources/2020-examples/day11-12.txt create mode 100644 src/main/resources/2020-examples/day11-13.txt create mode 100644 src/main/resources/2020-examples/day11-14.txt create mode 100644 src/main/resources/2020-examples/day11-15.txt create mode 100644 src/main/resources/2020-examples/day11-16.txt create mode 100644 src/main/resources/2020-examples/day11-2.txt create mode 100644 src/main/resources/2020-examples/day11-3.txt create mode 100644 src/main/resources/2020-examples/day11-4.txt create mode 100644 src/main/resources/2020-examples/day11-5.txt create mode 100644 src/main/resources/2020-examples/day11-6.txt create mode 100644 src/main/resources/2020-examples/day11-7.txt create mode 100644 src/main/resources/2020-examples/day11-8.txt create mode 100644 src/main/resources/2020-examples/day11-9.txt create mode 100644 src/main/resources/2020-examples/day12-1.txt create mode 100644 src/main/resources/2020-examples/day13-1.txt create mode 100644 src/main/resources/2020-examples/day13-2.txt create mode 100644 src/main/resources/2020-examples/day13-3.txt create mode 100644 src/main/resources/2020-examples/day13-4.txt create mode 100644 src/main/resources/2020-examples/day14-1.txt create mode 100644 src/main/resources/2020-examples/day14-2.txt create mode 100644 src/main/resources/2020-examples/day14-3.txt create mode 100644 src/main/resources/2020-examples/day14-4.txt create mode 100644 src/main/resources/2020-examples/day14-5.txt create mode 100644 src/main/resources/2020-examples/day14-6.txt create mode 100644 src/main/resources/2020-examples/day14-7.txt create mode 100644 src/main/resources/2020-examples/day14-8.txt create mode 100644 src/main/resources/2020-examples/day14-9.txt create mode 100644 src/main/resources/2020-examples/day16-1.txt create mode 100644 src/main/resources/2020-examples/day16-2.txt create mode 100644 src/main/resources/2020-examples/day16-3.txt create mode 100644 src/main/resources/2020-examples/day17-1.txt create mode 100644 src/main/resources/2020-examples/day17-2.txt create mode 100644 src/main/resources/2020-examples/day17-3.txt create mode 100644 src/main/resources/2020-examples/day18-1.txt create mode 100644 src/main/resources/2020-examples/day18-2.txt create mode 100644 src/main/resources/2020-examples/day18-3.txt create mode 100644 src/main/resources/2020-examples/day19-1.txt create mode 100644 src/main/resources/2020-examples/day19-2.txt create mode 100644 src/main/resources/2020-examples/day19-3.txt create mode 100644 src/main/resources/2020-examples/day19-4.txt create mode 100644 src/main/resources/2020-examples/day19-5.txt create mode 100644 src/main/resources/2020-examples/day2-1.txt create mode 100644 src/main/resources/2020-examples/day20-1.txt create mode 100644 src/main/resources/2020-examples/day20-2.txt create mode 100644 src/main/resources/2020-examples/day20-3.txt create mode 100644 src/main/resources/2020-examples/day20-4.txt create mode 100644 src/main/resources/2020-examples/day20-5.txt create mode 100644 src/main/resources/2020-examples/day20-6.txt create mode 100644 src/main/resources/2020-examples/day20-7.txt create mode 100644 src/main/resources/2020-examples/day21-1.txt create mode 100644 src/main/resources/2020-examples/day22-1.txt create mode 100644 src/main/resources/2020-examples/day22-2.txt create mode 100644 src/main/resources/2020-examples/day22-3.txt create mode 100644 src/main/resources/2020-examples/day22-4.txt create mode 100644 src/main/resources/2020-examples/day22-5.txt create mode 100644 src/main/resources/2020-examples/day23-1.txt create mode 100644 src/main/resources/2020-examples/day24-1.txt create mode 100644 src/main/resources/2020-examples/day24-2.txt create mode 100644 src/main/resources/2020-examples/day3-1.txt create mode 100644 src/main/resources/2020-examples/day3-2.txt create mode 100644 src/main/resources/2020-examples/day3-3.txt create mode 100644 src/main/resources/2020-examples/day4-1.txt create mode 100644 src/main/resources/2020-examples/day4-2.txt create mode 100644 src/main/resources/2020-examples/day4-3.txt create mode 100644 src/main/resources/2020-examples/day4-4.txt create mode 100644 src/main/resources/2020-examples/day6-1.txt create mode 100644 src/main/resources/2020-examples/day6-2.txt create mode 100644 src/main/resources/2020-examples/day6-3.txt create mode 100644 src/main/resources/2020-examples/day7-1.txt create mode 100644 src/main/resources/2020-examples/day7-2.txt create mode 100644 src/main/resources/2020-examples/day8-1.txt create mode 100644 src/main/resources/2020-examples/day8-2.txt create mode 100644 src/main/resources/2020-examples/day8-3.txt create mode 100644 src/main/resources/2020-examples/day8-4.txt create mode 100644 src/main/resources/2020-examples/day9-1.txt create mode 100644 src/main/resources/2020-examples/day9-2.txt diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 05810ced..2f3e6e57 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -2,6 +2,7 @@ + @@ -10,7 +11,7 @@ - + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 972ec8d7..482738ca 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -7,5 +7,5 @@ - + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 00000000..797acea5 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/adventofcode2019.iml b/adventofcode2019.iml index 873f0da3..842a5127 100644 --- a/adventofcode2019.iml +++ b/adventofcode2019.iml @@ -5,7 +5,7 @@ - + @@ -15,17 +15,17 @@ - + - - + + - - + + - + @@ -33,5 +33,7 @@ + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index d65e6128..d69d727e 100644 --- a/pom.xml +++ b/pom.xml @@ -13,8 +13,8 @@ org.apache.maven.plugins maven-compiler-plugin - 11 - 11 + 17 + 17 @@ -28,24 +28,24 @@ junit junit - 4.13.1 + 4.13.2 test org.projectlombok lombok - 1.18.16 + 1.18.22 provided com.google.guava guava - 30.0-jre + 31.0.1-jre org.apache.commons commons-lang3 - 3.11 + 3.12.0 org.apache.commons @@ -77,5 +77,10 @@ commons-configuration2 2.7 + + net.sourceforge.htmlcleaner + htmlcleaner + 2.25 + diff --git a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java index a76d6458..c664090c 100644 --- a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java +++ b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java @@ -7,7 +7,6 @@ import java.net.HttpCookie; import java.net.URI; import java.net.URISyntaxException; -import java.net.URL; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; @@ -51,7 +50,7 @@ public static void main(String[] args) throws Exception { String year = args[0]; String day = args[1]; String session = System.getenv("AOCSESSION"); - new FetchInput(session).runForYear(year); + new FetchInput(session).retrieveDay(day, year); } @@ -63,7 +62,8 @@ private void retrieveDay(String day, String year) { private void retrieveExamples(String day, String year) { var matches = getMatchesByXpath(doRequest(year + "/day/" + day), "//pre/code"); for(int i = 0; i< matches.size(); i++){ - File file = getFile(day + "-" + (i + 1), year); + File file = getFile(day + "-" + (i + 1), year+"-examples"); + file.getParentFile().mkdirs(); if(!file.exists()) { writeFile(file, matches.get(i)); } @@ -78,6 +78,7 @@ private void runForYear(String year) { private void retrieveInput(String day, String year) { File dayFile = getFile(day, year); + dayFile.getParentFile().mkdirs(); if(!dayFile.exists()){ writeFile(dayFile, doRequest(year + "/day/" + day + "/input")); } diff --git a/src/main/resources/2015-examples/day13-1.txt b/src/main/resources/2015-examples/day13-1.txt new file mode 100644 index 00000000..b67c3c6f --- /dev/null +++ b/src/main/resources/2015-examples/day13-1.txt @@ -0,0 +1,12 @@ +Alice would gain 54 happiness units by sitting next to Bob. +Alice would lose 79 happiness units by sitting next to Carol. +Alice would lose 2 happiness units by sitting next to David. +Bob would gain 83 happiness units by sitting next to Alice. +Bob would lose 7 happiness units by sitting next to Carol. +Bob would lose 63 happiness units by sitting next to David. +Carol would lose 62 happiness units by sitting next to Alice. +Carol would gain 60 happiness units by sitting next to Bob. +Carol would gain 55 happiness units by sitting next to David. +David would gain 46 happiness units by sitting next to Alice. +David would lose 7 happiness units by sitting next to Bob. +David would gain 41 happiness units by sitting next to Carol. diff --git a/src/main/resources/2015-examples/day13-2.txt b/src/main/resources/2015-examples/day13-2.txt new file mode 100644 index 00000000..5fad4498 --- /dev/null +++ b/src/main/resources/2015-examples/day13-2.txt @@ -0,0 +1,5 @@ + +41 +46 ++55 David -2 +Carol Alice ++60 Bob +54 + -7 +83 diff --git a/src/main/resources/2015-examples/day15-1.txt b/src/main/resources/2015-examples/day15-1.txt new file mode 100644 index 00000000..1a7ff256 --- /dev/null +++ b/src/main/resources/2015-examples/day15-1.txt @@ -0,0 +1,2 @@ +Butterscotch: capacity -1, durability -2, flavor 6, texture 3, calories 8 +Cinnamon: capacity 2, durability 3, flavor -2, texture -1, calories 3 diff --git a/src/main/resources/2015-examples/day16-1.txt b/src/main/resources/2015-examples/day16-1.txt new file mode 100644 index 00000000..ab4a9e4e --- /dev/null +++ b/src/main/resources/2015-examples/day16-1.txt @@ -0,0 +1,10 @@ +children: 3 +cats: 7 +samoyeds: 2 +pomeranians: 3 +akitas: 0 +vizslas: 0 +goldfish: 5 +trees: 3 +cars: 2 +perfumes: 1 diff --git a/src/main/resources/2015-examples/day18-1.txt b/src/main/resources/2015-examples/day18-1.txt new file mode 100644 index 00000000..c983cdfa --- /dev/null +++ b/src/main/resources/2015-examples/day18-1.txt @@ -0,0 +1,6 @@ +1B5... +234... +...... +..123. +..8A4. +..765. diff --git a/src/main/resources/2015-examples/day18-2.txt b/src/main/resources/2015-examples/day18-2.txt new file mode 100644 index 00000000..ba052dd4 --- /dev/null +++ b/src/main/resources/2015-examples/day18-2.txt @@ -0,0 +1,39 @@ +Initial state: +.#.#.# +...##. +#....# +..#... +#.#..# +####.. + +After 1 step: +..##.. +..##.# +...##. +...... +#..... +#.##.. + +After 2 steps: +..###. +...... +..###. +...... +.#.... +.#.... + +After 3 steps: +...#.. +...... +...#.. +..##.. +...... +...... + +After 4 steps: +...... +...... +..##.. +..##.. +...... +...... diff --git a/src/main/resources/2015-examples/day19-1.txt b/src/main/resources/2015-examples/day19-1.txt new file mode 100644 index 00000000..bdbac08e --- /dev/null +++ b/src/main/resources/2015-examples/day19-1.txt @@ -0,0 +1,3 @@ +H => HO +H => OH +O => HH diff --git a/src/main/resources/2015-examples/day20-1.txt b/src/main/resources/2015-examples/day20-1.txt new file mode 100644 index 00000000..b89e91d9 --- /dev/null +++ b/src/main/resources/2015-examples/day20-1.txt @@ -0,0 +1,9 @@ +House 1 got 10 presents. +House 2 got 30 presents. +House 3 got 40 presents. +House 4 got 70 presents. +House 5 got 60 presents. +House 6 got 120 presents. +House 7 got 80 presents. +House 8 got 150 presents. +House 9 got 130 presents. diff --git a/src/main/resources/2015-examples/day21-1.txt b/src/main/resources/2015-examples/day21-1.txt new file mode 100644 index 00000000..8637bef7 --- /dev/null +++ b/src/main/resources/2015-examples/day21-1.txt @@ -0,0 +1,21 @@ +Weapons: Cost Damage Armor +Dagger 8 4 0 +Shortsword 10 5 0 +Warhammer 25 6 0 +Longsword 40 7 0 +Greataxe 74 8 0 + +Armor: Cost Damage Armor +Leather 13 0 1 +Chainmail 31 0 2 +Splintmail 53 0 3 +Bandedmail 75 0 4 +Platemail 102 0 5 + +Rings: Cost Damage Armor +Damage +1 25 1 0 +Damage +2 50 2 0 +Damage +3 100 3 0 +Defense +1 20 0 1 +Defense +2 40 0 2 +Defense +3 80 0 3 diff --git a/src/main/resources/2015-examples/day22-1.txt b/src/main/resources/2015-examples/day22-1.txt new file mode 100644 index 00000000..4bede78c --- /dev/null +++ b/src/main/resources/2015-examples/day22-1.txt @@ -0,0 +1,21 @@ +-- Player turn -- +- Player has 10 hit points, 0 armor, 250 mana +- Boss has 13 hit points +Player casts Poison. + +-- Boss turn -- +- Player has 10 hit points, 0 armor, 77 mana +- Boss has 13 hit points +Poison deals 3 damage; its timer is now 5. +Boss attacks for 8 damage. + +-- Player turn -- +- Player has 2 hit points, 0 armor, 77 mana +- Boss has 10 hit points +Poison deals 3 damage; its timer is now 4. +Player casts Magic Missile, dealing 4 damage. + +-- Boss turn -- +- Player has 2 hit points, 0 armor, 24 mana +- Boss has 3 hit points +Poison deals 3 damage. This kills the boss, and the player wins. diff --git a/src/main/resources/2015-examples/day22-2.txt b/src/main/resources/2015-examples/day22-2.txt new file mode 100644 index 00000000..f232c85c --- /dev/null +++ b/src/main/resources/2015-examples/day22-2.txt @@ -0,0 +1,64 @@ +-- Player turn -- +- Player has 10 hit points, 0 armor, 250 mana +- Boss has 14 hit points +Player casts Recharge. + +-- Boss turn -- +- Player has 10 hit points, 0 armor, 21 mana +- Boss has 14 hit points +Recharge provides 101 mana; its timer is now 4. +Boss attacks for 8 damage! + +-- Player turn -- +- Player has 2 hit points, 0 armor, 122 mana +- Boss has 14 hit points +Recharge provides 101 mana; its timer is now 3. +Player casts Shield, increasing armor by 7. + +-- Boss turn -- +- Player has 2 hit points, 7 armor, 110 mana +- Boss has 14 hit points +Shield's timer is now 5. +Recharge provides 101 mana; its timer is now 2. +Boss attacks for 8 - 7 = 1 damage! + +-- Player turn -- +- Player has 1 hit point, 7 armor, 211 mana +- Boss has 14 hit points +Shield's timer is now 4. +Recharge provides 101 mana; its timer is now 1. +Player casts Drain, dealing 2 damage, and healing 2 hit points. + +-- Boss turn -- +- Player has 3 hit points, 7 armor, 239 mana +- Boss has 12 hit points +Shield's timer is now 3. +Recharge provides 101 mana; its timer is now 0. +Recharge wears off. +Boss attacks for 8 - 7 = 1 damage! + +-- Player turn -- +- Player has 2 hit points, 7 armor, 340 mana +- Boss has 12 hit points +Shield's timer is now 2. +Player casts Poison. + +-- Boss turn -- +- Player has 2 hit points, 7 armor, 167 mana +- Boss has 12 hit points +Shield's timer is now 1. +Poison deals 3 damage; its timer is now 5. +Boss attacks for 8 - 7 = 1 damage! + +-- Player turn -- +- Player has 1 hit point, 7 armor, 167 mana +- Boss has 9 hit points +Shield's timer is now 0. +Shield wears off, decreasing armor by 7. +Poison deals 3 damage; its timer is now 4. +Player casts Magic Missile, dealing 4 damage. + +-- Boss turn -- +- Player has 1 hit point, 0 armor, 114 mana +- Boss has 2 hit points +Poison deals 3 damage. This kills the boss, and the player wins. diff --git a/src/main/resources/2015-examples/day23-1.txt b/src/main/resources/2015-examples/day23-1.txt new file mode 100644 index 00000000..c55ca775 --- /dev/null +++ b/src/main/resources/2015-examples/day23-1.txt @@ -0,0 +1,4 @@ +inc a +jio a, +2 +tpl a +inc a diff --git a/src/main/resources/2015-examples/day24-1.txt b/src/main/resources/2015-examples/day24-1.txt new file mode 100644 index 00000000..653a9a2e --- /dev/null +++ b/src/main/resources/2015-examples/day24-1.txt @@ -0,0 +1,14 @@ +Group 1; Group 2; Group 3 +11 9 (QE= 99); 10 8 2; 7 5 4 3 1 +10 9 1 (QE= 90); 11 7 2; 8 5 4 3 +10 8 2 (QE=160); 11 9; 7 5 4 3 1 +10 7 3 (QE=210); 11 9; 8 5 4 2 1 +10 5 4 1 (QE=200); 11 9; 8 7 3 2 +10 5 3 2 (QE=300); 11 9; 8 7 4 1 +10 4 3 2 1 (QE=240); 11 9; 8 7 5 +9 8 3 (QE=216); 11 7 2; 10 5 4 1 +9 7 4 (QE=252); 11 8 1; 10 5 3 2 +9 5 4 2 (QE=360); 11 8 1; 10 7 3 +8 7 5 (QE=280); 11 9; 10 4 3 2 1 +8 5 4 3 (QE=480); 11 9; 10 7 2 1 +7 5 4 3 1 (QE=420); 11 9; 10 8 2 diff --git a/src/main/resources/2015-examples/day25-1.txt b/src/main/resources/2015-examples/day25-1.txt new file mode 100644 index 00000000..54a3f9e8 --- /dev/null +++ b/src/main/resources/2015-examples/day25-1.txt @@ -0,0 +1,8 @@ + | 1 2 3 4 5 6 +---+---+---+---+---+---+---+ + 1 | 1 3 6 10 15 21 + 2 | 2 5 9 14 20 + 3 | 4 8 13 19 + 4 | 7 12 18 + 5 | 11 17 + 6 | 16 diff --git a/src/main/resources/2015-examples/day25-2.txt b/src/main/resources/2015-examples/day25-2.txt new file mode 100644 index 00000000..633f688e --- /dev/null +++ b/src/main/resources/2015-examples/day25-2.txt @@ -0,0 +1,8 @@ + | 1 2 3 4 5 6 +---+---------+---------+---------+---------+---------+---------+ + 1 | 20151125 18749137 17289845 30943339 10071777 33511524 + 2 | 31916031 21629792 16929656 7726640 15514188 4041754 + 3 | 16080970 8057251 1601130 7981243 11661866 16474243 + 4 | 24592653 32451966 21345942 9380097 10600672 31527494 + 5 | 77061 17552253 28094349 6899651 9250759 31663883 + 6 | 33071741 6796745 25397450 24659492 1534922 27995004 diff --git a/src/main/resources/2015-examples/day7-1.txt b/src/main/resources/2015-examples/day7-1.txt new file mode 100644 index 00000000..82c9f9d4 --- /dev/null +++ b/src/main/resources/2015-examples/day7-1.txt @@ -0,0 +1,8 @@ +123 -> x +456 -> y +x AND y -> d +x OR y -> e +x LSHIFT 2 -> f +y RSHIFT 2 -> g +NOT x -> h +NOT y -> i diff --git a/src/main/resources/2015-examples/day7-2.txt b/src/main/resources/2015-examples/day7-2.txt new file mode 100644 index 00000000..af81e278 --- /dev/null +++ b/src/main/resources/2015-examples/day7-2.txt @@ -0,0 +1,8 @@ +d: 72 +e: 507 +f: 492 +g: 114 +h: 65412 +i: 65079 +x: 123 +y: 456 diff --git a/src/main/resources/2015-examples/day9-1.txt b/src/main/resources/2015-examples/day9-1.txt new file mode 100644 index 00000000..2bceede9 --- /dev/null +++ b/src/main/resources/2015-examples/day9-1.txt @@ -0,0 +1,3 @@ +London to Dublin = 464 +London to Belfast = 518 +Dublin to Belfast = 141 diff --git a/src/main/resources/2015-examples/day9-2.txt b/src/main/resources/2015-examples/day9-2.txt new file mode 100644 index 00000000..d733269a --- /dev/null +++ b/src/main/resources/2015-examples/day9-2.txt @@ -0,0 +1,6 @@ +Dublin -> London -> Belfast = 982 +London -> Dublin -> Belfast = 605 +London -> Belfast -> Dublin = 659 +Dublin -> Belfast -> London = 659 +Belfast -> Dublin -> London = 605 +Belfast -> London -> Dublin = 982 diff --git a/src/main/resources/2015/day1.txt b/src/main/resources/2015/day1.txt new file mode 100644 index 00000000..f7beb583 --- /dev/null +++ b/src/main/resources/2015/day1.txt @@ -0,0 +1 @@ +((((()(()(((((((()))(((()((((()())(())()(((()((((((()((()(()(((()(()((())))()((()()())))))))))()((((((())((()))(((((()(((((((((()()))((()(())()((())((()(()))((()))()))()(((((()(((()()))()())((()((((())()())()((((())()(()(()(((()(())(()(())(((((((())()()(((())(()(()(()(())))(()((((())((()))(((()(()()(((((()()(()(((()(((((())()))()((()(()))()((()((((())((((())(()(((())()()(()()()()()(())((((())((())(()()))()((((())))((((()())()((((())((()())((())(())(((((()((((()(((()((((())(()(((()()))()))((((((()((())()())))(((()(()))(()()(()(((()(()))((()()()())((()()()(((())())()())())())((()))(()(()))(((((()(()(())((()(())(())()((((()())()))((((())(())((())())((((()(((())(())((()()((((()((((((()(())()()(()(()()((((()))(())()())()))(())))(())))())()()(())(()))()((()(()(())()()))(()())))))(()))(()()))(())(((((()(()(()()((())()())))))((())())((())(()(())((()))(())(((()((((((((()()()(()))()()(((()))()((()()(())(())())()(()(())))(((((()(())(())(()))))())()))(()))()(()(((((((()((((())))())())())())()((((((((((((((()()((((((()()()())())()())())())(())(())))())((()())((()(()))))))()))))))))))))))))())((())((())()()))))))(((()((()(()()))((())(()()))()()())))(())))))))(()(((())))())()())))()()(())()))()(()))())((()()))))(()))))()))(()()(())))))))()(((()))))()(()))(())())))))()))((()))((()))())(())))))))))((((())()))()))()))())(())()()(())))())))(()())()))((()()(())))(())((((((()(())((()(((()(()()(())))()))))))()))()(()((()))()(()))(()(((())((((())())(())(()))))))))())))))))())())))))())))))()()(((())()(()))))))))())))))(())()()()))()))()))(()(())()()())())))))))())()(()(()))))()()()))))())(()))))()()))))()())))))(((())()()))(()))))))))))()()))))()()()))))(()())())()()())()(()))))()(()))(())))))))(((((())(())())()()))()()))(())))))()(()))))(())(()()))()())()))()))()))()))))())()()))())())))(()))(()))))))())()(((())()))))))))()))()())))())))())))()))))))))))()()))(()()))))))(())()(()))))())(()))))(()))))(()())))))())())()()))))())()))))))))(()))))()))))))()(()())))))))()))())))())))())))())))))))())(()()))))))(()())())))()())()))))))))))))))())))()(())))()))())()()(())(()()))(())))())()())(()(()(()))))())))))))))))())(()))()))()))))(())()())()())))))))))))()()))))))))))))())())))))(()())))))))))))())(())))()))))))))())())(()))()))(())))()))()()(())()))))))()((((())()))())())))))()))()))))((()())()))))())))(())))))))))))))))))()))))()()())()))()()))))())()))((()())))())))(()))(()())))))))()))()))))(())))))))(())))))())()()(()))())()))()()))))())()()))))())()))())))))))(()))))()())()))))))))(()))())))(()))()))))(())()))())())(())())())))))))((((())))))()))()))()())()(())))()))()))()())(()())()()(()())()))))())())))))(()))()))))())(()()(())))))(())()()((())())))))(())(())))))))())))))))))()(())))))))()())())())()(()))))))))(()))))))))())()()))()(()))))))()))))))())))))))(())))()()(())()())))))(((())))()((())()))())))(()()))())(())())))()(((()())))))()(()()())))()()(()()(()()))())()(()()()))())()()))()())(()))))())))))())))(())()()))))(()))))(())(()))(())))))()()))()))))())()))()()(())())))((()))())()))))))()()))))((()(()))))()()))))))())))))())(()((()())))))))))))()())())))()))(()))))))(()))(())()())))(()))))))))())()()()()))))(()())))))))((())))()))(()))(())(())()())()))))))))(())))())))(()))()()))(()()))(()))())))()(())))())((()((()(())))((())))()))))((((())())()())))(())))()))))))())(()()((())))())()(()())))))(()())()))())))))))((())())))))))(()(()))())()()(()()(((()(((()())))))()))))))()(())(()()((()()(())()()))())()())()))()())())())))))))(((())))))))()()))))))(((())()))(()()))(()()))))(()(()()((((())()())((()()))))(()(())))))()((()()()())()()((()((()()))(()))(((()()()))(((())))()(((())()))))))((()(())())))(()())(((((()(()))(()((()))(()())()))))(()(()))()(()))(())(((())(()()))))()()))(((()))))(()()()()))())))((()()()(())()))()))))()()))()))))))((((((()()()))))())((()()(((()))))(()(())(()()())())())))()(((()()))(())((())))(()))(()()()())((())())())(()))))()))()((()(())()(()()(())(()))(())()))(())(()))))(())(())())(()()(()((()()((())))((()))()((())))(((()()()()((((()))(()()))()()()(((())((())())(()()(()()()))()((())(())()))())(((()()(())))()((()()())()())(()(())())(((())(())())((())(())()(((()()))(())))((())(()())())(())((()()()((((((())))((()(((((())()))()))(())(()()))()))(())()()))(())((()()())()()(()))())()((())))()((()()())((((()())((())())())((()((()))()))((())((()()(()((()()(((())(()()))))((()((())()(((())(()((())())((())(()((((((())())()(()())()(())(((())((((((()(())(()((()()()((()()(()()()())))()()(((((()()))()((((((()))()(()(()(()(((()())((()))())()((()))(())))()))()()))())()()))())((((())(()(()))(((((((())(((()(((((()(((()()((((())(((())())))(()()()(()(()))()))((((((()))((()(((()(())((()((((()((((((())(((((())))(((()(()))))(((()(((())()((())(()((()))(((()()(((())((((()(()(((((()))(((()(((((((()(()()()(()(()(()()())(())(((((()(())())()())(()(()(()))()(()()()())(()()(()((()))()((())())()(()))((())(()))()(()))()(((()(()(()((((((()()()()())()(((((()()(((()()()((()(((((()))((((((((()()()(((((()))))))(()()()(())(()))(()()))))(())()))(((((()(((((()()(()(()())(((()))((((()((()(()(()((()(()((())))()(((()((()))((()))(((((((((()((()((()(())))()((((()((()()))((())(((()(((((()()(()(()()((()(()()()(((((((())())()())))))((((()()(()))()))(()((())()(()(((((((((()()(((()(()())(()((()())((())())((((()(((()(((()((((()((()((((()(()((((((())((((((((((((()()(()()((((((((((((((()((()()))()((((((((((((())((((()(()())((()(()(()))()(((((()()(((()()))()())(())((()(((((()((())(((((()((()(((((()))()()((((())()((((())(((((((((()(())(()(())))())(()((())(((())(())(())())(()(()(())()()((()((())()(((()(((((()(())))()(((()((())))((()()()(((()(((()((()(()(())(()((()())(()(()(((()(((((((((())(()((((()()))(()((((()()()()(((()((((((((()(()()((((((()(()()(()((()((((((((((()()(((((((()())(())))(((()()))(((((()((()()())(()()((((())((()((((()))))(())((()(()()(((()(()(((()((((()(((((()))())())(()((())()))(((()())((())((())((((()((()((((((())(()((((()()))((((((())()(()))((()(((())((((((((((()()(((((()(((((()((()()()((((())))(()))()((()(())()()((()((((((((((()((())(())(((((()(()(()()))((((()((((()()((()(((()(((((((((()(()((()((()))((((((()(((())()()((()(((((((()())))()()(()((()((()()(((()(()()()()((((()((())((((()(((((((((()(((()()(((()(()(((()(((()((())()(()((()(()(()(()))()(((()))(()((((()((())((((())((((((())(()))(()((((())((()(()((((((((()()((((((()(()(()()()(())((()((()()(((()(((((((()()((()(((((((()))(((((()(((()(()()()(()(((()((()()((())(()(((((((((()(()((()((((((()()((())()))(((((()((())()())()(((((((((((()))((((()()()()())(()()(()(()()))()))(()))(()(((()()))())(()(()))()()((())(()())()())()(()))()))(()()(()((((((())((()(((((((((((()(())()((()(()((()((()(()((()((((((((((()()())((())()(())))((())()())()(((((()(()())((((()((()(())(()))(((())()((()))(((((())(()))()()(()))(((())((((()((((()(())))(((((((()))))())()())(())((())()(()()((()(()))()(()()(()()((()())((())((()()))((((()))()()))(()()(())()()(((((()(())((()((((()))()))(()())())(((()()(()()))(())))))(()))((())(((((()((((()))()((((()))()((())(((())))(((()())))((()(()()(( \ No newline at end of file diff --git a/src/main/resources/2015/day10.txt b/src/main/resources/2015/day10.txt new file mode 100644 index 00000000..e7dcbbd1 --- /dev/null +++ b/src/main/resources/2015/day10.txt @@ -0,0 +1 @@ +1113122113 diff --git a/src/main/resources/2015/day11.txt b/src/main/resources/2015/day11.txt new file mode 100644 index 00000000..04b9e320 --- /dev/null +++ b/src/main/resources/2015/day11.txt @@ -0,0 +1 @@ +hxbxwxba diff --git a/src/main/resources/2015/day12.txt b/src/main/resources/2015/day12.txt new file mode 100644 index 00000000..87e53094 --- /dev/null +++ b/src/main/resources/2015/day12.txt @@ -0,0 +1 @@ +[{"a":{"e":{"e":161,"a":"blue","d":{"e":-14,"a":"red","d":{"c":"yellow","a":[-35,0],"b":"orange","d":{"e":70,"a":"green","d":"blue","j":12,"c":69,"h":"orange","b":92,"g":"yellow","f":"green","i":121}},"c":"blue","h":14,"b":46,"g":62,"f":[179]},"j":{"e":133,"c":"violet","a":"orange","b":"blue","d":"violet"},"c":{"e":151,"a":"violet","d":{"e":"red","c":93,"a":135,"g":{"e":43,"c":"green","a":"orange","b":"green","d":54},"b":69,"d":159,"f":2},"c":"green","h":65,"b":{"c":126,"a":106,"b":190,"d":-40},"g":134,"f":"red"},"h":87,"b":[-3,"yellow",50,120],"g":{"e":[138,83,"red"],"c":["yellow",["red",177,98,"blue",179,"blue","violet",23],108,["green",17,-46,3,99],-43,46,"orange","yellow",{"a":192,"b":39},57],"a":"red","b":195,"d":172},"f":97,"i":160},"a":"orange","d":120,"c":61,"h":"red","b":186,"g":{"e":"orange","a":82,"d":{"a":{"e":"green","c":-5,"a":-13,"b":12,"d":"blue","f":-19}},"c":"blue","h":["violet","violet",82,3,"orange","orange",45,"red",198,[81,"red","green","green","yellow",{"c":"orange","a":"blue","b":193},"blue"]],"b":99,"g":{"a":[64,"orange","blue",98],"b":30},"f":"orange","i":[167]},"f":[{"e":"green","c":168,"a":"red","b":173,"d":"blue"},{"e":"violet","c":90,"a":10,"g":{"a":3,"b":195},"b":"orange","d":{"e":143,"c":-26,"a":136,"g":-28,"b":137,"d":"violet","f":[108,70,19,"blue","violet","orange"]},"f":-11},{"e":188,"a":173,"d":135,"j":148,"c":"orange","h":["orange","yellow",108,"violet","violet","blue",188,"yellow","red"],"b":[145,118,"orange","green","green",17,["red",55,86,-20,"green",118,"violet","green"]],"g":{"e":62,"c":"blue","a":"violet","b":-41,"d":5},"f":"green","i":[33,"orange"]},{"a":"green"},{"a":[87,"violet"],"b":"violet"},{"e":"violet","a":147,"d":"blue","c":["blue",91,"violet","violet","yellow","orange","yellow",-4],"h":"yellow","b":19,"g":{"a":"red"},"f":[-38,"yellow","violet",-10,"orange",29,"violet",52],"i":"red"},54,[-14,-2,{"e":12,"a":"violet","d":"blue","j":"orange","c":180,"h":{"e":186,"a":"green","d":"violet","c":"orange","h":"yellow","b":"yellow","g":"green","f":"violet"},"b":"green","g":{"e":"green","c":103,"a":119,"b":"blue","d":"violet","f":116},"f":22,"i":"yellow"},["violet","blue","blue","violet",44,"orange"],144],"red",[119,"red",[10,15,115,"orange",55,"yellow",85,135,-12,"orange"],61,{"e":"red","c":"yellow","a":34,"b":"blue","d":"orange","f":"yellow"},{"c":{"c":"yellow","a":0,"b":"violet"},"a":"orange","b":"green","d":-37},-21]],"i":{"e":[{"e":123,"a":106,"d":100,"j":"violet","c":164,"h":["red",120,"orange","violet",54],"b":-22,"g":"violet","f":"orange","i":130}],"c":{"e":"blue","a":[[198,82,2,"orange",151],128,"violet",88],"d":72,"c":"blue","h":194,"b":4,"g":149,"f":"violet"},"a":[["blue",27,"green",174],"orange",50,"orange",["orange","violet",154,167],"red","orange",{"c":49,"a":"violet","b":76,"d":{"c":166,"a":"red","b":10,"d":185}},53,"yellow"],"b":"orange","d":101,"f":-1}},"b":{"e":{"e":["blue",92,-20,"red","yellow",129,99,"yellow",38],"a":98,"d":129,"c":-5,"h":"green","b":"violet","g":"blue","f":"yellow","i":"red"},"a":"blue","d":[[20,87,"red",124,-2,"yellow","red",17,"violet","yellow"],{"c":"violet","a":"red","b":161},104,{"e":["blue",[51,47,57,-41,"green",149,-11,"red",103,"orange"],"violet",72,"red",["orange","blue","red"],-8,{"c":"violet","a":68,"b":-43,"d":"green"},"orange"],"a":36,"d":["orange","green","green",106,"green","red","red","red","violet"],"j":{"a":"red","b":144},"c":166,"h":109,"b":[{"a":56,"b":"red"},-41,"blue",36,20,"blue","blue"],"g":188,"f":"yellow","i":-7},[155,["green","green",0,"red","blue"],{"e":144,"c":"green","a":"orange","b":133,"d":10,"f":[91,160,"blue",183,18,43,85,-37]},{"e":"violet","a":-35,"d":57,"c":"violet","h":17,"b":"orange","g":57,"f":"red","i":"blue"},"red","red","green","red",29,{"e":112,"c":["red","blue",68,"red","yellow"],"a":"blue","g":"blue","b":{"a":"red"},"d":162,"f":"green"}],"green",[42,"orange"],[["yellow",183,2,"red",115,"red",-31]]],"j":29,"c":{"e":[{"c":"orange","a":{"e":"orange","c":-47,"a":"blue","b":35,"d":25,"f":"blue"},"b":111,"d":16},-44,-22,179,"yellow",84],"a":{"e":178,"a":["red",183,92],"d":163,"c":105,"h":24,"b":"violet","g":-26,"f":[125,"green","violet"],"i":"red"},"d":[[12,"yellow","blue","green"],144,[114,"orange",92,"blue",["violet",40,"blue"],67,105],["orange",155,"violet",37,-38]],"j":{"a":{"c":["green","yellow",-13,"green","red"],"a":[-27],"b":"violet"},"b":["red",[109,57],181,"blue",193,-32,83,"violet"]},"c":128,"h":21,"b":{"e":"red","a":"red","d":"green","c":["green",{"a":"blue"}],"h":"orange","b":{"e":199,"c":35,"a":126,"b":183,"d":60},"g":"orange","f":"violet","i":105},"g":"yellow","f":133,"i":[{"c":"violet","a":"yellow","b":"orange","d":144},"red","yellow","green",105,72,"red","yellow"]},"h":["violet",[[161,"red","blue",[98,"red","violet"],"orange",51,"violet"],"violet",-6,"orange","yellow",51],{"e":72,"a":[190,"red","blue",-13,90,"blue",-6,"violet",137,61],"d":[126,["red",101,118],13,"blue",-4,"blue",[47,157,77]],"c":"orange","h":176,"b":{"c":[67,"green",59,"green",140,"orange","blue",15,53],"a":162,"b":"orange","d":47},"g":49,"f":"yellow","i":"violet"}],"b":{"e":132,"c":[["blue",142,"violet","green",75,56,"green","green"],"red",185,"orange","violet"],"a":144,"b":"violet","d":{"e":"green","a":"blue","d":"violet","c":["violet","yellow","orange","green",121,"blue",-23],"h":"violet","b":"yellow","g":-34,"f":147,"i":127},"f":-25},"g":"green","f":"blue","i":80}},{"e":[43,[34,"yellow",-1,{"e":[150,95],"a":"red","d":"green","j":{"e":"red","c":"yellow","a":"orange","g":-4,"b":-4,"d":{"e":108,"a":"green","d":"orange","j":70,"c":-1,"h":45,"b":"blue","g":-20,"f":"yellow","i":"yellow"},"f":-19},"c":"red","h":90,"b":-46,"g":96,"f":[44,-43,"green","green"],"i":[124,"orange",30,"blue","green","violet",66,"red","orange",125]}]],"c":{"a":[{"c":108,"a":"green","b":"orange"},"green","yellow"],"b":-11},"a":["red",["violet",132,-33,{"a":[148,-13,"orange",84,"yellow",10,"orange","blue"]},["red",-21,{"c":"green","a":"violet","b":"blue"},-1,"red",110,"yellow",51],["violet",{"a":"orange","b":127},[-14,{"a":"yellow"}],{"a":15}]]],"g":"violet","b":["green","violet"],"d":{"a":"yellow","b":"red"},"f":{"e":"green","c":{"a":"orange","b":"violet"},"a":{"c":102,"a":["red","green",{"e":"yellow","a":-41,"d":101,"j":{"a":"yellow"},"c":"yellow","h":"violet","b":19,"g":"blue","f":"yellow","i":61}],"b":["red","green"]},"g":55,"b":"violet","d":{"a":"orange","b":{"e":{"e":-5,"c":113,"a":"orange","g":"blue","b":"orange","d":35,"f":"violet"},"c":"blue","a":26,"b":150,"d":"blue"}},"f":"red"}},[{"a":[{"e":39,"a":"green","d":[[152,198,"yellow",75,"yellow",191,131,"blue"],[177,27,"blue","red"],51,129,"red",{"a":52},"green"],"c":165,"h":"blue","b":4,"g":[{"c":"yellow","a":"violet","b":15},"red","yellow","blue",52,182,{"a":83,"b":"green"},"blue",167,[103,66,105]],"f":-19,"i":162},"blue","orange",165,[153,"green",115],["orange",0,"green",{"c":"violet","a":"red","b":26,"d":198}],{"e":15,"a":["violet",58,-15,"orange",-3],"d":{"e":113,"c":59,"a":["green",-42,"violet",38,"green",-2],"b":"orange","d":"red"},"c":["green",156,"green","yellow",79,"red",126,64,"orange"],"h":"blue","b":"red","g":["orange",43,"red","yellow",{"e":"blue","a":47,"d":"red","c":"violet","h":44,"b":-15,"g":60,"f":"violet","i":-38},"orange",130,34],"f":-49,"i":"yellow"}],"b":[142,"green",[{"c":"yellow","a":181,"b":"yellow"},"blue"],{"a":[["red",35,"green","red",0,"yellow"]],"b":"yellow"},-20]},{"e":88,"a":{"e":"yellow","c":"blue","a":171,"b":{"c":[{"e":"orange","a":"orange","d":"green","c":"green","h":-13,"b":28,"g":70,"f":-30,"i":63}],"a":"green","b":"orange","d":23},"d":"red"},"d":19,"c":"violet","h":[[105,{"e":"orange","a":["red","violet",138,"blue"],"d":21,"j":-20,"c":-26,"h":143,"b":26,"g":119,"f":179,"i":"orange"},"green",["red",48,171,"blue"],"blue","yellow",{"a":"yellow","b":132}],"yellow",{"c":92,"a":{"c":-23,"a":"yellow","b":"violet"},"b":"green","d":[52,124,"violet",{"e":-19,"c":"yellow","a":181,"b":-23,"d":-7},"yellow",139,136]},117,{"e":145,"c":"blue","a":175,"b":42,"d":193}],"b":"yellow","g":[-16,-43,{"a":146,"b":[115,199,"red","violet",150]},{"a":{"c":-14,"a":129,"b":"yellow"}},64,[86,1,109,"orange",[{"e":"blue","c":"blue","a":"violet","b":"orange","d":"yellow"},149,30,"blue",112,{"e":140,"c":"green","a":139,"b":"orange","d":-8},-13,25,111],[127,183,"violet",81,"yellow",192,"blue",{"a":"blue"},"violet",105],71,"violet",18,{"c":37,"a":["red","blue"],"b":184,"d":121}],"green",["yellow",{"e":59,"c":33,"a":154,"g":97,"b":113,"d":"orange","f":23},"yellow",125,"yellow",85,99],34,{"c":100,"a":{"e":"green","a":19,"d":-2,"c":114,"h":72,"b":144,"g":96,"f":85,"i":125},"b":"green","d":-18}],"f":[[73,"blue",132,["yellow","blue","orange","blue",146,15,"orange","orange",{"e":138,"a":"violet","d":194,"c":104,"h":-4,"b":122,"g":-32,"f":"yellow"},-28]],{"e":"red","c":-6,"a":18,"g":-31,"b":44,"d":{"a":117,"b":-37},"f":{"a":"yellow"}},"orange",122,{"e":{"e":-31,"a":"yellow","d":78,"c":118,"h":"green","b":{"a":"violet","b":166},"g":167,"f":126,"i":137},"a":"yellow","d":{"c":152,"a":"blue","b":"green"},"c":"yellow","h":[14,"green",39,171,"red",46,137,-13],"b":"red","g":{"e":"green","c":136,"a":"violet","b":76,"d":"red","f":148},"f":86},-9,["green",156,119,["red",66,198,["orange",-1,34],"yellow",["violet",52,85,-5,"red"],96,43,"violet"],"red",32,95,{"e":119,"a":"blue","d":-8,"c":126,"h":17,"b":"blue","g":178,"f":"violet"},73]],"i":{"e":57,"a":"green","d":195,"c":"violet","h":23,"b":[{"c":"violet","a":122,"b":[64,"violet","green",11,"red",-18,"orange","green","yellow","orange"]},"orange","red",{"e":"violet","a":147,"d":"green","j":-34,"c":{"e":-24,"a":51,"d":"violet","c":"orange","h":121,"b":"blue","g":104,"f":152,"i":99},"h":62,"b":"yellow","g":37,"f":"orange","i":178}],"g":"yellow","f":"violet","i":112}},"violet","violet",{"a":192,"b":"yellow"},["red",["green",165],{"a":"red"},[["green","blue","red","violet",82,"violet","violet",61,86],["violet","green",[187,119,"yellow","orange",17,173],"orange",{"e":"yellow","a":193,"d":87,"c":-1,"h":-1,"b":"red","g":"green","f":"orange"},133,{"e":165,"a":["green",68,-24,"blue"],"d":129,"c":"yellow","h":52,"b":173,"g":"green","f":145},51],141,129],{"c":"red","a":14,"b":"violet","d":{"e":25,"a":118,"d":"orange","c":{"e":6,"c":169,"a":"violet","b":"orange","d":"violet"},"h":29,"b":{"e":"blue","c":"violet","a":["red",176,79,74,"violet","yellow",67,"violet","blue"],"b":"violet","d":"yellow"},"g":34,"f":[47,"green","violet","blue"]}},{"e":"blue","c":{"c":23,"a":"violet","b":16,"d":{"e":-27,"c":"orange","a":{"e":48,"a":56,"d":"yellow","c":173,"h":"violet","b":98,"g":147,"f":"green","i":69},"b":137,"d":[171,"green","orange",1,-22,17,"red","orange","green",-33],"f":"red"}},"a":[{"c":"blue","a":"red","b":-30},"red",{"e":"blue","c":154,"a":"green","b":"blue","d":"red","f":{"e":"blue","c":59,"a":"orange","g":125,"b":84,"d":"green","f":50}},[91,{"e":-20,"c":"red","a":"orange","b":-13,"d":46},79,173,["orange","blue","orange","yellow","red","violet",107,103,32]]],"b":[193,["orange",{"a":6,"b":"violet"},"violet",82,-24,"green"],197],"d":25,"f":-2},{"e":167,"a":-45,"d":"violet","c":55,"h":"red","b":"red","g":"blue","f":21,"i":{"e":198,"c":[{"c":"yellow","a":"green","b":55,"d":"violet"},[44,13,0],{"e":"red","a":197,"d":"violet","c":69,"h":80,"b":92,"g":11,"f":158,"i":130},"red"],"a":"violet","b":"red","d":"yellow"}},[{"e":88,"a":[["green",199,176,-23],{"e":128,"a":185,"d":"yellow","c":142,"h":"blue","b":"red","g":148,"f":124,"i":"violet"},15,"violet","violet",1],"d":"orange","c":"blue","h":-31,"b":[{"e":"violet","c":90,"a":"red","b":24,"d":177},190,65,-14],"g":146,"f":140,"i":126},"green",["yellow",-11,158,11,{"e":"green","c":"red","a":"red","b":{"a":168},"d":7},"orange",107,"green","red"]],167,[["green",{"e":37,"a":"blue","d":"blue","c":-48,"h":"red","b":179,"g":"blue","f":"orange"},{"c":"yellow","a":116,"b":196,"d":97},{"e":"violet","c":{"e":"green","a":"orange","d":107,"c":144,"h":"violet","b":4,"g":98,"f":147,"i":"blue"},"a":"violet","b":"orange","d":["orange",-40,"violet","violet",64],"f":191},["blue","blue"],178,"violet",["violet"]],"violet",49,"green","blue","violet",{"e":"orange","c":61,"a":"orange","b":"green","d":125,"f":["red","yellow","orange",["orange","yellow",-41,27,"violet","orange","blue"],"violet",9,"green","red"]}]],{"e":194,"a":{"e":138,"a":"violet","d":112,"c":[[184,"green","red","violet","blue","red",{"e":"yellow","c":"orange","a":-16,"g":"orange","b":115,"d":"red","f":-6}],149],"h":[-20,["yellow",50,"yellow",20,"red"],"green","blue",-38,128],"b":{"e":["orange",[160],{"e":193,"c":-18,"a":118,"g":"violet","b":"violet","d":"orange","f":"yellow"},183],"c":"red","a":"red","b":{"e":"yellow","a":"yellow","d":99,"c":-13,"h":166,"b":{"e":20,"c":183,"a":"red","b":77,"d":61},"g":-31,"f":"violet","i":"violet"},"d":"orange","f":49},"g":"green","f":166,"i":"red"},"d":{"e":[[-30,"green",-33,"blue"],-38,"red",167,"yellow",["orange",[53,145,67,109,156],"green",189,{"e":"red","c":"red","a":"orange","b":116,"d":"red","f":"violet"},-24,"orange","yellow","violet","violet"],{"e":"red","c":"violet","a":"red","b":76,"d":"blue","f":"orange"},[45,10,"green",168,-9,"violet"]],"c":{"c":[93,-6,109,[12,"orange","red","blue"],"violet"],"a":{"e":-35,"c":{"e":36,"c":-10,"a":105,"b":31,"d":"green"},"a":"green","b":40,"d":"yellow"},"b":["violet",{"e":"violet","a":"blue","d":"blue","c":75,"h":"yellow","b":"orange","g":23,"f":"violet"},187],"d":48},"a":172,"b":{"e":"red","a":"blue","d":[7,"yellow","yellow","red",-2],"c":"blue","h":"blue","b":167,"g":"violet","f":{"a":"yellow"}},"d":"green","f":"orange"},"c":{"e":["violet",{"c":"yellow","a":"violet","b":140,"d":102},62,"yellow",111,69,[84]],"a":114,"d":"violet","c":13,"h":"violet","b":"green","g":99,"f":{"e":"blue","a":"green","d":"blue","j":[-21,"blue","red",88,174,"orange",-1],"c":"yellow","h":[[68,119,152,"yellow"],132,"green","violet","violet",8,{"e":61,"c":1,"a":70,"b":"yellow","d":"blue","f":"violet"}],"b":48,"g":-39,"f":[3,142,"green","blue","violet","orange","orange","yellow","blue",114],"i":["blue","green",82,19,91,18]}},"h":-24,"b":137,"g":153,"f":0,"i":"orange"},{"e":45,"a":{"e":[[62,25,"orange",189,"orange",38,"orange"]],"c":119,"a":100,"b":["red",{"a":"green","b":[-36,"green","red","orange","violet",157,"blue","green",42]},"violet"],"d":[{"c":{"a":24,"b":77},"a":135,"b":8,"d":{"e":185,"a":"violet","d":138,"j":"green","c":-16,"h":6,"b":149,"g":23,"f":"violet","i":"blue"}}],"f":{"e":192,"c":"yellow","a":[-36,"blue",-27],"b":["green",-17,81],"d":"yellow","f":141}},"d":23,"j":{"a":[86,"blue",-22,"orange",123,56,[131,156,58,"violet","green",{"e":27,"a":56,"d":"yellow","c":35,"h":"green","b":84,"g":141,"f":65}],{"a":-17,"b":192},137]},"c":[47,{"e":{"e":95,"a":{"e":182,"a":177,"d":"blue","c":174,"h":-11,"b":"red","g":"yellow","f":"violet","i":39},"d":80,"c":"orange","h":"violet","b":112,"g":-19,"f":"green"},"c":{"c":"violet","a":-18,"b":"green","d":["red",16,-37,"blue","yellow",21,"blue"]},"a":-5,"b":106,"d":31,"f":146},46,-49,{"c":"orange","a":-20,"b":-9},["orange",{"e":["blue","blue",155,"orange","red"],"a":"violet","d":"orange","j":-33,"c":"green","h":"violet","b":"orange","g":"violet","f":173,"i":[-1,"yellow",194,"green",-31,"green"]},{"a":42,"b":{"e":"blue","a":"green","d":"yellow","j":"violet","c":121,"h":102,"b":"orange","g":-27,"f":137,"i":-23}},{"e":{"c":-25,"a":"red","b":129},"c":145,"a":34,"b":108,"d":"red"},"yellow","red","yellow",131,164,6],"yellow",{"a":["orange"],"b":31}],"h":{"e":{"e":"orange","a":"orange","d":{"c":"violet","a":{"e":"blue","a":127,"d":"blue","c":"green","h":"violet","b":88,"g":-40,"f":"yellow","i":"red"},"b":"violet"},"c":["red",{"e":"yellow","a":160,"d":"yellow","j":"blue","c":"orange","h":25,"b":41,"g":44,"f":"yellow","i":106},["yellow",197,21,115,"blue","green",144,38,-24,"blue"],"blue","blue","yellow",148],"h":"red","b":[65,41,{"a":177,"b":118},-42,{"e":13,"c":"orange","a":"violet","g":104,"b":32,"d":"blue","f":"orange"},119,"blue",-44],"g":"violet","f":87,"i":58},"a":128,"d":"green","j":"green","c":[{"a":{"e":"red","c":-24,"a":"yellow","b":"orange","d":"red","f":15}},"violet","green",165,"yellow",{"e":109,"a":101,"d":98,"c":"orange","h":"red","b":"yellow","g":"red","f":78},[166,"green","blue",-20,[33],"red",-9,"yellow","orange",112],"blue"],"h":[{"c":{"e":"yellow","c":144,"a":86,"b":"orange","d":"yellow","f":176},"a":128,"b":"violet","d":{"a":150}},71,{"e":{"a":47},"a":105,"d":45,"c":"green","h":"green","b":112,"g":"red","f":["yellow",196,170,49,"green","red"],"i":91},"blue","blue","green"],"b":{"e":["blue",-40,{"e":-46,"a":-15,"d":"green","c":"red","h":93,"b":18,"g":"yellow","f":-17},"green","violet","green","orange","orange","orange",80],"c":"orange","a":[93,"blue",199,91,"green"],"b":"green","d":{"e":70,"c":"orange","a":"blue","b":-39,"d":198,"f":"blue"}},"g":[57,"violet",81],"f":"violet","i":"violet"},"b":"blue","g":[154,"orange",["yellow",{"e":{"e":-37,"c":-6,"a":"orange","g":"violet","b":"orange","d":"orange","f":77},"c":"green","a":"violet","g":"yellow","b":157,"d":"violet","f":"red"},75,86,"orange"],[{"e":"orange","c":7,"a":["orange",-40,"red",139,"violet"],"b":34,"d":120,"f":"green"},152,119,"orange",{"e":[-5,"orange",107,105,"red","violet",104,136,"violet"],"c":9,"a":199,"b":48,"d":178,"f":152},36],"yellow",89,{"a":155,"b":107},{"a":{"c":13,"a":160,"b":114}},{"a":"yellow"}],"f":["yellow",{"a":"blue","b":157},{"e":"orange","c":[81,-48,"yellow",76,13,"red","red"],"a":{"e":"red","a":"yellow","d":"violet","j":12,"c":"green","h":"green","b":"yellow","g":"yellow","f":76,"i":-44},"b":"blue","d":"green","f":"blue"},{"c":{"a":"orange"},"a":180,"b":"orange","d":133}],"i":{"e":"violet","c":{"e":"orange","c":{"e":[13,"red","yellow","yellow","blue","green","red",156],"c":{"e":"violet","a":"violet","d":"blue","c":102,"h":-7,"b":21,"g":"blue","f":"violet"},"a":129,"b":26,"d":"green"},"a":7,"b":"green","d":"orange"},"a":"red","b":"orange","d":[["yellow",33,178,-31,194,9,126],"orange",27,7,91,[190,-27],[143,{"e":"blue","a":3,"d":5,"c":116,"h":"blue","b":"red","g":"red","f":"violet","i":39},"green",81,[-24,-34,-42,188,63,"orange"],2,172,-44,"yellow",75],{"e":-40,"a":["green","blue","violet",197,-21,"yellow","blue",84,"blue",7],"d":["red","yellow","orange",39,"orange",98,"violet",173],"c":49,"h":38,"b":184,"g":"green","f":-33}]}}],[[[{"e":["violet","blue",53],"a":{"e":77,"c":"orange","a":[166,118,"red",-6,"orange","orange","violet",74,"green"],"b":"red","d":47},"d":"violet","c":92,"h":4,"b":3,"g":{"e":"green","c":"blue","a":"yellow","g":167,"b":"green","d":-31,"f":30},"f":"orange"},{"e":"orange","c":194,"a":"violet","g":-34,"b":43,"d":"yellow","f":"blue"},"yellow",-28],[["green",181,"blue"]],175,"orange",110,198,[185,{"e":183,"c":{"c":29,"a":"blue","b":{"e":45,"a":"yellow","d":"orange","c":"green","h":155,"b":"green","g":-39,"f":"blue","i":"red"},"d":192},"a":"red","g":{"e":{"a":"violet","b":77},"a":-42,"d":57,"j":"orange","c":193,"h":62,"b":"red","g":64,"f":58,"i":"yellow"},"b":[["green",-31,"yellow",141,"yellow","red",111,167,-13,"blue"]],"d":["red",17],"f":"red"},"green",[{"e":22,"c":"orange","a":{"a":"red","b":"violet"},"b":"violet","d":{"a":167,"b":"blue"},"f":56},{"a":{"e":26,"c":145,"a":"violet","g":6,"b":13,"d":"green","f":"yellow"},"b":-41},"yellow",[[120,"red",187,124,"red","green"],"violet","red"],["yellow","violet",34],"yellow","red",71],{"c":["red","green",82,"yellow"],"a":[146,87,"green","orange",168,"yellow"],"b":{"a":["violet"]}},117,"orange",39,144],["violet",{"e":131,"a":-28,"d":["red","green","blue","blue","violet",-15,"violet"],"j":-42,"c":"orange","h":47,"b":"green","g":"yellow","f":[99,140,138],"i":"blue"},{"e":"blue","a":65,"d":"red","c":185,"h":8,"b":["orange",153,{"c":"orange","a":-40,"b":"violet"},"blue","orange",93,175],"g":-27,"f":"yellow","i":-47},48,{"c":83,"a":["blue",184,"orange","blue",{"a":167,"b":"yellow"},"violet","yellow"],"b":-27}],[[12,22,-15,"yellow",34],28,{"e":121,"c":170,"a":"red","g":{"e":13,"a":"yellow","d":44,"j":{"c":198,"a":"violet","b":176},"c":23,"h":-3,"b":"green","g":"blue","f":"violet","i":165},"b":"blue","d":64,"f":189},"yellow",-19,{"e":-49,"c":123,"a":-6,"g":"green","b":[190,"red","orange",68,98,"yellow","orange","red",{"c":68,"a":"red","b":"red"},"violet"],"d":-27,"f":"orange"},17,{"a":[105,127,{"e":-1,"a":138,"d":173,"j":"green","c":"blue","h":80,"b":"yellow","g":176,"f":"green","i":"green"},139,-41,"blue",10]},"orange"]],[[[{"e":"green","a":"blue","d":"orange","j":"blue","c":"yellow","h":"yellow","b":{"c":199,"a":"violet","b":-19},"g":"yellow","f":"red","i":"violet"},["orange"],[{"e":-20,"a":72,"d":"violet","c":"green","h":"yellow","b":20,"g":62,"f":-46},["yellow",48,44,"yellow","orange",-19,"green","red",10],{"c":0,"a":"blue","b":"green"},71,168,-27,"red"],{"e":"violet","a":{"a":"violet"},"d":-32,"c":"orange","h":"orange","b":"yellow","g":144,"f":131,"i":"orange"},"orange","violet","yellow","red"],151,[18,[{"a":"green"}],"orange","red","blue"]],{"c":91,"a":-17,"b":47,"d":46}],[["orange","green",[132],[4,156,186,{"e":148,"a":"green","d":"red","c":14,"h":34,"b":98,"g":141,"f":197,"i":"blue"},"red"],["yellow",["red","violet",-8,{"e":"orange","a":86,"d":"green","c":-49,"h":"green","b":"orange","g":107,"f":"green","i":174},101,57,"red","red",{"c":"orange","a":185,"b":84,"d":"blue"}],92,"orange","green","green",{"e":[-17,"blue","violet"],"c":["blue",80,"red"],"a":134,"g":192,"b":"green","d":"violet","f":51}],{"e":[122,"yellow","green","orange"],"a":"blue","d":113,"c":"yellow","h":"yellow","b":["violet","violet",199,71,128,["yellow","green","violet","blue",-41,"green","violet","yellow","yellow"],["yellow",190,"green","green","orange","green",-30,61]],"g":{"a":136,"b":"red"},"f":[135,"violet",60,["yellow",16,"blue"],131,"yellow",{"e":"orange","c":"violet","a":62,"b":190,"d":109},"blue",68,{"a":58,"b":-31}]},"yellow",-17,"violet","red"],44,[-39,"orange",{"e":70,"c":199,"a":73,"g":12,"b":"orange","d":6,"f":"green"},["blue","red",58,{"e":51,"c":80,"a":[46,26,"violet",64,"violet"],"b":"red","d":"red"},{"a":"yellow","b":"blue"}],196,{"a":"orange","b":{"c":"yellow","a":66,"b":161}}],157,[-25,["red",31],96,"yellow",[{"a":"green","b":9},"yellow",147,"yellow","green","orange",[-4,"green",66,152,157,["violet","violet",45,199,36,"violet",125,25]],50,["green",34,"orange",-37,33,179]],"green",{"e":"violet","a":["red",{"e":40,"a":"green","d":-24,"c":174,"h":"violet","b":"red","g":180,"f":63},"red","red",{"a":-36},178,-19,"violet",["green","red",24,"red"],"violet"],"d":{"e":24,"c":9,"a":7,"g":-41,"b":44,"d":"red","f":"violet"},"c":"violet","h":"yellow","b":["red"],"g":"yellow","f":-1,"i":["blue",53,"violet","red",87,"blue",{"e":-20,"a":130,"d":"red","c":"blue","h":58,"b":"blue","g":"blue","f":"blue","i":"yellow"},"orange","green"]},["red","green","green",-23,-6,75,"blue",{"e":112,"a":"green","d":129,"c":"yellow","h":"green","b":"yellow","g":-16,"f":194,"i":{"a":"violet","b":114}},"blue",[87,{"a":"violet"},10,65,70,"yellow",104,78,-41]],{"e":"violet","a":[[180,108],"orange","green","yellow",119,52],"d":113,"j":"red","c":[91,"green","red",41,"red",41],"h":"yellow","b":{"e":"orange","c":188,"a":77,"g":"yellow","b":"blue","d":-46,"f":"blue"},"g":"yellow","f":"yellow","i":{"e":{"e":"yellow","c":112,"a":"red","b":-36,"d":10,"f":"blue"},"a":{"a":172},"d":["green",92,87,65,123],"c":"blue","h":{"c":152,"a":"green","b":107,"d":-47},"b":"violet","g":25,"f":65,"i":"blue"}},"violet"],[["orange",{"e":"yellow","c":"orange","a":"orange","b":128,"d":145},"blue",-3,"green",108,"yellow",153],{"e":"red","c":50,"a":[90,"green",34,91,{"c":"orange","a":"red","b":197,"d":"red"}],"b":{"e":[54,"yellow","yellow"],"a":{"e":"orange","c":"yellow","a":"red","g":59,"b":"orange","d":161,"f":15},"d":"green","c":"orange","h":"green","b":25,"g":"green","f":"green","i":[191,95,-39]},"d":11},"yellow",39,"green","blue"],{"e":[[-45,[77,"yellow",-2,149,"blue",37,114],"violet",53,"green","violet",86,"green",2],135,-36,193,{"e":177,"a":33,"d":23,"j":"orange","c":-49,"h":79,"b":"violet","g":2,"f":"orange","i":-11},{"c":35,"a":"green","b":"blue"},"red",71,"violet","yellow"],"a":{"c":[100,"red",-32,"green","red","red",106,"red"],"a":"violet","b":-37,"d":{"e":145,"a":22,"d":[-45,85,-25,141],"j":"yellow","c":150,"h":[-4,"violet","green","violet",197,26,52,13,"blue",195],"b":165,"g":79,"f":-2,"i":"yellow"}},"d":[174,182,4,111,"violet",[25,"violet","yellow","red",107,124,114,"violet"],["red",57,-26,"green",131,25,"blue",["green","blue",47,-9,91,"yellow","red",-29,"red"]]],"c":[49,"violet",-24,56,99,127,26],"h":{"e":30,"a":10,"d":"violet","c":{"e":"blue","c":192,"a":86,"g":"blue","b":111,"d":[198,"green"],"f":-42},"h":-9,"b":["violet",{"e":29,"a":"blue","d":49,"j":109,"c":99,"h":-9,"b":"violet","g":"orange","f":120,"i":"orange"},["green",-7,"green"],"blue",129,"green","violet",{"e":-7,"a":"blue","d":130,"c":"green","h":126,"b":158,"g":"blue","f":132,"i":"blue"},191,"orange"],"g":183,"f":"yellow"},"b":"orange","g":[-7,"blue",{"e":"orange","a":"yellow","d":"violet","j":139,"c":33,"h":"blue","b":"red","g":-20,"f":3,"i":151},"blue",136,"orange",160],"f":[128]}],[["blue",185,57,82,{"e":"yellow","a":"red","d":"violet","c":5,"h":"yellow","b":16,"g":11,"f":-27}],[["orange",38,{"c":"green","a":"blue","b":[177,"blue","violet",-41,"orange",41,67,106]},"green","blue","red"],"violet",["green",-13,"orange",6,{"e":"red","a":116,"d":"orange","c":100,"h":"violet","b":"yellow","g":"red","f":"red","i":"red"},{"e":36,"a":"blue","d":"blue","j":135,"c":194,"h":-27,"b":["green",186,"green","violet","violet",197,32],"g":["blue"],"f":"violet","i":101},-47,"violet",30],[11,"orange",[-11,{"a":"green","b":-32},-21,133],{"a":32}],"orange",-49,102,136,"blue",125],-1,{"e":"orange","a":{"e":{"c":"violet","a":"green","b":13,"d":"blue"},"a":[{"e":"red","c":"orange","a":67,"g":"blue","b":"red","d":103,"f":176},7,5,176],"d":["orange",[-12,"orange","orange","yellow",165,152],["blue",38,"yellow","blue"],"violet",157,"orange"],"c":153,"h":"yellow","b":"green","g":["blue",[11,"red","yellow","green",16,89,"yellow"],"violet",180,120],"f":-21,"i":166},"d":["yellow",{"e":"violet","c":"green","a":"red","b":156,"d":"blue","f":{"e":38,"a":"orange","d":109,"c":"orange","h":93,"b":"green","g":-19,"f":-4}},{"e":88,"c":81,"a":50,"b":184,"d":"orange"},{"a":"green"},"red",[31,["blue",37],"violet",-5,16,"red",-43],"orange",32,[-10,72,16,138,"blue","green","violet"],"green"],"c":"violet","h":{"e":49,"c":-25,"a":"violet","b":42,"d":["red",-5,65,"green",-47,146,{"e":"red","c":167,"a":113,"b":169,"d":"red"},-19,"blue"],"f":"blue"},"b":{"a":89},"g":{"e":-42,"c":"green","a":-27,"b":{"e":"orange","a":"blue","d":"violet","j":"green","c":-8,"h":112,"b":-45,"g":-27,"f":"green","i":["violet","yellow","blue","violet",13,"blue",21]},"d":["orange",113,152,115,"red",112,-11,-5,{"e":"blue","c":"orange","a":158,"b":57,"d":"violet"}],"f":42},"f":[18,"yellow","red"],"i":-37}],{"c":[-7,"orange","green","green"],"a":{"a":"blue"},"b":{"e":"orange","a":114,"d":{"c":{"c":45,"a":26,"b":-4},"a":111,"b":["yellow",["red",196,"blue","yellow","orange","orange"],"red",-39,"orange","red","blue",{"e":"red","c":"red","a":"violet","b":"green","d":-13,"f":144},18],"d":22},"c":["green",{"c":"orange","a":20,"b":"yellow","d":120},98,107,"green","orange",181,[69,-30,{"e":"red","a":"blue","d":"orange","c":42,"h":136,"b":"blue","g":24,"f":35,"i":"red"},["violet","blue",77,152,"violet","red","orange"],185,[87,59],178,"yellow"],"violet"],"h":172,"b":{"c":"orange","a":{"e":161,"c":52,"a":33,"b":"violet","d":169,"f":122},"b":{"e":"yellow","a":-12,"d":"yellow","c":43,"h":-30,"b":"blue","g":94,"f":"yellow"},"d":{"e":0,"a":37,"d":"green","c":-30,"h":101,"b":111,"g":"orange","f":195}},"g":{"a":138,"b":"yellow"},"f":[160]},"d":"violet"},[{"c":{"e":{"e":[-30,"green",127],"c":"red","a":"red","b":123,"d":163},"c":"violet","a":[62,"red",101,103,172,"green",{"e":"orange","a":"blue","d":"green","j":23,"c":"red","h":"blue","b":43,"g":"orange","f":"red","i":-31},"violet",159],"b":"orange","d":37,"f":143},"a":"blue","b":136},{"e":74,"a":49,"d":"violet","j":176,"c":{"e":147,"c":50,"a":158,"b":{"e":55,"a":99,"d":"yellow","c":{"e":"red","a":"yellow","d":-14,"j":89,"c":79,"h":185,"b":138,"g":-1,"f":66,"i":"green"},"h":{"a":-9},"b":{"e":-19,"a":"violet","d":"red","c":-5,"h":99,"b":11,"g":"green","f":90},"g":177,"f":146,"i":"green"},"d":190,"f":{"e":"red","c":"yellow","a":"blue","g":"blue","b":135,"d":-49,"f":114}},"h":"yellow","b":88,"g":[{"a":["green","red",36,"violet"]},{"e":[118],"c":"violet","a":-4,"b":"red","d":"blue"},"violet","green",[["green","blue",81,"orange","blue","violet","violet",115,195],19,39,39,31,41,-1],"yellow",{"a":42,"b":149},79],"f":129,"i":173},["violet",{"e":48,"a":81,"d":102,"j":76,"c":182,"h":{"a":43,"b":"violet"},"b":-27,"g":166,"f":["orange",["yellow"],36,"green",[86,"green",2,"yellow",-36],83,"yellow","orange",89],"i":133},[{"a":"violet","b":"violet"},"blue","orange","orange",161,"violet",[196,-14,152,{"a":129},"violet"],181,"red","red"],{"e":"violet","c":40,"a":["orange","violet","yellow","violet","yellow",91,"orange","violet",108],"g":"orange","b":"blue","d":[{"a":"orange"},-28,7,"orange",{"a":"violet"},183],"f":-12},115,-32,"yellow","violet","orange",193],{"e":{"a":147,"b":11},"c":127,"a":79,"b":"yellow","d":-5},{"e":[{"e":1,"a":101,"d":"blue","c":[126,"violet",-24,"green"],"h":"blue","b":149,"g":"orange","f":"violet"},"red","red",{"a":5,"b":"orange"},"red"],"c":{"e":"orange","a":-49,"d":"red","j":-22,"c":{"e":"blue","c":155,"a":-2,"g":"blue","b":{"c":"violet","a":151,"b":"blue","d":"violet"},"d":{"c":55,"a":"blue","b":68,"d":"green"},"f":"green"},"h":"red","b":"red","g":27,"f":[["violet","blue"],"violet",144,111,-24,"blue","red","yellow"],"i":{"a":155,"b":38}},"a":"red","b":1,"d":"yellow","f":{"e":{"c":78,"a":40,"b":"green"},"c":"yellow","a":122,"g":"blue","b":"red","d":{"a":[70,79,65,"green",77,"red",133]},"f":[115,"blue"]}},{"c":42,"a":[{"e":"violet","c":{"e":"violet","a":"blue","d":"yellow","c":"violet","h":-24,"b":11,"g":"green","f":"green","i":"violet"},"a":122,"b":"orange","d":"violet"},[197,"blue",62,-32,127,119,"orange","blue"],121,{"c":198,"a":"orange","b":["red","yellow","yellow"],"d":"red"},-5],"b":{"e":14,"c":-41,"a":[["green",75,"yellow",138,"green","orange",42,188],21,98,109,149],"g":-36,"b":[-34,["orange","green",98,-45],[33,89,"blue","green"],184,"violet","yellow"],"d":["green",["orange",111,"blue","orange","blue","yellow","orange",189,"yellow","blue"],"orange",98,"green"],"f":[-32,{"e":-13,"c":"blue","a":108,"g":106,"b":153,"d":-45,"f":3},"blue",109,"blue"]}},[[[172,{"e":"red","a":"blue","d":71,"j":"green","c":61,"h":"orange","b":133,"g":155,"f":153,"i":169},"red",-6,"red",155],[60,130,80],"blue",["green",63,"green",127,"red"],["yellow",185,{"c":"orange","a":27,"b":"blue"},"yellow","violet",{"c":32,"a":6,"b":-37},-18],"yellow",138,["blue",{"e":94,"c":"blue","a":156,"b":-15,"d":52},101,"orange",61],"blue"],{"e":[62,"blue","red"],"a":138,"d":"red","j":"yellow","c":"blue","h":["green","green",-42,"green"],"b":["red",3,-36,"red","red","violet",{"e":"violet","a":"blue","d":77,"c":"orange","h":"yellow","b":"violet","g":"orange","f":"green","i":"blue"}],"g":[193,"blue","yellow",74,"green",-24,96,7],"f":-9,"i":"blue"},["yellow",[138,100,"orange",62,-30,"blue","green"],"yellow","violet",19]],109,{"e":"violet","a":"blue","d":90,"j":-39,"c":"green","h":[{"a":"green","b":153},91],"b":189,"g":"blue","f":"orange","i":"green"}],{"a":{"c":"green","a":34,"b":["yellow",181,-2,126,"blue","orange","violet"],"d":["red","violet",133,[192,176,16,"blue",3],[96,"blue","red","orange",[-16,"red",119,"yellow","orange","red",149,"red"],"red","violet","violet",-17,"yellow"],["blue"],"blue","green","blue"]},"b":{"a":"green","b":"violet"}},{"e":{"e":170,"c":139,"a":[{"e":-15,"a":78,"d":"violet","j":-1,"c":7,"h":71,"b":[116,-1,-25,-20],"g":"blue","f":"green","i":68},-25,[[125,"orange",134,"orange",35,50,126],-3,[166,"red",33,"red",85],-33,"orange",[198,"violet","red","blue",106,141,-45],-47],77,[["violet",74,"green","yellow",130,"violet"],9],{"e":9,"a":140,"d":111,"c":"yellow","h":"orange","b":"yellow","g":"violet","f":"red"}],"b":{"e":"green","c":167,"a":[16,-5,"green","red","green"],"b":-27,"d":"blue","f":"orange"},"d":{"e":{"c":66,"a":{"e":"red","a":"violet","d":"yellow","j":"red","c":"blue","h":-32,"b":95,"g":"violet","f":31,"i":"red"},"b":"blue","d":"blue"},"a":"red","d":{"c":75,"a":"yellow","b":"green","d":["green",-21,171,"yellow","blue",131,0,-33]},"c":[164,"orange"],"h":"red","b":118,"g":161,"f":"yellow","i":{"e":"violet","a":"green","d":{"e":123,"c":"violet","a":"orange","g":46,"b":-29,"d":"yellow","f":43},"c":-44,"h":"green","b":{"c":"green","a":81,"b":31,"d":"blue"},"g":"yellow","f":3}},"f":"green"},"c":"yellow","a":[["yellow","blue","red",168,69,[-44,"orange"],{"e":"blue","c":"yellow","a":65,"b":"yellow","d":"red","f":"orange"},"green","blue","blue"],{"e":{"c":48,"a":-39,"b":["orange",127,"blue","blue",92,"green"],"d":"red"},"a":-41,"d":"blue","j":"blue","c":134,"h":["violet","red"],"b":-48,"g":13,"f":"blue","i":["red",131,"blue","orange","green","green",161]},{"e":197,"a":-17,"d":-48,"c":"violet","h":177,"b":123,"g":"violet","f":-12,"i":[52,148,"violet","red",128,["blue"]]},[17,-28,{"e":-20,"a":{"a":"violet"},"d":"yellow","c":{"a":"blue","b":"violet"},"h":11,"b":39,"g":{"e":"blue","a":"green","d":"violet","c":"orange","h":"blue","b":132,"g":137,"f":"red"},"f":"blue","i":[187]},{"e":"violet","c":149,"a":"green","g":"red","b":72,"d":[-5],"f":{"c":11,"a":-2,"b":"green"}},-6,["green","yellow","yellow",{"e":"orange","c":"red","a":185,"b":"green","d":"red"}]],4],"g":"orange","b":[{"e":["violet","violet","green",119,-26],"a":"blue","d":"red","c":{"e":-38,"c":"green","a":17,"b":{"a":-31},"d":"yellow"},"h":["red","violet",-13,-41,[197,"violet","orange",150,"violet",156,161,179,70,"red"],143,110,-2,"blue","green"],"b":"green","g":"blue","f":"red"},"orange",{"c":[26,{"c":-21,"a":"green","b":"red"},"blue","orange",-23,"green",179,["orange"],{"e":"orange","c":"blue","a":"green","b":169,"d":"red"},"orange"],"a":"violet","b":"blue","d":175},60,"orange",[-44,{"e":"green","c":"orange","a":-41,"b":"violet","d":[0,"orange","green"]},"blue",["violet",[26,-9,"yellow",101,6,"yellow",161],81,104,"red","red","violet","red",180,60],114],"orange",15,22,"yellow"],"d":[53,"yellow",{"e":{"e":[99],"a":51,"d":["orange","yellow",114],"c":67,"h":{"e":109,"c":"violet","a":"orange","g":"orange","b":"blue","d":"orange","f":-4},"b":-27,"g":[93,"orange"],"f":"blue","i":"red"},"a":"red","d":37,"j":{"c":"red","a":"blue","b":"orange","d":{"a":"violet"}},"c":["green"],"h":"orange","b":[32,{"c":"red","a":"red","b":34},81,-3,{"c":"red","a":133,"b":-47,"d":112},"green","green","orange",{"e":"blue","a":"orange","d":"green","j":45,"c":-16,"h":78,"b":-28,"g":"yellow","f":"blue","i":130},0],"g":116,"f":-5,"i":"red"},"yellow","blue",152],"f":{"c":{"e":116,"c":"orange","a":128,"b":"blue","d":"blue"},"a":2,"b":{"c":101,"a":-48,"b":["yellow",106,179,["orange",97,104,"violet","orange","blue","orange"],{"e":"blue","a":183,"d":"red","c":-8,"h":26,"b":"orange","g":4,"f":"orange"},"violet","green","blue","green"]}}}],[{"e":10,"c":[[{"a":195},"yellow",[89,"orange","blue",[158,"violet",-41,174,135,"red",-21,182,"yellow","green"]],"green",{"e":"orange","a":[159,-6],"d":"yellow","j":"violet","c":"green","h":-23,"b":"orange","g":108,"f":"orange","i":53},["blue"],["blue","blue",[3,"violet","red"],"violet","yellow","violet"],85,92,"yellow"],{"a":"violet","b":188},"violet",{"a":197}],"a":-46,"g":"yellow","b":[54,["yellow","orange","violet",168,197,125,{"e":"blue","c":-24,"a":"orange","g":164,"b":"red","d":148,"f":{"e":48,"c":61,"a":"yellow","g":"blue","b":-46,"d":56,"f":-4}},{"a":["blue",131,6]},{"c":[179],"a":-13,"b":"violet","d":-34},-22],"violet",187],"d":34,"f":"yellow"},197,[{"e":52,"c":96,"a":{"e":59,"c":"orange","a":73,"b":["blue","green"],"d":-22},"b":{"e":["blue",152],"a":123,"d":"green","c":28,"h":-33,"b":-8,"g":"violet","f":167,"i":-29},"d":[[-21,"yellow"],52,"blue","red"]},-21],176,[[[193],53]],[[175,{"e":"red","a":132,"d":113,"c":["yellow"],"h":["red",185,129,57,"violet",135,"green","yellow","blue","green"],"b":"orange","g":-20,"f":{"c":"red","a":"orange","b":{"a":"violet","b":11}},"i":141},28,{"e":-4,"a":{"e":51,"a":171,"d":103,"c":{"e":-9,"a":144,"d":"green","j":"orange","c":"violet","h":126,"b":"yellow","g":60,"f":"violet","i":"orange"},"h":{"e":-40,"c":99,"a":"orange","g":"green","b":"red","d":128,"f":"blue"},"b":"green","g":82,"f":-23},"d":-16,"j":"violet","c":108,"h":140,"b":"yellow","g":"blue","f":84,"i":"orange"},[{"e":"red","c":-31,"a":-23,"g":-11,"b":25,"d":"green","f":"green"},{"e":"blue","c":180,"a":58,"b":-27,"d":60,"f":79},"orange",172],"red"],["orange",{"c":64,"a":109,"b":-14,"d":"red"},{"a":70,"b":"orange"},["violet",17],{"e":"violet","a":[141,"blue",{"a":"red"},[142,"red","violet","violet",-45,58,78,"yellow","orange"],"orange"],"d":{"e":"green","a":"red","d":86,"c":{"e":-44,"a":33,"d":"violet","c":188,"h":"red","b":-36,"g":"blue","f":"yellow"},"h":"red","b":186,"g":166,"f":"red"},"c":20,"h":"red","b":["violet",{"e":"blue","a":187,"d":115,"j":193,"c":119,"h":"yellow","b":"yellow","g":"red","f":74,"i":25},"orange",0,-17,"yellow",-23],"g":199,"f":76}]]]] diff --git a/src/main/resources/2015/day13.txt b/src/main/resources/2015/day13.txt new file mode 100644 index 00000000..a6f9c66f --- /dev/null +++ b/src/main/resources/2015/day13.txt @@ -0,0 +1,56 @@ +Alice would gain 2 happiness units by sitting next to Bob. +Alice would gain 26 happiness units by sitting next to Carol. +Alice would lose 82 happiness units by sitting next to David. +Alice would lose 75 happiness units by sitting next to Eric. +Alice would gain 42 happiness units by sitting next to Frank. +Alice would gain 38 happiness units by sitting next to George. +Alice would gain 39 happiness units by sitting next to Mallory. +Bob would gain 40 happiness units by sitting next to Alice. +Bob would lose 61 happiness units by sitting next to Carol. +Bob would lose 15 happiness units by sitting next to David. +Bob would gain 63 happiness units by sitting next to Eric. +Bob would gain 41 happiness units by sitting next to Frank. +Bob would gain 30 happiness units by sitting next to George. +Bob would gain 87 happiness units by sitting next to Mallory. +Carol would lose 35 happiness units by sitting next to Alice. +Carol would lose 99 happiness units by sitting next to Bob. +Carol would lose 51 happiness units by sitting next to David. +Carol would gain 95 happiness units by sitting next to Eric. +Carol would gain 90 happiness units by sitting next to Frank. +Carol would lose 16 happiness units by sitting next to George. +Carol would gain 94 happiness units by sitting next to Mallory. +David would gain 36 happiness units by sitting next to Alice. +David would lose 18 happiness units by sitting next to Bob. +David would lose 65 happiness units by sitting next to Carol. +David would lose 18 happiness units by sitting next to Eric. +David would lose 22 happiness units by sitting next to Frank. +David would gain 2 happiness units by sitting next to George. +David would gain 42 happiness units by sitting next to Mallory. +Eric would lose 65 happiness units by sitting next to Alice. +Eric would gain 24 happiness units by sitting next to Bob. +Eric would gain 100 happiness units by sitting next to Carol. +Eric would gain 51 happiness units by sitting next to David. +Eric would gain 21 happiness units by sitting next to Frank. +Eric would gain 55 happiness units by sitting next to George. +Eric would lose 44 happiness units by sitting next to Mallory. +Frank would lose 48 happiness units by sitting next to Alice. +Frank would gain 91 happiness units by sitting next to Bob. +Frank would gain 8 happiness units by sitting next to Carol. +Frank would lose 66 happiness units by sitting next to David. +Frank would gain 97 happiness units by sitting next to Eric. +Frank would lose 9 happiness units by sitting next to George. +Frank would lose 92 happiness units by sitting next to Mallory. +George would lose 44 happiness units by sitting next to Alice. +George would lose 25 happiness units by sitting next to Bob. +George would gain 17 happiness units by sitting next to Carol. +George would gain 92 happiness units by sitting next to David. +George would lose 92 happiness units by sitting next to Eric. +George would gain 18 happiness units by sitting next to Frank. +George would gain 97 happiness units by sitting next to Mallory. +Mallory would gain 92 happiness units by sitting next to Alice. +Mallory would lose 96 happiness units by sitting next to Bob. +Mallory would lose 51 happiness units by sitting next to Carol. +Mallory would lose 81 happiness units by sitting next to David. +Mallory would gain 31 happiness units by sitting next to Eric. +Mallory would lose 73 happiness units by sitting next to Frank. +Mallory would lose 89 happiness units by sitting next to George. diff --git a/src/main/resources/2015/day14.txt b/src/main/resources/2015/day14.txt new file mode 100644 index 00000000..6cf5489f --- /dev/null +++ b/src/main/resources/2015/day14.txt @@ -0,0 +1,9 @@ +Dancer can fly 27 km/s for 5 seconds, but then must rest for 132 seconds. +Cupid can fly 22 km/s for 2 seconds, but then must rest for 41 seconds. +Rudolph can fly 11 km/s for 5 seconds, but then must rest for 48 seconds. +Donner can fly 28 km/s for 5 seconds, but then must rest for 134 seconds. +Dasher can fly 4 km/s for 16 seconds, but then must rest for 55 seconds. +Blitzen can fly 14 km/s for 3 seconds, but then must rest for 38 seconds. +Prancer can fly 3 km/s for 21 seconds, but then must rest for 40 seconds. +Comet can fly 18 km/s for 6 seconds, but then must rest for 103 seconds. +Vixen can fly 18 km/s for 5 seconds, but then must rest for 84 seconds. diff --git a/src/main/resources/2015/day15.txt b/src/main/resources/2015/day15.txt new file mode 100644 index 00000000..6281182f --- /dev/null +++ b/src/main/resources/2015/day15.txt @@ -0,0 +1,4 @@ +Sprinkles: capacity 5, durability -1, flavor 0, texture 0, calories 5 +PeanutButter: capacity -1, durability 3, flavor 0, texture 0, calories 1 +Frosting: capacity 0, durability -1, flavor 4, texture 0, calories 6 +Sugar: capacity -1, durability 0, flavor 0, texture 2, calories 8 diff --git a/src/main/resources/2015/day16.txt b/src/main/resources/2015/day16.txt new file mode 100644 index 00000000..b1bd498e --- /dev/null +++ b/src/main/resources/2015/day16.txt @@ -0,0 +1,500 @@ +Sue 1: children: 1, cars: 8, vizslas: 7 +Sue 2: akitas: 10, perfumes: 10, children: 5 +Sue 3: cars: 5, pomeranians: 4, vizslas: 1 +Sue 4: goldfish: 5, children: 8, perfumes: 3 +Sue 5: vizslas: 2, akitas: 7, perfumes: 6 +Sue 6: vizslas: 0, akitas: 1, perfumes: 2 +Sue 7: perfumes: 8, cars: 4, goldfish: 10 +Sue 8: perfumes: 7, children: 2, cats: 1 +Sue 9: pomeranians: 3, goldfish: 10, trees: 10 +Sue 10: akitas: 7, trees: 8, pomeranians: 4 +Sue 11: goldfish: 1, perfumes: 4, cars: 6 +Sue 12: samoyeds: 6, trees: 6, perfumes: 2 +Sue 13: akitas: 10, pomeranians: 0, vizslas: 2 +Sue 14: cars: 2, perfumes: 3, children: 4 +Sue 15: goldfish: 2, children: 8, cars: 5 +Sue 16: goldfish: 9, cars: 0, vizslas: 5 +Sue 17: cats: 5, trees: 6, perfumes: 6 +Sue 18: cars: 0, perfumes: 8, pomeranians: 7 +Sue 19: trees: 2, goldfish: 5, perfumes: 4 +Sue 20: akitas: 4, vizslas: 4, trees: 0 +Sue 21: pomeranians: 7, trees: 0, goldfish: 10 +Sue 22: cars: 4, vizslas: 0, perfumes: 3 +Sue 23: vizslas: 8, trees: 1, akitas: 2 +Sue 24: children: 7, trees: 0, akitas: 1 +Sue 25: goldfish: 3, akitas: 2, trees: 2 +Sue 26: pomeranians: 4, vizslas: 4, samoyeds: 2 +Sue 27: cars: 0, trees: 8, akitas: 5 +Sue 28: perfumes: 6, cats: 0, cars: 2 +Sue 29: trees: 7, akitas: 1, vizslas: 1 +Sue 30: perfumes: 9, cars: 9, trees: 10 +Sue 31: pomeranians: 5, akitas: 9, samoyeds: 1 +Sue 32: pomeranians: 10, vizslas: 5, goldfish: 5 +Sue 33: vizslas: 2, akitas: 3, trees: 7 +Sue 34: goldfish: 10, perfumes: 0, samoyeds: 7 +Sue 35: akitas: 6, cats: 7, perfumes: 10 +Sue 36: pomeranians: 8, vizslas: 7, akitas: 6 +Sue 37: goldfish: 2, cars: 10, children: 7 +Sue 38: goldfish: 2, perfumes: 3, cars: 7 +Sue 39: trees: 9, vizslas: 10, cars: 5 +Sue 40: goldfish: 1, pomeranians: 0, trees: 2 +Sue 41: trees: 2, goldfish: 6, vizslas: 3 +Sue 42: akitas: 1, cars: 3, vizslas: 3 +Sue 43: akitas: 1, pomeranians: 1, vizslas: 3 +Sue 44: goldfish: 7, akitas: 3, vizslas: 10 +Sue 45: akitas: 8, samoyeds: 8, goldfish: 2 +Sue 46: trees: 0, vizslas: 4, cars: 9 +Sue 47: cars: 9, trees: 10, perfumes: 4 +Sue 48: akitas: 0, vizslas: 5, perfumes: 4 +Sue 49: goldfish: 9, trees: 1, cars: 4 +Sue 50: goldfish: 2, perfumes: 5, cars: 2 +Sue 51: samoyeds: 1, goldfish: 2, perfumes: 7 +Sue 52: cars: 0, perfumes: 4, goldfish: 8 +Sue 53: goldfish: 9, vizslas: 2, akitas: 9 +Sue 54: trees: 1, goldfish: 9, children: 5 +Sue 55: cars: 0, akitas: 5, trees: 4 +Sue 56: trees: 4, samoyeds: 5, children: 9 +Sue 57: children: 0, vizslas: 8, cars: 3 +Sue 58: trees: 4, pomeranians: 5, akitas: 5 +Sue 59: vizslas: 10, cats: 3, children: 2 +Sue 60: cats: 6, vizslas: 2, cars: 2 +Sue 61: akitas: 1, vizslas: 0, children: 4 +Sue 62: akitas: 4, trees: 9, children: 10 +Sue 63: pomeranians: 6, vizslas: 6, cars: 4 +Sue 64: perfumes: 8, pomeranians: 1, children: 8 +Sue 65: perfumes: 3, goldfish: 6, trees: 5 +Sue 66: goldfish: 10, akitas: 8, vizslas: 4 +Sue 67: vizslas: 10, samoyeds: 3, trees: 2 +Sue 68: samoyeds: 4, cars: 7, perfumes: 3 +Sue 69: perfumes: 2, goldfish: 0, trees: 2 +Sue 70: trees: 8, vizslas: 7, akitas: 6 +Sue 71: cars: 2, children: 7, perfumes: 3 +Sue 72: cars: 1, akitas: 9, perfumes: 0 +Sue 73: vizslas: 4, akitas: 7, cars: 5 +Sue 74: samoyeds: 3, cars: 3, akitas: 2 +Sue 75: trees: 2, cars: 1, vizslas: 7 +Sue 76: samoyeds: 9, perfumes: 1, trees: 6 +Sue 77: trees: 6, perfumes: 10, cars: 7 +Sue 78: trees: 0, children: 8, vizslas: 5 +Sue 79: vizslas: 0, trees: 0, samoyeds: 1 +Sue 80: trees: 6, goldfish: 8, perfumes: 0 +Sue 81: samoyeds: 8, pomeranians: 6, akitas: 5 +Sue 82: vizslas: 6, perfumes: 9, akitas: 4 +Sue 83: cats: 0, vizslas: 3, pomeranians: 10 +Sue 84: cars: 4, perfumes: 6, samoyeds: 5 +Sue 85: vizslas: 7, trees: 5, goldfish: 7 +Sue 86: goldfish: 2, trees: 2, vizslas: 1 +Sue 87: trees: 6, goldfish: 10, pomeranians: 4 +Sue 88: vizslas: 1, akitas: 0, perfumes: 8 +Sue 89: goldfish: 8, akitas: 3, vizslas: 7 +Sue 90: vizslas: 9, akitas: 7, perfumes: 9 +Sue 91: children: 7, cars: 7, trees: 9 +Sue 92: vizslas: 10, akitas: 8, goldfish: 1 +Sue 93: goldfish: 7, vizslas: 2, pomeranians: 0 +Sue 94: cats: 2, samoyeds: 6, pomeranians: 3 +Sue 95: samoyeds: 4, children: 4, pomeranians: 10 +Sue 96: pomeranians: 9, cats: 1, goldfish: 3 +Sue 97: trees: 1, akitas: 6, goldfish: 1 +Sue 98: vizslas: 7, akitas: 2, perfumes: 7 +Sue 99: pomeranians: 6, perfumes: 2, trees: 1 +Sue 100: cars: 3, children: 9, trees: 10 +Sue 101: children: 0, perfumes: 0, vizslas: 3 +Sue 102: cars: 4, goldfish: 5, children: 2 +Sue 103: pomeranians: 3, perfumes: 7, cats: 8 +Sue 104: akitas: 0, perfumes: 5, vizslas: 5 +Sue 105: akitas: 7, vizslas: 2, samoyeds: 8 +Sue 106: goldfish: 7, perfumes: 0, cats: 8 +Sue 107: cats: 6, pomeranians: 9, cars: 6 +Sue 108: akitas: 3, vizslas: 10, cats: 5 +Sue 109: akitas: 10, perfumes: 2, cars: 7 +Sue 110: goldfish: 7, pomeranians: 1, trees: 1 +Sue 111: akitas: 10, samoyeds: 6, vizslas: 6 +Sue 112: cats: 6, akitas: 7, trees: 9 +Sue 113: akitas: 1, trees: 9, vizslas: 8 +Sue 114: vizslas: 2, cats: 1, cars: 4 +Sue 115: akitas: 0, trees: 5, goldfish: 7 +Sue 116: goldfish: 2, trees: 10, akitas: 2 +Sue 117: cars: 4, goldfish: 10, perfumes: 5 +Sue 118: cars: 5, perfumes: 6, trees: 0 +Sue 119: perfumes: 5, vizslas: 1, cats: 0 +Sue 120: perfumes: 8, akitas: 9, vizslas: 4 +Sue 121: samoyeds: 2, vizslas: 7, perfumes: 6 +Sue 122: children: 6, trees: 9, perfumes: 2 +Sue 123: cars: 7, akitas: 0, pomeranians: 0 +Sue 124: akitas: 7, cats: 8, vizslas: 5 +Sue 125: goldfish: 3, trees: 1, cars: 4 +Sue 126: cars: 4, perfumes: 3, akitas: 0 +Sue 127: children: 10, vizslas: 5, akitas: 9 +Sue 128: akitas: 3, samoyeds: 2, cats: 8 +Sue 129: cats: 8, akitas: 1, vizslas: 8 +Sue 130: trees: 4, cars: 6, perfumes: 6 +Sue 131: akitas: 7, perfumes: 6, goldfish: 9 +Sue 132: akitas: 6, vizslas: 7, trees: 1 +Sue 133: akitas: 5, vizslas: 7, children: 9 +Sue 134: cars: 8, goldfish: 4, pomeranians: 4 +Sue 135: samoyeds: 1, pomeranians: 6, akitas: 4 +Sue 136: perfumes: 10, goldfish: 1, cars: 3 +Sue 137: cars: 3, samoyeds: 6, vizslas: 7 +Sue 138: samoyeds: 10, akitas: 3, perfumes: 4 +Sue 139: perfumes: 10, vizslas: 2, goldfish: 7 +Sue 140: samoyeds: 7, cars: 1, trees: 2 +Sue 141: children: 6, cats: 5, cars: 9 +Sue 142: cats: 0, trees: 1, akitas: 10 +Sue 143: samoyeds: 4, cars: 0, children: 7 +Sue 144: trees: 0, cars: 4, perfumes: 8 +Sue 145: goldfish: 7, cars: 5, trees: 1 +Sue 146: perfumes: 7, cars: 7, goldfish: 0 +Sue 147: trees: 2, goldfish: 7, vizslas: 5 +Sue 148: samoyeds: 8, perfumes: 1, trees: 0 +Sue 149: vizslas: 2, samoyeds: 5, trees: 0 +Sue 150: akitas: 4, perfumes: 4, pomeranians: 2 +Sue 151: trees: 2, cars: 0, goldfish: 10 +Sue 152: goldfish: 7, vizslas: 0, trees: 0 +Sue 153: children: 9, cats: 0, pomeranians: 10 +Sue 154: cars: 6, goldfish: 10, akitas: 5 +Sue 155: perfumes: 9, trees: 2, akitas: 3 +Sue 156: pomeranians: 9, perfumes: 5, cars: 9 +Sue 157: akitas: 0, trees: 2, cars: 7 +Sue 158: goldfish: 10, trees: 8, akitas: 7 +Sue 159: akitas: 5, trees: 10, cars: 10 +Sue 160: akitas: 3, trees: 5, cars: 8 +Sue 161: samoyeds: 2, cars: 7, perfumes: 4 +Sue 162: cars: 6, vizslas: 10, pomeranians: 5 +Sue 163: cars: 10, perfumes: 6, vizslas: 9 +Sue 164: pomeranians: 7, cars: 4, vizslas: 2 +Sue 165: goldfish: 9, vizslas: 3, trees: 1 +Sue 166: goldfish: 1, samoyeds: 3, trees: 1 +Sue 167: vizslas: 4, goldfish: 7, cats: 5 +Sue 168: children: 1, cars: 5, samoyeds: 7 +Sue 169: trees: 1, samoyeds: 3, goldfish: 6 +Sue 170: goldfish: 2, cars: 3, perfumes: 9 +Sue 171: cars: 4, goldfish: 0, trees: 6 +Sue 172: cats: 8, perfumes: 6, trees: 1 +Sue 173: akitas: 9, goldfish: 7, cars: 10 +Sue 174: vizslas: 2, trees: 0, akitas: 1 +Sue 175: perfumes: 3, vizslas: 8, akitas: 4 +Sue 176: perfumes: 0, akitas: 6, goldfish: 3 +Sue 177: perfumes: 6, children: 1, goldfish: 10 +Sue 178: cars: 5, vizslas: 3, children: 10 +Sue 179: perfumes: 3, trees: 8, cats: 9 +Sue 180: perfumes: 8, vizslas: 4, trees: 7 +Sue 181: perfumes: 7, vizslas: 9, samoyeds: 4 +Sue 182: vizslas: 9, trees: 4, pomeranians: 4 +Sue 183: trees: 9, cars: 3, goldfish: 5 +Sue 184: perfumes: 2, cars: 4, vizslas: 3 +Sue 185: children: 10, akitas: 10, cats: 9 +Sue 186: cars: 5, samoyeds: 0, trees: 0 +Sue 187: trees: 2, goldfish: 3, cars: 4 +Sue 188: goldfish: 3, vizslas: 1, cats: 6 +Sue 189: trees: 2, pomeranians: 10, cars: 7 +Sue 190: perfumes: 10, akitas: 3, samoyeds: 0 +Sue 191: cats: 5, vizslas: 6, akitas: 6 +Sue 192: samoyeds: 5, trees: 1, perfumes: 8 +Sue 193: pomeranians: 0, akitas: 9, cats: 0 +Sue 194: trees: 1, goldfish: 0, perfumes: 10 +Sue 195: perfumes: 2, akitas: 7, cars: 5 +Sue 196: perfumes: 5, samoyeds: 8, cars: 1 +Sue 197: vizslas: 2, pomeranians: 9, trees: 1 +Sue 198: trees: 8, vizslas: 6, children: 8 +Sue 199: pomeranians: 4, cars: 7, vizslas: 5 +Sue 200: trees: 0, perfumes: 10, akitas: 10 +Sue 201: cats: 9, akitas: 4, vizslas: 0 +Sue 202: goldfish: 9, pomeranians: 9, cats: 6 +Sue 203: cars: 5, perfumes: 5, trees: 2 +Sue 204: pomeranians: 7, children: 2, akitas: 6 +Sue 205: samoyeds: 7, pomeranians: 7, children: 6 +Sue 206: trees: 1, cars: 1, pomeranians: 4 +Sue 207: goldfish: 2, perfumes: 5, trees: 0 +Sue 208: perfumes: 2, samoyeds: 4, trees: 1 +Sue 209: cars: 8, perfumes: 6, goldfish: 9 +Sue 210: perfumes: 4, cars: 8, samoyeds: 3 +Sue 211: perfumes: 2, cars: 8, trees: 9 +Sue 212: trees: 7, perfumes: 2, akitas: 5 +Sue 213: children: 3, goldfish: 5, vizslas: 0 +Sue 214: akitas: 6, goldfish: 0, children: 0 +Sue 215: trees: 8, akitas: 3, goldfish: 1 +Sue 216: goldfish: 6, perfumes: 8, akitas: 3 +Sue 217: children: 7, trees: 2, vizslas: 6 +Sue 218: goldfish: 8, samoyeds: 4, pomeranians: 6 +Sue 219: goldfish: 8, samoyeds: 0, children: 9 +Sue 220: perfumes: 1, cars: 8, vizslas: 6 +Sue 221: perfumes: 9, cars: 10, children: 10 +Sue 222: perfumes: 9, vizslas: 1, trees: 0 +Sue 223: goldfish: 1, akitas: 2, vizslas: 8 +Sue 224: samoyeds: 8, akitas: 7, vizslas: 4 +Sue 225: goldfish: 1, cars: 4, perfumes: 10 +Sue 226: goldfish: 9, trees: 4, perfumes: 5 +Sue 227: vizslas: 5, trees: 4, goldfish: 7 +Sue 228: cars: 1, cats: 10, perfumes: 4 +Sue 229: vizslas: 8, cars: 10, akitas: 4 +Sue 230: cats: 1, children: 8, vizslas: 3 +Sue 231: perfumes: 7, cats: 6, samoyeds: 7 +Sue 232: cars: 3, children: 9, perfumes: 7 +Sue 233: vizslas: 1, samoyeds: 2, children: 2 +Sue 234: trees: 1, samoyeds: 8, children: 2 +Sue 235: trees: 6, akitas: 9, goldfish: 7 +Sue 236: children: 10, trees: 0, samoyeds: 8 +Sue 237: pomeranians: 4, trees: 1, goldfish: 2 +Sue 238: vizslas: 4, akitas: 2, cars: 0 +Sue 239: goldfish: 9, cars: 10, perfumes: 4 +Sue 240: perfumes: 3, vizslas: 6, trees: 6 +Sue 241: pomeranians: 6, akitas: 4, trees: 2 +Sue 242: cars: 8, perfumes: 5, children: 7 +Sue 243: trees: 4, perfumes: 7, cars: 3 +Sue 244: perfumes: 6, akitas: 1, vizslas: 7 +Sue 245: akitas: 3, perfumes: 9, samoyeds: 0 +Sue 246: pomeranians: 3, vizslas: 9, samoyeds: 1 +Sue 247: cars: 0, goldfish: 7, cats: 2 +Sue 248: trees: 5, goldfish: 6, perfumes: 3 +Sue 249: trees: 0, pomeranians: 7, perfumes: 9 +Sue 250: cars: 9, trees: 1, goldfish: 10 +Sue 251: perfumes: 3, cars: 8, trees: 7 +Sue 252: cars: 5, akitas: 7, trees: 8 +Sue 253: perfumes: 7, akitas: 3, trees: 8 +Sue 254: goldfish: 8, samoyeds: 1, vizslas: 7 +Sue 255: perfumes: 3, cars: 4, children: 6 +Sue 256: perfumes: 9, trees: 8, children: 7 +Sue 257: trees: 8, children: 6, cars: 4 +Sue 258: vizslas: 1, trees: 10, goldfish: 9 +Sue 259: vizslas: 5, trees: 6, goldfish: 9 +Sue 260: trees: 0, goldfish: 6, cars: 7 +Sue 261: cars: 1, perfumes: 4, goldfish: 9 +Sue 262: cars: 7, goldfish: 9, cats: 9 +Sue 263: cars: 0, children: 5, goldfish: 8 +Sue 264: cars: 2, akitas: 8, trees: 0 +Sue 265: perfumes: 9, children: 8, samoyeds: 7 +Sue 266: cats: 1, children: 1, vizslas: 10 +Sue 267: vizslas: 8, children: 2, trees: 6 +Sue 268: akitas: 10, vizslas: 3, cats: 2 +Sue 269: children: 4, goldfish: 1, cats: 6 +Sue 270: vizslas: 5, cars: 9, akitas: 9 +Sue 271: vizslas: 5, children: 4, akitas: 3 +Sue 272: cars: 1, goldfish: 0, vizslas: 0 +Sue 273: goldfish: 10, samoyeds: 1, akitas: 2 +Sue 274: goldfish: 10, children: 2, pomeranians: 0 +Sue 275: children: 0, vizslas: 1, samoyeds: 6 +Sue 276: children: 1, vizslas: 3, samoyeds: 1 +Sue 277: perfumes: 4, cats: 6, children: 10 +Sue 278: pomeranians: 7, goldfish: 3, cars: 4 +Sue 279: perfumes: 5, goldfish: 9, trees: 7 +Sue 280: goldfish: 6, trees: 5, perfumes: 8 +Sue 281: cars: 2, akitas: 1, vizslas: 7 +Sue 282: vizslas: 4, akitas: 3, children: 8 +Sue 283: pomeranians: 8, akitas: 9, vizslas: 4 +Sue 284: samoyeds: 10, trees: 10, pomeranians: 2 +Sue 285: akitas: 9, perfumes: 7, goldfish: 6 +Sue 286: akitas: 2, vizslas: 7, goldfish: 10 +Sue 287: pomeranians: 8, cars: 6, samoyeds: 5 +Sue 288: pomeranians: 1, trees: 0, goldfish: 0 +Sue 289: trees: 10, samoyeds: 1, children: 0 +Sue 290: cats: 10, samoyeds: 6, trees: 0 +Sue 291: vizslas: 9, trees: 6, goldfish: 5 +Sue 292: cats: 4, perfumes: 8, cars: 3 +Sue 293: goldfish: 10, perfumes: 10, cats: 0 +Sue 294: cats: 7, trees: 6, akitas: 4 +Sue 295: vizslas: 8, cars: 1, akitas: 6 +Sue 296: vizslas: 5, akitas: 10, trees: 1 +Sue 297: pomeranians: 8, samoyeds: 5, vizslas: 4 +Sue 298: perfumes: 10, children: 5, vizslas: 2 +Sue 299: cars: 10, akitas: 7, cats: 5 +Sue 300: trees: 1, perfumes: 7, cars: 7 +Sue 301: cars: 9, vizslas: 1, perfumes: 3 +Sue 302: perfumes: 9, vizslas: 1, akitas: 5 +Sue 303: akitas: 9, trees: 1, goldfish: 10 +Sue 304: children: 10, vizslas: 6, pomeranians: 8 +Sue 305: trees: 3, goldfish: 6, cats: 9 +Sue 306: cars: 5, perfumes: 9, vizslas: 5 +Sue 307: children: 0, goldfish: 7, trees: 2 +Sue 308: trees: 9, samoyeds: 4, cars: 0 +Sue 309: cats: 8, vizslas: 2, perfumes: 3 +Sue 310: cars: 6, pomeranians: 6, vizslas: 6 +Sue 311: vizslas: 6, akitas: 7, cats: 10 +Sue 312: trees: 0, goldfish: 7, cars: 0 +Sue 313: perfumes: 5, akitas: 5, cars: 2 +Sue 314: akitas: 10, vizslas: 3, samoyeds: 8 +Sue 315: cars: 3, perfumes: 1, goldfish: 8 +Sue 316: pomeranians: 6, goldfish: 9, perfumes: 1 +Sue 317: goldfish: 4, akitas: 6, cars: 2 +Sue 318: perfumes: 8, vizslas: 8, akitas: 0 +Sue 319: akitas: 10, cars: 5, vizslas: 6 +Sue 320: vizslas: 4, akitas: 3, cats: 4 +Sue 321: goldfish: 4, akitas: 8, cars: 8 +Sue 322: pomeranians: 5, vizslas: 7, cats: 1 +Sue 323: perfumes: 1, trees: 6, goldfish: 0 +Sue 324: goldfish: 6, trees: 10, cars: 10 +Sue 325: akitas: 2, samoyeds: 6, trees: 9 +Sue 326: vizslas: 4, akitas: 7, cars: 9 +Sue 327: children: 3, perfumes: 4, cars: 1 +Sue 328: akitas: 9, perfumes: 6, cars: 10 +Sue 329: perfumes: 2, goldfish: 0, trees: 1 +Sue 330: vizslas: 10, pomeranians: 7, goldfish: 6 +Sue 331: trees: 3, vizslas: 8, cars: 3 +Sue 332: akitas: 2, cats: 1, goldfish: 8 +Sue 333: cars: 6, trees: 2, vizslas: 0 +Sue 334: samoyeds: 7, cars: 7, trees: 3 +Sue 335: cats: 7, children: 1, perfumes: 8 +Sue 336: akitas: 5, goldfish: 10, vizslas: 5 +Sue 337: cats: 3, vizslas: 0, akitas: 10 +Sue 338: perfumes: 8, cars: 1, trees: 8 +Sue 339: cars: 4, samoyeds: 8, children: 2 +Sue 340: goldfish: 9, pomeranians: 1, samoyeds: 1 +Sue 341: akitas: 3, trees: 0, goldfish: 2 +Sue 342: perfumes: 4, vizslas: 8, pomeranians: 9 +Sue 343: akitas: 4, cars: 5, goldfish: 4 +Sue 344: samoyeds: 5, cats: 4, trees: 0 +Sue 345: samoyeds: 4, cars: 8, akitas: 2 +Sue 346: akitas: 3, vizslas: 10, perfumes: 10 +Sue 347: goldfish: 10, akitas: 4, cars: 1 +Sue 348: perfumes: 10, cats: 4, vizslas: 5 +Sue 349: akitas: 2, vizslas: 4, cars: 7 +Sue 350: akitas: 5, vizslas: 5, cars: 6 +Sue 351: vizslas: 8, perfumes: 6, cars: 3 +Sue 352: cars: 10, vizslas: 0, goldfish: 10 +Sue 353: cars: 10, perfumes: 5, children: 7 +Sue 354: vizslas: 6, akitas: 3, samoyeds: 9 +Sue 355: akitas: 2, perfumes: 7, cars: 10 +Sue 356: cars: 10, perfumes: 7, children: 6 +Sue 357: akitas: 4, cars: 8, trees: 1 +Sue 358: trees: 2, cars: 1, goldfish: 2 +Sue 359: vizslas: 5, cars: 9, trees: 4 +Sue 360: perfumes: 4, akitas: 3, cars: 3 +Sue 361: children: 3, akitas: 2, cats: 5 +Sue 362: cars: 8, cats: 4, akitas: 10 +Sue 363: cats: 2, trees: 1, vizslas: 4 +Sue 364: vizslas: 2, pomeranians: 5, samoyeds: 9 +Sue 365: samoyeds: 2, akitas: 7, goldfish: 9 +Sue 366: goldfish: 8, trees: 7, cats: 2 +Sue 367: perfumes: 2, vizslas: 6, trees: 5 +Sue 368: cars: 5, samoyeds: 0, perfumes: 6 +Sue 369: samoyeds: 10, trees: 10, vizslas: 1 +Sue 370: trees: 2, vizslas: 3, cars: 4 +Sue 371: akitas: 6, pomeranians: 2, cats: 4 +Sue 372: trees: 2, perfumes: 3, goldfish: 9 +Sue 373: vizslas: 5, children: 0, pomeranians: 6 +Sue 374: trees: 1, vizslas: 8, perfumes: 10 +Sue 375: cars: 0, akitas: 6, children: 0 +Sue 376: akitas: 1, vizslas: 0, trees: 0 +Sue 377: samoyeds: 10, cats: 5, pomeranians: 0 +Sue 378: goldfish: 3, pomeranians: 7, cats: 7 +Sue 379: perfumes: 0, cats: 0, trees: 8 +Sue 380: perfumes: 4, samoyeds: 1, akitas: 7 +Sue 381: akitas: 4, pomeranians: 2, children: 4 +Sue 382: vizslas: 9, akitas: 4, trees: 10 +Sue 383: trees: 1, vizslas: 10, akitas: 6 +Sue 384: trees: 3, akitas: 8, goldfish: 3 +Sue 385: goldfish: 6, perfumes: 2, children: 9 +Sue 386: children: 10, akitas: 7, goldfish: 7 +Sue 387: goldfish: 3, vizslas: 10, perfumes: 5 +Sue 388: children: 4, trees: 0, cars: 2 +Sue 389: trees: 0, cats: 3, goldfish: 10 +Sue 390: samoyeds: 9, pomeranians: 0, cats: 6 +Sue 391: samoyeds: 10, trees: 3, akitas: 4 +Sue 392: akitas: 9, goldfish: 10, perfumes: 7 +Sue 393: goldfish: 6, cars: 2, akitas: 9 +Sue 394: trees: 4, goldfish: 9, vizslas: 7 +Sue 395: vizslas: 4, samoyeds: 1, goldfish: 6 +Sue 396: vizslas: 5, cats: 0, samoyeds: 1 +Sue 397: goldfish: 7, cats: 0, trees: 7 +Sue 398: cars: 10, akitas: 1, vizslas: 7 +Sue 399: samoyeds: 10, cats: 6, goldfish: 6 +Sue 400: cats: 6, samoyeds: 0, trees: 2 +Sue 401: trees: 1, children: 4, goldfish: 2 +Sue 402: cats: 8, vizslas: 4, children: 3 +Sue 403: cars: 9, perfumes: 8, pomeranians: 2 +Sue 404: goldfish: 8, trees: 2, cars: 5 +Sue 405: perfumes: 1, pomeranians: 5, vizslas: 5 +Sue 406: perfumes: 6, trees: 2, pomeranians: 6 +Sue 407: trees: 0, goldfish: 6, cars: 6 +Sue 408: trees: 0, samoyeds: 7, goldfish: 9 +Sue 409: samoyeds: 10, goldfish: 6, pomeranians: 0 +Sue 410: perfumes: 5, vizslas: 6, trees: 0 +Sue 411: goldfish: 2, trees: 2, pomeranians: 0 +Sue 412: pomeranians: 4, perfumes: 8, cats: 8 +Sue 413: vizslas: 4, cars: 5, akitas: 1 +Sue 414: perfumes: 2, trees: 8, goldfish: 7 +Sue 415: akitas: 3, trees: 1, perfumes: 3 +Sue 416: cars: 7, trees: 1, perfumes: 8 +Sue 417: cars: 5, goldfish: 5, trees: 1 +Sue 418: cars: 9, goldfish: 4, samoyeds: 2 +Sue 419: pomeranians: 8, akitas: 1, goldfish: 6 +Sue 420: cars: 0, cats: 0, children: 8 +Sue 421: akitas: 10, goldfish: 1, vizslas: 8 +Sue 422: children: 8, vizslas: 6, samoyeds: 10 +Sue 423: samoyeds: 3, goldfish: 10, vizslas: 8 +Sue 424: cars: 3, children: 7, goldfish: 4 +Sue 425: cars: 9, perfumes: 9, goldfish: 8 +Sue 426: akitas: 5, trees: 10, vizslas: 10 +Sue 427: vizslas: 10, cars: 3, akitas: 7 +Sue 428: cats: 6, perfumes: 5, goldfish: 10 +Sue 429: goldfish: 7, trees: 5, vizslas: 10 +Sue 430: perfumes: 3, trees: 7, cars: 3 +Sue 431: cars: 2, vizslas: 1, akitas: 6 +Sue 432: pomeranians: 8, perfumes: 5, cars: 3 +Sue 433: children: 8, cars: 0, perfumes: 7 +Sue 434: samoyeds: 0, vizslas: 9, akitas: 10 +Sue 435: akitas: 3, vizslas: 8, cats: 4 +Sue 436: goldfish: 5, trees: 8, samoyeds: 8 +Sue 437: cars: 10, samoyeds: 9, goldfish: 7 +Sue 438: samoyeds: 5, akitas: 7, perfumes: 9 +Sue 439: goldfish: 10, perfumes: 5, cars: 0 +Sue 440: pomeranians: 1, samoyeds: 9, children: 4 +Sue 441: vizslas: 4, perfumes: 2, cats: 5 +Sue 442: trees: 0, pomeranians: 3, cars: 7 +Sue 443: akitas: 0, cars: 2, vizslas: 10 +Sue 444: children: 1, akitas: 9, trees: 0 +Sue 445: cars: 5, perfumes: 7, goldfish: 9 +Sue 446: akitas: 0, perfumes: 1, vizslas: 2 +Sue 447: vizslas: 7, perfumes: 0, cars: 5 +Sue 448: vizslas: 6, goldfish: 10, trees: 0 +Sue 449: cars: 7, vizslas: 7, trees: 3 +Sue 450: pomeranians: 4, akitas: 4, vizslas: 8 +Sue 451: cats: 4, perfumes: 8, children: 3 +Sue 452: samoyeds: 8, akitas: 9, cars: 1 +Sue 453: cars: 8, akitas: 5, vizslas: 2 +Sue 454: vizslas: 9, perfumes: 4, akitas: 4 +Sue 455: akitas: 3, goldfish: 2, vizslas: 6 +Sue 456: cars: 4, perfumes: 5, goldfish: 10 +Sue 457: trees: 9, pomeranians: 4, goldfish: 10 +Sue 458: pomeranians: 1, perfumes: 9, children: 6 +Sue 459: samoyeds: 0, goldfish: 8, vizslas: 6 +Sue 460: cars: 10, goldfish: 8, samoyeds: 8 +Sue 461: akitas: 8, goldfish: 9, vizslas: 2 +Sue 462: cars: 1, vizslas: 2, akitas: 8 +Sue 463: goldfish: 2, akitas: 4, samoyeds: 10 +Sue 464: children: 5, perfumes: 5, cars: 5 +Sue 465: perfumes: 9, trees: 0, samoyeds: 6 +Sue 466: akitas: 5, goldfish: 3, cats: 6 +Sue 467: perfumes: 3, goldfish: 0, trees: 4 +Sue 468: goldfish: 2, children: 4, trees: 1 +Sue 469: cars: 0, perfumes: 8, children: 7 +Sue 470: vizslas: 8, cats: 5, samoyeds: 9 +Sue 471: pomeranians: 7, trees: 2, goldfish: 3 +Sue 472: goldfish: 8, akitas: 4, perfumes: 5 +Sue 473: perfumes: 2, pomeranians: 3, cars: 8 +Sue 474: samoyeds: 0, akitas: 7, pomeranians: 6 +Sue 475: vizslas: 7, perfumes: 1, trees: 6 +Sue 476: vizslas: 3, samoyeds: 1, perfumes: 10 +Sue 477: cars: 6, perfumes: 5, vizslas: 2 +Sue 478: pomeranians: 1, goldfish: 3, akitas: 7 +Sue 479: goldfish: 10, trees: 0, cars: 3 +Sue 480: cats: 3, akitas: 5, vizslas: 8 +Sue 481: pomeranians: 5, vizslas: 2, trees: 3 +Sue 482: cars: 8, samoyeds: 10, goldfish: 10 +Sue 483: pomeranians: 3, vizslas: 6, goldfish: 5 +Sue 484: perfumes: 7, vizslas: 4, akitas: 7 +Sue 485: goldfish: 1, trees: 0, perfumes: 10 +Sue 486: goldfish: 6, perfumes: 0, akitas: 10 +Sue 487: cats: 2, akitas: 10, trees: 1 +Sue 488: akitas: 1, goldfish: 3, cars: 7 +Sue 489: goldfish: 3, akitas: 6, vizslas: 6 +Sue 490: goldfish: 8, perfumes: 2, akitas: 2 +Sue 491: trees: 4, vizslas: 8, perfumes: 6 +Sue 492: cars: 9, perfumes: 3, cats: 0 +Sue 493: trees: 3, vizslas: 6, goldfish: 7 +Sue 494: trees: 8, samoyeds: 1, perfumes: 5 +Sue 495: children: 9, akitas: 8, vizslas: 4 +Sue 496: vizslas: 2, pomeranians: 1, perfumes: 7 +Sue 497: trees: 2, akitas: 4, vizslas: 6 +Sue 498: akitas: 8, pomeranians: 7, trees: 0 +Sue 499: perfumes: 6, goldfish: 3, vizslas: 7 +Sue 500: cars: 1, perfumes: 6, vizslas: 1 diff --git a/src/main/resources/2015/day17.txt b/src/main/resources/2015/day17.txt new file mode 100644 index 00000000..6b25a726 --- /dev/null +++ b/src/main/resources/2015/day17.txt @@ -0,0 +1,20 @@ +33 +14 +18 +20 +45 +35 +16 +35 +1 +13 +18 +13 +50 +44 +48 +6 +24 +41 +30 +42 diff --git a/src/main/resources/2015/day18.txt b/src/main/resources/2015/day18.txt new file mode 100644 index 00000000..5efaa1bf --- /dev/null +++ b/src/main/resources/2015/day18.txt @@ -0,0 +1,100 @@ +#...##......#......##.##..#...##......##.#.#.###.#.#..#..#......####..#......###.#.#....#..##..###.. +####..#.#...#....#.#####.##.##.#..#.......#....#.##...###.###..#.#.#........#..#.#.##...##..#.####.# +...#..##...#.#.###.#.###..#.##.####.###...#...........#.###..##.#.##.#.###...#.#..###....#.###.#..#. +.#...##...####.#..#.....#..#...#.#.##...#...##..#.#.###....#..###.....##..#.###..###.....##..###...# +..##.#####....##..#.#..##.##..######...#..###.######.....#..##...#.#..##..##..#..#..#..##.#.#.#.#... +.###.###.###...##...##..###..##.###.#.....##..##.#.#########...##..##.#..##.#..##..####..#.#.#.##### +#.#####..###.###.##.##.#...#.#.#.#..#.###...#..##.###.#...####.#..#.#.....###..#..####..#.#.#...##.. +....#...##.....#....####.##.#.###..#.#.##..#.#...##.###.###..#.##..#.#.##..##..#.##.###..#.#.###.### +##.##...#.##...#.#..#.#..#...###...###.#..#..#.#####..###.#......#.....###.#####.#.#..#.#.#.##..#.#. +#.#..#.....#.....##.#..##...###..##...##...###.#.###.#..#.#.###...##..##..#.###...#.#######.#...#.#. +#.#.....####.#..#.##...#.##....#####.###.#.....#####....###..#........##..####...#...#.###....#..### +##.#.##..#.#.##.#.....##.#.....###.####.#..######.....####.#.#..##.#.##...#..#.#.....#.####.#....... +#..#..#.#..#.######.##..##.####.....##.#.##.#.######..#.#....#.#...#.#..#..#.#.###.#..#.#.#..#...### +####..####.#.#.###.....#.#.#.##..#.##.##.##.#..##..##.#.##.....#.#..#.####.....###.#..#.####.#.#..## +###.##..##.#.##..#..##...#.#####.##.#....##.####.#.##....#..###.#.#.##...#.....#.#.#.#.#..##.#.#..#. +......#..####...##.##...#.##.##...##..#..##.###..#...#..##...#.#....###.####...#.##.###.#.##.####.## +..#...#####.#.#..#.##....#..#...#..####.....###...##.###....#..#.###...#........#.#.##..#..#.#.....# +#######.#.#.###.###..######.##..#####.##.###.###....####.#..##.##...###.#..############.#.##....##.# +#.#...##.###.#.###..#.#.#.#.#.#..##..####.#..##.....#.##..#.##...##.#..##..#.#.#....##....##.#..#.#. +..#.#.####.....###..#######.#.#.#.#...##.#####.....##...##...##.###..######.###..#...####.#..###.### +.#.##....#.#.##..##.#.##.##..######...#.....#..#.#.#.#.....#.#..##.#.#.......#######....#.......#... +..###.##.##..##....#.###...#.....##..##......###...##..###.##...##.###.#.#.#.###.###.#.#...###..#... +.##.#.#...#...##.#.#...#..#..#.#...##.#.##...##..#....#.#..##.#..#.#..#.#.....#..#.#...#######.#.##. +...####....#.###.#..###..##...##..#.#.#.###...#..##.##.##..##.#...#..#.##.....#.#........#..#.#.#### +.....##..###...#....#.#.#.#...###.###...#.#...#.#.####....#..####...###..#..######..##.##..###.##### +#####.##..#....###.###....##.....#.#..#....#.#####.##.#.####.#.##...#..###...###..##...#.###.#####.. +###.##..........########.######....####.###.#..##...#.##.####.#.....##..#####..###...#####.....#.#.# +##..#####.##.#.#####.#.##.##..#.##....########.#####.#...#.###.##...#.###.#.#..#....##.#..#...#.#.#. +.##.#....#..#...#..#####..#..##.#......#..#....########...#..#...#.....####.#...##...#.###.#.#..##.# +.##.##.#.##.#.##...#.#.#..##.##.###.#..##..#...###.##.###.#####.#.###..#..###.#...#.###.#...#..#.#.# +.#..#..#.#..#..###..#....###.####.##.#.###.#.##.###.#.##.###.###...###...###.#...####...#.##.##.#.#. +###..##...###...#..##.#..#.#...##....###.##.##..#####....###..#..#....#..###.###.#...#.##...#.#.#..# +#....#.......##.....#.##...#..#.###.#.##..##..#.##..#.###..##.##...#####.#..#####..#####..#####....# +.####.####....###..###.#.##.####.##.#...####.#.###.#.....#...####..#####.###..#.#.###.##.##...##..#. +####..##...##.########...##..###..#..###.##.#.#.#........#.#####.#...#.###.####.#..####..#.#.#....## +###.#..#...###.#..#..#.###...##..###.##.#.#...#..#...####..##....#.#..#..##.#.#...#####.###.#..#.#.# +...##....#.###.#.#..##...##.###.#..#..#......#...#.#..####.#.##..######.####.#...#..#..#..##.#.#.##. +##.####.#...#..#.#.##..##.#.#.###..##...####......#..######.#......#.##.#....##...###.#.#..#......## +#.....#...#######.##.#..#.#...###.#..#.####....#.#.##.#.##...###..#...#.###.##..#.###..#.##...#####. +#####.##...#..#.#.#.......#.##..#####..#####...###..##.#.#..###.#.#####.####..#.#..##...#.##...#.### +.##.#..#######.###.#.####.....##...#.##.#.#..#...##....####......######.#..######.....##########.##. +##...#.#..#.##.###.#.#.#.##.###.##..##.##.##...#.#..###.#######..#.....#####..#....######.#..##..### +.#.#.###.....#..##..#.#..##..#.###...###.#..##...#...#.#####.#.#####..###.#..#...##..#.#..#..####... +.#......##..#.....####.###....##.###.....###.##........#.###.##..#..#.#######.#.######..##..###..... +..##.#.#..#.##...#.###.###...######..#..#.#..#....###.#.#....#..........#...##.##.##.#..##..#.#####. +###.###.#..#.##..##.#..#..##.....##.....#..#######.#..#.#.#.####.###..###.#.#..#.##.##.####.###.#### +#.#.#..#....########.#..#..#...##..#.##..#.#..##..####...##.....#.##.#.#...########..#.###.#..#.#.## +.##.....#...#.#...##.##....###...##..#.####...#..#.#..#..#.##..#.###.##.####.##..####.....##.#.....# +....####.#.##.#.##.#..##.#.######.##.####..#...####.#..###.#.#..#..##.#.#.....##.#####.#.####...#.#. +#..#####.#####.....##....######..##....#..#.#.###.#####.....##.##.####.#...##...#.##.#.#####.##.#... +##.####..###.#....#...#.#.#.#.###.#####.#.####..####...####......##..#..#..#.#.##...########....#... +.###.#.#.#.#..####.##.#..######..#.#.###.....#.#......#.#.#.#..####.##...##.#####.#.##..##..#..#.#.. +.....###...#...#.####.###.#.#.#.#.....#....#.####.###.##.##.##.#######......#.####......#....##..... +##..#..#.#.##..#...#..##.##.##..###.#....##.##....####.#.##.###....#.##.#.#.##...##.###...#..#..#### +...#.#..##..##.#...##.##...#.#......#.#.##..###....####.##...#.#.###.#..#..#.####..##..##..#####.### +.##.##..##########.##...#.##.####.#.#######.##.#.##.##..#...##....########.###..##.##.##.#..##.#.#.# +#####.#....#.##..#.....#......##.##..#.##.###..##.......###..##.#.###.##.###....####.#..#.###..#.#.# +.#...#..#.##....##....#...####....#...#..#...####...########.###.#..##.#.#.##..###..#.#.###.....##.# +##..##.....###......#..###.##.####.##.####.#.#....#..#...#..#.#..#.###.#...#...#..##.##...#..####### +.....##..###..##...#####.#.#.....###.#.#..####...#.#.#..#..####..##.#..###.####.#....##..###....#..# +#.#.##.#....#.#####.#....##...#...##...##....#.#.......#....#..#...###.###.#.####..####....#.##.#.#. +..##...##..###.#.#.##.#..#....#.#.....##.###.#.###.###.....#...#.#..#######.#####..#.###...##......# +#......###..#....#.#..#.###.##.#...##..###.####.#.#....#.##..#.###..##.#..#####..##.###.....#..###.. +##.#.##..##.###.#..##.....#.##.....###....##.####.######.#...#..###....#.#...#.##.....###....#..#.#. +.##.#.#.#.##..#.#.#..##..#.###.####....#..###.######..####.#.....###.##..#...###.#..######.##.#.##.. +...##.####.#..##.#####.##.#...##..#..#...#.#.#.#####...#....#..###...#..#....#.#.##.#.######.#..#### +..#.#.#.#...#.######.#.....#..#.#..###....#.#.########...#....#.#.##..#...##...#.#..#.#.###....##... +#####..#..##..#..##..#..#.#.##.#....#####.####.##.#.###..##..##....#.....#.#####.#...#.#####.##.#.#. +#.#..#####...####.###.###.....####.###.....##...##...#..#..#######.#.##....##..####.....##...#..#..# +#.#.###.#.#..##..#....#.#...#.#.##.##..#.##.....##...#.#..##.......##.#.###..#####.#.##....#.##..... +...#.......#....#.#.####.#.###.###..#....#..##.#..####........#.##..#...#.#...###.#..#.#.#...#...#.. +...##.#####.##.#.###.##.##.#.##..##.#.#.#.#.#.##.#..##...##.#.#..#..##.##.#####.#.###...#####..#..#. +#######.#..#..#....##.#.#..####.#..#..###...#..#.......###.#.#.####....#.###...#.#.###.#.#.#.#..###. +..##.##.#.##.###....###.##.#.###.#...#....#.####..###..###.#.#..#...##.#.#.#..##.###..###.#.##...### +######..######..##..##.#.#.##.##.#..##..#.#.#.##..#.#...#...#.#.#..######.#..#.#.######..#......##.# +#.#####.....#.......#########..###.##...#...##.#.#..#...#####...#...#..#.###.#..#.#...###.#.#.#...#. +#....##....###...##.##.#...##.........##.#.#..#.#.##.#.######.#####..#..###.###.#...#.#.##.######... +#.#...###.#.###.##.#.######.#######.###.##..#.#.#...######.##.####.##..#.#.#.#......##..##.........# +..###..##....#.....##...#.#.###.#.#.....##.#...###.####.#...#...##..##.#.#.####..###...######....#.# +..###.#.##.####.#..#.##....##..#####....#..##.##.#..#######...#.####...##.#.#.##.........#....#....# +.##.#...#.####..#.#...#.##..######.##..##.#.###.##..###.###....##..#.##.##..##.#...###.##.##.###.... +#...###.###.#..#....#.......#..#.....###..#.###.##.##....#.####.#.####.##..##..#..#.....#....##.#.#. +.##.#..#..#.##.......#.####.#######.....#.##.##.#.....#.#..#....######.#..###.##.##.....#.####..##.# +###..#.###.#..####.....##....#..####....#.##.##..#...######.#########...#.#....##...###.#..#.##...#. +#..###..##..#.#.##.###.#.#.##...###.#...##.##..#.###....###..#.#...#.###..######.#..#.###..#..#..#.# +.#........##.#.###..###.#.#.##.....##.##.#.#...##..#.##....###..#.#.#.#.##....#.##..#.#...###...#... +####.####..#....#.#.#..#..##.......##.####...###.##..#.#.##.#..##..######.......##.#.##..#...#.....# +..#..#..###..##.##..######.#..###..###.#.##..##.#..#####.#.#.#.##..#.##..##.##......####.#.......... +...##.##..###.#...###....#.#.#.#.....#.##.....##...#...#......####...##.##....##.#..#.####.#..###.#. +..#.....####.#.###.#####..#..###..#..#.#...#####...###.###....#.###..#...#..#..#.#..#.##..##.#.#.... +..##.#####...###.###.........#....##.####.##..#.#..#.#...#...##.##.##..#.#.##.########......#####... +...###.#.#..#...#.###.###.......##.###.#..#.##########...#..#.#.#.##.#.###...######..#.#...###.##... +.#.#.#######.#..##.##..##...#...####...#..#####.#..##...###.#.#...#.##...#......#..##.####..#.....## +.##.##.#.#......#######..###.....##.#.##..###......#....####...#.###.#.##.#........#..#....##.....## +#...#.###.#.##...##.####....#...#.###..#.#.....#.#....#.#.#.##...#.#..#####.#.#..#..#..#....#...#### +.....##...###......#####..##.##.##...##.#.#####..##...#.#.#.#.###...###.##.####..#.#..#.#..#.####.## +#..#..##.#.##.#.##.#.#.#..###....###.##.#.##.#...#.#..#...#....###.#..#.#.######.#...####..#..##.#.# +#..#.#..#...###.#..##.#...#...##.#......#...#..#..####..##.....#.###...#.#..#.#....#.#####.##.###... +###....#.#..#.#..###..#.##......#...#..#..##.#..###..##..#..#.####..#...########..##.#.##.#.#.#...#. +.#.#.##.##.###..#...#.#....#..#.##..#.#.#.#.##.##.#####...#........####..###..####.#####..#.##.#.##. diff --git a/src/main/resources/2015/day19.txt b/src/main/resources/2015/day19.txt new file mode 100644 index 00000000..a245944f --- /dev/null +++ b/src/main/resources/2015/day19.txt @@ -0,0 +1,45 @@ +Al => ThF +Al => ThRnFAr +B => BCa +B => TiB +B => TiRnFAr +Ca => CaCa +Ca => PB +Ca => PRnFAr +Ca => SiRnFYFAr +Ca => SiRnMgAr +Ca => SiTh +F => CaF +F => PMg +F => SiAl +H => CRnAlAr +H => CRnFYFYFAr +H => CRnFYMgAr +H => CRnMgYFAr +H => HCa +H => NRnFYFAr +H => NRnMgAr +H => NTh +H => OB +H => ORnFAr +Mg => BF +Mg => TiMg +N => CRnFAr +N => HSi +O => CRnFYFAr +O => CRnMgAr +O => HP +O => NRnFAr +O => OTi +P => CaP +P => PTi +P => SiRnFAr +Si => CaSi +Th => ThCa +Ti => BP +Ti => TiTi +e => HF +e => NAl +e => OMg + +CRnCaCaCaSiRnBPTiMgArSiRnSiRnMgArSiRnCaFArTiTiBSiThFYCaFArCaCaSiThCaPBSiThSiThCaCaPTiRnPBSiThRnFArArCaCaSiThCaSiThSiRnMgArCaPTiBPRnFArSiThCaSiRnFArBCaSiRnCaPRnFArPMgYCaFArCaPTiTiTiBPBSiThCaPTiBPBSiRnFArBPBSiRnCaFArBPRnSiRnFArRnSiRnBFArCaFArCaCaCaSiThSiThCaCaPBPTiTiRnFArCaPTiBSiAlArPBCaCaCaCaCaSiRnMgArCaSiThFArThCaSiThCaSiRnCaFYCaSiRnFYFArFArCaSiRnFYFArCaSiRnBPMgArSiThPRnFArCaSiRnFArTiRnSiRnFYFArCaSiRnBFArCaSiRnTiMgArSiThCaSiThCaFArPRnFArSiRnFArTiTiTiTiBCaCaSiRnCaCaFYFArSiThCaPTiBPTiBCaSiThSiRnMgArCaF diff --git a/src/main/resources/2015/day2.txt b/src/main/resources/2015/day2.txt new file mode 100644 index 00000000..5f3335f7 --- /dev/null +++ b/src/main/resources/2015/day2.txt @@ -0,0 +1,1000 @@ +29x13x26 +11x11x14 +27x2x5 +6x10x13 +15x19x10 +26x29x15 +8x23x6 +17x8x26 +20x28x3 +23x12x24 +11x17x3 +19x23x28 +25x2x25 +1x15x3 +25x14x4 +23x10x23 +29x19x7 +17x10x13 +26x30x4 +16x7x16 +7x5x27 +8x23x6 +2x20x2 +18x4x24 +30x2x26 +6x14x23 +10x23x9 +29x29x22 +1x21x14 +22x10x13 +10x12x10 +20x13x11 +12x2x14 +2x16x29 +27x18x26 +6x12x20 +18x17x8 +14x25x1 +30x15x22 +17x18x7 +28x23x24 +15x12x25 +14x7x20 +29x23x8 +24x5x22 +6x22x8 +1x15x26 +14x5x1 +24x28x28 +17x23x23 +4x15x7 +23x8x11 +6x15x1 +23x18x13 +17x1x26 +23x13x17 +2x18x8 +22x22x1 +10x22x6 +28x29x20 +22x21x25 +14x8x23 +12x30x14 +8x7x5 +3x30x15 +4x3x29 +25x18x3 +16x7x16 +4x3x8 +9x16x30 +20x28x3 +28x24x6 +4x18x2 +23x18x5 +22x4x30 +15x30x9 +7x12x12 +3x22x29 +12x1x9 +9x2x25 +17x11x10 +25x24x7 +7x27x26 +26x4x12 +29x2x26 +19x24x12 +23x23x3 +26x28x16 +18x4x16 +25x30x18 +29x19x19 +16x3x27 +29x25x29 +18x19x5 +14x21x30 +19x13x26 +19x10x15 +9x4x7 +18x6x6 +24x25x29 +9x12x27 +15x3x22 +30x17x21 +18x19x28 +9x11x12 +8x28x22 +11x3x4 +28x17x20 +24x18x15 +11x12x13 +6x19x24 +28x4x5 +28x22x23 +13x29x2 +9x16x15 +29x28x1 +10x18x30 +19x11x12 +26x28x25 +23x17x13 +25x1x21 +17x1x27 +17x27x28 +28x13x15 +14x13x25 +11x29x7 +22x29x5 +13x6x14 +23x18x13 +25x7x17 +18x9x20 +21x11x2 +28x11x13 +13x25x1 +19x29x25 +16x29x4 +10x21x10 +7x25x17 +5x9x3 +1x15x6 +8x27x29 +23x6x30 +22x22x29 +6x20x30 +26x25x29 +10x19x19 +20x30x9 +5x30x24 +17x10x27 +30x14x30 +8x17x4 +7x18x6 +3x5x4 +24x17x15 +14x20x17 +22x27x15 +18x14x15 +23x9x11 +21x16x29 +7x18x21 +9x3x29 +10x13x4 +2x30x4 +23x20x4 +8x22x21 +29x28x4 +13x16x25 +21x9x11 +7x26x26 +13x23x30 +19x7x10 +9x23x21 +21x9x17 +9x21x15 +20x29x22 +23x13x15 +19x25x2 +12x11x30 +20x21x6 +21x6x17 +24x26x9 +29x21x29 +29x26x16 +6x16x1 +2x12x6 +6x7x20 +7x2x22 +6x22x4 +13x11x27 +25x27x14 +11x8x6 +26x11x14 +30x3x29 +27x21x20 +15x16x26 +6x22x10 +11x9x25 +23x13x6 +13x9x3 +30x22x13 +29x23x14 +25x19x6 +7x29x11 +19x18x5 +29x25x13 +25x24x27 +1x9x12 +22x9x17 +14x12x28 +19x21x17 +13x25x17 +14x25x12 +4x14x30 +7x15x28 +3x6x25 +6x2x16 +15x19x11 +17x30x20 +20x23x7 +26x21x6 +26x29x24 +2x4x30 +4x22x18 +13x3x28 +27x6x21 +5x3x27 +12x7x11 +28x11x9 +12x9x2 +1x22x20 +15x13x28 +14x19x16 +28x20x3 +20x4x9 +26x7x26 +18x19x25 +7x1x13 +20x23x29 +27x26x8 +11x15x15 +10x21x23 +29x2x11 +21x28x20 +3x18x23 +26x17x17 +14x26x17 +20x7x17 +18x12x8 +4x8x8 +8x15x23 +24x29x5 +1x25x8 +1x28x17 +16x18x13 +29x24x22 +13x16x10 +14x7x16 +15x11x29 +12x15x19 +17x6x28 +4x3x9 +15x16x8 +29x27x11 +2x24x20 +4x21x3 +29x24x27 +18x22x22 +7x8x18 +20x7x8 +19x9x2 +20x17x2 +2x29x10 +19x25x1 +28x9x3 +29x27x20 +7x21x7 +10x4x22 +26x8x5 +26x14x1 +5x27x9 +2x18x3 +3x27x17 +30x17x23 +30x11x20 +4x6x7 +6x29x27 +30x16x20 +24x30x28 +19x20x26 +18x1x25 +26x12x12 +19x15x29 +16x21x24 +23x13x26 +25x16x10 +8x9x18 +24x14x1 +24x15x21 +19x9x14 +8x23x11 +22x2x16 +29x9x26 +3x16x25 +15x20x30 +3x11x12 +15x2x3 +13x7x4 +2x7x27 +9x26x11 +30x24x19 +28x17x21 +10x8x2 +11x15x26 +10x12x20 +24x24x27 +25x26x16 +13x4x20 +25x13x11 +12x22x3 +20x7x1 +12x18x6 +26x8x20 +14x2x7 +23x12x1 +26x24x24 +27x26x23 +26x17x5 +17x24x2 +26x5x6 +23x5x1 +5x18x30 +24x21x19 +5x28x11 +21x20x14 +25x4x22 +26x24x11 +7x5x8 +13x1x30 +5x1x6 +14x5x2 +8x11x7 +13x20x1 +17x30x14 +29x22x10 +12x26x3 +27x17x3 +26x27x4 +5x26x17 +22x11x19 +8x26x3 +24x19x22 +7x1x4 +6x27x30 +4x28x14 +16x14x18 +4x5x20 +19x25x4 +15x15x1 +10x14x14 +16x18x24 +21x27x15 +5x5x10 +1x7x13 +16x2x8 +13x15x11 +3x25x10 +20x29x8 +12x3x2 +10x13x12 +25x27x1 +11x30x19 +7x19x13 +27x6x18 +16x21x19 +21x29x5 +16x23x12 +29x19x15 +5x5x10 +27x15x1 +13x16x22 +29x19x5 +8x12x9 +3x18x5 +13x25x3 +5x9x21 +10x20x16 +9x9x11 +23x21x1 +22x2x15 +27x8x13 +23x7x3 +26x30x15 +29x15x16 +16x27x13 +2x18x9 +10x27x8 +20x9x25 +10x2x17 +16x13x13 +21x26x1 +27x26x24 +9x30x16 +19x17x28 +25x15x1 +10x26x6 +10x11x11 +5x26x25 +30x4x15 +9x8x23 +14x25x7 +8x28x8 +28x18x24 +4x4x25 +16x25x11 +17x27x8 +15x16x9 +24x13x21 +17x3x27 +27x5x26 +8x27x12 +29x2x8 +24x23x30 +1x30x21 +6x18x20 +13x14x12 +25x30x23 +24x6x24 +12x7x21 +11x6x8 +8x30x30 +26x3x12 +28x6x5 +18x7x1 +7x6x20 +14x16x18 +11x22x15 +4x20x10 +19x24x19 +8x24x11 +4x9x10 +6x6x22 +10x9x29 +1x5x28 +19x25x29 +20x30x3 +15x13x13 +9x9x24 +20x14x29 +26x24x13 +2x25x8 +10x26x2 +12x19x12 +18x6x20 +4x5x14 +26x27x10 +16x26x20 +3x21x15 +2x26x18 +14x11x17 +26x26x25 +10x1x11 +17x19x19 +27x28x26 +9x2x10 +19x30x15 +23x30x14 +15x3x20 +2x14x22 +21x18x8 +22x4x29 +19x6x29 +9x26x29 +16x10x9 +22x12x22 +13x28x14 +25x14x28 +28x3x30 +10x17x1 +10x27x22 +10x23x19 +14x25x9 +11x24x8 +30x25x10 +22x13x28 +2x7x6 +11x20x8 +9x22x14 +19x16x9 +11x24x4 +11x17x2 +6x4x10 +26x10x10 +12x14x5 +27x10x3 +15x3x6 +11x7x19 +22x10x12 +21x26x10 +13x20x3 +27x8x8 +1x24x23 +24x9x22 +23x17x23 +3x28x19 +2x20x28 +23x17x24 +26x1x4 +4x1x12 +5x6x16 +13x22x13 +25x21x21 +20x21x12 +9x24x25 +17x16x12 +12x28x9 +18x16x27 +29x12x2 +30x12x15 +24x11x10 +4x9x22 +4x24x5 +19x11x5 +6x25x6 +1x20x17 +22x8x21 +11x26x4 +16x19x3 +8x12x8 +13x2x18 +10x5x11 +8x12x17 +21x2x5 +26x17x26 +23x18x17 +28x11x14 +1x4x27 +29x5x28 +5x9x10 +5x7x25 +20x15x27 +15x11x17 +12x14x1 +29x14x4 +18x14x18 +14x25x24 +26x14x18 +13x8x11 +30x1x23 +3x4x12 +12x24x9 +8x6x16 +14x15x30 +12x30x8 +22x11x18 +16x30x28 +17x18x4 +13x14x23 +2x28x8 +3x28x30 +29x30x8 +4x6x26 +6x30x17 +11x30x30 +19x4x3 +12x15x20 +22x28x4 +26x30x2 +6x12x7 +1x10x5 +25x29x7 +17x9x18 +16x21x29 +21x14x7 +15x16x11 +26x6x15 +8x24x7 +2x20x4 +2x9x3 +19x8x13 +18x7x22 +27x14x17 +2x13x8 +18x15x26 +15x27x27 +18x11x15 +1x29x20 +21x12x11 +20x2x15 +28x23x9 +1x1x17 +7x23x9 +30x9x27 +9x16x18 +15x24x28 +30x11x18 +29x26x10 +9x5x25 +2x1x19 +14x3x14 +6x3x6 +30x15x20 +20x17x27 +28x10x9 +14x24x28 +17x11x6 +12x3x6 +8x8x15 +23x14x21 +11x21x7 +5x13x30 +4x29x25 +30x28x24 +18x4x9 +3x15x6 +13x9x19 +30x14x7 +7x9x9 +17x11x26 +24x26x13 +16x21x16 +27x17x25 +2x21x11 +9x11x27 +3x3x7 +13x8x14 +20x20x26 +13x29x22 +30x11x1 +7x10x19 +27x5x9 +23x17x15 +21x6x13 +24x15x16 +18x4x14 +18x16x6 +22x11x18 +14x2x5 +15x3x7 +10x20x29 +16x1x10 +30x23x1 +10x15x11 +17x14x5 +22x8x13 +7x11x28 +26x17x3 +2x23x2 +28x13x19 +18x12x28 +22x23x16 +14x12x1 +20x8x19 +17x19x13 +29x2x12 +2x26x27 +29x16x4 +13x8x18 +16x15x30 +23x16x2 +28x8x27 +21x8x23 +13x20x26 +19x6x17 +17x30x15 +7x4x30 +2x13x30 +18x7x19 +4x13x27 +8x6x5 +18x20x25 +2x3x30 +23x27x13 +22x30x4 +23x25x25 +23x16x19 +25x3x1 +5x6x15 +11x29x12 +25x24x7 +16x7x20 +20x3x2 +12x27x15 +16x10x12 +1x3x14 +22x1x26 +2x24x18 +11x29x16 +15x2x9 +10x1x24 +21x8x11 +30x11x23 +6x30x21 +13x27x29 +14x6x5 +18x29x19 +12x4x28 +29x3x14 +10x30x28 +5x7x15 +14x1x10 +9x25x14 +7x24x18 +28x17x21 +18x13x25 +26x15x1 +21x1x19 +12x16x21 +4x6x13 +7x15x26 +17x19x5 +12x28x2 +1x20x19 +27x7x5 +17x26x8 +12x15x19 +5x23x10 +8x2x8 +16x13x12 +14x27x1 +26x29x3 +24x16x14 +14x13x13 +7x22x23 +2x9x30 +4x27x8 +26x27x15 +23x1x6 +25x29x18 +5x18x1 +20x8x20 +5x10x25 +30x25x15 +7x22x25 +28x26x17 +29x4x1 +21x11x27 +20x9x8 +25x22x12 +2x11x11 +23x2x16 +23x27x20 +2x13x28 +27x2x24 +11x1x17 +12x4x27 +16x20x22 +30x12x10 +5x15x4 +5x2x27 +12x4x25 +1x16x4 +27x4x4 +21x16x3 +27x26x3 +24x6x6 +24x12x12 +20x20x25 +8x29x2 +21x4x5 +2x4x8 +4x13x19 +3x20x10 +12x15x16 +6x5x4 +12x16x20 +22x19x17 +8x17x22 +25x16x15 +7x1x19 +10x1x7 +23x23x5 +28x6x12 +2x25x12 +10x27x12 +24x27x19 +14x14x20 +4x1x5 +16x27x29 +20x20x24 +28x24x30 +6x15x15 +9x15x30 +23x26x3 +17x24x21 +22x25x25 +18x29x10 +20x25x1 +24x11x16 +20x7x21 +20x7x9 +7x26x2 +5x18x1 +16x26x28 +4x10x18 +27x30x21 +26x9x9 +8x16x14 +6x27x8 +28x9x20 +13x13x4 +9x18x16 +18x15x18 +22x19x14 +14x10x17 +25x29x11 +1x18x19 +8x11x26 +18x6x14 +30x24x13 +27x1x27 +15x9x3 +2x29x17 +2x26x21 +22x9x9 +20x20x20 +22x28x2 +26x5x16 +11x3x14 +21x16x16 +18x26x7 +18x30x6 +7x11x12 +15x10x2 +27x2x16 +27x30x24 +28x14x24 +7x4x8 +6x28x15 +13x19x1 +22x26x30 +7x30x24 +2x17x21 +19x26x2 +19x24x15 +14x23x2 +21x27x15 +30x15x14 +21x29x5 +23x30x2 +4x1x2 +15x5x13 +21x2x30 +20x7x16 +1x21x25 +2x25x1 +12x29x5 +28x13x16 +26x3x12 +29x20x23 +28x12x20 +4x30x8 +16x15x16 +6x16x29 +2x28x13 +24x25x2 +26x15x22 +17x20x11 +18x12x7 +19x1x18 +8x27x13 +22x16x8 +19x26x17 +13x11x10 +22x12x3 +13x12x14 +29x17x9 +6x14x10 +14x20x10 +8x26x9 +25x13x22 +3x30x25 +14x28x1 +30x29x12 +3x17x15 +3x24x14 +28x24x22 +16x6x1 +20x25x14 +17x17x13 +6x19x27 +10x15x20 +8x23x20 +7x29x21 +18x9x25 +10x5x22 +2x27x27 +16x18x30 +15x5x12 +26x29x29 +28x11x10 +9x29x28 +24x15x23 +26x9x10 +5x1x25 +22x27x16 +7x29x3 +1x3x5 +8x7x29 +19x21x11 +28x13x30 +17x16x20 +5x10x25 +9x14x15 +15x14x23 +16x4x17 +21x8x2 +9x9x8 +22x22x4 +10x2x27 +12x19x10 +15x29x4 +22x14x7 +29x18x5 +1x7x27 +24x1x15 +23x23x26 +12x17x23 +26x10x24 +8x22x2 +8x1x10 +22x19x12 +2x23x13 +11x27x25 +26x15x27 +27x7x21 +18x9x6 +22x21x22 +7x12x26 +23x21x13 +14x3x8 +5x9x28 +29x29x15 +27x25x23 +12x2x24 +8x2x20 +29x19x4 +12x24x29 +2x27x28 +14x20x9 +28x6x25 +18x29x8 +19x11x30 +15x11x23 +18x7x7 +14x20x14 +26x18x22 +27x25x13 +12x10x30 +30x2x7 +28x10x1 +18x10x30 +22x11x5 +22x16x3 +25x15x9 +5x10x24 +4x28x8 +19x24x18 +3x4x25 +14x4x30 +11x26x3 +12x12x12 +26x7x24 +3x2x14 +1x27x7 +2x2x13 +3x26x26 +12x4x11 +12x17x20 +4x19x30 +5x18x10 +17x6x18 +19x30x20 +11x2x17 +30x13x19 +22x23x7 +17x28x2 +5x17x30 +7x11x4 +21x26x18 +15x28x4 +5x6x27 +12x6x16 +9x17x12 +27x20x5 +14x5x20 +27x14x6 +2x14x21 +4x28x30 +24x5x1 +19x29x29 +11x23x1 +8x16x21 +3x17x19 +10x13x5 +20x21x16 +23x3x6 +27x26x11 +3x2x22 +14x3x5 +10x9x8 diff --git a/src/main/resources/2015/day20.txt b/src/main/resources/2015/day20.txt new file mode 100644 index 00000000..f0d83361 --- /dev/null +++ b/src/main/resources/2015/day20.txt @@ -0,0 +1 @@ +36000000 diff --git a/src/main/resources/2015/day21.txt b/src/main/resources/2015/day21.txt new file mode 100644 index 00000000..3351c92f --- /dev/null +++ b/src/main/resources/2015/day21.txt @@ -0,0 +1,3 @@ +Hit Points: 104 +Damage: 8 +Armor: 1 diff --git a/src/main/resources/2015/day22.txt b/src/main/resources/2015/day22.txt new file mode 100644 index 00000000..0001c6bd --- /dev/null +++ b/src/main/resources/2015/day22.txt @@ -0,0 +1,2 @@ +Hit Points: 55 +Damage: 8 diff --git a/src/main/resources/2015/day23.txt b/src/main/resources/2015/day23.txt new file mode 100644 index 00000000..a2b735a5 --- /dev/null +++ b/src/main/resources/2015/day23.txt @@ -0,0 +1,47 @@ +jio a, +18 +inc a +tpl a +inc a +tpl a +tpl a +tpl a +inc a +tpl a +inc a +tpl a +inc a +inc a +tpl a +tpl a +tpl a +inc a +jmp +22 +tpl a +inc a +tpl a +inc a +inc a +tpl a +inc a +tpl a +inc a +inc a +tpl a +tpl a +inc a +inc a +tpl a +inc a +inc a +tpl a +inc a +inc a +tpl a +jio a, +8 +inc b +jie a, +4 +tpl a +inc a +jmp +2 +hlf a +jmp -7 diff --git a/src/main/resources/2015/day24.txt b/src/main/resources/2015/day24.txt new file mode 100644 index 00000000..502fad75 --- /dev/null +++ b/src/main/resources/2015/day24.txt @@ -0,0 +1,29 @@ +1 +2 +3 +5 +7 +13 +17 +19 +23 +29 +31 +37 +41 +43 +53 +59 +61 +67 +71 +73 +79 +83 +89 +97 +101 +103 +107 +109 +113 diff --git a/src/main/resources/2015/day25.txt b/src/main/resources/2015/day25.txt new file mode 100644 index 00000000..c5c38e68 --- /dev/null +++ b/src/main/resources/2015/day25.txt @@ -0,0 +1 @@ +To continue, please consult the code grid in the manual. Enter the code at row 2947, column 3029. diff --git a/src/main/resources/2015/day3.txt b/src/main/resources/2015/day3.txt new file mode 100644 index 00000000..a5954e78 --- /dev/null +++ b/src/main/resources/2015/day3.txt @@ -0,0 +1 @@ +v>vvv>v<<<^^^^^<<^^>v^>^>^>^>^>^<<^><<<^vvvv>^>^><^v^><^<>^^>^vvv^>^>^^<>><>^>vvv>>^vv>^<><>^^>^>><<^><><>^<^>>vvv>v>>>v<<^<><^v>^^v^^^<^v^^>>><^>^>v<>^<>>^>^^v^>>><>v^v<>>^>^<>v^>^<>^v^^^v^^>>vv<<^^><^^>^^<^>>^^^^^v^vv<>>v^v<^v^^<><^<^vv^><>><><>v>vvv^vv^^<<><<<^v^>vvv^<^>vvvv^>^>>^v^v>vv^<>><^^^>^>>v>^>v^<>v><^<^^^vv<^^<>v^v^vv<>>>>v^v<>><^^v>vv^^>v^v>v>v>>vv>^^>^v><<^<vv^^^v>v^^^>><^^>v>^^v>>v^^^<^^v>^v>><^<^<>>v<<^^vv>^^^v<^<^^vv^>>v^>><<<>^vv^<^<>v^^<<^><>>^^^<^vv<^^^>><^^v>^^v^^^^<^v<^<<<<^v^<^^<>^^>^><<>>^v><>><^<^^^>>vv>^>^^^^^v^vvv><><^<^>v>v^v^>^><><^<^><>v<><>^v^^v>^<<<>^v^>^<v^<>>^vv>v>>>^<^>>>>>v>>^v>v><>>vvv<^^><<^>^>v<^vvvv<^^^v^^^>v^v<>v<^^v>>><>v>v>>^^<^^v><<<<<^vv<^<>^>>>^v>^v>vv>^v<>v>v<^>>v>>^>^><^^v<><><^^>^^^^>vv^v^v>^v^^v^^v>><^v>>vv<>vvvv<>>^v^>^>>v^v^<<>>^v<^^vv^><>v>^>v><<<<<<<^>^^v^<<^^>>vvv^<><>><>^^v<<^^v<^^>v^>>>v^v>v^><>v<<>v>^^v><<<<><^v^v>>^<>^<<>^>v<<>><^<<<<^v>^<^v>v>vv^>v<^<<>v^v>><v>v>>v^vvv^^>>>v^<^<<^^<<<>v^<v<^^<>^>v>>v<>^>^^>>^v<<>v^^^>>>^vv<^v^>v>^><>v^^<>^^v^^vv^<^>^<<>><<^>^v>>><<<<><<^v>v^<^><^<>>v^>^^^<>>v<>>^>>v^><<>vvv><^>>v><>v>>^>v><<><<>^<>^^^vv>v^^>>^>^<^vv^>v^>^><^<^><><v<^^v^^<<<<^><^^<^><>>^v<<^<<^vv>v>>v<^<^vv>>v^v<>^>v<>^v<<>^^v>>>v^>^v^v>^^^v><^>vvv^<<<>v<>v>^>vv^<^^v^><^^^^^v<^>>vv^v^>^^<>>><^v^<v>^v>^^v<>>vv>>^v>>^<<<<^><<<><^^>>v<>^vvvv>v^^^>^^^>^<^^vv<^v^v<v^^<>^>^<^v>vvv><<^><><^^v<<><^^><>^v>^<><<^<^^<<>vv<>^^<<^>><<<>>vvv>^>v^^v^><<^>v>^>^<^<<>v<^>vv^v^v<>vv<vv<^>v^<>^vv^v^>>>v^v><^<><<>vv^>vvv^>v>>><^^vvv<^<^>>^^>^^vv>>><^v<>^v^<<>v^^^^>>^<^>^v<^^^^v>^>>v>^>^>>>v^<<^>^<<^^<>v<^v<^<>v^v>^^v^vv>vvv>v^<^>>vvvv<>>^^<>v^<><>v<^<>v<>^>v<>vv>v<^^>v>><>>^<^^<>>^>^>vvv^v>>^>^>v><><<>v<>^v<^vv^^^<>^^<<^^^v<>>v^>vvvv>^^v^>^>^<<><^^^^<<>^<>vv^<><^>^^<>v^<>>>v><>vvvvv>v>v^^>^<vv>>v<<^<>^^^v^<><>>^<<>>><>v>^>^^^^vv^^<<><^^<v>vv<<<^<v<>>^<^>^>>v>><^^<>><<<><<><^<^v<^^v<<>><<<<^>v^>v^v^<<>>v<><^<>><>>^><>v^v>v<<>v<>v^^><<>>>v<<>>>>^>v>>>>vv>v>^<^^^<>v^<^^v^vvv^>vv>^^<<>vvv<<^^<^>^>>v>v<<<<<>^^vv^>>v>^<^^v>>v>^v<><>^<^>v>v<<<^^^v>^<<<>vvv^v^^>^>>^>v>v<>^^><>>v>^>v<<<^^^v^><><^<^<>>^v>vv<^v<<^vv>v^<v>v>^v^>^v<<^v^vv>v^<<>>v<>>vvv^^vv^^v><^>v^vv<^^<<>v<><^><>^<><vv<>^vv>v><^^v<>><^v^v><><>>vv<>>>><<^>>><^^^vvv<<><>>>v<<<<<>v^^<<^vv^>vv>^<>^v^^<>^^^vv>v^^v>^v>^<>v^^^>v^^v<^>v^v^<>v>v>v<^^vv^v<^^^^vv<<><<^>>^^<v^>>^^^><^^>^v^v>^<^>>^v<>^<^>v>^>^v^<^^^<^vv<^^>>v^>^v^>>>>^v>^^<<^<^^v^<<<>>><>^<>>>v<<><<^^<^^>v^>^>v^v<><^^v>^<^v^v>>>^^<^^vv<<^><><^<>v>>>vv>><^^^v^^^v<^^v>v<>>^^<><>v>^^>>>><>v>^v>^vv^v>^>^^^><>^<<>>><<<><>^^<<v^>v>v^^^>^>^v<<>v>vv>><<^^^>>^><^>v<^<^v>><^^>v<><>^><<><>v^>v<><^^>><>^<^^v<^<><<<^^<><>>>^>v^<><^<<^vv<^v^v^v<>v^^v>v^<^>^vv^>>><<>v^vv^<>^v^><v^<><>>v^v^><>v^vvv^^^<<^<>v^v>^^><>v>>v^<>^>v>^>><<>v^v><^v>v>>><^<^^>vv<^>^<^>^^v><><^<<^^vvv^v>^>^<>>vv>v^^v^^vv<^^>><^v>v^<vvv<>>^v><<>^v<<<>^><^vv><<^^v<^vv<>^v>>>><<<<^^<^v>^<^^<^<^^>>^^v>^^^^v^^^<<>^^vv<><^<<><>^>v<>>v^^^>^v^^v^v>>>>>^v>^>^^v>><^^^v<<^^>^<^<^><^<<>v>v>^v<><^>vv^vv><^><>^><<^^>v>v>^^^<>v>^v^^>vv^vv<^^>><>^>^<>v>><>^v<v>^><^^^v^<<^v^>v^>vv>v^<>v><^v>v<>^v<>^v>^^<>vvv^>^<><^>><^<>^v<<^v^><<^<^v>^vv^v>v<^^vv<><>vv^>v<<>v>v>^^>>><<<^>^vv>>^^^>v<^vv<>v<<>>>^<^^^^>v<^^<>v>vvv^>v>v<^>^v^<>v>>vvv>^^><^vvv>><>>>^<<^>>v^^>>^><>v<^^v^<<>^<>>><^v^v>>>^vvvv^<><<>v>^v^v>v><^<<^>^^>v<^v^<^>v>^<v^<>v^<>vv^<>^>^>v^>^vv<>^^<<>>v<>^v<><><<v>v^>vv^><<<^v<><>^^v^^v^^^>^<>>>>^><>>v>>v<<>v<<<<<<<^v<<^^^v<^v<>v^^<<<^<>>v^vv^<^^<^^<<^>vv><^<^^v<<<^><^v<^><>v^v^^>>><<^<<^<>>^>>^<<<>>v>^v>><>v>>v>><>v>><^^>^^vv<^^<^>vv><<^>><<>^vvv><^v^>vvv^>>^<><^>^<<>>v^v>v<<>^>>^>v<^^<^<<>^^v^^v>v<>^<^^<v^^vvv^^v>^vv^<>v<^v^>^vv<v^<<^>^><^^<^^<^>vv^<>^<>^>^^<^v><<<^>vv^vv>v^v<>^^v^<^^^vvv^>v^<><>v>vv<^v^>>^v<^^vv>vv>^>><<<<>^><>>v<>>v>^v<^vv>^^>^<^<>v^v<^^v<^^>^^<>^^^^>^vv<^>><^>vv^>v^>^vv>^>v^^<>>^v<>>v<^>^v>vv^>^>>>vvv>vv>^><^v<<<>^^v>v^v<^^^v^^>^><<^^>^><^^^^^^^<^v<^>>vv>>^v^vv<>><>^>>>^^^^^><^<<^v<>vv^>>v<^vv<^v<>v<>^v^<<>>>>v^^>^vv<<><<>v^v<^<^>>^^><^>^><<><^<><>vv>>>>^><<^^^<^v^>^>^^>^<^><^^<^^<>><>><<<>^>^^v<>^<<>vv>^>>^>^<>>vv<^^vv<>v<>^^>^v^v^v>^^^v<<<^vv^><>^>^^vv>v^<<^><>>vv^^^^^>v>>v<<<>^<><^v<^v<^>^<>^vvv>^>v><<v>vv^<^^>v^v>^<^v^<^v<<^>^<><>^^<>>^^<^v^<^<<^>v^^>v^v^^^<^v<<^v>^>>^^^^^><<>v^><>v^^<^v<^<v^^^><^^^><<<<<>^<<^<>>v<^>><^^^<>>>>vvv>v<>>>v^v^v<^<<^>^<<>v>>^>^^><^><<^v^^<^<>v^v>vv<>>>>>>v<<>>^^>v<<<>^<<^><<^v>vv>>>><><>v^<^v><^>v>>^^^v<^>>^>>v<<^<<>vvv>>^v<>>^v><<<^v^v<>^vvv^^^<>vvv^^^>>v>^>^<><<>vv>^v^>>^<v><><<>^^><>^<<>^v<<>>v^vv<<>^^v^v^v><^>v>v<^<<^<^>vv>^v<<^>^>>v^<v^^v^^>><<<>^v>><>v<>><^v>^^v<<<<^v^vv<<<<><><^<^<^v><<^^v^<<<<<^^><^^>vvv<^><>vvv^v^>^>^^^v<<^<^^>vv^vv^><^v^<<>v<^^>^vv<<>^<<><^>v^<<^<>v><><>v<<^^><^^^v>>v>^vv>^v^^<><<<<<^>^v^<^<^^>^vv<^>v^^v^<>v<>v^v>vvv><><<><>vv^^>^^^<><^>^^^>vvv><>v<>>v^>v^^vv^>v>>>><^^>^v^v>>vv<^>><<<^>><^<^>^<^>^>>v^<^<>^<^^<>^<>>><^<^<^<<^><^^>vv<>^^>v^>>v>>>v<<^vv^<><>>>^^<^v^>>^>>><<^<>^>>^v>>><^^^<<^vv><><<>^^^<>^^^>><>>>^>vv>^<^<>>^<^^>v^>vv><><>>><><<^^v<<^vvv<><><<^v>^v<>^<^^^v^>^<^><^v>v>^v<>><^^v^^^^^<>>vvvv>>>>^<<><^v>vv>>^^><<><><^^^<^<^<<^v>^^^>>>>><v^^^<>>vv^^^v<><^>v>><<><>v<^><<>>><>v>^<>>^>v^v<<<<>^vv<<>>>>>vv<><>^<^v>vv^<>><<>^<>><^>>>><<>^^>><<<^^^^^v>>^<<>>vvvv<^v^vvv<<<^><>>>>vv^<^v>v<^<>^v>>^<^^v^>>><>^^<^v>>v<<>vvvv>^><>v^<>^<<^vv<^>>^v^>^^<<<^>>^^>^<^^<^<<v^^v^^<^v<^>>><<>vv<<^><^>vv<^>>^vv>>>^>>><^<<<>>^<<>><^<<^^^>>v^^>v<<<>v>v>v^<>>>^vvv><<^^<<><^v>>>>vv^^v^v<>v>v<<<<><<>vv<><^^^<>>v>>>>^^<><^<^v^>>^^v>^<v>^^>^v^<>>v^^<^v^^<<>^^>v^^>><<<<^<^^v>^^v>v<^>v^<>vv>>^^v>v^^>vvvvv<<>vv>vvvvvv>>v>>^^^vv^^><>v^^^^v>vv>v<^v>>>>^>^>^v>^>>><<>>^vv>>>><><<^<^><^vv^v>>>>>v>^>^^v^>v<^v^<^<v<>>^vv<<>^v^v>><><<>>v^^<<>^^<>v<<^^<^^>^^>^<^><>>v<>>^^<^>><<>>^v^>v>v<<^^<<^>v>v^^v^^<<>^v>v>v<^^>^v<><^<<v<^<<<<^^>v^v^^><<><^^^v^^>>>vvv><>vv<>>^^v^v<<^>v^^v^>vv>^<^^<^v^^<^^v<<>>vv<^>>^><><>v>>v<>^<<>>> \ No newline at end of file diff --git a/src/main/resources/2015/day4.txt b/src/main/resources/2015/day4.txt new file mode 100644 index 00000000..d75e0dcd --- /dev/null +++ b/src/main/resources/2015/day4.txt @@ -0,0 +1 @@ +yzbqklnj diff --git a/src/main/resources/2015/day5.txt b/src/main/resources/2015/day5.txt new file mode 100644 index 00000000..56421004 --- /dev/null +++ b/src/main/resources/2015/day5.txt @@ -0,0 +1,1000 @@ +rthkunfaakmwmush +qxlnvjguikqcyfzt +sleaoasjspnjctqt +lactpmehuhmzwfjl +bvggvrdgjcspkkyj +nwaceixfiasuzyoz +hsapdhrxlqoiumqw +lsitcmhlehasgejo +hksifrqlsiqkzyex +dfwuxtexmnvjyxqc +iawwfwylyrcbxwak +mamtkmvvaeeifnve +qiqtuihvsaeebjkd +skerkykytazvbupg +kgnxaylpgbdzedoo +plzkdktirhmumcuf +pexcckdvsrahvbop +jpocepxixeqjpigq +vnsvxizubavwrhtc +lqveclebkwnajppk +ikbzllevuwxscogb +xvfmkozbxzfuezjt +ukeazxczeejwoxli +tvtnlwcmhuezwney +hoamfvwwcarfuqro +wkvnmvqllphnsbnf +kiggbamoppmfhmlf +ughbudqakuskbiik +avccmveveqwhnjdx +llhqxueawluwmygt +mgkgxnkunzbvakiz +fwjbwmfxhkzmwtsq +kzmtudrtznhutukg +gtvnosbfetqiftmf +aoifrnnzufvhcwuy +cldmefgeuwlbxpof +xdqfinwotmffynqz +pajfvqhtlbhmyxai +jkacnevnrxpgxqal +esxqayxzvortsqgz +glfoarwvkzgybqlz +xdjcnevwhdfsnmma +jyjktscromovdchb +pvguwmhdvfxvapmz +iheglsjvxmkzgdbu +lwjioxdbyhqnwekv +zcoguugygkwizryj +ogvnripxxfeqpxdh +hkvajhsbfnzsygbm +cnjqeykecopwabpq +wojjtbcjinoiuhsj +kpwpvgxbyzczdzjq +wrvhylisemlewgzk +uiezkmnhilfzahtm +mucteynnuxpxzmvt +zaiwbgxefusfhmst +apptbogpxivjwink +qryboarjtwjhjgjb +irehxupgyseaahzd +fobstqxguyubggoh +ysriumfghtxtfxwe +auchdmasvfeliptw +mztuhefcrnknyrdl +tyjmkhihbwabjtaa +yquzkdtgsljkaebw +almvdvofjtkyzbmd +emqftiuqqpdwwbrv +hrrhmqfpepvbawvw +atrkgykycvgxbpyb +dhthetnealksbdan +zzqafhgicubptiyo +qdtaieaziwhbttnw +kyskgapdgqrtrefw +edwzlpqztpydmdlr +awszjnlmvlyqsuvl +kcrtmtshtsgixvcp +jtaskgkijivbbkri +mmggfwapsetemiuj +itagrrnjbnmhgppd +uqmbezechbrpbnqq +nnyimvtascflpzsa +knqeimypkdttyudj +vgoiyvtvegwyxjjd +qubzdxsbecktzrho +zehojtvktsbbxijb +xepmjrekwcgoxyoh +bnptxnocbpbqbyeq +sfvynsywscbnymos +dsltfbpcmffbluba +kncrlzlmkikylppa +siwudrvmildgaozv +jhhefbvbvneqzvtc +lqjgztxitbuccqbp +himmwlbhjqednltt +vwognchyertnnfil +eejakhapkbodrntf +qxuijkkhhlskgrba +aankpfxxicfpllog +vuxykvljyqexfhrn +epgygflbxlbwybzq +zuxmwvetmvcszayc +xttwhfqmemgtjnkf +hftwldmivyfunfvl +bejlyxfamzliilrj +zkehazcxyyvtrxti +dsgafehmcfpycvgz +igremmqdojqdvwmb +swnjzvmhcslvkmiw +fchzbfbmtqtxmaef +xwjmyyrlznxrcytq +brwcwzpcvbwdrthl +fvrlridacsiojdmb +mhsturxdlmtxozvy +usxvqyrwywdyvjvz +gwazuslvmarfpnzm +rgkbudaqsnolbcqo +dpxvlbtavdhdedkj +nnqmjzejhodyfgyd +ozoazxkfhujgtzvy +psdgvhzdiwnuaxpl +tznkilxpogbzgijz +wnpytcseirtborhh +lhauurlfsmagfges +oqfbzixnlywkzwwy +yoehapoyjpakziom +vtjftdcsfdzbmtrn +zcshfnodiwixcwqj +wapbxpaxgjvtntkm +qfyypkyvblrtaenh +bsxhbxkovgukhcza +kitdmvpiwzdonoyy +slkbhxmehzavbdsf +dovzjouqkzkcmbkl +qpbigdcqkfnfkxvq +eaiaquhnesvtcdsv +mhbezlhqojdsuryj +dqprkkzxlghkoccx +xqepmorryeivhrhm +frwmrjpezwmjflvf +gjpfgwghodfslwlf +fzyvajisdjbhfthq +pvzxkxdscdbilrdb +mtaxmqcnagmplvnm +rlyafujuuydrqwnc +gvqvrcxwyohufehq +lmrkircgfrfusmfd +ovlpnkxcpimyaspb +xhyjremmqhdqywju +pxfczlhpzbypfarm +utjhprzhtggausyp +utzkkzlnyskjtlqh +cecbcnxpazvkedic +xwvoaggihrbhmijq +krredhmtwlfmyagw +lwfhxgbknhwudkzw +vyczyvuxzmhxmdmn +swcoaosyieqekwxx +waohmlfdftjphpqw +gaclbbfqtiqasijg +ybcyaxhluxmiiagp +xgtxadsytgaznndw +wzqhtjqpaihyxksm +fdwltsowtcsmsyhm +rpoelfbsararhfja +tswgdacgnlhzwcvz +xjgbhdlxllgeigor +ksgthvrewhesuvke +whgooqirdjwsfhgi +toztqrxzavxmjewp +hbkayxxahipxnrtl +lazimkmdnhrtflcu +ndoudnupbotwqgmr +niwuwyhnudxmnnlk +hlmihzlrpnrtwekr +wzkttdudlgbvhqnc +rfyzzgytifkqlxjx +skddrtwxcyvhmjtb +mljspkvjxbuyhari +xwkhozaoancnwaud +nookruxkdffeymdz +oiqfvpxmcplyfgoa +qoxggshmrjlzarex +lsroezewzkrwdchx +nkoonmvdydgzspcl +lygxeqztdqklabov +jempjyzupwboieye +hpdaqkhjiddzybly +cvcizjlnzdjfjlbh +vaaddsbkcgdjhbkj +pjxmtxoyrkmpnenf +ujqdvyqnkbusxlps +miyvzkzqploqaceb +gapcsbkulicvlnmo +xqpcyriqhjhaeqlj +ipumdjwlldzqhmgh +swdstecnzttmehxe +ucmqordmzgioclle +aywgqhmqlrzcxmqx +ptkgyitqanvjocjn +wcesxtmzbzqedgfl +rnetcouciqdesloe +chpnkwfdjikqxwms +onpyrjowcuzdtzfg +tydnqwaqwkskcycz +dhamguhmkjzzeduy +oecllwyrlvsyeeuf +gsukajpoewxhqzft +sgdnffdixtxidkih +pqqzjxzydcvwwkmw +wnjltltufkgnrtgm +hylaicyfrqwolnaq +ovfnugjjwyfjunkm +xknyzsebmqodvhcl +uwfmrjzjvvzoaraw +zaldjvlcnqbessds +zphvjuctrsksouvz +ceqbneqjwyshgyge +wmelhaoylbyxcson +nghuescieaujhgkj +dhjmflwwnskrdpph +exvanqpoofjgiubf +aidkmnongrzjhsvn +mdbtkyjzpthewycc +izctbwnzorqwcqwz +hrvludvulaopcbrv +mrsjyjmjmbxyqbnz +sjdqrffsybmijezd +geozfiuqmentvlci +duzieldieeomrmcg +ehkbsecgugsulotm +cymnfvxkxeatztuq +bacrjsgrnbtmtmdl +kbarcowlijtzvhfb +uwietqeuupewbjav +ypenynjeuhpshdxw +fwwqvpgzquczqgso +wjegagwkzhmxqmdi +vocvrudgxdljwhcz +nnytqwspstuwiqep +axapfrlcanzgkpjs +lklrjiszochmmepj +gxadfpwiovjzsnpi +qidsjxzgwoqdrfie +wgszciclvsdxxoej +kwewlmzxruoojlaq +ywhahockhioribnz +ucbqdveieawzucef +mdyyzmfoaxmzddfv +hsxnabxyqfzceijv +vivruyvbrtaqeebr +jxfeweptjtgvmcjc +mmypqxmpurhculwd +mpiaphksvctnryli +xqzqnuxmuzylkkun +fndmtefjxxcygtji +dnorqlldvzqprird +nutokyajmjpwjaqu +vlupfperqyqkjcaj +dgihjeokrphkpdnk +nvbdyrlheqzixuku +mhrkntnxvsmvrpka +kvhkyanlhhymwljf +fhipumtegqfgeqqw +vpfjgveycdefuabu +kzincljffncylcsf +tsezxymwmjtyegqw +wxhcdrqedkdcwxli +ueihvxviirnooomi +kfelyctfvwyovlyh +horzapuapgtvzizz +iiqkdpmfvhwwzmtj +rsaclclupiicstff +quwkkhrafypkaoum +gyrgkgmwqfkeudfe +noydhbqacwptyfmy +efwwuipzgtkwffhf +suyojcitomdxsduh +lbcxnsykojkufkml +zpglsvoutvzkgdep +usgrufyvgsbsmbpr +katrrwuhwvunjqor +btngwrpcxoyfbgbc +bxjscjdiowjrkpns +nwxvnfrnlkgqxvhf +ikhyqkvljucgdlag +xibnxsjopmxvflkl +mzplumcfivqcjqnz +jqflcxoxzlbwlxry +fcscvmfepdxrshxe +wlpffwunffklzbuc +emvrlqajjgwzfmle +rhaheurtzrfoqkyq +ifuuhpxmadaysfsx +ncyfvleyzqntpcoo +zeogmyaqccmtvokd +jqppbzebppdnpurn +xixarswxsiwjzgni +ezruwzajsoombphs +hmiqfeizyprielxf +jnaoxljnftymsfey +extgzrxzovlsixnf +yhyfmovvlrwoezsv +ffnybaolppuzpjym +pqowimdiusccaagn +jgceiosiihpjsmnu +hkoexeaopebktngx +njhzuvsygymejqav +yjkgcclgtvushcfk +gmbjxhnkkxlihups +pdlwysadiebsidjz +omrwmgzulfoaqros +ofvvgdezwvcffdcy +otytpuklhxcpxhgd +eyfaosxdauumvlux +mvdthjfstrlqlyuo +mdgdchgnlxaxspdm +bakjezmhbwqxzevd +msakswaphdwaodhg +vjcqscgdbnsxdllh +jjywaovewbuzreoj +nqvplhwacylifvwk +lpwmpixbxysmsign +flcvbpxrchcpbgcb +qjpkeuenenwawlok +bnqkflfmdmntctya +fzsgzpoqixvpsneq +icwfdisutoilejld +relchofohnkwbumi +aljalgdaqwhzhfwr +cahkvnwnbwhodpqs +dnrzeunxiattlvdm +nsmkhlrpwlunppjs +mqqsexlwfqnogwub +tfavelkqrtndpait +ooguafrnmprfxcnz +ntynkiordzxtwrqa +rkkyzlxekqqlkvym +ofxcivdnwcmgfnme +ywotqwbrqxlrnobh +nrbbiypwhrqihvev +flqsjixxtydheufs +lcfrfzypstrqctja +hyzbuzawuzjrynny +exfbywcnstebnvmq +vydzwnbmcihvqrnj +qmwqaaylinzrdmiw +lpxpztpvfggspeun +lhxmqqbracsuyrfm +zgkwsrabaseidbrw +yjlmbhbqsqgszsun +mqfzqtbxtuteabtd +izomzdmcqmfrevwd +iqijrlqurdwrkoln +fxhqzpgoxxjkkhql +oulwontmgrjeopnk +edaigfydjexvzzvj +vjhybiklxpxjqpwc +ypxfbfnpbmqmwtte +xzvcsgasztrxdzud +rpulqmobptfarboo +palacmdijxzzykrf +jmllwukplufohiby +dnswayomusiekfmy +sxbrjqtqgzzwhcfo +lylvndsgbnbqiejm +jaxxhoulxnxnaenr +nblissutfazbcpwn +zmlsjszzldvbiacr +kewojtlchfkclqwk +eqvfjasddggvfame +yibzqlvxtraxpdon +dgnbxsbmdrtyvaac +uoxrcxfimhgtxqhy +xfdxalrwcwudlviq +xmtbdklqptoswpwl +zezyopzdztdjerfl +xuzluhjsqvhytgbc +qdjtmeckispmgzki +phakupesplzmmmvc +gpuoqfffumzszybn +bhywxqkrrlwuebbw +ibvwgoyvelzenkzl +ncohvvbmiekbaksa +fzuvqzvxvdbeirrp +lshtzniokucwojjd +punrduvlnrulkium +gnfpikidnfobrrme +vxkvweekmnvkzgyl +rhydssudkcjlqgxn +cjtqvlaahohcgumo +jwzmfyinsfwecgcb +blpeseqhlzfilpuf +jvtpjkyokzcvagon +qjomincbcobjczpe +ugsyzkzgdhxtmsfz +hleaqgwzqjwajcra +coumfghptpnxvvov +hqpnbupnzwpdvgqd +cpouyodqxgviasem +lljvxeyozckifhfd +huqtnvutdyfgwtwa +yenlveuynmlmmymu +ojdyufkomxiwjmbf +spjzgvcwvzgffjkk +vxykmjhyvmhyssbp +tazdeqggfcjfvwwn +uumwcngwcytvpufx +avovuzkrevloneop +owczrtbnrvjfemkt +hzpugcanaxyvaokj +iishlodnxvjtgzyn +qosdonclrnxirham +eonqlnwevahydddg +ryqmnuikftlxuoqy +whqepbcwabzbthha +vekisvnwhgpyemxr +lrwxzoamnvpnlhap +ywepvqthnorfswjv +evqwvsoazmwyypjy +bgwoojddubppmjxf +jypkfrthzgtyeddi +tynabbhfjzkrqsju +adxstbfqheuqbcuk +gqwqiocdyqoiblrx +ybuddlyuskdlegxv +luwynbsmpgyeqsbr +ltyqgqoyljibqndo +jaedpajzphfybajh +epglnrxofptsqvmy +zjdpxkngfkstxbxh +ekegphcwanoickfu +cqvhuucvejqirvfs +uqudnnqumsqcgefo +qnzunermlnpcfflo +ovyxaniqaawzfuxx +djekxcezjowdhopq +bwtwbmdehrhpjnlk +nilsnlacerweikfa +hyrigsrmsrzcyaus +gvmdmgddduylmxic +ewzovdblhmjgjwsk +ojjfsknlonzguzlq +yjgfruvpjvlvrvvq +cyoryodwyhzwprbv +crsjclrurcquqgut +sjhfhobwtojxcmem +ibxfjudilmdeksea +uqbhdbjoeupyhbcz +uqbxigzxuxgmjgnw +jashafmtzrhswirg +dexiolovaucyooka +czjbwwnlwcoqnoiu +ojigosazigfhttjc +zfiqtgrqbmftknzn +dlzbmvmolssbqlzl +sgmchcurrutdtsmw +scdwjqsdohcdrwry +cgtdvecqwplpprxn +iiplenflfczaktwi +wmgnwfxfcjhyeiqg +giihshowtcatecvl +nqhzfincclumvkaz +kxstpzgdfvepionc +agbhxcijxjxerxyi +hmgfqevgdyvisyvs +tthakmvpowpvhtao +ottalcghygpaafbo +aplvozayycremgqg +dbjxlnaouxqtdpfz +peeyallzjsdvpalc +ndtdjyboixuyhfox +llabnbcobexfoldn +cweuvfnfyumbjvxr +ewkhhepaosalnvkk +pivyiwsiqpwhagyx +auzsnwdcerfttawt +grbfrekupciuzkrt +byfwzadtzrbndluf +lluypxjeljzquptk +pskwsnhqanemtfou +sxvrtqqjdjkfhhrm +ulsmqgmshvijyeqh +qigofesfhekoftkf +zhatniakqtqcxyqa +uuczvylgnxkenqee +mlitvtuxknihmisc +srrtrxdvcokpyfmz +osispuucklxcfkeb +vqhazlaulmnpipql +umkiueljberqhdig +knvpbkbvgoqzwprp +nbsocqikhuvsbloj +wjnpepjkzkednqbm +agbhmytsofuyqcor +gvogzhkkpxyfecko +ardafguxifeipxcn +yiajcskbgykyzzkw +sejunbydztyibnpq +dqrgfggwcnxeiygy +xnqqwilzfbhcweel +jjtifhlvmyfxajqi +gwszrpgpmbpiwhek +kydzftzgcidiohfd +efprvslgkhboujic +kecjdfwqimkzuynx +rildnxnexlvrvxts +dlnhjbqjrzpfgjlk +qluoxmzyhkbyvhub +crydevvrjfmsypbi +dosaftwumofnjvix +pwsqxrfwigeffvef +nzyfmnpwqyygjvfx +iccbckrkxlwjsjat +bmputypderxzrwab +bhuakynbwnlreixb +qmrzfyqjiwaawvvk +juvtixbkwyludftn +zapmjxmuvhuqlfol +paiwrqjhpjavuivm +tsepfbiqhhkbyriz +jpprewufiogxoygk +mmapyxbsugcsngef +pduhmgnepnpsshnh +aetndoqjvqyjrwut +fnfvlorhwpkkemhz +gedfidpwvoeazztl +beclvhospgtowaue +wsclsvthxustmczm +tjbxhnpniuikijhe +rhetyhvfcemponeg +mavonujurprbeexi +argbrpomztrdyasa +bzvtffbtygjxmkvh +maqyqkhsqgzfzvve +seeirbiynilkhfcr +wxmanwnozfrlxhwr +dieulypsobhuvswb +nxevassztkpnvxtb +jclxuynjsrezvlcy +xlolzyvgmwjsbmyf +tguzoeybelluxwxc +fkchoysvdoaasykz +cyynwbfcqpqapldf +rhifmzpddjykktuy +ndvufsyusbxcsotm +txutnzvdsorrixgg +qjoczhukbliojneu +ufhwujotncovjjsz +kclsgsdwcrxsycbr +yscwmlrdaueniiic +nxhivrovpkgsmugb +fdxqfyvwwvgeuqkv +femtamfylysohmpr +amsyzslvyxsoribh +nhmqxncwsonhgbcz +uomqsvcbpthlmcue +kxtfapcqrnjkkslj +xtieihonlfubeync +adpcjqxgydulchgj +cjynnzsmmujsxxpd +neeapmzweidordog +szoivgqyqwnyjsnk +uwgrtzaqezgphdcu +ptpgttqxocjwxohi +fhltebsizfwzpgpf +emmsazsidspkhgnh +dxcprkbcjeqxqzgn +tpxzqwxbzwigdtlt +afsmksnmzustfqyt +xyehnftstacyfpit +vcrfqumhjcmnurlw +rrznpjzcjgnugoch +gbxnzkwsjmepvgzk +jwobshgwerborffm +zmuvfkhohoznmifs +buyuwgynbtujtura +bevncenmpxfyzwtf +hqqtcrhzfsrcutjh +kbpzshllpiowepgc +alspewedcukgtvso +xvsvzzdcgjuvutrw +pmwulqraatlbuski +abuzsiinbueowpqn +oedruzahyfuchijk +avhcuhqqjuqkesoq +azqgplkzsawkvnhb +rjyoydogkzohhcvx +aezxwucqvqxuqotb +kxobnsjvzvenyhbu +nnjoiilshoavzwly +aijttlxjrqwaewgk +cvsaujkqfoixarsw +zngtoacpxcsplgal +qhkxliqtokvepcdv +aixihrtdmxkfvcqw +owbgdgdymxhhnoum +tajsagmruwzuakkd +ckrfduwmsodeuebj +alfdhuijuwyufnne +xpchlkijwuftgmnm +rwcrvgphistiihlg +xdaksnorrnkihreq +akeschycpnyyuiug +rgputhzsvngfuovz +lerknhznuxzdhvre +mqiqmyladulbkzve +csnmupielbbpyops +kwgrwgmhfzjbwxxz +npwtvbslvlxvtjsd +zxleuskblzjfmxgf +hexvporkmherrtrn +rhtdhcagicfndmbm +qhnzyuswqwoobuzz +dpvanjuofrbueoza +kjcqujmnhkjdmrrf +gholddsspmxtpybg +jihlvyqdyzkshfsi +zuviqmuqqfmtneur +kzexjowatvkohrtx +wgijnfhibsiruvnl +zevkrkmhsxmicijb +khxrcteqourjvoxa +ylpxlkcnenbxxtta +zrfsvctbojjkpvtw +nlzbudxibnmcrxbt +cqnscphbicqmyrex +ywvdohheukipshcw +riwatbvjqstubssf +idlztqqaxzjiyllu +sdpdgzemlqtizgxn +rjtbovqlgcgojyjx +fnfrfwujmjwdrbdr +osnppzzmrpxmdhtj +ljhwngclvydkwyoe +chwqkrkzrvjwarat +jmydkwpibkvmqlgs +zvhfmbxnlxtujpcz +jsnhsphowlqupqwj +fzhkkbpasthopdev +jerntjdsspdstyhf +gctwmaywbyrzwdxz +xemeaiuzlctijykr +xulrqevtbhplmgxc +yfejfizzsycecqpu +gboxrvvxyzcowtzm +lpvhcxtchwvpgaxp +wdiwucbdyxwnjdqf +qgwoqazzjlvnjrwj +prtlnkakjfqcjngn +fagvxsvjpuvqxniz +xacmxveueaakfbsm +ginvtonnfbnugkpz +qpvggsppewfzvwin +reoqnlzruyyfraxa +kolwtqhifjbbuzor +vrkcywvdhdprztww +ngdvyfmvjqhbzbxt +rooxeoilqzqjunmp +efxmdprtogtxgyqs +qrhjuqndgurcmwgu +ouitjprueefafzpl +kirdwcksqrbwbchp +fpumsmogojuywezo +lgjrgykywugzjees +xigioqcpjabpbdas +ewkhuprpqzikmeop +fgrgxsqeducigxvr +bclkursnqkzmjihl +jozidniwvnqhvsbc +oghcilcyozrmmpta +xbgmaungzcpasapi +iqowypfiayzbcvhv +opdehgwdgkocrgkf +zfzvdjeinlegcjba +vhakxvlcayuzukap +xyradgyiebpevnwe +eamhtflgedwyshkn +igteqdgchjeulfth +kwsfkigxzpbgdxod +vapnpsbdboiewpzp +wbuqhjsngxpqshen +vxxilouxuytitwgm +cpnwlkwnkeanqnet +wdmbtqvvlowftvgb +wjtmcecpyqzwpbqg +jnxmoxdhvsphcdeg +wabxfxpotoywwodn +mwbsoxzlqpqobvvh +coktshbyzjkxnwlt +rzhnggpslwzvyqrp +dgzuqbzarbutlkfx +wunajaiiwgijfvjh +uotdbcgmsvbsfqlb +kxdtlgmqbccjqldb +ngmjzjwvwbegehfr +cvpsabqfpyygwncs +wqluvqlhdhskgmzj +rbveperybfntcfxs +fbmoypqdyyvqyknz +zxpgzwnvmuvkbgov +yexcyzhyrpluxfbj +ltqaihhstpzgyiou +munhsdsfkjebdicd +plecvjctydfbanep +kjrxnnlqrpcieuwx +zbcdtcqakhobuscf +kgovoohchranhmsh +llxufffkyvuxcmfx +tgaswqyzqopfvxtw +kojcqjkdpzvbtjtv +xggdlkmkrsygzcfk +vvitpsnjtdqwyzhh +gcqjuwytlhxsecci +vbsghygcsokphnrg +vejqximdopiztjjm +hudqtwmwkviiuslp +vwswfvpcwwpxlyry +gxmfiehdxptweweq +qjmekjdcedfasopf +pqyxdxtryfnihphf +felnavctjjojdlgp +hbimufguekgdxdac +dhxhtnqgfczywxlr +pssottpdjxkejjrh +edieanguabapxyig +sciinanyqblrbzbb +irxpsorkpcpahiqi +qsxecaykkmtfisei +ivfwlvxlbnrzixff +hqxzzfulfxpmivcw +vvbpaepmhmvqykdg +cetgicjasozykgje +wuetifzdarhwmhji +gaozwhpoickokgby +eldnodziomvdfbuv +favpaqktqaqgixtv +twbcobsayaecyxvu +lzyzjihydpfjgqev +wnurwckqgufskuoh +fxogtycnnmcbgvqz +aetositiahrhzidz +dyklsmlyvgcmtswr +ykaxtdkjqevtttbx +kfmnceyxyhiczzjm +nnizopcndipffpko +yjmznhzyfinpmvkb +sljegcvvbnjhhwdd +zmkeadxlwhfahpwg +rwvcogvegcohcrmx +aguqwrfymwbpscau +vlusytjagzvsnbwe +smvzhburcgvqtklh +rfuprvjkhazrcxpv +megqlnoqmymcrclc +gvldhkewtmlwqvqv +awynhvtyziemnjoa +voprnvtnzspfvpeh +dhlguqwmunbbekih +goayirdhnjrfuiqi +eoghydfykxdslohz +chpippjykogxpbxq +hqbycjweqczwjwgf +pvefsrvwumrlvhmt +eghwdovaynmctktk +crwkxoucibumzawc +bzbtahvhkdigvvtj +bnbptgihhfubxhho +ddqmbwyfmfnjjaro +gvtswqyzazihctif +vmqctjpgadxztqqb +dgnndowtpeooaqqf +sxdvctfdtalufxty +ylgeexosibsmmckw +sxplpyskbpqnojvw +coarhxtsvrontyeg +fyoaurggjupvzvlv +jlyrkqsiwuggvjem +uwbsjoxonreuucyi +gihuqvwxovbgokes +dxzaaxupbcgnxcwf +gidrgmvyrlqqslve +csflmlvqmonoywpx +jkxkpixlythlacnk +ejkarcdkdslldugv +dbzmsusevohhjkmr +cbrqzualjpdtworc +kpgidqlmcbpfmmwu +zwghjuofexfowqam +ncdlxmcrsmsocetz +kfprzqacefifjkbd +swwzivrxulkhvldc +wgqejhigbjwunscp +rsstnwcyybfauqxu +qhngfxyhdqopyfgk +zrndpyyejsmqsiaj +xxknxwpvafxiwwjc +mmaahwgoiwbxloem +tabacndyodmpuovp +yriwomauudscvdce +duvyscvfidmtcugl +mgipxnqlfpjdilge +imeeqcdetjuhfjnw +dvkutrdofpulqkyh +jefvtlktxegpmbya +iyzudqgpvlzjfydh +giohapxnpaqayryd +qheqdprmnqlpztls +rdxhijmzegxkotoq +hdnmaspumdwnrcdz +wafpbgehbuzdgsnc +tbtrfztsferdmhsy +vusndcyjngtkrtmk +ilqblestzxebcifh +urfgjbjgzlrfsdlv +aptcdvpsqwleqttn +bigczjvzokvfofiw +zjnjeufonyqgkbpx +trcdebioegfqrrdi +jrdvdriujlmbqewt +jqrcmuxpwurdhaue +yjlermsgruublkly +zwarvgszuqeesuwq +xthhhqzwvqiyctvs +mzwwaxnbdxhajyyv +nclsozlqrjvqifyi +gcnyqmhezcqvksqw +deuakiskeuwdfxwp +tclkbhqqcydlgrrl +qbpndlfjayowkcrx +apjhkutpoiegnxfx +oaupiimsplsvcsie +sdmxrufyhztxzgmt +ukfoinnlbqrgzdeh +azosvwtcipqzckns +mydyeqsimocdikzn +itfmfjrclmglcrkc +swknpgysfscdrnop +shyyuvvldmqheuiv +tljrjohwhhekyhle +dayinwzuvzimvzjw +qgylixuuervyylur +klqqaiemurawmaaz +hdmzgtxxjabplxvf +xiivzelzdjjtkhnj +ktgplkzblgxwrnvo +gvbpyofzodnknytd +lqhlmnmhakqeffqw +ltzdbngrcxwuxecy +obxnfjeebvovjcjz +zexpwallpocrxpvp +tjpkkmcqbbkxaiak +qiedfixxgvciblih +qcxkhghosuslbyih +gnsfidwhzaxjufgm +xrghwgvyjakkzidw +tftftwedtecglavz +wquqczzkzqrlfngr +twibtkijpvzbsfro +bmplypdsvzuhrjxp +zanrfmestvqpwbuh +zonrhfqowyimcukm +kpvajjfmqpbhrjma +kujzluicngigjbtp +iusguantsrwxdjal +kwxeuylcnszswahw +visdhnkobxnemldu +rogeadmmaicwtabl +pxqycifbgevqudvs +osaiozyvlyddylqr +vffjxrolrpuxcatx +jbmsetccdrywssjd +qgxyhjfpbfifmvgc +npejgalglldxjdhs +mbbtqgmttastrlck +whapaqwdtpkropek +dulbdboxazfyjgkg +xaymnudlozbykgow +lebvqmxeaymkkfoy +bmicnfuubkregouj +dieatyxxxlvhneoj +yglaapcsnsbuvrva +bbpjaslqpzqcwkpk +xehuznbayagrbhnd +ikqmeovaurmqfuvr +ylyokwuzxltvxmgv +hqtfinrkllhqtoiz +pjmhtigznoaejifx +fqdbmowkjtmvvrmx +uvqtqfoulvzozfxv +rpajajukuxtchrjd +sznucejifktvxdre +ufvibsmoushmjbne +xirdqoshngthfvax +iafpkddchsgdqmzl +vmualmlduipvykzh +fnmuahmblwyceejb +ilsaapnswfoymiov +lenvylifraahaclv +cukqxlipuyxedqfh +zgwecslpniqvtvuz +cdcdfpsxuyrhsmag +dszjinhantnxgqra +ioimwotsgnjeacgt +dqcymnvjystbynhp +yibaudyfefbfgunx +cabslcvunjavqkbf +goymzvmgkvlsmugf +zxteiitpthzskjjx +agnxcnaqhjhlurzs +cvmgyxhhnykuxbmb +cgqmjexydmvgwxpp +sygjajofieojiuna +clpvxbrbjvqfbzvu +cbntswqynsdqnhyv +bztpbtwbefiotkfa +pnxccbgajvhyeybu +asyzrvgzumtuissa +facjyblvcqqginxa +rvwnucnbsvberxuv +ghrbeykzrxclasie +ekujtselepgjtaql +krtrzsmduhsifyiw +ticjswvsnyrwhpnt +clmjhsftkfjzwyke +lbxlcixxcztddlam +xhfeekmxgbloguri +azxqwlucwhahtvep +kitdjrwmockhksow +keznwwcusgbtvfrs +ljvzxoywcofgwajj +vebjnhnkcfzbhrcw +eqfcxkavstxcuels +ldattkyawjrvcido +bsqqeilshcwtqyil +foqqsxahfiozcqrw +liswfmuhzfbyzjhf +sulbdcyzmolapfbs +zuggzkelwxjpsgxb +betioxrgtnhpivcw +xmtbixstdipibhgs +ttvurgqmulryyaji +viobnljznzppfmxw +qlzabfopydtxrlet +tusvydegfxhaxolk +thoufvvfjferxhwp +cfyyzppfarjiilbs +jwmhxtgafkkgseqs +pqwuuaxbeklodwpt +vndyveahdiwgkjyx +ssrjgasfhdouwyoh +thbavfcisgvvyekf +yjdvxmubvqadgypa +tlbmcxaelkouhsvu +bonohfnlboxiezzr +rktlxcbkhewyvcjl +rsmoutcbcssodvsc +qszdratuxcrhsvoh +eypyfahpuzqwzwhi +yhkrleqmqlmwdnio +vpnvxusvmngsobmq +hkzyhopvxrsimzys +dblriiwnrvnhxykl +xkriqxkrprjwpncs +rcymltrbszhyhqti +mzbvneplsnpiztzn +vkqtnptgbqefvfoc +nwdtfiaozkcjtlax +crximadpvdaccrsm +lrbajafxwwnxvbei +rbexzesrytpwwmjf +stxwjarildpnzfpg +btamaihdivrhhrrv +acqbucebpaulpotl +dkjhzghxxtxgdpvm +rsbzwsnvlpqzyjir +mizypbwvpgqoiams +nvrslorjpqaasudn +wvexcpzmconqkbvk +rfwfumhjwzrvdzam +eaghdaqorkhdsmth +gtuntmpqaivosewh +nzlsmdgjrigghrmy +dhuvxwobpzbuwjgk +kkcuvbezftvkhebf +aeediumxyljbuyqu +rfkpqeekjezejtjc +wkzasuyckmgwddwy +eixpkpdhsjmynxhi +elrlnndorggmmhmx +ayxwhkxahljoxggy +mtzvvwmwexkberaw +evpktriyydxvdhpx +otznecuqsfagruls +vrdykpyebzyblnut +cnriedolerlhbqjy +uajaprnrrkvggqgx +xdlxuguloojvskjq +mfifrjamczjncuym +otmgvsykuuxrluky +oiuroieurpyejuvm diff --git a/src/main/resources/2015/day6.txt b/src/main/resources/2015/day6.txt new file mode 100644 index 00000000..df10465d --- /dev/null +++ b/src/main/resources/2015/day6.txt @@ -0,0 +1,300 @@ +turn on 489,959 through 759,964 +turn off 820,516 through 871,914 +turn off 427,423 through 929,502 +turn on 774,14 through 977,877 +turn on 410,146 through 864,337 +turn on 931,331 through 939,812 +turn off 756,53 through 923,339 +turn off 313,787 through 545,979 +turn off 12,823 through 102,934 +toggle 756,965 through 812,992 +turn off 743,684 through 789,958 +toggle 120,314 through 745,489 +toggle 692,845 through 866,994 +turn off 587,176 through 850,273 +turn off 674,321 through 793,388 +toggle 749,672 through 973,965 +turn on 943,30 through 990,907 +turn on 296,50 through 729,664 +turn on 212,957 through 490,987 +toggle 171,31 through 688,88 +turn off 991,989 through 994,998 +turn off 913,943 through 958,953 +turn off 278,258 through 367,386 +toggle 275,796 through 493,971 +turn off 70,873 through 798,923 +toggle 258,985 through 663,998 +turn on 601,259 through 831,486 +turn off 914,94 through 941,102 +turn off 558,161 through 994,647 +turn on 119,662 through 760,838 +toggle 378,775 through 526,852 +turn off 384,670 through 674,972 +turn off 249,41 through 270,936 +turn on 614,742 through 769,780 +turn on 427,70 through 575,441 +turn on 410,478 through 985,753 +turn off 619,46 through 931,342 +turn on 284,55 through 768,922 +turn off 40,592 through 728,685 +turn on 825,291 through 956,950 +turn on 147,843 through 592,909 +turn off 218,675 through 972,911 +toggle 249,291 through 350,960 +turn off 556,80 through 967,675 +toggle 609,148 through 968,279 +toggle 217,605 through 961,862 +toggle 407,177 through 548,910 +toggle 400,936 through 599,938 +turn off 721,101 through 925,455 +turn on 268,631 through 735,814 +toggle 549,969 through 612,991 +toggle 553,268 through 689,432 +turn off 817,668 through 889,897 +toggle 801,544 through 858,556 +toggle 615,729 through 832,951 +turn off 427,477 through 958,948 +turn on 164,49 through 852,946 +turn on 542,449 through 774,776 +turn off 923,196 through 980,446 +toggle 90,310 through 718,846 +turn off 657,215 through 744,252 +turn off 800,239 through 811,712 +turn on 502,90 through 619,760 +toggle 649,512 through 862,844 +turn off 334,903 through 823,935 +turn off 630,233 through 839,445 +turn on 713,67 through 839,865 +turn on 932,50 through 982,411 +turn off 480,729 through 984,910 +turn on 100,219 through 796,395 +turn on 758,108 through 850,950 +turn off 427,276 through 439,938 +turn on 178,284 through 670,536 +toggle 540,27 through 625,102 +turn off 906,722 through 936,948 +toggle 345,418 through 859,627 +toggle 175,775 through 580,781 +toggle 863,28 through 929,735 +turn off 824,858 through 905,973 +toggle 752,312 through 863,425 +turn on 985,716 through 988,852 +turn off 68,504 through 763,745 +toggle 76,209 through 810,720 +turn off 657,607 through 676,664 +toggle 596,869 through 896,921 +turn off 915,411 through 968,945 +turn off 368,39 through 902,986 +turn on 11,549 through 393,597 +turn off 842,893 through 976,911 +toggle 274,106 through 581,329 +toggle 406,403 through 780,950 +toggle 408,988 through 500,994 +toggle 217,73 through 826,951 +turn on 917,872 through 961,911 +toggle 394,34 through 510,572 +toggle 424,603 through 583,626 +toggle 106,159 through 755,738 +turn off 244,610 through 472,709 +turn on 350,265 through 884,690 +turn on 688,184 through 928,280 +toggle 279,443 through 720,797 +turn off 615,493 through 888,610 +toggle 118,413 through 736,632 +turn on 798,782 through 829,813 +turn off 250,934 through 442,972 +turn on 68,503 through 400,949 +toggle 297,482 through 313,871 +toggle 710,3 through 839,859 +turn on 125,300 through 546,888 +toggle 482,39 through 584,159 +turn off 536,89 through 765,962 +turn on 530,518 through 843,676 +turn on 994,467 through 994,676 +turn on 623,628 through 744,927 +toggle 704,912 through 837,983 +turn on 154,364 through 517,412 +toggle 344,409 through 780,524 +turn off 578,740 through 725,879 +turn on 251,933 through 632,957 +turn on 827,705 through 971,789 +toggle 191,282 through 470,929 +toggle 324,525 through 446,867 +toggle 534,343 through 874,971 +toggle 550,650 through 633,980 +toggle 837,404 through 881,915 +toggle 338,881 through 845,905 +turn on 469,462 through 750,696 +turn on 741,703 through 892,870 +turn off 570,215 through 733,562 +turn on 445,576 through 870,775 +turn on 466,747 through 554,878 +turn off 820,453 through 868,712 +turn off 892,706 through 938,792 +turn off 300,238 through 894,746 +turn off 306,44 through 457,444 +turn off 912,569 through 967,963 +toggle 109,756 through 297,867 +turn on 37,546 through 41,951 +turn on 321,637 through 790,910 +toggle 66,50 through 579,301 +toggle 933,221 through 933,791 +turn on 486,676 through 878,797 +turn on 417,231 through 556,317 +toggle 904,468 through 981,873 +turn on 417,675 through 749,712 +turn on 692,371 through 821,842 +toggle 324,73 through 830,543 +turn on 912,490 through 977,757 +turn off 634,872 through 902,949 +toggle 266,779 through 870,798 +turn on 772,982 through 990,996 +turn off 607,46 through 798,559 +turn on 295,602 through 963,987 +turn on 657,86 through 944,742 +turn off 334,639 through 456,821 +turn off 997,667 through 997,670 +turn off 725,832 through 951,945 +turn off 30,120 through 952,984 +turn on 860,965 through 917,976 +toggle 471,997 through 840,998 +turn off 319,307 through 928,504 +toggle 823,631 through 940,908 +toggle 969,984 through 981,993 +turn off 691,319 through 865,954 +toggle 911,926 through 938,929 +turn on 953,937 through 968,991 +toggle 914,643 through 975,840 +turn on 266,982 through 436,996 +turn off 101,896 through 321,932 +turn off 193,852 through 751,885 +turn off 576,532 through 863,684 +turn on 761,456 through 940,783 +turn on 20,290 through 398,933 +turn off 435,335 through 644,652 +turn on 830,569 through 905,770 +turn off 630,517 through 905,654 +turn on 664,53 through 886,976 +toggle 275,416 through 408,719 +turn on 370,621 through 515,793 +turn on 483,373 through 654,749 +turn on 656,786 through 847,928 +turn off 532,752 through 945,974 +toggle 301,150 through 880,792 +turn off 951,488 through 958,952 +turn on 207,729 through 882,828 +toggle 694,532 through 973,961 +toggle 676,639 through 891,802 +turn off 653,6 through 905,519 +toggle 391,109 through 418,312 +turn on 877,423 through 957,932 +turn on 340,145 through 563,522 +turn off 978,467 through 988,895 +turn off 396,418 through 420,885 +turn off 31,308 through 816,316 +turn on 107,675 through 758,824 +turn on 61,82 through 789,876 +turn on 750,743 through 754,760 +toggle 88,733 through 736,968 +turn off 754,349 through 849,897 +toggle 157,50 through 975,781 +turn off 230,231 through 865,842 +turn off 516,317 through 630,329 +turn off 697,820 through 829,903 +turn on 218,250 through 271,732 +toggle 56,167 through 404,431 +toggle 626,891 through 680,927 +toggle 370,207 through 791,514 +toggle 860,74 through 949,888 +turn on 416,527 through 616,541 +turn off 745,449 through 786,908 +turn on 485,554 through 689,689 +turn on 586,62 through 693,141 +toggle 506,759 through 768,829 +turn on 473,109 through 929,166 +turn on 760,617 through 773,789 +toggle 595,683 through 618,789 +turn off 210,775 through 825,972 +toggle 12,426 through 179,982 +turn on 774,539 through 778,786 +turn on 102,498 through 121,807 +turn off 706,897 through 834,965 +turn off 678,529 through 824,627 +turn on 7,765 through 615,870 +turn off 730,872 through 974,943 +turn off 595,626 through 836,711 +turn off 215,424 through 841,959 +toggle 341,780 through 861,813 +toggle 507,503 through 568,822 +turn on 252,603 through 349,655 +toggle 93,521 through 154,834 +turn on 565,682 through 951,954 +turn on 544,318 through 703,418 +toggle 756,953 through 891,964 +turn on 531,123 through 856,991 +turn on 148,315 through 776,559 +turn off 925,835 through 963,971 +turn on 895,944 through 967,964 +turn off 102,527 through 650,747 +toggle 626,105 through 738,720 +turn off 160,75 through 384,922 +toggle 813,724 through 903,941 +turn on 207,107 through 982,849 +toggle 750,505 through 961,697 +toggle 105,410 through 885,819 +turn on 226,104 through 298,283 +turn off 224,604 through 508,762 +turn on 477,368 through 523,506 +turn off 477,901 through 627,936 +turn off 887,131 through 889,670 +turn on 896,994 through 938,999 +toggle 401,580 through 493,728 +toggle 987,184 through 991,205 +turn on 821,643 through 882,674 +toggle 784,940 through 968,959 +turn off 251,293 through 274,632 +turn off 339,840 through 341,844 +turn off 675,351 through 675,836 +toggle 918,857 through 944,886 +toggle 70,253 through 918,736 +turn off 612,604 through 772,680 +turn off 277,40 through 828,348 +toggle 692,139 through 698,880 +toggle 124,446 through 883,453 +toggle 969,932 through 990,945 +toggle 855,692 through 993,693 +toggle 722,472 through 887,899 +toggle 978,149 through 985,442 +toggle 837,540 through 916,889 +turn off 612,2 through 835,82 +toggle 560,767 through 878,856 +turn on 461,734 through 524,991 +toggle 206,824 through 976,912 +turn on 826,610 through 879,892 +turn on 577,699 through 956,933 +turn off 9,250 through 50,529 +turn off 77,657 through 817,677 +turn on 68,419 through 86,426 +turn on 991,720 through 992,784 +turn on 668,20 through 935,470 +turn off 133,418 through 613,458 +turn off 487,286 through 540,328 +toggle 247,874 through 840,955 +toggle 301,808 through 754,970 +turn off 34,194 through 578,203 +turn off 451,49 through 492,921 +turn on 907,256 through 912,737 +turn off 479,305 through 702,587 +turn on 545,583 through 732,749 +toggle 11,16 through 725,868 +turn on 965,343 through 986,908 +turn on 674,953 through 820,965 +toggle 398,147 through 504,583 +turn off 778,194 through 898,298 +turn on 179,140 through 350,852 +turn off 241,118 through 530,832 +turn off 41,447 through 932,737 +turn off 820,663 through 832,982 +turn on 550,460 through 964,782 +turn on 31,760 through 655,892 +toggle 628,958 through 811,992 diff --git a/src/main/resources/2015/day7.txt b/src/main/resources/2015/day7.txt new file mode 100644 index 00000000..1b7dfc90 --- /dev/null +++ b/src/main/resources/2015/day7.txt @@ -0,0 +1,339 @@ +bn RSHIFT 2 -> bo +lf RSHIFT 1 -> ly +fo RSHIFT 3 -> fq +cj OR cp -> cq +fo OR fz -> ga +t OR s -> u +lx -> a +NOT ax -> ay +he RSHIFT 2 -> hf +lf OR lq -> lr +lr AND lt -> lu +dy OR ej -> ek +1 AND cx -> cy +hb LSHIFT 1 -> hv +1 AND bh -> bi +ih AND ij -> ik +c LSHIFT 1 -> t +ea AND eb -> ed +km OR kn -> ko +NOT bw -> bx +ci OR ct -> cu +NOT p -> q +lw OR lv -> lx +NOT lo -> lp +fp OR fv -> fw +o AND q -> r +dh AND dj -> dk +ap LSHIFT 1 -> bj +bk LSHIFT 1 -> ce +NOT ii -> ij +gh OR gi -> gj +kk RSHIFT 1 -> ld +lc LSHIFT 1 -> lw +lb OR la -> lc +1 AND am -> an +gn AND gp -> gq +lf RSHIFT 3 -> lh +e OR f -> g +lg AND lm -> lo +ci RSHIFT 1 -> db +cf LSHIFT 1 -> cz +bn RSHIFT 1 -> cg +et AND fe -> fg +is OR it -> iu +kw AND ky -> kz +ck AND cl -> cn +bj OR bi -> bk +gj RSHIFT 1 -> hc +iu AND jf -> jh +NOT bs -> bt +kk OR kv -> kw +ks AND ku -> kv +hz OR ik -> il +b RSHIFT 1 -> v +iu RSHIFT 1 -> jn +fo RSHIFT 5 -> fr +be AND bg -> bh +ga AND gc -> gd +hf OR hl -> hm +ld OR le -> lf +as RSHIFT 5 -> av +fm OR fn -> fo +hm AND ho -> hp +lg OR lm -> ln +NOT kx -> ky +kk RSHIFT 3 -> km +ek AND em -> en +NOT ft -> fu +NOT jh -> ji +jn OR jo -> jp +gj AND gu -> gw +d AND j -> l +et RSHIFT 1 -> fm +jq OR jw -> jx +ep OR eo -> eq +lv LSHIFT 15 -> lz +NOT ey -> ez +jp RSHIFT 2 -> jq +eg AND ei -> ej +NOT dm -> dn +jp AND ka -> kc +as AND bd -> bf +fk OR fj -> fl +dw OR dx -> dy +lj AND ll -> lm +ec AND ee -> ef +fq AND fr -> ft +NOT kp -> kq +ki OR kj -> kk +cz OR cy -> da +as RSHIFT 3 -> au +an LSHIFT 15 -> ar +fj LSHIFT 15 -> fn +1 AND fi -> fj +he RSHIFT 1 -> hx +lf RSHIFT 2 -> lg +kf LSHIFT 15 -> kj +dz AND ef -> eh +ib OR ic -> id +lf RSHIFT 5 -> li +bp OR bq -> br +NOT gs -> gt +fo RSHIFT 1 -> gh +bz AND cb -> cc +ea OR eb -> ec +lf AND lq -> ls +NOT l -> m +hz RSHIFT 3 -> ib +NOT di -> dj +NOT lk -> ll +jp RSHIFT 3 -> jr +jp RSHIFT 5 -> js +NOT bf -> bg +s LSHIFT 15 -> w +eq LSHIFT 1 -> fk +jl OR jk -> jm +hz AND ik -> im +dz OR ef -> eg +1 AND gy -> gz +la LSHIFT 15 -> le +br AND bt -> bu +NOT cn -> co +v OR w -> x +d OR j -> k +1 AND gd -> ge +ia OR ig -> ih +NOT go -> gp +NOT ed -> ee +jq AND jw -> jy +et OR fe -> ff +aw AND ay -> az +ff AND fh -> fi +ir LSHIFT 1 -> jl +gg LSHIFT 1 -> ha +x RSHIFT 2 -> y +db OR dc -> dd +bl OR bm -> bn +ib AND ic -> ie +x RSHIFT 3 -> z +lh AND li -> lk +ce OR cd -> cf +NOT bb -> bc +hi AND hk -> hl +NOT gb -> gc +1 AND r -> s +fw AND fy -> fz +fb AND fd -> fe +1 AND en -> eo +z OR aa -> ab +bi LSHIFT 15 -> bm +hg OR hh -> hi +kh LSHIFT 1 -> lb +cg OR ch -> ci +1 AND kz -> la +gf OR ge -> gg +gj RSHIFT 2 -> gk +dd RSHIFT 2 -> de +NOT ls -> lt +lh OR li -> lj +jr OR js -> jt +au AND av -> ax +0 -> c +he AND hp -> hr +id AND if -> ig +et RSHIFT 5 -> ew +bp AND bq -> bs +e AND f -> h +ly OR lz -> ma +1 AND lu -> lv +NOT jd -> je +ha OR gz -> hb +dy RSHIFT 1 -> er +iu RSHIFT 2 -> iv +NOT hr -> hs +as RSHIFT 1 -> bl +kk RSHIFT 2 -> kl +b AND n -> p +ln AND lp -> lq +cj AND cp -> cr +dl AND dn -> do +ci RSHIFT 2 -> cj +as OR bd -> be +ge LSHIFT 15 -> gi +hz RSHIFT 5 -> ic +dv LSHIFT 1 -> ep +kl OR kr -> ks +gj OR gu -> gv +he RSHIFT 5 -> hh +NOT fg -> fh +hg AND hh -> hj +b OR n -> o +jk LSHIFT 15 -> jo +gz LSHIFT 15 -> hd +cy LSHIFT 15 -> dc +kk RSHIFT 5 -> kn +ci RSHIFT 3 -> ck +at OR az -> ba +iu RSHIFT 3 -> iw +ko AND kq -> kr +NOT eh -> ei +aq OR ar -> as +iy AND ja -> jb +dd RSHIFT 3 -> df +bn RSHIFT 3 -> bp +1 AND cc -> cd +at AND az -> bb +x OR ai -> aj +kk AND kv -> kx +ao OR an -> ap +dy RSHIFT 3 -> ea +x RSHIFT 1 -> aq +eu AND fa -> fc +kl AND kr -> kt +ia AND ig -> ii +df AND dg -> di +NOT fx -> fy +k AND m -> n +bn RSHIFT 5 -> bq +km AND kn -> kp +dt LSHIFT 15 -> dx +hz RSHIFT 2 -> ia +aj AND al -> am +cd LSHIFT 15 -> ch +hc OR hd -> he +he RSHIFT 3 -> hg +bn OR by -> bz +NOT kt -> ku +z AND aa -> ac +NOT ak -> al +cu AND cw -> cx +NOT ie -> if +dy RSHIFT 2 -> dz +ip LSHIFT 15 -> it +de OR dk -> dl +au OR av -> aw +jg AND ji -> jj +ci AND ct -> cv +dy RSHIFT 5 -> eb +hx OR hy -> hz +eu OR fa -> fb +gj RSHIFT 3 -> gl +fo AND fz -> gb +1 AND jj -> jk +jp OR ka -> kb +de AND dk -> dm +ex AND ez -> fa +df OR dg -> dh +iv OR jb -> jc +x RSHIFT 5 -> aa +NOT hj -> hk +NOT im -> in +fl LSHIFT 1 -> gf +hu LSHIFT 15 -> hy +iq OR ip -> ir +iu RSHIFT 5 -> ix +NOT fc -> fd +NOT el -> em +ck OR cl -> cm +et RSHIFT 3 -> ev +hw LSHIFT 1 -> iq +ci RSHIFT 5 -> cl +iv AND jb -> jd +dd RSHIFT 5 -> dg +as RSHIFT 2 -> at +NOT jy -> jz +af AND ah -> ai +1 AND ds -> dt +jx AND jz -> ka +da LSHIFT 1 -> du +fs AND fu -> fv +jp RSHIFT 1 -> ki +iw AND ix -> iz +iw OR ix -> iy +eo LSHIFT 15 -> es +ev AND ew -> ey +ba AND bc -> bd +fp AND fv -> fx +jc AND je -> jf +et RSHIFT 2 -> eu +kg OR kf -> kh +iu OR jf -> jg +er OR es -> et +fo RSHIFT 2 -> fp +NOT ca -> cb +bv AND bx -> by +u LSHIFT 1 -> ao +cm AND co -> cp +y OR ae -> af +bn AND by -> ca +1 AND ke -> kf +jt AND jv -> jw +fq OR fr -> fs +dy AND ej -> el +NOT kc -> kd +ev OR ew -> ex +dd OR do -> dp +NOT cv -> cw +gr AND gt -> gu +dd RSHIFT 1 -> dw +NOT gw -> gx +NOT iz -> ja +1 AND io -> ip +NOT ag -> ah +b RSHIFT 5 -> f +NOT cr -> cs +kb AND kd -> ke +jr AND js -> ju +cq AND cs -> ct +il AND in -> io +NOT ju -> jv +du OR dt -> dv +dd AND do -> dq +b RSHIFT 2 -> d +jm LSHIFT 1 -> kg +NOT dq -> dr +bo OR bu -> bv +gk OR gq -> gr +he OR hp -> hq +NOT h -> i +hf AND hl -> hn +gv AND gx -> gy +x AND ai -> ak +bo AND bu -> bw +hq AND hs -> ht +hz RSHIFT 1 -> is +gj RSHIFT 5 -> gm +g AND i -> j +gk AND gq -> gs +dp AND dr -> ds +b RSHIFT 3 -> e +gl AND gm -> go +gl OR gm -> gn +y AND ae -> ag +hv OR hu -> hw +1674 -> b +ab AND ad -> ae +NOT ac -> ad +1 AND ht -> hu +NOT hn -> ho diff --git a/src/main/resources/2015/day8.txt b/src/main/resources/2015/day8.txt new file mode 100644 index 00000000..3e5be655 --- /dev/null +++ b/src/main/resources/2015/day8.txt @@ -0,0 +1,300 @@ +"\xa8br\x8bjr\"" +"nq" +"zjrfcpbktjmrzgsz\xcaqsc\x03n\"huqab" +"daz\\zyyxddpwk" +"draes\xa2n\\g\x27ek\"lj\"\\viqych" +"nnx\\krnrfomdnt\x2flbl\xd2xpo\"cp\"k" +"kwdaapalq" +"u\"ptk" +"ckhorczuiudfjmmcc\\u\"wozqxibsfjma" +"ydctdrxat\"pd\"lwi\"bjesevfw\xe8" +"v\"\xa8rrzep\"\"r" +"nbydghkfvmq\\\xe0\"lfsrsvlsj\"i\x61liif" +"jsas\"u" +"odipikxlo" +"\"rnubsgwltqkbsu\"pcpcs" +"eitk\\f\\mhcqqoym\\ji" +"vnedc" +"\"lhcaurdqzyjyu" +"haxzsa\"zcn\"y\"foclgtjfcnv\"m\x68krc" +"\"eoeggg\"tmiydvcay\"vfavc" +"snqvyqoncwxcvwbdktoywch" +"rnfgjsyr\xd5wacy" +"ik\"hebrpvsts" +"txw" +"\x15pxtdkogd\"urbm\"gevhh\"nxr\x3erxtk" +"cetqtcy" +"inleep\\mgl" +"uflwbxvww\x2cxzezqnaply\"yh\"qlllzk" +"eepak\"xqtedzt" +"na\x61qzfieafvyrsnwkssznohjmc" +"yceaonylz\xc1\\jrlbbkzwsidfi" +"ybqafngkcqpbp" +"\xaft" +"yidjpaobqydso" +"ju\\ldxig\\lrdrhjcmm\x77rc" +"tylacqeslnwj\x48ds\"tjxa" +"efbfm" +"\\fxkgoprgdcjgyajykg\\dtbrz" +"eujvva" +"h\x7acwfpikme\\vwthyvrqdnx\"" +"rbpbrxm\\\"\"\"voxx" +"ykiw\"tkb\\lforu\"rsf\\tf\"x\"rqti" +"e\\wh\x77aqeugiq\\ihhfqfuaij" +"g\"t\\o" +"nxzo\"hf\\xp" +"dxiaqfo\xea" +"kali\\zczhiqkqzybjj\"fgdjnik" +"zdkgrqmdv" +"bimxim\xb6lrwsaj\"ui\"a" +"\"rrznitibgx\\olpsjmjqzctxaubdifsq" +"zb\"khzixaacmhuzmlymoformipdzml" +"qfwi" +"hjwsxfpphttjy\"\"zixais\xbblgnqfto" +"puj\\qmyu\"nqgaqfthbwjokbmrpbhpi" +"cyxdpkh\\\"" +"q" +"m" +"tbxdzzllarlo" +"gbtys" +"gytilk\\vlqxvcuutjunrqc" +"uugkvcuzan\\eyhb" +"yaxr\"genlbgw\"\\uc" +"nrgecjeip\\sjdvgqaqxwsqactopu" +"pu\"r\"txpyrkfny\\zmwfneyvwmnkkdipv" +"jm\xa3bhwvq" +"qxojmnml\"w\x9airr" +"xbzsuihs\x4dcedy\xaclrhgii\\\"" +"drgjirusrekrwmvxllwdm" +"\x28hfxnfpycmpnkku\"csuf\xaarxlqyg\"x" +"\"zvz\\rmg\"\\sxxoifffyqfyn\"iq\"ps" +"\"z" +"zbwkmk\"sgzos\x93gtc\"" +"bvm\x28aa\\\\\"pywuhaniox\\z\\hbp\xd7mold" +"aszgvsyna" +"qf\"vdwuss" +"lnohni\"qwiacjsjegstlbfq\\kyjhyd" +"c\\naawulxlqplnacvytspry\xf5ytxxqq" +"razwqmsqgbaaxcd\\f" +"radggyrjrg\"zx" +"\"pu\x11t\\ajcjuieinlkvya" +"veggiskh" +"eglfhjxiet\"kouqfskwsy\"hpthsldel" +"mv\xc1b\"f\\shrssnjwcpmurepdxdlcj" +"dlayjd\"suvzotgdtc" +"\xa9pvxeopn" +"lpplsaxy\"oiwaq" +"hqwh\\lusv" +"hykykwlx\"\xa5atkgh\\d\x63dff" +"vfktanpjy\"xxetc" +"dnhwkgjnsmsswfuelvihvjl\"jtf" +"x\"dwvzra\"nbbsewftehczgbvfzd\"rau" +"csfi\"mzejnjqkqupwadrgti\"von" +"xckf\xf7xsm\\pgvlpetjndpyblais\\z" +"yecy\x6fuj\x58bwpgeuiw\"mdu" +"fgb" +"c\\lx\x3efthet\xfdelgvwvpem" +"kgyrmarvfwjinlowt" +"yzte" +"vc\"z" +"sxevqfzmmdwsuu\"" +"fxbaercmcy\xb6md" +"f" +"m\x44gqbcppho\\b" +"gtafr\x57m\x11jy\"\"erwmmpiwjkbckuw" +"ufdjt\"kssprzxqixzxmq\x58q" +"yzbyo\"lfdbyaxexyfbnyv\\\xe8xmre" +"u\x43ntr\\\\byyfjr\"iveujvnwsqbnpuvrta" +"us\xf6bai" +"c\\edh" +"tzckolphexfq\\\x23\xfbdqv\\\"m" +"yjafhbvhhj\x1b\"bplb" +"\"o" +"rubahvmp\"" +"qmkukrnrmqumh" +"wdpxyvyidhwjf\\nabbijwhr\xc5bksvy\"p" +"u\"prlpg\"" +"nsvcquyxbwilsxxemf\xd9leq" +"y\xcetxuafl" +"it" +"kwdlysf\\xjpelae" +"viwh\x58wpjjlnvryuti\x2chngrx\\nhtkui" +"vhn\x9ehre\xc3ncsqbozms\"nl" +"ytc\xa3mgeeogjcqavmmmd" +"xzlexlitseozoxtpzzutfq" +"cish\x07lmovj" +"ekbflwqzaiivdr\"pq\\azrfbntqwkn" +"uc\"xdbegmlmhksofzohavtrnxf" +"xfdnrdqdrcjzbe" +"ndg\"ckgrpisib\"rg\"p\\lmpfzlssnvk" +"witfjwpbyyzlop" +"zonlww\"emrbcsgdtrg\"rjzy\x64zqntlw" +"dvgb\"zn\\vrbzema\"ckmd" +"\\vdlmxhlvldk\"pmzazeip" +"\"\"r" +"rsntinv" +"iy" +"lr\x20efh" +"csgexlb\"zqdavlxxhtdbh\"\"\x0fkpvhiphm" +"ouwhp\"ogbft" +"cm\\ckltng\"dw\x8brf\xf0eppgckd" +"zmnlsgalhpkejsizfsbtnfliu\"nhc" +"pnrkaayqvwpdjbhcrbb\"yfeq\"aq" +"ozh\\hoxow\x2csrtr\\r\"" +"bqxabj\"u\\s" +"cpsjti\"gy" +"aa\"p\\nki\\ajijkqev" +"q\"\"lfdentjgd\\" +"bmokvpoebutfki" +"pielvcbne\xf6efvzxn" +"kx" +"zlgmqagcrbhrwtwtmmg" +"aiyhmntcqjbpv\xb5hhswxbryoedvos" +"tdpaxrb" +"fu\"\x7dttkyvhrlwko" +"oirc\\\"cqlnqffjqt\\k" +"edxlia\\tcyby" +"jpeybgwfayerfrfbvfog\"ol" +"ysr" +"bzwzilgwfugjk" +"tlcc\x75nukvwjgftetjcs\xaecwc" +"dsqssa\"vzrf\"sewbp\\ahhlmhbeihlh" +"qtgmjck\"n\"guki\"gmdivwqxismqj" +"\"f" +"wuorvlovucngbzdszqpikyk" +"dfrdsacoukmgvhbq\"\"iwto" +"\"ey\"ch\\wcgioe\\\"ouvligmsw" +"ciqlszzgs" +"\\tzyrkaoi\"sopjaq" +"lmtnv" +"ar\"fqoroigiertjjlm\"ymgi\\kkjewsxd" +"wehcimlvudpxtamdn\"rwy" +"hr\"zvrwthr\"vruzqfrldn\"b" +"sggekodkiwvym\"mhsco" +"ltlkfbrrdvk\\" +"uut\"sfjnz\"\\ef" +"hxilg\\" +"zsredsiwlzrpedibn" +"vtfi" +"\\h" +"qekfrc\xf6wduodbwrguqcng\\n" +"\"lljlfdrxftwidn\\pkv\xd9ij" +"mrvgqynpehkliuijlpp" +"gikjph" +"yoxcdrdt\"wbaurnyhoyxoihu" +"onmomwuxuammbzxe" +"rnrr\\twviz\x61gqaljr\x0dmtw" +"r\"vupaoi" +"l" +"sei" +"jwxtdtbkd\\kxd" +"\x22v\\" +"ahd" +"j\"bjqxs" +"\\i\x24gglxub\\nzsajokt" +"lviwpu\"uxdlh\\zuy\"xqy\"ytdzlx\"r" +"kptfmys" +"fwxzikfhczkjwyjszqdbkepaeellc" +"nlqpsvbrbd\\ns" +"qryuwkjiodw\"\"vaqyq\"dmyifm" +"tw\x15kdmaudjl\\zorhp\"alwh" +"aatrvczesykekkjfyb\"kb" +"usqcutbqbxxhucwxo\xc1ltb\"j\"bghjcvws" +"ilhsrnzxkz" +"bianqfdfdhvw" +"hqibqs\x7ax\"qoxqoaqtcsz" +"htxtoojbbauztwxuiq\\ngyfy\\obzc" +"rxn\\moxlj" +"mtus\x84erh\"dbe" +"asx\x50huvsitcxadt" +"\"bugggtnrc\"\"kl\"hmpu\x83hqrvhpo" +"ewisbp\"\"vuzf\\w\x5fvalszdhl" +"scusplpwxfnxu\x57\"zynpn\x99xerc\\ri" +"m\\kinmkke\x0cl" +"xhuzit\x7fd" +"kfbo\x04\x50ruqirn" +"t\"\"xpbdscmdoug" +"punvpsgnbgyxe\"sptmpz" +"bxukkazijr" +"nxyrcdaoo\"rjkk\"wntehcvcip\"vrd" +"rdpvqskmihqaw" +"p\\gwdhtqnpgthod" +"nwnuf\"\"yebycearom\"nqym\"\xd4sii\xccle" +"alda\"ptspo\"wkkv\"zoi\"hkb\"vnntyd" +"ixpgpfzbqv" +"znui\"\\fzn\x03qozabh\"rva\"pv\x67" +"e\"zswmwuk" +"hcccygwfa" +"ngmace\\rtyllolr\"\x68bw" +"\\c\"jyufbry\"ryo\"xpo\x26ecninfeckh\\s" +"hdnpngtuc\"dzbvvosn\x31fwtpzbrt" +"hesbpd\xd4" +"dsdbstuzrdfmrnyntufs\"dmv" +"d\xeeibcwhcvkt" +"fvzwrsfjdqdmy\"\"v" +"ns\"dqafz\\lkyoflnazv\"mn\x37\"o\"yj\"e" +"dypilgbwzccayxa\"bnmuernx" +"q\xa9ztqrhreb\"\"kxfeyodqb" +"iz\xa5qjxqulaawuwz\"rqmpcj\\yel" +"z\"\\pq\"\"y\x67zpjtn" +"ifxqvivp\"kiiftdoe" +"jxzebj\"\x35\"qr\"ecglcutuoyywqumcs\"kk" +"q" +"yob\x85qmpuwexptczbkrl" +"cjiavv\"uudpozvibyycnmxhxpxmpjoz" +"xro\\uiqyrcid" +"nod\\k" +"d\"neiec" +"tqyrqvwyvmz\\pzgzzcqsqsrgbqbtapoz" +"r\"xvocpeuxfxslgueb\x05kzyyie\"aoec" +"\"du\\uirlhcbgv\\cjqhfreqnvn" +"zp\x04\x15\"pbjwhrjtmiba" +"\\cv\"" +"k\"rwnb\\hiu\"rqd\"rc\\nyakrhly" +"klrmafjzandiddodgz" +"xipzhqzhvlpykzcuppx" +"zdvrvn\xd0mtfvpylbn\\\\sxcznrzugwznl" +"ody\\pvm\"kpjiudzhxazirgxzvumeat\"o" +"kllvhdp\"prjikzrrc\"adgpegc\\\"gk" +"sqtpug\xbcaauxaamw" +"wegxxrrxdvpivrqievfeokmnojsk" +"\\bo" +"gijhz" +"ylowluvabwrigssdgtxdwsiorxev\xdd" +"\"" +"ghnsrnsqtxpygikahkrl" +"\"rcfqkbjf\"sgxg\"vnd\\rotn" +"ap\"smgsuexjrbuqs\"mpbstogj\"x" +"koaunz\\sgt\"opv" +"yialiuzwix" +"yp\"ndxgwzml\"bt" +"lpcjxmggfsy\\szbxccarjkqzasqkb\xcfd\x0c" +"x" +"mgakc" +"vjieunoh\x73fjwx" +"erbvv\"qulsd" +"mimycrbfhqkarmz" +"tihfbgcszuej\"c\xfbvoqskkhbgpaddioo" +"mziavkwrmekriqghw" +"izk\\tnjd\\ed\\emokvjoc" +"c\"nhbqzndro\\g" +"usfngdo" +"aypljdftvptt" +"ym\"afvq\xbcc" +"zabi\"wjpvugwhl" +"ebvptcjqjhc\"n\"p\"dxrphegr\\" +"mzlqqxokhye\xd9\\rffhnzs" +"hnipqknwpsjakanuewe" +"rqgbfcjdrmiz\"h" +"kzzp\\z\\txmkwaouxictybwx" +"yzmspjkqrteiydswlvb" +"gjpxklgpzv\"txri\\hotpuiukzzzd" +"p\"rxergtbsxmjmkeeqwvoagnki\"" +"santipvuiq" +"\"ihjqlhtwbuy\"hdkiv\"mtiqacnf\\" +"oliaggtqyyx" +"fwwnpmbb" +"yrtdrieazfxyyneo" +"nywbv\\" +"twc\\ehfqxhgomgrgwpxyzmnkioj" +"qludrkkvljljd\\xvdeum\x4e" diff --git a/src/main/resources/2015/day9.txt b/src/main/resources/2015/day9.txt new file mode 100644 index 00000000..a56f5e25 --- /dev/null +++ b/src/main/resources/2015/day9.txt @@ -0,0 +1,28 @@ +AlphaCentauri to Snowdin = 66 +AlphaCentauri to Tambi = 28 +AlphaCentauri to Faerun = 60 +AlphaCentauri to Norrath = 34 +AlphaCentauri to Straylight = 34 +AlphaCentauri to Tristram = 3 +AlphaCentauri to Arbre = 108 +Snowdin to Tambi = 22 +Snowdin to Faerun = 12 +Snowdin to Norrath = 91 +Snowdin to Straylight = 121 +Snowdin to Tristram = 111 +Snowdin to Arbre = 71 +Tambi to Faerun = 39 +Tambi to Norrath = 113 +Tambi to Straylight = 130 +Tambi to Tristram = 35 +Tambi to Arbre = 40 +Faerun to Norrath = 63 +Faerun to Straylight = 21 +Faerun to Tristram = 57 +Faerun to Arbre = 83 +Norrath to Straylight = 9 +Norrath to Tristram = 50 +Norrath to Arbre = 60 +Straylight to Tristram = 27 +Straylight to Arbre = 81 +Tristram to Arbre = 90 diff --git a/src/main/resources/2016-examples/day10-1.txt b/src/main/resources/2016-examples/day10-1.txt new file mode 100644 index 00000000..e9ad2b4e --- /dev/null +++ b/src/main/resources/2016-examples/day10-1.txt @@ -0,0 +1,6 @@ +value 5 goes to bot 2 +bot 2 gives low to bot 1 and high to bot 0 +value 3 goes to bot 1 +bot 1 gives low to output 1 and high to bot 0 +bot 0 gives low to output 2 and high to output 0 +value 2 goes to bot 2 diff --git a/src/main/resources/2016-examples/day11-1.txt b/src/main/resources/2016-examples/day11-1.txt new file mode 100644 index 00000000..0a01c5e3 --- /dev/null +++ b/src/main/resources/2016-examples/day11-1.txt @@ -0,0 +1,4 @@ +The first floor contains a hydrogen-compatible microchip and a lithium-compatible microchip. +The second floor contains a hydrogen generator. +The third floor contains a lithium generator. +The fourth floor contains nothing relevant. diff --git a/src/main/resources/2016-examples/day11-10.txt b/src/main/resources/2016-examples/day11-10.txt new file mode 100644 index 00000000..4191a853 --- /dev/null +++ b/src/main/resources/2016-examples/day11-10.txt @@ -0,0 +1,4 @@ +F4 . . . . LM +F3 E HG HM LG . +F2 . . . . . +F1 . . . . . diff --git a/src/main/resources/2016-examples/day11-11.txt b/src/main/resources/2016-examples/day11-11.txt new file mode 100644 index 00000000..88f32241 --- /dev/null +++ b/src/main/resources/2016-examples/day11-11.txt @@ -0,0 +1,4 @@ +F4 E HG . LG LM +F3 . . HM . . +F2 . . . . . +F1 . . . . . diff --git a/src/main/resources/2016-examples/day11-12.txt b/src/main/resources/2016-examples/day11-12.txt new file mode 100644 index 00000000..2fd3c63d --- /dev/null +++ b/src/main/resources/2016-examples/day11-12.txt @@ -0,0 +1,4 @@ +F4 . HG . LG . +F3 E . HM . LM +F2 . . . . . +F1 . . . . . diff --git a/src/main/resources/2016-examples/day11-13.txt b/src/main/resources/2016-examples/day11-13.txt new file mode 100644 index 00000000..f85a14c9 --- /dev/null +++ b/src/main/resources/2016-examples/day11-13.txt @@ -0,0 +1,4 @@ +F4 E HG HM LG LM +F3 . . . . . +F2 . . . . . +F1 . . . . . diff --git a/src/main/resources/2016-examples/day11-2.txt b/src/main/resources/2016-examples/day11-2.txt new file mode 100644 index 00000000..f1044a8c --- /dev/null +++ b/src/main/resources/2016-examples/day11-2.txt @@ -0,0 +1,4 @@ +F4 . . . . . +F3 . . . LG . +F2 . HG . . . +F1 E . HM . LM diff --git a/src/main/resources/2016-examples/day11-3.txt b/src/main/resources/2016-examples/day11-3.txt new file mode 100644 index 00000000..f7d59167 --- /dev/null +++ b/src/main/resources/2016-examples/day11-3.txt @@ -0,0 +1,4 @@ +F4 . . . . . +F3 . . . LG . +F2 E HG HM . . +F1 . . . . LM diff --git a/src/main/resources/2016-examples/day11-4.txt b/src/main/resources/2016-examples/day11-4.txt new file mode 100644 index 00000000..29750325 --- /dev/null +++ b/src/main/resources/2016-examples/day11-4.txt @@ -0,0 +1,4 @@ +F4 . . . . . +F3 E HG HM LG . +F2 . . . . . +F1 . . . . LM diff --git a/src/main/resources/2016-examples/day11-5.txt b/src/main/resources/2016-examples/day11-5.txt new file mode 100644 index 00000000..285327fe --- /dev/null +++ b/src/main/resources/2016-examples/day11-5.txt @@ -0,0 +1,4 @@ +F4 . . . . . +F3 . HG . LG . +F2 E . HM . . +F1 . . . . LM diff --git a/src/main/resources/2016-examples/day11-6.txt b/src/main/resources/2016-examples/day11-6.txt new file mode 100644 index 00000000..808c2d4b --- /dev/null +++ b/src/main/resources/2016-examples/day11-6.txt @@ -0,0 +1,4 @@ +F4 . . . . . +F3 . HG . LG . +F2 . . . . . +F1 E . HM . LM diff --git a/src/main/resources/2016-examples/day11-7.txt b/src/main/resources/2016-examples/day11-7.txt new file mode 100644 index 00000000..fe95e36e --- /dev/null +++ b/src/main/resources/2016-examples/day11-7.txt @@ -0,0 +1,4 @@ +F4 . . . . . +F3 . HG . LG . +F2 E . HM . LM +F1 . . . . . diff --git a/src/main/resources/2016-examples/day11-8.txt b/src/main/resources/2016-examples/day11-8.txt new file mode 100644 index 00000000..e8018194 --- /dev/null +++ b/src/main/resources/2016-examples/day11-8.txt @@ -0,0 +1,4 @@ +F4 . . . . . +F3 E HG HM LG LM +F2 . . . . . +F1 . . . . . diff --git a/src/main/resources/2016-examples/day11-9.txt b/src/main/resources/2016-examples/day11-9.txt new file mode 100644 index 00000000..af6a17fa --- /dev/null +++ b/src/main/resources/2016-examples/day11-9.txt @@ -0,0 +1,4 @@ +F4 E . HM . LM +F3 . HG . LG . +F2 . . . . . +F1 . . . . . diff --git a/src/main/resources/2016-examples/day12-1.txt b/src/main/resources/2016-examples/day12-1.txt new file mode 100644 index 00000000..01a004ba --- /dev/null +++ b/src/main/resources/2016-examples/day12-1.txt @@ -0,0 +1,6 @@ +cpy 41 a +inc a +inc a +dec a +jnz a 2 +dec a diff --git a/src/main/resources/2016-examples/day13-1.txt b/src/main/resources/2016-examples/day13-1.txt new file mode 100644 index 00000000..3cdf3263 --- /dev/null +++ b/src/main/resources/2016-examples/day13-1.txt @@ -0,0 +1,8 @@ + 0123456789 +0 .#.####.## +1 ..#..#...# +2 #....##... +3 ###.#.###. +4 .##..#..#. +5 ..##....#. +6 #...##.### diff --git a/src/main/resources/2016-examples/day13-2.txt b/src/main/resources/2016-examples/day13-2.txt new file mode 100644 index 00000000..2b185ad3 --- /dev/null +++ b/src/main/resources/2016-examples/day13-2.txt @@ -0,0 +1,8 @@ + 0123456789 +0 .#.####.## +1 .O#..#...# +2 #OOO.##... +3 ###O#.###. +4 .##OO#OO#. +5 ..##OOO.#. +6 #...##.### diff --git a/src/main/resources/2016-examples/day15-1.txt b/src/main/resources/2016-examples/day15-1.txt new file mode 100644 index 00000000..8a942343 --- /dev/null +++ b/src/main/resources/2016-examples/day15-1.txt @@ -0,0 +1,2 @@ +Disc #1 has 5 positions; at time=0, it is at position 4. +Disc #2 has 2 positions; at time=0, it is at position 1. diff --git a/src/main/resources/2016-examples/day17-1.txt b/src/main/resources/2016-examples/day17-1.txt new file mode 100644 index 00000000..bd3c147d --- /dev/null +++ b/src/main/resources/2016-examples/day17-1.txt @@ -0,0 +1,9 @@ +######### +#S| | | # +#-#-#-#-# +# | | | # +#-#-#-#-# +# | | | # +#-#-#-#-# +# | | | +####### V diff --git a/src/main/resources/2016-examples/day18-1.txt b/src/main/resources/2016-examples/day18-1.txt new file mode 100644 index 00000000..93aa8052 --- /dev/null +++ b/src/main/resources/2016-examples/day18-1.txt @@ -0,0 +1,2 @@ +ABCDE +12345 diff --git a/src/main/resources/2016-examples/day18-2.txt b/src/main/resources/2016-examples/day18-2.txt new file mode 100644 index 00000000..7dec673f --- /dev/null +++ b/src/main/resources/2016-examples/day18-2.txt @@ -0,0 +1,3 @@ +..^^. +.^^^^ +^^..^ diff --git a/src/main/resources/2016-examples/day18-3.txt b/src/main/resources/2016-examples/day18-3.txt new file mode 100644 index 00000000..a6d3b621 --- /dev/null +++ b/src/main/resources/2016-examples/day18-3.txt @@ -0,0 +1,10 @@ +.^^.^.^^^^ +^^^...^..^ +^.^^.^.^^. +..^^...^^^ +.^^^^.^^.^ +^^..^.^^.. +^^^^..^^^. +^..^^^^.^^ +.^^^..^.^^ +^^.^^^..^^ diff --git a/src/main/resources/2016-examples/day19-1.txt b/src/main/resources/2016-examples/day19-1.txt new file mode 100644 index 00000000..53d302cf --- /dev/null +++ b/src/main/resources/2016-examples/day19-1.txt @@ -0,0 +1,3 @@ + 1 +5 2 + 4 3 diff --git a/src/main/resources/2016-examples/day2-1.txt b/src/main/resources/2016-examples/day2-1.txt new file mode 100644 index 00000000..50ecbb59 --- /dev/null +++ b/src/main/resources/2016-examples/day2-1.txt @@ -0,0 +1,3 @@ +1 2 3 +4 5 6 +7 8 9 diff --git a/src/main/resources/2016-examples/day2-2.txt b/src/main/resources/2016-examples/day2-2.txt new file mode 100644 index 00000000..51391967 --- /dev/null +++ b/src/main/resources/2016-examples/day2-2.txt @@ -0,0 +1,4 @@ +ULL +RRDDD +LURDL +UUUUD diff --git a/src/main/resources/2016-examples/day20-1.txt b/src/main/resources/2016-examples/day20-1.txt new file mode 100644 index 00000000..b5cde741 --- /dev/null +++ b/src/main/resources/2016-examples/day20-1.txt @@ -0,0 +1,3 @@ +5-8 +0-2 +4-7 diff --git a/src/main/resources/2016-examples/day23-1.txt b/src/main/resources/2016-examples/day23-1.txt new file mode 100644 index 00000000..bcabc2c6 --- /dev/null +++ b/src/main/resources/2016-examples/day23-1.txt @@ -0,0 +1,7 @@ +cpy 2 a +tgl a +tgl a +tgl a +cpy 1 a +dec a +dec a diff --git a/src/main/resources/2016-examples/day24-1.txt b/src/main/resources/2016-examples/day24-1.txt new file mode 100644 index 00000000..628e51b9 --- /dev/null +++ b/src/main/resources/2016-examples/day24-1.txt @@ -0,0 +1,5 @@ +########### +#0.1.....2# +#.#######.# +#4.......3# +########### diff --git a/src/main/resources/2016-examples/day6-1.txt b/src/main/resources/2016-examples/day6-1.txt new file mode 100644 index 00000000..32ba5180 --- /dev/null +++ b/src/main/resources/2016-examples/day6-1.txt @@ -0,0 +1,16 @@ +eedadn +drvtee +eandsr +raavrd +atevrs +tsrnev +sdttsa +rasrtv +nssdts +ntnada +svetve +tesnvt +vntsnd +vrdear +dvrsen +enarar diff --git a/src/main/resources/2016-examples/day8-1.txt b/src/main/resources/2016-examples/day8-1.txt new file mode 100644 index 00000000..273dea2d --- /dev/null +++ b/src/main/resources/2016-examples/day8-1.txt @@ -0,0 +1,3 @@ +###.... +###.... +....... \ No newline at end of file diff --git a/src/main/resources/2016-examples/day8-2.txt b/src/main/resources/2016-examples/day8-2.txt new file mode 100644 index 00000000..a18d0cc9 --- /dev/null +++ b/src/main/resources/2016-examples/day8-2.txt @@ -0,0 +1,3 @@ +#.#.... +###.... +.#..... \ No newline at end of file diff --git a/src/main/resources/2016-examples/day8-3.txt b/src/main/resources/2016-examples/day8-3.txt new file mode 100644 index 00000000..b942c8e0 --- /dev/null +++ b/src/main/resources/2016-examples/day8-3.txt @@ -0,0 +1,3 @@ +....#.# +###.... +.#..... \ No newline at end of file diff --git a/src/main/resources/2016-examples/day8-4.txt b/src/main/resources/2016-examples/day8-4.txt new file mode 100644 index 00000000..631c2749 --- /dev/null +++ b/src/main/resources/2016-examples/day8-4.txt @@ -0,0 +1,3 @@ +.#..#.# +#.#.... +.#..... \ No newline at end of file diff --git a/src/main/resources/2016/day1.txt b/src/main/resources/2016/day1.txt new file mode 100644 index 00000000..2288cc5a --- /dev/null +++ b/src/main/resources/2016/day1.txt @@ -0,0 +1 @@ +R4, R3, L3, L2, L1, R1, L1, R2, R3, L5, L5, R4, L4, R2, R4, L3, R3, L3, R3, R4, R2, L1, R2, L3, L2, L1, R3, R5, L1, L4, R2, L4, R3, R1, R2, L5, R2, L189, R5, L5, R52, R3, L1, R4, R5, R1, R4, L1, L3, R2, L2, L3, R4, R3, L2, L5, R4, R5, L2, R2, L1, L3, R3, L4, R4, R5, L1, L1, R3, L5, L2, R76, R2, R2, L1, L3, R189, L3, L4, L1, L3, R5, R4, L1, R1, L1, L1, R2, L4, R2, L5, L5, L5, R2, L4, L5, R4, R4, R5, L5, R3, L1, L3, L1, L1, L3, L4, R5, L3, R5, R3, R3, L5, L5, R3, R4, L3, R3, R1, R3, R2, R2, L1, R1, L3, L3, L3, L1, R2, L1, R4, R4, L1, L1, R3, R3, R4, R1, L5, L2, R2, R3, R2, L3, R4, L5, R1, R4, R5, R4, L4, R1, L3, R1, R3, L2, L3, R1, L2, R3, L3, L1, L3, R4, L4, L5, R3, R5, R4, R1, L2, R3, R5, L5, L4, L1, L1 diff --git a/src/main/resources/2016/day10.txt b/src/main/resources/2016/day10.txt new file mode 100644 index 00000000..4ef1923d --- /dev/null +++ b/src/main/resources/2016/day10.txt @@ -0,0 +1,231 @@ +bot 75 gives low to bot 145 and high to bot 95 +bot 116 gives low to bot 157 and high to bot 197 +bot 185 gives low to bot 57 and high to bot 139 +bot 202 gives low to bot 105 and high to bot 209 +bot 179 gives low to output 20 and high to bot 133 +bot 114 gives low to bot 140 and high to bot 51 +bot 166 gives low to bot 95 and high to bot 87 +bot 57 gives low to bot 118 and high to bot 32 +bot 33 gives low to bot 141 and high to bot 105 +bot 68 gives low to bot 86 and high to bot 25 +bot 139 gives low to bot 32 and high to bot 28 +bot 18 gives low to bot 186 and high to bot 136 +bot 99 gives low to bot 41 and high to bot 83 +bot 155 gives low to bot 43 and high to bot 78 +bot 157 gives low to bot 55 and high to bot 185 +bot 204 gives low to bot 83 and high to bot 54 +bot 22 gives low to bot 187 and high to bot 148 +bot 48 gives low to bot 151 and high to bot 160 +value 7 goes to bot 77 +bot 154 gives low to bot 138 and high to bot 4 +bot 206 gives low to output 15 and high to bot 203 +value 11 goes to bot 113 +bot 47 gives low to bot 209 and high to bot 86 +bot 187 gives low to bot 54 and high to bot 37 +bot 103 gives low to output 13 and high to bot 125 +bot 92 gives low to bot 150 and high to bot 131 +bot 102 gives low to bot 56 and high to bot 164 +bot 37 gives low to bot 44 and high to bot 11 +bot 80 gives low to bot 17 and high to bot 84 +bot 52 gives low to bot 143 and high to bot 38 +bot 168 gives low to bot 170 and high to bot 2 +bot 188 gives low to bot 161 and high to bot 180 +bot 17 gives low to bot 93 and high to bot 109 +bot 117 gives low to bot 81 and high to bot 168 +bot 25 gives low to bot 59 and high to bot 71 +bot 173 gives low to bot 192 and high to bot 126 +bot 118 gives low to output 7 and high to bot 96 +bot 1 gives low to bot 155 and high to bot 100 +bot 64 gives low to bot 125 and high to bot 192 +bot 5 gives low to bot 197 and high to bot 8 +bot 136 gives low to bot 202 and high to bot 47 +bot 59 gives low to bot 7 and high to bot 130 +bot 197 gives low to bot 185 and high to bot 0 +bot 94 gives low to bot 16 and high to bot 39 +bot 138 gives low to bot 87 and high to bot 65 +bot 20 gives low to bot 128 and high to bot 208 +value 59 goes to bot 162 +bot 201 gives low to bot 119 and high to bot 177 +bot 32 gives low to bot 96 and high to bot 90 +bot 174 gives low to bot 36 and high to bot 124 +bot 60 gives low to bot 158 and high to bot 34 +value 53 goes to bot 140 +bot 141 gives low to bot 152 and high to bot 175 +bot 145 gives low to bot 183 and high to bot 146 +bot 190 gives low to output 1 and high to bot 36 +bot 113 gives low to bot 194 and high to bot 157 +value 41 goes to bot 143 +bot 61 gives low to bot 171 and high to bot 144 +bot 8 gives low to bot 0 and high to bot 152 +bot 170 gives low to bot 193 and high to bot 91 +bot 65 gives low to bot 147 and high to bot 93 +bot 6 gives low to bot 205 and high to bot 182 +bot 45 gives low to bot 195 and high to bot 13 +bot 98 gives low to bot 111 and high to bot 46 +bot 172 gives low to bot 154 and high to bot 7 +bot 119 gives low to bot 131 and high to bot 169 +bot 199 gives low to bot 117 and high to bot 156 +bot 128 gives low to bot 179 and high to bot 208 +bot 84 gives low to bot 109 and high to bot 21 +bot 86 gives low to bot 172 and high to bot 59 +value 43 goes to bot 104 +bot 165 gives low to bot 27 and high to bot 72 +bot 62 gives low to bot 58 and high to bot 120 +bot 109 gives low to bot 121 and high to bot 102 +bot 115 gives low to bot 24 and high to bot 151 +bot 19 gives low to bot 52 and high to bot 76 +bot 125 gives low to output 2 and high to bot 107 +bot 76 gives low to bot 38 and high to bot 155 +value 61 goes to bot 52 +bot 14 gives low to bot 153 and high to bot 53 +bot 180 gives low to bot 106 and high to bot 15 +bot 30 gives low to bot 28 and high to bot 75 +bot 121 gives low to bot 60 and high to bot 56 +bot 200 gives low to output 16 and high to bot 206 +bot 163 gives low to bot 71 and high to bot 14 +bot 146 gives low to bot 174 and high to bot 16 +bot 12 gives low to bot 11 and high to bot 10 +bot 127 gives low to bot 126 and high to bot 129 +bot 101 gives low to bot 64 and high to bot 173 +bot 7 gives low to bot 4 and high to bot 80 +bot 189 gives low to bot 51 and high to bot 62 +bot 85 gives low to bot 98 and high to bot 108 +bot 169 gives low to bot 204 and high to bot 187 +bot 160 gives low to bot 123 and high to bot 112 +bot 40 gives low to bot 182 and high to bot 70 +bot 158 gives low to bot 101 and high to bot 178 +bot 175 gives low to bot 159 and high to bot 67 +bot 183 gives low to bot 190 and high to bot 174 +bot 95 gives low to bot 146 and high to bot 94 +bot 110 gives low to bot 115 and high to bot 48 +bot 55 gives low to bot 49 and high to bot 57 +bot 159 gives low to bot 75 and high to bot 166 +bot 208 gives low to bot 133 and high to bot 196 +bot 131 gives low to bot 99 and high to bot 204 +value 2 goes to bot 19 +value 47 goes to bot 24 +value 31 goes to bot 194 +bot 70 gives low to bot 199 and high to bot 156 +bot 120 gives low to bot 112 and high to bot 198 +bot 42 gives low to bot 22 and high to bot 191 +bot 23 gives low to bot 177 and high to bot 42 +bot 144 gives low to bot 23 and high to bot 79 +bot 107 gives low to output 9 and high to bot 161 +bot 81 gives low to bot 15 and high to bot 170 +bot 143 gives low to bot 176 and high to bot 88 +bot 186 gives low to bot 33 and high to bot 202 +bot 205 gives low to bot 127 and high to bot 50 +bot 27 gives low to bot 3 and high to bot 97 +bot 87 gives low to bot 94 and high to bot 147 +bot 41 gives low to bot 100 and high to bot 18 +bot 50 gives low to bot 129 and high to bot 199 +bot 66 gives low to output 4 and high to bot 190 +bot 171 gives low to bot 201 and high to bot 23 +value 37 goes to bot 27 +bot 10 gives low to bot 142 and high to bot 163 +bot 148 gives low to bot 37 and high to bot 12 +bot 195 gives low to bot 165 and high to bot 31 +bot 36 gives low to output 6 and high to bot 26 +bot 162 gives low to bot 114 and high to bot 189 +bot 104 gives low to bot 162 and high to bot 189 +bot 82 gives low to bot 67 and high to bot 154 +bot 196 gives low to output 17 and high to output 8 +bot 39 gives low to bot 85 and high to bot 89 +bot 78 gives low to bot 134 and high to bot 33 +bot 167 gives low to bot 203 and high to bot 128 +bot 44 gives low to bot 73 and high to bot 63 +bot 97 gives low to bot 207 and high to bot 132 +bot 13 gives low to bot 31 and high to bot 9 +bot 46 gives low to bot 103 and high to bot 64 +bot 203 gives low to output 14 and high to bot 179 +value 23 goes to bot 195 +bot 182 gives low to bot 50 and high to bot 70 +bot 112 gives low to bot 61 and high to bot 198 +bot 184 gives low to bot 89 and high to bot 60 +bot 67 gives low to bot 166 and high to bot 138 +bot 88 gives low to bot 116 and high to bot 5 +bot 31 gives low to bot 72 and high to bot 92 +bot 198 gives low to bot 144 and high to bot 79 +bot 83 gives low to bot 18 and high to bot 29 +bot 0 gives low to bot 139 and high to bot 30 +value 19 goes to bot 115 +bot 3 gives low to bot 19 and high to bot 207 +value 13 goes to bot 114 +bot 89 gives low to bot 108 and high to bot 158 +bot 176 gives low to bot 113 and high to bot 116 +value 5 goes to bot 3 +bot 181 gives low to bot 48 and high to bot 58 +bot 26 gives low to output 19 and high to bot 111 +value 3 goes to bot 45 +bot 4 gives low to bot 65 and high to bot 17 +bot 11 gives low to bot 63 and high to bot 10 +bot 177 gives low to bot 169 and high to bot 22 +bot 71 gives low to bot 130 and high to bot 14 +bot 108 gives low to bot 46 and high to bot 101 +bot 207 gives low to bot 76 and high to bot 1 +value 17 goes to bot 104 +bot 126 gives low to bot 188 and high to bot 149 +bot 135 gives low to bot 164 and high to bot 40 +bot 105 gives low to bot 175 and high to bot 82 +bot 153 gives low to bot 84 and high to bot 53 +bot 35 gives low to bot 122 and high to bot 171 +bot 164 gives low to bot 6 and high to bot 40 +bot 124 gives low to bot 26 and high to bot 98 +bot 69 gives low to bot 13 and high to bot 122 +bot 49 gives low to output 0 and high to bot 118 +bot 193 gives low to bot 206 and high to bot 167 +bot 133 gives low to output 5 and high to bot 196 +bot 24 gives low to bot 74 and high to bot 137 +bot 111 gives low to output 18 and high to bot 103 +bot 192 gives low to bot 107 and high to bot 188 +value 29 goes to bot 110 +bot 72 gives low to bot 97 and high to bot 150 +bot 140 gives low to bot 110 and high to bot 181 +bot 191 gives low to bot 148 and high to bot 12 +value 67 goes to bot 74 +bot 132 gives low to bot 1 and high to bot 41 +bot 16 gives low to bot 124 and high to bot 85 +bot 156 gives low to bot 168 and high to bot 2 +bot 58 gives low to bot 160 and high to bot 120 +bot 43 gives low to bot 5 and high to bot 134 +bot 77 gives low to output 11 and high to bot 49 +bot 21 gives low to bot 102 and high to bot 135 +bot 178 gives low to bot 173 and high to bot 127 +bot 63 gives low to bot 68 and high to bot 142 +bot 194 gives low to bot 77 and high to bot 55 +bot 51 gives low to bot 181 and high to bot 62 +bot 209 gives low to bot 82 and high to bot 172 +bot 38 gives low to bot 88 and high to bot 43 +bot 130 gives low to bot 80 and high to bot 153 +bot 29 gives low to bot 136 and high to bot 73 +bot 56 gives low to bot 34 and high to bot 6 +bot 54 gives low to bot 29 and high to bot 44 +bot 150 gives low to bot 132 and high to bot 99 +bot 106 gives low to output 12 and high to bot 200 +bot 79 gives low to bot 42 and high to bot 191 +bot 147 gives low to bot 39 and high to bot 184 +bot 93 gives low to bot 184 and high to bot 121 +bot 90 gives low to bot 66 and high to bot 183 +bot 123 gives low to bot 35 and high to bot 61 +bot 53 gives low to bot 21 and high to bot 135 +bot 137 gives low to bot 69 and high to bot 35 +bot 28 gives low to bot 90 and high to bot 145 +bot 2 gives low to bot 91 and high to bot 20 +bot 91 gives low to bot 167 and high to bot 20 +bot 161 gives low to output 3 and high to bot 106 +value 71 goes to bot 176 +bot 73 gives low to bot 47 and high to bot 68 +bot 134 gives low to bot 8 and high to bot 141 +bot 9 gives low to bot 92 and high to bot 119 +bot 129 gives low to bot 149 and high to bot 117 +bot 74 gives low to bot 45 and high to bot 69 +bot 34 gives low to bot 178 and high to bot 205 +bot 100 gives low to bot 78 and high to bot 186 +bot 152 gives low to bot 30 and high to bot 159 +bot 149 gives low to bot 180 and high to bot 81 +bot 142 gives low to bot 25 and high to bot 163 +bot 15 gives low to bot 200 and high to bot 193 +bot 96 gives low to output 10 and high to bot 66 +value 73 goes to bot 165 +bot 151 gives low to bot 137 and high to bot 123 +bot 122 gives low to bot 9 and high to bot 201 diff --git a/src/main/resources/2016/day11.txt b/src/main/resources/2016/day11.txt new file mode 100644 index 00000000..d4538045 --- /dev/null +++ b/src/main/resources/2016/day11.txt @@ -0,0 +1,4 @@ +The first floor contains a strontium generator, a strontium-compatible microchip, a plutonium generator, and a plutonium-compatible microchip. +The second floor contains a thulium generator, a ruthenium generator, a ruthenium-compatible microchip, a curium generator, and a curium-compatible microchip. +The third floor contains a thulium-compatible microchip. +The fourth floor contains nothing relevant. diff --git a/src/main/resources/2016/day12.txt b/src/main/resources/2016/day12.txt new file mode 100644 index 00000000..3729d83e --- /dev/null +++ b/src/main/resources/2016/day12.txt @@ -0,0 +1,23 @@ +cpy 1 a +cpy 1 b +cpy 26 d +jnz c 2 +jnz 1 5 +cpy 7 c +inc d +dec c +jnz c -2 +cpy a c +inc a +dec b +jnz b -2 +cpy c b +dec d +jnz d -6 +cpy 19 c +cpy 11 d +inc a +dec d +jnz d -2 +dec c +jnz c -5 diff --git a/src/main/resources/2016/day13.txt b/src/main/resources/2016/day13.txt new file mode 100644 index 00000000..ea29ccd0 --- /dev/null +++ b/src/main/resources/2016/day13.txt @@ -0,0 +1 @@ +1362 diff --git a/src/main/resources/2016/day14.txt b/src/main/resources/2016/day14.txt new file mode 100644 index 00000000..f7f11ad9 --- /dev/null +++ b/src/main/resources/2016/day14.txt @@ -0,0 +1 @@ +ngcjuoqr diff --git a/src/main/resources/2016/day15.txt b/src/main/resources/2016/day15.txt new file mode 100644 index 00000000..6472b577 --- /dev/null +++ b/src/main/resources/2016/day15.txt @@ -0,0 +1,6 @@ +Disc #1 has 17 positions; at time=0, it is at position 15. +Disc #2 has 3 positions; at time=0, it is at position 2. +Disc #3 has 19 positions; at time=0, it is at position 4. +Disc #4 has 13 positions; at time=0, it is at position 2. +Disc #5 has 7 positions; at time=0, it is at position 2. +Disc #6 has 5 positions; at time=0, it is at position 0. diff --git a/src/main/resources/2016/day16.txt b/src/main/resources/2016/day16.txt new file mode 100644 index 00000000..f8e6224b --- /dev/null +++ b/src/main/resources/2016/day16.txt @@ -0,0 +1 @@ +00111101111101000 diff --git a/src/main/resources/2016/day17.txt b/src/main/resources/2016/day17.txt new file mode 100644 index 00000000..20c2a4e0 --- /dev/null +++ b/src/main/resources/2016/day17.txt @@ -0,0 +1 @@ +hhhxzeay diff --git a/src/main/resources/2016/day18.txt b/src/main/resources/2016/day18.txt new file mode 100644 index 00000000..aeae9dc3 --- /dev/null +++ b/src/main/resources/2016/day18.txt @@ -0,0 +1 @@ +......^.^^.....^^^^^^^^^...^.^..^^.^^^..^.^..^.^^^.^^^^..^^.^.^.....^^^^^..^..^^^..^^.^.^..^^..^^^.. diff --git a/src/main/resources/2016/day19.txt b/src/main/resources/2016/day19.txt new file mode 100644 index 00000000..aa27aa1f --- /dev/null +++ b/src/main/resources/2016/day19.txt @@ -0,0 +1 @@ +3017957 diff --git a/src/main/resources/2016/day2.txt b/src/main/resources/2016/day2.txt new file mode 100644 index 00000000..d098f4b1 --- /dev/null +++ b/src/main/resources/2016/day2.txt @@ -0,0 +1,5 @@ +RRLLRLLRULLRUUUDRDLDDLLLDDDDDUUURRRRUUDLRULURRRDRUDRUUDDRUDLLLRLDDDUDRDDRRLLLLRLRLULUURDRURRUULDRRDUDURRUURURDLURULLDUDRDLUUUUDDURRLLLUDLDLRDRRRDULLDLDULLDRLDLDURDLRRULLDDLDRLLLUDDLLRDURULLDDDDDUURURLRLRRDUURUULRLLLULLRLULLUUDRRLLDURLDDDDULUUDLUDDDULRLDURDDRUUDRRUUURLLLULURUDRULDRDUDUDRRDDULRURLLRRLRRLLDLULURDRDRULDRDRURUDLLRRDUUULDDDUURDLULDLRLLURRURLLUDURDDRUDRDLLLLDLRLDLDDRDRRDUUULLUULRRDLURLDULLDLDUUUULLLDRURLRULLULRLULUURLLRDDRULDULRLDRRURLURUDLRRRLUDLDUULULLURLDDUDDLLUDRUDRLDUDURRRRLRUUURLUDDUDURDUDDDLLRLRDDURDRUUDUDRULURLRLDRULDRRLRLDDDRDDDRLDUDRLULDLUDLRLRRRLRDULDDLRRDDLDDULDLLDU +RULLUDDUDLULRRDLLDRUDLLLDURLLLURDURLRDRRDLRDRDLLURRULUULUDUDDLLRRULLURDRLDURDLDDUURLUURLDLDLRLDRLRUULDRLRLDRLRLUDULURDULLLDRUDULDURURRRUDURDUDLRDRRURULRRLRLRRRRRRDRUDLDRULDRUDLRDLRRUDULDLRLURRRLLDRULULRUDULRLULLRLULDRUDUULLRUULDULDUDDUUULLLDRDDRRDLURUUDRRLRRRDLRRLULLLLDLRUULDLLULURUURURDRURLLDUDRRURRURRUUDDRRDDRRRRUDULULRLUULRRDDRDDLLUDLDLULLRLDRLLUULDURLDRULDDUDRUUUURRLDDUDRUURUDLLDLDLURDLULDRLLLULLLUDLLDLD +RDLDULURDLULRRDLRLLLULRUULURULLLDLLDDRLLURUUUURDRLURLLRLRLLLULRDLURDURULULDDUDDUDRLRLDLULLURRRUULUDRDURRRUDDDLUDLDLRLRRLLLRUULLLLURRDDDRRRUURULRLDRRRLRLUDDRRULDDDRUUDDRLLDULRLUDUDLDLDDDUDDLLDDRDRDUDULDRRUDRDRRDRLUURDLRDDDULLDRRRRRUDRLURDUURRDDRLUDLURRRLRDDDLRRLUULRLURDUUURRDLDDULLLRURRRUDRLUDLLDDDDDUDDRDULLUUDDURRLULLUDULUUDRLDRRRLLURLRRLLDLLLLUDRUUUDDULLRDLLDUDUDUURRUUUDRUURDRDLLDLDDULLDDRRULDLDDUUURLDLULLLRRLLRDDULLDLDLDDLDLDULURRDURURDRDRRDLR +RDRLRRUUDRLDUDLLDLUDLUUDUDLRRUUDRDDDLDDLLLRRRUDULLRRRRRURRRLUDDDLRRRRUUULDURDRULLDLRURRUULUDRURRRRLRURLRDUUDUDUDRDDURRURUDLLLLLRURUULRUURLLURDRUURLUDDDRLDDURDLDUDRURDRLRRRRUURDDRRRRURDLUUDRLDRDUULURUDDULLURRDUDLUULLDURRURLUDUUDRDDDUUDDUUUULDLDUDDLUDUUDRURLLULRUUULLRRDDUDDLULDDUUUDLUDDLDDLLRUUDRULLRRDRLLDLLRRLULLRRDDRLRDUULLLUULLDLLUDUDDLRDULUDLDLUDDRRRRDUDLUULLULDLRRDLULRLRRRULRURRDRLULDDUDLDLDULLURLLRDLURRULURDLURLUDRDRRUUDRLLUDDRLRDDUURLRRDUDLDRURDUUUDRRLLRDLDLLDRRURLUDURUULDUDLDDDDRUULLDDRLRURRDURLURRLDDRRRRLRLRDRURUDDRDLDRURLULDDL +RULRDLDDLRURDDDDDDRURLLLDDDUUULLRRDLDLURUURLUDLURRLUDUURDULDRUULDDURULDUULDDULLLUDLRULDRLDLRDDRRDLDDLLDRRUDDUDRDUULUDLLLDDLUUULDDUUULRRDULLURLULDLRLLLRLURLLRLRLDRDURRDUUDDURRULDDURRULRDRDUDLRRDRLDULULDRDURDURLLLDRDRLULRDUURRUUDURRDRLUDDRRLDLDLULRLLRRUUUDDULURRDRLLDLRRLDRLLLLRRDRRDDLDUULRLRRULURLDRLRDULUDRDLRUUDDDURUDLRLDRRUDURDDLLLUDLRLURDUDUDULRURRDLLURLLRRRUDLRRRLUDURDDDDRRDLDDLLDLRDRDDRLLLURDDRDRLRULDDRRLUURDURDLLDRRRDDURUDLDRRDRUUDDDLUDULRUUUUDRLDDD diff --git a/src/main/resources/2016/day20.txt b/src/main/resources/2016/day20.txt new file mode 100644 index 00000000..189331ca --- /dev/null +++ b/src/main/resources/2016/day20.txt @@ -0,0 +1,1005 @@ +3382920125-3384842620 +274395476-292717439 +2930989217-2931442098 +3567238438-3585628354 +1810679772-1815894338 +2521813372-2535211980 +4013982395-4016121606 +2226785695-2253602522 +4229313327-4237568877 +1132836395-1152735559 +4269205249-4270079756 +2511639370-2530694840 +1171860793-1191956612 +3608053909-3628140626 +1775412113-1797695975 +4252451184-4252820601 +1890203557-1895515881 +193774732-206045669 +3175243761-3179190970 +19216799-19928301 +3971224406-3973125653 +68520730-94398865 +945026896-957344481 +1412893721-1441801950 +3788966586-3804667828 +2223187817-2271363589 +2545050647-2564483681 +2242154395-2257327093 +660143774-679617175 +32282927-36527505 +1229799722-1238149872 +3822988915-3824678099 +3884348907-3904978960 +2252013899-2263171199 +3981516539-4010091149 +945651521-976367354 +1221206473-1229799720 +2549674323-2561232188 +2376575970-2385719960 +1829303629-1830213769 +2912748047-2912973420 +296450718-298533185 +0-296167 +3007232257-3021954584 +2582574639-2595855729 +1126754955-1140997648 +2752347098-2755308045 +321293830-342822868 +3044917961-3053774169 +296168-338264 +2649036310-2651206776 +3928579179-3971224404 +3737193158-3780150443 +1573397371-1581625110 +1148171795-1149071460 +3408724803-3428558635 +4109666880-4111857380 +3448144745-3460294806 +1973628511-1981533533 +3910915179-3925173331 +1167391101-1190519306 +1698028061-1711856370 +3238650022-3242636563 +2167565708-2184217555 +1944362237-1944379075 +3521245233-3565141178 +2571486508-2634519366 +1068461313-1077918553 +2525701686-2528766629 +1007018315-1008720710 +1169491074-1182700437 +3223704461-3228194458 +2745317983-2749861362 +3731646349-3774460614 +67383642-75156586 +1087254330-1100199012 +1944252124-1944359392 +2678720901-2684840830 +3189810804-3209591108 +3045104016-3056042589 +3100783758-3105185632 +1970405872-1975927116 +30653275-33023281 +1729464127-1757742357 +3492152701-3496720848 +3838945885-3848343543 +2375265785-2376167442 +1281737199-1296067597 +153839654-192286353 +3061850960-3063867047 +2004615362-2011857766 +476720144-488779061 +4176808904-4176858533 +492477166-527499878 +4010091151-4025282542 +1483844776-1496977388 +391524704-408520374 +835404913-844274834 +1247397368-1259987148 +2274372271-2286321078 +33382215-47606566 +2656063772-2678720900 +1122989118-1134481584 +2298071484-2303767417 +1500615536-1513878328 +2291114932-2295384774 +1291517806-1295675102 +259510824-282241059 +967069512-969192091 +2079767818-2105862356 +1606936119-1620662769 +2945855436-2949623976 +4086076760-4093177773 +2485901459-2511639368 +589152049-597247085 +3270052935-3298492585 +409062463-409427072 +1929277403-1941018188 +1010771555-1012643406 +1493995188-1495245637 +1619574592-1622196598 +3716313190-3737193157 +3826791442-3865501220 +825394498-825744078 +1773854071-1779360047 +2816332266-2818641650 +2371579315-2373848117 +2366969457-2391079767 +4123843400-4124989452 +192286354-192541612 +870373772-896071056 +2048779745-2054449255 +268512502-283090853 +4269917675-4279760928 +1462129979-1465223356 +3247583317-3259024503 +3403959199-3407679571 +4180798441-4182367116 +3063867048-3099209395 +1739301078-1760165423 +2645684515-2649713671 +2162195522-2167543718 +3221850097-3227046227 +396737648-399152359 +2313750941-2342383891 +427252428-458811443 +445566820-446097704 +907066705-914448562 +1920136239-1939293201 +2334636788-2339526533 +3514129555-3521245232 +4281339062-4294967295 +2686884806-2745210393 +439169154-455722709 +825744079-851589298 +3592373874-3634851804 +1211029415-1212832495 +273388944-274163729 +2132629675-2132700694 +2326528914-2330825379 +909137317-928919312 +1522375692-1550294454 +1134481585-1159050084 +997502057-1007018313 +2133634767-2135284509 +496193729-512883053 +1728458413-1734223404 +1782318366-1788200671 +127408875-153839652 +621168152-658228192 +40273288-64703196 +2342383892-2343706398 +2190122771-2202195589 +784611548-810002490 +1362421579-1395584056 +739113110-750311063 +730131534-755802629 +3644607763-3677628864 +1665013054-1678433427 +243374728-261627849 +3385386916-3393847439 +2155515429-2187539714 +810370879-819340508 +1335022169-1353125978 +22887908-40273287 +4025282543-4038335157 +2949623977-2974530638 +356899-526908 +215559317-227556922 +634153508-644185930 +4051716178-4083270267 +2135798301-2137541953 +3378154439-3385386915 +566204137-570632585 +630340925-635762048 +600087250-621168151 +1441801951-1451987059 +1136156009-1152687437 +1879006122-1885589295 +2974530640-3007232256 +2242396606-2252030436 +679617177-709847053 +1121696532-1122989116 +1689775922-1705775363 +240864028-243374726 +928919314-945651520 +199476581-210053727 +2020719353-2029905834 +1224624935-1228220228 +3348209102-3378154437 +1694908069-1706914052 +1823170033-1840038962 +2123962597-2125807985 +220529375-231563680 +3636188162-3644607762 +114512497-116367083 +2542221563-2563583721 +440721121-443253425 +1814324660-1814776846 +316171985-321293828 +1551343653-1551417152 +1031220674-1068461312 +178336905-180296237 +3677628866-3700353494 +709847054-730131532 +1287723007-1318939855 +1822475995-1842462378 +3125724575-3159628774 +1955246012-1962440512 +1819209653-1819816377 +344329395-389291803 +2749861364-2759109163 +527499879-533571500 +1164270-1481011 +3817400832-3821786328 +901919569-920421338 +851589300-870373771 +595550368-600087248 +2759109164-2760643932 +3821786329-3826791440 +1949443933-1970405871 +2221584805-2223187816 +1923301958-1942106417 +1012132604-1016533540 +348650091-378626227 +28276119-52605826 +2483735686-2492147527 +2568480999-2571486507 +2683686729-2686884804 +1383416036-1383424105 +1451987061-1465262753 +3819890477-3820014182 +218734078-227934420 +3242025866-3245287395 +1565274153-1568270598 +543998311-551251629 +3159628776-3221850096 +1383415633-1383417760 +472634773-481329318 +3272554719-3284374410 +2352029418-2357807359 +3795913899-3817400830 +1982524206-1985660116 +2344870095-2356691970 +15179284-15208613 +483586800-485882611 +790054203-825394496 +2417955156-2431673241 +1060111039-1068592663 +717604300-721842101 +1720917970-1760674479 +2339262539-2341812485 +4083270269-4107229565 +3393847441-3444103711 +1819816379-1842989273 +2855176964-2861003252 +615534248-642669508 +1217865821-1218326602 +1996585864-1999916771 +3299334363-3300161360 +1989192869-1994354251 +17392476-18451433 +3575798614-3592373872 +165099211-183295830 +3228194460-3247583316 +2982941789-2987321627 +1441097434-1445936581 +590243311-595211713 +755802630-760774561 +3235753051-3255820518 +1468416458-1468455274 +669621393-672959731 +2473003938-2489482468 +3259024505-3270052934 +3331647869-3348209101 +4199628170-4252451182 +3634851805-3636188160 +1096541631-1099376487 +2536496011-2542221561 +3397236409-3399143903 +1641276080-1681591145 +3680601912-3703506252 +1296474851-1322391536 +988476364-989996293 +3033936266-3036955642 +979911605-1002087529 +4104876209-4107243235 +3306555870-3308425868 +115778546-129354919 +389291805-417628406 +1989403878-2012858691 +1546327487-1547203424 +2343706400-2351350196 +1186369842-1198581391 +4182367118-4199628169 +1334526721-1342509587 +3700353495-3716313188 +867902139-879521194 +1425754606-1443576388 +3336592324-3353553106 +3042033257-3046689814 +533571502-542226692 +3928078977-3941757285 +345288703-383651417 +3498131404-3514129553 +216258763-220545698 +1809247449-1819209652 +2760643934-2781531747 +987427038-999763162 +2833260077-2855176963 +3944171786-3948030354 +3469422818-3492152699 +760774563-790054202 +4129662063-4137417252 +1335520454-1339806810 +1476565092-1521929333 +171417566-180614013 +1048919317-1064342678 +3325700154-3334070797 +3384723456-3389821412 +2431673243-2438008172 +711297600-720760721 +4264349849-4281339060 +304359527-308615901 +1586925539-1609842612 +464241620-492477164 +1388596941-1411011352 +683224859-684724346 +394626125-419293805 +4237408619-4246478691 +2391079769-2402783877 +2659409480-2678047635 +2296473187-2312899725 +110865646-115455859 +1864974310-1920136237 +863159991-870770281 +1055828663-1070489310 +2444713222-2451056648 +2637386450-2651970603 +943589-1164269 +3444538013-3454605952 +3162950403-3227215568 +1765728230-1779481151 +3503881483-3510813488 +3007115189-3007470646 +590039933-596625156 +3948145140-3970110907 +2793388962-2826701333 +3272493234-3287945160 +568598493-582854306 +1670360905-1689775920 +3022737908-3034367992 +3315476309-3325700152 +2546025328-2556376813 +1342454357-1351096476 +261627850-274064399 +4228394805-4236419474 +1944311172-1944722574 +4131310747-4162992714 +1010081024-1010771554 +2125807987-2130444545 +1760674480-1765728228 +73645309-79317363 +950292880-959564426 +2786879875-2825002009 +105397257-127408874 +1087209164-1121696531 +368220701-371111861 +1569459904-1586925537 +607581036-608077398 +4173269611-4174119323 +2844879629-2845217856 +2753271043-2757764026 +1959985533-1968095028 +1705775364-1720917968 +3602618846-3610579776 +1242566331-1276821530 +889929398-890275103 +3306446323-3317763996 +1595029750-1597941920 +780548480-785102060 +2705670454-2708020928 +1256458647-1281737197 +2219132176-2221584803 +1942594732-1944396203 +64982902-67683321 +3066140059-3066855275 +1465262754-1470050405 +1495924013-1501063645 +318586-356898 +1160956884-1211029414 +1534780725-1535823633 +2022004332-2027472832 +3041899759-3042690143 +313123739-314449501 +1012222604-1031220672 +1659525312-1670360904 +481669087-484796416 +3116438564-3122478539 +837255957-838285548 +912527697-912840438 +76991573-82365911 +2130444546-2138286096 +1779481152-1809247447 +3825258788-3825671210 +4065379322-4070317121 +2451479414-2453220953 +2469339724-2489484142 +2271363591-2296473186 +3780150445-3787339388 +4016664589-4025890998 +590578611-593888990 +2453886250-2456860665 +3279224721-3288422104 +3535542612-3543098316 +2443650195-2444595922 +1985660117-2016553627 +1148119196-1148764506 +3094795296-3095920839 +4019192128-4026050778 +1092442517-1093829738 +2023013298-2041240865 +1814467493-1818539320 +3076118916-3090677357 +3307156073-3323639190 +1563809190-1567493564 +3980703234-3988136413 +551284368-587037715 +857019769-872505288 +976367356-997502056 +3971819957-3973561606 +794806432-803617291 +2241454848-2263544967 +1212832497-1217770903 +3456605804-3481082221 +902154451-921445395 +2094224351-2099681572 +1944357183-1944363132 +1223055058-1227782181 +2636445986-2641100226 +3444755935-3454876871 +542541828-547000672 +2474960157-2502850835 +1879702426-1881800084 +2580182143-2590984428 +1595567928-1598277825 +507513580-514073365 +1859163315-1864974309 +3854470118-3860479944 +3265417704-3279454467 +4055818403-4079447905 +2063632639-2064958294 +1217770904-1224112895 +3695132653-3713149541 +497756477-523236755 +1610554974-1633348137 +1842989274-1859163313 +3396782387-3402868431 +3300138591-3300502021 +3458569100-3469996107 +4270100053-4270561883 +2922640986-2942710495 +4173886702-4180798440 +2873495940-2912748046 +1711630545-1716251263 +2658467267-2677384090 +1564163162-1570677945 +2417337335-2417413928 +1461667403-1462859282 +2652947303-2656063770 +195088301-196469703 +2582553452-2620574531 +2048460532-2048899787 +709214029-721035675 +3891491970-3903401430 +3365160031-3374736713 +3104588971-3115733169 +3204860388-3211157811 +1787926186-1796355897 +2445799244-2452795590 +2418910963-2424145291 +247380909-275647101 +4105856039-4107646677 +3925173332-3931399691 +3066565693-3074312658 +1470050407-1475643287 +2016553629-2057778379 +2790660820-2822522031 +2991807862-2996796995 +4047075048-4050210199 +2064958296-2095043831 +3307610341-3308724441 +1015524241-1023656078 +589825855-592055765 +1015993233-1029896311 +4040738788-4068965233 +4186913164-4229954405 +1008774467-1018719265 +574855316-576727313 +4208019144-4247208714 +65602494-66299578 +3360158360-3378108909 +269782036-280194349 +4134699031-4169267930 +699993381-721029669 +2466959221-2498251053 +4115341314-4143640697 +2865625835-2866804445 +2658583733-2671459562 +1168494786-1196738801 +4254567270-4259506300 +2333068117-2335855320 +4133687106-4151924959 +1535012775-1537900539 +3446385279-3469422817 +2462195571-2481529125 +1322391538-1347698869 +1383416657-1383450578 +3005709574-3006877355 +2394741810-2427498661 +1963046613-1969784518 +3865501221-3866422917 +1460361099-1462481424 +3448387919-3469381556 +1230059245-1242566330 +3031419211-3047324322 +3444330376-3444538011 +2787078869-2833260075 +1242988078-1244105333 +3682801932-3684630135 +2438008173-2445691083 +1395584057-1407407033 +2198522828-2219132175 +2170430672-2175936933 +3732557498-3736464094 +1494472634-1498091211 +2032522821-2045467139 +2714467967-2717531120 +2912973422-2913083816 +2736931464-2749855256 +3298492587-3300115843 +3685589675-3709803507 +3115849886-3116207193 +2451274812-2454113545 +4047188788-4050382414 +94398867-114790779 +2563583722-2564317178 +4039808033-4042390351 +3228958627-3255826496 +3800106025-3801876074 +2639096879-2645122059 +3929103007-3938392177 +3532436927-3534736680 +461413165-464241619 +2526200033-2536496010 +2398846954-2423553234 +536370-943588 +4288962745-4290619977 +636980688-646930866 +1218887965-1225612868 +671828987-677448584 +4270021357-4270354835 +3685969598-3693109108 +3906297697-3910915177 +1898545939-1906623101 +3921404257-3955599234 +2665600353-2678784357 +3379840660-3386697049 +2172294648-2181893861 +2138286098-2147627935 +2474128173-2491465605 +2312899727-2326264347 +2861003254-2878829564 +3565141180-3568626042 +308034725-308930370 +1374297787-1380188076 +2068350379-2103164273 +2702434316-2706631005 +840841762-843827173 +229774001-234577870 +2443293270-2444181013 +2574363987-2599509306 +845988653-846928995 +2842140798-2844212347 +1159050086-1162924895 +4176624770-4179568335 +1905152176-1908861185 +3606966881-3625605509 +2166966376-2171494787 +3707543797-3710413405 +2227000048-2246357729 +3124052995-3138551453 +3034771020-3037079950 +1243594629-1247856697 +4103498097-4109666879 +4203196953-4219400839 +1077918555-1094983032 +2187539716-2208607142 +2473581216-2485901458 +3006847770-3007275174 +3795257999-3795893809 +3795280067-3796297230 +3545921317-3561167758 +553671633-571891401 +2238446853-2246415452 +3503347037-3503591653 +310512326-314458992 +4012559618-4015268266 +2642511754-2651864212 +886299687-896817994 +3831912904-3841111291 +2914871355-2945855434 +4291658998-4292541862 +1079441616-1095238335 +1972756258-1972823681 +3044529792-3049122444 +897474157-908605461 +1622977765-1624949994 +3760168892-3775868493 +2695977801-2706156257 +4199845296-4243416654 +4177775615-4178843612 +2101880914-2105104067 +3867587845-3899468258 +1437467314-1437840786 +2093133394-2110473538 +1724010685-1748760725 +1167854731-1171905437 +2322711178-2336704318 +4231384538-4242310243 +1436980489-1437501195 +1378548431-1400976547 +3396448428-3399042206 +3332285028-3332375353 +2850614289-2852661610 +3187769187-3204842123 +2636291169-2640638445 +2517128152-2524544424 +3533300423-3541129068 +3573676754-3586699285 +3832578767-3841924270 +2477155824-2487462236 +3035920211-3040698912 +2636502692-2642511753 +2952432198-2971920769 +421129764-426848253 +2238635499-2243485822 +3899018260-3903171024 +1243523891-1245953102 +3384235667-3387646608 +790098274-793907157 +3276379980-3277190884 +3307896877-3319098793 +3641444007-3652122767 +3447005599-3461604095 +3462534637-3489441055 +2833382577-2840549985 +3542225929-3546837316 +2146092922-2155515428 +4211070374-4233272852 +3300043907-3314078796 +1701091122-1708998038 +2913024368-2913481687 +2745210394-2745645192 +1537899875-1539681070 +314012837-315380828 +3792148556-3796673743 +1291936207-1296576784 +3128985781-3150897646 +1379246184-1380841525 +3237038068-3243669218 +834667595-848396762 +3658218412-3670611693 +2692426015-2739862742 +4106928638-4107460569 +4287915224-4289366667 +892439163-897474155 +3893977471-3899446004 +3974871979-3981866307 +4046928323-4047184536 +333364695-343159811 +2952169267-2954573558 +2690146848-2717243659 +2755378753-2756460882 +2651575794-2653371414 +4046844150-4051716177 +2781531748-2810973065 +3303219538-3313081002 +912236390-912762687 +618629-906615 +2841833088-2843285315 +1218091567-1218345972 +906568139-909137316 +3108329496-3111948153 +74728522-80765410 +3548862395-3557636198 +1570417344-1580218390 +3117586921-3125724574 +3577015031-3577548939 +1015056285-1023786721 +3655096652-3659642735 +4111857382-4124735338 +1284290662-1296474850 +967937098-970818324 +20056881-20584783 +4135005481-4144833956 +221149070-240864027 +1710858080-1717882479 +1601063719-1618092010 +1166807149-1170618627 +1706232059-1713134566 +3115733170-3116067361 +4130973781-4143562361 +843422499-844720865 +3734875958-3741567257 +2678807125-2686424630 +1054816704-1061718755 +2872527689-2890484915 +3040491186-3056691605 +4252820602-4259944760 +2739837406-2740050066 +3126484839-3131427900 +2332013266-2335298295 +2999166329-3016421804 +2205268977-2209403178 +991291734-998472487 +192541614-202428614 +4047160273-4047217725 +2878835138-2893001123 +1375604678-1379759604 +3496345621-3504196200 +2652396822-2655405235 +3314078797-3318915019 +1633348139-1660027185 +3498753158-3512415972 +2591789953-2616643994 +575368706-581401066 +4231679445-4237060522 +3383738500-3386738201 +1008368502-1010698488 +3866113074-3867587843 +2402783878-2419285864 +2939413921-2942219764 +193014880-206479483 +4018437222-4024788715 +211754529-219443426 +3975278884-3986634567 +2564266037-2568480997 +666978253-677172271 +223203125-231491045 +2192871188-2207220241 +675858225-675952197 +4257875783-4260699436 +3940911746-3941818761 +3988918893-4007346244 +3031534264-3053593807 +195556009-196837181 +4286366695-4289048606 +226298223-238515408 +421363548-427252427 +300712133-316171984 +1471461219-1476565091 +3240052251-3241386278 +2231989399-2264591448 +3299508574-3300179059 +2646205821-2652027108 +3129409101-3132079129 +4172668392-4179309752 +64703198-66141247 +3971539247-3974871978 +292717441-304774999 +1293392954-1298137650 +3332318691-3332429290 +334555237-344329394 +772076204-782410336 +2039614574-2040147613 +458811445-463771353 +1356594077-1362421577 +4130552895-4133561937 +1402788318-1412893719 +2993310543-3009919115 +2444518820-2447369285 +1351096477-1359203213 +3543692767-3554653903 +2994252231-2998775799 +3888643539-3894556102 +755676110-755819696 +2959006612-2961692229 +4288838018-4289477072 +3975814181-3999363827 +2442111999-2453707073 +1623782409-1624437681 +4254752791-4266103317 +2438554423-2452608911 +4258959867-4260213148 +3309364026-3323683264 +572107636-575184177 +1785746314-1791209417 +755713961-755868908 +417628407-420524802 +1331153534-1351460515 +3352294628-3356437686 +958623192-968490278 +20119191-22887906 +777444801-820808960 +3519216305-3538850688 +1504049921-1519439892 +69376974-77465178 +3904978961-3910909761 +1096342936-1098061182 +2360555311-2366969456 +3332376000-3332444944 +2093416138-2123962596 +1400240408-1411182311 +1812810592-1813817247 +4194775348-4230093279 +10043235-20056880 +658965209-660143773 +658228194-660018205 +988139853-988890960 +3566969226-3575798613 +1299704418-1313986078 +3326245272-3365728403 +2355105948-2361674222 +1374933841-1376509422 +2755815067-2756920528 +3065692142-3066173496 +1222655406-1222854745 +3302092195-3307808868 +1222656245-1223388503 +3310805449-3318236347 +1563665591-1565964587 +3500127914-3506345530 +66175128-68520729 +971415679-971438052 +2533426597-2535586000 +417640991-421129762 +4038335159-4047297836 +1481012-19067078 +4215425077-4233295756 +1513069473-1522375690 +1526395860-1535180867 +2533109682-2535536505 +259012497-280042917 +1092158303-1092310579 +587037717-595030105 +2449102172-2455068497 +3115910816-3116438562 +4289219635-4290513855 +971352187-971425385 +2596721069-2614884167 +2202304638-2204641422 +1983306462-2016210300 +98785619-120360211 +3734505160-3736504307 +906373341-908727213 +1987234731-2000421026 +591565572-595550367 +4166402786-4171901263 +3003226411-3005630903 +2098393934-2104954270 +1374724703-1375984400 +2202151168-2203033657 +1476748370-1499918361 +3987121456-3988259357 +2864184557-2895589402 +1566627822-1583849612 +448076121-458094571 +3532511739-3541650687 +1770087544-1786108116 +1343999847-1350306206 +4137009835-4151771902 +574161-825403 +3352815885-3355102553 +4189090453-4235387842 +348976886-386738198 +3984044069-3987766381 +1658592149-1660311063 +1620874816-1624015163 +4066090098-4073771506 +542226693-576985533 +1333730749-1335614766 +2443413884-2445100251 +3865604776-3866752621 +3819878422-3819980898 +3299910115-3316426233 +4047194787-4047227667 +11540965-12225599 +3353631607-3363805493 +675731305-675887073 +3178549872-3188507025 +4143640698-4159586896 +1092177276-1092640111 +906363542-906948068 +3924258074-3929255454 +2948759624-2961881600 +723319058-728376658 +675715140-675742004 +4152104204-4172668390 +4041961742-4042525064 +988633059-991245637 +612207279-637349464 +3099209397-3111771687 +1249971850-1256470700 +470483337-473161883 +1594652709-1595966414 +3033237415-3061850958 +1960894410-1960943838 +2101531682-2109531569 +2920716472-2924595989 +3819966618-3819998902 +526909-785166 +3038311762-3044991110 +332215272-375605795 +2447148673-2462195569 +2690105306-2733531504 +1814492093-1818707672 +2920662080-2924197601 +3240013671-3240354417 +1609842613-1621859382 +4022515306-4026711143 +1468393035-1468419357 +207646612-211754527 +307684614-308379795 +1033592629-1037435660 +3434226621-3437122894 +3785668719-3795913898 +3796760686-3797471605 +2285198565-2297181003 +3108911312-3111149567 +86384527-88825176 +4056463317-4068828679 +2953555159-2960474022 +2634519368-2638715809 +3004961824-3005815942 +3444103712-3444389286 +1595556007-1596384528 +1555143934-1562116062 +3936081202-3945563120 +1659222079-1662764945 +3496720849-3503120412 +2913481688-2931396492 +1981533535-1984202583 +3022489925-3031534263 +85723398-87045537 +2256910583-2262520880 +4060339410-4069992129 +3110505154-3113683544 +2032719111-2063632638 +2092072604-2097347473 +4041476487-4047873276 +2914975332-2933186420 +1960874133-1960901569 +3796091862-3797395425 +1550294455-1559848607 +2844699816-2845069351 +2256768047-2260994367 +3111539056-3113760923 +1468376221-1468412465 +912440499-912775470 +3924993791-3964673937 +3108424707-3110543821 +841598382-845221105 +844215802-846669383 +971389171-971451918 +1239928137-1251743127 +2665595736-2679331263 +989266353-998318732 +1941122272-1949443931 +1939293202-1941391631 +755125638-756411210 +590764992-594630716 +206479484-210953249 +3021954586-3023849838 +1308467159-1320340471 +1660536607-1663577866 +1563386860-1566627821 +1622209725-1624469922 +2662613082-2675241140 +3077994117-3083539989 +755393660-757594713 +1562116064-1563502746 +3184192645-3197212232 +573558521-576486773 +3077610247-3082214069 diff --git a/src/main/resources/2016/day21.txt b/src/main/resources/2016/day21.txt new file mode 100644 index 00000000..f43fd373 --- /dev/null +++ b/src/main/resources/2016/day21.txt @@ -0,0 +1,100 @@ +swap position 2 with position 7 +swap letter f with letter a +swap letter c with letter a +rotate based on position of letter g +rotate based on position of letter f +rotate based on position of letter b +swap position 3 with position 6 +swap letter e with letter c +swap letter f with letter h +rotate based on position of letter e +swap letter c with letter b +rotate right 6 steps +reverse positions 4 through 7 +rotate based on position of letter f +swap position 1 with position 5 +rotate left 1 step +swap letter d with letter e +rotate right 7 steps +move position 0 to position 6 +swap position 2 with position 6 +swap position 2 with position 0 +swap position 0 with position 1 +rotate based on position of letter d +rotate right 2 steps +rotate left 4 steps +reverse positions 0 through 2 +rotate right 2 steps +move position 6 to position 1 +move position 1 to position 2 +reverse positions 2 through 5 +move position 2 to position 7 +rotate left 3 steps +swap position 0 with position 1 +rotate based on position of letter g +swap position 5 with position 0 +rotate left 1 step +swap position 7 with position 1 +swap letter g with letter h +rotate left 1 step +rotate based on position of letter g +reverse positions 1 through 7 +reverse positions 1 through 4 +reverse positions 4 through 5 +rotate left 2 steps +swap letter f with letter d +swap position 6 with position 3 +swap letter c with letter e +swap letter c with letter d +swap position 1 with position 6 +rotate based on position of letter g +move position 4 to position 5 +swap letter g with letter h +rotate based on position of letter h +swap letter h with letter f +swap position 3 with position 6 +rotate based on position of letter c +rotate left 3 steps +rotate based on position of letter d +swap position 0 with position 7 +swap letter e with letter d +move position 6 to position 7 +rotate right 5 steps +move position 7 to position 0 +rotate left 1 step +move position 6 to position 2 +rotate based on position of letter d +rotate right 7 steps +swap position 3 with position 5 +move position 1 to position 5 +rotate right 0 steps +move position 4 to position 5 +rotate based on position of letter b +reverse positions 2 through 4 +rotate right 3 steps +swap letter b with letter g +rotate based on position of letter a +rotate right 0 steps +move position 0 to position 6 +reverse positions 5 through 6 +rotate left 2 steps +move position 3 to position 0 +swap letter g with letter b +move position 6 to position 1 +rotate based on position of letter f +move position 3 to position 2 +reverse positions 2 through 7 +swap position 0 with position 4 +swap letter e with letter b +rotate left 4 steps +reverse positions 0 through 4 +rotate based on position of letter a +rotate based on position of letter b +rotate left 6 steps +rotate based on position of letter d +rotate left 7 steps +swap letter c with letter d +rotate left 3 steps +move position 4 to position 6 +move position 3 to position 2 +reverse positions 0 through 6 diff --git a/src/main/resources/2016/day22.txt b/src/main/resources/2016/day22.txt new file mode 100644 index 00000000..df16e40f --- /dev/null +++ b/src/main/resources/2016/day22.txt @@ -0,0 +1,1066 @@ +root@ebhq-gridcenter# df -h +Filesystem Size Used Avail Use% +/dev/grid/node-x0-y0 93T 68T 25T 73% +/dev/grid/node-x0-y1 91T 69T 22T 75% +/dev/grid/node-x0-y2 92T 68T 24T 73% +/dev/grid/node-x0-y3 92T 73T 19T 79% +/dev/grid/node-x0-y4 89T 69T 20T 77% +/dev/grid/node-x0-y5 88T 69T 19T 78% +/dev/grid/node-x0-y6 88T 67T 21T 76% +/dev/grid/node-x0-y7 89T 72T 17T 80% +/dev/grid/node-x0-y8 86T 65T 21T 75% +/dev/grid/node-x0-y9 94T 72T 22T 76% +/dev/grid/node-x0-y10 91T 64T 27T 70% +/dev/grid/node-x0-y11 90T 73T 17T 81% +/dev/grid/node-x0-y12 90T 72T 18T 80% +/dev/grid/node-x0-y13 90T 68T 22T 75% +/dev/grid/node-x0-y14 93T 73T 20T 78% +/dev/grid/node-x0-y15 91T 66T 25T 72% +/dev/grid/node-x0-y16 86T 73T 13T 84% +/dev/grid/node-x0-y17 90T 69T 21T 76% +/dev/grid/node-x0-y18 87T 71T 16T 81% +/dev/grid/node-x0-y19 91T 64T 27T 70% +/dev/grid/node-x0-y20 86T 64T 22T 74% +/dev/grid/node-x0-y21 90T 73T 17T 81% +/dev/grid/node-x0-y22 85T 64T 21T 75% +/dev/grid/node-x0-y23 88T 68T 20T 77% +/dev/grid/node-x0-y24 90T 66T 24T 73% +/dev/grid/node-x0-y25 87T 68T 19T 78% +/dev/grid/node-x0-y26 90T 67T 23T 74% +/dev/grid/node-x0-y27 88T 72T 16T 81% +/dev/grid/node-x1-y0 89T 65T 24T 73% +/dev/grid/node-x1-y1 89T 71T 18T 79% +/dev/grid/node-x1-y2 88T 73T 15T 82% +/dev/grid/node-x1-y3 93T 68T 25T 73% +/dev/grid/node-x1-y4 91T 68T 23T 74% +/dev/grid/node-x1-y5 94T 68T 26T 72% +/dev/grid/node-x1-y6 94T 64T 30T 68% +/dev/grid/node-x1-y7 86T 73T 13T 84% +/dev/grid/node-x1-y8 87T 72T 15T 82% +/dev/grid/node-x1-y9 85T 64T 21T 75% +/dev/grid/node-x1-y10 87T 71T 16T 81% +/dev/grid/node-x1-y11 88T 67T 21T 76% +/dev/grid/node-x1-y12 85T 65T 20T 76% +/dev/grid/node-x1-y13 85T 73T 12T 85% +/dev/grid/node-x1-y14 85T 68T 17T 80% +/dev/grid/node-x1-y15 93T 68T 25T 73% +/dev/grid/node-x1-y16 89T 64T 25T 71% +/dev/grid/node-x1-y17 90T 71T 19T 78% +/dev/grid/node-x1-y18 87T 65T 22T 74% +/dev/grid/node-x1-y19 94T 72T 22T 76% +/dev/grid/node-x1-y20 86T 65T 21T 75% +/dev/grid/node-x1-y21 92T 69T 23T 75% +/dev/grid/node-x1-y22 87T 69T 18T 79% +/dev/grid/node-x1-y23 86T 68T 18T 79% +/dev/grid/node-x1-y24 91T 64T 27T 70% +/dev/grid/node-x1-y25 85T 73T 12T 85% +/dev/grid/node-x1-y26 89T 68T 21T 76% +/dev/grid/node-x1-y27 91T 70T 21T 76% +/dev/grid/node-x2-y0 94T 73T 21T 77% +/dev/grid/node-x2-y1 93T 67T 26T 72% +/dev/grid/node-x2-y2 87T 69T 18T 79% +/dev/grid/node-x2-y3 86T 66T 20T 76% +/dev/grid/node-x2-y4 94T 68T 26T 72% +/dev/grid/node-x2-y5 93T 64T 29T 68% +/dev/grid/node-x2-y6 89T 66T 23T 74% +/dev/grid/node-x2-y7 86T 64T 22T 74% +/dev/grid/node-x2-y8 90T 64T 26T 71% +/dev/grid/node-x2-y9 86T 67T 19T 77% +/dev/grid/node-x2-y10 87T 71T 16T 81% +/dev/grid/node-x2-y11 85T 70T 15T 82% +/dev/grid/node-x2-y12 93T 68T 25T 73% +/dev/grid/node-x2-y13 88T 64T 24T 72% +/dev/grid/node-x2-y14 87T 64T 23T 73% +/dev/grid/node-x2-y15 91T 68T 23T 74% +/dev/grid/node-x2-y16 94T 67T 27T 71% +/dev/grid/node-x2-y17 90T 73T 17T 81% +/dev/grid/node-x2-y18 93T 68T 25T 73% +/dev/grid/node-x2-y19 90T 71T 19T 78% +/dev/grid/node-x2-y20 94T 73T 21T 77% +/dev/grid/node-x2-y21 93T 65T 28T 69% +/dev/grid/node-x2-y22 94T 64T 30T 68% +/dev/grid/node-x2-y23 93T 65T 28T 69% +/dev/grid/node-x2-y24 89T 72T 17T 80% +/dev/grid/node-x2-y25 87T 64T 23T 73% +/dev/grid/node-x2-y26 85T 69T 16T 81% +/dev/grid/node-x2-y27 87T 73T 14T 83% +/dev/grid/node-x3-y0 94T 65T 29T 69% +/dev/grid/node-x3-y1 87T 71T 16T 81% +/dev/grid/node-x3-y2 91T 64T 27T 70% +/dev/grid/node-x3-y3 94T 69T 25T 73% +/dev/grid/node-x3-y4 90T 73T 17T 81% +/dev/grid/node-x3-y5 94T 66T 28T 70% +/dev/grid/node-x3-y6 85T 72T 13T 84% +/dev/grid/node-x3-y7 87T 66T 21T 75% +/dev/grid/node-x3-y8 89T 72T 17T 80% +/dev/grid/node-x3-y9 94T 73T 21T 77% +/dev/grid/node-x3-y10 88T 67T 21T 76% +/dev/grid/node-x3-y11 86T 67T 19T 77% +/dev/grid/node-x3-y12 86T 67T 19T 77% +/dev/grid/node-x3-y13 87T 68T 19T 78% +/dev/grid/node-x3-y14 91T 68T 23T 74% +/dev/grid/node-x3-y15 92T 68T 24T 73% +/dev/grid/node-x3-y16 87T 66T 21T 75% +/dev/grid/node-x3-y17 94T 65T 29T 69% +/dev/grid/node-x3-y18 90T 66T 24T 73% +/dev/grid/node-x3-y19 87T 71T 16T 81% +/dev/grid/node-x3-y20 86T 73T 13T 84% +/dev/grid/node-x3-y21 93T 65T 28T 69% +/dev/grid/node-x3-y22 85T 64T 21T 75% +/dev/grid/node-x3-y23 89T 73T 16T 82% +/dev/grid/node-x3-y24 88T 67T 21T 76% +/dev/grid/node-x3-y25 90T 72T 18T 80% +/dev/grid/node-x3-y26 92T 69T 23T 75% +/dev/grid/node-x3-y27 87T 70T 17T 80% +/dev/grid/node-x4-y0 86T 69T 17T 80% +/dev/grid/node-x4-y1 92T 72T 20T 78% +/dev/grid/node-x4-y2 94T 64T 30T 68% +/dev/grid/node-x4-y3 85T 64T 21T 75% +/dev/grid/node-x4-y4 92T 68T 24T 73% +/dev/grid/node-x4-y5 93T 65T 28T 69% +/dev/grid/node-x4-y6 94T 66T 28T 70% +/dev/grid/node-x4-y7 90T 69T 21T 76% +/dev/grid/node-x4-y8 90T 72T 18T 80% +/dev/grid/node-x4-y9 88T 72T 16T 81% +/dev/grid/node-x4-y10 89T 73T 16T 82% +/dev/grid/node-x4-y11 85T 64T 21T 75% +/dev/grid/node-x4-y12 85T 65T 20T 76% +/dev/grid/node-x4-y13 92T 68T 24T 73% +/dev/grid/node-x4-y14 94T 70T 24T 74% +/dev/grid/node-x4-y15 92T 69T 23T 75% +/dev/grid/node-x4-y16 91T 70T 21T 76% +/dev/grid/node-x4-y17 88T 69T 19T 78% +/dev/grid/node-x4-y18 92T 64T 28T 69% +/dev/grid/node-x4-y19 86T 72T 14T 83% +/dev/grid/node-x4-y20 89T 71T 18T 79% +/dev/grid/node-x4-y21 92T 64T 28T 69% +/dev/grid/node-x4-y22 91T 66T 25T 72% +/dev/grid/node-x4-y23 88T 65T 23T 73% +/dev/grid/node-x4-y24 94T 69T 25T 73% +/dev/grid/node-x4-y25 89T 70T 19T 78% +/dev/grid/node-x4-y26 88T 73T 15T 82% +/dev/grid/node-x4-y27 87T 64T 23T 73% +/dev/grid/node-x5-y0 92T 67T 25T 72% +/dev/grid/node-x5-y1 89T 68T 21T 76% +/dev/grid/node-x5-y2 89T 69T 20T 77% +/dev/grid/node-x5-y3 94T 69T 25T 73% +/dev/grid/node-x5-y4 85T 69T 16T 81% +/dev/grid/node-x5-y5 90T 66T 24T 73% +/dev/grid/node-x5-y6 94T 70T 24T 74% +/dev/grid/node-x5-y7 88T 65T 23T 73% +/dev/grid/node-x5-y8 91T 67T 24T 73% +/dev/grid/node-x5-y9 93T 66T 27T 70% +/dev/grid/node-x5-y10 91T 68T 23T 74% +/dev/grid/node-x5-y11 93T 73T 20T 78% +/dev/grid/node-x5-y12 93T 70T 23T 75% +/dev/grid/node-x5-y13 85T 70T 15T 82% +/dev/grid/node-x5-y14 86T 70T 16T 81% +/dev/grid/node-x5-y15 87T 71T 16T 81% +/dev/grid/node-x5-y16 88T 71T 17T 80% +/dev/grid/node-x5-y17 94T 66T 28T 70% +/dev/grid/node-x5-y18 93T 68T 25T 73% +/dev/grid/node-x5-y19 85T 67T 18T 78% +/dev/grid/node-x5-y20 85T 73T 12T 85% +/dev/grid/node-x5-y21 85T 67T 18T 78% +/dev/grid/node-x5-y22 90T 68T 22T 75% +/dev/grid/node-x5-y23 91T 72T 19T 79% +/dev/grid/node-x5-y24 87T 68T 19T 78% +/dev/grid/node-x5-y25 94T 72T 22T 76% +/dev/grid/node-x5-y26 86T 69T 17T 80% +/dev/grid/node-x5-y27 90T 73T 17T 81% +/dev/grid/node-x6-y0 93T 65T 28T 69% +/dev/grid/node-x6-y1 92T 70T 22T 76% +/dev/grid/node-x6-y2 86T 64T 22T 74% +/dev/grid/node-x6-y3 88T 73T 15T 82% +/dev/grid/node-x6-y4 92T 67T 25T 72% +/dev/grid/node-x6-y5 88T 71T 17T 80% +/dev/grid/node-x6-y6 94T 66T 28T 70% +/dev/grid/node-x6-y7 92T 64T 28T 69% +/dev/grid/node-x6-y8 92T 69T 23T 75% +/dev/grid/node-x6-y9 93T 68T 25T 73% +/dev/grid/node-x6-y10 88T 66T 22T 75% +/dev/grid/node-x6-y11 93T 66T 27T 70% +/dev/grid/node-x6-y12 90T 64T 26T 71% +/dev/grid/node-x6-y13 92T 68T 24T 73% +/dev/grid/node-x6-y14 87T 72T 15T 82% +/dev/grid/node-x6-y15 89T 69T 20T 77% +/dev/grid/node-x6-y16 92T 69T 23T 75% +/dev/grid/node-x6-y17 89T 73T 16T 82% +/dev/grid/node-x6-y18 85T 70T 15T 82% +/dev/grid/node-x6-y19 89T 65T 24T 73% +/dev/grid/node-x6-y20 85T 73T 12T 85% +/dev/grid/node-x6-y21 92T 65T 27T 70% +/dev/grid/node-x6-y22 85T 71T 14T 83% +/dev/grid/node-x6-y23 94T 69T 25T 73% +/dev/grid/node-x6-y24 93T 65T 28T 69% +/dev/grid/node-x6-y25 85T 73T 12T 85% +/dev/grid/node-x6-y26 92T 67T 25T 72% +/dev/grid/node-x6-y27 90T 69T 21T 76% +/dev/grid/node-x7-y0 92T 65T 27T 70% +/dev/grid/node-x7-y1 92T 68T 24T 73% +/dev/grid/node-x7-y2 90T 69T 21T 76% +/dev/grid/node-x7-y3 93T 68T 25T 73% +/dev/grid/node-x7-y4 93T 71T 22T 76% +/dev/grid/node-x7-y5 85T 71T 14T 83% +/dev/grid/node-x7-y6 85T 68T 17T 80% +/dev/grid/node-x7-y7 85T 64T 21T 75% +/dev/grid/node-x7-y8 85T 69T 16T 81% +/dev/grid/node-x7-y9 94T 68T 26T 72% +/dev/grid/node-x7-y10 89T 66T 23T 74% +/dev/grid/node-x7-y11 93T 70T 23T 75% +/dev/grid/node-x7-y12 85T 72T 13T 84% +/dev/grid/node-x7-y13 87T 70T 17T 80% +/dev/grid/node-x7-y14 86T 72T 14T 83% +/dev/grid/node-x7-y15 90T 72T 18T 80% +/dev/grid/node-x7-y16 87T 67T 20T 77% +/dev/grid/node-x7-y17 87T 66T 21T 75% +/dev/grid/node-x7-y18 90T 72T 18T 80% +/dev/grid/node-x7-y19 91T 73T 18T 80% +/dev/grid/node-x7-y20 88T 73T 15T 82% +/dev/grid/node-x7-y21 88T 69T 19T 78% +/dev/grid/node-x7-y22 90T 69T 21T 76% +/dev/grid/node-x7-y23 89T 73T 16T 82% +/dev/grid/node-x7-y24 87T 72T 15T 82% +/dev/grid/node-x7-y25 85T 71T 14T 83% +/dev/grid/node-x7-y26 94T 71T 23T 75% +/dev/grid/node-x7-y27 94T 70T 24T 74% +/dev/grid/node-x8-y0 86T 65T 21T 75% +/dev/grid/node-x8-y1 89T 72T 17T 80% +/dev/grid/node-x8-y2 86T 72T 14T 83% +/dev/grid/node-x8-y3 85T 66T 19T 77% +/dev/grid/node-x8-y4 88T 69T 19T 78% +/dev/grid/node-x8-y5 94T 73T 21T 77% +/dev/grid/node-x8-y6 92T 67T 25T 72% +/dev/grid/node-x8-y7 88T 66T 22T 75% +/dev/grid/node-x8-y8 88T 70T 18T 79% +/dev/grid/node-x8-y9 87T 69T 18T 79% +/dev/grid/node-x8-y10 86T 66T 20T 76% +/dev/grid/node-x8-y11 88T 65T 23T 73% +/dev/grid/node-x8-y12 89T 70T 19T 78% +/dev/grid/node-x8-y13 90T 71T 19T 78% +/dev/grid/node-x8-y14 92T 64T 28T 69% +/dev/grid/node-x8-y15 93T 71T 22T 76% +/dev/grid/node-x8-y16 87T 66T 21T 75% +/dev/grid/node-x8-y17 91T 73T 18T 80% +/dev/grid/node-x8-y18 94T 67T 27T 71% +/dev/grid/node-x8-y19 87T 73T 14T 83% +/dev/grid/node-x8-y20 90T 67T 23T 74% +/dev/grid/node-x8-y21 91T 65T 26T 71% +/dev/grid/node-x8-y22 90T 70T 20T 77% +/dev/grid/node-x8-y23 92T 70T 22T 76% +/dev/grid/node-x8-y24 85T 71T 14T 83% +/dev/grid/node-x8-y25 94T 69T 25T 73% +/dev/grid/node-x8-y26 90T 67T 23T 74% +/dev/grid/node-x8-y27 90T 66T 24T 73% +/dev/grid/node-x9-y0 89T 65T 24T 73% +/dev/grid/node-x9-y1 88T 64T 24T 72% +/dev/grid/node-x9-y2 92T 67T 25T 72% +/dev/grid/node-x9-y3 87T 71T 16T 81% +/dev/grid/node-x9-y4 89T 69T 20T 77% +/dev/grid/node-x9-y5 92T 67T 25T 72% +/dev/grid/node-x9-y6 89T 71T 18T 79% +/dev/grid/node-x9-y7 88T 67T 21T 76% +/dev/grid/node-x9-y8 85T 70T 15T 82% +/dev/grid/node-x9-y9 89T 71T 18T 79% +/dev/grid/node-x9-y10 87T 71T 16T 81% +/dev/grid/node-x9-y11 89T 64T 25T 71% +/dev/grid/node-x9-y12 93T 66T 27T 70% +/dev/grid/node-x9-y13 93T 70T 23T 75% +/dev/grid/node-x9-y14 87T 73T 14T 83% +/dev/grid/node-x9-y15 88T 71T 17T 80% +/dev/grid/node-x9-y16 91T 66T 25T 72% +/dev/grid/node-x9-y17 93T 69T 24T 74% +/dev/grid/node-x9-y18 89T 70T 19T 78% +/dev/grid/node-x9-y19 86T 69T 17T 80% +/dev/grid/node-x9-y20 85T 66T 19T 77% +/dev/grid/node-x9-y21 88T 68T 20T 77% +/dev/grid/node-x9-y22 93T 73T 20T 78% +/dev/grid/node-x9-y23 91T 73T 18T 80% +/dev/grid/node-x9-y24 86T 64T 22T 74% +/dev/grid/node-x9-y25 90T 64T 26T 71% +/dev/grid/node-x9-y26 88T 72T 16T 81% +/dev/grid/node-x9-y27 91T 69T 22T 75% +/dev/grid/node-x10-y0 89T 71T 18T 79% +/dev/grid/node-x10-y1 88T 67T 21T 76% +/dev/grid/node-x10-y2 89T 70T 19T 78% +/dev/grid/node-x10-y3 85T 65T 20T 76% +/dev/grid/node-x10-y4 87T 67T 20T 77% +/dev/grid/node-x10-y5 92T 69T 23T 75% +/dev/grid/node-x10-y6 85T 73T 12T 85% +/dev/grid/node-x10-y7 90T 72T 18T 80% +/dev/grid/node-x10-y8 90T 66T 24T 73% +/dev/grid/node-x10-y9 92T 68T 24T 73% +/dev/grid/node-x10-y10 86T 67T 19T 77% +/dev/grid/node-x10-y11 88T 71T 17T 80% +/dev/grid/node-x10-y12 93T 69T 24T 74% +/dev/grid/node-x10-y13 89T 71T 18T 79% +/dev/grid/node-x10-y14 94T 67T 27T 71% +/dev/grid/node-x10-y15 86T 65T 21T 75% +/dev/grid/node-x10-y16 89T 73T 16T 82% +/dev/grid/node-x10-y17 91T 73T 18T 80% +/dev/grid/node-x10-y18 85T 70T 15T 82% +/dev/grid/node-x10-y19 92T 69T 23T 75% +/dev/grid/node-x10-y20 91T 73T 18T 80% +/dev/grid/node-x10-y21 91T 65T 26T 71% +/dev/grid/node-x10-y22 91T 72T 19T 79% +/dev/grid/node-x10-y23 92T 71T 21T 77% +/dev/grid/node-x10-y24 90T 71T 19T 78% +/dev/grid/node-x10-y25 87T 66T 21T 75% +/dev/grid/node-x10-y26 89T 66T 23T 74% +/dev/grid/node-x10-y27 93T 72T 21T 77% +/dev/grid/node-x11-y0 86T 69T 17T 80% +/dev/grid/node-x11-y1 87T 64T 23T 73% +/dev/grid/node-x11-y2 89T 71T 18T 79% +/dev/grid/node-x11-y3 88T 66T 22T 75% +/dev/grid/node-x11-y4 92T 65T 27T 70% +/dev/grid/node-x11-y5 88T 70T 18T 79% +/dev/grid/node-x11-y6 94T 64T 30T 68% +/dev/grid/node-x11-y7 94T 70T 24T 74% +/dev/grid/node-x11-y8 92T 65T 27T 70% +/dev/grid/node-x11-y9 90T 70T 20T 77% +/dev/grid/node-x11-y10 89T 69T 20T 77% +/dev/grid/node-x11-y11 89T 65T 24T 73% +/dev/grid/node-x11-y12 88T 69T 19T 78% +/dev/grid/node-x11-y13 85T 73T 12T 85% +/dev/grid/node-x11-y14 93T 72T 21T 77% +/dev/grid/node-x11-y15 91T 71T 20T 78% +/dev/grid/node-x11-y16 89T 73T 16T 82% +/dev/grid/node-x11-y17 92T 66T 26T 71% +/dev/grid/node-x11-y18 88T 68T 20T 77% +/dev/grid/node-x11-y19 92T 67T 25T 72% +/dev/grid/node-x11-y20 86T 72T 14T 83% +/dev/grid/node-x11-y21 92T 68T 24T 73% +/dev/grid/node-x11-y22 94T 71T 23T 75% +/dev/grid/node-x11-y23 85T 72T 13T 84% +/dev/grid/node-x11-y24 86T 68T 18T 79% +/dev/grid/node-x11-y25 88T 65T 23T 73% +/dev/grid/node-x11-y26 86T 64T 22T 74% +/dev/grid/node-x11-y27 87T 70T 17T 80% +/dev/grid/node-x12-y0 91T 73T 18T 80% +/dev/grid/node-x12-y1 86T 73T 13T 84% +/dev/grid/node-x12-y2 87T 65T 22T 74% +/dev/grid/node-x12-y3 85T 68T 17T 80% +/dev/grid/node-x12-y4 85T 68T 17T 80% +/dev/grid/node-x12-y5 89T 69T 20T 77% +/dev/grid/node-x12-y6 88T 67T 21T 76% +/dev/grid/node-x12-y7 93T 64T 29T 68% +/dev/grid/node-x12-y8 85T 67T 18T 78% +/dev/grid/node-x12-y9 92T 70T 22T 76% +/dev/grid/node-x12-y10 89T 68T 21T 76% +/dev/grid/node-x12-y11 91T 73T 18T 80% +/dev/grid/node-x12-y12 94T 66T 28T 70% +/dev/grid/node-x12-y13 85T 65T 20T 76% +/dev/grid/node-x12-y14 85T 67T 18T 78% +/dev/grid/node-x12-y15 85T 71T 14T 83% +/dev/grid/node-x12-y16 93T 69T 24T 74% +/dev/grid/node-x12-y17 94T 71T 23T 75% +/dev/grid/node-x12-y18 89T 73T 16T 82% +/dev/grid/node-x12-y19 93T 73T 20T 78% +/dev/grid/node-x12-y20 88T 67T 21T 76% +/dev/grid/node-x12-y21 87T 64T 23T 73% +/dev/grid/node-x12-y22 85T 73T 12T 85% +/dev/grid/node-x12-y23 93T 71T 22T 76% +/dev/grid/node-x12-y24 89T 67T 22T 75% +/dev/grid/node-x12-y25 93T 72T 21T 77% +/dev/grid/node-x12-y26 88T 68T 20T 77% +/dev/grid/node-x12-y27 90T 71T 19T 78% +/dev/grid/node-x13-y0 92T 64T 28T 69% +/dev/grid/node-x13-y1 90T 70T 20T 77% +/dev/grid/node-x13-y2 89T 64T 25T 71% +/dev/grid/node-x13-y3 93T 68T 25T 73% +/dev/grid/node-x13-y4 86T 65T 21T 75% +/dev/grid/node-x13-y5 91T 66T 25T 72% +/dev/grid/node-x13-y6 88T 71T 17T 80% +/dev/grid/node-x13-y7 85T 67T 18T 78% +/dev/grid/node-x13-y8 87T 64T 23T 73% +/dev/grid/node-x13-y9 94T 68T 26T 72% +/dev/grid/node-x13-y10 93T 73T 20T 78% +/dev/grid/node-x13-y11 91T 72T 19T 79% +/dev/grid/node-x13-y12 92T 68T 24T 73% +/dev/grid/node-x13-y13 87T 72T 15T 82% +/dev/grid/node-x13-y14 94T 73T 21T 77% +/dev/grid/node-x13-y15 88T 70T 18T 79% +/dev/grid/node-x13-y16 91T 69T 22T 75% +/dev/grid/node-x13-y17 85T 73T 12T 85% +/dev/grid/node-x13-y18 87T 73T 14T 83% +/dev/grid/node-x13-y19 507T 498T 9T 98% +/dev/grid/node-x13-y20 87T 70T 17T 80% +/dev/grid/node-x13-y21 86T 69T 17T 80% +/dev/grid/node-x13-y22 91T 73T 18T 80% +/dev/grid/node-x13-y23 94T 69T 25T 73% +/dev/grid/node-x13-y24 93T 68T 25T 73% +/dev/grid/node-x13-y25 88T 64T 24T 72% +/dev/grid/node-x13-y26 87T 68T 19T 78% +/dev/grid/node-x13-y27 86T 71T 15T 82% +/dev/grid/node-x14-y0 91T 73T 18T 80% +/dev/grid/node-x14-y1 88T 68T 20T 77% +/dev/grid/node-x14-y2 88T 70T 18T 79% +/dev/grid/node-x14-y3 85T 70T 15T 82% +/dev/grid/node-x14-y4 87T 69T 18T 79% +/dev/grid/node-x14-y5 88T 70T 18T 79% +/dev/grid/node-x14-y6 86T 67T 19T 77% +/dev/grid/node-x14-y7 86T 72T 14T 83% +/dev/grid/node-x14-y8 85T 66T 19T 77% +/dev/grid/node-x14-y9 91T 69T 22T 75% +/dev/grid/node-x14-y10 93T 68T 25T 73% +/dev/grid/node-x14-y11 92T 64T 28T 69% +/dev/grid/node-x14-y12 89T 64T 25T 71% +/dev/grid/node-x14-y13 90T 70T 20T 77% +/dev/grid/node-x14-y14 86T 66T 20T 76% +/dev/grid/node-x14-y15 92T 68T 24T 73% +/dev/grid/node-x14-y16 93T 65T 28T 69% +/dev/grid/node-x14-y17 88T 64T 24T 72% +/dev/grid/node-x14-y18 86T 68T 18T 79% +/dev/grid/node-x14-y19 505T 496T 9T 98% +/dev/grid/node-x14-y20 87T 70T 17T 80% +/dev/grid/node-x14-y21 93T 67T 26T 72% +/dev/grid/node-x14-y22 91T 70T 21T 76% +/dev/grid/node-x14-y23 93T 71T 22T 76% +/dev/grid/node-x14-y24 86T 71T 15T 82% +/dev/grid/node-x14-y25 85T 64T 21T 75% +/dev/grid/node-x14-y26 91T 71T 20T 78% +/dev/grid/node-x14-y27 88T 67T 21T 76% +/dev/grid/node-x15-y0 93T 69T 24T 74% +/dev/grid/node-x15-y1 91T 70T 21T 76% +/dev/grid/node-x15-y2 90T 72T 18T 80% +/dev/grid/node-x15-y3 87T 70T 17T 80% +/dev/grid/node-x15-y4 91T 69T 22T 75% +/dev/grid/node-x15-y5 87T 64T 23T 73% +/dev/grid/node-x15-y6 85T 67T 18T 78% +/dev/grid/node-x15-y7 94T 73T 21T 77% +/dev/grid/node-x15-y8 89T 71T 18T 79% +/dev/grid/node-x15-y9 94T 65T 29T 69% +/dev/grid/node-x15-y10 93T 73T 20T 78% +/dev/grid/node-x15-y11 87T 72T 15T 82% +/dev/grid/node-x15-y12 87T 69T 18T 79% +/dev/grid/node-x15-y13 93T 64T 29T 68% +/dev/grid/node-x15-y14 92T 64T 28T 69% +/dev/grid/node-x15-y15 86T 65T 21T 75% +/dev/grid/node-x15-y16 85T 65T 20T 76% +/dev/grid/node-x15-y17 93T 68T 25T 73% +/dev/grid/node-x15-y18 89T 73T 16T 82% +/dev/grid/node-x15-y19 505T 494T 11T 97% +/dev/grid/node-x15-y20 85T 72T 13T 84% +/dev/grid/node-x15-y21 93T 73T 20T 78% +/dev/grid/node-x15-y22 86T 72T 14T 83% +/dev/grid/node-x15-y23 85T 71T 14T 83% +/dev/grid/node-x15-y24 86T 65T 21T 75% +/dev/grid/node-x15-y25 85T 64T 21T 75% +/dev/grid/node-x15-y26 93T 72T 21T 77% +/dev/grid/node-x15-y27 87T 65T 22T 74% +/dev/grid/node-x16-y0 91T 68T 23T 74% +/dev/grid/node-x16-y1 87T 70T 17T 80% +/dev/grid/node-x16-y2 92T 73T 19T 79% +/dev/grid/node-x16-y3 88T 71T 17T 80% +/dev/grid/node-x16-y4 85T 65T 20T 76% +/dev/grid/node-x16-y5 91T 70T 21T 76% +/dev/grid/node-x16-y6 88T 67T 21T 76% +/dev/grid/node-x16-y7 94T 69T 25T 73% +/dev/grid/node-x16-y8 92T 64T 28T 69% +/dev/grid/node-x16-y9 88T 72T 16T 81% +/dev/grid/node-x16-y10 88T 70T 18T 79% +/dev/grid/node-x16-y11 89T 67T 22T 75% +/dev/grid/node-x16-y12 93T 65T 28T 69% +/dev/grid/node-x16-y13 87T 64T 23T 73% +/dev/grid/node-x16-y14 93T 68T 25T 73% +/dev/grid/node-x16-y15 90T 73T 17T 81% +/dev/grid/node-x16-y16 94T 71T 23T 75% +/dev/grid/node-x16-y17 85T 66T 19T 77% +/dev/grid/node-x16-y18 89T 69T 20T 77% +/dev/grid/node-x16-y19 502T 490T 12T 97% +/dev/grid/node-x16-y20 92T 69T 23T 75% +/dev/grid/node-x16-y21 86T 67T 19T 77% +/dev/grid/node-x16-y22 90T 64T 26T 71% +/dev/grid/node-x16-y23 90T 66T 24T 73% +/dev/grid/node-x16-y24 94T 65T 29T 69% +/dev/grid/node-x16-y25 89T 64T 25T 71% +/dev/grid/node-x16-y26 92T 72T 20T 78% +/dev/grid/node-x16-y27 85T 65T 20T 76% +/dev/grid/node-x17-y0 93T 68T 25T 73% +/dev/grid/node-x17-y1 87T 64T 23T 73% +/dev/grid/node-x17-y2 88T 66T 22T 75% +/dev/grid/node-x17-y3 90T 65T 25T 72% +/dev/grid/node-x17-y4 90T 65T 25T 72% +/dev/grid/node-x17-y5 87T 66T 21T 75% +/dev/grid/node-x17-y6 92T 65T 27T 70% +/dev/grid/node-x17-y7 93T 70T 23T 75% +/dev/grid/node-x17-y8 91T 72T 19T 79% +/dev/grid/node-x17-y9 88T 69T 19T 78% +/dev/grid/node-x17-y10 86T 68T 18T 79% +/dev/grid/node-x17-y11 90T 68T 22T 75% +/dev/grid/node-x17-y12 86T 69T 17T 80% +/dev/grid/node-x17-y13 90T 70T 20T 77% +/dev/grid/node-x17-y14 91T 66T 25T 72% +/dev/grid/node-x17-y15 87T 72T 15T 82% +/dev/grid/node-x17-y16 94T 64T 30T 68% +/dev/grid/node-x17-y17 94T 70T 24T 74% +/dev/grid/node-x17-y18 89T 68T 21T 76% +/dev/grid/node-x17-y19 501T 491T 10T 98% +/dev/grid/node-x17-y20 85T 66T 19T 77% +/dev/grid/node-x17-y21 92T 64T 28T 69% +/dev/grid/node-x17-y22 94T 67T 27T 71% +/dev/grid/node-x17-y23 90T 64T 26T 71% +/dev/grid/node-x17-y24 90T 66T 24T 73% +/dev/grid/node-x17-y25 92T 68T 24T 73% +/dev/grid/node-x17-y26 92T 73T 19T 79% +/dev/grid/node-x17-y27 88T 66T 22T 75% +/dev/grid/node-x18-y0 93T 64T 29T 68% +/dev/grid/node-x18-y1 94T 64T 30T 68% +/dev/grid/node-x18-y2 92T 70T 22T 76% +/dev/grid/node-x18-y3 86T 70T 16T 81% +/dev/grid/node-x18-y4 91T 64T 27T 70% +/dev/grid/node-x18-y5 89T 65T 24T 73% +/dev/grid/node-x18-y6 85T 71T 14T 83% +/dev/grid/node-x18-y7 89T 64T 25T 71% +/dev/grid/node-x18-y8 89T 67T 22T 75% +/dev/grid/node-x18-y9 94T 72T 22T 76% +/dev/grid/node-x18-y10 89T 73T 16T 82% +/dev/grid/node-x18-y11 90T 67T 23T 74% +/dev/grid/node-x18-y12 91T 70T 21T 76% +/dev/grid/node-x18-y13 90T 67T 23T 74% +/dev/grid/node-x18-y14 93T 73T 20T 78% +/dev/grid/node-x18-y15 88T 71T 17T 80% +/dev/grid/node-x18-y16 94T 70T 24T 74% +/dev/grid/node-x18-y17 89T 64T 25T 71% +/dev/grid/node-x18-y18 89T 66T 23T 74% +/dev/grid/node-x18-y19 502T 495T 7T 98% +/dev/grid/node-x18-y20 88T 69T 19T 78% +/dev/grid/node-x18-y21 93T 72T 21T 77% +/dev/grid/node-x18-y22 90T 71T 19T 78% +/dev/grid/node-x18-y23 90T 72T 18T 80% +/dev/grid/node-x18-y24 85T 67T 18T 78% +/dev/grid/node-x18-y25 87T 65T 22T 74% +/dev/grid/node-x18-y26 87T 72T 15T 82% +/dev/grid/node-x18-y27 93T 64T 29T 68% +/dev/grid/node-x19-y0 94T 73T 21T 77% +/dev/grid/node-x19-y1 93T 68T 25T 73% +/dev/grid/node-x19-y2 91T 67T 24T 73% +/dev/grid/node-x19-y3 91T 73T 18T 80% +/dev/grid/node-x19-y4 94T 70T 24T 74% +/dev/grid/node-x19-y5 87T 67T 20T 77% +/dev/grid/node-x19-y6 91T 64T 27T 70% +/dev/grid/node-x19-y7 88T 68T 20T 77% +/dev/grid/node-x19-y8 86T 72T 14T 83% +/dev/grid/node-x19-y9 86T 66T 20T 76% +/dev/grid/node-x19-y10 92T 71T 21T 77% +/dev/grid/node-x19-y11 93T 69T 24T 74% +/dev/grid/node-x19-y12 93T 73T 20T 78% +/dev/grid/node-x19-y13 93T 66T 27T 70% +/dev/grid/node-x19-y14 92T 72T 20T 78% +/dev/grid/node-x19-y15 92T 70T 22T 76% +/dev/grid/node-x19-y16 86T 73T 13T 84% +/dev/grid/node-x19-y17 85T 65T 20T 76% +/dev/grid/node-x19-y18 85T 68T 17T 80% +/dev/grid/node-x19-y19 508T 493T 15T 97% +/dev/grid/node-x19-y20 88T 69T 19T 78% +/dev/grid/node-x19-y21 94T 65T 29T 69% +/dev/grid/node-x19-y22 89T 68T 21T 76% +/dev/grid/node-x19-y23 89T 65T 24T 73% +/dev/grid/node-x19-y24 89T 64T 25T 71% +/dev/grid/node-x19-y25 85T 73T 12T 85% +/dev/grid/node-x19-y26 94T 69T 25T 73% +/dev/grid/node-x19-y27 92T 68T 24T 73% +/dev/grid/node-x20-y0 94T 67T 27T 71% +/dev/grid/node-x20-y1 87T 68T 19T 78% +/dev/grid/node-x20-y2 85T 68T 17T 80% +/dev/grid/node-x20-y3 92T 73T 19T 79% +/dev/grid/node-x20-y4 88T 73T 15T 82% +/dev/grid/node-x20-y5 94T 64T 30T 68% +/dev/grid/node-x20-y6 85T 65T 20T 76% +/dev/grid/node-x20-y7 89T 67T 22T 75% +/dev/grid/node-x20-y8 91T 69T 22T 75% +/dev/grid/node-x20-y9 94T 64T 30T 68% +/dev/grid/node-x20-y10 90T 72T 18T 80% +/dev/grid/node-x20-y11 94T 73T 21T 77% +/dev/grid/node-x20-y12 86T 69T 17T 80% +/dev/grid/node-x20-y13 86T 66T 20T 76% +/dev/grid/node-x20-y14 92T 73T 19T 79% +/dev/grid/node-x20-y15 87T 65T 22T 74% +/dev/grid/node-x20-y16 88T 72T 16T 81% +/dev/grid/node-x20-y17 88T 68T 20T 77% +/dev/grid/node-x20-y18 85T 65T 20T 76% +/dev/grid/node-x20-y19 503T 499T 4T 99% +/dev/grid/node-x20-y20 93T 70T 23T 75% +/dev/grid/node-x20-y21 89T 73T 16T 82% +/dev/grid/node-x20-y22 93T 73T 20T 78% +/dev/grid/node-x20-y23 87T 64T 23T 73% +/dev/grid/node-x20-y24 86T 67T 19T 77% +/dev/grid/node-x20-y25 93T 71T 22T 76% +/dev/grid/node-x20-y26 89T 65T 24T 73% +/dev/grid/node-x20-y27 89T 66T 23T 74% +/dev/grid/node-x21-y0 91T 64T 27T 70% +/dev/grid/node-x21-y1 87T 69T 18T 79% +/dev/grid/node-x21-y2 91T 70T 21T 76% +/dev/grid/node-x21-y3 92T 72T 20T 78% +/dev/grid/node-x21-y4 91T 68T 23T 74% +/dev/grid/node-x21-y5 85T 72T 13T 84% +/dev/grid/node-x21-y6 87T 72T 15T 82% +/dev/grid/node-x21-y7 92T 69T 23T 75% +/dev/grid/node-x21-y8 90T 71T 19T 78% +/dev/grid/node-x21-y9 85T 67T 18T 78% +/dev/grid/node-x21-y10 85T 65T 20T 76% +/dev/grid/node-x21-y11 94T 69T 25T 73% +/dev/grid/node-x21-y12 86T 67T 19T 77% +/dev/grid/node-x21-y13 94T 68T 26T 72% +/dev/grid/node-x21-y14 88T 64T 24T 72% +/dev/grid/node-x21-y15 91T 64T 27T 70% +/dev/grid/node-x21-y16 90T 71T 19T 78% +/dev/grid/node-x21-y17 87T 66T 21T 75% +/dev/grid/node-x21-y18 89T 72T 17T 80% +/dev/grid/node-x21-y19 504T 490T 14T 97% +/dev/grid/node-x21-y20 85T 65T 20T 76% +/dev/grid/node-x21-y21 86T 66T 20T 76% +/dev/grid/node-x21-y22 89T 72T 17T 80% +/dev/grid/node-x21-y23 94T 65T 29T 69% +/dev/grid/node-x21-y24 89T 69T 20T 77% +/dev/grid/node-x21-y25 91T 69T 22T 75% +/dev/grid/node-x21-y26 92T 69T 23T 75% +/dev/grid/node-x21-y27 94T 69T 25T 73% +/dev/grid/node-x22-y0 91T 73T 18T 80% +/dev/grid/node-x22-y1 91T 64T 27T 70% +/dev/grid/node-x22-y2 85T 64T 21T 75% +/dev/grid/node-x22-y3 85T 69T 16T 81% +/dev/grid/node-x22-y4 92T 64T 28T 69% +/dev/grid/node-x22-y5 86T 69T 17T 80% +/dev/grid/node-x22-y6 94T 70T 24T 74% +/dev/grid/node-x22-y7 91T 72T 19T 79% +/dev/grid/node-x22-y8 87T 70T 17T 80% +/dev/grid/node-x22-y9 90T 69T 21T 76% +/dev/grid/node-x22-y10 90T 64T 26T 71% +/dev/grid/node-x22-y11 85T 67T 18T 78% +/dev/grid/node-x22-y12 86T 72T 14T 83% +/dev/grid/node-x22-y13 85T 71T 14T 83% +/dev/grid/node-x22-y14 93T 70T 23T 75% +/dev/grid/node-x22-y15 92T 69T 23T 75% +/dev/grid/node-x22-y16 87T 69T 18T 79% +/dev/grid/node-x22-y17 91T 71T 20T 78% +/dev/grid/node-x22-y18 85T 66T 19T 77% +/dev/grid/node-x22-y19 507T 493T 14T 97% +/dev/grid/node-x22-y20 90T 69T 21T 76% +/dev/grid/node-x22-y21 91T 71T 20T 78% +/dev/grid/node-x22-y22 85T 66T 19T 77% +/dev/grid/node-x22-y23 87T 69T 18T 79% +/dev/grid/node-x22-y24 94T 66T 28T 70% +/dev/grid/node-x22-y25 87T 65T 22T 74% +/dev/grid/node-x22-y26 91T 66T 25T 72% +/dev/grid/node-x22-y27 92T 73T 19T 79% +/dev/grid/node-x23-y0 91T 65T 26T 71% +/dev/grid/node-x23-y1 88T 70T 18T 79% +/dev/grid/node-x23-y2 90T 66T 24T 73% +/dev/grid/node-x23-y3 85T 65T 20T 76% +/dev/grid/node-x23-y4 85T 70T 15T 82% +/dev/grid/node-x23-y5 90T 67T 23T 74% +/dev/grid/node-x23-y6 89T 72T 17T 80% +/dev/grid/node-x23-y7 92T 68T 24T 73% +/dev/grid/node-x23-y8 85T 71T 14T 83% +/dev/grid/node-x23-y9 85T 64T 21T 75% +/dev/grid/node-x23-y10 93T 66T 27T 70% +/dev/grid/node-x23-y11 92T 73T 19T 79% +/dev/grid/node-x23-y12 87T 69T 18T 79% +/dev/grid/node-x23-y13 91T 64T 27T 70% +/dev/grid/node-x23-y14 87T 68T 19T 78% +/dev/grid/node-x23-y15 91T 65T 26T 71% +/dev/grid/node-x23-y16 86T 70T 16T 81% +/dev/grid/node-x23-y17 88T 70T 18T 79% +/dev/grid/node-x23-y18 87T 70T 17T 80% +/dev/grid/node-x23-y19 503T 495T 8T 98% +/dev/grid/node-x23-y20 89T 69T 20T 77% +/dev/grid/node-x23-y21 91T 68T 23T 74% +/dev/grid/node-x23-y22 92T 64T 28T 69% +/dev/grid/node-x23-y23 87T 73T 14T 83% +/dev/grid/node-x23-y24 89T 69T 20T 77% +/dev/grid/node-x23-y25 86T 64T 22T 74% +/dev/grid/node-x23-y26 89T 67T 22T 75% +/dev/grid/node-x23-y27 91T 65T 26T 71% +/dev/grid/node-x24-y0 87T 65T 22T 74% +/dev/grid/node-x24-y1 89T 66T 23T 74% +/dev/grid/node-x24-y2 93T 68T 25T 73% +/dev/grid/node-x24-y3 93T 68T 25T 73% +/dev/grid/node-x24-y4 88T 65T 23T 73% +/dev/grid/node-x24-y5 87T 66T 21T 75% +/dev/grid/node-x24-y6 93T 70T 23T 75% +/dev/grid/node-x24-y7 93T 67T 26T 72% +/dev/grid/node-x24-y8 87T 71T 16T 81% +/dev/grid/node-x24-y9 86T 69T 17T 80% +/dev/grid/node-x24-y10 93T 64T 29T 68% +/dev/grid/node-x24-y11 85T 69T 16T 81% +/dev/grid/node-x24-y12 91T 69T 22T 75% +/dev/grid/node-x24-y13 86T 67T 19T 77% +/dev/grid/node-x24-y14 92T 69T 23T 75% +/dev/grid/node-x24-y15 88T 73T 15T 82% +/dev/grid/node-x24-y16 86T 67T 19T 77% +/dev/grid/node-x24-y17 92T 69T 23T 75% +/dev/grid/node-x24-y18 88T 70T 18T 79% +/dev/grid/node-x24-y19 505T 491T 14T 97% +/dev/grid/node-x24-y20 92T 73T 19T 79% +/dev/grid/node-x24-y21 86T 73T 13T 84% +/dev/grid/node-x24-y22 94T 67T 27T 71% +/dev/grid/node-x24-y23 86T 65T 21T 75% +/dev/grid/node-x24-y24 88T 72T 16T 81% +/dev/grid/node-x24-y25 86T 66T 20T 76% +/dev/grid/node-x24-y26 93T 65T 28T 69% +/dev/grid/node-x24-y27 89T 69T 20T 77% +/dev/grid/node-x25-y0 91T 72T 19T 79% +/dev/grid/node-x25-y1 89T 68T 21T 76% +/dev/grid/node-x25-y2 87T 66T 21T 75% +/dev/grid/node-x25-y3 85T 66T 19T 77% +/dev/grid/node-x25-y4 86T 67T 19T 77% +/dev/grid/node-x25-y5 89T 72T 17T 80% +/dev/grid/node-x25-y6 94T 66T 28T 70% +/dev/grid/node-x25-y7 87T 64T 23T 73% +/dev/grid/node-x25-y8 86T 66T 20T 76% +/dev/grid/node-x25-y9 87T 73T 14T 83% +/dev/grid/node-x25-y10 92T 72T 20T 78% +/dev/grid/node-x25-y11 94T 64T 30T 68% +/dev/grid/node-x25-y12 85T 68T 17T 80% +/dev/grid/node-x25-y13 87T 65T 22T 74% +/dev/grid/node-x25-y14 90T 72T 18T 80% +/dev/grid/node-x25-y15 91T 64T 27T 70% +/dev/grid/node-x25-y16 86T 65T 21T 75% +/dev/grid/node-x25-y17 92T 68T 24T 73% +/dev/grid/node-x25-y18 89T 71T 18T 79% +/dev/grid/node-x25-y19 508T 491T 17T 96% +/dev/grid/node-x25-y20 92T 64T 28T 69% +/dev/grid/node-x25-y21 86T 68T 18T 79% +/dev/grid/node-x25-y22 94T 70T 24T 74% +/dev/grid/node-x25-y23 90T 73T 17T 81% +/dev/grid/node-x25-y24 92T 72T 20T 78% +/dev/grid/node-x25-y25 90T 67T 23T 74% +/dev/grid/node-x25-y26 87T 70T 17T 80% +/dev/grid/node-x25-y27 94T 66T 28T 70% +/dev/grid/node-x26-y0 93T 72T 21T 77% +/dev/grid/node-x26-y1 88T 72T 16T 81% +/dev/grid/node-x26-y2 86T 64T 22T 74% +/dev/grid/node-x26-y3 90T 66T 24T 73% +/dev/grid/node-x26-y4 91T 66T 25T 72% +/dev/grid/node-x26-y5 93T 72T 21T 77% +/dev/grid/node-x26-y6 87T 64T 23T 73% +/dev/grid/node-x26-y7 85T 73T 12T 85% +/dev/grid/node-x26-y8 87T 71T 16T 81% +/dev/grid/node-x26-y9 90T 71T 19T 78% +/dev/grid/node-x26-y10 86T 66T 20T 76% +/dev/grid/node-x26-y11 88T 67T 21T 76% +/dev/grid/node-x26-y12 89T 70T 19T 78% +/dev/grid/node-x26-y13 88T 70T 18T 79% +/dev/grid/node-x26-y14 90T 69T 21T 76% +/dev/grid/node-x26-y15 87T 69T 18T 79% +/dev/grid/node-x26-y16 92T 64T 28T 69% +/dev/grid/node-x26-y17 93T 68T 25T 73% +/dev/grid/node-x26-y18 90T 67T 23T 74% +/dev/grid/node-x26-y19 501T 499T 2T 99% +/dev/grid/node-x26-y20 86T 69T 17T 80% +/dev/grid/node-x26-y21 88T 64T 24T 72% +/dev/grid/node-x26-y22 85T 68T 17T 80% +/dev/grid/node-x26-y23 86T 69T 17T 80% +/dev/grid/node-x26-y24 93T 69T 24T 74% +/dev/grid/node-x26-y25 90T 72T 18T 80% +/dev/grid/node-x26-y26 93T 71T 22T 76% +/dev/grid/node-x26-y27 85T 71T 14T 83% +/dev/grid/node-x27-y0 85T 73T 12T 85% +/dev/grid/node-x27-y1 89T 67T 22T 75% +/dev/grid/node-x27-y2 88T 72T 16T 81% +/dev/grid/node-x27-y3 88T 70T 18T 79% +/dev/grid/node-x27-y4 93T 65T 28T 69% +/dev/grid/node-x27-y5 93T 66T 27T 70% +/dev/grid/node-x27-y6 89T 69T 20T 77% +/dev/grid/node-x27-y7 94T 64T 30T 68% +/dev/grid/node-x27-y8 88T 64T 24T 72% +/dev/grid/node-x27-y9 89T 67T 22T 75% +/dev/grid/node-x27-y10 89T 72T 17T 80% +/dev/grid/node-x27-y11 94T 67T 27T 71% +/dev/grid/node-x27-y12 90T 68T 22T 75% +/dev/grid/node-x27-y13 86T 68T 18T 79% +/dev/grid/node-x27-y14 89T 69T 20T 77% +/dev/grid/node-x27-y15 86T 70T 16T 81% +/dev/grid/node-x27-y16 93T 70T 23T 75% +/dev/grid/node-x27-y17 90T 66T 24T 73% +/dev/grid/node-x27-y18 86T 65T 21T 75% +/dev/grid/node-x27-y19 502T 493T 9T 98% +/dev/grid/node-x27-y20 89T 69T 20T 77% +/dev/grid/node-x27-y21 94T 70T 24T 74% +/dev/grid/node-x27-y22 91T 70T 21T 76% +/dev/grid/node-x27-y23 86T 69T 17T 80% +/dev/grid/node-x27-y24 87T 66T 21T 75% +/dev/grid/node-x27-y25 85T 64T 21T 75% +/dev/grid/node-x27-y26 85T 65T 20T 76% +/dev/grid/node-x27-y27 91T 69T 22T 75% +/dev/grid/node-x28-y0 86T 67T 19T 77% +/dev/grid/node-x28-y1 93T 67T 26T 72% +/dev/grid/node-x28-y2 88T 67T 21T 76% +/dev/grid/node-x28-y3 87T 67T 20T 77% +/dev/grid/node-x28-y4 85T 65T 20T 76% +/dev/grid/node-x28-y5 91T 73T 18T 80% +/dev/grid/node-x28-y6 88T 66T 22T 75% +/dev/grid/node-x28-y7 86T 66T 20T 76% +/dev/grid/node-x28-y8 88T 68T 20T 77% +/dev/grid/node-x28-y9 91T 68T 23T 74% +/dev/grid/node-x28-y10 91T 66T 25T 72% +/dev/grid/node-x28-y11 85T 73T 12T 85% +/dev/grid/node-x28-y12 86T 71T 15T 82% +/dev/grid/node-x28-y13 85T 71T 14T 83% +/dev/grid/node-x28-y14 85T 64T 21T 75% +/dev/grid/node-x28-y15 92T 68T 24T 73% +/dev/grid/node-x28-y16 85T 73T 12T 85% +/dev/grid/node-x28-y17 87T 71T 16T 81% +/dev/grid/node-x28-y18 85T 68T 17T 80% +/dev/grid/node-x28-y19 504T 491T 13T 97% +/dev/grid/node-x28-y20 88T 71T 17T 80% +/dev/grid/node-x28-y21 92T 64T 28T 69% +/dev/grid/node-x28-y22 86T 69T 17T 80% +/dev/grid/node-x28-y23 85T 70T 15T 82% +/dev/grid/node-x28-y24 92T 71T 21T 77% +/dev/grid/node-x28-y25 86T 64T 22T 74% +/dev/grid/node-x28-y26 90T 66T 24T 73% +/dev/grid/node-x28-y27 92T 64T 28T 69% +/dev/grid/node-x29-y0 93T 72T 21T 77% +/dev/grid/node-x29-y1 93T 72T 21T 77% +/dev/grid/node-x29-y2 86T 72T 14T 83% +/dev/grid/node-x29-y3 88T 71T 17T 80% +/dev/grid/node-x29-y4 93T 64T 29T 68% +/dev/grid/node-x29-y5 92T 73T 19T 79% +/dev/grid/node-x29-y6 87T 69T 18T 79% +/dev/grid/node-x29-y7 86T 69T 17T 80% +/dev/grid/node-x29-y8 90T 68T 22T 75% +/dev/grid/node-x29-y9 88T 64T 24T 72% +/dev/grid/node-x29-y10 93T 65T 28T 69% +/dev/grid/node-x29-y11 94T 70T 24T 74% +/dev/grid/node-x29-y12 88T 72T 16T 81% +/dev/grid/node-x29-y13 90T 65T 25T 72% +/dev/grid/node-x29-y14 90T 70T 20T 77% +/dev/grid/node-x29-y15 94T 65T 29T 69% +/dev/grid/node-x29-y16 90T 73T 17T 81% +/dev/grid/node-x29-y17 94T 66T 28T 70% +/dev/grid/node-x29-y18 90T 64T 26T 71% +/dev/grid/node-x29-y19 507T 495T 12T 97% +/dev/grid/node-x29-y20 92T 67T 25T 72% +/dev/grid/node-x29-y21 93T 69T 24T 74% +/dev/grid/node-x29-y22 93T 71T 22T 76% +/dev/grid/node-x29-y23 93T 69T 24T 74% +/dev/grid/node-x29-y24 85T 66T 19T 77% +/dev/grid/node-x29-y25 91T 70T 21T 76% +/dev/grid/node-x29-y26 91T 65T 26T 71% +/dev/grid/node-x29-y27 91T 69T 22T 75% +/dev/grid/node-x30-y0 91T 64T 27T 70% +/dev/grid/node-x30-y1 85T 65T 20T 76% +/dev/grid/node-x30-y2 91T 64T 27T 70% +/dev/grid/node-x30-y3 94T 73T 21T 77% +/dev/grid/node-x30-y4 85T 69T 16T 81% +/dev/grid/node-x30-y5 91T 73T 18T 80% +/dev/grid/node-x30-y6 86T 67T 19T 77% +/dev/grid/node-x30-y7 92T 73T 19T 79% +/dev/grid/node-x30-y8 86T 70T 16T 81% +/dev/grid/node-x30-y9 91T 71T 20T 78% +/dev/grid/node-x30-y10 89T 66T 23T 74% +/dev/grid/node-x30-y11 90T 67T 23T 74% +/dev/grid/node-x30-y12 88T 70T 18T 79% +/dev/grid/node-x30-y13 85T 64T 21T 75% +/dev/grid/node-x30-y14 91T 65T 26T 71% +/dev/grid/node-x30-y15 94T 69T 25T 73% +/dev/grid/node-x30-y16 87T 65T 22T 74% +/dev/grid/node-x30-y17 93T 70T 23T 75% +/dev/grid/node-x30-y18 94T 71T 23T 75% +/dev/grid/node-x30-y19 508T 498T 10T 98% +/dev/grid/node-x30-y20 94T 65T 29T 69% +/dev/grid/node-x30-y21 85T 70T 15T 82% +/dev/grid/node-x30-y22 91T 71T 20T 78% +/dev/grid/node-x30-y23 88T 67T 21T 76% +/dev/grid/node-x30-y24 90T 65T 25T 72% +/dev/grid/node-x30-y25 91T 67T 24T 73% +/dev/grid/node-x30-y26 93T 69T 24T 74% +/dev/grid/node-x30-y27 87T 72T 15T 82% +/dev/grid/node-x31-y0 91T 68T 23T 74% +/dev/grid/node-x31-y1 86T 67T 19T 77% +/dev/grid/node-x31-y2 85T 64T 21T 75% +/dev/grid/node-x31-y3 86T 65T 21T 75% +/dev/grid/node-x31-y4 87T 70T 17T 80% +/dev/grid/node-x31-y5 87T 71T 16T 81% +/dev/grid/node-x31-y6 91T 69T 22T 75% +/dev/grid/node-x31-y7 85T 64T 21T 75% +/dev/grid/node-x31-y8 89T 65T 24T 73% +/dev/grid/node-x31-y9 93T 67T 26T 72% +/dev/grid/node-x31-y10 87T 72T 15T 82% +/dev/grid/node-x31-y11 92T 69T 23T 75% +/dev/grid/node-x31-y12 94T 66T 28T 70% +/dev/grid/node-x31-y13 91T 65T 26T 71% +/dev/grid/node-x31-y14 89T 67T 22T 75% +/dev/grid/node-x31-y15 91T 70T 21T 76% +/dev/grid/node-x31-y16 87T 70T 17T 80% +/dev/grid/node-x31-y17 87T 67T 20T 77% +/dev/grid/node-x31-y18 92T 71T 21T 77% +/dev/grid/node-x31-y19 509T 496T 13T 97% +/dev/grid/node-x31-y20 94T 66T 28T 70% +/dev/grid/node-x31-y21 90T 67T 23T 74% +/dev/grid/node-x31-y22 88T 69T 19T 78% +/dev/grid/node-x31-y23 87T 65T 22T 74% +/dev/grid/node-x31-y24 94T 73T 21T 77% +/dev/grid/node-x31-y25 93T 70T 23T 75% +/dev/grid/node-x31-y26 93T 66T 27T 70% +/dev/grid/node-x31-y27 86T 66T 20T 76% +/dev/grid/node-x32-y0 88T 72T 16T 81% +/dev/grid/node-x32-y1 92T 70T 22T 76% +/dev/grid/node-x32-y2 93T 67T 26T 72% +/dev/grid/node-x32-y3 89T 73T 16T 82% +/dev/grid/node-x32-y4 94T 68T 26T 72% +/dev/grid/node-x32-y5 86T 72T 14T 83% +/dev/grid/node-x32-y6 88T 71T 17T 80% +/dev/grid/node-x32-y7 87T 66T 21T 75% +/dev/grid/node-x32-y8 87T 64T 23T 73% +/dev/grid/node-x32-y9 88T 67T 21T 76% +/dev/grid/node-x32-y10 91T 67T 24T 73% +/dev/grid/node-x32-y11 94T 66T 28T 70% +/dev/grid/node-x32-y12 86T 66T 20T 76% +/dev/grid/node-x32-y13 94T 71T 23T 75% +/dev/grid/node-x32-y14 87T 67T 20T 77% +/dev/grid/node-x32-y15 94T 73T 21T 77% +/dev/grid/node-x32-y16 87T 67T 20T 77% +/dev/grid/node-x32-y17 88T 68T 20T 77% +/dev/grid/node-x32-y18 85T 65T 20T 76% +/dev/grid/node-x32-y19 506T 494T 12T 97% +/dev/grid/node-x32-y20 94T 64T 30T 68% +/dev/grid/node-x32-y21 91T 68T 23T 74% +/dev/grid/node-x32-y22 94T 66T 28T 70% +/dev/grid/node-x32-y23 86T 72T 14T 83% +/dev/grid/node-x32-y24 87T 67T 20T 77% +/dev/grid/node-x32-y25 91T 65T 26T 71% +/dev/grid/node-x32-y26 85T 71T 14T 83% +/dev/grid/node-x32-y27 93T 67T 26T 72% +/dev/grid/node-x33-y0 87T 72T 15T 82% +/dev/grid/node-x33-y1 86T 65T 21T 75% +/dev/grid/node-x33-y2 93T 70T 23T 75% +/dev/grid/node-x33-y3 85T 67T 18T 78% +/dev/grid/node-x33-y4 89T 67T 22T 75% +/dev/grid/node-x33-y5 91T 70T 21T 76% +/dev/grid/node-x33-y6 89T 67T 22T 75% +/dev/grid/node-x33-y7 86T 68T 18T 79% +/dev/grid/node-x33-y8 91T 72T 19T 79% +/dev/grid/node-x33-y9 86T 72T 14T 83% +/dev/grid/node-x33-y10 86T 68T 18T 79% +/dev/grid/node-x33-y11 91T 72T 19T 79% +/dev/grid/node-x33-y12 93T 69T 24T 74% +/dev/grid/node-x33-y13 87T 71T 16T 81% +/dev/grid/node-x33-y14 88T 70T 18T 79% +/dev/grid/node-x33-y15 86T 73T 13T 84% +/dev/grid/node-x33-y16 90T 72T 18T 80% +/dev/grid/node-x33-y17 86T 70T 16T 81% +/dev/grid/node-x33-y18 90T 64T 26T 71% +/dev/grid/node-x33-y19 509T 496T 13T 97% +/dev/grid/node-x33-y20 89T 69T 20T 77% +/dev/grid/node-x33-y21 94T 69T 25T 73% +/dev/grid/node-x33-y22 90T 66T 24T 73% +/dev/grid/node-x33-y23 85T 73T 12T 85% +/dev/grid/node-x33-y24 92T 68T 24T 73% +/dev/grid/node-x33-y25 89T 65T 24T 73% +/dev/grid/node-x33-y26 90T 68T 22T 75% +/dev/grid/node-x33-y27 93T 70T 23T 75% +/dev/grid/node-x34-y0 86T 66T 20T 76% +/dev/grid/node-x34-y1 92T 64T 28T 69% +/dev/grid/node-x34-y2 90T 69T 21T 76% +/dev/grid/node-x34-y3 91T 73T 18T 80% +/dev/grid/node-x34-y4 90T 70T 20T 77% +/dev/grid/node-x34-y5 86T 68T 18T 79% +/dev/grid/node-x34-y6 87T 72T 15T 82% +/dev/grid/node-x34-y7 92T 72T 20T 78% +/dev/grid/node-x34-y8 86T 64T 22T 74% +/dev/grid/node-x34-y9 88T 65T 23T 73% +/dev/grid/node-x34-y10 88T 72T 16T 81% +/dev/grid/node-x34-y11 93T 69T 24T 74% +/dev/grid/node-x34-y12 87T 73T 14T 83% +/dev/grid/node-x34-y13 88T 72T 16T 81% +/dev/grid/node-x34-y14 93T 69T 24T 74% +/dev/grid/node-x34-y15 88T 68T 20T 77% +/dev/grid/node-x34-y16 89T 66T 23T 74% +/dev/grid/node-x34-y17 92T 66T 26T 71% +/dev/grid/node-x34-y18 94T 70T 24T 74% +/dev/grid/node-x34-y19 506T 496T 10T 98% +/dev/grid/node-x34-y20 85T 72T 13T 84% +/dev/grid/node-x34-y21 89T 70T 19T 78% +/dev/grid/node-x34-y22 92T 65T 27T 70% +/dev/grid/node-x34-y23 87T 64T 23T 73% +/dev/grid/node-x34-y24 89T 71T 18T 79% +/dev/grid/node-x34-y25 90T 73T 17T 81% +/dev/grid/node-x34-y26 87T 70T 17T 80% +/dev/grid/node-x34-y27 91T 67T 24T 73% +/dev/grid/node-x35-y0 86T 70T 16T 81% +/dev/grid/node-x35-y1 91T 67T 24T 73% +/dev/grid/node-x35-y2 86T 66T 20T 76% +/dev/grid/node-x35-y3 92T 72T 20T 78% +/dev/grid/node-x35-y4 90T 73T 17T 81% +/dev/grid/node-x35-y5 86T 69T 17T 80% +/dev/grid/node-x35-y6 91T 69T 22T 75% +/dev/grid/node-x35-y7 94T 73T 21T 77% +/dev/grid/node-x35-y8 89T 68T 21T 76% +/dev/grid/node-x35-y9 86T 64T 22T 74% +/dev/grid/node-x35-y10 92T 68T 24T 73% +/dev/grid/node-x35-y11 89T 64T 25T 71% +/dev/grid/node-x35-y12 91T 70T 21T 76% +/dev/grid/node-x35-y13 88T 68T 20T 77% +/dev/grid/node-x35-y14 92T 69T 23T 75% +/dev/grid/node-x35-y15 88T 66T 22T 75% +/dev/grid/node-x35-y16 91T 66T 25T 72% +/dev/grid/node-x35-y17 88T 65T 23T 73% +/dev/grid/node-x35-y18 93T 72T 21T 77% +/dev/grid/node-x35-y19 501T 491T 10T 98% +/dev/grid/node-x35-y20 85T 67T 18T 78% +/dev/grid/node-x35-y21 90T 65T 25T 72% +/dev/grid/node-x35-y22 87T 71T 16T 81% +/dev/grid/node-x35-y23 87T 70T 17T 80% +/dev/grid/node-x35-y24 89T 0T 89T 0% +/dev/grid/node-x35-y25 87T 68T 19T 78% +/dev/grid/node-x35-y26 87T 67T 20T 77% +/dev/grid/node-x35-y27 90T 71T 19T 78% +/dev/grid/node-x36-y0 85T 68T 17T 80% +/dev/grid/node-x36-y1 85T 65T 20T 76% +/dev/grid/node-x36-y2 90T 72T 18T 80% +/dev/grid/node-x36-y3 91T 65T 26T 71% +/dev/grid/node-x36-y4 92T 72T 20T 78% +/dev/grid/node-x36-y5 85T 66T 19T 77% +/dev/grid/node-x36-y6 87T 69T 18T 79% +/dev/grid/node-x36-y7 94T 73T 21T 77% +/dev/grid/node-x36-y8 85T 72T 13T 84% +/dev/grid/node-x36-y9 86T 69T 17T 80% +/dev/grid/node-x36-y10 90T 70T 20T 77% +/dev/grid/node-x36-y11 85T 72T 13T 84% +/dev/grid/node-x36-y12 86T 64T 22T 74% +/dev/grid/node-x36-y13 89T 68T 21T 76% +/dev/grid/node-x36-y14 85T 68T 17T 80% +/dev/grid/node-x36-y15 93T 71T 22T 76% +/dev/grid/node-x36-y16 85T 66T 19T 77% +/dev/grid/node-x36-y17 93T 72T 21T 77% +/dev/grid/node-x36-y18 94T 64T 30T 68% +/dev/grid/node-x36-y19 506T 499T 7T 98% +/dev/grid/node-x36-y20 86T 69T 17T 80% +/dev/grid/node-x36-y21 85T 68T 17T 80% +/dev/grid/node-x36-y22 91T 65T 26T 71% +/dev/grid/node-x36-y23 85T 73T 12T 85% +/dev/grid/node-x36-y24 85T 71T 14T 83% +/dev/grid/node-x36-y25 87T 67T 20T 77% +/dev/grid/node-x36-y26 85T 69T 16T 81% +/dev/grid/node-x36-y27 89T 65T 24T 73% +/dev/grid/node-x37-y0 85T 70T 15T 82% +/dev/grid/node-x37-y1 85T 73T 12T 85% +/dev/grid/node-x37-y2 94T 68T 26T 72% +/dev/grid/node-x37-y3 91T 64T 27T 70% +/dev/grid/node-x37-y4 89T 67T 22T 75% +/dev/grid/node-x37-y5 89T 66T 23T 74% +/dev/grid/node-x37-y6 93T 65T 28T 69% +/dev/grid/node-x37-y7 89T 64T 25T 71% +/dev/grid/node-x37-y8 94T 69T 25T 73% +/dev/grid/node-x37-y9 87T 72T 15T 82% +/dev/grid/node-x37-y10 93T 64T 29T 68% +/dev/grid/node-x37-y11 87T 72T 15T 82% +/dev/grid/node-x37-y12 89T 65T 24T 73% +/dev/grid/node-x37-y13 91T 64T 27T 70% +/dev/grid/node-x37-y14 87T 65T 22T 74% +/dev/grid/node-x37-y15 92T 67T 25T 72% +/dev/grid/node-x37-y16 89T 73T 16T 82% +/dev/grid/node-x37-y17 92T 64T 28T 69% +/dev/grid/node-x37-y18 88T 68T 20T 77% +/dev/grid/node-x37-y19 504T 495T 9T 98% +/dev/grid/node-x37-y20 93T 71T 22T 76% +/dev/grid/node-x37-y21 93T 67T 26T 72% +/dev/grid/node-x37-y22 87T 71T 16T 81% +/dev/grid/node-x37-y23 93T 65T 28T 69% +/dev/grid/node-x37-y24 89T 64T 25T 71% +/dev/grid/node-x37-y25 86T 65T 21T 75% +/dev/grid/node-x37-y26 93T 73T 20T 78% +/dev/grid/node-x37-y27 87T 66T 21T 75% diff --git a/src/main/resources/2016/day23.txt b/src/main/resources/2016/day23.txt new file mode 100644 index 00000000..87c4c7a7 --- /dev/null +++ b/src/main/resources/2016/day23.txt @@ -0,0 +1,26 @@ +cpy a b +dec b +cpy a d +cpy 0 a +cpy b c +inc a +dec c +jnz c -2 +dec d +jnz d -5 +dec b +cpy b c +cpy c d +dec d +inc c +jnz d -2 +tgl c +cpy -16 c +jnz 1 c +cpy 95 c +jnz 73 d +inc a +inc d +jnz d -2 +inc c +jnz c -5 diff --git a/src/main/resources/2016/day24.txt b/src/main/resources/2016/day24.txt new file mode 100644 index 00000000..619879b0 --- /dev/null +++ b/src/main/resources/2016/day24.txt @@ -0,0 +1,39 @@ +################################################################################################################################################################################### +#.#.........#.#.....#.#.#.#.#.........#...#.......#.....#.#.....#...#.......#.#...#.#.....#...#.....#.................#.#...#.....#.....#.....#.............#.........#.#.....#0#.# +#.###.#.#.#.#.#.#.#.#.#.#.#.#####.#.#.#.#.#.###.#.#.###.#.#.#.#.#.###.#.#.#.#.#.#.#.#.#.#.#.#.#.#.###.#.#.#.#.###.#.#.#.#.#.#.#.###.#.#.#.#.#####.#####.#.#.#.#.#.#.#.#.###.#.#.#.# +#.......#.......#.#...#.....#...#.#...#...#.....#2#.#...#.#.....#...#...#.......#...#...#.....#.#.#.....#...#.#.....#.........#.#.#.....#.......#...#.....#.......#.....#...#...#.# +#.###.#.#.#.###.#####.#.#.#.###.#.###.#.#.###.#.#####.#.#####.#.#.#.#########.#.#.#######.###.#.#.#.#.#.###.#.#.#.#.###.#.#.#.#.#.#.#.###.###.#.#.###.#####.#.#.#####.#.###.#.#.#.# +#.....#...........#...#.......................#...........#.#...#.#.#.#.....#.#...#...#.#...#.#.........#...#.....#...#...#.....#.....#.....#...#.....#.#...#...........#.....#.#.# +#####.###.#########.###.#.#########.###.###.#.#####.#####.#.#.#####.#.#.#.###.#.#.#.#.#.###.#.###########.#.#.#.#.#.#####.#######.###.#.###.#.###.#####.#.#.#####.#.#.###.###.#.#.# +#...#.#1..#...........#.#.....#...#.#.....#...#...#...........#...#.......#...............#...#.......#.....#.....#.#...#.....#...#.#.#.......#.......#.............#...........#.# +#.#.#.#.###.#.#.#.#.###.#.#.#.#.#.#.#.###.#.#.#.#.#.#.#.#####.#####.###.#.#.#######.#####.###.#.###.#.#.###.#.#.###.#.#.#.#.#.#.###.#.#.###.#.#.#.#.#.#.#.#.#.###.#######.#.####### +#...#...#...#.....#...#...........#...#.#...#...#.#.#.#...#...#...#...#.#...#.#.......#...#...#.#.....#.#.....#.....#.....#.....#.#.#...#...#.#.....#.....#.....#.......#.#.#.....# +#.#.#.#.###.#.#####.#.#.#.#.#####.#.#.#.#.###.#.#.#.#.#####.#.#.#.#.#.#.###.#.#.#.#.#.#####.#.#.#.#.###.###.#.###.###.###.#.#.#.#.#.###.###.#.###.#.#.###.#.###.#.#.###.#.###.#.### +#...#...#...#...........#.........#.#.#.#.....#.#.#.#.#.........#.....#.#.......#.#.#...#.....#...#...#.......#.#.....#.#.....#.......#...#.#.#...#.#.#...#.#...#.#...#.#.#...#.#.# +#.###.###.#.#.#.#.#.###.#.#.#.#.#.#.#.#.###.#.#####.#.#.#.#.#####.#.#.#.#.#.###.#.#.###.###.###.#######.#.#####.###.#.#.#.###.#.#.###.#.#.#.#.#.#.#.###.#.###.#.#.#.#####.#.#.#.#.# +#...#.#...#.#.#.............#.......#.#...............#.#.#.....#...#.#...#.....#...#...................#.....#.#.#.....#.........#...#.#...#.......#...#...#...#.#.......#.....#.# +###.#.#.#.#.#.#######.#.#.#.#.#.###.#####.###.#.#.###.#.###.###.#.#.#.#.#.#.#########.###.#.#.###.#.#.#.#.#.#.#.#.#.###.###########.#.#.#####.#.#####.#.#.#.###.#.#.###.#.###.#.#.# +#...#.....#...#...#...#.#...#.....#.#.......#.....#...#...#.#.....#...#...#...#.......#.............#.....#...#.....#.......#.....#.#.#.......#.....#...#.....#...#.....#.#...#...# +#.#.#####.#########.#.#.#.#.###########.###.###.#.#.#.#.#.#.#####.#.###.#.#.###.#####.#.#.#####.###.#.#.###.#.#.###.#.###.#.#.#.###.#.#.#.#####.#.#.#.#.#.#.#.#.#.#.#####.#.#.#.### +#.........#.#...........#.#.#...#.#.....#.....#...........#.#.....#.....#...#.#...#.#.......#...#.#.......#.....#...#...#...#.......#.#.......#.#.....#...#...#.#.#.#4........#...# +#.###.#.###.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#############.#.#.#######.#.#.#.#.###.#.#.#####.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.###.###.#.#.###.#.#.#.#.#.#.#.#.#.#.#.###.#.#####.#.# +#3........#...#...#.#.#.#...#...#.....#...#.#...#...#.#.#.#...#.....#.#.#.#.............#.........#.#.....#.....#.#.............#.#.#.#...#...#...#.#.............#.#...#.....#...# +###.###.#.#.###.###.###.#.#####.#####.#####.#.#.#.#.#.#.###.#.#.#.#.#.#####.###.###.#.###.#.#.#.#.#.#.#.###.#.###.###########.###.#.#.#.#.#.#.#.#####.###.#.#.#.#.#.###.###.#.#.#.# +#...#.......#.#.#...............#.........#...#.....#.#...........#.#.........#.....#.........#...#...#.........#.......#.......#.........#.....#.#...#...#.#.#.....#.............# +#.#.###.#####.###.###.#.###.#.###.#.#.###.###.#.#####.#######.###.#.#.###.#####.#.#.#.#.#.#.###.#.#####.#.#.#######.#.#.###.###.#.#.###.#.###.#.#.###.#############.#.###.#.#####.# +#.#.#...#...#.#...#.#...#...#.....#.#.........#.......#.............#.#...#.........#.#.....#.....#.....#...#.....#...#...#.....#...#...#.........#...#.....#.........#...#.....#.# +#.#####.#.#.#.#.#.#.#.#.#.#.#.#####.#.#.#.#.###.#.###.#.#.###.###.#.###.#.#.#.#.###.#.#####.###.#.###.#########.#.#.#####.#.#.#.#.#.###.###.###.#.#.#.#.###.#.#.#.#.###.#.#.#.#.#.# +#.................#...#...#.#...........#.#.#.......#.......#...#.#...#...#.#...#.#.#.......#.#.#...#...........#.............#.#...#...#.......#...#.#.....#...#.#...#...#.......# +#.#.#.#.#.###.###.#.#.#####.#.#.#.#####.#.#.#.###.#.#######.###.#.#.###.#.#.#####.#.#####.#.#.#.#.#.#.#.#.#.#.#.#.###.#.#####.#####.###.#.#.###.#.#.#.#.#.#.#.###.#.#.#.#.#####.#.# +#...#.#.#...#.....#.#.#.......#...#...#...#.......................#.#.....#.................#.....#.......#...#...........#...#...........#...#...#...#.....#.#.#...#.#.#...#...#.# +#.#.#.#.###.#.#######.#####.###.#.#.#.###.#.###.#.#.###.#.#.#.###.#####.#.#.#.#.#.###.#.#####.###.#######.#.#.#.###.###.#.###.#.#.###.###.#.#.###.###.#.###.###.###.#.#.###.#.#.#.# +#...#...#.#.#...#...#.#...#...#.#.....#.#...#.....#.....#.....#.#.....#.....#.#...#.#...#.........#.....#.#.....................#...#...#.#...#...#...#.#.....#.#...#.....#...#...# +#.#####.#.#####.###.#.#.#.#.#.#.#.#.###.#####.#.#.#.###.#.###.#.###.#.###.###.#.#.#.###.#.#.#.#.#.#.#.#.#.#.###.#.###.#.#######.#.#.#.#.#.#.#.#.#.#.#.#.#.#####.#.#.#.#.#.#.#.#.#.# +#.....#.#.#7..#.#.......#...#.#.....#...#.........#...#.#...#.......#.....#...#.#...#.#...#.#.#.#.#.......#.....#...#...#.........#.....#...#.....#.....#.#.....#.............#..5# +#.###.#.#.###.#.###.#######.#.#####.###.#.#.###.#.#.#.#.###.###.#.#.#####.#.#.#.#.#.#.#.###.#.#.#.#.#.###.###.###.#.#####.###.#.###.#.#.#.#.#.#####.#.#.#.#.#####.#.#.#.#.###.#.#.# +#.......#.....#.....#.#.......#.#.#...#...#6#.#.......#...#.#.#.....#.#.#.....#.....#.....#.....#.#...#.........#...#...#.#.......#.#.#...#.#...#...#.....#.#.....#...#...#...#.#.# +###.#.###.#.#.#.#.#.#.#.###.#.#.#.#.###.#.#.#.#####.#.#####.#.#.#.#.#.#.###.#.#####.#.#.#.#######.#.#.#####.#.#.#.#.#.#.#.###.###.###.#.#.#.#.#######.#.#.#.#.#.#.#.#.###.#.#.#.#.# +#...#.#...#.#.....#...#.....#...#.#.....#...#.#...#.#.......#...#.....#...#.......#.....#.#...#...#...#.#...#.....#.....#.........#.#.......#.#.......#.#.....#.....#.#...........# +#.#.#.###.#.###.###.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#######.###.#.#.#####.###.#.#.#.#.#.#.#.#.###.#.#.#####.###.###.###.#.#.#.#.#.#####.#.#####.#.#.#.###.#.###.#.#.#####.#.#.#######.# +#.#.#...#.......#.....#...#.#...#...................#...#...#...#...#.......#.#.....#...#...#.........#.....#...........#...#.#.#.#.#.#...#.........#.#.........#.#...#.....#.#...# +################################################################################################################################################################################### diff --git a/src/main/resources/2016/day25.txt b/src/main/resources/2016/day25.txt new file mode 100644 index 00000000..30cc487b --- /dev/null +++ b/src/main/resources/2016/day25.txt @@ -0,0 +1,30 @@ +cpy a d +cpy 4 c +cpy 633 b +inc d +dec b +jnz b -2 +dec c +jnz c -5 +cpy d a +jnz 0 0 +cpy a b +cpy 0 a +cpy 2 c +jnz b 2 +jnz 1 6 +dec b +dec c +jnz c -4 +inc a +jnz 1 -7 +cpy 2 b +jnz c 2 +jnz 1 4 +dec b +dec c +jnz 1 -4 +jnz 0 0 +out b +jnz a -19 +jnz 1 -21 diff --git a/src/main/resources/2016/day3.txt b/src/main/resources/2016/day3.txt new file mode 100644 index 00000000..50d7e863 --- /dev/null +++ b/src/main/resources/2016/day3.txt @@ -0,0 +1,1908 @@ + 4 21 894 + 419 794 987 + 424 797 125 + 651 305 558 + 655 631 963 + 2 628 436 + 736 50 363 + 657 707 408 + 252 705 98 + 532 173 878 + 574 792 854 + 157 737 303 + 468 76 580 + 502 503 434 + 467 567 310 + 911 911 391 + 791 913 925 + 174 49 532 + 796 803 426 + 800 132 710 + 273 722 711 + 388 576 551 + 17 936 676 + 371 712 141 + 692 738 913 + 745 805 975 + 381 140 680 + 859 344 336 + 109 148 877 + 835 441 716 + 355 288 669 + 968 259 517 + 979 350 773 + 134 222 347 + 614 279 628 + 510 140 590 + 901 581 707 + 958 933 680 + 95 558 766 + 676 739 739 + 890 40 825 + 280 735 297 + 593 354 701 + 555 756 730 + 39 656 853 + 399 660 14 + 293 685 48 + 109 374 42 + 260 608 680 + 306 885 603 + 49 683 810 + 125 513 512 + 706 600 143 + 728 138 658 + 410 673 27 + 617 872 89 + 923 733 103 + 462 674 95 + 352 718 191 + 129 351 173 + 648 839 828 + 332 829 789 + 947 44 214 + 768 576 184 + 672 900 601 + 98 672 738 + 368 926 539 + 271 300 372 + 141 844 261 + 731 426 205 + 734 979 792 + 16 703 888 + 133 682 323 + 428 784 182 + 398 171 394 + 154 845 425 + 643 14 775 + 695 849 432 + 22 227 464 + 490 544 485 + 474 701 910 + 902 629 10 + 996 680 67 + 91 908 75 + 653 600 845 + 439 53 117 + 480 552 860 + 156 144 46 + 492 359 597 + 408 473 614 + 469 343 737 + 777 438 149 + 803 114 676 + 78 835 753 + 567 230 707 + 542 738 49 + 286 542 939 + 75 985 179 + 293 914 854 + 234 609 877 + 237 167 880 + 151 722 925 + 793 515 278 + 350 432 777 + 883 402 581 + 621 501 702 + 494 265 665 + 167 668 345 + 853 911 629 + 747 428 576 + 703 979 73 + 938 798 401 + 851 743 542 + 281 216 483 + 772 573 404 + 598 547 606 + 275 107 823 + 92 94 864 + 416 201 759 + 331 146 446 + 200 375 70 + 459 349 928 + 615 77 999 + 748 380 628 + 624 244 759 + 934 512 163 + 964 117 75 + 515 146 209 + 917 31 218 + 694 640 116 + 758 53 375 + 250 655 353 + 153 200 189 + 259 752 85 + 313 637 129 + 361 632 973 + 896 61 934 + 581 611 483 + 620 788 889 + 959 273 754 + 677 997 322 + 43 201 714 + 181 956 734 + 147 878 850 + 139 802 938 + 542 729 26 + 531 201 915 + 412 917 301 + 845 44 811 + 489 897 626 + 378 384 781 + 429 130 313 + 583 400 515 + 811 937 949 + 584 812 909 + 738 143 205 + 79 813 801 + 599 872 539 + 650 177 384 + 299 267 539 + 506 358 516 + 425 520 185 + 901 854 622 + 84 371 21 + 931 797 642 + 274 155 432 + 366 935 635 + 331 810 836 + 56 725 67 + 9 756 985 + 58 38 946 + 385 807 899 + 336 998 3 + 243 539 893 + 792 117 272 + 345 995 452 + 717 892 262 + 311 694 23 + 737 169 392 + 875 741 379 + 609 422 100 + 644 442 916 + 832 51 967 + 230 962 82 + 380 202 931 + 308 786 903 + 556 668 121 + 194 650 263 + 732 20 346 + 528 445 589 + 341 142 684 + 281 302 550 + 408 511 219 + 683 938 617 + 679 705 763 + 812 847 313 + 557 838 308 + 888 23 145 + 120 20 129 + 450 643 245 + 329 658 282 + 30 878 700 + 698 799 335 + 698 320 595 + 875 959 595 + 50 715 454 + 856 686 269 + 986 38 589 + 834 925 69 + 263 928 654 + 430 175 586 + 99 712 642 + 439 679 132 + 639 714 644 + 563 940 62 + 228 385 666 + 758 757 949 + 137 174 104 + 859 746 939 + 675 140 592 + 324 446 357 + 471 486 455 + 450 429 980 + 955 388 599 + 914 222 512 + 981 673 871 + 941 716 744 + 55 192 173 + 98 48 411 + 774 686 343 + 689 671 412 + 666 613 686 + 420 595 550 + 891 148 204 + 150 678 978 + 420 684 49 + 503 879 985 + 95 508 231 + 90 393 777 + 17 464 813 + 372 120 26 + 513 10 445 + 258 133 460 + 392 29 355 + 116 874 635 + 326 889 493 + 883 599 250 + 913 388 798 + 85 366 782 + 422 416 204 + 533 174 93 + 168 413 270 + 617 996 461 + 8 386 1 + 613 928 464 + 455 545 619 + 424 631 488 + 142 612 146 + 921 374 324 + 744 791 395 + 923 797 445 + 876 447 602 + 851 62 493 + 23 397 993 + 232 602 90 + 790 604 698 + 855 7 654 + 350 105 561 + 550 198 327 + 670 130 340 + 904 943 765 + 23 467 804 + 906 726 948 + 337 90 774 + 438 546 667 + 134 625 247 + 334 282 729 + 619 275 412 + 377 5 763 + 250 722 852 + 754 365 401 + 558 393 615 + 974 673 39 + 922 610 899 + 99 969 868 + 89 616 911 + 235 326 371 + 252 605 907 + 429 387 678 + 564 34 565 + 436 359 584 + 125 780 474 + 842 372 184 + 785 507 489 + 849 418 633 + 962 191 582 + 728 453 669 + 91 970 639 + 48 222 639 + 41 865 103 + 395 765 945 + 551 103 9 + 313 687 956 + 952 109 894 + 612 79 518 + 392 119 506 + 106 739 427 + 941 688 483 + 917 103 114 + 326 466 604 + 393 641 488 + 128 920 135 + 609 742 725 + 101 596 371 + 631 325 416 + 318 939 170 + 166 540 821 + 460 654 843 + 672 942 330 + 620 673 352 + 288 731 20 + 263 277 387 + 259 49 434 + 73 262 278 + 525 775 36 + 867 735 125 + 437 415 141 + 567 537 640 + 99 581 584 + 468 108 84 + 608 997 893 + 573 722 971 + 497 953 399 + 201 184 372 + 203 323 386 + 2 331 72 + 375 687 307 + 484 57 322 + 311 704 416 + 720 961 571 + 444 211 926 + 668 771 666 + 742 688 146 + 447 435 143 + 394 444 1 + 450 39 373 + 150 634 442 + 422 645 546 + 132 562 281 + 795 365 455 + 921 389 255 + 17 153 85 + 795 593 367 + 788 637 447 + 292 297 703 + 190 938 871 + 166 821 386 + 437 636 385 + 160 288 604 + 334 584 837 + 701 207 665 + 470 84 204 + 599 268 739 + 634 92 148 + 507 620 198 + 193 677 94 + 301 990 536 + 874 493 783 + 932 550 497 + 81 166 546 + 633 538 476 + 553 411 790 + 593 159 316 + 47 729 226 + 619 708 409 + 38 535 763 + 421 830 550 + 400 537 641 + 275 531 166 + 247 564 495 + 177 791 655 + 959 363 548 + 232 105 594 + 919 272 912 + 258 467 505 + 882 783 365 + 916 331 441 + 70 815 204 + 66 304 470 + 2 810 372 + 734 276 875 + 771 295 72 + 455 191 892 + 765 384 195 + 758 418 844 + 38 121 980 + 302 379 606 + 116 384 199 + 353 13 607 + 712 805 790 + 589 701 694 + 540 776 276 + 985 814 61 + 996 10 709 + 450 821 652 + 715 26 899 + 628 656 679 + 322 669 279 + 144 649 518 + 962 175 363 + 839 627 292 + 931 934 378 + 588 382 122 + 410 923 263 + 652 680 654 + 25 878 835 + 640 399 396 + 492 202 511 + 510 225 521 + 15 413 233 + 493 551 122 + 683 222 569 + 248 457 641 + 100 936 315 + 902 998 870 + 975 98 680 + 998 309 653 + 605 944 532 + 530 887 400 + 572 879 925 + 311 147 692 + 425 924 848 + 453 945 934 + 492 918 22 + 434 338 933 + 288 297 665 + 274 712 185 + 99 503 741 + 868 523 263 + 828 218 121 + 53 565 236 + 15 409 778 + 367 293 444 + 352 610 413 + 892 970 706 + 954 767 321 + 75 656 414 + 823 781 57 + 423 673 349 + 817 405 324 + 768 19 345 + 302 949 529 + 654 944 794 + 262 766 959 + 783 92 866 + 772 718 772 + 629 154 669 + 723 349 109 + 914 352 599 + 559 746 346 + 492 781 860 + 103 52 624 + 655 397 857 + 680 242 417 + 183 203 846 + 714 519 457 + 849 292 946 + 605 566 646 + 793 653 156 + 111 135 44 + 882 531 191 + 920 773 378 + 911 340 546 + 23 655 382 + 656 708 587 + 43 792 708 + 673 734 605 + 506 725 943 + 421 762 553 + 471 214 572 + 195 575 438 + 114 546 687 + 121 47 894 + 744 221 820 + 58 273 982 + 759 58 233 + 770 824 785 + 857 441 480 + 87 387 477 + 838 633 28 + 635 547 49 + 329 404 47 + 534 955 933 + 661 985 662 + 199 144 713 + 228 996 622 + 197 523 858 + 64 486 552 + 859 968 422 + 847 31 648 + 41 944 812 + 625 953 830 + 987 734 37 + 529 512 825 + 104 690 688 + 602 224 973 + 592 888 409 + 241 247 639 + 290 80 570 + 483 284 97 + 322 223 57 + 91 204 503 + 257 18 464 + 904 480 177 + 945 364 137 + 199 240 234 + 231 177 23 + 537 147 464 + 683 71 468 + 448 55 544 + 264 143 640 + 307 125 706 + 674 384 373 + 469 903 656 + 538 695 361 + 461 942 728 + 430 911 347 + 85 70 789 + 422 525 65 + 466 322 776 + 49 620 765 + 832 530 9 + 215 92 417 + 965 511 415 + 865 888 289 + 993 74 332 + 685 830 52 + 11 334 151 + 98 36 192 + 93 307 89 + 38 483 498 + 674 317 910 + 697 302 486 + 267 29 508 + 816 924 165 + 895 954 671 + 629 75 634 + 591 301 149 + 368 346 735 + 916 606 382 + 63 786 124 + 916 180 475 + 466 656 218 + 128 35 326 + 570 665 164 + 181 382 773 + 256 122 266 + 130 288 905 + 288 524 40 + 278 526 471 + 39 243 476 + 951 16 522 + 662 93 522 + 378 107 7 + 218 520 10 + 654 399 343 + 674 158 351 + 854 320 834 + 722 358 818 + 231 178 671 + 862 892 764 + 109 461 982 + 943 655 412 + 745 541 255 + 868 541 297 + 472 20 224 + 163 991 647 + 249 883 588 + 232 486 162 + 236 281 784 + 416 261 65 + 377 34 790 + 357 121 610 + 542 439 866 + 860 324 598 + 865 337 712 + 368 421 977 + 839 280 457 + 140 655 416 + 962 381 331 + 901 685 732 + 818 483 831 + 13 724 791 + 818 694 222 + 746 822 841 + 829 418 836 + 335 565 408 + 516 447 281 + 584 204 166 + 480 508 119 + 713 787 704 + 626 941 739 + 206 418 284 + 989 326 701 + 636 396 195 + 397 393 655 + 240 696 896 + 166 117 974 + 72 733 210 + 797 533 566 + 729 728 481 + 663 212 86 + 298 475 563 + 590 533 517 + 618 314 133 + 422 195 38 + 195 415 288 + 540 303 253 + 446 553 859 + 568 891 223 + 432 617 981 + 519 214 775 + 529 721 844 + 786 898 692 + 440 401 201 + 345 353 846 + 296 566 906 + 638 422 370 + 15 577 469 + 624 192 134 + 136 554 755 + 182 690 940 + 77 366 923 + 284 979 275 + 157 582 373 + 433 547 343 + 767 786 527 + 983 877 385 + 581 612 158 + 365 520 673 + 436 227 897 + 458 421 913 + 579 492 760 + 818 493 507 + 316 22 867 + 114 421 939 + 372 281 912 + 415 608 633 + 938 676 927 + 965 591 931 + 335 789 34 + 865 820 346 + 406 798 304 + 893 441 267 + 166 126 835 + 764 859 839 + 629 918 194 + 557 297 552 + 954 79 478 + 801 224 670 + 640 493 262 + 750 478 681 + 534 867 654 + 980 586 142 + 882 597 156 + 277 186 48 + 448 541 23 + 457 702 496 + 11 936 491 + 689 668 457 + 368 941 288 + 914 311 464 + 893 843 828 + 800 933 797 + 951 427 657 + 754 215 476 + 148 260 508 + 735 130 193 + 390 631 761 + 288 203 777 + 273 443 23 + 189 20 355 + 240 344 560 + 157 360 674 + 921 774 803 + 473 943 937 + 600 920 393 + 611 579 530 + 632 577 59 + 24 5 495 + 701 358 722 + 703 284 820 + 625 625 844 + 649 253 531 + 447 309 534 + 662 218 419 + 762 347 627 + 947 344 133 + 581 36 652 + 222 747 122 + 238 761 162 + 72 82 231 + 717 296 966 + 563 516 774 + 273 451 819 + 956 175 651 + 33 770 754 + 956 650 369 + 146 838 148 + 588 713 547 + 453 457 541 + 979 92 401 + 967 162 417 + 144 155 672 + 725 737 962 + 779 701 886 + 64 203 120 + 433 284 482 + 911 538 512 + 613 713 77 + 268 636 685 + 445 955 193 + 458 677 653 + 91 450 356 + 747 11 360 + 728 448 147 + 37 494 679 + 780 582 256 + 756 212 810 + 556 434 265 + 280 472 983 + 547 93 857 + 922 225 378 + 754 138 346 + 236 235 349 + 718 421 501 + 80 880 464 + 753 490 286 + 616 332 218 + 338 391 547 + 490 599 370 + 35 559 686 + 67 290 565 + 30 597 153 + 59 763 701 + 268 439 123 + 237 940 669 + 451 205 145 + 302 284 961 + 365 443 828 + 225 598 65 + 437 561 73 + 248 219 7 + 72 29 274 + 577 35 654 + 537 41 857 + 956 966 739 + 545 747 373 + 479 463 705 + 112 79 161 + 280 885 672 + 322 829 596 + 422 279 697 + 804 997 963 + 907 852 494 + 321 245 492 + 298 698 419 + 49 454 185 + 169 214 25 + 880 324 414 + 816 163 425 + 366 370 167 + 729 49 684 + 460 337 792 + 719 908 817 + 825 310 303 + 245 814 724 + 877 713 128 + 488 241 839 + 499 820 884 + 918 356 273 + 69 228 442 + 877 523 698 + 780 391 627 + 838 539 547 + 512 867 786 + 491 298 421 + 402 153 940 + 602 220 539 + 638 167 534 + 626 204 122 + 77 170 569 + 342 364 529 + 74 523 842 + 416 675 415 + 292 900 918 + 335 565 795 + 145 396 558 + 320 421 585 + 315 495 106 + 618 492 494 + 985 684 702 + 261 35 699 + 890 678 100 + 797 972 693 + 782 12 675 + 991 963 24 + 774 465 254 + 409 446 291 + 920 178 430 + 558 186 476 + 668 502 39 + 897 497 471 + 927 534 95 + 465 621 535 + 971 718 597 + 440 803 941 + 859 104 59 + 891 712 889 + 7 465 712 + 928 323 951 + 938 251 464 + 939 541 491 + 376 430 543 + 605 181 684 + 849 578 57 + 635 433 572 + 958 171 565 + 525 870 63 + 198 864 591 + 466 125 610 + 442 604 512 + 444 666 55 + 129 374 546 + 893 328 978 + 78 279 999 + 852 302 465 + 378 619 123 + 97 246 185 + 374 775 308 + 579 48 388 + 497 730 745 + 142 703 596 + 387 31 973 + 861 944 602 + 894 919 522 + 755 689 409 + 592 310 115 + 326 708 398 + 53 87 866 + 966 266 370 + 925 281 815 + 864 315 882 + 699 352 849 + 526 185 948 + 58 454 681 + 496 917 237 + 556 907 558 + 815 422 705 + 232 423 194 + 941 811 583 + 686 207 335 + 637 693 440 + 574 795 385 + 531 936 899 + 721 950 37 + 317 786 906 + 830 719 101 + 360 615 650 + 689 218 676 + 790 208 197 + 621 7 791 + 868 203 866 + 16 491 53 + 952 268 717 + 956 736 773 + 793 386 760 + 750 624 957 + 184 964 443 + 454 684 835 + 439 931 60 + 293 434 866 + 990 467 282 + 664 423 302 + 523 485 116 + 127 469 710 + 625 758 497 + 514 544 998 + 571 281 413 + 458 70 645 + 526 283 884 + 77 738 725 + 802 278 508 + 782 597 976 + 385 358 919 + 710 492 994 + 750 517 79 + 964 231 679 + 370 34 845 + 951 245 299 + 83 431 846 + 384 989 609 + 447 761 747 + 647 898 371 + 95 794 298 + 644 157 625 + 663 107 507 + 572 927 578 + 165 926 94 + 455 530 905 + 397 412 598 + 616 239 788 + 228 556 609 + 26 540 184 + 208 745 687 + 877 36 977 + 64 29 195 + 936 56 807 + 952 253 397 + 62 246 95 + 923 102 491 + 576 116 739 + 919 559 820 + 882 534 865 + 490 650 961 + 441 741 975 + 59 922 597 + 76 209 337 + 293 785 447 + 338 971 276 + 117 581 939 + 210 266 701 + 108 448 378 + 253 556 164 + 998 200 168 + 969 358 13 + 606 206 458 + 752 400 571 + 796 521 911 + 934 50 150 + 96 205 764 + 844 216 657 + 669 434 222 + 242 301 66 + 471 277 227 + 732 681 20 + 67 991 597 + 784 793 613 + 198 841 555 + 109 429 396 + 219 461 729 + 128 255 888 + 850 154 754 + 809 226 387 + 719 468 706 + 289 436 26 + 441 280 688 + 510 57 451 + 417 255 277 + 670 198 625 + 791 681 20 + 803 998 294 + 332 323 282 + 905 213 739 + 115 267 394 + 965 213 788 + 125 829 635 + 90 281 640 + 103 584 81 + 407 771 19 + 205 213 708 + 380 814 704 + 778 462 872 + 799 553 758 + 402 193 269 + 403 947 198 + 814 22 499 + 532 948 570 + 159 951 932 + 505 616 592 + 507 657 785 + 811 860 675 + 831 140 99 + 450 966 627 + 939 358 947 + 182 201 1 + 951 487 951 + 367 376 539 + 972 491 495 + 758 761 80 + 122 872 278 + 933 927 926 + 835 300 759 + 733 195 418 + 347 73 485 + 783 138 660 + 186 586 422 + 464 301 410 + 479 552 175 + 532 634 83 + 383 285 44 + 436 431 58 + 535 170 985 + 632 274 488 + 338 130 571 + 176 582 380 + 669 613 396 + 705 169 719 + 856 993 121 + 133 966 370 + 914 196 281 + 798 669 132 + 890 418 374 + 955 705 442 + 159 406 397 + 404 59 893 + 526 377 933 + 248 442 442 + 471 116 739 + 292 552 575 + 676 666 574 + 511 172 422 + 796 592 548 + 697 197 477 + 661 900 981 + 526 779 684 + 989 910 867 + 482 449 661 + 891 955 235 + 826 260 714 + 652 178 978 + 234 346 905 + 935 213 526 + 329 593 819 + 651 773 628 + 879 926 371 + 868 42 701 + 13 891 485 + 130 730 141 + 454 725 922 + 586 445 826 + 274 99 77 + 282 84 102 + 318 19 73 + 467 956 769 + 90 409 641 + 417 660 846 + 417 577 381 + 463 863 570 + 46 323 473 + 261 448 309 + 499 63 834 + 334 421 710 + 392 296 356 + 432 152 633 + 48 257 572 + 130 797 559 + 304 136 450 + 285 807 671 + 715 135 563 + 504 218 531 + 838 139 745 + 938 200 245 + 866 797 168 + 656 709 308 + 213 654 329 + 550 138 928 + 454 702 780 + 881 227 940 + 83 894 989 + 903 836 207 + 134 762 835 + 592 857 242 + 724 922 700 + 612 291 718 + 874 856 943 + 413 854 568 + 843 169 497 + 815 927 781 + 236 776 958 + 990 235 853 + 537 229 396 + 706 195 709 + 13 38 102 + 665 705 455 + 655 735 525 + 490 30 684 + 291 219 12 + 657 236 687 + 814 779 613 + 957 976 589 + 705 994 456 + 276 389 477 + 968 752 553 + 708 859 947 + 267 922 639 + 34 724 754 + 253 262 358 + 693 662 387 + 386 326 592 + 432 547 227 + 295 465 360 + 604 434 858 + 627 759 610 + 676 557 182 + 231 538 98 + 817 595 122 + 153 686 713 + 71 491 59 + 197 631 744 + 202 441 943 + 509 420 915 + 572 160 162 + 836 976 237 + 235 26 160 + 729 984 367 + 385 758 902 + 190 475 560 + 432 289 613 + 435 200 247 + 366 614 260 + 708 445 16 + 367 330 743 + 397 750 311 + 35 581 700 + 574 182 762 + 930 258 952 + 739 297 845 + 291 229 421 + 986 463 383 + 875 605 217 + 215 993 9 + 762 768 136 + 960 561 130 + 809 868 81 + 843 592 612 + 159 449 610 + 148 831 220 + 42 173 589 + 152 872 608 + 895 190 707 + 675 245 822 + 671 246 352 + 401 246 973 + 124 390 123 + 461 579 871 + 874 975 766 + 472 257 751 + 421 887 254 + 429 259 207 + 472 362 673 + 392 598 763 + 459 736 45 + 771 314 779 + 734 589 747 + 206 592 287 + 984 629 554 + 801 590 601 + 517 61 527 + 389 133 105 + 862 114 607 + 238 748 757 + 915 890 653 + 984 939 697 + 532 53 229 + 822 196 730 + 621 248 666 + 901 819 307 + 809 540 510 + 113 719 233 + 348 69 692 + 842 890 213 + 821 951 579 + 529 323 306 + 89 323 543 + 440 26 722 + 802 522 426 + 756 657 960 + 93 596 816 + 866 442 378 + 828 556 364 + 96 121 12 + 317 648 577 + 253 53 633 + 544 688 931 + 424 790 344 + 458 865 145 + 562 831 363 + 893 221 919 + 840 92 529 + 169 297 774 + 838 306 682 + 441 121 570 + 428 389 811 + 344 727 239 + 196 44 826 + 229 728 950 + 357 615 210 + 859 776 89 + 935 539 212 + 884 487 844 + 31 508 774 + 851 25 109 + 436 477 675 + 584 995 828 + 573 794 507 + 599 655 909 + 303 126 412 + 752 568 805 + 987 391 459 + 680 853 647 + 778 468 531 + 415 606 323 + 490 746 519 + 373 674 320 + 200 95 319 + 251 186 808 + 49 280 952 + 173 406 142 + 421 808 498 + 550 953 635 + 314 384 519 + 383 663 385 + 116 706 387 + 376 445 205 + 430 181 173 + 248 525 43 + 274 444 534 + 582 464 599 + 858 68 229 + 353 821 235 + 564 259 256 + 510 953 54 + 713 337 323 + 4 96 282 + 711 402 41 + 337 629 820 + 185 206 180 + 385 472 645 + 455 600 405 + 743 974 79 + 591 819 423 + 741 14 207 + 290 698 121 + 851 693 145 + 739 993 803 + 740 484 702 + 304 582 551 + 132 253 734 + 770 178 853 + 835 268 809 + 759 934 619 + 984 542 238 + 835 741 413 + 606 159 861 + 699 163 862 + 96 50 31 + 814 712 650 + 818 212 404 + 32 784 659 + 111 465 941 + 895 376 756 + 924 574 646 + 341 753 965 + 400 394 948 + 379 471 35 + 171 467 199 + 528 16 634 + 360 453 592 + 820 44 316 + 591 841 550 + 724 825 255 + 356 648 85 + 338 530 337 + 637 151 291 + 811 629 578 + 709 389 77 + 208 856 654 + 781 611 560 + 165 676 590 + 657 192 67 + 737 322 236 + 946 299 235 + 410 438 205 + 789 274 389 + 834 318 884 + 107 335 552 + 283 336 8 + 755 310 431 + 920 497 430 + 576 751 597 + 9 893 607 + 570 151 70 + 514 330 198 + 481 726 103 + 324 929 124 + 594 180 866 + 901 125 69 + 528 60 899 + 705 772 441 + 156 93 469 + 701 849 58 + 66 437 140 + 424 499 152 + 380 921 55 + 825 124 860 + 424 246 851 + 832 211 94 + 419 701 417 + 296 310 689 + 127 647 813 + 881 699 761 + 815 948 199 + 176 386 713 + 371 373 510 + 356 995 411 + 97 864 476 + 267 888 213 + 656 368 996 + 921 760 863 + 208 243 271 + 241 16 796 + 168 256 928 + 213 677 471 + 829 27 169 + 747 648 351 + 339 681 214 + 398 512 176 + 251 212 367 + 313 846 267 + 255 735 547 + 271 212 356 + 146 401 656 + 245 891 351 + 334 623 729 + 498 864 547 + 857 596 730 + 482 834 899 + 400 836 434 + 78 390 440 + 398 688 167 + 63 564 884 + 587 891 982 + 594 431 168 + 439 990 512 + 219 905 258 + 550 82 523 + 631 402 199 + 148 517 112 + 743 670 185 + 605 731 534 + 651 124 537 + 81 710 220 + 520 635 499 + 761 929 500 + 741 403 917 + 68 710 230 + 278 538 203 + 235 229 295 + 470 244 126 + 448 350 96 + 56 247 75 + 861 763 85 + 571 855 522 + 410 96 437 + 196 552 400 + 651 453 974 + 458 674 706 + 211 593 139 + 388 134 179 + 407 608 180 + 640 454 445 + 213 176 407 + 616 447 712 + 252 103 866 + 242 27 981 + 147 85 675 + 314 370 693 + 256 490 434 + 296 206 544 + 531 137 677 + 577 524 896 + 61 486 293 + 677 425 436 + 605 304 630 + 654 542 339 + 863 592 22 + 914 224 711 + 234 649 727 + 873 159 424 + 826 639 696 + 136 653 407 + 436 767 449 + 678 875 610 + 271 785 460 + 569 592 969 + 729 582 988 + 326 139 391 + 841 847 925 + 425 991 861 + 642 949 501 + 895 661 827 + 979 685 941 + 724 208 801 + 439 724 125 + 527 998 303 + 150 327 217 + 7 188 418 + 52 110 291 + 59 211 162 + 989 311 166 + 377 12 561 + 650 303 503 + 427 496 663 + 419 913 81 + 364 531 661 + 991 37 692 + 773 394 245 + 459 357 617 + 949 190 23 + 544 154 313 + 629 156 298 + 338 753 854 + 282 744 855 + 273 23 3 + 908 784 528 + 889 764 520 + 65 327 55 + 118 826 479 + 285 34 48 + 320 820 441 + 652 154 358 + 373 876 806 + 543 778 916 + 261 387 788 + 695 408 734 + 956 128 961 + 750 302 195 + 669 163 641 + 197 291 528 + 406 959 749 + 835 747 135 + 474 931 721 + 374 616 113 + 385 279 59 + 85 772 123 + 767 955 243 + 782 383 174 + 253 918 312 + 941 99 123 + 234 689 235 + 950 737 269 + 145 535 192 + 13 352 267 + 134 621 325 + 897 529 864 + 373 646 618 + 597 968 619 + 876 655 663 + 83 735 132 + 866 556 738 + 580 162 735 + 437 822 458 + 482 811 492 + 401 656 753 + 615 435 892 + 493 771 395 + 721 994 734 + 243 133 298 + 526 873 809 + 564 836 232 + 768 309 254 + 366 958 72 + 568 606 339 + 775 134 538 + 255 575 619 + 997 278 669 + 957 88 623 + 720 342 370 + 213 811 197 + 931 690 50 + 838 814 200 + 776 480 744 + 638 396 519 + 356 511 309 + 912 125 65 + 939 277 931 + 305 350 864 + 20 981 501 + 78 931 296 + 66 194 781 + 572 395 560 + 453 92 447 + 919 312 747 + 824 44 469 + 367 312 862 + 709 357 563 + 637 984 458 + 549 698 470 + 248 861 48 + 603 264 145 + 379 795 37 + 607 646 180 + 826 195 197 + 562 207 255 + 426 29 108 + 945 796 577 + 292 521 686 + 674 293 324 + 739 14 179 + 544 385 839 + 236 373 943 + 126 522 467 + 17 521 11 + 111 12 470 + 232 480 781 + 393 938 941 + 541 520 836 + 705 990 34 + 800 961 999 + 532 825 963 + 783 931 544 + 327 483 595 + 578 905 886 + 734 718 476 + 744 158 824 + 80 643 837 + 118 615 866 + 59 51 845 + 56 598 106 + 676 553 786 + 660 815 795 + 202 324 8 + 349 876 702 + 421 439 420 + 717 937 924 + 223 875 728 + 236 895 561 + 302 114 176 + 314 163 38 + 349 581 456 + 124 526 474 + 537 74 902 + 618 216 612 + 183 160 937 + 945 731 219 + 108 30 508 + 935 728 300 + 854 527 753 + 87 473 250 + 918 208 524 + 554 611 73 + 545 728 620 + 77 596 588 + 751 552 839 + 615 178 163 + 993 541 716 + 581 615 625 + 788 406 731 + 655 937 322 + 223 203 650 + 267 376 258 + 321 428 886 + 379 751 439 + 865 701 554 + 758 180 165 + 880 855 658 + 53 414 748 + 852 963 754 + 324 813 28 + 535 817 588 + 364 44 581 + 211 198 458 + 193 192 695 + 61 92 991 + 205 599 445 + 920 416 284 + 965 956 500 + 835 324 654 + 627 371 100 + 897 92 624 + 47 382 646 + 800 43 758 + 804 349 363 + 766 209 373 + 299 499 662 + 685 349 311 + 23 870 624 + 202 811 638 + 189 231 50 + 813 226 556 + 546 499 403 + 476 654 206 + 781 604 423 + 805 673 459 + 26 452 406 + 278 721 185 + 364 442 550 + 169 576 423 + 808 518 616 + 841 739 727 + 380 504 391 + 191 81 239 + 895 35 203 + 940 65 86 + 311 717 120 + 77 422 22 + 318 531 139 + 613 513 219 + 650 825 630 + 45 488 702 + 470 339 498 + 849 231 382 + 623 154 426 + 23 433 332 + 810 273 385 + 835 251 140 + 83 577 853 + 125 526 609 + 174 415 846 + 698 974 257 + 280 869 9 + 436 151 254 + 603 73 174 + 782 392 58 + 626 457 140 + 629 410 748 + 40 30 560 + 601 427 364 + 532 766 900 + 969 786 66 + 558 31 848 + 8 834 70 + 915 887 103 + 909 468 53 + 738 758 163 + 805 631 345 + 188 364 354 + 116 605 773 + 366 606 20 + 346 85 757 + 447 812 952 + 51 696 925 + 425 428 977 + 817 409 802 + 911 218 886 + 335 240 294 + 17 100 608 + 2 77 754 + 20 100 721 + 984 724 971 + 446 970 606 + 948 270 957 + 765 492 236 + 527 552 37 + 365 301 253 + 434 418 690 + 501 250 117 + 416 292 808 + 180 696 352 + 657 477 190 + 568 244 418 + 716 395 525 + 725 691 472 + 611 625 489 + 584 930 500 + 600 702 701 + 202 762 713 + 354 361 19 + 579 524 355 + 711 499 338 + 430 427 492 + 680 504 673 + 284 396 779 + 544 250 813 + 247 47 933 + 372 205 679 + 458 583 566 + 161 787 651 + 438 308 536 + 138 281 797 + 452 223 221 + 460 496 911 + 401 351 611 + 191 218 755 + 475 452 497 + 72 219 536 + 906 220 214 + 959 62 418 + 225 697 628 + 195 838 657 + 411 854 328 + 993 733 236 + 846 838 306 + 263 112 119 + 158 9 149 + 144 87 732 + 87 82 674 + 283 33 61 + 888 734 364 + 718 750 344 + 2 485 454 + 337 451 728 + 341 170 577 + 651 272 820 + 225 562 481 + 472 759 609 + 63 402 607 + 731 394 506 + 744 680 331 + 697 381 236 + 336 396 451 + 360 20 281 + 710 608 343 + 624 567 415 + 778 800 390 + 422 831 213 + 453 294 120 + 28 635 287 + 788 367 373 + 213 739 579 + 622 560 219 + 296 890 516 + 733 808 384 + 481 245 585 + 58 647 842 + 60 652 705 + 2 100 202 + 36 696 415 + 151 786 712 + 174 410 804 + 867 904 58 + 885 869 868 + 99 679 864 + 396 301 272 + 744 849 192 + 425 621 289 + 805 71 892 + 92 422 424 + 873 363 573 + 480 977 298 + 263 514 173 + 456 963 265 + 636 637 203 + 902 573 219 + 414 405 90 + 314 842 900 + 251 946 787 + 562 519 831 + 865 20 512 + 560 190 301 + 915 183 779 + 372 559 104 + 15 434 105 + 377 134 11 + 178 479 303 + 503 396 290 + 427 522 349 + 567 694 454 + 630 919 58 + 353 305 511 + 704 867 137 + 713 974 740 + 911 756 703 + 655 148 739 + 519 212 406 + 677 289 620 + 983 84 724 + 142 389 335 + 841 384 662 + 807 587 868 + 888 560 138 + 84 24 812 + 432 278 122 + 656 178 215 + 234 100 209 + 239 186 768 + 101 342 212 + 264 265 666 + 575 971 78 + 655 70 294 + 616 902 307 + 888 637 155 + 929 282 916 + 639 730 964 + 438 345 192 + 468 610 206 + 51 472 217 + 423 875 674 + 371 748 692 + 793 387 318 + 642 879 775 + 499 948 877 + 930 102 541 + 223 95 252 + 588 61 258 + 439 51 56 + 495 666 26 + 262 696 423 + 276 102 416 + 656 484 499 + 807 663 474 + 876 411 24 + 351 138 143 + 312 124 534 + 336 200 421 + 687 489 733 + 751 229 941 + 322 414 256 + 440 575 936 + 373 304 5 + 689 311 931 + 854 760 440 + 824 432 463 + 302 807 159 + 842 822 499 + 751 893 350 + 205 284 474 + 852 890 257 + 91 826 609 + 806 154 808 + 947 710 269 + 999 150 135 + 291 838 260 + 347 728 885 + 481 454 779 + 518 339 139 + 767 914 644 + 519 946 650 + 561 56 988 + 485 44 40 + 42 839 457 + 518 845 490 + 121 535 452 + 392 674 242 + 502 361 491 + 838 170 716 + 828 458 249 + 260 528 618 + 359 825 228 + 494 786 183 + 701 160 315 + 568 437 13 + 577 367 383 + 65 235 376 + 134 948 942 + 151 468 204 + 67 819 813 + 90 396 447 + 688 334 528 + 706 319 398 + 609 530 604 + 564 129 561 + 932 584 43 + 653 30 91 + 262 657 302 + 389 628 375 + 9 664 564 + 764 101 568 + 754 730 927 + 650 910 57 + 51 379 96 + 616 820 112 + 100 564 98 + 688 835 659 + 720 466 647 + 262 893 400 + 425 104 167 + 388 919 466 + 257 765 50 + 197 717 734 + 101 750 750 + 412 526 261 + 382 762 382 + 209 361 315 + 470 712 398 + 447 641 40 + 390 267 438 + 441 98 446 + 402 836 333 + 678 925 255 + 835 35 166 + 471 665 859 + 390 699 875 + 551 523 235 + 691 639 263 + 879 647 53 + 331 413 118 + 154 477 970 + 389 406 916 + 811 948 239 + 408 217 244 + 868 943 404 + 349 276 792 + 236 585 481 + 320 656 546 + 835 769 804 + 161 728 778 + 948 729 65 + 835 164 940 + 692 211 148 + 434 58 920 + 524 174 30 + 572 233 25 + 50 94 8 + 554 421 618 + 338 274 638 + 346 188 656 diff --git a/src/main/resources/2016/day4.txt b/src/main/resources/2016/day4.txt new file mode 100644 index 00000000..88596488 --- /dev/null +++ b/src/main/resources/2016/day4.txt @@ -0,0 +1,980 @@ +bkwzkqsxq-tovvilokx-nozvyiwoxd-172[fstek] +wifilzof-wbiwifuny-yhachyylcha-526[qrazx] +jvyyvzpcl-jhukf-shivyhavyf-487[zhtsi] +kwvacumz-ozilm-kivlg-kwvbiqvumvb-694[gknyw] +mvhkvbdib-kmjezxodgz-mvwwdo-omvdidib-837[dmvbi] +nzydfxpc-rclop-qwzhpc-lnbftdtetzy-171[cptzd] +vhehkyne-unggr-inkvatlbgz-813[gnehk] +tcorcikpi-hnqygt-octmgvkpi-570[nzewo] +xmtjbzidx-wvnfzo-jkzmvodjin-447[uyzlp] +willimcpy-mwupyhayl-bohn-mufym-734[stjoc] +sbejpbdujwf-cvooz-xpsltipq-961[azfnd] +jchipqat-qphzti-rjhidbtg-htgkxrt-271[thigj] +npmhcargjc-zsllw-pcqcypaf-158[mzwnx] +luxciuwncpy-jfumncw-alumm-qilembij-318[mucil] +bxaxipgn-vgpst-rpcsn-rdpixcv-htgkxrth-427[ywazt] +zekvierkzferc-tyftfcrkv-ivtvzmzex-295[evzfk] +enzcntvat-qlr-hfre-grfgvat-143[rtaef] +mvkccspson-bkllsd-nofovyzwoxd-224[oscdk] +enzcntvat-zvyvgnel-tenqr-pnaql-pbngvat-ratvarrevat-429[zymbs] +nwzekwypera-xwogap-pnwejejc-992[lkiwn] +ajmrxjlcren-ajkkrc-lxwcjrwvnwc-667[ezynd] +bxaxipgn-vgpst-hrpktcvtg-wjci-advxhixrh-661[lytku] +owshgfarwv-vqw-kzahhafy-190[ahwfv] +jqwpihizlwca-moo-twoqabqka-512[ncdyv] +apwmeclga-pyzzgr-rcaflmjmew-886[amceg] +tyepcyletzylw-ojp-wzrtdetnd-951[mxqsy] +dlhwvupglk-kfl-hjxbpzpapvu-773[nrotd] +fab-eqodqf-dmnnuf-bgdotmeuzs-612[dchyk] +qjopwxha-bhksan-skngodkl-940[kahno] +lsyrkjkbnyec-dyz-combod-cmkfoxqob-rexd-bomosfsxq-718[lktzs] +zixppfcfba-bdd-jxohbqfkd-939[sqtor] +vxupkizork-kmm-ktmotkkxotm-852[dsqjh] +excdklvo-mkxni-mykdsxq-nozkbdwoxd-952[zspmc] +bnqqnrhud-eknvdq-sqzhmhmf-391[qhndm] +gzefmnxq-otaoaxmfq-ogefayqd-eqdhuoq-716[zinwb] +qzoggwtwsr-qobrm-ghcfous-428[goqrs] +gpbepvxcv-ltpedcxots-qphzti-steadnbtci-193[ignjy] +hvbizodx-nxvqzibzm-cpio-hvmfzodib-265[hixfe] +wkqxodsm-lexxi-kxkvicsc-926[xkcis] +bknsykmdsfo-myxcewob-qbkno-oqq-zebmrkcsxq-380[utqrz] +lejkrscv-wcfnvi-kirzezex-711[ecikr] +htwwtxnaj-idj-btwpxmtu-255[itgmd] +zsxyfgqj-jll-ijufwyrjsy-931[wrpgt] +iuxxuyobk-yigbktmkx-natz-gtgreyoy-384[ygktx] +qjopwxha-xqjju-zalhkuiajp-628[esmxk] +lxaaxbren-ljwmh-anbnjalq-745[stjqy] +gokzyxsjon-zvkcdsm-qbkcc-dbksxsxq-380[tsyqk] +qzoggwtwsr-qobrm-qcohwbu-rsdofhasbh-168[obhqr] +pelbtravp-pnaql-fgbentr-325[pabel] +xzwrmkbqtm-akidmvomz-pcvb-mvoqvmmzqvo-122[mvoqz] +sbnqbhjoh-ezf-fohjoffsjoh-233[xskyb] +jyddc-yrwxefpi-fewoix-hiwmkr-412[pdekg] +fab-eqodqf-rxaiqd-xmnadmfadk-690[sicjl] +xcitgcpixdcpa-rpcsn-htgkxrth-427[stznv] +rflsjynh-rnqnyfwd-lwfij-jll-xytwflj-229[lfjnw] +zotts-wlsiayhcw-vumeyn-fuvilunils-500[ilsun] +odiih-yujbcrl-pajbb-dbna-cnbcrwp-147[bcadi] +udskkaxawv-tmffq-klgjsyw-996[tmnfc] +emixwvqhml-kpwkwtibm-wxmzibqwva-278[zomvn] +dfcxsqhwzs-dzoghwq-ufogg-zcuwghwqg-116[kmijn] +dwbcjkun-ouxfna-mnbrpw-745[nbuwa] +jchipqat-rwdrdapit-pcpanhxh-973[hglvu] +fkqbokxqflkxi-avb-zlkqxfkjbkq-861[wdnor] +wbhsfbohwcboz-foppwh-qighcasf-gsfjwqs-480[fhswb] +dzczkrip-xiruv-szfyrqriuflj-treup-kvtyefcfxp-451[rfipu] +fmsledevhsyw-fyrrc-eguymwmxmsr-698[yzoxu] +udskkaxawv-jsttal-wfyafwwjafy-840[nlkda] +sno-rdbqds-idkkxadzm-sqzhmhmf-287[lngzc] +crwwv-yxphbq-rpbo-qbpqfkd-341[bpqrw] +odiih-mhn-anjlzdrbrcrxw-563[xadcy] +jyddc-ikk-wlmttmrk-698[lmstk] +buzahisl-wshzapj-nyhzz-klzpnu-149[pjxor] +odkasqzuo-eomhqzsqd-tgzf-ymzmsqyqzf-560[frqmp] +gokzyxsjon-bkllsd-yzobkdsyxc-874[nbtmv] +excdklvo-pvygob-bocokbmr-952[tyzxa] +jvsvymbs-jovjvshal-aljouvsvnf-253[zgtdm] +hafgnoyr-qlr-erfrnepu-637[refna] +pelbtravp-sybjre-fnyrf-299[tjoim] +fodvvlilhg-gbh-vwrudjh-621[hvdgl] +kgjgrypw-epybc-bwc-bcnjmwkclr-678[smijy] +myxcewob-qbkno-mrymyvkdo-dbksxsxq-458[bkmox] +joufsobujpobm-fhh-dpoubjonfou-311[uvksy] +rflsjynh-ojqqdgjfs-ijajqturjsy-697[jqsfr] +vetllbybxw-vtgwr-kxtvjnblbmbhg-709[athym] +ajvyjprwp-ajmrxjlcren-kdwwh-lxwcjrwvnwc-433[qsaxt] +zbytomdsvo-mkxni-mykdsxq-myxdksxwoxd-952[xdmko] +esyfwlau-bwddqtwsf-suimakalagf-684[stvip] +jef-iushuj-fhezusjybu-fbqijys-whqii-huiuqhsx-582[uhijs] +tpspahyf-nyhkl-jovjvshal-bzly-alzapun-565[sdprn] +apwmeclga-hcjjwzcyl-umpiqfmn-132[shfrg] +kwtwznct-jcvvg-lmxizbumvb-148[vbcmt] +rmn-qcapcr-aylbw-umpiqfmn-366[juftv] +sorozgxe-mxgjk-hgyqkz-yzuxgmk-748[xuvst] +bkwzkqsxq-wsvsdkbi-qbkno-mkxni-mykdsxq-yzobkdsyxc-822[ksbqx] +ryexqpqhteki-vbemuh-skijecuh-iuhlysu-842[tszmj] +ikhcxvmbex-wrx-wxlbzg-501[zhqis] +lsyrkjkbnyec-mrymyvkdo-nozvyiwoxd-978[enkfi] +wdjcvuvmyjpn-mvhkvbdib-agjrzm-nojmvbz-395[tcxne] +uwtojhynqj-gfxpjy-fhvznxnynts-567[kqpvs] +iqmbazulqp-pkq-dqoquhuzs-534[ntpuq] +gntmfefwitzx-ojqqdgjfs-ijajqturjsy-385[jfqtg] +sebehvkb-fhezusjybu-zubboruqd-husuylydw-972[ytsim] +nzcczdtgp-nsznzwlep-hzcvdsza-405[yotgu] +joufsobujpobm-fhh-ufdiopmphz-675[tsymn] +cxy-bnlanc-snuuhknjw-anbnjalq-823[nabcj] +shoewudys-rkddo-huiuqhsx-374[dhsuo] +vagreangvbany-rtt-jbexfubc-403[ynepo] +aoubshwq-dzoghwq-ufogg-aobousasbh-714[oabgh] +njmjubsz-hsbef-dipdpmbuf-qvsdibtjoh-805[bdjsf] +zovldbkfz-gbiivybxk-lmboxqflkp-653[nyajo] +yknnkoera-xwogap-hkceopeyo-628[ybmzc] +nij-mywlyn-wbiwifuny-guleyncha-396[nyiwl] +ocipgvke-ecpfa-eqcvkpi-vgejpqnqia-258[jsiqz] +encuukhkgf-hnqygt-vgejpqnqia-882[dxzer] +odiih-ljwmh-anbnjalq-927[ahijl] +fkqbokxqflkxi-zxkav-ixyloxqlov-861[nxgja] +udskkaxawv-xmrrq-uzgugdslw-sfsdqkak-216[msfyx] +owshgfarwv-bwddqtwsf-kzahhafy-216[wafhd] +oaxadrgx-dmnnuf-ruzmzouzs-794[uqhse] +ziuxioqvo-akidmvomz-pcvb-zmikycqaqbqwv-616[iqvmo] +bqvvu-xqjju-opknwca-550[yzhum] +xgjougizobk-lruckx-gtgreyoy-670[nbfmk] +bxaxipgn-vgpst-uadltg-bpgztixcv-323[gptxa] +vcibutulxiom-jfumncw-alumm-nluchcha-448[ucmla] +irgyyolokj-xghhoz-uvkxgzouty-930[ogyhk] +kyelcrga-aylbw-amyrgle-umpiqfmn-782[almye] +jsvagsulanw-xdgowj-kzahhafy-138[dblcm] +ixccb-fkrfrodwh-uhdftxlvlwlrq-881[mblzw] +chnylhuncihuf-mwupyhayl-bohn-guleyncha-422[hnuyc] +irdgrxzex-treup-tfrkzex-uvgrikdvek-165[sjbnk] +xzwrmkbqtm-akidmvomz-pcvb-zmikycqaqbqwv-434[sanut] +ykhknbqh-zua-iwjwcaiajp-524[kjlio] +jlidywncfy-mwupyhayl-bohn-uwkocmcncih-916[cyhnw] +nuatmlmdpage-omzpk-eqdhuoqe-326[ljtsm] +xmrrq-kusnwfywj-zmfl-suimakalagf-684[afmkl] +foadouwbu-qvcqczohs-rsgwub-116[oubcq] +etyyx-bgnbnkzsd-kzanqzsnqx-391[pnmlv] +pinovwgz-wvnfzo-hvmfzodib-291[ovzfi] +qekrixmg-gsrwyqiv-kvehi-fewoix-ywiv-xiwxmrk-828[iwxek] +jqwpihizlwca-xtiabqk-oziaa-kcabwumz-amzdqkm-928[aizkm] +qekrixmg-jpsaiv-stivexmsrw-672[etmsq] +excdklvo-gokzyxsjon-mrymyvkdo-bomosfsxq-562[okmsx] +qczcftiz-pibbm-aobousasbh-532[zynvo] +wbhsfbohwcboz-suu-gsfjwqsg-506[bdhxv] +lxwbdvna-pajmn-ajkkrc-anlnrerwp-563[anrjk] +lsyrkjkbnyec-pvygob-cobfsmoc-900[uyrgf] +cqwdujys-sxesebqju-ixyffydw-374[nyjvi] +odiih-ouxfna-anlnrerwp-433[naior] +rzvkjiduzy-xviyt-xjvodib-vxlpdndodji-993[aousd] +ltpedcxots-qphzti-rjhidbtg-htgkxrt-453[rjlkn] +krxqjijamxdb-kdwwh-fxatbqxy-823[wctav] +froruixo-edvnhw-vwrudjh-829[rdhou] +jvyyvzpcl-jhukf-aljouvsvnf-201[uwkic] +nij-mywlyn-vumeyn-zchuhwcha-266[hnycm] +ydjuhdqjyedqb-zubboruqd-tufbeocudj-244[vmkln] +qlm-pbzobq-mixpqfz-doxpp-mrozexpfkd-575[zswni] +qvbmzvibqwvit-moo-tijwzibwzg-330[ibvwz] +pbeebfvir-fpniratre-uhag-freivprf-949[gvxlm] +wfummczcyx-jfumncw-alumm-uwkocmcncih-890[vturj] +dwbcjkun-npp-cajrwrwp-355[kstqo] +dpssptjwf-cbtlfu-vtfs-uftujoh-441[ftsuj] +vrurcjah-pajmn-npp-anbnjalq-303[tozvd] +wfruflnsl-ojqqdgjfs-xfqjx-775[fjqls] +pbafhzre-tenqr-qlr-qrirybczrag-897[yszub] +sehheiylu-rkddo-udwyduuhydw-322[qbyad] +upq-tfdsfu-cbtlfu-nbobhfnfou-103[vpxyh] +ajvyjprwp-npp-dbna-cnbcrwp-901[stevo] +bkzrrhehdc-bzmcx-bnzshmf-qdrdzqbg-833[msuya] +amlqskcp-epybc-aylbw-rcaflmjmew-730[arbyn] +wbhsfbohwcboz-dzoghwq-ufogg-gozsg-272[gobhw] +ksodcbwnsr-dfcxsqhwzs-gqojsbusf-vibh-obozmgwg-194[rwimn] +mfklstdw-usfvq-hmjuzskafy-424[ulgym] +wfruflnsl-ojqqdgjfs-qfgtwfytwd-177[xbofz] +sedikcuh-whqtu-isqludwuh-xkdj-jhqydydw-218[dhuqw] +ltpedcxots-raphhxuxts-qphzti-advxhixrh-765[jahpi] +zgmfyxypbmsq-djmucp-rcaflmjmew-548[aeoiv] +qspkfdujmf-ezf-nbobhfnfou-207[lnkrt] +fbebmtkr-zktwx-pxtihgbsxw-ietlmbv-zktll-kxlxtkva-943[hajmb] +apwmeclga-hcjjwzcyl-bctcjmnkclr-548[yxnzl] +rflsjynh-kqtbjw-btwpxmtu-177[tbjwf] +kfg-jvtivk-treup-uvgcfpdvek-373[vkefg] +upq-tfdsfu-kfmmzcfbo-nbobhfnfou-285[vsglz] +chnylhuncihuf-mwupyhayl-bohn-xypyfijgyhn-266[pwahm] +apwmeclga-zyqicr-dglylagle-886[lagce] +jlidywncfy-xsy-qilembij-188[uxjts] +jqwpihizlwca-lgm-lmaqov-954[laimq] +qcffcgwjs-foppwh-gozsg-246[fgcop] +bqxnfdmhb-rbzudmfdq-gtms-cdrhfm-287[dmbfh] +gifavtkzcv-wcfnvi-rthlzjzkzfe-763[tmniq] +uqtqbizg-ozilm-kivlg-kwibqvo-tijwzibwzg-720[qndzg] +sxdobxkdsyxkv-mkxni-bomosfsxq-848[zyubw] +qfmcusbwq-foppwh-kcfygvcd-662[cfpqw] +sehheiylu-fbqijys-whqii-skijecuh-iuhlysu-660[kdjyq] +sedikcuh-whqtu-uww-bqrehqjeho-660[dtawl] +veqtekmrk-wgezirkiv-lyrx-eguymwmxmsr-464[emrkg] +lqwhuqdwlrqdo-exqqb-uhdftxlvlwlrq-231[ydznk] +sno-rdbqds-bzmcx-otqbgzrhmf-183[gomah] +ujqgywfau-jsttal-hmjuzskafy-476[lghae] +yrwxefpi-jpsaiv-gsrxemrqirx-100[yazxo] +udglrdfwlyh-exqqb-sxufkdvlqj-569[dlqfu] +ugjjgkanw-uzgugdslw-esjcwlafy-736[rnxjs] +pdjqhwlf-sodvwlf-judvv-orjlvwlfv-673[vldfj] +xekdwvwnzkqo-fahhuxawj-ajcejaanejc-524[ajewc] +pwcvonofrcig-pibbm-fsqswjwbu-766[myazu] +tcrjjzwzvu-wcfnvi-glityrjzex-893[bkuyx] +lugjuacha-wbiwifuny-omyl-nymncha-448[mosph] +ckgvutofkj-inuiurgzk-jkvgxzsktz-228[kguzi] +ydjuhdqjyedqb-sqdto-ijehqwu-868[ozqsj] +sxdobxkdsyxkv-zvkcdsm-qbkcc-myxdksxwoxd-640[xdksc] +odkasqzuo-dmnnuf-dqmocgueufuaz-482[wfbke] +wpuvcdng-tcddkv-wugt-vguvkpi-414[hayjs] +lqwhuqdwlrqdo-edvnhw-uhfhlylqj-439[bjzye] +wpuvcdng-dwppa-ceswkukvkqp-674[mxnkj] +qzlozfhmf-bkzrrhehdc-okzrshb-fqzrr-zbpthrhshnm-365[hrzbf] +raphhxuxts-rpcsn-rdpixcv-rjhidbtg-htgkxrt-635[yozvr] +tfejldvi-xiruv-gcrjkzt-xirjj-tljkfdvi-jvimztv-321[veyxs] +ryexqpqhteki-sxesebqju-iqbui-868[qebar] +eqpuwogt-itcfg-hnqygt-tgegkxkpi-648[ywzjl] +uzfqdzmfuazmx-pkq-bgdotmeuzs-482[zmudf] +sbnqbhjoh-cbtlfu-bdrvjtjujpo-441[taquv] +gokzyxsjon-bkwzkqsxq-lexxi-bomosfsxq-354[xoskq] +oazegyqd-sdmpq-iqmbazulqp-dmnnuf-geqd-fqefuzs-456[qdefm] +dwbcjkun-ljwmh-lxjcrwp-anbnjalq-875[hoynm] +udskkaxawv-eadalsjq-yjsvw-xdgowj-klgjsyw-216[cnwyi] +surmhfwloh-exqqb-sxufkdvlqj-439[tspmq] +ksodcbwnsr-foppwh-zcuwghwqg-402[vopuk] +zsxyfgqj-hmthtqfyj-fhvznxnynts-697[fhnty] +yflexwxoalrp-yxphbq-bkdfkbbofkd-653[jzvpm] +ltpedcxots-tvv-rdcipxcbtci-557[ctdip] +slqryzjc-djmucp-qyjcq-756[cjqyd] +rgndvtcxr-qphzti-bpcpvtbtci-817[tcpbi] +ftzgxmbv-fbebmtkr-zktwx-vtgwr-vhtmbgz-lmhktzx-371[wzxvl] +htqtwkzq-hfsid-yjhmstqtld-463[rxszy] +rwcnawjcrxwju-yujbcrl-pajbb-mnenuxyvnwc-979[gkutb] +gokzyxsjon-tovvilokx-kmaescsdsyx-562[dwlah] +iutyaskx-mxgjk-lruckx-iayzuskx-ykxboik-826[kxiuy] +vhglnfxk-zktwx-yehpxk-hixktmbhgl-891[diznt] +sedikcuh-whqtu-kdijqrbu-sqdto-seqjydw-iuhlysui-790[lksjh] +jyfvnlupj-zjhclunly-obua-vwlyhapvuz-617[pirsw] +iuruxlar-sgmtkzoi-hgyqkz-zkinturume-670[qatsn] +wkqxodsm-mrymyvkdo-mecdywob-cobfsmo-250[hgarm] +odiih-kjbtnc-nwprwnnarwp-381[qpodn] +kfg-jvtivk-tyftfcrkv-kirzezex-373[srcvd] +gcfcnuls-aluxy-zotts-wuhxs-omyl-nymncha-552[clnsu] +xmtjbzidx-zbb-xpnojhzm-nzmqdxz-421[mnkio] +qjopwxha-acc-iwngapejc-160[jimst] +emixwvqhml-kivlg-kwibqvo-aitma-564[qspyb] +nvrgfezqvu-avccpsvre-cfxzjkztj-529[lmnsh] +emixwvqhml-ktiaaqnqml-xtiabqk-oziaa-ikycqaqbqwv-746[ozadu] +zhdsrqlchg-hjj-orjlvwlfv-751[hjlrv] +cybyjqho-whqtu-uww-qsgkyiyjyed-478[szxuo] +clxalrtyr-nsznzwlep-wzrtdetnd-405[lnrtz] +sgmtkzoi-yigbktmkx-natz-rghuxgzuxe-722[gktxz] +hjgbwuladw-tskcwl-sfsdqkak-502[txdsw] +yrwxefpi-hci-vigimzmrk-646[hdmzy] +hqcfqwydw-hqrryj-jusxdebewo-946[qwdeh] +wsvsdkbi-qbkno-cmkfoxqob-rexd-yzobkdsyxc-276[wptxs] +qfmcusbwq-qvcqczohs-zcuwghwqg-870[mnybx] +clxalrtyr-nsznzwlep-cpdplcns-743[rtycz] +fbebmtkr-zktwx-ktuubm-ybgtgvbgz-553[osmdy] +jvuzbtly-nyhkl-yhtwhnpun-jovjvshal-ylzlhyjo-773[hlyjn] +slqryzjc-aylbw-pcacgtgle-782[nxkri] +tfcfiwlc-wcfnvi-wzeretzex-971[smobe] +jef-iushuj-uww-qsgkyiyjyed-556[xzrwq] +crwwv-yxphbq-xkxivpfp-653[pxvwb] +hqcfqwydw-zubboruqd-husuylydw-244[lqeho] +oxmeeuruqp-qss-eqdhuoqe-534[equos] +qxdwpopgsdjh-rgndvtcxr-gpqqxi-gthtpgrw-687[gpdqr] +mybbycsfo-mrymyvkdo-bocokbmr-692[pymza] +myvybpev-oqq-yzobkdsyxc-250[sxytw] +fnjyxwrinm-kdwwh-uxprbcrlb-329[natqu] +aietsrmdih-nippcfier-gsrxemrqirx-958[iremp] +xmrrq-tmffq-vwhdgqewfl-138[fqmrw] +oqnidbshkd-bzmcx-sdbgmnknfx-599[nzdyx] +eqttqukxg-ecpfa-eqcvkpi-ewuvqogt-ugtxkeg-128[mytkp] +nchhg-ntwemz-amzdqkma-252[kmbop] +bjfutsneji-jll-zxjw-yjxynsl-775[ndbsw] +ktwbhtvmbox-lvtoxgzxk-angm-mxvaghehzr-319[ijqxb] +kyelcrga-afmamjyrc-pcqcypaf-210[acyfm] +myxcewob-qbkno-mkxni-oxqsxoobsxq-484[oxbqk] +esyfwlau-vqw-kzahhafy-788[jikae] +oqnidbshkd-eknvdq-btrsnldq-rdquhbd-391[njzml] +qjopwxha-bhksan-opknwca-888[ahkno] +udskkaxawv-jsttal-vwhdgqewfl-190[hqmnt] +excdklvo-lexxi-crszzsxq-458[uavnl] +frqvxphu-judgh-fdqgb-frdwlqj-wudlqlqj-179[bimaq] +iuruxlar-kmm-ykxboiky-852[tijpz] +tyepcyletzylw-mldvpe-lylwjdtd-509[lydet] +frqvxphu-judgh-gbh-whfkqrorjb-101[mhbes] +xqvwdeoh-edvnhw-zrunvkrs-699[zmudw] +irdgrxzex-treup-fgvirkzfej-893[fbsyn] +cxy-bnlanc-ljwmh-orwjwlrwp-771[ngpmz] +eqpuwogt-itcfg-gii-ucngu-388[hzgae] +ikhcxvmbex-cxeeruxtg-wxlbzg-553[mvnfs] +mrxivrexmsrep-fyrrc-asvowlst-854[codsq] +npmhcargjc-aylbw-qcptgacq-366[ditsg] +ftzgxmbv-ietlmbv-zktll-phkdlahi-241[ltbhi] +hqcfqwydw-tou-bewyijysi-270[hnvux] +emixwvqhml-kivlg-abwziom-590[imlvw] +pejji-nio-mecdywob-cobfsmo-926[wrjmp] +bknsykmdsfo-oqq-dbksxsxq-640[naysz] +gifavtkzcv-vxx-tfekrzedvek-789[cnwtp] +kmjezxodgz-diozmivodjivg-agjrzm-xjiovdihzio-915[yqktj] +shoewudys-vbemuh-qsgkyiyjyed-946[nqsjd] +htqtwkzq-ojqqdgjfs-rfwpjynsl-749[hryqo] +rmn-qcapcr-zyqicr-pcacgtgle-340[znstw] +bnqqnrhud-bzmcx-bnmszhmldms-729[yfetv] +surmhfwloh-gbh-rshudwlrqv-725[dsaym] +jchipqat-tvv-itrwcdadvn-505[povhu] +zgmfyxypbmsq-njyqrga-epyqq-rcaflmjmew-340[mqyae] +froruixo-exqqb-pdunhwlqj-283[nmuqd] +lnkfaypeha-xwogap-odellejc-784[ytrsz] +jlidywncfy-xsy-fuvilunils-864[ilyfn] +joufsobujpobm-dipdpmbuf-sftfbsdi-545[rwjnm] +tvsnigxmpi-gerhc-gsexmrk-eguymwmxmsr-932[pivem] +tfejldvi-xiruv-srjbvk-ivjvrity-815[vijrt] +zuv-ykixkz-yigbktmkx-natz-zkinturume-410[kzitu] +enzcntvat-pubpbyngr-qrcyblzrag-117[oywbs] +wsvsdkbi-qbkno-lkcuod-nofovyzwoxd-744[xnuqc] +wbhsfbohwcboz-foppwh-aobousasbh-246[nfsml] +uiovmbqk-jcvvg-abwziom-720[nbqaz] +etaqigpke-fag-fgrnqaogpv-674[gaefp] +ejpanjwpekjwh-nwxxep-hkceopeyo-238[bmscu] +qjopwxha-bhksan-wjwhuoeo-940[xenwh] +etyyx-bzmcx-bnzshmf-qdzbpthrhshnm-729[hbmzn] +uqtqbizg-ozilm-lgm-abwziom-356[tspmz] +excdklvo-mybbycsfo-tovvilokx-psxkxmsxq-874[axwon] +mvydjvxodqz-xviyt-xjvodib-pnzm-oznodib-187[nflym] +ixccb-zhdsrqlchg-edvnhw-xvhu-whvwlqj-465[hcvwd] +qspkfdujmf-votubcmf-tdbwfohfs-ivou-bdrvjtjujpo-181[esuzg] +fkqbokxqflkxi-qlm-pbzobq-bdd-jxohbqfkd-601[dcgym] +mtzslklcozfd-prr-nfdezxpc-dpcgtnp-301[tmnrk] +xekdwvwnzkqo-lhwopey-cnwoo-wymqeoepekj-290[rzsnk] +fubrjhqlf-sodvwlf-judvv-pdqdjhphqw-725[dfhjq] +shoewudys-zubboruqd-skijecuh-iuhlysu-608[ushbd] +zlkprjbo-doxab-zxkav-rpbo-qbpqfkd-679[bkopa] +nzcczdtgp-mldvpe-opawzjxpye-587[tkbms] +apuut-nxvqzibzm-cpio-yzkvmohzio-655[rsozd] +rgllk-ngzzk-ymdwqfuzs-300[yhzxu] +cvabijtm-jcvvg-uiviomumvb-538[ixajz] +oazegyqd-sdmpq-otaoaxmfq-pqbmdfyqzf-248[qadfm] +rtqlgevkng-fag-nqikuvkeu-960[nqdom] +bnknqetk-cxd-cdrhfm-183[mfpwa] +ohmnuvfy-wuhxs-wiuncha-lyuwkocmcncih-552[chunw] +hqtyeqsjylu-jef-iushuj-tou-fkhsxqiydw-296[isfmy] +kwtwznct-kwvacumz-ozilm-jiasmb-uiviomumvb-746[qmjyz] +qfmcusbwq-foppwh-twbobqwbu-298[bwqfo] +ykhknbqh-xqjju-owhao-472[hjtck] +dszphfojd-tdbwfohfs-ivou-mbcpsbupsz-103[sbdfo] +lahxpnwrl-ljwmh-nwprwnnarwp-641[srtpm] +ckgvutofkj-lruckx-jkvruesktz-878[zjlyk] +dyz-combod-zvkcdsm-qbkcc-nocsqx-926[yvute] +ktwbhtvmbox-wrx-nlxk-mxlmbgz-345[lsuwt] +nwilwcejc-nwxxep-zalhkuiajp-186[bznxr] +uzfqdzmfuazmx-otaoaxmfq-bgdotmeuzs-846[mzafo] +oxmeeuruqp-omzpk-oamfuzs-oazfmuzyqzf-352[ypdzg] +zhdsrqlchg-fdqgb-ghsduwphqw-361[hdgqs] +nchhg-jiasmb-amzdqkma-278[qklti] +tfiifjzmv-upv-wzeretzex-295[itvos] +eqttqukxg-ecpfa-ujkrrkpi-830[kepqr] +clotzlnetgp-mldvpe-nzyeltyxpye-145[xfpsy] +mbiyqoxsm-myvybpev-mkxni-mykdsxq-yzobkdsyxc-900[ymxbk] +plolwdub-judgh-vfdyhqjhu-kxqw-vhuylfhv-621[zqwmy] +atyzghrk-vxupkizork-jek-giwaoyozout-228[abrmv] +zotts-xsy-mufym-162[mstyf] +vhehkyne-ktuubm-mktbgbgz-293[qmytr] +kwvacumz-ozilm-zijjqb-ivitgaqa-616[fkoxt] +yaxsnlcrun-ajvyjprwp-snuuhknjw-anlnrerwp-771[zpyld] +raphhxuxts-bpvctixr-eaphixr-vgphh-bpcpvtbtci-115[phtxb] +nuatmlmdpage-odkasqzuo-qss-dqmocgueufuaz-768[umnqw] +yknnkoera-lhwopey-cnwoo-nawymqeoepekj-680[eonkw] +pybgmyargtc-aylbw-qyjcq-886[buzfp] +gzefmnxq-ngzzk-iadwetab-638[zaegn] +sbnqbhjoh-kfmmzcfbo-usbjojoh-129[acdkb] +lxaaxbren-lujbbrornm-ljwmh-lxjcrwp-mnyjacvnwc-355[yzsuk] +nchhg-lgm-nqvivkqvo-200[dystz] +plolwdub-judgh-udeelw-rshudwlrqv-335[sihdt] +wlsiayhcw-vumeyn-lymyulwb-292[zbrux] +ytu-xjhwjy-hfsid-htfynsl-qtlnxynhx-411[adxmu] +wkqxodsm-tovvilokx-ckvoc-822[uhgov] +chnylhuncihuf-vumeyn-nluchcha-500[rcbmn] +tfiifjzmv-lejkrscv-tyftfcrkv-jyzggzex-243[fjtvz] +eqpuwogt-itcfg-tcddkv-tgugctej-310[pyemh] +iuruxlar-xgsvgmotm-pkrrehkgt-xkykgxin-956[btwqp] +shoewudys-sxesebqju-qdqboiyi-894[seqbd] +zlkprjbo-doxab-gbiivybxk-pxibp-861[azyjx] +ckgvutofkj-inuiurgzk-lotgtiotm-982[qszly] +thnulapj-jshzzpmplk-jhukf-vwlyhapvuz-747[hpjlu] +pybgmyargtc-hcjjwzcyl-qcptgacq-782[bxsuc] +xgsvgmotm-vrgyzoi-mxgyy-iutzgotsktz-150[gtmoy] +laffe-yigbktmkx-natz-jkyomt-696[ktafm] +zvyvgnel-tenqr-pubpbyngr-znexrgvat-507[wfjhu] +pelbtravp-pnaql-znantrzrag-403[cbyja] +jqwpihizlwca-akidmvomz-pcvb-apqxxqvo-850[oxymv] +cvabijtm-ntwemz-twoqabqka-954[atbmq] +zixppfcfba-avb-zlkqxfkjbkq-809[zlmjc] +sebehvkb-zubboruqd-tufqhjcudj-556[budeh] +lqwhuqdwlrqdo-fdqgb-ghvljq-621[qdlgh] +qlm-pbzobq-crwwv-zxkav-zlxqfkd-rpbo-qbpqfkd-731[ciyxw] +pwcvonofrcig-gqojsbusf-vibh-qighcasf-gsfjwqs-740[csebm] +mvydjvxodqz-kmjezxodgz-kgvnodx-bmvnn-yzqzgjkhzio-239[zdovg] +kzgwomvqk-xtiabqk-oziaa-tijwzibwzg-564[menyj] +ksodcbwnsr-xszzmpsob-kcfygvcd-454[mbaod] +ejpanjwpekjwh-xwogap-hwxknwpknu-472[wpjkn] +mvydjvxodqz-hvbizodx-wpiit-hvivbzhzio-967[ivzdh] +mvydjvxodqz-mvwwdo-nzmqdxzn-681[jryzk] +enqvbnpgvir-rtt-freivprf-871[lgqrc] +hvbizodx-wpiit-kpmxcvndib-291[dyjmn] +molgbzqfib-mixpqfz-doxpp-xkxivpfp-965[pxfib] +fbebmtkr-zktwx-cxeeruxtg-nlxk-mxlmbgz-137[dckut] +luxciuwncpy-luvvcn-mbcjjcha-500[qsvzt] +apwmeclga-hcjjwzcyl-qyjcq-704[cjalq] +wpuvcdng-eqttqukxg-uecxgpigt-jwpv-cpcnauku-830[ucgpt] +iehepwnu-cnwza-fahhuxawj-pnwejejc-940[ewahj] +pbybeshy-pbeebfvir-pnaql-pbngvat-freivprf-715[uyzwp] +htsxzrjw-lwfij-ojqqdgjfs-zxjw-yjxynsl-957[iyonc] +sxdobxkdsyxkv-wsvsdkbi-qbkno-zvkcdsm-qbkcc-bomosfsxq-536[mbyan] +fruurvlyh-fkrfrodwh-uhdftxlvlwlrq-335[rflhu] +froruixo-hjj-orjlvwlfv-387[uyawn] +myvybpev-lexxi-vklybkdybi-978[ybvei] +chnylhuncihuf-vohhs-xymcah-240[yxnmh] +tagzsrsjvgmk-vqw-vwhsjlewfl-606[svwgj] +zbytomdsvo-lexxi-domrxyvyqi-250[oxydi] +qfkkj-clmmte-opgpwzaxpye-821[pekma] +lgh-kwujwl-udskkaxawv-jsttal-hmjuzskafy-320[axyrm] +irdgrxzex-nvrgfezqvu-avccpsvre-cfxzjkztj-191[sclzh] +mhi-lxvkxm-xzz-etuhktmhkr-319[rcomn] +lhkhszqx-fqzcd-dff-sdbgmnknfx-391[ugevx] +apwmeclga-aylbw-ylyjwqgq-314[izfye] +yflexwxoalrp-zlkprjbo-doxab-ciltbo-qbzeklildv-341[byclp] +cvabijtm-kwzzwaqdm-ntwemz-abwziom-252[rdmvn] +qfkkj-upwwjmply-epnsyzwzrj-899[okhgz] +jxdkbqfz-avb-zlkqxfkjbkq-861[wptxb] +gpsxdprixkt-qphzti-hwxeexcv-947[krgwe] +nij-mywlyn-wuhxs-wiuncha-lymyulwb-968[wylnu] +sbnqbhjoh-kfmmzcfbo-ufdiopmphz-987[bfhmo] +guahyncw-jfumncw-alumm-xyjfisgyhn-500[htamn] +ytu-xjhwjy-jll-ijxnls-879[duthg] +lgh-kwujwl-usfvq-ugslafy-esfsywewfl-944[ilszy] +tvsnigxmpi-tpewxmg-kveww-xiglrspskc-152[gipsw] +joufsobujpobm-cbtlfu-dvtupnfs-tfswjdf-129[fubjo] +rwcnawjcrxwju-bljenwpna-qdwc-mnyuxhvnwc-225[wncja] +qzchnzbshud-okzrshb-fqzrr-rzkdr-989[rzhbd] +qzoggwtwsr-pogysh-rsjszcdasbh-896[sghor] +gzefmnxq-dmnnuf-xmnadmfadk-326[tvuiw] +qzoggwtwsr-pibbm-zopcfohcfm-792[jsmfu] +mvydjvxodqz-xviyt-xjvodib-hvivbzhzio-369[iceny] +wkqxodsm-lkcuod-cdybkqo-224[dkocq] +veqtekmrk-ikk-wxsveki-542[keivm] +zlkprjbo-doxab-yxphbq-pqloxdb-419[ckdtm] +buzahisl-ibuuf-klzpnu-721[stjnm] +hwdtljsnh-kqtbjw-ijajqturjsy-515[plnqy] +luxciuwncpy-jfumncw-alumm-lyuwkocmcncih-474[lqpco] +tinnm-ibghopzs-rms-aobousasbh-506[sboah] +pbeebfvir-rtt-ratvarrevat-403[tdokj] +dmybmsuzs-pkq-efadmsq-300[msdqa] +ujqgywfau-tmffq-dgyaklauk-970[yxmid] +ovbunmneqbhf-enoovg-hfre-grfgvat-481[efgno] +hqfxxnknji-kzeed-uqfxynh-lwfxx-wjhjnansl-957[nxfhj] +plolwdub-judgh-edvnhw-pdqdjhphqw-985[dsxhg] +nwlddtqtpo-awldetn-rcldd-nfdezxpc-dpcgtnp-353[dnptc] +bwx-amkzmb-xzwrmkbqtm-ntwemz-amzdqkma-668[swmnl] +bqxnfdmhb-qzaahs-rdquhbdr-443[bdhqa] +egdytrixat-ide-htrgti-uadltg-steadnbtci-297[zampy] +gsrwyqiv-kvehi-gerhc-gsexmrk-erepcwmw-880[bkwts] +nsyjwsfyntsfq-gfxpjy-jslnsjjwnsl-749[lvzus] +dfcxsqhwzs-pibbm-gvwddwbu-246[dqbem] +mtzslklcozfd-ojp-fdpc-epdetyr-613[dpcef] +gbc-frperg-ohaal-erfrnepu-351[reafg] +gvaaz-cbtlfu-efqbsunfou-311[dvnmz] +ugdgjxmd-tskcwl-umklgewj-kwjnauw-892[wgjku] +iruzfrtkzmv-avccpsvre-nfibjyfg-243[jzoyc] +shoewudys-hqrryj-bqrehqjeho-296[heqrj] +hwdtljsnh-kqtbjw-htsyfnsrjsy-827[dntpc] +zilqwikbqdm-kivlg-uiviomumvb-902[imvbk] +rsvxltspi-sfnigx-wxsveki-984[sixve] +surmhfwloh-gbh-xvhu-whvwlqj-387[hwluv] +ubhatstkwhnl-yehpxk-wxlbzg-137[raqjb] +oknkvcta-itcfg-uecxgpigt-jwpv-ocpcigogpv-596[cgpio] +amjmpdsj-djmucp-nspafyqgle-470[ztpqn] +zixppfcfba-avb-abpfdk-471[abfpc] +owshgfarwv-jsttal-vwkayf-944[smcyx] +vjpwncrl-ljwmh-lxjcrwp-lxwcjrwvnwc-589[irbxq] +qvbmzvibqwvit-ziuxioqvo-lgm-amzdqkma-928[hgfln] +lxuxaodu-kjbtnc-jwjuhbrb-147[bjuxa] +etaqigpke-fag-yqtmujqr-440[qaegt] +zekvierkzferc-irdgrxzex-jtrmvexvi-ylek-rthlzjzkzfe-633[gkyzp] +mfklstdw-hdsklau-yjskk-kwjnauwk-762[vnfzg] +pkl-oaynap-fahhuxawj-oanreyao-706[mdfpn] +hwdtljsnh-hmthtqfyj-rfsfljrjsy-359[sxziu] +fab-eqodqf-ngzzk-bgdotmeuzs-144[kxags] +tagzsrsjvgmk-tskcwl-vwhsjlewfl-424[ejuah] +kzgwomvqk-jiasmb-uizsmbqvo-590[mbiko] +qjopwxha-xqjju-oanreyao-758[ubmon] +hvbizodx-xmtjbzidx-nxvqzibzm-cpio-yzkgjthzio-889[rmyqo] +iuruxlar-kmm-jkvruesktz-644[kruma] +ujqgywfau-jsttal-vwhdgqewfl-710[hbdlx] +jlidywncfy-wuhxs-wiuncha-yhachyylcha-630[hycaw] +lugjuacha-wlsiayhcw-dyffsvyuh-uhufsmcm-890[juefh] +hjgbwuladw-xdgowj-hmjuzskafy-398[wqigl] +yuxufmdk-sdmpq-pkq-etubbuzs-456[wldkg] +vcibutulxiom-dyffsvyuh-qilembij-110[jdnmz] +nzwzcqfw-clmmte-dpcgtnpd-509[cdmnp] +aczupnetwp-nlyoj-nzletyr-zapcletzyd-665[zelnp] +htsxzrjw-lwfij-wfintfhynaj-kqtbjw-knsfshnsl-983[kytzm] +enqvbnpgvir-onfxrg-qrirybczrag-611[rgnbi] +molgbzqfib-ciltbo-xkxivpfp-159[biflo] +plolwdub-judgh-fkrfrodwh-ghyhorsphqw-517[hdorw] +gzefmnxq-omzpk-oazfmuzyqzf-872[zkycu] +qjopwxha-lhwopey-cnwoo-naoawnyd-186[cvyno] +jyfvnlupj-ipvohghykvbz-jovjvshal-ylzlhyjo-435[xlenk] +ajmrxjlcren-kjbtnc-jwjuhbrb-329[klcuz] +wdjcvuvmyjpn-ezggtwzvi-jkzmvodjin-603[gmveh] +muqfedyput-fbqijys-whqii-bqrehqjeho-192[vdlge] +ktfitzbgz-xzz-ftgtzxfxgm-605[izfql] +bknsykmdsfo-oqq-wkbuodsxq-458[stifb] +slqryzjc-hcjjwzcyl-yaosgqgrgml-314[qymir] +gpewwmjmih-veffmx-xvemrmrk-126[itcvu] +rdadguja-gpqqxi-ldgzhwde-297[hnvso] +lxaaxbren-mhn-cnlqwxuxph-251[xvjuz] +xst-wigvix-fewoix-gsrxemrqirx-698[xireg] +iehepwnu-cnwza-zua-wymqeoepekj-108[sdnmj] +oknkvcta-itcfg-rncuvke-itcuu-hkpcpekpi-908[pgfbe] +enqvbnpgvir-ohaal-hfre-grfgvat-351[hsgdf] +ixccb-iorzhu-hqjlqhhulqj-647[hqcij] +apuut-agjrzm-jkzmvodjin-915[jamuz] +hqcfqwydw-rqiauj-ijehqwu-530[qwhij] +vhehkyne-ktwbhtvmbox-lvtoxgzxk-angm-kxvxbobgz-683[tsurp] +gntmfefwitzx-idj-knsfshnsl-723[fnsit] +ajvyjprwp-bljenwpna-qdwc-ujkxajcxah-563[yskxv] +joufsobujpobm-dboez-dpbujoh-mbcpsbupsz-259[bopuj] +xlrypetn-prr-nzyeltyxpye-847[yeprl] +zuv-ykixkz-xgsvgmotm-lruckx-jkvgxzsktz-696[ijlfz] +jqwpihizlwca-moo-lmxtwgumvb-798[nkzsr] +jsvagsulanw-kusnwfywj-zmfl-klgjsyw-736[ectrq] +ykhknbqh-nwxxep-nawymqeoepekj-758[cfvdy] +kzeed-gfxpjy-tujwfyntsx-385[aunmy] +slqryzjc-qaytclecp-fslr-dglylagle-184[lcyae] +laffe-vrgyzoi-mxgyy-iutzgotsktz-410[gtyzf] +gpbepvxcv-hrpktcvtg-wjci-stktadebtci-141[zoqhx] +yaxsnlcrun-lqxlxujcn-mnyuxhvnwc-641[nxclu] +tagzsrsjvgmk-kusnwfywj-zmfl-dstgjslgjq-294[gayon] +kwzzwaqdm-zijjqb-xczkpiaqvo-902[mkgjt] +mfklstdw-usfvq-ugslafy-xafsfuafy-684[fsaul] +zvyvgnel-tenqr-ovbunmneqbhf-sybjre-fgbentr-117[shfce] +emixwvqhml-akidmvomz-pcvb-amzdqkma-720[relbk] +rdggdhxkt-eaphixr-vgphh-hwxeexcv-973[xozyv] +bqvvu-zua-iwngapejc-992[nmdax] +bjfutsneji-kqtbjw-wjxjfwhm-203[irjmx] +bdavqofuxq-nmewqf-abqdmfuaze-976[vgzhc] +vdzonmhydc-okzrshb-fqzrr-rzkdr-313[rzdhk] +sawlkjevaz-oywrajcan-dqjp-wjwhuoeo-836[ajwoe] +fruurvlyh-gbh-sxufkdvlqj-413[kftmo] +fruurvlyh-sodvwlf-judvv-ghsorbphqw-569[tadzk] +sbejpbdujwf-tdbwfohfs-ivou-dpoubjonfou-103[rbqio] +oxmeeuruqp-otaoaxmfq-xasuefuoe-222[ozipy] +rdggdhxkt-qphzti-ejgrwphxcv-921[tusrb] +dkqjcbctfqwu-fag-yqtmujqr-882[kzvuf] +gzefmnxq-dmnnuf-mzmxkeue-248[menfu] +kgjgrypw-epybc-aylbw-kylyeckclr-314[mlvhs] +bwx-amkzmb-akidmvomz-pcvb-abwziom-148[nmtyw] +ckgvutofkj-sorozgxe-mxgjk-xghhoz-xkykgxin-670[gkxoh] +zhdsrqlchg-fkrfrodwh-ghsorbphqw-803[cjybd] +hvbizodx-wvnfzo-adivixdib-603[xwstz] +tvsnigxmpi-gerhc-hitpscqirx-204[icghp] +jrncbavmrq-cynfgvp-tenff-npdhvfvgvba-741[ybszn] +mbiyqoxsm-pvygob-psxkxmsxq-952[mjfnc] +gsrwyqiv-kvehi-veffmx-gywxsqiv-wivzmgi-282[bdrgj] +clxalrtyr-xtwtelcj-rclop-awldetn-rcldd-cpdplcns-847[lcdrt] +ahngzyzqcntr-bzmcx-sdbgmnknfx-287[fmyqt] +zgmfyxypbmsq-aylbw-amyrgle-bctcjmnkclr-340[mybcl] +fydelmwp-prr-nzyeltyxpye-717[gfjxa] +rnqnyfwd-lwfij-rflsjynh-wfggny-xfqjx-931[fnjwy] +zilqwikbqdm-xtiabqk-oziaa-twoqabqka-278[ftonr] +bjfutsneji-gzssd-uzwhmfxnsl-827[sfjnu] +ojk-nzxmzo-pinovwgz-agjrzm-jkzmvodjin-733[zjomn] +ygcrqpkbgf-dcumgv-fgukip-570[vmhxn] +dzczkrip-xiruv-srjbvk-jyzggzex-945[uzneh] +bkzrrhehdc-bzmcx-lzmzfdldms-287[eclvd] +ziuxioqvo-kpwkwtibm-lmxizbumvb-564[txsru] +kzgwomvqk-lgm-lmxizbumvb-122[mbgkl] +htsxzrjw-lwfij-idj-xjwanhjx-463[obdze] +gntmfefwitzx-kqtbjw-wjxjfwhm-749[qzutv] +htsxzrjw-lwfij-jll-tujwfyntsx-671[xugan] +ymszqfuo-rxaiqd-etubbuzs-118[ubqsz] +vdzonmhydc-azrjds-lzqjdshmf-989[dzhjm] +dyz-combod-bkllsd-oxqsxoobsxq-354[nrmkx] +pyknyegle-afmamjyrc-yaosgqgrgml-626[zdlfg] +oxmeeuruqp-vqxxknqmz-oazfmuzyqzf-352[rnsyt] +qjopwxha-xqjju-pnwejejc-654[jepqw] +wifilzof-jfumncw-alumm-xypyfijgyhn-604[fjerw] +vagreangvbany-enoovg-fuvccvat-533[gncot] +avw-zljyla-zjhclunly-obua-thuhnltlua-669[wathd] +ynssr-lvtoxgzxk-angm-mxvaghehzr-345[vopnm] +cvabijtm-uqtqbizg-ozilm-xtiabqk-oziaa-lmdmtwxumvb-928[imabt] +frqvxphu-judgh-sodvwlf-judvv-pdqdjhphqw-751[azovy] +qmpmxevc-kvehi-jyddc-fyrrc-qerekiqirx-282[ygmhv] +fodvvlilhg-udeelw-pdunhwlqj-153[sndmo] +gpsxdprixkt-ytaanqtpc-gthtpgrw-765[tpgar] +cvabijtm-kpwkwtibm-bmkpvwtwog-174[wbkmt] +vetllbybxw-yehpxk-wxlbzg-891[yekxl] +nzwzcqfw-nlyoj-dezclrp-275[zclnw] +qmpmxevc-kvehi-glsgspexi-gsrxemrqirx-828[exgim] +xtwtelcj-rclop-dnlgpyrpc-sfye-hzcvdsza-873[xmpon] +jrncbavmrq-pnaql-jbexfubc-793[bacjn] +ohmnuvfy-yaa-lymyulwb-266[yalmu] +nzwzcqfw-aczupnetwp-awldetn-rcldd-pyrtyppctyr-613[pctwd] +vqr-ugetgv-uecxgpigt-jwpv-rwtejcukpi-752[geptu] +tfcfiwlc-lejkrscv-upv-rthlzjzkzfe-607[tcfns] +hwdtljsnh-uqfxynh-lwfxx-knsfshnsl-229[xtngb] +iuruxlar-igtje-iayzuskx-ykxboik-930[kmghr] +xjgjmapg-ezggtwzvi-hvivbzhzio-421[gzivh] +gpbepvxcv-hrpktcvtg-wjci-hwxeexcv-349[xswrp] +tcorcikpi-eqttqukxg-gii-hkpcpekpi-622[ruxyk] +ygcrqpkbgf-ejqeqncvg-ucngu-440[gcqen] +etyyx-dff-qdbdhuhmf-729[wskto] +tfiifjzmv-upv-vexzevvizex-399[veizf] +houngfgxjuay-sorozgxe-mxgjk-jek-aykx-zkyzotm-566[aimhd] +hcd-gsqfsh-dzoghwq-ufogg-aobousasbh-714[ynfie] +foadouwbu-qobrm-qcohwbu-zopcfohcfm-792[obcfu] +ynukcajey-oywrajcan-dqjp-wjwhuoeo-680[jaowy] +rflsjynh-jll-rfsfljrjsy-489[jlfrs] +vkrhzxgbv-pxtihgbsxw-yehpxk-mktbgbgz-917[igtvy] +hjgbwuladw-tskcwl-dgyaklauk-294[aklwd] +cvabijtm-jcvvg-zmikycqaqbqwv-772[vcqab] +odiih-yujbcrl-pajbb-vjwjpnvnwc-849[jbcin] +tinnm-tzcksf-igsf-hsghwbu-220[bnamt] +pbeebfvir-wryylorna-jbexfubc-637[egouk] +xmtjbzidx-xviyt-yzqzgjkhzio-265[vxsry] +avw-zljyla-zjhclunly-obua-klwhyatlua-201[sjayl] +dfcxsqhwzs-qvcqczohs-fsgsofqv-246[dosrp] +rzvkjiduzy-xviyt-xjvodib-kpmxcvndib-291[cwzla] +gcfcnuls-aluxy-mwupyhayl-bohn-wihnuchgyhn-968[hnuyc] +dyz-combod-lsyrkjkbnyec-bkllsd-domrxyvyqi-328[vtxzd] +fruurvlyh-mhoobehdq-dftxlvlwlrq-907[jlves] +mrxivrexmsrep-gerhc-gsexmrk-tyvglewmrk-152[wzuly] +votubcmf-gmpxfs-pqfsbujpot-883[fpbmo] +bljenwpna-qdwc-anbnjalq-329[lcwmy] +xekdwvwnzkqo-ydkykhwpa-wjwhuoeo-550[toavy] +yhkpvhjapcl-yhiipa-jbzavtly-zlycpjl-201[lpyah] +xjinphzm-bmvyz-wvnfzo-nzmqdxzn-681[ykfxe] +pbeebfvir-rtt-ybtvfgvpf-507[bftve] +gvcskirmg-ikk-hizipstqirx-750[iyquj] +yhwooebeaz-lhwopey-cnwoo-oanreyao-108[tmuag] +wlqqp-jtrmvexvi-ylek-nfibjyfg-581[tnrhf] +tfiifjzmv-avccpsvre-jyzggzex-477[mvnjr] +xjmmjndqz-zbb-yzndbi-811[bzdjm] +qjopwxha-xwogap-nayaerejc-160[isjqz] +qzlozfhmf-azrjds-knfhrshbr-573[dfmys] +vhglnfxk-zktwx-vetllbybxw-vtgwr-vhtmbgz-ybgtgvbgz-761[gbtvl] +etaqigpke-ecpfa-eqcvkpi-cpcnauku-336[eyxtb] +lqwhuqdwlrqdo-fdqgb-frdwlqj-zrunvkrs-933[tvijl] +gvcskirmg-tvsnigxmpi-gerhc-gsexmrk-wlmttmrk-828[szawg] +irdgrxzex-kfg-jvtivk-wcfnvi-jyzggzex-269[givxz] +cqwdujys-sqdto-iqbui-270[siyeh] +bnqqnrhud-bgnbnkzsd-trdq-sdrshmf-807[dnbqr] +rgndvtcxr-hrpktcvtg-wjci-prfjxhxixdc-193[yjsht] +qekrixmg-hci-xvemrmrk-282[mreik] +xcitgcpixdcpa-snt-apqdgpidgn-349[mfywv] +wkqxodsm-pvygob-wkbuodsxq-978[ysamp] +aoubshwq-qvcqczohs-kcfygvcd-558[ytvls] +tyepcyletzylw-qwzhpc-opalcexpye-301[gamdn] +tfcfiwlc-treup-uvjzxe-607[nrthm] +ubhatstkwhnl-lvtoxgzxk-angm-inkvatlbgz-865[tagkl] +wihmogyl-aluxy-yaa-qilembij-890[emvct] +bxaxipgn-vgpst-ltpedcxots-gpqqxi-hidgpvt-245[pgtxi] +jfifqxov-doxab-mixpqfz-doxpp-obpbxoze-107[ghpyi] +gvaaz-dpssptjwf-sbccju-fohjoffsjoh-675[pfzwa] +gzefmnxq-eomhqzsqd-tgzf-efadmsq-378[qefmz] +emixwvqhml-kivlg-zmkmqdqvo-876[dcfin] +fodvvlilhg-fdqgb-frqwdlqphqw-725[qdflg] +laffe-pkrrehkgt-rumoyzoiy-670[dyjut] +egdytrixat-qphzti-tcvxcttgxcv-245[tcxgi] +htqtwkzq-wfintfhynaj-xhfajsljw-mzsy-jslnsjjwnsl-645[eynzi] +vrurcjah-pajmn-npp-mnyuxhvnwc-563[npach] +ejpanjwpekjwh-acc-klanwpekjo-576[jaekp] +kwvacumz-ozilm-kpwkwtibm-uizsmbqvo-876[mikwz] +hjgbwuladw-xdgowj-esfsywewfl-866[byzdm] +pbybeshy-wryylorna-npdhvfvgvba-351[stmxy] +qjopwxha-ywjzu-hkceopeyo-654[tysoa] +lhkhszqx-fqzcd-dff-vnqjrgno-417[fqdhn] +rgllk-otaoaxmfq-fdmuzuzs-768[vkqac] +ohmnuvfy-xsy-omyl-nymncha-214[hmtfs] +enzcntvat-cynfgvp-tenff-nanylfvf-455[cuimh] +sedikcuh-whqtu-sehheiylu-tou-bqrehqjeho-868[ydaux] +tyepcyletzylw-ojp-opalcexpye-145[wciks] +udpsdjlqj-hjj-frqwdlqphqw-309[gbpcz] +eqpuwogt-itcfg-lgnnadgcp-vtckpkpi-388[gpcti] +rkpqxyib-pzxsbkdbo-erkq-zrpqljbo-pbosfzb-133[bpkoq] +kdijqrbu-sxesebqju-tufqhjcudj-114[tdbva] +gsvvswmzi-wgezirkiv-lyrx-irkmriivmrk-412[twsrk] +ucynmlgxcb-qaytclecp-fslr-amlryglkclr-704[lcrya] +xst-wigvix-veffmx-wxsveki-100[ocvmr] +surmhfwloh-vfdyhqjhu-kxqw-frqwdlqphqw-829[hqwfd] +xmrrq-usfvq-esfsywewfl-528[alidm] +zhdsrqlchg-lqwhuqdwlrqdo-sodvwlf-judvv-ghsorbphqw-777[rtnmj] +egdytrixat-xcitgcpixdcpa-rwdrdapit-uxcpcrxcv-245[cdabn] +yrwxefpi-ikk-gywxsqiv-wivzmgi-152[iwgkv] +qcffcgwjs-foppwh-obozmgwg-558[zotsu] +veqtekmrk-gerhc-gsexmrk-hitpscqirx-568[nczdq] +gzefmnxq-pkq-pqbmdfyqzf-794[jxrmh] +eadalsjq-yjsvw-usfvq-ugslafy-ugflsafewfl-632[fsalu] +esyfwlau-usfvq-ugslafy-vwhdgqewfl-684[flsuw] +ktfitzbgz-fbebmtkr-zktwx-utldxm-wxlbzg-683[afwhg] +wihmogyl-aluxy-vohhs-uwkocmcncih-292[wzryd] +bkzrrhehdc-idkkxadzm-lzmzfdldms-677[oxwvn] +clxalrtyr-qwzhpc-lnbftdtetzy-249[zryvn] +rgllk-fab-eqodqf-vqxxknqmz-pqbxakyqzf-222[qfkxa] +xjinphzm-bmvyz-xviyt-mzxzdqdib-603[xnhfs] +htsxzrjw-lwfij-hmthtqfyj-wjfhvznxnynts-385[zreuy] +myvybpev-gokzyxsjon-oqq-nozvyiwoxd-692[iyzuj] +hcd-gsqfsh-pogysh-gvwddwbu-480[mysuk] +hcd-gsqfsh-foppwh-rsgwub-428[kvtfs] +frqvxphu-judgh-exqqb-uhvhdufk-621[wtgmn] +vhglnfxk-zktwx-vahvhetmx-vhgmtbgfxgm-345[hnamj] +tagzsrsjvgmk-usfvq-ugslafy-ugflsafewfl-892[yckbv] +joufsobujpobm-gmpxfs-vtfs-uftujoh-233[foujs] +zsxyfgqj-ojqqdgjfs-zxjw-yjxynsl-593[jqsxy] +bnknqetk-atmmx-qdzbpthrhshnm-131[ecnmt] +hmsdqmzshnmzk-dff-sqzhmhmf-859[dnxcz] +hqtyeqsjylu-tou-udwyduuhydw-348[uydhq] +ktiaaqnqml-kpwkwtibm-zmikycqaqbqwv-772[tlrsg] +nzydfxpc-rclop-mtzslklcozfd-mfyyj-nfdezxpc-dpcgtnp-951[cpdfz] +ckgvutofkj-hatte-gtgreyoy-644[tgeko] +iwcjapey-zua-paydjkhkcu-628[hntmg] +bnknqetk-okzrshb-fqzrr-trdq-sdrshmf-729[tuzoy] +qmpmxevc-kvehi-yrwxefpi-glsgspexi-wlmttmrk-828[hsyvf] +amjmpdsj-njyqrga-epyqq-qcptgacq-106[bhysd] +dwbcjkun-ljwmh-mnyuxhvnwc-641[wuyrz] +gspsvjyp-jpsaiv-hiwmkr-854[zthel] +gsrwyqiv-kvehi-gerhc-stivexmsrw-750[whgse] +xjgjmapg-wpiit-ozxcijgjbt-889[ytsop] +xgjougizobk-kmm-rghuxgzuxe-280[cwrty] +zovldbkfz-oxjmxdfkd-oxyyfq-ixyloxqlov-653[snkwb] +qczcftiz-qvcqczohs-gsfjwqsg-142[cqszf] +krxqjijamxdb-mhn-ldbcxvna-bnaerln-771[ravbt] +pybgmyargtc-bwc-bcqgel-860[bcgya] +wyvqljapsl-jovjvshal-shivyhavyf-773[vahjl] +pbafhzre-tenqr-onfxrg-bcrengvbaf-221[zyaro] +glrcplyrgmlyj-bwc-pcqcypaf-132[clpyg] +dpmpsgvm-dboez-dpbujoh-tfswjdft-545[bdmzf] +dkqjcbctfqwu-rncuvke-itcuu-cpcnauku-700[cuknq] +ajmrxjlcren-yujbcrl-pajbb-anbnjalq-459[yslvg] +oazegyqd-sdmpq-bxmefuo-sdmee-fqotzaxask-586[vfmnu] +ugdgjxmd-jsttal-ksdwk-632[hfjix] +aietsrmdih-gvcskirmg-tpewxmg-kveww-vigimzmrk-412[kfcim] +drxevkzt-jtrmvexvi-ylek-uvgcfpdvek-685[vekdr] +excdklvo-bkllsd-nozvyiwoxd-250[dlokv] +uwtojhynqj-hfsid-wjxjfwhm-281[fqsmx] +plolwdub-judgh-udeelw-uhfhlylqj-205[ludhe] +oqnidbshkd-dff-zmzkxrhr-729[cvlkx] +bknsykmdsfo-tovvilokx-bomosfsxq-328[boqly] +dpotvnfs-hsbef-qspkfdujmf-cvooz-tijqqjoh-961[zmnyi] +gspsvjyp-fyrrc-gsrxemrqirx-490[rsgpx] +gifavtkzcv-szfyrqriuflj-wcfnvi-uvmvcfgdvek-139[zadfj] +gsrwyqiv-kvehi-wgezirkiv-lyrx-wxsveki-490[alpzb] +ykhknbqh-ydkykhwpa-zalhkuiajp-862[khayp] +dmybmsuzs-yuxufmdk-sdmpq-bxmefuo-sdmee-fqotzaxask-586[nwikx] +nwzekwypera-bhksan-nayaerejc-940[xnmta] +wrs-vhfuhw-hjj-zrunvkrs-283[hrjsu] +ajyqqgdgcb-pyzzgr-amlryglkclr-782[lozts] +ohmnuvfy-jfumncw-alumm-womnigyl-mylpcwy-110[mqrgd] +foadouwbu-suu-obozmgwg-792[hgkuj] +wdjcvuvmyjpn-ytz-yzkgjthzio-109[jyztv] +ucynmlgxcb-pyzzgr-qfgnngle-210[iftry] +ymszqfuo-omzpk-oamfuzs-pqhqxabyqzf-872[qzfmo] +clotzlnetgp-ojp-opawzjxpye-769[pnhtz] +mhi-lxvkxm-yehpxk-ftgtzxfxgm-657[etajx] +surmhfwloh-fkrfrodwh-uhfhlylqj-699[rkslj] +iruzfrtkzmv-tyftfcrkv-kirzezex-841[emztq] +bdavqofuxq-nmewqf-ogefayqd-eqdhuoq-352[jpmyv] +bdavqofuxq-otaoaxmfq-xasuefuoe-326[aofqu] +gpsxdprixkt-tvv-ldgzhwde-219[dgptv] +pbeebfvir-rtt-bcrengvbaf-897[enlaq] +jchipqat-gpqqxi-bpgztixcv-375[cnqyt] +glrcplyrgmlyj-qaytclecp-fslr-pcqcypaf-574[clpyr] +pejji-oqq-vyqscdsmc-640[qcjsd] +houngfgxjuay-yigbktmkx-natz-xkykgxin-774[mszcw] +ltpedcxots-jchipqat-gpqqxi-bpcpvtbtci-219[isgfv] +gifavtkzcv-tyftfcrkv-drerxvdvek-659[vbdyz] +vjpwncrl-mhn-orwjwlrwp-641[wrjln] +vjpwncrl-ouxfna-bcxajpn-511[ydzfw] +rzvkjiduzy-xviyt-xjvodib-adivixdib-187[idvxb] +tinnm-suu-twbobqwbu-272[datjf] +apuut-xviyt-vxlpdndodji-941[zrtso] +jxdkbqfz-zixppfcfba-mixpqfz-doxpp-jxohbqfkd-705[fpxbd] +zilqwikbqdm-lgm-kwvbiqvumvb-876[bqpme] +jyddc-wgezirkiv-lyrx-wxsveki-256[sjntv] +ahngzyzqcntr-qzaahs-zbpthrhshnm-963[fzvai] +ksodcbwnsr-qfmcusbwq-suu-qighcasf-gsfjwqs-350[wyezk] +atyzghrk-igtje-iugzotm-jkyomt-462[ksuli] +dwbcjkun-ajmrxjlcren-yujbcrl-pajbb-nwprwnnarwp-563[tjsqg] +aoubshwq-dzoghwq-ufogg-aofyshwbu-896[hwcmz] +apwmeclga-npmhcargjc-njyqrga-epyqq-rpyglgle-340[dgtsc] +apwmeclga-aylbw-amyrgle-dglylagle-210[iumzy] +ydjuhdqjyedqb-rkddo-sedjqydcudj-738[ycbmx] +iuxxuyobk-xgjougizobk-pkrrehkgt-sgtgmksktz-644[pzsmw] +bnmrtldq-fqzcd-bgnbnkzsd-vnqjrgno-521[nbdqg] +wfruflnsl-gzssd-wjhjnansl-177[wtmsg] +yhwooebeaz-ywjzu-klanwpekjo-680[eowaj] +pynffvsvrq-cynfgvp-tenff-ernpdhvfvgvba-663[vbduy] +zilqwikbqdm-ntwemz-uizsmbqvo-356[yhenq] +jvsvymbs-zjhclunly-obua-jvuahputlua-721[uajlv] +fhezusjybu-rqiauj-tufbeocudj-400[ecamb] +ftzgxmbv-wrx-xgzbgxxkbgz-293[xgbzf] +chnylhuncihuf-xsy-xypyfijgyhn-578[jigcy] +vhkkhlbox-pxtihgbsxw-cxeeruxtg-wxlbzg-111[hsuty] +foadouwbu-tzcksf-gozsg-246[ofgsu] +xzwrmkbqtm-moo-nqvivkqvo-434[moqvk] +gvaaz-cvooz-dpoubjonfou-415[mcnzb] +pbafhzre-tenqr-enoovg-grpuabybtl-169[bktjl] +uwtojhynqj-gzssd-ywfnsnsl-723[phguv] +dlhwvupglk-zjhclunly-obua-klwhyatlua-227[luahk] +vhkkhlbox-vhehkyne-vahvhetmx-ybgtgvbgz-215[hvbeg] +qlm-pbzobq-gbiivybxk-lmboxqflkp-809[blqik] +forwcoqhwjs-qvcqczohs-ghcfous-792[mtuqn] +eqpuwogt-itcfg-dwppa-fgrnqaogpv-570[gpafo] +lxuxaodu-bljenwpna-qdwc-jwjuhbrb-121[rbqfd] +ykhknbqh-xqjju-oanreyao-680[ahjkn] +ugfkmewj-yjsvw-hdsklau-yjskk-kzahhafy-918[kahjs] +gbc-frperg-fpniratre-uhag-fnyrf-897[dskta] +myxcewob-qbkno-lexxi-wkxkqowoxd-770[spdoc] +cqwdujys-fbqijys-whqii-huiuqhsx-998[uhebs] +ckgvutofkj-igtje-iugzotm-rghuxgzuxe-774[gutei] +excdklvo-lexxi-psxkxmsxq-302[ypsmx] +mbiyqoxsm-dyz-combod-mkxni-mykdsxq-zebmrkcsxq-692[fnhpz] +zlkprjbo-doxab-gbiivybxk-xkxivpfp-809[ydtxn] +wdjcvuvmyjpn-ezggtwzvi-hvmfzodib-603[vzdgi] +njmjubsz-hsbef-fhh-bobmztjt-649[mxkjw] +wsvsdkbi-qbkno-oqq-ecob-docdsxq-796[rglok] +htsxzrjw-lwfij-gfxpjy-fsfqdxnx-307[uyteb] +wpuvcdng-ejqeqncvg-yqtmujqr-882[svamn] +tagzsrsjvgmk-hdsklau-yjskk-ugflsafewfl-606[tysrn] +kwtwznct-akidmvomz-pcvb-zmamizkp-200[skpom] +dpmpsgvm-dboez-dpbujoh-fohjoffsjoh-311[fknst] +rnqnyfwd-lwfij-hmthtqfyj-xytwflj-567[gzkol] +zntargvp-pnaql-hfre-grfgvat-923[yijbm] +dzczkrip-xiruv-treup-tfrkzex-drerxvdvek-347[vrmsu] +ajyqqgdgcb-afmamjyrc-sqcp-rcqrgle-522[cqagr] +pelbtravp-ohaal-erprvivat-715[jnbmz] +irdgrxzex-sleep-ivrthlzjzkzfe-113[bmsnw] +eqpuwogt-itcfg-tcddkv-fgxgnqrogpv-804[gtcdf] +cvabijtm-moo-ivitgaqa-226[darfu] +ytu-xjhwjy-xhfajsljw-mzsy-zxjw-yjxynsl-281[wzjeb] +fkqbokxqflkxi-yxphbq-obxznrfpfqflk-809[dcasb] +gokzyxsjon-sxdobxkdsyxkv-mkxni-ecob-docdsxq-276[zypso] +ibghopzs-suu-kcfygvcd-402[cgsub] +tfiifjzmv-srjbvk-uvjzxe-581[sovtj] +gntmfefwitzx-gfxpjy-xmnuunsl-619[fnxgm] +lgh-kwujwl-bwddqtwsf-vwhsjlewfl-788[tlejf] +hjgbwuladw-wyy-ghwjslagfk-164[wgahj] +nzwzcqfw-ojp-qtylyntyr-431[ynqtw] +sbejpbdujwf-sbccju-vtfs-uftujoh-909[kujit] +vhkkhlbox-wrx-ftkdxmbgz-241[uwzex] +lahxpnwrl-bljenwpna-qdwc-cajrwrwp-381[yjzno] +lugjuacha-jfumncw-alumm-jolwbumcha-838[uamcj] +gvcskirmg-glsgspexi-jmrergmrk-828[smeyi] +thnulapj-ihzrla-thyrlapun-955[ahlnp] +sno-rdbqds-bzmcx-btrsnldq-rdquhbd-937[dbqrs] +vdzonmhydc-eknvdq-dmfhmddqhmf-781[dmhfn] +iehepwnu-cnwza-xqjju-ykjpwejiajp-368[jepwa] +dfcxsqhwzs-dzoghwq-ufogg-cdsfohwcbg-974[gcdfh] +sbqiiyvyut-tou-jhqydydw-608[okbzs] +htsxzrjw-lwfij-gzssd-uzwhmfxnsl-801[nmtjq] +hvbizodx-rzvkjiduzy-xviyt-yzqzgjkhzio-213[zivyd] +ajmrxjlcren-ljwmh-lxjcrwp-bqryyrwp-745[kheat] +vkppo-shoewudys-tou-udwyduuhydw-556[udowy] +dpotvnfs-hsbef-dmbttjgjfe-gmpxfs-nbslfujoh-363[qapli] +glrcplyrgmlyj-djmucp-qrmpyec-158[clmpr] +emixwvqhml-xtiabqk-oziaa-wxmzibqwva-642[rkpba] +qczcftiz-dzoghwq-ufogg-aofyshwbu-298[lmcuy] +cvabijtm-zilqwikbqdm-akidmvomz-pcvb-nqvivkqvo-746[ynxzo] +pkl-oaynap-acc-wjwhuoeo-134[jxlai] +xjmmjndqz-kgvnodx-bmvnn-rjmfncjk-291[njmdk] +ejpanjwpekjwh-nwxxep-nayaerejc-550[lisvd] +htwwtxnaj-htsxzrjw-lwfij-hfsid-htfynsl-wjfhvznxnynts-541[hntwf] +mbiyqoxsm-mkxni-mykdsxq-crszzsxq-770[zhowm] +rmn-qcapcr-ucynmlgxcb-cee-pcqcypaf-886[cpaem] +rtqlgevkng-ejqeqncvg-fgxgnqrogpv-466[zktns] +fydelmwp-mfyyj-nfdezxpc-dpcgtnp-769[anfej] +yuxufmdk-sdmpq-otaoaxmfq-pqbxakyqzf-742[ohxti] +vxupkizork-igtje-xkgiwaoyozout-592[bmwjf] +veqtekmrk-tvsnigxmpi-gerhc-gsexmrk-gywxsqiv-wivzmgi-802[dglps] +nsyjwsfyntsfq-uqfxynh-lwfxx-ijuqtdrjsy-931[ymnhu] +gifavtkzcv-avccpsvre-fgvirkzfej-841[ypigz] +krxqjijamxdb-kdwwh-mnyjacvnwc-641[krnma] +dszphfojd-ezf-sftfbsdi-805[fdszb] +xmrrq-tmffq-lwuzfgdgyq-372[fqgmr] +tagzsrsjvgmk-xdgowj-vwhsjlewfl-788[gjswl] +lsyrkjkbnyec-mkxni-nofovyzwoxd-614[knoyx] +dwbcjkun-mhn-bjunb-173[mykra] +vhehkyne-vtgwr-nlxk-mxlmbgz-319[eghkl] +bkzrrhehdc-bnqqnrhud-bzmcx-bnzshmf-otqbgzrhmf-677[xaszn] +oxmeeuruqp-bxmefuo-sdmee-abqdmfuaze-248[udtec] +jlidywncfy-mwupyhayl-bohn-uhufsmcm-500[yhmuc] +xjmmjndqz-zbb-mzvxlpdndodji-239[djmzb] +yuxufmdk-sdmpq-omzpk-qzsuzqqduzs-534[ofrpg] +tfejldvi-xiruv-vxx-uvgrikdvek-659[cnesm] +yaxsnlcrun-ajkkrc-anbnjalq-979[nmivs] +tvsnigxmpi-ikk-wivzmgiw-880[agunv] +mrxivrexmsrep-tpewxmg-kveww-viwievgl-698[evwim] +nglmtuex-yehpxk-labiibgz-241[begil] +zuv-ykixkz-ixeumktoi-igtje-iugzotm-aykx-zkyzotm-670[pjybl] +forwcoqhwjs-dzoghwq-ufogg-difqvogwbu-272[xkwoz] +ajyqqgdgcb-qaytclecp-fslr-bcqgel-886[mkvsi] +myxcewob-qbkno-mkxni-mykdsxq-wkbuodsxq-770[zmijb] +uwtojhynqj-kqtbjw-yjhmstqtld-333[jtqhw] +wsvsdkbi-qbkno-lkcuod-dbksxsxq-406[biaoe] +gpbepvxcv-rpcsn-rdpixcv-advxhixrh-895[dcwgp] +muqfedyput-isqludwuh-xkdj-mehaixef-712[betdq] +ckgvutofkj-inuiurgzk-xkgiwaoyozout-956[sazyo] +wfruflnsl-uqfxynh-lwfxx-btwpxmtu-541[fxluw] +qfmcusbwq-rms-igsf-hsghwbu-246[sbfgh] +ynukcajey-nwxxep-qoan-paopejc-602[htmbv] +ujqgywfau-uzgugdslw-jwkwsjuz-138[newms] +yflexwxoalrp-zxkav-cfkxkzfkd-705[ctnsy] +vjpwncrl-lqxlxujcn-mnyuxhvnwc-953[nawmz] +willimcpy-wuhxs-lyuwkocmcncih-786[cilwh] +mtzslklcozfd-clmmte-cpnptgtyr-119[tjkgv] +xlrypetn-awldetn-rcldd-cplnbftdtetzy-795[tdlen] +vkppo-rqiauj-huqsgkyiyjyed-452[yijkp] +vxupkizork-lruckx-jkbkruvsktz-124[eumyz] +diozmivodjivg-agjrzm-nzmqdxzn-915[otpfl] +owshgfarwv-hdsklau-yjskk-klgjsyw-918[qcjim] +zuv-ykixkz-igtje-iugzotm-zkinturume-202[plvqf] +zlilocri-oxyyfq-bkdfkbbofkd-835[bswmn] +ziuxioqvo-lgm-amzdqkma-798[maioq] +xqvwdeoh-sodvwlf-judvv-ghyhorsphqw-517[hvdow] +ovbunmneqbhf-enqvbnpgvir-onfxrg-qrfvta-507[nvbfq] +gbc-frperg-pnaql-genvavat-351[pmzkq] +eadalsjq-yjsvw-jsttal-suimakalagf-580[zjghy] +rdadguja-rpcsn-rdpixcv-apqdgpidgn-245[dpagr] +tbxmlkfwba-pzxsbkdbo-erkq-abpfdk-523[vifrq] +ocipgvke-uecxgpigt-jwpv-ugtxkegu-544[abfsh] +ovbunmneqbhf-zvyvgnel-tenqr-wryylorna-ybtvfgvpf-481[hxymg] +pinovwgz-xjinphzm-bmvyz-agjrzm-ozxcijgjbt-681[cqlnu] +tinnm-qobrm-ghcfous-220[hyczt] +iuruxlar-yigbktmkx-natz-ykxboiky-748[kixya] +bkzrrhehdc-bzmcx-bnzshmf-cdrhfm-209[hbcmr] +gpsxdprixkt-tvv-uxcpcrxcv-973[xcpvr] +forwcoqhwjs-rms-hfowbwbu-974[stzrm] +zovldbkfz-fkqbokxqflkxi-mixpqfz-doxpp-cfkxkzfkd-705[tsmfo] +vetllbybxw-lvtoxgzxk-angm-ftgtzxfxgm-371[sbemy] +hwbba-ejqeqncvg-tgugctej-232[iyrqv] +vqr-ugetgv-lgnnadgcp-wugt-vguvkpi-596[gvunp] +xgvnndadzy-wpiit-yzndbi-343[rawyd] +jxdkbqfz-oxyyfq-qbzeklildv-107[qbdfk] +wlsiayhcw-luvvcn-mufym-656[jbvne] +surmhfwloh-fdqgb-ghvljq-621[ymnve] +mvkccspson-bkllsd-vklybkdybi-432[yscux] +dszphfojd-sbccju-dvtupnfs-tfswjdf-129[itbfs] +lsyrkjkbnyec-lexxi-crszzsxq-978[sxcek] +qlm-pbzobq-mixpqfz-doxpp-zlkqxfkjbkq-211[satyb] +bknsykmdsfo-nio-kmaescsdsyx-744[tspif] +bpvctixr-rpcsn-rjhidbtg-htgkxrt-713[rtbcg] +sebehvkb-rqiauj-udwyduuhydw-140[udbeh] +zhdsrqlchg-fdqgb-hqjlqhhulqj-387[zptrs] +qxdwpopgsdjh-rpcsn-sthxvc-635[nbixj] +pualyuhapvuhs-msvdly-klzpnu-721[ulpah] +sbqiiyvyut-shoewudys-isqludwuh-xkdj-jhqydydw-894[dysuh] +wsvsdkbi-qbkno-lexxi-dbksxsxq-614[onzwh] +ydjuhdqjyedqb-rqiauj-efuhqjyedi-894[ocdpe] +kwzzwaqdm-ntwemz-wxmzibqwva-434[nwzml] +qspkfdujmf-fhh-nbobhfnfou-571[zpyau] +bxaxipgn-vgpst-tvv-detgpixdch-583[xwiac] +qfmcusbwq-dfcxsqhwzs-xszzmpsob-fsqswjwbu-402[lstrx] +dpmpsgvm-dboez-sfdfjwjoh-337[dfjmo] +dzoghwq-ufogg-fsgsofqv-636[gfoqs] +nzwzcqfw-dnlgpyrpc-sfye-qtylyntyr-509[milhd] +xgsvgmotm-pkrrehkgt-vaxingyotm-176[jubcm] +xgsvgmotm-jek-cuxqynuv-644[soxwn] +cxy-bnlanc-lahxpnwrl-kdwwh-fxatbqxy-485[zamhj] +irgyyolokj-inuiurgzk-sgtgmksktz-982[vzkrq] +xgvnndadzy-xcjxjgvoz-xjiovdihzio-733[ozhyu] +gvcskirmg-nippcfier-xiglrspskc-334[bastq] +zlilocri-gbiivybxk-obxznrfpfqflk-367[ntyda] +pyknyegle-pyzzgr-pcqcypaf-886[nxvzy] +zhdsrqlchg-gbh-frqwdlqphqw-361[nqzts] +kyelcrga-cee-yaosgqgrgml-808[izdqr] +hplazytkpo-prr-cpnptgtyr-379[prtya] diff --git a/src/main/resources/2016/day5.txt b/src/main/resources/2016/day5.txt new file mode 100644 index 00000000..b003e0de --- /dev/null +++ b/src/main/resources/2016/day5.txt @@ -0,0 +1 @@ +abbhdwsy diff --git a/src/main/resources/2016/day6.txt b/src/main/resources/2016/day6.txt new file mode 100644 index 00000000..23a40593 --- /dev/null +++ b/src/main/resources/2016/day6.txt @@ -0,0 +1,572 @@ +blrqqadw +hxwteava +xtzzneor +ufydaiyx +hhvcoozu +nbbvuvmd +usvdcalw +rpntrbyo +kgjholvo +nlohafzu +gxmifiuy +xndolmhm +zmtsfmtq +wkdzmogx +aogqflji +uphmjtnl +jkqognlw +mdzsbrij +zyxolasw +kvdyikgy +xpxgmuqq +viuoqyap +simgbmca +qxcjewnz +ivwoedjr +mlmzozlr +jmyallmm +oeecmjte +miuvzeww +qtfsiigb +lstgpdfp +pevoamxy +mjtpbedv +ugbasbgg +idcnuhtx +wwhcrxdr +prrugmrq +npoiywvw +zpkohigv +wngoczfk +gxnmxano +cbacsmte +meclajtf +zhztflqy +grqqlecu +qjbzsptn +ebagoidi +egegrnyh +jccwkqle +ikkwrzqt +nedkjwhf +vildwwrp +ugrejotn +kdajfbqw +gyiwhxpd +eemhkuwh +jvfhoiqi +wsgyaiip +jzjvagvv +lqupczes +fetfptqt +msmlbgcf +iukfpgrm +ctymfjpj +rbrpmkvx +glooxgap +scctgiai +lakkjuyk +gaekimfl +bhfaybki +qaiazzpf +dwqkvsee +fuhbygkt +zhkggelc +haigokzn +jpuangaj +tpunltos +izqxnhhd +oeyxnqkn +vzvelmik +ddnaozap +mdlhkdlu +oglyexnm +mcgxswpe +jzkjknxc +gfqnuhfs +ztnxzwng +bnuxixlk +vmumdwec +kuxxbcbv +vdcfhyso +qtdesxqr +qciljohn +qqlluqzz +njhvvqbw +knakngrj +pradgsbt +koffjwwy +tvrkgjql +mqtxerte +smigupym +bxxvoskx +jerbindg +snlgnowp +qsuxtdsu +fnpexyoa +ffwifdad +mvgrpczm +oxszzrsb +pxefzlch +mcgbeauh +neseoapm +iwnulsrv +zhinoifi +lfmjmmtk +fsxcqurn +gmkkhfuh +nuqeimxo +uvjdgkdo +ohtmvkcu +albuiptc +piaihrgr +fjviblws +qotlvddl +gchijkjr +azzrnqhy +xrynrbck +pdvkcekk +thscvzai +eoapfznw +hpgoissz +ifnesaoy +eniqycje +hmjmghcp +sfyrvbbi +tuxcoidt +icysmkcf +ycagvtls +dohqfcgc +taitvkzk +bblnroyh +grdklrua +qpijbooa +pcwtjacj +mrvxbefl +oodwrtvj +xosqbcie +zbquakff +ypwpamng +rpfbkssq +fctgmcav +hdtcdfcf +ctboapkz +qypakerm +vebdtsmq +cyxqtbtt +dcnpkmnu +hnjppwfo +gqmfdahb +hxiqcrbe +rpxazkak +nmtraoky +sisqtogo +oycwooev +lmmitjey +rytzptco +waatgjdu +khsuxyse +cxjltfxn +eedsmcld +fngdicwe +lkomchdq +ulvabpoz +oyhjvimr +dpyexiwi +wjfzkbbv +ihohnaxx +ajxfefrv +bplrrpcz +rtamodoq +slwrcibk +sgwdtumz +vlemhplz +dnpkqvad +ytolejsa +ojevrxsc +bgbmnvyv +lmrousup +yyubvohm +bqaqltmt +vfbzzthz +ylehjmop +exddqqwo +xqfxejzq +myyuypku +zyvmvbla +cnpquvbp +yaxdddeq +cnrjqdra +lwphgfgf +zqdbcnmn +qelivdwx +wpnwomgu +xzephbpa +yghrabgr +pnjsyhth +okdznczw +urwcwwfm +hjrsrrzk +foklmzqs +mjldwaun +dabalbmb +jmtqvwst +uhtzixah +blclhmjf +wilsnjwb +qeeriszr +vbfagerv +afegxkkh +zwzausdd +ysfgzvbw +ymjlmnmz +rnrbxnij +ihvhqtvk +ofwrugbp +ontvlhfu +sfjgpqpx +oyzkaiyl +xfmvkfkh +pqpeeptl +jdyueahx +plghatyl +yrdizope +lrurgkqw +xdqtlmww +dkaiotxb +iegjcmln +iupoupxa +zrepcilx +tpewzoxi +munsmbpj +fvhsucvb +rlwchfml +kcmlbubj +jnhurapr +dflwxeii +wtypbujm +jivypmpr +argvlhnz +acyvvplf +naqafzfw +ngepfsju +xfpuwtji +pqgkxbmj +oeygjbxs +evoydkqq +nhuoohdi +wrznguek +ssirmkbq +ackhglvh +egszqozo +rhnhhxul +mqabqvun +yunlcuvd +zklsneau +itanrdqb +pvxbkwoc +rqbqjyuv +ioxjpvqd +pzkgsdej +yklripsi +iohazhoh +umxxpdaw +czfnfgxt +xaxvkjjc +qhgvdvaa +iobwhxjq +jwfwqqjs +cbrfgjpp +conpdlzv +wbcmssue +gyqkseid +ozrzahxt +rzowboce +lhntmyie +tlrcktzc +lxmzpvku +ckliqrdt +qlmalosg +ovvyxrnr +gctjwzrl +ooqvxzac +dbdqzzly +fpsjzuxx +njndzgel +hjfqofhh +txhcpktf +otceqnmc +dduyepiz +bsxdbzgs +zklbicun +rstnuwtg +tasiqsbs +wewnwuyn +zvgkuxxp +nxcmlrmx +mizqhlnv +xyxzfeca +qkeuwzgi +ajnzmfks +ejszlxyc +xzfggxpd +jbooydts +eisoqvuo +hdfpevns +alybbyrb +yvpylcnz +tdpcycrv +kwptuqyw +ncobyufk +fclvkbek +tgnfcfup +vbcuaudl +hublkdvy +aoetzcyl +fsiuwhbi +eyolgmxh +siptvnjn +shvycepr +ntrwmime +dbdnbfyt +bwluchce +uigenqhy +krxdyhap +avycqglh +gguniqpm +wcwzelyd +wzurdris +rmhstxuj +vuaozvvq +bsdgqrpx +twnvkunt +nqgqtugs +vzkvghwg +ypceflob +dsyzunmb +kvhacqqr +ozlfwkjl +pyznytxd +ykdkbfgf +eajwdyia +bhkxsxcc +vytpdoop +ibpypdrh +dkkjnwng +lxwkkldf +nbtckkoy +qtjyffvl +sbitpceb +sxmhbcuy +zorovlxd +bazreact +cwzggemu +uowhquji +eijszbmy +aarneovu +grhvjqyo +fzheiyvq +nzsdrlli +wfsdwsok +wrqjuygq +ggpffnri +wkycrfjm +drksyjxn +smuhwcxa +iabdvvyj +esidunjn +decnfzwl +ysihdzkf +zokmsjgk +pxuddjdo +uemyoegc +glqycmsw +fvfkqzdu +mhotjpqc +pfyuopbx +tibutsqb +krzcqnkv +djqpmsmb +vbufrshp +mmzsrikm +zkjbrtoo +uopielbd +jmketnly +raomwphg +uwocphkf +lvktwagm +lqmorzgf +rihrgrdp +cnbuplfg +hwfjvxcj +sfgptuic +ixkimxsx +kfpicnix +tvpybbrf +navehxpr +rwbcttbq +obqcxwjd +fuiskmfg +xcvfxoeh +tsmaaoyx +qjhiyeex +qwfxiyxq +ctkyxatm +hyxhsvmy +puknicfi +hbwzmyks +uczqlycu +wkywzgqs +kzfehffd +aoooehdc +lnijvgrg +aedbnxzk +lusvnger +ltpbpgiq +aypxjgwo +lgejygmw +auqexwja +fwszagnq +aiafpduf +lyltmest +agtasqwl +fqrlliiw +udarpyjv +kxotyded +aodevwdt +lmmfarbx +snjwogeo +ehfmpymn +yahfaxeo +xudbdnog +rrkxhhsy +hdxadfck +dmnujkng +cujvjtry +srwxylvi +dwohbywb +cvspfupf +czvvjhfw +wvyjwtzz +vfooqywj +bmulxlpz +hbukjylo +bdhsvgdg +vnrrqyue +hjveswxf +yxgzdjwn +byonsarh +edbmtqyz +owvunnfp +wfqqsuyj +cwckbkwt +plesmdky +pzatdacm +nqfyxhij +jjwqitsc +tejffykk +yllyznoo +kkqhuqlc +hxchsqos +buvmceha +kbzymzrl +kiemcigv +txmjfujf +vfnystic +kvaiybnq +ztrwxszz +wiyawlfm +sgedycpx +isafnieb +bpspuqvx +fqjtxrtb +bgjdrvhb +mnsbgbhe +jpsqcfzz +fpumugea +qqutezwg +eoabntsw +tupqchzt +ezwjasja +rsguwrqg +cqzcijqd +rhxlhksr +vcwlknrc +eiqbcafb +lwzbrrtr +aomiovcj +ujxshcar +fbpjehma +bgdphfwg +iukvlxvq +ptawvjzy +styyqrqd +itobtfvm +yqnpsyha +vkwfaykp +zwpoxkzx +uqwasoht +tkgfmnvj +xkilydvt +xlmkpdaz +xfvukjte +yyzpwped +xzxwnrlm +ausmhunn +qgiiljhq +njqhxprl +fgfxiphp +kkzjpuur +dcqixesl +tthldwgg +nkjxnttn +cjtiiltj +drlzddsv +xxluiael +kjjsewia +danhtpxa +edexzcqw +mrqewvuh +opwtwbbt +rdbsaeke +viistwnj +llcndvsm +jeejjqyb +hstekias +gmswtskg +qhdktszo +ptbryiff +jrtlgbag +gjbbbfnu +uirwdwzh +esmntxej +vdcmrenk +tagtsvaz +hnewrron +zydwkvuh +zscfhzxk +sazgunom +gqcxdowc +twmxtniu +wfblhfiv +barpdrob +jwjrnqhv +xvnysjvz +jvsftvqs +jivuhphv +grbezkpe +xuolyqis +smuxlqpu +rticwcrh +huzyzxul +pgqawldg +mdcgejab +rlrgwpfo +uqhvyglu +csinjsjy +ydorfrud +gmcnjnbr +qzvizjbt +vejkuvii +uhfrombz +clgrjlys diff --git a/src/main/resources/2016/day7.txt b/src/main/resources/2016/day7.txt new file mode 100644 index 00000000..fb0a6417 --- /dev/null +++ b/src/main/resources/2016/day7.txt @@ -0,0 +1,2000 @@ +dnwtsgywerfamfv[gwrhdujbiowtcirq]bjbhmuxdcasenlctwgh +rnqfzoisbqxbdlkgfh[lwlybvcsiupwnsyiljz]kmbgyaptjcsvwcltrdx[ntrpwgkrfeljpye]jxjdlgtntpljxaojufe +jgltdnjfjsbrffzwbv[nclpjchuobdjfrpavcq]sbzanvbimpahadkk[yyoasqmddrzunoyyk]knfdltzlirrbypa +vvrchszuidkhtwx[ebqaetowcthddea]cxgxbffcoudllbtxsa +olgvwasskryjoqpfyvr[hawojecuuzobgyinfi]iywikscwfnlhsgqon +jlzynnkpwqyjvqcmcbz[fdjxnwkoqiquvbvo]bgkxfhztgjyyrcquoiv[xetgnqvwtdiuyiyv]zyfprefpmvxzauur +vjqhodfzrrqjshbhx[lezezbbswydnjnz]ejcflwytgzvyigz[hjdilpgdyzfkloa]mxtkrysovvotkuyekba +xjmkkppyuxybkmzya[jbmofazcbdwzameos]skmpycixjqsagnzwmy +zeebynirxqrjbdqzjav[cawghcfvfeefkmx]xqcdkvawumyayfnq[qhhwzlwjvjpvyavtm]sbnvwssglfpyacfbua[wpbknuubmsjjbekkfy]icimffaoqghdpvsbx +enupgggxsmwvfdljoaj[qlfmrciiyljngimjh]qkjawvmtnvkidcclfay[bllphejvluylyfzyvli]heboydfsgafkqoi +ottpscfbgoiyfri[iwzhojzrpzuinumuwd]orfroqlcemumqbqqrea +zhrhvyfxxcsdpris[xdqecoqujrnqbgla]bpwibmrkcfbzigf[rlqtqykdltcpusvc]ybtsglkxrhucxwv +msaebhhuxyaevahov[skkhuecthcqtrvtunw]bzlvljpsapsezchptjs[lbcxoczqbyysmha]zdqlfydjdctfnuetghr[owwhfhnjmpekukafw]qqitepzwooogqifl +jhdfwesnofrkpse[mkruficpgplktbmoo]mnrjpuvsauanolvzhym +ucibfxxivatgxlupp[rxlbgrqostcioowo]faiimhdhgpockadenua[teomupxzwrernokhyud]ohsfljkyjvkfzwus +gzxcgjqdbyvfndfpw[ypfsapvecfqihnpuszq]mvwxgfkniekgqzqid +fipkggpfwvgrqiwosi[itadifxotejgzkt]szwurlcbvffhgse +ketltdpowbxcusrcua[oonjssgqvcgwvlz]otjxgpizqfpcriuco[mgtgmwcjecomtdkxdev]dnrecyeyhqcpausqzsw +lcototgbpkkoxhsg[erticxnxcjwypnunco]notoouvtmgqcfdupe[hubcmesmprktstzyae]unuquevgbpxqnrib[egalxegqwowylkdjkdg]spqmkzfjnzwcwgutl +nesmourutitzqtolwd[rurfefjvljejcufm]jagkqdwpkefkjdz[cctohikipqxxbdjxsg]badmffkslhmgsxqscf +vvbwenaczgfagvrv[dqjzprtikukbikojlgm]bkfrnbigwaitptbdcha[llnwgonsrsppphnnp]sqozspzzfbeigmw +jzkzjzzghblqqme[fsqzyykcotbavruyp]vjzohzsunrevhmpi +jlngucjirfgdgorbgb[nvvkvebcjahujrwjmy]cfnlrssuthgusytkqt +kegsdcxndhtlskseb[zbtcngduxclffzlw]wrdqbtrqbcpbeaiqvx[svsyqhkrryycnkceq]ztrawvffepndijceeih +imtafeyfivrcegpagsl[tjzsewuwboushjl]mtnyptormlwiijlds +sblhlpnuutqgtuvlc[jlkivbtbkivklrnr]zkzcykzkyjxarepzvrr +ojuqmcidxmsyjkhuh[gsegkxlimzuyceo]dlhjiensaurluhul +sxkxluastorxmnd[gwkeczwgmamhjquth]yvpdadteadabxgsplmr +cndxxzfcmwwtcibgktm[ntsvmiwosuvniztv]onnfaenxutizlbxdk +eqiwaqxxstamxgzc[vnomzylvfpmcscjar]rwdqevxpeqvrmvliu +tvzbzkhvpzedqtp[whzeqaisikjjbezzcow]hqbizwaaffwbtfglq +ajwpjiqawievazmipkw[mgfhwrppaxagfdgfsa]iaqcnovhgearcutadns[anaukyaljeflxdnucbn]bhqcwrkeolrhwdih +neakzsrjrhvixwp[ydbbvlckobfkgbandud]xdynfcpsooblftf[wzyquuvtwnjjrjbuhj]yxlpiloirianyrkzfqe +jugqswdvlbaorwk[dfqvlubdcigzpcz]aqhybhnoukoyxuiw +kkkfysfugyvqnfvj[ahhqkrufcvhfvapblc]jfincvlxbjivelqrs[mpoymhslpyekjmy]eicbqlzecwuugez[tsqmqvjiokqofbp]senbbdxrdigwcjwik +ogiiiqaxakiaucwa[ltdchlxwnzefocrw]koxethzfvlsewbqdt[qdfqgtzftqpaxuzcruo]fvkgjcglmmxqnifv +epmnxkubnsnyeeyubv[ydzhcoytayiqmxlv]edmbahbircojbkmrg[dlxyprugefqzkum]svdaxiwnnwlkrkukfg[eacekyzjchfpzghltn]ofwgevhoivrevueaj +vvwvubpdeogvuklsjy[psnqcfnqhxaibnij]fwzpkbdgmpocoqp +pjdxcbutwijvtoftvw[zkqtzecoenkibees]llfxdbldntlydpvvn[uaweaigkebxceixszbh]xxlipjtlogbnxse +zmnirrxetiwyese[cedxmaoadgjjvsesk]nuisspyclmncqlasmuy[zxwlwmbzbjmvubgcf]hfqniztoirmsdwz[zlffqhttbpehxoabzhx]upmydjqzzwefvgdpqu +lwvsssgvvylrvqh[duxjrrqkzchbpvnmm]pckmefvejytvzavgzgc[dcekfwnrzooigwio]pmutxfiwfowlfnnggl[lzytuzirtzgwhkz]yzgxtksuqrgvvgfefon +tpmyecqhqjjpertn[qomuwmxstmgzexds]ftvqqwsvsrnmvpg[vtpebuufpyieqbhuu]dorortnekxkwnploro[pzajzflqvbkhautupl]eowpcyzmyvnntvzmvx +foguzgeasrkncbny[tlyweucylxkswwxb]jtzjubgewwhlddar[dkddqrpwaqvlhdp]skkegnatbjubqglwu[pkwscrmgvjzarzb]ibaagrqwnxblvtkg +ejgpdxesfyoyaggmymi[axfkdoyoqkpkhusfwe]pnczsmszqevkqiwlfc[dqhzcqjzpgnoknmv]ldrjdhopfyctlqtn +gqhyasteoryuofc[bhblyxlbiqtzzyzvzqg]dtvxrlkyuwxttyw[qvvzvuzhkemwglh]bopvfttkwtaeckq[vvhkkgrddaoxnzctwar]gsscsjuictekguq +sviwnvbtrgyydtadhz[ipjrrywkoxwuzmlrzd]kcxruwyisqvokporkub[tvarlltnhjmcuvvcck]raafszljrhconjqsqi[snbxmvzrkojpjybkgpi]ekoeuottccqbxrvpkb +vtouviqjarqwnoexuy[lzxhegzxptktueqo]azfsikzbwiajcrhnas[hvqxgtffjyyfgsjowxy]ddbmpksrtghvvypev[eoepwehfavxzwgt]igsulpdhrevkghzh +fucimprxzsubuuzmk[umzezmmnkfzvjlela]qxzdlcryifsinmkgeha +kauzjbailyzpvtji[hgeslalzqgpdkpuvomw]utsywinellykvmuawwr +oacbdgfaszolybf[hsytrkjoylrkkduzfz]bmoelqhppaxshmfjl[cusgbbuydfqtbbmsju]mcftwalxlvfvvpeu +ybylybngqxxrmplf[mybpfztzwnisfpfgqmb]fsllclehoezgthek[ldxhvhwniqfpqbl]ebybalwrmrqldukb[okenxoqxjgrenrcjd]kluumgtqybryflqi +mufsafgfxiegfgf[ydibrbrmiaulexjek]ouwchrlvilmygbuppjl[imyaxsiodgjteppdyy]ugondbuqnhjrzzzn +idihouejjocbahe[mclnirhxghanatge]ubwhxskdzgkmyrp[vksyktucsyumvxoc]bregaefrdlrgmtwt +qnsqwkqttdevlnzg[noyxiueharjajsalnhu]heaxmujxhpgjddqur[xnqwujjeasceovnroiv]hnrnwuogebatnfsa +evruuxfhpivnmknolsj[itpsnnhbtrrbllsbo]gefodpceljlvwuahz +ebddlswrvbjohtnkyip[qkssdudizhcoaazvyow]xvnqicorrkjrnxixp +bbmmzbebuexzmtbr[tpzfxmwgamhaikfpaeu]kraaocehdtalyjrf[zzqqtjplepyidohpvx]kzehgejueimxlqglfj[zgysopfdgxtokkdxwk]gwcfaflybmhdgoxjq +xztpwfipuczrtoyt[uwnlokmtopkhdtemm]sdfmvgvctgwbdjpmvhh[ozjpkdigpjqzqgy]yrkwokmkrevauzroaqm[vctyupmildfnnjomue]cvagxsievhrukgyqzg +jpmvqhuabqsvroxgmyk[toieqxrazxhhsbrm]wdwhoqdddwdacuo +mlaqnefjmwbxeetyxz[sziklwesunikpiqjark]iltkcgfzmhvusdnlr[bmfprkswemctykvio]hhsmvppnztgipxij[kvlbovfklljaumwmy]mdpaiazrlputabj +czdgmoqwzhvfnulxo[mlbkytxjhscsxrgchri]veugcvavrzihzencp +rbjtyudgcswzezr[inlznakcutfnnequc]uhisbxotgqqtzionoq[hzlgqtkpeubvudi]qqsryagiowmcijbejhr +wkvwdohwocizssun[kimsjrwwfpilzpkf]ruqhrplgugwhmnn[iouhwbjnqzlqyewxof]exjuguxwmphfypvsivl +bcnuloxdfhnyesgtdky[hvmgfzcjhhiiqino]sfipughwbebgstwrua[behnamammdxrnnok]ttpbmbflilacfvwiwd[sosjbmmjygpbfetziv]qcosdgrbfdsgqqrlhym +fbmthzppxydfxiipo[zsyfzbueqoaoxeueado]santekllapuywlmwjkl[yfsonktbvuyilcxf]xjerezinsamruvn[cceqpogyrsztadfap]fiivtuyynltqoypypou +lfjigofbbnyrdlhxv[gfblbnmkfnpxbio]zeqevpmpjowrxtw[mofuoyllwekzcjtxjhp]lnzewigzwruzlbjh +xjgdfbtgqmgazgvtif[farekeencwufapef]dxjltmtfxuiydactuko +njaolcljynwvrwy[qplxbpadtyndosjcch]fscxierutuanappsqiy[jftravlojauqkmgludp]pkfwxpdfcrjrmbucf +iyotvokljqynxnpjsfs[lfwwocnwcwstidfpb]mutsdjbqfruxxprzrnk +kpvxcagazjsxgagg[sabugyxucglnvcjb]uvrdglycowrjddy +zclgitkurpfdspcbk[yedvkzgbawpthoyn]dhvnmtxbrpttrdrio[drdahsrphffqsigrlmk]ykghbvcdosmtcgxdeb +rkmajkdvlbqwtnuanue[brdlutivdnfekggixum]pbsgstnxgghrygqwpf[rlqzaflmkbvvefdoc]jhbtzkodsfglsaow[onlllmfziapizsd]usvejrxmziulunvjux +jqlketojwcgvuce[ftcxdqqebijrnfzjriq]ucwgiavuxrxokmvxgad[zmyusreluasvwgzngmx]semjnvafnqvwtvkimy[owvczdccmvfohtbijfu]dmhbiikbzcualbbs +roewzhbnwyvondnn[ejikyjgtzpmepihnnl]yurjuztavzqkxqlrle[mbjcyqrzfuhhsnipzx]fcrtuzhrqorxrdmrcn +ycznijylnnqwmqzdd[ycnztjgxgyapvafhwaa]pzdtesugxpchhdb[sdruhgxaqpitoxlncc]exnhjwmnvqmquvclhu +iufdjzqflteyvhrem[eqiluhtbfuegasby]ikqccaxrpnjjrevdsev[wfluwngzffaxhaflbf]wnlyrgvaxzsmqvc[smkdicgtwwwxmdizdi]joaqneodtgvioxzg +pddsupswtnzture[pehcqhpltqocptr]ymzrvibfbeasccxh[jwwhastouxzmyhh]xsllfxcuzbtciegzcd +rnnvfdyavlqnvwze[aistrderxrrojbsspnu]hfkzgodowrlajmmeq +qnebfycqdylighjpgo[ablnwbutiwhdcrmwbg]hnqeseogqdsdhith[nmrgaeenxhizhoqper]tjxbhutvqtjzpyzh +batsftctktgebkvzv[rovosiyqqpafttgdmoc]ynnztvhekfnexdcuq[lnevylboilqebnkf]udftgymwddomqmy +ybrcyivzafzoubcj[crhigqvjszwqflocc]aesdfdfgzcnyxsmzg +oskvnzcbuyaytyixp[ypctohskpfoxhpydwpf]kgkbxhyfncznsar[vulxrgolpxlqzkknzva]ightbuekpmjodxzfky[nyjpxhpycxjrqdno]jhvrgxgfjwarwzkmfj +relqdjmixussrbijgqj[mfsyrfbtjbojcesuyw]wsckbuhopguszeh[unyhvpqjxxgfbgyf]dddjalolfjwliasyezn +xahbldxnvsviywko[ucmjsyoejvcggbtx]prfpnzzlexpolsgsmsf[bgocwabottcqekxs]ijvpreqlfejnqhfbi +qtcopopjmmcjlyfrtot[dmnfjowrhqtqhevs]pfczfmefcnnfbxiovzj[exoentzecnbfjsy]comgdcvnlyaemmya +plhhfkjlotvzupi[ilbcfjbrxuildya]uuvdzteoijumhavq[tcuesohvzusidbgpw]hdsgdngmjtlybnas +yoifccopobbguvkytps[xhkzrdcfsyhpmuujbt]ocidhllwycinggwu[kouoyzxtwiwknduclv]wkokzcbbqvjxtubqg[plgujclgyfmafflyurt]rpjrpxriaxyinneajvy +jbmiqrqkpbjasqhvwcv[zlyzpnhzdtqiorod]dkigqgjtzmpleja[ijenfaygzeceopbmxks]iwzcpoekmitcckbxbzr +zixveaipmutzulr[awdlukrjbyxtssfksb]hreqwpgrawaqwtqpt[bykxrwwuypetebhs]xhtujigporvkxqot +cldscqwnyjkrzvyegsf[zwsvoudppoalxeja]dbqrfscekpmhmpoellj[xxxpuyedbyuihdzdf]bmtfdebklpxvuacq +ohdqlkppqasvyrkkjm[hevshusrmyhuyyo]qbmrotalialbvje +nvwdnytzqwrugam[pflhibktydncffbnlva]lguqdlkusqqwovr[bgufsrqjnngbwxnhuco]uanvcpxragayfoj +zkvrrzmgitfjnit[gezdzgcdvxdkxytcq]avznjhxyjldbqpfoua +mmyxbuoieontkaxvnk[lijzkcghkhiryhceqc]zuouxoicowwkhklyp[baqxxkavhepnpepnj]jcdekzxrpfucavdq[nxrhabcrumlshoitzba]httcbsbgoyhjpkv +hpzoxihsevceefdjv[nxgkyykcfpjwtlz]lkszzbxqdrwyktr +djqunzvzcyxmjqhy[qapfiyujulhgqipfm]htqbtlhlsqxnjyply +lilhndsdretyqjojrn[oxrhvlpgqiotmvruvh]hgdlazecfzdrmegmnw[alxxixmnnjkyhrqjgh]mpbjuwwcyhdfxynyk +fcrwgutcgcqizev[nwszwhfvqtdhrymgqf]iiahiososrpdafnt[gbkrardsossgcvu]fmudukrxbiqyrpi +xpcgsvaeydonptb[ewpsimxlttaeoth]gersjqmmdamhikqtv[sxyvukeegkkbbarjknr]sohijvshdnoawujw +vnjkhbmpsmvxkdt[yrpltayaihgspvnjxb]ivhwkahhjjlwzxfpz +ofoancxlupttxku[hkedaqsibrvtvqu]zkssllvuecmgtqvs[eklsqwgwuhucbxykl]ioompempaewmnco +nwviejwlkyokiqhuvo[csddbtlbfdwtakxlmss]fxdoqlbdjhoslraj[shasfhtvpcsajdsmxfp]errsdzqcqzbrfnkeux +gvmytvlyluvnmemhgjr[bvqbhytqwpyemefwo]sygljhpvyjnuxzjqy +zootaoveazcrmtbda[qlxlwntntbkjtkqve]vffdsbekufzemgwomh[vzllvqlmloffyyldfh]alltnttrzqrchacoiqm +ksbuxsjkmtzsfsy[shracmzkycsuqrei]qrmgsndwzkqhtojsn[innhjjhyfsffgsboglx]zhwuwgyrwmucjfii +dagldnrnugbavjwiiq[vrsiyprmsvuapxvn]piirprosbofdwzuuhn[epdsrdcpgzkkzdjle]jylrtjltlmvazfpmh[rqqteknolbyzykdysvr]ieejzvgtumekqapi +mtamroysxwglblwmjn[gmebbprtzaogucvyzv]tjzuzqyyfuihjubuzu +pcfbudkakpzlyou[zznswrvmytntytfkt]kvudoarqnyybzeddvn +moelqaykzlstyntby[qmpxihbeysykajdo]omqcjgdbuqvvydd +ddyczdjdwnoacci[wpgjlohduqnlrifih]dfwcghvsdezgdixnpxe[ohhccenoirazgekq]lqtssqpzgusrlvyrd +ewirhlfcfhkqbvmvi[ixrorekrimzzkckpel]ihyukzubvqdpnmqpgu[mbtybrusfomfdhlg]ucrcmbvpnjbghnxdo[lyajfieycgiubui]llelwgnuopqhjax +jpltuunwbrijwnudg[ejxyrxniclwnqxxnh]krckhlysnmqahsz +hkdpdpshmftvxob[fsdhonsqalgpydpub]dirxpfxsxhpxliqg[tvbhlcqkymtbnytjp]xuvawokttfililgwgue +mdnmunbnueofzddapl[wxfahokzfixiapig]wekvqzgvufgztlgldh[zwglgerouhvhtbrdib]xeogmvaqszvkdvxv +mbqnuqonmkxmczjo[ueqnkvfdskaqwesufs]zmoqtlzfcwqaxdnddkk +qoaqjkdsftjstyjyqd[fyvizziweplccjt]ryvpqznfcdvjxuu[syspurpgsonxbbdrcc]vvedpafqmoeugwuize +ctdgzypcrjqxirm[ouyjhaohcueqwdez]kroowbthpspnnzgzuau[pqijczlztofszvdzhx]iccbpchemtflqnhdrnw[esvbnyvlckqirev]psrquqfxaotuzsojbt +rgukaurlmsyzovie[noclopxqrusykxpix]zbbopbxzogbeppp[anouobvemneuuztti]rpnbuugshsxxbbkhauq[zpqywyyxjfabzyppw]ecdrhvipvzregbgl +vmbtrbtoajfkswgy[kailajjwltvmwasynoq]goxmpryedtsrgkx[hljqifnoadoljqtub]xucplzmspnbxvliaap[tfqpmrhbakiidoxwa]iceqprkydjgouemqsmf +cvpnedbnibipftign[cigxthfejgyjzvspaam]esifvgljjjbexwm[uspsplcqhomoszleq]qnogejwqjdiznyfellc[sszzsifsfavntyghfs]btswodsrhcrrbodmtz +lvxwpuujqxypkhqfymh[wtizujakvxzrqwpols]jffeswrfpnhhakyhwlz[lzyloeveicgwixnvdx]uvwhpnjlszclssbf +noblqdnmgtyjbxjq[chxjibegmcbmljibes]edtgpajthcmqgpz[qafbzkjfqbjzilzh]aorhwssnugyflolh +hunicsoijinxshpfskq[lniiseazhvpjiyg]wirqusdwvaiyatimhx[jntjijtppuekuvvzz]mxebkmgiqyfaglow +wvzgoeqwcuudhjlc[nsjqegpxfiwvbtyuo]hehqjsarzkbbidy +ncjcjhyagdubxcibe[qpddbjyualjarnnpkf]cizleaqaaewqysxwys +jqslpqaqntewoglud[xtzdawarqxbigpuf]qnxdyobxvfsrwoaz[snegbwbzchqcbavh]kipasixtzznhgkjskv +hptaschabsnqdgmuzoj[satvzxkqetnonungbjb]gqhigqimupvihhwy[nejqgulbxtzfjbjlya]jywahuqdzrufxenshjj +sjgpoxxqtfsltzk[jqwzhblplilweukbso]tgorxisfymrcgyr[tfbebfnnljlpcfeps]ahpjfbonoajtohthzri[tdgaokthtdhxpsg]ajcykosmkhftnrjqphg +tnwtnvvrpilvadiy[taucexvsohfmaxd]cfhrctuhgqwjgtll +xzzmvrhyhwvprzczwz[lnshilvbyfjqgff]qfkoodzijhqkpuob[iyyvvfibosnuwlov]fhbcvpuqvpxmlolhry[osdmjplktygtobvt]msazwlubhinqvyfh +wanhwievduqinfwlcou[uyalesnoaqmajcc]zbdddgzmqprwiia +dfovljmseevxcfarf[enpclythxgepfzqcw]wechankwzxxkkutq[mvzawbhttzrauulkxvd]emcdawwiunjraebra +sylgfxqcfrqgeeuh[dljwdydnbuddmtdgp]fhenkxvmwvdyaukaxa[xcdbxlqqfgqtjyhoi]tbnpjbnpoxxaxef[rlnmcnmntjlitsmn]vkculrpgrmqsrayre +xexefhsfpwtpxuygp[omxfywhnlcapmpalz]foblbhtxieggkgpcru[lscwcbkqvexwzzbri]ipjoiumgoyugfzq +hbeghglpgqnwpxqio[pcujpvhzhghnyjkmppe]jwcnwmqwctqgoxpj +apqmhkpxrtrfwulqbq[trthojavkcrlcgc]oikizlfqpukeudv[afgmhbusoqjubra]ajbuhxzuhecopcxm[lowqlmwiyvmdojjla]jrrhjmopywkqrhlgicl +dxrqnbrkijtvmkwq[dvtqzljjbreayipqgp]erhjjvypeyramuaab[cjedbzbceteuydrps]kolgelhdemrbeviu +gwjakwyuaxixflozol[omjuyjzbtditgoznip]nqybdawthoydext +lcdwaahhbhajoai[cszvgduipwduhgmo]vpsgnhmtypusbgmhwnb[qitqpalswmqvjiu]iyjenmmobfasnzqefci +tkxizzrgmsxvmrdawsx[edbhkciwrqmoflyang]nbuwbbspldrfhic[guhvpvocfyjpwwclv]olxhqqgrylvzzqxxd[cnhwdegsxurungopo]rdenofdlpgilpiuvmr +wkadrydzokfmuiah[mihkmnzzjladulkvb]weqzktdsbwalcdijda[rejzrqqdtbvrwgbgojt]ggruyvfdesfdwenyx[jjyyleykqeskpfmzl]ssqauxmvzygppvncz +djzzsqykcfbhgfoq[frykddayaohlxmkem]kawloxhrgcpronph[xxkgjvdfespwmnja]jddmrdznkctmsmaxih[uxotxlcobxfemckshh]irmewesnknuknipl +hzojrovrbmfobhsau[itboujfkrmpgjpsvsr]qgczawmbunmisxs[dtrvnzrayqlvdpyzbuy]wrcsquxgcxpvbwwzlqo[kqbfajfleopglhfui]bsoomwrdifoekal +cntxerwyrvbludhaa[fclfiyjfekdtavmgy]lnvvlflygrewrgswx[juijxzrpwfrmshbttg]yjeuhzyjbmbdslbdhf +gclzrtvgfbqqqcl[fdkwmnpoansxtklyusn]ywwzqahbabjbcbzd[kuiejkftwfuzmjbiify]tabpjhaiwzcdnzvof +hmshguykeqstxgzs[fsnsxtrvkdyrlek]rkzkooteryozbwmda[jyjzddadewtuaqulp]gtprcoocgdsfbtduekc[llfoixzevsmexhuitz]ppiutxxuvaxhzgiib +ouvpvcchazfdcljaux[kxqnkynylosbuekz]arsuffkkpzlwuibqd[lmmxhndkoldfbtyfpw]nvcrjoborzogjhgwn +ojesaevpprrzqaksixa[ykxbgapdjiulhmxgihm]nrxxnhdwodfgqoeproy +vzbltcugyxvtlxqnkxu[fcflcasuyaljgewcynf]azqaltkfsglwgkeh +urcslegrolaaalf[grobiijzrtgpntne]uhpzjqkslgahpkehix[prmevyrajmgfhsjpag]kwfhbrhzkojqazxjocg +zwfeopovkggasxxb[fadbebqmbxwktwfdeui]ftomtaogfvgkkdrkc[rdkdznntsigigjiv]warlzbzbnfbjjsh[etjzyzfdjztsfsyi]dulnqfxjoewssxgkfb +nvrsqzcyguparczn[ewfmgkjaibzjoiex]kpooaykofbtkpawayfh[ssuzuankcdhqvold]qaeuwxgakqvcugn +rnlhwrnjgxwleghohuz[nktpaaaciwyfagkpqw]yeyzojziajnryse[bmpxxtaljjigfiv]ojzukghfhfhykqrcdyy +doqbqcwjoldvwtws[qaxghysnphejfacrnkn]iqyhfkjogmrkjpk[hfjqxqeuzwywwmnzj]uzhpypjadzqcpeibcgc +kmcmhdptzlhgqui[cpluzrcwihnwxrsdoj]czbxutspkzdwesrc[fccnqmeaqfmxtqqng]fitsnmdmyzwsifevbat[fxhgcmqhxrudtnleoww]yhxgwphkxlzhxzjnvcp +tmjpplcwhmsaxav[epfnxqdzfpxmaztdqn]vwdoatnafiotogpsxk[lydghxujguhqcjqtbbk]mtvqsesoxvybfrxyoi +fslvgbiibdkhchajyb[zpbhqrokrbfuqrowop]gqqzoqvfsdfcjcdurrs[xhqfcfytbbekivnvod]jxjwuxivnyhppvfhaol[evfnrmrjnnhychtpv]emiyjcjsnojxexs +gqaygymjihevbsps[iepworrljuepufyvne]fzfjulzebpsphczby[kxaohggiqnjpdbf]bsjfluhncewudkumaxj +mvjlhovwivdanexv[iaphahshtwtnhoeoqsk]syolycabjeiwtwtec +ikhcujftlekmcnmcy[ubsoslmlaitakaqb]ruyiqnoobymxiim[ppxtpuphuisxnqumd]qxjhzfwvixjjmfgaqej[bdjpilcwzhqphfumpny]itvjttbjsbfmxppif +xhemwtnqvfankrccdtk[bbjzsytqxhxcgtedp]ksfozdggjvyvpoyw[tberajbwhcirnenwv]juojuogrifenjsbldn +bczvqdwkurvezjxgrg[yjvuwvfypobetomm]vtfujjaergrizoots[snwcbtqylvuhnxyvb]turadiqlfjvclpvbweg[mekdlejerxpllbf]bgkveafnrceyxufsqj +duqeascyrgxyhlspebo[kzimyrleaopbbwmbi]xsxqyleqvoscazopte[debdbibiuaosfdyioum]vjaptdzpitqctukwhf[jffyamdmvkrggbe]qrnqpwcdoditjixsc +cuxdugzthpcubgw[qjvtzbgagyebkobkhf]tsbcghahxswropcgj[yenmfdvoxlqekjsk]kjdmhdgepvdoovzvg[mafjriyxqtotmhxgvty]mdyayljihzqxhiga +ehkhfoqcdkpyxeum[xvjaglxwocodctbzj]osufidsaijsczhtfg[rvmapxxierwnjkc]pgshnzbphxdoaitou +wagqtjalswmbehwmuwm[oarjxyzwyhxzhpgilh]qapupwvuflcoryf[hmqhnrjiahzdfbaz]kuprvbaykjhqagnl[wfxatijeapdinkt]hadtvdjbkdduycdut +emfkovpbnkaxykrmwjg[otoxyqlkgczzivgdt]nsvpzdvcbsvrbpo[vdfxwihznfpxlbsju]xbcniikjhgzelav[opidnljejcjawbikt]gedgtkiksnpijteviu +fxbpujpvuboflfip[dogcwovzlakonhdyww]tkzftiqvyzumadasjtu +rqtkvmbmqtdrqsahsdy[dhaassflbjfdslopp]zetcyybbahysvheand[uncbkqyoidhvxjf]mxqjozeotsollwolhs +pxfqsysywqfsmername[yfcktnozutkhniqyp]tjzzakrnlxrtscena[bitenzjdqfopqevroqo]zujogbgemdxiaven[dtxlpfkysfcivyrxqt]fsgjjgzltbnlvdojqvk +guclyozvgpvbuhktwbh[qmueutcpmdebodbilp]vglsdvkxogzhzewjpl[guoovyobczavohc]jdguogegerfiwrxthui[hdcvpajqgpsoxuoawmz]ztwnqkdjnnwazrdzpc +llcocydhktglycn[aqvpbqqcyyjlfspio]bfwtqbvqbywnhvn[bdkrsfpiokzttiazuaw]kchhszhegdhxega[mgfuozyxaqcxmillwlx]mzcerkylhvawvyujx +jceiyppxbreywlqlc[fizmzubzyefdntbmd]bmholmqrninpjuux[wkbshvxwlfhlrpkbk]bnqhoqtiqqpsibgykwd[ajvhuevpxmsrjrdwt]ejcwhcsechltmxlycwv +lhzgbwzjykgdqwj[ksxhpuzyromwycwqtmi]fqkgkgvjfshsltg[ypmdudbfamagwadtia]nxqvzfdgxlwbbkrssc[zqmfrjzhsztnqbdgo]dvzoywqsqizywigsqsm +vvnbnhvgcpquhzbarub[ufazesxvliazvkcanib]agtuglmgoxupumcispr +mtpdvvydctgradgywc[mtpimzrgtmnlcge]vxbxcxjkpticzboc[ffiyihkovkviqjifrnt]yhxctiahahicybqti[latcrvinlucwkxhmc]ajivvpmxwiypcjtevwh +dpnjvkzcoyyzmgvvs[gtjdsruwdhyukkx]qndpbpmhkdngjmab +raugsxxkqxpsglitbj[ncskiewbnqnhxvojfx]qnqtemgvotsgnlgxyb[exshfmlaagkpxueykd]vgcwastyxsoddgu +vtmkqugezjlfpad[ljdytmxdmcfjvqus]zwkxtirtowwwoqybn[wwbggxlelxpmctsyio]ojizduyxsklhvogj[wkjkwbzdmusrmnwuq]dnvercuduocxwzzqvc +kcuaibmbtowdpkk[behnytmljmvkfzjzx]vwmeazoaavjnyopedp +jzmgdckgiwbhbits[qapkyzlxkcinhakr]zymyymfbxgiypcn +kbcfgsoqgqvurokxs[ygvbgzijbgfeylxvl]xsjucuevvfddgod +unfolwpdrbsrzgoo[xcskhiayzcpeegqfoe]sqhinsvvbcdboctc +yclpzeggejjnvkssg[jaxstjrzmutqmaqq]buvqcwkayhypitxnmp[hpxwubjyepaqhyhud]qhqlpdiqdhhgffsgtqw[ijhwhbvlbixaeywd]fwpyiwyrgoquoeuicxp +jwgenomewntwyxiawpa[eqcukoqwwwaruuaeoaz]przxcbqvsrozygtcyl[krwnmcxmgcgfbvkj]pcifuzymidokmsecl[wetuprgdinttljgam]wiiixvydbevhtscp +vzuukbqyqsivwpeeygi[bsfyvyrjgidexcfzq]wyfowikcidviqqnzcw +nsvfdglsbfbwlxfpfs[hdfyjgnwdgeropdfian]gznlvhnfjawhokhugz[klxeguqtsnydunmtj]gaauhesdugovoftjb[agqwktizuxyqgbvt]zhbzbgfwnkahvueja +xcnkdghtgpxbfefay[iekwzcvfquaynjpflf]rfmwtjyxputzpsgr[rxbiyhzboydmvufaz]vbibxkxeazvkbzpnrqv +efxnnxokdpeqbimle[sygsnwvurqpxovmfv]bfkvfubmjyasmvc +pvyunauqgvtigep[ypayrmkixxbagcbawlh]gsvqfsxbquttcaayobo[cwanbliqbdzlcur]ckdwzoeeeldqnmpnzta +uaxiegivsmmvixygiih[bwxhotmjiqmiffwt]ifggldhrjitovzh[wtrrvwjwudasapqdal]zegculmtzsyaxytuhih +hvikzocatynjoxxzjrr[yowwrajfokqlojraj]gvquwhdppqvtcvd[sqcangyggkdiljktl]fpjugbjlanzohbvfylb[fxdhqobssfucfmeaz]mzrtcejhidkqkpqc +lcgelocktqpqhjgon[vmfhipgnrbypfellki]bqgdqxjnlynzdjogpbk[ppgoudyairolaaomp]utxjqpmjzchqdhz +mtfryyrtmzzlooy[qltyhniowpskiqmolx]nuxblfnfrcqtjqfbzi[bdslgcpqyowecpp]vlxwrojvicfzzzfb +widpcxggzgbkofmmtkl[bhvmncpisdisugtk]azxcnslcqsbtyufnt[lqwxnibqiwuwzwkf]iqnupikuhmhvvhf +amceoqorrqtczywlb[znieihkpkxkvvqxk]rmoexicvufbvzrcxisb[nrrbalocuvporahypgm]sapytlndnufcmsmnl +ldbwysbqqkcizwlkqk[kxbcvzlolkrtyzou]zsqlgwgtcvtkmrc +bejhbhwlnmysyqgzk[gombhcspwwomoqoprog]zgwpzkhgbgaveqpe[kldisefosjggfqzo]eiyzwmdoqqsrpekrs[yoblfghskpxbimnq]ewghiykdpitzdsydl +uxdgjfelalnofqouoee[obhlfmbrcdwvtgs]hgtqhblpsfyxxdmruq[amhlljtgsqandpxg]uftttypexliymsri +xwcoczwpeprblqvdsze[fcqzupldpqdpibi]peaetflnafpkrqz[aibobqkhvfzpwaajxj]mzlrkrfslubibbu +fpofuivhqvybvczq[zbhaursvrqknspvj]zlovzphchihqwko[bxcpnqiijtjpypqk]hmdzgwlnervibxuz[hxskzadaiwuhkjrvia]fqtcewytffzarnbdid +kqzfapnhrgdwnrxtwcw[keiqggcxbtzwrcvrvl]itnkudvtbvfwlcvguev +folpqmauykgkbtb[sajzutpltmpwuvzu]qgkgeonxzucthfluwfz +qiniyhvlxrpcbscgf[mmjtkliysclrogfxsx]snxccrqkeuqchwfi[wbbptxydvrbgemquc]uyqttlcltqvqmhu[sawrjbeubszmuwsjuj]rowkyiykcizmcgha +xafcvdeuuhyxixxn[abpngbyvpnkmojksc]anahdcroysddmoxf[tasztimgjqwkkic]fiycikeddfoyafacbfl +fzmscbkkolwovgnjeb[qzholetigkxxmnmkoc]ffztdtemtdnustwuu[zjrqslegqkywtcaqod]qdtqbyfhwehdezedf[qqvslpytqtjuzrkc]knqvowafliildhqxgex +hicsgtpdpugetplbufu[lzlwcptzokxrsxtrl]smxnwfvtzttcsesdu[wmucgluptdavbca]xggqqcfaxxcagagkx +hwnfzlhdbchsmjwaytr[xfggqnxtnpdjzuyqm]efiweqzxmsxetmyjnhc[mgjnkbfmmvyrwyocr]jhviqqnrgzjsdmidsjs +nvouetegmutetgw[keqvyocxdetebkcgl]qfhnyfdnjqnklpad[swuvsfhrnzsnatb]zjwqmrmphlgwdnms[hdlfprihcbcemfn]lrraefojxvtpxljil +fowkqklueytawgdxklx[pmrpenfrmskqjttdqiw]ttqjijvoxxfxrrdve +nsyzzlnqjssmirvejh[gpqbubkrsqphkdjwg]gvzcxqgbvhopkgy[nzlfaemkjnuwvhul]vxdiuaimpogvtkx +pofmqefryoxboubl[neoxktodwrswfsxwruj]frlrumshrtcllqqf[erlodpkifgfpjlbl]bbfocfbyqjagesavoc[ajasttvajmlfwec]enqqcyveejcayzw +rqtdsfpdgwrlmfj[nmeovqshevzueyvd]ibiplfpvkyxvacl +wtvwzmpwviqbzol[oqlqunyszsyebxbm]ywqypuyvaiegekaok +ijcorxkdzocwisjb[qvcjrwytrzftjicua]buuniicmziszwzikph +pplaiaulcciebujjsx[hlyeskfzscwmeqss]tuuolvvbnyymfmo[trsqblvfyagxmgtwfk]kcigogbmkzsjlsrj +dbsqyxlovoghbra[lwqmeeclsvfsrezsed]odqamvyyhsmctpqegav[xxoamahurojgqse]tngvfzhoprhrxsccgnu[zwwglwyqrieusmlfmrv]tzfresqfmfspigfeo +tmnutczqpsydibk[skiokxeqdgilzjq]rfkxwumjpjulbkiz[folgircuujlcjhjqxa]snhsgynrkjecrsu[vukuvrankaiilqegzup]clzyhjlcbrfdbjrzlu +opgifufncugjrflllk[epkqgmpkzdijtdedk]xmvotyghoniyalmmg +ovtwjnqubjphsgapb[cnrcpnxrfclncasoeka]duqduyvmbzwdopyxp +imtmstorxxvbvmz[muklxeyazsgitgb]sjuudyrlbxgtlph +zbnvlmvzeitlrvclu[rwlyxjkxlvgeyfzdl]uzlfzyvmybjonpqay +cdxryezdoiyoopuzgl[rnmncixgvbxromitr]jgqlptcrlpzdrqh[sstvgpzcldcmoslnycc]cyrecvckpuyjqifsuil +acjvnpfqosyvnvzbjyv[tmnczokfkjaxcvwjo]cszegpeuzanwadl +knqqmdktrcvcikcfvcg[lnsoisfwtfpizbpo]xfxuxthdxsekjpi[qsroiaojvihodgq]jaamntgiaqvdasnz +mqefdyhtbqynychpbh[rrjozrtcexpbrpvfs]dotleanpfblcxfltod +coayqpuuvtnwmxzhgnu[fyjdjtselprfevq]elfqjzpryzqsyqykkb[utrizxtivhakgjoeryu]ozeuxjmcorkcejprcr +ybbgylmtmhxlhqizp[uvknavcimbacgtcaq]bcmdwwkdvfnmnunyp +xfdywwnnhzqqvuywq[drtdcfuoxvlflptlca]oimttatgiboynmu[sdgkeffjrteokyiby]tdiaadhkqdginrtqpq +fbpfhfecwfprygkwu[hvqikgwyrdwtieahmt]dvtcvnchfsienpasxw[ybkvqrxztwzpsnz]aecndxpzpamjkanchaa[gbjwjnipsmepfxpee]wqjnfjiezpzacmgf +adwjbyiantljqwsixso[wpjjoobofoumdxgrxv]rkvrcmmrlditmjtsh[vthldqtnlpjrqbobzs]efwiuqkqzfdxyhvgim +hbbvxnhhxsvghuh[fcrgvyndxojknfr]twczivatsbiynqjxeby[ckqrjoolqrxxjgejzua]omspfwphybvgiqpsc[hmnpdaumzrmqrti]sdysxoudxhpllkknvq +gfussckpoykcibjnoi[fqnfbkgojenspavpz]xqwvoktikoqyzpofg[xhdumbvmqllllthhsrv]vattqhipurbfvlk[hbebbjewrlmxdblgq]dmdhdbknmkouvie +tupwpbmrvffvqbfiw[rqpefvswlzjnphduk]mvafdoftaeiojrirv +bawbqabxqwpswzezv[cjmoppcjgifyfignuf]uawfxptpbgjnqbv +sekswalpvwmmczwdxbf[wmcngumevhrbffuzwp]tqwvmkfngyrhgknowv +dovrepylcvtomveqe[vzzskfllpjbvrvrkryl]byjsouhntlopqffti[lqxrgcqywryeexyao]qsukbxhzoifswmycw[rktzizqtdvetwyrchc]vtsdazzrpipfcrnxbk +ydnkchnxezkalny[wlfhmxcboamfrry]rmzprrgselhmfbeamf[dssnudvuvyhvzyacu]jyzdefurrnaqrfzq[rnndewpbutqgejcy]qxuganmeckxcpdtd +xhwdvxmfxmktgaz[qfzqjtuqokjeznwalq]ddgmotioparmkkudqef[pkgzogoaxvcwsao]cyebyhigpzgyclscf[qehxqzuztsluyweopsq]tikkkgtpkewkzzkdu +cygqebguktathghp[qlkscioiowgqftpd]ytftmijxsnhgacfmmf +ccuocdvpjktkdceebi[pshiishnrprqohwpt]bubrhtrzuabpzzvbwrv[msdeugbygsvewfxco]nzavazcgkniyxva +coscymyrfqgisrge[oggmfoqevlabvhm]xfyhzwpfzhhyhimqkhz[cybjjylavqoqjyyoy]igzwdivoxazgajmiy[kkxkhfunkpsgyvwp]isgotyzlmyzfqrij +vaezncmuzyyjpeomif[lyvwvohtlkcdyuxze]wzdkddeqkxmqbqet +yxcqysoxpbwjlqjdp[jinwxwcdeflygawd]hgdgruqilmuzuzhsg[ivpimcyrtifudwjgso]ostoopidgdzcrzzyzts[vvaiuzzuzywesuzk]ccmdnuyihasnldexf +jhpygjolrfstkxwt[krdivayaqwfuktykopv]dmposdxasvjkzjesg +lcprcppxkrnwuytdt[wysluivwtmytfgqpks]orlmxnkipofpsdteaa[vroskwwxeeylirbkna]zkeahngpukldeszwuk[harebfdcelqdbfemgo]usisvvczvasjomnjrip +eybojdjnfockfbsdjd[xjxxevnxuwjdamien]frogttytivtegcy +rezxczwcihbkywyq[sdzzflizzygfiovwyw]jhtiwvelkbaqhvnylca[xpnwnmqbaawlyqz]kftcwdejxaznztqsbhy +zitlyztihmeogushh[wpsygveulmddxdzvwvt]auvwghiyvkvfxyzf[ccnkvkboczqbgcmekt]hkqnuaoeffocspxkck +ucliphnwkaxtwgnma[wxkbcziemdvopzeq]nwxnkykbefamsdo[lveynsoldnjkcdn]kluaaaoiqsepyqfz[bgjuhrlfjgiyngwkwgj]ofjimzheftgbbyrugn +hshzrytllakuifsbuap[znsqxjzxbeewshkb]tdiohjkqimfsaijvmvf[wxvmhzzkjopfxhshsol]qgjutmxlputvudf[thwwxcavnensivbscm]dounftyvyaoguqzy +hktpfbzotlbrgddcff[adqmcoiraqbphjpag]fxxdcjqhwkftprk[lfeudfsbvnqjvywynfl]whirlnojvbkpyndhyv[xpypetlsykaucaibapl]gcpogvgqrgensxdeyh +afbiuqpasfjkniuw[bqclbergutdzfdqhdpm]gcgpimwjmvopfjhk[geztaacbsloyevwikqp]jjmlssrsuxmhbtnq +ojotaeydgumtjrfdtam[gpkjanckhqjvfjewt]zonzrwxnucpwtrmqyhv +llkryzvclmpozerpao[gfrhlpemunmdackfmp]fbntrvdilgbposhu[koksbsqnmtfdsyifpp]eswrneaxvurkzfs[ixjekbpjqsrhnpgw]pppbdmxsdflptotr +vbmibdiednxxbammtn[gqvlmbobpzpiuoda]agjiighkbopkxvwakva +fnlgxejzkpocaonnloc[ojrecrvcmirtehjfcvi]mrafnbifqfcqxpmqdrb[obuqfqpyrkeinweynd]qceebfqvcmnowjanh[ejpkcpwkjfbvyjmyzoo]hhjyeulunsuagwq +nubgjzyeuxvtwcc[vlpjhggsyeiulml]evysofvjmwxxazzr[tapuneqjkzgtblgy]gvbvijhcgtrdsybt[sdufwiyfojmptfruns]zqzvbotgmrcynfyq +ibcblmwnlhhftwfd[ajuhvgkyaqeikjgju]rvuwgrbnjxvbcgdpy +hizeoqbkkesksvtjotj[wkvmcgctdzwhzlubt]aegcgfmdneprdbw +lqyvebgqsrsfbcdccps[hygatrvziszspyihy]ratonoqinqfwcmm[pfieelpgzrfzhdffhx]zwaytmidpntpolajcg +admawesoilkvcfx[rqurmchqtkuifxm]tliyyitqauzegwst[zwpbngnlemkipcku]hpxfncvznjgfglvugk[ruinbrosnwmxdzav]adbvgjbxedbmxbkpxa +gpqgezsbrdmqmeihdr[etboranxahpniwzr]woeyirnlebizohoa[rufjzeicrsxgitspt]gltoxcqgcsnvlys[dcvxqvoivyuxxayd]zkxlasittnitmoisr +acoxthwyfwbhszfoz[wphyzlksmfenksfs]hpzmfaofkobjpcdxzs[sncrftlydahuqmuvoqq]ojvuhabayhrsynq +nxtmkatkddomlbnxs[qdqxrwoaamrztvkzq]ycyqxxaijhrpzamcbh[japizeqvlqsmdqygr]xhxvgqmbzgomhsm[kizldaqvytagvviondv]tidqihojfrzvyxy +lllcbzykxbdewnyff[iomemkjmyaqllvcx]vjvnigrbpnhdrbi[ukmffsdgnyqxafwstg]ralpevvmfxtqbzyii +vphviazdmmvtcyc[dcomcirqycymvqkm]meeikjmqliqraeqd +jcgueeliyoclqera[verzkovhghnquyndr]lptflbxptsugmbhvf +rcdghcuautflhme[zngtjffrvagsmdrxurj]mwsuxjbytlzyhinxyr[cibaxfqjdkmdwxr]yikrelnmbneqrsg +jyvaeqjealrbvbvekn[yharteswtwefyedz]wosalojtbxzaujpiba +cdfzjfycznejinx[uhnuxxhxgipoujnarw]bkwbisknvmurfnhp[jwbnvuvlvegrddzf]bkeykrhmjuphuvoza +aalmyxywwvbwwttad[daxeeneiiiupzvqz]cqcjxzindssjrqb[komptxyxwgtnuedefro]xfbjflfujclbqflke[fpatdmophhvpcmwfj]cqbuduaifbuhwiy +kogkhuakigjclxbjoi[yuidmmdeopwzvatxc]qdsbzscrwpmnloga[xsnwctwrdpgqvggoian]yayspjjhhpdsyzkkzx[qbttlvpkbplhagtb]ndnljzkxhgdvclz +rojijwgcylsaspmmrdy[jzptmasniljjjusl]fslcazgojebnrrrz[ybcsqnloovizrxiwal]ghjlkcnvkjjlqodusp +egzqbmomtlqvjfo[cdarustihbcqwpfpcv]fzxqpzavyniyjbfvc[wkmiofpbdcsnbtj]kmtvlxnlvdjflivtuge[jvlzovzdpwxwbcak]hwbtpuolbupvwfcbh +drzhzwluzurvcjogd[haakukjmwslumvgq]cmwkhsuahrqxfae[kugdxfrtkjmyyfheze]dyxxyffqsfctugyca +mlalvviidgseekfkqtk[rmltlzesxldtmsnyn]xdqfkftanryqfqrqkhc +vkajuyjjhekfhmwwek[uuanfibpmdbwxesfmsk]dxpsqnnmrnspifpcyts[ezmjkdjacskqhhbaupr]wkzxoqszqigbajudnq +wmpzatzujoibyjdle[awbuzjartnsdxfqtlh]votzdrynubyfrdip +tstuekiwimhtizzlky[trscvkeiiriseqj]glbwxwiwdqhndmnku +kjgjcnoipwnlqnk[hpukxdqokakrgjgjpk]nvinvznddzuhupepemb +vuawkeimjefqtywj[mgdvjppiouqnnyhzz]eeemepklcxhhfot[ktiuxquqhzrojqo]zcwlowvczfjucqeo +zatolywcfoplujidaz[avcmpullpablbdhusiu]bkwehsbzcysrauzz[tbgkmrwkzqfysfdh]anakunhzskapvmq[cqzomvulpzbizfuqug]untygoozordiywrnkm +ozynyagffvaeava[lvsgzdvrtdifdoxgvwy]pdkwomqrhfolkmj[fhemhaolmihgxlehn]huscypjzuujagfaqk[deqkgecbrdfhskujqg]grknbktwdyznqgrwm +mywakayudrxzofpri[qlywfoydoqmsmaoygp]xpwmtcqqfqsmsys +sdwltsgbumfnbqq[irstsqsogmppmlmkont]lrwnbdnpkxgfhjeo[eqstbbwumfepxoqaszs]fdrrfpfiotaugunbdrr +bappxujhicaqxhwiaoo[bjvhcmhrnldlwyrf]jdxfokaxlkbifuwyv +jlziyvwcuubpsziikv[mvkolefxtgoarsk]tpixifdoybzfwnwle[lpbkitwthyxdbvwflp]eyuzdxvhuukuiaqfp[xcwvlmoqpjnehwudh]sqxbifjmrgwknsno +rblicwlpfezecfhati[aqqhagfhathupym]vspyjiyytesirim[rqjyqiviftryoyychs]voksponpgjfuwsp[tmsccufpnvjdtgs]llptwgpugyjizqfch +admwljcwmrudrrph[rcxxxswmdlllfdwrk]etyjbtmryjxeajzccmq[nivhwmfzjwaspuon]tslmnzikhnbtqwkf[xnwykihihgkletgdy]mrtryzmlleorzwpi +ibgqtdglmjgcdfsycxt[ruddaxuheyvamwyi]neoneshgxmsbpydg[ytpshrjgditzqmjdlz]nlvhgtzsbzoskiva[asuilfpsgtgyftgtsho]xgoevzdtjemapbnady +appgubyezsrmwec[wbqyvobthbuperojt]gqxsjlchxpwvdfvdf[xlndklktmbpjkzuo]molwavhkvungdkvwywm +jusgjqhnjemncvbvy[voitjezdotclvwaggg]ffunuypbjmopbbvoh[lhufstqbkhqxqiworpi]gnhhneydiasvmbvbga +hvboappbxdqyjvxqyd[yukgymhpumetulsznf]hgiqjmlrezzsfndrx +jkovbtabgnbztjmzsoa[flxcmdoflhlgvaio]qjxscacvdykhkxclej[taocvcbcyfrjgcxlkm]aovpiymrcdmebktxwfa[coviwkpdmukcsixdob]trjjdhlgwwkwtegkqmp +ibnaxwwqjgtgxnlax[zozdkkwbccwdbvbpf]dwuzbcgeqfepczlvwo[pmlmuysuwyudzjam]pvhpqtcigtknoqxlib[kvwfykhxumzltcxidt]hybnroedkguawhgl +xqwhbiiflggraco[uwhisdtpaprjfji]dexzbtghefojvtt[nlhtexyhufqeneytdtu]fpskbqhfhavnbkjxwn[gtxmsoydrotriljoov]labmxjlalzgybpdjm +ibxakiwqconeyudxj[mwzjwhmnlaobsdy]gvxbmnzqbrzuorla[dvbreuhggwgdtbjet]hjrvpdrakncsfejis[tstdqmetsguihzdws]ukllrzriimevvsekrkv +ztiyqybtvliidsq[mvhqxpqunpsqouvgrbx]qmhkzbqhemycwxeq[cdadaodqyhjhelanr]rtrnroumhiwdadrbe +nswbgqjuxdygjrihvn[mkznbbryojdlhwee]kccwymwlzrsilyn +sebujequsxstufe[romzdeirdhctzkmemwt]vqcobpsqzelktljh[twewiabushguyyp]mktiojirfewuoacey[tgnliawsrpkhyko]kaytwdodmxqandynomu +qvfoyofzmhctntofr[xcokguepiaisrpwewng]lwwzyewekuamxxlepz[vybjmfsierveheb]bzvvxsdlcohnpmgir +txjecoixmxyskgactb[tvgiyxcbgzkdmgb]yvjfganhyoguuygau[vztmvqrrheqkzasss]mngxndysymgybqw +ptprazbzxzrjpnrcbko[qtdvwjwftefqzaw]ajavbdsfdjghhismds[vvouytxwsxpkttqr]kobwalobjsrwmxz +ucvupuxupiasbzxsuo[hnocitmtlqgttgdr]qghjdvyrttaklumszdi[oyeqkgycqizvaok]xpnaaapzbfqdzvcqhr +vvjibkoyadzluivaen[cesqlbhxmigdxphcr]ztmuzxnzeprichmdsc[daemwvspbbljrfc]jmqbyfpmjcddlepf +ztncnhqvomvfnkhca[ohbigcgrevrnpvuwgpv]lnjucgcpghvtzlrgkh +nsdamwafqwcjnslx[upwtncktpxkvkyhd]smtcegxuoakvjrl[dhvmeqrfgnbwqtd]zwlvwesmxdcnywjdb[whrrgcaujehwqcf]ayjiiktvzvxxquszmh +vnqareestxydfvuvj[psgzifyszldodtw]zkrympmklegtsstov[gblinnqlnfqargqx]hfcchypjbzvbleabbo[xvlxasumenqxcdgzqo]zyhgaickhrgscmo +jqaahcqcjjtinevp[kkntdvvdghnkloliin]zmrsdzabbeotokuz +vnrmthshyygudsrbu[yjvauysxhjhnmqenmkd]jbjlrunbjbzvilmyqf[gnoejrqddyzsdixecs]qipibwxkrnbmdgtevfx +uoqovspbksjvndhjz[gntlvpnmkbjcbsesyk]thzecqozlhmhrpm[ebvhbuhvuyfudyeyeey]zdlhgafvupyipekqoqt +hwilsmnzpcjvpyor[pmphksrtsuqgkdqfyx]psibvhgullieqqwyd[uqesmzorfwbvwgkiu]hlxqjuuflhxlgrub +dzxxmdpesgrpwhw[ohdfatbpppptmdyia]pqxvivkjxrisnmzbrl[iilqjrtayjrvxccs]gwfohsvsvsldpwaelep +vaenounqqmpnzww[duovdncntfceyoqojlv]qttmppevxurnlzde[jhwuqoqwdxjwilrgxil]ehuvfpawjlrzmssbzkm +wwxcidipvnqzxsvhaxw[oivkplzzdeoyqlemho]qthsqnpnbraqqkeyvk[pdkqargzfikxoxwsimn]biqpfsweppknwjvuwx +yefdguujlfuicqqiq[hqlabsggdampkda]tccxpvlmetflxhnd[oqnlgkzvzbhvnzzwz]rfugmbtihisgdklb +cmapvofvmxpioycw[wsmfasgncvdkvjnodyr]dkxkldjxlpdineg[omntdlldszepbdcynah]swcjxnbotrewahi +awbucpjznymkfhjaa[avrrlftouhjbnle]atvuoxpckhvplxm +wfrfilbmvnfdjycnlsf[thxhuqnznohekfern]ndjiygqshnkfehr[jpdgoiqcdevzyrywcp]iuqxgoskimjzasbvsct +crckwgzymgpzhckbgct[euhwrvuqcknwnfwokiu]muiqtteekeqzajvnuc +tljyrckyrcnheftu[xshakjmkjvzulic]mrloxmdpqnxcjhnwh[yyqdzldmfgsnmph]lwlpnskgxbkivqku[bwyxcdoyizqjmfvmc]reyetuasijwucrgylh +zkisfuqufwbhfklf[nicopfmlcpsvwfq]nmwkhlxmquqelszgbe +cqnuuhyddzalcxc[fjmqzkljrqjbexcxxf]pbjsvyixepnkthndhb[xztvuzlknucygyvegxp]nwxzswdvaspdufotcxs[bivsecxgawosnflmfd]bvdtxxionieorvecr +txqpvnrfxykothvao[uikgxsmnyxwlobod]tddprkiwjtdcwbobzrn +qjgftnxktteviik[hsnjrychdzepxamtfop]golzdtnptijzmpo[gfgevfrczlektwaohmu]vauncttcwnozkrwc[ljvbawzsqbknkuktnn]inwckpvsipmunmpo +kqxvmryochlslekzhl[ivuyfsoefnqqtwspxtu]bytaafalzlqvjumuleu[apezlzoaspstxvknv]mnkfbppakmectmiafs +vungsqgzakhfjlbuwig[cgydynonrrgfswomgev]lkyqpvlplfsmznc[kttzkoqpeplpfaoheek]ssijcynyhenhnwvd[hleabsbwqkqqnvdd]xbbxdphvgzmnauj +rxweekbgidxrpbcxk[zvguddibzffxqcmvq]edhnueezmvxinaxyo[mqhjuhujxklirvkm]eaozfcadmhsyfpoj +rcdwnquofraczluzh[gvtnjtocgohcsiswush]gnajmbxnrzppwobfjta[dckvvzvigupevbt]veqtchjayfclaltohjl[mkwsfnvdltripnzdkwr]jhdwksbflywaaul +iltlipfzwdrsmefm[brcprzzhfwsrzbk]dlegyxlpizwtlts[fcqadgpocjjnahyqm]htwrqtzfxoeamiqgeq[utrgqiasppoxrbhhv]hwkrxhaxxtltgbuvj +ljimkpaohzhoifdaiko[dkjxnandaghzxflymm]szzkmlubraphtnokpcj[irrxpfhtabogipufkev]bjucnqsbphjhekfvco[vejyxqrtfxuxeuelvmv]muygwodxspxrrijc +inovovgduyohxdw[tbzvjivtssmlxyc]pimyxafhdeyomgeu +ivahljnswgwewyhhn[jvfdvgftpukjcny]rtisgwgamadavuw[lmwlmlrkckbundmzjvo]eqjgikocnpbjpdh[mdpfdbxenzwycoou]uelglssvxdcxlwucz +zolsnrosfihzzhu[ravlcysbjoagcvaacmk]czfdqdbrlvweyyvbq +vktqafvmirobwwhtr[iqvczcryidfihypuz]adgkyomqrwfucufmm[ecbtnwriqiiaurzkn]vtyotrwlidvraksywke +oagqrhpfnkdvvsqemp[qsjyvadkirmihtfezev]vuuantqauwqrbyzxpev[mpaqvjcfntbdcpdi]ghgstpggptgbvwnmyiz[hghmuvsvhqxvxmmnx]owoulisjbqpndzgt +yyyrtktdrrprfdtbyli[tqbcxefwdtzllez]uaixdyuensmvobo +rginebxdxtfoudqwqx[bvnzfxfxsztzqyyq]dfvdsghoihksjcoccbe +avmokgrhvdnoptv[ngynfydflwspxifoi]lcdqccyarzcasxrbue[navvkjotgujkewhrx]ogzqcdvefknpghfjssj +sshuolwwobwchug[cwcurmfcxqblopvho]ghvtsqgltvvlsahwqpt[skxuphjregpzpqm]epmegfynfypbewftism[mwtakvgutsuppqz]tvapecuvnpedscjkfs +vsqfdssjnhoineb[tmcwmioejrnbdyrq]hlclokouzhvmmywskkk +zuxeupjvtrzzlwezm[gsptwvqfzpvkevapsvq]pvjuezgybonsblmmxdv +dsyuvmvaisuqxff[vmguqxuvvtbjrrva]ivytyfdovrfmzudyzcw[kwgjymkeadjgvdvxarz]rpizkvgpobjriqutyt +rpetcixepthhnydtsx[dvivlhhlgbxftlw]ensdqrwytpwniviwh[uierkmawdkijrbrbb]ywvqqtldiulgtft +iruarpzjrxupbdovqlk[cipcsklubepettbee]jfnvwjcgypepsbnauh[ncvfofkqfotujbat]moqzftmyjreztaugkij +uqqijwordoicegmn[ihceutxbgzatiwhtd]hxqgbplciimactv +kthovdomnavxzkrtg[utmtbhgqydotlxos]rtwopdppoocytum[ptdpdrndjiboffigipy]fwxyvpdnlhjofwjtwx +vitzjdhxjjossygyje[vzysmvvgddhvkufqb]fhwstpatifhmyespsay[mrpnqgygncsiwial]cwbbaisjnqrpuzca[taqkhmlvfdelcrzbryp]kwsdxlkmoplziobgct +iwybfvkucobqwagtdf[nafgfydrpzzdujp]nzdzwcpazorvzncb[niuturhwvakdywurves]txickuysfxeaamhlv[kpiwhdphpimfnmjinua]crunehowomfdmznrc +qololsmsdenfcxmtqxo[orjyxjutzakvhok]wgcgzavspuxtiyhdds +fvzbruyrecjzobgjfnv[tfnighcrmbgeklgaq]eanwrgtehcxvxow[hrmkbicsuekiicxw]pmyfavysbfzttzncxbm +frjvccazhabvndxri[wrmbltymeeoqpqtx]hbyuxmlxfrjrzifpj +nkasezsbfuldeolo[wshypstyfliqxplkh]nsoplkbnmiagngvusr[mwpwshlkyfrxlgcofiy]ycplnfgorpssaitngop[rtplyrqezwrwqhc]houlrclmoatskoufgti +cmsmitcywtmhtimj[pevbzyuhvaqftnugc]rjaxtggjpjvayzmhx[pvfplwswzpusjzhom]jmaurmlkkbusduxd +tshzomvzzouayvevgb[esegiphlwqwlkgt]letvbhxdhuzidevee[zngibooquknjqqxnxz]dtnugmifjztkwjpqd +uuzovqhxwovqeki[ddwwgejprtbquodnj]nafunjrpotozufcf[lqyfeicklrejcwwrvxu]kfxgdnpvqdmvvitzt +syawdtcaspkeubwty[vyxykmhcofzktwfex]fmevgmpetmzurpou[bgqqdkgrojeesxj]lhnvraueoksvtjz +hkyhsguxgsejarhub[kuluosrzpmogndwe]wzqvcpdculcwgqldxm[uybwzbsgzjqfspayk]nysymudwyxdocossgu[usnahkjspekuwvgtje]gtjxtcjsdvtzwmf +jiuygraiggbzoxz[wopmhgtzdwlkyzvfhs]kquojxccygvgujcopbq +rmdqmtbvzoocsjddyj[mmwewpzkjayrxkortj]cznmpvsiqtjdpbgbbf[dfgdncqhajjrohr]kjsivnolfcccyijyd[smuudgbnrfqkxzec]zukmasqygzxrjqoz +zvhafubtbxcnggnnec[khfuhiaikrpowmg]udtuciwamjspaojuks[wlzjqwtmrfrfxmxcfd]plaqjdorfrbkkppep[exrlzahsxksdqsllkn]fooqtqpmnglrwokq +rilxjscompommcmc[qpdxzxqycqutfyj]xvoufpojhanaloymvez +crvrlgjjpprknkurjq[tuvlylfiibnpkzmi]ghncayxzzrrhwfe[atnpozkssbyznplv]elzhtwbiernezqns +yvdbhamisqligavziqh[jcfjonwpgcszajk]xdszcpfvefvmlduoo[vqszbxqazfwgrfazh]geltrpsnlfyzzxjsg[usmmfawdtvkvkcm]wqimqpbsojuimmf +fsgjpguxmrmwxeymhjr[gsunymylqpnrbmiqyi]bwqcxjzweyndcslvxx[rhtvuzqaxazgzhhwp]lqiceppxpscreytystv +zdzsidcfertfbeifye[vdttvawxhnsjirsifn]abpddikgqtsqalilwl[mgqwvkdulrgdgni]bqjuliwrgnvycgnvcr +jrrmfvdpwdborgjxw[uqsuxsointqfsbunl]qosvmfqnyadjfhrc +huekbtocejhhjud[hzglqavqagcxaaksxp]afqncrfalluiiqzfo[mdgrvbtzxdzaztpeg]lsthchkkrvofbaa +lsehhfmwrfuqzewvxkv[rjrryjrjwhgtdifux]nnhqgwmoxdcixsna[wgburhmplkpkrgmpco]hrakazqqsstcrxupvv[mhacbkzqgskhorwf]fbobhetgehykvsbmb +cjmaltrbirusgyoirp[eipxzkuhukkdcdh]iqyymukrkwitywb[dcvtitgqvetxqip]sldydwlrcdcrljhzu +oqpgfzdkcrsrazei[geqerlvxxatddmn]igakhcntksmsttyqsv +tjhfyftjaclsdwzby[oiinbkqwzmhzxeic]ehyliwwisegufbhh[sqmpgxuqhsxnzdi]whwxlqgetakchwht +ukgmtuvowisscvp[nhzgobykdniheamz]ekflzosxwmggiuuudz +sqbsxlbyunhhepfx[okuhhqbyojpkahiz]hhywggdmcojawfpvkhx +xlqohzjcztxennv[cnbtlwijpkczgrk]pwxkxivbtxzovdn[bekntreckjtfkrsihm]ouowyjrzyjbgsygj[cbirdomndbelavpb]ujdrausbmqhnretkhtw +jaowfyulkleymkdpl[yxwftdgbtfzugqnnzwr]ztmzcodybfzmfrv[sttkedpckbjaxmqvhds]fidvanwfqvpywervo[jtludguqxuwucvzcjmv]mfnoqzvgatqhvteacyp +txyjtniwndqckudby[jbemysikizywlxbv]bezhcvssxmbmzgpo +gcxfeqprbvpwtdnrxcx[kvhziidtwrxlhejxm]kxzumooacujxvuwsiui +vvzhcfuecgfvrxrnquo[oqgutuxthxlcxhpke]liqjotlxzbmsassyxrf[colshvmiwbfjansdg]vggdkkyqrjvthtvp[dmozaqtceghrabasafj]lnsoewepnlbqvibyk +keehyqsqydfzlqrqqu[obaslijmtiakxkc]wmrxgysajmjymaqpas[tqwlwdqldidsapjtzct]mjeqlhemnwupulj[xdnkrxbbtlkzeapnat]btxcxfncwhdqlhmh +qwdiosimjitfulva[dhnypfmjunifrhopd]plrzlaakgfirzcccif[strfuwthjgfazeoq]lvhimnjpbpagrozczhn +adqktintsuslnns[mtlbicyrgqgnxuhqcd]mdadfpkvbkvkaimvghc[cvqgxjplvvqbato]lbskgsbvqnvndequq +brftuxdhebezivqio[yukrabpvgetpxpylxj]ldgifnehggvkdtq[pobhasghdmctwcgl]ccevtzwnziffjhqu +ibeocesspzaammu[twfeunwtyqohdtz]kiknftbdbkwrzhrdj[ywsjzyncsuyykqgu]yqbjeqoftsblixeozlz[mmcmncavhecsxbxi]aumsmhzrbxpjqrxllit +hieqiicvqswviniteuv[ubxwceioqqhagxybrl]kikxmdnftjiqazj[oyvdrxwqbljzkjbh]mejsqgnksglqmsfrlf +zjeouhblfsglaxzz[efenlnptrfbopulk]tbdiezqxnkiwmifiyy[pylvblxazwozkdv]guaxwfuktjlovasatlc[blnlcbxxlcgddfquwgx]jkemembgzzxssliiywp +juscmzarbykdkbcf[naosptvhazhfydzz]yflhbtlxgowuvmf[bdmledxprwnfcaflpf]fvjeubkojokjcfnzoo[bmmclnpuykellsdywvh]vibjnjgmtpoyvdw +kqmrdsifaonqprpach[chzxtugxvhbjujlzgq]ffbjsynmytyajcbsyn[jsondannallzwhz]gjrnybnhyxjismip[nocashryyqnbsszebpp]pbugutcxooiznkwwim +vfziparbxeibtccl[efwcwvbtlutmoltmrr]fjwkgsaambdhwvefs[nsrvprujruqdlxrls]ivmnrtvdbkumpiio +bjweouryhlzxnkfj[uuqptwyhasahjmkirh]rrxwiqmpcbwkhzr +bgdivzqqpztnswtd[xwfurbswsweduce]osimciokvwbydgqojkk[yyjvptlwdknyxnzpr]cqiztxdhugywyclvz +ftcvabkblehqjyqtl[txwnhqhrsrnengcl]skhszkrtpljsgiylab +ackokzybncuxpku[xzpocuamnohjypcdq]dwroulahreyhkraojf +hqlijbwudkycvijqs[buaclznmftiadyidde]jxhkyqsoqbpxcjgsus[atcehpnpgwuchfzekk]rvyzujpclugrfyksmk +hnrkcioqaeeqjrpg[cowbmmovdcsubwiltd]myuwiosvtmymgfyav[yvyjgtogmgxxnawpda]saqmtvyakacfwsvtxvd +tyanupyqajrxmuk[bkxkehodeqxpclfebq]kiupgpdlxfvzydgs[rvbbrqbdsolzrgse]srmrovuaxvxvzmrmev +pjbnyjsxcwyhjzpvqkl[qtgofokbciwsszwa]bwvnbcneuvipqaaiyjv +ecxbamdgtlfpmqhi[khvmvwiorzygnitsbb]znripfwspcqgsdzosv[nfhgdavrprmveeexppv]uhzugtmfmipmaznbby +jdoggfnexvkxovwiatd[xzxovisxynejpyxhfz]ciehyiyumbbwwxrc[nozxzgzvotunvgnhhjk]umzgdkvcwauvkzr +qhdaymaijahfkqzw[mbjhxuvbksqtvxwveau]rkvgvfqsehbynbom[keygsbhockgurps]nzmhlxxwjlpjhzbhw[ujitcxihwbjrmrep]cbfpxvdzbljvbfpzsw +wiuprpjfojcowmy[vmrpruwhtzbwyciid]ntbkrodejcrwavjfqfa +ctqdkuxwiricymu[wexourbkgedaqbybfj]revrxjgaoalievfbj[qtvcolrhwgqtjesuvkw]ozphhuwwzzguldf +bqpwrkyhlysqvwxga[ghyqnatqnccegjnkgw]pdgglsmagwkwemidd[fcddsukcrksifkv]cyutddgeoqcyopmm +mxmpasrqdexjpqfapbh[rqeoslcvcwqteki]zpervmncbpfbhwaxmd[rnljbhhtgiyluaaetx]aycxgjfqyxhgeraelo[fukyvtlgjzupjjrxvt]peumsiryqvhwcsutrj +nbdnniplhgrqkrcd[thcyuekybfqraxspek]rlwhyqiavfrfglg[luswlglyiuklvbuqe]mdgjepgjbhuyqkcs +lwueejoqpguiciw[kpbyblloubmxdhk]omjurxlkfpsdwdmbl[qnifmaxwapfvglrt]vssmqdzlxyyrdgkwh[ljslsxolkkivoakh]upwkosogsrzzuej +rfqbvdzxrnrbuhvw[wzurtnrnslhoqkdoaja]vuxsxofemkrjzqkk +pqslistydhvgulggwbi[nipdejpoxqfmbeft]frepgyumygqywwycjl +excgzlqtguboybi[guywktnzbmkwqrbp]qghuyihqlgjrdbuljs[zrkzhirafcadgqnifuz]medyulldvxdtpmqifpg[lsmokycxcicnxcyfpe]cobezkjtvpuqyqu +aajcheqlcfjvktswy[lsgbzwuxqcbgicd]skvwyyeawvlzzfp +afnnxrxdhbqqixcli[msrrsiakxynnwiard]tzanbapzvxtabeuz[rbyqhswrxrofedlykg]phyilynmscckkxgbhks[enrqxrwqiotksdor]phnmohcaqxspqhv +pjyiwunebggfgpgsk[ovrxnqwfhtrjoxwi]lmkquysxzdebvarwfxu +cdztgjverhjafgemi[aogtmpdwqhazrij]dmypauxszajopbp[sdsrejzmjvpjijq]okitpugefdhpbfnzs[jyospqqhusxbhfuuzp]btfwfpiblknocxncj +djgkwjxzxrgsncwd[iuaqmffmnfklkieaq]agtkftischmbszqpo[conozrxbpdsuonpvx]mflbagusvgzybhasrlf[ntidmtstsedfdbfwost]igffrxgipzxzzyjy +ahfhhpqofpjyshcus[lrxchnknzrjtzkgt]hvtqhnuzihgxovj[wbnqnjjnzltdyvxswv]bmppxzhzgwdsckuo +ghwlmylxxuybkpmo[bkxcurwihedpwjm]ypkvoiavnzgzlkahlp[lnxohqbghwsnbeqgk]vsegowbzcrqwcsgy +whzaoswycajecyuw[nwzgcizbidljdtoull]zfyczyjiqsqxgzsjm[nfkpyfcjwjijtnb]dabgzqajwpzsczrfzrl +sitsnxvhgjjnlitqs[vvlbonwoskugqxo]bqitwdmlvnlcziltj +avgdblmcidneynp[gkjdefhfakqungkij]eztuncfdkicjhaytdzw[dcfldbgzscsumjox]okqkplzsscszdsxejso[yihmpxvcbnsofchozr]easrxwgppwzqern +cvefvhycaorfsfbmi[fkvzdrremrlrvdl]cfcjirtcmdphvfircx +wegfumofnzigbnhy[oqkrudppjpvcuvr]fzyxsxrktwkgrvyiwz[jkporwybtotanposc]exmwkvygccdurwge +iqfavtweexjxhdkz[drnsnxjziacormb]yftyjvtetmuvwew[vlrdviggcdfnribze]xzykwuzopkedwfqjxo[vnadxonxshmwhvk]mqbtnfjmhjmfdftwm +odyopnscztauzvjvbfe[zpgqzgzcqclarhkkc]lfuvvhwhtlypbfv +ogaqzpgfwlmdrjgo[abvqsomptscdejeyfg]rukgbtpqwyyvnvrdz[bcvgngjhgitweuc]bljvftlzomvgvmlkzsd[yhpnqsmblsnfgfnyv]nvnkvwwllyygxcdnef +jlbnwewczmvtoshkwk[rmtpjyqhqxturbfc]ulsjqpziwqfjccmdpgy[neunvaltjjkcxvf]opuswwcrtqbkqyq[wzpxgeaohprbhvamaf]ybxisfhszawrtgsj +mmrbaaqjvgpshmn[exjdqzgpzdalrwmtha]qrxggoccbehivaiegs[udbyzlbkpvwfkaot]vfbmvytjziptkyv +pjtbkayljttjwyztu[clbiouysqsjbyjguhe]srltvgtetxcbkud[qnuhjnuziihtvqtbeyw]iccppmvrkzyehgiv[lldvqxdqvpcrizue]vpwqjhbktcmiyed +vxqpmalvgeaxtkpv[elquojhkjsxpmks]dqvuljielvjopjcuvsx[yoklegkajhhpatv]cnfivppgdnkjzmrr[vnjebiwfefjgqzle]aqkvijxvgljbxmm +lhkkzniihzzsqxdr[gvhbztmgmlicdoasdxn]fthfehxdcnyjhdwvsx +sthxexgjpexecjzr[semwlxfagpybhblcq]ztkmocjbxsqnwfs +tsswuaezqpzyevei[nolctgupccscwsj]serolamcjmqaawea[qgjyyldemhsqivwmvtn]rlmxvchrccptrgmmbko[qtiqgvilvevjvlkxc]jjcnzdjdxycczflslq +geiglvdxwpsdtyt[isbkywwxvuzljpnv]djxvppprsgjagqtfgl[wmhnkumvdpikdjhmt]snjqvydpmjqutduh +ksqeegpqcodzekvp[htprcliyvqdgjbqv]sqykqimpyqiwktnq[bfjsisougvnyjoyha]ixghemgcvicbedylz +mwomvddjcxrdzmqplow[fznhevtpwhldwpo]ygskvziyhzxmtbcikbl[tjhieqjuukoqmixm]mgzzrsccohxzfgak +xvdiafigrvgrckwol[gttxgvtlreruvonzl]fgwyzafvtwaqdwuo +siyvzqpzfobnlgtxn[zcgxyzgysabhpvsviup]xfdpicxyxyjgxyxd +tuyintcsfdyhfxofk[abiuiwquiscebxbk]zqazrpoxqqswycjwvk[hayvaaykkacbakpom]bwwhqzhuiitdaed +ckkmzdomnglfwcbeh[avqftwjqckajjqe]fkpgyrqzygfcheoctfy +teuvnsaipkrkmuu[rtiypvevtipwuelkzxf]xqywsffobbokraw[oonkmkqovksdycu]noxwpblcqqbikpbck +bwgmejgaihdorgcqq[djldztucejcjizv]nuuzvdhlgqscyrjmab[nwcglzehbfzzvgr]aybubdihvypmvqmpfhi +gxrmeqpjnbegqjeuui[iqpcaqmpavyeeqkye]etydxarxyxculok +wakuruxdmenhmcsgt[lndpybwsvzyibmd]tfabajlzuxwwhofz[msknqgraxzpzwytjx]lfoqigitqufmhfmgwgi +gpusiwyruzmkoluea[ofbgogetujmjnqv]dzmarlipdqkgwdzwzd[uhsfvlrawossxvxyk]yeseypubhoapfgdjom +rcmnwwzrimrifziyoyg[avrikteehxhxcqhsq]yklfcrtqwaxmoepr[lahpskzjdwrjonqg]wddynujhryzkunrokho[ixwzkdpcqefelgcoabt]arjhdevhgaqcohbut +zkcxzfkwxxdtbumymqv[qgaztskshqiukhwuelq]wxzpzaxuhdtfbimub +nlgurkzredyklilaicv[mtxzdczugdhoowtp]hnhcyeygqrbqdnsc +pbbcmecbydtmjigfn[giiambqbdgbgntq]zaaqvlpkysxuvbgbo +aqyxolkflikpaxr[iqrnhzdtynkqymz]rwmgahzmvwtfebyguxh +kcxhmwgrvommccee[oqvsuahbhwioqeunkz]mhcyripmlfivqsimnpk[zptnyqihvavtlxkq]guacutltkqoixskg +ldpiuuwsszyidqxqj[tsmectapcwuyhhy]slauiehtpaocaeqyd[wbhrligadmsgznlyvd]nyvfiipvkthxjuoubc[zplkhqbtciuqnhjhiwy]olcmrcsayukgcbf +tzcpkpyrdolcerqnwu[zqvhulfxfhgaehbwf]zaekvjegdligfrsh +ghellbvwbjaummjjoss[pevgyftbjzmlsryfzv]kjdgnwfofftlxbiabir +pidtrxbnvaobubqwah[nftxjicikdapqexh]mwssisitrwjgxhk[nghedqdzfdgxaqacas]hvehmhbxzfwylzdrjf[bisktoqalmaapoomzt]lwkkhvacvuqvmsv +bdqjqlmohbjvqlson[mupepkeeoofwydse]ekylhrfsudqdcvkv[joofkljfkmpknazry]anyojhejtzfofcg[zcvpdeswtvtngyqleri]seqoyrfsqawkrudmg +lmjegqfshvauxngz[ysmejumumaurgvgrsy]xrmslpnljfmaidojz[mtvwolafkcxlwjjthy]yjqsssxayanfdrel +qmmiampdlsscnqml[ymselibefbqnqakirdw]uzxhisxyqljsdvhfe[jhjnivjgqdfyeqcea]nxbqpgyhtqzcwoptq[frlnwadwwyfnndeqv]qcbefaxmhgspalprcdo +tavfmtbizkrpnerc[kmenfsatjafincrwrlk]pbbxvydrsqnfyap +hwrkfzaovfbmrqhff[qglmybgnoytlkma]ibbbvmtqegqqxdk[gquqtiaqekcwiudebb]ozhpyabnxipgwfs[xqcajsdxhwpkofa]ssaordrnwjyvmcmjtp +pkyhiseqcvejtkbqcgf[xvgqerenvyizecof]sflyqnazxuwbyexzwyq[zppuknfnnngpwihe]hacwithomkpaveqjrs[whsspxqxxqihxrmqxvn]ifsktqmduowpuhck +xqctscaefqpvqcrm[rqbjdsxwoynqeoubwz]zycfrxbkijaedhkr[rzzbvjmogwxgcqa]hpzjokedwwmsbcrggmd +hcbohuwdyeacvgmbmea[mmpvzmjiryorskh]tydknyaqhgcxafmqj[ejadhaojfjlsfxs]duohhgjdfjffvwzcgel +ltlddqcbkkayshw[qdedbdppzuqdhfaxt]doedeeehsibaylpsnk +bywykrbttmmpyacsoo[ghicjobuumyckupnmw]wzxuueyajmgprxe +gejngdvsephfgyawm[eahzdehzhyymhcwx]qejrbkjhhplzgbehwdw +hobcaacuxkoxnutlayu[yvsylobmhtczpxdhvh]qpwhgyojuomiubmahcd[pmspsmyxaqrdvcpwnwj]ghdvfbhifxhphkseh[ntyabnyuoadseevhvpf]opibtuiwjogylqzt +bbuecmhireivvxmtw[kkvuwrudhmpqpmqr]cqrzfeasrpqapvtjqnz +uxsiwqfamsnemtcqyym[wemijyiqgxbcsvdz]tdhlutowbxpxrkrlpx +tnnlwlvfrrluuxjnvx[fgijrjghghgrkfmfb]lslknlacvseuzwy[acexgqeksduhjpf]enxevtqjetnyftgrad +wiegevfedudnajr[uryivbxbutbhfuh]zrpurmrupgeggdyc[tfykavyeulosotky]ahsieiakxnitxhaa +cdymukpgwzamxpe[ihvwjlomeozhnxq]zqlglkiyekzhkesoyui[dqdkxlczjrxgbdfqf]pdipsbuxwhibjytdb[ngoqkjeboqlsuic]efcostvlclbxvzhloan +uuavzipkjlcgutoxrbc[orpbrqapdzdsagy]hbgwsmgmyowonxftjl[wrimpmzmwyjjtnkaf]qmlpvrkqhqbdswyyvpf[lpjhsulqumdzgjxuajn]yocpoqqrpuquduay +wivyimuplkhmmkxioub[vqfixqklclmrbume]trenzswrpqljwctfat[ulkqyvjjpchvkpd]mvlwfrclcfqziho[pbmrqudqsivfemt]osmrlwtwstidtwmbmzc +owpgvzzedsxwjjdeuz[kyqifdbwfxcphnb]kyeaxxmsplabrbd[gayquqvysxjwpckzlvj]tiuxhodkebirvmdb[zhnicexwwcgbbnfd]hcxwgyjpphxocggfl +vrjvymyzflpaqfy[fokfgiaiyyzruyt]yvfrfomlsjqkvtps[mprfrwzeokyjmdetnl]znjipokvzxljjgqaw +opczfzhpovblsevqcx[twcavjnyjerbqfqvooy]tmyyybovoyqcygzzyk +gpifunuvcpqjornc[wcenyqazsxzksun]dijyypqoxxmjiyi[kdzvguquhohgsghqqko]tzknqsgldnnbotqnocj +xtnewbseisluqott[ukktnadfrptzmvmnmwe]nfevmvifmaaubdrytcb +uvwgvqvzikkvvaltpbs[darnokckfpuiwvaq]qjgglscrdhximnfg[cplqfytiupsnlwjnz]tjjkzojxijhhghoo +mwvyjvnzfbptvndlui[dvpxdnwzdssddngva]nkvlbcdcwjumrqmjuw[xgrpriwhdpyxvakfpsu]jzugamflkelhfrzswca[hvdnwrkyrvcdkep]kqyiaalprdowzeudqvt +zahhurbvayisuhkxluc[dpkhtfqcplnlwkr]moobahksmsqtmxasrw[oyxemzzmvwvxrldebja]tqnquzqoslugwcqcwtr[vibjzqdbmsmtxckkkn]ylujuamatwbexgo +ffpiprpoymeaccwoun[avnvjzwvzowgthwymt]sakvpfnqtnzdyhodzud[egijncssvgvsofu]dplbxmzfihrpopurlvn[knjefyormeaeoni]ubcbldkemxgefbnjcbj +fpyokxpcrydmqzkgr[gprmekopimtigwz]fobjyaxokhstzjsgkw[njzhtjqrhoynlzpiw]svrqxlhgpckwoat +srrcdyevzyzhxnx[bbojuevgatiabjudws]zoxxvzrngllhtrtfm[rxoiyzmzwoenbodp]keodzdiobtdfgrxzgye[akofrgfwqtqblvntv]rfyrjcwbfblulkw +kxuswiaijpaejqzoxes[cgyhiwbpjrhaacwe]uqqocaxbsotoaei[runskhbiegmjwfyjv]qgnmhdcjcbgbsztap +kvzutkvgsyiyrab[zhbqkvgbyqzgwvfpbf]nhtaiwzmvrssvxsrdz +tncgsbkllaugseepp[axryamrptnzekcb]xcvqkfuggjcfqhb[mtmzyjnvrgyuwtev]xziofjwvnbsothqzdm +hmjthvqdelrmghgnvxg[cvfmsllxyxchaglntl]ikpeldmfhjdtnvaw +sdhirfhdcxlwhxevbv[rfktrkotbfwiolxd]bhbkmmbdisqlclttbi[ueaqlmpvdaoxhezzg]baphbkfivkwpmtj +crzkarxgbgpitxjeunw[xlonohiojoepwnuhd]kalfjqpazwmwruq[erssxjpfzosbcta]exvgtqljewfuwioyq[syaeqtgrgswbgbetkzw]ofnozzjtykajqcuc +xdojuclultxptlxgci[nkmxgmiyhrrfgoshmeg]zqxcexaabvdjcaiarw +rewjiwxykozqjzneh[tczrbiawzwtndtqnew]yxrgwvnswgyxjvnot[khomcpuiavkhwjsl]ksqiuqyarwwibcssseg[dsrplcalbjojxlecjdo]falbpuscbjsdxvyn +dusvvyynezzobcrt[yrikyxqxqreoqcyyq]vkjxvnlnmleqybmgt +qzmjfdvoruomeilaejd[ksrwqvmnyiessfejo]lvhmckdfwzoxwmydxm[icmiecrnoqepcuzctl]unxwrfwxgnijdxqjc[tuwcbylgfhpaveyak]qslgbtviucbmeluf +djblesvduxlxfxp[grmuswjaheivlqvtst]yrqstsaryoqejwkd +kpyoqmyglnrmxculu[tuyuqjronsgluls]whuymvpcdxvxrimvmow +lruqeoicrisykqejy[ruqwiitwyrsithkyo]hbgqgiywqwsclcsn +pkpmmddfcezjrrs[rbzbxotrbqlnmlpidpu]aakddaqjvbbafbnk[sendmtepxbcpttn]udnifsqhogqvszi +foqjzmqhghzmymeq[isvvkjfpmvmhquoidkk]tskrbirqdtjpxolwzw +pneojhviynihvnv[meuldylhohlfwsxp]nmdwxhxuexorktj +gpnxdnxmueucaawmctx[ggcizpwllvbffytwv]riqcitchmdekosocp +kcoafhejmqsopizo[lyoqftddzxuuerafco]zrvrzbmnzcawaydwg[bhnmhrnwpzmghrprzzw]qcrnkmyfcdoymceacg +chcabwcrpxqnelguile[ckxfqhnrwlulnfgxjb]toauhcbsxmeirtlyy[cfgmasaieapbabcgdd]ijenfrqiaeiehllwpvk[ciymykejvkzxsbxy]iiyypzaxohmykgbzej +yeqhlpncjcipsmtzpi[zoidbyeatjrlgmi]rcrhombxichyykncbwh[wtduqjwbefekhnwo]kqemsisbcrcjaqzdzw +nbxvvetblqcarlcku[njrccfhdvxtarpj]rhndgwlyfzaeubc[imtcezhovdlfyixzwm]dwughoowqyazwaziea[slarywwdukqwygnhre]efzdruetqfoqqxusb +vhvbnbyluqqaqzolkrs[fbfwkawbihbzwlrhd]npfzyqkoxlgkklgxz[zboinxtlzrqbwcqo]jqhvalbjqaogtyn[razwnxfkshezamemtr]nywqcxpvmuudyqo +jubvozjfmykufhrkk[qhbaxcvcpyzbrwjlrij]itseilbvjwvzlgqjfe[lgxynowzlpqgoyrk]inolsbnzxvdmvbrvwqu[hjzfopqwsuqvqhb]wffwgmhjubihiqkpuls +rqnjadbwfosviivshb[rutsuesebrktxitgy]abukeyordcrrqvrgf +bfveiveawwoqyluxwu[trxwkfvioqzltgafma]swkyqokgtrprzzit[kuziuekaorgdgqjgi]zudaehzrjfzogiwb[fyxwwswqrbwgomriqo]sqfjrdskmdvalkhchc +pnrvpotetwyvodue[xwkxyzxflrvxdfogk]kamxypekoelgwktq +etjkovmlbwryvhv[wvubzziqtxbjvua]hmrqokvqrctugqdazz[ykobpstcxdqweotsi]eiczvmdcfjpvhdyfnci[eeklndzunbzipcqubp]tjsktxuorvbnisy +fnexznsqqbhygrm[jgnmivchcvxgssjcm]klqcaszkwyzzecve +pdmzjundpcsxbgplk[lbdsyrmgxnatuwk]nwrhpgieqrtzpktaiqw[dcxtjtkzvlxpibanjma]djszxtofdcuyfpdr[kzblikjgqfiaykr]yhiqqurlkwlrrjo +bwtgmmjbtisnzbnyedf[iniovvuewpetwsg]dgvjyrzfrqcozekvp[xsulvxvvtwcxuvbxau]vvjyodjlbbjxigdxvxv +jcanelvhybigzhplc[lhgjkwbpdlcybzgacya]uwisdadjoniyerw[kzcrorifvylivkhs]ssicvecwpkxbdwq +tuxlnjuyudvhazlxdf[oknheznyzffrtcb]joozaraxuivijskxblf +rvfdfyaemhgyeynw[hmmkdfdhadrqkxzzmsj]ugfozgghllznjhdxw[ucrgusuuqthlgxx]ipiercifxtkghbkf +jgzrilirvzcocaphnz[gyrvhettmmhxaxbmyg]ecpwkoozcgtpoac[iretjtqyscaqfqziu]wqjckfkbfoqmmjkuhqe +pswuxyynrpckrquj[wfbedboaabsgnnzzzwl]wgfrecpfkvlvjzl +zkcihebtrfmiryqkd[ybedpynfafkkrbfdm]ovrsmnhexyqblafad +pbkoczqfumwdpfu[gtcvqjuwknlrfxre]crpyxhawudbilybaomf +pnagrmxhmjftwltxh[aqlhxdwuzrvnwjwl]xhmgrrajywnizazyrdc[hxdxewvthhrwhsva]ckluhnyewiiqazzmvd +amjksgqzgmoavvxtov[ekqixufaaepczzusfga]fvlmiilpsqsgfgg[gzcyehzgpujyquhrkm]caaocajhmhqzbacvpog +hitezskizncharbzyz[nbwuldsjxkjezjq]monndtwsxuikupvi[iardznrxkorquvyvwlk]etzyolkxhyqsdirbaj +ocsxlxpsgimcvori[gawgkxlilqzeakhzds]bodnyayaioozoeg[bmaukrfdlswrnvuwy]nafolaiqfeendahms +kseklqtakbkzzhfd[ghivxwcqlgfgxeot]levjimgmcfpgqrjjic[ixwevpbqkyzthafyj]azdxqlromttwteeqep[kxyiyoxyhvgqlmvscwz]zxdujwvngqyoabmrio +elgbshsnykhiyndouao[nhumkawagmrztsamd]fwqupmyuogneywsyhub[zzcemywfdswhvjpl]ockclifwawqsyzt +hyetqdpieicmycip[ciwciijtqspvydxsdu]zjrfhyctplqvypy[hdewteddlqfaoifgy]murcplulddvzheegmgd[rooqfiqsnkjeelfjcag]pdzzjacxzdzmmgmqwu +nufvveulfkudkrvskbg[cdrvqfofoxmqwtv]jzgfbywojzvwumo[vvshcsjnhobkayk]gkwnyerwhezneuze +qhmjnzcokmkmvclhfh[ywruoexbmjwuxvrk]lswliylmniqdgybtyx[yjrzasyfroiuaeps]xevbxtsyjknqmeuv +crwelvogceorioqm[xmduhdacxyzodslgtv]wilmwenmmnwgqteftrx[zonwpkkjimmmhbrtls]vfbovjoabzwjpxd[jjxievceapgflzeldwb]onucskcmpkgsryl +ujitrvtlzcrtazmghgm[mculcmczwibnuhtunnt]izqgurxwxhwboygvmf +lespfnkqubxfoqa[exmzkeazfrfrkhzufz]xpunddczqrkxtgorc[ymsbogpyjeimnuola]kufhnwzukrdayts +mitdlhggspwferwda[fcwhldszpyfznayp]rbfzewqihtcwtjznsp +wzhbemsmffcmcswdvp[jcbuktuymokdqfjj]zyhqthqbczupmcmkhi +qulvtldmhliyflccbyg[mqggwujrznjefvjw]sduatqntzkkvgfqel[fyxdewnrtlkkils]utxmideawxrzpewmee +ggpinoooeucoxmezfi[ovisfbmebypyafknejc]ccqkrmaimxmvxhtain +cqezdujipgzaara[afkpzozyzuitollf]srmeiyjzqjruima +ivbrwakbgkrxpilylu[eewfaajedkwjbdrk]stsichtqqsksydtubf[umxwxeikoyehrou]kwddyduytdhdgdbyn +vowwatzholrusydvmdb[jarugsbvowdtznwx]oofschlksdrodakrk +oruwtttstrcvcgxz[cvidyuxfxluddzxuz]jckmrrmvolclrbam[dqptqpdwkpewhmcax]rtfmeakahrcbazlzsju +vjrkcrzvefpxgardmqb[wxmurzwunsvjaxfhik]meiaafxurfgikqg[dkoextitsnfeorgoihc]diohmorpmlhisrs[ibtzwvoovjmdpfi]oelairhwcbbltmjcjdr +miafjehtxwnfqzxg[nlovpfjpeclnmlbm]rleupmgzewtvuewypt +osoaytxzfrkcljfjv[bbpjqntkuuwpgupxsy]bgryerdaukelujvayjt[gycrjaelxuemeosc]jgdfpdoltoqnmow[yfwoyzixdzamgqweb]lvmnjywqfjfvyxhb +oiksidcbtzhhtnegqa[vdxnacjfxbcsjzqdq]ixvwmdqdaleuzjniki +ngbyqfvobuxdnjeqia[ksktvzdyzkvyvjrgkos]xwuslzgntfwrnyqrod[cxmkhhwyremunrbc]hijkgxizhlyzqfaay[ljwayjqxyrduyoebm]ancrkgmzboqtwkjah +kxcifwahsdmqasrmwi[aqzdihesmgntomgmj]jkhmcqvxqxtshprsy[wgewbxfsobokszgsivz]zlpavaqlwvauvedwf +ibhzychwgtvobvws[qaestubbbtvyylbr]ovsxlggntxnneirtot[kgqrkbiqracxbnbi]lzpfersavecdddsytb +abjcqoeeqfhvqmo[eferwxtafaxzidjzbr]qztbvxsaiyqhcsdkj +uqqngbvhyfxovmdods[zwyybohwrhprvxaaaio]cgyaactenmhiokzh +hiqqvjquvdkfcjwmo[jzrxnmbrqfhjhvppdxm]mwvibfiltxmwroeruo[fasknewgpsmftnx]aubymogtwkseupwmr[xnyevhhalilxuxqqvya]mastwtyfihocpbjngaw +aqvkyxqnjtthgkjxr[ahvjgtzfqetvqhz]vcaijasfqaygnxmdba[loyjulxsgyldkotlefn]lnzykvlsbkyuvnqb[iqjxfxdmjgyxboyzr]zbfwxpxbthtwtnjdaw +iweumcmplhykolkazmb[zgzeryniuwebpka]hsuxltmwyxogseiogl[ogacxzbrbvopihzm]ipogfmqtohqqfvowzl +hlvbzegrmbrgoepemyh[luscnqomtcxbpxjmxvx]tipsuhgnhdavsubyqha[ozroemaxbdbcpnydjqs]xqdwngpkteoyyvkq +fgpmkosjnfnltkfy[sxqzypihbntsfnryubc]oygetjhbfvozerfzw[nwvofzjfuwdzxncwvo]nvbtoxgwkmhnyox +kbqkyxwacrffvkoxmb[tqfooaoggaauopcanz]ptiakppuyxzwzpua[tefuhyaqzyeteexrsj]hkuwublifohismiqg +pdbrixpmacobfnpg[mxmgtvdlsuyhjnjxz]ghuebmnxzqfljxyutl +ichijthjvilenbfg[zeibnuadotzachqyvej]qogvchvkfeskckvmxw[plyhbwjrhhnvdumajut]xazlyayoobgkmevrpho +cbkznopiuqsssvle[gecuynehzvcmfuzcaxz]qfihmsdjfsxymvesb[jtriyipbkkpfnazcj]wbcwllfdxxdzrimwues +ntxzlslwvxztbmola[duloarwqzkzxsfag]nzrsxasndnrktih +fvvowikdydblgts[xozwhuhhngdjqnbry]hkcwbqloymkqjyzpj[xfwuoehhuljposct]ashitwoprqcooweytiw +ynbifagloxgkzlydhk[qoxltvqdpmqhawcvef]wfnbtiyjafaqfujr[crcuopstahopywinvgc]ppxsgbvevlrkdgsv +tdgutgskbatswuizuv[zpmhakbnxnkehhf]ffuohvkaxpiptot[zlykjduigarhxygukw]bucqoskhlesclyzbpd[igdjnevmqlibrugc]seyjwcizckvbncjwon +holbjgzpvhqirwrxts[lpvaadhoqjjwvijk]etjusqwbrccaqea[livhtrfodwoxnkvk]dmprijbirsnzuptikc[icjaaepybpgnorie]imtoivdxpujjmlegqn +ljywtdshrtzqzrln[lqzqgywtrpgszaigfv]vjyyvrbkjdiiminfas +xfluerhpuqsqnrq[rtxglsxbetzajmo]bktotbhryqxdqfaf[cptmsctjrifdojglh]qzpxnniqwxlbvnexlg[vooexmzwbpulnxxv]eumwdzoixhfxkoavu +xmomvhstjavjyisvhs[suremlzhaiwhikzzojb]urbiiuvmveiapcybgz[botikbmkcfsghtgtcn]jbsrxdkpxnynfibgxyw[agdmtydfehaujynym]xfpytnqyoafnuott +xjzhgefdlodsdahv[ihwwnfbwhcjdbrdixy]kmsckqifucrgpocyvc[pudtuuaebkvsrflz]qjfwaaylzyhzerjbhyn[fsnmlxncwzsdsqp]edevlblbzmwkgkfluke +qxlppzrvoymnsiyb[ybyeqxwtoberzwvcdlk]zsofrmazkapwiuxwjjn +jbdmjeyxyksaonmswm[vhxyxtashfdrzjzytoq]jpkbmclxjtprrhmaz +vxishfigjpmdwufh[oykzgieieiypyrqaxdx]etgleieyrezvbcg[scrtyttykipejzmuhy]oxnektqrkndltaixnj +jnetcyoxmhjfyfjxm[dezndcwpoghexum]xloobrzxrvanbbh[gvcaufplrrstvrf]jgdhedqsxchoorlai +enbtwxacyokhcwyhxp[ahjgrmfhavhnhqoqsfs]ahdcbzojcfgzkjfe[gtjphvcbwzsiohlha]lwaphixwqbmbqhyoccv +arwtwiiowytbbjsumh[iwdhsnllysydgbcuxw]kummpwhpyydfdaf +laidhzhbdwoezqhi[eccvqcxwasyyzqvhrw]oobigxsojqsyijmjmu[kinacswultmqsxdhw]xlildtoykeuzgzl +fbwcshbijakfapcqzj[qktwqwrlnuktxjvuvn]nbzsrphskcxzuzho[lrbnsyzvrorznoq]ewytfrszdyhcrhpcx[bmzudjktpnqxqwmblf]xtwqqocsaxoluhsh +xgnhvwkwhfbprypnak[yuwpjkfdxygltniuepa]mmbkjavsboilcvpp +hprznssbfrukcvu[mojrsfuktavnbhzty]ipdxnxmtbvsazyx +tfdicuergiqhvie[wwpqnqkyfyhuqlb]wovoujvgcwuptcqhkd[whhyzgbflhplrff]kezriqiamcvkeifegv[kcbdxrvoharumkgzufn]xypaikbmpsjqcbxrrp +tkqpijxftrvwkam[yyajdcxgzrkhkroq]qfrbvprhxlpgunqqs +fvwgqznbhbrmcaubz[lgsawqyuhadojbqwrwt]gzbvdgpwjuwqsgokqy[zpzdukphcvdqgpdoex]atanoaretkhxbyzw +fispfedprcrygxs[xqiggqkjgjhaskp]thgqnbgscmrcfqjckbw[tvueixxvxlsnaupqed]lshjncmwxgzzczjssh +fplljoayuqmjtjs[vnlhbmvowousilhym]emygvrnfsofwobaducv[flrnwxzgkghpboubuh]sdndpovsuohytnq +utkqxfkbxtoudnbh[bjatbltbacnlwzlbjk]eunawwbizxdytndqc[arhtjgntcqetkeikojq]jfooeguervzgzgudb[nhifbismjhcwqyt]xwsxwzwwvtqoadmgvoe +bxbifxmedhwkesbmjff[ncfbdgsqfejalnqyar]oifushwlnfxghktjhtq[gnapwycvocshetc]zzslupkhadbieerb +rrotstdgmwqowfmf[zlddfgpxgucuestu]dvlbhinllnkxdybha[aovlzdyhamvvcgm]dzehxcilzoxrmcyhiwb[xkeszyasnqsumpx]bnrsppzfvjhiyafpk +qgpylzwwdjxmepsc[bumaitztsvayatapvl]gotathwcrjrsknrfuk +odbkgubddtpxdsgmhvh[mbgpgqafpcrymkkdpsd]ieabelyvewiypbkjm[psowbfplvsxifqwq]szgntjujujycbfy +urqwuzkruqfgejkdoh[qxxkamiyhedlffzg]hnfntvahsaivnzmawf[mxcrmrqtgmnplma]gxcsbxvqcoxpddj +qzkfvuxmfneyrpysh[clufxjecvedwwegflp]rcxzfazrzbgogna[ogoplmljfwvizwniudc]yewvacqgzcjgdnmasw +mgweqpewhvtdjnjdbu[pecantesazignmq]upotybqiovoujemqg[ipzggdcevkbkvpyz]wqtflwovevactij[ednlhfkzrtfwpuignhd]epfijiuwnczwxdmgvzd +lavqyaejctfofhdend[enxgzalvzelvvxdt]dkrlwjpuipwnqvuv[ishvyxwuhxdxujbgkev]euytwzxkpwccexc +haibamsiwfwmdvzu[aekmrvauzoxdbtury]tfgjabbgdrwbzde +gqoyggrpzhfgrkjjw[kwhwkctzmjdpdoeey]ngurqljoormcjarv[bmvadfmdgpwpzfiiv]fkfqchwhedeymsa[etqtnxepdmolklpa]tywoaqpoowybxcoqq +vnvmbxxccmctcba[ncggihzavxxxrhb]mblrxjgtypycewg[syiizsazwqrhsllezvs]tpzocblnycaokaphz +ffpbdxvenqkihvvsi[bbukwnounmzzxody]bzfefymopdtkpdm[sjbemcyhrspadzkuwi]xlhinxfjjeajzuqjkuo[zfpeikvvdfptpxe]dhsjhnwlzlcxbkz +gulvdtkcmjewjchf[auqodvrekgvzxzyiwee]rarumiavqvnbyqu[xywssgnmbeefrqgr]lyyjmkpmqxmjbughzta[avdsmuyfdwvzrzn]qvhfqmazlactaxtxi +vvqlvlsnrxwhoxfnac[sablzmrjccqvauyjfao]avdnqlseflqxtgb[masnpoqnvjtkreifrvy]lvtoftpiotxcstvu[vohbaippdypuwpkuip]kxffhmrvrbmvhecnui +kclmgqkaprofpmdm[bhbitgjmddxhbhu]hmasnpqsttrgtmuq +tvqcqkarkyqtpvea[fjqrifichijyykq]qqtmxszpmovzfvk[xrcoyhzyxwmqwujxp]nzlgwxpkuersepyhy +zalveeaqakqjhfl[uypjekwlbcplfcasa]sasiztlswzyhvpd[weglkkwlrrvdvfd]mvsdbveypnjsymtjka[kroszrkveyammdqqool]kgmxohwwgmvcdludvdl +xbroawhwunnamvnaogo[uzdvwckcbkaahqltp]bxudkhzxrykrkffaiiq[ljfeimkibushcpclbia]wztapafqrfdpwcwpyz[xwzhahnbnaxjorpkaj]glhfrkaiizzidtmfi +cycyarwdelrstoi[rivlkfszzvyljoa]hkjtyvycydwronsgyd +mbdqighfupmzacpi[keeoafjlwzqeoaryo]vjcwhcjkjkandqir[auactffhpuwzgzm]ybkwzkxyevwrphq +cpiuxmmwrsjzbyqkfms[buipqvxsetxzsgqi]tzwpfhknlpwmtxzggc[nidtlxvnowvutuqv]qsohatjnnizngzsqxxr[klnzvuognkllhhr]clpjgdupfpanyxwjg +hhtduiwmfhibnpmhjm[emakclmaqjnvjsjyt]ntebrhiztekglpmhsrg[rgehmkrotjobrtah]gzlybshvhkoznupnhr +hyzvardyeiddsgk[vszukhazfkwqsodz]psztzqehiwcpifdlna[igstccorevbmgfae]vdapqjiijwygxap +towtxxuitgwhddsua[bydcnwqycygmimbrut]cvnvgtuiuduzjod[gpazublcnojkfnnvn]rozlfkywwjelmry[wvtxeleixyqstxjqed]vsuvzaskgyooigoczd +uywuytlehdznyxr[goerwtisqdsinimd]abuktfxdobkfqabm +rolwzkzesawhyxddo[yuuvalxthkptulugzh]tagfpsdniekrekzkt +nstbvilzeselffses[cpgyssgpjimcevp]ehfkumlscjuocclfhel +idvdfrmadfyhafvyixs[igsqckpzuelddtl]eclbbakcdyttbtse[irchopmhiqbeloiqq]lwbecblskhopzyw[yjmdufblseluvukftkv]nnawapbepipwcsfz +thqwduckwmjtxwwmj[ppnucfmtpcsawxvkago]vojtdpukjwwlnirsvle[cscyjfrxjlgxhyu]fldolxqfbxhigdom[tgacpmzitahxucqpzke]copdqvctocklhvrq +maseolhlyrjuoqdazl[klgwgcdfwhpwmnlklcx]jycbhtwurlwwsjyuubt[cuabclvzukvmoiniql]pzockwxqjbtadsspl[izzcraalbnmcopcr]cqdxcrkdnwclxcitizq +ucyccfdgxaciwhx[txuygxhekywmyuaaina]szfdjuddiopneadpot[zpjsnpjtmicknxkybi]lfirzuldnatglheyhnw[rhgqfyfxlaunabfqxl]hplszylhorbrkuy +vmgeqazfjldqcfif[fuepxyjuuzxkect]ywoxrfdxbyjomjo +qacfshruytmlwyj[jpqmllbdypmnzqoe]sdhmtuefjbrmvmeby[xkyplnmmmcrcmixkls]motyvnyucleirbnmrys[zdopkcnnuvxmhrg]feeagfdkgorsubr +knlaaiwxponscqwtqla[jxilqsyolsnanzxvqi]itqqqbrfpcexbnecnkw[bpcxykvtdbxejlcda]mxodmdxzohrturffnwf +txvqlvddwpcysvkctlu[wvuoeprflcpycbghfv]ksbpnggnitrxkua[hqyiyucnvjqsceml]uwwwbxrjvodohwznlx +oebxtpwwjtewgkwjbv[omataxkuqenxmxolwe]aiepvclknbgapqh[wywlrbzliilwwvebxbl]ljsiuvllqbjrvqzh +jznegbplekeeohnf[hegaqbzbjwdhgkouzja]msaozvrtyshcajexwen[cnleoafnzyvbvdfndha]guawhzetoxlxmjwt +nytoqgolirudokcgok[qjtvenvrstrjjlsbvzq]mwhkktxfsokxxqb[pgswnhmmgzcrgjbqcx]amhrxgwmcnykgpuzfb[dnihosgggajabkoq]jtyxfrifreihydzwjdx +bxihyluintytvypxhl[kbnizownozfekbhmsp]sjgxqgjbhoftgmbck[knoibzmlipdnfca]ofyxruebaspanxxhakl +xhrlcwziflvahls[babpaszszfgfywj]gkquumhyqvozkgubcs[gkjczyujqykeifhsylz]fhmvopfsltpzijdw +ntyxwcfpdgnsyau[eqjxtsfneseakvrf]sbzesbxxrrmpmlazhi +lwakhsvcamfxiceusua[ymczlpqkoiophom]fiybjcxhftziivsrsok[sejyfiorjpptboakf]ipsamdcnfnlhger +ncgeewwfszytkag[kizbzwnxepsvdxsbzbm]fofhxxpymrbqvcco[swphuoqvhbpghtku]hvxqclwgtxxqywhhs[ibvpkuiylqazccin]oftqdvkbzdkmycntx +yhnhzwjjsiqngmhe[jtkcipgiclbqublpfs]glxyczwidjilkqoa[ytsphdvgnawjsctty]xdofsnhnpsylvmso[pmjrjgiwhqfegydcs]ylfcipikfzvmpjn +pwlhyvxnneepoqexj[jsnwzbjxibgqnpjgdf]qndnlnzxewcrjio[hccvunupvbcyptqdihc]rfhmapmentuhoiv[kohfhnoakeglvnasojm]oggzhzybuuupwdrjrtj +eyglfycgaoqwsqqnue[woaxqinxtvrhsbjjvnk]cfnkhvorifhxedbmbmq +nrqqggalpihpjyu[dqbqopedkxhoqqnp]qguazmdjtenlvzgoemw[ccjlmsdaajwghuikrnp]xrjcyfkrrfxddnjn +wkiymdlskwyjrft[ovucvqbenolfvvu]tzymrvmekxnlptynj[dupyullbzepmmrmgwe]fnjtcvrvzstijxq[elzfqhyjdyprzfxa]uszwjwzbbzgpcavynk +jrdliqwwffvgzpu[mxoivfuwuqvtxqmbbs]tvtlqzqgwzgshkpw[hspnaspqnjvwybzfzxd]clkhutlibvxzxfrgg[yujteartlwdhzfgsn]lyfrxjqcpkcvcsnsw +gtfhmxlpptgvgwob[xlzqaoawpmmjwszqmhm]xalfbbroilfuzzqm +gqxmhinpeppmdhbdt[cpoaeltrlzmfgsipvg]iqlrhncmkmjijjh[xsbdusetrksrxjiofj]zndjqyxwvmsnrbcyrmh[qnbxczovjlrrvilks]rfpihmkwzmgxcynu +abcncmuhelkxeph[crlbybjylvbgtsk]yvnbosicedmzurqcm +fbhtialrsrrtpwcxxh[pisambikwkesdtbsj]zcdseybwrdrkxeiylg +sehxfywgpznuuypj[upswvzwnkinocjk]nabhugsxhitlhis[ilrwksgypfqgfexvuhv]torregbntatolgchv[kkimpdkcxhsxyuczj]xpfacbmnrhcxnbgwis +hldgiynbgrfjcunattg[nwfovbxygpkwmxnulm]xleqlwcajqwnncww[waoaudnttcfdktcd]yikfvdmekcexcrhsi[sntclwlhouhyjrob]wqpclaistsngwfmf +izblnsxlmqjhxvx[qpmqqzakbjpbapwtlel]vmriwjoqlrttqpoxay[ylqzxxdpycurefadv]ftcuduceaycwejp +jqjtnshmtsvokhwnpr[bxprgnaltcsqdkceygx]udqckcknpvegeryj[zvjfvligrqxnpypoerp]zhzwojzkckjwgdyu +ohxpnvtduqvsihjt[eczkrdqlgyddymrdjfj]zzqhfijxsgoisbwpd[lysfkgekxvqspagq]kemxkdqxetnkyctjp[bknjdsvchfxflsrkuum]wmxncxrwwxxxgza +xnulgysrzxheppsiril[hdxgzhscbjhkcntrmsy]vhedyohrrqclnoe[nnuxdbtlbjvaddo]xivkwdwvmkplsvfaal[omihwmflpvrshkcoci]hekqpjtrjlsaomfd +hfyusspcypxdbgzb[cxbfccrumbqqqxb]ygsuxbxdfkisqwstqp[lqctoagvchrmggtmo]dgmcjusbvlmlvkdmnpu +vmpobkctlhdwqjyb[dxeinhrldspqhgeu]ndglldouuoawkiwtask[szkthuhxdkmfqoqwwgq]zwjhzselzvirjadzvr[rholepzsidriqmlepo]yhbxhcmbkvripyusams +mzscivdohxhfkdqet[imwvpkunuzbhbaj]tohxwppjtsjykxrj[nhonsbadufgsqiysn]cogovslrrwexgzujn +pzsteeyowqmhzaqao[qsbohgqamrksizzs]vscfiltkxbxwbdlold[psofpwfkxhsxllnz]odwbidqaqpuchaew[kruwykloeqpcrjzon]famaoipldevywnouele +tuqiapyobwqwpwbqqu[ycphsbdcwbmklro]medgafihivwegukhfof +lficcecamifbjwk[sdguwtafkigjiapxagj]hmeqrhxptojctevbdbu[zvxeefaytjajdpwi]uliqtzilzcnwmbfusnm +pvyzncrszmuienoptx[bigapupzitygcxstqx]rqikselsbelyfjdm[lyqmdmfyofksmecg]wjceogefnlgelpguu +hmddytvxqrazumnnr[hpeurkbdfejhlfvg]pedwizmuhmtpdwh[efikgkrhnagpmqypzx]ltlncfegswhwcxa[bakxhwhtvxcwcxtmofk]zwjvbxyvljlfaie +oxgoszggsifsgrck[gruwptjveewmfewguku]otchieijhojsyxi +kunxbbrdhibhtlknrq[tmtsuhwakksyets]xdugxmqcstdallfqgq[tticbbqirncbjtx]knkygxawcwdhefesu[rerbfffgddyehtvl]yasblwlhikbvjidgku +qoqnwslopcpytqy[zngrksptgviifcwbw]nuislpzizqikmgn +khmctigslwdgzghkbk[veaqghpizqwjxlwcf]aymehevjgpjgwruhyc[hzgzilbhyoazljsk]jocgjmooxqxayzsa +xodvowdhvnquwtma[kvlbfwwzeuucthg]djlyemkbpudpjlnrkv[cbaqlhuwfwwfvbdewx]vsjvsxsizgwsakpx[pzyowqndqdbkdakdney]eeylqpqpuqvdyyr +cmdykdqavxgeismtlua[iwviddbtauhirfcabh]fhpsinbnwrcpxdho[tdbgrmgscvzukjl]rxupjtwbwmtgnltbjp[vgzucvscpzgjnvg]zftzsshpmizeksiz +kfzmwzmzdpxabvi[ftkotbrorpkpfxzbg]hgbrsewdgnnqhxvueya[lkjknzgrbuzjqxwqseg]oyzaqahfuqtpbzi[yflzhfxwkugpetsqli]nowgjqaquqhrlxz +ktphtjqwsitgbaii[tjwcbyfrpupwkvzrol]smlczhhekwxtlvxdfn[mqfupholnlvfhuv]mvdhzncezgunydrk +lrvdftzasxbpfgb[pglmengmgfbnzxz]hbasbstksqkkqpwkcbp +siheyyvdmjiubhlapns[xfcaevnaoexubdar]pgbougfzkmlzjqygdta +tblrafqbjhwzbwbe[iefobcqdrypwnwidvm]olrzzrqgkwiefngf[asvmlckavcwtuosgkrm]esqsgwmiyxncjjqsqp +alvaycnbqdlvvnwcnq[jwxzjzgpnzmcampkye]hepmdlzjvxhboxh +mtfkavmnrxyfzvkes[gmwvavomsyolkahey]dnqosibjkplwzjojus +gbckujjuhwnvovpfqw[qwievsrrtusgzbscuf]bnrjcovodutibjtq[fxteivdfkpixonphrog]mnumbxikkkyeositn +remzamtzlhwpndrknl[xgrbcgdvlvrcdrpi]tnzimcpmxzaxsgpu[klvglrrepqxiiewn]lozcwxnclirneaky[nevhtplqsmuhykzqxf]fgmsbwdgfwjftndzi +aybmjypdrytigyyip[zafsvprjirkniuwr]wfdyfncywtdtzezdbtm[umbxrtflhquwdofgut]lyjixlycobwpwvhfp[xoxtkyhvwqgawmike]bfqtgcxvcfwtdpl +tugswvsgbsfbiyzcm[akmlddjckugylrea]fyzltfupxnvagbshlb +lcgvlozzzzpzxeoee[zsvjydznyoadkvyxlsq]wqmgagbkerqyxjnnx[isukybwewezizpll]odqwazjphoaqhzltms[gtqeysqpwuuohdbhcnx]yqtvojobgaluizidrbn +agnxxgirnprujhsk[hagcvuqcwyhmkdqmn]zehvuytegijhnfqnk[ytlokgpipjcviulp]hsomdskdngoysnbmg[wztsneomppnewhrl]gpkauttapxhcjrsicvy +cvnowinufvrjpiqtq[kuavqbtrcelpcuasmk]poksbapbwverccds[qdddbhewvxgfoldib]mthrvrsfygbhlwlkcs[zhivcpxibufugkpigzs]qffdjnrsoigwxqhaf +kovjiaxxjvzmzvmn[cmrbwjccgphtstvaiq]onqfbpryjertymd[sgmcnqbseodopnnd]gbgealygrgjnamdq[yrjuwjfvmsmgbur]ldiztdwrwmeqrohy +tluglhveqluxpiy[wrsgxdrzuigwzfsby]bmhqmnbecjnyutpwlbk[iifejjworkzrsaj]illltueflutteej[adfixnftjenvyrigmkv]zgsqagrctomzublltjm +fhcnrceynkcnnjxj[jrevstsodmhopao]zqapczirtxrunfhl +rzmxbxurpdmzgef[agevdburkuvnsrof]rhclixqpruwxuanwxct +vxejrazzpddvobzlq[dpspaddyabqzrjgvv]elcpgozzkqjsasufcv +iaodnwpcpresylkhyy[dltvlrxbvnqslzzyvox]qownkehbhjprbzf +kqbwgctrhxwrkkedau[occltggonhshykttsrr]snshslgqtlgejanlg +jpesfmiguicqdcnkm[oawppiwdsmoidvkcre]wfifgnhqeisplngcjkr[wevtsiuznmpapke]dqgxavmudniuaml +ddewtwhdfjatjlgrt[ceurnauksrgwzondnb]znsvkdkwsimbmdxfkh +hwjwuhdokecprunbju[jhftguwujsuetdriyu]vcgpesthcnwuwpwes +cgizaalsahfzkcxab[nehrqohgkmbxiufyco]xbnclpuepsanwrwjoo[kvdifptokbtlihgx]hgynbeebmdwbkwrfbh[rlypefyljzefnft]wwevofyexvbojyc +ckxkzlpwrfhwzuep[etqgjhcmexxvaccx]qqkhjttaudjpbjboeo[gihevbqqqumfythcfm]hraqbarwvqnmvtiy[cbnfqzxyjcpmwvu]lrugefybnoiopvzi +bbmhfnwnuhvdgmoibjq[eugipbrefcqiniulz]frkuvbhbdiaoaqdcaq[ksqqrrhjltlxvet]cdjhqazjzfrphjzjr[aspkvkpmwhkzxfeic]vkhbjolvoddtaasvs +rxkbkkhnaiudojzsr[ecdvrnjjyzyqjxf]uxctotuqtvambwea +saknwxxhcybeglwr[molhqlfbvopapnuco]hbbaomsdwcfwvoi[rlvhmvffqcyftricsyb]pkeuoigxjpwfbffif +pylywhhzktocomu[sehthaaqwkyerucg]cwfmpqudeylrtavze +vmawzgbfmmsivwfqclb[fpvwdbyrfjgmidxw]btatkdonphkxtprxfsj +kspofpgsttceoft[fcqagpbfoujjulhp]fkbxvsbuwioyngydy[hnoxyyuhdviahwsf]gustmoflyrtelseo +xyiofnffruqapvtgnr[wmigiedeszezgunm]vydqpobqqrisgtt[kolobhezpsiolofxrlq]abrzbbmtlqvuhxl +enzmvjyrzypbbtmbvx[izvhoqpjgqgmmvricf]dbghstbtqgqawqjr[irvprevogenchjy]gbiwvcxncbjjvwmshsx +uavpufepuqdbjedp[itqmeflkorinwdpjwp]hlrnsxymcnxwulsmfk[bayxjuxhtpcwafadefe]srrkibtivlskepjxamu +dlwhxttrwjlxlit[atmcusmqvonodkfwqvb]ilfdsqjtjbimpaqht[zsbqjwsrgxlxbjqmulb]feblytbapctmfuao +zfzicvjnuuugutgymp[owgyvyjfhrqpuukkgok]dfkfwodxgvrdqelliaa[xaumszuhzjjsxwe]ihaxfxpxjxcbhjg +gmsgnyadjfimoemyzt[fjtprppdzhkorpqoo]eyxayeizyntiumrgk +wvdatykekdfednl[kwpjrdcfjjklpdofpq]lidlhawqalcyigapvv[ukqjuzvvxehbwzhsci]rdrfhnobcwtvivgcc +wvqxpnxpjmzfnfy[xgtkzusumupupuqvn]vmxceafgkxhnosupdkj +ypfaupbycoerlpnhvk[pjrtdmwsmsckcfongoo]bjxlfxbekwvfruvy[uccfekaoczxlyigfs]gnvkjcwikenkmvgrpdj[yrtbyzxjkmpewjpbstp]nfwcwhereraqwxu +cqxbsrqdgqudcci[olptuqqvfgunmstjc]xnppdflvdcjfviaemlm +asywjbgrfvbfnkhnc[euubbvzujqjnsxtmel]gwxqasfbyjazgqodfh +gvnexriimytwvefmo[dtuxofcgyfnaiibqx]iaaodpjwjnkbrqsmdzp[nuvnumldfhglafg]dpcqqfdrekqdfyfe +hnwaqtrqgztvegfhj[mzqkcvhmqhzwmhlkc]kytpmyhzrvtytwvfkqk +latjxjyjkwwnvyrbl[bjnilknxprpwziowcjn]zpdvccsjiuhfwrkn +nowozzvrysgsfhxd[lhgxyitirlsyljl]nodxmmwtydaqkoxvu[vgbjtbbjqgfbssytsk]gpzprrvyvseifydxz +sjihqhaecgshhhdrbto[goawszmxrrdtoxq]qvywgrnewpsordounhw[oaxydcsvrzzunbizz]nzisqsdrmmsaqwt[nmyxmrkeainaqyfe]eacdicawhfuobezyao +oyztkiwsxqcufgqk[iyxqvktohfnoymgisag]acfhjawamdhawitvjg[npflzsugezpsmunukqa]vhhxnunvyxjtehyvv +jzfmuzdlemckyiccan[rykdnvtoavzjtjxtx]vcmkcuioriltvpzzxqb[jdgqayewkwcqpkg]ulsujrvqzsmnpqgvg[lshytukyfqhnjehk]cpwbeyiudngpkrl +uruvigtkkoqkfdbqkre[wyvcwnxixwkacuu]ajvziogdmzueetqzxxx[fyevgfzreomzjbsumi]ahbhcyjbadiacwjplq[quesxyjqfbckmnt]oqehbkjyoxsyczfta +xzqfptkjpiknvkyzzt[hklpsitbnhlozgp]pkbgrwmqrbhohay[mhphptvyseydwfq]ehswmqarsalmcatb +ohahitbjjxlnkyb[umyhhgtcasbfbxqx]dxyhbvpjjatkwvpkyry +bcixbnnzlqxkisv[tapovjggqzlwlmc]vwnosivvmdcfsor[uaapwzmzarenaplcjp]jdcpazyedcdkdinrrz +kdofbgwblzpnocgpq[scfdzdrueknbdud]axnfckaaghmrpfmk +fisxkiplryvtnrvm[sypuemhvxvohsapkccc]exrrwesixcvnhzpopk[hpsilxrztuukzksyax]lixfijobrlgmonzui +zjnlscyhmjmoofha[ezglbbmqulybnvf]qvbharzbfbbustsm[tdeqjfbfxeiknfr]chpwwntytidtnnjf +qildxsfzfukzbmre[jykfpbbfelicvkqov]pyemzfzobutliokrrox[uplajddwknupdnfje]vombwrjguiukbiwozj[kcutkvgruxqqcuykn]zsbonxyerpjkfpnxchj +pdmfyadwrblhcvecezb[fhqgurbenzitepyh]xhhtisxbusntgekaps[yefgbqwocpsexwq]emmlcuwjwvluecbfo[ohehzdjljocucatf]zmgbwenmeuiftywp +xhrulprzdnbbzenux[ptzrrcmdscsuryk]ognjzqtletsyrcy[snpqabmryhyvcyztmd]lhkwhjylportbbo +xphruwdeuqibzdss[ubuaiomstyuqgcgzyn]upkpgfqmamubaqhkao[ohjojarsqpjldirf]ianntdwcgclwmyzwjh[qqeajbudidxsqfw]nenqeljkdyjucrqnsgd +xuydzitbfqwpaafru[jasqmetengbkljylhse]wkqxkjwkoipjfhkafnt[uolbyhzhmtupebneng]pcjjrczeczmoenefu +ievtjpcjrlfqwisl[pzhzabrlrdeadbtpyec]sowfrknejwbuvgs +qcuiylijqwfcqwjisqr[icjobpbxzjzuaxc]pcrdpfgwajrudfhxb[oiqtbvhfvitjvuts]ctwyepzbqlrtwuclz[smugjsqssswocjyc]lhlncivlmhmoexsrd +yqmqbdhiciqlgdmf[rywqydtlwdocdih]ofxwyqckxktvcrlxsx[rxupkwzkvwrmhuiz]znbksfkkqxephhb +bgzhbpweidflkmmjc[gxozhwikjiygyrm]vykpmxdywyfummana[mcqteiumnmmoyiwtcqw]ntczagaqoprodvhxbl +gvtyicyxseltoqfgk[eozvokbnjytodemeo]ogofokdupjyhzdgrk[fucnzhyuqkcakflcky]zfgxqfofzfdxyzetc[kdgpxyithocprbr]rpqlihcmgthswhvz +svrwqsrlntabucyssj[trbqnxxvtfiatqd]isjqyfxsoarfetrtgmm[lnwqkkgqucipvocrk]cdcsuvgwvzurnxleuus[wqjewzmcvqhhgwawyo]arzledaetbnpjmwjrl +jttgsvurypqumflcm[ccznbkqklwsxmva]ooughikefyugfvz[rzsyqmtahohpmnq]kyotvedmsjfshan[bwadbneyfitukleqbyg]oyeonratlyvtfbcrs +rpbklfvsjmisbnowf[vupfpfstcrfdxipqi]wuftflxmtftrcrb +igqcfvsqbbvpmgflu[kremgawldkinlqnr]ogcijqlgvrvbloj +ncjbiybzlsophbdemtc[zszwhtluxpobqclp]unvkyqmemvucdtwt[bzmibpkgwokausrgo]btnixophsknmjrqozwt +gxapkeestvvhodxnp[xlvglgrlzjdrpjrps]sephfhztipqaftxnqp +zalwvceeodddhqqyrk[znydhdhxhprlmip]bjijtiotyvfgyiou[odtkdhdrwuzpgwkf]kldnjprzjewdeyzmdua[wsdyljqvdmfdenajaks]zcvlwqkrytjsryab +schsgvlniqevsrjfkxw[drtzpizdeopipceke]bduaeqelcxyvykt[vhoefhavfmuhjkgooub]tzgcfhwkfuvwcif +wocmjawhtyhxksjiktg[hftunpxmlvyxauvnfj]spefcqpimqgjhnou[gmzejgwtyavnatavwju]vccngpxjmmxlruac +igqxjgofompnnrsaxoh[lmmrwzhovfloeps]loixvtpiyzagyvgq[yaiiiuvpjpuldqk]jwpjsgmvglkzuiepr +jgvoejrytatxvfqwt[hinkejefiqlrpqy]cgmvjuyjejpinjunld[qcdmwbqbqusirlxh]udhmheqsvmqmczbbofh +qffigxgklwwslnts[gwhobujjovmwfmrg]menqzjmmxrgchttltek[fwegvyhranuutxgxec]fwzgoobvkjekogpfscr +qlphzfkuyrhvkmsfxmb[unvtasxalhelbiw]gwqjfeftpkxtfiru[dhkyfsvpktyrttk]mypdaocnergxlnbodpi +pxdqzshlqhkrhzwcqkb[tudazezhnktsxxexyq]ybzclsifzrgndcaxq[ewlslzvwnqqwvljgo]nwnyptvummeraaoow +ysivygqkobbtznpxy[ydbgipznapsnkzfq]upackoodqdqmpvbgc[qnzvzwnbwrvgvwn]imcsgjzzaeltfxyhbx +hcqlfxoahajthjesrdy[nammwfgfdqnjewunwz]pdzecgfgatymrrntt +vwpdygtfuvbryipr[ehziaqbphyzzdolbfsv]rqxvfvafrauzncapu[dvqlgdgkzgpbjuihbl]sdtldsvjvvtlvjdgd +rajovnvmoxozjldjd[czqnvirgxkydoaaxr]dejvwkgmpwqvnvnzzsb[zwxifotwvljvpkxae]taoulidxuvefjqxjdu +jywqykajspyzvcw[jkqxjzfmvcrsqszgim]fncjgfxwbvfdwujhooa[otrkhmvyonynxsyap]skgdhtgcwmzixpdgmjh +wbkndoivecgnkrid[tpdmkrufmawhpijryk]untkposunbiezua[njngjktbavkmsozyy]dqotrtnnoxxejcz[nyinrkqzxnsaahwa]zpdibcyegeumjjgowz +gexzzkajyulforpnmb[mwihfmwsdpjjsnaxmme]xavowvaqybvqcqescdq[hjymwnhorqcdkoxv]myycpwmcpxinhru[koqbxfaoankdcpi]hgdktcvvxvoolccqcy +alpcsvxjoouuhjrgzo[blnjpvnbtcufzsxqn]ipijmuwbljfwuxotk[sgpwkohrsfeypqc]vqlggpiytetmkifwc +ixbszxrkuuzvvstrn[kdgfwhiapjrtiervwi]iugjmuvqljcbnmumal[ajgjfwerxsqqyrxuvob]qcdagpdvlnicajqcooo[qtuiukkwxyevxmgijtm]bgfetysdwvceqjc +pdbbmswfeutwunlcm[ywbxptxhgqpjkpeenbx]wzzaxgyiztbdftpm[lbeexhgaqvezxfef]fqktklfxugwifcfaio[ucpewlhkqnbsigioumy]cawftwrwmbnfmzmhd +xmtduxirbkbxjrqkvg[ythlqfokwjfwowrq]dguxbidgwelcrbxahi[mdumdnvbcsicvki]yhdgylmjisngrkcnbne +yzilepuvsfipivcroyu[czocwppwvwxjadgqpc]uoypwqxrpcpdzmsyyqx[mzjaguojtnjobsvpdx]vnsywqfvrnpipenwka[dtiayvtdtuyeqlddh]wpxkwbagfqncorkomi +qyebzyuerdwfocyr[cayytpduwkezuatyb]nuazweyhjemncuqpp[gwadeldyzfsvyqyk]gqjdzsuylxshtoayat +eliktfnkrxvywmvr[tlnexbwvbbdeupd]gynrdmuppfbawfcb[dqsidilgsixsudputz]odwsmpcptosjdhrp[mumunqhddegofkrpabd]bnetmxiqkwhtcsgpuui +wuozzupdubqhnbm[siwvzeelxcodzissd]niswczzlnrokkhrnd +bjxpecnvcntfbqdyqy[hjawjkugajcwmouz]ipusnakbyyxmqhyislo[xcafwiwiabdlxpaqqo]vaemogopzemmnilw +dlczcabztkrsdznjlcd[atcfirjxoipnvnoobjr]ujnimmhscetvevwpj[vnbwetjzberefmavwuy]penzvgcewibypznzpv[rqsqdxopumiqfftcb]qrotltpgkmzcndx +juqqbnfozoikxscqata[cgretlqkyynhwhmk]yiehuxyidjlzpjs[jdnlbxkxvsufsduoulo]ymrfqienfjrrgraxfh[jlopugujyekjzrfet]hqlqjkulbfsnnxyksp +epcyjxlwzmxwlulhx[pxjecldoxjwjkrndmir]baneyblyinubutjdi[cufdnjpvlwbfqbulb]dbzgyztjopciduxuo[paqntbrciorikaw]jbpsfzmzxvxlrgj +euufrqxfhnfdzlawui[zwgpectzebtpxfwbym]btexmfeuilnoqsbgmz[hvnxaanolwzkygx]hurfyrjkanhjlaz[vdmsczzhobknlhoslpg]bgitrvjaildspbz +gaweiazdfuixwqo[qedebtjxaewtracsgk]qnmuhjsbvqvcnov[aabcxwfcazxjqajv]xlhkehyvjohrqkbzyow +uqxzgyclomagldxv[amcvkpboneuscronwcs]qbeqgbmrdcdtvsc +xgkenttkfbysllows[bamxgmibkgysryjebgr]dhfiqnlocykclbofdzj +ppyfzqrjpxgouxmsduv[euokodyohaiajyvsrz]xfxsvtjasezevkjwjk +vcsgnfhhjkjssirc[kfdwqpdjaejqbfaxu]riqzqfwmwnsiqgamwm +tvxtikdqugadgbux[niaxwpplrlwrnipcnnc]tcunnqamexertrdm[xkxjepysgqqdphb]vnxvtxntrsqrfjaz[akxkeqvlxgaorhqnd]sfhwarxbzfbtftuflr +lwklfaiawghiwljxxow[oqmepnydmfkjbgkrjaj]clhguzdrfrmcoslsghh +eqtzgxqoviujmxpg[pkkbcdmlkvbcppqrm]zjzmsjmxdkaknido[sellbmhvshvqdsslyq]xuokcgfaxstavgkni +gstjodvjotzmvnm[mfvosfrnlksillaqs]riecejrjvhdrjvdl[sznhzufedvbdhbeq]msgvdfzoxeykqyx +ivwoejkryedvxpi[autbisivgebnntgixu]papdjtvhwtxgipbhes +apzalddmyxxmfysm[cdzptytpjydinlfdxa]gnjxiwepetlucfl[izgqnvcdaqkzgtpvwvk]cdxqaizjmvdnxigkmvm[cdybhclfttdchsbnyzs]xlqahfrmgnowlgba +slubhmrmovzbgdw[dehwvsngduvcfkontgs]zeiqylnomqgevvikm[oubxjfwewqtdjwacb]mqjinmndnakfemp[mccapdxlrmrevbuaas]hcjdpjgnoguztrdjgbt +vqeogkqjnfuayfpioi[rnkeynfubkpmjalnz]ybrwpzhiscwtyue[vnhkeaqwzawibjnvnos]ctmmursouxvylixiqko[voqlscgdnaelsbxcshf]azssljeollyzjjwkxin +sanarwdtnkaemdsoj[ojswyaadxpnpzcm]acjrepbjwnnpncdf +uvankqvbgxtgignh[zaimktolqipleig]mobimtizmlgqetrxkft[kooknezmesqkqisip]jdpwwsisdorcrryvyjn +lkiqyvxlouvphqf[wiibwrighxagoiod]mavajklcesvhiytvcx[ntesmbqoxkadtth]kovhcrsmmtllhai +ilzqxrlibfavovp[hrdmyejnxrlntti]yqmycbqlyitgkumdm +oslndtyjgissmwhqbo[lguvaxjavhlklnqvd]cbmjzevkakhfauq[huujtqleuzhwcbpxjf]hiitxzclsgphiembgwx[ixccjsoybxmjmufm]knmagcfohytzcoq +eutljtdlueiugunxsy[bmbgyvpiruvvuezir]vksxzmgftqglhrowpk[wphxqgxjmzhuqrwhce]giazmdryyjldglcivd[nsicphjzfpfzlhfymh]pfpeazmsdcttsutbs +tmdniznfpsrdaivxpcp[nlebmzzfjfklqixhk]sbusrwexlbpswiyslbh[tuvimwrkchmarbvl]ykhoceojfjugoim +vjkixsnkgnhzcsj[eqauuxevvcbzmlrvxk]owiikpkahbpkpuhkmns +yiomyydjxljwyxoeh[rxyahvmloktamapez]ygtodyeyjtqusou[esemeduybcbngynmzl]rxszjfhelknuyjq +hayzvqcfdjowlfeavo[mmcaawmtqthurqvmlfq]kbdpwcduhsjfbskcin[sueeedwjrdazxpae]drtfzfbefgvneiiqtsn +lfsgnugdavjvstpk[usjflghmtbzdzavzgos]vajnuirkzezjgkst[ixiusdyawuqkbnacri]yfhtwiifnoltnygk +fqvyvpipisvelyjfa[xewusykjjogfsupar]icdydlsidbisscyn[bpibwwfzoqajtnxlad]potpbswobrhcyvy +wozhxjyiybczbhbqvd[kfsajcbxdespfdewbjw]afcsihkfitjosfwxb[fngvcuammwspeglx]xizamsngscxtprjwkq +kmakicivcpvmjokl[rnsobihgweztudwrql]wytavzsniyqrdrxu +nawqmyenftpbvxo[nsztprtyzoacbxy]jiwvrmgzztoisveafzh[kgpykqugwgvfkztnnz]qqmehjutfdzzowkof +mxddcacabljlmyxmpn[zdlffviwrbhbjhl]niubaphkzsiybwkmh[ysxwkjpjhpyjmosgeo]kkhqupjsegymyxfh[sxxdsrtuwgsznnvhuy]licmdzzrtcxkgce +hkvugidmuerakcmmsn[mkmrvpqxfoghbyxr]brkgsmexzyvqztplvgo +inbjfdjjfofwckfckfo[nhjqvxeoedsfzfpwt]snlalnxxyjihecmxl[qtoxbcyxxtvuliams]bijqmocptaquusurml +wmwfxoaocwtzuhvenl[yzpbmaoazbchjxozl]oulzkybjweqqzml[ydkamvkncxomqsibme]fcuomzdfejvijxeniaf +clyxvevuyzylpdud[jmwhfhkzrzzkawp]nwcvtlwlwnbebgdz[cbnfsolnppgafml]mxhbrzrialopbbk +ekyvudgmgzgiomwt[ebcbzzamsuhycbcvc]gzmmgrqbbuvbzfebh[lyuflvjhaxkfxkv]bvnmyumtjzismbtig[nqoxegjljmzarvyowo]rldakoyzzgansfefpwr +wjhfgmicaoysnhmcer[kocbthyqjwsefyepgqh]vvzlwheralmhnixsb[adysumyfpsahmkntv]bnzgyilfgsepwvrdbdo[yqcnxfvzlpjxnvv]syedcecdzbffhmpztd +qdmvnazvvyyxqjkm[lcmgrtbttzwijqf]gjacmuqivbcttnp[uduzbmcdayazzpr]vabqjkbgwnjophdxwvr[yyljnrcxwwcehamtg]psdjpizyavaebua +fzjlpppzspuaflfwtv[dqmrdnatqlqnvowh]bevfgmojlmxmvfqb[smrcvucejxdrppkldvg]nbagvxquhrilbzi[dtbbwkaqepopjtgsgnz]zebxmxzzszbxtqeyjmd +kipuoxmzbydfycmkxcx[bfmjtzvthijzhezx]aiwnfmjhetyrdahmi +hiekvarctkixnmypau[dafmuxavuaosooos]czvsosvafizsjiouwi +epzppyfkcwcqiirpm[drxvceywherxdpnxl]pzylclelnhztrgnqb[qrmfgrtyqmlnsggg]seaeqafycqwjfccuyhv[fnwvqeftfesdvyu]djdlucfogiqnrblz +ihjtuvxjkvzqdpepjd[xzmyhwkdjooosritpw]rsvwysjoukgevdeve +wdgepzzfwonrsxprc[oefuycfwngwkrgklo]fbckfdmwzzwfiinlfhw[mjebaresrtulcvkeb]aqxnxzpnqukspcol[hpfnupcjrkswiwlgzz]xbnwmtcsqwbpkxys +nbaxkwtbtodcuecg[xqoetzqgjhxmuvfvnoa]edvwhehydqhhfjm[xyepeppmsepsaixyisi]txxbbqwefwuffdztlnc +aqeknneydrvnameefot[dduhtgzqtjyggmr]ausnandgijmikvgd[jjvsfofhypkfrrc]rgzmkiqggfaesoznlxl[przqmabciaxkcunhy]cnntseafxmnjldcp +rxilrztnhgzclsgy[yaxsuppphljrtcxev]mqyqgjopdetsxzmutjk[adyfostrkvhuajndjaw]ikumnitoxctaqcpop +ntotlcdwgtsgotovhyj[wgduvgtqijgobem]hhdytbkiplykiejg[sntkfbyrzgguijtwmm]mpxnepfkhssujwhegbq[sxpsxodobizsvppqptl]uqlqlsopbfmgliw +wbyugpjhymzlgbl[zdoddxxbnxqimlo]tyaobecgkbvrmgajpga[asriovkglwqiukcxtjk]nvjqkrzxwicfzdr[vzqasgjrafilljt]eobbqeenineqwps +xbtwnvkwrlnwseaids[znlftryxezmidoc]suigxfrnxfzeudpi[ahlshriqmozkpiogtc]zpjiwsbdawhjynju +drjfebkgnrcuqyzpezw[hnweqviwyjtfrwpu]popubobnviqwkqfv[plaxjplhmhjqjmqjsh]idacejabrvhfteelbiu[hhxwpwgvjcncpjcovv]tqyykiwalnnkoniju +fwdnjlvptzmxpwvsli[eidmcurldxszfvvhjf]bshskptweuzuqtjym[dpwmmspdxpiqidrfz]bulnlyngfaybqfinqn +khvidctisgemoswq[vzknkycuuvznnjkzay]rvzkmucboqomxkmtuvv +ymfxlhojyjfqvctzue[sihfpembvmdtdda]wezkljquqtkcyiar +cgzdjkbnmhptcggqib[autoeqiibhxdief]zapmbimuvhywdtsbtm +gilwnvmvdyftcdmvaql[esmtawtmepovyih]quztpmdplotzlszav +sfsncarxehtgmutj[aqauaojoqabkguvan]olgokvyhpfjzyqgvbcy[fsfdkbxhstvxlkzb]ozwgbzlhrocqpjoseq +shzexlixgxazcobmdvz[bvrebdcpytgplvii]gxdgzyoqpmkqznz[wuywofxihsgxgpcksgh]lwqsslamcrmkobn +pkjlltvbsjnfarycgf[gwkayyieahfowbrgr]ccgyjvjbdeoilsznvbi[njniljtubngiuwlil]kosrulvapzdufvq +clhvakestwquwywsohs[ubwecsjptinhzngw]dvjcvukpkdrgpbeua[svetegijnnbtetpgfu]nfejtethkqavpol +vksryzexymetdykenw[etxzvunetbovrwttr]pnmwnldqzmxzjldnmh[vnskreneiwajgmd]rwbeletsldocxguy[agccpaxhrlfokpt]wembexaqbprlrzg +wrxyiatlpvvcuroguv[hfcsmxesvpwfgtpqip]jbspeicucxtbnti +gbxyskaitzeogoej[drokshekgcpxpgktoi]ivxtocmlrugoguf +sfzpstesdmegcuhn[drrpxmsfpcjvqerjb]jqcvoeifgceremgz[chsbisfayixexqer]qyhonslazxrkagpp +bfufgciknfkthfbr[tlfmuebscorrclekjfx]offqunmqlcetebpov[bsbmhnbmmqmdbpnt]knkjsvpmffjqvtqpk[bryxvufxbsocwnd]hkxplkqhsymumxarn +ftafmqgtmaazvmstfq[qxsvdxplpesqzqg]yrbkrhtzaqtygxjheuo +xqgmldfvsmitjzhbr[yrwujpzkzksxdbthk]jblnpmdcljgadym +ijtilnlhxlkhoaftet[rgzfrfsilxhwgpzx]gmdwwndlvtvvtdimd[wyghkhzahfwpaknrxiy]ekpkylqvvxypaszcozp[hjdwslazthbzhdimne]xuptxflgcjgdajfgqa +ceklxvygwnkfrqvwd[qxjqndmhxzvhicvcf]lvrzumjuaawtgviue[xdvdtoulmeaaiiuqa]xveikrwzicxctyy +pdvdkirojjubchc[iylcutkspnuquwdc]uzbtxemzazuwottv[sojezpwrsstkdwkses]laokggzzeaobwfus +ibuowtqicxqiifze[emohxvujvolopghkrgw]secpljnouzblzup[xvpvnqvnsgsnmhwdpbn]ykpvwjlhtpdjlflxvye +botbhhrfjqjqwdgmeu[itwjgbhzrqnnagvy]pzexftzhniligeyd[egtdkuktihxgmdd]cumzxbfgryzedtsc +dgvuwphikpupaovhovx[nbwxxhepxfzlxcoma]vypmvuopklupuzlk[plkvxscxriyzeln]sopaaxvckgcbiahm[gpafvifmxvjouczus]uyqhgsdxkcylwle +gufjlajgktlwahsa[kwtpvwbvjzpmpbstiyj]nqkkgajutaofdauzmfq[zihotkwlyixmfsp]fezlipznjthttsiwpj +lqriaqvyvawemnogd[gyqqrvivtuxxbzf]xqrrsgnxbpmjsgqqr[zfwpyfwojhemhmyoajq]pyninwzcjzypmygy[qzftysfhztknzjo]zyybzurfxiolsik +iojvqxazkhdwzed[jnnntfrduoxnyqpeszj]dpeducyducrsuwa[rnfiudvklwbdbho]lklubgxkqldqalvh[ogbeiwjdaeuwjyz]cvhoaaenmeuovocvog +kxtwtkvaixeisgzjky[cnzhhsipmfawaqzc]gjpptvjnwmbqqbuum[qryazcieexjwwsvfi]cysiabvuldrkvsxqgu[koflanzstuwaebjih]krzursoabnpundffqs +bzqcnugxfeixhnvk[sjyuxwjdceauputr]tcjsgbmvjklijlowud[mdmuqbpupxhndvfcd]ypgdbaxwopztyqelfis[bvpphfvdscmfbhynf]vjaytjezersopuqa +sceyeinwgkcccgn[sgxwelfgqimdwzlbj]uvyuazuplvkhpndc[etahwkowloxlylnp]hletqjpvxzicdrs[kyrfwcyoudjlueqrvr]kdqsjyoajsfenmrol +atkckckrgntchlets[tyebmdckmayofez]hryglgphkgeoswe[jeamxrrzxgyzvmuh]vcvejocdlauybbz[lnnricpcvqztoumc]uggeimsqrjnppskl +rutaemkjlwrslmsp[jwwgmphxqlggydlsh]xdudpbdjfqtcgrw +lwddwkagigyjsht[zpizzqoqkcbqmdqfqp]vbvigihfyemwjqusdh[kqgxbnysneqgxdwzkpp]issqguyhzmttxofz +zzxsolnnbmerygtvvk[bhfexiwvaohrbqbadi]zdsieuxicwijamvo +lbfovxmrghyzhfdybb[whedwghlrxnjtvqelzp]oezlanrknbaxtmo[jtrlurnbhmuymfwx]puvsiaizbjtqnot[rssajpiwyftzhoacoqh]ihmzohwlncqrfrjpbpn +mflsnlcufwvqbhye[lslradskdqrueaxvoez]iyrdzgwbghbrctrmdt[bqgxpsiwleisnru]sjwifvnufaaedueaag +rcdjaebyojixvatc[bjybjvqonbvdtyjwet]rnatoqmpxauyiezad[ltcfporqmmavmsjgmrb]sdiogziluykhmgcjf[bkkhyuslxlarrqbqe]zzsdsepgilymdpnhw +jikhvuzivjikuxkmlus[vsgrhafeosvtphzg]bjhxequjxbqorsnhx[pvkgxrttjofimfuq]cmrxlinhwqxhrkrdzpk[xugunnrtpxbnemj]hapjbouhnfydllttkdt +xsvwiruapkldajmkyx[iohclbiotvabvkhkngm]qfvbpipvniprtqjj[ehcphknxkybflhn]ackdoidsuczifwx[bdbekqnxcwwskgxp]ofvzsecshsgbqll +rnpjfqpbnpfqtlpkc[itzrqowsquwryisqywl]mrkjwermsejxwqubxwi[plxkhpuflnhspjficnt]djldgtkuzafchfwar[auijeassmbtfdsd]etfcwmifwixeffrtpco +nkqwqvkikgnmwcnos[nmvtwkyhwtwyrrupx]emdniphxpavkede +tkcdryrjllweves[pqdjnylpftbbktemtkl]qlykuckixcfhwuczikv +cfjwosfrfjwgwognyjc[jiwoynoxdngalmreoq]otqvhbkwlkpqatkx[wwgwguxuzwlorap]rjuopkpuaftnkdeg +icgtjqangadcebdax[wyosawgqnexwsdqq]ulyhqvrzrqhibudyu +mrrdimungjnszyr[quzeqzycxcsamewykb]vqrhnvflewxwzvxwxg +aciggfsvhpeaemh[xhizavbtwzpsxdkgzdl]dbqpkvkmrbwjcle +ctxwfkazxjvguatxus[hkcjonilmmvovjawir]ruwyywhbhkrheofbpr[qeknvkabxrdgfxgrp]hymknrdlgolmqrpklal[qbkzigpdxfcgnfhdrqr]hrutorkgyzxlqlujnv +ocyqsefzuzizjllui[ttpjltsmxnkavfbviwn]ccfanejrzrghpnb[ehkgwatoncpnwfpjc]qkwynkumqgvxuslirgg[vrnprgoivxrsqlpbmke]jdygjgsfkbhrbfc +necmpldghpppjggvw[vtantcichlsjgrzdxlo]bihypdunzshlhxktuk[iusfpqesheojjdmk]ycztqgqrqsuifzgnqvw[oyjhytgpicigpcf]ewrixdzorbmmxgywf +tsddziihnzqushtoeg[ldqhzxrgtfkcrhecrm]nnesvhwbrujwmon +rdapxiunwuijmxrqf[qvekjcwvibpucemj]uidzbyozcfnpempx +fdvouzrhnlgyemqqqa[rosijdvpwbgnxzzr]moxykttwbfixxvflpje[daadlshdcnrwftzxpjj]pgpphzgfkeapstad[rptqkhjmanvnfuj]drurgqqilijigaa +dcdcoboftwhtitlto[qdqpbbobdncixqwhmn]cdjrukqmcdbzwji +fsmzzqlggnjqunemec[oxrxnckqpvilfinnolv]mgpmmemxrkuonag[wsoiyculboqjnux]urwswywdpuesxaq +gpughkygfkxahewxsip[licxlfgczxcqejs]idnuezcmwhwgryjare +shoehgaydkpbxwshf[ksbdsdldhfsxjipf]ubrrcyykdsgnywhojya[hfjwtuughentmddwd]wjpsomayxantmltuoep +srpgizgochbueqgg[qeqltfdohredaspdbmy]cexowllqgvorkapnkc[kfivkiksqxospfw]naiqwxlkjowysnh +patacqalyfmxulxxtkw[hyxkhrfewkpafeel]thgckmswuwcjgcuepp[lsfmmxuvmiyyzzxu]yiktaounkhxoqzm +maeefdbswszxotz[sdfwswrwotoblvzk]bqmhwlxmzvjnorn[phhhipunsmqfmormtk]aasvyeqeffypmcop +fhpaqlgiumuampggbha[tktjydzyzgbpqosq]dpqodhygfzmbfku +iotcaohleclcmtwp[zirjcaznbsuwrbbspl]vdyhcyoroztlltnsubz[nmnaakmudmmobxzk]xjxybbzqfoibovwhr[tpzyhrmupmrfoeufsv]nfvtlfdnynqiwrmnmt +bsadpcmsvgfxbpskka[bqcswpjvfijomiajzjv]zjzfrshleucdcwpf[ipqvielmzuykgbs]rsvzmpmpfahujfofx +fvryaokhaacjqgah[epbqswhzewpvaip]cuveezfvkvejvvaizr[hlhatamayfeqllu]ixwqbzzaekbgxkmhzaz +reyvoyklzltgudphp[oxjgegadnwxleogg]ljmtypolhtjwpvs +cbihaubuoteffoyu[svxjexmihzibcqb]jzdqjhmjgugqyur +krpfvdsywmrzxbusjl[juomxpbfboxgvkm]brhpobarqecdmqkiwy +wsbwcjnpzputekmilg[qhdrjrdtwqqaqsymipv]fyrpxnpnbowlhwkcwd[wcxmrmmzlznnrel]oamqtpijleztiuknf +mmjzxbxoyrxkyvdtss[cikixrlteokbezfi]urjcocznnivoqkf[wzqgjmuuvuniccrj]eiarnnhreduakcv +honratmzckbtooiwan[epebkioukueaexbb]xyakukoiqfmtdhvxf +auczawuragikjbyg[xqvricdlkrsbnmjqymq]uwinnxrbwluaanvjyvz +rrpjxhttogyefupw[cidavmfspeeooolb]ucfrrurpkeqltglk[ulptzlfrcvniduqkc]bytebcgtpqkknxpbh +ateymyqwgrjfwemgg[xppbfkjrlnizskzttbw]genvojuvqaudosfm[psnzsxmpjtdbznh]kljgvgkdvezzljte[ovfuojewcuvcqrfdzsk]kmbgrfpjzllvrbmpimu +mrvctdetjidibveb[msvevesuydbqwrytbh]yiliwznzilsslmachk[mqyuthyalilcmdpxz]ctawteeyyrsbncp +xhqazvqcraogaog[efbpamcmboregjesn]vinozerwxjyrytyd[vmzmjnevhaiidnhiuw]nvzsnlixrdzmzvtgfy[veacynylxxfkeep]syokzdwmkkhirrz +swavkosetgudxoshj[fvzlrzpjhrbnbqsccn]hlvbbqalpdfefmaxdse[ekisavmzzlowfwcmqp]hutgwyxxcqjdiso[vraskyhzrfjitpxakqa]rcljjityeqogidyb +hidnzkzjrekzkkqqpj[qvvuzioihfbxhglu]nzlgputvbrvwrchwhzc[rimjeexwqbdnsdn]tfzbpsuttxirwszy +wiubbpcsjjmtbnd[thcllhnafhmdojqr]viplkejozrbrwacv +jaywbjoscfdifdfalf[lvouibjhzbkxdqd]mcxggciwqqirwcyps[ztiybfroldnlieeg]vwnzbrghyfatjsxsvfl[jenhflndcjmgdojv]uyxvsnfigbtgaemccz +uutahwebslojhtl[affybmhohxqavah]xocumtcofvavgdgl[xlypyhazihrgfwllp]ptfnqjlzbaccyoaawi +akdzebybusompcsooz[xgymxdecspvdvkgit]dtnhtzkelcazovecig +jqajvhvbrkrynxg[yekfvwkborakrkfl]bovxzhceonjclmgecgy +ilythgztqwpxktjrpf[igwywudlvdqpqbu]hxmvjverypjvjtk +dbkmmuymxedkowpcws[kxtthcqfurgkuxxx]vkypnrqtmhlsqogt[rtixamexlrydluvxe]nbehtyxipwgvefctyaf[cxtipjkxixrgawvomc]ssvdpknocgugwjxpzpf +fidyxymrgwqpntyg[loqqjfrzmidkxskyfsa]mqilmzklkzhzedf[mitpmedchdhhzxdqpl]roerrhbijrjwmsm[quhrsmqqujwufnm]layxublhkfpoykadvcr +njsjelrfstonstmhq[crcgsmvxndyvyfsjku]yvyrpgjnuimkxcutgvh[gwmbqumupsdfrusp]sbedcqptxzhsohroth[wudivolpxauvxvxbpqk]bnfygsxxzqwxumonnm +ivtobvcmwywqtjkfa[tcfyhhgftbsswpnvbtv]bkuulyhtihhqcckjo[lgnkduoojrzyjhby]uwkeujommiprdopgche +mzrhrvpuyolqlku[rlofuuumtasfuknrasa]tfhglvunxtkafazyehj[hrnjrlpyjntwosogwti]ixtpihfavwqkjnlipmm +jzhfwqxoqsgnrnex[ccrtrnroigtbvrnjeji]bbhfsodufjqhjvplii[mcubmtdgwttmmnazhpt]hovifldmlnbzrwqicaz +hcchhpmerpjppsj[wftljcxoqwtoclz]xihvvfjfhefdkeip[abdthspjojqvwxx]fhffpflinospcczm +vupulseekbaiaoempu[zupmjydxyobqbfmy]xkyopqxvogwcpuwnud[orgnovcpbpqecljkaq]sdvcakqwdmgydeeup +wruccyxbyiexpnka[iirsbfvggokpwli]gztvpqcsckeaiqofwf[zdloxqdlcazkhkppz]jydaafpuoznegyif +lwxqnbbzjlckuji[bzxykmlhlgjosvs]fdocjjmtlhlghzvj[snveavqbuhnzqktmyur]xcoabwwqxexqzakbrh[iqkdvngcdtlhlhudqk]edydfxflcnpzrcjsppt +eokcsyiozfqhcbzffj[uiczyrevovzcgvu]mniuhovkpklhedhx[gbyzowvpnxpemkcrccc]avfhgxxldgtjxuy +rxjbmcovdnxoxrjter[ijiplhrlromkesgs]xwtfawphuvrjimntwvs +uuwjtmgqskgrxrlzt[nqzvntwfmxeptqylma]gbahtqxvunohprsd[strhrrwmxsuoiuvi]nhamfjzlocoufnwbgu[osdxgghdsdkbqcpj]ywmalngfjbjymkz +vsmcjtzwfubhlop[ttbkmxwjonmuscwi]ikjuxrmqhqldtfzqa +oqhkopaodmimgikwcg[biimzvsoczaxfdy]bkcbjbcusyhdpfo[vfnzlymbwetzhbcxz]zyntiiipnkmsjjemxq +hzaeznnipwioicdfa[lperfrgxekbntipyf]mnerflshwywujfsp[nrkcmayjxnxbhuvo]mdxovxksmxlwvkbrdf +cuqqyiwojnwvbybcps[bujmpcuovhebtztm]bektaixvzjpofzb[egiiqzxqdlfwoukjyiw]nqkjlpwevuxeognpnq +ryxoyvavwharlbwzeq[rphqbmnaiykgafsftjs]ijrqxkvnqersvvryz[mevoiitcztvfztorohn]hkchrvkqswjpyay[staoxhiuifnbmxuytlc]fuawdkujedmkpeto +caowivzceqsclbyp[grpcqqthiebrabqwhxv]bzmazhewqmbuhjokm +uhrtxyxnakvjydnroc[fhnjxathwyyxszmo]zzukeuqdhxravrs[zqcltmosvkqcekap]gjartckwucksqzcn[smddsrvnfxqjxya]gkumdkzqxcqxfyhm +ldzhaqlkbxfagur[qvlstlwnkzbmxlxw]reflsfhdsosjaaesps[qajtodlxlfrbdlj]bxytsckpxumuoklw +ghjjrxtnytqatjfxwt[opmvopscrillueslb]zsxtxstrwnyzolxk[lyeeidvaghynwkckr]shhkellgnhsuekrzoc +vpliqrfetzttovx[nkmmjlsskjhnyxh]ayockmlevegaseq[auzorvghfdfuuajnt]poknhujvpctqrrycfun +vzgpmpjvlzbhzhlexp[zheyfmgekvhjsnmosaq]krmficowypbxwbztrn[rvoedtkjlfpxtaot]rxwejzlarsgdlayv +jfrznpvhlbchvre[obxfauzcchgnzksp]fgimlwasdrgqvquis[ewaqnfexmitmuxhqnp]graisawghismkouwfv +nqmcashwuluyxaxcw[fdqovhbtwijgklubmon]dgxewefrjkhrylq[maeguvhvptbgmjdwhxb]dkdmdobhsbyforzmqr +huwexxqnjlofulknxz[qnbpzxlpdlsqrti]sbmmwvryxqsrfzpm[ucizjfqroaflnixzbpr]ndztjtaeahzmkyords +mwlrbdybkjhgorutus[bmbedqpcsxwkganh]ttwjrjrvxsikepdbvgs[qycnjzrbeiiplxarls]atrevpowofauioaof[nlhyhaoljptrowlmyo]hmeaxvwasyaszlgq +tqsmjetgtzmxfgakjqs[cbnxrpnckgcndpcwiae]uavavaewuucokfrm[viufzfvvuiuuehyxcw]nkskrloinkwsoukw +roximfsrbnzyzjmn[bqugwcdliqyzyaqiupv]rpdidncsfgexyncbg[amzmtmqwzipkjfy]fqnscfsjmxjlpoccvfd[bpebfxoinyaqsgjpb]dykidfsbcykdobqe +rcmbmjwgmwathepxunw[uoieoiytmrywrjevift]ourmrqqatqnwmrisyu[bxodgsozbekrcuwf]gkaigbulsjxysdiawg[kczakejsrndvzdirs]ggjgbhegtgijrdz +xtksmozdsgsclsxrfh[afxjsmsjpuqnomb]onqkiyrogyrkykxjr[bhvnrdaenimevcx]snufewjwvfqkafjjzn[cquvjkzxpbfbghmnpwi]wjbdkkloxxgsgnmriw +doruvpwqkvibnww[uslnnvqcrwjlexech]cshujlmmujfjdtjw[pkbasqruzspzipwrqke]yypbzzqwoasgldn +aoxxznvrxfhzwyyq[byxxvystyyrlzvl]jnilbnasrzvgbbhrl +wvtujbbebuyuazangzc[moooepbzqolouuyxij]vhqrubkyyuypknfh[gvfucxhufyyjefei]axvrkaeaqlxxfip[fiazyighxscxhiwydc]acvifmzzltvluos +yzyfibzwjuddaoxc[gpjgkmckxctlttgcdcm]rmjohduchcituck[noozqqxrakiadwu]mipigxbhlbtngtpcpz +zipobscyynjrecng[jeekozoaoyuuqmroisx]tgffoyomlggbyjnnv[mcfybdsenqhygjo]dnzrpghyroqbcje[aoapyvfyscqfzhihddf]vplszbvbycwxqrhb +gcoyyfxpuufglqfsczx[ebjwlqjgtgkqdeike]xtuuxrrbgiwhwqdcyw +mdwjuxoulckloxfujkj[omieaeznetsnkeoroh]ggnwbuenkgeujmap[ghrtxfonaxyhfogpjub]ptyopzxhctssbwlpwy[xmpglsqcnihwzgbgm]yqmqddmugnlrbnqkgci +xeayvddumafiomemh[euwluehznzxvpmzbz]fxcevhwksvwhrvzid[maotzdveeldpyetguj]cixjfwlbbbrrqmnoklo +larctxbpbdnbpqyyz[vzooyuwrgpgtjtq]sgizsbcjteinyxto[jbqzsxejwwgrpcgzwrj]bpwcfwyglhtuxqmy +zbxohuvlboydqvqhhkd[wgcjvlrppivpnxifvk]kmpdiwdtpmrctyhy[pprsqaqxunduprjnjxx]zfbqlbdpmcgfwenem +ghcjhgkmyfejmua[mqsuukbcdvjmdnz]ixxelnebxjrtrdwzlkd[ikojyewznghqksregl]tkthqugytcsdudoggp +hdfwyjganjbjhbjvswz[bfaxlkjfrkakeedg]zrkxyzbozmchfqgz +inmdmdyssqhykuhn[vbjasprzyxaphygdg]ucbbhyvlsjjdqri +zdyejivfbywyaaqljp[sxmtwgwmwbqelhsg]jesgfubnghtsagcu[tofvxzmzzsnywhbx]ibnbzcdhusdiqhgika[sipfigjsngidlzxxneq]bljavpomkpqzrsuuo +uahcmotfanpvzru[opmqbnngxtudnuyc]lsvafzhwwwmoagl[kzpffwsffxozirgyz]lsbjnbzflbiprwuvurf +rzietxnbixgvzxnmzlj[iygcirkrgwwsgpcidzr]bfrwgfeyyatmalyjsl[dweehclvlbefvlcp]qurpnzinmyweipshzs[lgbfgdjhddmtvbzxu]ppxtzzkiizoqqguct +zfsvifntrvbjgdcuc[jjwqwhifqbxeqkbigcl]fmyuetebsksddti[hmopwdnxvmqwqflr]jidndiejmzoutjpkdm +qwnlstjkluchubgkttm[yyndjrkhfqrxuyglebo]xdltobqidrkstozk[shmmslerstluurc]fxkrzqnfjoalxcmssq[bjenpehkwbxpktb]eaallvedtajrnupomva +zxqdqrztephcpieqdi[rigecfyegojksvjmya]rgygzpdzmpvogeurni[odgdyrqmqgrcmhfcu]ggdgejoiritcrdxxu +ezhzkozgllmnompn[sqyilkceizeygqkwot]pdkuklrqdgtgoqap[yvadgqlkffoklshvf]hkgwcnlbadpbiuzvkaz[oozjtyzsxujalkwoo]dhntuiangtulscbzg +zvwmdxzivmtzpkmhnp[qduttqlbrhetmuj]vmykluzepgxxilmn[qgswpbooccvoxlg]ujndjzfubkxmvvdib[yrneuetnuktitut]vvwnzxosnenywomkyj +phuncbfvyiwxfour[oauntpjxaqvwvqn]liffvpoxrbljogpcwvw +usabjelvalpgdyiyn[hywbrqfeqwkizwnxf]ebpcgxloqmzflbeag[dxifrjggqwzokner]ndwzylxxlkdcpbk[kfergfdezgbceby]uscylihvxfbetfnog +afgmwhqdwessspzx[ssbmbckihwjmiaw]zbbiktbhykmehed +hforuldqhrolhqsm[gofgjhapikxnhhdn]xgdarfanlnonwdielb[hvntptxixclnlqphvq]hvvdpsmvsveyaiubt[hiiscphavjogadmj]bbfjdjeecrhhrspxdpq +djtyronibzvtixf[yvofthnckundxfe]eccattkkitxyotbziy[afdaacfefrerytfh]cquizrjfjtqgjozagid[xkbcgazeolbliwp]hukcarrfnjctdycpfb +egwoebxchfxxlrr[hxugiprrlfwmknw]cpmfgzxzakyhumd[evzzvvtjwwzwzywvk]lwcfpjlcgrbjszjvf +hktuhumsttqsgfltrdv[rctkgluikouomerrv]jblnggtkdhveufixx +ejjzogefxwuyadzthjb[ibrhegtzukygkfnziwt]utcbeamzzfkbrmqonlu[yofpkwiuewvtbswaet]zxkgoommtfxezcfcweb +wbauuixpbtjnuos[ozwhlzidaubnfiuiqa]nlkdtbovsytnvjz[ztfjpnzvymrefnt]nixbxdoogrxdvuxbxbr +xadpfckydqkmbvbj[vwdzgyfbjlyslafrp]mbozdmkfztxwailiuv[uttdatknprbzvjvucxh]cqcbkumzxiaqweqfiry +bsdbnkvvlwpezlhc[cdzdiuewblcmciggdgp]halpvjdbnpbdrnkz[ikoyxulwagjnwego]twyvbkffqxasqbomi[ajwtpvliyyssqjex]cfbqtoqqlggpufbfx +qoqtovwkavyaqbkwmd[vxuqdoobfxtanlwd]zklibywcjpksseelw[roqxvvoifjmxnarqvt]zeijltexwykdvpd +obkgwgtfxwjfrepg[slekjheburvgrunuaxf]cnhsvevmitpuwokwee +flulgpwvsikwhpzpza[pmlcfhtmvuiyoidfbfh]czcxxurdakbxizbbfb[blpwjusbzbdwugwbcv]vltmmzttxuhooid[hlbpbqjpqyclebkye]hgozvhgdplllxiio +oupstawbevsasbhv[ddvybaqnhfckfvdgabz]nooqiufueyoflccqzc[jyljuydjddholsx]bbejlommzienlhz[mpbmppjwfqrgucxdqxx]sjohlscgjoprsqt +augjtgfyoatluixgc[atdsbsouunywohfnk]dpghgakdvfscbapsm[nkodybopavlbeikalqj]myhpkcbsbkbjfgj +whzlsgvuspnzdunurbg[cypfmgrkqjeppudbdy]civtfkixnmrkqmchhg[ypyakrsygkyvmfmmyf]blihjslfkbrysntsl +xeyyjiqvduxcflt[xiqxiqeepbpkkydtzxs]vbpbdsaivyavnfwj[rduzjulshqiluheud]inliammiyxregzbsrkt +txvixsvhvmxxsomvo[hgdskyjskapgvyiqzsz]shvhmfrbpxbndsx[plvytalszauhmpkr]jyujmokrvxwmanzbxbi[mefmngrdhatojkpplcv]dttxfesvavgpkbtpri +pproajkxqwedocrc[muhbyboayoghprmbtxs]odroemzznotffsaxsmg[ykfnecchdltzosnyby]nozuvokzntxrnitq +rqimalibychumvzdq[siqhwfjimixscjmne]hkvxsavgjvpzkyay[nzbxnmxgmyuwcywvd]qkuzrfifsyvonaalxu +rymadifucrlickzorqr[phxxuxpffvnjgofl]zqfbhfmzbvhbmask +gzuklpopfcjdrxoekz[lwviuuoyojzggqjs]cyacdnvkgqqafcyprae[iyazavdiashvzwpgip]sztafbunqsyjtpz[fkwjsbllccbrrdpa]dijejdfyzqycvrdkl +nhmayligrdtlvyeo[laulduejrclodvnaoh]frxoepqtmqdzwwupiy +exzcpmjdjiagpvsvin[aontczoixbznfwsvss]hdlmrrdtbumlfvril[gcuizdwjbzyhttw]apadljkbcsylwgekv +pujkeovpnvnleypqz[ecxuhbtnrlnzojsxs]eyolbkoatzbwvnvwxlx +oefowwmlhqytnxaec[rdbjjilbmiazndcycr]dvjwgldyxfrzicw[fxpbshhafqifvyju]ygagsxtxwnsphgzqrpv +lhbebfasigqbhndgsux[drchunjaqzkcmefjys]nzloazwftxoemnmifox[gjpmyydbftxggnggadd]onlcnitfjniiekbiaz[swjdwdaikyykupgyg]ltwxeordcvjfarrhx +ukvzfltucnovohjidr[apslrphaneessxbpdx]cxrovjkruohahxshazw +xnsrwrjioindnxhxrrn[mvuraryghmwxppnlp]mconcxeyryuvfqcoy +opafehetqedyikso[vjnjwsjlbiknomzuu]pjurldelcuxkdlhehm +kvpcbopojkvzykdhm[ldleeqmztdnrohjm]vejwyvzvekairyhc +yrbrakwltaduyge[qwvsxbxwiretxirlsbt]hdnwansdelcvxptiou[uhibherodkibtww]aphfcrfnpewbrblyme[lfwjpxyosiappsd]rshmipxgjvorazj +tsymbomuywfpmdul[wgulyfhhwodplfi]xixmazxgewasngsv +ktywwprbuvuhmnpwfoa[fcuicnujrweusdoe]fuarbahbvkhqjibcfp +snhkrkibygzndryeblm[pykdztwnxrawqbevu]wwiwrwfcwtirdkjh +xhomjlsunzjzgkxc[qyxzsooayiqnuzljj]jftgbnqtumwipywdfrp +mhfgzwlocsrhbfkdbud[kwtnglxzzdwqcfw]ezvrdgdyjjqfwuv[abznvdwgiisyqjxvu]khcfgchqbgwflioa[upibqontzrahabnpi]tgjaagwvmqewmfyer +yfptdfhnebzhgpzism[tglibrfrnpfmydwbea]mmoqveuvvenorhnrw +ljztcdworsemcoe[yloilpxuumxdzzxl]dyawqaacdnjlttcz[dxyytbozmlibkocr]dxpindavjlezzpogz +bwkhzerttqexrgoea[ubnuzbvktcxsxednmu]zqjpbtbzdcfmidopdy[malphrsrebpeeuw]vwdlaafkntcaqmwjqc[abciktgfeaiptay]yqksuqwsuqtckkoyh +filqrpdsqqfgkcu[obiciozcvbatglnx]sjzgtjuddnazrzfcju[svrswvhpfraptqsxolt]nfcphmwaudhrnxkzc[ysohuzukkfqlskgkd]nynxljuswasofiaarc +desdobciyiqsycj[wzvqcbwfbneahei]svofzhyvvsrwasvvg[igvhymbudpcrdgjwv]qtyrjtghnbbtekl +fygnlyiuxapyciwwnbw[fhwxcrwprlaoiybnkbe]fxvtiehvhfgfwtsdfh[mreawqbzyvkbcnkyftm]rryknthocegscrdtbcw[ktbeedxfulszfogwnqi]kqwtzaemzwmsloi +zxroedxtywemimrje[fvzlxeqgczajhimr]lrhvziwtgglifto[buxquosscraxroklx]pryldzimioibwliygt[yvmeeklmyokbgexl]oqezpvcwnctcbskefas +dcowzgprrgvczwfx[zminxdmdflugwkkkk]vfoltgijbqlhjdohr +vtrfdkwipegmqbwrvo[kshaxjtaiuyicufl]zfkbjdxhihqmtjco +djidszgreaxdweqjk[rdjzkbmqtyolitmqhf]plltubpvwojnccsygfy[mewadohjaliobsdwezu]vmrkkqgbtfmwemn[erlreifagjhqavlxxh]yplrasxtqcyowlci +ctautcpnnufupce[qtydhgcjjqofrfay]lfahmjfjyppehyp[qzaxqkpopvwzqofe]rkcqkjpgptshvoucer[qmczzorygyrwbxiji]zljzfavjmwawfrfr +mwmkedorswoukdumznq[hdujfmdkyiznceknql]wgvbskjuuwmwrsvca +sdvjnkxypkzbwaam[jrjyjxcfvipcsfv]hqpkybfiuthhszpey[cxzhyjyccoulowr]bwjcdjlwidvcfkguaud +wfvvroenfriclccedd[aqkoeakjbakjprhnj]ytucldefderfpqaibsn[gjukmqtaxbygrygukiy]xfreqhtftbfsvsjstda +gmqthnogaadlkycgrv[qrgjpxucfcnthziuqmc]fqlchcfytukeoho +muwfuurxmlzrcgij[ifojpmgnfufvhbmmeu]ezcruchallsnspos[bwlnhfxtqvwcdjo]lnfuojduqnrbdyk[jhfihfozzosipwsyk]akukjehglqpancmiy +ultbxqkpivdepjvze[flhbwrxncynirgxwt]twqbnqiaivfwlqorpa +izvobuuojtimkzlsak[moodohlaudrwsto]cxjybpccizkmeau[dqaajcusqoaatpbojuh]pxlzqhwqdgetmjcm[jmjesiihxrtbmgwkcck]ywajslefzjxwyfivv +ymymmfpvyiyegjw[auyhltgyvzodazgd]twjkvzwomymmrhfthwc +romqbwenzvevhyq[ewpxvrduvqewryaoct]wxgowmsdxrxjnyj[obazseiipwfmbyxhkdv]gjalmcoqrquvdnmzacu[abzkksqdcduhkizuzxs]uzuazfdegdfqjmmr +frvysxhaafihjpza[uuwayzhynhgliyxcc]vdcjfobjuqddqibjef[iusgoufujvqkfjt]cejktzeuphymtswrxj[nthrscqmjniokzsq]tnsfuflhwdkvsrlm +rrybzahzqjlsnrf[aexlsirbdpwkrfhms]ftuaymthroqwnjlhwv[gugocacufksbdyqsfwn]ptivpdoxkvpbwaohlfr +ikdnaifadlcqtyfpq[ftwtatuewtwyxevw]klpnngjlhfuuwykwbqh +jcjepxytivozlscfk[pdosptbukdrtforgvxk]wdghlnuxqjdaztviyiz[mqtajavotnicuxco]vovuvrvnwoedhflabai +yaiokdeleeowglfd[qzhtllekpxcjvig]ohtsvsylelaafkxk +qkopuespenokczipnz[qmncizyvbxioknj]piygfwazneqkamiq[oebzwpkixhbywqc]tglnlkwhricqqzzbkuo[azpshyiwubdevjojg]fqlqjwtirppkilhplu +wpjdzojjjgthuvhs[ttvkvkootolwcilow]lvilrilboatpxwa +sqcunkrlvqeapsseomh[hcaleossxxtjalzts]dwokbxvvtiocokk[ziimvyrfcpcagbchp]lqsdomcpacsejdzcxw[tpekrtncgabhvirc]nqguzphabzalcgqjbmw +lchsqkntfaymwss[glcnjoqtmlubbldwxb]repxhlvahfruswno +gvwpylwrbvedenl[bsexdkrwujurnrhirju]eskvbigiwdmjthvhrw +uumyugkrepjyfna[clcqpswhmttsgtrnh]wnfqshojhbnuvkblcjh +hcwvxdxtuptlajr[svvedookmmgybok]dgfqpjqcewcjwqcw[rtkptmdbzfeqcyiha]xjnmaukpdrlznfxvfl[phdpcpgmzzlbeplqeyp]xfxopckbwdpteui +mxlmvngjychkbdad[nprwbbiggpyhrgjnox]kkkrpnnokeecsxwtfp[mscljzerlkqzmxsghg]mvwiwebrwurrppqw +bdgrunylqufybegh[hwkqigrllagcnatuzqe]tfooqltcwxznzoaot[hvdskwgtazfkqlbbbk]zlqphymjvcvgybaxo[uvougcsxvyieite]lryismkbwdzxmprwjmu +mtrggduulofkvbdmqj[oijictmaujkaxedjfm]kvriyuoautahkfmt +ljywcelytwxtjojhn[iopmxuupcuvfcgubem]alcwlvcmjgwoksp +ybgcqoheatckeypwgq[szypqmipvcfzxbl]obblmhvzjoiinqd[kvoyilelwmylaezhow]fforcawucbchzbjlrmu +txgcosxcdgywyfhgjm[etzfxsiksioqtrir]czbkwziihsrtlceuaj[ksksgvozuazlcgqcy]tcottzfkvhsmrsyvf +iggzhhbedhayxftelth[qznllaqmnrogfmdtbx]ualmvsfjwntzbzd +dfeuwphubioymbzuwo[tucongmmrqerhidwq]tjzrtrfhgixyspdsl[tygroajgdzxudheh]oumnugqbzgyilbrth[ejcdurppfugoluctx]rtxzchnbmwvfewg +kyzwhtfybawdrjkvoyl[fzrhzpdsmtmmmvuu]fgbiqggdekddtlpzvzh +irtlqtjyzstyynjfjt[zrlqdodytcoqczaib]brhvezqcuycqmta[uaofbaluqnucifngqd]eeprilhhysftrhp[zmdzijhtuxhysuaye]bqokznpdffiubikgf +nsrehcsbptmpdeskqi[rpcpoctimqyccgnpnfp]peakqjqlahqkqfgoc[irckfbpvcdodsmwm]oxnqnxhwmwflazjv +iuanxnzepawwipojp[bzoxbyrugitmuiutg]wtsagitdstugmsssbc[dvxwzoncffczplwcaw]gifhatzuqdvuwnupmja[wncssuyvhyawbmfpbdv]faluhtnnnvuiwbbudh +fpedlxzxifcuqmvxm[vrfcejeyfkhegliplkr]giqaenxejvscrlxbg[qctzkslosctnoamy]qyjmeunfiiuoxsid[xpbjwjejckcavehej]txgqklgnzqdtimmiqwc +iwkrzpmhsunofgrddx[ecssnqrcjyhmsfh]yrmuqswzgcbxnaa +lacpahmmufjghzen[zkbpbownspfqxnclzk]yjnyyjnabyhsrggji +vgxbpddjqotuvzbakan[vnagjxrcehlhbxwdw]kxuenaclhrihntgwjq[bgqywyrrhjzjqdnu]eirujssxedivdmvlsby +tsqxgzovbjzlwpcbv[rgaywjaothmsswcdrtp]owwnjohtsgegsgtah +xzxejmuyfhjmgoxfl[hyafuepnewepjpy]lbdbsoxevfzdpnwpfk +moucalsxxvhjiyoceol[gwxofnqdrtxzusk]qjosxisditclyvucbm +bjgdyrlrhtkbqrjohwj[gcmcelqjvjadxqnj]tlupekhzidsrscrf[oqadjqqatohbjwxrneo]ykhccsunlyamcmmk +vgihvcltopalggrjzsv[hmrksbhlxuzvtbnuss]yqpcbwauqeduyse[oojtsldylgtokmdwsy]intpovuqazkybvjim[qbqspjlovnizurecdj]fkxluehqgdogxdofnq +mhwhttcwzcntsbufi[afretswhwxhwkptb]srrajfoeahmhecarmu[wgjragqlbpfbfpd]epytkbjxmblfnkwhlhe +dgpphmjzkoobitcjyoo[nzkzbsfktzftpmgwdcd]nbezurwvzkhwskfq +epuokjzxtxphttxtkz[xcyaposdqcfkcxhncz]hcupnojktsvxrfwlyv +xfoshshomwdgssxla[uhshvhbfofuhdsqk]zbzynuiyfagqpemuplr +hycladrjbjuyieejeg[ajsfbpoakutelvhdak]hjejfrmmzslupsepozu +ksputfunecibpffwovl[xteycruesicuhzai]sqpunyzatnromjeq[xlzamstzzisboayh]gzlnqcjacsbkkmgzi[aonbwutxuesczgwnr]aflrcbdkkgoyumfakb +gjgmaueywnbqdvgf[tpheftnkpnlyujv]tvnqzdugoyjybxfpx[lnhefqkhesyicqqgvai]dvdgtlsayhtscupgikg[fyjgjzcrucldwdd]ohlycgvvdatuyvduhuo +emkefdmyurledfdd[dxzytfxcsdxgjcwxjzb]rqwwzvnosuhkcplv +fpmhvozxaaxsyxcpx[yohzimahvewgvzucn]ztkenzkvcryyrmo[drnglpsvnlefqhx]clawabytpjiwgqflfbv[xvqqglnkzkxlevq]dhpydxfqbclvcjtdcn +itvuciuufdkcgdqgo[mgwnpeydayczlvjegm]jyrwfakomakilgvhd[mslududkqwtcsojaosn]dssdnwxzapuchnxz +twopcscmaiqhzsepel[qhydrqfqwvjjvinlq]tfmaoxgmccymtrbecjk[zkuwqiccdgoubccjoc]pepwccwqlxzlvuhb +dingttjebuuxtxrxt[jmgffmivzzxvgvefk]bqxyaoqiukfungsvu[sidxinaokekzqpqz]hekuuswyvznavhuvk[lnmhqeaujpofmdzub]vcufrufbmgwvdwksqn +mlgkvlqtkpwzcjbrr[yzhdcawedycuwdw]ncjgthabbqmeuji +oqybrhgapxiiaxihexa[gerjxleappelousidd]dblyflqmoarwpne[enariawxfzzpeqdvj]lgjzpkhkrumhvap[rtcetzkiztcmyyjzs]adjuxkqsxrlyjgf +hqxmuovloocgcgjlajv[hjbhghstuvarcwhfy]wldxggmqrrhiwdc +yelxlqwqeiqqwwaitp[uservmlohjixnqtl]cocskteueenenkfmy[ehpleyhokmlzslrdlh]lyvwccjeqrqiofplw[pcsjxogpwmbhrpvvn]ncmxjsoxflyiderh +znmujbypnozpjpkqii[iydnrowiwhgazihmxxp]lvehdleutcqbwwan +lympkckqyhgbaumc[oodkeqjyhckceptyqui]ejkkqbitfscazcx +sxvzcdelbmcqawvour[jgrjmuzvknqddwawl]cfdxxgxsviiyckx +nrsjamicxprsigw[iywcxzvebsemowpdmn]tbmisagklgwliuuin[ztbbbdtyfonwumpl]cjmddkvsaxzaszisyy +tllvdxtvmesnmauwk[qaomhmguwvmsjbwrwz]gvzyhjymfhmheexe +jqiffwykdbqbfcz[nzzfstvzsrtshctbwt]uazcksxgiyuwlkbde[nvsnfriumhwznjfdual]beqjfgyanriagjl[mkwaqdkmtnrzfpszb]mrqgyvqvyqabnugoc +kyvjsbdoorblnmy[wxackciwbnwvsggfoxe]pbufyorljghrayitwnf[orktaokqgpeenjyk]xdldvupmoyqwylb[aljdjuvxqagigdbti]erzojwkjcoxvuztbqw +zuceocflmwjxczrua[gpdqtptmhzmrumm]lvmswwevpotdyrrztzl[pkzxcpcqxpbfmznn]zoaxhfddhvfzxmdreww[roilsmnfdmogsvyyr]inqfvvkesrzgzwsnwya +lihowzmdtujxkokt[czwvzrilryxqxqm]appqwnbyvtxjysxkh[wpjuzvceldxgvsx]hkyptytryliycwhpbkk +ccyquivxwnsmzvurzl[gatwkzfmiuzvlxqqyy]twruqhcerhppziydvey +kfmpvuwkfbczuahpr[uhtwcsydtbjjfcyu]mltkvudoyovjipwmptv +yzuinluayrwqgezu[qbeujtuehlcqhbz]qwvclzkjxuficbgqv[qrzlculckkjhunba]gemnanesaovxzxatvm +ytnrkypitsppgols[boldlbadecdiaeyp]miwxcsnjabbmlfz[nmfvanenygvwqmgpiei]dqwnubvfbwzdptj[ormimocwondmsyrk]eptdchejhezxzpqimj +bpvimxocqygiyfak[kocimiojschpxlmlbh]oeohxkrlnaramquwz[mvodjkrtgwsyshboxo]jmxqxvydlieugen[qsqvwfzcowdvxzeflfz]eoysyaomzucvprpm +uhanxfxnxmoedczj[pjqlsouqdhqhforcuk]wgqlbagmjmtimaewh[qlnvfdicashjzjjmmwe]wrtbmpniixypmei[hnikhifbzacymvga]cueedmtiokuuauro +rmwtcdtidmhhqvlooj[ibfeikfmamtpxld]tvqxdwcislwdijaa[znpzxccexnnkerzseb]cvyteeonwbckvkmw +xtrkdnwsvlqfpzb[fyqeealbxbpjxohdssv]eomkcxpzhdzzchmg[rszbjedcqvxmotecne]arebcunvopesercpsif +wpmgxfiikbeczkih[cjfseyjqbnprrzrc]vmofgvrwxiitjsy[cdbplfeqqrpvyoguuqp]gicntinbexxdcom[bhrrykkursqvyepyy]lhpnuchjkxczxxvqp +qnaldysjxpygshfd[ggbsrjqdcbppktpfk]rfapyzecbxeoluhop[njlupwxmsxpopefrwl]xhmjoasimqrdlgjwm +acajjiclnscuxdsyxv[axykpgkepnjhrhfgqvr]slbbdyluiqetchbrhrm +ryolywtcfhaxzpu[cihbqzqvoqwayjwqtx]cpnraqtbqozlcrvoxn[ippcsfxvbyrodbacgmg]gfmqhdjmgnfisex +etevnoklfebubfa[kjvpcomfcdacfhthi]nfqsxiilqrwqianlsex[ugqfrpggyrmumjf]utvcyluzwmzjygnta +tvqkpekrujjfpzlot[kgoaglxyitdkwjmf]mlihujxyrtwfmzup +ktqkqvqxohypotivf[nsytklzqsdqgtjsrved]beidsrlrqlaaykv[bhalrlzjhvbdtjcmig]awjesirwjnmfjdslc +axgwliaxadkosbsp[hpschybkdbrmhmm]sslipdgrubjiifxzze[sptnagunoyiasvcunvg]fywdxjoeyzvwrpinmf +rhpxrkwvbmiuoks[ynxkvorcjpyldmigt]juvdfreyownzxciopxa +qlmnvnzbswfkadrm[gvgyozcjgthimuxze]ewpsviwopsrqszjq[odmqbtcagnixpgasn]cywfvmbtfcixzjmyue[ekxllezjdqxkqfxkflf]smxhvcoojkrwvuiv +mrjroyadyadcyppfliq[xunpwmmutvwiewlkyye]ppcjwembftkaakdig[fycllhoijmljdas]ghnbcqzccvagpgplb[eafwmpftuwwwoln]qbxjdgsbyahqkxqzrlv +fzfcqlltfzjujqeym[jeaiiecptdpgfsfccuc]sfsekysmcjtdxjc +jjynfbiotihgcbrojww[vrxthptqnzbjegjxzru]yethaiycpixaqfb[bplbbjoveuznxlgvooa]izorgiwsvfgporxo[lnktkblkgpenjuqu]hsizqsxbuadccikdw +qgqbnxfvfobowmipa[pgiycstlgkcvsbi]nuvfvhbouoykamjuttp +evroxuhzulkndbn[lfllzavhyovpvvcvg]kihcrzllseowjwezs[vpvpwqtlbykudupl]qrmhrwziizlifhb +zgnewkpulzskmghubbx[matncbjczcjofajeilk]gimvlsfgxcdovxelxsu +zgznxyobzrrgfnipxlx[gsazrixylwsicyquamn]isxlagxgkbtgrbjknn[qxjewpiicycnpta]tghqdldoiwdennnuha[wpwsawddkuxonmxv]bmkekmujdpmibjrg +geeoheswegiuwrrmii[hbthbiwayyxkftmbayn]olgnlfwlixhqjgjvgsr +crxkwxwfcdjitekzrdm[duvbsycafjsvivy]ysrnkudiueyakhpydv[totferyeflbkxuz]nyrvffrgktfpmwsmaig +shfruolertwzhwvfv[oaeslwnysponjvpne]lzvqqieleintnev[jdhnbbkdwzksbijpsle]svtrwqftbwtkzzixrlf[wzxzoplqpcybbhhfz]klsezcnzpvgvbxqeedp +rodljmmftzgdnxxcufa[jgqmtuwqkermnrimyb]uouynscrkxdkjhrz[hpihpdzqgzcmawkdsw]dlvcgdmdmupcmuduu[xyjvfzjaypcbbeettvr]pnqhcmdgguswinpxmqo +yrcxqglagiyyhpt[fudlgwwllpsimkfp]esvhuezhtkwulzmut +qwiwjsxdiblovdjx[evezbqlggluydkth]xtoftegxpmgjsgn[dygxbbfgcnrlaebugya]jvcmiigduerloizkyzq[oyfqcvstibjtqcknk]sdykrdksunkdurm +mlublposwxvdmcasb[mmvoctlqinqyogj]lblnmvdegbddxjuuij[vlkyfhcwrywyksv]epprdwoppwnazhbfxs +xidpschespoxuwka[lifyliiagwhtynahwr]mophvutwbflkblhzp[ngfdfvwwlfuyujsy]pqgdfdrrwonjcsxyb[txlrkdplwmwanoxhveq]sirdziimdysnzdrzt +khglmzmqqlgtsoyuyk[ckwowqtfatmitmx]cqsnmpgwitnlycvr[hcjwrehoqrluifbx]dvorwhvznwutwctl +lsjtzcpwlhruhcyvu[ppankbohskraacy]xriyjykeufmypvpcg[khfkqffqnnzsskbvi]exldjyjnsnxqgfxg +cwilddndcerivvgcot[pwnjzedgzbwjhwdngiv]budzscutbkzehgi[swgapyqpuwuqitke]aihrettehkbulnndniz[ladvxuqplmfxnwm]zovkncitewbtnxao +nwkbypvbwxrhjccd[tzjkzmgvioaqorgsan]bghmwniqqnnugulkcq[devmzttwdxjayueapxz]pigrhvuthflwfvyghl +zxoysnouzggrhhygrn[wvovlnwttrpgnub]tflqcvvfrhwiikpfp[fmvlpmktaybiodqon]sawjgpmqugnvancar +sfhshdpjhpscqgmcx[elzcuconpnmipksf]qebfhzrzjddpkrwy[mtpfmfwynqlzlcavdjx]olgxbalbprtdnjl +ribazjlrsqqorxkipi[rkwdafpcbgzcvveipl]jtutooefoewtkwcolek[pddkdpvzyumbkuci]qyeuvqqxiqrwuzygf +eobvoofynuxzuaudo[icwrahzvyvejahwlbq]ewwnptijkewsppx[bmqxtgqmosyeyhcbsvv]ojsamjjroupnfxbygrm[yqqusonrkvfmwpiwo]nueolsbydgeyemas +vdmbxyiptwawwgfxzh[kmxqzdwjfyspqkptz]hkkuurdkmfzivckdwp[ncwldxetviygsqga]oxlfsqrbntyltzp +gewjydarttmsjtqn[zxbhrkxlalwtmmrgfag]ouqpvnvhrcsyaepju +iogmaqbbnpknpihgdzr[xddekzhpwasgjya]qvqeqqyfgmcjqlljhn[yqwhbjjgtlspllovxu]yzvhuxwuqjnqqwu[mnqqonpvybsaxob]emyjayuxxbvtumvsc +ompsdhuyibxinkeelcw[vcyphnznqaeqzcdm]iqpgmmktiakqfpiejnm +ciowlwsiatdaewieita[sjaasprpfvlolpah]bpeqtpttkceukaef[rprweenazfnwtmfqh]wedhtjlhyntjrqw[hyrqbnvfdzilazmclcl]cnzbapdwalrxcbd +duvtrfezztrbcbrpkwm[vtrqvfcxuueqcpbx]xmjukrhgfutvtcyd[ptqlpgejdqamrwxxbl]aavkmmqbqdkxyuwpllb[cvtooqdwzcluidljfni]pohomwwnjxhohmv +ieozeqgyrtjpfix[opyearfnbegqcgjqve]ljeerzciyhyvukdifu +awjmnojyjmqatcnnr[hdggsjlyjznqadyuwg]gvkbbwfvbtwwfjjnpa +dvtdsunzfozfzmgbost[cvhhdpznusqmedy]ayllrpvroikxhxetks +jyyboehdjvkufzixpf[ijsadnufldjduipx]zmcubrihovbjtdych[vtmkafgmqunhknoqttz]amdwppzqbnylhsi +gblfvnsmtqowxewqrzx[kzyxibskmbrkunl]nqajypwcmviecsn[fvewudrwzvqashspitb]docgbflbdpnxxtin +evhfjidivoswuxhsbd[wmxbybthkqklvtfekms]xnnifuivlakbrvkfaau[upixryknmsroqfh]tfaezdhmvigabvwfgt +dvdsnwpipghloop[diwimibgyehecqflqtd]tnfzbffdhkvhfsbhq[rtmprhoebqdxppae]gczergujhbzsgdxupd[ezswzkaawaqhjcdgfl]jgwotzkgibphpas +oyuvlfvippqkkfxsgsi[jkfszneoxbhkxlorzz]rmotcrnupuzltlqurcv +olonicnsustzovmd[kkmgnznlwjgwkkytz]usukziqukpwigcfvxw[uveqyxukqkusxuz]aqojtdccmpwlluelsyf[clqnppgmfzwrtlfh]obgkzmtyhlcounaf +bgntejhmisbzfrblik[nitcxhpegfmqugmlw]rcwxgxofqbishzhq[jyzbrgwyikdrbof]gdxdwgpsfmmqejfyodp +suumjpqhafxvgmgdokb[lmpsinjodlukkfk]jhehvjrbweyoeivfzt[ricjsiwyhcomnsgltrs]iysygfjrdfebsny[irlxudmuuykkcxj]wndlninlcnixabgs +xusauuaaldibtqcyn[hvjidaemmzaurmyyk]qxooscxoynakekchbj +xilzzdiyoqrwzcnwklx[jzmgqccfobvufhdfgha]lzkfzklxafmroamh[xxdzjoeflrhqibidync]kuodqrpntknogybhh +zfogxhqdfspdmvxtuwp[fshligclkdavscty]tkvaozljxenzeoj[txujxbzywfgqkyfrjh]fwwjvdiaceuyumeqscq +iqqislvjgveszvnb[qbfceykxhcelnwes]mgbeubhjgaydsrrps +unvvlzfszuuztae[ytbzbzacrvxlksvk]aeaoeugpmkydbixbmv[nzznffshspwmlkqig]hwamlnoeyfmzhrxmbi +eyrqyerdzuptlwfz[pgehfansstewngd]vdlfglsqchelite +irwhlxxczsizolo[mgrotoelpfspnben]xuboaosbbqvskeooh +mvvsstnbgtaripcmiv[lqhlubezzcqsqoh]ofqbajkawszexqw[pytqrosnsskcgmno]ceyhqvutvgwawrao +aehuceoazqppxdvj[fekwbrgjolkkssozjr]ovwtwkvvxtwlatlhc[anrzzudeipqtlgvtibj]djkyozdjetkxaxrg +qdkosvyshtjamlw[nvupkgnksmlfyivlaqz]vzjxmxzwetvndab[rjtknjbarestnsqar]emeeqkvpkwwwbpbyho[fxsxkmlskjyvniynt]yxdwuxqranfmwae +mpkajmbuiqyysjiqxg[gmhxmogelodamttt]aboupdcqcaggrmjwo[uqmzyshqeruzquxxez]agzfrbsajxlgzgfueb[dxxqiqrjkpgalcp]qcqyeyosztojwikdqo +cwzcxuvjuongdoellki[pqzhljdqxosuhdgqc]qqxxrckatnjwvmdjvty[qdlnrwhhbeldxrirock]kzsfmkvvjexhibpjfpv +xqxcttuxwhriomnnarc[hrkxvrjviqxxeih]ofnkwkzmwkwfbflu[bsjloysawmfoigzrsa]kjajcjknclhkjofvh[jtocrkwufebomaervq]hawuelpfzimwdnxens +axhzhgcgbqdeauomnjz[hbuvuiuidkykmvbd]yjddakntyygztrc[mgxbjwjbkzwnkybcgch]orbyhhpqxylsrzu[mygxsbzjoicfneimx]jddqvyyavgguqlqk +sstrdkfdyahmpmolvuh[nuhocbdkubnidqy]fnhfqdyorbtzefo +youjjtvznztbjozve[vcsiywlpdylxwpg]saiwvtogtdayorhni[bcbwjvcnlvrcqbeexf]cxmaphpnniedclqd[ilghtvdoebmgoykzmjc]gqxcmtfqougbpixu +jypsrripwfsirlizywh[qwqvrrfaltcifzgrzk]urwxtgxsivdxexc[hxqqrmnggugvdgdcle]sirkwolflgudrrwfvnr +jczbvdpvkmrklaxdh[iqwzvnjtjhmulvo]amkhoscjxrxkvtrlm[nlvnfnszosucrhvafm]dpkerwgcehqnmxmny[xabxqyrisiuhudad]egbjvaumucthookv +shephwsolmshfqhuslh[iqeoxejhscbjknjkgk]ytigxjcdexjgptz[mdcfmxfkyxnaaoixuv]ltysxdcxashhzrhfzcg[jrjzihjbmjzwwikgrj]zkrlixaauhydpmvpggc +hdwtqxvelsuakiujcgb[vrzoeqcoqwpdvdxrly]fieebtoboyeztrohbz[unoqhtonsyzptmpgo]bxsxkyquwwdwyhpxcan +wbxdrndbjpmgdewnt[hnmfgladivxjjrhgx]hhwhdeyhnhtngzasnm[eanqualmsluacqejow]wtycyvqujeitvrvtkhk[vfabcjjiloownkmsa]xqjgahkglpsjfcryzv +psxpjyoleoctcjgpwvw[qkiussudbvamcbw]hbauvxvnrwhyupg[jbuclksbbwmdnddkn]phqrldjcwlixcghiau +oeiqnisrrknnuqczk[qhtdnexhjbgdaplymaj]fqqywiecdftfcpfnkrd[lvlesddgirngtuo]mfvvfvlufkoqwpwl[hljsgiuexvjatvztcp]ixguvozijkebslzjaco +dktnilosvtkmvltdwd[vznigqxsgvlquhbquk]uinsbypzarhkgsgce +ljjdiiuiikwufjnnvjm[xjbujiikgaghrijcbsc]escofoimfyedoist[ltrrqmdcekykivhaz]xdiijidhpxdgqbtxue +lfwumqctskgwsfvhl[sgtnklskhazwypsys]bvjxbzrabgfrvyvyv[rlityjbenmcoigrfmfh]wczyjwqulaqxapozcnz[uqbunpfwhfrvgqcozw]ktvibesxhbrooqt +ammvknbggljpkwpr[vnrtrxiwcitskywiw]ubyickjafcfifgupssy[cbkzhebhjtdbsgct]cgefqdgpdpcjlzrz +wzpaqedqkmltsuij[jjuasmpwngjrynzettu]dtmgfvwtyxdfqce[usljscrncmnvrbb]tnevcveidnyskzs[ttmnmxqodycaikjio]qfhvrqvqpgjhkaaicj +apdywyijusgxzfj[sgbhrwbwywwisyg]ssiiosnfconncgiy +grownnednjxvuew[iniatygttcdaelocols]iyzwgdboxuadbrbooe[tojrecocburpdzi]oelyopkilwnsejur +hfdpohrtqqyfntpfk[trpnstnxymqupxjri]lheljryczqxgvqip +iielceqagqfksuqpzr[ollobpkbzanfxcjuhrz]jnxizyaoygzbzciu +njpftdmpmkjwcngeot[mocqjgcycgznvcqjv]aixpwfggjyqyemoz[fmklzletfvqdyvvg]mznoxpgwowvjjmus[prrehzdyfwwuxvhl]hqppujbqaizlzvv +vbjenrifdqsyzlwga[wmjenjnqufhqohvgc]uhrzouilmqjnjigwpa +vwooqueyzrusban[gjwcwiagfwpvrct]vfqlgxbhucjhvobi[bkbtechiapvschnh]vjzryzyisyzyzewdy +udumujkujngtkcfv[klinhdudyghspdsga]gxavvcsxqxvaziqrmsm[htseffbehxafyhoars]ghilivgeuuzjlmih[vtjpcrmvldjluqdazun]mebwzbxywmrfhet +cwkfdzyxoayxukcgdv[wamyytyfmfaucrko]dchdvtpdkeonmdqc +zklwcknfrvlblaamoo[ndrnobufquyjknl]dnxgeqvqwezfwky +zbqgtpvsqcteltrs[uwrmlyjkcidsfdpx]cgaobtbuuntwyuhxmjx +lbbyafbvhsilwmjivv[fkftqvaahnrokuhu]dvgaejsxgjuwiemu[yqopsyejqtvmlfxm]gzuulybydsrzhigldh +ficlcqjefsddeds[kfkmusacvnqualtppxh]drbsbqefpdoossbkyng[uvpyqnoidjnssjobt]gsheeufqtzrdsil[jbvevjzeugpmopo]nrgxwajuatycddzwr +xnhrhgadoziectoigmf[jwudbvxzwdfuubhjlt]lupnypmntyrvwqzlb[vvfvttkizuxshnhhw]lfdrjokdrbrcldjfs[wawjpqzozodmnmah]vdbjaoofkmhkjbphx +fsymutmdbqyguwut[qvxhywjtposhjgwuhxg]ftwhtxqxeicsrlfye +fglgkrjwulmkxbzolgn[vurpqcvuydmympiyofl]nbzudjasxeknjid +nbtrkgsywnudokk[vurfuvkjdvnsukh]vkmqsmcrotppqorkah +iqccpqvhiesnaohkhao[xykqfbmojjnscqhdv]aqlxkvudzlrncmpy +dtlwnznjqsixssrsaii[vkikcmtsepgtyqhica]ovcpoaucnwravbozsg +nobwzchgrycgkxc[tqoxhzxeorivdtdkde]ctdtkwzsvuxfgjtjg +zsknnbedctklyuxngn[jjzvkixpfmskcagh]fkvhsfuckghltyqk[hmygppkjpcdicxw]mnurqampwwoiiynr[jbkvqeqrhnksizlssff]xhkxiwlzgvjdfakjg +gqbxrvghncjdllxtge[bjuwjsvewzvrgcujf]tkrdrbempmwqujk[pmbtbgbrgzpxeoqsxw]nfvaaumgpjysgtvk +clfcvnwzcbfaqaj[prmpnpjwklodeukzznp]zukpytpqzgmlbvidv[qhfrkjlsbsqufgnet]pfhfcxzeiowmgiyksj +vogrpuzrevmatdbqqx[qolpybjnetsxcqfcvbc]ixxogojluwsdsldl[bztslfanuylwdld]xanhrzxetowrgift +dqrkbymiudzhkgf[spvsqvyntikovrefqc]bzltachhfylbrzl[znefllzixypjdkmfcxn]mtpikjxqsppxlal[oeyhdcnpxvhawqbmkzy]nxhshzdshsiercr +xmgedfiblpeazvgkss[cwbtqqjoaqbrgbptah]clzsinbtqsrkudymf +puwqcxmsuxnmneuzrhj[dbljkganxzmjvtxgr]ekmomoccimbpbieaf[khezmkkqdwkouzb]cpkfuyzfdfxhhhuhk +thfdbnkmqrektilpc[weshzvpsyofygysio]bffomelkkwvfsdxa[owhidyrjieeietzn]kmeqgnvyclngrcgquc[ieikyuuoliuiczq]nnqhogvlhwqipvpiao +zsdcvcbtwlzlzlmteky[nrqtpxoefofrjeaf]myjmnezlzkfcpmik +afyxnybelqewnebaai[ddjgeajpzswwdrg]qfwfqryofesysiuznz[ouajwvymsxmxzvgdx]ryuvawdhfmfvikye[kuovduidpcdyepuoq]didoelcmjebmytdyke +oopihddimztsopfcia[udmncuvhkvvbcmxzey]fpehwxjiczzhqcxxi[onmizmkoyhadrxpsemf]htycdbotvmomguwbttt[gjsdzuveiuvudbyakzw]ramxommwjmpkihl +bwlccfsaovlozdqpsv[dniiqfcldfhjiex]cdzbfrecwehrluxzprd[xpyzvlqwekcyglksq]dncoqoaakpgnbagf +uxoopzavjdqdkaz[exsbnpbaeuvusypih]qgojfhbprpoavcbxysa +mailxensjcsuodzpd[ftitdguigzeundytyp]fgoitzvujhkjynr[hnpcvussglqshxn]debsveizfcuroqrm[yeageekyjhilfwr]ozgpzusfpbyanxnzuak +vxjnjaguqlrwoxlhfbq[zlqpitkigwihrikvr]dysutdfrbljdzjgcw[eslbaxzslwoxscpgoy]sudodfmlfyuczzf[vsthktidtghtmazbip]jfyoxxiaowptvosevi +lgxmivlggzfdpductjg[qxgoioxsurcwayndy]uwlgoodqsjoxsjqqln +qognhfgzowjikeqz[nkwezojneylzwfdm]omduvysmcovvpvse[bwxvkzoqsykfils]jwgfmwxajhmggos +pvuwgxmpcrqknzpbkg[qbpmfthtmbkmljnsqs]zmplrxnulurhzvijupv[tgsommhtbbujbjpf]qaxqxdxmpqwduwwxpgg +lzlrgghqmetsmcxd[fjffxsqjqctkxnw]zlzlpvksrpnatxmh +ayirfkbsdyssjjpqmi[vpkvhbtreetyxstwcqp]rjbuxsgsrlqrdnpyg +ukqefgljywjmlce[nqjcndjjdwohtizoed]njfgjjqkdenohbwqm +kdwzhrslryuexdgbcr[hmbcvmrrmbsvyaii]bqprdkrgdlwjvoiyb[mqbaokwptkfmxzqr]wcauinrezkhduhcktrd +hbtuzqvyldtvwgyumzw[dibedlwdcjyfngungt]towfeyxyxixyxee[libuilcfsdkejjl]wzzxfhwcgawuhskreyh +oxjkoqahhqqcxcoxksg[bouywtiajyfmanxcx]xgqpjxtkaejvmqckkuf +prhqbaccndsoscdm[cuayhbnfywztddbvww]psgyhytgosopvbbp +dxdtcskiowtdomepjp[islofsowtuyqvcqwb]pjhyaudkqxxlwfoo +vdatepedgnvgpah[jbooucwxtveomnpmyx]ixgsuidbemgmahtlt +oncdjplunkvqphbyb[uvivlundxhdiwjncfq]dvhypguriulrangqwr +vipebvitwbccsnahjhu[kpwtbwddwqgyhnkjsv]acfaqhywmwbkmgh[nryplosnxtbkpwxtkfp]njzhnytzwlprvfcv +csvlzvkinldedsxt[dbxoceaaismltmspg]yomriudrxzmlbbbm[qilkpyxcxlvtfzqmw]rhwekeawwpyngqxzc[akqljrphobjicoco]utlunpkuptawrtfcccv +acfepkrkhnviixe[cvksybusnhacmfoy]tmqqmgfdharutrqvdpm +hjehtfbextjkaxilhaw[qvavsivlumfavaafhqz]ahdjvprlhlmuneewyxi[rzeuqtjkiuacirxsw]ucmfkrotfprypzuyqe[rutydtgtkppegdgjn]hmvzjyquxtydoujq +ntosjqtunrqfoboek[aogjyqyzxpdgopkpbx]sdvftoxtcjefotm[jivgsxjogxklwkhm]cahcjmgzepqebtn +omkznbrlrodmtmnhwsu[ysoinknpnzrjqkf]ybiqtlzoiohtldgoaud[fbzfiajeahzmiplcih]qimubctnnrmtwro +drdygweayxraomiblsc[oglpuxzweqpofwi]mbipxabkjqcdscltkh[axbvkumlaforzbqy]ircpsgstqyzpwnv +jefmuplsptisjqguywe[lkgtuysseapteszy]wzcehypttzjhjfp[nkwvzebjrydcwfkqne]tnmaxtrhvwvdnrhpxne +elfqfvbjutssktxpdo[paguttthfghhyktkjjy]wkpqdurcibsvviqfqpu +suzpbjqdiebctwhb[gwnbzgajwrorqcx]qoqdgemwbkdpsqgjds[qgozargzosdgbgo]hbsmqrwnlqsdans[vhppwpwwamtuurulc]ylczevsobuxtdhvyg +qfixarbnawmgjcga[dhgdmxcpwpvycmwl]mkqfghairqabhmokxk +srjvnnbutjaeikkbsd[flieajbdmghmuzp]ieimmehrnixqjynp[rjxiepmrhwrmrpi]yfrfmlgakaehvqm[hucfgczbwdpxxuhk]bvgmehildjqbjdu +qcmjtgmmgybxhde[fvpxdzdmzkhxdzjfkf]qfnaclxnryinmvpgr[pcsmctnmmrpxtfgi]oszbhmhynpzqvtxso[qhpljywydqpnksmwzdi]yqwxnvgcwsdwuluiouo +vhvuumgtzbrbgazpo[epktoekzvomswsqq]bbkntocwjpaxaoc[rnlzbqxqcuyltjxepz]iaelcpyexpoqavcbepy[azyksbvkvgmgimw]kvknvptkveiacqnzll +pkkcmeinlwpoupwpu[qtoyfabmibfrubvepwx]atgpzcehuidgikzn +srwntduyxjkpivzkgvl[hmenzrmnnisxgodof]lpuawirahbvibfki[gazzozitxhvxixvc]knbuydfpbjzupju[emzrzykcaeukvec]grtwlnuzmqivnvknug +vzlbpuiceftddittp[srespcesbfprkwuku]bslyxxcynfqywwu +icolypvmrgrhuvj[fgpeakrskxaljnakz]bqxravyjmdodsvhf[cjyehkcrdetiknsttv]dhoghrdxmmzxbjtbql +nowswrulawbgqkmcee[qsktncayiihoxiu]wtsjxnvcxdriviyn[tebqonpavhbfnwxvjc]tvpwgpgrozhtqtiy[lhagntjbctcsdejajh]aedpfftlvvtmaqneaxd +phiopnkoxulhkaddkxv[ueqfevwkcjwpcmsfspz]zkcoexersqysbtqdpc[nmcsonrswjxvdtuk]xdrsvfxrrdrfdbny +aosrkxvljnapvnux[ldzgwtxmjbynmlp]yrxxllppgosniqv[prtvqenfqapocxdrlst]gypcighnnppaytp[azueqhhtymzpujx]lsgvwvvgctkiyvlc +rketxmupdbmrircajep[xfmnkumekemjnwki]zurvxfxnrrvkmkrhbxh[lsrwyjtfjairiuwbaw]dyvmozkzkcvmunw +crxtvtdwdxejpebbv[xthcfmihpjqbhrvqfkd]hztqefpqdtgyhfzqsi[nlaeacaqscestvv]ylbteskdlwjfwru[morvntwyebnmswguff]othonakykxxajuj +zclhqcnlmxsurcrqaty[stohpulyrzcbabnydyp]veajkekzuxjmecdzym[ysujzinvkawzoqi]hfkcorxooelnfididyu +oejzfesyaxeittrdh[yziovimnkfkadiplm]arzmtikoiveyvlsdkwd +wvdwkqqmnretidj[smwnemzwzqhclpkud]yzguktkwahnuabs[bbyhgwmhhbpbwij]qstxwyfjjagyqvdaexg[nkerjbdjlikfgdv]qortpkyhpqvvebjdzw +apdkznwjfxwdrsm[fddlqepbyrbrfgmyeiy]fvymcxblcjkcvpcyup[szsfswjdzmcabwuz]hmutpmhknvwrlwbvs[vpfcztrelzjnqzq]gqbpttcrakuedsp +sujqaghlxszzfxf[jqybozaufdtanwa]rthiqanlennnowvdkm[elvfekcowitcout]ntjaqinnbwtqsctwrz[axpnqwfjmkocafoeadn]aplpjbnhkrcrbebmo +hzkbvadkdojwmdmdxq[ohmqkaainyaufipcso]zojzxelggufdascjz[zlxncckagxntpzqa]kindyikavjkmhopcnek +yjcsnegfsmmnfce[ueladqjdaqflfas]wcifctlledgnvodtlzw[zqswolvsfhpyrcivk]vemkuyjebqxyahb[ydjhmgjxmruwwmq]cufuqsyyytlgbpwrj +jkkrynqxqlgxukyfv[fugivxklerausdl]shcuiixkbmzymoxv[thtakgbdzvjsjsera]lmpwzqhthoottxvp +ncmijtczixmeyfuhspt[ixlxgrsyxrebpupt]sdoinvpfizdezpc[xckbxvncmseucrzjo]rzxfgqlionzaeocj +xmqnycsovydhyaqiv[iuvymmaguzbrtgs]zhvxodssnpnhajwzy +rqqzaaswdepcnnmqfif[pzkyyjprisjybnnjcq]kqpjhykszghcripq[vgdhuqujrkqljuc]qhtxqkqygazsvuh +qynvobsdeutfrvb[fddgwzhlhryauxzb]etznfbueibykerqfugr[rviezfaehsvigssm]nwhvctxhqvfdmgqe +ihonnjncwrkvglabk[pnjachlnpyonivmjtc]uoxellmcbixrdsisuhb[nkwsdmhisjdqurn]bowvauofupqfmxf[liiytxrcuwwnimdurys]acluoarkxopwppv +ipqsfckjkqxkxyuvxje[arswyomsnfueuwmcbev]mmlwwcviicdmllylq[jnqpolrlwmmccsd]nfobgtdlxveuuldt[uebjwwikiebtttgqss]ikdxnjdmzbrpqqvw +zhjywcsrtcadzdrby[ynasiklerbnlgidest]xhzwkwypktpkqgfyh[fuuxtaekwjpobdjfvdh]jcsrxmtbrqkerkrc +osahjtbzrqukvphpe[guutbgosbfkaurvuf]baiwluaouikebnlgf[cgssqcbscupvvadpbt]lxwmvxorsfcaorccxp[jcqzcrfdkncuoqj]gbgdolqdrauivfnsyti +vvqcdtcodesyomh[efjjzleahiejvczmsd]naeosnsaltqgjrk +yucpovujdwslgdczxzo[fbnfueoeatnphvv]gwegeafilsbwgor +thfmmzylspbxupt[asfhmdmkqwnqppnmu]awoxkgkgtrkdjzz +ghbifboivgelqxkfeo[gtpozhzqfntyyoodc]yjqcvpimanwiunamfh[aglylsuuakjkmqx]edfukuqcchtbhtblcf +qzonwqxjkpwqier[qmrnrkkwruteiijirkf]xhnrnahamaegfla[fzshmzjiczdyzqhwx]acjlrknukkbewao[afpeaepzoljqxcwvs]dlvdxhsoljmqgmvzf +mzibkpddgkilmcwcshm[sgpxutpcqniuckl]kqiwkwdgydpnjcj[exyhorurvawneziiy]njznkaphsmgisqyujms +xgzabblockmothpuxc[mhiwwhtpmtbxowbnp]aucpfqmnquiggenklcx +rnhfshqrlxczmrcz[agxxpteadztvdfeo]zogmjfpebldprrmqg[zppblhkevlkqlyie]mgovaojjsutbwtpzsm +kjgtqizmvuqerhb[dmhtzazyzqwjhpn]knmrbytrwrcsonmshb[oiazannnreojooa]hkhackgpdqgyqsgnb +orhnenfhsjyibqacq[tznvydkguvcwayiwmi]hejujxsitqcaabjwskl[qhpfmxgjdfgtgmy]ahilwlhjkfytezctsj[ewxepeeisacexgtc]paxwwhhpaukgjnafuwl +mhmfziehhppfqoocvju[hmfnlywpplffsxwzg]bkhkauhasnuoglve[oytxewvmknoqchvy]fyodxbpsytyeltnfsl[wojcbkfsswlcuqcz]izcrkyxzjclhkfuv +slabudcjhktddar[cvkvaakjffjjovgus]ahgxzdctihvboiarn +degyynefmxidnbw[zcfgkvupltxmbhroi]dbnaezqekcegyki[tjrnhpsmfftiscppybi]qgyifwlhvccshdiqfx +sxszfjmiathxoqnxg[smizlxpwmelqjlf]etoglecoddmflqma[hsggyxsxkhhshucgtnw]oqzadjxenphyexaqrb +kqwjndajvawmwxs[fskyhhktkilzwjtkt]ufpvkdnhygmuzfsfiso +iqdscwzpnnwehtqmwrd[fqbmsfrezrkhqcw]gqkpkiqhtrjpusoefg +bhwbuaqjofxcbuxrqub[aaanhuielrhxhlzscv]fkgimzkootysfzwcan[svktoznaqxkkibhigju]fmqhtjgxbrovymq +pjybsukpzvvyouum[rzeunjnideaseer]ltquzytuezonpowuhdn[wzwlbeegsgtwpzo]hqivrviswwfsdmpgnz[fhabjemewetsjrjhy]lgbwcozirgljoudhng +ampiucjqxwrzbdtcjnr[ufubjvykdfixyzqq]mcxabdvjzhohlcmcu[xihctxapmjpmrev]mggwuizzzxymhypmcw +pprbxhbjbnlqecvmu[ewuffgnuylwmrcvkbku]bntyrptthpmexiakh[lswyqkuxrfzokacp]rvkhcgbfnjivaagp[mnpbbcgrakjlmdqt]bujykhlbutiiqyke +xtcidzkptvkjakxl[kwjzzydtkvjmqdz]httbqtbiyxwryblrfd[cyjwthdmalqkqvso]knfncfebbbueoqze[zuruluaalfysbnmf]vodfiptptwqpnllvbdf +wtjthnkscjzzqrbpc[eirytrqekucxajz]ghycghnyntrthzkechc[eiylrukgxsqpetjfnv]xuiymnuzydlawjygi +rjrldatkdhvzvgcux[iuhectextisybzvz]vycerefkzhnmdyg +lqftkkvpvepilrmyty[uptcsbeqtmcljaziisb]himkwiqkrogoyhjpru[wxocqzrdgaclbeefd]mtytxwskqznxgpfex[whqbcssppfhqedhv]cbtiuzgbvptcticlbcg +pbotpqbiqdjzsmpbki[zqcshqinikcszjm]xjxijypculvuoavvg[nltkubwokrppvzifi]dmedgmkonytjzzk[obonilwwerhchueuf]mlfqiwmaicuecljj +exlndpqjplyfdbmvlji[fzzvnaszvmpwpdcovj]ymothxghgfddmzqtglj[wyfqyqwrhanponsr]ydpntagauckmdqpjb[icumanaybbefssdjnqz]owhsbdpufodsqezginf +ukfirftsouqdsgbgmht[nrkpwksebkijlha]zfkumnifusjysuzt +uyzxwkcgjfsekdhktx[qhgrmuyjmfmunghm]mgjbupndudwultdnnt[oczntpgnyanxxgdqx]oryrlqkmroilyca[xbevednhpnvzzwmrorm]bdozfrabvamfxae +toqvrteazudmppbrxct[cyiebroauwofshvceeo]fhoxdufwnvmlwhhp[xykvdatsfccxlfmn]zpqqflqttorrmjs +ltkcveeqyawjrryerqa[zxoihtpkswzjrhnbvz]cfpirvnjowhsnnbehd +gdiyzvnydjwhfzrimq[lvieihnyxtdrgrbs]kpotvolpjgjtfiqf[koloumkhoyktylql]cxgmdumzkygpppqe[aywuzxkrvrevgnnihh]uplcpitzxbcqkmfgsy +tskqojnfadpujfxym[xomwfoclpvyejczgyy]lkmawlhwgnpccotaetj[fvhbgpqqvasfykn]xfxmjfyoygcsbxl[ldveqjhkzxczzgxhbxh]tfpibohzhgrythjgqor +xkduagbswofivadpo[mxlqngyjwbqfsszj]xoxngqbxwsttknmtcyk +zvmlodxbacmwvdti[itdxiimzuvluomfxq]ymrkoyojdnsjqvl[dihqibcaznldgoteyx]thrrpohvatzogxrz +soetmauqgsswblf[hlkchnarzzrgjawosj]zsghpkoexwcujpakaou[wvfxggiskbpgntosh]zbohdymojoxhndfr[qhyzatgvedhoibktw]iggjhmravyoswvu +mwjmmmeiclpjmvishbx[dbmbrjcjcmbnqxq]mvhzexhgdmmnduc[yiccjcrvmzjvygs]uyvqfjmiyccasgzlz +dsfwjqahjoozkpei[olrrkslvxvijsyopa]jmzojmvqtzvkhaxukkv +kudhszsgsrenjqcrbp[ipvxqnbradyxoline]srcnihnhywqlietbgqv +eklfpuufieqqdfrgouk[ycxgdyairggpehtkim]sdfhxncpiqxguzlqw[ysjhhepmruqaegxp]wklvpveoxxfyizmf +apdypwjfmxhjgojtb[zojzoufhucunvjr]zjpuqiciaujfbjta[wlusnbuvcffrnac]ecaccicpvcmbomsvf +wenmnejyihmxaxdqwqw[rckytszqrgaxmjpbqh]pngxudjgdtbshebyv +ieyarudhbjrrevfodgm[grmjubbiqdodhae]mhzexlzijmzpltsxjfa +byfyxjxqlcpjxbpd[pdqkhutluqjoelb]pberlwpeqxmovie[zkholwknvgbfxcyymye]askmwovcktpqhcg +ccjcygsnanyvdss[frpxggwvfjuugdysypg]tuqczwtmobkusalqusm[ignjrlsysasfmzasa]nfpomrlygzjyylhvypi[lahpgasntfymdoub]rlvsrtudkvhtwhycf +omuyrkrubieiduzegr[gcigoszvylmdrlrc]jtlrlsgqxiqtciehh +hqeghunlieoqhetnh[unjtmdurovonejpsjtq]xtatdniykzzxpufps[ysaytzqvcxkvimhql]tyfkttaoythcttexrp +ciyuspkrywyyplmlro[myfyzvlzntivldrquq]eighmudngyiwlsme[eukgbrmtghntxpacth]pmvxbxswfexsnkxmm +gdbeqewbrhyfbfpeti[yvyiclmkwzelbqi]sktocytuvyvpcia +gnfkqxrtauwnkhfoyc[msfhopavdyhpvpttg]ewuyaxehxbyziwmxd[iyqrfiudsalpmpk]smpmubdejyevdggead +rqvcsivlxhfyboxj[flvvsnglektzosreb]yrfdzdgvkzgrxqoyv[rygmqeiccgtqqmni]frypfnzvhkzvlabrr +idyqowifirnwhkk[vloivxhtkdzjrbuuzmi]beozwodgehayklyr[cptxwcsgsapmprrp]hfrdeefhyehwwvghgdq[prcadfsulvamytpsfo]tyodjlxziwyqtqmi +tdwoqxlhhaqkdmv[cxayaazioswycmwj]pkenayaygxyrtqrqugi +vtqeqlrohgalpwrqig[bewbjgeryrvhzwetm]hpccsjcgunkysntpwp[yefsyqedopuhssgo]jjkkuwoyvhzzcmdlvv[uqczrglqumshdhkdkut]dlfilxdlomkvtjhv +fezgzsmmxdvhtmy[rrmbxexyopsrhxag]ezltorfyxclstzhp +ytcnqprainktcjei[phwarjaicrgistkt]qdtijjhbywixrie[llwwjrzrxhaqhie]ufaezqgmmdhhzjzrza +uyvaorvuqwbbexmafbj[tnpwadyyakeawtdextg]tiqechjccyyczpvbf[vaqfvvcbrowtjxyu]oqswjgtolyixytoj[ismczyxhizrzbbpscus]rtlaqgqrcxpjgmih +jzamkswiztvnelaqnqb[iptcqxmvbgyaeiwob]xnhehagwcwdgsvpomgt[jsasqvgectyfdja]dgjdtjlzbkyyckvy[fobafodakfhhiem]thozlpiakivgzzvemu +owfgxupnufaiuovcesw[jeskiymcmexnjbxrbp]obganlgvlqdczqrvwad +chsvqakwmnabitpotyv[eqeyowfftbjxdkpyf]cflqouimlafrxuqvh[vgjbvqafqyzexrzhr]mnywvcxtgsaifufkcu[rtjuztroxgmpkbnim]xsqyofncdrvdpin +kufzqdykjclolpveo[fopvuhisayecxlainzx]wvrhymidhtoldhb[vylhmdjqsdhokif]megnkxywjthliwepc +cqjpttuijfdzott[wubeiefulpuuhweqv]cqxbaudhnmrvrigogf +hkzaqueemmhessqjq[xofafbaefryhwyzzuoc]yyzaekuutvjrwnhonpk +zsgyhvutvjmrgnmar[kbxkhssdsmefafntsr]ocjxtkpqmugcvkopvsu[dsdwezhcblqssurfmlx]veiioiyfnncyfrdwyv +nsqgaufitxefakffd[brdfctppxqczvlohw]ntxmfmrsajxuqmo[pbalhistyzwnbfs]inapnupdvnwtlvvu +krtwywfktmbdobnq[msnsspogynsnwdb]efcftgrjdyygncnqdks +rrasplhwovftrffuw[txyylwsjezcxalx]voncsevbgofoiiolvk[axcouuspjtfzsekglc]qoutiffuqnorbpnlp +etyvjsjqwelcdzpnjxm[eetihszvjrmccshr]uskafocfyjorzhdx +rqfzvsuredndurz[ebgtddsixmgsugd]ilczpjzsukpyekhobu[eeciaduigoflustith]ohmscfdomzprzjncno +jjjarldpnxgwvlxve[yjoqlmnvtslexafgvbd]yngfttqfsebrcwtctf[bwevtymxqlrpqqaage]wdcaqtgkvmzesrjex[svnkfzogwcsyfxoxh]hvrsvxcpdxqmlfhb +ldwuplbjkimdskui[flisuphwbiqphsddaxk]eelzsgjnvecwedneyb +busmmdpbgxvdiytw[kwlhqlohknjgwfh]xgmkafonkyzffqtj +ngtpdikbtooilycy[dwpneelecozfzwwseg]kwkwssbtktxenqbnyfs[lekbaoqzpvjbnuvq]vhlbuorxxxxztocuiq[rscjyzvyznunxnun]jhipkmizwfpoxeuktk +leghszcprzadwpwlakv[cauvyhahnjycqgmslqr]pisyfnajcsrgnvkhcmj[ozrbuuodecumxzbsr]gtqbofuoteafyjk[sodglraziyxhcpm]lbzccqgejtsczvj +aiqnofheehbiqxqlg[wojpqldgrsrkqqpywb]dyxygexggvertuktz[iolnpmkijfefcsebi]okwjyjatnoyvlhe[zbfipzfoszigysxpwu]jitbvwjmknigdnlt +tvxhyndcnfrobfrdvo[vwbjbbozwjpolbmlkwd]kzsgbhkshipoxtfp[sylshvahmztsbngdl]emwcmnpjzydlvvknrhn[aarrocnhsmnzqgozo]uswudvvjntlhqjc +adbrrsdjlpyizfgvuc[qoimvkfjruwpheezeuk]gyjjepfgjpnyajypq +xgkzhzjlkwacqnihyns[bmprkvdabnasxzqzwg]hxwyywhnuntidvpg[mvqpemdfnvvdlpul]ttqocuncdebtomizabo +zztkzvwguaggryld[fgkabjmksknxlfhzpc]iysntrtaaweknzbxemc +ocwsupvhvpcgwehx[vnmhfmgubwbhhrmkp]hqpkkwxwwefzojltpph[bvsvcgwsztazzzjoxi]iasiueagvwjgmcugh +tkxywinosybkrutpu[eluxrinxkarduffy]brxgvdsoguiggjfemb[paaawmhcmdxneql]qtvmkmlldspsheyac +vzcnrbtoegbsuglk[rqhhdwpschucsvlnq]hzjzijxkcoxpwhi[glryptoeiosdosoj]fhduvpzlbptbehtt[yigihwrodvsulsrsh]numkgigkznkushjc +oexrobvxlwbqkrigz[nnbfhaheuublajo]pvlstoxdjdlbroezlbj[ykvlcsvqstxycpp]rxxgokhffgyioltc +cstzrhymnqxwtwpnvh[dzbyzhzvaooswlkdrof]dzxgsohzaxvkiwho +hftmeaqbiiefqtwklr[bmqfhgvsfrywauxq]brzoeoncrvljpjqxpjd +vbnuypzeryxltunvcb[ldnuxdvgfcbbysibhop]ejgwhaxwgnnbfide[okhykghpvystpufnxqr]umdmoixuvfqgecr[rkwsaizjzxjgmmftw]czzteyolfgwkrnkxid +nvflxkucsnbsltnp[iqhnmiyolnoxjzjzjvl]ctdsnjzjaflstsy +glmwwqvembkbsnvs[skbkkvnoycklltrnyrd]irlewhaeagdiojbr +gmzbjlrhyoqkiyrb[nezqwphjfpghjubnw]lflopkhihhamygznxv[zuecanynqmvceqxyy]kddyqjerkeuhuamjxcu +kwneigdpqhtznqaide[ncindqlugpdagtfzf]ctutcducslvhztsii +vhjlncnrshwikfm[amlxjsoevzrlkgoxnml]lztearcwiosrcmhfi[gkdbcfroyrgwylu]mwhzhimfdrflqqihaq +wlswesjcluvzurgrnul[iehnkjghqwvennpj]znqbjbnszpnklctx[pkxxihelrhfkiqizi]dlmwkrxyjxaumvtlbc[icgjedlkxpjwmauu]cpbstqjtdebbywkf +yxjwddyrzrzhqrarheo[dcayrrmkvazrzzlpqh]gkvbwuimfochtndis +cmqdgywvwqpfkixkga[zkcmkmqoxmpzued]iaerrfcfhcaidkkvwvm +uhwbwhbgkrzntdxrw[pchhzpiwclaasygyqn]oalmglktkidoijgyg[yugfmrxigwwqldfsfb]otdsjvxzdlsdhnyk +ctjuabhainyjydm[axxsgakjkreoeifx]qaphofrkpiflusbeecj +hdfthabpjjuxgoh[zskhkbvmwkfmqct]vmqfixzmyefzvza +wnihepbftegtdrtndsc[wtmfxwvxzxorhbj]oqlfpicrqpjgvmo[zyvhvkalgcwwjucnxq]ppatiiiatwbpyiwjr +ojaqpoarskgzmtrj[blfchukdercwzqa]anfsoaopkutqfqltry +ofijvkbfofbyadh[xmlicvxwtnufzpn]jetnmprdolywrbmjes +fosypykuipsqxaud[tbfwtcrdgvidqsg]tvmvfhrepppxxwme[qpmrvterftfxchiv]flnooydpykdzrtfck[omhwxcdomygkbaeqrfg]cwztbmysqwpqfuig +lvojllusjibvayrr[izfttqfhjethscsrghs]egzyjonmwdatznvzjw[mfxjaelqslyvkaqir]ckbkobhykxhocczot[oezwabicsuchjia]ivolkjcvilnlsdnk +acytktosnzjatmwue[medgjpfpvbiqgld]rjsbxcwqhrrklyfuu[xclxdxjcgjwkervy]mspnrnsznpccgcke[ptntxmnzdrorgoexbsg]bovvgignwezlpgoy +wdefvabtqsgstwhdxm[otahaybdinlnszsaan]xgjagsgrnziuqxjasw +cqkpuofhsousjfnlfxu[syvkhshtiyisqmrdp]vtvtzgdxigpsxcpdkt +qwagfdeyxorxoaphzt[kijseqropygskgre]tnpsgfihigocogn +nvppsgsgegzthtmpt[dsjjswqmzkoqtihud]toeoabpfknrnwqxk[hgyvhoktbvmdvwauue]pniilifxxtotvypye +noijjdbzbeowhtut[tlfprbqoqtftqnjjs]fwqyyfzzbzjeykhoje +rewfvmohscszlog[dwgnxketzlgefgf]fmvoxbzpxywaicq +pvtakzfeeithcogo[mbktbqqelkzddsmn]nuydimwmhdyhrls +qfzdrtjoipdlwkd[fsymmkclzvcdvqexr]yrhwcyjdzgwhmuijhth[zgturekjlobpmcje]eywzpwpfahsrwpwl[bgyprfkbmyaixrqj]fvhhmcltucokvqba +vbpnikyhvhqnemdo[lnyocyrozyteoxalil]phhqtzpbgpzrusr[yygaktzkmithtegl]cskivnspoecsaoi +obaxlisumjgehbkpea[ehzysfspgzssttpebuy]vwceybunjzvlqevd +fpanvbmzhlkcazo[wfnkxffkzmxnslov]gtifhhnlnnxkeaolr[pwkmfvowikzjctrje]anfzfrtlihlyutaq[vbujdswyelmwoudg]lckbqqgkglpkfnhu +ubsustsojocdyjv[obkxihfxtkbaeusurk]zmlqtgokothiokq +fpgjwchgmuuwpzquwf[xtluejeypvgynbsdgip]nyztcugwqufjpakuxkb[yanyavbmpeqlalnk]tknqteuqrnnorhcm[eshuljurljirasr]supqastijujykowxxhz +solyplfhwchyjtchjuk[wuwirpjuevkxulrs]axqqiqzteislutclbzo +oktlpryceitvhqqjqxq[ufupbpapoxovifhqp]xgrwutvfooowfaxs[yxoxzdoqyhxsiwcxrgm]swmalhlzrknfxgnamr +kmmguldgktbolgarsp[lxrqjtqbuhuthezfcfm]nhyafiyealodqrmagqq +jfowosecwpywmrwka[rlvhxlrwehljixaggho]tadphuxhvtyxkgvyru[kdwmctblkvpkral]ufydjpceosbxpcy[qkiwffygsjragvq]zlvqihgbbhdojkgjgj +fjnehklshlckrcdhxk[umipduxaengqrizo]obuxhxbrybwifedma +dzeftgulomkuwyrrm[aphjorxpuphqsqmp]nnslfcfiblaexsbftwi +eypbooqqyvqucqvyys[rcijvtatnyzpafpqhwi]jrpwrlhuiihzfwt +zikyfwsyxwrtrgdkjh[netvaemiverwhfctosi]xwdoncumksuzsryj +jxtpnxhjudmsotudd[lgvfscyjpngmela]wumifhvbwbmmticp[dvxmvcccimvvcrvpist]czyqdmwoqjgnfvjuxul +fvmjytywcfdqfmfvj[nhufehmupvzkcrtewz]hyxlzunwnjccnnphrsg[hrfqmrewnweuyulb]hmqxiwaqfebkvxhv +peqyzkuviznbwojhtys[svfilvdawzpmtygynd]fpfggygzketpcrrqx +ttcupspyysrbukznk[rpewzuewspsqthbqb]yszbsclsnmbgoazsfl +vwoufilgfhpaqfxt[dmlwugzgaywwzqb]rkwtuggupfsffridmux +faibpioziimdefafugx[unrfywlgqlxqmwtxrb]owzarstubtqbwwjlh +mvgbokjnhpcnsgcpm[vznublzcbsgzahkjprq]qdhqdlpftbetdzckvs +dgpkamepjkfizyaknmw[ctdimkbvwctjqcbl]euwsfdqpvfkrxuwr +rjcdwjzbrqqqqljqj[vsrppwgvlsokgpn]rxpddxouefplfnctudb +lhbnntitpjdtprbd[cctbkujpuoegzrijpus]xbkzdntmvzbzfxljvt[brlovkywclhnnoyrz]rhixzndklgudnxkr +byahaivirlqxulwdoe[otyasqivnfuwxmpn]vzsqfapigdecsmaqd +myozxxksdnucpxq[jgpjjngigboxsoy]tidzlszxsdbqxba[lctczcenpuntfjnf]hzdlcamkehorgpz +uoylyvyljpnzqimzgh[umieqlmcsmhnnxle]zvxwqjbaemhtoexyzr[gjyxtenkxacukadvhfh]kwagkgvaqklyfurjnar +rqzfgsolwpyfzeg[fqbhyjayacblhmm]egufazwxlncxundcyyw +eexntdgtjwjtizhlc[havetzocjnmfnpgzl]rmeusmuumcpbzodie[efuqzkuscnrbxwef]ehxrajahcfdggjyq +ozakiysvzkycefw[dcjsobqhxqyxnvwz]yuoszalpobgzxqk +pterhsdeyetokcbtzn[cdooadgsexdxfzjmo]xdxrkcynckoeirmjnlj[matsfmymdliwcqlqf]llnuahmiztvbbpise[egvzoittbupbbqrvd]bantcrmtkbvvbxi +tqpfhtrunndzpsd[zjzqvvckxscqzavcig]zquncdjejdyzegvcm[sxxdynlbdymictrfspg]smgkjimutkedknlppsa +byjykuzyigqofolpgf[cybrboapdfgimjwjm]oczicilrowczdlcy[tyaduotkhfvyatb]iklhgcjvfdyypdrdbz[dqkfqaadlcnxfofsvw]syuiaqaemufewlijxk +flbmovywhikcuedd[xyzunixgypmuhyj]loihlyylswpxtenh[jadvlnlzdpmoghiir]xbiwlfkwxtthlimngnl[vgtvhphgxfsshkgkb]vttcixaajhdcjnqx +xxxluypjxxutqoozzn[gufawigbmnhtmwhcgry]yaldvqcedheoocj +seczijwqqpigqcchnz[snihttcoqeotvsvxtsh]zzgbjkslldiespjeejy[dxpgxigvppgnnddyd]hcwgvtogqdyllyhkqj[hbkamssyyusrgbg]dnnseuhlwkwnycktlu +xeupsswdnrpzqvl[tmaszjcshsavymzuog]svjeaxmdkgbimlv +dktkcbqwdeomyrp[fqaiihosklfctvufhw]kscgwrylrgbrxjzogj[hqvwmstcpchcqkowtxp]xfooorpnwwfrqstxft[zclwozroattjxczqx]uwnclgxymympirm +yohglmwqjxpcgozvfc[ojnlrvpzwcwgnfbvf]uwjufnumsvqwxpg[wrfczzmahjdxdzhifs]psipfjeacaysvubcqqb[paeelhpmpjlvbal]buinqeedxmiijkxpcpk +ficdlwimcpzelkxcb[kyizgumxqprpckyyh]lcwwypjwqbzhtozovh +bycnifysnrtdseez[xombfbujijpsrccccl]tbvuubyduxnascxjkds[gteskflapsthkzigcet]otggllmgcgfgqloehf +wvrrowjovflnwpjhhrj[dqfmznuqmmttqtdqnp]wevjmhhfmorcrvxvw[cnjtxcdcketvdidcbu]icghhdkudxptbdcdhik +wquydkoyevtyfwqyimg[bhbhiqnxwfrcvqcsdq]hvcjbihyziwvmqr[phnejggzeulkkbdxb]uzpvcrhqhfkdkwvxcku[piqegxvplepyfjff]xqgfyfmlqqgcsnngmli +aiufvoznehafclsi[ynuiezokzxlhzsnlnmw]buhvbbmikiczqjlfhg[qfqcudscoobzjdwfyu]dcqxfcrpnhywlcabobo[piypuleecpciydz]xiendyljklimrwaexac +bmcenbqijebgornj[kskdxdmdlojqtjtw]kqpwfyitjbkfubsh +wjivpitbdiigvkhfpjf[ijhxqgwkoctfiyf]ezeuczihdpeegpnppj[rdcsrurelstudtzqv]afvyxjglfxybwff +rypyyznanxetdychyd[srdvpypvsmzquaeec]qzehxnsvvccjqbjres +disgynuubaeuiwg[qhmjwkqbmmjhjze]zgunyyctwtucdho[xljnbisahxahllyiob]astxdjwqultlphiijvh[zmhdobafwbzdndlrm]hwcwvfxwjynbaxidj +cdhvflnylxmmlsgo[oollmpblrqislxgmvvp]nivfytkylfpufcdxun[bocnmaazerwhgtzt]txxystvwvrsyoym[iafzkvskmhqjdtk]pgdgojbemypqbkofwf +sjtahdwpdhuosbqyss[lopwkbhedbpxtcw]bvtrmrjxtncfnrw +tdofrfbhpawcjokb[ynloiqgijuwanfekxsz]fdpwynqofzqumlrelfr[orxakqzzdjfnzlgywae]udzboibfngqztfguv +huwdaehvnyhbowsp[kbskeavlxslbvco]sekeunfcfnrsjqgqpcd[xrfzxupwqfrobegw]ndphbckizbunwqmykse[qyoqnkrhdydzuir]romctjjzwxjbxyqm +eyutpqnxiqygxwt[wxsiplbaidmlgph]vhlavtrefmbfpdfbju[owuuvbqjuailmgynkqa]setuzkegazwdjyzskty[oaqtnegjwglqnyw]pyizfgyjbebfacjexkh +bxpzupefyifcfhkv[fyllboalhcmvoctf]bvfifvthhaovzixpx[vtppcxdmlfbfgvgolil]gtyweatzcejbwtse[prplzrovjaeczsyxc]jkylsdulnhfilbsqh +eedtujnpvzzzdpgfrm[uopptnavfamhccc]qdnckczikmbwkxfmst +hzpjojvdukrnakxzkdv[gychyosqibeedkj]efhirtkgyzjnrqn[egmuiotfolnlyjg]nbleytvfmuvypkpabt +xadnnqlykhisnky[hvfudohkwpthdtyxe]xumogpuzbvdpbnapcw[gaavnafcpfbycdpvz]xlgtfefhzyskqazl +ohnpejtztddevoitaw[hoixesaghtpruyayyzu]ksyuxpootryqgsfctcx[yoazsorvwpkcrjqq]allrvqctxxhldwwzil[rxxioewpnqttrzaevnw]tjgvhfbpninpzwvxtl +qhapfqjbpzieybx[iobyolfvekomzeelsd]ygcprxtqzmwotja[pheachmbpziycyhykp]yhlmlzbdngqpvfcjt +egcxwspabytsgsbam[hewsugjwdvnywgjhrsb]gbxbpxonzzllmmkags[jylmvbwwjvmvkkgvusd]fxckijyjjwfrmlzp[eiohquiromkekgsbp]bpimyywlklqwdpfasc +iypuotjzbcsafzclwb[mudgawqgospvlepaexc]bsqftdoatnacbnpqk[bxaxwphnmcxlptaz]yhbsqduzzzkviyxmv[cfeyjhtefuxjqndg]rknngkyxrldxnqxfil +epqhofdmbeblgqjcpan[tuffplppwdkoimwbu]yiyfzqemymmtzevrvtb[vzuuiqvvudpedkbdgq]qzkbzuuvgzujipvh[etjfbbzkhkhvlslkjg]sqkdjmgjilbpvmr +cukbhochuhppwcuwwh[ziuieaxmtjrcovi]egmfefvbqztrinknvh[tcrdwnuqobusvhhhuw]llwltqrtuzujeuatp +uegokkxxfybcozva[hwnrfpsyzbclsubdc]kxssypkvfyghukcsted[uvtzwttuxxztqwwyjx]lhlyeezyttvgxgtz +vgriivdekqhhyzgmc[lkzxlushgdqezkwkbv]aqtzbkzcfxrkuwkw[aeubxxnhyhlolauhnu]qphfpphyptbmbvcyutk[xscabrjhmsfredzulrm]torgsvodiuuxkgcp +blygklicgpngtpgcldl[melaiuchcudinutcx]fldhqlhwyjqhgthjsrb[qnvfdzzszgaedjqky]amhauyjuhdistfgbipm[irrhdtrtvlhanuhfb]cszydrvyiahzwegkdiv +yrncnxrkuamoung[vteffidkspotxmwhna]lohvncugddeuevq[ueuixhkoouhzzfucs]xgwgddhczhiovgacg +gowzwidadczncgofqsa[gzkezmlagbaetlf]oochwgecelkuokyunem[slzawxgblqhorfpezd]chugkzdgaukccbeoi[apmckbkkvlblsel]tokgjnxyppksnep +zyqnagblhgoyiqihy[oisqkkmqfxdtvfx]qrpxcdxvmtlqbgvm[rsoqvutimhujjhbwaf]xtdayhoscopmejfxz[sqcpfrehprvngyagm]ecwgbravfceaajqg +nntkrxodbypdodgtj[lnlglurkrynztgae]twtxdcskknbsbinlnnu +meztofjunuxbkfx[cthbsibrfgxjyjawtv]ujhnboyhpoyjprrheg[qmjwvltvyjgntydrmeb]dsbnlksebapwyfrtr[aoyswieertsyvbfijuw]wfzftnldrfdpnmnn +aanwuubqnptyoryyrw[izbhposjoffhknmia]pmpudrwiwouwspqnozk[sojpnvluazibqcqkw]veawduaoceyxmzwbgd +aenjhairjysyrfylli[ksygiscororwmpcbpl]mdggayipjsxxfhz[zrovsdxuwyxjjbfm]vpmedxtfdporoono[zfnnenxocrbtapmnezl]odykztbwvuvlngxkwm +aetllelassgaxxhspd[knioznfojvtrwjtnvfj]zmdmmmgudgcrchsuufw[qowcvxqgjaoptskz]qyrfhavolkmidaul +gkevcmsegjotmpa[yjvykufplocymkaq]yhewirtmatswhjud +kaerzsgqzwhdrlzk[fgmfnhjaylhdvepgdr]smkwpurhnnhaqccuho[cznwafhuvozqolaruqx]ktiyadiryeclynr +qnfeguqpvoiadeipxs[tuodvfpmqdlndroq]ruumxxencwatfiv[otgvbhlyuhtbtyfews]swsjtpcysedmpsgwao +mpxuvhlsahhdmtwlhz[saxrupcdkcfpmpvzk]rctxchvmeqnqsxqizr[isqtziiuucctgioof]vdlchnruvtuupzvukfx +czxihwpinbwjaatnmx[quuiszmtsnqdsugbr]fhhhwhvrnenwekmyi[phwhrltyjkmdffqyu]woxrbiznmygdqbptf +qwqniztrmqkkiyg[yvknzntvwmikawjlgh]izdzijciztugcknoi[mqpjeordqprhefbbsdj]rtwjvqdagpycdsxtd +pyslrefucxvqpgtnfd[guaqdwpjlwhfmmyzxln]unlgsygdedtpfrpz[uxytlfxsaeouxxdpdb]ufpwpasnaiqyqnex[kiulyoykitwlllexti]cvxikzspuywpgaud +rbzuremuvpunjopiw[evldkwtjsfwgvdl]unsafmnksqehiore[ipvgyeheeuobibga]ohwjoehyibiihubwuo +zlxdszmzwikrjfjfh[rmzbjspugrnhysidi]impguvxjhbhtirmdihz[wlpaqqnimsearxzka]fftirrvfdqzoyusjucj +yvzxaecltitusbcfqv[witiggtqtgarfrq]bhnbijcfbhoqpojeuqw +peyeydbwowzleyebpqs[abxvydhobwmlksefjy]hntuuskjfvsfwnmh +gxdajcawzfzzhjbzpxm[nxdsexkhsbaviwzw]kojsiljoybqxuvi[razmescyfxecbmzc]fdayjgkrzsmzngiszt[sdqgfgolavfqmuzqag]uzbbbcwcizcmhntiom +gssllxegqicytbgko[imezntkypaaclprdo]hojadqftyszdiohirac[wcpiroednqmsrywvxsh]gkfmxwfuaykpwmdukm +iwdziuryoqkhqzukcbq[qdoppjrevjmjuod]jewewfyupjnuydkn[ysbuocvxflmhbdhlb]ggjdqbzqfekjbbf[ubywismzabwewsrl]fufmyromzqrxtxsijkl +tbmlgasrsqjxwto[mvoqzbghnwpunzvxu]wxnwrrzdalxjlflva +hlalpnzdmwlhuwewel[uqawlldafxwhejwbxj]vkktsmliwswarsq[isoseemfosjusoo]bjbjwogehxaqhasloxq[oktpqmpxmsnvbnsubz]ekgpiztxkkuvpszb +xfxkkivnffdwrqecja[lvgeafomwyqhlfd]uyvvthewoyqjyoo[dcoayhnhnhakcuv]sfucrodbqeqcqhpmc +iqfduwigwfxgkhbge[qojiewaocberonshm]toxtpcpkallieefn[swenxuejqehdfutw]oaiceeyuhhzpazuyaiw[gqbyuetdmvtttffowv]neqopgkvwqemnrmauc +bbwxyipchypnmsk[lefobpxeokqvfglny]rwdgvzdupkxjhppcqp[onrpulkcgonndkfq]eegboakcdoqrmdgfta +yxeegoeubfjhijn[pmdjdggehnbtvfqkdk]ofdoklopgeznrvssgdc[jidbyndormgpitjsl]ucucnufigpzjuuxdq[phajlefstzyysdkdrh]vziqmjzpeeqnqholz +pnlllqydepsbgkrhm[ltoscinqrrvkdyusds]qwwtxmmexgsfqgoh[uucslmiboquvlso]xmbeigfpdmodrodwbp +jatdtuzlcxvgwpryf[dvyuqxhxkurrpblehq]vowbsishfgkjtvicd[krvikdxyqlwdjjnd]mujppmtqzmeviflf[ihqppwgfywzrqyx]aobhudzykvgwwhirfiy +thmdermwtxojztany[xcohmubhlagpuew]lnlsiczemaohvjhhknx[spnegzrtgilojpnoxs]spnvmefqqzpdfzset +jccjsrpjiyokryde[gfwdanjjnbycygt]iqiuzghicmveelbxp[tzugzompmkteyydyeb]bkvntycebtvjlgour +rzskdzdoxsdqinbmjlv[fnwbduvtemtogsfi]oayebzmwazggkoo +hzpsgtucyxemkvmfxy[duxikzpqdgcmkbl]bluegvpkqmjiyzibglc[qruyknjgybyboyvmrsk]pqyrdevwrpeatgkyo +uubdyuzvtcfrrdl[stntntweakppdrbqk]yoiwxzsdefzihdnilx[vvvsontntjvgcvanni]sqdbtjoziwfolwbby +tdpetsinuufpbezbgpt[hpklzrbaryhnibm]ucetauqranqexnfdstk[sadfrrjazeweeec]jaozzdmvmylzatlon[gyrmfjwewarvlpsh]wfojorkgrvraihwpaf +sarrhlzjldgzhyuvefm[braqtukjacxtcbrgtx]rpfporiksxcacot[zezcjaonoyzxnbgd]jmrjkrugljonkzb +hclqtamrzmzkhhwcd[hcxqnplterhqgbude]kduskujldxotldizi[ashjjijtmbppyhgxo]ozdvjfhxmojeqagmoa[dppzupkveblwydh]qonltaesyzvczgyng +urvfscylyvpyvpqwl[akngblyladvcuwa]pauygcletxnisgriad[ovsqsgvuccmdzqcwn]jjugrvjyydebzrjghae +ohvihbfwdsvpzohtu[qsxghcyyscnxwgnspni]kxlgrkvsbjeomgckk +gzywjgljugwxnrv[mssfmontfbahkya]gfmnxglcggnbrpvuxv[poejydksxougrcw]tiqmbdmjniaqnqgptk +hillvlrgjsewmjkoha[iighatessfoqwexqdc]iqwztbnauifcazihogj[xgovsowyvdafqch]qfjgljkcgkdmrnlrrmv[hnjcrfgkftyitryole]muemrwwikauccsregut +vmdrttktgqkyovr[myycrednrrhozjdhiog]qrrfvxcqpthdfcls[nipthbalwkyqrmqy]xaprggoudqizdkqu +ofmohzqodnueziyemx[njkghrspckzhduwsrg]fxxnmxloclzfmlkebpl +naurkqfrkpbbfkmbe[cpttgjergcoemawxjtl]cdkngakkemsmtgtwyzn +xtwigprawkooqitoy[dzapkodeyqhkixy]zrtxkzjqgqeuagdie[vnieacbchbgexzaf]ezbpshpznqosvuk[mcmcfwuzlyodiqez]bojvjhtatwvmxsxhkbs +muiyjlnqtepriyly[cnrfxiwdlkrqsarpc]hdlysxsdtpqxquhnz +clmaeawlvsluxfrhl[rayxcpbervctzew]syqcakahftovtzcdl +ljjlywtzejfslouih[hmsyjqsqljnppyv]bxdissuzzauueguk[xhyiqeotzpbtzsrd]wapoxmkfmxhbykdv +duvdnbsaqzqemzc[kfefbyefuptincfaw]jhuvhgdqrnjwmlfrmr[niprevfcbwagwvewhj]hdhrwocbqysjstefldo[uelmkdqczcnlmaefjms]bwszcueianjsjhiywwh +yrfewhgpkihnhct[pxzsdirhdakahwdxteq]ygayoyiuikakdqo +wjrmypbsxqajzbtwl[pvltruknhkznchej]ypobvzyforzyiihvzq +pdchmvgzmxaspkcwkpp[kekolrkqgqcekeitv]xwpjbdcxgoelowm[wxdhdpqotthaeay]ovvuawitaqelckg +fcqvgochyglldipl[ryndsmjdhqvikwnexf]smwbuebgfzzmfftrdck[ynaegesquznhgmisvri]hwbktncquitjaqs +hcbbiznmlcfgdfjtgc[xqnepuustubktgck]jspcsloqtblxprd[mudjqeoagjqcfato]vgguzyxablhnrlye[rvzjejrpykdzzqcpgmc]okcylioamjhremephbh +ihlcdgalqwvznxl[afsqmxduvmdjftmrjeq]ekvaovqjvajxfdutwhv[zolonpiqednbtfpsrh]vurkbqdeglqdsml[jivoaiwnfpbgbzzc]neycassstykebswqao +bsgrhhzfgwsgzowrbj[mvkzjwkxsuwxnioolfq]yobngzosyzkmgrphxc +edoabezjjyzijqbgxup[lcxkqejwnnslgykokx]wihvmpynxyyhaysxvrq +wmbgvnekkdivugwirt[yuioeaoerarbpcmbwk]bdlohxkfgdbthtxlc[zqpipkuumpyyioewz]xssqnavbegcidoenex[xvcirztjwasastitiy]mmcxttawlbzdztesk +fmfwtjsguazrodvdy[uuzglafbhjlwujwr]rjttgtqakbrloqs +mjtlntwhjqjoxsbhk[adswsdpwqnvqtuj]uwzfdezklxcvhvhb[rzmgufbrcamkvsl]imtazflkqvdgqvfthc[pvktfhdynocqbhqb]qjtlmgsjspdfgoazn +hfeiexxrkdehqttaam[uinfvckvhatgmlblj]rhksgzqfcizyqqx[ofgjnqhqhveobpzva]qaxdjvvaibeenyuzpzl[ktwkynazrcnewdnb]yzmotgipaelgbsahicf +djhinybbfbbvidnyest[zougucdzxpenqpoi]vvxbocdotanwdrjks +poulgwkphlvqfjplgw[enhvwdoftxrnowdy]jfepitixnyjgvvl +agbtjztsonrgwzivf[igqgvjqttujviljk]pmqphqrfzfdiinxhy[hjpgkjjwxgfsiki]fqgfwrylhecwcoowxsi[fygonoznhkmzcjcpm]nwouwxzbpqmsxnfhedh +fnukiqycmrzcije[optroggxrsbsokabplj]vlepcfzbmvrqptyx +pdteouejbrhsicugggj[dipcyddhrktybch]rsynpfyiklwyhvlzoxz +yuxxurstojjfnoft[obornuhvvdtcyzj]kivbosojivpliva[twgyjecwqsxjmgi]hbphkpnfffzpbwjgf +iuauoxmsalkxobrgb[blehxxupivauaxkahxf]torbqoddhsksgtnps +sjgwxpuwloyujust[psqoquaifhrgmah]vpaddscloldhahh[hditsfewhihijrpf]ofjdasdbjvfrwefs +arpvdepqyadnevyphg[kbpdnghrphvogmn]wrzcskupnydzepdmxkp[beeaeyelchimtyrq]yppeqczzpjsntfytp[aofegesxpscjbehmcr]wkhyeeykbgemqgcynxs +ouluccjlcbcurdpkzg[flulmqooipvjzhip]qkxrrgvodksuivbspr +zfmcvmwchidwtgjmpoh[ecthaqwuytzvxcfk]pwvwrbzdjqdtxlq[fwbcqsvdosnolronvef]sbroultaoabvbtvh[ziihpfydzrkdqsz]uydoxylhbdlicydahf +wyvxswplnabvdoeshds[zhrpmmoiilsleemryd]pgkwuzialwbqkiw +ehkebgpllhheumhf[pfovxzqmiqoxdmywhc]qpzsvhisrjgjfqnliw +bzizropqhokoukoxz[ahvweuhqlrysrwu]sdmyzgqcevcixtomzch +kfyocamgrbgzslp[bclztdzvmbyetlgjk]llzxtjeauatwnnpkrvp[pxshjlevsleipkfkmf]xblovddfkfhviqulap[zhqfznscbngsaej]rjfncwzuuqwowdhfk +biaunelzsqaxohte[zyqygmhjmwigxsfi]lmdfmblocglcxaszya +ngxgqwjnobiygnm[jnhtcpyfpwpwkxapib]lyhgjgvcuwgbxgxwn[rovvgibkfcahiyn]dyojmojklujquiqfsj +tqdbdrqgfyumjwktbg[weesraucasfagyailb]ilhskphxtzaqesynmi[stfgxrouxicascniwpo]yfkxnhvrwkielncq +twgbfgwbpygvbfnyy[xhwmhyacxxleyadli]wffogpkjkmysxzlmpuv[qnjizoqydldcwubtux]askyjzovxsalrrgo +yunqqhjmfpqqycv[vamwyuzotttqgdzgj]lmuivwjmlbeqkay +qhquozlhiohsyzwv[utxfaionxyjgcnpulf]nkmfgjxfobxmrydyic +wehhwiznslzkyncnkc[dzxeftrnxfhrwprllke]imknddjnfrzanslzdz[dfqldjhkxhowubxs]ojzmgmludytadwespep +rbkqkcqoxrfczfwte[poemreldxewfaif]vehqkzgxcwmvocban[ffpechryektpzbdaivy]emfkcgsqpqkqxiitol +eidbkaxexnexudiembn[xyiztwlbqvoavomnlwv]rrfwfdixzpzvwkhwlw[kjinrqheqjsynha]pilasnmhghvvgaxor[nrgzhlsetahyskduscq]uazoholzvqjdaovgjr +ynlcechniybypvzubo[fupezmnrswguyjysfj]ckmilshpttvobgoux[hybhkdzvvhelhyvoynm]amrybybroexntrlcmvy +qpmlcmgstzjfincjh[axvarrnhwnkyucrz]wbbpucxtqbdjxsug[tutypessbhpshlyt]wwlkakvsggtbzcz[rypxpzrrmmohyowkja]aeuhylvosccpatslhp +hrdlnpgexbirsepd[waphktwkfccnylxg]hgukjgxutuzfovpazhx[jzgspycuftkivlpx]bhfazqqagtfpljr +ciyqjrkwqlwtuhh[lknvhwchhuntllyvjb]ontiepkrlphiydhyir[pdcojzrccoatarrqj]rwmyqonvfiexmbnjy[nhknsnxkwatatfhwa]qzlqiiovmuukmwypy +tjxbenxjlgozxrtqdp[fqimqatlktqjwjdzuoc]fedjvxnqivqaxkvcw[lskccrwcsxulkabzp]orszzlxhimwlzfawjw +yufbensvlqaxthui[vplidvdhajkxfkledbz]uposqezqxglywtlxgg +wacgjknueqomqccqnkf[erdhexyxtcmmvhums]bnywbavxkfzbqwlppv[bwdbqoqfxejqnsgjd]eafoepuyabzlznxw[etyfwvldfchsrdsjyec]apzomripffavakswd +conwdmtawpjnzrjlkrs[lfssaruafijkmgdp]izwehdqwarvfgxi[stkwrpsrwwucxlrpvd]sucqudlqvvklrfdgac[gelbgtycawlilemxamk]zmdjppqtsdlqfbhmm +ufwwjiajxhcorfa[hrdobejvqrdojftlnj]vamxyyehcgnupky +eonddfixsvjssautqun[kktlnrsxhmhwisd]drpflrvwelqqmdrcleu[vefzppqxcrtevyv]yeayirahatkufcjvax +gipuuaoxlxfkqld[kytubcrnjxvhdxjto]kwpqrvvtjopyigmq[urijeznvkopxtgkd]infdbnklnolvaqwwvo +bdqprkxthvsgqlp[qtcbdifrlnjdpxrb]xqmtwugptmssrivqb[zlkwptpsqnljxxod]esxomobcnfjuxxdmsmc[tifraqareavetzrpw]dlpsxjssqzyqwhd +ylwhvgowletbcqjgr[tnhoxqhrnytlbnwifx]pyzwjmotosezztkqd[ejfcslurfhiompqindp]kvbfdwfmwkiswfm +bqlhxpzchtvwcqc[jhpqckkyntskugvua]ylakfwmlerklrxq[wjrmeexzlljednrxho]rdobmdgxkucmdrk +ehtqwbiyigxjvkp[qujbspkhxogjrzskfm]qebesubhovwonqudy +sjqrkysnnbgtkhwe[ibgrjvqztrkknsr]mnbkbbxvfhsihzkbsqz[hxxhvxonqzrgcant]kbkvnbphoymseakbxjf[yjkdvhsscxggtyyk]tofzfukarcsahrmvs +ndepmgjnsgfsttp[rgrcqahcpnsyknjkd]uablhivltavxssnx[uwjmrokgisrjukeoh]wollclyotaektyjg[tzbziofnztlojbros]qvbgoapfzbecqwjsq +lspiukvizecamzh[vgaxbxgipyodtbxb]qpnkwuqxsgnihgd +khdzfhioeykvnvxuhic[lhfxiidbrwldhvfav]rwxsfwhshazzaxvk +coaljuoxfhvirzhedxp[femqrflktuakhveiiye]iabhkrebiawlktxmbr[pzvgzzcfzhswxitunrj]kqpbmoluwjetvhdcr[tyqdtrnkdmvdpuf]skrdeadiylehnbiyvws +qimxmesehwdrqskwitd[nvgxgwksihjcplpl]bxnyyafyzxludvyehd[hswtrhxmggpcpcvew]cucgudrfxfbietibgv +moiyvifvvucewfqu[wuzvazqcictmsbtq]nktfnkfjbsejorafo[vfreizeqljwshfafwdx]xrtbsdzcfkdmskiiuwj +kchuwlbokzivzlzvib[izbibinxysyjrvtapis]vugjoxtigdmbdqjn +xbclcahcqnbzwpvshao[qkamrpzzmssylpxb]tjsufvzaorutvdu +hraytavipeznkuoi[jmllyjddfakuxwfsx]ofoxhbhnucmiztrtcji[vebzprplbxwqnzllu]peaegqqeqbjikxff[jxzebruqgpoqmklz]liakpsmvutnpufovqlq +omtbdjlfagkxdlntz[mhwuaqvyldixapgoaec]aghmtjapinrxlvem +kbvvqlrdswbturvx[qpkrbbaxhpljnhlytou]xsogoxibyznqcpqgygn +orqcxbycauryvjxq[ijorpddboqkyznnnm]rvildjpthqvtdrzcq +hvttzyckbqjbyfdn[lzeulxlidymszjl]wbbmixifmqzkvypqola +eizqnqqixewedcvcit[ohtuntptfbovbsnl]uuswevyvyulevsfnw[etmfugdbznyzikdtx]euprxmmhcrdoefvfjg +pvxjhbwdlshqkth[gwmtamzhtucvbkmwacs]uyephbahzeptqmif +zitdlkpouvntzndz[iluwraejfdnwafe]fuevzmqlsflfcht[suumoqktussjsze]dawzltubgawnahpd +krskxctpuowviqiqxu[xunkhvqyyqiqhyx]rcdhdjoqrutobnjpimv +frsjlbcvuwydaobhii[bdatbysbolkcpzcxoyf]lwsfakbmjilithjrls[fhozecjhruquesmkca]oorqtbaamburjorhy[occzlzfhekgspeep]lilnnsqheytwakzah +ragajrztetigfkm[egetcjedsnrseahrxr]cblhtdmtcnoaank[fzhqephlcyygbwt]uyqlhhlhmnfyfcts +nklzxesmrrdlzyakdk[pfexuhulnvbmndvyat]xjvspjnesqugmkngn[vmzvdrheaknqmzyrc]xfncycggjiaqvirfvnn[aqeinzmbaijlafd]pjojbnvismokshrs +urteecaminrqiohs[rskgnsdfpksfznqpphc]yaxixbacbtysdrnwixf +ibvmhqpmnpzmghdtdpo[djdzntakacvezlr]jtdoweayvyiaskblc[qhwimwixemjmqsu]rzekezftftlqqovnq[hzeyrnhbrrducxz]ceiqewhcqqmqluro +joqwthpcrccoovxrvq[qjlcrltwaxkjenbbql]ovebjdqfnfkomjpswn[qhwrxhvbaattcrkvff]nmytfcchpqktagojhtf +jeeuutsrxjlqegcdlrm[chrtabpzdcoetzoopc]axdhgbwmwhhlrvc +djcujdyidkcgwygy[zfpuoobkfdetgiifrpf]uxzlkhxzqgiuyvuc[gboovijloiwizfuuye]wimticbreszjcpsls +ylpbdnvjaavulnhg[novahskycjcruokxbrc]gzsmxnvpupgxwhx +qdarjsoimlwxduyp[nghlzeghibocgcbhqb]vuoixghxxsxftuztlxs +ikdnbajyzpzbtzjdey[fiygpvlyluerdjvcdc]hheswtvpmtvjochdsih[kmjnhhmbpokaxsrf]byzdcdlvgyorjvkujyl[ttxlhbnifbfgmvs]onytmkodkklacgel +rcpgwlbaskiorvxhgsb[xikxwyiageqvilea]rhkkzuqtuxbhuygcxya[prteqotsqfyypus]mpdedamsijgmdktn[ptlcxgtlxfnvychnwe]mdjujbmrytfbzpslad +edjzqlaktolcrbwboup[bvmtkmfmidimoohq]kpsgyntrgidclnq[ohqjnvirkjlmztem]smtywugfaobbpvmzj[aksdrqczxftjrzuylmm]ffyrsvfwtqlmwbw +rkgutyhaonmyick[udryocpupaohqhrmmsk]lmusznhxbkbagotha +ebtiyamyxtfcakoku[tfggedpatfzjvirou]iwbguywvekoline +vjyzycrsfycfrookru[iszkkyvwngsskic]bnnqauaqcfxctnyofoi[tlegfofrqiuqlgkld]biryppugzufezftpjra +neipbfcjvrnrmpijwhq[eppjsmrnolpscnfowe]crsmezklwmkbysajb +quwdpyfsllgkwtj[ercxwsjcfkbpohokuc]isdjfklflnudrjetf[fuxsclqmfyplxxvao]xflfujjqnglxzxlxz +vfxrgmnvontljaodk[pwtwiqibbceehlnhf]lwzkbshrmagzhwqyq +ecfthornfevsngitzhb[pblbvztbbsbsxxuwec]jtjnnhwkekrgjanoxbe[osbstvuwyjietzx]xiordmxphcsjnzfnrwe +tcnlllsrvzoxupp[ficwiahpzqtauuk]whxfguillhkpxitoqq[ovsdwbddmfojvkqrxb]bfagfcimddodrtb[lghczsmdqufswoayezk]ctkmauzrnhgotbibbb +qahnaxgypnpjftgu[bghbgwqxwfnfrcybzd]qinmtddfxbpkhqnna[rheeshzhyxfbcfxkd]awwsrosrkyfqcvtx +siffwvlfljwbcndns[cawuqwatfhgwsphjn]twfwwneebgzxmqyrhbr[awxuvozbhlohuaxim]dykizkumcmmnwiwdx[dikxuxtmacvaxiwih]mscklmepmcgjemwtvv +nwnwxbeggraucwj[ygdjhwgskclfginltdy]ngfxeqsonadvobrnwne +ceulusceecbvzesfpia[etyucdrmmbsstudbfo]jjzwvaqsiovrgro[msadpldzcxurzije]mjrrrqwmyqxpdgmp +aiwctbwfathsnst[ymcmlyeojcaokgf]hchdxsyquapjjgncfq[adzpesdwzpvcksioys]rbfqvkxsicnkphd +hnbounecoxhinavuro[tdytxmzudgjmyxmm]fovpxazijvtvirqfrup[qbfsslqkpyioabrzhlz]htlcbtysbfxurnuqgs[nybjnpqgugmtfculk]zxdfwtbtbvhxyrtcodd +ecszlqenzswzeujn[aymhmhqkvzbuabtr]qasueshfbfducoit +bmvypnceplfbhhsko[eypvaebyvggpcmzum]ycwgnjvrjmdrkiao[hdkledypozrgbkexls]isuydppzigzqtfo[onvsgjzwozxcvgkukez]uhjisxtizfjiaebue +ljvtminczzipicxg[eqfvilzenlbztef]hpdptelqvvscyfqjbk +kofmsmvngqzdobeg[atcxvdptaufgfpec]rbyvvgagylqgryjmdz +qrqirixxxpivzyxidp[vanhxwefpeffrphvwm]awiajngjmxhscxctxt[hnmowanymdizdow]lqjbxcvbswqatxyp +baeknzdxlkxorrfi[tiqhvwvqoyavllfk]uqqdkslrjsueklu +usgfgiqvoudfsdyov[unqciexsmnreobavmoq]kcboezrfdmoqrgg +xrqjdugnwddstnr[gbnpzkldpjyfady]edvtrvipwheribydmaq[mwzdiuqdstogfjy]owanzbjqvaqgsgf +oumjseobbaxvipit[ukwqpfaqohsabpd]twomizennyccksgi[hszmrfksmdcycyda]connwmiollbtvgh +skyizttcnisqncq[lcxdhawnbdbcptj]ocvhdptvtfnwqcdmjff[sqbbfcaufseolqwcjt]xlnlzmuciirvedlni +nwlhzupppktailtktkb[bzdpulmwswdaqrv]kncfgfqmxoohevsxfp[vgabgahytpqzalhap]bbubtzxxzeysqyqp[nhpmkotpzfifrfpmk]fruxnzwuvonfoxc +yedymyfylbzvjfwst[woezxcgsurflqnrmvt]qsiblcwatgywwbktdmh +gnbeeaxxlvupyacdpl[dhgikxwvtnhllqs]dzsbgvmgvhcbygjkxz[qmayyikkpsqdoukt]kdfbifunpwlbhsh[qrqskqnysxtloxs]zudxossasajrdeanct +rhftgsygepdspzqbewd[lcmdbukbzwdesfroixj]oblwwxyfconxmhefjow[fvutwgcvuaemgzqanrz]xtiuegikggcimaobg[uhqwmtpowirexexim]txoyjvcawbfxprxf +viebpcquqeagmuavf[kxfkxsoijrjklkgtahh]gdxrwirjrvzjcykax +uptdisvspkluwgzkti[omvlmaxnyxyzwuian]pmieocovsvpfcveurx +ejmnzzuuduhzoze[xrdlxozvhgiofrc]sxtycslunhjmvejtkd[pakbfwkagujukiybe]adudpcxmlamtkwak +lqyqdhuldmtwbvydji[okhzffzbmlvqiko]wdcicvzpzkaowwqnztt +imnhospjiqsxihx[utoykmsvdetrkdxvzti]zgdfvtmfjggwyjef +lwsirsmcseswkfxh[izotdhmoodsvpsp]jivuksxahorpwcgxnn[plncjtzvyamfyxzst]nnpdtmoozfzuemdcenb +puavooykfwvhwzmkglt[xutftanpuhgsdznc]rvzdveoxydbctczqu[hetpqpdgohitmgtgyp]koiwybsyijhmmqxesqk +puivygxavmlrxwkst[qvtxsgezqcquyae]brdptsxbxnobkvcqclm[ibxfeuecufosgtzhxg]vziaqziqriftdfrpnll[bjfubyvxxrbsjbqvi]nnlbiuncvdtnnarm +tlzooyjugzfsomi[robsmcwkpeprtatddr]taktjvhztdlygkj[vbjvzeeznvmamus]sformulcgeirdihntt +zbcyicsjcmpicotmt[tbrfctpfnqspmvnv]edzcoymhzfqwbuyuyu[jhauxxgwnguurrviws]rfkagjqfdvhjiavoxtf[zdejarfvfodyslh]pzjedvtgzwflpduq +dhbhmlhsizoeldofqs[qcypvphfozxibpjdo]idntecorhucvlufrwu[naoixcxuqlgsytnt]ehsyusyugbmahyrn[djtckrolqitsztwtuq]urantneyeodhvorgsx +cnsrdanbfjubsdd[nwynwjxiyygvgdlx]gyyuqjjvumvquvzib +otivcdfzmsjivefwujc[yiveblxrayrkmfjwd]mbwaroznwihbnbmjp +fwanqgdmtlsezhtvat[bhxmmztvspchqvhovae]cnjyjntrcijkmnjwnlp[rziosbsufkiamqmqnmt]mvxhzoxxibbkezhzlks[hfessxjoefqfbgxhc]kdgmlomxtdfgdgku +ygxiiehdqiqtqjzj[cwbddmmlczrgdgpibge]tartaeajmndarksakye[qnurjchyeijxcsdpc]uguxoncwdrojsyszsib[mlwwasmjacumzfqr]sguglzsozcdjzlooexl +ytyzugjtaxtnwxkns[aclewmcdbbbwyyu]hlfhrgrigvwsdmdethb[osohbeuazmmffxyeq]ygmbsfwcmyqowdvh[pqpwyutdqwwunfqt]ppkundibovmqwjwyll +vcrftmfliijtpaqsoy[zcpypxlyshsruwbclj]mnwgypyvzdxnnie +fmfdmvxkdupjadbxh[tauggdjujfbeogtsgzs]pygzoyudakrlrlba +ysxiybmwpoygkyle[xaaughrlqulsertp]iukezabalczvwieegzj[wlycqpkbqptraajl]mjevizxosnolkxnfwxc[veialybabbpytrf]tpgpqighdqgphcwoysw +cnxnptbcjhgrxrtremt[tjguyerqizvuobq]honeukqpcsoiapswdgs[hcroutdslvvzypfklj]owxcxqehkqqyeflgi +ypgeqbggpntconrgr[fmsyjvaninmkfqekne]ykrmyjpfwlhnsvgehop[gvltviftpcixosamy]xlsyzevtwaokuvneo[nbfcynlfsbmmweiml]nxuzmhrwlucgvfy +zagsvkbkhcrkvnukl[pyfiiavqjgonrarga]antgzbmtohtndzgf[gkvovvdgppcnyjifrc]lxdhpometcwlkofze[fpxwacqdussynpwd]mymrmftjovoqtkuae +xrtjipuirgczdlrrlnu[xdczaqvzsfgavmzq]luocuzuztdgsyxbcy[agpcmbiyqxfntvnmzn]atjschwzmauidumzxru[gvmmftvwtfsvudtd]vhmononuocptbuvorau +fzozmcmcymohndlq[rnrgxsywctnmxxd]unfjafhfgeexfykym[xnldroqvnecyhhcwel]wagagwcqljxduzebjeb +efvejswssxdrqggx[iqwwyhgngmwzwsw]dlkdcjxurmpsoceomp[scbledaqpgsgynjo]rsdxazcyjgcubfxlbb +rlkrgjrxefztgtho[tphpsircgzsauqfew]ridnbmerksozxzwx[lcqwhfgiihdzgtgudp]whskzgdpjubkztb +qbtcopfgkbhzhhglhh[ostebaqylyggiyfptkw]bbuaatfqlpxstpgwg[nydgrdgyazzfwlagrz]fiiddplgxeyyntyeb +bogowskdtwkyhtdpzw[uxvrferconwfnnj]eukencoekwwahhefvs[xtrpjeahwpxbwgogfmh]axqvtgibzojnfcku[zhkpmdtwlogmypeqc]jzqywlhocshrdrlgd +rdmpdlidbkplejoikjc[iqzadghltpndooanzp]ltizdvolnhagtlvr[rqcrkoaqwfwjpsrj]rtlcwqisvkznpvrjrbi +ndbtkvzkgjsuyfibsn[gbfhvruiotbnbtvuxaa]xihrrhcnbnowthpdge +vxtgjsiuodbsuhg[updgogkqrntiedefvh]xwgrhmgmpzsxyen[tbhogopfepprmtewkm]fmrtnudhysikudz[rrdmqrctpwlcykzr]lpbvstnhcmvnfcpngja +eoaqeiqpsqdqkdvia[pdyuqgwuhxfiukmpvw]wsjyvdabhrdsxij[puikfklqhrmvfrwomu]zvbbuuromxgpnmpviw[fvfilnspmeoxozaba]yaouxfprxpkvkit +qpaksrcracxnyuozqc[evqvzzqomyzwufkvxx]vmbkqqkzjskcxbmbbp[alqaapbcvzuxchmaa]pzxrooiyfqprfaucxue +jmjvvyxljzznmaarmau[piytxuyakxaropkfnfb]txaaoeuvlqiwynhqlt +yrgxyekmldicpvo[wqcvsbptigcqvzoet]jjwvbjbshgmwttac[ymvjkuxxoojchqomnj]tsapoddljyrehrxrke[ajspkmvbrzxrxlpzw]hwymrguaqnefpsza +dmlshfvkrzncuuoo[fddyurlzqbpqdidtkrs]kcewmacglikdszapy[fltgxlltlvysvylrl]rgovwrvccixdullrof[bqkrpxjupbbrdnahf]ebmiiwmxkutltuxwrds +lzklscqfbovjmjbo[rhwheqhkaseohohelh]msyobgeiybsbyucus +olbjozztfeowxftbsx[oefyqpxsebyfawerwwb]uyfpnsvujqenwouagc +hwhbihujnzgayah[euifzicfxexpxir]lpgjmexgfyseevwjpqo[nniwslmnmrgybuelwb]khkudtujoigkyyjipu +okiwsdqqwbijptpjzl[ktibxjcdrjvsgxzlgg]cimquzswgbhabcf[gictypilnrboctfwls]oiofteanmgnauid +hdwokqbmfofrujxvf[gcrxxfsxmycedcfr]xwcmtasmlcvfmezvtk +gcxgyjgbqhtcqznfuoh[yitqnwqdcpkgwzayq]oqbiabducwietmxira[kuxdaeohprtnmpfniab]wddlljbeofkomijydzt +gnxobceomvkecom[oedsyavphnrvulwlqfk]klkcrpigniietqecrc +bgzhntrrxvjvhyqhf[tnyvbggtjvjfgratfo]hltqszvzgcutrdcvddq +sgzcemtrlzdjijht[wtvzogdoomtmhxcwckm]nmvftmtbucjnczm[hkqmnugntbrrsphbmn]yfvwwzebdqjkryhm[ydcjwepsqqrwnhkpup]tyssdovqgkhvvstvd +buhlborygnuuklh[haftitnpydnilqbqabe]gemzbfstwlhejmjoox[awjrajspxybgdkbl]nrkncxgvjhuwukw +suckcafpmeixlavp[ehmqotytcsxzagjq]vfwmytywcapfwlljl +vblctxriewmbbpxo[xsgdnvmcmfnuejlrtz]iltofzajbcezlpy[wnfixwfqqgseisa]buystfqzokvletbzv[woumxjkmiqqstnt]ciarbpnsahayntnv +cjsgiueunqlisps[zurvijydsqsdtktm]xhlpspwgqlwqfvx +bobcmszgphpejiwlwdm[wwjrxebfctqobojw]hyrcpguihwihhpmr +jlyvxnexbisiiwyjjf[pxpqjtfgwysrewmrv]xcfaninzgmdidqswt[spnysxcfdiwijvfqitl]wigmjtxvsmwlquxew +qqtluuthgrubwpqzr[kgebpbdpqekehnnuyuh]onnyuyxeqstunzueapk +sizavpqzmcfexfocoxn[dwcfbufvxxousaeah]hymczucocssffcj +ldupymvmttlywlxbbs[vsttjksdhwfdxclitx]hfvkvgmtmaxtifvo +tbgqiatbujypfbjha[catabtthtrydcjbt]aujolgbocqymyeqfr[apsuwlktuaukokmldw]qllsjhthoqdlpykgwz +zqtpkzchpnnmyzygsaf[zuokmkcncefsioenp]ynympbineurlgzkdys[nhrjzpmbwhwcsuowx]hzawgwukxrerbljm +navcmnriavzmexm[xdvtpfcjdxlbsyenvtx]byqzubujbhvpwfcme +kookhqsmbrpgpsbctfp[wlbmttbadvipoyrojd]cqmhhdfaunlqkre[gqmltgpxfyljdyo]zvzerdpqmktqmezf[npidrfvvtdeqgzhojn]hzehtqonmwoahdakvve +tanngpmswmpddgfpph[egmymqydmigpnpr]bymycsueiolsfyfey +uddmrzbeefaxbulsm[ieevtshivgygbvsiwpd]lbxhzadyduakugey[sqywcrjzoxbbgadoqne]xngapfdfzbwcrkd[gurtymibbzvsbxtpypw]elpexxrljomuxnybuxk +diqvdzizaoprrpzrovy[cbayiwiifklhjkw]somecbyhptpmhjvkrba[gczcezgzlsyowteraem]xkjkakyvwxbgmybzj[htxdiogfsahudae]hhbdrescqujtyeyo +kzrqpxxtetqkqqfxild[tenlubsvlvxwjgokm]zxfixurqybohvhfa +pjhbxnktknirbwjp[arlmosnekoqwtpysn]hexsbuespjgsrzbvpf[vaacxsepjnqxegwqq]owuxuohhzxqnoqepvha +pumaevegtbjlzsijtf[cjpsnszjnvoexufcgxy]dxngvevsnjzsbuask +azhhrcrptkuqsvxa[hwxldisbvxutspea]tiqwqugkmslokmixx[wzqlcgyfzacbyoguk]klpprvhtplelelsmx +dumehssexnwcppac[gucpccbmtrdgoee]zpcpjjuztjtgxxhzroz[iizviarbucshvccj]xlypepsxxhxphttgc +deujoayipwnugheu[nnyjneomcvpfrvfu]sfspbwylbnzbyqh[innsmlncnbxrbfuhu]tldwbficslnxpkzlrtw[kyfmnucfyrwlvbb]wedvxsifdxaysaw +lcvkjzckpkeyzyjgtwy[osncmhyofupofwscd]rysnhkmiqoqulyu[lqwjsxrgpkpkgxnvhf]ftmywmwfpckoadd +pixbxvhtlxjxzpm[nvmqocftgaxxgejke]npibmenishbqrxtavc[jzceumsoxcyqbfv]qcdqqbwcueyyqptc[egixgueerjonkmigr]teecwbxvwhgavdfjxi +vhtgslxovrpmlojcyiu[pngyxboltgfaskge]eawigmpxrezdxtau[osjcsdhppmqtqxixkg]gkxhhsphrnkjyxgmp[khnpkxghpkaxnvgxqe]zpedrsevlishcdbd +ixnbejxsfmcjmqh[pagzggnbjxxwktstf]hcjdsogfetpzoucuxg[gsnpjjdmrqzojcozi]csxsgebagjjgxqjx +mekdjtrwhgafduvnmwn[aaphpbnxrwwkhzxn]jqzcqvefysuegreqcw +wbpogjbyzelmxqeaazu[djdqdlmpfmezzehvjl]qdquppvgjweftqvph[equcifktaceuqwoakk]uxemheczqpboerwq +objhlxsujoqunmhip[bxpjvcdqedgvqrv]rvycwulyrrllbrxlbty +ckxcgnosnlskecyq[lcbisjdelotgldlea]edcebpmpxvvgktuxq[pewmfvnkiiulfehy]electgrfvkbxiic[emqhtmrsqfbebmykzv]jfdpefifxcptpfzvovc +leyueicungygchlce[fbclcyopnajqvxey]jcwvhehawbpflgddtn[xlozeiujqbiinjlvrt]ljmnnzlebbjbccao +mblrhofhihdiotvy[nfatavuoewnlsvc]gtuqdhyxielngaci +eyzlvgyolwwobcg[vaeslqvdrjthzho]zdakaychskakuufan +ukqgdhxdohzgrdfc[vfxeqopkydlzdehao]cormknsmtbidhgml[ceialgwruscjsapfc]erjsjeuxzxjokxct +szronkojjdgnfzkpqzq[xpzmblnarrtycgglkw]cixtddybdschdshenjl[gflkqtgzlxeesrfvx]erpfhhlwbsdasjljnqh +crndgetyvbvxhujqtu[svhcpjoxbaacvpqf]ohhkqbbwhtbcatwopz[nzfqzdbjhixrtpw]dpyfzrpxayfoglzji[aynmktzgxtegbucrw]igvfejgptghxddj +efswwtohurobgbpvlhr[sbgfgmsrjsrjblwr]xkswzbsgmboecxc[odmohossczkqjwtrdi]gvdjrovgilpgrdgt +qihgnzozzcedhgivz[wfzerbwlgrjbwolsz]ehnxlqolcgghtdfkeus[isyrflbjdelvbgz]eblyrmmkbobefzo[baowrnzmyctfmoylu]bzhtmcwxpcqhubyws +tjgkgtykbfdogfa[tixjoqenpxjbetz]oybvzsgugsucpvid[qukesagikwrrpuesq]xodwkyngdrxadgqz[sigwgfluzksbqqpvueq]rlgcptipyfrgihzn +tbilszajwwosrhs[rewcahkzssatddmv]wtusvesduewjvissr[efusbpnhwnrdjwgjthd]dunuqtpzocqwyqbysak +spvqcisucqxihmincf[csjfurernawvtia]vzarehconlkvnhbpsaa[mttsrsqoluowbizxrbk]pewqfgipuxqzsfj[qznswrhnuvmmqtbq]mbjqscwfpmkejjowy +eqeycwhpzzryclb[mvthqzizihyfvtdgon]maeannxtfakrfmg[xlxbqdqlglfspvyqrx]chjokbtqngjjsidqdyf[nnmqygvepumttyp]zipyquwulqtblevg +etutgnamoiukjadrf[phwftwicxcpgdegzkr]lafqcmydwbvsxlegc +kbwfmffiylhmwisrb[wvoulhoyvagzmgxmp]heupruovkypjtzkilqm +hjgmjhzizaeqewp[fepsjuqdjujbjpnooe]rnovsbmzwqtukgy +rlxvqkugtcovejm[vqlkivalxqfohnwz]afmwxjnymstqmem[ynyidmrgyujdkmjq]cliodisdvotckoatva[ysfxjtwokboitvhi]xfxomfghbnfnkobval +oxsmqxhljzdjqtx[eavkvuusdpcbrlwmr]kkpbxnnmuqigfvbrf[qrfzadqfcladouu]irmuceccvwsazcydh[kvkeafmibmbgpjoc]kgmkohjtzjqnfwxkv +hvvzujphepxjyypzp[isabpxdneywzpzr]rjbcrfhnidqlywbgvxf +ezfeilvlhanyhfvd[wgbqirhrycdzzbu]wpwvyghpwpfykgdt[drvcvbpndcvrcirig]qzcdvhfcxqdxubat +hjkktoruvvqmuauitf[dmygsosigufbzkm]rjbwsccifhzyhqk +zazrvwupbrzlepfcc[nzlsrlgeovdbndxwqv]yhjwjlnravqgraen +fqjubgphparanlll[avwevtaigfdxgjet]mgftlttzuhaqlvwqn[cnxupkaxahrlnjelty]yqgaieunjkxlhrha[xexqcuvkacjayozydc]blhjzcfcoyiozuajqxw +nacvyqozsyqgnvkvw[urqhhtybjqfpqqcrex]pxfufqzfghzxinnnlq[vbxhmpntjgivfgzgmq]vgsmxbkpphhjvzqdirx[mrnmmtbamdhoved]zziaxsjdqjfvqzq +hdrdsknkwrtejdgeqg[wbvycsdyecvuclhi]owhsjsujsqjachyh +jwfxtraepnpxwmziud[qhwoewcswwusdqcvfh]czaiemhwpbkflzqi[yntelahhkwcytedvpe]kpkuxgqygwicxoh[vuifmbkhbycxqiv]cfyzggvhpveafhduk +ngiytctkauehibctccr[coszigxgcttxzoqrhvn]hfrpsylypetiwrggzg[xwnfgwaxrjabzmsqquj]gxdqtprloqdojdthh +rhhicddiuxdobco[ihkmummwydkeoqp]seubufqphohblrkn +sgslfpeleveakroo[kgpoljsrrcfwlwyzb]zeacrfqqaortgdv[yoipuknesgpwoscvguw]ubrzxeqpijxuflgsgpt[allsdtgmdlnupofjb]brnjhlzxmijpicty +vbcaptabloujxkqwnsc[iujlwsczjefkoewao]yqwmtuetinhedenovhm +fcswktnxobrvovrjg[qsaxxwxgrenkdcpfvx]bmivhngglvcwxwgjz +nhmxhadaretplflb[eaaitxsycuqarue]zzdsqhjjnebzptm[znupjbepvjzujwj]djueiauiobywmclemio +lzgmurmbxidxqofgvy[nhpkiprmeusixtqhfid]zlpmcgmvjfsqhddfzu +aziympesgvakqhltci[qdofqedxvlvpyqat]txvwrspujxyuqsn +ezewtaywtinlcbrn[idtmhvforhdxgcdy]ohpcvnchsamehoewc +ayzzozmdklbhitpd[xwlznwdbvtciozoykoy]ainwvvxkreuvsgdatbm +kvacickhqbjjwkk[fryxetyntagtppzorb]gkqgbqhjykyewipbcj[zdaanxpihogooeeqby]lxdkkpostipynvh +nzngguddxyeihkkyt[wamdyvzgrnofprps]znzgitnmvvvrrzsb +vnbogcvphumewlx[cboxtlpwdmfbtfegkai]zlxznqxwahbghxz +stwxjgiqglghaaot[gdxpnepcgstafgt]psljddrwgewawdc[snbjvfbagexsbpyh]wqqhsxerdjilgln[jyqcqbxxikzmrguo]sophymnkilydvivcdk +kihnifnjfzhvlinqrqi[bcgxtjpdyxtgejzrdi]avzbrcqlbmaadrrvazb[ntmnrjhiklfwujlg]pifpvzbirqokamrmd[rbanfbdlrtmtkxca]udilckezqvrehkz +liradbqjmqeaifibll[yrfnryjrscfrxgazpzc]vxmlibidbmcwgoygn[ojkunzztsdudqhma]dvmtamzfaanvyivxqrq[yqypfcmwnezorcnbzy]wytsaklpzfftqat +fhaxbfjherqxbzbrtg[nabthakgwjarjsfhj]iokwyfrrjtwulhwi +asundudwctdvninxpag[opdvadcnjnbxptahj]scynlgwnmzdtmudu[bupcfcyqmmcwsqfffb]rjargbcgxvonfgjco +zwzcwjnudozdektxh[wesqhjkthgohlufhrf]mwqrvudkqiysxokugz[lcjiemidwqbdnohpd]psvhnbkuptpjicdmb[vfoerfpkymcjmhzicwm]pwykcpzewskfmho +zbhxhhqfeurqurm[buuctguwokorlkfq]extdceaqdkokhdaxzqj +qcrnmtdrftlnyciul[qvtjesglscjradq]tcoobnfosubnnrps[qafsnrpijrnjkemz]urgzkcxptagwndzug[olhgasghsicjvswx]higdtidzwjfzlfkmxbf +ymvlttwormrtliwoy[wrcafamahrcipugxxgy]mjzzpdkuowbrbqtmr +swwktdvpgkbbntq[jujwbyzbmzktmpag]uinhisqwpyszittfqe +qrlfgtcrpyanzwfeuhl[sstllbrafqeobsocmsc]gmfmnisxdoqqctof +znfoqfwiwmxdiixycul[tsxegdjmxscgpfllqvi]fhwwrpconfwceqv[gqpboszvyuduzehsun]hmydskzdmmifotkn[jurqmnkixknhmwj]vcjomeocgzfhftqq +wukfxspnkhedqdbtfti[cjcrwokxqxfqbvfatie]eaohmttcidinhxqtcu +usgxfhglhuknqauzic[jlhntqhcyjuoywthv]hbskrwccmtzgyby[pijipgraqquvxhso]hehkqohxirecivlxnvo[lawgvpbmozisammvpcx]vuchsyinsehynzm +dgnciyptfimtrbmfbcd[tedeoxadobgoobffh]iucidwknmfofwia[bbtbzcwjwiphlcruw]ukwczycabezutqdcc +huxitbsdoqaffnlyxyn[vzcnvdddtezaeymzrr]bmovgbcqswsdmjacezx[jjdtfpukrwhiafcy]fwlhrymiaolokojdkx[ftqdrarkfhfbelc]yfonqpoegjmmxkwhz +ldedcblvfbdacsy[rksxibwzdatluua]agxedenvctglzyvpu[qkwulxegyokwljso]akjfktolnkzwsnn[lfhdwjomyhroqkkzk]mtkhpnffxrrwipsrqet +ajwscynjeiagnubeew[ftyzkgsmsevmdkpyv]ufeszcwnhqpwsep[rinrtwoninoxbqvlgy]mzacylokxrhxtbyut +rdlragvdebqlteu[kitphkhhnrssleu]chisqrsnofxmmbegi +sjzglwvefnntfgofuax[htbkuezcjsfgohzynlp]wquzxtqerwxlperau[kqnbhymijqtvtzxbra]tcwbvbockcilgvn +bdqyqodloytjtcylu[xgwgnadrhxshcyhd]qshqmfdqpzbruygmmzc +pnwkymgknqqdwzmymmh[vcnetknxxjvihfrlvq]cujdvtwltkpkzwkc[owjyboqcsymigajgish]bdklpwzslsjvadacm[mmimdikciuetfjeece]dxwoxjenzguercr +vxgoxslogbrjaxbjg[qyyckvarfyidktepi]odfkcgodqdusnjs +nmumnqunfnuhvtucy[voatnmasscuvwjth]grckxjhdzzoqtpgwm[qwmgudaltzavyrchqy]bmxedeqkwkgoqyrmlx[uqzdpkjekjgfvlnfwh]tpsfewpellmljsakhea +dvvwqujegsgarow[rkjpzfvtrtlpcdlc]kvpqbvyshmoemkhvq[hzbtnbzhmgaufkfvwh]ipdgirduhpdkhcwzfid[jmxetzvqbkrhkices]yzrxhfcakriippr +xyijrstjowvehnp[ylbnnbclmipxjtxtbb]dtynyczfzgqozpa[rmontkapaesmlvuasig]qmuqzwqsoipzutdwz +bdwyvvnsxojfzifhkr[mfdopzhxfakffhoudpz]vqnrhwzqbahbztlynpi +hymeoolncfmkblqrd[ifbyrijjwxsjvmhql]vgybqqlmoilegcrcp +arqsuxhcivbxfiuf[jfqqzwkamooqvyj]awbpyjrtunzulggzmh[iipnlkhwzzmzcdi]ktvdnpdmzmkrqavxsxy[dnoqbxknjvouymfz]brcemvbpovqjdvps +sxhcuagminkkyodlma[zkcpbofatowxfdddhv]iydjxsbzyvvptmrivf[thuzxghsyyrkqbjozw]zicredtdvmavltqgeg +qgvauvsmewyfypvgx[bkzpxdkwztxbpak]ghwmldmcmotjcmun +ivnbdeggumwedodrru[ejwxagdnszmvpyxtsfv]eaabhawecgtctegy +nylnblglukusyetuly[annmbyywmkzxoxcubb]fwslxffcquyfzezst[exsgjgeufpzlscazuw]rebffdvzignmrpriw[qwsiovjdtaimkun]utobenmeyrtxlorxjx +eivxnczlgqbmybivjx[zrbbxnnjprbaknh]gtfbkkxqoowynpt +botxfdjpvcayvpxmf[jysydtitavnzahbeg]zwkgkehpvxtocktco[iodpobnripiqifmexh]zpnrcxntqwwwucz[nwrxbbqtsqmkaiysi]pecfziyavdcfehr +bmfbcrmibywamwmic[npcluivjtbtwmwxmx]mxyepxnjdabcuiexhwi +kezzmzrmfsmhwxfhy[euevwjfsullybtlul]edrcskoqqmtwbhhafnl +yywsnxvznbcockrn[fnmwrszfamgerfhocoa]uxfgnvtphthtmeuyy[houdomoboxleqhrf]zznqyqwslypolnqef[ttbcfuirmlnwevhzw]dmohemntzpwivaab +xfrmjbgozdwamlqe[rdrfdfobgryckvow]gzbnazpqaqxcjdro +vdxepylmqqekuqe[hagzuweczkaioxyz]sndgjumcegndnuwwukz[ymkpvinydrrvfare]oplwhupwenqwloy +paikbyhegnbvcqa[kawvebmxrhzszrncq]noltxgnszsqxfbxbrk +hwifnlppmjawmyb[gulsfllyemlqkcws]wfopsunpcakhzkz[fcpmxchdgicqido]tlvnxgdsecuxsux +yogujlygnpdyhkxpdf[bawcwagtpbuwaorpa]noyoqlkcbsytnzywva[zvdbrjsxhozvyrugdnr]yyehxcwcnepivtjntex +ukkuxsacdvwqkgwu[qfhnxatswcchleqaeg]qynrnkuwuynramm +srvnvdghsmgtyvvli[gujzqjtjtrdfeandy]rypduscceqqfodndh[bssbtbzcdoiygtdse]klhkfnjidkombeom +hrxpcidpccertdnde[iubpwxhlmbnofumjnk]tzjinnaqvzhuqmjgzqs[tbpdksrgbhbhscpnns]kgaslrsilgklgukanif +xhrwvvblyiyyjithaqj[nxzhuqjrftquwsq]juvsrstyudnsyjxqpko +qjjtuuqdjaovcgs[klwmohvmeyujgvauez]faqyixqvshgpkrgvac[hzjbtsvreecwygo]vluysvnbqjuroaondag[qqaysmxakrfjdrpvj]lteebmjrrlysmwocpg +fkemhtixlciygti[babpytzqdpoovfy]ptjooannebsdcfrs[ismooacbkqjciwrfw]wsawvmoxxzwzloxunq[wrjhadcbmeslujxk]zckevlidqnpsdordy +ikapdixlczlrtpab[xyfywwygclrvxmc]tugwitpyopgfhucrrp[zjnmpndgvwlqnsfnemv]xeahjahtuyjwjwxfdv +wjbljlhlkfhhkhrz[kfhvlihkiqprhjno]mhceaicjbnvajugy[rvkrsptmdupaylqsbv]nptyjetdstrwmqjav +nqcmyiscwhuiafdyg[njnrwedfdsnzkyg]rsxrirfayriqxvyqthn[alkdpteuyfothxvyeow]smfyaybytdibkus +msvwpibrptekclckgdd[gdowictxfvmjmdtyimm]nlrlpatlusnrqcydh[zqiivotvmzapjjdzhx]eqxxguxozcbzlfkktk[amsfzydattcuqolcoaw]exjpttscqgketzhe +uqiaugsvrqenozqcnry[hcmsmwdqjcoohwlu]morsyizcifxpoyzes[tdnfcmzkcxkltvom]jbkvbwcolkcpkxdlhy[joounotcqahwjvx]teeotmpwnuvnrgdxscb +xsejzfhwsziaedxovv[accbrvbghrsomiv]glmkioydimjfcneh[xejzphhekszjpec]qfetmjhsfagbzjurrr +qwmyiuonuwttopaz[esdvdnqxftkihzblcc]xxfxmkdxigfxfwadl +gnvhardsrapmlpmlg[gmliinpyvjenkrnnh]kovjprgbyfdknmnbfme[nhzmroniytmwwfp]falokmiuiibxhheszok +zcczeqrlhunbfsxu[ifzbbveczjlfwppp]pvtsdxzdoxrrlukmqmh +rbgkskquxcvswaf[xihgvfvaxkptizohvn]tbntgfbhclvkdael[zuxdeparbafjpwqvg]cpfuexhjmkrdurlbnis[vfmoasavisksmltggm]hsnrpmdkogfxnprmvxu +abttallvhutezhtr[beucmccowruviwqjxlo]slskvryjaodaowc[vqtmaqykahuvoqc]valnulizvgiciruetx[rbhcdafdupnswhn]bppfeuexkximknecfq +hlnjhkjucpmxmguhb[gtoyutdhjwfudqnra]pipjkprnypqtglf[phovsbawbyxsuwsyopo]phkewndekgucmrrbw +bikqggafubkrtyskep[eugvetcxkbfuajpuz]drgqdldmenwxyldlwd[klwzyogvokknfwdqw]ffojmxeeurqxasxgf[qdjndihaiuwjqie]uaatdignzrdeyjddxzg +ddjhxhnkcrmnaztvps[crzhufiibsjerulkslh]snirbjgmmerlrucjlv +ckxphmsmljtplee[mbrperwqumwnitb]aikxmbbxmgsmsfgeni +zwmouppnlfbatcigqkh[kahnxdhbhongbfgmtxy]kfictxvtzrwlzvxees +gfrgqbgweickiocqas[urgmzzgkrwpkfhpf]aazsfnctfvvdrrf +sgndtkclbxdovlte[ylbolooanippjrmyi]lfydwbjkfsgdrecxzn +gfypysbhqsgyoxrtxxp[vdfjphnhrphzphdia]ekhgpckheqjkjinexuu +tagvhpldzimodoca[odnlmmdinuwyazwif]hsresddnysmuldvv[zpnjyvabzrktghfvtfx]jbzsfhvzaglqkstj[leniqywipplvkues]zumzesiphmejqufbn +qhkrsmlwyoxfawk[egspgdlxbrdcwvoeje]pxuytqzjiabwebbmu +wsxvnbuosiwcutjct[nzthycbqcazrnqppb]keasqheprjcqwac +jyiifehztqkdshfuj[cddnloevonuheydyle]tftddpechuzfagnww +zyicuknwqxtzzzy[mqgzslkciigsugirbcu]vadteaxyvnpyhwbec[waifsdqtrcbdnvrl]dygogwgquwnouhc +jltdbxzvwoxlherhs[vuuwuslxdkthbcs]ujzniwntplzaaldguqb[zdcnhufvintzrxm]cunexbzfbuzomrv +huikyoqqhcabtgosej[tqbxkfxeqyclgcqqsu]thtunfddczjfocqmr[vddedigjifexfqgp]otvsknxemvtrpbxw +sgukpjkupqmgtmj[qmvzpbebkypfmje]howlgwptfegdnqp +wnomkfqdtyobjkmd[goockdzswfoumhiavf]noshgjhgufjxgxiro +ivzlyzlnqpslrbldxqw[qmlmhingxmcporfx]bccugkqyzoqaqbv[msgojkckxyuihysrhp]hdmzempetgwwycoy +xzyacqjyialgkmmcj[aqenwwtnrupdsmitna]bhbicwoaervlixo[cggrwmpqsyxfoidjm]yawyxhdkscodboohvvo +aoywrlzjkqkzcmmicvi[lhwojrkhqdearhac]zwhrxrrrmfpkjvrnd[zwdpqkomjgjvkcndhi]cxpctyvgnthrsarfhx[clnierazieohvgsy]eydbsvaautujuqqsr +zfozpdjsfxmbwyb[ignvlhfnrdhybkwhxq]qfxolqnfiyokzcbdy[ohvvpuipajnqwml]rybjvumgzqgzfveqjvy +gkvxesvhovzoekxbmgh[hjnizppxqxtlkdj]mqvvrcdepnalllarg[urffyistzzqlhimfhi]yhndztrezwcapskbkz +qbuqvobipnbazji[qypkenwigkvsjhfdhd]pafhisczyaozydialh +dkocroswvahrephwueh[qtiawejyhzlhsnlaxz]yyelniorfgcpgfxtle +uyuylzyqivmpinpi[nxooflqcmtftzosn]vwxiscnnmmujalwegzl +ewyjffqwxipurwkejav[yxcfacgyuuqpjqxgn]bsxufukndbljizkbo +lglancnskvgdozzuuy[eossyfcrfjnpqtim]mvjbtylaisjdcgyn +lxrbvlmepaibubsqlc[pnndwclekhualwxbpg]cxaynaselbcbisw[evtpqzovucquqbgg]lsscjpanobjuqlpkhtu +wqcqpnmdhfupmmaa[qawfetitfsotgsibhg]vanugoxziwlnbda[apowiuucwbqxkcxry]kithnvgmjbuevopx[okzohlobuxbbjxeul]wrcnqenrhpvmxzp +qwmlncrpjifxmtyxjil[evgtbhnhavfwyih]ganxbqprffolbtg[pxidrhwgdqsycynecqe]sukgwvxkhbzolomvx +vmgykxaeppaasupwolg[pqkilujgqcoxpzys]vtmypzwtqecvidu[nolweceicrhwtvov]uevlxruhysbiedfibc[ytdalspbuzpagzjr]yrkwrgdaptnoxcqqr +fgwnpezirnabdiwcknh[qnwczufxpwtomgr]umwdzmivstlmecryoh[ogyfrrqklslzcqoo]yohswnizpisqpvpyu[bmwnspsfofxvrvqkc]itdkhtuqsybuiom +ynbnpjgaoammxaoagp[xkivkmwwiejjbbgk]ongbnbtqtcxqipe +gxuxnshdgyttcjzvk[lsxpwpvsoquxuazidye]mfihmxgxumzfhnm +ngwlkbdsfkoopeugbf[zkcrhoyehnzszjl]jwkxolilixmiake[kcoazkmvlmmlxhlip]urmeqvldopqdrvrdd +hnlkmhqgkitizzp[dgtnogdyumxjgnh]gazsmgjzighgwpided[vaxfshfsqkmebtkceye]ndxcvfbzddvksncrr[clhmftvehwzwljbp]tooichznleiqlksnv +jgnvwreomaddorfbnna[oedwzjkpxolayry]wdkdtjlmdviveeog[tkbjzabxaqxvbnasst]lqttnyqfnirsajb +yiuwebgrrtctqhvq[dmddhqpukxspoiaua]egktbjgjcfzhltkjtyu +sbfvjniiethddwbjx[guajrdwgcphepysv]qntvmggllbcquzfu[qtlrmikwlmlzfpqufgk]tjwivdcycoacfcwwfyl +mxbvlmxjhiorcnni[ubvkvylqtxbchszgp]kzxkzbjtogzujapfq +aezkzdgfurigqcdxt[kkjkjuyowyhylcxzs]maogxmmqteaectjv[aocufmtewquabwa]wlidntwbxueqzbql +gngwphszdvmcnjj[qvbontopydlzjywvaiq]jbrgkevvbwzvkcpz +qtdsnkqlmcwenkzxodb[wqmskmdllfarzicsce]dmubpplnmipygwqjim[yejatlbffcwmlyrek]gsvwxfaeblczgpdvhhm +ktshrikjzljpacyux[omqqrcsqtbtdqsupfvm]bggungenwwenmztg[kacviemyqpqmwmiivp]petgeydeoygoknl +lvvozapyfvdohboxrt[sqedcfculzdrbsafvg]ioohxzwwppkserbkim[bytwtckhnlhtxgmes]uzwrmuczkofyfgv +ocskfzkwwmnkize[wnjrhvmcynlydnbvn]qbykllzinrgwfvod +eqnrivojtcjljsfcj[rlxxybjowtdptsg]rnnvkyrsxzytscf[mbykscjmwlryaiictd]gmfcxwtjljrpihljll[gxrwqhtelbnpguyvw]lpbbvcxyokowlqfih +sujejaymvqavyvhwpe[vzobezygmsxvqwnnu]dmuyhdixfuqfbnehqve[gwdapthzmbpwtui]hxhsorcfmtmrdqqrzf[dqrxkbkttpsjkqpbnl]qsmueuwxsrnejednm +vmqbwehpqesssnps[jkyzwrfofkfqkse]glwxlfrqaamjejrievu[jhbggigitejevdzgqsm]sqxbxgyvfpqtxrlbca +mlbhjbelhzgprdshat[zcytqxmfhuyriabyr]yzhvmpjfzkhgxavltdz +ctdohoakygysybf[loxbfdhctlnhggxpoq]bimosyslpbihbwqp[fahhvvdfkiiucdf]bbgugrcsmoasoxyymgz[wjhbkirawxanrqf]palckvdfnlhficazmwm +qoetptacgfcrdrstl[gpcfptpchpeiicbmfd]vsjqqgbwiqlndgmop +dmlzhkeleeqkgqvriu[qxzssbjfthbzhdf]inuernrmyomwyre +pcezyuyfhpyebmvanp[jccebfvhvicqksgwyqy]nssvudrlhkckath +mrpkkivxuuozfbxejfm[bkwbwzhwwkfqqlupltj]ngrlyucvbmdilkke[qlzntmxfkeapmlbumu]ynjqdpmonwypyjpalvh +tkqhdmjsbnhbvkdgo[jufmjoypjidudkbcvy]olrsjedkqdbeijypjp +brnhsqltbrizrohj[dlzumegwwcbonaa]llqtbxfulkgjeqw +vxjgwcccalsesmngkbk[owvdclfjsyhgchpt]zgqonnjsnsqxxvqzmqs[wsmtnxjpvzcdpobat]rkgwlaecswhucndgv +wkjmaneymsjdyjd[uvgaxovnqgsvamsbz]naumvynxlnbgksk[mmjeguwrwppdwmdjlm]puiytitjsyskwomrfqj +fquaiztteofhvsbcba[hvstcffflwbvchn]ntvqaedorhoikidi[cpypurqddikmaynmxzx]qkrvwfsppcglqejkn +cpjplvpmbumvgsduald[sowmjselnjpjwhav]flufpydujtzuzusyrr +jfhplkijkstxymvwgz[kbsytlilpsegzanvlee]ywcxnydvgcxzuibxvu[ayieqmzukhoxmcli]rsyubeqkgvobehe +ocsbswhjtvywugym[twhemgyfgdfegogpj]xamojomgxvyedia[rukhjizwdryazdtdsb]fdiecwglfmtfjqxocw +vywxxiyjfwsjhvjmk[mwjsyhoifeimjqtmx]ribwktjvuvxakqqznf[izcdtybzxfbyubfbckt]aocntguubagirsgvz +ursnbtivqkjfkcbls[ckjjoszuogsdnficmhy]wwzjkspwdvilshnzg[gzuoexgingreqktak]ywmfxtqooxdgqaa[bmucdllxdktiifoqp]pvxrfcknwxdjivyym +ebtozyepluaazxsuoi[mocwxdgmeyxmoulo]grazonsbnsnczptl[rusiwrrcbqpybtjfxt]ewazwwjculbvwjgc[jmoyjpbznvzlvnzu]ghwsmgrsqjgragu +cmbehdhyvukkufctwpl[toklbggcxvjerfqozbj]wqbacnegquxmszdul[ggzaznwywpswuxmlmg]swowxuqlmlfvxmznm +qbebmodvutfozxt[macysosjlpjhykkb]qdewwbokbiqofejcsj[ddzpouyuxgogajwmuk]iukkhkmjmrrkefycw +adaobhuodvmkfzrbk[ucroxtaavsmpvfd]nvrnzhxozidrgvf +yytzgmmuqrfqegalpow[eyefbjmsyximixd]sgxjxpfncigzmft[zuwduxnhjiidywvsm]qmdvambkreelttqmv[mqhlvabyxnmnjfpkigl]vuxmnunvxclyhkxi +qdgaknszcwxvyhlrfsr[kbbxnitytjopwtruar]ucanrksrycnoqlcvrd +nqwjdcnwfxkdglllft[gbawkxvzhyiprfenf]ysybkzwywpqwerm[cwsthmeytiuialllzxx]plcctxffnigyhdfmndc[kyyvjcfkxfofxfsrw]cwynasabqneione +kqthcqbvfsncuenmqx[rpokleyrpkohzefrw]txvckiapuezhimt[rrfglfzarznwgchlej]vpnrufinbaqrbjtu[hypcxgeuiotonfxvuf]cfpjwonfyqddtogr +aaxuojwascuilsqjt[aqpfsummtaolqpdi]qoqnuhfpinypgxiex[peasbtrzdkneuriyt]dbhohenosanaxkqqxq[fwvbczhithdxtbdpd]bmncqvxnaijxuexu +mgiepbqfrprbaqd[swsyfijoncrtrigly]bzdkfgrsmwamezhp[minqrxxklutrtrfxps]dacjpwxdrbxhumh +shdjdexuhgauroqwtmd[jpvifgjpgzmjlrnuyj]svvjpufybafcjsoppia[albycpxsvxdykattdos]ewhcfugwuovgnepvovv +ldwjwyzaqxwfrelh[rzkhymugnnpmowx]xufycgvikehdxxggp[mykgpsmatnpimovscqe]cpdwiemofukofnauyh[iicxbleijoxlvml]dxzlvafklkbfhqke +cqdtbwoinxghfrwulij[wwuuffpfxzcckuf]zeayaofaskxfueiq +odegrvwiwncavmxd[smgtzidklnmlnltytx]psknhjsrxwqdqlw[kmejoinwatytdkz]dfziwicdcmfwawwf +jzioqoutlwitjdcb[furuyivyebozkvcny]gfhakdfpfouliybsvk[vfrykghujsittpcxjnj]vjekmvdvwkaffrhhr +rclnyybawbizurp[cptbsqptpvcuchcyncy]rlqjeblagqogxwy[mwexxfjhkiyoihog]slgmmhvjhpomcvgabu[xgipgcmbydzmayywci]tptdbfqkemdnuzvuz +junsrcleteqbngabdh[loajbjvuielphzeel]yquxjlecdumepsr[lktbtwjmyeqrurys]ralurzrcthwtkenjtet +zgykbezaearyhzuxhta[pqtjhajbyttwqzfozi]dzodljvnchwsytat[wrdvidyboznzzbgvxc]fnpmjaiocpucgucwh[kiqymnngzdrlcncpw]xkjzheobflinqcxu +kbaghyebhrmquslcfc[ukdaffinqagmwhvhl]ruyaqrvavvfrzwiyit[jdhkzojqtxymxoaval]qfxsbqwjtsudcet +obscoqxaeartfjmeue[dtceaealpasuxsdoo]zhtpbqqfonksrcpu +bphcztpaoqfofau[wlhtxjzhyooevsax]pvktnvejsbjwsizugxj[aijfjqhoxneawmq]dlfbjynbvobrkyur[swgyiujwbafngtiql]nepaaduwebbpsrew +fsjxwoamqjhjvyyr[johjhabbsofojaxccga]tqcnhtvkimixbyiqt +lrasfxkclqtptlt[bmwhuwhzvfmwxxwla]xghbszjpdbdykjmfvhx[cerzilbrtilvfptwid]nkzdvndlbgkwkgzwatw[njpjupthwiwffesnct]cipyoqwmxtiugbyfmk +txfqpycfderhwnqtrp[cvtdbizqhlxikkw]nuxymppbyfdpayjxt[sfsnmgqrjqrlfxh]dgwdxoveamltzalgyw +ntfdficysbefpup[fvdhtaqmjosqoxosu]pwrbdoceiweqrfyrx[ftlwubetphczbxhx]jolpetpuszxjkxuupke[mbcbzrxeoqpibuyjsgg]cpdzzdzkwbucybc +pwwzjoakzydrvkyn[xisfgbgguunevtbg]ntzbwgeohmdvitrtdpj[fzkkujhplarmvzckn]whvdpxzietgdyfhok[hlmsjxrxxrdjfrzncyi]xvvkjroullhawqdj +pgazkqglbbjzrofkpy[mkeiyuwlxlmgmeugcbb]oguzgbkaasscxhict[lckibbhqnkatvzlqcw]ulilgiydzfsdwngr[qcrozfdctltxaatyajh]ojyzengehkhylgh +zdatmhxwkinjiumoy[qwhfmokowsvzgcngeax]uqebryzrbawakjz[ltilidihghatuhi]lljxtazlhxbrnvwsrc[updgoblisisvpdqngzo]tjvlrlfopjdoyoisim +tfguxgdgurymskwxk[ngtycndepeqrcif]gttrbjkhsbrfczdwxo[xulqdcmgztpjgiajnkn]pgwsbrzakmvblfsvlsd +lclevdvivjogclcmn[kpxlegarknivgdvfymk]kygexxjbzqppiywvxtz +zadpyjsswjcfimejbc[htbpkbzsmbkfeqww]ydwbivnpofvmzvw[archeurcpsapgylrf]teidjxdxdailsbb[nmoqxuhzymlxxqykol]zbesrnrszqdpsbchg +ykwptdjfydxfdue[svxdapsdzsvmsifz]omdvdqwkswiktcwkma[tprmxhwqpdycftzlsz]dyfcmpaaokppkzvoa +adfqjdussbzlxfvlg[hxktcqjmyqctyjnl]ouyrbuvumwwygdc +rrryoldbjkwnauaz[uarnttzxeuurzokpa]clkjazjocprwqti[krkcdnwldqexavrpo]fdegufvailefzfi[izadiszyerlbhwd]myayzynvrymyobbfdc +krttvoiaszqvnme[hlywolnuxbxjhzmnt]lwcvxyuuugaqribebi +yrznsouskotcing[jnttzbfwdrpszrcqr]dhxidpojntnwrrsjjc[dlvjkiqqyrrougz]bjhjvlhvrefihomycx[veomjtdhecgcvsshcwo]iboybnggfhdhymyukl +qtvgzpyhogqojzi[vtbmgswqkcpdzhxwzo]jsmnjadclhgsofgrq[lltxvswaeqdbvbyqj]gvrdvrgygzhbetbkjq +oqmbdnnrpqmjasc[hzdfeapdznngjzjchow]fdoxpevjbqngxrhhlhj +ujszwtyancoxbcga[qzpevsjkmozdbeqf]bdzegnfxtazxdna[wyinvjijbvudlvkwvg]mrgzfijgyouxyio[qehebkkwomsmozoojy]sqhbhyonrnjocbjzfl +hinhkyqfttbnnou[luuiucbkkrnwiuqbwb]ujfitmunviqwhkiziy[wqbetolmyaceofd]wbwbxudxttgmtuxjeo +schrxkylmxpwphllds[iijplekwtutqrdkmsrt]hvejiqeylhoxdpkxz[gbhczsfvoidbktsgbqu]rtfwgjnvhjhemkkvbm[lxojvsbvcnlbuofvwg]ruakyrabueflgsnict +fvqtupyapfmstztmbe[zxtzrmjxlmgshjlfywb]tdihozcziyvstvdtvd[ifzqxsyyhgstjwlr]xihkbuvismdtqtfm[xtxunrrzvtuhjlzoji]zotmlgbjircyvzgcxkd +shkjoyjuiufvxbluji[saofjqdwpwodltmra]xldohzmyameybbnw[zwaispolnanumhtz]hpobrxhytzqmkrkf +jgaozdtecqmpueg[bnfjhfyhdndzlkxrcb]esbfjomhfrfvzgm[wqvhdvpvrbsazqzgnw]lkmrymdcupndnoktuv +mehlgjudopvrolla[ghqzncojnxbdtupn]vacvkbpzsztmzhz[tcvqbgfvrehiycr]unpokrfctcwqexbgo[hbigocuneutkffaka]dwwclmxsripmvcluve +rkdurapdxvohktm[idaisubzmlljyfbblho]kkkxhnkaiaxxyivjsna +ujdjbvlqoavnuoeeilr[tpiehldutfyewbqv]crvmofwdjdesxrl +ptyvtwbbmoujjbvsf[avhpwnutnjkysjdubd]ysgpwvxugjswjzhw[fvgohaphbuqpbwzr]sqvpubqxxhmfxvlw +sslbaaxswqcqfln[nmdfjxyyrexvtxv]wavnexwpbgnrbrwyrf[deouszhzjkbxxrhvkn]xtfqfjexnqgdiddxh[tphqtpimimjxxkkndng]ncngkkzdnhmbqohupgr +kcowklgmyivdmreahg[nhhhjuxwoafzwur]jokzmfbbnzsobiahlhi[qgzkumabuuxqhki]ubnjasaqscrxdjy +ccofivnvzaxcise[erfolydklxltrildvth]sjprbxbfldbsozha[lrbdfwialwqinprra]wqresduonlpwaamhj[nmlgvtrcuqvsirfhwi]qjtgpekylrqmxxbm +fugomjlqyofxoij[prndifttmowgenapio]jpvcsgonnqmvqrxwo[yuioijkmnwkyiba]gtosuvsrcszwsotg[zvtndiccjofwagevdcb]qpdjgtopkcimpfyqw +zbzstwtngoozwdgtkme[mrcfdmgpywwvikyrto]ktlmqekphuekemo[wenupyuqahrgisu]wjyyqsuatrkzlohmo[judqmuzbdrqamof]qiovruvlcreoircteb +yyclnzxvjfymqgrzup[koyfzianzwtvdjga]jtfmxjxehvwejfl[xbebzfwcbmjrhka]oqnpqgevsokznwo[briagugdtzfswfbq]dmnccxrswiebtkwao +muxweanabaymbamknkz[abtqprtejlmchtpy]nmrtnrjxewbqynvbe[rtxnzbwcjbtmvob]segkftbvlvczkgubgp +hkihivjdrqvywhwt[xpciwwigazxeddp]vkaysmwlighihfka[lcyiuojfjmmhltubrj]spandymlggnmqiact[xizoxzguscxtsut]cmjecsmmjasgpvx +kasrdhbhmrlwiczlyp[sfvdefhihrtmmgele]voszgwzdjlvkejvrkn[ahwvipvknuyzrzbrmkk]yuhtxgfpaipuupqep[hezjazdypaguhxkwud]bsfgurgwdetewwg +mkxpacxlrpbfqio[axwgpntpusujnovkpxp]afzkmjvcysdkbfeli +mspmqxwmjhzxqmbhbj[zniufuwcidklzfpuoxs]uvlrvuhbhjhudvx +nrgtmsqbjxlnpsc[hpbskrvswufaucjmjv]pkuulesksyygynxyku +kmopgjfjwvvrfgvo[qsigvjyusqjqziiuwxf]ewkbjkiqfgdwhkot[tbrynegplyfllxcqaar]cybelgkyrndjodpf +wjzkfwmrsnyjitglauy[jnncpybddtktmehxz]hluaspiawjwywug[ujwjjttoevainaxqmer]gewchllvjclaahplb[haewxwlxjjnfggtg]uxmnawcpzfwhfiefo +jogfshkvmshdacro[anluswkewepuhbemk]rwfxbxtmtfgxatwj[lwqompcrkgqzkajgrqg]ckjftivpzkflgbifzx[autylalyokqqlxgu]chewqmwkwewmwoby +vhqxmrwadjsfoprv[imclvgvrtvqfbcllpr]kmgvgofdlkarrusoo +kwkqhpdsrkdlhuq[njldfvflplvygnihg]hikxtejykexrghupbqz[tanglgtyodyncabh]ennzrvfvgcnlehci +hmibwhrmzhcxvzgt[vrdwkryugziqxxfv]tcgmqhirboxwvyy[mjgojhlpjolsjtcu]tphrqucjxjpsdsi[ahqidqxdgeucevqinms]edzoyewnqweqkla +deizsskvkzcsohdf[plhmdlimpiduxfdyzv]iaodhxioxasudzv +aepgcwcwlpdqric[xyxiplpunvajsjk]dkragqziaqxgbwr +keocoxwzsscocdxcf[lvdnlggndlqzvxjo]cajmnvjxphmfopy[bxfnemakuysdjvhzv]ymuttirruskkndjlpw +rrfoglacqhfucnjkhsf[ejgwoteprdneomyqphi]gtsffeskyegnxzfkssz +awgoetenjdtwnpw[hflbiyqshareqvcc]qxwgczjnzceffwk[eumisjskpmnqfmox]dtsifzhnbdvlfaqdkwe +jezzkwqvkbbcskih[cxqpssjfttcropqrk]eqkohazzfagyqpjt[qveehpentvwwdazsmdc]enufhtsnszihemkf +zqokauntjcoqolc[kfjplmodgrkaeuuvq]fqicoryxfrkubee[fcncbrofqpyxdnejn]yebngpgxcbjnivisgza[bpwzrwupgpmtbhg]ufxyezblslkscovzaqd +vdrhbvkjchpslgpwwdt[cfslokjhwrpogwmf]qkxlvkrswbbbhudgk[ryazzfichahhigijhc]xbxrwruzjhyjlwxf[xlulxjmhxnhmkflqw]xtkuftnstlwxwiirwko +qwbqncrimtxfjspgyyn[ysolszsumngdzijn]stfhvhqwymtjpauip[lnucccqwwzenxlytrb]aumcvdswfuucagbkel[skoaaxgeqadxehwvjt]jrjzozvfrrjrsvmov +akweexwajqyahlpq[pjxilukjsvzjerrcdcb]qsptnuxrshmerfccxhb +xbnsmtgyhitmtounl[msqlrxysydxdydbtyho]varxjhsmmqlilsprkq +udmbexywtscnesd[azofuoboewwundyif]mykxybobvefathvqkfx +gjedwdykwqbxqpsb[nykqvlfsckqcgfhvbd]xdactphykfhbpjollax +tinuplnorykjcuete[qqwstzqrupgcliapi]durprlvdyucmbkhceq +zrfmusbfbogbrsin[gaayijtuqfbfnxb]cgjsibujnswdmuhfez[rhatyymizrxrqud]wpvajerbhxbtrva +tpjpjlmhvuorwnd[vnwdgopuigazzwytzbe]uaplhgdvedfaiboz[rqkafxfjjzjwbzwung]cqwjlakbfpqvxspia[chyrracxefgkuznb]chigmcxzjqnzsdn +badqhtkxeokdbres[wmdthitngyoujdumxfb]lnafdeqakaggcdttnq[acuhhjaemkakovqq]vfvloofttmvvolbpgb +myaunxirrlgywdtyrlp[nxinrircujeyezto]tdzynxmmbhjybgz[sxbjlwhbkhpplbveqk]oplketzgeeoczpadvhj +wtqjkfmtshufwfiux[njjvqujaetzgcihtxvi]fapfzhffwqovrvfpatr[hwjfoqsbiothjtrbg]sfwifkjkimjnyzaui +milzoncxkgtbsgtxgb[zvskfgfsgefelbjckwy]lrdralfxvtlupde[kvvibrstieyneglniu]pfyopkpteyovtkahwby +sjwqwumquvxpwokonnd[wooozqoxtlhwsfhtcic]tgzecomscwuxgazattf[dmaxzgxonbkehxgymq]xbqkxgbziuumwex[csesnsjiexhypqrxjj]dbscxozezqgzexrwci +yqgpqvteubzxsmjb[bntiezjqbiywrsq]nrgpewzpshvjwdx[qifsblzcgkiqfmele]oypyewwjmytlaujp +bxlsaiblatkrxpcr[xxnilxrehixaglra]apwnnbwgatzwgmr +rqsogjhjijafydmr[krhzamyodyfpbdv]jkjdjxgdszznhiv[ywihxdwlgdadayqm]cjvrvelwbegtiqswzqr[toujknandbegjga]wvdikqjnnxpuxtijios +dqlbbhlsllmcdejnme[fchpcehhwkjwkythfc]shnipixrreczdblufyb +pljkshxmvbpvswl[gbuflmmaywvbjwibfud]mexysgjrvoxovxtvici[svuosbkwxjzhvmztiq]cvfjfnisqtyomho[jvrshoymwbzcpgxtxl]ysdystgkeioszdbora +ooyljflrcdoujmfajfu[qvnbylveipljcmgrvl]cjfvbounfvjfpsxmbnj[mohdhwcdrykexihcgvb]gfzxjkkqdnspzbqb[jkoiqbqtbjxgezxvsgn]juvveztzrtcxhyp +ebfbaesgsxjbwhkmpxp[dzkhyyykwhayaztjt]xkxdjdlfvlzpqbb[tjdqvwygsgoldpffs]uwccbahfnjkhbfzcocf +uayfnudukxaldfgdvh[tshkbhbydlzzndsc]wtjmhgayuizllbngcr[tfglywxclqmgpeatsva]riocgxwsethrhbh[xnerbhkafskywvgxbdl]yzubvjedgzbpqqng +iensavdsekzfncu[frepnzfzbolseio]thbtyqsviqjozgq[mqobufwdnxkzqvqtgj]woxdzihysaypdxamitb[llqsjadcqlogalbice]xwrmwjiednucqqfuy +lgmcluvxcilrgacyc[ozvsjikotkgiepo]ximiftuuulbsghmm[ykwtdziaokecacpd]bvhsjkjycywcuitep +eoefpqghlbkskrhdhv[wkzmafhoocaswuz]iyiulabsaueugqys +noklaptafpgtvzb[hocgskfdbisxdlcdbq]sgwqzdhmwapbbjox[yyjutkzwybpoeea]xtnvxgftzjdwqhgh[nqgarhtwigpfriuq]etonjczcgfhclbf +tyqqeyfkxjcnjih[edtgzfrlpapwoyrnccx]fmsegnaucwnvsyrsj[lptzjaxumqhbwhmljyv]rugwpouagbvimws +enpywofbxruqkma[lesuqdferlsfxqis]tqkchirhakakvbgf[ytrxxjwygqwaauwjsg]ncrkbikcmvtbtrabvqb +nticpuumzthsihk[asrmrtlzizgsvnvcxny]wjntjizixwyedcrh +yjkotqgkximxcbpa[ttuenysknomggwwvvhe]htzkgoilhlqrpmbcvh[zucaclqaevmjqfuy]pfkvmsbcslkjxyydhk[obfcguogfxfimowk]eczitrwtnkfqyvxco +nbrsaktghjdxrhul[kmtgawzkmntyypqmw]jggmopgbovomadux[pkwngsqopjftulu]ymmfdmimjpxufntd[hnovhrnfsloivbbueip]oreyglwcjkylphqtwl +ufynjbkocygleqwskw[yuykssufmvmdkdntk]opbcqjxsioqpkzbtuhh +nkxtoheqxycxqbp[nmjgqytppiuscyylrm]ezhiobiihpmhkqjc[bewnvjufjzxgfwhy]hslvggdrixjquaigzp[dkaylzejrwivzcl]mxzgkigdgfhmczixkrq +fgcsqpmignjsbxxzt[zoatnmdxtjwltkazbep]wiadjhqakemepgfh[csuxhgjcqjsztsrwb]wdekgrxgngaaqcequ[kjlsrjjtidezpuitng]lhibpbcwjndstunhfff +ozgymklbikxnhme[bbbbemtxaxyxnnazaxm]jszcoclvxluigfgdlq[bkkxgjapnrpvovq]tdsakecfolgpiynztiu +tytomipjwhuqwshlvho[ewcfspufoolvxmeyodk]wrrxjaexfktctmwrkvc[fwdrputsdfepfvglfq]fqhmqffdtqahfpyelce[elfiaqrgaqxwpjbxcig]jmlxcfxgjkteodsufs +zdfxveufnuenptljiet[bxzgimeczdpygyen]ptmmjlitdsoncpjlwh +yfyzedhbbtpqiwmri[uqxjtkmjcivoqatycbc]etqdfgffuplikkgrug[ezipcwmudtfakrrif]kumvfsiqqyfrbcbvgf[upsfgrzgndzpzxhmx]aewrwjwdquhsagmgwah +tkhbexdnhdkmlogvk[rvuvfkiqrvxwewnhihc]yytysizvrtytoqznokd[cyxenputwxkuesw]qukaxyqfxbjvgdcy[rfvlqyyapixtzghha]sjazfjtokjizlxiim +ynwzzgtnjmfjhbys[enxaumsepjmyaapa]tctribvarqtdaceq[omcmnkckmzjjdhjiwvj]qlkbuktkubixegud[bbvvgpocsbliknv]nivyswbiijvnvvkuw +dwncikgxhzvktwgwa[nwmhqzwlvntxvjv]dmbsieiwdzgwecq[uvutvspxpxwfafv]vauzasizdqputolg[ncsglnqbwjshyxa]dtgwditcpcuncdcxn +kupmpwwjcwmmrhum[aakppoytxqucqfncv]gpuyruwkndprpqjqwup[lrcoaodsmpmlhnhnyq]zathwgfvwmumcjwaa +ivdparkbqlazewoujo[tzfulakdrwfncibtnza]titrajiplrfpbsar[rnjnbtkpwadofahdfvv]uwobxeoluadvnxyxwl +kkoyqwkjdgcvqaufnj[qucvzomguivuynsg]cbhahcwrhchflfuc[czlxnbidfvtovgdl]jmyougddwlejoyrfsfm[kcuqcjogcjrhvjpxx]khnizsdkqwzdzehlpe +wzeknwbkawxgvgtq[wmypojfjlgomvmk]tfwjzxvhrbxpkuyk +ivalkzrbqzhiqmjo[olluyctvwisrwwt]ndrunxditvvundvd +zezjmfpqesoftjufk[tdueprzpghkckpq]fnwlbwrhqmmayee +jpmhszgjuxnpjdsbtk[cpzosccgpfbvzuretl]nfpjzsqdvzkcszid[csygzwucakziegi]laqibhadzxurnulc[otxsegwpopkabmwbxzd]ymmsoiqsjnlnsvlsq +srgtzegqicrsutbpfsh[wfdoodrpmioayoa]kfqtpkwcfgyvjeyhvsj[yzcyshhziwjudxmm]xnmgrqxumondortjbye[nyajdyykzhnmolyv]zbdkvkbjavamxrafhbl +ifwabdpxckluvreesop[dsyliwtgkelyyam]hqwleigpcnogipr +bpaukztdyuwjkjrqj[dnslgwpwsanuxvtyn]fxkjtpifmtqzrlok[vfcgvkrunowkiilyok]ypgxcltrqbuzwiqom[ikzgjcafxhxmtgril]btdnvecxukjskjkndz +nghqjtbvhviyatzaz[guzxivxizjukrxwaf]vtggynfcmuttsnrvm[eqvzxmtlkaigaur]dmfhpohcbyjikjl[kxaapmbxolonwgbw]uektjdecblphouwitdv +fxefzaiaeclqyvka[srznplyazbvctgfdr]xakjubrnnbfykcep +rwlthwstbsaxphlsrz[ihywtcvcfdeczmy]lpxfewmiwnskbnv[ripgyxpgczfvxkzp]iltpwldaivxkwwcb[yiejtwqmnnnzywks]krnbkndouhoakztwzh +mwaxggiakwqnbihaaj[pxslpnutqpgdfvhvwgp]nhhnvftzfwdfnrqisfi[hgroxibwekbugif]btrhjqipvkpfvcf +xmxlpyuuqssmtmzqyb[ybwrbnrgkansaodfap]cihlwrfxgbaxddtja +fahbkbakvcwwazgioub[ouuvcmqsmykbkhfhj]gntumiippgacbcl +hqkuhmrurcqtkzusgu[drwgthikmebvdcjapw]vdxfpjwqlcvwpgsflb[mmaxekmyvkxfxye]nlusofrecbdvhbruu +tjyqhrxlyrubiuwl[voyszxwudonuwiptjoy]xggibveyrclwxsq[aolwexwhfxpwcuavvwr]bwkkcnpvsiynoeikmlb +cxpvpcjhfbokvuh[sdkkaewwgkvniqymkrl]emeetymmtcbrivitvn[bvyzmgaorsfbsmqoka]vodjpeovgjpofkq +nupojuxxbgjvlafg[uhfrugmmacqdsap]nxuunqzbasceyiz[ircwdmgmysazaya]qwsmsdywyhklvniiq +mxujioozxlybxvyjcmj[afimhsdzsmtxszd]fsckiqksntizegvxgz +htyhhcuqdfhhniloe[iqslmejacjbynzkw]nenyirdlormvppyym +jbphnkbvlextsaqnid[xdebmjhugwvnodt]spdqamgmvsuftfx +mpdupjaxozerpkit[pcivcugsbsqynoz]zrxxjvwswbpuylnxi[tjoxsullllulompfxhy]zobcdnaypuabmzfn[inubfyjlhoysdjath]vufswsypjkekcrb +qsbiexorinxuevkoad[tjzedsasyapfnvwa]qbfrkhbfmaxcgmovnif[evrexsygnumrldt]serpxomgczhbzjix +ukqzagjymparwzqvw[lnkduutsjulfxuqug]lvupmgsyiquqeepmgsv[ekenewopqmddlcqc]rhnwektxgccickla +ezrytvzepmzxbjapim[knaxuvqciriixgji]epksyimofrrkgawirz[tewvfyplzorvkyeog]bwnejljtelcigsqfx +fngkrmmwapuutwtn[pjrinpthoymdxemoe]qoxhlklweoscgcagw[pyrevdqrznakburr]fnsowwitbsxsdsdv[hzbrhpemwokvyhpohjw]jppmuxhrsdsmmprl +wfpphsvqgdaostxg[abwxepvuvujjmdbhees]uxitcdrdkyaqgtyrdr[rqdczpmmmisomtmop]lnqpzuqcyrdgzrcc[cvzwdsaeorgdzzklrx]ekwjqzkeolvlkkqtj +qzhiltifnugunsngzg[fxfhjhvijjnhnxkbl]bbaftchmgjrfuanns +isducdmcjzbiacltx[jvkepdvzknnyqegqte]zbuvzcrrsbjsqkf[dowjjsipssfisalqwmk]uzrmibeeevzeuxtb[ajzixsnzrxwpekzpy]weogtsmtsuxvjyhy +dnxhdwkvawccsfvncy[odsmukbcbpfyjqeau]ugusdxmjuxjosasg[ouwrwzplzttepynf]avhgcbmjesyqkzjgms +pwyizorvifedguhjqrg[zsafqttsqlygzwmqv]hxilzjvsuyfnyck[dnovwvccguuzizrjw]qgbluurgbxnollv +meqzvrprpthaebpd[htamsljskphtldx]riagbpmpasjnjefv[cvpfevyvpivbals]tgxiqxmhvqhhmrr[cgeamacqfrlrhaoz]vficakheeoprpbows +okkhpeexympjqvlamxu[mvjvngmxhkbiaygi]pnwoitpqlyqaiwdpf[ryfcbkcyzbvxuyngw]xxgknvjauivacqxr[tqmanixcxxbolxf]orhkvkwpyrwbymux +ipwcjobowzgrgzmnf[uahjinxxnmyyibzp]badwoisgtafnkgnp +bcbwbvyvqpozfig[twwsbwyhvfaddwo]jogvkczzowocmkwwlla[yedsazzkeklftvohfqz]tghtcjemmehumuyxar +bevtohpxkrlrjjen[jxnohlogvkugugmk]nrxomawkgbwlnqwb[rtjoeivssknwelkhv]dihcnpigtbnwfdlxhm +upuufvskhseazwfttq[kkipejrjmxwmqjsh]xquyqplziwgvkkiyv[iirqohxpmcxsjryb]ajblnptlfnukvae +sijztjuwnyftelgytm[mgirqlkcbaigiyx]wgbeoandnwaudhgvd[drhbrumogcajpxnvqov]vwandmoxgzsokgfs[xwgtfizcmyjrfzgejhv]nhckviycimfezwefw +gfgrgtizxajkaicjcc[mftrzuftzrgrwilsv]uckwgxywnamzjglbnts +znbgncjrhyxaxgd[xyyzkorhakwqubjzk]wrsdvjsrsdorwkgr[krrqukxrdobhkzmr]mdebvnlirbtdbavpj[adbczigmaoreudvgns]yqxeoeccdlpuwyvf +ymjcaobrviuqtvxjqq[jwpvalizcmbpfdjk]wmxpzhqvcavedvmhtn[llsefbpkphhetqhbj]qryznzcexwgvxni +ginmrsljkrcminltayt[iarzxlzixokzfxiazwl]aircthhepljgylm[wlorimkebaxcvcwanlh]bihvjtofcsnvuem +zdegfhthlaitfojyj[bltnoljmwcfdvle]gnadpzusiepwthtv[ieuoyrprfkwonhwjt]wwfphscvjchvrab +kdnddjueyrofzhjdzcs[asdqcpbunitvxrwi]usylnhwfapvczeb[ozrrpkegwtbkftyeusg]pncbcdrovovzozcazn +lkksyjqoayppxtvns[csiuzvhklkfijem]xpsmnkdmivkitka[djmnmzweqxrkfomzqhr]wkzmhoiasanmhez[wojpalkldcaopeg]murhvjrgpwxpbveekq +jawznxjorxwvflmkk[gafmrermlounwjqod]nalazknfqhepgnelal +wlszezwacdeehnlnoj[njlzbwkfnvnbwim]fydgpvvovkuardng[gqxvckevjodockykp]qsbtvwpwaaeatbd +bwwttxctuzuezxfdz[apvuanhzemgcupc]qcfxkvevimwvwpu[zhhorxgplrpuyabae]gzabsprhuhwrtkd[sqhumhfqwdgxthu]fyebhdninkahfyy +hhttjuhgvcgkisaqof[obpleewrfrrsgpumz]umcmeaytqjlqkyrawp[rhkhciyzmxciiysv]kszzqcmcylslhlpqjag +fnevugmjjescvvmbmt[bjzdquqohnusozz]fwlevkwzllmptbcelsh +hzqfveaxrqycvuolynx[ztsmaipixbuhbmv]ebvofyoeponbpip +utmnuyowmxipzhde[yuvqwfsuyhonciiepq]ynjvqvvifywnecwzdk[httqooeiilokkjghwjq]znixikpswkpgxcchuyg +goojhvcnizyiukzgmwb[euyvjdmnjjrkjwpu]puidllwqpsddlrhx +ysglduipsofxegb[kzrbdzimejxkyftyuz]aekosjomszyegyy[vpkwocloupebnjeo]ocdaynpnnytwrgkn +anheyoxddpkmqla[isqzqeuwwitvtqy]jnchwevvrgyznqsomum[kribzkkrxawjnfsmiux]mlerrnvwcydnfckydfm[hwouaafteeabtgflb]acwwvgztxwcanzizha +kaqernqhzefzthuc[tiuifctajhxawtoi]kyqdkeudzkihvfsn +vwwekuavrftztxb[aywyoempmajrdkxpsc]eibnjbszsfsapujqn[rxpcsihuzszefcdzl]gsahdvozzgxjhontxk +ymjyffbcgimsalujegr[dnppglortkqlowskj]wxwtxtdaaopcyvp[xfsnsdrlopdotuqx]sprrvphwennltlddiw +lguyxqxdnirprljpkec[gevtjwbiofgesdwil]phnydixjjjcprpxlpj +mgjnnftohavesepu[slwhvezajhvdukghl]hdhtlheqzqqrsqmfqyz +iapqmjgrjnecxylopbo[pnbvgmbhbcmcnpsf]opurzpqoyxdxfkud +efuoofbuyjoaqjd[achnmlslfvovmgt]xcuyvikslsewgqlx[gjxolnhgqhhglojjqhy]iarxidejlgphqwaei +uxpcurtzqgpgtzkvp[mibqtgwackcedfri]otnnsgolldyzdpbew[tmgiijgjuvjykwahml]xxgjgzmnicxmywdubrb[hwhcgbzhuoankdubft]rxqzywfyuliatahn +uhmufcxuptehmuf[sygthxldinztzudvs]bdxukzqaxeavvrbqmuz[wovugtpgwisttusjlet]tpfbcndafwhdnolv +kwknefvhmzbtjezkh[zcvncbptzekirhqo]qvgnyfkmrnxlgxzjjxl[twxzjkybjlrpurfmufa]lclhwuylibekjjxc +mspxottklkidvlomd[rhiachlbqgpdhfnxyc]ekkxgijnueonlkpfkm[dnwcjiihmpjqtmb]dkknlqniolowydd[dyqofryhvgracxeuivp]pbsgttbtgksqqevytrb +pjvdfpsdlampeztecfq[lpqshzeegwiouas]nwxqaoryigyvbby[iiddsczjoxentwv]weexunkmtaaufurjz[meywmosucyrxzlgxi]huqfmfpxdmcmqfk +abbhujqyoaphnruaih[yidrkxgrxeoarph]fvryghhzqrobkbsck[dnokdwmkbktlfoihxl]ttptfiadsswiwsfbvf +djwqivpbexyvdquh[qmmdydhjbmunyjixviv]nradabzesdavhasjbjs[lsabjblhocebvyhfee]hwbyvnzltgezasg +maxofygcnygnwefsb[gdfccusdbseqsqfwva]cxdmwhnjitaazhjftn[kcratndpffdnbopd]wocybndplnotqgctr[ymceqbtulsezvftsi]eggtzhqojksdjapnv +lzihlroqvmeohnun[wskcytlimfagjyd]tnehibbupupuhepqz[hschjdjtzbvavum]zstmglsltkovvckpmqr +syzoikkgzplleoaz[ccpsffhupzpuhjcw]kaswkcoyhlrayhikme[qnjnztjupvbwyns]ggmkqikeziailzpuv[ugqgbpunztgvsxsp]mntxaumliefzkpnia +dxnkgspqhyejogxstsk[jfgckouqypxttst]axtisjbtaviwafh +baxazxlkzlyzvbdvtlc[yhegkwrrluxcnaahyl]nyegiipdjrnjobyjp[ulhbizabyukfvhmdg]hgmxctzxzewckasi[fuvwuolxkcfdkmtcngk]xvmvoydeiuaeawcz +bkomgyefwkmwwpsayb[rozknmkljogphrqywyo]vlpasefojmrzbpox[epogjnrjrntbcnzha]okfkagkfyagcszueu[gjpfnuvnazbnqylfm]busunenasatqeieestf +dwlbzijjdujfhotvj[swplsznswlgnaud]bgedlfxgjbwxekq +ffjhdorivdezjdb[tqkfrzxthlxadqstmqe]ttmrscyvbrresartqnh[rfztsxgbedcdecgv]qxcsxdqhshsqtjtl +zwosebsoogknldkh[mkcucbphbvnaqyxjope]aibznttouadentsy[xfucuvnlnchuawcapcq]jqherkgzqodpzydtgu +xondkuknycfwyenkceu[ugjlxueqtcyhyhni]bbofydvkhtjgxxnyrc[gpnwoarvjltzyhhe]qebolgjnwnstokco +cygilweroxmbmbmx[hopxissehjarmezawol]exywzaffjuhehvmbm +nbndomwcaauiluzbg[qjxqxhccqsvtkwm]oazwbouchccdhtrbnbv[vetwfilwgnxxxrhxar]mrbcnwlpciwpizkxj +xuabbxdwkutpsogcfea[tgetfqpgstsxrokcemk]cbftstsldgcqbxf[vwjejomptmifhdulc]ejeroshnazbwjjzofbe diff --git a/src/main/resources/2016/day8.txt b/src/main/resources/2016/day8.txt new file mode 100644 index 00000000..d827762c --- /dev/null +++ b/src/main/resources/2016/day8.txt @@ -0,0 +1,194 @@ +rect 1x1 +rotate row y=0 by 7 +rect 1x1 +rotate row y=0 by 5 +rect 1x1 +rotate row y=0 by 5 +rect 1x1 +rotate row y=0 by 2 +rect 1x1 +rotate row y=0 by 3 +rect 1x1 +rotate row y=0 by 5 +rect 1x1 +rotate row y=0 by 3 +rect 1x1 +rotate row y=0 by 2 +rect 1x1 +rotate row y=0 by 3 +rect 2x1 +rotate row y=0 by 7 +rect 6x1 +rotate row y=0 by 3 +rect 2x1 +rotate row y=0 by 2 +rect 1x2 +rotate row y=1 by 10 +rotate row y=0 by 3 +rotate column x=0 by 1 +rect 2x1 +rotate column x=20 by 1 +rotate column x=15 by 1 +rotate column x=5 by 1 +rotate row y=1 by 5 +rotate row y=0 by 2 +rect 1x2 +rotate row y=0 by 5 +rotate column x=0 by 1 +rect 4x1 +rotate row y=2 by 15 +rotate row y=0 by 5 +rotate column x=0 by 1 +rect 4x1 +rotate row y=2 by 5 +rotate row y=0 by 5 +rotate column x=0 by 1 +rect 4x1 +rotate row y=2 by 10 +rotate row y=0 by 10 +rotate column x=8 by 1 +rotate column x=5 by 1 +rotate column x=0 by 1 +rect 9x1 +rotate column x=27 by 1 +rotate row y=0 by 5 +rotate column x=0 by 1 +rect 4x1 +rotate column x=42 by 1 +rotate column x=40 by 1 +rotate column x=22 by 1 +rotate column x=17 by 1 +rotate column x=12 by 1 +rotate column x=7 by 1 +rotate column x=2 by 1 +rotate row y=3 by 10 +rotate row y=2 by 5 +rotate row y=1 by 3 +rotate row y=0 by 10 +rect 1x4 +rotate column x=37 by 2 +rotate row y=3 by 18 +rotate row y=2 by 30 +rotate row y=1 by 7 +rotate row y=0 by 2 +rotate column x=13 by 3 +rotate column x=12 by 1 +rotate column x=10 by 1 +rotate column x=7 by 1 +rotate column x=6 by 3 +rotate column x=5 by 1 +rotate column x=3 by 3 +rotate column x=2 by 1 +rotate column x=0 by 1 +rect 14x1 +rotate column x=38 by 3 +rotate row y=3 by 12 +rotate row y=2 by 10 +rotate row y=0 by 10 +rotate column x=7 by 1 +rotate column x=5 by 1 +rotate column x=2 by 1 +rotate column x=0 by 1 +rect 9x1 +rotate row y=4 by 20 +rotate row y=3 by 25 +rotate row y=2 by 10 +rotate row y=0 by 15 +rotate column x=12 by 1 +rotate column x=10 by 1 +rotate column x=8 by 3 +rotate column x=7 by 1 +rotate column x=5 by 1 +rotate column x=3 by 3 +rotate column x=2 by 1 +rotate column x=0 by 1 +rect 14x1 +rotate column x=34 by 1 +rotate row y=1 by 45 +rotate column x=47 by 1 +rotate column x=42 by 1 +rotate column x=19 by 1 +rotate column x=9 by 2 +rotate row y=4 by 7 +rotate row y=3 by 20 +rotate row y=0 by 7 +rotate column x=5 by 1 +rotate column x=3 by 1 +rotate column x=2 by 1 +rotate column x=0 by 1 +rect 6x1 +rotate row y=4 by 8 +rotate row y=3 by 5 +rotate row y=1 by 5 +rotate column x=5 by 1 +rotate column x=4 by 1 +rotate column x=3 by 2 +rotate column x=2 by 1 +rotate column x=1 by 3 +rotate column x=0 by 1 +rect 6x1 +rotate column x=36 by 3 +rotate column x=25 by 3 +rotate column x=18 by 3 +rotate column x=11 by 3 +rotate column x=3 by 4 +rotate row y=4 by 5 +rotate row y=3 by 5 +rotate row y=2 by 8 +rotate row y=1 by 8 +rotate row y=0 by 3 +rotate column x=3 by 4 +rotate column x=0 by 4 +rect 4x4 +rotate row y=4 by 10 +rotate row y=3 by 20 +rotate row y=1 by 10 +rotate row y=0 by 10 +rotate column x=8 by 1 +rotate column x=7 by 1 +rotate column x=6 by 1 +rotate column x=5 by 1 +rotate column x=3 by 1 +rotate column x=2 by 1 +rotate column x=1 by 1 +rotate column x=0 by 1 +rect 9x1 +rotate row y=0 by 40 +rotate column x=44 by 1 +rotate column x=35 by 5 +rotate column x=18 by 5 +rotate column x=15 by 3 +rotate column x=10 by 5 +rotate row y=5 by 15 +rotate row y=4 by 10 +rotate row y=3 by 40 +rotate row y=2 by 20 +rotate row y=1 by 45 +rotate row y=0 by 35 +rotate column x=48 by 1 +rotate column x=47 by 5 +rotate column x=46 by 5 +rotate column x=45 by 1 +rotate column x=43 by 1 +rotate column x=40 by 1 +rotate column x=38 by 2 +rotate column x=37 by 3 +rotate column x=36 by 2 +rotate column x=32 by 2 +rotate column x=31 by 2 +rotate column x=28 by 1 +rotate column x=23 by 3 +rotate column x=22 by 3 +rotate column x=21 by 5 +rotate column x=20 by 1 +rotate column x=18 by 1 +rotate column x=17 by 3 +rotate column x=13 by 1 +rotate column x=10 by 1 +rotate column x=8 by 1 +rotate column x=7 by 5 +rotate column x=6 by 5 +rotate column x=5 by 1 +rotate column x=3 by 5 +rotate column x=2 by 5 +rotate column x=1 by 5 diff --git a/src/main/resources/2016/day9.txt b/src/main/resources/2016/day9.txt new file mode 100644 index 00000000..493df1bf --- /dev/null +++ b/src/main/resources/2016/day9.txt @@ -0,0 +1 @@ +EXGPFSKT(4275x11)(700x12)(33x7)(13x10)YMNCBPTTVSYJF(8x3)ZLNSMHML(654x8)(80x11)(73x12)(46x13)(6x2)GZBCMO(14x11)WSLOVGSEUQSCOU(9x5)PTZEOKTCV(14x9)(9x3)RWHPLNBSW(559x12)(7x6)ECGZJKJ(116x6)(3x6)QRI(10x7)ZELLLAFGTR(86x4)(2x12)JF(22x11)EGZDZZFDMNIPSTKFJPCAHC(7x12)FPOYHGL(2x1)NL(23x7)WXBBFTECULOIUVRQNSUEHCY(183x7)(74x3)(4x5)GYKH(8x13)TEHMVNOW(5x14)WYXEW(33x10)MMSQVRGIKPIKBMDVFYUIJVITMMRAOEBQO(18x14)(11x10)ZAJBGEUSGVC(58x6)(27x11)OQBORSQLXCJWWMQPXPRULKTXLIO(18x7)ALNIJHLTLOXUFGFADH(8x13)EJCAKUNR(81x14)(74x12)(7x8)WLDRUDW(4x13)ORTI(1x6)D(22x3)AZHREXMWYUDXGVONIIKQJD(12x1)FMCSOJICPMCX(139x2)(5x8)KBPOT(16x5)(10x2)ONBEZABRPW(13x14)(8x9)RCIWSSPW(46x13)(9x3)SVLAKYMSZ(12x7)LBZJIJKABYJW(9x7)XRMROBHUO(28x9)(21x10)HSBTOHZLXPXMDHKCLIZNO(28x15)(21x11)XPNWQSKYYKPCIBVXVGGEA(1646x5)(719x13)(75x3)(25x4)DFMNLGPWRZEPXIXVKMNOKOHLU(37x10)(31x2)(1x4)E(10x10)XDVOAGCQPS(3x2)WBY(194x1)(37x8)(30x11)(16x13)TJMYJWLNSVVTJIZU(1x11)J(46x10)(27x9)HUAFNEBKKXVZKXQZSRPPQPRHFER(8x2)(3x4)XLZ(32x12)(25x13)(18x13)HOQIRUQBNZIFGDEAZZ(3x7)HZP(45x5)IJOFPXBMNLEZMFFTIPCVTIMXWYPGWIIKHXUWQWTAJYKJA(61x10)(54x12)(15x12)LCIGFYOKGRQCMRR(26x1)RJHMEFCWCZATOWWSEAKJDBLRDW(361x14)(16x5)JKQPFKKPXYMLHMDS(5x6)BFPHP(102x12)(58x10)(1x12)O(1x15)P(26x4)OXPTIJMNDCIMDEIMJGEMCKOOXX(6x12)VRTINZ(30x15)(2x8)OH(7x10)JYAVMNQ(4x12)PWRQ(28x6)(11x5)TBFSTOREUDV(6x5)WIMHZH(178x4)(9x7)(4x9)BEBJ(9x7)(3x13)ZYT(79x1)(14x9)AFXRFZGFMAQAGK(12x1)RHKJWFDUOBZM(12x2)UUMDTFGWMSTI(16x11)MQYBNNSKVREPNFFH(15x7)PBLFBVHHLWUTZUL(38x2)(13x4)GRQKWRIHKSIUA(2x5)UX(6x13)OFCYUJ(912x3)(330x3)(4x6)CZOF(313x10)(72x13)(8x7)NQFXMGRF(18x4)YWVHOTNROCDFIBHUJC(28x12)MPOIGQVEYBGYMZHJZBQRQRTAGKEG(56x8)(2x10)QH(6x1)ERSBGM(24x6)CAPYVJCWPFTOWXGXGVAHLZKU(2x8)MF(82x7)(3x1)WFM(4x5)RWGJ(25x8)ZGYCHFCKSQTHQQYTCZACXIHBE(5x10)PXKMA(17x4)CRVDERSIDHWZMVUYA(34x8)(28x2)FNXLBLNQIAGFTPCMLYBVYRFEIPJG(37x10)(5x2)THXHX(14x15)XGPLXZGKZBXJPI(1x3)I(179x6)(6x6)HZSKYK(50x3)(32x13)(5x10)VZKDL(4x3)PRHF(7x1)PREOWOU(5x13)LVVJL(105x3)(11x7)XFLDVQDYPZN(63x6)(19x12)KIBXJQKQWQJBFDMNKRL(31x3)ZDTPHEXZUKFLYROFZIKOKDTEUWAFUBK(12x11)FEIOHBUHOQGL(19x15)(12x10)SEODPOPKDOZJ(4x4)JBPF(347x4)(131x14)(56x10)(14x11)ILUNXGLXEZYRYS(20x5)NKFKCYSSTFEHMUPJOIDG(3x13)TYL(62x2)(1x14)O(8x2)JBFPALMC(16x2)NWMKTVWTJWCUOMST(13x10)PCETXVEEISPXL(34x10)GBUSPXTCJGGSWKOGABZSDYTTVTCJNVDIDG(13x12)OFVRQHOMTZTRT(6x7)CZZKDI(129x6)(39x5)(23x5)HMGZFDKYHBVHRYEFDYQVRVT(5x6)ZZQTO(3x7)ZMT(4x3)HMXK(60x10)(7x4)TWQTPGY(41x15)YIVNPYAOROKEZWECJMMKRDJBBVIGZLLQMTBFMLGWY(4x8)ZYON(1860x12)(987x6)(592x10)(167x10)(104x4)(16x13)YLYAAFMPWUADLLAA(26x1)QGJCGUAESHZXRGDLVIMAJHJFEK(13x4)JZSTUHASJWQLF(24x8)XWHGLLMMJOPBDBNZIOWIPVOF(23x11)CSQLVALTRGFJTPQLDFLUHDL(9x5)(3x13)ATH(7x5)WFSADAG(130x9)(53x9)(9x10)FEMVPYZZE(21x10)MQQIROZEBCGCHUSXMDGWG(4x10)BVNJ(27x13)GBIEDUINCXYPVIBQMMZVOFINIAJ(31x2)(14x6)FCBZIDBBMKMNWC(6x7)OEEWAM(51x11)(2x15)TW(5x7)CXFTR(11x11)XBQRDAHLCLT(2x14)SH(1x11)C(83x2)(77x6)(1x13)A(17x6)EWLJMXWWHKCPXKXYX(15x12)SCGDQSHOUQJSUJW(10x9)XZKRTFCZGT(4x2)QSPO(126x7)(27x1)LSDKCBKMHTMTVMRDDCXJBEZWMZZ(13x10)UKSZQOQTTAFTF(10x3)(5x9)CTCXT(2x10)PQ(43x1)(37x9)XSLWUXQHTAEYPEAZHZRWHCSBATQYLNWAXIZFZ(1x5)R(374x7)(167x12)(54x6)XBMBHMJCDGMKJNQNVMTBYKJAKZSZUBGUXIOMUGOXLUAOTUZSLBAUUY(2x2)KD(28x8)(9x5)QJAGYOCIM(8x14)SLUYWRFK(60x5)(1x12)Y(33x6)HHIGXAQGEPVUEPNHKSSKUMONLYKELNLQI(8x13)CPKZBJXB(192x1)(46x3)(17x11)YRPCRLQDUGCUWSSXL(8x1)ZCUZOYJE(3x14)YPU(79x5)(33x10)MPUPPXIEFXGWMULKTYHDOAGDHLJHRRRCJ(1x12)E(7x1)TZOVONQ(14x3)KMXWRLKYTTVCWU(49x4)(8x10)VMPCJQXL(15x1)SKVVHKKMHDIQUQJ(2x3)HY(2x9)ZG(11x4)XFNOZSNBKRK(465x12)(18x5)GEXOEINBKUNFIOLURE(419x13)(119x4)(26x10)(4x2)UALR(10x12)SIIWBAUPWM(59x6)(43x5)SKTSLHJOATIMRUUTOKGTPUCWRWLEYEYDKVJBQOPMXTR(5x3)JFPZT(3x8)GXX(7x15)UVIQZJB(2x10)XJ(24x11)TPOQLQZKFCYXOXVFSLIJVECQ(246x12)(12x3)NZIQPEKTVARU(54x9)(3x9)NPB(11x10)AGJZXFHZLLH(7x12)LPQHVGY(2x11)AA(1x12)I(59x3)(1x1)S(19x7)WPUSQHIOZKQFOWHYDFA(14x3)URKCWDSQAEYPCI(2x14)NC(61x4)(5x7)TKVYH(4x2)PDVV(2x9)HG(17x6)GVOAMZYJQOXAQJGSQ(7x7)CLLMQWC(29x15)(16x1)GDUOOMNVGYUOSQYB(2x6)RU(8x15)EJYAJQGY(369x1)(361x14)(21x1)YJBFRFVNNZCCYFKRBYYVC(156x12)(7x14)YHUFOAM(2x11)XP(29x6)(8x4)CZSYISLG(4x10)HLDW(1x4)S(10x4)WNCMYPKQFT(77x15)(5x8)UGNME(18x12)URSWKSHFWAFOXIMZPB(5x7)QZERF(2x7)OV(19x1)NOLPFVRRIEVYQVSZDJS(150x8)(5x8)OIINF(12x8)KVCJZIRYKXUY(73x11)(2x7)LA(8x2)LMEXVNOI(10x1)NTMQYFFNBZ(4x7)WTDE(22x5)DXWNDKGMHYGACWOBAYJRNY(36x8)(4x10)FKHP(19x15)NEQXWUKWXWTTCCVQYYL(7x14)WSBOVTP(3038x7)(41x14)(22x12)ZWNVASWZGVOIKWCODFMDCI(6x15)YYYSHD(789x13)(13x1)(8x9)EVGUCHWQ(510x6)(119x13)(111x13)(6x11)QDRYAJ(16x5)RKAMGLXAVFFTPEBZ(20x2)QFUGELMPXRQDCWEHRJEY(44x15)(2x8)VK(2x2)HD(7x14)RWTSNSB(10x12)EWQQLCJCPC(6x3)AGWELW(364x14)(11x11)(5x11)DKNHQ(59x3)(19x9)OTEFEVUKQZGSTFRVYWP(9x2)LDGOBKPTQ(13x12)(7x14)ADLOZYC(137x8)(56x10)(2x6)RW(7x15)HUFOIGT(18x8)HARMVPJZRJXJNGZDPO(6x11)PCUKHL(67x10)(28x11)PCNQWAATCRKZFHVZNHXYUUPYFWVF(1x14)V(1x12)S(12x6)YQQZXVTFDVTJ(130x5)(8x12)WYIJMHHZ(3x6)SQB(14x3)(9x1)HGWVWOFXQ(10x7)QGKSPZKEXQ(66x2)(3x6)IND(7x3)TKRQCXL(18x1)MYODGXLSNEWKNSUZYX(10x4)MOKRMBZEHQ(1x3)Q(245x13)(230x14)(222x13)(19x4)(6x15)UBRZZX(2x8)TE(58x4)(4x9)DPLV(8x1)SIDQXUSD(1x10)X(23x4)HZYITSFYWXIORUCZZCMDSGL(91x9)(8x9)JNCNQVES(10x1)CLUYCEZAOA(3x3)XJO(20x14)BUZUTQDYTQXYAZYTJDQV(20x13)KOCADZBCUGHFESCAKGOK(16x13)AWJNJIZCSGXFBJXI(7x11)(1x13)F(2x1)BK(1711x14)(223x8)(215x15)(178x4)(29x9)MAGFORTGLLSMMWMJEUHFFNFBCRMSC(5x6)NFCYQ(16x13)QNCOOJIQIYABASQS(96x11)(2x15)EQ(43x13)GLKEUOLATIDSXLGUHFIORRWTRRINCFXLJATSVCJNNSO(17x15)HBCIUUHVYSZNVGMRN(8x10)GFVPTGYM(2x8)TE(1x12)N(17x1)EZTFYIDDINVGFYSEP(780x13)(353x15)(3x4)MGC(10x7)SCWQDZWYAB(92x14)(8x4)(2x15)NX(6x14)(1x8)C(60x14)(15x3)BRXCIFTLUEAIBRO(9x5)NOLTRVJOA(6x12)FMSVCV(7x14)DQAMZQX(215x3)(68x7)(8x14)TAXQBMFZ(21x15)OITWZKZBCMVBOYYFHNBPL(6x6)QEPQIC(3x2)SNT(1x12)B(55x7)(5x9)VKRLX(13x14)UDHUZCEUVBXJO(8x4)RJJKLLAH(6x14)OHIDTS(4x14)ITYG(21x5)(1x1)W(1x4)I(4x6)KILC(36x14)(11x14)RITTDRXXDLP(11x10)PRDGKVIFDUI(2x11)CM(182x8)(51x12)(7x2)BWELDSV(3x10)JEY(11x10)GVLHUJMDTVT(6x14)WACVKS(117x6)(63x10)(9x15)MKTMWEPXC(5x10)JABHS(24x9)MJJYMDBMKCASLIXDCGWSXUIN(2x6)SW(7x12)AMOCBKG(27x10)XDVHHIKNMPJXAIOREECWPNVMVKS(223x5)(99x1)(7x2)CBMGYMO(53x3)(15x6)BAAOTMWHHNHEZGJ(5x13)DUGTH(15x4)JAUKYJRIORHNRAB(6x11)MAPRYB(10x3)IAJYWAFXIM(111x3)(5x10)MCBCA(36x6)(6x4)LZEYPF(10x13)AQUBHKOLTE(2x13)AK(52x5)(7x14)DDRKRNY(10x5)VFHONXKURX(4x9)UKUY(8x15)NIYAUWGP(686x7)(61x8)(55x5)(8x13)(3x4)XJS(12x12)(6x10)WLUSDF(3x10)XKP(8x1)SFCVKSLY(2x3)CP(237x14)(229x11)(81x14)(7x8)UBVPDAG(13x8)MXAHYLCWDKPIH(17x5)SLTNXXKTFVARXXBGO(13x5)BDCRYEZKXFXEY(2x14)TA(58x11)(36x6)QVITJPANFEIDLDUEIBNICBSMEQZBSWQQVGCT(1x5)T(5x5)SFCVM(58x4)(16x1)MATNEXLFWYFTUWWR(8x3)RASBWVWX(3x14)XXY(8x11)XNLOMORW(1x9)Y(1x3)I(359x11)(89x4)(25x14)(1x12)O(11x11)SAQDRZJGAUU(8x11)CKZTLZUY(8x7)(3x2)DFZ(7x7)MOQCZTS(11x10)LHFKTDYZQSD(88x11)(53x4)(1x5)C(10x5)BERUOONCSJ(1x3)C(19x8)WBDYTHXMQQCLVSEISTT(23x5)LLZRCXQVHLWBCUKVQVFXBQY(162x5)(57x7)(4x10)XALW(9x9)QNJMMYHCM(12x15)BTRLEFIHQMRT(9x2)UPAWFPMKE(3x6)SCQ(3x15)YTZ(75x14)(16x11)SBPEWETWXGVTZUXO(4x5)HZQX(11x14)FZCDGEVIZEE(6x5)KVPGOQ(8x12)ONZPWNCS(51x13)(45x2)(39x7)(24x8)(17x11)(11x1)CHNDNHXBFHN(4x3)CXJB(407x13)(400x1)(132x8)(6x13)LKTZZI(9x2)YLBLZKYPS(99x13)(3x9)NOZ(17x12)(11x2)IATQCUARWUM(2x7)CK(43x12)(8x14)CMFYZEHC(7x5)YROKKKP(3x5)HQF(4x8)GNJK(4x10)PHJF(1x5)Z(54x2)(47x10)(18x10)ZCTVFHIVURCAJRKCDQ(15x11)HBIPKLREYNWUHMO(188x6)(79x3)(11x8)KZGMRZELKER(27x15)RYOMUMMRJVSQTHUKKLTAEYWAQTW(22x8)(1x6)V(3x5)EWY(3x9)FYV(9x11)DNKDAJFBY(70x15)(17x15)(11x1)DJXXFHRAKPL(26x6)(4x5)FAGX(10x11)EBFOAWIEQP(9x9)IJLKNETCB(5x15)ABQPQ(579x3)(29x7)(9x5)GTXCFXTKP(9x14)(3x14)VRS(537x7)(529x11)(344x2)(66x12)(7x9)(2x2)CT(21x13)(4x11)TTXD(6x1)OAFJIF(13x3)CBXPZYOGHJSWG(1x13)M(50x2)(14x15)(2x7)NL(2x1)XZ(23x6)(16x15)GTNPUPURKNMRRWQF(6x7)HWPRNW(197x5)(5x4)EYQWV(75x11)(8x15)UPJHYIQU(36x5)GWMIZBKNPLDITWVHWHXHJAUEEMCBGUWUMMHX(12x12)NPQXLMXAKXFJ(98x10)(1x13)W(10x6)LWLZRSBXOA(9x5)HQZGJGYGG(6x9)IFSNXI(44x3)UKFXTYRNYULHXGQPTKZDMTTSSNNBHVGXJLSMUPLGBVPN(170x14)(11x8)MGIYKALHMUW(146x8)(4x1)PMBT(12x14)(7x2)DPFEWXT(13x14)JMIYORYVYZJGS(39x3)NCXKUQBUBUPRPNGMBJULZJFRNHHZZPXPZHDQDBX(46x15)(6x10)RBICQU(6x5)LJUDIP(1x10)B(10x3)LMMIYYDXMV(24x6)(9x5)VDCHYSMAQ(4x10)XZGCLMPFRW diff --git a/src/main/resources/2017-examples/day10-1.txt b/src/main/resources/2017-examples/day10-1.txt new file mode 100644 index 00000000..f963bffc --- /dev/null +++ b/src/main/resources/2017-examples/day10-1.txt @@ -0,0 +1,5 @@ + 4--5 pinch 4 5 4 1 + / \ 5,0,1 / \/ \ twist / \ / \ +3 0 --> 3 0 --> 3 X 0 + \ / \ /\ / \ / \ / + 2--1 2 1 2 5 diff --git a/src/main/resources/2017-examples/day11-1.txt b/src/main/resources/2017-examples/day11-1.txt new file mode 100644 index 00000000..b14ec5a3 --- /dev/null +++ b/src/main/resources/2017-examples/day11-1.txt @@ -0,0 +1,7 @@ + \ n / +nw +--+ ne + / \ +-+ +- + \ / +sw +--+ se + / s \ diff --git a/src/main/resources/2017-examples/day12-1.txt b/src/main/resources/2017-examples/day12-1.txt new file mode 100644 index 00000000..ee108d80 --- /dev/null +++ b/src/main/resources/2017-examples/day12-1.txt @@ -0,0 +1,7 @@ +0 <-> 2 +1 <-> 1 +2 <-> 0, 3, 4 +3 <-> 2, 4 +4 <-> 2, 3, 6 +5 <-> 6 +6 <-> 4, 5 diff --git a/src/main/resources/2017-examples/day13-1.txt b/src/main/resources/2017-examples/day13-1.txt new file mode 100644 index 00000000..0239024d --- /dev/null +++ b/src/main/resources/2017-examples/day13-1.txt @@ -0,0 +1,4 @@ +0: 3 +1: 2 +4: 4 +6: 4 diff --git a/src/main/resources/2017-examples/day13-2.txt b/src/main/resources/2017-examples/day13-2.txt new file mode 100644 index 00000000..e7405beb --- /dev/null +++ b/src/main/resources/2017-examples/day13-2.txt @@ -0,0 +1,5 @@ + 0 1 2 3 4 5 6 +[ ] [ ] ... ... [ ] ... [ ] +[ ] [ ] [ ] [ ] +[ ] [ ] [ ] + [ ] [ ] diff --git a/src/main/resources/2017-examples/day13-3.txt b/src/main/resources/2017-examples/day13-3.txt new file mode 100644 index 00000000..fb52eee3 --- /dev/null +++ b/src/main/resources/2017-examples/day13-3.txt @@ -0,0 +1,28 @@ + +Picosecond 0: + 0 1 2 3 4 5 6 +[S] [S] ... ... [S] ... [S] +[ ] [ ] [ ] [ ] +[ ] [ ] [ ] + [ ] [ ] + +Picosecond 1: + 0 1 2 3 4 5 6 +[ ] [ ] ... ... [ ] ... [ ] +[S] [S] [S] [S] +[ ] [ ] [ ] + [ ] [ ] + +Picosecond 2: + 0 1 2 3 4 5 6 +[ ] [S] ... ... [ ] ... [ ] +[ ] [ ] [ ] [ ] +[S] [S] [S] + [ ] [ ] + +Picosecond 3: + 0 1 2 3 4 5 6 +[ ] [ ] ... ... [ ] ... [ ] +[S] [S] [ ] [ ] +[ ] [ ] [ ] + [S] [S] diff --git a/src/main/resources/2017-examples/day13-4.txt b/src/main/resources/2017-examples/day13-4.txt new file mode 100644 index 00000000..34dd9657 --- /dev/null +++ b/src/main/resources/2017-examples/day13-4.txt @@ -0,0 +1,103 @@ +Initial state: + 0 1 2 3 4 5 6 +[S] [S] ... ... [S] ... [S] +[ ] [ ] [ ] [ ] +[ ] [ ] [ ] + [ ] [ ] + +Picosecond 0: + 0 1 2 3 4 5 6 +(S) [S] ... ... [S] ... [S] +[ ] [ ] [ ] [ ] +[ ] [ ] [ ] + [ ] [ ] + + 0 1 2 3 4 5 6 +( ) [ ] ... ... [ ] ... [ ] +[S] [S] [S] [S] +[ ] [ ] [ ] + [ ] [ ] + + +Picosecond 1: + 0 1 2 3 4 5 6 +[ ] ( ) ... ... [ ] ... [ ] +[S] [S] [S] [S] +[ ] [ ] [ ] + [ ] [ ] + + 0 1 2 3 4 5 6 +[ ] (S) ... ... [ ] ... [ ] +[ ] [ ] [ ] [ ] +[S] [S] [S] + [ ] [ ] + + +Picosecond 2: + 0 1 2 3 4 5 6 +[ ] [S] (.) ... [ ] ... [ ] +[ ] [ ] [ ] [ ] +[S] [S] [S] + [ ] [ ] + + 0 1 2 3 4 5 6 +[ ] [ ] (.) ... [ ] ... [ ] +[S] [S] [ ] [ ] +[ ] [ ] [ ] + [S] [S] + + +Picosecond 3: + 0 1 2 3 4 5 6 +[ ] [ ] ... (.) [ ] ... [ ] +[S] [S] [ ] [ ] +[ ] [ ] [ ] + [S] [S] + + 0 1 2 3 4 5 6 +[S] [S] ... (.) [ ] ... [ ] +[ ] [ ] [ ] [ ] +[ ] [S] [S] + [ ] [ ] + + +Picosecond 4: + 0 1 2 3 4 5 6 +[S] [S] ... ... ( ) ... [ ] +[ ] [ ] [ ] [ ] +[ ] [S] [S] + [ ] [ ] + + 0 1 2 3 4 5 6 +[ ] [ ] ... ... ( ) ... [ ] +[S] [S] [S] [S] +[ ] [ ] [ ] + [ ] [ ] + + +Picosecond 5: + 0 1 2 3 4 5 6 +[ ] [ ] ... ... [ ] (.) [ ] +[S] [S] [S] [S] +[ ] [ ] [ ] + [ ] [ ] + + 0 1 2 3 4 5 6 +[ ] [S] ... ... [S] (.) [S] +[ ] [ ] [ ] [ ] +[S] [ ] [ ] + [ ] [ ] + + +Picosecond 6: + 0 1 2 3 4 5 6 +[ ] [S] ... ... [S] ... (S) +[ ] [ ] [ ] [ ] +[S] [ ] [ ] + [ ] [ ] + + 0 1 2 3 4 5 6 +[ ] [ ] ... ... [ ] ... ( ) +[S] [S] [S] [S] +[ ] [ ] [ ] + [ ] [ ] diff --git a/src/main/resources/2017-examples/day14-1.txt b/src/main/resources/2017-examples/day14-1.txt new file mode 100644 index 00000000..adbbbac8 --- /dev/null +++ b/src/main/resources/2017-examples/day14-1.txt @@ -0,0 +1,10 @@ +##.#.#..--> +.#.#.#.# +....#.#. +#.#.##.# +.##.#... +##..#..# +.#...#.. +##.#.##.--> +| | +V V diff --git a/src/main/resources/2017-examples/day15-1.txt b/src/main/resources/2017-examples/day15-1.txt new file mode 100644 index 00000000..ad72838c --- /dev/null +++ b/src/main/resources/2017-examples/day15-1.txt @@ -0,0 +1,6 @@ +--Gen. A-- --Gen. B-- + 1092455 430625591 +1181022009 1233683848 + 245556042 1431495498 +1744312007 137874439 +1352636452 285222916 diff --git a/src/main/resources/2017-examples/day15-2.txt b/src/main/resources/2017-examples/day15-2.txt new file mode 100644 index 00000000..e63f9d86 --- /dev/null +++ b/src/main/resources/2017-examples/day15-2.txt @@ -0,0 +1,14 @@ +00000000000100001010101101100111 +00011001101010101101001100110111 + +01000110011001001111011100111001 +01001001100010001000010110001000 + +00001110101000101110001101001010 +01010101010100101110001101001010 + +01100111111110000001011011000111 +00001000001101111100110000000111 + +01010000100111111001100000100100 +00010001000000000010100000000100 diff --git a/src/main/resources/2017-examples/day17-1.txt b/src/main/resources/2017-examples/day17-1.txt new file mode 100644 index 00000000..d39835d0 --- /dev/null +++ b/src/main/resources/2017-examples/day17-1.txt @@ -0,0 +1 @@ +1512 1134 151 (2017) 638 1513 851 \ No newline at end of file diff --git a/src/main/resources/2017-examples/day18-1.txt b/src/main/resources/2017-examples/day18-1.txt new file mode 100644 index 00000000..4e62dbd6 --- /dev/null +++ b/src/main/resources/2017-examples/day18-1.txt @@ -0,0 +1,10 @@ +set a 1 +add a 2 +mul a a +mod a 5 +snd a +set a 0 +rcv a +jgz a -1 +set a 1 +jgz a -2 diff --git a/src/main/resources/2017-examples/day19-1.txt b/src/main/resources/2017-examples/day19-1.txt new file mode 100644 index 00000000..6d29f434 --- /dev/null +++ b/src/main/resources/2017-examples/day19-1.txt @@ -0,0 +1,7 @@ + | + | +--+ + A | C + F---|----E|--+ + | | | D + +B-+ +--+ + diff --git a/src/main/resources/2017-examples/day2-1.txt b/src/main/resources/2017-examples/day2-1.txt new file mode 100644 index 00000000..ef932270 --- /dev/null +++ b/src/main/resources/2017-examples/day2-1.txt @@ -0,0 +1,3 @@ +5 1 9 5 +7 5 3 +2 4 6 8 \ No newline at end of file diff --git a/src/main/resources/2017-examples/day20-1.txt b/src/main/resources/2017-examples/day20-1.txt new file mode 100644 index 00000000..e16daf0e --- /dev/null +++ b/src/main/resources/2017-examples/day20-1.txt @@ -0,0 +1,11 @@ +p=< 3,0,0>, v=< 2,0,0>, a=<-1,0,0> -4 -3 -2 -1 0 1 2 3 4 +p=< 4,0,0>, v=< 0,0,0>, a=<-2,0,0> (0)(1) + +p=< 4,0,0>, v=< 1,0,0>, a=<-1,0,0> -4 -3 -2 -1 0 1 2 3 4 +p=< 2,0,0>, v=<-2,0,0>, a=<-2,0,0> (1) (0) + +p=< 4,0,0>, v=< 0,0,0>, a=<-1,0,0> -4 -3 -2 -1 0 1 2 3 4 +p=<-2,0,0>, v=<-4,0,0>, a=<-2,0,0> (1) (0) + +p=< 3,0,0>, v=<-1,0,0>, a=<-1,0,0> -4 -3 -2 -1 0 1 2 3 4 +p=<-8,0,0>, v=<-6,0,0>, a=<-2,0,0> (0) diff --git a/src/main/resources/2017-examples/day21-1.txt b/src/main/resources/2017-examples/day21-1.txt new file mode 100644 index 00000000..eedd3d21 --- /dev/null +++ b/src/main/resources/2017-examples/day21-1.txt @@ -0,0 +1,3 @@ +.#. +..# +### diff --git a/src/main/resources/2017-examples/day21-2.txt b/src/main/resources/2017-examples/day21-2.txt new file mode 100644 index 00000000..eba3e80d --- /dev/null +++ b/src/main/resources/2017-examples/day21-2.txt @@ -0,0 +1,11 @@ +../.# = .. + .# + + .#. +.#./..#/### = ..# + ### + + #..# +#..#/..../#..#/.##. = .... + #..# + .##. diff --git a/src/main/resources/2017-examples/day21-3.txt b/src/main/resources/2017-examples/day21-3.txt new file mode 100644 index 00000000..ebbddd45 --- /dev/null +++ b/src/main/resources/2017-examples/day21-3.txt @@ -0,0 +1,3 @@ +.#. .#. #.. ### +..# #.. #.# ..# +### ### ##. .#. diff --git a/src/main/resources/2017-examples/day21-4.txt b/src/main/resources/2017-examples/day21-4.txt new file mode 100644 index 00000000..33fc15e4 --- /dev/null +++ b/src/main/resources/2017-examples/day21-4.txt @@ -0,0 +1,2 @@ +../.# => ##./#../... +.#./..#/### => #..#/..../..../#..# diff --git a/src/main/resources/2017-examples/day21-5.txt b/src/main/resources/2017-examples/day21-5.txt new file mode 100644 index 00000000..eedd3d21 --- /dev/null +++ b/src/main/resources/2017-examples/day21-5.txt @@ -0,0 +1,3 @@ +.#. +..# +### diff --git a/src/main/resources/2017-examples/day21-6.txt b/src/main/resources/2017-examples/day21-6.txt new file mode 100644 index 00000000..b1016302 --- /dev/null +++ b/src/main/resources/2017-examples/day21-6.txt @@ -0,0 +1,4 @@ +#..# +.... +.... +#..# diff --git a/src/main/resources/2017-examples/day21-7.txt b/src/main/resources/2017-examples/day21-7.txt new file mode 100644 index 00000000..b90ea11c --- /dev/null +++ b/src/main/resources/2017-examples/day21-7.txt @@ -0,0 +1,5 @@ +#.|.# +..|.. +--+-- +..|.. +#.|.# diff --git a/src/main/resources/2017-examples/day21-8.txt b/src/main/resources/2017-examples/day21-8.txt new file mode 100644 index 00000000..0b25f6ee --- /dev/null +++ b/src/main/resources/2017-examples/day21-8.txt @@ -0,0 +1,7 @@ +##.|##. +#..|#.. +...|... +---+--- +##.|##. +#..|#.. +...|... diff --git a/src/main/resources/2017-examples/day21-9.txt b/src/main/resources/2017-examples/day21-9.txt new file mode 100644 index 00000000..f81f6b0c --- /dev/null +++ b/src/main/resources/2017-examples/day21-9.txt @@ -0,0 +1,6 @@ +##.##. +#..#.. +...... +##.##. +#..#.. +...... diff --git a/src/main/resources/2017-examples/day22-1.txt b/src/main/resources/2017-examples/day22-1.txt new file mode 100644 index 00000000..3105a0bb --- /dev/null +++ b/src/main/resources/2017-examples/day22-1.txt @@ -0,0 +1,3 @@ +..# +#.. +... diff --git a/src/main/resources/2017-examples/day22-2.txt b/src/main/resources/2017-examples/day22-2.txt new file mode 100644 index 00000000..4b92c988 --- /dev/null +++ b/src/main/resources/2017-examples/day22-2.txt @@ -0,0 +1,8 @@ +. . . . . . . . . +. . . . . . . . . +. . . . . . . . . +. . . . . # . . . +. . . #[.]. . . . +. . . . . . . . . +. . . . . . . . . +. . . . . . . . . diff --git a/src/main/resources/2017-examples/day22-3.txt b/src/main/resources/2017-examples/day22-3.txt new file mode 100644 index 00000000..ca8b9dbf --- /dev/null +++ b/src/main/resources/2017-examples/day22-3.txt @@ -0,0 +1,8 @@ +. . . . . . . . . +. . . . . . . . . +. . . . . . . . . +. . . . . # . . . +. . .[#]# . . . . +. . . . . . . . . +. . . . . . . . . +. . . . . . . . . diff --git a/src/main/resources/2017-examples/day22-4.txt b/src/main/resources/2017-examples/day22-4.txt new file mode 100644 index 00000000..accd5687 --- /dev/null +++ b/src/main/resources/2017-examples/day22-4.txt @@ -0,0 +1,8 @@ +. . . . . . . . . +. . . . . . . . . +. . . . . . . . . +. . .[.]. # . . . +. . . . # . . . . +. . . . . . . . . +. . . . . . . . . +. . . . . . . . . diff --git a/src/main/resources/2017-examples/day22-5.txt b/src/main/resources/2017-examples/day22-5.txt new file mode 100644 index 00000000..efa989dd --- /dev/null +++ b/src/main/resources/2017-examples/day22-5.txt @@ -0,0 +1,8 @@ +. . . . . . . . . +. . . . . . . . . +. . . . . . . . . +. . #[#]. # . . . +. . # # # . . . . +. . . . . . . . . +. . . . . . . . . +. . . . . . . . . diff --git a/src/main/resources/2017-examples/day22-6.txt b/src/main/resources/2017-examples/day22-6.txt new file mode 100644 index 00000000..726f188c --- /dev/null +++ b/src/main/resources/2017-examples/day22-6.txt @@ -0,0 +1,8 @@ +. . . . . . . . . +. . . . . . . . . +. . . . . . . . . +. . # .[.]# . . . +. . # # # . . . . +. . . . . . . . . +. . . . . . . . . +. . . . . . . . . diff --git a/src/main/resources/2017-examples/day22-7.txt b/src/main/resources/2017-examples/day22-7.txt new file mode 100644 index 00000000..ef39e728 --- /dev/null +++ b/src/main/resources/2017-examples/day22-7.txt @@ -0,0 +1,8 @@ +. . . . . # # . . +. . . . # . . # . +. . . # . . . . # +. . # . #[.]. . # +. . # . # . . # . +. . . . . # # . . +. . . . . . . . . +. . . . . . . . . diff --git a/src/main/resources/2017-examples/day24-1.txt b/src/main/resources/2017-examples/day24-1.txt new file mode 100644 index 00000000..f2c8f2ae --- /dev/null +++ b/src/main/resources/2017-examples/day24-1.txt @@ -0,0 +1,8 @@ +0/2 +2/2 +2/3 +3/4 +3/5 +0/1 +10/1 +9/10 diff --git a/src/main/resources/2017-examples/day25-1.txt b/src/main/resources/2017-examples/day25-1.txt new file mode 100644 index 00000000..3fab6c1e --- /dev/null +++ b/src/main/resources/2017-examples/day25-1.txt @@ -0,0 +1,22 @@ +Begin in state A. +Perform a diagnostic checksum after 6 steps. + +In state A: + If the current value is 0: + - Write the value 1. + - Move one slot to the right. + - Continue with state B. + If the current value is 1: + - Write the value 0. + - Move one slot to the left. + - Continue with state B. + +In state B: + If the current value is 0: + - Write the value 1. + - Move one slot to the left. + - Continue with state A. + If the current value is 1: + - Write the value 1. + - Move one slot to the right. + - Continue with state A. diff --git a/src/main/resources/2017-examples/day25-2.txt b/src/main/resources/2017-examples/day25-2.txt new file mode 100644 index 00000000..2fbe3a57 --- /dev/null +++ b/src/main/resources/2017-examples/day25-2.txt @@ -0,0 +1,7 @@ +... 0 0 0 [0] 0 0 ... (before any steps; about to run state A) +... 0 0 0 1 [0] 0 ... (after 1 step; about to run state B) +... 0 0 0 [1] 1 0 ... (after 2 steps; about to run state A) +... 0 0 [0] 0 1 0 ... (after 3 steps; about to run state B) +... 0 [0] 1 0 1 0 ... (after 4 steps; about to run state A) +... 0 1 [1] 0 1 0 ... (after 5 steps; about to run state B) +... 0 1 1 [0] 1 0 ... (after 6 steps; about to run state A) diff --git a/src/main/resources/2017-examples/day3-1.txt b/src/main/resources/2017-examples/day3-1.txt new file mode 100644 index 00000000..5752f9ba --- /dev/null +++ b/src/main/resources/2017-examples/day3-1.txt @@ -0,0 +1,5 @@ +17 16 15 14 13 +18 5 4 3 12 +19 6 1 2 11 +20 7 8 9 10 +21 22 23---> ... diff --git a/src/main/resources/2017-examples/day5-1.txt b/src/main/resources/2017-examples/day5-1.txt new file mode 100644 index 00000000..7a76cf7f --- /dev/null +++ b/src/main/resources/2017-examples/day5-1.txt @@ -0,0 +1,5 @@ +0 +3 +0 +1 +-3 diff --git a/src/main/resources/2017-examples/day7-1.txt b/src/main/resources/2017-examples/day7-1.txt new file mode 100644 index 00000000..1ac6b194 --- /dev/null +++ b/src/main/resources/2017-examples/day7-1.txt @@ -0,0 +1,13 @@ +pbga (66) +xhth (57) +ebii (61) +havc (66) +ktlj (57) +fwft (72) -> ktlj, cntj, xhth +qoyq (66) +padx (45) -> pbga, havc, qoyq +tknk (41) -> ugml, padx, fwft +jptl (61) +ugml (68) -> gyxo, ebii, jptl +gyxo (61) +cntj (57) diff --git a/src/main/resources/2017-examples/day7-2.txt b/src/main/resources/2017-examples/day7-2.txt new file mode 100644 index 00000000..9fc55724 --- /dev/null +++ b/src/main/resources/2017-examples/day7-2.txt @@ -0,0 +1,17 @@ + gyxo + / + ugml - ebii + / \ + | jptl + | + | pbga + / / +tknk --- padx - havc + \ \ + | qoyq + | + | ktlj + \ / + fwft - cntj + \ + xhth diff --git a/src/main/resources/2017-examples/day8-1.txt b/src/main/resources/2017-examples/day8-1.txt new file mode 100644 index 00000000..067c0c1e --- /dev/null +++ b/src/main/resources/2017-examples/day8-1.txt @@ -0,0 +1,4 @@ +b inc 5 if a > 1 +a inc 1 if b < 5 +c dec -10 if a >= 1 +c inc -20 if c == 10 diff --git a/src/main/resources/2017/day1.txt b/src/main/resources/2017/day1.txt new file mode 100644 index 00000000..8e3fcdbc --- /dev/null +++ b/src/main/resources/2017/day1.txt @@ -0,0 +1 @@ +823936645345581272695677318513459491834641129844393742672553544439126314399846773234845535593355348931499496184839582118817689171948635864427852215325421433717458975771369522138766248225963242168658975326354785415252974294317138511141826226866364555761117178764543435899886711426319675443679829181257496966219435831621565519667989898725836639626681645821714861443141893427672384716732765884844772433374798185955741311116365899659833634237938878181367317218635539667357364295754744829595842962773524584225427969467467611641591834876769829719248136613147351298534885563144114336211961674392912181735773851634298227454157885241769156811787611897349965331474217223461176896643242975397227859696554492996937235423272549348349528559432214521551656971136859972232854126262349381254424597348874447736545722261957871275935756764184378994167427983811716675476257858556464755677478725146588747147857375293675711575747132471727933773512571368467386151966568598964631331428869762151853634362356935751298121849281442128796517663482391226174256395515166361514442624944181255952124524815268864131969151433888721213595267927325759562132732586252438456569556992685896517565257787464673718221817783929691626876446423134331749327322367571432532857235214364221471769481667118117729326429556357572421333798517168997863151927281418238491791975399357393494751913155219862399959646993428921878798119215675548847845477994836744929918954159722827194721564121532315459611433157384994543332773796862165243183378464731546787498174844781781139571984272235872866886275879944921329959736315296733981313643956576956851762149275521949177991988236529475373595217665112434727744235789852852765675189342753695377219374791548554786671473733124951946779531847479755363363288448281622183736545494372344785112312749694167483996738384351293899149136857728545977442763489799693492319549773328626918874718387697878235744154491677922317518952687439655962477734559232755624943644966227973617788182213621899579391324399386146423427262874437992579573858589183571854577861459758534348533553925167947139351819511798829977371215856637215221838924612644785498936263849489519896548811254628976642391428413984281758771868781714266261781359762798 diff --git a/src/main/resources/2017/day10.txt b/src/main/resources/2017/day10.txt new file mode 100644 index 00000000..67cc6027 --- /dev/null +++ b/src/main/resources/2017/day10.txt @@ -0,0 +1 @@ +130,126,1,11,140,2,255,207,18,254,246,164,29,104,0,224 diff --git a/src/main/resources/2017/day11.txt b/src/main/resources/2017/day11.txt new file mode 100644 index 00000000..4d8c4a56 --- /dev/null +++ b/src/main/resources/2017/day11.txt @@ -0,0 +1 @@ +sw,nw,nw,se,ne,ne,n,ne,n,ne,ne,ne,se,se,se,se,ne,se,se,nw,se,sw,s,se,sw,s,se,s,s,se,s,s,s,n,s,s,s,ne,s,s,s,s,s,sw,sw,ne,n,sw,ne,sw,sw,sw,sw,sw,s,sw,sw,s,sw,sw,sw,sw,n,sw,nw,sw,sw,nw,s,sw,sw,s,nw,nw,nw,sw,nw,nw,nw,nw,nw,sw,sw,ne,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,s,nw,sw,nw,nw,se,nw,nw,nw,n,n,nw,nw,nw,nw,nw,nw,s,se,nw,nw,s,nw,se,n,n,n,nw,nw,nw,nw,n,se,nw,s,n,nw,n,n,ne,n,n,nw,n,n,n,n,se,n,ne,n,n,n,n,se,n,ne,n,n,n,n,n,n,sw,n,n,n,ne,n,ne,ne,nw,ne,ne,ne,n,ne,ne,n,se,ne,ne,ne,sw,n,sw,n,n,nw,n,ne,ne,se,ne,ne,nw,ne,n,s,ne,n,ne,n,ne,ne,n,ne,se,n,n,ne,ne,ne,ne,ne,ne,ne,ne,ne,n,ne,ne,ne,ne,ne,ne,ne,se,ne,ne,nw,ne,ne,nw,ne,ne,sw,nw,ne,ne,ne,sw,ne,ne,ne,ne,ne,se,s,ne,ne,se,se,ne,ne,se,se,ne,nw,ne,se,ne,ne,ne,ne,se,s,ne,ne,sw,ne,s,ne,ne,se,se,n,ne,se,ne,se,se,se,n,ne,se,ne,ne,se,ne,se,se,n,ne,sw,ne,se,se,n,se,ne,se,ne,se,nw,se,se,se,s,se,se,se,se,se,se,se,se,nw,ne,ne,s,se,se,se,se,se,se,se,se,n,ne,se,n,s,se,se,se,se,ne,se,nw,se,se,s,se,se,s,s,s,se,se,s,se,s,n,se,se,se,se,nw,se,se,se,sw,se,s,se,se,se,nw,s,se,s,se,se,se,ne,se,se,se,se,se,sw,n,s,s,sw,s,s,se,se,se,se,s,s,ne,s,nw,ne,se,se,se,s,s,s,sw,s,sw,ne,se,ne,s,s,se,se,se,s,se,se,n,s,n,se,se,se,se,s,se,se,se,n,n,se,s,s,ne,se,s,s,n,se,sw,s,s,s,ne,s,s,s,ne,s,s,s,s,nw,sw,ne,ne,sw,s,s,s,s,nw,s,s,n,s,s,s,s,s,nw,s,s,s,s,sw,s,s,s,s,sw,nw,s,s,s,ne,sw,se,s,se,sw,s,s,s,s,s,ne,s,sw,se,s,s,n,se,sw,s,sw,s,s,s,se,s,sw,s,s,s,s,s,s,s,s,sw,s,s,s,sw,s,s,s,s,s,sw,s,sw,s,s,se,s,sw,n,sw,s,sw,s,sw,sw,sw,s,sw,sw,sw,n,s,se,nw,ne,sw,se,sw,nw,sw,s,s,sw,s,n,sw,s,s,ne,sw,sw,s,s,s,s,sw,se,ne,sw,sw,sw,s,s,s,s,sw,s,n,sw,s,sw,s,sw,sw,sw,sw,sw,s,sw,sw,sw,sw,sw,ne,sw,se,s,sw,s,sw,sw,nw,sw,n,sw,sw,sw,sw,n,nw,s,ne,s,sw,sw,sw,sw,n,sw,ne,sw,se,s,sw,sw,sw,sw,s,sw,sw,sw,sw,n,ne,s,s,sw,sw,s,ne,sw,sw,s,sw,sw,se,sw,sw,sw,ne,sw,sw,sw,se,n,s,sw,s,sw,sw,sw,se,sw,sw,n,sw,sw,sw,sw,se,sw,sw,sw,n,ne,sw,sw,sw,s,sw,sw,sw,sw,sw,nw,sw,nw,sw,sw,sw,sw,sw,sw,sw,sw,n,nw,sw,sw,sw,ne,sw,se,sw,ne,nw,sw,sw,s,sw,sw,sw,nw,ne,sw,sw,sw,sw,se,sw,sw,sw,sw,nw,sw,ne,sw,sw,sw,sw,se,ne,sw,sw,sw,sw,sw,ne,nw,sw,nw,sw,sw,nw,nw,sw,sw,nw,sw,sw,nw,s,sw,se,sw,nw,sw,nw,sw,ne,sw,sw,s,sw,sw,nw,n,nw,n,sw,nw,sw,sw,n,sw,nw,sw,sw,nw,sw,nw,ne,nw,nw,ne,sw,n,nw,nw,sw,nw,sw,sw,sw,nw,s,nw,sw,nw,nw,sw,nw,ne,nw,sw,nw,sw,nw,nw,sw,sw,sw,sw,sw,sw,s,nw,sw,sw,nw,sw,nw,nw,sw,nw,ne,s,s,s,n,sw,sw,sw,nw,sw,sw,sw,sw,nw,nw,nw,sw,ne,sw,nw,sw,ne,sw,nw,se,nw,sw,nw,nw,nw,nw,nw,nw,nw,nw,nw,sw,nw,n,sw,nw,se,nw,se,n,sw,se,n,sw,nw,nw,s,nw,nw,nw,nw,ne,nw,nw,nw,sw,nw,nw,nw,nw,se,nw,sw,nw,sw,ne,se,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,s,se,nw,sw,nw,nw,se,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,s,nw,nw,nw,nw,nw,n,sw,nw,nw,ne,nw,nw,nw,nw,nw,nw,sw,ne,nw,nw,nw,nw,nw,ne,nw,nw,n,nw,ne,sw,nw,nw,nw,nw,nw,sw,s,nw,nw,nw,nw,se,nw,nw,nw,se,s,nw,se,nw,se,sw,n,nw,s,nw,n,nw,nw,nw,n,nw,ne,nw,nw,nw,s,n,nw,nw,se,nw,nw,n,nw,nw,nw,nw,sw,nw,nw,nw,ne,ne,n,n,nw,nw,nw,n,nw,nw,n,n,nw,sw,nw,nw,nw,nw,nw,ne,nw,nw,n,nw,nw,n,nw,nw,nw,n,n,ne,nw,nw,n,nw,nw,n,nw,nw,n,nw,nw,n,nw,nw,nw,nw,nw,nw,nw,nw,n,nw,nw,nw,nw,nw,nw,se,n,nw,nw,nw,n,n,nw,nw,n,n,n,nw,nw,n,nw,nw,nw,nw,nw,nw,nw,sw,n,nw,nw,nw,se,n,nw,nw,se,n,n,nw,n,n,n,nw,nw,nw,sw,n,nw,n,nw,n,nw,sw,nw,n,nw,nw,s,s,n,n,nw,nw,se,n,n,sw,n,n,sw,nw,nw,nw,n,s,ne,nw,nw,nw,sw,nw,ne,n,nw,n,n,n,nw,n,nw,nw,n,n,nw,n,nw,n,nw,nw,nw,ne,nw,nw,s,s,sw,se,n,n,nw,nw,ne,nw,nw,nw,n,nw,n,n,n,se,nw,n,n,n,n,ne,n,nw,nw,nw,n,n,sw,nw,n,sw,nw,n,n,n,nw,n,nw,nw,nw,nw,n,n,n,n,nw,nw,n,n,n,n,n,n,n,nw,nw,n,nw,n,n,nw,s,n,n,n,n,nw,nw,nw,n,se,nw,nw,n,n,n,n,n,n,nw,nw,n,nw,nw,n,n,n,nw,nw,n,n,nw,n,n,nw,n,n,sw,nw,se,n,ne,n,nw,ne,nw,n,n,n,n,n,n,n,ne,n,n,n,se,n,se,n,n,nw,n,n,sw,n,n,n,s,n,n,n,nw,nw,n,n,n,n,nw,nw,n,n,nw,n,n,n,n,n,n,n,n,nw,n,n,n,n,n,n,n,n,n,n,n,ne,n,n,n,n,n,n,n,n,n,ne,nw,nw,nw,n,n,se,n,n,n,n,n,n,n,n,n,se,s,n,n,n,n,nw,sw,n,n,n,n,n,n,n,n,n,nw,nw,n,n,ne,ne,n,n,n,n,n,n,n,s,s,n,n,n,s,ne,n,n,n,n,n,n,n,n,n,n,n,nw,n,n,n,n,ne,nw,n,n,ne,n,n,n,n,n,n,ne,n,n,n,n,ne,n,n,n,n,ne,n,ne,n,ne,n,n,ne,sw,n,nw,s,n,n,s,se,sw,n,ne,n,n,n,n,n,sw,n,sw,n,n,n,n,n,n,ne,n,sw,n,n,ne,n,ne,se,n,n,n,n,ne,n,n,n,ne,n,ne,ne,n,n,n,ne,sw,se,n,n,n,n,n,n,ne,ne,n,n,n,n,ne,s,ne,ne,n,n,n,n,n,n,n,ne,se,n,ne,nw,n,nw,se,n,n,ne,n,ne,n,n,sw,ne,n,n,ne,se,n,n,ne,n,n,n,n,n,n,n,n,n,sw,n,n,s,nw,n,se,ne,n,ne,ne,se,n,n,n,sw,sw,n,n,n,s,n,s,sw,n,n,n,n,n,n,n,se,ne,n,ne,n,ne,ne,nw,n,n,n,s,ne,n,se,se,ne,s,n,n,ne,nw,s,ne,se,n,n,sw,ne,s,n,ne,se,n,ne,n,ne,n,s,n,n,ne,ne,ne,se,se,ne,n,ne,n,n,n,s,n,sw,ne,ne,ne,nw,ne,ne,n,ne,n,ne,n,n,ne,sw,ne,ne,ne,sw,n,n,ne,ne,n,se,ne,n,ne,nw,ne,n,ne,s,n,n,se,n,ne,ne,n,sw,nw,ne,ne,n,ne,n,n,se,n,se,sw,sw,n,ne,ne,ne,nw,ne,ne,n,n,n,s,ne,s,n,n,s,sw,ne,ne,n,nw,n,ne,n,ne,ne,n,se,ne,n,ne,ne,n,ne,n,sw,n,n,n,se,ne,n,ne,ne,n,ne,nw,ne,sw,n,ne,nw,sw,n,n,ne,ne,n,ne,ne,ne,n,se,ne,ne,n,sw,ne,ne,se,ne,ne,ne,ne,ne,sw,ne,ne,ne,n,ne,sw,ne,nw,n,sw,ne,ne,n,ne,n,sw,n,ne,ne,nw,ne,ne,ne,n,n,n,ne,s,se,ne,nw,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,nw,n,ne,ne,n,n,ne,s,se,ne,ne,ne,s,ne,ne,ne,n,ne,ne,n,ne,ne,ne,ne,ne,ne,s,ne,se,ne,n,ne,n,ne,ne,ne,n,ne,ne,ne,s,ne,n,ne,ne,ne,n,ne,ne,ne,se,ne,ne,ne,ne,ne,n,ne,s,n,ne,ne,se,s,ne,ne,ne,ne,ne,ne,nw,sw,ne,ne,s,ne,nw,ne,ne,ne,n,n,ne,ne,ne,s,ne,n,ne,ne,ne,ne,n,ne,ne,ne,ne,ne,ne,ne,ne,sw,ne,s,ne,ne,ne,nw,ne,ne,ne,ne,ne,nw,n,sw,ne,se,ne,n,ne,ne,nw,s,ne,ne,ne,ne,n,se,ne,ne,n,ne,ne,s,ne,ne,s,ne,ne,ne,ne,nw,ne,ne,ne,ne,ne,ne,ne,nw,se,se,ne,ne,ne,ne,ne,ne,sw,ne,s,nw,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,nw,ne,ne,se,ne,ne,ne,ne,ne,ne,ne,sw,ne,ne,ne,ne,ne,ne,ne,se,se,ne,ne,ne,ne,ne,ne,ne,ne,ne,nw,ne,sw,ne,n,se,ne,ne,ne,nw,ne,se,ne,ne,n,ne,ne,ne,se,sw,ne,ne,se,n,ne,s,ne,ne,ne,sw,ne,s,se,ne,nw,ne,s,ne,ne,ne,ne,se,ne,ne,ne,ne,ne,se,ne,ne,ne,se,ne,ne,ne,sw,se,ne,ne,ne,ne,ne,se,ne,ne,ne,n,se,se,ne,ne,ne,se,ne,ne,ne,ne,se,se,ne,n,se,nw,ne,se,se,se,ne,se,n,ne,se,se,nw,se,ne,sw,se,se,ne,ne,ne,nw,se,ne,ne,ne,ne,ne,ne,ne,n,se,ne,ne,ne,nw,ne,se,ne,ne,se,ne,sw,ne,se,ne,ne,ne,se,se,ne,ne,se,se,ne,ne,se,ne,ne,ne,ne,nw,ne,ne,se,ne,ne,se,ne,se,ne,ne,ne,ne,ne,se,sw,ne,ne,ne,ne,se,se,ne,ne,ne,ne,ne,ne,se,ne,s,se,n,ne,ne,se,se,se,se,ne,s,ne,ne,se,se,s,ne,nw,ne,ne,ne,se,ne,ne,ne,ne,n,ne,ne,ne,se,ne,ne,ne,se,se,ne,ne,se,ne,ne,ne,ne,se,sw,nw,se,ne,ne,se,ne,s,se,sw,ne,se,ne,nw,ne,ne,s,se,ne,se,sw,ne,s,ne,ne,sw,se,se,ne,ne,se,ne,se,ne,ne,s,se,se,ne,se,ne,nw,se,sw,ne,ne,se,n,se,ne,ne,se,se,se,ne,se,se,se,ne,se,ne,se,ne,se,ne,s,n,ne,se,se,ne,sw,se,ne,se,ne,se,sw,se,nw,se,se,se,ne,se,se,se,ne,se,se,se,ne,nw,se,nw,se,nw,se,se,nw,se,s,ne,se,ne,n,se,ne,se,ne,se,se,ne,se,ne,ne,se,ne,ne,se,se,ne,se,ne,se,se,se,se,ne,nw,se,se,se,ne,se,sw,ne,se,nw,s,ne,se,se,ne,se,ne,se,se,se,sw,ne,se,ne,ne,se,s,ne,se,se,sw,se,ne,se,ne,ne,se,nw,se,se,ne,se,se,n,ne,ne,s,sw,se,se,se,ne,se,n,nw,se,ne,n,se,se,ne,se,se,se,se,se,nw,se,nw,se,se,ne,ne,n,ne,ne,se,se,sw,se,s,ne,se,ne,se,se,ne,ne,ne,ne,se,se,nw,se,se,ne,se,se,ne,se,se,se,ne,sw,se,ne,ne,nw,se,n,ne,se,se,ne,se,ne,n,se,se,se,ne,ne,se,nw,s,nw,se,se,s,s,ne,ne,ne,se,se,se,se,ne,se,ne,se,ne,se,sw,se,ne,se,ne,sw,se,se,se,ne,se,n,se,ne,ne,ne,se,nw,se,se,se,se,se,ne,se,ne,ne,ne,ne,ne,se,n,se,se,n,se,se,se,se,se,ne,ne,se,nw,se,ne,s,se,s,se,ne,n,s,se,se,se,ne,se,se,n,se,se,se,nw,ne,ne,ne,sw,se,ne,nw,se,se,ne,se,se,se,sw,se,se,se,n,nw,nw,se,n,sw,sw,se,ne,n,nw,n,se,se,se,s,ne,ne,se,se,se,se,ne,se,sw,se,se,se,se,s,ne,se,s,se,se,n,se,ne,se,ne,se,nw,se,se,nw,se,se,se,se,se,se,se,ne,se,se,se,se,se,se,se,se,se,ne,se,se,se,se,se,nw,se,se,se,se,n,se,se,se,se,n,s,se,se,se,se,ne,ne,se,n,se,n,sw,ne,s,se,ne,n,se,se,se,se,se,sw,se,se,se,ne,se,se,sw,se,se,s,se,ne,n,nw,se,se,ne,se,se,se,se,se,se,se,ne,sw,se,se,se,se,se,se,se,n,se,ne,nw,se,ne,se,se,se,nw,ne,n,se,se,se,se,se,se,ne,se,se,sw,s,se,se,se,se,se,ne,se,se,se,se,ne,se,s,se,se,nw,se,se,se,se,se,se,ne,se,n,nw,se,se,se,se,se,se,n,se,nw,nw,n,ne,se,se,nw,se,nw,s,se,s,se,se,sw,se,se,se,se,se,s,se,se,se,nw,se,n,se,se,se,se,se,se,se,se,se,se,se,se,se,se,se,se,se,se,se,se,nw,se,se,n,se,se,se,se,se,ne,se,se,se,se,se,se,s,se,ne,se,se,se,se,se,nw,se,se,se,se,se,se,se,se,sw,se,s,se,se,se,se,se,n,se,s,s,se,se,s,s,se,se,s,se,n,ne,nw,s,se,se,sw,se,ne,se,s,se,se,ne,se,se,sw,se,se,n,se,nw,s,se,se,se,s,se,sw,s,s,se,s,se,se,se,se,nw,se,se,se,s,se,se,s,se,s,ne,se,se,se,se,n,se,se,se,s,se,n,se,se,s,se,se,s,se,se,s,se,se,s,se,se,se,se,se,nw,se,nw,se,se,ne,se,s,sw,se,s,s,se,se,se,se,se,se,se,se,se,se,se,sw,se,se,se,se,s,se,se,se,s,ne,n,se,se,se,sw,se,se,n,s,se,se,se,se,se,se,se,ne,sw,s,s,s,se,nw,se,se,sw,se,s,s,se,se,nw,nw,se,nw,nw,s,se,n,ne,se,sw,se,se,se,ne,s,se,se,se,s,se,se,se,s,se,n,se,sw,se,se,se,se,se,se,s,se,se,sw,se,s,se,n,se,se,se,se,se,n,ne,s,s,se,nw,se,se,se,se,se,se,se,se,s,se,s,n,se,se,s,s,ne,sw,s,se,se,s,s,se,s,se,se,se,se,se,se,se,s,s,s,s,se,s,se,se,s,se,se,se,s,s,s,se,se,nw,se,ne,ne,se,nw,ne,se,ne,se,se,se,se,se,se,se,sw,sw,ne,se,s,se,se,s,s,s,s,s,s,nw,se,s,s,se,s,se,se,se,se,s,s,se,s,s,sw,s,s,se,n,se,s,se,n,s,se,se,se,se,ne,se,se,se,s,se,se,ne,s,s,ne,se,sw,sw,se,se,se,se,s,se,nw,s,s,s,s,se,se,se,se,sw,se,se,se,s,se,se,s,s,se,se,se,se,s,s,se,se,s,se,s,s,se,se,se,s,s,s,s,se,n,se,se,se,s,ne,s,n,se,s,ne,se,sw,se,se,sw,sw,s,s,nw,s,se,sw,se,nw,s,se,s,se,s,s,ne,se,n,se,s,se,nw,se,sw,s,se,s,se,s,se,se,se,s,s,sw,sw,s,ne,s,se,sw,se,se,s,s,s,n,se,se,s,s,s,nw,se,se,nw,s,s,s,s,n,s,s,s,n,se,se,se,s,s,se,s,se,s,n,n,sw,se,s,s,se,se,s,n,s,se,se,n,n,s,s,se,se,s,se,se,n,s,s,n,sw,ne,s,sw,s,se,s,nw,se,n,nw,s,s,s,se,ne,s,s,ne,s,sw,s,s,s,s,s,se,s,se,se,se,s,s,sw,s,s,se,se,se,s,se,s,ne,s,n,s,s,nw,se,s,s,s,nw,se,s,se,ne,s,s,ne,se,nw,se,s,n,s,n,se,se,se,s,s,sw,s,s,s,se,se,s,s,n,se,se,nw,n,n,s,s,s,ne,se,s,s,s,s,ne,n,s,s,s,s,se,se,se,se,se,s,nw,s,s,s,n,se,s,s,s,se,se,s,s,s,nw,s,s,se,se,s,s,s,s,s,s,s,s,sw,s,s,s,s,se,s,se,se,s,s,se,s,nw,se,s,ne,s,s,se,s,ne,se,s,s,ne,se,n,s,nw,se,ne,se,se,se,se,se,n,n,se,n,se,s,nw,s,s,s,s,s,ne,s,sw,s,s,s,se,s,nw,s,s,se,nw,s,se,s,s,se,s,se,sw,se,n,s,se,s,s,s,s,n,ne,s,se,n,s,se,s,se,se,n,s,se,s,s,s,sw,s,s,s,se,s,se,s,ne,se,nw,s,nw,s,sw,s,s,s,s,n,se,s,n,se,s,s,s,s,s,s,se,s,s,n,s,se,s,s,ne,s,s,se,se,se,se,s,s,s,se,s,s,n,s,s,s,s,se,se,n,n,s,se,s,s,s,s,n,s,s,se,se,s,s,s,s,s,n,n,ne,s,s,s,s,nw,s,s,s,s,s,s,n,s,s,se,s,se,s,s,se,s,s,s,sw,ne,s,sw,s,s,se,s,se,s,s,s,se,s,s,s,s,s,s,s,se,n,s,s,s,se,n,s,s,se,nw,s,s,n,s,s,ne,nw,s,s,s,se,s,s,s,s,s,s,se,s,s,s,se,se,se,s,s,s,s,s,se,nw,s,s,s,se,s,nw,s,s,s,s,s,s,ne,s,s,se,n,s,s,ne,s,s,s,s,s,s,s,s,se,s,s,s,sw,s,s,s,s,s,s,n,s,se,se,ne,s,s,s,s,ne,s,sw,s,s,sw,s,sw,s,s,s,s,s,s,ne,s,se,s,s,s,s,s,sw,s,s,s,s,s,s,s,se,n,s,se,s,s,s,s,s,s,s,s,s,s,s,nw,s,se,s,n,s,s,s,s,s,sw,nw,s,s,ne,n,n,s,s,n,s,s,s,s,s,s,s,s,se,sw,n,s,s,sw,s,s,s,s,s,ne,s,s,nw,s,s,ne,s,s,s,s,s,s,s,s,sw,s,s,s,s,s,s,s,s,sw,sw,s,s,s,s,s,s,sw,s,sw,s,s,s,ne,s,s,s,s,s,sw,s,s,sw,se,nw,s,s,s,s,s,s,s,s,se,sw,s,s,s,s,s,s,s,s,s,s,s,sw,s,s,s,s,s,s,s,s,s,s,s,nw,sw,s,s,ne,s,s,s,s,s,s,s,s,nw,nw,s,sw,sw,s,s,s,se,s,se,s,n,sw,s,ne,s,sw,s,n,s,s,n,s,s,s,s,s,s,s,s,sw,sw,s,s,s,s,sw,s,nw,s,s,se,sw,nw,s,s,s,n,s,s,s,sw,sw,s,s,s,nw,s,s,sw,s,s,sw,sw,s,s,s,nw,s,s,s,se,s,s,s,se,s,n,s,s,s,s,s,n,s,sw,s,s,s,s,s,sw,s,s,s,n,s,s,nw,s,se,ne,s,sw,s,nw,n,s,s,n,s,s,s,s,s,s,sw,s,s,s,sw,s,s,s,s,s,s,s,sw,sw,ne,s,s,n,s,ne,s,s,s,s,s,s,sw,s,sw,n,ne,s,sw,s,s,s,ne,s,s,s,s,s,s,ne,s,s,s,s,s,s,s,s,sw,s,s,s,ne,s,s,sw,nw,s,sw,s,sw,nw,s,s,s,s,s,se,s,n,s,sw,s,s,s,nw,sw,se,se,s,sw,s,sw,s,sw,s,sw,s,sw,s,sw,s,n,sw,s,nw,s,s,sw,s,s,sw,s,s,s,s,sw,s,s,s,s,se,se,s,n,n,n,sw,ne,s,s,s,s,sw,s,n,s,s,s,sw,s,s,ne,s,s,s,s,ne,s,s,s,s,se,s,s,s,nw,se,nw,s,s,s,s,sw,sw,s,s,s,sw,sw,sw,s,se,s,n,sw,s,sw,s,sw,n,s,s,sw,s,s,s,s,s,s,nw,s,s,s,se,s,s,se,sw,sw,n,sw,sw,n,sw,sw,s,s,sw,s,n,sw,s,s,sw,se,s,s,s,sw,s,s,s,s,s,s,sw,ne,sw,sw,s,s,se,sw,s,n,s,s,s,s,nw,s,s,s,s,sw,s,s,s,ne,sw,sw,se,s,s,s,s,sw,n,s,s,s,s,s,s,s,s,s,sw,s,sw,s,s,sw,s,n,sw,s,se,ne,s,s,s,s,sw,se,s,s,s,s,s,s,s,s,s,sw,s,s,s,sw,sw,s,s,s,s,sw,se,s,s,s,s,s,s,s,s,s,s,s,s,nw,nw,sw,nw,s,s,s,sw,s,sw,n,s,s,ne,sw,s,s,s,s,sw,s,nw,sw,sw,sw,sw,sw,sw,sw,s,sw,n,sw,s,s,sw,se,sw,s,s,s,se,se,sw,s,sw,s,se,s,s,s,nw,s,n,sw,s,s,sw,sw,sw,s,s,n,sw,s,sw,se,sw,sw,sw,ne,s,sw,sw,nw,s,se,ne,s,s,s,sw,sw,s,s,sw,s,sw,s,sw,s,s,s,nw,sw,s,n,sw,ne,sw,sw,sw,s,sw,s,se,ne,sw,s,sw,n,n,s,sw,ne,n,ne,sw,s,s,sw,s,nw,sw,sw,s,sw,ne,ne,s,sw,sw,s,sw,sw,s,ne,se,s,sw,se,nw,n,nw,ne,se,s,s,ne,n,ne,s,s,sw,nw,se,s,s,s,s,s,sw,s,ne,s,n,sw,s,n,sw,s,s,s,se,s,s,sw,s,sw,sw,s,s,sw,s,sw,s,s,s,s,s,sw,sw,sw,sw,s,s,s,s,se,ne,sw,s,ne,s,s,ne,s,sw,sw,sw,ne,sw,sw,s,s,nw,sw,sw,sw,s,nw,sw,sw,s,sw,sw,s,n,sw,ne,s,sw,s,s,n,sw,ne,sw,nw,sw,s,ne,s,s,n,s,sw,s,se,sw,s,s,sw,s,sw,s,s,nw,nw,sw,s,s,s,se,s,sw,sw,sw,n,s,nw,sw,n,s,s,s,s,sw,sw,s,s,sw,s,s,sw,se,sw,sw,s,s,s,sw,sw,nw,sw,se,s,sw,se,se,sw,sw,s,sw,s,s,ne,s,sw,sw,sw,sw,sw,sw,s,sw,s,sw,sw,s,sw,n,sw,sw,nw,sw,sw,s,s,s,se,nw,s,n,sw,s,s,se,sw,s,sw,sw,sw,sw,s,s,sw,s,sw,s,s,s,sw,s,s,nw,n,sw,sw,se,sw,ne,s,s,se,s,sw,s,sw,sw,s,s,ne,sw,sw,sw,ne,se,sw,sw,sw,n,s,s,sw,s,s,sw,sw,sw,s,s,sw,sw,n,sw,s,s,sw,sw,s,sw,sw,sw,s,n,ne,sw,ne,sw,sw,ne,sw,ne,s,sw,s,sw,s,sw,sw,n,sw,sw,s,se,sw,sw,ne,sw,s,sw,s,sw,se,s,s,se,s,sw,sw,s,sw,s,s,s,sw,sw,sw,s,s,s,sw,sw,s,sw,s,ne,nw,sw,sw,sw,s,sw,s,s,sw,sw,se,ne,s,sw,s,sw,sw,se,sw,s,sw,ne,sw,s,se,s,sw,s,s,sw,s,sw,s,sw,s,sw,sw,s,s,sw,s,sw,nw,ne,sw,s,sw,sw,n,ne,sw,se,sw,s,sw,n,sw,s,se,s,se,se,sw,sw,n,sw,sw,sw,sw,sw,s,sw,sw,sw,nw,s,n,se,sw,sw,sw,n,sw,sw,sw,n,sw,sw,sw,sw,sw,ne,sw,s,n,s,sw,sw,sw,nw,s,sw,n,s,s,s,s,n,n,sw,s,s,n,sw,sw,se,nw,sw,sw,n,sw,s,sw,sw,sw,sw,sw,nw,s,s,sw,n,s,s,sw,s,s,ne,s,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,se,s,s,s,n,sw,s,sw,sw,sw,sw,nw,s,s,se,sw,n,sw,sw,nw,sw,sw,sw,sw,sw,s,sw,s,s,sw,sw,s,s,s,s,sw,sw,sw,sw,sw,s,sw,sw,n,sw,s,sw,se,sw,sw,n,s,s,s,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,s,sw,s,sw,sw,s,s,s,ne,sw,sw,ne,sw,sw,sw,s,sw,sw,sw,sw,n,sw,s,ne,sw,sw,s,sw,sw,sw,s,sw,s,s,sw,sw,s,nw,se,s,sw,s,sw,sw,sw,sw,sw,sw,s,sw,sw,sw,sw,sw,sw,s,nw,s,sw,sw,sw,s,sw,sw,s,sw,n,sw,sw,nw,sw,sw,se,n,sw,sw,s,sw,s,sw,sw,ne,sw,sw,n,sw,se,sw,sw,s,sw,sw,sw,s,sw,sw,se,sw,sw,s,sw,sw,s,sw,sw,sw,sw,s,sw,sw,sw,sw,se,sw,s,sw,sw,sw,ne,sw,sw,sw,sw,sw,sw,sw,sw,s,s,ne,sw,s,s,sw,sw,s,se,sw,sw,sw,n,s,se,sw,sw,s,sw,s,s,ne,s,sw,sw,s,sw,s,sw,sw,sw,sw,sw,se,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,nw,sw,sw,sw,sw,sw,sw,nw,s,sw,sw,sw,nw,sw,sw,s,sw,se,s,sw,nw,n,s,sw,sw,nw,sw,sw,s,sw,ne,sw,sw,nw,sw,sw,sw,sw,ne,sw,ne,sw,sw,sw,sw,sw,n,sw,sw,sw,sw,sw,sw,sw,s,sw,sw,nw,sw,s,ne,sw,sw,sw,sw,sw,sw,se,s,sw,s,nw,sw,sw,sw,sw,se,sw,sw,se,sw,sw,ne,ne,sw,sw,sw,sw,sw,sw,s,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,nw,s,sw,sw,ne,sw,sw,sw,sw,sw,sw,sw,s,ne,sw,sw,sw,sw,sw,sw,sw,sw,s,sw,sw,ne,n,sw,sw,sw,sw,n,sw,sw,se,s,se,s,nw,s,sw,ne,se,sw,ne,sw,sw,se,sw,s,sw,sw,sw,sw,sw,sw,sw,sw,s,ne,sw,sw,sw,ne,sw,sw,sw,ne,sw,sw,sw,sw,nw,nw,s,sw,sw,sw,nw,sw,s,sw,s,sw,sw,sw,sw,n,sw,sw,ne,sw,sw,sw,sw,sw,s,s,sw,sw,sw,se,sw,sw,s,n,se,ne,ne,ne,ne,ne,n,n,n,nw,ne,sw,n,n,n,sw,nw,nw,nw,nw,nw,nw,n,sw,nw,nw,sw,sw,sw,nw,sw,sw,sw,nw,sw,sw,sw,sw,sw,n,sw,sw,sw,sw,sw,s,s,sw,sw,s,s,s,s,ne,s,s,nw,s,s,s,s,s,sw,s,s,s,s,ne,se,s,se,s,se,se,se,se,s,se,n,s,se,s,s,s,se,se,se,se,s,n,se,se,se,se,nw,se,nw,se,ne,se,se,se,se,se,se,se,nw,sw,se,se,se,ne,se,se,se,n,n,ne,se,ne,n,se,n,se,ne,ne,se,se,nw,ne,ne,ne,ne,ne,se,ne,se,ne,ne,ne,ne,ne,ne,se,ne,ne,ne,s,nw,ne,ne,n,ne,ne,ne,ne,s,sw,sw,ne,ne,ne,nw,n,ne,ne,n,s,n,ne,ne,ne,ne,se,s,n,ne,ne,ne,ne,ne,s,ne,n,n,ne,se,n,n,n,n,n,ne,n,n,n,n,sw,n,n,n,ne,nw,s,n,ne,n,n,n,se,s,sw,n,n,n,n,n,ne,n,n,n,sw,n,sw,n,n,n,n,n,n,n,sw,n,s,n,n,n,n,n,n,n,n,s,n,n,nw,se,n,n,se,n,n,n,nw,nw,n,n,nw,n,s,s,n,nw,n,ne,nw,n,n,n,nw,n,nw,sw,nw,n,nw,n,nw,n,n,nw,n,nw,s,n,n,n,nw,nw,nw,n,nw,n,nw,se,nw,nw,nw,s,n,nw,nw,nw,nw,se,ne,n,sw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,sw,nw,nw,nw,se,nw,nw,s,nw,nw,ne,sw,nw,nw,nw,nw,nw,ne,sw,nw,s,nw,nw,nw,nw,nw,nw,nw,se,nw,ne,nw,sw,sw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,ne,nw,sw,nw,nw,sw,nw,nw,sw,sw,nw,sw,nw,n,sw,nw,sw,nw,n,ne,sw,sw,nw,nw,nw,sw,nw,nw,sw,nw,sw,sw,nw,sw,sw,nw,nw,nw,sw,sw,sw,sw,ne,sw,sw,s,sw,sw,nw,nw,sw,nw,sw,nw,nw,sw,ne,ne,sw,sw,s,sw,sw,sw,sw,s,nw,nw,nw,nw,sw,sw,n,sw,sw,sw,nw,sw,sw,sw,se,sw,n,s,n,sw,se,sw,sw,sw,sw,sw,sw,sw,sw,sw,nw,n,sw,sw,sw,sw,sw,n,sw,sw,sw,sw,sw,sw,se,ne,sw,sw,sw,sw,sw,sw,sw,s,se,sw,sw,sw,sw,sw,sw,s,sw,sw,sw,sw,sw,s,sw,sw,s,sw,ne,sw,s,se,sw,ne,sw,sw,s,sw,sw,s,s,sw,s,sw,nw,n,sw,n,n,s,ne,s,sw,nw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,s,s,sw,s,sw,sw,sw,sw,nw,sw,se,s,nw,n,s,s,sw,s,sw,s,s,n,se,sw,sw,s,sw,s,s,sw,s,s,sw,s,sw,sw,s,s,sw,s,n,s,sw,s,s,s,se,sw,s,s,sw,sw,n,sw,sw,sw,sw,s,nw,se,nw,s,s,s,sw,sw,sw,s,s,sw,s,sw,s,sw,s,sw,s,s,n,sw,s,s,sw,s,s,s,sw,s,s,s,s,sw,s,s,sw,s,nw,s,s,s,s,s,s,ne,n,n,s,s,s,nw,s,n,s,s,s,s,s,s,sw,s,s,sw,s,s,s,s,s,s,se,se,s,s,s,s,s,s,s,s,s,s,s,s,s,n,s,s,se,sw,s,s,sw,s,s,n,s,s,s,n,se,s,n,s,s,se,s,n,s,s,s,s,s,s,s,s,s,s,s,sw,s,se,s,s,s,se,s,se,s,se,s,se,se,se,s,s,ne,s,s,s,s,s,s,nw,s,s,s,s,s,s,s,s,s,s,s,s,s,s,ne,ne,s,s,s,nw,s,s,sw,s,sw,se,s,s,s,se,ne,s,s,n,s,se,s,s,s,s,sw,s,se,se,se,s,se,s,nw,ne,se,nw,s,s,ne,se,nw,s,s,nw,s,se,se,s,se,s,s,s,se,s,s,se,se,s,se,nw,s,se,s,sw,s,se,s,n,se,s,ne,se,s,ne,se,se,se,s,s,se,s,s,se,s,n,s,se,s,se,se,se,se,s,se,se,se,ne,se,nw,se,se,se,s,s,se,se,s,sw,se,s,s,s,ne,s,ne,ne,se,se,se,s,se,se,se,nw,sw,se,se,se,se,se,se,s,se,se,se,n,n,se,sw,se,nw,se,s,s,nw,se,se,s,se,se,s,sw,se,s,se,se,se,se,se,se,nw,se,s,ne,se,s,se,ne,n,se,sw,se,se,nw,se,se,se,se,s,sw,se,se,se,se,se,se,se,se,se,s,se,sw,se,se,se,se,s,se,se,sw,se,se,se,se,se,nw,se,se,se,se,sw,se,se,nw,se,sw,se,sw,se,sw,se,sw,se,se,se,se,se,se,s,se,se,nw,se,se,se,se,se,ne,se,se,se,ne,se,se,ne,se,s,ne,se,se,se,ne,se,se,se,se,se,se,se,se,se,n,ne,sw,se,se,ne,se,se,se,se,s,se,se,se,se,se,ne,ne,s,se,se,se,se,se,se,s,sw,se,se,n,se,se,se,se,se,se,ne,n,nw,se,n,se,ne,se,se,ne,se,s,ne,se,se,se,se,se,s,s,ne,se,se,se,ne,se,se,se,se,n,se,se,nw,se,se,s,s,se,se,se,se,nw,se,n,se,nw,se,ne,se,se,se,ne,ne,n,sw,se,ne,ne,se,se,nw,se,ne,ne,se,se,se,sw,se,se,ne,ne,ne,se,ne,ne,ne,se,nw,ne,ne,s,ne,ne,sw,se,se,ne,se,se,ne,se,s,n,se,sw,se,ne,se,se,ne,s,ne,se,ne,ne,se,ne,ne,ne,ne,se,ne,se,s,ne,nw,ne,nw,ne,ne,ne,ne,ne,ne,s,ne,se,ne,ne,se,ne,ne,ne,ne,n,ne,sw,se,ne,s,ne,s,s,ne,nw,se,se,se,se,sw,se,s,se,ne,ne,se,se,n,se,se,sw,se,ne,nw,nw,se,se,nw,ne,se,ne,se,ne,ne,ne,ne,nw,ne,s,n,ne,ne,ne,ne,s,ne,ne,se,ne,ne,s,se,sw,ne,ne,ne,n,s,ne,se,nw,ne,ne,se,sw,nw,ne,ne,s,ne,ne,ne,ne,ne,ne,ne,ne,ne,se,ne,n,ne,ne,s,se,se,ne,sw,ne,ne,ne,nw,ne,ne,s,sw,nw,ne,ne,ne,ne,ne,ne,ne,se,s,ne,ne,ne,se,ne,sw,ne,ne,se,ne,ne,sw,ne,nw,nw,ne,ne,ne,ne,sw,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,se,ne,ne,ne,se,ne,ne,sw,ne,ne,ne,ne,se,ne,ne,ne,nw,ne,ne,ne,ne,ne,n,ne,nw,ne,ne,ne,s,ne,ne,ne,ne,sw,ne,s,se,ne,ne,s,n,ne,ne,ne,sw,ne,ne,ne,ne,nw,ne,ne,ne,ne,ne,n,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,sw,ne,ne,ne,sw,ne,nw,ne,se,se,ne,ne,ne,ne,ne,ne,n,ne,ne,ne,sw,ne,ne,ne,ne,ne,ne,ne,n,sw,ne,ne,ne,ne,ne,ne,ne,s,ne,ne,se,s,se,ne,sw,se,s,nw,ne,ne,ne,ne,se,ne,ne,ne,n,ne,n,n,ne,n,se,ne,sw,ne,ne,ne,ne,ne,n,se,ne,se,n,s,n,nw,ne,n,s,ne,ne,ne,ne,ne,n,ne,ne,nw,ne,ne,s,se,ne,n,ne,se,n,ne,ne,n,nw,sw,n,n,ne,ne,ne,s,ne,ne,nw,ne,n,nw,ne,s,n,ne,nw,n,se,n,ne,ne,se,ne,n,ne,ne,ne,nw,s,sw,ne,ne,sw,n,ne,ne,ne,n,sw,ne,ne,se,ne,n,n,ne,ne,se,nw,ne,ne,ne,ne,se,n,se,s,ne,ne,nw,se,n,nw,n,nw,ne,ne,ne,ne,ne,sw,ne,n,ne,n,ne,ne,se,n,se,ne,ne,ne,ne,n,ne,ne,ne,s,ne,ne,n,n,sw,ne,n,ne,ne,ne,n,se,nw,ne,n,ne,n,se,n,n,ne,n,ne,ne,ne,ne,n,n,ne,ne,se,ne,ne,n,n,ne,n,nw,ne,n,ne,ne,ne,ne,ne,n,ne,n,nw,ne,ne,s,n,n,ne,ne,n,nw,ne,n,sw,sw,ne,nw,ne,nw,n,n,n,n,se,n,sw,n,ne,ne,ne,nw,ne,n,s,ne,ne,n,ne,n,n,n,n,n,n,n,ne,ne,n,ne,n,n,n,n,n,ne,ne,ne,se,n,ne,n,s,n,se,n,ne,n,ne,sw,n,n,n,n,n,n,s,ne,n,n,se,n,nw,n,n,n,n,ne,s,n,n,n,n,ne,ne,ne,sw,n,n,n,n,ne,n,n,ne,nw,n,ne,n,ne,n,n,ne,ne,n,ne,se,n,ne,nw,ne,ne,sw,ne,ne,nw,ne,ne,ne,nw,n,sw,se,nw,n,n,sw,n,sw,sw,n,n,n,s,sw,s,n,se,ne,n,ne,n,n,n,n,ne,n,n,n,n,sw,sw,ne,ne,se,sw,s,n,n,n,ne,n,n,n,n,n,nw,n,n,n,ne,n,s,n,n,n,nw,n,n,ne,n,n,ne,n,sw,n,n,n,n,n,ne,n,nw,n,n,n,n,n,n,s,nw,n,ne,n,n,n,ne,n,n,ne,n,n,s,ne,ne,n,se,n,n,ne,se,n,n,n,n,ne,n,ne,n,n,n,n,se,n,ne,sw,n,s,s,n,sw,n,n,sw,nw,n,nw,n,n,n,n,n,n,n,nw,nw,n,sw,n,n,n,n,n,ne,n,s,n,n,s,n,n,n,ne,s,s,n,s,se,n,n,n,n,n,n,se,nw,sw,n,n,n,n,n,n,n,n,n,n,n,nw,sw,n,n,ne,n,n,n,n,n,n,n,n,n,n,n,n,se,s,n,s,n,s,n,nw,n,n,ne,n,ne,s,n,n,s,n,ne,ne,n,n,n,n,nw,ne,n,se,sw,n,n,sw,n,n,n,se,n,n,se,n,se,n,n,s,n,n,n,nw,ne,n,n,n,n,n,n,n,s,n,nw,n,n,n,se,n,n,n,n,n,n,n,n,n,s,n,n,n,se,sw,n,n,sw,n,s,nw,n,nw,n,n,se,n,sw,n,n,n,n,n,nw,n,n,n,n,s,n,n,n,n,nw,nw,n,n,n,se,nw,n,nw,se,n,n,n,n,ne,n,n,n,s,se,sw,sw,nw,s,nw,ne,n,n,nw,n,nw,n,n,ne,n,n,n,n,n,n,se,se,n,se,n,nw,n,n,n,n,nw,nw,nw,n,s,n,nw,n,n,n,ne,n,n,n,nw,nw,n,n,s,n,nw,n,n,n,n,n,nw,n,nw,n,n,n,s,se,n,n,n,nw,s,n,s,n,n,n,n,n,n,se,n,n,n,n,n,sw,n,nw,n,n,n,nw,n,n,se,s,n,nw,nw,n,n,n,n,se,n,n,n,n,ne,sw,nw,nw,se,n,nw,nw,nw,s,se,ne,nw,n,s,n,n,s,n,s,s,n,nw,n,ne,nw,n,se,n,nw,n,se,nw,nw,n,nw,n,s,nw,nw,nw,n,n,nw,n,ne,nw,se,n,n,n,nw,nw,n,s,n,n,nw,n,nw,s,nw,sw,nw,n,nw,se,n,n,n,ne,n,nw,n,ne,nw,n,nw,n,n,se,n,nw,nw,n,se,nw,se,se,nw,n,nw,nw,n,ne,sw,se,n,n,nw,s,n,nw,nw,n,nw,nw,n,nw,nw,nw,s,nw,n,se,nw,n,n,s,s,n,n,n,ne,n,nw,n,n,n,n,sw,n,n,se,ne,n,nw,nw,n,n,nw,sw,nw,ne,n,nw,n,n,se,se,n,n,nw,n,se,n,s,nw,n,n,n,n,nw,n,n,n,ne,nw,nw,nw,n,nw,n,n,n,nw,nw,nw,n,ne,nw,n,n,sw,n,n,n,nw,nw,s,n,nw,nw,sw,n,n,nw,n,n,n,n,nw,n,n,n,nw,nw,nw,nw,n,s,nw,nw,n,nw,se,n,nw,nw,n,n,nw,n,nw,n,nw,n,n,nw,n,nw,n,n,n,n,nw,nw,nw,nw,nw,n,n,n,sw,n,n,nw,nw,n,n,n,n,ne,n,sw,n,n,nw,n,nw,nw,nw,nw,nw,nw,nw,ne,nw,ne,n,n,nw,nw,nw,nw,nw,nw,nw,nw,se,nw,nw,nw,n,nw,ne,nw,se,nw,nw,nw,n,se,nw,n,se,nw,nw,nw,ne,n,n,sw,nw,n,ne,ne,nw,n,nw,sw,n,n,nw,nw,n,ne,nw,nw,nw,nw,nw,nw,s,nw,nw,nw,s,nw,nw,nw,n,nw,nw,sw,n,se,nw,nw,nw,nw,n,nw,s,n,nw,nw,n,nw,nw,nw,sw,nw,n,nw,nw,sw,n,nw,nw,nw,s,nw,nw,nw,nw,n,ne,nw,nw,nw,se,n,n,nw,nw,nw,n,nw,nw,s,nw,nw,n,nw,nw,nw,sw,se,nw,nw,nw,nw,n,s,nw,nw,nw,nw,ne,se,sw,nw,sw,nw,nw,n,n,n,nw,n,nw,nw,nw,nw,nw,nw,nw,n,nw,nw,nw,nw,se,se,se,n,sw,nw,s,ne,n,nw,nw,s,n,nw,s,n,ne,s,se,nw,nw,n,nw,nw,ne,nw,nw,nw,nw,nw,nw,ne,nw,n,nw,nw,nw,nw,n,nw,s,n,nw,nw,nw,nw,nw,nw,nw,n,nw,nw,n,nw,nw,nw,nw,nw,nw,nw,ne,nw,nw,nw,nw,nw,s,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,n,sw,nw,sw,nw,n,ne,nw,nw,nw,nw,nw,nw,nw,s,nw,nw,nw,nw,se,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,se,nw,nw,nw,n,nw,ne,nw,nw,ne,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,ne diff --git a/src/main/resources/2017/day12.txt b/src/main/resources/2017/day12.txt new file mode 100644 index 00000000..10550303 --- /dev/null +++ b/src/main/resources/2017/day12.txt @@ -0,0 +1,2000 @@ +0 <-> 1352, 1864 +1 <-> 430 +2 <-> 1202, 1416 +3 <-> 303, 363, 635 +4 <-> 1041, 1383 +5 <-> 143, 1513 +6 <-> 6 +7 <-> 619 +8 <-> 167, 1246, 1822 +9 <-> 577, 1274, 1347 +10 <-> 10, 899 +11 <-> 790 +12 <-> 606 +13 <-> 1134, 1894 +14 <-> 539, 1974 +15 <-> 683, 1783 +16 <-> 438, 1235 +17 <-> 17 +18 <-> 760, 1162 +19 <-> 1146 +20 <-> 678, 1235, 1397, 1911 +21 <-> 127, 615, 980 +22 <-> 22, 187 +23 <-> 192, 552 +24 <-> 169 +25 <-> 471 +26 <-> 1030, 1329, 1333 +27 <-> 1404 +28 <-> 1249 +29 <-> 1755 +30 <-> 198 +31 <-> 510, 1884 +32 <-> 1088 +33 <-> 54, 372, 616, 938, 1548 +34 <-> 1574 +35 <-> 238, 1411 +36 <-> 114 +37 <-> 1962 +38 <-> 1554, 1633 +39 <-> 72, 486, 1002 +40 <-> 40, 1224, 1342, 1511, 1886 +41 <-> 1244, 1644 +42 <-> 1784 +43 <-> 169, 1142 +44 <-> 96, 827 +45 <-> 842, 1512 +46 <-> 1248 +47 <-> 283, 1125, 1130 +48 <-> 212, 327, 1922 +49 <-> 490 +50 <-> 359, 1386 +51 <-> 1186 +52 <-> 414 +53 <-> 808 +54 <-> 33, 673 +55 <-> 614 +56 <-> 56 +57 <-> 257 +58 <-> 482, 701, 1702, 1921 +59 <-> 515, 695, 1073 +60 <-> 809 +61 <-> 865 +62 <-> 106, 764 +63 <-> 416, 1119, 1360 +64 <-> 552 +65 <-> 978, 1042 +66 <-> 97, 130, 168 +67 <-> 180, 339 +68 <-> 1076 +69 <-> 1550, 1621 +70 <-> 1163, 1574, 1834 +71 <-> 163, 1789 +72 <-> 39, 1461, 1693 +73 <-> 266, 652, 1612, 1877 +74 <-> 860, 936, 1685 +75 <-> 502, 768 +76 <-> 1064 +77 <-> 1685, 1967 +78 <-> 501 +79 <-> 743, 1261, 1608 +80 <-> 80, 1901 +81 <-> 1684 +82 <-> 82 +83 <-> 234, 504, 1159 +84 <-> 1529 +85 <-> 705 +86 <-> 362, 644 +87 <-> 223 +88 <-> 1870 +89 <-> 1412, 1633 +90 <-> 191, 1141, 1993, 1999 +91 <-> 588 +92 <-> 92 +93 <-> 918 +94 <-> 972, 1401 +95 <-> 1043, 1299 +96 <-> 44 +97 <-> 66, 1089 +98 <-> 1300 +99 <-> 243, 1220, 1957 +100 <-> 1327 +101 <-> 815, 1700, 1782 +102 <-> 427, 723, 780, 1033 +103 <-> 589, 1586 +104 <-> 486 +105 <-> 1296 +106 <-> 62, 1677 +107 <-> 1855 +108 <-> 174, 1792 +109 <-> 1518 +110 <-> 1943 +111 <-> 1799 +112 <-> 112, 845 +113 <-> 1189 +114 <-> 36, 1895 +115 <-> 775, 894, 987, 1832 +116 <-> 455, 1317 +117 <-> 436, 630, 944, 1229 +118 <-> 1316 +119 <-> 282 +120 <-> 1022 +121 <-> 446, 685 +122 <-> 908, 1189 +123 <-> 850, 1058, 1400 +124 <-> 124, 867 +125 <-> 316, 1198 +126 <-> 1938 +127 <-> 21 +128 <-> 514, 871 +129 <-> 597 +130 <-> 66, 187, 541, 952 +131 <-> 637, 728, 1951 +132 <-> 1480 +133 <-> 921, 1443 +134 <-> 506, 576 +135 <-> 1510 +136 <-> 755 +137 <-> 842 +138 <-> 1077, 1219 +139 <-> 1284, 1664 +140 <-> 403 +141 <-> 452, 1400 +142 <-> 142, 442, 1462, 1463 +143 <-> 5, 331, 492 +144 <-> 144 +145 <-> 844 +146 <-> 774, 1141 +147 <-> 351, 458 +148 <-> 1984 +149 <-> 499, 909, 935 +150 <-> 153, 1300 +151 <-> 151 +152 <-> 1331 +153 <-> 150 +154 <-> 783 +155 <-> 155, 1985 +156 <-> 1752 +157 <-> 716, 1144 +158 <-> 647, 750 +159 <-> 583 +160 <-> 493, 770, 1669, 1675 +161 <-> 161, 291, 1890 +162 <-> 744, 1088, 1250 +163 <-> 71, 803 +164 <-> 231 +165 <-> 1799 +166 <-> 1101 +167 <-> 8, 167 +168 <-> 66, 441 +169 <-> 24, 43, 1015 +170 <-> 414, 509, 1222, 1392, 1947 +171 <-> 180, 260, 1448 +172 <-> 1894 +173 <-> 585, 1662 +174 <-> 108, 1300, 1304, 1789 +175 <-> 574, 1245 +176 <-> 1776, 1809 +177 <-> 1625 +178 <-> 1463 +179 <-> 1469, 1648 +180 <-> 67, 171 +181 <-> 506, 1333 +182 <-> 1703 +183 <-> 370, 745, 816, 961 +184 <-> 1143, 1608, 1696 +185 <-> 431, 447, 633 +186 <-> 352, 752 +187 <-> 22, 130, 201, 232, 279 +188 <-> 921 +189 <-> 1460 +190 <-> 445, 891, 972 +191 <-> 90, 1078, 1383, 1957 +192 <-> 23, 1057 +193 <-> 1438 +194 <-> 196, 819, 873 +195 <-> 1403 +196 <-> 194, 508 +197 <-> 865, 1625 +198 <-> 30, 855, 1397 +199 <-> 399, 401 +200 <-> 458 +201 <-> 187, 457, 796 +202 <-> 754, 964, 1736, 1737 +203 <-> 937, 1890 +204 <-> 676, 1148, 1472 +205 <-> 205 +206 <-> 206, 872, 1504 +207 <-> 1575, 1717 +208 <-> 1349, 1582, 1619, 1952 +209 <-> 375, 523 +210 <-> 1029 +211 <-> 588, 623 +212 <-> 48, 404, 820 +213 <-> 213 +214 <-> 1370 +215 <-> 360, 412, 1507, 1800, 1874 +216 <-> 287, 634, 1023, 1986 +217 <-> 662, 1863 +218 <-> 417, 1154 +219 <-> 1250, 1442, 1962 +220 <-> 595, 935, 1153, 1181 +221 <-> 290 +222 <-> 1328, 1407 +223 <-> 87, 464, 925, 1131 +224 <-> 1398 +225 <-> 225, 768 +226 <-> 999 +227 <-> 311, 581, 697 +228 <-> 983, 1019 +229 <-> 719, 1469, 1820 +230 <-> 453, 806, 1205, 1449 +231 <-> 164, 451, 1741 +232 <-> 187 +233 <-> 664, 1419 +234 <-> 83, 295, 482, 1684 +235 <-> 622 +236 <-> 236, 1662 +237 <-> 287 +238 <-> 35, 1308, 1608, 1805 +239 <-> 1365 +240 <-> 1177 +241 <-> 387, 778, 1051 +242 <-> 1233 +243 <-> 99, 806, 1614 +244 <-> 609, 1468 +245 <-> 625, 1618 +246 <-> 841, 1835 +247 <-> 1720 +248 <-> 1382, 1859 +249 <-> 601, 1882 +250 <-> 250, 1189, 1603, 1673, 1793 +251 <-> 511 +252 <-> 627 +253 <-> 1195 +254 <-> 400, 1562, 1893, 1951 +255 <-> 285, 588, 1180 +256 <-> 1408, 1468 +257 <-> 57, 1211, 1940 +258 <-> 695, 1174 +259 <-> 610, 1176, 1516 +260 <-> 171 +261 <-> 268 +262 <-> 502, 837, 1963 +263 <-> 263 +264 <-> 622, 638, 1815, 1945 +265 <-> 570, 1590 +266 <-> 73 +267 <-> 336, 1040 +268 <-> 261, 1815 +269 <-> 652, 966, 1487 +270 <-> 508, 522 +271 <-> 1259, 1298, 1477, 1767 +272 <-> 553, 1103, 1982 +273 <-> 593, 1919 +274 <-> 934, 1361 +275 <-> 1839 +276 <-> 329 +277 <-> 1017, 1047 +278 <-> 671 +279 <-> 187, 853 +280 <-> 1097, 1370 +281 <-> 629 +282 <-> 119, 1431 +283 <-> 47, 974 +284 <-> 1359, 1471 +285 <-> 255 +286 <-> 321, 883 +287 <-> 216, 237 +288 <-> 630, 880 +289 <-> 289, 1853 +290 <-> 221, 1307 +291 <-> 161, 691, 1213 +292 <-> 808 +293 <-> 877, 1031, 1192 +294 <-> 294, 1935 +295 <-> 234 +296 <-> 520, 1725 +297 <-> 578, 702, 1184, 1209, 1431 +298 <-> 979 +299 <-> 1297, 1506 +300 <-> 540, 995, 1187, 1774 +301 <-> 675 +302 <-> 739, 842 +303 <-> 3, 1149, 1369, 1484 +304 <-> 690 +305 <-> 1306 +306 <-> 481 +307 <-> 474, 1723 +308 <-> 323 +309 <-> 995 +310 <-> 544, 797, 1000 +311 <-> 227, 927, 1127 +312 <-> 1519 +313 <-> 1989 +314 <-> 314 +315 <-> 536, 560, 1758 +316 <-> 125, 582, 679, 1362 +317 <-> 317, 510 +318 <-> 1382, 1678 +319 <-> 682 +320 <-> 1733 +321 <-> 286, 575 +322 <-> 905, 1898 +323 <-> 308, 366, 788, 1022, 1119, 1615 +324 <-> 1151, 1390, 1540 +325 <-> 1022 +326 <-> 335, 1858 +327 <-> 48 +328 <-> 1076, 1456 +329 <-> 276, 329, 1268 +330 <-> 796, 919, 1330, 1565, 1926 +331 <-> 143, 1522 +332 <-> 831 +333 <-> 1746 +334 <-> 1254, 1844 +335 <-> 326 +336 <-> 267, 913 +337 <-> 454, 1365, 1618 +338 <-> 1800 +339 <-> 67 +340 <-> 1061 +341 <-> 957 +342 <-> 1130, 1242 +343 <-> 782, 1629 +344 <-> 350, 1216 +345 <-> 898 +346 <-> 586, 1372 +347 <-> 1537 +348 <-> 1899 +349 <-> 378 +350 <-> 344 +351 <-> 147, 381, 993 +352 <-> 186 +353 <-> 353, 646, 913 +354 <-> 465 +355 <-> 1423, 1695 +356 <-> 573, 1241 +357 <-> 1695 +358 <-> 1100, 1271 +359 <-> 50, 1472, 1910 +360 <-> 215 +361 <-> 1512 +362 <-> 86, 1768, 1997 +363 <-> 3, 1731 +364 <-> 657, 1713, 1992 +365 <-> 475, 1490, 1968 +366 <-> 323, 1482, 1765 +367 <-> 831 +368 <-> 1393 +369 <-> 1135 +370 <-> 183, 592 +371 <-> 637, 1518 +372 <-> 33 +373 <-> 1494 +374 <-> 1761 +375 <-> 209 +376 <-> 1587 +377 <-> 1522 +378 <-> 349, 686, 1006, 1946 +379 <-> 379, 487 +380 <-> 1763 +381 <-> 351, 1048 +382 <-> 1895 +383 <-> 1623 +384 <-> 1423, 1450 +385 <-> 1350, 1770 +386 <-> 798, 890 +387 <-> 241, 894 +388 <-> 1756 +389 <-> 629 +390 <-> 507 +391 <-> 1780 +392 <-> 1144 +393 <-> 1240, 1279 +394 <-> 1227 +395 <-> 1361 +396 <-> 396 +397 <-> 397, 1228 +398 <-> 454 +399 <-> 199 +400 <-> 254, 1147 +401 <-> 199, 1068, 1445, 1918 +402 <-> 636, 1601, 1934 +403 <-> 140, 921 +404 <-> 212, 430, 468, 1064, 1346, 1434 +405 <-> 633 +406 <-> 949 +407 <-> 512, 951 +408 <-> 1900, 1908 +409 <-> 409 +410 <-> 1724 +411 <-> 624, 733 +412 <-> 215, 1455 +413 <-> 1612 +414 <-> 52, 170 +415 <-> 907, 1600 +416 <-> 63 +417 <-> 218, 835 +418 <-> 418, 1116 +419 <-> 1531 +420 <-> 1154, 1538 +421 <-> 485, 511 +422 <-> 422 +423 <-> 665 +424 <-> 1891 +425 <-> 1140 +426 <-> 1409 +427 <-> 102 +428 <-> 463 +429 <-> 575, 1432, 1779 +430 <-> 1, 404 +431 <-> 185, 1473 +432 <-> 1065, 1720 +433 <-> 1554 +434 <-> 965 +435 <-> 562, 1577 +436 <-> 117 +437 <-> 960 +438 <-> 16, 926, 1342 +439 <-> 1171 +440 <-> 1198, 1622 +441 <-> 168 +442 <-> 142 +443 <-> 443 +444 <-> 1399, 1836 +445 <-> 190 +446 <-> 121 +447 <-> 185, 1249 +448 <-> 1505 +449 <-> 542, 1433 +450 <-> 1859 +451 <-> 231, 590, 1641, 1651 +452 <-> 141, 452 +453 <-> 230 +454 <-> 337, 398, 511 +455 <-> 116, 455 +456 <-> 1231, 1368 +457 <-> 201, 1294 +458 <-> 147, 200, 1799 +459 <-> 1113 +460 <-> 1521, 1841 +461 <-> 882 +462 <-> 683, 1744, 1887 +463 <-> 428, 1221 +464 <-> 223, 1310 +465 <-> 354, 880 +466 <-> 960, 1216 +467 <-> 511, 1185 +468 <-> 404 +469 <-> 469 +470 <-> 470 +471 <-> 25, 494, 747, 1078 +472 <-> 855, 1358 +473 <-> 473 +474 <-> 307, 1288 +475 <-> 365, 688, 1881 +476 <-> 1129, 1496, 1753 +477 <-> 828, 1032, 1376 +478 <-> 1474, 1950 +479 <-> 479 +480 <-> 480, 1318 +481 <-> 306, 487 +482 <-> 58, 234, 902, 1003 +483 <-> 1681, 1730 +484 <-> 484, 1071 +485 <-> 421, 800, 975, 1124 +486 <-> 39, 104 +487 <-> 379, 481, 918 +488 <-> 488, 1297 +489 <-> 897, 1216, 1384 +490 <-> 49, 1286 +491 <-> 1283 +492 <-> 143, 1098 +493 <-> 160, 1120 +494 <-> 471, 1781 +495 <-> 495, 642, 714, 1004 +496 <-> 1227 +497 <-> 513, 1349, 1382 +498 <-> 1846 +499 <-> 149, 499 +500 <-> 621, 1005, 1640 +501 <-> 78, 1254 +502 <-> 75, 262, 1008, 1404, 1915 +503 <-> 1707 +504 <-> 83 +505 <-> 1809 +506 <-> 134, 181, 506 +507 <-> 390, 621, 1630 +508 <-> 196, 270 +509 <-> 170, 1819 +510 <-> 31, 317, 656 +511 <-> 251, 421, 454, 467, 1532 +512 <-> 407, 1258, 1430 +513 <-> 497 +514 <-> 128, 840 +515 <-> 59, 619, 662 +516 <-> 1649 +517 <-> 517 +518 <-> 731 +519 <-> 1522 +520 <-> 296, 847 +521 <-> 1667 +522 <-> 270, 690, 1047, 1246 +523 <-> 209, 1087 +524 <-> 1267 +525 <-> 714, 1126, 1896 +526 <-> 1788 +527 <-> 1660, 1733 +528 <-> 1309, 1955 +529 <-> 1912 +530 <-> 838 +531 <-> 1167, 1515 +532 <-> 532, 1128 +533 <-> 1602 +534 <-> 564, 1108 +535 <-> 535, 810 +536 <-> 315, 1842 +537 <-> 1947 +538 <-> 1208, 1445 +539 <-> 14, 825 +540 <-> 300 +541 <-> 130, 1188 +542 <-> 449, 1197 +543 <-> 1302 +544 <-> 310, 1131 +545 <-> 1409 +546 <-> 772 +547 <-> 1954 +548 <-> 1662 +549 <-> 1601 +550 <-> 875, 1899 +551 <-> 1208 +552 <-> 23, 64, 1140 +553 <-> 272, 1616, 1632, 1988 +554 <-> 554, 622, 1169 +555 <-> 555, 705, 772 +556 <-> 625 +557 <-> 867, 1210 +558 <-> 870, 1039, 1320, 1509, 1995 +559 <-> 835, 968 +560 <-> 315 +561 <-> 1335 +562 <-> 435 +563 <-> 658 +564 <-> 534, 640, 1456, 1610 +565 <-> 1130 +566 <-> 741 +567 <-> 1018 +568 <-> 839 +569 <-> 1544, 1767 +570 <-> 265 +571 <-> 1006, 1852 +572 <-> 1320 +573 <-> 356, 787, 816, 1947 +574 <-> 175, 1287, 1381, 1413 +575 <-> 321, 429 +576 <-> 134 +577 <-> 9, 668, 1979 +578 <-> 297, 1576 +579 <-> 1779 +580 <-> 798 +581 <-> 227, 832 +582 <-> 316, 1033 +583 <-> 159, 1550 +584 <-> 1988 +585 <-> 173, 1275 +586 <-> 346, 1343 +587 <-> 1499, 1911 +588 <-> 91, 211, 255 +589 <-> 103, 703 +590 <-> 451, 1686 +591 <-> 828, 1746 +592 <-> 370 +593 <-> 273 +594 <-> 1358, 1607 +595 <-> 220 +596 <-> 1050, 1375 +597 <-> 129, 1463 +598 <-> 598, 1804 +599 <-> 1606, 1671 +600 <-> 1930 +601 <-> 249, 869, 1233, 1336 +602 <-> 1150, 1203 +603 <-> 603 +604 <-> 604, 620 +605 <-> 835, 1556, 1770 +606 <-> 12, 696, 1634, 1897 +607 <-> 1629 +608 <-> 608 +609 <-> 244, 738 +610 <-> 259, 684, 1309 +611 <-> 1398 +612 <-> 612, 1178, 1808 +613 <-> 1245 +614 <-> 55, 1701, 1969 +615 <-> 21, 759 +616 <-> 33, 1160 +617 <-> 617, 824 +618 <-> 725, 840 +619 <-> 7, 515 +620 <-> 604, 1247 +621 <-> 500, 507, 1039 +622 <-> 235, 264, 554, 665, 1476 +623 <-> 211, 773, 1382, 1839 +624 <-> 411, 943 +625 <-> 245, 556, 794, 1277 +626 <-> 988, 1429, 1495 +627 <-> 252, 708, 1780 +628 <-> 981 +629 <-> 281, 389, 1132 +630 <-> 117, 288, 802, 1438, 1492 +631 <-> 753, 1279, 1716, 1843 +632 <-> 1715 +633 <-> 185, 405 +634 <-> 216 +635 <-> 3 +636 <-> 402, 1983 +637 <-> 131, 371 +638 <-> 264, 1157 +639 <-> 815 +640 <-> 564 +641 <-> 1473, 1727 +642 <-> 495 +643 <-> 967, 1996 +644 <-> 86, 1586 +645 <-> 1063, 1994 +646 <-> 353 +647 <-> 158, 1732 +648 <-> 910, 1758 +649 <-> 685, 704 +650 <-> 1443, 1490 +651 <-> 891 +652 <-> 73, 269, 1374 +653 <-> 756 +654 <-> 1026 +655 <-> 1177 +656 <-> 510 +657 <-> 364 +658 <-> 563, 1264, 1402, 1457, 1617 +659 <-> 899, 1543 +660 <-> 874, 1691 +661 <-> 1979 +662 <-> 217, 515 +663 <-> 953, 1147 +664 <-> 233, 820, 1152 +665 <-> 423, 622, 856 +666 <-> 1020 +667 <-> 1093, 1611 +668 <-> 577, 892 +669 <-> 1563 +670 <-> 984, 1927 +671 <-> 278, 803, 982 +672 <-> 1143 +673 <-> 54, 1650, 1902 +674 <-> 1624, 1694 +675 <-> 301, 1473 +676 <-> 204, 1726 +677 <-> 786, 1772 +678 <-> 20 +679 <-> 316 +680 <-> 722, 1885 +681 <-> 845 +682 <-> 319, 777, 1935 +683 <-> 15, 462 +684 <-> 610 +685 <-> 121, 649, 836, 1137 +686 <-> 378, 1709 +687 <-> 687 +688 <-> 475 +689 <-> 1950 +690 <-> 304, 522, 1357, 1814 +691 <-> 291 +692 <-> 838, 1183 +693 <-> 1298 +694 <-> 1493 +695 <-> 59, 258, 1529 +696 <-> 606 +697 <-> 227, 1590 +698 <-> 870 +699 <-> 1699 +700 <-> 1740 +701 <-> 58, 1535 +702 <-> 297 +703 <-> 589, 703 +704 <-> 649, 1289, 1652 +705 <-> 85, 555 +706 <-> 1523 +707 <-> 1606 +708 <-> 627, 710, 1498, 1598 +709 <-> 852, 1835 +710 <-> 708 +711 <-> 711 +712 <-> 1786 +713 <-> 991, 1558 +714 <-> 495, 525 +715 <-> 1185, 1473 +716 <-> 157 +717 <-> 1425 +718 <-> 718, 1316 +719 <-> 229, 1568 +720 <-> 1977 +721 <-> 721, 1272 +722 <-> 680, 734, 1547 +723 <-> 102 +724 <-> 1982 +725 <-> 618, 807 +726 <-> 1771 +727 <-> 1447 +728 <-> 131, 1232, 1972 +729 <-> 1345, 1875 +730 <-> 730, 991 +731 <-> 518, 1201, 1484 +732 <-> 1972 +733 <-> 411, 1596 +734 <-> 722 +735 <-> 1253 +736 <-> 936, 1160 +737 <-> 799, 865, 957, 1319 +738 <-> 609 +739 <-> 302, 1047 +740 <-> 1532 +741 <-> 566, 1226, 1395 +742 <-> 742, 1215 +743 <-> 79, 1552 +744 <-> 162, 1110 +745 <-> 183 +746 <-> 1861 +747 <-> 471 +748 <-> 1671 +749 <-> 1099, 1899 +750 <-> 158 +751 <-> 751 +752 <-> 186, 804, 1013, 1403 +753 <-> 631, 753 +754 <-> 202, 1423, 1670 +755 <-> 136, 803, 1343 +756 <-> 653, 756 +757 <-> 819 +758 <-> 758 +759 <-> 615 +760 <-> 18, 1044 +761 <-> 1636 +762 <-> 1184, 1251 +763 <-> 879, 1227 +764 <-> 62, 1486 +765 <-> 1993 +766 <-> 966, 1665 +767 <-> 773, 925, 1295 +768 <-> 75, 225 +769 <-> 1675 +770 <-> 160 +771 <-> 801, 916, 985, 996, 1984 +772 <-> 546, 555 +773 <-> 623, 767, 927, 1447 +774 <-> 146, 979, 1583 +775 <-> 115, 947 +776 <-> 1055 +777 <-> 682, 1114, 1480 +778 <-> 241 +779 <-> 1735 +780 <-> 102, 781, 1942 +781 <-> 780, 1062 +782 <-> 343, 809, 881, 1766 +783 <-> 154, 1389, 1763 +784 <-> 1168, 1935 +785 <-> 1286 +786 <-> 677, 833, 1140 +787 <-> 573, 1801 +788 <-> 323, 1036 +789 <-> 983, 1599 +790 <-> 11, 1322, 1503, 1667 +791 <-> 956 +792 <-> 1708 +793 <-> 1431 +794 <-> 625, 1842 +795 <-> 795 +796 <-> 201, 330 +797 <-> 310, 1425, 1749 +798 <-> 386, 580 +799 <-> 737, 1561, 1722 +800 <-> 485 +801 <-> 771 +802 <-> 630, 1363 +803 <-> 163, 671, 755, 1897, 1953 +804 <-> 752, 1356 +805 <-> 1459 +806 <-> 230, 243 +807 <-> 725, 855 +808 <-> 53, 292, 1303, 1494 +809 <-> 60, 782 +810 <-> 535, 1713 +811 <-> 1670 +812 <-> 1910 +813 <-> 1458 +814 <-> 896, 1098 +815 <-> 101, 639, 815, 898 +816 <-> 183, 573 +817 <-> 817, 1021, 1262 +818 <-> 818, 1077 +819 <-> 194, 757, 861 +820 <-> 212, 664, 1944 +821 <-> 1081, 1109 +822 <-> 1769 +823 <-> 1758 +824 <-> 617 +825 <-> 539 +826 <-> 1150, 1844 +827 <-> 44, 831 +828 <-> 477, 591 +829 <-> 1947 +830 <-> 1165, 1669 +831 <-> 332, 367, 827 +832 <-> 581 +833 <-> 786 +834 <-> 1022, 1530 +835 <-> 417, 559, 605 +836 <-> 685, 1647 +837 <-> 262, 1560, 1944 +838 <-> 530, 692, 1717 +839 <-> 568, 843, 1021, 1788 +840 <-> 514, 618, 1390 +841 <-> 246, 1190, 1646 +842 <-> 45, 137, 302, 1306 +843 <-> 839 +844 <-> 145, 1715, 1833 +845 <-> 112, 681 +846 <-> 1136, 1718 +847 <-> 520, 1818 +848 <-> 1916 +849 <-> 1641 +850 <-> 123 +851 <-> 1072 +852 <-> 709 +853 <-> 279, 941 +854 <-> 1188 +855 <-> 198, 472, 807, 1469 +856 <-> 665 +857 <-> 1318 +858 <-> 1608 +859 <-> 1901 +860 <-> 74 +861 <-> 819, 920 +862 <-> 1378 +863 <-> 1683 +864 <-> 1880 +865 <-> 61, 197, 737, 1289 +866 <-> 866, 1221 +867 <-> 124, 557 +868 <-> 1485 +869 <-> 601, 1029 +870 <-> 558, 698 +871 <-> 128, 1738 +872 <-> 206 +873 <-> 194 +874 <-> 660, 1100 +875 <-> 550, 900 +876 <-> 1029 +877 <-> 293, 1087, 1486 +878 <-> 1726 +879 <-> 763, 1252, 1597 +880 <-> 288, 465 +881 <-> 782 +882 <-> 461, 1223, 1252, 1585 +883 <-> 286, 954, 1046, 1491 +884 <-> 1184 +885 <-> 1393, 1487 +886 <-> 907, 995, 1123 +887 <-> 988, 997 +888 <-> 1218, 1679 +889 <-> 1544 +890 <-> 386, 1867 +891 <-> 190, 651, 917, 1593 +892 <-> 668 +893 <-> 893 +894 <-> 115, 387 +895 <-> 1378, 1857 +896 <-> 814 +897 <-> 489, 1829 +898 <-> 345, 815 +899 <-> 10, 659 +900 <-> 875 +901 <-> 901, 1132, 1550 +902 <-> 482 +903 <-> 1172, 1271, 1657 +904 <-> 1954 +905 <-> 322 +906 <-> 1716 +907 <-> 415, 886, 1929 +908 <-> 122 +909 <-> 149 +910 <-> 648 +911 <-> 911 +912 <-> 1292, 1962 +913 <-> 336, 353 +914 <-> 914 +915 <-> 1744 +916 <-> 771, 1421 +917 <-> 891, 1084, 1428 +918 <-> 93, 487 +919 <-> 330, 1672 +920 <-> 861 +921 <-> 133, 188, 403, 1418, 1921 +922 <-> 1020, 1515 +923 <-> 1597 +924 <-> 1102 +925 <-> 223, 767, 1175, 1920 +926 <-> 438 +927 <-> 311, 773 +928 <-> 1162, 1317, 1571 +929 <-> 929 +930 <-> 1485, 1875 +931 <-> 1809 +932 <-> 1130, 1190, 1553 +933 <-> 1303 +934 <-> 274 +935 <-> 149, 220 +936 <-> 74, 736, 1574 +937 <-> 203, 1942 +938 <-> 33 +939 <-> 1616 +940 <-> 940, 1577 +941 <-> 853 +942 <-> 1315, 1345 +943 <-> 624 +944 <-> 117, 1531 +945 <-> 1130 +946 <-> 1789 +947 <-> 775 +948 <-> 1275 +949 <-> 406, 1279, 1795 +950 <-> 1803 +951 <-> 407, 1440, 1785 +952 <-> 130 +953 <-> 663, 1460 +954 <-> 883 +955 <-> 1954 +956 <-> 791, 1625 +957 <-> 341, 737 +958 <-> 1932 +959 <-> 1624 +960 <-> 437, 466, 1501 +961 <-> 183, 994 +962 <-> 1663 +963 <-> 963, 1734 +964 <-> 202, 1784 +965 <-> 434, 1240 +966 <-> 269, 766, 1395 +967 <-> 643, 1414 +968 <-> 559, 1523 +969 <-> 1664 +970 <-> 1670 +971 <-> 1485 +972 <-> 94, 190 +973 <-> 984 +974 <-> 283 +975 <-> 485, 1584 +976 <-> 1835 +977 <-> 977 +978 <-> 65 +979 <-> 298, 774 +980 <-> 21, 1217, 1897 +981 <-> 628, 981 +982 <-> 671 +983 <-> 228, 789, 1321, 1933 +984 <-> 670, 973, 1105 +985 <-> 771, 1703 +986 <-> 1478 +987 <-> 115, 1725 +988 <-> 626, 887, 1266 +989 <-> 1366, 1601, 1964 +990 <-> 1990 +991 <-> 713, 730, 1932 +992 <-> 1183 +993 <-> 351 +994 <-> 961 +995 <-> 300, 309, 886, 995, 1305 +996 <-> 771, 1048, 1203 +997 <-> 887 +998 <-> 1787 +999 <-> 226, 1093, 1367 +1000 <-> 310 +1001 <-> 1468, 1913 +1002 <-> 39, 1718 +1003 <-> 482 +1004 <-> 495 +1005 <-> 500 +1006 <-> 378, 571 +1007 <-> 1256 +1008 <-> 502 +1009 <-> 1127 +1010 <-> 1567 +1011 <-> 1011, 1122, 1840 +1012 <-> 1012 +1013 <-> 752 +1014 <-> 1538, 1775 +1015 <-> 169, 1426 +1016 <-> 1016, 1960 +1017 <-> 277 +1018 <-> 567, 1619 +1019 <-> 228, 1495 +1020 <-> 666, 922 +1021 <-> 817, 839 +1022 <-> 120, 323, 325, 834 +1023 <-> 216, 1271 +1024 <-> 1502 +1025 <-> 1097 +1026 <-> 654, 1455, 1739 +1027 <-> 1823, 1906 +1028 <-> 1903 +1029 <-> 210, 869, 876, 1474, 1756 +1030 <-> 26 +1031 <-> 293, 1458 +1032 <-> 477 +1033 <-> 102, 582 +1034 <-> 1984 +1035 <-> 1977 +1036 <-> 788 +1037 <-> 1037 +1038 <-> 1312, 1796, 1855 +1039 <-> 558, 621, 1831 +1040 <-> 267, 1478, 1776 +1041 <-> 4 +1042 <-> 65, 1881 +1043 <-> 95, 1202, 1794 +1044 <-> 760 +1045 <-> 1426 +1046 <-> 883 +1047 <-> 277, 522, 739 +1048 <-> 381, 996, 1578 +1049 <-> 1554, 1779 +1050 <-> 596 +1051 <-> 241, 1117 +1052 <-> 1533, 1637 +1053 <-> 1797 +1054 <-> 1814 +1055 <-> 776, 1380 +1056 <-> 1732, 1965 +1057 <-> 192 +1058 <-> 123 +1059 <-> 1114 +1060 <-> 1282 +1061 <-> 340, 1325, 1517 +1062 <-> 781, 1810 +1063 <-> 645, 1567 +1064 <-> 76, 404 +1065 <-> 432 +1066 <-> 1081, 1384, 1592 +1067 <-> 1139 +1068 <-> 401 +1069 <-> 1327, 1873 +1070 <-> 1070 +1071 <-> 484, 1334 +1072 <-> 851, 1072 +1073 <-> 59 +1074 <-> 1948 +1075 <-> 1227 +1076 <-> 68, 328, 1076 +1077 <-> 138, 818, 1906 +1078 <-> 191, 471, 1966 +1079 <-> 1869 +1080 <-> 1735, 1811, 1855 +1081 <-> 821, 1066, 1895 +1082 <-> 1740 +1083 <-> 1083 +1084 <-> 917 +1085 <-> 1111 +1086 <-> 1440, 1916 +1087 <-> 523, 877 +1088 <-> 32, 162 +1089 <-> 97, 1854, 1948 +1090 <-> 1102, 1896 +1091 <-> 1466 +1092 <-> 1655 +1093 <-> 667, 999, 1159 +1094 <-> 1248, 1961 +1095 <-> 1243 +1096 <-> 1635 +1097 <-> 280, 1025 +1098 <-> 492, 814 +1099 <-> 749 +1100 <-> 358, 874 +1101 <-> 166, 1846 +1102 <-> 924, 1090 +1103 <-> 272, 1766 +1104 <-> 1712 +1105 <-> 984, 1105 +1106 <-> 1106, 1620 +1107 <-> 1107 +1108 <-> 534, 1529 +1109 <-> 821 +1110 <-> 744 +1111 <-> 1085, 1111, 1207 +1112 <-> 1373 +1113 <-> 459, 1430 +1114 <-> 777, 1059 +1115 <-> 1115 +1116 <-> 418 +1117 <-> 1051 +1118 <-> 1474, 1583 +1119 <-> 63, 323, 1194, 1302 +1120 <-> 493 +1121 <-> 1464 +1122 <-> 1011 +1123 <-> 886, 1848 +1124 <-> 485 +1125 <-> 47, 1705 +1126 <-> 525 +1127 <-> 311, 1009, 1566 +1128 <-> 532 +1129 <-> 476 +1130 <-> 47, 342, 565, 932, 945 +1131 <-> 223, 544 +1132 <-> 629, 901 +1133 <-> 1133, 1526 +1134 <-> 13, 1913 +1135 <-> 369, 1871 +1136 <-> 846, 1879 +1137 <-> 685 +1138 <-> 1752 +1139 <-> 1067, 1202 +1140 <-> 425, 552, 786 +1141 <-> 90, 146 +1142 <-> 43, 1818 +1143 <-> 184, 672, 1411 +1144 <-> 157, 392, 1851 +1145 <-> 1145, 1628 +1146 <-> 19, 1574 +1147 <-> 400, 663, 1265 +1148 <-> 204, 1289, 1499, 1899 +1149 <-> 303, 1797 +1150 <-> 602, 826 +1151 <-> 324 +1152 <-> 664, 1518 +1153 <-> 220, 1990 +1154 <-> 218, 420, 1811 +1155 <-> 1658 +1156 <-> 1581, 1778, 1865 +1157 <-> 638, 1849 +1158 <-> 1445 +1159 <-> 83, 1093, 1680 +1160 <-> 616, 736 +1161 <-> 1161 +1162 <-> 18, 928 +1163 <-> 70 +1164 <-> 1868 +1165 <-> 830, 1769 +1166 <-> 1687 +1167 <-> 531 +1168 <-> 784, 1761 +1169 <-> 554 +1170 <-> 1206, 1327, 1754 +1171 <-> 439, 1307, 1525 +1172 <-> 903, 1172, 1542 +1173 <-> 1173 +1174 <-> 258 +1175 <-> 925, 1869 +1176 <-> 259 +1177 <-> 240, 655, 1738 +1178 <-> 612 +1179 <-> 1537 +1180 <-> 255, 1675 +1181 <-> 220 +1182 <-> 1377, 1877 +1183 <-> 692, 992 +1184 <-> 297, 762, 884, 1718 +1185 <-> 467, 715, 1369 +1186 <-> 51, 1600 +1187 <-> 300 +1188 <-> 541, 854 +1189 <-> 113, 122, 250, 1653 +1190 <-> 841, 932, 1448 +1191 <-> 1225, 1345, 1427 +1192 <-> 293, 1927 +1193 <-> 1193, 1436 +1194 <-> 1119 +1195 <-> 253, 1864 +1196 <-> 1432 +1197 <-> 542, 1368, 1825 +1198 <-> 125, 440 +1199 <-> 1199, 1570, 1740 +1200 <-> 1565 +1201 <-> 731 +1202 <-> 2, 1043, 1139, 1303 +1203 <-> 602, 996, 1250 +1204 <-> 1204 +1205 <-> 230, 1514 +1206 <-> 1170 +1207 <-> 1111 +1208 <-> 538, 551, 1904 +1209 <-> 297 +1210 <-> 557 +1211 <-> 257, 1629 +1212 <-> 1999 +1213 <-> 291 +1214 <-> 1977 +1215 <-> 742, 1311, 1502, 1721 +1216 <-> 344, 466, 489, 1457, 1810 +1217 <-> 980 +1218 <-> 888, 1294 +1219 <-> 138 +1220 <-> 99 +1221 <-> 463, 866 +1222 <-> 170 +1223 <-> 882, 1817 +1224 <-> 40, 1267 +1225 <-> 1191, 1857 +1226 <-> 741, 1309 +1227 <-> 394, 496, 763, 1075, 1673 +1228 <-> 397 +1229 <-> 117, 1237 +1230 <-> 1435, 1551, 1555 +1231 <-> 456, 1885 +1232 <-> 728 +1233 <-> 242, 601 +1234 <-> 1699 +1235 <-> 16, 20, 1335 +1236 <-> 1417 +1237 <-> 1229, 1554 +1238 <-> 1561 +1239 <-> 1731, 1864 +1240 <-> 393, 965, 1624 +1241 <-> 356, 1241 +1242 <-> 342 +1243 <-> 1095, 1540 +1244 <-> 41, 1802 +1245 <-> 175, 613 +1246 <-> 8, 522 +1247 <-> 620 +1248 <-> 46, 1094, 1430 +1249 <-> 28, 447 +1250 <-> 162, 219, 1203 +1251 <-> 762 +1252 <-> 879, 882 +1253 <-> 735, 1867 +1254 <-> 334, 501 +1255 <-> 1396 +1256 <-> 1007, 1366, 1636 +1257 <-> 1257 +1258 <-> 512, 1488 +1259 <-> 271 +1260 <-> 1898, 1978 +1261 <-> 79 +1262 <-> 817 +1263 <-> 1387, 1405, 1580 +1264 <-> 658 +1265 <-> 1147, 1943 +1266 <-> 988 +1267 <-> 524, 1224 +1268 <-> 329 +1269 <-> 1537, 1608 +1270 <-> 1540 +1271 <-> 358, 903, 1023, 1398 +1272 <-> 721, 1410 +1273 <-> 1379 +1274 <-> 9 +1275 <-> 585, 948 +1276 <-> 1920 +1277 <-> 625 +1278 <-> 1483 +1279 <-> 393, 631, 949 +1280 <-> 1572, 1842 +1281 <-> 1281, 1833 +1282 <-> 1060, 1283, 1422 +1283 <-> 491, 1282 +1284 <-> 139 +1285 <-> 1893 +1286 <-> 490, 785, 1598, 1661 +1287 <-> 574 +1288 <-> 474, 1600, 1824 +1289 <-> 704, 865, 1148, 1681 +1290 <-> 1660 +1291 <-> 1291, 1301 +1292 <-> 912, 1416 +1293 <-> 1293, 1605 +1294 <-> 457, 1218 +1295 <-> 767 +1296 <-> 105, 1859 +1297 <-> 299, 488 +1298 <-> 271, 693 +1299 <-> 95, 1445 +1300 <-> 98, 150, 174, 1422 +1301 <-> 1291 +1302 <-> 543, 1119 +1303 <-> 808, 933, 1202, 1883 +1304 <-> 174 +1305 <-> 995 +1306 <-> 305, 842 +1307 <-> 290, 1171 +1308 <-> 238, 1385 +1309 <-> 528, 610, 1226 +1310 <-> 464, 1520 +1311 <-> 1215, 1830 +1312 <-> 1038 +1313 <-> 1835 +1314 <-> 1916 +1315 <-> 942 +1316 <-> 118, 718 +1317 <-> 116, 928 +1318 <-> 480, 857 +1319 <-> 737 +1320 <-> 558, 572 +1321 <-> 983 +1322 <-> 790, 1368 +1323 <-> 1846 +1324 <-> 1920 +1325 <-> 1061, 1409, 1459 +1326 <-> 1486 +1327 <-> 100, 1069, 1170, 1441, 1641 +1328 <-> 222, 1328 +1329 <-> 26 +1330 <-> 330 +1331 <-> 152, 1358, 1380, 1690, 1888 +1332 <-> 1776 +1333 <-> 26, 181 +1334 <-> 1071 +1335 <-> 561, 1235 +1336 <-> 601 +1337 <-> 1689 +1338 <-> 1528, 1689 +1339 <-> 1422, 1588 +1340 <-> 1911, 1964 +1341 <-> 1887 +1342 <-> 40, 438 +1343 <-> 586, 755, 1806, 1956 +1344 <-> 1344, 1354, 1623, 1923 +1345 <-> 729, 942, 1191 +1346 <-> 404 +1347 <-> 9, 1524, 1757, 1945, 1978 +1348 <-> 1828 +1349 <-> 208, 497 +1350 <-> 385 +1351 <-> 1399 +1352 <-> 0 +1353 <-> 1731 +1354 <-> 1344, 1587, 1870 +1355 <-> 1522, 1625 +1356 <-> 804, 1356 +1357 <-> 690 +1358 <-> 472, 594, 1331 +1359 <-> 284, 1934 +1360 <-> 63, 1403 +1361 <-> 274, 395, 1361 +1362 <-> 316 +1363 <-> 802, 1779, 1975 +1364 <-> 1377 +1365 <-> 239, 337 +1366 <-> 989, 1256, 1420 +1367 <-> 999, 1483 +1368 <-> 456, 1197, 1322 +1369 <-> 303, 1185 +1370 <-> 214, 280, 1747, 1764 +1371 <-> 1371 +1372 <-> 346, 1546 +1373 <-> 1112, 1665 +1374 <-> 652 +1375 <-> 596, 1375 +1376 <-> 477, 1730, 1807 +1377 <-> 1182, 1364 +1378 <-> 862, 895, 1378, 1391 +1379 <-> 1273, 1698, 1715 +1380 <-> 1055, 1331, 1847 +1381 <-> 574, 1654 +1382 <-> 248, 318, 497, 623 +1383 <-> 4, 191 +1384 <-> 489, 1066 +1385 <-> 1308 +1386 <-> 50 +1387 <-> 1263 +1388 <-> 1567 +1389 <-> 783 +1390 <-> 324, 840, 1772 +1391 <-> 1378 +1392 <-> 170, 1641 +1393 <-> 368, 885 +1394 <-> 1645, 1655 +1395 <-> 741, 966 +1396 <-> 1255, 1396, 1965 +1397 <-> 20, 198 +1398 <-> 224, 611, 1271, 1549 +1399 <-> 444, 1351, 1660 +1400 <-> 123, 141 +1401 <-> 94 +1402 <-> 658 +1403 <-> 195, 752, 1360 +1404 <-> 27, 502 +1405 <-> 1263 +1406 <-> 1514 +1407 <-> 222 +1408 <-> 256 +1409 <-> 426, 545, 1325, 1980, 1981 +1410 <-> 1272 +1411 <-> 35, 1143, 1444 +1412 <-> 89 +1413 <-> 574 +1414 <-> 967, 1680 +1415 <-> 1593 +1416 <-> 2, 1292 +1417 <-> 1236, 1599 +1418 <-> 921, 1464 +1419 <-> 233 +1420 <-> 1366, 1564 +1421 <-> 916 +1422 <-> 1282, 1300, 1339 +1423 <-> 355, 384, 754 +1424 <-> 1488 +1425 <-> 717, 797 +1426 <-> 1015, 1045 +1427 <-> 1191 +1428 <-> 917 +1429 <-> 626, 1911 +1430 <-> 512, 1113, 1248 +1431 <-> 282, 297, 793, 1663 +1432 <-> 429, 1196 +1433 <-> 449 +1434 <-> 404 +1435 <-> 1230 +1436 <-> 1193, 1827 +1437 <-> 1809 +1438 <-> 193, 630 +1439 <-> 1773 +1440 <-> 951, 1086 +1441 <-> 1327 +1442 <-> 219, 1808 +1443 <-> 133, 650 +1444 <-> 1411, 1527, 1689 +1445 <-> 401, 538, 1158, 1299 +1446 <-> 1831 +1447 <-> 727, 773 +1448 <-> 171, 1190 +1449 <-> 230, 1751 +1450 <-> 384 +1451 <-> 1451 +1452 <-> 1607 +1453 <-> 1453 +1454 <-> 1454 +1455 <-> 412, 1026 +1456 <-> 328, 564 +1457 <-> 658, 1216 +1458 <-> 813, 1031 +1459 <-> 805, 1325 +1460 <-> 189, 953 +1461 <-> 72, 1461, 1573 +1462 <-> 142 +1463 <-> 142, 178, 597 +1464 <-> 1121, 1418, 1905 +1465 <-> 1810 +1466 <-> 1091, 1751 +1467 <-> 1484, 1697 +1468 <-> 244, 256, 1001, 1503 +1469 <-> 179, 229, 855 +1470 <-> 1889 +1471 <-> 284 +1472 <-> 204, 359, 1748 +1473 <-> 431, 641, 675, 715, 1753 +1474 <-> 478, 1029, 1118 +1475 <-> 1475, 1595 +1476 <-> 622 +1477 <-> 271 +1478 <-> 986, 1040 +1479 <-> 1479 +1480 <-> 132, 777 +1481 <-> 1481 +1482 <-> 366 +1483 <-> 1278, 1367 +1484 <-> 303, 731, 1467, 1778 +1485 <-> 868, 930, 971 +1486 <-> 764, 877, 1326 +1487 <-> 269, 885 +1488 <-> 1258, 1424 +1489 <-> 1839 +1490 <-> 365, 650 +1491 <-> 883, 1655 +1492 <-> 630, 1505, 1710, 1866 +1493 <-> 694, 1785 +1494 <-> 373, 808, 1838 +1495 <-> 626, 1019 +1496 <-> 476, 1666 +1497 <-> 1916 +1498 <-> 708 +1499 <-> 587, 1148, 1596 +1500 <-> 1800, 1974 +1501 <-> 960 +1502 <-> 1024, 1215, 1676 +1503 <-> 790, 1468 +1504 <-> 206 +1505 <-> 448, 1492 +1506 <-> 299 +1507 <-> 215, 1579 +1508 <-> 1678 +1509 <-> 558 +1510 <-> 135, 1693 +1511 <-> 40 +1512 <-> 45, 361, 1635 +1513 <-> 5 +1514 <-> 1205, 1406 +1515 <-> 531, 922, 1730 +1516 <-> 259 +1517 <-> 1061 +1518 <-> 109, 371, 1152 +1519 <-> 312, 1835 +1520 <-> 1310 +1521 <-> 460 +1522 <-> 331, 377, 519, 1355, 1852, 1871 +1523 <-> 706, 968, 1607 +1524 <-> 1347 +1525 <-> 1171, 1728 +1526 <-> 1133 +1527 <-> 1444 +1528 <-> 1338 +1529 <-> 84, 695, 1108 +1530 <-> 834 +1531 <-> 419, 944 +1532 <-> 511, 740 +1533 <-> 1052 +1534 <-> 1572 +1535 <-> 701, 1606 +1536 <-> 1536 +1537 <-> 347, 1179, 1269 +1538 <-> 420, 1014 +1539 <-> 1648 +1540 <-> 324, 1243, 1270 +1541 <-> 1952 +1542 <-> 1172 +1543 <-> 659 +1544 <-> 569, 889 +1545 <-> 1545 +1546 <-> 1372 +1547 <-> 722 +1548 <-> 33 +1549 <-> 1398 +1550 <-> 69, 583, 901 +1551 <-> 1230, 1907 +1552 <-> 743, 1841 +1553 <-> 932 +1554 <-> 38, 433, 1049, 1237 +1555 <-> 1230 +1556 <-> 605 +1557 <-> 1728, 1980 +1558 <-> 713 +1559 <-> 1573 +1560 <-> 837, 1803 +1561 <-> 799, 1238, 1712 +1562 <-> 254 +1563 <-> 669, 1610 +1564 <-> 1420, 1832 +1565 <-> 330, 1200 +1566 <-> 1127 +1567 <-> 1010, 1063, 1388 +1568 <-> 719 +1569 <-> 1851 +1570 <-> 1199 +1571 <-> 928, 1752 +1572 <-> 1280, 1534 +1573 <-> 1461, 1559 +1574 <-> 34, 70, 936, 1146 +1575 <-> 207 +1576 <-> 578 +1577 <-> 435, 940 +1578 <-> 1048 +1579 <-> 1507 +1580 <-> 1263, 1610 +1581 <-> 1156 +1582 <-> 208, 1839 +1583 <-> 774, 1118, 1902 +1584 <-> 975 +1585 <-> 882 +1586 <-> 103, 644, 1637 +1587 <-> 376, 1354 +1588 <-> 1339, 1913 +1589 <-> 1791, 1855 +1590 <-> 265, 697 +1591 <-> 1631 +1592 <-> 1066, 1692, 1707 +1593 <-> 891, 1415, 1723 +1594 <-> 1594, 1959 +1595 <-> 1475 +1596 <-> 733, 1499 +1597 <-> 879, 923, 1991 +1598 <-> 708, 1286, 1965 +1599 <-> 789, 1417 +1600 <-> 415, 1186, 1288 +1601 <-> 402, 549, 989 +1602 <-> 533, 1602 +1603 <-> 250 +1604 <-> 1784 +1605 <-> 1293 +1606 <-> 599, 707, 1535 +1607 <-> 594, 1452, 1523 +1608 <-> 79, 184, 238, 858, 1269 +1609 <-> 1638 +1610 <-> 564, 1563, 1580 +1611 <-> 667 +1612 <-> 73, 413, 1612 +1613 <-> 1997 +1614 <-> 243 +1615 <-> 323 +1616 <-> 553, 939 +1617 <-> 658 +1618 <-> 245, 337, 1618 +1619 <-> 208, 1018 +1620 <-> 1106 +1621 <-> 69 +1622 <-> 440, 1876 +1623 <-> 383, 1344 +1624 <-> 674, 959, 1240 +1625 <-> 177, 197, 956, 1355 +1626 <-> 1626, 1790 +1627 <-> 1722 +1628 <-> 1145 +1629 <-> 343, 607, 1211 +1630 <-> 507 +1631 <-> 1591, 1886 +1632 <-> 553 +1633 <-> 38, 89 +1634 <-> 606 +1635 <-> 1096, 1512 +1636 <-> 761, 1256 +1637 <-> 1052, 1586 +1638 <-> 1609, 1638 +1639 <-> 1978 +1640 <-> 500, 1712 +1641 <-> 451, 849, 1327, 1392, 1994 +1642 <-> 1785 +1643 <-> 1960 +1644 <-> 41, 1644 +1645 <-> 1394 +1646 <-> 841, 1646, 1936 +1647 <-> 836 +1648 <-> 179, 1539 +1649 <-> 516, 1717 +1650 <-> 673 +1651 <-> 451 +1652 <-> 704 +1653 <-> 1189 +1654 <-> 1381, 1654, 1928 +1655 <-> 1092, 1394, 1491 +1656 <-> 1755, 1767 +1657 <-> 903 +1658 <-> 1155, 1658 +1659 <-> 1659, 1747 +1660 <-> 527, 1290, 1399 +1661 <-> 1286 +1662 <-> 173, 236, 548 +1663 <-> 962, 1431 +1664 <-> 139, 969, 1664 +1665 <-> 766, 1373 +1666 <-> 1496 +1667 <-> 521, 790, 1919 +1668 <-> 1668 +1669 <-> 160, 830 +1670 <-> 754, 811, 970 +1671 <-> 599, 748 +1672 <-> 919 +1673 <-> 250, 1227 +1674 <-> 1771, 1838 +1675 <-> 160, 769, 1180, 1729 +1676 <-> 1502 +1677 <-> 106 +1678 <-> 318, 1508 +1679 <-> 888 +1680 <-> 1159, 1414 +1681 <-> 483, 1289 +1682 <-> 1905 +1683 <-> 863, 1798, 1891 +1684 <-> 81, 234 +1685 <-> 74, 77 +1686 <-> 590 +1687 <-> 1166, 1709 +1688 <-> 1820 +1689 <-> 1337, 1338, 1444 +1690 <-> 1331 +1691 <-> 660 +1692 <-> 1592 +1693 <-> 72, 1510, 1957 +1694 <-> 674 +1695 <-> 355, 357, 1755 +1696 <-> 184, 1828 +1697 <-> 1467 +1698 <-> 1379 +1699 <-> 699, 1234, 1699, 1784 +1700 <-> 101 +1701 <-> 614, 1728, 1743 +1702 <-> 58 +1703 <-> 182, 985 +1704 <-> 1704 +1705 <-> 1125 +1706 <-> 1706 +1707 <-> 503, 1592 +1708 <-> 792, 1880, 1882 +1709 <-> 686, 1687 +1710 <-> 1492 +1711 <-> 1711 +1712 <-> 1104, 1561, 1640 +1713 <-> 364, 810 +1714 <-> 1714, 1845 +1715 <-> 632, 844, 1379 +1716 <-> 631, 906 +1717 <-> 207, 838, 1649, 1717 +1718 <-> 846, 1002, 1184 +1719 <-> 1719 +1720 <-> 247, 432, 1720, 1914 +1721 <-> 1215 +1722 <-> 799, 1627 +1723 <-> 307, 1593 +1724 <-> 410, 1756, 1887 +1725 <-> 296, 987 +1726 <-> 676, 878, 1837 +1727 <-> 641 +1728 <-> 1525, 1557, 1701, 1875 +1729 <-> 1675 +1730 <-> 483, 1376, 1515, 1916 +1731 <-> 363, 1239, 1353 +1732 <-> 647, 1056 +1733 <-> 320, 527, 1733 +1734 <-> 963 +1735 <-> 779, 1080 +1736 <-> 202 +1737 <-> 202 +1738 <-> 871, 1177 +1739 <-> 1026 +1740 <-> 700, 1082, 1199, 1941 +1741 <-> 231 +1742 <-> 1936 +1743 <-> 1701 +1744 <-> 462, 915 +1745 <-> 1798 +1746 <-> 333, 591 +1747 <-> 1370, 1659 +1748 <-> 1472, 1930 +1749 <-> 797 +1750 <-> 1949 +1751 <-> 1449, 1466 +1752 <-> 156, 1138, 1571 +1753 <-> 476, 1473 +1754 <-> 1170 +1755 <-> 29, 1656, 1695 +1756 <-> 388, 1029, 1724 +1757 <-> 1347 +1758 <-> 315, 648, 823, 1851 +1759 <-> 1759 +1760 <-> 1760, 1889 +1761 <-> 374, 1168 +1762 <-> 1814 +1763 <-> 380, 783, 1863 +1764 <-> 1370, 1949 +1765 <-> 366 +1766 <-> 782, 1103 +1767 <-> 271, 569, 1656 +1768 <-> 362 +1769 <-> 822, 1165 +1770 <-> 385, 605, 1800 +1771 <-> 726, 1674, 1907 +1772 <-> 677, 1390 +1773 <-> 1439, 1773 +1774 <-> 300 +1775 <-> 1014 +1776 <-> 176, 1040, 1332 +1777 <-> 1841 +1778 <-> 1156, 1484 +1779 <-> 429, 579, 1049, 1363 +1780 <-> 391, 627 +1781 <-> 494 +1782 <-> 101 +1783 <-> 15 +1784 <-> 42, 964, 1604, 1699, 1996 +1785 <-> 951, 1493, 1642 +1786 <-> 712, 1786 +1787 <-> 998, 1787 +1788 <-> 526, 839 +1789 <-> 71, 174, 946, 1973 +1790 <-> 1626 +1791 <-> 1589 +1792 <-> 108, 1842 +1793 <-> 250 +1794 <-> 1043 +1795 <-> 949 +1796 <-> 1038 +1797 <-> 1053, 1149 +1798 <-> 1683, 1745, 1830 +1799 <-> 111, 165, 458 +1800 <-> 215, 338, 1500, 1770 +1801 <-> 787 +1802 <-> 1244 +1803 <-> 950, 1560 +1804 <-> 598 +1805 <-> 238 +1806 <-> 1343 +1807 <-> 1376 +1808 <-> 612, 1442 +1809 <-> 176, 505, 931, 1437 +1810 <-> 1062, 1216, 1465 +1811 <-> 1080, 1154 +1812 <-> 1832, 1858 +1813 <-> 1813 +1814 <-> 690, 1054, 1762 +1815 <-> 264, 268 +1816 <-> 1816 +1817 <-> 1223 +1818 <-> 847, 1142 +1819 <-> 509 +1820 <-> 229, 1688 +1821 <-> 1976 +1822 <-> 8 +1823 <-> 1027 +1824 <-> 1288 +1825 <-> 1197 +1826 <-> 1894, 1977 +1827 <-> 1436 +1828 <-> 1348, 1696 +1829 <-> 897 +1830 <-> 1311, 1798 +1831 <-> 1039, 1446 +1832 <-> 115, 1564, 1812 +1833 <-> 844, 1281 +1834 <-> 70 +1835 <-> 246, 709, 976, 1313, 1519 +1836 <-> 444 +1837 <-> 1726 +1838 <-> 1494, 1674 +1839 <-> 275, 623, 1489, 1582 +1840 <-> 1011 +1841 <-> 460, 1552, 1777 +1842 <-> 536, 794, 1280, 1792 +1843 <-> 631 +1844 <-> 334, 826 +1845 <-> 1714 +1846 <-> 498, 1101, 1323, 1846 +1847 <-> 1380 +1848 <-> 1123 +1849 <-> 1157 +1850 <-> 1850 +1851 <-> 1144, 1569, 1758 +1852 <-> 571, 1522 +1853 <-> 289 +1854 <-> 1089 +1855 <-> 107, 1038, 1080, 1589 +1856 <-> 1947 +1857 <-> 895, 1225 +1858 <-> 326, 1812 +1859 <-> 248, 450, 1296 +1860 <-> 1860 +1861 <-> 746, 1861 +1862 <-> 1882 +1863 <-> 217, 1763 +1864 <-> 0, 1195, 1239 +1865 <-> 1156, 1925 +1866 <-> 1492 +1867 <-> 890, 1253, 1867 +1868 <-> 1164, 1893 +1869 <-> 1079, 1175 +1870 <-> 88, 1354 +1871 <-> 1135, 1522, 1940 +1872 <-> 1872 +1873 <-> 1069 +1874 <-> 215 +1875 <-> 729, 930, 1728 +1876 <-> 1622, 1903 +1877 <-> 73, 1182 +1878 <-> 1970 +1879 <-> 1136, 1912, 1958, 1989 +1880 <-> 864, 1708 +1881 <-> 475, 1042 +1882 <-> 249, 1708, 1862 +1883 <-> 1303 +1884 <-> 31 +1885 <-> 680, 1231 +1886 <-> 40, 1631 +1887 <-> 462, 1341, 1724 +1888 <-> 1331 +1889 <-> 1470, 1760 +1890 <-> 161, 203 +1891 <-> 424, 1683 +1892 <-> 1892 +1893 <-> 254, 1285, 1868 +1894 <-> 13, 172, 1826 +1895 <-> 114, 382, 1081 +1896 <-> 525, 1090 +1897 <-> 606, 803, 980 +1898 <-> 322, 1260 +1899 <-> 348, 550, 749, 1148 +1900 <-> 408, 1900 +1901 <-> 80, 859 +1902 <-> 673, 1583 +1903 <-> 1028, 1876 +1904 <-> 1208 +1905 <-> 1464, 1682 +1906 <-> 1027, 1077 +1907 <-> 1551, 1771 +1908 <-> 408 +1909 <-> 1909 +1910 <-> 359, 812 +1911 <-> 20, 587, 1340, 1429 +1912 <-> 529, 1879 +1913 <-> 1001, 1134, 1588 +1914 <-> 1720 +1915 <-> 502 +1916 <-> 848, 1086, 1314, 1497, 1730 +1917 <-> 1951 +1918 <-> 401 +1919 <-> 273, 1667 +1920 <-> 925, 1276, 1324 +1921 <-> 58, 921 +1922 <-> 48 +1923 <-> 1344 +1924 <-> 1993 +1925 <-> 1865 +1926 <-> 330 +1927 <-> 670, 1192 +1928 <-> 1654 +1929 <-> 907 +1930 <-> 600, 1748 +1931 <-> 1931 +1932 <-> 958, 991 +1933 <-> 983 +1934 <-> 402, 1359 +1935 <-> 294, 682, 784 +1936 <-> 1646, 1742 +1937 <-> 1937, 1971 +1938 <-> 126, 1938 +1939 <-> 1998 +1940 <-> 257, 1871 +1941 <-> 1740 +1942 <-> 780, 937 +1943 <-> 110, 1265 +1944 <-> 820, 837 +1945 <-> 264, 1347 +1946 <-> 378 +1947 <-> 170, 537, 573, 829, 1856 +1948 <-> 1074, 1089 +1949 <-> 1750, 1764 +1950 <-> 478, 689 +1951 <-> 131, 254, 1917 +1952 <-> 208, 1541 +1953 <-> 803 +1954 <-> 547, 904, 955, 1954 +1955 <-> 528 +1956 <-> 1343 +1957 <-> 99, 191, 1693 +1958 <-> 1879 +1959 <-> 1594 +1960 <-> 1016, 1643 +1961 <-> 1094 +1962 <-> 37, 219, 912 +1963 <-> 262 +1964 <-> 989, 1340 +1965 <-> 1056, 1396, 1598 +1966 <-> 1078 +1967 <-> 77 +1968 <-> 365 +1969 <-> 614 +1970 <-> 1878, 1970 +1971 <-> 1937 +1972 <-> 728, 732 +1973 <-> 1789 +1974 <-> 14, 1500 +1975 <-> 1363 +1976 <-> 1821, 1976 +1977 <-> 720, 1035, 1214, 1826 +1978 <-> 1260, 1347, 1639 +1979 <-> 577, 661 +1980 <-> 1409, 1557 +1981 <-> 1409 +1982 <-> 272, 724 +1983 <-> 636 +1984 <-> 148, 771, 1034 +1985 <-> 155 +1986 <-> 216 +1987 <-> 1987 +1988 <-> 553, 584 +1989 <-> 313, 1879 +1990 <-> 990, 1153 +1991 <-> 1597 +1992 <-> 364 +1993 <-> 90, 765, 1924 +1994 <-> 645, 1641 +1995 <-> 558 +1996 <-> 643, 1784 +1997 <-> 362, 1613 +1998 <-> 1939, 1998 +1999 <-> 90, 1212 diff --git a/src/main/resources/2017/day13.txt b/src/main/resources/2017/day13.txt new file mode 100644 index 00000000..a445f9fd --- /dev/null +++ b/src/main/resources/2017/day13.txt @@ -0,0 +1,43 @@ +0: 5 +1: 2 +2: 3 +4: 4 +6: 8 +8: 4 +10: 6 +12: 6 +14: 8 +16: 6 +18: 6 +20: 12 +22: 14 +24: 8 +26: 8 +28: 9 +30: 8 +32: 8 +34: 12 +36: 10 +38: 12 +40: 12 +44: 14 +46: 12 +48: 10 +50: 12 +52: 12 +54: 12 +56: 14 +58: 12 +60: 14 +62: 14 +64: 14 +66: 14 +68: 17 +70: 12 +72: 14 +76: 14 +78: 14 +80: 14 +82: 18 +84: 14 +88: 20 diff --git a/src/main/resources/2017/day14.txt b/src/main/resources/2017/day14.txt new file mode 100644 index 00000000..191abddf --- /dev/null +++ b/src/main/resources/2017/day14.txt @@ -0,0 +1 @@ +hxtvlmkl diff --git a/src/main/resources/2017/day15.txt b/src/main/resources/2017/day15.txt new file mode 100644 index 00000000..ffb6d14e --- /dev/null +++ b/src/main/resources/2017/day15.txt @@ -0,0 +1,2 @@ +Generator A starts with 591 +Generator B starts with 393 diff --git a/src/main/resources/2017/day16.txt b/src/main/resources/2017/day16.txt new file mode 100644 index 00000000..dcbcc4a6 --- /dev/null +++ b/src/main/resources/2017/day16.txt @@ -0,0 +1 @@ +x12/14,s11,x10/4,s7,pb/o,x12/7,s5,x3/10,s10,x6/4,pk/a,x14/8,s2,x10/5,s6,x9/6,s10,pm/b,x3/7,s1,x5/12,po/k,x1/13,pc/g,x9/11,pd/l,x12/7,s5,x11/3,s15,x2/5,pe/j,x10/15,s13,x8/7,pa/k,s5,x2/4,pl/d,x11/15,s1,x12/8,s4,x13/10,pk/j,x14/8,s8,x2/1,s4,x13/7,s7,x10/6,s9,x9/15,pf/p,x5/0,pg/a,s1,x10/11,pm/h,x5/7,s4,x8/13,s14,x11/7,s13,x4/9,s15,x7/2,s5,x10/11,s10,x2/5,s8,x3/14,s6,x13/12,s7,x7/8,s2,x14/4,pc/e,s13,x7/15,s14,x5/10,s15,x13/2,s8,pk/o,x6/10,s15,x13/12,pi/m,x0/1,s9,x13/8,pg/a,x5/0,s11,x13/4,pl/m,x15/8,pc/e,s3,x1/13,s3,x8/14,pp/k,x7/3,s11,x5/13,pb/h,x9/15,s5,pp/i,x11/12,pl/j,s12,ph/n,x4/1,pe/a,x9/10,pp/f,x4/5,pg/j,x10/3,s5,x7/0,s1,x4/8,s9,x1/3,pe/c,x9/10,pj/o,x14/12,s5,x3/6,s15,x0/4,s14,x10/6,s9,x15/2,s12,x8/0,pm/p,s7,x5/6,pa/c,x11/10,s2,x15/6,pg/l,x13/14,pd/j,x7/15,s12,x9/1,pi/m,x8/7,s5,x2/1,pj/o,x4/11,pb/i,s1,x8/3,s4,x11/5,pp/o,x15/13,pm/h,x6/14,s3,x5/11,s2,x14/6,pk/f,s13,x13/10,po/a,x9/15,s6,x0/5,s9,x2/10,pp/e,x0/14,pi/b,x13/7,s5,x14/0,s3,x5/3,s12,x7/14,pf/g,x8/5,pc/o,x11/6,s14,x3/13,pp/j,x12/7,s1,x9/11,pf/l,x4/12,s13,x2/6,s5,x1/8,pj/o,x10/2,s11,x7/11,pc/m,x13/10,s9,x0/9,pe/l,x8/12,s3,x11/9,s2,x0/12,pn/a,x7/6,pi/j,s7,x2/12,pl/e,x14/7,s3,x9/5,s11,x4/1,pc/k,x15/8,s14,x6/1,pf/h,x3/4,s12,x14/2,pl/c,x0/10,pj/p,x15/8,s1,x2/14,s10,x13/9,s3,x12/1,pe/g,x8/7,pd/n,x2/3,pc/i,x9/13,po/m,x12/15,ph/c,x0/1,pl/e,x7/11,po/j,x6/14,s5,x10/7,s12,x9/4,pm/e,x2/0,s4,x8/9,pa/l,s9,x3/6,s12,x14/11,s12,x13/9,s13,x14/3,s1,pc/o,x7/1,s1,x2/11,s14,x12/5,s11,x3/9,pp/a,x7/14,pi/l,x2/4,pb/d,x15/3,pc/e,x2/9,s5,x13/12,s4,x6/1,s7,x2/15,pj/k,x8/6,s15,x5/0,s4,x7/11,s12,x8/1,pf/d,x6/2,pl/b,x10/9,s10,x3/7,pd/f,x14/8,pa/b,x1/11,pj/h,x2/6,s14,x7/0,pn/a,x4/8,s2,ph/l,x11/0,pg/i,x9/15,pb/n,x12/7,s10,x9/6,pd/f,x15/2,s14,x14/10,s9,x13/0,po/l,x6/11,s14,x2/5,s11,x12/0,pj/b,s8,x4/6,s7,x1/7,s1,x11/8,s11,x1/15,pk/i,x9/5,pc/l,s7,x0/11,pp/a,s1,x8/9,pl/n,x0/11,s2,x10/13,s11,x0/6,pg/f,x1/7,pp/a,x8/3,s15,x0/11,s8,x15/3,s2,x0/8,pl/g,x12/9,s8,x8/5,s1,x2/9,s1,x6/8,s5,x12/11,pp/e,s6,x1/5,s8,x2/10,po/k,x3/11,s13,x4/6,pe/l,x14/5,s12,x8/10,s11,x5/4,pf/b,x10/14,po/j,s7,x9/7,s2,x15/6,s14,x14/1,pk/n,x13/9,pm/f,x4/14,s7,x13/9,pp/n,x11/14,pl/o,x4/2,s3,x11/13,s5,x8/6,s5,x9/4,s2,x1/7,pb/d,x2/4,pe/h,x0/3,po/g,x13/11,pl/c,s6,x3/15,pj/o,s15,x9/2,s5,x6/0,s1,x14/4,s6,x7/15,s7,x3/1,s6,x14/12,s3,x9/11,s8,x15/8,pd/f,x0/10,pm/j,x3/1,pf/a,x0/7,po/n,x15/11,pm/j,x7/13,s13,x1/3,s9,x2/7,s10,x1/13,s14,x11/14,s5,x6/2,po/d,x14/11,s1,x5/3,s2,x8/11,pk/b,s3,x14/12,pe/g,x10/15,s2,x14/6,s7,x3/15,s12,x4/7,s13,x1/2,s6,x11/14,s14,x7/9,s7,x1/13,pj/n,x7/4,s7,x10/0,s2,x15/11,pp/k,x9/6,pm/n,x11/5,pp/i,x13/1,s3,x15/11,pd/n,x2/0,pc/b,x11/5,pj/n,x3/14,pk/c,x0/1,pn/i,x2/7,ph/l,x12/8,pk/i,x11/15,s8,x4/13,s10,x11/3,s12,x2/6,pl/c,s9,pp/n,x14/7,s8,x11/9,pj/i,x7/12,s9,x8/9,pe/h,s7,x13/5,pm/p,x10/9,s13,x8/0,s4,x10/12,s7,x11/6,s4,pl/c,x14/4,pd/n,s7,x6/1,s7,x13/9,pp/f,x8/2,s2,x4/6,s11,x15/9,pg/e,x7/2,pn/f,x10/8,s10,ph/j,x14/7,s9,pk/i,x13/0,pb/g,x2/6,s9,x12/5,pc/a,x6/2,s4,pe/k,x5/12,s4,x0/10,pp/a,x15/4,s15,x11/14,pf/e,x8/6,s2,x1/3,pn/o,s10,x8/9,s12,x11/14,pk/a,x13/7,ph/b,x9/11,s5,x15/4,s4,x8/1,pg/p,x12/15,pn/c,x3/13,s15,x2/8,po/f,x15/9,s3,x3/12,s10,x13/6,pg/b,x1/3,s5,x5/10,s14,x12/7,s6,x1/4,s1,x10/8,s1,x2/15,s13,x7/14,pj/f,x3/13,s3,x2/14,pp/a,x9/4,pd/h,x15/5,s13,x3/6,pj/m,x10/14,s1,x4/6,s8,x5/11,po/h,x9/12,pc/n,x5/10,s10,pi/g,x7/8,pa/f,x9/13,s5,pp/k,x2/5,pc/d,x14/10,pg/k,x4/3,s15,x15/9,pf/n,x14/7,pi/b,x15/5,pm/f,x4/7,s14,x8/6,s3,pc/a,x11/2,s11,x12/5,pi/e,x6/11,s13,x9/12,pc/l,x0/10,s8,x2/5,s2,x15/11,pe/n,x14/2,pp/o,s12,x6/11,s4,x10/0,s6,x14/3,s5,pb/d,x9/8,ph/m,s10,x14/1,pl/f,x5/10,pc/p,x15/6,pk/b,x3/2,ph/e,x6/0,pm/l,x3/15,s8,x0/4,pd/c,x12/3,s5,x1/5,pa/f,x13/6,s10,x4/3,po/c,x7/13,s7,x14/2,s15,x3/6,pi/g,x1/2,s11,x6/15,s12,x9/1,s2,x2/12,s4,x7/6,s13,x13/9,s1,x6/10,pn/k,x3/1,pf/b,s12,x14/7,s10,x2/5,pp/l,x13/12,po/g,x9/5,pl/c,s15,x4/1,s9,x15/14,s13,x4/3,s6,pj/b,x10/9,s8,x8/5,s15,x15/13,s12,x2/4,pd/p,x9/11,s3,x13/7,s9,x11/10,s5,x2/6,s14,x8/12,ph/b,s4,x9/10,s4,x12/13,pe/a,x3/10,pb/m,x12/6,pk/o,x5/4,pb/h,x12/7,s9,x11/10,s5,x13/14,pe/i,x0/6,ph/k,x4/8,pj/c,s5,x7/11,pe/m,x14/15,s15,x2/1,ph/d,s13,x10/13,s3,x14/2,s3,x9/10,pj/o,x2/5,s6,x0/10,s8,x2/9,s9,x6/12,pl/m,x7/0,pf/c,x2/13,pl/g,x7/3,pf/e,x13/11,s4,x12/14,pn/j,x0/13,pm/a,s13,x9/2,pd/c,x7/3,s1,x6/4,s7,x3/9,s5,x13/7,ph/j,x15/14,pc/b,x8/10,s12,x7/11,s12,x14/9,s15,x15/6,po/p,x12/0,s15,x7/15,s9,x6/5,pf/i,x15/1,pc/e,x11/2,pf/i,s3,x5/0,pc/k,x6/14,pi/m,x11/4,po/a,x10/3,s15,x6/7,pg/c,x4/13,pe/i,x5/11,s12,x1/15,s13,x11/6,pk/l,x3/14,pm/e,x2/5,s13,x10/9,s3,x4/0,pa/h,x13/3,s5,x0/4,s7,x5/3,s5,x11/12,s6,x2/13,pc/n,x7/5,pg/p,x3/6,pc/j,x12/15,pa/d,x11/5,s9,x9/7,ph/j,x10/14,s7,x15/13,s15,x10/2,pc/e,x14/4,s1,x13/1,s9,x3/10,pk/n,x1/8,s15,x14/10,s2,x3/13,pl/c,x11/15,s13,x1/7,pa/m,x6/2,pf/o,x10/0,s10,x7/6,pk/c,x0/11,s12,x5/13,s12,x1/2,pf/p,x9/14,s12,x13/2,s12,x14/3,pb/a,x0/11,ph/g,x12/4,pj/k,x3/7,s6,x4/0,pn/h,s7,x6/10,pg/p,x12/9,ph/e,x13/4,pj/c,x14/15,pp/e,s9,x1/12,pf/l,x15/11,s8,x7/6,pp/c,x10/12,pd/o,x4/0,pf/b,s1,x13/2,pg/l,x15/6,pf/h,x3/8,pb/d,x11/15,s11,x3/12,s13,x9/11,pc/m,x3/4,ph/i,s12,x5/14,s8,x15/11,s3,x14/9,s15,x3/15,s9,x11/12,s13,x15/3,s12,x0/8,s12,x15/10,s9,x4/6,s14,x7/2,s4,x8/13,s11,x11/15,s14,x4/10,pk/n,s14,x2/6,s8,pl/p,s11,pc/i,x12/7,s1,x11/9,s5,x10/1,pj/f,x0/3,pd/m,s4,x7/13,pa/g,x12/5,s9,pe/n,x15/0,pg/d,x2/12,pf/p,x5/15,s7,x8/11,pj/k,x2/6,s5,x8/10,pa/l,x6/12,s14,x9/1,pp/g,x0/4,s4,x10/14,po/i,s2,x11/5,pd/h,x4/14,pg/a,x9/5,s14,x14/10,s9,x0/15,s11,x13/9,s7,x0/11,pf/l,x4/12,s3,x5/0,ph/a,x15/7,s11,x0/5,s11,x14/15,s10,x12/11,s10,x14/10,s15,x5/4,s5,x8/10,s14,x9/0,s4,x11/1,s2,x9/14,pe/c,x6/13,ph/a,x7/9,pi/l,x8/2,s9,x15/3,pn/h,x9/13,s9,x0/4,s6,x11/2,s7,x15/14,pm/l,s2,x0/7,pb/e,x15/4,pc/k,s1,x11/5,pg/e,x7/14,ph/f,x6/11,pd/a,x13/4,s11,x14/2,pn/l,x0/8,pe/g,x5/1,s5,x9/8,pd/j,x15/10,s10,x1/4,po/c,x6/2,pj/p,x5/7,s8,x9/10,pd/h,x5/11,s4,x13/7,pj/m,x6/1,pp/h,s3,x8/12,s14,pl/g,x10/14,pd/c,x0/8,pp/g,x10/7,s4,x1/3,s2,x6/0,pd/a,s1,x3/7,s12,x9/14,s15,x2/10,pp/k,s7,x11/1,s10,x10/15,pj/c,x11/14,pb/g,s8,x0/8,pj/f,x7/11,pp/d,s13,x3/10,s13,x1/15,pb/k,x3/6,pg/e,x7/12,s6,x6/13,s11,x9/8,pj/p,x3/10,s6,x13/11,s11,x14/7,s12,x3/13,s9,x7/11,s2,pd/a,x4/0,s5,x2/14,po/n,x15/10,s14,x9/4,pb/p,x12/5,s10,x13/4,s15,x14/8,s7,x1/9,s3,x15/5,pf/j,x7/14,s11,x5/1,s6,x8/15,po/c,x6/5,s8,x1/12,s7,x2/9,s9,x4/8,pa/f,s4,pe/b,x5/1,s9,x15/7,s11,x5/2,pm/i,s3,x9/7,s10,x2/10,pg/h,x11/5,pf/i,x14/1,pd/k,s4,x8/11,s10,x7/12,s6,x4/2,pp/j,x6/8,pd/l,x4/13,s4,x1/12,pf/o,x6/0,s4,x4/14,pm/l,x2/10,s11,x4/11,pa/i,x7/2,pd/f,x1/10,po/a,x12/0,s2,x9/13,pb/n,x5/10,s4,x6/3,s9,pa/c,x15/7,pl/k,s9,x12/1,s5,po/a,x5/7,ph/f,x6/14,s1,x11/13,s1,x0/3,s9,x2/9,pc/e,s14,x15/11,s2,x5/10,pp/i,s7,x7/13,pe/h,x4/6,pc/l,s2,x1/0,pn/b,s12,x10/12,po/a,s7,x13/5,s5,x12/6,pp/f,x2/8,s12,x4/9,s2,x11/8,s5,x13/2,pd/c,x14/4,pa/e,x8/1,s12,po/p,s13,x7/6,pb/l,x0/2,pf/o,x4/3,s4,x8/0,ph/e,s15,x5/2,po/c,x7/1,s7,x2/9,pl/h,x11/5,s8,x6/4,s6,x15/0,s5,x11/13,s2,x14/0,pm/g,x13/2,pa/p,x11/0,s6,x5/9,s14,x3/1,s8,x8/14,s1,x10/13,pl/i,x12/6,s12,x11/13,pd/k,s1,x15/8,s2,x13/5,s7,pm/i,x1/14,s7,x3/9,pe/b,x0/5,pg/n,x4/6,s13,x7/12,pj/l,x3/13,s1,x11/2,s2,x15/7,s12,x4/11,s6,x3/7,pn/c,x0/1,pa/e,x10/13,s10,x15/11,pd/k,x4/13,s11,x0/15,s4,x3/12,s7,x15/1,s12,x8/7,s12,x13/14,s2,x5/3,pl/i,s9,x14/6,pg/j,x0/1,s2,x5/14,s15,x15/9,s15,x0/2,s1,x11/8,s4,x5/3,pc/b,x12/1,s5,x2/5,s6,pj/m,x3/7,pp/c,x13/4,s9,x5/3,s14,x4/7,s14,x0/12,s1,pm/l,x4/3,s4,x12/15,s2,x6/5,s12,x10/14,s11,x1/7,pb/o,x6/4,pa/d,x8/14,s14,x11/3,s13,x13/5,pk/j,x8/15,pp/h,x9/1,s5,x12/0,s6,x3/11,po/c,x2/10,s2,x3/13,pf/d,x11/4,s14,x8/15,pl/h,x4/10,s9,x13/9,s10,x1/11,pk/m,x15/12,pj/l,x1/10,pa/o,x4/13,s3,x11/6,s14,x8/7,pf/m,x14/1,pk/d,x10/8,pj/h,x13/7,pf/b,x8/6,pp/e,x11/3,s5,x2/12,s14,x4/8,s13,x11/7,s5,x0/2,pl/b,s8,x14/4,s2,x8/12,s2,x1/13,pp/g,x14/10,pk/n,x13/0,s3,x8/5,pc/e,x7/15,s15,pb/a,s5,x10/3,po/j,x1/11,s15,x13/2,s15,x12/7,pg/m,x15/0,s6,po/p,x8/2,s13,x3/6,s2,x11/4,pi/l,x15/2,s10,pf/p,s3,x7/4,s8,x6/0,pk/e,x15/4,pl/i,x2/3,s6,x11/1,s9,x12/5,s7,x4/10,pd/p,x2/13,pj/n,x1/3,s2,x6/14,pk/l,s13,x9/5,s2,x6/3,s12,x10/15,s11,x5/2,pf/g,x7/1,s11,x13/8,pp/o,x3/6,s3,x14/2,s4,x7/9,s5,x0/5,s1,x6/12,pa/l,x4/3,pf/b,s13,x9/15,pp/n,x8/6,s14,x15/3,pb/c,x2/7,pi/k,x15/4,pf/o,s11,x7/2,ph/g,s6,x14/15,pd/m,x8/4,s15,x0/1,pb/i,x13/4,pl/n,x5/9,s10,x2/1,s10,x15/13,s8,x9/14,pm/a,x15/0,s5,x4/9,s2,x14/11,ph/c,x5/10,s12,x4/0,pa/k,x15/7,s15,x3/0,s6,x9/13,pg/e,x7/12,s2,x3/13,pc/m,x4/2,s11,pg/d,x8/11,s4,x5/13,s15,x1/7,s5,x3/15,s9,x1/10,s12,pk/j,x6/5,pi/e,x13/12,s7,x14/4,pf/n,x7/0,pi/p,x4/11,pe/j,x2/0,s9,x5/14,pg/o,x4/15,pk/m,x9/12,pn/e,x14/5,s2,x11/2,s6,x1/5,s1,x4/2,s1,x11/8,s3,x10/7,s1,x13/6,s13,x3/12,ph/o,x6/7,s11,x5/2,pj/l,x9/3,ph/f,s5,x7/0,s14,x11/9,pk/l,x4/2,s14,x10/0,s3,x11/13,s13,x7/1,ph/p,x3/8,s1,x14/7,s8,x12/2,s10,pe/d,x8/13,s5,x5/12,pc/p,x1/0,s12,x12/14,s13,x9/11,s10,x8/13,s7,x3/2,s10,pk/h,x7/9,s14,po/f,x0/5,pi/m,s6,x6/7,pd/h,x9/2,s10,x11/6,pf/b,x10/14,s3,x9/8,pd/j,s15,x12/6,s1,x13/8,s15,x12/15,s2,x4/9,pa/l,x14/1,s1,x4/7,s5,x11/5,s1,x2/6,s7,x4/0,ph/n,x6/15,s15,x10/14,s2,x1/6,pf/j,x12/5,s12,pc/a,x4/10,pb/m,x2/7,s11,x14/6,pg/i,x11/0,pm/h,x7/6,s10,pe/b,s9,pd/f,x15/3,pk/n,x14/8,s5,x6/15,pd/c,x10/9,pp/i,x0/2,pg/j,x4/8,s7,x1/10,pf/h,x15/9,s8,x12/13,pg/a,x10/3,s5,x9/2,s11,pm/l,x8/1,pk/n,x5/10,pp/i,x2/15,ph/g,x6/4,pf/m,s1,x8/2,po/d,x7/10,pi/k,x1/14,s5,x15/4,s11,x1/11,pg/f,x5/6,s3,x7/1,po/l,x10/6,s13,x9/2,s4,x5/14,pd/j,x15/6,pp/i,x12/0,s15,x9/11,ph/a,x7/0,s6,x15/5,pd/p,x12/13,s1,x2/1,s10,x4/3,pa/k,x9/13,s11,x11/14,s3,x5/12,pm/i,s13,x13/7,s2,x2/3,pd/e,x5/14,s10,x4/13,s5,x6/5,s2,pp/b,x2/3,s8,x9/15,pn/c,x10/12,pf/p,s3,x1/8,pg/i,x5/0,s12,x10/3,s11,x4/11,s11,x5/12,s8,x7/15,s13,x5/12,s6,x15/14,s3,x4/3,pf/h,x0/12,s6,x13/8,s8,x6/0,pk/i,x8/10,s14,x7/11,s11,x3/6,s5,x10/15,pf/b,x7/3,s13,x14/8,s1,x12/6,pd/i,x3/11,pk/h,x0/7,s3,pc/l,x5/13,s10,x11/15,s12,x5/10,pg/k,x12/9,pe/d,x1/0,s11,x8/3,pb/n,x14/0,pc/h,x4/2,po/p,x1/8,s11,x5/0,s10,x7/2,s11,x12/3,s9,x5/14,pk/i,s6,x8/4,s7,x0/7,s10,x9/14,pg/h,x6/3,s1,x12/5,s4,x3/2,s13,x0/5,s14,x4/2,pd/a,x10/13,s6,x4/2,pb/l,x11/1,pd/g,x5/4,s8,x9/14,s3,x6/15,s8,x10/5,pj/k,s11,x14/0,s4,x9/3,s7,x4/15,s5,x10/11,pm/o,x4/7,pk/h,x14/3,pi/g,x7/4,pk/b,s15,x8/12,s3,x7/13,pd/p,x0/11,s11,x9/15,s1,x1/2,pe/k,x10/15,s10,x2/3,s2,x1/5,s12,x14/4,s3,x11/12,pd/l,x8/14,s1,x11/15,pn/k,x2/14,s12,ph/p,s10,x15/3,s6,x1/10,s11,x15/11,s15,x10/0,po/i,s3,x15/2,pd/j,x11/12,s11,x10/8,ph/k,x14/15,pe/l,x13/11,pa/f,x15/12,s8,x5/6,pc/g,x2/15,pp/o,x3/12,pm/d,x2/11,s9,x15/5,pl/h,s5,x1/2,s13,x7/9,s14,x5/12,s3,pa/k,x1/2,s5,x11/12,s7,x8/9,s13,x12/1,s4,x2/7,s13,x5/9,s11,ph/o,x3/14,s15,x10/7,s5,x11/4,s6,x0/6,s10,x15/14,pc/m,x11/3,s6,x4/1,pf/d,s4,x9/10,s13,x4/6,s7,x15/7,pj/b,x4/11,pf/a,x7/2,pi/m,x12/14,pk/d,x2/5,s15,x8/13,pm/o,x14/9,s11,pn/k,x2/4,s6,x14/9,pd/f,x1/10,pi/m,x13/15,s5,x5/8,pa/g,x11/2,s13,x5/14,s5,x3/12,s2,x9/10,s13,x3/7,s8,x9/1,s3,pc/p,x13/8,s10,x12/9,po/e,x11/4,pc/i,x3/1,s14,x0/6,pe/d,x15/11,pa/k,x2/7,s8,x0/6,s11,x10/8,pj/c,x4/15,ph/b,x13/10,s2,x6/2,pf/p,x9/10,pe/o,x3/15,pf/l,s15,x14/11,s14,x3/12,s4,x10/6,s10,x14/4,s1,x5/6,s6,pp/b,x2/3,pj/d,s14,x10/12,pi/a,x8/5,s4,x10/12,s8,x0/11,s2,x8/7,s6,x15/9,s10,x6/5,pn/m,x12/0,pj/i,x8/10,pk/b,x9/5,ph/a,x8/4,s5,x7/1,s2,x6/13,s14,x10/0,s7,x13/14,s3,x6/0,pi/m,s8,x9/14,s1,x13/0,pc/p,x9/14,s5,x2/4,s1,x8/6,s12,x10/5,s6,x1/6,s7,x9/14,s12,x1/7,ph/k,x6/8,pp/l,x15/0,s4,x5/3,pi/j,x6/2,s4,x11/10,pp/g,x8/6,s14,x13/9,pe/f,s7,x6/14,pp/b,x15/7,s8,x4/8,s4,x15/11,pl/o,x1/5,s1,x8/11,s3,x1/5,pm/a,s5,x15/14,s9,x12/7,s8,po/i,s5,x14/8,s10,x10/11,pb/d,x6/13,s2,x3/12,s9,x4/9,s13,x12/13,s5,x7/10,pn/a,x12/1,pi/j,x0/15,s1,x8/11,pl/a,x9/7,s14,x13/11,s14,x4/5,s11,x14/11,pn/g,s5,x8/6,pl/d,x11/4,pg/c,x15/8,pi/n,x2/4,s10,x1/3,s13,pa/k,x4/13,pm/c,x10/6,pe/j,x9/12,s8,x5/2,pn/o,s13,x7/13,s10,pa/p,x5/10,pg/e,x9/2,pn/p,x11/5,s10,x0/4,pb/a,x1/5,pl/i,x11/14,s5,x6/8,s4,x14/2,pb/o,x7/9,s9,x12/5,s15,pe/c,s7,x0/6,s3,x5/4,s14,pj/m,x13/12,pi/p,x10/7,s7,x9/15,s5,x1/4,s6,x12/7,pf/l,x0/10,s15,x9/6,s14,x7/10,pk/h,x13/12,s15,x6/9,s9,x7/8,s10,x3/9,s13,x13/7,s1,x14/1,pl/p,x10/15,pj/o,x12/6,pm/e,x1/15,pl/n,x7/9,s9,x12/14,pj/f,x3/9,s6,pc/a,x10/7,pi/h,s13,x11/4,s10,x3/7,pb/k,x9/15,s1,x1/14,s9,x11/5,s2,x9/15,pa/g,x14/8,s9,x6/1,pe/k,x5/4,pm/h,s12,x8/1,pc/e,x3/5,pk/i,s15,x2/6,pm/l,x10/7,pe/o,x1/14,s15,x8/11,s2,x14/1,pj/b,x10/2,pa/o,x14/5,s14,x11/6,s3,x1/12,s1,x9/6,s7,x0/5,pe/c,x10/11,pg/p,x1/9,s11,x7/10,s13,x15/5,s15,x13/8,ph/a,s15,x7/5,pc/o,x9/4,s12,x1/3,s8,x15/9,s2,x8/6,pk/j,x2/7,pm/b,s2,x15/9,pp/j,x8/11,s2,x7/13,pb/f,x5/9,pj/a,x15/8,s11,x14/6,pg/p,x9/15,s10,x13/10,pb/d,x9/0,pa/k,x15/13,s14,x6/8,s9,x1/2,s10,x14/4,s9,x8/13,s15,x4/15,s3,x1/14,pg/p,x8/3,s7,x1/0,s2,x9/6,s11,x3/2,s5,x0/4,pd/b,s10,pe/h,x3/14,s2,x15/9,po/c,x0/10,s11,x9/2,s1,pg/d,x6/1,s5,x5/10,ph/f,x15/3,s7,x10/2,s11,x3/15,pd/o,x14/1,pi/j,x6/11,s13,x14/1,s7,pg/p,s9,x8/13,s1,x12/7,s2,x14/9,pf/k,x2/7,s3,x6/1,pe/m,x12/4,s10,x5/0,s7,x14/4,pk/l,x1/8,s7,x12/13,pn/p,x0/15,s10,x5/7,s2,x11/14,pk/f,x13/6,po/a,x1/11,s3,x13/5,s9,x3/7,s10,x6/12,s1,x3/14,s2,x1/7,s4,x3/12,pl/b,x4/8,s11,x12/15,s5,x8/4,s14,x10/1,pi/d,x6/13,pb/g,s11,x10/8,ph/j,x7/15,s7,x2/13,s9,x8/5,s5,x7/14,s14,x3/11,s6,x8/4,pe/p,x6/13,pl/o,x0/9,s6,x2/7,s6,x0/12,s4,pe/p,x15/11,s10,pa/l,x5/8,pc/h,s11,pf/o,x12/6,ph/g,x11/4,s8,x3/10,pb/a,x7/4,pg/m,x5/2,s1,x7/9,pk/o,x8/1,pn/m,x3/11,pg/c,x9/7,pp/f,x2/8,pg/l,x4/5,pk/b,x0/2,s12,x7/13,s2,pj/e,x0/6,s3,x8/5,s9,x12/1,s14,x7/8,s6,x15/6,s6,x7/8,pn/c,x15/14,s2,x0/11,s8,x4/9,s5,x12/10,pp/i,x7/15,pn/o,x6/4,s1,x15/1,pk/h,x6/8,pg/c,x10/14,s1,x5/11,s7,x2/15,pm/b,x13/5,pd/j,s2,x4/7,pf/i,x11/9,s11,x13/7,s5,x9/6,s6,x10/2,pp/j,x9/11,s5,x12/13,pa/g,x7/8,s12,x1/10,s7,x7/12,pb/k,x9/8,pm/e,x15/2,s12,x9/1,pk/b,x11/10,s11,pe/f,x0/1,s12,x14/13,pi/g,x2/5,s3,x13/9,s2,x5/8,s4,x3/0,s1,x4/14,s1,x15/10,s13,x8/6,s4,x7/5,s7,x15/6,s8,x7/1,s13,x6/13,s5,x0/5,pf/h,x9/8,pn/i,s14,x4/5,po/g,x2/14,s15,x3/5,s2,pk/a,x12/13,pf/b,x1/10,pc/j,x9/2,s15,x15/4,s5,pf/o,x9/1,s6,x4/2,s7,x7/15,s7,x12/0,pl/d,s10,x10/4,s11,x3/11,pa/c,x14/15,pe/g,x2/6,pn/h,x12/1,pg/f,x2/10,s14,pc/k,x11/4,pa/j,s7,x5/10,s11,x4/12,s1,x8/14,s2,x10/6,pk/m,x0/7,s5,x11/14,s8,x15/6,s2,x1/3,pe/a,x10/0,s3,x3/13,s15,x4/9,s6,x13/7,pm/l,x5/10,pg/k,x14/9,s10,x13/10,s1,x6/7,s5,x12/14,s14,x0/13,s1,x7/14,s3,x1/11,s15,x13/2,s1,x10/12,pi/n,x0/15,pl/c,x6/11,s1,x7/4,pd/i,x2/13,pa/e,x11/10,s5,x2/6,s9,x1/3,pg/f,x15/0,s14,x1/12,pa/h,x9/8,pg/c,x5/1,pd/j,x13/10,s4,x11/14,pm/h,x13/7,s15,x0/15,pj/e,x7/11,s1,x9/3,s13,x15/6,s9,x2/13,pk/c,x10/6,pm/a,x5/1,s13,pd/o,s11,x7/9,s11,pa/c,x4/13,s4,x1/9,pl/d,x0/3,pk/p,x2/11,s10,x15/9,s4,x1/8,pl/m,x9/2,s5,x13/3,s2,x12/2,pe/c,x8/14,po/k,x11/4,s11,x1/12,s10,x15/4,pn/m,x3/8,po/d,x13/5,s9,x8/7,pf/k,s15,x6/13,s11,x4/0,pp/b,s3,x11/10,pk/g,x5/6,s7,x13/0,pc/p,x12/14,pj/e,x3/11,s12,x0/7,s5,x10/8,s11,x14/11,s10,x5/7,s12,x12/13,pi/h,x14/1,s2,x12/2,pk/g,x3/13,s5,pf/d,x9/7,pc/g,x11/0,s9,x8/12,s1,x15/9,s10,x6/7,s4,x8/4,pd/h,x6/7,s7,x2/3,s5,x7/11,s4,x9/2,pi/o,x4/3,s4,x8/2,pe/f,x7/4,s4,x9/8,pi/b,x14/11,ph/o,x2/13,s1,x3/12,pj/f,s14,pa/d,x13/10,pi/h,x6/15,pa/e,x0/2,s8,x10/6,s10,po/m,x2/0,pk/h,x9/15,pf/a,x13/4,s15,x2/9,s9,x6/3,s4,x0/4,pg/j,x10/1,pn/o,s9,x15/9,pl/k,x14/11,s3,pd/g,x10/4,s10,x7/3,s4,x15/9,s12,x12/4,s5,x7/0,pa/i,x10/3,pf/p,x2/13,ph/o,x3/9,s4,x11/0,s10,x2/10,pp/i,s11,x9/6,s7,x5/3,pg/o,x11/12,s15,x1/4,s12,ph/e,x15/8,s13,x3/11,s10,x10/13,s12,x0/1,s13,pk/c,x15/9,pl/m,x0/1,s2,x7/12,s1,x11/2,ph/e,x15/0,s7,x13/6,s15,x0/10,pj/f,x8/2,s8,x0/5,s8,pk/a,x11/9,pp/o,x5/7,s13,x1/11,s1,x0/9,pl/m,x3/15,s15,x2/11,s4,x13/1,pc/j,x2/4,pg/m,x1/9,pi/j,x4/2,pm/f,x10/8,pl/p,x7/5,s3,x15/14,pe/c,s4,x8/10,pp/j,x3/1,s6,x10/13,s7,x12/1,s6,x0/9,s1,x4/7,pb/i,x12/5,s10,pd/c,x11/9,s12,x8/4,s3,x13/9,po/b,s5,x12/1,pe/k,x13/3,s1,x7/2,s14,x12/14,s11,x11/7,s11,x3/10,pa/m,x13/11,s2,x9/10,pd/k,x8/7,ph/b,s11,x6/12,pg/k,x10/14,s10,pc/d,x8/1,s8,x10/2,s8,x6/12,s6,x2/0,s15,x5/11,pb/a,s12,pn/i,x0/6,s14,x3/4,s7,x1/6,pl/m,x5/9,s5,x7/10,s13,x15/8,pg/k,x7/11,s14,x9/1,s12,x5/12,s3,x7/10,pc/a,x9/15,s7,x3/5,s13,x1/13,pf/m,x9/10,pa/e,x11/5,ph/l,x3/9,s12,x13/10,s8,x2/7,s11,pi/g,x14/5,pp/m,x1/7,s15,x9/11,pj/k,x0/5,pl/d,x13/2,s9,x14/8,s7,x15/3,s8,x10/11,s6,x12/1,pp/c,x10/6,ph/a,x14/9,pf/m,x15/8,s14,x7/4,pa/c,s9,x12/2,s14,x14/7,s14,x5/4,s1,pi/m,s15,x9/0,pd/l,x1/5,s14,pf/o,x4/14,s9,x11/5,s1,x1/6,pg/m,x5/14,pl/j,x9/10,pa/i,x8/7,s1,x4/2,s7,pg/f,x6/1,s14,x14/5,s5,x0/12,s10,x2/5,po/e,x12/8,pn/a,s15,x13/11,pp/k,x3/14,s14,x9/11,s14,x3/4,s12,x10/12,s1,x2/3,s11,x14/5,pm/d,x10/1,s15,x13/15,pl/f,x14/6,s4,x10/8,pj/b,x2/7,pm/f,x14/6,pp/g,x9/10,pi/n,x11/1,s9,x2/12,pb/c,x7/11,pf/h,x3/4,s11,x10/11,pa/o,x15/7,s6,x1/5,ph/i,x11/4,s8,x7/3,pe/p,x0/2,s5,x13/11,s9,x7/15,s10,x14/6,pd/i,x10/2,s2,pe/n,s4,x9/5,pk/m,s9,x7/3,pf/i,x10/8,pd/b,x12/7,s2,x4/3,s9,x14/2,ph/m,x0/9,s1,x1/5,s7,x7/10,s6,x9/2,s2,x6/1,s4,x4/9,s1,x3/7,pf/i,x14/12,s4,x11/13,pn/k,x15/4,po/a,x9/3,s15,x11/5,pi/d,x2/13,pn/b,x7/11,s14,x10/5,po/p,s3,pb/a,s7,x12/14,s8,x9/13,pc/k,x0/1,s12,x5/8,s11,x2/13,pf/l,x14/15,pc/m,x7/0,pd/e,x13/2,pc/h,x7/9,s3,x6/0,pp/a,x5/8,pd/h,x9/0,s11,x15/4,s4,x13/5,s14,x6/1,s11,x3/13,pb/g,s14,x11/8,pa/l,x15/14,s4,x5/2,pn/m,x7/15,s8,x11/6,pf/o,x12/8,pi/b,x13/1,pp/m,x5/11,pi/n,x3/12,s1,x4/14,s7,pk/m,x0/1,s9,x10/6,pl/b,s5,x5/12,s11,x13/6,s15,x10/4,s9,x5/7,s10,x12/4,s3,x6/10,s8,x7/13,s13,x11/0,s8,x13/14,s2,x15/9,s11,x1/13,s9,x10/7,pm/f,x15/11,s12,x14/13,pj/o,s13,x12/6,pn/l,s10,x13/9,ph/d,x3/1,pn/p,x0/14,s9,x8/13,s8,ph/a,x2/4,s7,x0/5,s11,x3/10,pe/k,x8/1,s14,x7/3,pb/a,x14/9,pn/g,x6/3,s1,x1/14,s14,x15/0,s6,x9/7,s3,x2/5,s12,x1/11,s15,pm/b,x14/4,s9,pi/p,s2,x15/3,s1,x11/1,s13,x7/6,s6,x5/2,s7,x10/13,s10,x0/15,pa/d,x10/11,ph/n,x12/14,s12,x15/0,s10,x3/8,s5,pl/c,x12/11,s12,pd/f,x9/14,ph/m,s11,x5/2,pk/c,x4/8,s14,x5/6,s13,x3/9,pa/h,x15/11,s14,x3/6,s11,x8/2,s13,x14/7,pe/p,x11/5,pc/d,x1/2,s10,x13/6,pe/g,x4/8,pm/l,s3,x1/12,pb/f,x9/7,s15,x1/4,s11,x14/0,s5,x4/3,s3,x5/0,s15,x14/12,s5,x8/7,s10,x4/14,s13,x8/5,pn/a,x11/15,s11,x0/6,s10,x7/13,po/p,x4/10,s10,x13/9,s9,x5/3,s1,x11/15,s11,x0/3,s14,x8/12,pg/c,x5/11,s11,x15/6,pa/i,x3/8,s12,x9/15,pg/l,x0/6,pe/f,x4/5,s5,x14/9,pg/l,x1/4,pc/o,s14,x2/6,s6,x14/8,pm/k,x4/6,s11,x7/12,pf/c,x14/2,s12,x3/11,pb/l,x13/5,s5,x8/6,s11,x0/5,s15,x1/13,s7,x15/11,s14,x10/13,s5,x5/2,s10,x0/7,pn/p,x5/10,s9,x12/11,s3,x0/4,pg/f,x14/7,pk/d,x0/10,s9,pc/j,x7/11,s5,x15/9,s5,x12/14,s10,x0/13,s6,x1/11,po/n,x4/8,s15,x7/12,s6,x5/0,pi/c,x15/1,po/m,x2/0,s2,x3/7,s12,x9/13,s14,x6/15,s10,x8/10,pl/c,x1/6,pm/p,x9/5,po/f,x11/12,pb/n,x4/9,pc/l,x13/1,pa/g,x3/11,s13,x4/14,s14,x3/10,s3,x2/7,s10,x15/3,pl/e,x0/11,s5,x1/6,s12,x9/14,pm/o,x2/7,pk/f,s2,x14/0,s7,x4/6,pc/j,x1/5,s14,x3/0,pd/f,x8/5,pm/p,x1/0,pb/d,x6/14,s4,x2/13,pa/k,x7/11,s5,x10/5,s13,x11/3,s14,x6/4,s10,x13/1,s11,x0/7,s7,x13/8,s6,x3/12,po/d,x14/13,s15,x6/7,pg/b,x12/10,s8,x8/2,s5,x13/10,s4,pm/d,x8/14,po/p,x13/7,s11,x4/6,s15,x5/15,s2,x2/10,s3,x8/1,pe/l,x11/0,pn/f,x8/7,s3,x5/11,s15,pi/j,x1/2,s12,x14/9,s15,x15/11,pm/g,x13/3,s3,x10/15,s7,x6/2,pi/k,s7,x12/1,pd/a,x2/15,s9,x4/6,s7,x10/8,pl/k,s11,x0/6,s3,x4/2,s12,x10/8,pa/f,s7,x11/14,s6,x3/12,ph/i,x1/8,s1,x14/5,pf/n,x0/11,pk/i,x4/5,s9,ph/g,x1/3,pn/e,x12/9,pl/i,s5,x3/11,s15,x4/5,s13,x11/0,s4,x4/12,pj/k,x3/11,pc/f,x2/12,s8,x15/14,s10,x5/7,s8,x2/11,s12,x14/9,s15,x2/4,s8,x0/6,pa/j,x10/2,pb/h,x6/11,pf/l,x10/13,s1,x3/5,po/e,x8/10,pi/p,x6/7,pa/j,x10/9,s14,x11/12,s9,x7/1,s10,x3/13,s15,x12/9,pb/e,x8/7,s5,x1/10,s12,x6/0,s10,x12/7,s15,x14/9,s12,pp/n,x8/4,s11,pm/c,x1/5,s7,x4/12,s10,x5/14,s6,x10/2,s2,x1/9,s12,x5/4,s13,x6/13,s10,x12/5,pd/o,s5,x10/13,pc/p,x4/3,pf/b,x8/14,s13,pj/k,x4/13,pn/i,x11/6,s12,x8/9,s5,x12/7,pg/p,x3/11,s6,x4/2,s7,x10/13,pk/h,x11/9,s10,x4/5,pl/m,x2/3,s5,pp/b,x0/5,s12,x10/4,s8,x1/6,s5,x4/8,s11,x1/10,s13,x9/7,s12,pc/a,x15/3,s14,x4/5,pm/b,x7/1,pn/k,x3/10,pc/b,x15/13,ph/i,x12/6,pm/f,x8/9,pl/n,x7/2,pk/e,x5/3,s10,x4/13,pd/p,x2/12,pk/b,x1/8,s9,x14/10,s5,x4/8,pg/a,x7/3,s7,x13/8,pb/e,x7/1,pl/h,x9/3,s13,x10/11,s5,x1/13,s12,x4/14,pg/a,x1/0,s6,x5/10,s4,x2/4,pl/b,x1/14,pa/c,s10,x10/5,pl/b,x9/1,s5,x6/2,s15,x11/5,pc/k,s1,x1/0,pa/b,x7/2,ph/j,x1/0,s13,x7/13,pc/f,x14/3,pp/n,x4/9,s15,x7/10,s14,x8/13,s13,x9/10,s5,pl/i,x1/12,s6,x9/7,s3,x13/12,ph/j,x5/6,s13,x2/4,s6,x15/8,s4,x2/4,po/k,x1/14,pc/d,x15/2,pb/l,x1/10,s4,x11/2,s8,x13/0,s12,x12/1,po/a,x2/10,s8,x7/12,pf/h,x2/4,s4,x11/15,s4,x8/7,pe/b,x10/11,s10,x13/3,s14,x4/1,s14,x9/3,pl/c,s11,x1/6,s5,x0/2,s14,x1/9,s7,pe/o,x12/6,pj/d,x14/2,pg/o,x4/12,s5,x15/11,s14,x1/9,s13,x13/2,s10,x10/9,s13,x5/2,s8,x14/7,s2,x6/13,pi/b,x3/11,ph/m,s7,x12/10,pd/i,x2/11,pa/f,x7/10,pg/h,x5/13,s4,x10/7,s15,x5/6,pj/c,x3/2,pe/d,x0/7,pp/j,x9/6,s4,x1/7,po/h,x2/6,s4,x7/5,s12,x2/9,pm/g,x7/12,pi/n,s2,pb/p,s13,pn/i,x4/9,pe/h,x8/1,s1,x3/14,s2,x4/5,s15,x8/6,pc/f,x5/12,s14,x0/8,s8,x11/7,s12,pn/l,x14/3,s12,x11/1,pc/g,x0/8,ph/b,x13/5,pk/j,x14/4,pl/f,x3/7,pc/e,x5/12,ph/i,x8/1,s3,x2/3,s11,x7/15,s11,pn/g,x12/14,s11,x2/7,s15,x8/13,pj/h,x3/14,s2,x10/12,pe/l,x2/8,s3,x9/13,pm/h,x14/15,s4,x2/11,s10,x8/4,s13,x12/0,s8,x10/4,s12,x1/2,s8,x0/10,s4,pg/l,x15/1,pj/d,x4/9,s15,x0/7,s8,x15/3,pg/l,x5/6,s12,x12/3,pk/h,x15/6,s9,x11/8,s10,x13/7,pe/a,x8/15,s6,x10/13,s12,x1/5,s3,x14/9,pl/b,x11/8,pa/p,x14/7,s12,x10/9,s2,x4/14,pg/e,x8/3,pl/p,x0/1,s13,x13/11,s3,x7/4,s3,x9/12,pa/c,x5/6,s4,x8/14,pf/e,x2/13,pk/g,x7/4,po/h,x8/10,s1,x5/3,pd/j,x10/14,s4,x4/12,s11,x7/10,s10,pb/g,s13,pp/e,x11/9,pd/b,x8/10,s13,x12/13,s7,x15/14,s15,x12/5,s7,x8/10,s7,x2/6,s10,x14/0,pj/k,x12/10,s14,x3/13,s11,x9/0,pm/i,s9,pc/g,x1/6,s12,x0/8,s13,x12/7,s6,x1/0,pb/e,x13/15,s13,x3/9,s13,x13/14,po/h,x15/2,pa/k,x9/14,s9,x11/6,pg/p,x9/4,s9,x14/1,pl/d,x2/9,pk/p,x0/4,pl/j,x2/3,s13,x14/15,pd/m,x2/13,s13,x4/5,pj/l,x7/9,s6,x10/13,pc/n,x7/12,s3,x9/1,s1,x5/8,s13,x14/11,s2,x13/9,s8,x4/3,s3,x10/12,pp/a,x3/13,s4,x8/7,s10,x9/11,s15,x3/0,pc/m,s5,pf/h,x8/4,s7,pn/m,x0/10,pk/g,x6/5,pb/j,x8/14,pd/c,x7/0,pe/i,s2,x3/4,s14,x2/10,pd/c,x6/0,pl/b,x4/11,pn/g,x6/2,s1,pc/m,s7,x15/4,ph/n,x6/3,pd/p,x7/12,s11,x6/10,s10,x4/11,pf/l,s15,x9/10,pg/o,s7,x8/14,s7,x13/15,s7,x12/2,pp/k,x0/4,pg/n,x2/9,s12,x7/3,pk/f,x13/6,pj/a,x5/7,s12,x14/12,s7,x1/0,pl/e,x9/2,s14,x10/0,s4,x7/11,s8,x14/2,pm/o,s4,x15/12,pc/l,x0/2,s11,x4/14,s15,pa/i,x8/2,s11,x0/3,s8,x13/6,s7,x12/4,pl/k,x3/0,pb/o,x5/12,pe/f,x6/13,s10,x14/10,s11,x15/6,s7,x12/11,pp/b,x2/4,s12,x10/14,s1,x1/15,s15,x5/11,pi/j,x3/6,pe/o,x10/4,ph/f,x6/0,pj/n,x4/2,pi/g,x14/13,pc/p,s1,x2/3,s8,x6/13,pn/f,x9/15,s6,x14/13,pb/h,x2/4,s1,pg/j,x11/0,s10,x15/12,s6,x3/10,s15,x5/2,pn/f,x1/3,s15,x6/12,pj/d,x8/9,s6,x7/14,s5,x11/5,s1,x3/1,pn/c,x11/4,s12,pi/g,x13/6,s1,x9/4,s3,x3/13,s15,x15/2,s7,x12/1,s14,x3/14,pe/d,x0/7,s2,x15/5,pp/m,x2/9,s3,x12/5,s12,x15/6,pf/n,x5/12,s15,x7/2,s4,x1/3,s15,x13/4,s2,x7/8,pk/j,x4/14,s11,x12/0,s15,x1/7,ph/d,x0/2,s4,pi/e,x7/10,s14,x0/1,s1,x5/14,s13,x4/3,po/a,x8/12,pf/j,x10/5,s15,x1/3,pe/l,x9/15,s10,x6/11,s13,pc/m,x15/9,s10,pa/b,x8/2,s2,x10/1,s5,x15/3,s15,x7/9,pf/n,x10/4,pj/b,x6/1,pa/d,x9/3,s14,x6/14,pb/c,x15/10,s15,x0/6,pg/p,x5/12,s1,x9/15,s7,x8/2,s1,x9/3,pd/a,x15/5,s12,x11/9,s11,pm/b,x15/5,s14,x3/0,s15,x14/2,po/d,x3/7,pe/a,s15,x2/14,s3,x8/5,s6,x14/7,pg/o,x13/5,s2,x14/7,pf/h,x2/9,s14,x10/8,pm/g,x2/5,s7,x13/12,s15,x0/14,pk/f,x7/8,s13,x4/15,s15,po/g,x6/12,s12,x7/1,pl/n,x12/2,pk/i,x3/11,s8,x5/12,po/p,x9/14,pg/l,s14,pj/i,x13/15,s11,x6/1,s11,pe/d,x10/0,s6,x2/13,s15,x6/4,pc/k,x8/9,s10,x4/12,s4,pa/e,x0/11,s13,x9/5,s5,x1/13,pn/p,x7/3,pg/h,x15/0,s10,x1/3,s13,x11/14,s3,x6/15,s3,x9/4,s1,x10/14,pe/p,x2/11,s7,x4/13,s4,x11/9,s1,x8/6,s3,x13/2,pb/c,x11/15,s3,x9/4,s7,x1/3,s9,x6/4,ph/f,x12/11,s7,x15/5,pj/l,x10/9,s7,x14/6,s6,x8/7,ph/g,x6/1,pc/n,x2/15,pl/g,x10/13,s1,x5/14,pk/m,x8/2,s10,x15/7,s11,x12/10,pc/j,x14/6,pe/l,x0/12,s8,x8/4,pn/k,x13/6,s14,x4/9,s15,pi/f,x7/8,s14,x2/3,s5,x9/15,s5,x1/6,s1,x3/13,pp/g,x5/12,pj/h,s13,x15/7,s5,x11/8,s9,x6/12,s14,x13/0,pb/n,x14/15,s15,x10/4,s11,x5/7,s11,x4/0,s6,x14/6,s14,x10/5,s3,x3/4,s9,x11/2,s10,x8/10,s2,x6/15,s9,x8/11,s5,x6/10,s9,x1/7,pe/l,x0/12,pn/c,x5/15,s4,x10/13,pp/g,x1/4,pd/a,x8/10,s6,x9/5,s1,x3/1,s12,x8/9,pf/c,x6/13,pi/m,s1,x10/9,s15,x5/6,po/g,x15/9,s4,x1/10,pf/b,s3,x8/0,s6,x10/2,pm/h,x7/9,po/n,x15/14,s11,x9/3,pc/f,x5/11,s3,x3/15,s4,x10/1,pd/n,x11/7,pg/c,x10/6,pe/i,x15/5,s8,x1/2,s12,x8/0,pf/n,x11/4,s2,x10/2,pa/j,x7/4,pf/h,x9/12,pl/a,x7/1,s9,x14/0,s4,pd/b,x6/3,ph/i,x10/7,pa/b,x13/8,s3,x12/6,ph/l,x4/1,s12,x3/11,pg/c,x6/7,s8,ph/n,s4,x2/12,s14,x14/1,s10,x5/11,s15,x1/12,pk/l,x9/5,pj/p,s4,pn/b,s11,x2/15,s15,x11/4,po/j,x8/7,s8,x1/2,s4,x7/14,pm/a,x13/15,s2,x10/11,pl/k,x13/0,s14,x5/1,pj/e,s11,x9/6,s12,x5/1,po/g,x14/8,pj/k,x5/10,po/f,x4/1,pb/e,x5/14,s5,x0/9,pf/a,x10/6,pm/k,x2/9,pl/p,x6/8,pm/i,x5/10,pl/k,x14/8,ph/b,x7/1,s1,x15/13,s11,x9/6,s14,x3/1,pg/n,x14/2,pe/l,x3/6,s11,x9/7,s11,pf/p,x14/6,pd/l,s9,x4/9,s5,pe/a,x5/6,s11,x14/13,pg/o,x15/11,s6,x1/6,s3,x10/7,pp/l,x1/14,s6,x11/3,s5,x13/1,s12,x2/4,s2,x0/1,s11,x11/10,pj/a,x1/8,s15,x11/0,s6,x4/7,s3,x8/2,s7,x15/4,s5,x7/9,s11,x11/10,pp/i,x13/3,pl/f,x10/5,s14,x1/11,s2,x10/2,s13,x13/4,s12,x6/12,pj/b,x14/0,s11,x8/9,s1,x0/11,s6,x10/15,s10,x6/9,pm/e,x0/8,s4,x13/12,s11,x14/4,pf/g,s5,x6/11,pa/h,x9/7,pn/f,s6,x1/8,pa/g,x4/7,s8,x14/10,s10,x3/9,s4,x0/7,s14,x10/11,s9,x4/0,po/i,x13/14,pg/c,s12,x2/1,pj/o,x13/15,s15,x14/11,ph/i,x9/12,s3,x6/8,pg/o,s4,pd/f,s15,x3/4,s12,x1/0,s2,x9/15,pc/m,x5/0,s9,x3/11,pa/g,x2/13,s3,x12/15,s1,x14/6,s15,pi/b,x2/12,s8,x1/4,s15,x15/3,s7,x14/9,s15,x6/15,s7,pl/n,x8/9,s2,x3/13,s13,x7/11,pg/j,x5/15,pf/b,x2/4,pk/d,x7/15,s5,x1/8,s10,x0/5,s5,x15/7,pm/e,x0/5,pg/i,x2/6,s1,x9/3,s1,pk/j,x7/4,s14,x12/9,ph/p,x8/0,s14,x6/5,s7,x11/8,s3,pa/m,x15/13,s6,x14/4,pc/o,x15/6,s4,x2/4,s7,x11/10,pn/g,x15/2,pk/d,x7/0,ph/c,x3/2,s12,x4/5,pf/g,s8,x14/12,s4,x13/3,pc/i,x2/5,s14,x8/6,pm/d,x15/14,pp/c,s7,x6/13,pj/e,x14/15,s15,x12/1,s9,x15/6,pg/i,x12/11,ph/n,x4/5,s7,x10/8,po/k,x14/1,s11,x4/6,pj/i,x0/1,pf/h,x12/4,s14,x0/10,s7,x14/3,pd/l,x2/11,s7,x6/15,s11,x14/1,s15,x9/15,s3,x7/5,s7,x15/2,s5,x10/11,s6,x0/7,pb/e,x6/2,s14,x15/14,s7,x13/5,s2,x10/3,pk/l,x0/14,s3,x4/6,pj/f,x10/1,po/d,s6,x9/15,s1,x11/4,pk/f,x9/14,pi/d,x6/7,s6,pp/b,x11/1,s5,x0/7,pd/j,x3/1,pm/a,x15/11,pe/p,x4/3,s3,x1/14,s4,x8/12,pm/g,x11/6,pl/o,x7/9,s7,x3/12,s2,x5/14,s1,pp/b,x7/4,pf/a,x8/10,pb/o,x12/7,s6,x10/2,pm/j,x12/1,s10,x4/14,s2,x15/11,s15,x13/7,pk/e,x9/0,pb/m,x3/1,s8,ph/p,x5/8,pi/o,s15,x13/12,s14,x10/15,s5,x12/8,s5,x6/1,s14,x10/15,s1,x1/5,ph/a,x9/15,pg/d,x12/8,pn/k,x14/5,pi/b,s5,x0/7,s14,x2/5,pj/m,x9/3,pi/c,x1/13,s5,x6/9,s13,x2/1,s12,pj/p,x13/6,s11,x0/3,pd/o,s1,x11/15,s2,x5/4,pa/f,s15,x7/13,s14,x8/14,pb/i,x3/0,s6,x14/8,s2,x10/3,pm/j,x14/5,s4,ph/e,x10/9,pd/m,x11/14,s7,x5/6,pj/l,x14/12,s13,x15/1,s10,pi/c,x4/9,s4,x14/7,s9,x3/9,pd/f,x0/10,pb/k,x1/2,s15,x5/8,pd/c,x11/14,s5,x1/13,pf/g,s12,x9/6,pj/p,s9,x11/8,pf/o,x0/13,s9,x2/8,s5,x0/9,pd/p,x8/14,s3,x12/13,pn/k,x11/7,pm/o,x3/10,pd/p,s13,x11/0,po/b,x9/1,pp/e,x14/10,s7,x2/3,s7,x1/14,s14,x8/11,s6,x4/6,s5,x1/15,pb/a,x13/9,s9,x2/10,s7,x13/9,pe/p,x3/15,s12,x6/8,s5,x13/11,s4,x6/0,s10,x2/13,pb/a,x9/3,s9,x0/11,s2,x1/4,s8,x2/9,s13,x11/13,pn/o,x0/9,s6,x13/12,pd/p,x0/10,pm/b,x8/2,pi/c,x10/0,s8,x1/11,ph/k,x8/5,s2,x12/1,s13,x8/15,s9,x14/6,s14,x5/0,pd/f,s9,x1/9,pi/b,x6/8,s7,x12/11,s13,x0/10,s15,x12/7,pf/a,x4/11,ph/d,s10,x2/10,pm/k,x8/15,s10,po/l,x14/11,pn/i,x7/12,pc/f,x11/10,s11,pj/a,x13/5,s6,x8/15,s11,x3/4,s9,x7/9,pe/n,x15/12,s9,x8/3,s10,x7/4,s3,x14/9,pi/o,x7/10,s9,x1/5,s8,x6/13,pj/e,x1/14,pd/p,x10/5,s5,x3/15,s13,x6/14,pe/c,x15/2,ph/k,x9/5,s5,x0/7,s11,x12/9,pl/e,x13/0,pa/b,x14/4,pd/f,x0/15,po/k,x2/4,s15,x7/15,s13,pl/p,x12/8,s14,x2/13,s2,x5/12,pc/j,x4/14,ph/k,x0/3,pm/j,x4/13,s13,pd/e,x5/2,s3,x7/8,pn/b,x15/10,s12,x13/1,s6,x15/14,s3,x10/7,s15,x11/8,ph/f,x9/4,s1,x14/12,pn/k,s12,x11/10,s7,x8/9,s14,x10/2,s10,x8/6,s9,x2/5,pg/d,x11/4,s2,x3/9,s6,x13/15,s7,x5/1,s4,x11/6,s7,x9/5,s3,x14/1,s6,x3/11,s5,x15/4,s10,x3/8,s7,x4/15,s12,x0/14,pl/m,x9/12,pg/p,x1/2,pl/d,x5/10,s15,x12/7,s2,x2/1,pa/m,x5/3,s7,x4/11,s12,x9/12,pc/g,x3/13,s5,x15/11,pp/d,x4/13,pn/c,x15/2,pl/j,x1/6,pb/e,s4,x4/12,s5,x0/7,s9,x1/11,s8,x13/3,pg/m,x4/11,s6,x3/8,s1,x14/4,pc/n,x3/1,s11,x8/15,ph/j,s2,pm/f,x14/11,pp/j,x3/1,pn/h,x0/14,s5,x11/15,s11,x12/10,pa/b,x1/5,pn/m,x10/11,s5,pd/g,x8/0,pj/p,x4/14,pm/f,x7/11,pn/d,x5/6,pj/i,x7/12,pm/h,s8,x3/6,s6,x0/13,s5,x6/10,s13,pb/p,s6,x1/9,pe/h,x0/10,pf/n,x13/11,s1,x12/4,pj/m,x0/1,ph/k,s1,x3/14,pn/f,x12/2,s14,pd/l,x15/8,s11,x7/6,pf/k,x12/15,pn/m,x3/11,s3,x1/2,pp/g,x5/12,s2,x4/14,pl/f,x9/8,pg/o,x12/13,s5,x7/6,pn/e,x1/8,pi/j,x14/4,ph/a,x3/6,s12,x9/2,s2,x7/1,s4,x9/5,s14,x8/4,pd/m,x11/13,s15,x4/9,ph/p,x1/13,pj/i,x11/10,s14,x13/3,s15,x4/14,pb/g,x11/12,s3,x8/0,ph/m,x11/15,s14,x12/1,s12,x14/5,s9,x6/8,s12,x10/13,s15,x15/7,pj/i,x12/9,s4,x4/8,s13,pf/n,x14/10,s15,pk/p,s11,x15/9,pl/b,x4/11,s12,x2/5,s14,x10/8,s6,x11/7,pf/p,x13/14,s13,x12/2,pc/l,x13/6,s11,x9/11,s9,x3/7,s1,x4/1,s3,x14/15,s2,x4/2,pm/i,x3/8,s1,x9/14,pd/b,x13/11,s5,x3/8,s4,x2/9,pi/p,x12/13,pe/k,x5/8,s7,x3/14,pf/h,x10/7,s4,x15/8,s4,x3/6,s13,x9/12,s9,x11/15,s12,x8/12,s14,x13/6,s10,x11/15,s5,x1/12,s2,x3/7,pp/m,x12/1,s1,x5/4,s2,x7/9,po/e,x15/2,pa/b,x5/11,s4,po/f,x7/1,s14,x6/13,s8,x14/2,s11,x3/1,s1,x11/8,pa/n,x2/9,s9,x1/15,s4,x5/12,s9,x1/3,pe/k,x7/6,s15,x3/2,pi/d,x11/12,s7,x6/15,pb/h,x4/14,pe/l,x9/6,pi/j,s6,x7/14,s9,x3/1,s5,x15/14,pe/g,x9/1,s8,x8/7,s13,x14/0,pk/d,x13/7,s9,x1/14,s6,x13/15,pp/o,x4/7,pe/i,s15,x2/14,s4,x10/0,pc/l,x2/14,s12,x1/15,s3,x3/4,s5,x14/8,s6,x1/12,s12,x13/10,pa/j,x3/4,s2,x5/2,s9,x13/0,pp/c,x3/6,s8,x4/5,pb/h,x10/15,s12,x7/1,s10,x10/14,pi/l,x8/15,pn/d,x9/1,pf/b,s4,x15/14,pn/p,x12/4,s9,x11/5,s9,pf/o,x3/7,s3,x10/6,s3,x3/13,s3,x2/4,pc/b,x9/8,s5,x7/3,pf/a,x1/9,pi/l,x10/8,s3,pd/b,x11/14,s5,x10/6,s12,ph/k,x2/7,s3,pb/e,x15/1,s2,x14/8,pg/n,x9/0,pm/o,s12,pk/n,x12/14,s13,x13/15,pi/l,x4/2,s12,x0/14,ph/b,s9,x6/11,pe/j,x8/14,s2,x13/4,s11,x8/14,s4,x2/6,s12,x13/11,po/l,s2,x7/14,pc/m,x11/6,pi/f,x3/13,s8,x8/9,pc/g,x4/1,s3,x5/7,s10,x11/9,pk/f,s6,x14/4,s4,x15/9,s4,x4/1,pm/o,s15,pc/l,s9,pm/k,x9/14,s12,x8/4,pj/c,x9/1,s2,x2/7,pn/m,s4,x1/8,s1,pc/e,s8,x3/7,pg/m,x6/0,s9,pe/k,x3/9,pi/n,x10/2,pc/j,x8/9,pl/o,x10/13,s9,x6/8,pn/e,x13/10,pp/g,x8/3,s11,pi/m,x0/11,s12,x9/12,s3,pg/e,x1/14,s11,x9/3,s5,x2/11,s11,x9/6,s13,x7/14,s14,x2/4,pm/b,x7/10,s13,x14/6,pg/h,x2/12,pp/i,x5/10,s11,x6/7,s12,x13/8,s13,x15/6,s10,x0/4,s11,x9/15,s10,x14/11,ph/b,x0/15,pk/f,s9,x2/3,s6,x6/4,s4,x3/2,pi/c,x10/8,s2,x5/12,pj/k,x4/8,pl/m,x13/9,pd/i,x3/12,s4,x0/9,s3,x14/2,s6,x7/11,pa/h,x3/0,pj/c,x8/10,s6,x0/9,pk/g,x15/5,po/h,x9/4,s2,x15/10,s12,x0/4,pi/n,s5,x1/5,s9,x15/2,ph/c,x9/5,po/e,x0/6,ph/d,x14/9,s5,x5/15,pm/j,s6,x6/9,s5,x4/5,s5,x8/13,pb/l,x2/11,ph/e,x15/4,s13,x11/3,s1,x0/15,s15,x8/11,pn/o,x13/12,s11,x9/6,s10,x8/11,s13,x5/0,s1,pg/f,x4/1,pa/o,x13/14,pp/h,x0/9,pc/l,x6/7,s11,x11/5,s10,x1/0,s10,x7/3,s7,x9/0,s9,x8/2,pm/a,x12/15,s1,x9/13,pp/j,x10/5,s3,x2/14,s1,x3/6,s7,x8/2,s5,x5/10,s14,x2/1,s4,x10/0,pm/o,x11/15,pj/l,x14/5,s13,x0/4,pg/n,x8/7,ph/a,x2/14,s7,pl/n,x8/4,pf/c,x7/11,s5,x12/10,pd/m,x2/8,s7,x0/1,s4,x6/9,ph/i,x13/8,pl/o,x11/10,s14,x13/6,s9,x15/10,pn/m,x4/9,pp/b,x13/0,s3,x7/1,pa/i,x11/9,pl/p,x15/13,s11,po/e,x7/4,s15,pc/i,x13/5,pm/h,x8/11,s8,x4/12,pd/o,x7/10,ph/a,x2/5,pf/b,x14/0,pk/h,x4/15,s7,x6/0,pa/i,x15/4,pc/f,s13,x3/9,s14,x0/8,s15,x14/15,pg/m,x6/0,s7,x7/10,pk/p,x4/11,ph/n,x2/0,s2,x7/4,s11,x8/13,s14,x11/14,s14,pa/k,x10/15,s12,x13/6,s12,x1/2,s8,x12/3,s6,x11/15,pm/l,x7/6,s14,x15/3,s2,x9/1,s9,x8/11,pk/d,x6/2,s11,x11/1,s14,x2/0,pe/c,x13/7,pn/m,x5/6,s12,x8/4,s9,x7/13,s7,x9/11,s13,pi/a,x10/6,pl/b,x12/13,pm/n,x6/11,s7,x2/12,s7,x10/15,s13,x14/4,po/f,x13/6,pe/b,x15/2,s6,x14/7,s7,x4/3,pm/i,x12/8,s5,pg/o,x5/13,s12,x0/9,s7,x13/4,s15,x10/7,pn/j,x11/5,pp/m,x6/15,s5,x5/14,s1,x10/0,ph/k,x1/7,pd/g,x3/5,pl/o,x15/0,s9,x6/12,pj/h,s14,x9/3,s15,x15/0,s13,x2/8,s15,x1/7,s15,x15/5,pe/o,x2/6,ph/a,x15/13,s3,x4/6,pm/p,x10/1,s4,x7/11,pc/l,x0/5,s9,pa/i,s3,x1/12,pd/e,x13/11,s2,x8/12,pk/f,x4/13,s11,x3/7,pd/n,s8,x12/0,s3,x14/9,pm/o,x12/10,pn/l,x11/4,pm/o,x10/8,s1,x7/5,s6,x9/2,pe/d,x8/1,s2,x3/7,s2,x12/15,s15,x6/5,s5,x0/12,pf/a,x7/11,pm/c,x14/1,po/b,x8/15,s7,x5/1,pi/g,x0/12,pb/l,s11,x10/7,s2,x14/4,s4,x12/5,s10,x0/1,s5,x10/9,pc/j,x7/14,s13,x3/8,s1,x7/2,s5,x5/11,s15,x2/9,pf/o,x15/14,pj/c,x0/8,pa/o,x10/5,s2,x8/7,pf/h,x6/15,po/c,s3,x14/8,s12,x7/12,s15,x14/10,s6,x2/9,s5,x0/4,pj/h,x1/8,pm/k,x13/15,pi/e,x0/7,s2,x11/2,s3,x9/12,s12,x2/11,s8,x3/0,s12,x14/5,s1,x7/2,pp/b,x12/5,pl/d,x10/9,s10,x2/4,s13,pn/m,x13/1,s15,pp/g,x15/6,pa/h,x12/9,s8,x3/11,s15,x1/9,pk/p,x11/13,s12,x8/12,s10,x4/14,s13,ph/m,s1,x11/1,s9,x12/0,s15,x3/13,s7,x4/14,s13,x11/2,pg/i,x12/10,s14,x3/0,s9,x13/5,pj/l,x3/6,s1,x9/11,pi/a,x6/4,s10,x8/1,pk/l,x10/11,pd/p,x13/4,s13,x8/2,s1,x7/4,s13,x9/1,pj/f,x8/11,s7,x7/4,s6,pn/g,x1/3,pb/o,s13,pn/c,x11/13,pf/g,x12/4,s12,x11/2,pa/d,s1,x8/5,pc/k,x10/1,s1,x7/3,s14,x5/13,s9,x4/14,s8,x5/10,pl/d,x6/15,s6,x10/13,s10,x7/14,s9,x4/11,po/m,x1/15,s13,x3/12,pi/p,x10/15,s15,x12/4,pj/m,x3/0,s6,x8/12,s15,x3/9,s8,x12/5,po/p,x7/14,pn/i,x8/2,s11,x4/15,s9,x12/7,s9,po/c,x9/6,pl/g,x2/8,s14,x10/14,s8,x0/12,s1,x9/1,s11,x0/11,po/b,x1/9,s3,x15/4,pn/h,x13/3,s2,x12/2,s15,x4/3,s15,x0/1,po/d,x10/12,pi/g,x5/3,s3,x6/1,ph/l,s3,x5/2,s3,pg/n,s8,x14/8,pa/k,x12/3,s3,x4/1,s7,x9/14,s8,x13/6,pf/i,x1/14,pn/p,x8/7,s2,x0/3,s6,x11/7,pf/a,x8/2,s8,x0/1,s1,x2/15,pm/p,x5/9,s13,x2/14,s6,x9/11,s8,x1/10,s11,pe/a,x0/8,pn/c,s10,po/d,x9/3,pl/m,x8/4,s15,x2/14,s15,x15/10,s3,x12/1,s9,x14/8,s2,x15/10,s4,pk/f,x9/1,pl/c,x11/4,pd/h,x14/8,pb/m,x13/10,ph/p,x6/0,s11,x2/9,pe/b,s2,pc/f,x7/6,s14,x15/10,ph/b,x1/4,s14,x13/15,s5,x9/10,s5,x11/7,s1,x4/0,pg/k,x1/5,s12,po/l,s8,x3/0,s7,x11/14,s13,x10/12,pk/i,x3/5,pm/p,x0/6,s1,x7/9,pn/b,x0/11,s11,x4/15,s10,x5/2,pp/a,x9/8,po/n,x15/0,s4,x10/9,s1,pp/b,s3,x0/15,pc/e,x3/6,s10,x4/14,s11,ph/j,x3/13,s12,x11/8,s5,x10/14,pl/m,s3,x4/0,ph/o,s6,x12/13,pe/p,x5/6,pm/k,x9/13,s15,x12/8,s15,x2/1,s7,x6/11,pc/j,x9/14,s14,x11/12,s8,x1/7,s7,x8/3,s1,x14/0,s6,x7/15,s6,x11/4,s3,x6/13,s6,x5/15,pe/l,x9/4,s7,x7/3,pi/b,x0/15,pd/l,x12/14,s12,x10/4,pm/i,x7/8,pj/n,x9/0,pi/b,x14/1,ph/f,x8/13,pa/d,x1/4,pi/g,x0/11,s15,x1/14,s6,x5/3,s12,x13/1,s6,x15/4,pa/n,x12/8,pk/j,x0/13,s9,x5/4,pf/c,x9/1,pp/d,s7,pl/f,x8/14,s4,x12/7,po/g,x14/5,s4,x10/11,s12,x3/14,pj/f,x12/15,ph/b,x10/0,s9,x3/13,pa/m,x15/7,s1,x1/3,s13,x0/9,s7,x10/5,s11,x12/4,s7,x10/13,pe/d,x3/14,s14,x9/7,s15,x2/10,pj/c,x5/4,s8,x15/2,s10,pp/l,x14/7,pe/f,s5,x2/10,s6,x15/5,s1,x9/13,s5,pc/j,x6/12,s2,x13/1,pi/e,x2/9,pm/p,x8/4,s11,x10/15,s12,x9/3,s6,x5/1,s6,x6/9,pn/o,x7/15,pb/f,s4,x4/8,s3,x9/0,ph/l,x13/7,pp/f,x3/4,s7,x1/0,s10,x3/12,s11,x14/0,s15,x1/11,s10,x6/0,s3,x3/7,s15,pa/i,x1/15,pn/j,s8,x13/9,pa/b,x1/3,pi/j,x4/14,s12,x0/1,pk/b,x12/3,pf/j,x6/7,pi/c,x2/5,s13,x11/12,s10,x3/8,s14,x13/1,s12,x4/12,s4,x8/13,s11,pm/b,s1,x5/4,po/i,x7/2,ph/p,x1/9,s5,x13/3,s11,pl/e,x5/11,ph/k,x12/6,s12,x9/15,pf/n,x7/3,pc/a,x1/2,s7,pe/n,x9/4,pc/h,x6/2,s14,x8/15,po/g,x1/5,s8,x15/11,pj/m,x4/0,pp/k,x5/8,ph/i,x13/0,pe/n,x1/2,s10,x3/7,pg/b,x1/11,s11,x12/7,ph/j,x1/3,pb/n,x12/11,s15,x3/13,pk/j,s6,x1/6,s14,x15/9,pd/h,x4/11,s8,x9/14,pe/l,s11,x7/4,pd/k,s2,x9/10,pb/a,x6/15,s1,x11/9,s15,x6/2,s3,x13/0,pg/e,x7/11,pc/a,x6/0,s9,x3/4,s15,x1/7,s2,x9/11,s5,x4/3,s4,x7/0,s3,x12/2,pp/f,x9/3,pl/n,x2/12,s3,x10/15,s13,x9/12,pj/f,x10/7,s11,x0/4,pl/p,s1,x15/1,s9,pk/o,x13/7,s8,x9/5,s11,x6/0,s4,x2/1,pi/n,x10/14,s9,pk/c,x6/8,pm/a,x9/10,pc/p,x6/7,s2,x8/2,s7,x9/10,s13,x15/12,s7,x14/4,pg/b,x3/0,pl/h,x5/1,s4,x3/7,s11,x11/2,s4,pc/o,x0/8,s10,x6/11,s1,x3/13,s2,x2/9,s13,x1/14,s5,x7/9,pd/p,x12/3,pg/c,x6/14,s6,x11/7,pb/l,x3/2,pe/g,x9/8,pm/f,x11/6,s5,x8/7,s6,x5/6,s10,x2/8,s8,x5/3,pg/l,x10/0,s1,x15/5,pj/b,x12/4,s8,x1/15,pd/o,x5/10,pk/i,x8/9,pg/l,x7/13,pk/m,x9/15,s2,x13/12,s9,pi/a,x6/1,s1,ph/l,x10/9,s5,x14/5,s10,x4/11,pe/f,x12/15,pk/i,x10/2,s3,x4/11,s11,x12/9,pl/h,x11/4,s7,x3/8,s5,x9/0,s4,x8/13,pi/c,x6/7,pg/p,x10/9,s1,x13/15,pd/m,x10/4,pl/c,x13/7,pn/o,x0/9,pf/k,x4/14,s3,x3/13,s11,x10/11,s1,x2/7,pl/p,x6/9,pm/c,s7,x11/2,s6,x12/3,s10,x1/5,s2,x3/0,s5,x14/6,pp/f,x9/0,s5,x13/11,s8,x8/7,s5,x9/6,s8,x2/0,pi/m,x5/10,s5,x4/12,pc/p,x8/0,pb/h,x2/5,pf/j,x3/0,pe/h,x4/14,s5,x11/15,po/g,s5,x13/3,pl/c,x8/9,s13,x0/1,s6,x15/12,s14,x8/11,s11,x13/4,s11,x11/14,s3,x4/0,pa/i,x8/11,s12,x14/13,ph/c,x12/11,s14,x3/2,pe/k,x13/5,pi/a,x0/7,s2,x3/11,pk/b,s15,x0/14,s1,x12/5,s13,x1/9,pf/i,x10/6,s13,x12/3,s6,x6/1,s11,x13/8,s11,x5/10,pb/h,x7/4,pc/g,x1/6,pp/i,x7/4,pa/d,s14,x0/6,pm/b,x5/12,s9,x1/10,s5,x13/9,pk/j,x8/3,pn/d,x7/6,po/g,x8/14,s8,x2/11,s6,x7/13,s10,x1/4,pp/h,x5/13,pb/j,x15/3,s9,x10/8,s12,x5/11,pe/c,x7/12,pn/m,s8,x13/4,s10,x7/1,s13,pj/k,x6/3,pg/d,x12/15,pm/i,x3/5,pe/b,x7/15,s14,x2/12,s11,x10/1,pm/h,x4/11,s1,x6/2,s12,x1/7,pa/b,x10/4,pk/c,x12/0,pp/d,x8/4,pi/b,x3/6,s10,x10/11,pd/l,x14/0,pc/e,x13/11,ph/i,s6,x3/12,s9,x7/1,s10,x2/5,s11,x11/8,pj/b,x5/7,pn/l,x3/9,s4,x13/11,pa/b,x0/12,s7,x7/1,s11,x3/15,pd/k,x2/14,ph/n,x0/9,pd/e,x14/8,s2,x2/1,pp/h,s12,x7/3,s10,x9/8,s6,pl/k,s13,x10/15,s14,pb/e,x7/8,pp/l,x5/15,s8,x11/4,s12,x14/8,ph/j,x12/11,s11,x9/3,s8,pb/m,x14/2,pi/n,x15/4,s9,x12/3,s12,x1/10,pa/g,x15/7,s4,ph/f,s4,x11/5,pl/p,x2/10,s11,x15/0,pb/i,x4/6,pn/p,x12/13,s11,x11/10,s2,x8/2,s12,x1/3,s4,x8/13,s9,x4/2,s3,pe/m,x1/15,s11,x2/0,s10,x10/6,s9,x15/8,pa/b,x13/2,pl/f,s8,x10/5,s3,x4/8,pc/m,x0/9,s4,x3/5,s7,x10/7,pb/h,x11/1,pd/e,x0/5,pb/j,x1/8,s13,x12/3,s7,pl/f,s15,x2/4,pb/p,s2,x0/7,s7,x13/12,pj/h,s10,x15/6,s5,x3/4,s5,x6/8,s7,x7/0,pi/d,s8,pg/j,x15/1,pi/e,x10/13,pj/p,x7/1,s7,x2/3,pl/n,x14/10,s3,x9/2,s4,x13/6,pf/i,x3/10,pj/n,x12/9,pk/i,x6/13,s14,x14/4,pg/b,x11/9,s10,x5/13,s15,x2/0,s5,x5/14,pi/j,x3/9,pg/b,s2,x4/0,s9,x12/13,s4,x9/3,po/l,x14/0,pe/c,x6/7,pn/k,s1,x3/13,s3,x12/0,pm/i,x2/6,s13,x7/3,s7,x15/5,pb/a,x1/13,s10,x12/14,pn/p,s5,x3/5,s8,x0/13,pm/b,x2/4,s11,x11/0,s6,x13/4,s10,x10/6,pi/f,s1,pl/e,s1,x3/2,s11,x13/11,s3,x15/8,po/g,x2/1,pf/k,x13/10,s14,x1/8,s12,x10/13,po/l,x3/8,s13,x13/1,pg/d,x3/11,pj/n,x5/0,pl/o,x8/4,s8,x12/15,pm/c,x9/6,pk/o,x14/1,s14,x8/12,pn/l,x6/13,s3,x7/2,pj/d,x13/14,s9,x10/9,s1,ph/m,x11/7,s4,x6/0,s6,x7/15,s4,x10/3,pa/o,s8,x9/5,s12,x2/8,pi/m,s5,x7/12,pe/l,x4/13,pd/p,x11/8,pk/a,x6/0,s6,x2/12,s15,x14/5,pb/p,x12/15,pk/n,x10/0,pc/i,x6/9,s12,x2/4,s10,x8/1,s13,x3/12,s13,x15/14,s13,x11/5,s13,x6/4,pk/a,x14/11,s5,x6/12,s10,x2/13,s3,x3/12,s11,x14/7,pe/c,x15/8,s13,x3/4,s9,x5/8,s4,x3/2,s3,x11/13,pl/i,x4/7,pk/b,x3/13,s7,x7/10,pn/e,x3/11,pd/b,x1/13,s9,po/n,x6/12,s14,x0/14,pe/l,x3/12,ph/a,x8/14,s14,pk/n,x11/4,s8,x10/12,s2,x15/11,s10,x10/0,s10,x5/2,s9,x6/3,pa/p,x15/5,s13,x14/6,s14,x1/8,s14,x12/4,s6,x14/7,pd/h,x2/3,s2,x9/12,s1,x10/15,s5,pg/j,x7/4,pp/a,x10/1,s9,x6/8,pf/d,x7/13,s7,x2/4,s10,x8/0,ph/e,x12/1,pd/f,x3/5,pj/i,x6/14,s15,x10/8,s15,pn/p,x1/3,pl/j,x12/8,pe/g,x2/14,s5,x6/7,s5,x14/5,pc/p,x12/0,s1,x2/11,pm/i,x12/8,s1,x9/4,s10,x13/11,s6,x5/7,s13,x11/9,s12,x5/2,s8,x3/7,s15,x10/2,s6,x6/7,s3,x3/8,pf/g,s9,x1/5,s3,x11/12,s4,x7/0,pi/j,s3,x15/3,s3,pc/n,s12,x14/13,pa/b,x4/11,pg/j,x1/14,s8,x4/12,pb/o,s2,x0/6,s8,x13/7,s7,x0/8,pl/g,s9,ph/b,x11/7,s10,x9/3,pi/m,x13/7,s9,x10/9,pf/a,x12/13,pp/j,x14/3,pi/h,x0/4,s2,x8/13,pf/d,x12/9,s4,x5/13,pb/o,x3/1,s7,x8/0,s4,x2/7,pa/n,x15/5,pe/m,x13/3,pp/g,x2/11,s13,x9/8,s14,x15/6,pc/j,s14,x10/13,pg/e,x8/9,s8,x10/2,s5,x3/0,pp/m,x10/2,pe/k,s15,x15/6,s10,x4/14,pa/p,x6/9,s13,x4/10,s11,x6/7,s12,x15/4,ph/d,x6/7,s13,x11/15,s15,x6/2,s11,x12/7,pb/i,s13,x6/5,pa/d,x13/12,s7,x9/10,pm/h,x12/4,s7,x2/14,s2,x15/11,pl/o,s7,x13/9,s6,x3/2,s12,x11/12,ph/d,x1/15,s11,x4/11,s10,x13/7,pg/e,x15/4,ph/a,x6/13,s2,x5/14,s2,x3/9,s14,x13/4,pc/d,x2/8,s14,pb/a,x11/14,s13,x15/4,s7,pi/f,s14,x0/3,pa/d,x14/7,s10,x3/4,pj/h,x9/7,pm/k,x5/1,s14,x14/3,s2,x11/10,s13,x5/3,pf/n,x4/12,s10,x7/8,s2,x10/3,s10,x15/1,pk/a,x9/11,s13,x0/5,s14,x4/3,s8,x14/5,s12,x11/6,pc/h,x12/3,pi/p,x1/0,s15,pd/l,x6/14,s12,x2/1,s6,x4/3,s8,x2/12,s9,x1/11,s3,x4/15,s3,x2/12,s5,x3/6,pa/e,x8/14,pb/j,x1/5,s9,x6/9,s2,x1/7,s9,x3/0,pn/k,x7/2,s12,x3/4,pp/e,s10,x9/2,s12,x0/10,pc/n,x5/3,ph/d,x2/12,pa/o,x11/4,pg/m,x5/15,pc/o,x8/11,s14,x6/5,pb/a,x2/11,pk/g,x13/7,s5,x0/8,s6,x3/2,pn/j,x15/7,s14,x9/0,s12,x8/13,s10,x14/12,pa/k,s7,x8/1,s4,x10/2,pn/c,s8,pe/o,x9/5,s8,x13/10,s10,x1/4,s5,x10/15,pd/j,x11/3,pc/o,x10/13,pe/i,x0/1,s5,x5/12,s1,x10/14,s11,x4/8,s2,x6/9,s10,x4/11,s8,x13/2,s7,x1/12,s1,x14/15,s5,x4/2,s10,x13/11,po/c,x2/14,pp/f,x5/1,s2,x15/7,s14,x12/2,s1,x5/4,pj/g,x15/11,s9,x2/4,s4,x7/11,pe/i,x8/15,s15,x11/6,s13,x7/12,pm/a,x3/13,s6,pd/l,x15/7,pn/f,x11/4,s11,x14/12,pd/b,x3/4,s1,x11/15,pj/p,x3/6,s14,x7/14,s8,x1/12,s5,x11/3,po/c,x14/0,ph/a,x10/6,s10,x4/14,pd/l,x3/11,pc/g,x13/8,s10,x5/6,s1,x14/13,s13,x8/4,s11,x6/2,s4,x13/11,pj/h,x14/10,s11,x9/12,s15,pm/g,x13/5,pb/j,x2/7,s13,pf/k,x15/12,s14,x13/6,s8,x12/9,s13,x11/4,s5,pn/o,x6/10,s1,x3/4,s3,x15/11,s12,pk/p,x12/6,pe/j,x11/5,s12,x4/15,pp/h,s6,x9/5,s11,x13/15,pb/i,x7/5,s7,x6/15,s1,x2/1,pk/o,x7/0,s10,x12/4,s6,x14/15,pf/g,x3/12,pl/n,x0/5,s5,x12/14,pe/h,x7/13,s5,x0/3,pm/c,x2/1,s6,x6/13,pp/f,s8,pb/n,s12,x11/12,s11,x3/6,pm/a,s4,x13/4,s12,x10/14,pp/n,s6,x3/11,pj/c,x6/5,pd/m,x11/13,s14,x12/9,pg/a,x8/11,pl/m,x3/0,ph/j,x4/7,pg/d,s8,x12/5,pe/a,s2,x15/6,s15,x5/1,s4,x14/9,pc/b,x1/3,s4,x5/10,s8,x3/2,pl/m,s6,x10/5,pf/b,x9/2,po/e,x1/3,s13,x12/4,s13,pb/h,x5/1,pi/j,x7/3,s7,x0/9,s11,x10/8,s7,x2/14,pg/o,s14,x4/3,pc/k,x14/12,s1,x9/7,pd/p,x4/11,s13,x3/13,s1,x6/9,pe/n,x2/15,s15,x10/1,s14,x2/11,s7,x13/6,pi/j,x0/2,pc/o,x5/1,s7,x6/2,pg/h,x9/5,pk/c,x14/7,pb/h,x12/6,pc/m,x13/15,s11,x2/0,pl/b,x4/9,pp/k,x8/1,s7,x13/5,s12,x3/14,pl/b,x6/11,pp/k,x10/15,s10,x2/0,pm/g,x4/3,s12,x9/5,pe/n,x8/0,s12,x3/10,s6,x9/0,s7,x4/7,pi/d,x14/13,s3,x11/15,s1,ph/f,x4/9,s8,x12/3,pp/m,x7/1,s15,x0/4,pl/k,x14/5,s13,x0/1,s4,x13/10,s9,x14/1,ph/j,x2/7,s2,x11/5,pf/a,x7/10,s6,x11/3,s1,x7/10,pn/o,x13/9,pe/m,x12/11,pb/c,x4/1,s6,x12/5,s6,pp/f,x7/0,pd/o,x14/2,pc/b,x15/9,s10,x1/3,s5,x15/0,pe/p,x10/2,s3,x14/3,pc/g,x12/11,s5,x7/5,s4,x13/2,po/j,s10,pp/m,x11/10,pg/k,s14,x4/7,pp/b,x9/11,ph/a,x5/4,po/e,x10/0,s14,x8/15,pd/f,x3/12,s11,x4/13,ph/e,x7/1,pp/c,x6/13,s1,x10/5,s3,x1/8,s2,x15/3,pd/k,x1/0,s13,x13/9,s2,x4/10,s13,x12/14,s11,x8/6,s12,x2/4,s13,x9/8,po/l,x10/15,s8,x7/1,s2,x13/11,s3,pn/b,s11,x2/4,s3,x5/6,s7,x8/11,pm/j,x0/7,s5,x9/11,s10,x1/4,pg/d,x13/2,s10,pf/k,x14/1,s7,x11/4,s9,x5/9,s6,x1/13,s4,x6/10,s10,x5/9,s5,x3/1,s12,pm/c,x13/12,s10,x6/11,s5,x12/8,s1,x1/7,s3,x11/12,s3,x6/3,s14,x4/13,s2,x14/0,pp/a,x2/9,pe/k,x10/1,pj/l,x5/8,s2,x15/7,s10,x3/11,s15,x7/6,pg/o,x14/11,pp/l,x3/12,s5,x8/6,s10,x12/11,pg/b,s14,pk/a,x1/14,s4,x9/3,s10,x12/2,pp/o,x1/6,s2,x5/10,s10,x0/1,s11,x14/11,pe/a,x10/15,ph/n,x3/7,pj/m,x15/9,s3,x2/1,s10,x13/12,pd/o,s3,x8/14,s15,x6/2,s12,x14/9,s2,x3/1,s4,pa/k,x12/0,s1,x9/10,s6,pj/c,s5,x8/4,pg/e,x13/12,ph/a,x0/7,s13,x8/3,s4,x14/10,s5,x3/2,pi/o,x6/14,pj/e,x13/9,s2,x6/0,s1,x15/4,pi/h,x5/11,pg/m,x2/12,s11,x13/6,s5,x4/3,s1,x5/1,pc/l,s14,x14/8,pf/h,x9/12,pj/d,x6/8,s15,x13/7,s15,x11/14,pb/f,x5/7,s10,x2/10,s3,x14/4,ph/j,x11/10,s14,x6/3,s13,x1/10,s14,x0/3,s7,x11/10,s15,x8/6,s6,x10/13,pb/l,x3/6,s4,x10/11,s15,x13/12,po/k,x14/2,pb/e,x0/10,s13,x3/14,s6,x0/11,s5,x5/13,po/d,x2/0,pe/g,x3/5,s9,x15/7,pn/i,x12/10,pk/e,x5/6,po/m,x8/13,pl/n,x14/1,s9,x9/6,s3,x2/4,s5,x1/10,s12,x13/2,s11,x1/3,s14,x4/9,pk/p,x5/12,s13,x7/14,s8,x8/6,pm/l,x11/15,s9,x3/4,s6,x10/5,s15,x15/9,pk/o,x1/10,pc/b,x15/11,pe/k,s15,x12/7,s14,x2/6,s7,x4/3,s12,x13/6,s3,x1/11,pj/h,x8/10,s14,x1/5,po/k,x8/2,pa/l,x5/15,pg/n,x6/3,s2,x0/8,pe/d,x6/3,pf/k,x7/15,pc/e,x9/3,s8,x12/15,s10,pf/g,x10/1,pa/n,x6/8,pb/m,x11/1,pf/p,x6/9,s4,x13/2,s11,pg/i,x15/5,s5,x11/13,s14,pm/k,x14/8,s10,x4/10,s6,x15/7,s14,x10/3,s1,x1/4,s12,x11/15,s8,x8/10,s9,x9/11,s8,x8/2,s14,x4/0,s6,x1/11,pc/d,x12/6,pn/a,x10/0,s3,x12/9,s2,x6/13,pm/i,x8/15,s2,x1/10,pb/l,x12/15,s5,x2/7,s6,x10/0,s8,x1/4,s13,x11/15,s3,x0/10,s12,x8/1,s3,x2/5,pg/o,x8/12,pb/e,x1/6,s11,x8/10,pp/f,x11/13,s8,pa/h,x3/6,pk/c,s13,x7/2,s4,x3/10,pj/i,x13/7,s12,x10/9,s15,x7/3,po/c,x6/13,s2,x7/10,s4,x1/9,pb/l,x5/14,s4,x10/3,pk/d,x15/13,s6,x4/9,s11,x6/12,s8,x10/5,s7,x0/6,s3,x4/11,pf/n,x9/10,s5,x13/7,pm/l,x2/12,pe/a,x14/4,s8,x15/8,s14,x14/10,s14,x9/13,s1,x14/4,s6,x8/7,pg/c,x10/12,s6,x7/14,s10,x9/1,pf/m,x6/11,s10,x0/15,s9,x13/4,s3,x7/10,pn/h,x1/6,pd/g,x10/8,pm/k,x11/5,s12,x3/10,s12,x2/0,s13,x8/6,s7,x0/7,pa/j,x1/14,s12,x0/10,pn/g,x2/1,po/d,x13/12,s15,x11/7,s13,x12/0,s3,x14/10,pl/a,x0/9,s6,pm/c,s6,x11/14,s1,x6/0,s1,x9/1,s12,x13/12,s13,x14/3,s7,x8/12,s2,x14/1,s9,x12/15,pp/b,x7/9,s12,x14/3,s6,x10/5,s15,x4/0,s2,x3/11,s8,x0/15,s7,x7/4,pe/j,x1/12,pl/k,x5/4,pe/f,s2,x9/2,s10,x15/12,pm/n,x9/5,pi/h,x4/12,pe/m,x5/2,pj/c,x3/7,s14,x10/12,s8,x13/5,pn/b,x15/11,s3,x1/8,po/m,x12/15,s15,x1/5,pg/d,x9/10,s3,x4/12,s5,x9/15,s13,x14/7,po/k,x2/9,pa/p,x4/6,pk/f,s13,x15/13,s5,pi/l,s11,x1/5,s9,x6/2,pp/f,x9/11,pj/k,x15/1,s2,x2/7,s15,x15/4,s9,pg/b,x11/12,s6,x7/0,s10,x2/8,s12,x5/13,s8,x10/1,pk/m,s6,x4/13,pl/g,x10/0,s4,x12/13,s12,x3/10,pa/h,x5/1,s7,x7/9,s4,x0/8,s4,x3/13,pl/k,x0/2,s6,x4/1,s15,x15/3,s11,x14/0,pd/o,x4/3,pc/a,x14/9,s3,x2/6,pj/f,x10/1,pp/m,s7,x6/5,pg/k,x11/4,s11,x0/1,s13,x3/11,pl/o,x15/5,pb/e,x9/6,s14,x8/4,pa/p,x10/6,pn/j,x9/1,s10,x0/6,pk/m,s8,x15/13,pb/l,x3/12,pp/k,x8/2,pn/l,s6,pd/j,x5/6,pc/a,x1/11,po/l,s7,x10/4,pb/i,x13/2,s1,x9/8,s1,x3/0,ph/c,s15,x4/8,pm/i,x5/2,pa/e,x15/10,s3,x11/9,pk/o,x3/10,s7,x6/12,s10,x0/1,s8,x11/13,s8,x9/12,s8,x0/8,s8,x10/6,pi/p,x14/3,pb/c,x2/0,s4,x7/9,s15,x8/3,pj/p,x12/0,s6,x1/10,s10,x8/12,pm/d,x11/5,s3,x12/3,s4,x1/14,s3,x13/3,pj/l,x6/9,pb/k,x15/11,s13,x13/6,s5,x11/3,s10,x0/6,po/j,s13,x1/9,pi/g,x6/14,pl/h,x13/10,s5,pi/c,s3,x1/14,pl/b,s5,x6/5,s1,x4/9,s7,x3/10,s9,x2/0,s3,x5/14,s10,pj/c,x3/11,s9,x15/10,pl/n,x9/3,s14,x13/8,pb/d,x15/11,pp/f,x13/5,pl/j,x6/8,s14,x4/9,s7,x0/15,pp/i,x13/2,s4,x8/14,s14,x1/0,pf/n,x2/6,pj/b,x1/3,pm/p,x0/9,s2,x12/2,pc/d,x10/9,pi/f,x2/6,s5,x9/14,pp/h,x15/3,pf/n,x0/11,pl/j,x9/14,s8,x5/8,pd/g,s2,x12/15,s2,x5/4,s13,po/k,s1,x3/9,s11,x4/14,s8,pi/m,s12,x15/10,s7,x7/12,s9,x2/8,s13,x7/6,pn/e,x10/13,s3,x11/5,s4,x12/13,s6,x2/1,s1,pj/g,s2,x5/8,s7,x14/0,s13,x4/1,s10,x3/11,s9,pp/f,x1/12,pj/l,s8,x5/7,s2,x9/4,s1,x7/11,s13,x4/8,pe/m,x2/15,s13,x14/1,po/c,x9/3,s11,x7/0,s15,x2/11,s7,x1/7,s7,x3/15,s14,x10/6,s1,x15/0,s9,x12/11,pm/b,x2/7,pa/e,x4/11,s8,x15/2,pn/g,x14/0,s8,x12/13,s2,x10/4,pf/i,x11/0,s8,po/p,x7/9,pd/b,s10,pa/g,x2/15,s11,x7/5,s4,x3/11,pp/b,x5/15,pg/j,x13/14,s15,x2/0,s10,x14/3,pd/a,x13/6,s14,x11/7,s15,x8/5,s15,x4/12,pl/p,x11/2,s12,x15/6,s6,x9/12,s13,x13/3,s11,x2/8,s14,x1/10,pf/n,x3/4,s5,x14/15,pa/c,x3/4,s6,x14/15,s11,x2/11,pl/d,x4/6,s6,x12/9,pk/a,x3/4,pf/i,x5/15,s10,x2/10,pj/c,x5/12,s8,po/e,x14/1,pg/a,x10/2,s8,x14/0,pk/d,x9/7,s6,x1/14,s9,x3/9,s7,x2/13,pm/o,x12/0,s12,x7/14,pg/k,x1/10,pp/o,x2/6,pb/l,s5,x5/13,pc/g,x8/11,s5,pl/m,x13/6,pf/c,x0/9,s1,x11/8,s9,x2/14,pi/a,x8/1,s4,x11/7,pp/j,s7,x4/12,s2,x3/6,s11,x13/8,s11,x1/3,s15,x2/9,pg/l,x6/0,pm/f,x3/12,s4,pp/g,x14/15,pm/a,s4,x0/13,pp/n,x3/12,s6,x0/2,s4,x4/8,po/b,x15/5,s5,ph/d,x9/2,pm/b,x4/11,s10,pj/h,s5,x15/3,pi/c,x12/6,s5,x13/3,s8,pe/b,x8/7,ph/a,x13/4,pl/o,x2/8,pk/j,x14/4,pb/m,s6,x1/3,pn/k,s12,x4/9,pj/i,x15/14,s14,x0/11,s15,x6/13,s1,x14/8,s1,x6/12,s15,pe/n,x0/3,s7,x1/9,s9,x15/13,s4,x4/2,pi/a,x1/12,pc/j,x2/15,s4,x13/9,pm/k,x0/3,pl/a,x6/4,pd/e,x2/12,s3,x13/4,s2,x2/11,s5,x13/12,ph/k,x4/14,pa/b,s14,x15/2,po/k,x12/3,s4,x5/4,s10,x12/6,s4,ph/c,x1/15,pd/p,x0/13,s13,x15/1,pb/n,x0/14,s2,x1/15,s10,x11/10,s2,x15/14,s13,x8/1,pf/h,x0/15,s10,x7/3,s7,x10/13,s1,x15/3,pl/o,x13/7,pj/h,x4/14,pl/n,s8,x8/6,pa/d,x2/15,s13,x7/3,pe/i,x0/14,s9,x9/12,s13,x6/7,s12,pm/a,x15/13,s2,x9/8,pd/n,s1,x3/1,s9,x5/9,s4,x12/4,s2,x15/8,s6,x11/6,pg/i,x9/7,s14,x14/4,pp/o,x0/3,s1,x1/9,pj/b,x6/7,pd/f,x5/10,pg/m,x11/2,s11,x0/14,s15,x13/15,s14,x12/9,pf/c,s5,x0/6,s6,x14/11,ph/g,s11,x3/4,pl/k,x10/12,s8,x15/5,s11,x12/9,pi/h,s1,x3/14,pg/p,x6/5,s10,x3/4,s11,x1/10,pk/d,s10,x5/9,pe/p,x14/6,s10,pb/m,x0/10,s3,x6/7,pf/o,x9/3,s14,ph/m,s2,x15/6,pn/a,x4/13,pc/l,x14/2,s14,x3/13,s9,x8/0,po/m,x7/6,pp/j,x12/15,s3,x1/9,s10,x5/8,s6,x6/13,s5,x5/1,pd/a,x2/12,s11,x8/3,s8,pp/m,x11/0,s6,x2/14,s15,x12/13,s15,x9/8,s13,x15/12,s6,x14/8,s9,x9/2,s3,x14/7,s12,x1/11,s4,x13/2,s5,x12/10,s14,x1/8,pe/a,x0/4,pi/o,x5/10,s2,x0/3,pd/f,x1/14,pb/c,x10/2,s3,x0/13,s14,x14/2,s7,x13/7,s13,x12/11,pf/a,x14/1,ph/m,x8/11,s12,x13/5,pn/p,x1/8,s7,pd/l,x12/4,s4,x10/6,s3,x7/5,s6,pn/j,x12/13,pe/f,x4/10,pd/g,x6/14,ph/p,x5/13,s3,x15/1,s14,x7/2,pb/a,x4/13,pc/o,x5/6,s10,x12/15,pe/j,x4/6,s15,x9/13,s10,pg/h,x3/11,s8,x9/6,s11,x0/12,pm/a,s2,x2/7,s13,x11/12,s5,x2/13,s8,x5/14,s3,x3/13,s6,x4/6,pe/o,x3/10,pm/g,x0/12,s8,x8/9,s9,x13/14,s5,x8/3,s11,x5/7,pk/d,x14/6,s10,x4/1,s9,x7/12,s9,x9/3,pm/p,x15/10,s11,x6/0,s3,x8/2,pg/l,x6/7,pf/a,s10,pi/e,s3,x4/0,s12,x13/3,s1,x2/5,pm/b,x0/9,s8,x15/4,s9,x11/3,pe/j,x7/2,s4,x13/0,s10,x11/6,pa/p,x3/4,pf/o,x10/1,s2,x12/6,pd/a,x9/1,pg/e,x0/13,s4,x14/10,s12,x13/1,pk/p,s11,x6/9,s9,x12/11,pf/e,x3/0,ph/g,x12/2,pf/m,x3/15,pk/n,x1/10,pc/d,s13,x7/3,s11,x2/8,s2,x1/12,pg/n,x14/9,pm/h,x6/1,s11,pk/p,x5/3,s13,x8/10,s10,x9/5,s2,x3/15,s9,x8/9,s12,x4/10,s1,x2/8,s1,x12/3,pl/g,x5/7,pa/j,x3/4,s12,x8/2,s2,x0/4,pk/d,s9,x8/12,po/f,x7/3,pi/p,x15/1,s10,x14/2,s9,x13/12,s11,x9/7,s7,x1/3,pj/a,x8/14,s15,x10/12,pg/f,x9/11,s9,x7/3,pp/c,x2/1,pm/l,x9/14,po/k,x12/8,s11,x1/15,s6,x8/12,pl/m,x6/3,s2,x2/0,s7,x4/9,s9,x1/10,pj/n,x11/13,pd/b,x9/8,s12,pc/m,x14/15,pf/p,x8/11,s14,x3/13,s12,x6/2,s15,x7/13,pm/j,x3/6,s9,x10/5,s7,x2/4,s12,x14/9,po/d,x8/10,s12,x14/4,s10,x7/13,s10,x1/8,s4,x10/4,pa/g,x2/14,s8,x6/11,pi/d,x3/0,s13,x5/10,pj/l,x15/13,s10,pa/f,x1/2,pb/e,s10,x14/6,s5,x3/5,pm/g,x4/1,pn/p,x2/14,s4,x12/15,s12,x7/13,s1,x11/3,pg/l,x8/1,s8,x7/6,pk/d,s11,x5/11,s14,x10/2,pp/e,x6/4,pd/m,x0/15,pj/o,x4/7,s2,x10/8,s1,x14/2,s10,x11/12,s9,x6/4,s9,x9/15,s4,x10/13,ph/p,x0/1,pa/g,s3,x4/3,pf/k,x14/0,pe/j,x10/13,s7,x9/2,s4,x3/5,s8,x12/1,pa/p,x10/2,pn/d,x8/5,s13,x13/4,s7,x2/3,pi/b,x8/4,pp/k,s1,x9/2,pd/e,s5,x8/7,s3,x11/12,po/j,x0/15,pk/m,x1/6,po/f,x11/3,s1,x8/9,pa/j,x12/5,pb/k,s9,x14/15,s6,x6/12,s8,x1/11,s6,x3/12,pd/e,x5/0,po/h,x11/4,s13,x14/7,s11,x5/3,s8,x12/2,s10,x15/5,s13,x3/14,s1,x11/1,s3,x13/5,s7,x8/0,s13,x4/6,s15,x7/11,s1,x15/3,s13,x4/7,pe/k,s3,x11/6,pn/j,x10/0,pp/l,s13,x7/1,s1,x0/11,pb/g,x1/8,s3,x15/3,s5,x2/13,pf/m,x15/1,s13,x0/13,pd/i,s4,x10/4,pa/n,s6 diff --git a/src/main/resources/2017/day17.txt b/src/main/resources/2017/day17.txt new file mode 100644 index 00000000..9346fabb --- /dev/null +++ b/src/main/resources/2017/day17.txt @@ -0,0 +1 @@ +314 diff --git a/src/main/resources/2017/day18.txt b/src/main/resources/2017/day18.txt new file mode 100644 index 00000000..20386caa --- /dev/null +++ b/src/main/resources/2017/day18.txt @@ -0,0 +1,41 @@ +set i 31 +set a 1 +mul p 17 +jgz p p +mul a 2 +add i -1 +jgz i -2 +add a -1 +set i 127 +set p 464 +mul p 8505 +mod p a +mul p 129749 +add p 12345 +mod p a +set b p +mod b 10000 +snd b +add i -1 +jgz i -9 +jgz a 3 +rcv b +jgz b -1 +set f 0 +set i 126 +rcv a +rcv b +set p a +mul p -1 +add p b +jgz p 4 +snd a +set a b +jgz 1 3 +snd b +set f 1 +add i -1 +jgz i -11 +snd a +jgz f -16 +jgz a -19 diff --git a/src/main/resources/2017/day19.txt b/src/main/resources/2017/day19.txt new file mode 100644 index 00000000..925ae881 --- /dev/null +++ b/src/main/resources/2017/day19.txt @@ -0,0 +1,201 @@ + | + +-+ +---+ +---+ +-----------------------------------------|---+ +---+ +-------------------------------------+ +-------------------+ + | | | | | | | | | | | | | | | + +-------------------|-------|-------------+ +---|-------------------------------+ | +---------------------------------+ | | | + | | | | | | | | | | | | | | | | | | | + | | | | +---|---|---|---------|---------------------+ | | | | | | +---+ | | | | + D | | | | | | | | | | | | | | | | | | | | + | | | | +---|---+ | +---|-------------+ | +-+ +-|---|---------------------------|---------------------+ | | | | | | +---------+ | + | | | | | | | | | | | | | | | | | | | | | | | | | | | + | +-|---------|---|-------+ | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | + | +-|---------|---------------|-----|---|---------------------|---|-----|---|--------------------F------------------------------+ +-----------------+ | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | + | +-|-----+ | | +-|---|---|-----|---|---------------------|-------|---------------------------------------------+ | | | | | | | +-+ +---------+ | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | +-|-------------------------|---------+ | +-------------------|-----------|-----|---+ +-------------+ +-+ | | +-----------+ | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | +---|---|-----|-----------------------------+ | | | | | | | +-|---|-+ | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | +-------|-|-------|---|-|---|-------------|-----------|---------|---------------------------|---------+ | +---+ | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | +---------|-|-|-------+ | | | | | +-------|-----------------|-------------------|---------|-|-----------------|-|---------|-|---|-----------------+ | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | +---------------|-----------------------+ | | | | | | | | | | +-|---|-|-----------|-|-------|-------|---------|-+ + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | +-----+ | | | +-----------|-----------------|---|-|-----------------------|-----------------------------|-------------------|-------------|-------------------|-------|-----+ | | +-+ + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | +-----------------------------------|-|---+ +-+ +-----|---------------------------|-----------|-----------------|-|-----------------------------|-|-|-----------|-|-------|-+ | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | +-+ | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | +-|-------------------------|-|-------+ | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | +-------|-|-|-----------|-----|-+ | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | +-+ | | | +-----+ | +---|---|-----------------|-|---|---|-------|-------|-------------------|---------------------------+ | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | +-----------------------+ | | +---------|-----------|---------+ | | | | +---|---------+ | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | J | | | | | | | | | + | +---|-|-----|-------+ | | | | | | | +-+ | | | | | | | +-|-----------|---------------|---------------|-----------------------------|-------+ | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | +-------|-------------------------+ | | | | | | | | | | | | | | | +---+ +-----|-|-----+ | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | +---|---+ +---------------------------------+ +-----|---|-------|---|-------------------|-|---|-----+ | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | +---|-------|-|---|-|-------|-------|---|-----------------------|-------------------|-----------|-----------------|-----------------|---------------|---|-----------------|-----------+ | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +-------------|-----|-------------------|-----+ | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +-----|---|-|-----------|-+ | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | +---------------|-|-------------------|-------------------|-------|-|-----------------------------------|---|---+ | | +-|---------------------|---|-+ | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | +---+ | | | | | | | | | | | | | | | | | | | | | | +-|-|---|---|-----|-------|---|-------------+ | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | +-|---------|---|---------+ | | | | +---------|-----------|-------------------|-|-----------------------|-----------|-------|-|-------|---|-------|-------+ | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | +---------|-|-------------+ | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | +---------|---------------------|-------------------|---------|-----------|-------|-|---------|-------------------|-----|---+ +---|-----|-|-|-+ +-------+ | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | +---------|-|-------|-|-----------------|-----------|---------|---------------------------------------------|-----------|-----------|-----+ | | | +-|-+ | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | +-------------|-----+ | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +---------------+ | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | +-|-----+ +-------|-|-|-|-----|-----|-------|---|---------------------+ | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | +-------------|-|---------------------------|-|-----|-----|-----|-----+ | | | | +-|-+ | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | +-------|-------------------|-|-----------------------|---|-|-----|-------------------|-------|-------------------|---|---------------+ | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | +---------------|-------------------------|---|-|-----|-----------|-------|-|-|-+ | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | +-|---|-----------|-|---|-----------|---|-|-----------|-|-------|-----|-----|-------|-|---------|-----------------|-|-----|-----|-------------|-----------|---|-------|-+ | | +---------+ | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | +-----|-------------------------------|-|---------+ | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | +-------------|-------------------------|-----|-----|-----|---------------|-|-|-|---|---|-------|---|---|-----------+ | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | +-|-------|-|---|---|-----------+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | +-----|---|-----------|-|---------|---|-------|---------------------------------|-----|-------------------------|-|-|-|-|---|---|---------|-----|-----------|-----+ | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + +-----|-|-----|-----------------------|-----|---|-----|-|-|-------------------|-------|-------------------------|---|-|-----------|-----|---+ | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | +---------|---|-|-+ | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + +---|-----------|-|-|-------|---+ | | | +-------|-+ | | | | | | | | | | | | | | +---|-|---|---|---|-----+ | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + +---+ | | | | | | | | | +-+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | +---+ | +-|-----|---|-|-----|---------------------|-|---------------------|---------|-----------------------|---|-------|-----------|-------|-|---------|-----------|-------|-------+ | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | +---|-----|-|-------|-|---------------|-|-----------|---------+ | +-------|-|-------------|-------------|-------|-----|-----|-+ | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | +-----------|---+ | | | | | | | | | | | +-|---------|---|-------|-----|-----|-|---|-|-|---|-------------------|-|-------------+ | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | +-------|---------|-------------|-----------------------------|---------------|---------------------|-----------|-|-|-|-|-|-|-----------|-|-----|-----------+ +-|-+ | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | +---|---------------------|-|-------------|---------------+ +-----------|-----------|---|-|-|---|-----|---------|-|-|-|-|-|---------------+ | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + +-|-----|-----|-----------|---------------|-|---------|-|-------------|---------+ +-----------|-|---------|-----|-|---------|-----|-|---|-------|-|-----------------|-----|-----------|-|-+ | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | +-------|---------|-|-------------|-----------------------------|---+ | +-|-|---------------|-----|-------|-|---+ | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | +-|-----+ | | | | | | | | | +---|-----------------------------|-----------------|-|---------------|---------------------+ | | | | | | | | | +-+ | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +-----+ | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | +-|---------|-----+ | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | +-----------+ | | | | | | | | | | | | | | | | | | | +-|-------+ | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | +---+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | +-------|-------------|--------------O----|-|---------------------------|-------|-|---|-|-|-------+ | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | +-|-+ | | | | | +-----|-------+ | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | +-|-----------------------|---------+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | +---|-------------------------------+ | | +-----|-----------|-----------------|-----|-+ | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | +---|-------------------------------------|---|-----|---|---|-|-|-----------+ | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | +-----------|---------|---|-------|-------------|---------------|---|---|-------|-------|---------|-----------|-|---|---|-|-|-+ | | | | +-|-----------|-+ | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | +-|-------------------------|---------------|-------|---------------|-------+ | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | +---------|---------|---------|-+ | | | | | +-|-------------------|-----------|-------|-------|-|-------|---|---|-|---|---|---+ | | | | | | | | | | | + | | | | | | U | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + +-|---+ | | +---------|---|---------|-------+ | | | | | | | | +-----------+ +---|---------------------------------|-----|-----------------|-----------------|-----------|-+ | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | +-|-------|-------------|-|---+ | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | +-------------------|-----|-|-------|-|---|-------------------|-|---------------|-|---------------------|---|-------------+ | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | +-----------|---------+ | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | +-|-|-|-------|-----|---+ +---|-+ +---|-----|-----------------------|---|-------------------------|-----------|---|-|-----------|-|-------|-+ | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | +---+ | | | +-|-----------|-------------|---------------|-|-------------|---------------|-----------+ | | +-+ | +-------|-------------+ | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + +-|-----|-|---|-----------|---------|-|---|-----------|---|-------|-------------|---------------|-----+ | | | | +-|-+ | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | +-----|-------|---|---|-----+ | | | | +-|---|---------------------------|-----------+ | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | +-------|-----|-----|---|---------|-------------|-----------|-|-|---|---------|-----|---------|---------+ | | | | | | | | | +-----------------------------+ | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | +---|---------|-----|---------+ | +-|--------------T------|-|---|---------|-----+ +-------|-----------|---|-----------|-----------|-+ | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + +-|---|-------|-----------|---------|-----------------|-----------|---------------|---|-------------------------|-------|-----|---|-----------+ | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | +-|-|-------------|-----+ +---|-------+ +-+ | | | +-------|-----------|---------|-------|---------|---------|-+ | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + +---------+ | | | | | | | | | | | | | | | | | | +-----------|-------------|-+ | | +-------|-------|-------------------------|-+ + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + +-+ | | | | | | | | | | | | | | | | | | | | +---------|---|---|---------|-|-|-----------------------+ | +-------|-+ +-+ + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | +---+ | | | | +-|---------------------|-|-------------|-----|-----------------------|-----|---------------------|-------+ | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | +-|---------|---------------|-----+ | | | +-------------------|-----|-----+ +-------|---|---|-|---------|---------|---------------|-|-+ | | + | | | | | | | | | | | | | | | R | | | | | | | | | | | | | | | | | + | | | | | | | | +---------------------------|-----|-------------|-----------|-----------------|-|---|-----------|-------|-----------------|-|---------------|---------+ + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | +-|-------|---------|---------------------------|---|-------|-------------------|---------|-------------------------+ +---|-+ +---|-+ | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + +-------|-------|---------|---------------------------------------|---------|-----|-------------------|-+ | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | +-------------------------------------------|-+ +-----+ | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | +-----------------------------+ | +-------+ +-|---+ | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | + | +-------|---------|-----------|---------+ +---|---+ | | | | +-------+ | | +-------|---+ | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | + +---------------|-------------------------|-------|---|---|---------------------|-|---+ +-----------|A------------------------------|-----------+ | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | + | | | +-|-----------------------+ | +-----------------|---+ +---------------------------------------+ | | +-+ +-------------------------+ | | | | + | | | | | | | | | | | | | | | | | + +---+ +---+ | | | +-------------------|---------------------------------------------------------------------------+ | | | | | | | + | | | | | | | | | | | | | | | | | + +-----------+ | | | | | | | +-----------------------------------------+ | +-|-------------------------------------------+ + | | | | | | | | | | | | | | | | | + +-+ | +---------|-------+ | | +---------------------------------------------------------------+ +-----------------------------------------------------------------+ + | | | | | | | | | | | + Q-+ +---------------+ +-----------+ +---------------------------------------------------------------------------------------------------------------+ +-+ +---------------+ + diff --git a/src/main/resources/2017/day2.txt b/src/main/resources/2017/day2.txt new file mode 100644 index 00000000..ce281f3c --- /dev/null +++ b/src/main/resources/2017/day2.txt @@ -0,0 +1,16 @@ +5806 6444 1281 38 267 1835 223 4912 5995 230 4395 2986 6048 4719 216 1201 +74 127 226 84 174 280 94 159 198 305 124 106 205 99 177 294 +1332 52 54 655 56 170 843 707 1273 1163 89 23 43 1300 1383 1229 +5653 236 1944 3807 5356 246 222 1999 4872 206 5265 5397 5220 5538 286 917 +3512 3132 2826 3664 2814 549 3408 3384 142 120 160 114 1395 2074 1816 2357 +100 2000 112 103 2122 113 92 522 1650 929 1281 2286 2259 1068 1089 651 +646 490 297 60 424 234 48 491 245 523 229 189 174 627 441 598 +2321 555 2413 2378 157 27 194 2512 117 140 2287 277 2635 1374 1496 1698 +101 1177 104 89 542 2033 1724 1197 474 1041 1803 770 87 1869 1183 553 +1393 92 105 1395 1000 85 391 1360 1529 1367 1063 688 642 102 999 638 +4627 223 188 5529 2406 4980 2384 2024 4610 279 249 2331 4660 4350 3264 242 +769 779 502 75 1105 53 55 931 1056 1195 65 292 1234 1164 678 1032 +2554 75 4406 484 2285 226 5666 245 4972 3739 5185 1543 230 236 3621 5387 +826 4028 4274 163 5303 4610 145 5779 157 4994 5053 186 5060 3082 2186 4882 +588 345 67 286 743 54 802 776 29 44 107 63 303 372 41 810 +128 2088 3422 111 3312 740 3024 1946 920 131 112 477 3386 2392 1108 2741 diff --git a/src/main/resources/2017/day20.txt b/src/main/resources/2017/day20.txt new file mode 100644 index 00000000..6f99fed7 --- /dev/null +++ b/src/main/resources/2017/day20.txt @@ -0,0 +1,1000 @@ +p=<-1021,-2406,1428>, v=<11,24,-73>, a=<4,9,0> +p=<-181,-26,548>, v=<11,73,-8>, a=<0,-7,-2> +p=<-2101,-2706,-1112>, v=<-19,-66,75>, a=<12,19,-2> +p=<-1221,-16,-1412>, v=<0,-1,-15>, a=<6,0,8> +p=<1009,-716,-1062>, v=<-164,55,125>, a=<11,-2,-7> +p=<-671,1794,-1062>, v=<46,87,41>, a=<-1,-17,1> +p=<255,-544,641>, v=<-21,93,-83>, a=<-1,-7,4> +p=<-945,-1004,-29>, v=<88,106,-38>, a=<1,-1,8> +p=<-1045,-644,-949>, v=<76,114,98>, a=<5,-9,0> +p=<640,956,741>, v=<-21,-79,-49>, a=<-8,-3,-4> +p=<230,461,-54>, v=<-35,-46,-8>, a=<2,0,3> +p=<-250,596,-354>, v=<-31,-87,-22>, a=<10,5,11> +p=<815,-779,-1364>, v=<-22,78,134>, a=<-11,0,1> +p=<-175,841,-459>, v=<55,-84,93>, a=<-7,0,-8> +p=<349,-2471,-1471>, v=<-29,111,4>, a=<1,3,8> +p=<-443,2236,5>, v=<53,-46,17>, a=<-3,-8,-2> +p=<-1658,634,20>, v=<149,5,-92>, a=<-3,-8,13> +p=<786,-822,-175>, v=<17,131,-7>, a=<-11,-10,3> +p=<-1151,1323,-84>, v=<-9,-118,35>, a=<14,2,-4> +p=<1163,-237,-578>, v=<-117,93,24>, a=<4,-11,3> +p=<1273,28,-590>, v=<-105,-68,57>, a=<-2,11,0> +p=<-1400,-170,-678>, v=<108,52,35>, a=<3,-6,5> +p=<1504,-720,-1767>, v=<-144,0,80>, a=<1,11,14> +p=<624,622,-1206>, v=<-64,-20,59>, a=<1,-6,9> +p=<-102,-412,1258>, v=<14,38,-63>, a=<-1,0,-8> +p=<-1477,-390,488>, v=<79,102,31>, a=<9,-11,-12> +p=<5988,-431,13>, v=<-177,-45,62>, a=<-6,5,-5> +p=<4236,853,1285>, v=<-54,-11,109>, a=<-10,-2,-13> +p=<1248,-755,1921>, v=<-42,81,-30>, a=<-1,-4,-4> +p=<-3756,-1103,-1391>, v=<54,-17,58>, a=<8,5,0> +p=<-4296,-215,1249>, v=<-36,-29,-2>, a=<17,3,-4> +p=<-2088,-2183,2257>, v=<72,3,-44>, a=<1,7,-4> +p=<348,3397,-3599>, v=<-42,-117,0>, a=<2,-2,12> +p=<-1416,4645,-407>, v=<44,-44,-83>, a=<1,-12,8> +p=<-2700,2065,-11>, v=<85,26,88>, a=<2,-9,-7> +p=<4572,4273,601>, v=<-93,-91,-50>, a=<-8,-7,2> +p=<6937,1685,-3884>, v=<-121,-76,16>, a=<-17,0,14> +p=<722,288,-2267>, v=<-34,-93,92>, a=<0,7,1> +p=<5001,112,3310>, v=<-102,53,-58>, a=<-11,-5,-8> +p=<-686,-4882,76>, v=<7,96,20>, a=<2,11,-2> +p=<-3260,-3958,384>, v=<32,54,-132>, a=<10,11,10> +p=<84,1894,3046>, v=<110,-28,-92>, a=<-10,-5,-4> +p=<2592,-2814,1946>, v=<-50,48,-88>, a=<-6,7,0> +p=<-213,-1571,-3257>, v=<43,-43,-1>, a=<-3,10,13> +p=<524,2169,1462>, v=<-2,-98,-66>, a=<-2,0,0> +p=<-1885,-2781,1506>, v=<73,127,-45>, a=<1,0,-2> +p=<-996,3744,-5856>, v=<-150,-41,96>, a=<9,-3,3> +p=<-1794,1483,13030>, v=<-12,-40,-128>, a=<3,0,-11> +p=<-10230,4485,5848>, v=<93,-2,-17>, a=<9,-6,-7> +p=<420,1686,-809>, v=<-23,-136,93>, a=<0,4,-5> +p=<-2351,-4485,-2475>, v=<131,164,110>, a=<1,11,4> +p=<2392,-2853,3985>, v=<-121,86,-126>, a=<-2,9,-12> +p=<437,632,-2356>, v=<-186,-2,85>, a=<18,-4,6> +p=<2817,-2054,1129>, v=<-83,12,-48>, a=<-9,12,-2> +p=<-1122,1614,2284>, v=<108,-33,-86>, a=<-5,-6,-4> +p=<-1140,-4209,295>, v=<-5,167,34>, a=<7,7,-5> +p=<-1671,-2589,-3872>, v=<34,39,142>, a=<6,11,8> +p=<-708,-1725,-38>, v=<-10,-9,-33>, a=<5,11,4> +p=<147,399,3715>, v=<9,-32,-118>, a=<-2,1,-9> +p=<1785,-384,997>, v=<-63,97,-43>, a=<-4,-8,-1> +p=<-1302,-132,1996>, v=<99,-12,44>, a=<-3,2,-16> +p=<2541,-1203,1069>, v=<66,0,-66>, a=<-22,7,1> +p=<435,1713,1771>, v=<-7,-124,-10>, a=<-2,3,-9> +p=<-2698,-5379,-1198>, v=<35,70,-43>, a=<2,4,4> +p=<-7619,-717,3279>, v=<73,39,83>, a=<7,-1,-9> +p=<-484,-2306,-875>, v=<-43,65,6>, a=<8,8,5> +p=<-1147,1383,-2388>, v=<-4,-80,23>, a=<8,0,13> +p=<-212,-4618,2848>, v=<49,147,-15>, a=<-4,14,-17> +p=<2151,-402,4089>, v=<-72,70,-97>, a=<-6,-5,-16> +p=<2695,3661,1998>, v=<-86,-133,-82>, a=<-8,-9,-4> +p=<1981,992,1284>, v=<19,-48,-49>, a=<-15,-1,-3> +p=<2151,1740,366>, v=<-54,-38,-103>, a=<-8,-7,9> +p=<2661,1961,-824>, v=<-111,-6,-24>, a=<-5,-12,8> +p=<-1167,977,-542>, v=<-13,-25,-43>, a=<8,-3,8> +p=<660,950,-605>, v=<-86,-71,27>, a=<5,2,1> +p=<-1419,1229,-1244>, v=<20,-115,91>, a=<6,5,-2> +p=<-1851,-85,2518>, v=<44,91,-61>, a=<6,-9,-8> +p=<-1261,4127,-1342>, v=<-43,-148,-12>, a=<6,0,4> +p=<-323,-8711,-1202>, v=<-4,122,-17>, a=<1,13,4> +p=<-4355,3693,2732>, v=<24,-60,-85>, a=<9,-5,-1> +p=<1553,-2551,-376>, v=<-71,18,55>, a=<1,5,-3> +p=<1175,1621,3054>, v=<15,-44,5>, a=<-4,-1,-8> +p=<-771,-3783,72>, v=<41,4,-48>, a=<-1,9,3> +p=<-561,-2929,-992>, v=<19,-12,-10>, a=<0,8,3> +p=<-5321,81,618>, v=<44,98,-53>, a=<10,-7,2> +p=<-1361,-1168,-1743>, v=<106,60,62>, a=<0,4,10> +p=<-438,-1051,-1028>, v=<0,72,42>, a=<5,1,5> +p=<-1348,41,-1>, v=<91,-75,19>, a=<2,10,-3> +p=<-477,769,1052>, v=<24,-47,-69>, a=<2,-2,-2> +p=<-919,-388,-781>, v=<72,7,30>, a=<0,3,4> +p=<-633,-336,675>, v=<106,-18,-19>, a=<-8,6,-5> +p=<-230,-271,259>, v=<5,19,-29>, a=<2,0,1> +p=<1408,-349,-612>, v=<-44,46,-32>, a=<-9,-3,11> +p=<-1452,847,-1262>, v=<113,-18,46>, a=<0,-7,7> +p=<91,-1183,-4776>, v=<15,-69,89>, a=<-1,6,3> +p=<-7763,5209,2551>, v=<106,-82,-74>, a=<7,-4,0> +p=<-3275,4903,-1614>, v=<79,67,-144>, a=<1,-12,11> +p=<-1388,-3495,-2617>, v=<-134,104,78>, a=<10,0,0> +p=<-5672,-3801,-662>, v=<62,8,3>, a=<6,6,1> +p=<1035,-5126,-1612>, v=<-67,50,-126>, a=<2,11,14> +p=<580,-615,1924>, v=<-63,-83,-46>, a=<3,8,-2> +p=<2049,1101,3055>, v=<-25,13,-49>, a=<-4,-4,-5> +p=<5091,-1187,-156>, v=<-115,-7,7>, a=<-6,4,0> +p=<-18,-4398,-2821>, v=<-40,-5,96>, a=<3,13,1> +p=<-486,3285,-5473>, v=<59,-44,144>, a=<-3,-6,5> +p=<-2462,1309,923>, v=<-54,-49,6>, a=<11,0,-3> +p=<320,4533,-3913>, v=<-53,-65,84>, a=<3,-8,5> +p=<3180,1153,6487>, v=<26,-16,-100>, a=<-11,-2,-11> +p=<-581,-3794,236>, v=<-43,72,19>, a=<7,11,-3> +p=<-1231,-2234,1536>, v=<-126,36,-25>, a=<18,7,-5> +p=<-2001,2066,1196>, v=<112,-95,-71>, a=<-1,-1,1> +p=<1719,-2804,3646>, v=<-32,33,-36>, a=<-5,10,-14> +p=<-41,1856,866>, v=<14,31,40>, a=<-1,-12,-8> +p=<-3241,-354,-3044>, v=<111,26,183>, a=<5,-1,-3> +p=<549,-1024,-2094>, v=<-110,49,146>, a=<8,0,-4> +p=<6554,-2720,-1361>, v=<-73,-47,28>, a=<-8,8,1> +p=<-2966,1552,4415>, v=<43,-98,95>, a=<3,3,-14> +p=<-870,-1840,-10081>, v=<-105,8,119>, a=<8,3,12> +p=<-118,1168,863>, v=<-13,46,-25>, a=<1,-5,0> +p=<-12374,1200,4303>, v=<106,12,82>, a=<17,-3,-13> +p=<-5974,-3440,10463>, v=<-28,58,-94>, a=<13,3,-14> +p=<3418,4384,-2673>, v=<-74,28,36>, a=<-2,-10,3> +p=<1322,2208,-1889>, v=<-25,-3,61>, a=<-1,-4,0> +p=<3114,6272,-3569>, v=<18,2,64>, a=<-7,-12,3> +p=<-2617,-3668,-2074>, v=<205,-99,-101>, a=<-7,10,8> +p=<-4707,1120,12290>, v=<65,9,-11>, a=<3,-2,-16> +p=<-7500,-11211,-6729>, v=<-37,41,119>, a=<12,13,3> +p=<4014,-11021,5602>, v=<11,153,48>, a=<-6,7,-10> +p=<1354,-1578,-3423>, v=<81,2,-85>, a=<-6,2,9> +p=<9714,-2167,-1770>, v=<-22,-41,8>, a=<-12,5,2> +p=<-6265,-2376,9022>, v=<67,23,-42>, a=<5,2,-10> +p=<4432,-115,-6938>, v=<-117,-95,-51>, a=<0,5,12> +p=<394,4626,3880>, v=<1,-184,-16>, a=<-1,1,-9> +p=<6847,1062,-2654>, v=<-196,46,-68>, a=<-4,-6,12> +p=<637,2034,-3113>, v=<-50,-172,117>, a=<2,7,0> +p=<-6049,-10384,-3497>, v=<46,69,-38>, a=<10,18,10> +p=<-8554,6566,88>, v=<21,-217,-49>, a=<17,0,3> +p=<-5239,-1084,-1997>, v=<-74,69,5>, a=<16,-2,4> +p=<1301,-3604,-3527>, v=<-106,-33,-37>, a=<4,10,10> +p=<-379,5021,943>, v=<12,5,62>, a=<0,-11,-6> +p=<-319,2486,1423>, v=<10,12,-47>, a=<0,-6,0> +p=<-3034,1346,-1607>, v=<-70,-43,23>, a=<11,0,2> +p=<-3004,-1063,-3803>, v=<7,110,-8>, a=<7,-5,10> +p=<5172,2423,-1535>, v=<-24,0,-2>, a=<-11,-6,4> +p=<-4502,71,-1437>, v=<162,-3,38>, a=<0,0,1> +p=<-6952,687,-1871>, v=<32,-83,-48>, a=<15,4,8> +p=<4000,4104,-2139>, v=<129,-58,-99>, a=<-17,-5,11> +p=<8065,-9456,-8259>, v=<-22,84,-19>, a=<-16,15,19> +p=<-10007,-68,2480>, v=<34,-45,32>, a=<18,3,-7> +p=<1866,10937,7440>, v=<-61,-96,48>, a=<0,-16,-18> +p=<595,3001,6510>, v=<-148,32,-34>, a=<8,-8,-11> +p=<6020,-5710,5022>, v=<-3,41,-98>, a=<-12,9,-4> +p=<1618,-6175,930>, v=<-69,24,-30>, a=<1,11,0> +p=<694,-14199,-2624>, v=<37,135,-93>, a=<-3,14,9> +p=<-5948,-2787,-5324>, v=<18,3,-18>, a=<8,4,9> +p=<6922,-4911,2704>, v=<-62,-86,55>, a=<-7,12,-7> +p=<289,-1614,2216>, v=<-15,125,-79>, a=<0,-3,-7> +p=<665,-750,-32>, v=<-13,71,-15>, a=<-3,-3,2> +p=<206,596,-89>, v=<-3,-38,26>, a=<-3,-3,-3> +p=<1207,420,395>, v=<-88,-22,0>, a=<-4,-3,-6> +p=<-377,123,417>, v=<2,23,-14>, a=<5,-6,-4> +p=<-190,-867,21>, v=<9,71,-50>, a=<1,1,8> +p=<894,-3318,-9396>, v=<-25,33,44>, a=<0,3,11> +p=<-4767,-10459,-6695>, v=<14,169,9>, a=<6,6,9> +p=<-2954,-8239,1260>, v=<41,128,41>, a=<2,5,-4> +p=<4113,715,-3513>, v=<59,-95,-1>, a=<-9,4,5> +p=<103,9579,2043>, v=<-3,47,54>, a=<0,-17,-6> +p=<1309,6033,-1179>, v=<56,53,88>, a=<-5,-12,-3> +p=<4623,-4737,-3090>, v=<-172,73,86>, a=<-1,9,3> +p=<-1677,-412,4135>, v=<67,17,-73>, a=<0,0,-7> +p=<723,563,410>, v=<-42,-22,50>, a=<1,0,-5> +p=<-2327,-912,-3365>, v=<2,37,-33>, a=<7,0,13> +p=<3598,1138,-3740>, v=<-53,20,86>, a=<-7,-5,5> +p=<323,-2587,-2915>, v=<39,0,66>, a=<-4,8,4> +p=<1448,3513,2235>, v=<-32,-75,-88>, a=<-2,-5,0> +p=<-4527,-2412,-2690>, v=<64,-7,31>, a=<9,8,6> +p=<-327,-2162,-6040>, v=<-78,22,35>, a=<7,5,16> +p=<-4527,2863,3385>, v=<51,-101,22>, a=<10,-1,-12> +p=<-693,-661,-821>, v=<-97,-44,21>, a=<20,12,5> +p=<728,816,-1108>, v=<4,-67,124>, a=<-7,1,-6> +p=<1470,2447,1090>, v=<-64,-101,-78>, a=<-5,-10,0> +p=<1015,431,1818>, v=<-24,-32,-145>, a=<-6,0,2> +p=<511,2068,-2125>, v=<-28,-34,17>, a=<0,-10,12> +p=<-322,-3474,-1683>, v=<120,148,81>, a=<-11,6,2> +p=<18,2102,-323>, v=<-8,-45,10>, a=<1,-9,1> +p=<-1597,912,-357>, v=<132,16,-24>, a=<-4,-8,5> +p=<1225,3122,-918>, v=<-88,-69,54>, a=<2,-13,0> +p=<-1121,1184,1615>, v=<59,-9,-14>, a=<1,-7,-9> +p=<-2807,-2982,46>, v=<78,2,49>, a=<6,14,-5> +p=<83,138,826>, v=<49,-7,-95>, a=<-5,0,5> +p=<-3337,-4542,16>, v=<31,59,-2>, a=<13,16,0> +p=<1083,-562,1226>, v=<-106,28,-31>, a=<5,0,-3> +p=<-1637,-1712,-1284>, v=<-54,180,0>, a=<13,-9,6> +p=<2683,308,3386>, v=<24,-26,-55>, a=<-15,1,-11> +p=<1053,778,-114>, v=<-94,45,36>, a=<4,-8,-3> +p=<-1777,-1532,-2384>, v=<58,108,34>, a=<3,-3,8> +p=<3985,-31,-2486>, v=<-47,-127,0>, a=<-5,8,5> +p=<6465,372,6039>, v=<-63,-44,-67>, a=<-9,2,-8> +p=<5163,1550,3249>, v=<-5,-50,-105>, a=<-10,0,0> +p=<-1688,-3410,-347>, v=<8,30,-5>, a=<3,5,1> +p=<544,-5177,11185>, v=<48,71,-137>, a=<-4,6,-14> +p=<-641,-708,2>, v=<55,38,96>, a=<-2,1,-11> +p=<-521,924,2762>, v=<-29,-47,-119>, a=<7,-1,-6> +p=<9928,-5087,261>, v=<-95,-29,73>, a=<-8,8,-4> +p=<-173,-10469,-6798>, v=<-16,89,134>, a=<1,9,2> +p=<1317,-593,485>, v=<-96,31,7>, a=<1,1,-5> +p=<3012,22,-1435>, v=<-137,30,71>, a=<-8,-4,3> +p=<-873,-758,500>, v=<58,178,-42>, a=<0,-16,1> +p=<-678,-2498,-40>, v=<37,54,-62>, a=<1,14,8> +p=<177,-8,-1150>, v=<-100,24,52>, a=<11,-3,3> +p=<-453,1687,-25>, v=<30,-25,33>, a=<0,-11,-4> +p=<222,-1043,2180>, v=<-39,13,-74>, a=<3,7,-9> +p=<1047,187,2645>, v=<-6,-45,-97>, a=<-8,4,-10> +p=<777,-1403,-1000>, v=<-52,53,66>, a=<0,5,0> +p=<324,780,1066>, v=<-20,-32,-7>, a=<0,-2,-7> +p=<148,196,1450>, v=<-9,-72,-82>, a=<0,7,-1> +p=<1484,1868,466>, v=<-101,-117,39>, a=<1,0,-8> +p=<196,-740,-894>, v=<-46,46,22>, a=<4,0,4> +p=<812,-1660,-1846>, v=<-8,163,107>, a=<-5,-7,1> +p=<412,-1492,186>, v=<-17,93,48>, a=<-1,0,-7> +p=<-308,-1276,914>, v=<62,20,11>, a=<-5,7,-8> +p=<1492,142,-249>, v=<28,5,65>, a=<-16,-2,-6> +p=<1867,-728,-9>, v=<-109,-25,73>, a=<-2,9,-9> +p=<1687,1297,21>, v=<-33,24,-1>, a=<-10,-14,0> +p=<1057,-23,1521>, v=<-79,0,51>, a=<1,0,-19> +p=<2092,442,-1449>, v=<-116,-47,25>, a=<-3,2,9> +p=<2572,922,-3804>, v=<-84,-23,150>, a=<-11,-5,13> +p=<2197,832,306>, v=<-91,-81,12>, a=<-7,3,-4> +p=<919,1669,-1409>, v=<-40,-69,27>, a=<-3,-7,10> +p=<2060,-1313,180>, v=<-99,9,-19>, a=<-6,11,1> +p=<548,1270,-2851>, v=<-21,-108,160>, a=<-2,2,6> +p=<1395,-718,-730>, v=<16,49,31>, a=<-15,0,3> +p=<-36,1770,1658>, v=<-2,-31,-92>, a=<0,-11,-2> +p=<-2616,315,-262>, v=<170,34,76>, a=<0,-7,-7> +p=<-771,-285,443>, v=<23,-22,-27>, a=<3,5,0> +p=<-276,-1095,83>, v=<-2,48,-91>, a=<2,3,11> +p=<1503,1767,-7081>, v=<51,-21,155>, a=<-6,-2,4> +p=<-2897,279,855>, v=<40,108,72>, a=<3,-7,-6> +p=<-3547,-7946,5832>, v=<6,-20,42>, a=<5,13,-11> +p=<5579,5266,2214>, v=<-81,-91,-24>, a=<-4,-3,-2> +p=<-452,181,-8175>, v=<13,-23,154>, a=<0,1,5> +p=<-5858,-10478,4031>, v=<172,133,145>, a=<0,10,-15> +p=<-1064,4210,-2565>, v=<-4,-19,-11>, a=<2,-6,5> +p=<2676,-2845,3674>, v=<26,-39,-107>, a=<-6,7,0> +p=<9000,62,6309>, v=<-90,-72,8>, a=<-10,4,-11> +p=<-3597,5876,-5744>, v=<123,2,-40>, a=<-1,-10,12> +p=<6161,-1655,-7784>, v=<11,-109,20>, a=<-11,9,12> +p=<925,-584,-1528>, v=<-45,52,46>, a=<1,-2,0> +p=<5396,-5548,4660>, v=<-54,58,-66>, a=<-6,6,-4> +p=<1796,-8375,-1230>, v=<-81,83,44>, a=<1,15,0> +p=<1012,-8683,5350>, v=<-53,123,12>, a=<1,13,-14> +p=<1796,2125,2928>, v=<-110,56,26>, a=<3,-9,-9> +p=<632,-10146,994>, v=<50,73,7>, a=<-5,20,-3> +p=<-124,298,-1568>, v=<19,-10,84>, a=<-1,0,-2> +p=<-4464,1880,308>, v=<58,-23,17>, a=<7,-3,-2> +p=<58,-2838,8988>, v=<-118,44,-177>, a=<8,4,-10> +p=<5956,-490,530>, v=<-152,-15,-96>, a=<-3,2,5> +p=<841,-3805,1550>, v=<96,-13,25>, a=<-8,9,-5> +p=<-3569,1355,2105>, v=<-98,32,-71>, a=<14,-5,0> +p=<2431,1610,1265>, v=<-81,-54,81>, a=<0,0,-8> +p=<646,-6310,-7000>, v=<-68,24,0>, a=<3,12,15> +p=<-734,815,3095>, v=<71,50,-42>, a=<-3,-5,-4> +p=<1311,-524,1013>, v=<-19,26,-99>, a=<-17,4,1> +p=<1377,15,177>, v=<-73,-5,-5>, a=<-9,1,-2> +p=<970,-172,991>, v=<-90,-18,-91>, a=<0,6,0> +p=<-1109,103,408>, v=<51,-73,-38>, a=<8,11,0> +p=<-218,-7,397>, v=<36,-9,-31>, a=<-3,2,-1> +p=<1465,-821,-593>, v=<-63,35,83>, a=<-12,7,-5> +p=<64,-474,785>, v=<-62,51,-69>, a=<8,-2,1> +p=<-1288,-851,-1438>, v=<119,3,102>, a=<-3,9,1> +p=<-937,1203,-1139>, v=<-13,-22,37>, a=<12,-10,7> +p=<129,436,-853>, v=<-123,-33,-6>, a=<16,0,10> +p=<1403,-1644,408>, v=<-60,127,2>, a=<-7,0,-5> +p=<-313,-1306,-723>, v=<-103,94,54>, a=<18,1,0> +p=<-14,371,629>, v=<14,-7,-22>, a=<-2,-3,-4> +p=<-2,1154,-6362>, v=<-78,86,148>, a=<4,-6,1> +p=<1480,1439,-6457>, v=<39,-97,14>, a=<-4,3,8> +p=<-3285,-3050,1237>, v=<139,125,0>, a=<0,0,-4> +p=<5475,2230,3001>, v=<-51,-120,-111>, a=<-14,2,-1> +p=<-1197,-3626,373>, v=<2,49,-64>, a=<4,8,4> +p=<-1617,190,-5975>, v=<82,-10,88>, a=<-1,0,13> +p=<675,3898,-6179>, v=<-1,-102,84>, a=<-2,-5,14> +p=<617,2333,2796>, v=<-72,-24,-158>, a=<4,-11,0> +p=<329,-763,3363>, v=<-18,110,-180>, a=<0,-7,-1> +p=<338,677,654>, v=<-28,-8,37>, a=<1,-3,-8> +p=<-2551,-313,-1767>, v=<28,-48,86>, a=<12,7,1> +p=<-3154,452,-1596>, v=<147,33,86>, a=<3,-6,0> +p=<104,1226,906>, v=<118,-29,-34>, a=<-13,-4,-2> +p=<-895,4691,753>, v=<-26,-98,41>, a=<8,-17,-9> +p=<320,-466,-507>, v=<68,27,-3>, a=<-9,0,3> +p=<-1102,-1618,-1965>, v=<-62,91,97>, a=<13,0,1> +p=<2849,1037,4587>, v=<-101,29,-210>, a=<-6,-9,-5> +p=<3362,-144,329>, v=<-126,-53,14>, a=<-8,7,-4> +p=<421,2372,-2391>, v=<-70,-66,66>, a=<5,-8,8> +p=<1781,-858,1417>, v=<-15,61,-95>, a=<-10,-1,1> +p=<319,-586,-1286>, v=<-100,63,91>, a=<9,-3,-2> +p=<829,859,-623>, v=<-49,59,-65>, a=<0,-12,11> +p=<-786,672,-1065>, v=<82,43,69>, a=<-4,-9,-1> +p=<115,-671,-317>, v=<2,41,25>, a=<-1,0,-1> +p=<591,-1385,3355>, v=<-35,47,-146>, a=<0,4,-6> +p=<438,-2881,-164>, v=<-44,0,7>, a=<2,19,0> +p=<-2622,757,1077>, v=<46,-16,15>, a=<12,-3,-9> +p=<-286,-626,-748>, v=<27,-25,-1>, a=<-1,2,1> +p=<3029,-9791,-3361>, v=<-58,-90,26>, a=<-1,17,3> +p=<-5356,6160,-14437>, v=<57,-39,30>, a=<4,-6,17> +p=<6050,3006,2925>, v=<-112,-144,-25>, a=<-10,2,-7> +p=<4250,2331,3475>, v=<-66,91,-47>, a=<-8,-14,-7> +p=<4064,-4572,1529>, v=<-58,-20,12>, a=<-3,8,-3> +p=<-76,5814,13697>, v=<-91,6,-67>, a=<5,-9,-17> +p=<-152,-192,662>, v=<-84,-59,85>, a=<11,8,-15> +p=<552,128,-1570>, v=<25,-28,46>, a=<-7,2,6> +p=<-2264,-304,4334>, v=<99,16,-221>, a=<5,0,-6> +p=<136,640,1454>, v=<17,-43,10>, a=<-3,0,-12> +p=<-1528,1152,-2378>, v=<70,-160,88>, a=<3,10,7> +p=<-728,1432,-18>, v=<37,-67,0>, a=<1,-3,0> +p=<1724,-224,-2735>, v=<-104,45,71>, a=<3,-2,0> +p=<-1164,-509,-132>, v=<-106,33,-56>, a=<7,-1,3> +p=<-1449,-4233,-3514>, v=<-1,-64,72>, a=<2,9,1> +p=<8127,-2219,4713>, v=<-19,0,31>, a=<-10,3,-8> +p=<-7054,3443,3345>, v=<127,-32,28>, a=<3,-3,-6> +p=<-4394,-14759,8437>, v=<-60,96,-106>, a=<9,15,-6> +p=<-2779,2075,-3913>, v=<73,-35,24>, a=<0,-1,4> +p=<-2141,-6916,851>, v=<88,27,40>, a=<0,21,-6> +p=<3139,3848,3671>, v=<-82,-134,-115>, a=<-4,-2,-3> +p=<1327,-2536,107>, v=<6,32,21>, a=<-5,6,-2> +p=<-3389,-1612,959>, v=<65,6,-27>, a=<6,5,-1> +p=<-1229,-244,3167>, v=<0,-26,-44>, a=<4,3,-7> +p=<1447,-1384,3911>, v=<26,34,-25>, a=<-7,2,-11> +p=<475,860,-1777>, v=<129,78,87>, a=<-12,-9,-1> +p=<1627,-2428,359>, v=<-119,40,-27>, a=<4,5,1> +p=<3211,488,-445>, v=<-60,-19,-31>, a=<-6,0,4> +p=<-1937,824,-2473>, v=<-33,-33,16>, a=<9,0,7> +p=<292,-3241,2398>, v=<-8,108,93>, a=<0,0,-11> +p=<-1568,5159,808>, v=<54,-110,-40>, a=<0,-4,1> +p=<4687,4169,3058>, v=<-46,-108,40>, a=<-7,-2,-9> +p=<7282,-961,-2897>, v=<-148,32,99>, a=<-6,0,0> +p=<-2205,1288,-648>, v=<57,-58,52>, a=<1,1,-2> +p=<-3810,-5357,-2283>, v=<-60,24,29>, a=<12,10,3> +p=<-4485,-3332,4107>, v=<40,3,-60>, a=<7,7,-5> +p=<-570,-4637,-3948>, v=<-13,31,-24>, a=<2,8,10> +p=<7155,673,822>, v=<24,133,-28>, a=<-17,-10,0> +p=<1305,-4037,-1368>, v=<-122,-51,45>, a=<5,12,0> +p=<1200,2773,-633>, v=<-10,-92,5>, a=<-2,0,1> +p=<4155,5713,3492>, v=<0,-4,-86>, a=<-9,-12,-2> +p=<845,-4997,2504>, v=<15,-6,35>, a=<-3,12,-8> +p=<-1185,281,3287>, v=<-35,7,-22>, a=<5,-1,-6> +p=<-2635,2572,561>, v=<90,-42,12>, a=<0,-3,-2> +p=<-2925,1006,1634>, v=<40,-33,-55>, a=<4,0,0> +p=<1381,3639,6097>, v=<-37,21,-5>, a=<0,-6,-8> +p=<89,-5709,-9692>, v=<-42,-6,40>, a=<2,8,11> +p=<12952,3240,-1522>, v=<-166,12,59>, a=<-9,-5,-1> +p=<12458,694,16110>, v=<-75,-116,-93>, a=<-13,5,-17> +p=<-1531,-2207,4330>, v=<97,-46,63>, a=<-3,7,-12> +p=<-3643,-1487,8010>, v=<31,-85,-19>, a=<5,8,-14> +p=<-75,-13119,3066>, v=<68,163,86>, a=<-4,15,-11> +p=<-411,-3647,-86>, v=<29,65,-63>, a=<-1,3,4> +p=<5093,-3807,3370>, v=<-11,-62,27>, a=<-9,11,-8> +p=<-424,633,-2094>, v=<89,-67,115>, a=<-7,3,1> +p=<-2362,-1815,-1414>, v=<104,77,3>, a=<4,3,9> +p=<-1002,2554,-1159>, v=<-30,-63,69>, a=<10,-10,0> +p=<936,-115,-1839>, v=<-54,-23,1>, a=<0,3,12> +p=<-2294,1211,82>, v=<19,-29,-13>, a=<13,-5,1> +p=<1633,-710,626>, v=<-32,3,-27>, a=<-7,4,-1> +p=<-2073,-1628,3261>, v=<123,120,-110>, a=<0,-3,-9> +p=<129,105,1073>, v=<-3,26,-119>, a=<-1,-5,5> +p=<-1623,-1077,-151>, v=<91,92,-43>, a=<7,0,9> +p=<-459,-1413,-2851>, v=<-19,55,182>, a=<9,10,9> +p=<-933,2439,1211>, v=<92,-123,-85>, a=<-2,-12,-2> +p=<-33,63,23>, v=<30,-3,-77>, a=<-4,0,12> +p=<-141,1275,11>, v=<13,-91,-11>, a=<0,-2,2> +p=<-579,-1785,-733>, v=<17,86,64>, a=<5,10,0> +p=<-405,189,-403>, v=<48,58,17>, a=<-2,-11,3> +p=<687,579,185>, v=<-30,-20,7>, a=<-4,-4,-3> +p=<-105,-489,2315>, v=<-16,4,-164>, a=<4,6,-4> +p=<5019,2191,-1557>, v=<-134,-9,25>, a=<-5,-6,3> +p=<2844,1491,1193>, v=<-8,-46,-85>, a=<-8,-1,3> +p=<619,3541,-2282>, v=<29,-76,28>, a=<-4,-5,5> +p=<435,137,1248>, v=<64,-37,-76>, a=<-9,3,1> +p=<-1626,-1609,-120>, v=<-21,3,38>, a=<12,9,-3> +p=<-429,56,726>, v=<55,-4,-9>, a=<-3,0,-3> +p=<-1572,-61,159>, v=<-62,-26,13>, a=<16,3,-2> +p=<-402,848,-498>, v=<-70,-48,97>, a=<10,0,-7> +p=<3278,-120,1704>, v=<26,66,24>, a=<-14,-5,-8> +p=<1185,-4812,1750>, v=<-111,90,58>, a=<5,10,-11> +p=<-4907,-1991,-6006>, v=<29,94,114>, a=<7,-2,4> +p=<-7085,814,4455>, v=<146,-8,-33>, a=<4,-1,-6> +p=<-815,-6446,132>, v=<-44,8,-55>, a=<4,11,3> +p=<-584,2530,-4521>, v=<17,-60,-50>, a=<0,-1,11> +p=<-1630,229,-1067>, v=<105,46,90>, a=<3,-9,-1> +p=<762,-876,-14>, v=<33,61,16>, a=<-13,1,-2> +p=<1269,879,948>, v=<15,10,-128>, a=<-16,-11,8> +p=<6413,-3286,-3895>, v=<-111,76,58>, a=<-4,1,3> +p=<6448,2524,-4105>, v=<68,-90,64>, a=<-14,1,3> +p=<-10562,-6331,-1095>, v=<32,181,-76>, a=<15,0,6> +p=<-6327,7599,3035>, v=<-107,17,-14>, a=<16,-13,-4> +p=<-1672,7809,-2355>, v=<84,-79,-22>, a=<-2,-8,5> +p=<6028,-2551,-6765>, v=<-28,-53,68>, a=<-8,7,7> +p=<-692,-3181,5520>, v=<20,73,77>, a=<0,1,-13> +p=<-1077,482,-1703>, v=<-17,56,80>, a=<10,-10,3> +p=<35,-1510,-4519>, v=<126,70,188>, a=<-15,3,11> +p=<1347,610,-287>, v=<-41,-105,17>, a=<-5,8,0> +p=<5512,5313,6606>, v=<-42,-96,-190>, a=<-5,-2,1> +p=<-1937,-3774,-1701>, v=<-11,17,43>, a=<3,4,0> +p=<-1079,1296,6801>, v=<27,-153,5>, a=<0,6,-9> +p=<1807,-2760,3564>, v=<-47,51,-32>, a=<0,1,-3> +p=<8398,1374,-2598>, v=<-16,-95,46>, a=<-10,3,1> +p=<-1469,3402,1458>, v=<-43,13,2>, a=<4,-5,-2> +p=<3367,8277,11520>, v=<-107,-52,-156>, a=<1,-8,-7> +p=<9607,8160,3018>, v=<-87,71,-78>, a=<-8,-14,0> +p=<884,505,-1467>, v=<-45,95,101>, a=<-2,-17,0> +p=<324,2157,-1264>, v=<-20,-53,34>, a=<0,-13,7> +p=<2361,-1938,-557>, v=<-113,112,21>, a=<-7,4,2> +p=<555,-657,1536>, v=<31,28,-91>, a=<-9,3,-3> +p=<646,988,178>, v=<-58,-67,6>, a=<2,0,-3> +p=<373,-2274,1914>, v=<29,136,-28>, a=<-7,4,-15> +p=<44,1793,262>, v=<45,-117,-15>, a=<-6,-1,-1> +p=<-1620,592,-839>, v=<31,-101,7>, a=<6,7,4> +p=<-1287,1510,-956>, v=<98,-19,137>, a=<-3,-7,-9> +p=<-45,2257,-1730>, v=<-28,-127,-48>, a=<3,0,15> +p=<734,490,2595>, v=<-18,-58,-115>, a=<-4,3,-9> +p=<-582,693,2532>, v=<16,-20,-43>, a=<4,-4,-18> +p=<-463,2387,-100>, v=<45,-126,55>, a=<-1,-6,-6> +p=<-1058,-700,894>, v=<95,12,-61>, a=<-2,5,0> +p=<-78,-2107,-1843>, v=<10,210,82>, a=<0,-8,7> +p=<-302,-1393,257>, v=<26,24,-53>, a=<0,10,5> +p=<776,-2030,54>, v=<-51,62,-1>, a=<0,11,0> +p=<-274,-329,1965>, v=<24,-7,-70>, a=<0,4,-9> +p=<426,189,264>, v=<-11,-89,-16>, a=<-2,10,0> +p=<2505,-742,880>, v=<-62,15,0>, a=<-15,5,-8> +p=<-2983,-3194,-209>, v=<8,-53,50>, a=<8,13,-3> +p=<2984,-4559,-1821>, v=<-100,13,4>, a=<-1,12,5> +p=<-2385,732,-105>, v=<147,-15,-116>, a=<-4,-1,9> +p=<1539,-193,-2637>, v=<-21,53,18>, a=<-6,-4,12> +p=<-969,-1656,-2067>, v=<21,30,-12>, a=<3,6,12> +p=<323,-2435,2170>, v=<-87,81,-105>, a=<7,5,-1> +p=<6722,-1881,6800>, v=<-51,23,-36>, a=<-9,2,-10> +p=<2960,990,2576>, v=<46,-30,-44>, a=<-8,0,-2> +p=<1640,-2310,-1879>, v=<-16,36,108>, a=<-2,2,-3> +p=<1904,-13365,7427>, v=<61,14,-72>, a=<-7,23,-9> +p=<254,-3762,2972>, v=<-93,-5,-158>, a=<5,7,4> +p=<1186,738,-74>, v=<-79,-95,71>, a=<-3,5,-10> +p=<-668,954,-1496>, v=<69,4,66>, a=<-2,-13,9> +p=<2080,366,1786>, v=<-69,-12,-149>, a=<-16,-3,0> +p=<-872,-630,-2924>, v=<21,71,211>, a=<8,-3,5> +p=<-1112,204,-86>, v=<119,34,20>, a=<-4,-8,-2> +p=<652,-510,-962>, v=<-80,113,41>, a=<4,-11,6> +p=<28,-846,-1340>, v=<63,128,92>, a=<-10,-9,3> +p=<802,-2301,-981>, v=<102,41,-112>, a=<-8,2,9> +p=<7622,2163,-4732>, v=<-6,25,57>, a=<-15,-6,6> +p=<-4190,2922,2674>, v=<132,-56,-84>, a=<15,-15,-10> +p=<210,634,-262>, v=<-24,-66,40>, a=<1,3,-3> +p=<1002,-502,186>, v=<-150,-12,12>, a=<10,5,-3> +p=<1582,-7,-39>, v=<-79,12,55>, a=<-6,-2,-7> +p=<-134,890,1287>, v=<46,-57,-33>, a=<-5,-2,-9> +p=<1361,-670,-754>, v=<-76,77,40>, a=<-4,-4,3> +p=<1556,1735,-949>, v=<-14,-73,34>, a=<-15,-9,6> +p=<-56,-891,2080>, v=<40,73,-87>, a=<-5,-1,-10> +p=<191,357,-533>, v=<21,26,9>, a=<-5,-8,5> +p=<1699,-1580,-117>, v=<-137,28,-58>, a=<1,13,10> +p=<-966,695,-1118>, v=<26,-63,54>, a=<7,1,5> +p=<-943,-389,98>, v=<2,141,-84>, a=<5,-12,8> +p=<1584,3867,364>, v=<-11,-93,-38>, a=<-7,-11,2> +p=<-521,-279,62>, v=<57,-41,-18>, a=<-1,11,2> +p=<-488,227,-213>, v=<78,-39,-59>, a=<-5,3,13> +p=<2697,157,659>, v=<-88,110,-41>, a=<-8,-13,0> +p=<-499,-812,-4203>, v=<55,23,155>, a=<-3,3,10> +p=<-482,752,-123>, v=<36,48,5>, a=<-1,-10,0> +p=<300,531,829>, v=<-19,43,-33>, a=<0,-8,-2> +p=<-1230,1704,-786>, v=<62,-134,-55>, a=<1,4,11> +p=<-1689,-251,251>, v=<71,-19,10>, a=<3,4,-3> +p=<1473,-1186,47>, v=<-70,27,-41>, a=<-2,5,4> +p=<-2148,-13,-718>, v=<17,-24,76>, a=<12,3,-4> +p=<-652,2469,-701>, v=<-44,-134,75>, a=<9,-1,-4> +p=<3519,1232,7089>, v=<-56,-102,-81>, a=<-4,4,-10> +p=<-651,4187,1299>, v=<-103,-61,-43>, a=<8,-5,0> +p=<-2491,-2393,2721>, v=<101,62,14>, a=<1,4,-12> +p=<6243,-1854,1137>, v=<-112,-43,-98>, a=<-15,11,4> +p=<-478,4691,-29>, v=<-25,-53,-45>, a=<4,-14,4> +p=<-1611,-534,-458>, v=<-31,35,-37>, a=<9,-1,5> +p=<-3129,-3493,-2207>, v=<61,66,-15>, a=<7,8,10> +p=<798,-2085,-326>, v=<-37,25,26>, a=<0,6,-1> +p=<-1622,3327,-425>, v=<27,-175,19>, a=<4,2,0> +p=<28,148,-2075>, v=<-2,96,94>, a=<0,-9,0> +p=<1544,6146,-1718>, v=<-39,143,44>, a=<0,-15,0> +p=<13010,1310,3469>, v=<-93,27,-129>, a=<-12,-3,2> +p=<-6295,-2824,-4409>, v=<-38,33,-167>, a=<10,2,14> +p=<-6334,6887,3391>, v=<23,4,-87>, a=<7,-9,0> +p=<-2707,-7153,-2693>, v=<110,84,-51>, a=<-2,5,6> +p=<3572,-4111,-1562>, v=<9,126,40>, a=<-5,-1,0> +p=<4462,-2550,-1370>, v=<-8,113,-23>, a=<-8,-2,4> +p=<-2754,-5894,-3082>, v=<3,3,80>, a=<5,11,1> +p=<-5170,-6022,-2090>, v=<95,73,16>, a=<4,7,3> +p=<-6370,-3782,-7594>, v=<83,36,56>, a=<7,5,11> +p=<-82,-598,1126>, v=<-64,-47,-35>, a=<4,4,0> +p=<5198,-502,-746>, v=<-97,16,-92>, a=<-4,0,7> +p=<14,-3830,-890>, v=<-1,21,61>, a=<0,6,-2> +p=<-3362,-1270,566>, v=<22,73,-34>, a=<5,-2,1> +p=<4998,5749,-1919>, v=<-132,6,12>, a=<0,-8,2> +p=<-9423,-8843,-12274>, v=<-45,39,109>, a=<15,10,11> +p=<-5623,-4093,-4465>, v=<-106,-47,40>, a=<13,8,4> +p=<-2868,-6905,703>, v=<75,66,-18>, a=<0,6,0> +p=<3839,-4207,-190>, v=<74,-83,-170>, a=<-9,10,9> +p=<-5768,7005,2433>, v=<-80,-103,-50>, a=<13,-5,-1> +p=<820,-4083,3477>, v=<-115,20,-42>, a=<5,5,-3> +p=<3459,-1784,-608>, v=<-8,78,-21>, a=<-12,0,4> +p=<2194,-3601,-2655>, v=<47,121,32>, a=<-12,3,7> +p=<216,3437,3624>, v=<157,-149,11>, a=<-14,0,-14> +p=<-14,-4498,1600>, v=<11,40,-9>, a=<-1,13,-5> +p=<-3947,4748,-4173>, v=<86,10,26>, a=<7,-18,13> +p=<4379,2540,4820>, v=<-48,34,-113>, a=<-12,-12,-8> +p=<-819,-1692,1738>, v=<10,2,57>, a=<2,6,-11> +p=<-1785,171,2497>, v=<-32,41,36>, a=<9,-4,-12> +p=<-5786,-3541,4522>, v=<147,-29,-75>, a=<0,6,-2> +p=<7279,8393,6784>, v=<32,-15,-53>, a=<-11,-10,-6> +p=<-7892,-2293,-4877>, v=<81,-1,26>, a=<6,3,5> +p=<-5786,203,-3629>, v=<47,-65,-66>, a=<5,3,8> +p=<-5942,-3307,-14744>, v=<71,-55,-21>, a=<4,7,20> +p=<9892,-2332,-8660>, v=<-55,160,43>, a=<-10,-5,9> +p=<-8087,-1045,-6359>, v=<46,87,-16>, a=<8,-3,9> +p=<10675,-4517,-152>, v=<1,-32,4>, a=<-17,9,0> +p=<-1960,-11377,6848>, v=<38,56,-124>, a=<1,15,-4> +p=<3675,2133,-8622>, v=<-195,-114,48>, a=<5,3,11> +p=<945,-1577,5798>, v=<-63,46,-4>, a=<2,0,-9> +p=<1624,-2462,-468>, v=<235,-355,-66>, a=<-10,30,7> +p=<811,628,3099>, v=<109,87,442>, a=<-8,-6,-33> +p=<-2613,-1644,-44>, v=<-377,-233,-11>, a=<22,19,2> +p=<2665,1031,1462>, v=<380,152,214>, a=<-27,-15,-13> +p=<-1167,2956,-837>, v=<-167,423,-119>, a=<11,-29,7> +p=<-500,-1627,2542>, v=<-71,-233,361>, a=<6,15,-24> +p=<2759,-228,330>, v=<393,-38,47>, a=<-32,1,-7> +p=<-1933,385,-1305>, v=<-277,56,-185>, a=<18,-2,10> +p=<-740,-3178,0>, v=<-107,-453,-2>, a=<14,28,3> +p=<837,2734,1599>, v=<119,385,227>, a=<-8,-24,-18> +p=<2029,-2022,2099>, v=<288,-287,299>, a=<-20,22,-19> +p=<1362,530,-2350>, v=<197,80,-335>, a=<-13,-5,21> +p=<35,1448,-2444>, v=<5,205,-349>, a=<5,-12,30> +p=<2512,-2034,-1044>, v=<355,-291,-148>, a=<-25,24,12> +p=<96,2593,1687>, v=<10,372,246>, a=<0,-24,-10> +p=<1697,-1020,-899>, v=<245,-145,-122>, a=<-21,10,13> +p=<322,-1743,1920>, v=<46,-248,279>, a=<-7,16,-17> +p=<462,44,3385>, v=<65,5,483>, a=<-1,-1,-33> +p=<2308,-1372,400>, v=<329,-191,60>, a=<-24,13,-2> +p=<993,-539,2957>, v=<140,-76,423>, a=<-8,7,-28> +p=<-894,-2502,-1769>, v=<-127,-359,-249>, a=<8,25,18> +p=<-1533,1125,-2885>, v=<-219,157,-418>, a=<19,-12,28> +p=<-1714,2565,204>, v=<-248,361,28>, a=<17,-24,-5> +p=<50,2129,1755>, v=<3,299,252>, a=<0,-18,-22> +p=<1377,-2722,-155>, v=<202,-392,-22>, a=<-9,29,-1> +p=<-2051,-135,2402>, v=<-295,-24,342>, a=<21,1,-28> +p=<1690,-2279,794>, v=<240,-322,113>, a=<-13,22,-7> +p=<1765,-1008,2234>, v=<251,-140,319>, a=<-20,9,-21> +p=<-944,201,2749>, v=<-135,25,393>, a=<8,0,-32> +p=<1277,1073,2254>, v=<181,153,325>, a=<-15,-15,-22> +p=<-1068,-1656,2795>, v=<-149,-236,395>, a=<5,19,-26> +p=<2481,-1470,-1338>, v=<355,-210,-193>, a=<-24,16,11> +p=<-448,2393,-837>, v=<-61,342,-119>, a=<3,-22,11> +p=<-2560,643,563>, v=<-366,89,77>, a=<26,-5,-8> +p=<3211,344,1361>, v=<460,46,194>, a=<-29,-6,-15> +p=<-510,-2939,993>, v=<-73,-418,141>, a=<4,32,-13> +p=<3090,1341,-594>, v=<441,191,-82>, a=<-24,-11,7> +p=<-2650,-1076,1037>, v=<-377,-153,150>, a=<26,6,-9> +p=<-2076,-1191,1581>, v=<-296,-162,228>, a=<25,11,-15> +p=<475,162,3389>, v=<66,25,487>, a=<-3,0,-35> +p=<378,1697,-2105>, v=<55,242,-299>, a=<-7,-18,19> +p=<245,608,2984>, v=<34,83,425>, a=<-3,-6,-29> +p=<1522,256,-1893>, v=<216,33,-273>, a=<-17,-1,19> +p=<-2367,902,1555>, v=<-333,128,223>, a=<20,-7,-15> +p=<389,-2674,-1034>, v=<55,-378,-141>, a=<-8,22,13> +p=<-2530,1332,773>, v=<-358,189,105>, a=<29,-18,-14> +p=<-960,-1666,-1362>, v=<-135,-241,-199>, a=<12,15,12> +p=<-1847,-2094,2325>, v=<-265,-303,333>, a=<21,20,-23> +p=<-119,-1836,2646>, v=<-14,-262,381>, a=<1,17,-26> +p=<2251,1198,990>, v=<323,171,145>, a=<-22,-11,-9> +p=<-464,-1556,-2369>, v=<-70,-222,-339>, a=<4,20,19> +p=<1703,745,2520>, v=<238,104,358>, a=<-16,-7,-23> +p=<-1691,1716,-2618>, v=<-246,244,-374>, a=<16,-18,30> +p=<1472,-2238,853>, v=<210,-315,118>, a=<-15,26,-8> +p=<-1947,2351,-1449>, v=<-286,338,-205>, a=<18,-27,12> +p=<-2815,1474,650>, v=<-404,209,86>, a=<29,-13,-3> +p=<1434,-1949,1020>, v=<208,-277,148>, a=<-20,18,-11> +p=<2722,1173,-256>, v=<390,166,-33>, a=<-25,-11,5> +p=<3026,-916,18>, v=<430,-130,-2>, a=<-28,8,3> +p=<1336,1272,-1884>, v=<188,185,-265>, a=<-15,-16,13> +p=<-562,-2147,-1631>, v=<-83,-310,-235>, a=<2,24,17> +p=<2473,-660,-62>, v=<350,-96,-12>, a=<-23,2,0> +p=<-1360,-1074,-2694>, v=<-194,-149,-380>, a=<13,11,31> +p=<-2791,-1608,-902>, v=<-395,-230,-128>, a=<27,14,9> +p=<811,282,2237>, v=<113,38,316>, a=<-8,-10,-20> +p=<-2080,-1126,-1316>, v=<-293,-163,-191>, a=<20,6,7> +p=<1893,-617,2345>, v=<267,-88,338>, a=<-19,6,-20> +p=<-2131,-721,-1427>, v=<-306,-101,-206>, a=<18,7,11> +p=<-2635,49,615>, v=<-377,7,86>, a=<25,1,-11> +p=<1224,3029,-1172>, v=<172,429,-161>, a=<-16,-31,6> +p=<67,-301,3085>, v=<11,-43,440>, a=<0,7,-30> +p=<1224,1528,-2785>, v=<177,216,-397>, a=<-12,-11,25> +p=<-863,2724,381>, v=<-126,391,52>, a=<5,-24,-2> +p=<-1288,-1610,2625>, v=<-184,-226,375>, a=<12,19,-25> +p=<-269,2017,-2101>, v=<-39,283,-300>, a=<2,-24,24> +p=<1950,1442,-103>, v=<278,203,-13>, a=<-20,-12,2> +p=<352,247,-2877>, v=<55,32,-410>, a=<-4,-6,26> +p=<1809,2045,-1944>, v=<259,292,-276>, a=<-14,-20,20> +p=<-21,-2189,988>, v=<-1,-313,141>, a=<-3,21,-9> +p=<-1001,-2217,1954>, v=<-140,-315,281>, a=<3,22,-21> +p=<2373,951,1447>, v=<340,139,206>, a=<-24,-11,-12> +p=<2379,1655,509>, v=<336,233,77>, a=<-23,-19,-5> +p=<884,-1431,-2145>, v=<125,-206,-306>, a=<-10,14,22> +p=<-372,-2465,658>, v=<-56,-346,93>, a=<0,29,-10> +p=<1671,2547,-1793>, v=<233,362,-252>, a=<-19,-28,11> +p=<326,736,-2726>, v=<46,105,-385>, a=<-6,-7,23> +p=<2241,-739,-1255>, v=<318,-105,-176>, a=<-19,6,12> +p=<1853,-1037,-1564>, v=<263,-148,-219>, a=<-15,9,20> +p=<-1518,-1071,2789>, v=<-218,-157,399>, a=<19,8,-30> +p=<1045,1858,1247>, v=<152,265,178>, a=<-11,-21,-13> +p=<281,-1098,3271>, v=<40,-161,468>, a=<-6,8,-31> +p=<1122,-2393,-122>, v=<158,-337,-17>, a=<-8,22,2> +p=<-727,1445,2272>, v=<-100,209,327>, a=<7,-14,-20> +p=<1448,2165,-1632>, v=<206,309,-239>, a=<-14,-23,16> +p=<2453,-1690,-1411>, v=<351,-245,-201>, a=<-27,16,15> +p=<1030,515,3122>, v=<147,72,446>, a=<-8,-6,-32> +p=<-589,-2972,1141>, v=<-79,-431,167>, a=<9,26,-9> +p=<1558,-2331,1268>, v=<224,-333,181>, a=<-14,15,-14> +p=<-1156,-1848,-1958>, v=<-165,-268,-279>, a=<9,18,17> +p=<-328,2409,-1728>, v=<-47,346,-252>, a=<3,-20,11> +p=<-2236,745,2041>, v=<-319,101,291>, a=<22,-8,-18> +p=<-2618,-1525,492>, v=<-380,-216,72>, a=<26,15,-11> +p=<-2468,166,-2092>, v=<-352,24,-296>, a=<28,-2,23> +p=<1132,2952,1200>, v=<164,419,170>, a=<-11,-29,-10> +p=<-929,-715,-2801>, v=<-132,-104,-401>, a=<6,2,23> +p=<150,-2148,-1598>, v=<12,-300,-225>, a=<-4,22,5> +p=<-3006,323,-1215>, v=<-429,51,-173>, a=<26,-1,8> +p=<-1606,-1914,962>, v=<-233,-271,135>, a=<15,18,-10> +p=<2816,-397,-1439>, v=<403,-54,-205>, a=<-29,1,14> +p=<-2638,684,-1710>, v=<-376,98,-244>, a=<26,-3,19> +p=<896,-1998,1773>, v=<131,-285,255>, a=<-14,19,-20> +p=<617,-1910,2135>, v=<88,-272,304>, a=<-8,21,-19> +p=<-1155,30,3112>, v=<-165,1,441>, a=<10,-3,-31> +p=<-685,-434,2700>, v=<-95,-63,385>, a=<11,4,-27> +p=<-1309,-2857,-1754>, v=<-191,-406,-250>, a=<17,29,15> +p=<1804,-461,-2272>, v=<257,-64,-323>, a=<-18,1,18> +p=<-2916,837,-229>, v=<-418,116,-31>, a=<27,-13,-2> +p=<-2396,-750,-958>, v=<-340,-112,-139>, a=<19,7,12> +p=<-1035,-2366,-1895>, v=<-147,-341,-274>, a=<12,23,16> +p=<-3113,-1407,191>, v=<-445,-198,26>, a=<30,11,7> +p=<-1076,2730,802>, v=<-153,390,114>, a=<10,-26,-4> +p=<2033,1679,1326>, v=<292,246,187>, a=<-18,-19,-5> +p=<2560,-2091,-1321>, v=<364,-295,-188>, a=<-28,21,12> +p=<684,-59,2815>, v=<95,-8,401>, a=<-7,1,-31> +p=<-1564,2964,-405>, v=<-223,425,-57>, a=<15,-26,-1> +p=<-2485,-1814,1918>, v=<-353,-256,274>, a=<25,23,-16> +p=<655,-984,2797>, v=<97,-140,395>, a=<-4,11,-24> +p=<1926,-2137,-790>, v=<276,-302,-110>, a=<-13,18,7> +p=<-540,46,2356>, v=<-79,6,338>, a=<3,1,-24> +p=<-2129,617,-2410>, v=<-306,85,-346>, a=<21,-8,26> +p=<2362,846,-1443>, v=<333,118,-204>, a=<-27,-9,11> +p=<557,-708,-2693>, v=<71,-100,-386>, a=<2,11,26> +p=<-3162,548,714>, v=<-451,73,102>, a=<38,-5,-6> +p=<2359,862,1641>, v=<339,116,235>, a=<-22,-5,-19> +p=<-2245,-1426,1021>, v=<-314,-201,142>, a=<26,9,-9> +p=<-1787,1609,-651>, v=<-253,228,-86>, a=<14,-12,7> +p=<-2046,-2176,675>, v=<-295,-314,98>, a=<20,21,-2> +p=<92,1224,2925>, v=<15,174,419>, a=<3,-13,-35> +p=<-2676,1132,792>, v=<-383,167,110>, a=<26,-11,-6> +p=<-2747,44,530>, v=<-392,6,75>, a=<31,-1,-10> +p=<1635,2416,-694>, v=<231,341,-96>, a=<-19,-30,9> +p=<2566,1397,141>, v=<365,201,25>, a=<-25,-13,-2> +p=<-2687,1625,156>, v=<-381,228,24>, a=<26,-19,1> +p=<1187,2782,593>, v=<166,400,84>, a=<-14,-27,-8> +p=<12,-1995,2377>, v=<-2,-282,339>, a=<0,22,-17> +p=<-3012,-360,-1500>, v=<-432,-48,-218>, a=<29,2,19> +p=<-2365,1525,199>, v=<-332,215,31>, a=<24,-17,-1> +p=<-254,1669,2513>, v=<-31,237,359>, a=<4,-16,-23> +p=<-1071,2203,1517>, v=<-154,320,216>, a=<12,-23,-17> +p=<2195,231,1764>, v=<310,33,253>, a=<-22,-1,-19> +p=<-765,-2729,630>, v=<-112,-390,93>, a=<5,24,-8> +p=<2437,-1776,-1403>, v=<349,-251,-197>, a=<-23,18,14> +p=<793,1403,2970>, v=<111,201,419>, a=<-6,-14,-29> +p=<1594,-2749,-1482>, v=<227,-396,-207>, a=<-16,27,11> +p=<1418,1864,1818>, v=<200,265,261>, a=<-16,-19,-17> +p=<-942,-1572,2134>, v=<-137,-226,308>, a=<7,13,-20> +p=<-2352,1032,1986>, v=<-334,151,285>, a=<27,-7,-26> +p=<-2238,-1898,1513>, v=<-319,-271,222>, a=<22,19,-14> +p=<144,-741,2701>, v=<23,-101,385>, a=<3,8,-27> +p=<2485,-1973,846>, v=<350,-277,114>, a=<-21,18,-1> +p=<-103,100,-2421>, v=<-14,12,-349>, a=<1,-5,30> +p=<-51,-2900,-418>, v=<-7,-416,-59>, a=<-4,33,2> +p=<-2342,-1431,-1158>, v=<-332,-199,-162>, a=<25,13,11> +p=<3047,-188,-482>, v=<441,-26,-68>, a=<-31,-3,2> +p=<-302,3019,-1359>, v=<-44,433,-192>, a=<5,-29,18> +p=<-2582,-1307,936>, v=<-366,-182,132>, a=<20,15,-3> +p=<-1140,-2503,-1090>, v=<-164,-357,-154>, a=<11,25,8> +p=<-1908,-1869,1747>, v=<-266,-266,249>, a=<18,18,-19> +p=<-569,183,2831>, v=<-78,30,403>, a=<5,-1,-27> +p=<-1931,-2513,927>, v=<-275,-358,132>, a=<19,23,-12> +p=<-502,2000,2056>, v=<-74,286,294>, a=<5,-20,-18> +p=<-2656,269,1039>, v=<-375,45,146>, a=<27,0,-8> +p=<-1126,1513,-2691>, v=<-159,215,-381>, a=<10,-20,26> +p=<-823,1328,-2091>, v=<-119,189,-296>, a=<8,-16,24> +p=<-2693,-978,580>, v=<-389,-142,84>, a=<23,12,2> +p=<-878,-277,-3355>, v=<-123,-40,-478>, a=<9,2,33> +p=<240,-2544,282>, v=<33,-367,36>, a=<-5,23,-2> +p=<-59,-572,3078>, v=<-5,-78,444>, a=<-1,3,-30> +p=<2532,832,2194>, v=<361,118,312>, a=<-28,-8,-21> +p=<748,2769,-376>, v=<100,390,-56>, a=<-6,-27,3> +p=<1468,175,2378>, v=<209,25,340>, a=<-16,2,-28> +p=<2324,1671,-2021>, v=<336,243,-286>, a=<-23,-17,20> +p=<-2635,-888,-467>, v=<-376,-124,-72>, a=<26,9,4> +p=<-118,2602,-2121>, v=<-15,374,-304>, a=<5,-23,15> +p=<1240,1379,2572>, v=<179,201,362>, a=<-13,-11,-26> +p=<-1191,406,-2299>, v=<-173,58,-333>, a=<11,-11,22> +p=<-2652,1550,299>, v=<-380,221,42>, a=<27,-15,0> +p=<-2310,-2072,226>, v=<-328,-298,30>, a=<24,20,-2> +p=<1112,2562,1028>, v=<156,361,138>, a=<-11,-26,-14> +p=<-1282,205,3040>, v=<-187,35,438>, a=<10,-2,-30> +p=<-2655,-409,816>, v=<-381,-58,116>, a=<29,4,-8> +p=<-595,-2598,562>, v=<-87,-371,76>, a=<2,30,-1> +p=<-1080,-1161,-2609>, v=<-155,-165,-374>, a=<8,14,26> +p=<129,-2416,1481>, v=<23,-342,211>, a=<-1,26,-13> +p=<-1290,531,-1895>, v=<-182,77,-267>, a=<9,-4,18> +p=<542,-3071,-1074>, v=<82,-443,-155>, a=<-6,30,7> +p=<-1564,1953,-842>, v=<-223,280,-125>, a=<12,-14,10> +p=<-2106,2188,-1213>, v=<-299,312,-175>, a=<19,-24,11> +p=<2634,198,708>, v=<374,26,101>, a=<-26,-2,-4> +p=<533,-2693,-1322>, v=<76,-381,-186>, a=<-7,27,10> +p=<-1197,-2782,19>, v=<-171,-397,3>, a=<9,24,0> +p=<3042,1356,22>, v=<435,193,3>, a=<-33,-18,2> +p=<-542,1215,2351>, v=<-79,169,335>, a=<6,-12,-25> +p=<-2630,-699,-1044>, v=<-376,-101,-150>, a=<22,8,8> +p=<-3027,-359,-1400>, v=<-434,-47,-198>, a=<30,9,11> +p=<1135,-753,2936>, v=<161,-107,418>, a=<-18,10,-26> +p=<-42,2063,-1784>, v=<-1,291,-254>, a=<-4,-24,16> +p=<-1999,1276,-2642>, v=<-283,184,-376>, a=<21,-9,25> +p=<120,1838,-2283>, v=<12,259,-326>, a=<-4,-16,22> +p=<-1024,-1742,2584>, v=<-142,-251,369>, a=<10,12,-28> +p=<721,-2855,641>, v=<101,-409,93>, a=<-8,32,-8> +p=<1490,2720,-427>, v=<214,389,-62>, a=<-15,-31,5> +p=<1421,-2724,-181>, v=<204,-389,-28>, a=<-11,27,2> +p=<-2360,582,-1120>, v=<-338,83,-165>, a=<22,-10,13> +p=<269,1999,2898>, v=<38,283,412>, a=<1,-18,-24> +p=<1655,2601,-1260>, v=<235,376,-180>, a=<-19,-25,18> +p=<1942,480,-1689>, v=<277,66,-242>, a=<-17,-3,16> +p=<2661,-338,-795>, v=<379,-48,-117>, a=<-24,0,13> +p=<-2134,1862,151>, v=<-307,261,26>, a=<24,-18,-1> +p=<395,2238,1976>, v=<54,319,279>, a=<-5,-19,-19> +p=<-1141,2540,821>, v=<-162,361,117>, a=<10,-27,-7> +p=<308,1830,2034>, v=<45,268,288>, a=<-6,-14,-22> +p=<1793,-260,2231>, v=<260,-39,320>, a=<-18,1,-21> +p=<1849,-611,-1885>, v=<262,-87,-265>, a=<-17,4,18> +p=<-1380,1752,1205>, v=<-196,253,172>, a=<4,-19,-12> +p=<2708,897,-747>, v=<386,121,-102>, a=<-30,-6,8> +p=<2889,-1381,-891>, v=<411,-191,-129>, a=<-26,12,8> +p=<-324,-1067,-2585>, v=<-45,-150,-371>, a=<11,16,25> +p=<1961,564,2554>, v=<280,79,365>, a=<-20,-2,-28> +p=<698,-2610,-474>, v=<99,-373,-74>, a=<-3,26,4> +p=<-1090,-2386,-377>, v=<-157,-335,-54>, a=<14,23,7> +p=<806,1740,-2303>, v=<116,246,-328>, a=<-6,-17,20> +p=<-505,-2361,-842>, v=<-76,-341,-122>, a=<4,28,7> +p=<2614,-396,-1722>, v=<371,-56,-248>, a=<-26,3,17> +p=<1756,-1364,1108>, v=<250,-192,160>, a=<-13,10,-11> +p=<335,-2431,1555>, v=<48,-346,217>, a=<0,26,-15> +p=<-726,1196,2161>, v=<-100,163,308>, a=<9,-7,-21> +p=<-601,-1618,-2643>, v=<-85,-233,-381>, a=<3,18,26> +p=<-393,2630,547>, v=<-58,375,79>, a=<-1,-24,-2> +p=<-1361,-2031,1574>, v=<-198,-293,224>, a=<13,21,-10> +p=<-2160,1193,-1156>, v=<-308,172,-166>, a=<23,-11,11> +p=<-445,2972,-226>, v=<-65,421,-36>, a=<11,-29,0> +p=<-1198,-46,-2987>, v=<-168,-8,-427>, a=<7,0,29> +p=<-2653,-381,1831>, v=<-376,-57,266>, a=<24,3,-18> +p=<1327,1037,1965>, v=<189,148,285>, a=<-13,-10,-19> +p=<2148,-1555,1233>, v=<306,-222,176>, a=<-19,12,-13> +p=<-1982,-576,2273>, v=<-279,-82,322>, a=<17,6,-22> +p=<2224,-1197,2241>, v=<313,-170,320>, a=<-22,13,-26> +p=<2010,-929,2125>, v=<287,-129,303>, a=<-19,11,-22> +p=<-2360,2080,-414>, v=<-328,299,-56>, a=<30,-19,7> +p=<-595,-1253,2351>, v=<-85,-184,333>, a=<6,11,-16> +p=<-2267,-2244,1322>, v=<-324,-320,187>, a=<20,23,-8> +p=<-2046,1657,1637>, v=<-297,235,235>, a=<20,-8,-14> +p=<-756,-1657,-2373>, v=<-108,-232,-340>, a=<4,15,26> +p=<2756,412,1668>, v=<392,59,234>, a=<-30,-5,-21> +p=<2758,-798,762>, v=<390,-114,110>, a=<-29,8,-11> +p=<-1593,617,2060>, v=<-227,91,293>, a=<13,-7,-22> +p=<491,-2699,835>, v=<71,-386,119>, a=<-5,24,-11> +p=<890,2658,-262>, v=<126,383,-36>, a=<-8,-24,2> +p=<1795,-2852,130>, v=<257,-408,12>, a=<-21,27,6> +p=<-2725,-1481,765>, v=<-391,-208,114>, a=<27,19,-7> +p=<-2723,2258,1012>, v=<-389,322,142>, a=<25,-22,-6> +p=<2522,1827,447>, v=<360,261,58>, a=<-25,-18,-4> +p=<-1683,2548,682>, v=<-240,364,94>, a=<18,-24,-2> +p=<384,569,-3079>, v=<53,84,-439>, a=<0,-3,28> +p=<-1861,1920,1736>, v=<-262,273,248>, a=<15,-22,-17> +p=<-169,-1604,2028>, v=<-27,-224,285>, a=<-2,16,-20> +p=<-662,-2466,-822>, v=<-94,-349,-117>, a=<6,24,2> +p=<1706,-389,-2530>, v=<241,-58,-361>, a=<-14,3,22> +p=<2714,156,1611>, v=<385,30,228>, a=<-27,1,-18> +p=<1490,2184,280>, v=<212,314,45>, a=<-12,-21,-1> +p=<-1244,1802,1193>, v=<-177,259,172>, a=<14,-17,-11> +p=<1919,1888,-1698>, v=<274,273,-242>, a=<-12,-16,18> +p=<241,3194,375>, v=<33,451,52>, a=<-4,-33,-3> +p=<-1884,-964,-2394>, v=<-270,-134,-336>, a=<17,10,22> +p=<2568,-1502,-54>, v=<368,-214,-9>, a=<-28,15,-2> +p=<-886,-718,-2639>, v=<-126,-101,-378>, a=<1,5,22> +p=<-1945,-900,-2633>, v=<-280,-130,-373>, a=<13,9,26> +p=<-239,-556,2764>, v=<-31,-78,396>, a=<-2,-2,-28> +p=<-2138,-218,2748>, v=<-298,-25,392>, a=<23,1,-29> +p=<-1637,-2820,378>, v=<-233,-398,53>, a=<20,33,2> +p=<193,-575,2576>, v=<25,-80,370>, a=<1,8,-26> +p=<605,2629,1304>, v=<89,378,190>, a=<-6,-29,-16> +p=<836,852,2538>, v=<119,117,360>, a=<-8,-9,-22> +p=<-1333,-2240,-1051>, v=<-192,-324,-150>, a=<11,22,10> +p=<18,-2875,-335>, v=<4,-408,-50>, a=<0,33,-1> +p=<-918,-1709,-2115>, v=<-137,-244,-303>, a=<13,12,21> +p=<85,-2882,613>, v=<8,-410,82>, a=<0,27,-10> +p=<-639,-2216,-1903>, v=<-94,-316,-274>, a=<6,25,18> +p=<2782,142,-550>, v=<397,23,-79>, a=<-25,3,5> +p=<1602,1495,-1811>, v=<227,212,-259>, a=<-20,-17,18> +p=<-620,1564,-2076>, v=<-90,223,-297>, a=<11,-17,19> +p=<-2278,-1759,2266>, v=<-325,-253,326>, a=<21,17,-23> +p=<-586,2535,-445>, v=<-82,355,-70>, a=<6,-23,0> +p=<-104,-235,2787>, v=<-15,-35,400>, a=<3,2,-26> +p=<2921,-472,1807>, v=<420,-63,263>, a=<-26,6,-19> +p=<-1991,-813,-2235>, v=<-287,-111,-317>, a=<20,8,22> +p=<1441,2300,19>, v=<203,326,-2>, a=<-20,-17,4> +p=<-1473,1810,-2502>, v=<-210,258,-358>, a=<14,-18,24> +p=<908,-1484,2373>, v=<129,-208,339>, a=<-9,17,-22> +p=<2873,672,-91>, v=<415,101,-9>, a=<-29,-6,0> +p=<1096,-140,-2284>, v=<161,-20,-324>, a=<-15,-6,20> +p=<-2830,528,-828>, v=<-404,78,-120>, a=<32,-5,9> +p=<114,-1499,-1649>, v=<15,-212,-234>, a=<4,14,11> +p=<3081,468,338>, v=<440,66,48>, a=<-31,-3,-1> +p=<-2575,1783,-922>, v=<-366,254,-133>, a=<25,-16,7> +p=<2457,-1530,-1409>, v=<351,-220,-202>, a=<-25,15,19> +p=<930,-955,2829>, v=<131,-142,405>, a=<-6,9,-28> +p=<1024,268,2510>, v=<146,38,357>, a=<-11,3,-25> +p=<-2613,783,-255>, v=<-373,112,-37>, a=<24,-3,3> +p=<2409,579,133>, v=<345,79,24>, a=<-26,-7,-2> +p=<-965,-2692,2075>, v=<-133,-383,293>, a=<9,31,-18> +p=<-3,-2099,2393>, v=<-4,-299,343>, a=<-1,19,-23> +p=<1736,671,2334>, v=<248,95,337>, a=<-24,-4,-28> +p=<1147,-2922,-452>, v=<163,-415,-62>, a=<-6,29,6> +p=<1640,-2525,-622>, v=<242,-361,-88>, a=<-14,23,6> +p=<540,2258,1727>, v=<74,320,251>, a=<-1,-19,-16> +p=<1303,-449,2867>, v=<186,-62,413>, a=<-16,2,-21> +p=<-2721,1071,1253>, v=<-389,149,178>, a=<27,-13,-18> +p=<416,1877,1908>, v=<58,268,278>, a=<-1,-19,-19> +p=<-847,2302,1418>, v=<-120,327,202>, a=<8,-24,-8> +p=<-749,3158,-182>, v=<-104,452,-27>, a=<3,-33,-7> +p=<-833,151,2877>, v=<-113,24,410>, a=<8,-2,-28> +p=<2416,-32,-522>, v=<345,-4,-71>, a=<-26,1,5> +p=<1538,-2361,1077>, v=<221,-336,154>, a=<-14,22,-9> +p=<183,-2061,2457>, v=<23,-294,349>, a=<-1,23,-27> +p=<294,-739,-2874>, v=<44,-109,-411>, a=<-1,10,29> +p=<219,888,-3099>, v=<31,129,-439>, a=<-5,-4,31> +p=<-2714,1712,-703>, v=<-387,241,-98>, a=<23,-14,6> +p=<580,-2685,329>, v=<83,-385,50>, a=<-6,27,-9> +p=<1602,-2225,594>, v=<225,-312,82>, a=<-15,22,-6> +p=<-2216,2293,-6>, v=<-316,325,5>, a=<25,-26,2> +p=<566,-333,-3381>, v=<80,-44,-485>, a=<-14,3,33> +p=<778,2937,764>, v=<113,413,113>, a=<-8,-25,-1> +p=<-1579,2289,684>, v=<-227,330,97>, a=<12,-21,-6> +p=<-311,-1348,2861>, v=<-42,-188,406>, a=<1,11,-24> +p=<1454,2941,792>, v=<206,416,110>, a=<-18,-27,-12> +p=<-3130,484,262>, v=<-447,66,37>, a=<27,-1,-1> +p=<-134,1496,-3097>, v=<-24,216,-442>, a=<3,-15,26> +p=<-2050,-2080,-233>, v=<-291,-294,-33>, a=<22,21,0> +p=<2036,-2084,1404>, v=<294,-295,194>, a=<-22,19,-15> +p=<2424,1709,603>, v=<346,244,88>, a=<-24,-17,-4> +p=<-317,2401,-1590>, v=<-44,341,-226>, a=<7,-22,16> +p=<-1625,2183,-583>, v=<-228,308,-78>, a=<13,-20,4> +p=<-1738,812,2472>, v=<-246,119,353>, a=<17,-13,-24> +p=<-2533,1137,-2055>, v=<-360,166,-293>, a=<26,-6,20> +p=<2673,824,-1584>, v=<383,117,-228>, a=<-28,-9,14> +p=<-1366,-850,-2087>, v=<-193,-117,-301>, a=<10,8,20> +p=<-825,2218,-1454>, v=<-119,318,-202>, a=<3,-22,19> +p=<1155,2901,-761>, v=<162,415,-106>, a=<-11,-28,14> +p=<2150,14,-1951>, v=<307,2,-276>, a=<-23,4,21> +p=<-2778,391,421>, v=<-394,58,57>, a=<27,1,-3> +p=<-1369,1076,-2495>, v=<-192,155,-362>, a=<15,-5,20> +p=<-3039,703,-75>, v=<-439,100,-10>, a=<32,-12,1> +p=<-1660,1972,-1387>, v=<-235,281,-199>, a=<18,-16,11> +p=<-2951,-94,-1146>, v=<-419,-12,-164>, a=<34,-2,8> +p=<1062,176,2808>, v=<151,26,403>, a=<-6,3,-32> +p=<1345,1285,-2594>, v=<190,183,-370>, a=<-10,-10,28> +p=<1831,261,1743>, v=<265,34,253>, a=<-19,0,-16> +p=<2280,1868,-1042>, v=<329,270,-150>, a=<-26,-19,10> +p=<-1024,2588,1616>, v=<-146,372,232>, a=<12,-28,-19> +p=<2381,1809,-161>, v=<342,258,-23>, a=<-19,-24,3> +p=<1334,-2983,743>, v=<184,-426,105>, a=<-18,31,-12> +p=<-396,2571,-747>, v=<-51,368,-106>, a=<2,-26,11> +p=<963,2288,930>, v=<142,325,132>, a=<-9,-29,-8> +p=<-928,-2396,1354>, v=<-135,-341,195>, a=<9,30,-11> +p=<146,796,-2515>, v=<23,111,-361>, a=<4,0,24> +p=<958,630,2955>, v=<144,93,422>, a=<-6,-3,-32> +p=<601,-1734,-2450>, v=<87,-247,-350>, a=<-6,18,25> +p=<2599,-616,1270>, v=<378,-91,185>, a=<-26,6,-9> +p=<199,-2036,-2354>, v=<29,-290,-343>, a=<3,20,23> +p=<247,772,2206>, v=<37,111,315>, a=<-1,-8,-18> +p=<-2228,1569,969>, v=<-322,227,140>, a=<22,-15,-9> +p=<-1749,-939,-1821>, v=<-249,-134,-262>, a=<18,8,18> +p=<-1860,-3024,-265>, v=<-266,-427,-39>, a=<20,28,1> +p=<1522,1810,1745>, v=<216,264,250>, a=<-11,-19,-17> +p=<1842,511,-2521>, v=<262,73,-353>, a=<-23,0,23> +p=<-1619,-2370,-589>, v=<-235,-344,-83>, a=<16,23,6> +p=<-1794,1706,-796>, v=<-258,237,-116>, a=<19,-17,8> +p=<88,22,-2919>, v=<6,5,-416>, a=<0,1,31> +p=<2649,611,1019>, v=<376,88,142>, a=<-22,-4,-11> +p=<1339,-2121,2155>, v=<186,-307,305>, a=<-13,21,-17> +p=<2271,1004,1369>, v=<328,141,197>, a=<-17,-14,-18> +p=<-1214,-1374,2161>, v=<-168,-190,308>, a=<10,12,-22> +p=<3088,337,-1749>, v=<443,45,-252>, a=<-26,-3,19> +p=<45,-1088,2359>, v=<5,-155,335>, a=<2,6,-23> +p=<1236,-967,-2901>, v=<171,-138,-413>, a=<-13,3,31> +p=<-1861,2148,557>, v=<-268,310,79>, a=<18,-20,-2> +p=<2559,1712,1910>, v=<362,245,270>, a=<-27,-16,-12> +p=<360,-2737,-63>, v=<48,-389,-7>, a=<-8,26,5> +p=<-2342,344,-639>, v=<-331,48,-91>, a=<22,-4,6> +p=<-1927,1718,-363>, v=<-280,245,-52>, a=<13,-20,-4> +p=<-709,135,2956>, v=<-102,18,425>, a=<14,-2,-25> +p=<-1172,-247,-2787>, v=<-167,-31,-398>, a=<9,2,28> +p=<-1765,-2164,249>, v=<-249,-304,35>, a=<21,21,-2> +p=<-1650,-274,-2505>, v=<-238,-36,-351>, a=<15,2,19> +p=<-2000,1250,1355>, v=<-287,184,194>, a=<20,-11,-14> +p=<2935,-445,167>, v=<421,-61,20>, a=<-29,4,-1> +p=<1991,-2237,-145>, v=<284,-313,-17>, a=<-19,19,2> +p=<-1051,-2065,1870>, v=<-154,-294,267>, a=<5,17,-15> +p=<-1045,2303,1779>, v=<-146,331,254>, a=<5,-25,-16> +p=<-1391,1424,-2606>, v=<-196,202,-375>, a=<9,-14,26> +p=<-449,-2757,482>, v=<-66,-394,63>, a=<4,25,-8> +p=<0,-1817,-2332>, v=<0,-261,-340>, a=<4,21,26> +p=<1435,599,2138>, v=<206,90,305>, a=<-14,-11,-17> +p=<-333,-2904,512>, v=<-46,-413,69>, a=<3,27,0> +p=<-1300,-2501,974>, v=<-185,-356,141>, a=<15,20,-7> +p=<-1152,1985,-1339>, v=<-167,285,-189>, a=<10,-15,10> +p=<-2231,-1654,-73>, v=<-315,-237,-10>, a=<24,16,4> +p=<1000,1712,2282>, v=<143,249,330>, a=<-15,-17,-22> +p=<-3328,362,-738>, v=<-477,56,-107>, a=<30,-3,7> +p=<2125,1946,1266>, v=<308,281,172>, a=<-18,-22,-10> +p=<584,1286,2843>, v=<81,178,401>, a=<-4,-14,-29> +p=<3430,-271,802>, v=<494,-38,118>, a=<-36,-1,-7> +p=<-2158,-405,2248>, v=<-308,-55,326>, a=<22,4,-22> +p=<-1612,-2558,132>, v=<-228,-365,18>, a=<21,29,0> +p=<-489,2723,-1390>, v=<-64,390,-198>, a=<1,-24,11> +p=<3076,1529,326>, v=<441,216,45>, a=<-24,-17,-1> +p=<1698,1152,2581>, v=<243,167,370>, a=<-20,-9,-25> +p=<-2453,80,-872>, v=<-348,14,-123>, a=<24,2,8> +p=<-2106,-1936,523>, v=<-303,-276,77>, a=<21,17,-5> +p=<-2612,-1675,657>, v=<-373,-244,93>, a=<22,18,-4> +p=<-1482,-1967,-1702>, v=<-207,-283,-245>, a=<14,16,17> +p=<-2518,1724,-814>, v=<-358,248,-115>, a=<24,-14,8> +p=<-2594,1458,-618>, v=<-374,214,-89>, a=<28,-15,7> +p=<-2498,1382,-322>, v=<-355,203,-48>, a=<27,-12,2> +p=<1526,-471,-2412>, v=<219,-70,-343>, a=<-11,4,25> +p=<-818,-1187,-2436>, v=<-111,-169,-348>, a=<10,6,25> +p=<1285,1242,-1814>, v=<179,177,-258>, a=<-12,-15,20> +p=<-2778,-1519,388>, v=<-395,-221,54>, a=<26,15,-4> +p=<-1778,-2274,-445>, v=<-256,-320,-63>, a=<17,18,2> +p=<1465,2951,-1028>, v=<214,421,-146>, a=<-10,-29,12> +p=<-2586,-2176,882>, v=<-367,-310,125>, a=<27,15,-11> +p=<-1800,-2702,-158>, v=<-255,-382,-20>, a=<20,24,1> +p=<-1488,-2830,-496>, v=<-212,-404,-70>, a=<14,27,4> +p=<2028,2471,-471>, v=<291,358,-66>, a=<-15,-21,0> +p=<1151,-79,2727>, v=<164,-8,390>, a=<-11,1,-26> +p=<-2620,-2745,-61>, v=<-373,-394,-8>, a=<31,27,0> +p=<231,-1223,2860>, v=<33,-170,409>, a=<-1,10,-26> +p=<2302,-656,-944>, v=<325,-88,-133>, a=<-21,6,15> +p=<-1157,-1411,2594>, v=<-170,-201,370>, a=<14,15,-31> +p=<-2064,-2094,1251>, v=<-294,-299,178>, a=<20,18,-11> +p=<2100,-2124,-488>, v=<295,-307,-70>, a=<-25,20,1> +p=<-1825,-2378,459>, v=<-263,-339,72>, a=<19,23,-6> +p=<-1205,1830,984>, v=<-173,261,132>, a=<12,-20,-9> +p=<3020,-168,-204>, v=<431,-24,-25>, a=<-32,2,5> +p=<1518,-1957,-2681>, v=<215,-278,-381>, a=<-19,19,27> +p=<-1734,-1066,2148>, v=<-249,-149,306>, a=<20,10,-23> +p=<-153,-2000,1830>, v=<-21,-283,264>, a=<-5,15,-14> +p=<-2504,-1384,1088>, v=<-356,-198,149>, a=<25,11,-14> +p=<1669,881,2447>, v=<236,118,352>, a=<-15,-6,-21> +p=<1535,-853,2618>, v=<221,-121,379>, a=<-17,11,-29> +p=<-2917,54,1511>, v=<-414,6,215>, a=<29,0,-12> +p=<-1106,-180,-2705>, v=<-156,-25,-386>, a=<7,0,21> +p=<-59,336,-2881>, v=<-9,51,-407>, a=<0,-2,29> +p=<-2210,1011,-845>, v=<-322,146,-120>, a=<19,-7,0> +p=<2826,-524,2237>, v=<403,-72,319>, a=<-22,5,-22> +p=<-1208,-2358,645>, v=<-171,-343,89>, a=<5,29,-1> +p=<-2048,2314,800>, v=<-293,334,112>, a=<22,-25,-1> +p=<-2149,5,-1355>, v=<-306,-3,-196>, a=<21,4,18> +p=<1284,662,-2593>, v=<184,94,-374>, a=<-12,-6,32> +p=<-1874,-2537,450>, v=<-267,-361,60>, a=<20,19,-5> +p=<2705,530,-198>, v=<387,75,-20>, a=<-29,2,1> +p=<-2624,-954,-1520>, v=<-377,-134,-220>, a=<23,12,22> +p=<-695,-376,-2690>, v=<-99,-52,-384>, a=<4,3,30> +p=<2412,-1747,-1046>, v=<339,-246,-151>, a=<-21,12,10> +p=<-1279,-2107,-1243>, v=<-180,-304,-177>, a=<12,22,14> +p=<337,-1405,2548>, v=<49,-203,364>, a=<-5,18,-27> +p=<1135,-2203,1556>, v=<161,-315,220>, a=<-14,27,-15> +p=<-754,2322,-1334>, v=<-107,331,-189>, a=<4,-24,11> +p=<-1854,-529,-2664>, v=<-261,-72,-378>, a=<16,8,28> +p=<2070,2256,-1296>, v=<290,326,-182>, a=<-15,-23,11> +p=<-1011,2553,1237>, v=<-149,365,177>, a=<9,-25,-14> +p=<-1374,-2495,412>, v=<-196,-353,61>, a=<12,24,-4> +p=<172,-2059,2245>, v=<24,-295,318>, a=<0,21,-24> +p=<88,1541,-2567>, v=<12,220,-369>, a=<-3,-15,29> +p=<-886,2415,982>, v=<-129,344,142>, a=<9,-29,-12> diff --git a/src/main/resources/2017/day21.txt b/src/main/resources/2017/day21.txt new file mode 100644 index 00000000..e805ea98 --- /dev/null +++ b/src/main/resources/2017/day21.txt @@ -0,0 +1,108 @@ +../.. => .../.##/##. +#./.. => .##/.##/#.. +##/.. => ..#/.../### +.#/#. => #.#/..#/##. +##/#. => .#./.#./..# +##/## => #.#/#../### +.../.../... => ..../#.../.##./..#. +#../.../... => ####/#.##/##.#/..#. +.#./.../... => ..##/..##/..##/..## +##./.../... => ..../..#./##../##.# +#.#/.../... => ##.#/..../####/...# +###/.../... => .#.#/.###/.#../.#.# +.#./#../... => .###/#.#./...#/##.. +##./#../... => #.##/#.../####/###. +..#/#../... => ####/...#/...#/#.## +#.#/#../... => .#../##../..##/..#. +.##/#../... => .#../..##/..../.##. +###/#../... => #.../..#./.#.#/#..# +.../.#./... => #.#./.#.#/.###/...# +#../.#./... => ###./.#../...#/.#.. +.#./.#./... => ##.#/.#../#..#/##.. +##./.#./... => #..#/...#/.#.#/###. +#.#/.#./... => .##./#.../#..#/.### +###/.#./... => .#.#/##.#/..../##.# +.#./##./... => ##.#/#.##/.#.#/#.## +##./##./... => #.##/..#./..#./.##. +..#/##./... => ..../#.../..#./..## +#.#/##./... => .##./####/####/#### +.##/##./... => #.##/####/#.##/#..# +###/##./... => .#../.###/##../...# +.../#.#/... => ...#/...#/#.##/#### +#../#.#/... => ..#./..#./###./.##. +.#./#.#/... => .##./##../.###/.#.# +##./#.#/... => #.#./.#../.##./...# +#.#/#.#/... => ##.#/..##/#.../##.# +###/#.#/... => ..##/##../.#.#/..## +.../###/... => .#../#.../.##./.... +#../###/... => ..##/..##/...#/.##. +.#./###/... => #..#/..#./#.#./..## +##./###/... => #.##/.#../##.#/##.# +#.#/###/... => ####/###./.##./...# +###/###/... => #..#/#.##/..../.##. +..#/.../#.. => #.#./.#../##../..#. +#.#/.../#.. => ##.#/####/##../.#.# +.##/.../#.. => ####/##../#..#/..#. +###/.../#.. => ##../..#./####/##.# +.##/#../#.. => ##../#.#./###./..## +###/#../#.. => ..../.#../#..#/...# +..#/.#./#.. => ..#./...#/.###/.#.# +#.#/.#./#.. => ###./..../#.#./###. +.##/.#./#.. => ####/#.##/.#.#/.#.. +###/.#./#.. => ###./#.##/##../#### +.##/##./#.. => ##.#/..##/..#./.#.. +###/##./#.. => ##.#/.##./.###/.##. +#../..#/#.. => #.../###./##.#/#..# +.#./..#/#.. => ..##/.###/...#/..#. +##./..#/#.. => ##../#.#./...#/.#.. +#.#/..#/#.. => ..#./###./##../.### +.##/..#/#.. => #.../.##./..../#.#. +###/..#/#.. => .#.#/#.##/#.##/..#. +#../#.#/#.. => ..##/..##/#.../#### +.#./#.#/#.. => #.../...#/..../..## +##./#.#/#.. => ###./..##/.#../.##. +..#/#.#/#.. => ...#/..##/..#./.#.. +#.#/#.#/#.. => #.#./.#../..../##.. +.##/#.#/#.. => ..#./.###/##.#/.... +###/#.#/#.. => #.##/..##/...#/##.. +#../.##/#.. => #.#./##../###./.#.# +.#./.##/#.. => .###/#..#/.##./.... +##./.##/#.. => .#.#/.#../.###/.##. +#.#/.##/#.. => .#../..##/###./#.## +.##/.##/#.. => ##../.##./..#./.#.. +###/.##/#.. => .#.#/..#./#..#/.### +#../###/#.. => #.##/#..#/.#.#/#.#. +.#./###/#.. => #.../#..#/#.../.#.# +##./###/#.. => ##../####/##../.### +..#/###/#.. => #.../..../####/##.# +#.#/###/#.. => ...#/..../...#/..## +.##/###/#.. => .#../####/#.##/.#.. +###/###/#.. => ###./.#.#/#.../##.. +.#./#.#/.#. => ...#/##../####/...# +##./#.#/.#. => ####/#..#/###./#.## +#.#/#.#/.#. => .###/#..#/..#./...# +###/#.#/.#. => ###./.###/##.#/###. +.#./###/.#. => #..#/#.../..#./#### +##./###/.#. => #.../..../#..#/..## +#.#/###/.#. => #..#/.#.#/#.../##.. +###/###/.#. => .#.#/..../.#.#/#.## +#.#/..#/##. => .#../..##/...#/###. +###/..#/##. => .###/..#./##.#/##.# +.##/#.#/##. => ####/#.##/.##./##.. +###/#.#/##. => #..#/#..#/####/#.## +#.#/.##/##. => .###/#.#./#..#/.#.# +###/.##/##. => #.#./#.#./#.##/..## +.##/###/##. => ####/###./##.#/##.# +###/###/##. => ##../..##/#.#./#... +#.#/.../#.# => .#../###./.###/##.# +###/.../#.# => ..../.#.#/#..#/##.. +###/#../#.# => ..#./#.../.##./...# +#.#/.#./#.# => ...#/#.../##.#/.##. +###/.#./#.# => ..../..../#.#./##.# +###/##./#.# => .#../...#/...#/###. +#.#/#.#/#.# => ...#/#.../##../.### +###/#.#/#.# => #.../...#/.#../#.## +#.#/###/#.# => ..../.##./..../##.. +###/###/#.# => .##./.#.#/#.##/.##. +###/#.#/### => #.#./####/.##./.##. +###/###/### => .#.#/..##/#.##/.##. diff --git a/src/main/resources/2017/day22.txt b/src/main/resources/2017/day22.txt new file mode 100644 index 00000000..0ffb8656 --- /dev/null +++ b/src/main/resources/2017/day22.txt @@ -0,0 +1,25 @@ +#.###...#..#..#...##.#### +##.##.#..##.#..#.#..##### +.####..###.#.#####.#.##.# +##..#.##.#.#.#...#..##..# +..#...####.#.###.###...#. +#..###.##.###.....#....#. +.#..#.##.##....##...####. +###.##....#...#.##....##. +..#.###..######.#.####... +.#.###..#.##.#..##.###### +###.####.#####.####....#. +#...####.#.##...##..#.#.. +##.######.#....##.#.####. +.#.#..#...##....#....#... +.####.##.#..##...#..####. +.#.####.##..###..###..##. +...#...####...#.#.#.###.# +#.##.####.#..##.###.####. +.#.#...####....##..####.# +##.###.##..####..#.###### +#.#...#.#.##.####........ +.......#..##..#.#..###... +.#..###.###........##.#.. +.######.......#.#.##.#.#. +.##..#.###.....##.#.#...# diff --git a/src/main/resources/2017/day23.txt b/src/main/resources/2017/day23.txt new file mode 100644 index 00000000..8155688d --- /dev/null +++ b/src/main/resources/2017/day23.txt @@ -0,0 +1,32 @@ +set b 67 +set c b +jnz a 2 +jnz 1 5 +mul b 100 +sub b -100000 +set c b +sub c -17000 +set f 1 +set d 2 +set e 2 +set g d +mul g e +sub g b +jnz g 2 +set f 0 +sub e -1 +set g e +sub g b +jnz g -8 +sub d -1 +set g d +sub g b +jnz g -13 +jnz f 2 +sub h -1 +set g b +sub g c +jnz g 2 +jnz 1 3 +sub b -17 +jnz 1 -23 diff --git a/src/main/resources/2017/day24.txt b/src/main/resources/2017/day24.txt new file mode 100644 index 00000000..d990a343 --- /dev/null +++ b/src/main/resources/2017/day24.txt @@ -0,0 +1,57 @@ +24/14 +30/24 +29/44 +47/37 +6/14 +20/37 +14/45 +5/5 +26/44 +2/31 +19/40 +47/11 +0/45 +36/31 +3/32 +30/35 +32/41 +39/30 +46/50 +33/33 +0/39 +44/30 +49/4 +41/50 +50/36 +5/31 +49/41 +20/24 +38/23 +4/30 +40/44 +44/5 +0/43 +38/20 +20/16 +34/38 +5/37 +40/24 +22/17 +17/3 +9/11 +41/35 +42/7 +22/48 +47/45 +6/28 +23/40 +15/15 +29/12 +45/11 +21/31 +27/8 +18/44 +2/17 +46/17 +29/29 +45/50 diff --git a/src/main/resources/2017/day25.txt b/src/main/resources/2017/day25.txt new file mode 100644 index 00000000..76a29e20 --- /dev/null +++ b/src/main/resources/2017/day25.txt @@ -0,0 +1,62 @@ +Begin in state A. +Perform a diagnostic checksum after 12481997 steps. + +In state A: + If the current value is 0: + - Write the value 1. + - Move one slot to the right. + - Continue with state B. + If the current value is 1: + - Write the value 0. + - Move one slot to the left. + - Continue with state C. + +In state B: + If the current value is 0: + - Write the value 1. + - Move one slot to the left. + - Continue with state A. + If the current value is 1: + - Write the value 1. + - Move one slot to the right. + - Continue with state D. + +In state C: + If the current value is 0: + - Write the value 0. + - Move one slot to the left. + - Continue with state B. + If the current value is 1: + - Write the value 0. + - Move one slot to the left. + - Continue with state E. + +In state D: + If the current value is 0: + - Write the value 1. + - Move one slot to the right. + - Continue with state A. + If the current value is 1: + - Write the value 0. + - Move one slot to the right. + - Continue with state B. + +In state E: + If the current value is 0: + - Write the value 1. + - Move one slot to the left. + - Continue with state F. + If the current value is 1: + - Write the value 1. + - Move one slot to the left. + - Continue with state C. + +In state F: + If the current value is 0: + - Write the value 1. + - Move one slot to the right. + - Continue with state D. + If the current value is 1: + - Write the value 1. + - Move one slot to the right. + - Continue with state A. diff --git a/src/main/resources/2017/day3.txt b/src/main/resources/2017/day3.txt new file mode 100644 index 00000000..6cd3b5b8 --- /dev/null +++ b/src/main/resources/2017/day3.txt @@ -0,0 +1 @@ +361527 diff --git a/src/main/resources/2017/day4.txt b/src/main/resources/2017/day4.txt new file mode 100644 index 00000000..cef14656 --- /dev/null +++ b/src/main/resources/2017/day4.txt @@ -0,0 +1,512 @@ +una bokpr ftz ryw nau yknf fguaczl anu +tvay wvco bcoblpt fwzg sfsys zvuqll mcbhwz ovcw fgdy +ynsocz vid rfmsy essqt fpbjvvq sldje qfpvjvb +yvh nxc kla vhy vkbq cxfzgr +kljv ymobo jlvk ebst cse cmlub tavputz omoby psif +ebfuvvu paqgzri uvvubef hglk jvn gzeln bdl ziqgpra bzcfa +tclq ytw tclq tezcqys +qae eofr yzwcwqf wqm ytcdnc pxnmkw +krryi irykr ycp lbeed ykrir lhq rdd tyujwd +hms pii lxoa dchsvz bepjwst bllxkqg hsm yrdj myzvju msh lwnnc +yxqh hqxy xkn ljjsqjh jjljshq +mhgsehj urbvnvf gbz ykxsd hsmgehj wtoc ujpfaos eir vifog tsy kdo +wfruf wwijme pxbbsvf asmgs ccbn vwtc mkhah oxxfh +lxqy jzvcvd cfgg uahxrwr dqmaqr bwzm wruxhra lrb lmk +jspgxo yuhgni njzqtn zglkzz ybc itj orqr zgqwuoo mjagh erll srqrk +cbrtnbx ukblei ienmdm sinzq lytyliz mma lizylty zeumwgu +aeggz eljcry buqdeog dvjzn ilvw arz vep kxdzm mvh szkf +imn sfty ugg flqq nydky mni bkqzlok wye lehwlmp xeyfmj +beyv oamrpkc tebdkwv zlq jes mqvif sej qpsnmjz edvtbkw +hylmacl wwlra xntnvg ppvb bzof cymllha +qktxomf ngfpuz qqz malc zxuqz szg zis vzro rfpgk +phru sxlg qzqlw uej vmd omzga jue +drzgojf ttqdqar weikik wvrjtxi gbj jramqh nlwoj drzgojf bgabmn xqlaeun +aiuohu pca apkmv cpa kmvpa nmdn +gelymv eto itcnuhn ote teo +oxiz xzio kqu wwgow +picoyb coibpy acsw ehlirq deyz gymqvz opicyb vuet lrl +zerg rezg miwtjgw gezr cui +mlh qlu ktil tnlgnrk bfqbk pgg qxeyd noadmjo nonlsh eqxdy +yqqaq yqqqa xod oss +mkotw bznvs xowoofq sebp wsgpsmn fytcpc vvmzr vmzrv xwtxz zrvvm +dvs twhz teqmlow oqg sjetxd aku cwl qfvrkex mndsio hfg +itdl qwdagkk wli tdil vlgur dyl xvfm +wlmyd dwmlx zhmqd zqmhd edzsvmz yclg umpq +petva gazw byrca pvaet epkoqh nlp vqfl vatpe +rykn ckr dijkme kmiedj ozlh deikmj +kuecjh sfqv pojfzf fjopzf fjpfzo amxtc +hri gglmial lrwbyc memgszu hir cfwlg ylcrwb +rxrfbtv pwpra fngt auh rapwp zrruuq uah +cevc utfd ysrfcw nnlg fnqtx aua htteunu mrjhhj +tvnxznj mvpagt nqmxvnl mutn ntmu eybh vkqeaj frayclp +ygktzxo lzwwy qsipu nwb jdmw pahao paow mwjd uivqbnj woap nyyogcc +log zihz rsmx ixfr xwvd osg zxc gol ufnbig +dogve cnb osa xbafl vefr nxlw yjgquui +ucyl aaoae ktjvi fyps xvjhpbh iiur tuc +pqt jasxg ehhs lzjzzzl sqmmj vwyva eklbtv hksanb fuesnd oyw fuesdn +uankv wesi frhpau qiucu lim uzbdapf ciwjd tifbqxh tfbtsdi +vgjd izpofu fqjpcct phuz +cfg cfg rgahl frm emn pbfsmgy frm jemwqgn sfpm azunntj igl +daps hpe fqg err sapd dci vbzlqx gsigq eyp rre +iuqyqdy djprdj mgtkdxr pwmkzv wmkvzp hppisd pidphs +rlr rrl vhevh cucprc xki urte lrr zfc xrqydzk ipjkyxj kytul +jwbkaee rgyjl rjljbwe ppq plp pfts ijd ckpvmw mbdrqh zolt lzmr +alw law awl wknavtb esklsbj wvssyai +aqy ldf qdht soxkg qtfipe nsdm aqe rtlc fbqrk ius gybbhxr +xteov wgqoqim nlz szlj oxevt xwb +tmgdst fyn oul tsohzbq ltmxji fgops gatssx zxdzfc talb +zkvjpu jnhtc nxs jqv pyoqz zsj ckwd xot ykai +fxfarre yjbxvj lqfaglo mbxuv bmuxv bxumv +yrhi uosldj hryi fwres ycygw ycvxze zevxyc iyk +yphev xisbai xdb hzrbg ayxbhdx qnvbus pwc +wytqraw yvurj erqckl rvrvda xsh gsd bxtm acxle gpndk +kpvjtu vacggk oabcuoq qusf zitqpgn pbyq ocabouq ntpgizq gaiiry dke +frz ceozajo ljltawq tjepzp iflv +zntejm dkfgc ysno noys sony muy +qdnyvvw oykq bnmldt zjgauw pviurd cbcnl tnkhq ebsey bccln arvwe +iqazt xidjgom wcrdz itht lfh ifzwkj rwqxhy ervcgmt vojg lzntz ezg +tlcxioh qvvkan wpi ody +mhsy dwm hyms yegvvc +hbkvi wvemc uwxgqf pwrgu wcy wxqfgu qkzppc vxcwdwd rcgp ivjd wmevc +upc ucp cpu unmr pyod +bqfew ebwfq paccwh phgc fchhr jrnio +abh bjalls bdtac zzvt totdlc yptqmgu rpcin bch cqklqly +bsnss qcsgi tegyz lqoqkpf qvatlyu ibza mzfotsk lye oqqf mnor +lzrxca stkbn axhr wckbip bsntk ahrx +oricdw cnpte dbz nqx xloxc bdz fdsl uyvgi nvoy ezbi +nlcqye ofta jcvqvtg yxduyh btawc tjgvqvc tcvqjvg +nji znctdfm kkmp pmt ikhl jjoubc xnp zdctnmf covvmsh ydh ircplcm +yafkuk yasqsyt ytqayss nusgb ukfyka +yogcf emg jlkd blupemf axg wihhrb ysernt yznhz +gmc yyqtgp use lohoit +lclwa ojjkm rxr rrx +punyfv iphw ddbc jghx lrssszc bepexv sicpy syicp lszrscs vrqjb +rjanra juh hljdmad scu usc baifu ijs suc bgdbbv +ogs hehi lgiwowc wwezznc ogs lorcl naunpll wlmal ajcbj ciujw +slenm xxod vhf amhts +mrrduda mrrduda lwecwjv lwecwjv vvzmjla cjipv +ixnv invx inmzz aoxghpv +ulyvfrf zsup zfryjy xoo agdsd giw papa ljtu rzbjiq wrex +bzpv svpuyov mklrct uzox +fxs iypd uaqch kxazj ksjyv +uxaommf xtq uubbfk bmlq kdhgjzg oxwpag itfij irmkjx ggod sddcyo bopn +lch plmvfni qbjr dnu zjcod qlwax gejmyj gxjqm mfzkb gejmyj +yoa thrfbto wposvrm amulogu mcqzfax fjquli oay +kywj kqqhney ozuljxz wqwfte ubo mjj anhhg aphy ocfnef yhin ywnx +vxuledm wllj obqtsrr jwll uvmelxd xvj gbwte +hevc bitwu ydw ywd btiwu iuether gfe +dzn ssmfpel wbbdeyt xge hrfi +zebz ifhq euto ppfnrwc winkkj +utuly wtdt iahpe ihtxwmh zxun bqluj hsaxgcs ytluu jlfnnuv drxlctr myhp +kwxgy hreul rsnh wdmsx kkajywb +bond djq kccazc zvzcie hndm myx cmhyhkc ove ord dqj +zcong tekgn pbzs ywqgqgu eizrx ypydeku yqyjdjp dwsu zxire zcgon iggnvf +tkioh hflkm fsjz gisjbi otikh +ccdqqm fdabbne fyd lbyqm cyzgtd puitvjz nluf hirrpxd tgxrg vvl +hjnygbz fnu twwbp xqw pfdlt uoalyme rsd muayeol ezcq +kubeooi bxgwoun paogjs twvwlji opsajg higbdfi aazo evmj +sfipxe mqbkmrn plwqd zvq nmvom fyfbs nbs qkrbmmn eym kqnrmbm +ruhsp hurps mqws umm sphru +ksjs pgpxh qozg enplxbn oqzg rvjnaje sjsk +rbwbvog mhgtgg uld twrqz rbf kpop +lwho lohw ylhd dej lydh vsfffsm +icljgu gluijc vthqx orynv xhvqt +biav elxkct mtaw nlafk snyr cbqdwim blim rtrqmc wze cxktel +fgpeia ebkhga azlfsr bsj pipvwsd nry bayrjzl ftth ynr mfhd +ymlowur nighqgk yjv pyxf nan xamb ohm jvy owrxbg icbz +iyyt linaqu httt zyfeo udap mllq pdxo lpl djhqaou zkit llp +dxspk yge kcqjqpz ulb hoe mfx nwayo +rdnmmh gyqd qhxrzj dgizu lyittbv txngpdg fiu mwd ndp oks vxnxybi +eul ztpe evnz yxx iuwon rkbbsw liy mqhxt +qahp zwn ualtk txbt cbthj xchqy pirucp povdwq +mqwu mwww muiafa miaafu hzripx wmww +auw hyyi ylewfi ihva jknbrry voxzooq xaos xymv qzzjw hjc +enpb jqa ajciy cbeopfs tqrlqj ecudb gso cyjai gxoet +yohkjj yohjjk xapawgo rtgnjj +lnlxxn nxllnx vhjrev uoew zts smkd kynlrg +bkblpr vgafcy alju aiyqe eebtsyu buve hdesodl pspbohw +aacmw qpndwo tcwsfqy qecnms wondpq sto +wdsyxe edsxyw jnzruiw pfqdrhi +pfgxekl vswgxhb qyn mykn jimiatq zkcz jimiatq kaexgxm mykn +xegwn upudt dew uqjrcl abyof hbtiko wxgne sorgno etm +xzojs zxsjo szjox gumjtwi +gttngkk bwdgce bhuw fgo rcbf byw +ngtzwqx ptx xodmy ctmtf oioahmm qajlhje jzilpk cvypp ijaefz +arlx slcugvm hyuo zoptsh emyr tndx rroecp tdnx xea rtkpd +sfckdx ktyrjju ruwjtp zhqznj vncun +oqqh xpc itrdg gtrid hoqq tuo yijh ncp suvck jic +brrlqu twdt urblrq twtd +brfuh arwtkpu mzlj wdyqk +pmag dtwnva nect azld axqrwy apgm xbv gdq ienubsy andvwt +hqb qbh gxdl mwjn cmfsmik +yiwma utlor qxjfjsn aomlvu gxp ryj rfkdsw kuguhyi qxxpg +ifq wcvcgly jdalgzx lgcycwv rajmnqw +latakk yxxbw evy vey +odkvw ojgveb jhg qwhkyoh btvu qbfot nouv owgtsi pdwbmfn pmvcv dnqbo +tmka qqnty knz swi fyvmt ikcdu jfjzsfu dshgi cosacuj szjjuff +eanet uua fbztk bzkft +jepi hyo jgzplr jyqk zzcs iepj hfamvu bfgbz sjsnf lprgzj +mlca ywko mtg vkfv ojka zbelq qkaujs simt kafq qtycfzo +sqh omv llvra ecvxmtx dpnafv llvszx xzlsvl quj ufnhvod faraf fivmnl +pvxlls fzeoav ahgv uhq nodcr cohy vqisgaj jsfcyur dbohh +ztccbwk okv vok kov ywel +xyu cmaikc jgqu ozccdzk ybn yoeq fky aetrkj eyoyvla laiu cermo +sssnb kxly mgvaz jpffkq bysbwwu rfnkm eycp ipyd hyi wjew +obdfqmh flkm semednj iafewg lvh uwa ciepe +zmldp ykffe gtehz qlmvule edrtzg prund oagwto qia bvyxur +kjok neno qbxh wqgkkt ympclso poyclsm cajgnnn +paqili kur sfit jbqchzx bhjqzxc +fhghm ubtaana qbn autnaab aaaunbt vmz +exlrl hfnpq zgdwx smix nyg ogccrhj iimhhwc uhcldo oydwxp kqc jxxpycv +wtdqjfh ialoqr zeej ipoh qtjdwhf wdhqftj +jcgug cmtvmu ynhnilj txlv uemowyu cvrool oolcvr njr cxqntdh +uhtwtp tgnc jmmjl utiu jfxtsoz cxwqcz +qntxl lyownp tsp tps mixyge rqfqumc bxjiry zmaj azjm +abt bat tftvm nyjs jyns +hzsdh pwthfvm cedg hzsdh rsxtehn owh cedg +hcoiny aqbeme eeuigt pocpvox tiugee rwb tvgmyc ojg hgdaf +mzlwcfc uoobo bouoo tvgvmiu evsfkm popgm evmfsk ehxvits vebxbmd qhmz jzj +mypgg jbpx vgeb ahvjl zbm ancdzfy wytkcq +bivscw zmzmjxu jzm fwb ujefxp jzsiskp cgx atcj sszikjp cxg nqvxga +vvurbxp iry zlz gfnlpuy npyugfl +fpmee mhj iul lui liu +xjoesn ggsdc vnisnmw kyxmmv xphfq +zcsml ngzlpy udaoab eotbv ylca bfmums izx +pdi bpyoep cofsy qazl oaovek fvfbe sotc lfdmaea smvs +zajm bskaqhj qxyiptb bdyeuqr dqjrekn iywj +hzhky hukvpve iqcbwju nyiwb rvutxlb hyuah urnhxg savicaw hexr ptedk +qndji wrr sin ljogf ncrb zvt tvz +kvfke tjpzhrl zvd doq kxyw fdgr oqd egkybdh rqpfxks nja +escstpv ccc ryzdv gxkjuyt gkhw jxnfda awpzg csestpv +cpcd onxeae nimbrpt zyji qnuo ktxgwbj vtjfglz skcozd zgii zgii nimbrpt +lwq iue hfbv hgbg aeqc +vzgbod yjkoc ckt bpiaz +eyco ecoy uzousjp faxj utu yoec +fhqdi myd tvex bzizkcx pifcfhz fczhpif eofzv bqzd knbhbgj dok ffcizhp +qlqlgmz hofmnc cwtk ahgnpne acn prwdh hwdrp rfofhl atavrf afkcbk +sgl apyfr pwxzptv osuwy vmqqh soyuw lqilked oinhh +eglqdox gcxfxql ejtnwu wvho can eyu uetwnj elgdxqo atvpkk eailsnn cwosyn +mylxhuj kbc apnllw qbmtj sqy hxtnvoe ins iyudo aagezrq nsi ikvn +lpmzo tkdeg zilkm vdkmtf yulbdd dkfmtv +fzrv grq zfvr ychga gqr +vdjxx wew pdxgp cjywsc meoffrj pgpdx chxmw eizgz ruea +iaklyhx btqqik tbiqqk ynmq laxykhi qatrnsh lnmtm plz +sfogup jtdsx tsxjd wwzkyy wzywky vgdsgr +paupqb kyy bccklmr vopviup lctcxza yyk yky +gduuia doek hqcr upvb szeewnu rrrdz +lhnsaf lut kzf allu dvj tyngx zkf aqsgz rtkzzdz +xxqj msg xxqj ezmm tmyji msg cco tain ctpel +pvcfzv rhn hlhxyu bghzzpx dlhvr hrvdl lhuxhy +npzhkp voghdv rvezqff hvgvdo jndf gpa wevrwpu +faixq aecax hxdouer yqlngzd grf wid iwd cce xnmmr +ifqwiah dib ibd dtvkwqj mpn dtwjkqv kyntq xwlv +rwoiz dja cvv lvza kfdblq bgtwgh ongdub wggthb lvaz +xajf eyasx rupsyqx wubjwx bsrqi ripghci sbzxp sbz dhooax +ydnv tvhwgp uvrh yryhl yxdlwa ladwxy awi mkwyn ghvpwt +qrl vwdvwic ocbhpi bcmz dor lrq hokg gokh +adz echnlju ebnmw twjl cfw loq fqklyyq clgqq jtgpsu wltj +vwlgisb murtsw ldkacqv wxfcke vcqkald ldhh gsl kpzn +itnvo lyddd saewfse spnri vtmst iblx +qsgv qni wvqiih mneg lkpb quhbkyi +efwaaa huu fslzwpc uuh szflwpc +sgmj ajh vcwpcua enltaks aquooh bwoda txbuve +vbe astgezx xqbxkdj evb bev yuuesdc fvohzq +gpn oqxfz pbwibjw gljdbf gbldfj sis dpk iss +pha ebybvye ntxhs wcuce +odnnywv qpcjll aslxqjm injfs vkbturz atxi +zzncfj kbhk jzzvnwf kqipx qkxpi rzb czfnzj +ygu vqpnxkw trdtv rrte +hrutley ljxuuq yonbpmk hmpc etyrhlu +odxp fpvizzx dxop jjbr skhxq mpzawhe zptdxuu erxk adbbuk zfzipvx +qjovasi yutjpg rcp bykpctm fqmmg pckbymt hqj +ssqc cype tkowxb fbh rsluu zjk scrukwv pkuexk qlgjtdq oulrke +bkcd nnf hdj sdlweyr uyf kmvzq +sgeg moy png blv bblree ufe uqknuqd lnjwbh +snpex hrbcfok pffv cwrvhcs fpk uprhn gbpy zkxyi esug ccnnj +bmwue dugcrdu uifiy clid rdmodec jodp hti xptj tpopl vuwhdyi hnoq +cwlkg qsz nnp lfyk pwn dpe oeuzp jusxxkq qlnchc +tsmkvge pxauyc cxypua boi hybq rzf iioyi rtedkc gjmk iob mqb +cvip wgbjhe ulwg jckkwd gdu bmaoisp +drpl xbliszf rpld ngnvgxl xnrd xsmd oetrcmn xvfohp mtocren +habmf dmfxq qitw xxtybla cxvb colcvpj sowoeuh bhmfa plccvjo naftjgw +cix soo icx ahx cdrjyxe htcnp +acoksaf cgahlg tdj euchwnj bdn lunouq aewrk uktre kklwqy lnouuq +ibsel hwjbah vxuk bjxa dvzbpq tffqvo bjax qfoftv +iynms tzv jakuuw cmz cjnyr ddibtd gcb +tmgerk pvwizc lxoma ergmtk xmg loaxm +ajazon yjwt viyemnk wobzwwm jcucn nopymyq znaajo qcjtmlq ccjun ywvt oqczod +kdhgnv kdnvgh rpyrxx xpyrxr +qftmshx hrbr kcggxw jwtuk qxbzkn +ddi fjekwxs xxua cmmkrso +ptrsv favvfh innnnx nninnx +kzsnd pnf evtazgw wmjk gvxp bslajo +nphqtka umlxu ymw whqiab whqiab vwigkz pevtps +vhje cnu uzfzum rwucy mxr wyrdqfi gnkuwz dkrwc otfc vbfc +ubtzio vlijsst anruj qyntadb fnic klz ywqq fnic vlijsst +rprj ybyqawb tgeieih nzcr rjpr bjfpozh tpevsx flvjdq +kvqqzvm cfdm wzjmkq sbcfx vzmkvqq +zqtt elpg eglp uoe glep +lqv madhtch xevl fal ijmx chcpra lzl afl cndbvnq +yjx jyx xjy otwklfj +cur egsdzaz ocbx wvky coxb pgiysbh lclhvy gfu oxbc vqyjvhh +gtd pytdaz kecsku nkiud ytt bmgobx tyt pfleji ebqlifv lqp ytzadp +bopfdvy eovszvw krgu jhuhyqi kaczafr krgu zlfxtl +yixprs zqai oprgw vcsjoc pgorw ypx ijo urjcjqv +estg oqnhw xgwajp mpbsag ibzi +zggbt jmmtkru sye ybd ztggb +tzryuqb blyxnnu sjpmf yxe zimf uyzqtbr qbyrtzu +rzivz rxn invxqd nazw efzun bwnw ywx rfuda jhnoww mketav +zxfw zcaqi qaciz ktefiwk xwzf +ntougl fvyaxfr obml obml bjkm lgsqj yfcggdu rqcpgt ntougl nveto +rma dakifg pvfc ticvff iffctv difkga +wpnt eclov vmmoqh qvw mljlvnj hxrx +ijnpo uhgxrfe xxopw xuzwyd powlpo ctduj eepw gubnepv +rxcmve myxckxk ecid nxe xevrmc juzaonr ilkx zpb pbz mvgos yzr +yfecm wqkh defqqa mnzgx nwe ixxg rjdhe new +awztgx vqgnfd iwcakr ajaiwn jiwnaa uqfrim wrgbjon ufqrmi vdu yjwy gwkdc +vrqf yzmvnr jkjji ghya pdlye ygha qlcm twmkex frqv +hjb xgypw vtr mgj asa owcuks fnllp ommrhng senv iix +usw iyuatv ondiwh neac ttge tzw bvjkfe neac usw +qwehwhj idrwo vex zopkjd lrcc sfqyz smte qrfh lccr qwjhewh vlb +efnlhsj ltm xirn nctwio cin +zocc cpfo czoc oiz tftk +rlzvqe inivone kptyumn eatw urjxc aetw +qavvqa jvvc yux cvvj +bfr fcpc xpkphcf irak bfr nuhsooj nniugf bfr gllq ipo +ekd dydxs rnmgb dek yowk +ipdll wdgx gjiigd uleiwg buvv vdhuzg gigidj gkyigmx lpdli lzyode fqdpvms +ycna rhyz bsipz lit rmc mrofb cyan mrc wujk +tjrk cwdsvf srkdjy lsyvryj nko syjvlry fgqq srdykj pgb koh dyle +sflcxt wmgdgej akllaoa bbsvve nsxnt nsxnt kgm akllaoa btqbez +bzmoci agemx mdtiol pyohvf zwtx aqblx oibmcz ypcmz lfg ckssn ozx +cuojke joekcu eusr dxqk xxwob klpsm +byspz lyunt eojrx ubh rjxoe ypzsb +ibok bkrtut wzcdk ppm qekhvy aupaic vswwul lmlxrv ainigy sasurbx +jeigcyc cycgjie resio ncz +xvxr lmlaje ebmtn cvms xrvx vsmc +cfjbffj xvo hpsbu nfm jhlsk mnf fmn +xncxo iwuon voj aebv jks nynzl hwjwo womejo ugzmr tdfaep olpdiaf +jlnusc hgpprf nulcjs kwiwypu kitjjbj snlcju +buqzm kpuoxel ajlqke qqdur jecuibn leajqk qudrq usi +ahbnjf uuzecdv yfyrsxv eoqey oonue vyyrxfs jixmvao +wjdi cfgurdl usdnlk jmao qnus cicxnux vtdxxkx nusq +mlvfz twu unj mar qpiz fhjczpz ytl npwjys ppq koa +ippdky pvwthzj qlkhl pvwthzj +kfm lcedomr xgdkrzo hfxyoe rafcby uwe pzjyuja weu nso erdwc fjvc +peep oufzlb fsgn kxj uge xvufb zsnrxss lere gfsn gvwajkj fmh +mexvi kgkktz kgkktz auyln ghvqc mexvi +wit qxtewrk qdaz oljeb wowb suergyt hxq pfnfbei rdu qrxkwte fyw +qjjzkd oxedeu uoxbehs zder vvjnn ocxkiz wkblzy eyzksc waiiqo fut raak +dhojys qkusuxs kzicui dcsxo +hsnexb yoz inza gqxtbc rya jqfe ufzlqva +scpquf gbloz ceol eclo qpvzavo rwfnxa +jyg edqf vdpsihl edqf +mbyjg yjgbm mgybj mhgi grw +ler oxssrel jhw jwh sfa hdhlo gng auzoan +hmkuis iaxf muhisk ikshum +eodbpo prajasi zsu hyb npr tbcntup uzs bxchne +zpyr kxmvz frlzwnb tzqrw vdh ndbwqmu cadwsv adq bzfnrwl qfgf +dybnn dmarc mknr fovokgj ukrp cuwag +khweq eljs rllijp pizevm lwws kehqw mkjcu otqodz +fvsrb kzbjbcc kzbjbcc mee dhyedb kzbjbcc +cnlmjd dvnd vhlvsa rsrtc scrrt tqhx vke jqmxpd udkjqc qxriw pfqpk +tyureg urteyg rutyge rmoihs +pccxeak tkmyane qqggpr tbdmpi ieb +wjucbi wjm hais pcxjd kkzh qns hmf mhf mnsv ifigsc +lqeyr pnopcig cpgoinp pncpigo mjfkjus cko zedvvyq +ofsnspv goj wqm ynolb qczly brl lrupzg buof zladwte +xzn zxn yaseulw qwhxb easyluw vvlmh +aiybip ydfczwh wkl rjsu xreokl qov mko pna fkfu +zjlwozs nxke ozwlzjs jybx jpsxp qtkll idsrad savpoe +xph lpvkmvy afq uqhg qqjgm smg tmhem mxdyqx bvhot lpvmkyv +jxkkzil pkjheow fewr ggbfy fuol cuzud wnx fxujfwh srjsmic +lzbjx vfx sncis xuv unoa nlgs stdhf oibxsgk uhogsb +hfqzkms bzyfnz npcd yhfdo myqukug pjq adle sqkfhmz +czhainb iazcnhb hhaqr cyrwj zzow luuvt zdyhnh uppysr +fyw dulbxa drewqsr tldlaac kyaw datclal ylplup hdzbj +kiiv tly gua lfg +gphbvwc lqdd jqja ffpkz hafal eiapksw wsikpea vphgbcw lkcpm zjxcx +viapp rxt vdgbm ezphp pcqr bll mklgx epzhp +favz bwmczgg zoyns pens wpgi mrwxel +ozwjjn kbzaozc cuaa igbfyq swi uypx bczaozk pyux odvawqx +npnpw nwppn egnpj fkzh wppnn +asu mlqmwa npewa cjluw qmalmw newpa fznx dzypi yiy +hleh usw bgmgscg cqc fijfuw idtyh cgmsbgg zjhr wus hymbju +tmre fvm cgowgb eduyfla ttez vdzp vtmtaog ezxsfi gyxgzi pvzd +acvarlu hkmfzdg jsnil hpv wjj rljpk pygl wjhhohk rkplj spvgx psgvx +wyz rvuobq kbmhaf bec bec +zosyz psuo lgihdo mjtftk fjkttm ddmcd +pqm qpswpb opviwxg ppqsbw waco jpx +yzgumgq kqv hqjghnl jixhoyg ufer kvq lzi rojm gbhvsd urd tuy +sxc jndqc ozpex wkchpu tmwv utcxzd piecpma cmppeia +ifjc lttj tltj rxmgxqa jcif lzhxkg zqb mdq kbjavv +isyxn zjbj uiw avziqxf zpezazx iuw +rjaudu amtpuk gufogys xiqs +gau sndrkv cmiolti cdxm ikkcisu xusnfbp jxffy ffcizj psye sgd +mvx onzmy oynzm mwfgvs +mrdg roanty dljs jlil gzcj dqitnfb gxb vzzqf ooweeh pgs oyntra +yna xgok fvbdl xgko udqp sorfo hmhl yan +kycl ule blupejp kycl fhpkoe pqkptw cfzpv nkncl +snugkyw zfdbsfs aehb olq kkoi xpsvy jqcspf lajjyu jtm +hifhfa mii clukcbc fhhifa wcts tgai vvqsyr kclcbcu +ordjftj dokk hdhytwc fjodrtj ojrjfdt san ajxrwy ked jfrqc +eylx cohd biswq xgiibz gzcptbf eylx icunv bfg jqanbv rntp sbfkiey +kub gdpbdms qnnto bit visqop +tywk clicj daics cbuewkx yyjjjka vxzk afsdyqg +bmxzll wqjnyr mxlzbl yutkaa qmpz hiqkf lqqqle jagj qlqelq +jgdeatg qubj jsu bhgbm swmgy lwgnuh qjbu dqwiikp mgwys +ryisldg asrrhz vxvrnk ibjr kebyx dwbx qdrpa tgakt +dfvgzk hifan dpjdnqc ncnvf xmqjjao npjq vobt evtaety kvufds pcugx oyjo +ezionjg ioznegj cykxy igeojzn ezm +dkv dkv vfqyl dkv dtjhrem +xfgh brsjcdw auvq fibb gcbecl +eet qdnrymr ndqmyrr tpfqxoi kbkxw +qhmaj maukf uygg hqmaj tfmtv irao wsari +ofoywus wxs leemkn wfko dwzqv txg qsiiiss aiiffe fadmdq zjtaovt +fgfms oazi sam msgff qif evxca reho +gpzhy qxh sco qeax wtabxwv sjd oev +xsmpi wskvku xspmi smipx +ghgf tbpeun qdivuvq dump umdp khxcxtx laljpv lownp egovve +vhmu eziabt hnz neko nkz hfmizn +vqhb lax zzyf lxa lik jrqynr rgcos +zjgbfzv ieufyz kjxad qxeuewx +ufl drkaac hoyic pqutop wqzdk eewabsr mqspcr ewarbse dzqkw +bgatanj xmddwv mwlmw scgzboo myignm lkfl fsqr +xkrx otjzfk wek dpbwk cromg fclmhg pkvw wsln +yyqjs lifg gifl cfv lfig fycza +dfup fkfeiqq rcmuv dly iforzi lngkjc rzifio oiifrz mlhor puwm qrthoa +nzfaeto punt rtmlg dwdk hyig +mds ueoyclh lxb axgea wqt wwqqglf tqw yvzji ryr dst bojf +ayoj yzj lyctgnc woxz gqltw lkzkwte wysb mjyeu hrwso +gymmvtt lhskza lsb nhlijnt men zphurrw oftksy zxs ykerwue hnijltn iknqyz +xuaxkc lgzeef fwb nlzzhjj lsieg qdr ews rue rdq +xnf lljcmod kyuercp kvlvd lkvh ncn afaq +bjytofa ltz mkyy bwt uxca somiz rhgdg keaqu ybr +aipljn qpq nilajp udgkchc dirvxg rrbmi mxfxkk kmfxkx +sfzjemk hjsvnmb hfd hprfmvg pbhkc +cvxi srj ucy yuc euswuns jpox +tajlnn ivuecv fdfce rakjq bfuxirh eibde tajnln nlajtn +ndvm mlnhy bfqlzn nmdv ohto +jysyvwy xbcyt lbbm osoye swwtwa emfznci qnzc qsgk +xcm jbqsuo xmc mtrk bojuqs +ukshrrh xhfl ooxgq vadlcrg ydva hugplg mnqbd wkyouq +mnmqys bhws megar krgoke modxe krgoke clovh dlo +ejl qzc agxph jcn zcq zqc +jgh yhh hjg jhg +tarm jboyg gbyjo pgalg xugzt bph mart +yur wrrahr fnnfqu rwhrar cdq +mukod gueg guge epalg xjkctt +hub hbu hbzul buh sqfl +xyrly lvpitr xfzn jjcl uvcnz dnpdyzq ifaiwe zlvzcx +wxzsf tgd khvwp cmd mzv bsvjvjm wvhpk ublnqyz mvbjvjs peishcb +zunmk hxpney nphxey znmku +bfxlgur wftcw xfkf fsik xkff ffxk +sxyjzr ugcscx uiovqx ldzhord xgxbfph ldzhord prdhg rhdhzd ugcscx +udg drb apyjq dgyevo fuxjhg +qshbe aigfdp wyvz xfcos wve dgfrufw dwimmb jfh wfrjbzk nwgrigr sbrpbb +ahpn xnzeof wxbv chxpcu jmso age ojsm bqonfki hqhrkw +mfupm vvig ndqbbm jlw +ejqh ebcrytj zpiqtpp ogznd +wkwkae odq rsrnqk nslczz hiyyhur kuw mjbuwll vduvod ryhuhiy swo tsos +znkufyx jejrdno knr wkx ikrlly tnxtj +iizdiw iizdiw hukep rwj eaq ptm klta rwj onaz +znb egqy qqnc igqr ikza ojgzkr xaen kurb pyckxvt wqx +pbohpw bphowp dajwdpp kotevs +hmuvxu zdnguk jhcmj gccyxiu cxgiycu uyxcgic akxi demeff +zjr lupzwcy puva rzj +cdn wee iqkbhl jwxo nhl cqd mqgqf ltdfg +phwco ggcj cggj ergpqmc kcz +aryjl wqwmkc aklktpz kptnroc mckqww +jadydt atjdyd tajdyd owswsgm +dshqt kacoge sdqth ylobih +kdnik knkdi dinkk xwvqa gvii +cifbkpt zye xhwnrhm fctibpk sbn pdqry emkye kzyjpa plzkc btkfcip gcchi +kekfr fufp dfy eqebgko obbn nuh +zixfbus skuf bea gimbqq caubhto eba uvkovz xisfzub peukmyn +okihcgh gazrc slee vlnwyg geviex eesl nmnvk rcbv ycupyw +tcvlgqs wxe lusvwzy unr yzluwvs wsylvzu zkwth qdykv +hyenkj ugao vlwgb putcepr lyeccs fqdotx burf aqew fje rfbu +uhmnc zgnkarz gylqawm abl zimcz qbs zzmic +pxkbpn zuxlwtt rlbhegv zlxuwtt ooxpr pgjx +leg wavgps fcplfpc xvxih ueskmi dvu wbiq nvtia pwjojw usiemk ojwwjp +zmrpknx xrfpq avque tvoyqp +lyposyj mckyoub sqbl olpsjyy hjafzi wmojb nvezofd +yflxrg egi aij qvc yflxrg typbs yflxrg kliexy eqnj jqrr +gggt sht kdajvz sht gkqwaot sht vout +ahl aucpih feig man umtchcv ceqabr tfptb +ftlywun voaorf kde ilwt hlpoe pksqxyh vpg cxo xgq fdkkl sgxhnq +zzekhfi akb lupta sgtd qapznzf lgidsx lidsgx akgmq ettuwjq xyumf +dxhpku lwoxpim gwb lhjmoh gxqapd ntmvc rvwwszg pvin lwoxpim coubc +qia bxmremo rjf vaeio eqexwz wuoz sguf bsbusof xqeewz +iczzz krf hbq tsgrih mzjabrt sfnwrm djignf zwac cwaz dgc nsrfmw +yvarsva zzpbp yai und kkbinr zlyj nyxxof ggrgu vyk eib +nepzm yrrgr vrlhbv hykmiog natrqx jvpq nbyhe zuo grx nwl +cfboeev hcn yfobyx cqvlo obctww xxaux ofybxy wouguq avuztl xmgqq xyofby +tikv uvzp oxopqy reh uzvp wefka vli kied gngks vbz thfsxyt +exxvknp pucbdyl dboto tzat qze xyinygz mhzl ubahr ekxbtk +jcz ufszbi pknsfgb ivok ijau okxolj etecn aurun zsa gbxs uryx +ypnb ousd osg mvset ipffzdn dfinfpz ltescx +taeoct aoetct aocett ttda fcdqnxv +bimtlk ssax bmrifkr vfxdmq hglp rgzr zpvk zhxtq rndwy mmr arkr +bwvdb axxbhzk nwfmbbu kzuc sahv cvas wdac acsv +xavkwou yvx ouwkxva otbe uzr mmw atq yiy ghavd qta pqlhv +omzht vsdsc zhtmo hmotz +eqt wtveez syift shtfnc hmckjxa apwbvn yme okdl hbihdtv hxahns eetvwz +rokdg ndjw hprxjc viys mbcctod dbvd +lhzb fyxf xaslmi sjd vqp grxhmfe snetfv mgivd uaknj givkdi +gxkxl kqcdnl rna jhcuepd npiedg djcpheu huce njryw bjluhq bvedvl kqxu +sogh uym atpzuwx vjgbe xgrvkg thgbyn mptcebt rkro +tnpxw uxrqxd lajmsmr tnnlt vrvbf deret hkmvrs eubvkn kks hjq +rcdoa zfja vod supip dvo +zbxdo xglqv how mgoq jqrdou pwrminc lidi nfs xglqv lidi +ldmnp dnqn ahhr tha mvsbsfh rpm rgus faf tjash +ewrdol jqhfpf rckj mrxlwj redjg bmxprx grla +rhr jksebwa vtu skwaejb vut +wrx iqvrjh atrt xrw vtqo tkcasd xedjh zkqrh vvhj +owc qlzygar uajwwe obzl inxawur +crbtrf phvy nzipo rctbfr trrcbf +vwuun wcfhhzo vxxjdt fbf bqtmmhs bffqcna +wkxfxmv zmrkyh sggw whwcw zukynw +lsdiy lnbn kblxi qfyib irfl mymrr zqbl +gwdkeu ghn afry zxoz fary uzntlnk kee xtnop ptnox zngoran +lgs lsg sgeseiz gsl +erpoqpi svtnv vsogl uym amzxbs +jtmodqx yjcsfcl zosugm jrekfdw xxbdqnx fcha +vio tlfxokx xaoq pydeiq glxsuzm honifvf maiuzsy uizsyam eco +ophcui saka qyt ltti syw +qff qff sde ryv +eiii jazx nlehtx tnhvxl rzvsjo qkupif feypppe tefxr wdjmlc +pdrr mwuy wccd rxla drpr enbbap +pclml ubwdbz hfudj gdpujfm ovabv +uink ffebi wdvhqzs qiympf lqxihty vnsp wdvhqzs hutxkcs lxfuos hutxkcs +fycoaw palkpz yrkg kappzl ncjym mergg kryg +eqy npvgh ghafkro piqnogb polacs qye hnvpg +dxyy udhmz jij tqsuic qxz erctv +urum nmbr cgek eetmhj gxr oxgukf wzdmvi oibzt fxkoug rcrywcr rglx +jkp ofej waibl opqhmww ifnczcg jdtkbc lil isc ill mylvuv +vqbcosk yhhsy gasmj bspx peakt cjtekw hvzo ywe qcvbosk ohzv qddt +edq llbvsx vedyvlm gou wkecank rkgf ziyrr belgo tbz +wbome vhzf ztk zaxiu ywjb supuf beq sxq spuuf pufus +femu ymkdoew kjynct aia +yjymr orovqj aremii licw bdtnc +uyade fbx duaye ujtvpn +yzvp pvzgjp yofcvya gvkkoh cafyvoy mhsm okhkvg +xuh qkaf dmi imd tzmlce mqkxj qilrc dim cadotvy +azpqgb kyc aflgyaf laagffy kesmk jzyzaer taf bpkbzdg +ogd dbdlh dqt zaaloh +exal vgnfx omu omepvwf szcwq snz bptite bzqyxl khmblyc sse emg +yqcbwsn aihhf tqck tcqk wqwqy cfez xahpn +qqbuf lil ies tqu pyxhqp mnfuk azj +vwma rzdtgl mxbasw nwgjav mwav +itpjfq rrgyt hralwm fqrig btwcod +ydjd kmk fvwr wrfv yvhw mkk +xbsxub yhsj xzbuf ace xubbsx fzuxb vxk +ttsist vubpf mhwkmtx vlj hdsva kmmhtwx ukxr upfvb tbma fxsrnxl hzwufho +wckjvz unmtev egxts ihw topvw ptowv rnihhmq +gpdtl kcric nwg ssbs qah aarp ydsdty ngw +lzhxbbq oktvcw xbasqe owtmwgp koa gumjie sodwrp hqsw aqh dtgsbb +xjbyy mxfxa ogvk nqiy qyni ldqwryj niyq jjixc +uhbul daccgva xtiz dim uhbul yjmakv yjmakv +huo esajup ouj oju ujo +eeeu hwvsk jfkmds okhi pogskfm itdlbll +lpyubo dylpfb iehwug decj ntidy cuygyg lalkb iutu oxgm imn diff --git a/src/main/resources/2017/day5.txt b/src/main/resources/2017/day5.txt new file mode 100644 index 00000000..30fa4278 --- /dev/null +++ b/src/main/resources/2017/day5.txt @@ -0,0 +1,1092 @@ +0 +0 +0 +2 +2 +-1 +-3 +-3 +0 +-6 +-9 +0 +-1 +-12 +-9 +-2 +0 +-14 +-6 +-2 +-10 +-12 +-10 +-13 +-2 +1 +-6 +-14 +-2 +-11 +-7 +-9 +-15 +-22 +-25 +-26 +-19 +-28 +1 +-2 +-38 +-39 +-30 +-18 +0 +-26 +-1 +-24 +-1 +-30 +-44 +-35 +-9 +-32 +-5 +-34 +-4 +-15 +-21 +-30 +-10 +-32 +-19 +-40 +-12 +-49 +-58 +-2 +-14 +-51 +-37 +-9 +-4 +-48 +-64 +-37 +-55 +-40 +-37 +2 +-22 +-68 +-57 +-57 +-83 +-65 +-38 +-22 +-20 +-78 +-27 +-40 +-4 +-83 +-33 +-47 +-74 +-41 +-74 +-68 +-18 +-8 +-27 +-23 +-53 +-70 +-43 +-99 +-48 +-90 +1 +-74 +-9 +-80 +-96 +-33 +-7 +-53 +-98 +-54 +-47 +-84 +-81 +-79 +-86 +-14 +-115 +-121 +-30 +-28 +-13 +-113 +-41 +-20 +-34 +-19 +-71 +-39 +-17 +-91 +-115 +-108 +-74 +-134 +-12 +-91 +-27 +-59 +-27 +-132 +-34 +-8 +-52 +-93 +-17 +-151 +-93 +-102 +-62 +-62 +-120 +-25 +-75 +-35 +-162 +-61 +-107 +-83 +-106 +-23 +-168 +-42 +-13 +-74 +-52 +-169 +-123 +-95 +-174 +-56 +-43 +-84 +-21 +-5 +-120 +-130 +-55 +-3 +-93 +-158 +-61 +-4 +-74 +-65 +-157 +-112 +-147 +-24 +-23 +-155 +-82 +-73 +-25 +-82 +-42 +-200 +-120 +-57 +-96 +-38 +-121 +-25 +-211 +-117 +-42 +-181 +-56 +-204 +-193 +-88 +-143 +-167 +-42 +-178 +-204 +-57 +-120 +-33 +-164 +-122 +-219 +-136 +-174 +0 +-36 +-64 +-77 +-34 +-158 +-163 +-194 +-212 +-101 +-48 +-216 +-141 +-142 +-189 +-101 +-144 +-158 +-114 +-88 +-251 +-172 +-173 +-94 +-89 +-12 +-188 +-218 +-130 +-33 +-117 +-39 +-245 +-195 +-20 +-37 +-183 +-24 +-48 +-159 +-36 +-68 +-96 +-215 +-127 +-241 +-171 +-44 +-2 +-203 +-27 +-37 +-241 +-173 +-193 +-143 +-52 +-187 +-54 +-236 +-219 +-71 +-197 +-162 +-245 +-133 +-153 +-240 +-250 +-91 +-128 +-20 +-263 +-124 +-46 +-290 +-194 +-191 +-60 +-92 +-97 +-284 +-60 +-44 +-208 +-59 +-6 +-40 +-292 +-1 +-14 +-27 +-71 +-144 +-289 +-16 +-266 +-80 +-138 +-215 +-249 +-104 +-29 +-260 +-124 +-178 +-331 +-283 +-47 +-253 +-80 +-316 +-62 +-15 +-327 +-64 +-201 +-26 +-60 +-110 +-117 +-13 +-99 +-139 +-124 +-25 +-242 +-92 +-10 +-322 +-110 +-169 +-26 +-353 +-284 +-234 +-361 +-95 +-37 +-93 +-186 +-90 +-26 +-90 +-268 +-179 +-305 +-378 +-145 +-238 +-358 +-186 +-108 +-120 +-75 +-109 +-279 +-192 +-308 +-197 +-373 +-19 +-38 +-238 +-133 +-60 +-334 +-45 +-169 +-167 +-257 +-107 +-222 +-380 +-321 +-99 +-177 +-268 +-224 +-45 +-323 +-407 +-167 +-125 +-243 +-331 +-268 +-132 +-254 +-204 +-191 +-280 +-242 +-223 +-313 +-237 +-234 +-274 +-327 +-271 +-362 +-39 +-194 +-184 +-16 +-214 +-46 +-199 +-108 +-332 +-316 +-29 +-327 +-200 +-52 +-260 +-128 +-103 +-67 +-109 +-432 +-399 +-153 +-403 +-176 +-434 +1 +-225 +-286 +-375 +-206 +-395 +-275 +-120 +-404 +-381 +-156 +-215 +-350 +-257 +-293 +-231 +-114 +-52 +-149 +-296 +-440 +-413 +-285 +-400 +-265 +-378 +-75 +-381 +-281 +-436 +-137 +-335 +-111 +-92 +-12 +-27 +-20 +-208 +-322 +-151 +-264 +-207 +-361 +-314 +-258 +-81 +-327 +-440 +-286 +-108 +-272 +-392 +-17 +-40 +-486 +-287 +-205 +-211 +-160 +1 +-216 +-114 +-32 +-143 +-113 +-489 +-109 +-56 +-371 +-258 +-430 +-29 +-475 +-141 +-477 +-169 +-473 +-264 +-225 +-123 +-412 +-395 +-391 +-28 +-527 +-493 +-471 +-401 +-510 +-430 +-154 +-34 +-533 +-544 +-39 +-535 +-553 +-447 +-144 +-517 +-482 +-362 +-265 +-434 +-504 +-526 +-31 +-53 +-170 +-44 +-126 +-75 +-163 +-136 +-508 +-564 +-289 +-68 +-541 +-165 +-496 +-78 +-117 +-268 +-326 +-361 +-194 +-483 +-495 +-560 +-215 +-363 +-275 +-426 +-160 +-333 +-182 +-457 +-96 +-200 +-569 +-236 +-31 +-365 +-419 +-43 +-366 +-385 +-322 +-430 +-334 +-156 +-377 +-184 +-522 +-289 +-129 +-87 +-501 +-606 +-84 +-163 +-318 +-552 +-442 +-590 +-137 +-517 +-161 +-333 +-497 +-150 +-188 +-401 +-613 +-131 +-595 +-18 +-591 +-134 +-44 +-637 +-500 +0 +-349 +-483 +-258 +-124 +-449 +-260 +-150 +-269 +-305 +-650 +-619 +-328 +-478 +-5 +-514 +-73 +-261 +-503 +-101 +-480 +-37 +-192 +-497 +-298 +-464 +-514 +-515 +-203 +-17 +-302 +-9 +-409 +-285 +-140 +-46 +-136 +-470 +-544 +-666 +-590 +-382 +-546 +-619 +-194 +-543 +-323 +-264 +-673 +-177 +-342 +-539 +-507 +-660 +-655 +-272 +-28 +-181 +-266 +-242 +-337 +-116 +-421 +-537 +-24 +-6 +-241 +-110 +-255 +-429 +-31 +-380 +-214 +-337 +-514 +-68 +-102 +-320 +-12 +-648 +-180 +-192 +-554 +-182 +-303 +-623 +-583 +-686 +-367 +-325 +-488 +-71 +-466 +-625 +-402 +-104 +-348 +-690 +-714 +-708 +-212 +-302 +-286 +-44 +-386 +-455 +-456 +-353 +-469 +-145 +-116 +-412 +-273 +-705 +-331 +-519 +-592 +-630 +-396 +-82 +-434 +-35 +-436 +-490 +-471 +-738 +-488 +-476 +-295 +-399 +-262 +-44 +-761 +-121 +-643 +-383 +-221 +-11 +-380 +-555 +-382 +-68 +-554 +-621 +-27 +-549 +-661 +-197 +-116 +-339 +-577 +-206 +-790 +-283 +-248 +-163 +-503 +-481 +-573 +-308 +-650 +-42 +-23 +-451 +-72 +-470 +-709 +-589 +-495 +-377 +-246 +-5 +-667 +-697 +-585 +-511 +0 +-787 +-559 +-320 +-81 +-782 +-660 +-153 +-111 +-162 +-584 +-103 +-774 +-827 +-453 +-815 +-290 +-794 +-667 +-524 +-281 +-230 +-205 +-333 +-495 +-705 +-568 +-519 +-132 +-819 +-190 +-736 +-135 +-649 +-712 +-126 +-233 +-827 +-353 +-197 +-803 +-19 +-124 +-691 +-234 +-96 +-690 +-500 +-321 +-277 +-56 +-838 +-512 +-6 +-70 +-611 +-285 +-253 +-14 +-545 +-143 +-193 +-352 +-755 +-634 +-572 +-320 +-132 +-522 +-688 +-273 +-194 +-613 +-492 +-715 +-624 +-581 +-505 +-185 +-468 +-853 +-445 +-407 +-605 +-86 +-583 +-160 +-746 +-436 +-673 +-597 +-479 +-278 +-259 +-503 +-121 +-710 +-169 +-363 +-639 +-325 +-146 +-760 +-673 +-177 +-400 +-431 +-782 +-756 +-166 +-300 +-461 +-917 +-872 +-786 +-921 +-346 +-137 +-638 +-396 +-812 +-107 +-303 +-55 +-70 +-675 +-477 +-520 +-843 +-632 +-290 +-497 +-758 +-20 +-636 +-166 +-681 +-459 +-591 +-332 +-65 +-814 +-373 +-909 +-72 +-71 +-513 +-387 +-209 +-199 +-777 +-663 +-635 +-874 +-596 +-733 +-226 +-950 +-845 +-321 +-94 +-450 +-672 +-665 +-469 +-369 +-415 +-210 +-290 +-911 +-140 +-413 +-823 +-74 +-833 +-163 +-577 +-576 +-926 +-683 +-417 +-970 +-11 +-460 +-689 +-493 +-879 +-797 +-578 +-918 +-633 +-591 +-915 +-550 +-646 +-33 +-122 +-184 +-324 +-1006 +-937 +-215 +-253 +-420 +-495 +-797 +-950 +-631 +-409 +-528 +-312 +-282 +-594 +-377 +-258 +-1017 +-354 +-871 +-25 +-650 +-765 +-246 +-710 +-815 +-772 +-733 +-920 +-1001 +-355 +-581 +-782 +-711 +-1044 +-922 +-74 +-391 +-3 +-847 +-1020 +-963 +-1036 +-1007 +-123 +-605 +-642 +-591 +-648 +-688 +-555 +-937 +-862 +-885 +-553 +-509 +-723 +-696 +-406 +-960 +-160 +-633 +-823 +-874 +-1076 +-962 +-736 +-984 +-486 +-645 +-932 +-734 +-744 +-21 +-20 +-506 diff --git a/src/main/resources/2017/day6.txt b/src/main/resources/2017/day6.txt new file mode 100644 index 00000000..d3697028 --- /dev/null +++ b/src/main/resources/2017/day6.txt @@ -0,0 +1 @@ +2 8 8 5 4 2 3 1 5 5 1 2 15 13 5 14 diff --git a/src/main/resources/2017/day7.txt b/src/main/resources/2017/day7.txt new file mode 100644 index 00000000..1c58260b --- /dev/null +++ b/src/main/resources/2017/day7.txt @@ -0,0 +1,1512 @@ +qgcmjz (87) -> skzkx, pzkofch +remwlv (18) +ngrmq (80) -> cluej, ywrxbgi, saznyj +omqech (119) -> asqih, chotekn +xekwze (70) +qzjln (86) -> gstsuq, hwbzs +hpltlm (94) +diwnw (43) +losei (80) +xkzbkz (16) +rzzcyrh (7) +xkkyybu (7) +gcricg (135) -> oowec, vfsonrs, fcszioo +ikkvv (12) +ugdngw (79) +dotrpsi (42) +xxemgkm (34) +zfcck (18) +haumg (7) +knlyr (51) +nzeiwlc (51) +cuoso (35) +diphdjt (44) +pcafsei (61) -> aenhbm, urjmc, ckarib +cnaxol (35) +ydsxmg (40) +kmybac (1311) -> sjlax, cyvwqu, siiztl +lpano (18) +idgqyfk (12) +fqxtra (261) -> aclfkav, aaovpqz +erqjic (5) +ikmaui (13) +myxnc (14) +imzgw (120) -> gyprs, dxswnz, xxzms +uckfdi (25) +fcphzy (27) +bnyaw (30) +iujsypy (34) +nrkpq (96) +iylhfc (27) +fkxei (241) +rmxzhgl (39) +xxwpir (94) +rfvjk (49) +zdkvsp (65) +dqiievh (63) -> oemva, cnaxol, lsmev +aivrgc (50) +gvrkyb (12) +seasb (34) +qjnqrxg (91) +zlunbf (67) +rqpripo (1383) -> aergp, jhubo, yfznza +kutjx (19) +wrntht (12) +vjdkx (90) +uzxcmdh (7) +exlobhb (80) -> fuixzt, lbhoabl, actgtp, cdfdg +sxjxk (21) +bebmszs (75) +wvghqb (60) -> qvqwp, jafchi +ieqcv (245) -> areod, lrsaprr +mupmhq (77) -> iavoj, tnlit +urvmk (26) -> hpltlm, odyxpkn, owwucfr +zhmjupz (1101) -> lafvy, jzczzhm, cytrtqs +udjtzas (92) +nuxmb (97) +zaqhiy (30) +slijas (78) +vbkifa (32) +ginnjra (67) +blsrmal (20) +xdjqk (48) +fuixzt (45) +eczncbr (92) +hzlhf (323) -> fgvyiz, pjssop, yffeaia +urmzp (297) -> gfodmz, mixlrfs +ypixztf (80) +deuia (2103) -> xpcyuu, bjgwnd +akkjr (12) +rupuyo (31) +fotck (62) +gnkzi (8441) -> cqcmf, bhsmhi, lkisrer, wkwylw, xunaojn +aokaek (55) -> hqzsf, iraqghm +kfwcftc (66) +iefrt (81) +kcehqft (92) +qqfrfmp (114) -> rwzuaru, ypixztf, wvxne +qgxkjj (70) +ffxfi (81) +aecfqhz (35) +jyhalw (92) +ijymh (94) +rfprjll (81) +brbnff (942) -> rlyuhm, duqiho, opsqo +iouzaj (198) +udmpb (19) +gavjcu (24) +npqgif (21) +vwjmeq (12) +nlxvg (32) +shorw (163) -> rdlqapx, dzkxl +exmqzmu (226) -> ssqlqmn, jfwnt +vsznmk (94) +bfkxr (226) -> qurkt, egfqvs +gyuxgla (48) +cuanrjw (120) -> rtdsov, ypbvxys, gzlbsml +llzufnq (456) +kzvxp (67) -> amomsn, ucocpbv, vlmua, zigfqp, exmqzmu, batiqxv +vptuwar (181) -> zdkvsp, bdank +jywenab (449) -> uvdikh, kdamqdd, pksdzch +minal (8) -> shwec, ltkwjkw, koyyc +zsdbkwn (90) +gsbka (18) +rpvpz (132) -> xvikaq, efiio +bbrmw (1738) -> eimqx, mvrpacv, grmzk +xciyqzi (27) +cmxxnel (223) -> vwjmeq, afowbn +vedvg (63) +jxwep (642) -> pnygn, ufjyqh, svouyu, eqkks, tdkdi +tysfacj (14) +eoqoqq (94) -> emuzuk, cmcjml +rllanu (38) -> kgxms, cguyudo, cdvkhp +xlafbbu (99) +agnojmu (54) +lhdtxwa (79) +cnmtugy (23) -> blrmjo, blkwmr +zvwli (233) +bdank (65) +eebealj (7) +ugeuc (67) +vybcj (166) -> fknwa, aecfqhz, cuoso, okcpk +ewlzxp (284) +iystzy (35) -> xiqdw, ecxsy, kikilp, ozsipa +vumoui (25) +dahxznk (74) -> munngu, erpdbe +hkbpff (94) +nkiyss (97) +mlouksr (16) -> qmuueat, owmxj, uhnaw, dazqtu +wtjxdv (10) +mixlrfs (35) +vvcwap (1351) -> ltcqa, ieaho, apdrocp +afazbmw (74) +kskmlk (31) +xvanyc (65) -> tqpztin, nrkpq +fgvyiz (83) -> cyzdj, zmmze +rxkiw (153) -> aamnwt, ttqxk +vqhncp (107) -> agoptjb, qyeifkn +uvwbxrr (83) -> ghmke, bkzek, dpyrzzy, gcricg, pwxkp, nawqww, cfgjwaj +fszyth (30900) -> agvbghb, xopcltl, ifdqaup +ufaji (64) +xgxzul (18) +peokst (5) +xinic (215) -> cboxdc, atvmevd +ydkppqv (10) -> jqers, rllanu, ifztqrk, urvmk +srsjjft (52) +fwnnw (22) -> vyilf, wycodto, rmxzhgl +afowbn (12) +hwyjqlo (23) +qyjvqwn (270) -> xmrocio, pojbfof +riaadk (72) +pydqh (93) +mngflny (91) +fuwwn (50) -> rgxjg, pvuyft, yqsufra +cypafs (209) -> uloaqjr, yvlzlnd, wydgy, uquuws +pnnbt (40) +vtodml (176) -> rfvjk, njfxxqe +fqjafn (172) -> ebmdbz, utltope +eibjdy (12) -> idgwugs, cbazit, rmungsh +uapkd (91) +apdrocp (5) -> uhzdjta, icaiy, wfchmxn, rnsmk +skcmm (30) +pkoykgl (23) +oyatmo (21) +nhgqoun (67) +qaslzm (95) +agoptjb (56) +tqdtgzi (751) -> fxplut, ablnk, citooti +chcuadg (67) +cdvkhp (90) +nsbse (99) +gwbbe (12) +qcytpf (58) +vxxmj (113) -> kcehqft, pgzmhg +kylrxvv (153) -> ktoxzno, vfjmx +kcfvm (433) -> kvfus, vmkyxsn, dclvnt, yvkzq +lwqwrpg (90) +yixuf (120) -> rkjzfmm, kcxjnz +vqrzfp (164) -> ekmhno, smyqf, wzecczv +enuyf (54) +pczzyg (55) +gugquvb (72) +dnojir (83) +hsronxu (235) -> pgbhv, ottdek, jumdiue, xsrrz +ffkubc (60) +spzex (20) +naifqx (55) -> dzsqc, fzluu, pncikdq +yipippp (86) +ofegal (85) +doqco (155) -> apmra, xsrotj +rdlqapx (34) +lopis (245) -> hfwmhrn, wbugpb +azwmgvy (63) +apmra (53) +yxikq (95) -> jsilno, uyzvco +ietzw (733) -> fylsk, bqedfkt, hmpstv +xopcltl (69) -> cadju, zndcv, shxnlm, kmybac, sjaufyu, aluvk, zhmjupz +nsronp (38) -> xpulso, rxsllr, liatu, wvltmyv +qjcjey (93) +raopje (31) +gtbbe (466) -> jxfhkc, cugcfjb, lmijj, vqhncp, xbmjza, uekierg, xwsxb +keazs (49) -> qphnx, bdrjupf +rkjzfmm (10) +fhtyxty (65) +ejfvc (78) +mhotdh (237) -> udmpb, kutjx +swrda (16) +pcdwwsx (92) -> tyujzc, lghlhb +ygjfl (80) -> toarg, odiiboe, kqlidl, vjcjl +yimhrw (373) -> wewaq, woiffy +iysaej (30) +cguyudo (90) +uohzm (150) -> aozkpqv, ugvump +hpyjk (69) +hmpstv (205) -> isbsl, zfvrxs, gjmiong +seygrud (79) +nvdacd (48) +zzffzbm (24) +lgfhkns (23) +cyvwqu (40) -> cbgrkw, qancsuo, ppwjh +gbloa (78) +vtvhz (98) -> whpko, yvxlc +jcrbv (79) +ucalkgd (21) +ruvqq (33) +wbugpb (6) +jkenxh (178) -> flahmx, pjmvysc, ujfkgpk +yanech (194) +nvncoj (624) -> quvvrml, nilbqer, liwvo, rxkiw, cvzubu, gonle, tyannz +fqrqvhm (500) -> pcdwwsx, iouzaj, frdln +ydtamvm (94) +xsrrz (31) +wdclggm (81) -> szqbyiy, ngrmq, bfkxr, bvmnols +kndlm (86) +hxlom (8) +wwniofg (7) +gvwdr (12) +nhitw (66) +tnbuu (957) -> bpdjd, zmxnypj, sjldep +lynlnjr (7) +csbdis (99) -> utiueqf, gsbka +skzjwi (56) +agvbghb (3128) -> tfpggg, ugnsbfr, aidxe, djihb, otzlwo, nkhrpg, qctjxs +jsilno (31) +cqmdp (76) +aenhbm (278) +jturbxp (50) +iewhsnf (81) -> gilke, ohedu, grzkzam, dzino, ockea, seddq, hzggfe +gyprs (29) +yvkzq (111) -> gjoof, bqile +ukvepc (94) +ihdujet (23) +vncffh (13) +wtwmmmy (66) +pwydd (89) +jjkkl (195) -> lgfhkns, pkoykgl +aclfkav (18) +ggqyz (10) +eyekgw (95) +nafqfvw (94) +yocxio (62) +vvvvgzx (40) +sfbfkb (1699) -> fzhiga, jpjufo, wvpln +ufnshbq (82) -> ipkqb, rnllfw, vjdkx +ouciqi (45) +isbsl (16) +hdgar (23) -> deuia, wkfpb, yqdhlr, qojdy, uvwbxrr, njtrh +rmvsw (48) +vpicsc (61) +qeenjrf (96) +rhygakw (83) +soyuwm (52) +unknkby (96) +rjppftm (64) +frdln (30) -> tqyhzm, fpfvv, hltmydl +cbbyjs (8) +wrkgz (168) -> iylhfc, fcphzy +cdwtclt (151) -> thkezk, zzffzbm, lluabe, cyjex +qyguegc (38) +vdzxo (227) -> coyodgw, qgxkjj +rtkjnq (55) +pkikya (9) -> wcdiup, maajj, qfqhlzi +tjxtjg (7196) -> yhqov, kzvxp, nvncoj +owsfeci (227) -> juogz, sqzyu, pxyfbvy, csbxo, sbpdtfq +ogljepx (8) +ssufgph (237) -> vxgadew, iujsypy +ikkvmpl (21) +ohyndb (98) +eoqzo (51) +krodu (33) +hflxhw (50) +ouvco (90) +kktaa (309) -> ofvivee, vumoui +ipqrsx (18) -> kxvmq, cdgxjqk +hfwsmrn (12) +rlyuhm (103) -> igorbc, tnagy +duqiho (5) -> zuuor, lwqwrpg +lubvf (38) +aozkpqv (24) +bdnbvsc (60) +fuclj (51) +cwzgcb (72) -> eweeq, kmvor +yodjjz (51) +pbngkw (7) +wjuxxef (62) +mggnu (63) +lcwnle (94) +zcdwm (26) +aajog (52) +mwcqrpu (55) -> yocxio, fotck, qdchc +jlenggo (94) +rgljpm (67) +vvenem (59) +shkxavi (58) +tdxow (7867) -> mrxqlw, htzrkz, ghwgd +cqgfeau (90) +cyjex (24) +xhtqxz (40) +dzkxl (34) +sknyb (76) +aqgnukp (72) +ucqqqi (143) -> zojod, eijqpl +fwyuklw (39) -> axzwwto, ufaji, hxrppz, izfjh +fmtjcxp (94) +vcwxkxy (18) +thkezk (24) +aidxe (118) -> xzaleu, pwyqnm, zfnpy, cjowcmb, rzgwqq +ctjkvre (95) +lxsycwm (215) -> aqtupw, ogffnth +otrpt (59) +yhqov (1441) -> xzhdixq, rxctq, arajafq +zmtzdj (216) -> vweupv, ktmepg +tuxbrfu (52) +ehpsber (92) +qsxpo (1427) -> mlouksr, zcqzjv, fxejcg +msmar (58) +qhehe (1428) -> junno, hhugr, yixuf +azsjzcr (75) +aabivaf (7) +ktpudp (81) -> jczjrin, tdsznt +mlgxkzg (43) +yobqdj (111) -> gmkrufv, puvkwv +fvvsis (97) +nqctxw (98) +uxczdzb (6693) -> gcaev, bqruuvx, pcafsei, ubahwni, kgqfw +gbsjs (69) +bllys (18) +klzefiz (28) +gkejxoc (78) +vtifny (42) +lsvrn (408) +ebknkgh (75) +bvntvu (170) -> ynybi, nxweh, oyatmo +hwkly (43) +ggqznq (69) -> qnywf, kndlm +jafchi (73) +bhnnrnz (7) +moolvq (69) +qdnqx (83) +vyilf (39) +shmrpov (257) +yvusemj (63) +cboxdc (9) +vfjmx (61) +ycbet (188) -> runmsjd, jzgllr +rxgbyox (82) +oufdzsi (30) +hpoeayk (72) +vchyhs (102) -> unuscm, dmuhap +wpawu (65) +pwvjth (69) +cxgcf (102) -> moolvq, vskve +kxvmq (71) +feqwmhy (9) +pgiixde (59) +llhhjb (68) +kyktl (123) -> ednxkm, hbdvy +hrdvgwl (27) +xxmermc (22) +vuvsu (7) +grmzk (251) -> kzwvmh, kwxkc, zoyfhq, xccabhd +kmvor (75) +rnnoy (99) -> ihekxpi, bhbwz +zlekeh (18) +lxbgm (52) -> vxudcio, pwydd, rjncwf, kdhwxo +ciigv (90) +axcqrvp (59) +ixzpx (85) +sqqrkn (12) +ikygytk (205) -> iriwf, lpano +fjuytze (90) -> ucapgv, riaadk, tczoglq +jrwycer (31) +xewyur (190) -> iigqx, zzbbtqs +ldbfz (94) +pigll (57) -> rpjxbhc, ilbhxw, jjrqd, rgfhr +tcuxy (211) -> vbkifa, qecdd +jscxey (12) +pjmvysc (39) +nzoczg (15) +actgtp (45) +sgoep (81) +wfchmxn (40) +isnxyg (67) +jouzv (48) +xpulso (78) -> pydqh, qjcjey +ivlvuhq (73) -> gvrkyb, qnuhxta +fvaiqyr (634) -> ufnshbq, uuskq, qyjvqwn +gopevi (67) +qojdy (1003) -> hxxhe, jkenxh, kyktl, fwyuklw +ntozie (48) +gjmiong (16) +idrncu (73) +txoamw (96) -> iefrt, sgoep, skaiivy, gqdwda +kawbxw (123) -> pmuxnac, wndlhkf, qhcuolm +kdvfpg (68) +bfqjth (80) -> kcentfc, wxftfvc, bqnykil +mebzrnn (32) +yojkhdg (33) +uscpxzv (39) -> ntozie, jouzv +gcaev (43) -> ewlzxp, azreib, bkzadqb +cadju (633) -> kktaa, bfqjth, hsronxu +xbaebbl (43) +vlzkjc (47) -> cyygfy, bebmszs +vlxxwu (70) +znxhe (79) +sqnpby (45) +emacdc (42) +nzznh (36) +idbik (65) +zrxjkr (653) -> fpffxl, ekgfr, txoamw +jfwnt (46) +hjiiezg (44) -> yvusemj, azwmgvy +kcxjnz (10) +hxrppz (64) +wcdiup (63) +stoosc (55) +xhbqmie (68) +lmijj (103) -> txgxosp, gzjkmy +uinplcz (405) -> vpuqipd, csisv, shmrpov, zvscftj, lopis +uekierg (153) -> ruvqq, acgyx +fiazqvj (51) +znfoyv (25) -> bzgeoqg, ftvwc +cybok (31) +gilke (96) -> hlchui, utzqyl +gtlmfhu (36) +dqukfsg (37) +dlyei (87) +tngwf (68) -> txodvj, xkjagrq, qgcmjz, imzgw +wzzdih (79) +vginql (139) +kmheqrj (185) +hycppt (310) -> wupzqha, dmyewr +bwefj (31) +twvwpd (7577) -> skiyk, qhehe, cpjawpx +zuevpk (79) +sbvhk (30) +vrzzc (59) +ejbtd (41) +acilnmg (83) -> ciigv, kqxsjt, bpnbtab, pumgsq +yufve (8) +hcktpld (61) +ygprn (49) +quvvrml (105) -> wruwjn, qqskz +fknwa (35) +wydgy (11) +yrrds (65) +gzbnkz (12) +asqih (57) +fvcfdo (27) -> cdaccdo, hlrknn +dqntfx (281) -> lsvrn, suhmny, kawbxw, lxbgm +waewrc (92) +tqoul (17) +dxvyfrf (31) +qdcyv (125) -> hvptp, abzahfo +tsoub (222) -> akkjr, ikkvv +ufdpy (44) -> qaslzm, eyekgw +zgigo (8) +csbxo (153) -> gfqcad, ftuet +nxweh (21) +yujxzit (69) +ybddxou (33) +ygara (10729) -> fqrqvhm, nsronp, qbbsz +dmobyt (11) +anmam (66) +qayqkk (9) +icbkonc (23) +npkvkpu (1870) -> fkpxwb, shorw, tibqjki +loziss (59) +qnywf (86) +xbmjza (135) -> kspoovz, qwezgho +ixbgkw (20) +xwsxb (83) -> pbrsgs, rxzgrn +dclips (49) +uypdm (94) -> iaphph, ukvepc, nafqfvw, xgnrwy +xxzms (29) +lkisrer (129) -> aywhbw, qdcyv, vlzkjc, tihtr, okzwi +ieaho (31) -> tzitsb, etlto +vvsvez (57) -> utlqx, xzhdy, tlmvaep, nbyij, fszyth, zimrf +obvji (37) +luewm (195) -> mlgxkzg, hlbdk +efavpu (210) -> xklqajg, vtqjrpy +sqkepae (177) -> ksuqm, ygxgxmd +sfdsda (81) +cluej (84) +zssmks (57) +wcqclc (99) +xmuewfv (191) -> vhldh, ppbsza +ahbqrkw (20) -> gjimeu, mbvkb, ipuzdkg, hsycxw +bvmnols (220) -> pminuvd, omxbi +farimk (5992) -> wbqbr, igvsrs, ofauy, kbskq +kzwvmh (6) +uotii (191) -> emacdc, cedwljx +uyzvco (31) +susvwaq (21) +emlmom (62) +cytrtqs (59) -> aqgnukp, ekfimhl +rhutj (82) +fcdmywz (170) +xzaleu (109) -> hcktpld, beqrsjx +jczjrin (42) +pyvfqx (64) +ezgozo (141) -> gopevi, fmvboqy +dazqtu (35) +eotjep (37) +oujeg (25) +kuplqir (89) +lmzoi (647) -> wnryzjo, kykmrh, hjiiezg, huhjt, fcdmywz +ynybi (21) +bfweit (631) -> smryqv, llzufnq, temngvm +mhzsyy (97) +uavous (100) -> pnnbt, qafsun, ydsxmg, vvvvgzx +tipds (347) -> hxlom, gfopy +wmvdmad (39) +drooh (20) +bajystl (23) +tqppbf (73) -> nkiyss, tbbpr, odzlc +czvcms (1990) -> hefdj, ntmyjat, roxewb +rnllfw (90) +saznyj (84) +jtrpn (58) +ccmobzb (49) +kyigxxe (50) +hzhtm (71) +wnryzjo (20) -> azsjzcr, pkggwf +kyijav (48) +zmucrfa (71) +jzclx (86) -> iysaej, zaqhiy, skcmm, wuglbn +puvkwv (74) +orhboz (64) +mcpjzd (261) +ockea (220) -> zwzrlp, cdrivrb +urjmc (32) -> gnjdzkp, qyptue, opkqf +wazmp (50) -> tslnnk, hepcmft, gkejxoc +tibqjki (73) -> zuevpk, josri +hozmnv (75) +wgetx (165) -> enwcj, cqkxj +ybauin (97) +sgdaxgh (167) -> xkzbkz, mohfmrr +atvmevd (9) +wubtbdp (171) -> rupuyo, jrwycer +lmsrcz (113) -> fqxtra, iyhif, nwnfwyw, ssewuyv, vxxmj, eibjdy +oqnerup (998) -> jhsnju, ssufgph, rcrlwms +zimrf (1412) -> twvwpd, agtwdyf, lsuiiih, hdgar, tjxtjg +rkdhv (50) +vkdfymy (132) -> acjnfd, isnxyg +rcrjah (57) +qqskz (44) +txgxosp (58) +ctbne (70) +xegbm (58) +mrxqlw (566) -> xewyur, jzclx, nweseg +inovvz (87) +qbmqlty (1099) -> ruuad, equpkvw, wwzreqg, sgdaxgh +dzsck (90) +vxudcio (89) +dqeoi (25) +njfxxqe (49) +jjrqd (50) +ekqlbr (18) -> wclwqix, bfweit, iewhsnf, veriopw, gtbbe, ftgff, nscyh +eweeq (75) +xzhdixq (34) -> nvdacd, kyijav, miymqw +qekcxr (49) -> cwlwzhy, ircgvnq, qsxpo, lmsrcz, qbmqlty, uizzbd +kdamqdd (119) -> kacgf, yynsrtq +rlals (13) +pbrsgs (68) +icblguo (82) +odzlc (97) +xjicbre (91) +hokdx (48) +xaacva (72) +yagku (31) -> xihae, vlxxwu, xekwze, jqeuxjc +hpiil (54) +tetnp (50) +tdsfl (93) +xkjagrq (41) -> rfbgops, qdnqx +acrpk (24) +ynevzr (9) +elxtgq (345) -> ybddxou, cuuuxw +wclwqix (963) -> nqswhd, mpxji, sqkepae, yobqdj +ghwgd (370) -> vtodml, nvxdw, eoqoqq +jybokd (61) +svouyu (225) -> ntkgyj, dvmpj, bnyaw +ofvivee (25) +ftvwc (80) +xdilahf (27) +qwcnhxs (19) -> ybauin, rftle +hxxhe (169) -> acfgtnp, xnniv +gmkrufv (74) +qafsun (40) +slthtvl (7) +tcsisyq (42) +pdclutm (86) +gvdqk (228) -> dnwfv, orhboz +wewaq (35) +bzhsmk (29) -> mqkpcxq, qzxdbvb, rxgbyox +dzqvp (67) +bkaowc (99) +xvikaq (54) +wtyeqkr (81) +efiio (54) +scpwjv (37) -> dvtfl, btvche, cvdfmn +fzluu (14) +orohja (48) +ksuqm (41) +ssewuyv (24) -> wtdgjd, dowcukk, qoyyyzt +vlqciig (49) +enwcj (34) +qdpcofy (763) -> nmgoh, wvghqb, gfiogpk, qzjln, pjdxt, qsatxh +hbmcb (160) -> lduyqm, npqgif, rsiom, ucalkgd +fumrjy (113) -> ugtwn, mgybe +ueyfa (117) -> ecdmtkz, ivibm +lbhoabl (45) +vrdezgb (83) +xytanzt (246) -> lhqqfh, giwrnux +lsmev (35) +hefdj (191) +lluoxxt (83) +tyujzc (53) +hbdvy (86) +wwzreqg (46) -> eoqzo, wzahu, quzew +qwnxufh (33) +zhzkbp (88) +zqxrmoi (23) +cfgjwaj (248) -> ikmaui, gmsrhnn, eatuwzc, rlals +rgqyd (259) -> ufdpy, zmtzdj, stxzzh, aikjla, hmbxr +xgnrwy (94) +siiztl (133) +vtqjrpy (8) +fyopf (27) +ckarib (232) -> sqqvakc, icbkonc +jjgevqi (60) -> jttvktl, wkuajq +ppbsza (28) +elkot (264) -> atzvica, rkdhv +mxtwfot (8) +oyxhn (90) +mxvto (86) +hwbzs (60) +dtmeth (112) -> klzefiz, nvmabz +jhfos (6318) -> dovmewj, qytejsk, kcfvm, nuiiywb, rgqyd +jtikqy (27) +gfqcad (25) +dxswnz (29) +vfsxpt (15) -> ezjxspt, mntzj, rnnoy, cmxxnel, jdhjjhc, xmuewfv +ujttt (30) +gqtmcy (26) +nbiyql (25) -> jcrbv, wzzdih +wftvt (90) +quzew (51) +gjimeu (84) +junno (14) -> chvgdm, vtifny, xhdds +gstsuq (60) +usogal (98) +iwqsdq (40) -> uotii, mhotdh, fvajjc, ezgozo, ajnqxgs, fumrjy +sqzyu (7) -> usogal, ohyndb +hzggfe (73) -> rgljpm, zlunbf, nhgqoun +oneomye (96) +rwpoq (22) +pdqzeg (158) -> wedvahi, vedvg +trkbjbk (52) +ndjwipm (89) -> dfmrj, uhlnlw, gyuxgla +wgsgkq (59) +wkwylw (74) -> pqpekm, exlobhb, ywarcbi, uavous +nwnfwyw (60) -> olmnek, ugdngw, shfeab +mteeayt (5630) -> zcykfzl, sfbfkb, vvcwap +pttbcl (7) +jqbxuq (31) +zelmrru (94) +wtdgjd (91) +fkkxcix (288) -> khhatd, qwnxufh +vklogmf (1412) -> sszzsjd, ucqqqi, lfztken +iigqx (8) +wkfpb (1892) -> naifqx, tieyaxc, ivlvuhq +toamjok (279) -> feqwmhy, qayqkk, tzaid +nltbv (82) +pnkitlq (75) +jqeuxjc (70) +kbjmz (85) +ifztqrk (232) -> kdcvok, aslbzb +koyyc (92) +ubahwni (415) -> ipqrsx, yptpysa, dkeamn +qdchc (62) +wsotig (50) +wxzcum (95) +jhsnju (143) -> sfdsda, lbuolhp +hexej (8) +ucapgv (72) +misjfqx (275) +hlrknn (54) +uloaqjr (11) +batiqxv (252) -> cipzul, yojkhdg +lduyqm (21) +dyfcem (10775) -> jywenab, hzlhf, tngwf +kbskq (54) -> bbbfnkl, duilfrb, fqjafn, dvvvpt, fuwwn +lluabe (24) +uuvzvmg (54) +fzhiga (49) +gzjkmy (58) +pjslph (41) +wvmctd (88) -> pdapop, gvwdr +oqhtqmi (1485) -> mnogvuo, nbiyql, dbulh, rxdfefu +hsidbv (246) +sosvey (48) +jttvktl (83) +gcjpmr (18) +dryio (99) +yqsufra (66) +rudbse (32) +ggypng (84) +cpjawpx (1750) -> dclips, eobrn +izfjh (64) +yfznza (200) -> zcdwm, fzjpfb, gqtmcy +bdojny (81) +ipkqb (90) +kwxkc (6) +iiena (67) +zojod (12) +aaovpqz (18) +bcyanf (60) +fxytl (66) +jdtauge (27) +vvqzxz (98) -> crjir, unbny +wkuajq (83) +zuuor (90) +oemva (35) +wndlhkf (95) +zcykfzl (11) -> pyxmwku, aqkvjip, vdzxo, urmzp, iystzy +lirus (30) +otzlwo (868) -> csbdis, fvcfdo, uscpxzv +nnamrm (68) +kgobcze (23) +urbny (156) -> wsotig, aivrgc, hxrif, yipmpvi +hvptp (36) +hlchui (89) +cyygfy (75) +lqmiv (74) +lvkwwuz (128) -> jybokd, wjivis, uacplos +ecdmtkz (65) +lgusee (16) +yadsolh (37) +uhwcb (3172) -> qiaaqj, unecu, sdjzoik, qdpcofy +aqkvjip (367) +pqniaz (53) +pmuxnac (95) +coruedm (31) -> iiena, htozjym +qbbsz (170) -> gtycci, xnuirq, sppbjqu +hnowl (61) +zvscftj (93) -> wuqaqh, nbiacm +jdhjjhc (121) -> mggnu, kdyjdi +ppwjh (31) +dlbakk (82) -> uckfdi, oujeg, orirs +sjgdfv (21) +wxwvh (99) +ezjxspt (105) -> djjagoc, hzhtm +xougi (97) +runmsjd (29) +zigfqp (66) -> czzfhvy, gkakcm, ggypng +smryqv (392) -> mebzrnn, rudbse +zfvrxs (16) +jrdlhg (40) +qancsuo (31) +rkkgpaw (3708) -> dxagp, ygjfl, tqdtgzi, jkilh, ietzw +kdhwxo (89) +ktygd (24) +odiiboe (253) -> tetnp, hflxhw +wedvahi (63) +pumgsq (90) +hqzsf (89) +pgzmhg (92) +bdrjupf (99) +uoturc (50) +ewgmy (60) +wvltmyv (204) -> lirus, ujttt +swgte (84) -> ouvco, oyxhn, rahcz +owwucfr (94) +xhdds (42) +optwjd (55) +bbufm (50) +kykmrh (41) -> diwnw, xbaebbl, pvxboe +nmgoh (152) -> xciyqzi, xdilahf +sjaufyu (79) -> aokaek, xeylx, omqech, zvwli, bvntvu, flimltt, ndjwipm +yynsrtq (15) +ofauy (823) -> yxikq, pajwswk, dlbakk +cduoay (91) +afqqpy (7) +cmcjml (90) +emadjac (75) +bqruuvx (571) -> nyzee, ykble, jdpmxgj, wtyeqkr +lsuiiih (8630) -> brbnff, vfsxpt, lmzoi +munngu (60) +bhqrhda (198) -> hfwsmrn, gwbbe, cemrson, idgqyfk +ircgvnq (1400) -> ktpudp, coruedm, dwpvwz +dnwfv (64) +lkqitr (57) +oowec (55) +tbbpr (97) +yvtrb (78) +eytlyat (51) +fydwas (58) +ugtwn (81) +zmmze (54) +crzaveq (85) +zmxnypj (95) +ntxgz (85) +ipuzdkg (84) +lbuolhp (81) +tczoglq (72) +xeylx (207) -> vncffh, thcgrv +ergsxv (99) +rcrlwms (8) -> ergsxv, xlafbbu, bmgddk +cjuyp (9) +utiueqf (18) +ajdhm (68) +grxap (96) +ogffnth (13) +txodvj (97) -> rtkjnq, optwjd +mzaane (98) -> afazbmw, mbdfm +acfgtnp (63) +tlmvaep (24984) -> gnkzi, ygara, ekqlbr +cdfdg (45) +qwdbvr (2969) -> nogrr, jdxxshy, fvaiqyr, uinplcz, iwqsdq +ottdek (31) +mntzj (157) -> sqnpby, jlcod +cjkhs (39) -> zerav, kskmlk, cybok, jqbxuq +bcwwbdp (76) +wxftfvc (93) +vxgadew (34) +rxctq (40) -> yujxzit, gbsjs +zadepxs (31) +fitvk (7) +vwobzsl (15) -> lqmiv, adkuh +ntmyjat (123) -> xxemgkm, havvqw +nqswhd (87) -> mxvto, yipippp +vfsonrs (55) +zhujwor (38) +ugvump (24) +pdapop (12) +rhxwwg (98) -> pqniaz, acqzje, btqdqx +hsycxw (84) +shxnlm (934) -> lzqin, vdycf, dahxznk, yanech +pjdxt (128) -> sfhnsel, wmvdmad +saome (163) +uuskq (328) -> ctycwjv, gzbnkz +jygig (88) +toarg (77) -> udjtzas, muymzj, ehpsber +atzvica (50) +iaphph (94) +wvnelsw (62) +ohlnw (24) +ghmke (108) -> unknkby, qeenjrf +tzitsb (67) +ozsipa (83) +ekfimhl (72) +qphnx (99) +bqnykil (93) +jkilh (68) -> urbny, ahbqrkw, gvdqk, hcmunl +vmkyxsn (51) -> wxwvh, bkaowc +ypbvxys (16) +yxhcygc (80) -> wdvfpay, chcuadg, dzqvp +sfhnsel (39) +kqxsjt (90) +qctjxs (421) -> jizwj, qwcnhxs, zcrsj, cwfgc +ijdjfr (58) +djihb (988) -> wxzcum, ctjkvre, vrjgl +tieyaxc (97) +hlbdk (43) +amrdo (41) +dmuhap (82) +dvvvpt (84) -> ethprq, rhutj +sjldep (81) -> wwniofg, afqqpy +btxsnrj (22) +kvfus (72) -> rrgsu, vrzzc, axcqrvp +upybuz (89) -> uhuhant, dqeoi +tivyb (5) +gmsrhnn (13) +mvrpacv (38) -> seygrud, lhdtxwa, znxhe +hltmydl (56) +vuahzfe (12) +omxbi (56) +ufjyqh (213) -> yodjjz, eytlyat +ugnsbfr (163) -> hzexlou, cwzgcb, crzrj, crnnojj, wrkgz +nscyh (1327) -> dqiievh, ykwyv, dtmeth, cuanrjw +ebedhd (72) +zlhwvo (55) +dvmpj (30) +pgdkb (60) +tfpggg (574) -> nteowjj, mupmhq, leyrvh +tqyhzm (56) +citooti (53) -> zdhuaa, nuxmb +ywvsf (61) -> hzjpu, pdclutm +ouchsl (91) +vdsxce (311) +areod (59) +nyzee (81) +rxsllr (166) -> dzgdexe, duozw +cwfgc (159) -> jtikqy, jdtauge +xihae (70) +eqkks (95) -> pczzyg, pnjhr, uhhgvga, mjwry +zfnpy (185) -> uffjcpm, enmfum +hzjpu (86) +wjivis (61) +vdyit (92) +jumdiue (31) +wupzqha (52) +cvdfmn (63) +miymqw (48) +rzgwqq (61) -> vgknyq, scbgse +dfmrj (48) +jcffy (291) +bpnbtab (90) +rgxjg (66) +cbazit (95) +tyannz (193) +ykble (81) +rrgsu (59) +qgjhab (87) -> dksoeb, ezdusg, pwvjth, mdlfse +enmfum (23) +ekgfr (392) -> aabivaf, rzzcyrh, jbwibse, bhnnrnz +shfeab (79) +pncikdq (14) +sppbjqu (138) -> kbjmz, ntxgz +jlcod (45) +jolfxq (35) +mgybe (81) +qyhyr (70) +jtzqhn (183) -> bcwwbdp, cqmdp, bercxo +awvths (33) -> rvhfdxw, mjzfv, uypdm, rroehj +xrnukee (93) +cemrson (12) +abzahfo (36) +pzkofch (60) +gtycci (294) -> xkkyybu, slthtvl +wwoii (125) -> jtrpn, msmar +jzgllr (29) +xnniv (63) +vgknyq (85) +qfqhlzi (63) +muymzj (92) +vsrrjw (63) -> kyigxxe, jturbxp +vzheyuj (92) +kgxms (90) +mnogvuo (23) -> ezxtmg, losei +ktoxzno (61) +dkeamn (118) -> susvwaq, ikkvmpl +aywhbw (197) +vggzc (83) -> bonch, cgfkphb, rqpripo, jxwep, oqhtqmi +rmfrx (90) +hmbxr (40) -> xougi, fvvsis +blrmjo (70) +azreib (86) -> wcqclc, nsbse +kyvgzk (38) +okcpk (35) +ednxkm (86) +orirs (25) +eiuijrv (99) +scbpz (59) +ivibm (65) +rjrtpwq (66) +nrestbe (77) -> ikeoki, eggqth +wkdyv (12) +mtmritp (182) -> pgkir, shkxavi, ijdjfr, xegbm +mqkpcxq (82) +iribjrc (36) +iuufms (103) -> hpoeayk, ebedhd +pjssop (45) -> lszon, idrncu +kdfxz (250) -> ulgkks, qaxbdi +cipzul (33) +mjwry (55) +vpuqipd (171) -> wpyaqv, hwkly +uelpws (287) -> hnlcfix, vnofuwc, cbbyjs +xunaojn (559) -> iovdh, znfoyv, kmheqrj +thxmp (72) +ctycwjv (12) +lrhseuy (748) -> xinic, wzimpmr, wubtbdp, ywvsf, wgetx +qytejsk (417) -> olhcanq, pydacw, cypafs, idzrtvp +ehiqt (38) +ndevzln (23) +sqqvakc (23) +crzrj (152) -> inkckep, jolfxq +xsrotj (53) +qzxdbvb (82) +lafvy (203) +cwlwzhy (75) -> xytanzt, tqppbf, awzfel, elkot, kdfxz +rftkw (10) +qecdd (32) +leyrvh (215) -> ynevzr, cjuyp +vhldh (28) +xklqajg (8) +xmrocio (41) +vskve (69) +ablnk (67) -> pgdkb, bcyanf, mqjxhhh +beqrsjx (61) +nilbqer (161) -> lgusee, swrda +kspoovz (42) +mbvkb (84) +kidyka (38) +gonle (23) -> qbovld, crzaveq +przui (83) +thvlvgt (10) +uffjcpm (23) +rpjxbhc (50) +egfqvs (53) +iszlpa (91) +ekmhno (37) +kqlidl (305) -> csfsklt, acrpk +uhnaw (35) +jdxxshy (226) -> wnvhd, ddzkbox, hbmcb, cgzumy, kggsq, godbrn +aslbzb (38) +kggsq (100) -> thxmp, gugquvb +utlqx (13165) -> dyfcem, icubrz, okuup, jhfos +wuglbn (30) +dxagp (769) -> wwoii, vvmay, mwcqrpu +nawqww (126) -> inovvz, dlyei +pyxmwku (95) -> xhbqmie, kypfh, sjkmq, ajdhm +chvgdm (42) +wzecczv (37) +qbovld (85) +wpyaqv (43) +uquuws (11) +inkckep (35) +dowcukk (91) +lhqqfh (59) +nvmabz (28) +dovmewj (99) -> vchyhs, vkdfymy, dwtvr, qvqdwx, wixuzd +dfxhfex (280) -> eqrcoq, dqukfsg +jdpmxgj (81) +urzurmc (89) +kuojws (97) +rroehj (342) -> rjppftm, pyvfqx +qvqdwx (78) -> fmtjcxp, lcwnle +pqpekm (260) +xccabhd (6) +agtwdyf (8894) -> ppodfft, wdclggm, yiyld +bbfkxd (10) +nteowjj (141) -> bajystl, pdlkc, ihdujet, kgobcze +kdcvok (38) +mjzfv (374) -> hokdx, sosvey +epbdtie (40) +hhugr (84) -> myxnc, tysfacj, bbbtpgn, yllqo +pgbhv (31) +ltkwjkw (92) +utzqyl (89) +wdvfpay (67) +sjlax (17) -> qcytpf, mgxbrrh +jhubo (248) -> bbfkxd, rftkw, ggqyz +nbiacm (82) +szqbyiy (146) -> wjuxxef, wvnelsw, emlmom +hzexlou (222) +rvhfdxw (336) -> ugeuc, ginnjra +adhga (7) +hepcmft (78) +lmdmcw (170) -> cduoay, iszlpa, mngflny +vuounm (208) -> vlqciig, ccmobzb +bpdjd (73) -> hsqujmf, awjacds +bhbwz (74) +rsffyjw (70) +uhtbx (93) +godbrn (140) -> tuxbrfu, poezvkv +ohtefz (24) +ajnqxgs (87) -> ldbfz, vsznmk +hxrif (50) +fmqozb (157) -> bwefj, zadepxs, dxvyfrf, raopje +awzfel (202) -> rfprjll, bdojny +lovrin (144) -> yufve, zgigo, evhuki, hexej +tqpztin (96) +hnlcfix (8) +jqers (248) -> jpjqz, ixbgkw, spzex +mohfmrr (16) +odflw (118) -> ejbtd, pjslph, amrdo +dbulh (183) +rahcz (90) +aikjla (234) +leavyf (69) +pydacw (117) -> bbvdc, nnamrm +flimltt (103) -> yrrds, wpawu +cbgrkw (31) +nkhrpg (43) -> bhqrhda, mzaane, hsidbv, tsoub, ycbet +rsiom (21) +yipmpvi (50) +dfodke (281) -> kdavcr, nzoczg +lrsaprr (59) +rprkjk (225) -> rjzjdh, krodu +ruxkyn (471) -> rhxwwg, pigll, xvanyc +skaiivy (81) +qyeifkn (56) +xugpwfp (311) +acgyx (33) +seddq (90) -> mewbsd, eczncbr +czzfhvy (84) +pwxkp (18) -> gtcmb, hkbpff, jlenggo +mqjxhhh (60) +qaxbdi (57) +iovdh (69) -> loceai, fydwas +kcentfc (93) +uuanft (81) +ftuet (25) +xzhdy (9) -> vggzc, mteeayt, uhwcb, farimk, uxczdzb, rkkgpaw +tihtr (109) -> xbypaw, diphdjt +pwyqnm (37) -> mhzsyy, kuojws +vxnfqtl (51) +olmnek (79) +tzaid (9) +yqekzzg (34) +ucocpbv (180) -> hpyjk, krltz +ulgkks (57) +hglgopo (17) +fuognlx (75) +ntvcnae (68) +llufp (306) +vvmay (169) -> remwlv, gcjpmr, zlekeh, zfcck +dmyewr (52) +igvsrs (1132) -> jvchu, muckfu, uuvzvmg +cqcmf (910) -> llhhjb, kdvfpg, ntvcnae +rbcqg (23) +pvuyft (66) +sdjzoik (1184) -> cnmtugy, saome, cjkhs, vwobzsl, vsrrjw +wzpfe (16) +cqkxj (34) +limohv (36) -> lubvf, zhujwor +rfbgops (83) +xotwwe (85) +xbypaw (44) +qokvy (226) -> lynlnjr, pbngkw +uhzdjta (40) +csisv (32) -> fuognlx, ebknkgh, eqoiqq +cyzdj (54) +gzlbsml (16) +btvche (63) +dvtfl (63) +ikeoki (85) +cgfkphb (1881) -> wvmctd, limohv, kewktnf +pnjhr (55) +bbvdc (68) +nogrr (448) -> pdhmo, hycppt, mtmritp +utltope (38) +pkggwf (75) +icubrz (72) -> dqntfx, lrhseuy, oqnerup, jaizfy, awvths, zrxjkr, vklogmf +temngvm (88) -> vzheyuj, waewrc, vdyit, jyhalw +awjacds (11) +kypfh (68) +oehtgj (24) +ohedu (109) -> grpvwt, xqbglc, xbhqpqp +aagqoya (55) -> zpgcqq, fpcqopg, enuyf +rxzgrn (68) +hcavfz (149) -> bbhrg, ndevzln, rbcqg, zqxrmoi +cedwljx (42) +cgjzvr (224) -> fhtyxty, idbik +fpcqopg (54) +xqzaqn (23) +suhmny (360) -> sqqrkn, tmvvgp, jscxey, vuahzfe +ttqxk (20) +icaiy (40) +dwtvr (72) -> ikwfxuh, rqxyfp +uhuhant (25) +qhcuolm (95) +gfdae (22) +flahmx (39) +grpvwt (55) +pdhmo (74) -> mxnrle, ixzpx, xotwwe, ofegal +xpcyuu (40) +ywarcbi (218) -> sxjxk, sjgdfv +zcrsj (57) -> ejfvc, slijas +cvzubu (43) -> gepvnm, xitkni +vjcjl (231) -> vpicsc, hnowl +cdaccdo (54) +zzbbtqs (8) +rkhbff (55) -> hpiil, agnojmu, zrwaek +ltcqa (117) -> sicsb, wzpfe, eowhrxj +liatu (98) -> xynwm, pxnhs +mxnrle (85) +uvdikh (128) -> fitvk, haumg, eebealj +eqrcoq (37) +mbdfm (74) +mewbsd (92) +gfopy (8) +ebmdbz (38) +xitkni (75) +uacplos (61) +aqtupw (13) +skzkx (60) +kdyjdi (63) +giwrnux (59) +ggampur (75) +xfgqwg (27) +cdrivrb (27) +zrwaek (54) +jizwj (57) -> yvtrb, gbloa +coyodgw (70) +grzkzam (274) +bbhrg (23) +zndcv (990) -> cxgcf, ogchry, xbddnc +skiyk (12) -> toamjok, fjuytze, llufp, vybcj, orcobz, vuounm +jaizfy (141) -> yimhrw, ltlss, lmdmcw, acilnmg +xynwm (83) +hauoc (90) +feoaqz (98) +mdlfse (69) +fxejcg (102) -> vcwxkxy, xgxzul, bllys +qvqwp (73) +maajj (63) +xnuirq (92) -> oozsasi, ojktrz, xaacva +emuzuk (90) +iraqghm (89) +hsifio (75) +mgxbrrh (58) +szsnk (55) +zdhuaa (97) +tslnnk (78) +zoyfhq (6) +gtcmb (94) +jzczzhm (173) -> dzydw, wtjxdv, thvlvgt +nffqvwl (32) +qoyyyzt (91) +ktmepg (9) +qyptue (82) +bercxo (76) +ndpeic (83) +ikwfxuh (97) +fzjpfb (26) +ddzkbox (58) -> tdsfl, xrnukee +jfblzs (217) +vxxftx (71) +ilbhxw (50) +akwhbb (90) -> ggampur, hozmnv +nuiiywb (340) -> tipds, ieqcv, qgjhab +ppodfft (419) -> gvuocj, vtvhz, uohzm, vvqzxz, pkikya +vweupv (9) +xfclvc (80) +rtemycc (58) +woiffy (35) +nftkch (335) -> kidyka, qyguegc +duilfrb (226) -> pqfijv, dmobyt +okzwi (77) -> ewgmy, ffkubc +jpjqz (20) +whpko (50) +rgfhr (50) +liwvo (97) -> orohja, rmvsw +eobrn (49) +hcmunl (240) -> dbedpz, rtemycc +yffeaia (11) -> wftvt, cqgfeau +ptakb (40) +unecu (74) -> gjljql, kylrxvv, vqrzfp, misjfqx, bzhsmk, zlaps, tcuxy +fkpxwb (215) -> ogljepx, mxtwfot +olhcanq (55) -> eiuijrv, dryio +wuqaqh (82) +sicsb (16) +yptpysa (84) -> kyvgzk, ehiqt +huhjt (56) -> lkqitr, rcrjah +oedpdc (48) +iriwf (18) +uhhgvga (55) +yiyld (689) -> rpvpz, akwhbb, qokvy +gfodmz (35) +ftgff (764) -> nrestbe, keazs, cdwtclt, ueyfa, iuufms +aluvk (1182) -> lovrin, batqran, zexqvx +eijqpl (12) +wzahu (51) +crjir (50) +ecxsy (83) +aamnwt (20) +etlto (67) +wixuzd (220) -> hwyjqlo, xqzaqn +rwzuaru (80) +ujfkgpk (39) +zexqvx (176) +yllqo (14) +xbhqpqp (55) +jvchu (54) +usgap (71) +cgzumy (223) -> vuvsu, adhga, mygwo +unbny (50) +kdavcr (15) +tnlit (78) +ehamxte (97) -> jtzqhn, ukbby, tivtbk, nftkch, dbvkk, elxtgq +muckfu (54) +gjljql (275) +eimqx (275) +dbvkk (315) -> nlxvg, nffqvwl, azcfch +pajwswk (55) -> fiazqvj, knlyr +hxvnrl (73) -> xxwpir, zelmrru +ntkgyj (30) +acqzje (53) +eatuwzc (13) +equpkvw (101) -> ygprn, fcyxxfb +wvxne (80) +kuhkj (69) +jpjufo (49) +shiyju (59) +pojbfof (41) +nvxdw (142) -> nhitw, fxytl +rjncwf (89) +duozw (49) +cdgxjqk (71) +idzrtvp (71) -> xjicbre, uapkd +sjkmq (68) +yvxlc (50) +okuup (648) -> bbrmw, ehamxte, eqsowyp, npkvkpu, czvcms +fwmiit (83) +ebyuo (51) +zcqzjv (66) -> ouciqi, lvwcbl +glbaiy (106) -> obvji, eotjep, yadsolh +lzqin (76) -> loziss, otrpt +qurkt (53) +qtwrr (93) +hydzhez (57) +xiqdw (83) +acjnfd (67) +yvlzlnd (11) +pminuvd (56) +tdsznt (42) +gfiogpk (10) -> feoaqz, nqctxw +nweseg (104) -> fuclj, vxnfqtl +htzrkz (99) -> rkhbff, jfblzs, glbaiy, aagqoya, lcfsvbf +khhatd (33) +gjoof (69) +amomsn (230) -> xxmermc, btxsnrj, rwpoq, gfdae +tivtbk (377) -> tqoul, hglgopo +kgqfw (682) -> usgap, zmucrfa, vxxftx +mrvqj (82) +acqqab (5) +vdycf (56) -> leavyf, kuhkj +htozjym (67) +fpffxl (302) -> scbpz, shiyju +eggqth (85) +fmvboqy (67) +dzino (114) -> xfclvc, shjzwy +evhuki (8) +smyqf (37) +qmuueat (35) +hsqujmf (11) +juogz (71) -> rjrtpwq, kfwcftc +pdlkc (23) +ygxgxmd (41) +vgszctg (59) +bbbtpgn (14) +xqbglc (55) +bzgeoqg (80) +gepvnm (75) +uizzbd (1052) -> yxhcygc, luewm, fmqozb +pqfijv (11) +krltz (69) +rftle (97) +dzydw (10) +havvqw (34) +orcobz (204) -> ebyuo, nzeiwlc +shjzwy (80) +cuuuxw (33) +tnagy (41) +ihekxpi (74) +dwpvwz (141) -> wkdyv, wrntht +batqran (14) -> uuanft, ffxfi +veriopw (1835) -> mrvqj, nltbv +aergp (96) -> qjnqrxg, ouchsl +pnygn (149) -> rhygakw, ndpeic +crnnojj (57) -> zlhwvo, szsnk, stoosc +ezdusg (69) +unuscm (82) +wvpln (49) +djjagoc (71) +blkwmr (70) +chotekn (57) +ruuad (199) +kikilp (83) +fcyxxfb (49) +rnsmk (40) +pvxboe (43) +ifdqaup (5829) -> owsfeci, ruxkyn, kcelbg, tnbuu, ydkppqv +wnvhd (64) -> hauoc, zsdbkwn +dzsqc (14) +kobrbu (66) -> hsifio, pnkitlq, emadjac +bbbfnkl (234) -> pttbcl, uzxcmdh +btqdqx (53) +fpfvv (56) +bkzek (240) -> sbvhk, oufdzsi +lszon (73) +fcszioo (55) +azcfch (32) +rqxyfp (97) +vnofuwc (8) +eqsowyp (1711) -> minal, wazmp, pdqzeg +dksoeb (69) +wzimpmr (129) -> aajog, soyuwm +lcfsvbf (39) -> urzurmc, kuplqir +dtqdwgm (83) +uhlnlw (48) +sszzsjd (167) +ltlss (233) -> ctbne, qyhyr, rsffyjw +erpdbe (60) +kewktnf (72) -> blsrmal, drooh +ethprq (82) +dclvnt (168) -> hrdvgwl, xfgqwg, fyopf +ssqlqmn (46) +ogchry (76) -> nigtunz, icblguo +zwzrlp (27) +bqile (69) +zpgcqq (54) +shwec (92) +loceai (58) +ezxtmg (80) +gnjdzkp (82) +qnuhxta (12) +roxewb (11) -> dzsck, rmfrx +jbwibse (7) +pxnhs (83) +rtdsov (16) +owmxj (35) +dpyrzzy (300) +rjzjdh (33) +sbpdtfq (11) -> oneomye, grxap +arajafq (178) +rmungsh (95) +qiaaqj (312) -> odflw, ggqznq, ikygytk, lxsycwm, hcavfz, fkxei, jjkkl +thcgrv (13) +fxplut (163) -> dotrpsi, tcsisyq +lghlhb (53) +nbyij (32760) -> tdxow, qekcxr, qwdbvr +dzgdexe (49) +dbedpz (58) +tmvvgp (12) +josri (79) +wycodto (39) +nsrad (76) +vrjgl (95) +adkuh (74) +hfwmhrn (6) +ukbby (79) -> dnojir, przui, vrdezgb, lluoxxt +fylsk (253) +vlmua (218) -> uoturc, bbufm +cjowcmb (111) -> bdnbvsc, ynwkyia +rxdfefu (79) -> srsjjft, trkbjbk +cugcfjb (43) -> jygig, zhzkbp +yqdhlr (1505) -> jjgevqi, efavpu, scpwjv +tdkdi (207) -> iribjrc, nzznh, gtlmfhu +zerav (31) +ojktrz (72) +lfztken (53) -> hydzhez, zssmks +bmgddk (99) +bonch (40) -> xugpwfp, dfodke, vdsxce, vptuwar, lvkwwuz, uelpws, yagku +wruwjn (44) +iavoj (78) +oozsasi (72) +gvuocj (46) -> nsrad, sknyb +opkqf (82) +npoan (66) +kcelbg (825) -> vginql, fwnnw, upybuz +ynwkyia (60) +wbqbr (421) -> rprkjk, kobrbu, jcffy +poezvkv (52) +odyxpkn (94) +pxyfbvy (85) -> vvenem, xuctchl +xbddnc (240) +qsatxh (186) -> erqjic, tivyb, peokst, acqqab +opsqo (8) -> pgiixde, wgsgkq, vgszctg +bkzadqb (188) -> oedpdc, xdjqk +jxfhkc (171) -> ohlnw, oehtgj +kacgf (15) +qwezgho (42) +xuctchl (59) +bjgwnd (40) +mpxji (191) -> seasb, yqekzzg +lvwcbl (45) +eowhrxj (16) +iyhif (131) -> dtqdwgm, fwmiit +zlaps (87) -> ijymh, ydtamvm +pgkir (58) +njtrh (413) -> dfxhfex, qqfrfmp, cgjzvr, fkkxcix, swgte +fvajjc (163) -> skzjwi, nlkvr +gqdwda (81) +axzwwto (64) +stxzzh (48) -> uhtbx, qtwrr +nigtunz (82) +pksdzch (77) -> ktygd, gavjcu, ohtefz +idgwugs (95) +scbgse (85) +mygwo (7) +igorbc (41) +bqedfkt (55) -> npoan, wtwmmmy, anmam +ykwyv (8) -> ptakb, jrdlhg, epbdtie, xhtqxz +bhsmhi (331) -> hxvnrl, doqco, mcpjzd +csfsklt (24) +eqoiqq (75) +nlkvr (56) +ywrxbgi (84) +gkakcm (84) diff --git a/src/main/resources/2017/day8.txt b/src/main/resources/2017/day8.txt new file mode 100644 index 00000000..b41d8f36 --- /dev/null +++ b/src/main/resources/2017/day8.txt @@ -0,0 +1,1000 @@ +utc dec -736 if p > -7 +tn inc -876 if qlm == 4 +uz dec 294 if l < 10 +a inc -904 if me >= -7 +tn inc 622 if ppl <= 6 +fr dec 17 if ufk > -10 +hkt inc -511 if mdk == 0 +t inc -290 if xxh <= -1 +l dec 727 if ufk < 7 +tn inc -576 if l == -727 +z inc 464 if dea >= -2 +ufk inc 755 if utc >= 735 +utc dec -720 if qlm <= 5 +a dec -277 if ufk <= 755 +xxh dec -640 if u == 0 +hkt inc 875 if m != -6 +ny inc -351 if p >= -4 +l inc 674 if dea > -7 +ufk dec -826 if p == 0 +mdk inc 377 if utc == 1456 +ppl dec 793 if q <= 4 +z dec 114 if mdk > 368 +ny dec -412 if ny >= -353 +utc dec 176 if a != -620 +utc dec -610 if p <= 1 +l inc -541 if xxh <= 635 +l inc 102 if ny < 66 +qlm dec 700 if l >= 43 +dea dec -202 if tn <= 38 +a inc 785 if a <= -629 +ny inc 414 if fr <= -21 +l inc 250 if hw <= -10 +l inc -516 if l > 41 +utc dec 358 if mdk > 373 +p dec -38 if z == 350 +uz dec -71 if a == -627 +t inc -713 if fr > -13 +l inc 242 if tn <= 53 +dea dec 600 if hw <= 8 +hw dec -92 if fr != -19 +hkt dec 67 if l <= -232 +qlm dec 523 if hw == 92 +utc dec -608 if q != -8 +m dec 314 if me < 9 +xxh inc -937 if xxh >= 638 +qlm dec 494 if m <= -313 +fr dec -590 if m <= -306 +utc inc -539 if tn == 46 +hkt dec 831 if p >= 43 +dea inc 510 if a > -627 +p inc 319 if m > -305 +m inc 736 if xxh >= -302 +ppl inc -712 if mdk == 377 +ny inc 21 if p <= 41 +hw inc -569 if hw != 92 +ppl inc 150 if dea < -595 +xxh dec -953 if z != 356 +ppl inc 578 if qlm <= -1714 +uz dec -733 if p >= 35 +xxh inc 100 if xxh >= 660 +hw dec -491 if ppl < -767 +t dec -64 if z < 347 +me dec 802 if dea > -601 +hkt inc 431 if hkt > 359 +utc inc -600 if q != 0 +u inc -223 if tn < 48 +tn inc 443 if uz <= 513 +l inc -349 if ny == 82 +utc inc -499 if xxh <= 661 +a inc 600 if hw >= 578 +z dec -636 if utc > 1099 +tn inc 75 if z == 986 +hkt dec 364 if mdk < 377 +ufk inc 249 if fr == 573 +l inc -429 if uz > 507 +hw dec -621 if ppl == -778 +l inc -620 if z != 980 +l inc 319 if tn == 564 +q dec -478 if ny <= 82 +utc dec -169 if uz < 519 +fr inc 124 if dea >= -607 +m dec -674 if p != 28 +m dec 744 if p != 44 +l dec -620 if hw <= 582 +utc dec -950 if p >= 37 +uz dec -122 if xxh < 660 +l inc -563 if z < 996 +hkt inc -514 if m <= 361 +l dec 525 if mdk == 377 +xxh inc -666 if u != -228 +a inc 934 if a <= -23 +a inc 817 if xxh >= -11 +me inc 450 if tn < 563 +hw inc 475 if xxh < -1 +fr dec 493 if xxh < -8 +uz inc -985 if qlm > -1724 +ppl inc 856 if qlm >= -1720 +hw inc -368 if me > -804 +ny dec -219 if p != 38 +u inc 1000 if ny > 79 +q dec 551 if hkt == 281 +uz dec 317 if dea >= -600 +uz inc -916 if qlm <= -1726 +hkt dec 915 if mdk != 380 +mdk inc 484 if l == -2392 +xxh inc 326 if dea > -607 +u dec -803 if me > -811 +q dec 689 if tn != 565 +hw dec 908 if p == 38 +z inc -173 if ppl > 72 +z dec 371 if tn < 565 +p inc 185 if u > 1571 +a inc 490 if mdk != 864 +tn dec -27 if u == 1580 +qlm inc 77 if m > 345 +p dec 364 if ufk <= 1836 +dea dec 308 if me == -802 +a inc -345 if hw == -218 +ny inc 603 if p <= -138 +fr inc -4 if utc > 2217 +me inc 118 if hkt <= -626 +hw inc -590 if z < 443 +me dec 279 if q <= -756 +me inc -50 if dea == -908 +ppl inc 708 if u <= 1586 +t inc -429 if mdk >= 854 +m dec -372 if uz > -676 +fr dec -840 if ppl == 787 +qlm dec -442 if tn != 584 +u dec 227 if l == -2402 +m inc 279 if z <= 446 +xxh inc -951 if t > -421 +t dec 530 if xxh != 317 +fr inc -621 if mdk <= 869 +a dec 480 if fr < 424 +q inc 988 if l == -2384 +u inc 313 if q < -757 +hw dec 237 if hkt == -634 +mdk dec 945 if t > -969 +me inc 631 if ny >= 679 +ny dec -740 if uz == -670 +t inc -310 if utc > 2213 +p dec -453 if utc >= 2218 +mdk inc -266 if hw == -1045 +a inc -887 if qlm == -1198 +ppl dec 521 if t >= -1270 +dea dec -685 if xxh != 310 +l inc -472 if m < 1013 +ufk inc -920 if l <= -2860 +u dec -503 if me <= -373 +ufk inc 547 if m > 998 +l inc -287 if p <= 309 +qlm dec -173 if q <= -755 +u dec -928 if z > 437 +hw inc 43 if hkt < -626 +utc inc -694 if me == -382 +fr dec -938 if tn > 584 +q inc 9 if mdk == -350 +dea inc 119 if m < 1012 +ny dec 210 if ufk <= 1465 +xxh inc 352 if q > -758 +dea inc 483 if hkt >= -639 +tn inc -652 if t >= -1266 +ufk inc 674 if ny >= 1207 +ppl dec 311 if z >= 442 +qlm inc 655 if m < 1005 +z dec 580 if uz < -661 +utc inc -977 if ppl <= -36 +xxh inc -25 if l == -2864 +me dec 252 if uz > -674 +mdk dec -98 if z <= -129 +p inc -276 if utc < 541 +hw dec 796 if xxh <= 649 +q inc -726 if z != -137 +fr dec 433 if ufk <= 2140 +hw inc -701 if z < -131 +hw dec 587 if mdk <= -244 +ny dec -734 if mdk <= -249 +qlm dec -311 if utc != 546 +ufk dec -405 if q > -1481 +p dec 97 if t != -1275 +t dec 597 if qlm >= -49 +ufk dec 389 if uz < -660 +l inc 765 if a < 504 +fr dec -948 if tn >= 586 +qlm dec 79 if m > 997 +ny inc 764 if p < 225 +a dec 419 if m != 1003 +q dec -860 if q != -1475 +fr inc 426 if hw > -3080 +ufk inc 0 if ppl != -36 +utc inc 939 if p >= 206 +m inc 830 if xxh < 650 +m inc -511 if hw > -3091 +u inc -720 if qlm > -134 +dea inc -147 if a <= 503 +u inc -322 if tn != 591 +ny dec 900 if ny != 2713 +ny inc -737 if me == -634 +fr inc -494 if l != -2097 +mdk inc -363 if ny != 1976 +l inc 991 if hkt > -636 +l dec 179 if dea != 232 +q dec -264 if ny != 1977 +l dec -976 if uz > -667 +tn inc 791 if hkt > -637 +ppl dec 225 if utc < 1495 +uz dec -527 if m > 1317 +a inc -644 if me < -624 +uz inc 160 if q >= -361 +u inc 577 if xxh > 650 +q inc 124 if xxh < 653 +l inc 268 if dea > 222 +hw inc 795 if uz < 10 +uz dec 934 if uz < 26 +tn inc 966 if ufk == 2150 +me dec -71 if p <= 222 +me inc 186 if ppl > -270 +m dec -377 if xxh <= 649 +ny dec 275 if mdk > -248 +qlm dec -574 if fr != 1371 +utc dec 78 if xxh > 638 +l inc 494 if u > 3315 +tn dec -595 if qlm > 435 +tn dec 113 if a <= -140 +fr inc -610 if ufk < 2148 +uz inc -791 if u != 3334 +uz inc 356 if t < -1276 +l dec -463 if utc < 1414 +tn inc -266 if a < -137 +p inc 747 if utc >= 1402 +z inc -671 if hkt == -634 +tn inc -441 if u != 3324 +fr inc 172 if hkt > -638 +tn dec -558 if qlm < 439 +a dec -234 if tn <= 2155 +t inc -325 if l >= 126 +t dec -685 if l > 110 +ufk inc -912 if z < -805 +ufk dec 0 if fr < 941 +fr dec 276 if a == -142 +xxh inc -972 if p < 967 +ufk inc 188 if mdk >= -245 +me inc -255 if t > -583 +qlm inc 451 if uz > -1710 +fr inc -921 if z >= -814 +q inc 272 if uz < -1705 +u dec 216 if p <= 956 +a inc 30 if z > -812 +tn dec -202 if dea == 232 +m inc 792 if ny != 1976 +uz dec -867 if z == -809 +ppl inc -765 if qlm != 894 +hkt inc 301 if xxh < -322 +p dec -839 if dea == 232 +utc dec -920 if m > 1694 +a inc -206 if mdk == -252 +ny dec -545 if ppl <= -1029 +me dec -860 if q >= 39 +ufk inc 644 if tn <= 2359 +hw dec 959 if t == -584 +qlm dec 667 if xxh != -321 +ufk inc 598 if a > -323 +ppl dec -514 if hw <= -4039 +uz dec 708 if p == 1801 +hw inc -902 if hkt != -333 +qlm dec 249 if tn != 2366 +mdk inc -570 if z > -812 +fr inc -47 if tn > 2350 +me inc -62 if hw != -4037 +qlm dec 796 if dea > 239 +q dec -201 if ppl == -521 +z inc 265 if ufk != 2481 +hw dec 597 if q >= 239 +ny dec 417 if uz > -1540 +hkt dec -866 if m <= 1704 +m inc 103 if m == 1699 +ufk inc -733 if qlm <= -28 +mdk dec -416 if z > -546 +ufk dec 477 if z < -543 +l dec 224 if m < 1799 +q inc 646 if u < 3327 +hkt dec -501 if qlm != -29 +ppl inc 321 if p > 1797 +a dec 678 if ufk == 1268 +u inc -878 if fr > -302 +t dec 523 if uz != -1552 +mdk dec -490 if fr != -304 +p dec -603 if ufk >= 1264 +tn inc -234 if qlm > -33 +mdk dec -51 if q <= 881 +a inc 672 if me < 244 +z dec 473 if m != 1797 +mdk dec -727 if utc == 2331 +ppl inc -59 if me == 235 +a dec -937 if uz <= -1547 +uz dec -352 if m >= 1798 +fr inc 693 if utc < 2333 +t inc 493 if hkt != 526 +hw inc 86 if hkt >= 533 +t dec 49 if ny != 2512 +utc inc 273 if me != 235 +xxh inc -871 if dea == 232 +z dec -707 if dea != 234 +mdk dec 362 if ny > 2528 +tn inc -825 if t <= -658 +uz dec 655 if xxh < -1195 +dea dec 231 if me < 242 +mdk dec -260 if xxh != -1200 +ppl dec -842 if mdk != 321 +l inc -957 if qlm == -23 +m dec 393 if ny > 2515 +ufk inc -648 if me < 243 +dea inc -251 if fr < 399 +a inc 772 if mdk < 323 +hkt inc 997 if fr > 383 +l dec 13 if dea == -240 +hkt dec -935 if tn >= 1291 +uz dec 992 if u < 3324 +hw dec -970 if t <= -655 +m inc 132 if mdk == 321 +hw inc 908 if hkt > 2464 +me inc -975 if l != 119 +ny dec -76 if dea >= -251 +ppl dec -844 if u >= 3322 +qlm dec 286 if ny >= 2597 +xxh dec 903 if uz != -1843 +u dec 992 if hkt <= 2471 +tn dec -663 if me > -735 +ny dec -598 if ppl >= 583 +m inc 84 if mdk != 318 +ufk inc -260 if t <= -668 +u dec -443 if fr >= 388 +l dec -116 if hw <= -2670 +m inc 816 if dea < -240 +t inc 319 if mdk != 317 +me inc -681 if z < -301 +m inc 451 if uz != -1845 +t inc 472 if mdk <= 330 +qlm inc -125 if z == -310 +ufk inc -419 if p > 2401 +l dec -7 if xxh <= -2096 +m dec 325 if fr < 380 +mdk inc -391 if hkt <= 2465 +xxh inc 491 if z != -315 +p inc -832 if utc > 2324 +t dec 304 if a > 2056 +xxh dec 107 if dea < -243 +l inc 220 if hw < -2681 +p dec -316 if p > 1565 +mdk inc 333 if utc == 2332 +ppl dec 961 if a >= 2055 +fr inc 230 if z <= -310 +hkt dec -715 if fr >= 615 +l inc -466 if p <= 1888 +qlm inc 185 if xxh >= -1725 +u inc -710 if t == -168 +z inc 15 if ppl < -371 +utc inc 422 if hw < -2683 +fr dec 688 if t > -181 +mdk dec 606 if a < 2064 +me dec 323 if z <= -289 +ppl dec 150 if uz > -1844 +t inc 617 if q > 879 +hw inc -212 if qlm != -255 +a inc 338 if m <= 2901 +utc dec 545 if l < -228 +tn dec 407 if z > -303 +mdk dec 784 if ppl >= -378 +q inc -352 if z == -295 +uz inc -644 if ppl <= -372 +fr dec 209 if dea < -242 +tn dec -605 if p >= 1879 +hkt dec 77 if mdk != -1470 +hw dec -280 if hw < -2676 +ufk dec 375 if qlm >= -248 +p inc -958 if xxh <= -1710 +a inc 653 if z != -295 +utc inc 493 if qlm == -255 +xxh dec -649 if q > 530 +z inc -993 if me != -1749 +t inc 119 if mdk <= -1451 +ufk dec 883 if utc <= 2825 +m inc -545 if qlm == -255 +tn inc 626 if dea != -253 +tn dec -111 if p > 923 +tn inc -719 if u <= 2780 +u inc 976 if u != 2767 +z inc -495 if ppl != -368 +z dec 481 if dea != -246 +ppl dec 539 if ppl >= -381 +uz dec 213 if uz >= -2504 +a inc -9 if tn < 1509 +ny dec 719 if u < 3757 +uz inc 718 if hkt <= 3103 +ny dec 378 if u >= 3748 +me dec 163 if xxh >= -1076 +t dec -569 if hkt > 3105 +fr inc -280 if a <= 2407 +l dec -908 if q != 527 +a inc -13 if me < -1912 +dea dec 584 if mdk <= -1464 +hw inc -988 if l >= 692 +tn dec 847 if mdk < -1451 +hw inc 568 if utc > 2822 +t dec 133 if tn < 659 +z inc 271 if q <= 539 +mdk inc -33 if q <= 545 +l inc 185 if dea >= -259 +xxh inc 36 if xxh != -1064 +a dec 70 if xxh >= -1042 +z inc 956 if p > 931 +utc inc -778 if dea != -244 +dea inc -868 if z > -1985 +t dec -872 if u >= 3750 +ppl dec 420 if u < 3747 +dea inc 372 if xxh >= -1043 +hkt dec 32 if u != 3759 +t inc 23 if uz == -1985 +ny dec 106 if ufk == -683 +dea dec -794 if t == 1441 +hkt dec -233 if t < 1435 +q dec -186 if ufk == -683 +u dec 328 if a >= 2331 +xxh inc -179 if z <= -1991 +utc inc -614 if qlm > -254 +fr dec 136 if m != 2349 +uz inc -942 if uz >= -2000 +me inc 391 if m >= 2340 +l dec -448 if utc > 2054 +me dec -64 if fr > -696 +utc dec -621 if qlm > -256 +z dec -622 if dea == 132 +a dec -228 if ny == 1992 +qlm inc 957 if a <= 2563 +t dec 178 if hkt == 3304 +me dec -583 if uz >= -2940 +xxh dec 22 if ny >= 1988 +ufk dec 294 if fr <= -690 +l dec 666 if a != 2559 +tn dec 135 if qlm >= 704 +hkt inc 524 if q == 722 +uz inc 448 if dea > 118 +q inc 299 if hkt >= 3832 +u dec 502 if p <= 931 +qlm dec -530 if l > 863 +m dec -677 if m > 2344 +uz inc -254 if qlm < 1236 +p inc 164 if tn != 663 +ny inc -208 if me >= -874 +hw inc 688 if ny >= 1775 +q dec -90 if ny < 1787 +qlm inc 602 if l <= 874 +xxh inc 442 if uz == -2739 +mdk inc 235 if xxh == -793 +a dec -225 if u > 2911 +m dec -706 if hkt <= 3831 +a dec 229 if ufk <= -977 +ppl dec 256 if xxh == -788 +t inc 1000 if p < 1087 +hw inc -970 if a <= 2564 +hw dec 398 if ny >= 1779 +ppl inc 984 if ufk != -968 +utc inc -979 if ufk != -967 +hw dec -383 if utc > 1678 +p dec 283 if xxh == -793 +hw inc -434 if ny <= 1786 +u dec -226 if l == 868 +l dec 943 if tn > 675 +xxh inc -64 if p >= 807 +ppl inc 577 if fr == -694 +dea inc 629 if ppl > 636 +u dec 113 if ufk != -984 +a inc 482 if dea < 760 +dea dec -232 if xxh == -857 +ny inc -952 if ufk < -967 +hkt inc 159 if p < 811 +z inc 530 if mdk == -1258 +m dec -745 if dea <= 988 +m inc -554 if mdk >= -1258 +fr inc -798 if xxh >= -864 +q dec -139 if utc > 1690 +m dec 962 if p < 808 +a inc -409 if u <= 2809 +u dec -30 if ppl > 643 +uz dec 502 if u < 2834 +l dec -653 if qlm == 1834 +qlm inc 732 if me <= -869 +tn dec 200 if fr >= -1495 +ny inc -26 if a <= 2632 +hkt inc -601 if ppl < 656 +t inc -277 if l <= 1521 +a inc -86 if xxh < -847 +hkt dec -42 if qlm >= 2566 +dea dec 218 if p >= 807 +ufk dec 870 if q > 815 +z inc 141 if z == -1463 +l dec 873 if mdk > -1263 +u dec 897 if ppl <= 653 +dea inc -239 if p < 809 +xxh inc 525 if uz >= -2746 +dea inc 827 if mdk > -1266 +dea dec -988 if ppl != 636 +ny dec 330 if m < 3923 +q inc -413 if hw > -2554 +hw inc 983 if mdk < -1250 +mdk dec 932 if hw >= -1573 +fr inc -984 if u >= 1934 +xxh dec -344 if qlm > 2566 +p dec 189 if tn != 464 +hw inc -986 if ny < 473 +m dec 233 if z > -1323 +mdk inc -803 if a >= 2542 +u dec -858 if dea > 2570 +me dec 215 if dea >= 2590 +q inc 945 if dea >= 2589 +z inc 55 if ny >= 471 +xxh dec -63 if a <= 2544 +fr dec -864 if ufk != -969 +me dec -330 if me <= -861 +ufk inc -96 if dea <= 2586 +fr inc 348 if uz >= -2739 +qlm inc -249 if q <= 805 +qlm dec -752 if uz < -2736 +hkt dec -389 if q < 818 +dea inc -169 if ppl == 646 +xxh inc -689 if z <= -1268 +tn inc 911 if m <= 3697 +ppl inc -390 if a != 2551 +a inc 87 if ufk != -1074 +z inc 413 if ppl == 262 +p inc 476 if mdk < -2052 +p dec -570 if z != -1257 +uz inc 266 if hkt <= 3654 +ppl inc -29 if ny <= 474 +ny inc -154 if ppl <= 264 +ufk inc -614 if uz < -2741 +dea dec -627 if xxh == -269 +me inc 553 if p < 1670 +q inc -413 if a > 2636 +q dec 754 if utc == 1688 +p dec 857 if m == 3688 +dea dec 883 if ufk >= -1074 +uz inc -485 if l == 647 +dea dec -979 if me <= 15 +hkt dec 738 if l > 642 +xxh inc 298 if tn < 1372 +uz dec 235 if l != 651 +m dec -170 if tn > 1379 +hkt inc 902 if a > 2619 +hkt inc 354 if hw < -1573 +qlm dec 512 if uz != -3462 +u inc -676 if t != 984 +a inc 635 if z == -1267 +ppl inc -756 if q <= 60 +t inc 662 if mdk == -2061 +qlm dec -900 if p > 807 +z dec 877 if hkt == 4176 +a dec -841 if uz > -3466 +dea inc 141 if u != 2115 +q inc 917 if dea != 3270 +ppl inc -582 if tn >= 1375 +dea dec -309 if xxh < -271 +utc inc -353 if hw <= -1578 +mdk dec 643 if q != 979 +hw inc -595 if fr != -1254 +xxh inc 736 if ny != 325 +hkt inc -692 if z == -2144 +p dec 500 if hw < -2170 +uz dec -168 if ppl >= -1083 +u dec 419 if hw > -2181 +fr inc -653 if u != 1704 +m inc -677 if qlm < 3716 +qlm dec -341 if u >= 1704 +me dec -926 if utc >= 1329 +qlm dec -462 if hw != -2174 +fr dec 604 if hw != -2173 +p dec -826 if uz >= -3291 +hkt inc -855 if ny <= 315 +utc dec -647 if dea > 3269 +xxh inc 483 if z < -2143 +l dec 93 if utc >= 1979 +dea inc -680 if fr != -1264 +me inc -293 if ufk != -1063 +uz dec 279 if t == 1636 +xxh inc -145 if u <= 1705 +q inc 269 if a > 4097 +ufk dec 734 if l >= 552 +z dec -270 if utc > 1977 +tn inc -154 if t <= 1645 +mdk inc 455 if uz < -3283 +dea inc 350 if utc < 1992 +hw dec -300 if ppl <= -1085 +ufk inc 337 if u >= 1699 +ppl inc -634 if l != 558 +t dec -583 if xxh == 805 +t dec 384 if dea >= 3620 +p dec -873 if m == 3011 +ufk inc -710 if uz < -3287 +hw inc -808 if hkt <= 3490 +hw dec -464 if u > 1702 +m dec -102 if mdk > -2256 +fr dec 579 if t > 1829 +dea dec -839 if qlm < 4519 +ufk dec -741 if l <= 545 +me inc -520 if z <= -1865 +mdk dec 824 if hkt < 3493 +qlm inc -703 if q <= 1243 +t dec 284 if qlm < 4517 +fr dec -527 if ufk == -2183 +me dec -995 if xxh == 805 +utc inc 498 if hw < -2525 +hw dec -350 if ufk <= -2174 +dea inc 143 if mdk == -3073 +utc dec 812 if l < 552 +ufk dec 679 if hkt <= 3490 +a inc -464 if ny < 317 +ufk inc 116 if hkt > 3483 +hw inc 77 if mdk < -3063 +hkt dec 851 if ny < 329 +uz dec -37 if uz != -3287 +hkt dec 45 if xxh == 805 +uz dec -682 if fr <= -1850 +dea inc 695 if hkt > 2582 +p dec 857 if hkt <= 2592 +fr inc 114 if dea < 5309 +q dec -714 if p < 1158 +utc dec 896 if ufk != -2752 +uz dec -937 if ufk < -2741 +p inc -807 if tn <= 1232 +ufk inc 788 if fr >= -1730 +ufk dec 519 if l > 558 +ufk dec 142 if tn < 1227 +ppl dec -561 if ufk > -2103 +dea dec 463 if fr >= -1728 +m inc 139 if tn != 1218 +fr dec -606 if q >= 1951 +qlm inc 934 if fr >= -1122 +a dec -910 if xxh < 815 +hw dec -564 if a <= 5015 +u dec -648 if hw > -1532 +hkt dec 601 if hkt <= 2588 +q dec -480 if hkt < 1997 +uz dec 596 if hkt >= 1983 +p dec -971 if u > 2347 +z dec 790 if m == 3252 +fr inc 281 if hw <= -1517 +uz dec 636 if hw == -1516 +l dec -582 if ny > 315 +ny inc 202 if dea < 5306 +mdk inc -251 if ppl > -1147 +me dec 826 if p == 1317 +qlm dec -11 if p == 1317 +z inc -166 if a >= 5011 +ny inc 455 if l >= 1127 +utc dec -156 if qlm < 4525 +q dec -147 if l <= 1129 +ufk inc 36 if ny < 978 +ppl dec -871 if uz < -2907 +fr inc 776 if t >= 1548 +qlm inc -510 if u != 2352 +z inc 373 if dea >= 5294 +uz dec -975 if fr <= -59 +fr dec -670 if z < -2459 +utc dec 322 if q != 2428 +l dec 3 if ppl != -282 +uz dec 728 if ny > 971 +ny dec -396 if p > 1308 +a inc -502 if mdk <= -3067 +ny dec -492 if uz <= -2666 +ppl inc -720 if t >= 1554 +uz inc -323 if hw != -1533 +ppl inc 805 if m >= 3252 +p inc 310 if qlm != 4520 +m dec 743 if dea >= 5299 +ppl inc 847 if t <= 1546 +p dec 89 if u != 2352 +a inc 472 if z < -2455 +me dec 301 if utc > 914 +ppl inc 740 if q < 2434 +ufk inc -633 if l > 1138 +ppl inc -51 if hw > -1529 +u dec -714 if fr >= -56 +z dec 510 if me >= 0 +l inc 664 if mdk != -3073 +qlm dec -742 if l < 1142 +ny dec -473 if tn == 1225 +fr inc -805 if ufk > -2093 +xxh dec -151 if fr > -74 +hw inc -734 if hw <= -1528 +p dec 976 if uz >= -2990 +mdk inc 523 if m == 2509 +u dec -176 if utc < 923 +me inc 766 if hkt != 1987 +ppl dec -392 if mdk != -2557 +l inc -756 if u > 2527 +fr inc -990 if xxh > 955 +l inc 901 if ufk > -2100 +xxh dec -856 if ppl >= 137 +hkt dec -989 if t == 1561 +p dec 846 if p > 339 +hkt inc -429 if dea != 5302 +u dec 534 if hw <= -1517 +uz dec 178 if xxh > 1803 +z dec 655 if m <= 2516 +xxh inc -340 if ny < 2334 +u inc -545 if dea != 5295 +p inc -996 if uz > -3172 +dea dec -140 if hkt != 1984 +q inc -764 if a <= 4985 +z inc 263 if uz == -3167 +l dec -929 if a <= 4985 +p inc -214 if uz >= -3170 +uz inc 393 if hw >= -1533 +tn inc -624 if me == -5 +me inc -474 if ufk != -2106 +ppl dec 475 if l <= 2214 +qlm inc 417 if u != 1449 +p inc -490 if qlm > 5257 +a inc 526 if u <= 1452 +ny inc -347 if u <= 1454 +p dec 397 if uz < -2765 +t dec 548 if u <= 1448 +ufk dec 514 if ufk > -2102 +l dec 744 if uz != -2782 +fr dec 810 if ppl == -333 +ppl dec -338 if qlm > 5258 +qlm dec 272 if q > 1665 +m dec 521 if ufk >= -2614 +uz dec 558 if me < -477 +p inc -632 if m >= 1987 +dea inc -237 if fr != -1864 +mdk dec 3 if utc > 917 +l inc -406 if dea >= 5213 +dea inc -268 if z == -2849 +utc inc 675 if q > 1664 +me dec -905 if p < -3230 +ufk inc -799 if u != 1439 +xxh inc 718 if hkt != 1987 +tn inc 156 if qlm >= 4984 +p inc -680 if fr == -1866 +ppl inc 423 if hkt >= 1980 +p inc -759 if ufk != -3405 +me inc 496 if qlm <= 4995 +m dec 111 if mdk != -2545 +u dec 351 if z < -2843 +uz dec -405 if xxh != 1804 +ny dec -634 if utc == 1592 +qlm inc 294 if l == 1463 +xxh inc -994 if a <= 5511 +a inc 460 if uz == -2927 +t inc -313 if u != 1093 +l inc 254 if hkt > 1978 +dea dec -290 if ppl <= 429 +ny inc 190 if z <= -2844 +ppl inc -865 if dea == 5220 +z dec 372 if utc <= 1595 +l dec -563 if u < 1104 +z inc -283 if xxh < 821 +q inc 967 if utc == 1595 +q dec -621 if ppl > 433 +l dec -221 if tn > 757 +l dec -935 if a >= 5962 +l inc -62 if l != 3225 +hkt dec -654 if t > 1240 +dea inc 87 if p == -4673 +l dec -166 if u <= 1098 +dea dec 183 if hw != -1529 +q dec 70 if p == -4667 +a dec -673 if ny < 2188 +q dec 295 if mdk != -2563 +m dec -26 if a == 6644 +qlm inc 378 if xxh != 816 +a dec 174 if l <= 3320 +fr inc 117 if dea >= 5131 +hkt dec -732 if hkt >= 2634 +ufk inc -838 if mdk != -2547 +ny inc -964 if a >= 6461 +hw dec -264 if a == 6470 +z dec -834 if ufk >= -4251 +l inc -658 if m > 1897 +xxh inc 400 if fr >= -1753 +hw dec 380 if hw <= -1265 +t inc -608 if utc < 1597 +ppl dec 352 if a > 6467 +l dec -355 if utc > 1591 +l dec 846 if dea <= 5128 +ppl dec 756 if fr < -1746 +utc dec 259 if p == -4673 +tn dec 160 if hw < -1257 +t inc -625 if t != 640 +xxh dec 804 if dea > 5130 +ny dec 227 if z <= -2665 +ppl dec 306 if uz != -2922 +q dec -671 if hw < -1262 +tn dec 149 if ufk == -4248 +p dec -583 if mdk == -2553 +hw inc 312 if uz <= -2919 +hkt inc 111 if tn >= 456 +q dec -23 if uz > -2918 +hw inc -291 if l > 3008 +me inc -744 if utc > 1327 +uz dec 188 if utc >= 1336 +hw dec -575 if z < -2663 +ppl dec 977 if ny != 988 +l dec -84 if dea < 5135 +p inc 905 if uz == -3115 +m inc 636 if m == 1903 +hkt dec 95 if p < -3178 +u inc 249 if utc > 1331 +uz dec -196 if qlm == 5662 +hkt inc -621 if fr > -1750 +z inc -859 if l < 3093 +l inc -789 if ppl > -1957 +me inc 916 if tn >= 457 +uz dec -115 if xxh != 406 +z dec -353 if z <= -2669 +hw inc -965 if ppl != -1960 +t inc 333 if qlm == 5662 +t dec 860 if z == -2310 +p dec -841 if l > 3104 +qlm inc 225 if t == 341 +utc inc -937 if p <= -3185 +qlm inc -191 if xxh < 424 +m dec 607 if q != 2354 +uz inc 807 if p >= -3178 +fr dec -431 if uz == -2804 +ppl dec -312 if t <= 341 +a dec -764 if mdk >= -2557 +utc dec 505 if a >= 7228 +ufk dec -148 if tn != 449 +utc dec -371 if utc != -100 +dea dec -11 if utc < 272 +ufk inc 329 if utc != 261 +utc dec -484 if z <= -2312 +m dec 784 if ppl == -1651 +xxh dec 669 if m <= 1147 +xxh inc -798 if me == 178 +p dec -832 if ppl == -1651 +ufk inc 266 if fr > -1318 +a inc -993 if fr >= -1319 +xxh inc 25 if ppl != -1652 +u inc -353 if hw == -1631 +p inc -338 if q >= 2340 +p dec 517 if utc >= 741 +ppl dec -221 if dea > 5137 +hw dec 949 if mdk < -2544 +tn inc 201 if ufk != -3781 +mdk inc 855 if t > 334 +m dec 604 if q <= 2353 +me inc 268 if tn <= 644 +tn inc -372 if m > 540 +l dec 275 if qlm >= 5687 +mdk dec -13 if p == -3199 +z dec -725 if tn > 286 +dea inc -843 if dea == 5142 +hw inc -603 if a >= 6234 +ppl inc 850 if tn <= 279 +l inc -601 if uz == -2804 +m inc 10 if z >= -2319 +fr inc -412 if xxh != -351 +me dec 726 if tn >= 277 +ny dec -719 if me < -544 +hw dec 413 if q > 2349 +a dec -229 if hkt == 2651 +t inc 620 if t != 347 +uz inc -216 if t <= 963 +fr inc 614 if me != -549 +xxh inc 536 if z < -2309 +q inc 974 if me < -548 +q inc -131 if ny == 1711 +tn dec 110 if tn > 274 +l inc 47 if p == -3208 +xxh inc -872 if dea >= 4295 +tn inc -667 if tn <= 169 +q dec 562 if mdk >= -1700 +a inc -16 if xxh != -685 +hw dec 649 if xxh == -695 +ufk inc 239 if l != 2268 +t dec 935 if ppl <= -576 +m dec 1000 if fr > -1120 +hkt inc -167 if xxh == -695 +ny inc 926 if uz > -3027 +m inc -729 if xxh > -693 +m inc -677 if a > 6221 +p dec -412 if qlm >= 5691 +m dec -678 if ufk < -3526 +ppl inc 206 if z < -2308 +m inc -961 if m != -445 +t inc -989 if mdk > -1701 +ppl dec 43 if q <= 1654 +xxh inc -619 if ny == 2637 +ppl dec 168 if xxh < -1312 +t inc 191 if xxh > -1320 +me inc 387 if hw >= -3826 +p inc 517 if q <= 1648 +q dec 577 if ppl > -589 +u dec -841 if fr <= -1115 +dea dec -791 if p <= -2793 +hkt inc 216 if tn != -500 +uz dec -333 if hkt >= 2490 +dea inc 46 if a > 6217 +mdk inc -168 if fr > -1117 +t inc -606 if fr > -1122 +me inc 662 if hkt != 2491 +uz dec 384 if p > -2806 +uz inc -848 if xxh < -1308 +ny inc 617 if tn < -497 +fr dec -359 if utc != 750 +m dec -911 if ufk <= -3530 +ppl dec -190 if mdk != -1858 +u dec -400 if t > -1388 +me inc -381 if u == 2235 +hw inc -548 if m == 466 +qlm inc -940 if mdk <= -1860 +dea dec 180 if z <= -2316 +hw inc 17 if tn != -504 +fr dec -769 if me > -277 +ppl inc -630 if hkt == 2482 +hw inc 825 if xxh == -1314 +utc dec -38 if hw < -3529 +q dec 851 if uz <= -3918 +me dec -417 if me > -274 +q inc 505 if ny < 3248 +ny dec 299 if fr > 9 +utc dec 996 if z == -2317 +z inc 157 if ppl == -395 +mdk inc -11 if mdk == -1866 +t dec -222 if ny <= 2964 +q dec 1000 if u <= 2244 +tn dec -704 if ppl >= -399 +l inc 666 if utc > -212 +q inc 890 if dea >= 4951 +tn inc 255 if xxh > -1324 +me dec -317 if p == -2796 +utc dec 651 if m >= 460 +dea dec -945 if q > 110 +ny inc -755 if z > -2169 +a inc 1 if utc < -858 +uz dec 840 if utc >= -861 +l dec 131 if ufk != -3542 +hkt inc -442 if u > 2236 +mdk dec -156 if hw == -3531 +ufk dec 380 if uz != -4756 +xxh dec 198 if p == -2796 +fr inc -946 if z != -2165 +q dec -736 if dea < 5898 +qlm inc -284 if fr == -934 +z dec 895 if t < -1152 +me dec -370 if l != 2806 +a dec -949 if dea >= 5906 +l inc -913 if uz <= -4758 +uz inc 15 if t > -1158 +m inc 535 if xxh > -1516 +me inc -896 if u > 2228 +m inc -821 if fr == -934 +me dec 754 if m <= 189 +xxh inc 685 if p >= -2802 +utc inc 149 if uz == -4744 +ufk dec -486 if hw <= -3535 +tn dec 617 if u != 2228 +fr inc -971 if ny < 2191 +l dec 933 if z < -3053 +q dec 269 if qlm > 4467 +me inc 449 if l < 968 +utc inc -359 if l <= 965 +tn inc -465 if p <= -2798 +xxh dec -811 if t <= -1149 +fr dec -106 if m <= 182 +uz inc 603 if p < -2794 +uz inc 310 if z <= -3064 +ny inc -764 if hw >= -3538 +mdk dec -843 if ufk < -3416 +a inc 49 if tn != -158 +dea inc 129 if ufk >= -3433 +ny dec 515 if ny < 1438 +q inc -603 if ufk < -3419 +tn dec 470 if hkt < 2496 +m inc -669 if utc <= -1067 +dea inc 401 if ny >= 912 +p inc 129 if tn >= -631 +p dec -708 if hw != -3540 +dea inc 932 if mdk == -1024 +tn dec -244 if ufk == -3426 +ny dec 632 if utc >= -1075 +ny dec -958 if z > -3063 +me dec -67 if hkt == 2490 +fr inc 431 if mdk > -1038 +ny dec -435 if z < -3052 +ny inc 997 if ny != 1686 +dea inc 397 if hw < -3537 +hw dec 232 if xxh == -16 +q inc 826 if p > -1960 +q inc -807 if z < -3045 +uz dec -645 if a < 6227 +me inc -725 if qlm < 4477 +xxh dec -440 if z == -3055 +mdk inc 647 if m <= -489 +t dec -497 if dea != 6827 +hkt dec -874 if hkt == 2490 diff --git a/src/main/resources/2017/day9.txt b/src/main/resources/2017/day9.txt new file mode 100644 index 00000000..b226fcca --- /dev/null +++ b/src/main/resources/2017/day9.txt @@ -0,0 +1 @@ +{{{{{{{<""!>,!!!>!<{!!!!!>>},{}},{<<'"i!!a!{oe!>!!e!!!,},,{<}{a",!',!!!>},!}<,'!o,<>}},{'"i!!!>u!>uai!,!>},,!>}o!>},,},,>}},{{{oo"!!a>}},{{{{}},{{{},{{}}}},{!!i'!!!>"""!>>,{}}},{{},{{'!>,e!>},},<,,{"{"!!!>'>}}},{{{{<"ao!>!!!>,,{<{!>,!>,}},{<,,<<<}a!!!!a!>,<>,!!!!!>!!"oe!!,o{!>},<}!>},<!a!!!>>}}},{{{{<>}}},{{!!!>!!!>!!!>!>},,<"!>},!>},,<'!!!>!!io>},{{{{<}!!!>},!>},},{<'!>,}},<,},{},,<>}},{{},<}{a!oei!aa,}"!!,e!>!!!>'!!}{>}}}}},{{{{!!i!!u!>>},<'!!!>!>},,}},{<,!!!!!>,<'!a!!!>,<{!<>}}},{{{<,,'!>,<}i'!>,!>},>},{{!!>}}},{{<'!!>}},{{},},"o!>,!!!>>}},{{},<<}{<'!>,!>,>,{}},{{{},<>},{{{}!>},,},{!>,<}!!o<,,{>}}}}},{{{},'>},{o!!i>}},{{}},{{<>,},a}i{!>ii!><>},{{!!!>},,{{<}{u!,u}{>},<}!>},,<<{u!!!{">}},{}}}}},{{{{{},{}},{{<{e{!!!>i!>,uei"!!!>},<,!<}!"!!o>,{}}}},{{<>},{{<,o"i!!,!oe!>},<"}o!!!>,{i!,u>}}}},{{},{{{<<>,{}},{{{}},{,<,'!!!>!!o>}}}},{u!!!!!o{'!>ai>,{},}}},{{},{{!>},,{,}u},oue!>,,,{},!>,},}}}},{{{{,,,,,},<'!>,,>},{{{{>},{a,!!!<"'!!>}},{,<,'>,i!}!>,<,!!'!!},{<'!!ee!!i!i>,{}}}},{}},{{{},{{{{}}},{{o,!>eei>,{<}}!>},<},ie!>},<}},{!>,!>},},<{}ua}uuu}o>}}}},{{{oe!>},'!>,i">,},},<{i">},{<}ui"!!!>"},!>,}},{{},{{,,<{io"!"e<,!!i!o}u"">},{,,<'!!,'a{"!>,<"o"ui,>}}},{{"!!!!,ia}>,{{,<'o}!!!!">}}},{{{!>!>},<>,}}},{{{},,!>},"e!!u!'!!!>>},},<,e!!{!}u!>>}},{{{{{},{{},<">}},{<"!>},<"!>},,{}},{{!!i!!!>,<>},{{e'iie"!!u!!!>>},{}},{{{{}}}}}},{<},<>,<"e},i!!}{u!>},,},<"!!!>a!!!!>},{{{"iu!>},a!!,>},{},,<}}!>!!ee{!>!!!!,!!'!>>}},{{},{}!!i}>}}}},{{<}o!>"{!!!e!!">},{{<>},!!!>},},<>},{{},}}}}},{{{<<}"uu!!i!>,!!!>,},,{}},{a<}>}},{,},<{ui!>},<'"u!!{>}},{{{{}},{<{!>!!!aa!ua{!>!!!>!!{{>}},{''ueu}o}"!>,!!!>!!!>>,<'!!!>!>!!!>!>!i,i!i!,!oie>}}},{{},!>!!!>,!!!"'!!>},{}}},{{}}!!o>},{<{'a!!ia'o!!!>},},<"u>},{{{{!!!!'{!!!!!>"!>,<>},{}}},{u!"ooi!!!>!!>}}}},{{{{{{{,},<{!>},},<}!>{i!>!!{!!!>!>>},{},},},<!!i,!>,}},<,{!!'!!!>!!}ua>}},{{{,'u!!o!!!>},},{<}i"uo{!>>}}}},{{{"!!!>!!aioiii>}},{!!!>!>,,},,a!!o!!}!o!!!{}!>!!!>a{oo!>e">},{},<'!!!!!>"a'!>,},"'<>,}},{{{},<>},{{{{{!!a},{}}},{,,<>}},{{>},<,<}},{{{},,,!>!!!>!!!e},{,},<>}},{}}},{{,,<},{{},{<{{'>}},{{},{<>}}}},{{,},,<>,{{}}},{<}!{!>,,<>,{},>}},{{}}},{{<"e,!>!>{!>,,{<!auei!>},>}},{,<'e{!!<<>},{,<>}},{{{{{},{,!>,,{{},!>,>}}}}},{},},,,<!!!>,<>},{{ea,a!>,},{{{<{!!{!>,<!!!>'!!!>"{"!>!!"u'!e!>},},<}{,{>},},!!'!>,<"!o!>,<,!>,i!>">},{<>,{},},<""!>},!>!{!!u!!!>e!!!>"o>}}}},{{},{{!a!!{!>},>},<'!!i>}},{{{},{{{}},{{a,u!>},},},!>},<'>}},{{<}!!}"!!a!!!>{iu!>!>>,"!!,,}{}!"!!e">}}},{{<'{o!!!!a!>{!>,},,<>}}},{{},{{{<",!!i!!ea{"},>},{},}}}},{{{{},{<<}!>}o!!!>!!!!!>!!a!a!>},},<>}},{{{{<'>,<,<}!'e!!!>,iao,},{{<{!>},}},{{{},{}},{{{,}},{{<'!!!!!>},<'{!!!>>},{}}}}}},{a!!!>},!>!!{i!e!u>,},},<}a>},{{<,!>},e},,!!oo>},},<'>}},{{{},!>!>,<'!!!>}}>},{},,!>,<>,"!!!>!!!!!>},!>,},,!"!'>}},{},,u!{!!{!!!>},,<'o!!i!>},,<>},{{<>},{{,,}}}}},{{{{{<>}},{{{{},{{i{ua!!!>},!!{o>}}}},{!>},<"'!>u'!!u!!<}u}>},{{}!>!!!>,<>},{},{{{{!!!>!!!>!>a}}!>i!!!>!!uu>}},{}},{{},<>}}}},{<">,<"!>>}},{{{{},,,},<>},{},},i!!!>>}},{,{<>}},{{!>,<{!!!!!>,<>,{{,!!,}a!!!"!!!!u{!!i>},<}!>},<}!!!!!>,<"!!!>,{",!>},},<>}},{<,<>},{,{,!!"'!!!>'!!a}a''!>},}}}},{{{<},,<"'!!!>!!!>,<'!}!!u'!!!!!>,<>,,<o}a>},{},{}},{{}},{{{<}">}},{{<,!>ea!!!>,{!>},!>,<{!>},},{}}}}},{},{{{{},{<"',},,,<>},{}},{{{>,{<{o},},!{">}},{{i!!!>!!!>},},<'o!!!>!>,<>},<}"a!!!!!>,,<}'!>,<'"!>!>},<{},{{<'!>,,},},},{}}},{{{}!}a>,{}}},{{{{<">},},{}},{{,!!"}e>,{}},{},<},,<'a{!a>}}}},{{{!o{{!!{!>,,eu!"i"!!'!!""!!!>},<">},{},{{},!!!><>},{<{!>!>,},},<"!>,oaiui!>,<>}}},{{<}!>{,!!!!!>!!!>,},<,!!!>e!!!>,,<>},{}}},{{{}}}},{}},{{},{{{!!!>},'!!!>"!!o!!!">}}}},{{{{{{},<{!!!a!!!!!!>},<",e!!!>!oe!!!>,!'o!!"!>},<>}}},{{{{{}},{{,,o!>!!!>>},{<,i}{!>},,,},!>,<>,{{},>}}}},{<"au!{e"!>>,},<{,i!>,>}},{{!!!e>,<>},{e{,{a!!ee"!}!>,<,}e'>,o}e!>!{,!>!>,<{!!!>!'}<>},{{}}},{{},{{{ue!>,,<>},{{{<"!!>}}}},{}},{"'{ieau,{u}!!">,{<>,{}}}},{{<'!,!!!>},<}!>},!>,!!!>!>},<>},{{,<"aa>},},},},<">},{{<{!!!>,,!!u!>!!a!!oai!>,,e}>},{},!>},<}!>,<"!!!!i!!!>!}ae{>}}}},{{{{<"o}}{!!!>,<'!!>,>}},{'u!>},"!>,<>,{{!>{!!>}},{{{{!!!!!>'e!!a,}ea,i!>>},{<{!!u!ao!!!,!!{!>!!!!!!!><"}!>,,oi>}}},>}},{},{{},<},,}>}},{{{{<>},{},<,o!!},},}},{{<,!>}<,"!!!!i!!!>>},{}},{}}}}},{{,<>,{{!!!!!><{!!u!!!!!>o!!e!'i>}}},{{{{},{!,i!!!!!!!>!",>}},{{{}},},{,!!!!!>'!>,,<>,{<{!!!>,<>}}},{{{},,},},,},{{<<}!!!!!!}!>},<}},{{},},,!>},<{,"o{i!!!><>}},{{{{},,{<""!<'u'!!i>}},{>}},{{{o!>!!!!a!!e!>,,<>},{<"!u>}}}},{{<"'!,!!u!>,,}}},{{{{},<>},{<,!ou!!!>>,{}}}},{,{{},{{<{!>},}!,},{<,<>,{}}}}}}},{}}},{{{,o>},{},{{<'o>,{<}!!ua'"o}},{{{{}{'!!'i{"!>e}!>a>}}},{{},<"{!!u!!}!!,<!!!>!>!!,u,"u{>}}},{{{<,",'!!!},{}},{{{!!!>,<,,<{>},{}},{'!!>}},{{}}},{}},{{{,<"{"}"oaa!!!>o",!>},!!!>,<>,!!e!!ao,>},{{{<,!!!,u},},"o>}}},{{{,},{}},{}}},{{},{{eo!a!>},<"!<},!>},>}},{{{!>},,<>}}}},{{<{i"}!i'!!}a!!i!!{,}}'!!!'!!>,},{{{}},{}}},{}}}},{{{},<<"}u!!'!>!>},},{{},},<"a!u!"">}},{}}}}},{{{<,}!!!>a!>}'>},{{{{{<}!!!>'{!!!>!!!>!>!>},},}},},{{},{<>}}},{{{,{>},{{},{{{{}},<",o!>!!,!>,a,!!!!!>>},{<,i"}>,{}}}},{{>}}},{{e!>ee<,!>">},{}}},{{{},"!!!>{u,!!!>},<},{,{!!>}},{<<,eu,a{>,!>,<"a{!!!>a!eiao{!>},!!u!e!!<>},{{},},},<}'!!"a,e"!>!{!!!!}>}}},{{},{{},{{{,<"a,>}},{}}}}},{{{{{{{<<'!!!>'!>!!!>!!"!!oe}<">},{>}}},{{},{{{<"!>}!!,!>,,u"u}>}},{}},{,<"!!!><,<{!e,>,}},{},i!>!!!>!!e!!ua!!"!''!!!>!,>,{},,}}"!!!>},<>}}},{},{{{}},,},<,!!!>!>,<'!!},,}!>},<,">}},{},{{{},{!>>,{}}}},{{{{},<"!>},<"e!>,,,<ao}>},<,e!}},{},{}},{{{},<>},{,<"},ea!>,!!'!>,<"{"!!oua!>!>},<,!!!>a>}},{{{<"!!!!!!a">},,>}}}},{{<"oua,{>,{<"'!>},},!>},<,i!,}i<>}},{{{<}!>,},<}}a!>},!!!!'!e!!!>,i'i>}}},{{{{},},},{}},{{{<'!>},},,<{!!!!!>aa>}}},{}},{,<}eauo!>">,{i<}!>"!>,,}}}},{{{{{<"!>},<"!>},},a>},{{}},{{,!!!!!"!>'ii!!!!,>},!!ea!!!>!>},!!iu!!!!!>},<'!i>}}},{{{{<{!>,<'>}},{{{},<'<,!>,}},{{{},<,!>},<<>},{}},{{<"",<{,!!""'e>},{{{,<>,{{!!!>},<>}},{}},{{}}},{{{e!>,},<}i'>}},{,{}},{}}},{{{}},},},<>}},{{a!!!!!>!!!>!>,<<"!>,!i"o!>">},<>}}}},{{{ieio!>,},{}}}},{{{<,<>,<"!>,<,!>,<<',,<'">},{'a!!!>ae!!ue,{!>!!!!!>!u>,<>},{{},{,<o,!>>}}},{{{,},},!"!!!>>},{aa!!!!!>,e<'>,{,!!{i}{"!!auu,>}}},{,<"o!>!>}}},{{<"!!!}a>,{!},!!!>a!!''!!!!!>{}!ao">}}},{{{{{},{{,"{'"u}!{"!>,},>},,'o!>'!!!>!!a},{{<{!!!!!>o!!!>,},},}}}}},{},{{},{<},},<,!!!>o>}}}},{{{{,<"!>,<{e<,!>!>,,<>},{{<',}},!!'!>,<"!>},<{!i},{u!<}"!!!>!>!>,},{'>,{},<,>}}},{{{},,<>}}}},{{<{i!!!>e}>,{{<<,!>,},,},}}},{!>},<!!}"!>},},<,!"!!!>a>}}},{<}{o!e{!!!>a'!!!>e!!!!!!u!>,},<>},{i!>,>,{,<"!!!>i!>,<'!!!!o<>}}}},{{{<>}},{{{{,{!>!>},>}},!>!>,,aoau}!>},<}o>},{{{<>}},{},,}},{{,{<{!!!>}}a{'u<>}}}},{{{{,!!u,i!>},!!,!!!>,>},{{},<}!!}!},!!e'>}}},{{},<},!!!!i{>},{{,<{!>!!!!!>o!!ii!!uoi!!!>}}}}}},{{{{{,<}>},{}}},{{{{},},}!>i!!!>"ai>,{}},{{<{"!!i{',<>},{{{!!!a'!>,{'!!}},{{,},<>},!!!!e!'!!a!>,a!>!,u!!!>i<>}},{{'>}}},{{},<''!>,<{e!>e}!}!!!>!!'!>},}}},{{}},{{{{{},,"!>,,{,!!!>"i,"!>},}},},,,},{}!>,<}!>!ae!!uu!!!>,<>}},{},<}!!!>iuaa!oa}}!!ia!>i">}},{{{e{,o!!}!!iu'>,{{ui!!!uau!!!>>},{}}}},{{}}}}},{{{{{{}!!!>!!{!>},,<>}}},{<>,},},{}},{{{<{ie!>!!,!>,<{!!'!>},,,!!!>>},{!!>}},{<'uo!>},},{}},{{{}},{{{}},{{},}},{{,!!!>!!<'!!u,>},{},<}e>}}}},{{{},<{!!!!!!!'{},{<>,{{{<{'i!!">}}}}}},{{{!!!>!!!!i!>},}},{{{{,!!!>,<>,{{<>}}},{{{}},{a!!}>,{},}},{},,<'">,<{'i!>},<}!!>},,<>}}},{{{},<,'!!o!!!>,!}o!!iei!>},>}},{!>},>}}},{,!!!!e!!!>!!a>,{}}}}},{{{{{<>,{{<<}}!',}!>!>,,ia!!u>,{}},{a'>}}},{{{},{{iu!!!!!>!!ae>}}}},{{<'"i!>,!!{o!<>,{<,!>!>},,<{"e}u!>,<{}}}}},{{{<}}!>},<'a!>},},<"i<{e},<,>,{<},}},}},{{{},<!>},},},},a!!ii">,{<,!>,<,,}!>,i}a,"o{!!!!>}}},{}}},{{{<},''!!o{!!!o!>,i!>},<,>}}}},{{{{{{<}!!!>,,},,,<,!}!u,a!!!>},},{{{,!!!>},<,!!!>},}},<{!!!>!ao!a""o!>!!!!a}!!o},<'!!!>>}},,,<,iu!!i<>},{{{},<'!>},!oi'!>},,<}a'!>,<>}}}},{{{{{{!>!>,<"!>,u,{!!!>a>}},{},a!>,}},{}},{,,,a'>},{{<"o!>},},<<{u!>},<{"!>,},{},{{},<!>!>,,<},},<",i!!!!!!!!<>}}},{{},{}},{{{,<{!},}!uu,'}'{!>,},'!>,<>},<>}}},{{<}!>,,<"!>!!!!i!>o'!>,<,>,},{{<}{!>,<},},u}>},{}},{,<<"!!!{a!>,,},},<{e,>,{,,},<"!!a!>>}}},{{{{!!!!!!!>!,{}a!!"'!!o!>!!!o!!!>!''>,{}},{{}},{{}}},{{{{},<>},{!>,}}},{{},<{u'{a,!!!!!!a,,},<'!!!>,!>!e!>,}}},{{{<<>},,<">},},a!!!!!>a!!!>!!!>u>},{{},{{}},{{!>},<>},<,,,!!!ie'u!i!>o!}!>},},>}}}},{{{<'{'i}aeoo{!>,,!!!>,!u!!!>>}},{{{{!<}>}},{,,},{,<{!e{'>}},{{{<,!i>},{<">,{{}}}},,!ua!!"!ue',!}au!>>},{!!'},,,<{>}}},{{{,<"'<>},{<,'>}},{{},}>}},{<"}}o{!!{!},!<}u!!>,!>},,<'i!!!>},e,!!o!>},<'o!!!>i!!>}},{{!!}!>,,},,,"}},{{},{,"eo'!!eu!>,,!!!>{}o>}}}},{{{{,<}!!"!>},<"!>},}},{{{!!!>,"o!>,<>}}},{{},<>,{a!>},o,{,i!!"i>}}}}},{{{{},},,},<},<}"!!a}{u>},{!u!>,!>},<"!!!>>,<,o"!>},},},{},},<}},{{{<"!>},<}{,a!!!>>},{{{}},{},{o!>,},{,<}!>},}}},{{<}"o,"!!}!!{!>},<}!>u>},},{},<{>,{},<"u!eui{,!>},<{{'o>}}}}}},{{{{},{{{},},!>,,!!!>!!!>!!!>!>}',e{!'!!!>o>}}},{{{{},<}!!u!!!>!!!>!>,<{>},!!e}>},<>},{{{<{!!!>,!>,!>'i!!!>!!{'!!!>u>}},{!!!>},<,!!!>!!!>}o"!>>}}}},{{{,,!>!>},<>}},{{},!>},<"}!>!>,!!!>a,{<,!>{,,<,}o',!>,<>}},{{}}}},{{{<'"!'!!!!o!"!!{!>,<,!"u{<,!">},{}},{{},}!!'!!!>!eaae{!!!>},oo>},{,},<,!!!!!>!i,!>},}}},{{{{{,,}},,!>},!!>},{},<!}!!!{>,{{<}i!!!>!!"!>},},!!i<{>,{},,,<>}},{<{!>>}}},{{,<{}'e!<>},{<!!!>>}}}},{{{},{{!!a"},!>,<>},{{},{{{},},}}},{{{!,!>,,{{{},{,<'!>},,<"<},}},{eu{i'!!oou!>,<,!!!!!>}o}!>,<>}}},{{{<>},{},<>}},{{!!','>},{!>},!!,"">}}},{{{{},{,},<{e,,!>},}},{},<'!>},,,,},<>}},{}}},{{ei{!!!>"}i<>},{,!!!!"!>,!!}!e!!{>},{{,<"!!!>{a>},{{u"!!"{!>},<,},o}!>},>}}}},{{{<},!>,!!!>>},{{{,<>}}}},{>}}}},{{{{{,,<>},e!>},},},<>}},{{},{}},{{!o{e!>},},{<">}}},{{},{{!!!!{a}'!>,{!>,>,!!!!o!>}!>!!"o!!{"!o!!!>>},{{{'!>,<!!!>e,<{!>!!,>}}}},{{{{<>},{<,!>},'"e>}},{}},{{{<>},,,,!>},},<>},{{<>},{u!a"!>eae!!oii>}}},{{},{{,},<,u!!!!,ue>},<{!>,<>}}}},{{{}},{{},{{<}"}!!!!,!!!>!!!!!>!>i<>},{}},{},},<",!!!>u!!!>!>>}},{{{e!!"!!!>'>,{!>,},}},{{!>},!>uu",!!e!!!>a}i!!'>},!>,e!!"i!!!>}i!ui"uo!!>},{}e>,{{},{{{<},,,<'}!>,<},!>>}}}}}},{{!>!>e>},{,a'!>},}}},{{{}},{{}}}}},{{{,<}"}a{!!!>!!!>!!!!a{!>eiu>},<,!!!>u>}},{},{{{}},{{},},<'i!u'!!!>e!!oe!>},}!ii!>!!e!>,<">},{{!>,!!!>!!!>!!oe!>},},}}}},{{{{{{!>!!!>eai},,i>}},{{{!!!!!>,<"'!!}!!!}!>eu!!!!!>},,<,>}}},{}},{<}a!>},,!!!!!<>,{},u{}io,{'iu!>,>}},{{}}},{{{{!!'!!!>},<"!!!!<}i{!>,<},{{},{{}}},{}},{},{}},{{{{,,<{!!,{i!>}}!"o!!>}},{}},{{{}},<"o>}},{{{{{{<">}}},{,<"!e!<{{!>,<'ou>,{<>}}},{{!!u!'o"!!},},<}>},},<{!>,<}!!!>!!'!!!!{!>,,<>}},{{{{{,<<'!>!!a>}},},<"!!!!!>>},>},{{<"!>!>},,<>},{<,!>},!>i!!}a}{}!>",!}eu>,{,},}}}},{{<}o!!!>!>,>},{}}},{{},{},{}}},{{{{!!!!!>uo,!>},<"!!!>!o!>,}},{{},,e,!!!>,},}},{{<<{"!>},,<'"!>},<">,{{<}i!',!>},},}>,}}},{{{{"e!>},,<>},<>}},{<"<"u,!!!>e!!}!i!>a>,<'"'a!{!>,<'!>},<>},{{<}}ia!!!>!>},<,!>"!>a!>>},{},<>}}},{{!!!>!oo,!!!>,},{{},<}!>'!},i'>}}},{{{{e!!<'i!>,<"!!"e>,<<{!!!>!>!!!'!!}!'eai!uu!>>}},{{{},{},'!o!>>,{},<}>}},{{<>,{}},{{{},{}},{{<{"},}}},{,,!!!>e>,{{}}}}},{{}},{{{{{{{{},}},{},<i,o}a!>,}},{}},{{}}}},{<{"!>,},<>,},!>!!'o!>i!iua""!!!>},},{!!"!>},!!!>!>,>}},{}}},{<"'{<,i<<'"!>},<'!>},>,{<}!a!!{>}}},{{{!>},o}!>},!>,<},<>}},<,>},{{{},<}}a",!eo!>},},<}}}},{{{{{{}},{{}},{{{{{}},,}},{}}},{{,{<"!!"!>},u!!!>!>!>!>},}},{{}}}},{{{!{!}!>e>},>},{{{,},i<{>}},{!!!>a<!!!>>,{<>}},{,,{<>}}},{{{{{}},{}!>,{!!o!>,<{oe"!>>}},!!ue!>},<'u!!!>a'>},{<{!!<>,<}a!!!>!>ooa>}}},{{{{{{}},{}}}},{{{<,},,<},{,{<}!>,},}}},<{!!!>},!!u!>},!!!><>},{{<>},{{{<,,!!!>!{{>}}}}}},{{!!!>uu{!!{>,},!!{,!!!>,<">},{u!!!>}!>a!!!>!!!>u,>,{}}}}},{{<"!!!>,<'!!!>!ao>},{,<"{!>},<!!!>>},{{{}},{,{}}}}},{{{,<'!>},<,!>,!!!!!!!a!!!>>,{{},{!!!>o>}}},{{},{}},{{{!>ee<"!!!>,<>}},{!>,>}}},{{<,a!!!>!!}{e!>}o!>>,{<},"!a!>!>}}!!!>,!!!>"o!>},<'i{>}},{{!!'<}!!,,},<>},{<>}}},{{{{{,,<'!!!'"!}>},{<<,{ei>}}},{{{{},<,<"i!!e!!'i!>},<"!!!>!!!>!!!>,<>},},{}!>,<,!>,!!i!!!>{!>,<>}},{{},{,<'u!!'!}!e!"!>{a!o!>},<,!>!>,,<>,!i"!!<},}>}}},{{<{!!!>>}}},{{<{!>},'!!!>,>}}},{{{,,<,>},{},,},{{{!>!!!!!>},<>},},<<"}}},{{{<'!!!>!!!!!!!>},au!i!>u!!!>"},{,},<"!!!"}!!u,<{<'au!!{!>,<>}},{{<{!>},<'iioa!>o'''!!!>u!!!>},<>},{{},,>},,<<{!ue!!!>i!>!>},>},{,<">,{}}},{{},,{!>},,{>}}},{{{}},,},,i>},{{!>},,<,},<>}}},{{{<{a!>,,},<"{{'>},{<{>,{o<"i!>},!!!>e!!!>,>}},{{<>}}},{{{>}},"iu'!!a!>},<,!!i!>ae!>},>}},{{<{">},{,{,!>},!!!>!>},,{{{}},{},<{!}}}},{{<}u{}oo''{'},<>,{{{},{{!}a!!!!!>>},!!!!!>uo!o}!!!>,o>}}}},{{{},},{!!,{e!!>}},{<>,{}},{u{a'!>,!auu"!>,}},{<'ae{!!!>!>{!>,<>}}}}}},{},{{{{,<o!>},},<>},{},!>!!!>>}},{<{iu!>},a">,<{'"o!!!>},},!},<{,"a!!!!"!>},<>},{{,<"o!>!>,},<>},{<"!!e"!!!>!>,,{<'!>,!!'!!aia}!>},},<!>}}}},{{{,<,>,{{<}}}},{{{<{u,<',<"!>>}},{{>}}},{<,"{u'!>!>,,{{{,a!!!!!a!"!},!>o!>,<",!!!,u!!!>},<>}},{,},<}"!>,o>}}}},{{{{},},},},,'!>o!>!"{ae{a!!a>},},{,!>},,<"!>a>}},{{<,{}i!}'!{!>>},{}}},{{{{},{,>,,,<>}},{{<>},{<>,{!!!>e!!!>!>a!o!,ue,{!ua>}}},{{{<>},{,<,}"!!ao"!>,<,>}},{<}!!!>!!uo}!!!!!!!>,!o,u!>,a!!,!>>,{}},{{<{!!!>,},<","i!!>,{{<{i'!!{""i!!!>,>},{{}}}},{},{,,<{i!!!!!>}a,!!u!>},"!>},,{}}}}}}}} diff --git a/src/main/resources/2018-examples/day10-1.txt b/src/main/resources/2018-examples/day10-1.txt new file mode 100644 index 00000000..7be78e79 --- /dev/null +++ b/src/main/resources/2018-examples/day10-1.txt @@ -0,0 +1,31 @@ +position=< 9, 1> velocity=< 0, 2> +position=< 7, 0> velocity=<-1, 0> +position=< 3, -2> velocity=<-1, 1> +position=< 6, 10> velocity=<-2, -1> +position=< 2, -4> velocity=< 2, 2> +position=<-6, 10> velocity=< 2, -2> +position=< 1, 8> velocity=< 1, -1> +position=< 1, 7> velocity=< 1, 0> +position=<-3, 11> velocity=< 1, -2> +position=< 7, 6> velocity=<-1, -1> +position=<-2, 3> velocity=< 1, 0> +position=<-4, 3> velocity=< 2, 0> +position=<10, -3> velocity=<-1, 1> +position=< 5, 11> velocity=< 1, -2> +position=< 4, 7> velocity=< 0, -1> +position=< 8, -2> velocity=< 0, 1> +position=<15, 0> velocity=<-2, 0> +position=< 1, 6> velocity=< 1, 0> +position=< 8, 9> velocity=< 0, -1> +position=< 3, 3> velocity=<-1, 1> +position=< 0, 5> velocity=< 0, -1> +position=<-2, 2> velocity=< 2, 0> +position=< 5, -2> velocity=< 1, 2> +position=< 1, 4> velocity=< 2, 1> +position=<-2, 7> velocity=< 2, -2> +position=< 3, 6> velocity=<-1, -1> +position=< 5, 0> velocity=< 1, 0> +position=<-6, 0> velocity=< 2, 0> +position=< 5, 9> velocity=< 1, -2> +position=<14, 7> velocity=<-2, 0> +position=<-3, 6> velocity=< 2, -1> diff --git a/src/main/resources/2018-examples/day10-2.txt b/src/main/resources/2018-examples/day10-2.txt new file mode 100644 index 00000000..0d1b4762 --- /dev/null +++ b/src/main/resources/2018-examples/day10-2.txt @@ -0,0 +1,89 @@ +Initially: +........#............. +................#..... +.........#.#..#....... +...................... +#..........#.#.......# +...............#...... +....#................. +..#.#....#............ +.......#.............. +......#............... +...#...#.#...#........ +....#..#..#.........#. +.......#.............. +...........#..#....... +#...........#......... +...#.......#.......... + +After 1 second: +...................... +...................... +..........#....#...... +........#.....#....... +..#.........#......#.. +...................... +......#............... +....##.........#...... +......#.#............. +.....##.##..#......... +........#.#........... +........#...#.....#... +..#...........#....... +....#.....#.#......... +...................... +...................... + +After 2 seconds: +...................... +...................... +...................... +..............#....... +....#..#...####..#.... +...................... +........#....#........ +......#.#............. +.......#...#.......... +.......#..#..#.#...... +....#....#.#.......... +.....#...#...##.#..... +........#............. +...................... +...................... +...................... + +After 3 seconds: +...................... +...................... +...................... +...................... +......#...#..###...... +......#...#...#....... +......#...#...#....... +......#####...#....... +......#...#...#....... +......#...#...#....... +......#...#...#....... +......#...#..###...... +...................... +...................... +...................... +...................... + +After 4 seconds: +...................... +...................... +...................... +............#......... +........##...#.#...... +......#.....#..#...... +.....#..##.##.#....... +.......##.#....#...... +...........#....#..... +..............#....... +....#......#...#...... +.....#.....##......... +...............#...... +...............#...... +...................... +...................... diff --git a/src/main/resources/2018-examples/day11-1.txt b/src/main/resources/2018-examples/day11-1.txt new file mode 100644 index 00000000..283f0f35 --- /dev/null +++ b/src/main/resources/2018-examples/day11-1.txt @@ -0,0 +1,5 @@ +-2 -4 4 4 4 +-4 4 4 4 -5 + 4 3 3 4 -4 + 1 1 2 4 -3 +-1 0 2 -5 -2 diff --git a/src/main/resources/2018-examples/day11-2.txt b/src/main/resources/2018-examples/day11-2.txt new file mode 100644 index 00000000..025cfc62 --- /dev/null +++ b/src/main/resources/2018-examples/day11-2.txt @@ -0,0 +1,5 @@ +-3 4 2 2 2 +-4 4 3 3 4 +-5 3 3 4 -4 + 4 3 3 4 -3 + 3 3 3 -5 -1 diff --git a/src/main/resources/2018-examples/day12-1.txt b/src/main/resources/2018-examples/day12-1.txt new file mode 100644 index 00000000..c2169663 --- /dev/null +++ b/src/main/resources/2018-examples/day12-1.txt @@ -0,0 +1,16 @@ +initial state: #..#.#..##......###...### + +...## => # +..#.. => # +.#... => # +.#.#. => # +.#.## => # +.##.. => # +.#### => # +#.#.# => # +#.### => # +##.#. => # +##.## => # +###.. => # +###.# => # +####. => # diff --git a/src/main/resources/2018-examples/day12-2.txt b/src/main/resources/2018-examples/day12-2.txt new file mode 100644 index 00000000..5fd546c4 --- /dev/null +++ b/src/main/resources/2018-examples/day12-2.txt @@ -0,0 +1,23 @@ + 1 2 3 + 0 0 0 0 + 0: ...#..#.#..##......###...###........... + 1: ...#...#....#.....#..#..#..#........... + 2: ...##..##...##....#..#..#..##.......... + 3: ..#.#...#..#.#....#..#..#...#.......... + 4: ...#.#..#...#.#...#..#..##..##......... + 5: ....#...##...#.#..#..#...#...#......... + 6: ....##.#.#....#...#..##..##..##........ + 7: ...#..###.#...##..#...#...#...#........ + 8: ...#....##.#.#.#..##..##..##..##....... + 9: ...##..#..#####....#...#...#...#....... +10: ..#.#..#...#.##....##..##..##..##...... +11: ...#...##...#.#...#.#...#...#...#...... +12: ...##.#.#....#.#...#.#..##..##..##..... +13: ..#..###.#....#.#...#....#...#...#..... +14: ..#....##.#....#.#..##...##..##..##.... +15: ..##..#..#.#....#....#..#.#...#...#.... +16: .#.#..#...#.#...##...#...#.#..##..##... +17: ..#...##...#.#.#.#...##...#....#...#... +18: ..##.#.#....#####.#.#.#...##...##..##.. +19: .#..###.#..#.#.#######.#.#.#..#.#...#.. +20: .#....##....#####...#######....#.#..##. diff --git a/src/main/resources/2018-examples/day13-1.txt b/src/main/resources/2018-examples/day13-1.txt new file mode 100644 index 00000000..afd7d5a8 --- /dev/null +++ b/src/main/resources/2018-examples/day13-1.txt @@ -0,0 +1,4 @@ +/----\ +| | +| | +\----/ diff --git a/src/main/resources/2018-examples/day13-2.txt b/src/main/resources/2018-examples/day13-2.txt new file mode 100644 index 00000000..41eda5c2 --- /dev/null +++ b/src/main/resources/2018-examples/day13-2.txt @@ -0,0 +1,7 @@ +/-----\ +| | +| /--+--\ +| | | | +\--+--/ | + | | + \-----/ diff --git a/src/main/resources/2018-examples/day13-3.txt b/src/main/resources/2018-examples/day13-3.txt new file mode 100644 index 00000000..d091b2c5 --- /dev/null +++ b/src/main/resources/2018-examples/day13-3.txt @@ -0,0 +1,7 @@ +| | | | | +v | | | | +| v v | | +| | | v X +| | ^ ^ | +^ ^ | | | +| | | | | diff --git a/src/main/resources/2018-examples/day13-4.txt b/src/main/resources/2018-examples/day13-4.txt new file mode 100644 index 00000000..39023afb --- /dev/null +++ b/src/main/resources/2018-examples/day13-4.txt @@ -0,0 +1,104 @@ +/->-\ +| | /----\ +| /-+--+-\ | +| | | | v | +\-+-/ \-+--/ + \------/ + +/-->\ +| | /----\ +| /-+--+-\ | +| | | | | | +\-+-/ \->--/ + \------/ + +/---v +| | /----\ +| /-+--+-\ | +| | | | | | +\-+-/ \-+>-/ + \------/ + +/---\ +| v /----\ +| /-+--+-\ | +| | | | | | +\-+-/ \-+->/ + \------/ + +/---\ +| | /----\ +| /->--+-\ | +| | | | | | +\-+-/ \-+--^ + \------/ + +/---\ +| | /----\ +| /-+>-+-\ | +| | | | | ^ +\-+-/ \-+--/ + \------/ + +/---\ +| | /----\ +| /-+->+-\ ^ +| | | | | | +\-+-/ \-+--/ + \------/ + +/---\ +| | /----< +| /-+-->-\ | +| | | | | | +\-+-/ \-+--/ + \------/ + +/---\ +| | /---<\ +| /-+--+>\ | +| | | | | | +\-+-/ \-+--/ + \------/ + +/---\ +| | /--<-\ +| /-+--+-v | +| | | | | | +\-+-/ \-+--/ + \------/ + +/---\ +| | /-<--\ +| /-+--+-\ | +| | | | v | +\-+-/ \-+--/ + \------/ + +/---\ +| | /<---\ +| /-+--+-\ | +| | | | | | +\-+-/ \-<--/ + \------/ + +/---\ +| | v----\ +| /-+--+-\ | +| | | | | | +\-+-/ \<+--/ + \------/ + +/---\ +| | /----\ +| /-+--v-\ | +| | | | | | +\-+-/ ^-+--/ + \------/ + +/---\ +| | /----\ +| /-+--+-\ | +| | | X | | +\-+-/ \-+--/ + \------/ diff --git a/src/main/resources/2018-examples/day13-5.txt b/src/main/resources/2018-examples/day13-5.txt new file mode 100644 index 00000000..941e8b9a --- /dev/null +++ b/src/main/resources/2018-examples/day13-5.txt @@ -0,0 +1,8 @@ + 111 + 0123456789012 +0/---\ +1| | /----\ +2| /-+--+-\ | +3| | | X | | +4\-+-/ \-+--/ +5 \------/ diff --git a/src/main/resources/2018-examples/day14-1.txt b/src/main/resources/2018-examples/day14-1.txt new file mode 100644 index 00000000..bbfd4573 --- /dev/null +++ b/src/main/resources/2018-examples/day14-1.txt @@ -0,0 +1,16 @@ +(3)[7] +(3)[7] 1 0 + 3 7 1 [0](1) 0 + 3 7 1 0 [1] 0 (1) +(3) 7 1 0 1 0 [1] 2 + 3 7 1 0 (1) 0 1 2 [4] + 3 7 1 [0] 1 0 (1) 2 4 5 + 3 7 1 0 [1] 0 1 2 (4) 5 1 + 3 (7) 1 0 1 0 [1] 2 4 5 1 5 + 3 7 1 0 1 0 1 2 [4](5) 1 5 8 + 3 (7) 1 0 1 0 1 2 4 5 1 5 8 [9] + 3 7 1 0 1 0 1 [2] 4 (5) 1 5 8 9 1 6 + 3 7 1 0 1 0 1 2 4 5 [1] 5 8 9 1 (6) 7 + 3 7 1 0 (1) 0 1 2 4 5 1 5 [8] 9 1 6 7 7 + 3 7 [1] 0 1 0 (1) 2 4 5 1 5 8 9 1 6 7 7 9 + 3 7 1 0 [1] 0 1 2 (4) 5 1 5 8 9 1 6 7 7 9 2 diff --git a/src/main/resources/2018-examples/day15-1.txt b/src/main/resources/2018-examples/day15-1.txt new file mode 100644 index 00000000..37af4f88 --- /dev/null +++ b/src/main/resources/2018-examples/day15-1.txt @@ -0,0 +1,7 @@ + would take their +These units: turns in this order: + ####### ####### + #.G.E.# #.1.2.# + #E.G.E# #3.4.5# + #.G.E.# #.6.7.# + ####### ####### diff --git a/src/main/resources/2018-examples/day15-10.txt b/src/main/resources/2018-examples/day15-10.txt new file mode 100644 index 00000000..c82ab1c3 --- /dev/null +++ b/src/main/resources/2018-examples/day15-10.txt @@ -0,0 +1,11 @@ +####### ####### +#.E...# #.....# +#.#..G# #.#G..# G(200) +#.###.# --> #.###.# +#E#G#G# #.#.#.# +#...#G# #G.G#G# G(98), G(38), G(200) +####### ####### + +Combat ends after 54 full rounds +Goblins win with 536 total hit points left +Outcome: 54 * 536 = 28944 diff --git a/src/main/resources/2018-examples/day15-11.txt b/src/main/resources/2018-examples/day15-11.txt new file mode 100644 index 00000000..33dae920 --- /dev/null +++ b/src/main/resources/2018-examples/day15-11.txt @@ -0,0 +1,13 @@ +######### ######### +#G......# #.G.....# G(137) +#.E.#...# #G.G#...# G(200), G(200) +#..##..G# #.G##...# G(200) +#...##..# --> #...##..# +#...#...# #.G.#...# G(200) +#.G...G.# #.......# +#.....G.# #.......# +######### ######### + +Combat ends after 20 full rounds +Goblins win with 937 total hit points left +Outcome: 20 * 937 = 18740 diff --git a/src/main/resources/2018-examples/day15-2.txt b/src/main/resources/2018-examples/day15-2.txt new file mode 100644 index 00000000..d07d31ec --- /dev/null +++ b/src/main/resources/2018-examples/day15-2.txt @@ -0,0 +1,6 @@ +Targets: In range: Reachable: Nearest: Chosen: +####### ####### ####### ####### ####### +#E..G.# #E.?G?# #E.@G.# #E.!G.# #E.+G.# +#...#.# --> #.?.#?# --> #.@.#.# --> #.!.#.# --> #...#.# +#.G.#G# #?G?#G# #@G@#G# #!G.#G# #.G.#G# +####### ####### ####### ####### ####### diff --git a/src/main/resources/2018-examples/day15-3.txt b/src/main/resources/2018-examples/day15-3.txt new file mode 100644 index 00000000..55cce342 --- /dev/null +++ b/src/main/resources/2018-examples/day15-3.txt @@ -0,0 +1,6 @@ +In range: Nearest: Chosen: Distance: Step: +####### ####### ####### ####### ####### +#.E...# #.E...# #.E...# #4E212# #..E..# +#...?.# --> #...!.# --> #...+.# --> #32101# --> #.....# +#..?G?# #..!G.# #...G.# #432G2# #...G.# +####### ####### ####### ####### ####### diff --git a/src/main/resources/2018-examples/day15-4.txt b/src/main/resources/2018-examples/day15-4.txt new file mode 100644 index 00000000..d9bd4075 --- /dev/null +++ b/src/main/resources/2018-examples/day15-4.txt @@ -0,0 +1,43 @@ +Initially: +######### +#G..G..G# +#.......# +#.......# +#G..E..G# +#.......# +#.......# +#G..G..G# +######### + +After 1 round: +######### +#.G...G.# +#...G...# +#...E..G# +#.G.....# +#.......# +#G..G..G# +#.......# +######### + +After 2 rounds: +######### +#..G.G..# +#...G...# +#.G.E.G.# +#.......# +#G..G..G# +#.......# +#.......# +######### + +After 3 rounds: +######### +#.......# +#..GGG..# +#..GEG..# +#G..G...# +#......G# +#.......# +#.......# +######### diff --git a/src/main/resources/2018-examples/day15-5.txt b/src/main/resources/2018-examples/day15-5.txt new file mode 100644 index 00000000..5451bbcd --- /dev/null +++ b/src/main/resources/2018-examples/day15-5.txt @@ -0,0 +1,6 @@ + HP: HP: +G.... 9 G.... 9 +..G.. 4 ..G.. 4 +..EG. 2 --> ..E.. +..G.. 2 ..G.. 2 +...G. 1 ...G. 1 diff --git a/src/main/resources/2018-examples/day15-6.txt b/src/main/resources/2018-examples/day15-6.txt new file mode 100644 index 00000000..7e8fd6b9 --- /dev/null +++ b/src/main/resources/2018-examples/day15-6.txt @@ -0,0 +1,93 @@ +Initially: +####### +#.G...# G(200) +#...EG# E(200), G(200) +#.#.#G# G(200) +#..G#E# G(200), E(200) +#.....# +####### + +After 1 round: +####### +#..G..# G(200) +#...EG# E(197), G(197) +#.#G#G# G(200), G(197) +#...#E# E(197) +#.....# +####### + +After 2 rounds: +####### +#...G.# G(200) +#..GEG# G(200), E(188), G(194) +#.#.#G# G(194) +#...#E# E(194) +#.....# +####### + +Combat ensues; eventually, the top Elf dies: + +After 23 rounds: +####### +#...G.# G(200) +#..G.G# G(200), G(131) +#.#.#G# G(131) +#...#E# E(131) +#.....# +####### + +After 24 rounds: +####### +#..G..# G(200) +#...G.# G(131) +#.#G#G# G(200), G(128) +#...#E# E(128) +#.....# +####### + +After 25 rounds: +####### +#.G...# G(200) +#..G..# G(131) +#.#.#G# G(125) +#..G#E# G(200), E(125) +#.....# +####### + +After 26 rounds: +####### +#G....# G(200) +#.G...# G(131) +#.#.#G# G(122) +#...#E# E(122) +#..G..# G(200) +####### + +After 27 rounds: +####### +#G....# G(200) +#.G...# G(131) +#.#.#G# G(119) +#...#E# E(119) +#...G.# G(200) +####### + +After 28 rounds: +####### +#G....# G(200) +#.G...# G(131) +#.#.#G# G(116) +#...#E# E(113) +#....G# G(200) +####### + +More combat ensues; eventually, the bottom Elf dies: + +After 47 rounds: +####### +#G....# G(200) +#.G...# G(131) +#.#.#G# G(59) +#...#.# +#....G# G(200) +####### diff --git a/src/main/resources/2018-examples/day15-7.txt b/src/main/resources/2018-examples/day15-7.txt new file mode 100644 index 00000000..015c250c --- /dev/null +++ b/src/main/resources/2018-examples/day15-7.txt @@ -0,0 +1,11 @@ +####### ####### +#G..#E# #...#E# E(200) +#E#E.E# #E#...# E(197) +#G.##.# --> #.E##.# E(185) +#...#E# #E..#E# E(200), E(200) +#...E.# #.....# +####### ####### + +Combat ends after 37 full rounds +Elves win with 982 total hit points left +Outcome: 37 * 982 = 36334 diff --git a/src/main/resources/2018-examples/day15-8.txt b/src/main/resources/2018-examples/day15-8.txt new file mode 100644 index 00000000..4c559af2 --- /dev/null +++ b/src/main/resources/2018-examples/day15-8.txt @@ -0,0 +1,11 @@ +####### ####### +#E..EG# #.E.E.# E(164), E(197) +#.#G.E# #.#E..# E(200) +#E.##E# --> #E.##.# E(98) +#G..#.# #.E.#.# E(200) +#..E#.# #...#.# +####### ####### + +Combat ends after 46 full rounds +Elves win with 859 total hit points left +Outcome: 46 * 859 = 39514 diff --git a/src/main/resources/2018-examples/day15-9.txt b/src/main/resources/2018-examples/day15-9.txt new file mode 100644 index 00000000..85b3df0d --- /dev/null +++ b/src/main/resources/2018-examples/day15-9.txt @@ -0,0 +1,11 @@ +####### ####### +#E.G#.# #G.G#.# G(200), G(98) +#.#G..# #.#G..# G(200) +#G.#.G# --> #..#..# +#G..#.# #...#G# G(95) +#...E.# #...G.# G(200) +####### ####### + +Combat ends after 35 full rounds +Goblins win with 793 total hit points left +Outcome: 35 * 793 = 27755 diff --git a/src/main/resources/2018-examples/day16-1.txt b/src/main/resources/2018-examples/day16-1.txt new file mode 100644 index 00000000..faa80a1a --- /dev/null +++ b/src/main/resources/2018-examples/day16-1.txt @@ -0,0 +1,3 @@ +Before: [3, 2, 1, 1] +9 2 1 2 +After: [3, 2, 2, 1] diff --git a/src/main/resources/2018-examples/day17-1.txt b/src/main/resources/2018-examples/day17-1.txt new file mode 100644 index 00000000..293b5af7 --- /dev/null +++ b/src/main/resources/2018-examples/day17-1.txt @@ -0,0 +1,8 @@ +x=495, y=2..7 +y=7, x=495..501 +x=501, y=3..7 +x=498, y=2..4 +x=506, y=1..2 +x=498, y=10..13 +x=504, y=10..13 +y=13, x=498..504 diff --git a/src/main/resources/2018-examples/day17-2.txt b/src/main/resources/2018-examples/day17-2.txt new file mode 100644 index 00000000..5aecab2e --- /dev/null +++ b/src/main/resources/2018-examples/day17-2.txt @@ -0,0 +1,17 @@ + 44444455555555 + 99999900000000 + 45678901234567 + 0 ......+....... + 1 ............#. + 2 .#..#.......#. + 3 .#..#..#...... + 4 .#..#..#...... + 5 .#.....#...... + 6 .#.....#...... + 7 .#######...... + 8 .............. + 9 .............. +10 ....#.....#... +11 ....#.....#... +12 ....#.....#... +13 ....#######... diff --git a/src/main/resources/2018-examples/day17-3.txt b/src/main/resources/2018-examples/day17-3.txt new file mode 100644 index 00000000..156effae --- /dev/null +++ b/src/main/resources/2018-examples/day17-3.txt @@ -0,0 +1,14 @@ +......+....... +......|.....#. +.#..#.|.....#. +.#..#.|#...... +.#..#.|#...... +.#....|#...... +.#~~~~~#...... +.#######...... +.............. +.............. +....#.....#... +....#.....#... +....#.....#... +....#######... diff --git a/src/main/resources/2018-examples/day17-4.txt b/src/main/resources/2018-examples/day17-4.txt new file mode 100644 index 00000000..cc78b8f3 --- /dev/null +++ b/src/main/resources/2018-examples/day17-4.txt @@ -0,0 +1,14 @@ +......+....... +......|.....#. +.#..#.|.....#. +.#..#.|#...... +.#..#.|#...... +.#~~~~~#...... +.#~~~~~#...... +.#######...... +.............. +.............. +....#.....#... +....#.....#... +....#.....#... +....#######... diff --git a/src/main/resources/2018-examples/day17-5.txt b/src/main/resources/2018-examples/day17-5.txt new file mode 100644 index 00000000..79d1c065 --- /dev/null +++ b/src/main/resources/2018-examples/day17-5.txt @@ -0,0 +1,14 @@ +......+....... +......|.....#. +.#..#.|.....#. +.#..#~~#...... +.#..#~~#...... +.#~~~~~#...... +.#~~~~~#...... +.#######...... +.............. +.............. +....#.....#... +....#.....#... +....#.....#... +....#######... diff --git a/src/main/resources/2018-examples/day17-6.txt b/src/main/resources/2018-examples/day17-6.txt new file mode 100644 index 00000000..f9e4768a --- /dev/null +++ b/src/main/resources/2018-examples/day17-6.txt @@ -0,0 +1,14 @@ +......+....... +......|.....#. +.#..#||||...#. +.#..#~~#|..... +.#..#~~#|..... +.#~~~~~#|..... +.#~~~~~#|..... +.#######|..... +........|..... +........|..... +....#...|.#... +....#...|.#... +....#~~~~~#... +....#######... diff --git a/src/main/resources/2018-examples/day17-7.txt b/src/main/resources/2018-examples/day17-7.txt new file mode 100644 index 00000000..e78942ae --- /dev/null +++ b/src/main/resources/2018-examples/day17-7.txt @@ -0,0 +1,14 @@ +......+....... +......|.....#. +.#..#||||...#. +.#..#~~#|..... +.#..#~~#|..... +.#~~~~~#|..... +.#~~~~~#|..... +.#######|..... +........|..... +........|..... +....#~~~~~#... +....#~~~~~#... +....#~~~~~#... +....#######... diff --git a/src/main/resources/2018-examples/day17-8.txt b/src/main/resources/2018-examples/day17-8.txt new file mode 100644 index 00000000..2d9ce503 --- /dev/null +++ b/src/main/resources/2018-examples/day17-8.txt @@ -0,0 +1,17 @@ +......+....... (line not counted: above minimum y value) +......|.....#. +.#..#||||...#. +.#..#~~#|..... +.#..#~~#|..... +.#~~~~~#|..... +.#~~~~~#|..... +.#######|..... +........|..... +...|||||||||.. +...|#~~~~~#|.. +...|#~~~~~#|.. +...|#~~~~~#|.. +...|#######|.. +...|.......|.. (line not counted: below maximum y value) +...|.......|.. (line not counted: below maximum y value) +...|.......|.. (line not counted: below maximum y value) diff --git a/src/main/resources/2018-examples/day18-1.txt b/src/main/resources/2018-examples/day18-1.txt new file mode 100644 index 00000000..2a76bb29 --- /dev/null +++ b/src/main/resources/2018-examples/day18-1.txt @@ -0,0 +1,131 @@ +Initial state: +.#.#...|#. +.....#|##| +.|..|...#. +..|#.....# +#.#|||#|#| +...#.||... +.|....|... +||...#|.#| +|.||||..|. +...#.|..|. + +After 1 minute: +.......##. +......|### +.|..|...#. +..|#||...# +..##||.|#| +...#||||.. +||...|||.. +|||||.||.| +|||||||||| +....||..|. + +After 2 minutes: +.......#.. +......|#.. +.|.|||.... +..##|||..# +..###|||#| +...#|||||. +|||||||||. +|||||||||| +|||||||||| +.||||||||| + +After 3 minutes: +.......#.. +....|||#.. +.|.||||... +..###|||.# +...##|||#| +.||##||||| +|||||||||| +|||||||||| +|||||||||| +|||||||||| + +After 4 minutes: +.....|.#.. +...||||#.. +.|.#||||.. +..###||||# +...###||#| +|||##||||| +|||||||||| +|||||||||| +|||||||||| +|||||||||| + +After 5 minutes: +....|||#.. +...||||#.. +.|.##||||. +..####|||# +.|.###||#| +|||###|||| +|||||||||| +|||||||||| +|||||||||| +|||||||||| + +After 6 minutes: +...||||#.. +...||||#.. +.|.###|||. +..#.##|||# +|||#.##|#| +|||###|||| +||||#||||| +|||||||||| +|||||||||| +|||||||||| + +After 7 minutes: +...||||#.. +..||#|##.. +.|.####||. +||#..##||# +||##.##|#| +|||####||| +|||###|||| +|||||||||| +|||||||||| +|||||||||| + +After 8 minutes: +..||||##.. +..|#####.. +|||#####|. +||#...##|# +||##..###| +||##.###|| +|||####||| +||||#||||| +|||||||||| +|||||||||| + +After 9 minutes: +..||###... +.||#####.. +||##...##. +||#....### +|##....##| +||##..###| +||######|| +|||###|||| +|||||||||| +|||||||||| + +After 10 minutes: +.||##..... +||###..... +||##...... +|##.....## +|##.....## +|##....##| +||##.####| +||#####||| +||||#||||| +|||||||||| diff --git a/src/main/resources/2018-examples/day19-1.txt b/src/main/resources/2018-examples/day19-1.txt new file mode 100644 index 00000000..d7d2a217 --- /dev/null +++ b/src/main/resources/2018-examples/day19-1.txt @@ -0,0 +1,8 @@ +#ip 0 +seti 5 0 1 +seti 6 0 2 +addi 0 1 0 +addr 1 2 3 +setr 1 0 0 +seti 8 0 4 +seti 9 0 5 diff --git a/src/main/resources/2018-examples/day19-2.txt b/src/main/resources/2018-examples/day19-2.txt new file mode 100644 index 00000000..f805100d --- /dev/null +++ b/src/main/resources/2018-examples/day19-2.txt @@ -0,0 +1,5 @@ +ip=0 [0, 0, 0, 0, 0, 0] seti 5 0 1 [0, 5, 0, 0, 0, 0] +ip=1 [1, 5, 0, 0, 0, 0] seti 6 0 2 [1, 5, 6, 0, 0, 0] +ip=2 [2, 5, 6, 0, 0, 0] addi 0 1 0 [3, 5, 6, 0, 0, 0] +ip=4 [4, 5, 6, 0, 0, 0] setr 1 0 0 [5, 5, 6, 0, 0, 0] +ip=6 [6, 5, 6, 0, 0, 0] seti 9 0 5 [6, 5, 6, 0, 0, 9] diff --git a/src/main/resources/2018-examples/day20-1.txt b/src/main/resources/2018-examples/day20-1.txt new file mode 100644 index 00000000..ad293db6 --- /dev/null +++ b/src/main/resources/2018-examples/day20-1.txt @@ -0,0 +1,5 @@ +##### +#.|.# +#-### +#.|X# +##### diff --git a/src/main/resources/2018-examples/day20-2.txt b/src/main/resources/2018-examples/day20-2.txt new file mode 100644 index 00000000..8e301115 --- /dev/null +++ b/src/main/resources/2018-examples/day20-2.txt @@ -0,0 +1,5 @@ +#?#?#?#?# +?.|.|.|.? +#?#?#?#-# + ?X|.? + #?#?# diff --git a/src/main/resources/2018-examples/day20-3.txt b/src/main/resources/2018-examples/day20-3.txt new file mode 100644 index 00000000..f17f44c6 --- /dev/null +++ b/src/main/resources/2018-examples/day20-3.txt @@ -0,0 +1,7 @@ +#?#?#?#?# +?.|.|.|.? +#-#?#?#?# +?.|.|.|.? +#?#?#?#-# + ?X|.? + #?#?# diff --git a/src/main/resources/2018-examples/day20-4.txt b/src/main/resources/2018-examples/day20-4.txt new file mode 100644 index 00000000..2397fefe --- /dev/null +++ b/src/main/resources/2018-examples/day20-4.txt @@ -0,0 +1,9 @@ +#?#?#?#?# +?.|.|.|.? +#-#?#?#?# +?.|.|.|.? +#-#?#?#-# +?.?.?X|.? +#-#-#?#?# +?.|.|.|.? +#?#?#?#?# diff --git a/src/main/resources/2018-examples/day20-5.txt b/src/main/resources/2018-examples/day20-5.txt new file mode 100644 index 00000000..650c547f --- /dev/null +++ b/src/main/resources/2018-examples/day20-5.txt @@ -0,0 +1,9 @@ +######### +#.|.|.|.# +#-####### +#.|.|.|.# +#-#####-# +#.#.#X|.# +#-#-##### +#.|.|.|.# +######### diff --git a/src/main/resources/2018-examples/day20-6.txt b/src/main/resources/2018-examples/day20-6.txt new file mode 100644 index 00000000..1e0edf67 --- /dev/null +++ b/src/main/resources/2018-examples/day20-6.txt @@ -0,0 +1,13 @@ +^ENNWSWW(NEWS|)SSSEEN(WNSE|)EE(SWEN|)NNN$ + +########### +#.|.#.|.#.# +#-###-#-#-# +#.|.|.#.#.# +#-#####-#-# +#.#.#X|.#.# +#-#-#####-# +#.#.|.|.|.# +#-###-###-# +#.|.|.#.|.# +########### diff --git a/src/main/resources/2018-examples/day20-7.txt b/src/main/resources/2018-examples/day20-7.txt new file mode 100644 index 00000000..338a9913 --- /dev/null +++ b/src/main/resources/2018-examples/day20-7.txt @@ -0,0 +1,16 @@ +Regex: ^ESSWWN(E|NNENN(EESS(WNSE|)SSS|WWWSSSSE(SW|NNNE)))$ +Furthest room requires passing 23 doors + +############# +#.|.|.|.|.|.# +#-#####-###-# +#.#.|.#.#.#.# +#-#-###-#-#-# +#.#.#.|.#.|.# +#-#-#-#####-# +#.#.#.#X|.#.# +#-#-#-###-#-# +#.|.#.|.#.#.# +###-#-###-#-# +#.|.#.|.|.#.# +############# diff --git a/src/main/resources/2018-examples/day20-8.txt b/src/main/resources/2018-examples/day20-8.txt new file mode 100644 index 00000000..f106a7f7 --- /dev/null +++ b/src/main/resources/2018-examples/day20-8.txt @@ -0,0 +1,18 @@ +Regex: ^WSSEESWWWNW(S|NENNEEEENN(ESSSSW(NWSW|SSEN)|WSWWN(E|WWS(E|SS))))$ +Furthest room requires passing 31 doors + +############### +#.|.|.|.#.|.|.# +#-###-###-#-#-# +#.|.#.|.|.#.#.# +#-#########-#-# +#.#.|.|.|.|.#.# +#-#-#########-# +#.#.#.|X#.|.#.# +###-#-###-#-#-# +#.|.#.#.|.#.|.# +#-###-#####-### +#.|.#.|.|.#.#.# +#-#-#####-#-#-# +#.#.|.|.|.#.|.# +############### diff --git a/src/main/resources/2018-examples/day22-1.txt b/src/main/resources/2018-examples/day22-1.txt new file mode 100644 index 00000000..3189a62a --- /dev/null +++ b/src/main/resources/2018-examples/day22-1.txt @@ -0,0 +1,16 @@ +M=.|=.|.|=.|=|=. +.|=|=|||..|.=... +.==|....||=..|== +=.|....|.==.|==. +=|..==...=.|==.. +=||.=.=||=|=..|= +|.=.===|||..=..| +|..==||=.|==|=== +.=..===..=|.|||. +.======|||=|=.|= +.===|=|===T===|| +=|||...|==..|=.| +=.=|=.=..=.||==| +||=|=...|==.=|== +|=.=||===.|||=== +||.|==.|.|.||=|| diff --git a/src/main/resources/2018-examples/day23-1.txt b/src/main/resources/2018-examples/day23-1.txt new file mode 100644 index 00000000..e023a878 --- /dev/null +++ b/src/main/resources/2018-examples/day23-1.txt @@ -0,0 +1,9 @@ +pos=<0,0,0>, r=4 +pos=<1,0,0>, r=1 +pos=<4,0,0>, r=3 +pos=<0,2,0>, r=1 +pos=<0,5,0>, r=3 +pos=<0,0,3>, r=1 +pos=<1,1,1>, r=1 +pos=<1,1,2>, r=1 +pos=<1,3,1>, r=1 diff --git a/src/main/resources/2018-examples/day24-1.txt b/src/main/resources/2018-examples/day24-1.txt new file mode 100644 index 00000000..933889e2 --- /dev/null +++ b/src/main/resources/2018-examples/day24-1.txt @@ -0,0 +1,2 @@ +18 units each with 729 hit points (weak to fire; immune to cold, slashing) + with an attack that does 8 radiation damage at initiative 10 diff --git a/src/main/resources/2018-examples/day24-10.txt b/src/main/resources/2018-examples/day24-10.txt new file mode 100644 index 00000000..69a814ea --- /dev/null +++ b/src/main/resources/2018-examples/day24-10.txt @@ -0,0 +1,12 @@ +Immune System: +Group 2 contains 49 units +Infection: +Group 1 contains 782 units +Group 2 contains 4434 units + +Infection group 1 would deal defending group 2 181424 damage +Immune System group 2 would deal defending group 1 1225 damage +Immune System group 2 would deal defending group 2 1225 damage + +Immune System group 2 attacks defending group 1, killing 0 units +Infection group 1 attacks defending group 2, killing 49 units diff --git a/src/main/resources/2018-examples/day24-11.txt b/src/main/resources/2018-examples/day24-11.txt new file mode 100644 index 00000000..5d8ea91e --- /dev/null +++ b/src/main/resources/2018-examples/day24-11.txt @@ -0,0 +1,5 @@ +Immune System: +No groups remain. +Infection: +Group 1 contains 782 units +Group 2 contains 4434 units diff --git a/src/main/resources/2018-examples/day24-2.txt b/src/main/resources/2018-examples/day24-2.txt new file mode 100644 index 00000000..9ef45150 --- /dev/null +++ b/src/main/resources/2018-examples/day24-2.txt @@ -0,0 +1,11 @@ +Immune System: +17 units each with 5390 hit points (weak to radiation, bludgeoning) with + an attack that does 4507 fire damage at initiative 2 +989 units each with 1274 hit points (immune to fire; weak to bludgeoning, + slashing) with an attack that does 25 slashing damage at initiative 3 + +Infection: +801 units each with 4706 hit points (weak to radiation) with an attack + that does 116 bludgeoning damage at initiative 1 +4485 units each with 2961 hit points (immune to radiation; weak to fire, + cold) with an attack that does 12 slashing damage at initiative 4 diff --git a/src/main/resources/2018-examples/day24-3.txt b/src/main/resources/2018-examples/day24-3.txt new file mode 100644 index 00000000..3e915a07 --- /dev/null +++ b/src/main/resources/2018-examples/day24-3.txt @@ -0,0 +1,18 @@ +Immune System: +Group 1 contains 17 units +Group 2 contains 989 units +Infection: +Group 1 contains 801 units +Group 2 contains 4485 units + +Infection group 1 would deal defending group 1 185832 damage +Infection group 1 would deal defending group 2 185832 damage +Infection group 2 would deal defending group 2 107640 damage +Immune System group 1 would deal defending group 1 76619 damage +Immune System group 1 would deal defending group 2 153238 damage +Immune System group 2 would deal defending group 1 24725 damage + +Infection group 2 attacks defending group 2, killing 84 units +Immune System group 2 attacks defending group 1, killing 4 units +Immune System group 1 attacks defending group 2, killing 51 units +Infection group 1 attacks defending group 1, killing 17 units diff --git a/src/main/resources/2018-examples/day24-4.txt b/src/main/resources/2018-examples/day24-4.txt new file mode 100644 index 00000000..e9554155 --- /dev/null +++ b/src/main/resources/2018-examples/day24-4.txt @@ -0,0 +1,12 @@ +Immune System: +Group 2 contains 905 units +Infection: +Group 1 contains 797 units +Group 2 contains 4434 units + +Infection group 1 would deal defending group 2 184904 damage +Immune System group 2 would deal defending group 1 22625 damage +Immune System group 2 would deal defending group 2 22625 damage + +Immune System group 2 attacks defending group 1, killing 4 units +Infection group 1 attacks defending group 2, killing 144 units diff --git a/src/main/resources/2018-examples/day24-5.txt b/src/main/resources/2018-examples/day24-5.txt new file mode 100644 index 00000000..c829d8ad --- /dev/null +++ b/src/main/resources/2018-examples/day24-5.txt @@ -0,0 +1,12 @@ +Immune System: +Group 2 contains 761 units +Infection: +Group 1 contains 793 units +Group 2 contains 4434 units + +Infection group 1 would deal defending group 2 183976 damage +Immune System group 2 would deal defending group 1 19025 damage +Immune System group 2 would deal defending group 2 19025 damage + +Immune System group 2 attacks defending group 1, killing 4 units +Infection group 1 attacks defending group 2, killing 143 units diff --git a/src/main/resources/2018-examples/day24-6.txt b/src/main/resources/2018-examples/day24-6.txt new file mode 100644 index 00000000..854d12fc --- /dev/null +++ b/src/main/resources/2018-examples/day24-6.txt @@ -0,0 +1,12 @@ +Immune System: +Group 2 contains 618 units +Infection: +Group 1 contains 789 units +Group 2 contains 4434 units + +Infection group 1 would deal defending group 2 183048 damage +Immune System group 2 would deal defending group 1 15450 damage +Immune System group 2 would deal defending group 2 15450 damage + +Immune System group 2 attacks defending group 1, killing 3 units +Infection group 1 attacks defending group 2, killing 143 units diff --git a/src/main/resources/2018-examples/day24-7.txt b/src/main/resources/2018-examples/day24-7.txt new file mode 100644 index 00000000..58111169 --- /dev/null +++ b/src/main/resources/2018-examples/day24-7.txt @@ -0,0 +1,12 @@ +Immune System: +Group 2 contains 475 units +Infection: +Group 1 contains 786 units +Group 2 contains 4434 units + +Infection group 1 would deal defending group 2 182352 damage +Immune System group 2 would deal defending group 1 11875 damage +Immune System group 2 would deal defending group 2 11875 damage + +Immune System group 2 attacks defending group 1, killing 2 units +Infection group 1 attacks defending group 2, killing 142 units diff --git a/src/main/resources/2018-examples/day24-8.txt b/src/main/resources/2018-examples/day24-8.txt new file mode 100644 index 00000000..b0b3ca26 --- /dev/null +++ b/src/main/resources/2018-examples/day24-8.txt @@ -0,0 +1,12 @@ +Immune System: +Group 2 contains 333 units +Infection: +Group 1 contains 784 units +Group 2 contains 4434 units + +Infection group 1 would deal defending group 2 181888 damage +Immune System group 2 would deal defending group 1 8325 damage +Immune System group 2 would deal defending group 2 8325 damage + +Immune System group 2 attacks defending group 1, killing 1 unit +Infection group 1 attacks defending group 2, killing 142 units diff --git a/src/main/resources/2018-examples/day24-9.txt b/src/main/resources/2018-examples/day24-9.txt new file mode 100644 index 00000000..55161535 --- /dev/null +++ b/src/main/resources/2018-examples/day24-9.txt @@ -0,0 +1,12 @@ +Immune System: +Group 2 contains 191 units +Infection: +Group 1 contains 783 units +Group 2 contains 4434 units + +Infection group 1 would deal defending group 2 181656 damage +Immune System group 2 would deal defending group 1 4775 damage +Immune System group 2 would deal defending group 2 4775 damage + +Immune System group 2 attacks defending group 1, killing 1 unit +Infection group 1 attacks defending group 2, killing 142 units diff --git a/src/main/resources/2018-examples/day25-1.txt b/src/main/resources/2018-examples/day25-1.txt new file mode 100644 index 00000000..ebb54aa0 --- /dev/null +++ b/src/main/resources/2018-examples/day25-1.txt @@ -0,0 +1,8 @@ + 0,0,0,0 + 3,0,0,0 + 0,3,0,0 + 0,0,3,0 + 0,0,0,3 + 0,0,0,6 + 9,0,0,0 +12,0,0,0 diff --git a/src/main/resources/2018-examples/day25-2.txt b/src/main/resources/2018-examples/day25-2.txt new file mode 100644 index 00000000..3a97e16c --- /dev/null +++ b/src/main/resources/2018-examples/day25-2.txt @@ -0,0 +1,10 @@ +-1,2,2,0 +0,0,2,-2 +0,0,0,-2 +-1,2,0,0 +-2,-2,-2,2 +3,0,2,-1 +-1,3,2,2 +-1,0,-1,0 +0,2,1,-2 +3,0,0,0 diff --git a/src/main/resources/2018-examples/day25-3.txt b/src/main/resources/2018-examples/day25-3.txt new file mode 100644 index 00000000..bf5c2b97 --- /dev/null +++ b/src/main/resources/2018-examples/day25-3.txt @@ -0,0 +1,10 @@ +1,-1,0,1 +2,0,-1,0 +3,2,-1,0 +0,0,3,1 +0,0,-1,-1 +2,3,-2,0 +-2,2,0,0 +2,-2,0,-1 +1,-1,0,-1 +3,2,0,2 diff --git a/src/main/resources/2018-examples/day25-4.txt b/src/main/resources/2018-examples/day25-4.txt new file mode 100644 index 00000000..1147af7a --- /dev/null +++ b/src/main/resources/2018-examples/day25-4.txt @@ -0,0 +1,10 @@ +1,-1,-1,-2 +-2,-2,0,1 +0,2,1,3 +-2,3,-2,1 +0,2,3,-2 +-1,-1,1,-2 +0,-2,-1,0 +-2,2,3,-1 +1,2,2,0 +-1,-2,0,-2 diff --git a/src/main/resources/2018-examples/day3-1.txt b/src/main/resources/2018-examples/day3-1.txt new file mode 100644 index 00000000..6b10a0ae --- /dev/null +++ b/src/main/resources/2018-examples/day3-1.txt @@ -0,0 +1,9 @@ +........... +........... +...#####... +...#####... +...#####... +...#####... +........... +........... +........... diff --git a/src/main/resources/2018-examples/day3-2.txt b/src/main/resources/2018-examples/day3-2.txt new file mode 100644 index 00000000..3755d524 --- /dev/null +++ b/src/main/resources/2018-examples/day3-2.txt @@ -0,0 +1,3 @@ +#1 @ 1,3: 4x4 +#2 @ 3,1: 4x4 +#3 @ 5,5: 2x2 diff --git a/src/main/resources/2018-examples/day3-3.txt b/src/main/resources/2018-examples/day3-3.txt new file mode 100644 index 00000000..23de7cc7 --- /dev/null +++ b/src/main/resources/2018-examples/day3-3.txt @@ -0,0 +1,8 @@ +........ +...2222. +...2222. +.11XX22. +.11XX22. +.111133. +.111133. +........ diff --git a/src/main/resources/2018-examples/day4-1.txt b/src/main/resources/2018-examples/day4-1.txt new file mode 100644 index 00000000..496d3149 --- /dev/null +++ b/src/main/resources/2018-examples/day4-1.txt @@ -0,0 +1,17 @@ +[1518-11-01 00:00] Guard #10 begins shift +[1518-11-01 00:05] falls asleep +[1518-11-01 00:25] wakes up +[1518-11-01 00:30] falls asleep +[1518-11-01 00:55] wakes up +[1518-11-01 23:58] Guard #99 begins shift +[1518-11-02 00:40] falls asleep +[1518-11-02 00:50] wakes up +[1518-11-03 00:05] Guard #10 begins shift +[1518-11-03 00:24] falls asleep +[1518-11-03 00:29] wakes up +[1518-11-04 00:02] Guard #99 begins shift +[1518-11-04 00:36] falls asleep +[1518-11-04 00:46] wakes up +[1518-11-05 00:03] Guard #99 begins shift +[1518-11-05 00:45] falls asleep +[1518-11-05 00:55] wakes up diff --git a/src/main/resources/2018-examples/day4-2.txt b/src/main/resources/2018-examples/day4-2.txt new file mode 100644 index 00000000..5cb6aae8 --- /dev/null +++ b/src/main/resources/2018-examples/day4-2.txt @@ -0,0 +1,8 @@ +Date ID Minute + 000000000011111111112222222222333333333344444444445555555555 + 012345678901234567890123456789012345678901234567890123456789 +11-01 #10 .....####################.....#########################..... +11-02 #99 ........................................##########.......... +11-03 #10 ........................#####............................... +11-04 #99 ....................................##########.............. +11-05 #99 .............................................##########..... diff --git a/src/main/resources/2018-examples/day5-1.txt b/src/main/resources/2018-examples/day5-1.txt new file mode 100644 index 00000000..ce9d5919 --- /dev/null +++ b/src/main/resources/2018-examples/day5-1.txt @@ -0,0 +1,4 @@ +dabAcCaCBAcCcaDA The first 'cC' is removed. +dabAaCBAcCcaDA This creates 'Aa', which is removed. +dabCBAcCcaDA Either 'cC' or 'Cc' are removed (the result is the same). +dabCBAcaDA No further actions can be taken. diff --git a/src/main/resources/2018-examples/day6-1.txt b/src/main/resources/2018-examples/day6-1.txt new file mode 100644 index 00000000..95d160ac --- /dev/null +++ b/src/main/resources/2018-examples/day6-1.txt @@ -0,0 +1,6 @@ +1, 1 +1, 6 +8, 3 +3, 4 +5, 5 +8, 9 diff --git a/src/main/resources/2018-examples/day6-2.txt b/src/main/resources/2018-examples/day6-2.txt new file mode 100644 index 00000000..a8300a19 --- /dev/null +++ b/src/main/resources/2018-examples/day6-2.txt @@ -0,0 +1,10 @@ +.......... +.A........ +.......... +........C. +...D...... +.....E.... +.B........ +.......... +.......... +........F. diff --git a/src/main/resources/2018-examples/day6-3.txt b/src/main/resources/2018-examples/day6-3.txt new file mode 100644 index 00000000..c0e678c5 --- /dev/null +++ b/src/main/resources/2018-examples/day6-3.txt @@ -0,0 +1,10 @@ +aaaaa.cccc +aAaaa.cccc +aaaddecccc +aadddeccCc +..dDdeeccc +bb.deEeecc +bBb.eeee.. +bbb.eeefff +bbb.eeffff +bbb.ffffFf diff --git a/src/main/resources/2018-examples/day7-1.txt b/src/main/resources/2018-examples/day7-1.txt new file mode 100644 index 00000000..9ab25bf5 --- /dev/null +++ b/src/main/resources/2018-examples/day7-1.txt @@ -0,0 +1,7 @@ +Step C must be finished before step A can begin. +Step C must be finished before step F can begin. +Step A must be finished before step B can begin. +Step A must be finished before step D can begin. +Step B must be finished before step E can begin. +Step D must be finished before step E can begin. +Step F must be finished before step E can begin. diff --git a/src/main/resources/2018-examples/day7-2.txt b/src/main/resources/2018-examples/day7-2.txt new file mode 100644 index 00000000..82c29617 --- /dev/null +++ b/src/main/resources/2018-examples/day7-2.txt @@ -0,0 +1,5 @@ + -->A--->B-- + / \ \ +C -->D----->E + \ / + ---->F----- diff --git a/src/main/resources/2018-examples/day8-1.txt b/src/main/resources/2018-examples/day8-1.txt new file mode 100644 index 00000000..93c6d38f --- /dev/null +++ b/src/main/resources/2018-examples/day8-1.txt @@ -0,0 +1,4 @@ +2 3 0 3 10 11 12 1 1 0 1 99 2 1 1 2 +A---------------------------------- + B----------- C----------- + D----- diff --git a/src/main/resources/2018-examples/day9-1.txt b/src/main/resources/2018-examples/day9-1.txt new file mode 100644 index 00000000..f9c9240f --- /dev/null +++ b/src/main/resources/2018-examples/day9-1.txt @@ -0,0 +1,26 @@ +[-] (0) +[1] 0 (1) +[2] 0 (2) 1 +[3] 0 2 1 (3) +[4] 0 (4) 2 1 3 +[5] 0 4 2 (5) 1 3 +[6] 0 4 2 5 1 (6) 3 +[7] 0 4 2 5 1 6 3 (7) +[8] 0 (8) 4 2 5 1 6 3 7 +[9] 0 8 4 (9) 2 5 1 6 3 7 +[1] 0 8 4 9 2(10) 5 1 6 3 7 +[2] 0 8 4 9 2 10 5(11) 1 6 3 7 +[3] 0 8 4 9 2 10 5 11 1(12) 6 3 7 +[4] 0 8 4 9 2 10 5 11 1 12 6(13) 3 7 +[5] 0 8 4 9 2 10 5 11 1 12 6 13 3(14) 7 +[6] 0 8 4 9 2 10 5 11 1 12 6 13 3 14 7(15) +[7] 0(16) 8 4 9 2 10 5 11 1 12 6 13 3 14 7 15 +[8] 0 16 8(17) 4 9 2 10 5 11 1 12 6 13 3 14 7 15 +[9] 0 16 8 17 4(18) 9 2 10 5 11 1 12 6 13 3 14 7 15 +[1] 0 16 8 17 4 18 9(19) 2 10 5 11 1 12 6 13 3 14 7 15 +[2] 0 16 8 17 4 18 9 19 2(20)10 5 11 1 12 6 13 3 14 7 15 +[3] 0 16 8 17 4 18 9 19 2 20 10(21) 5 11 1 12 6 13 3 14 7 15 +[4] 0 16 8 17 4 18 9 19 2 20 10 21 5(22)11 1 12 6 13 3 14 7 15 +[5] 0 16 8 17 4 18(19) 2 20 10 21 5 22 11 1 12 6 13 3 14 7 15 +[6] 0 16 8 17 4 18 19 2(24)20 10 21 5 22 11 1 12 6 13 3 14 7 15 +[7] 0 16 8 17 4 18 19 2 24 20(25)10 21 5 22 11 1 12 6 13 3 14 7 15 diff --git a/src/main/resources/2018/day10.txt b/src/main/resources/2018/day10.txt new file mode 100644 index 00000000..ac7e997a --- /dev/null +++ b/src/main/resources/2018/day10.txt @@ -0,0 +1,318 @@ +position=<-41150, 41504> velocity=< 4, -4> +position=< 31211, -10213> velocity=<-3, 1> +position=<-51522, -41248> velocity=< 5, 4> +position=< 31227, -51593> velocity=<-3, 5> +position=< 31257, -20560> velocity=<-3, 2> +position=< 41558, 10468> velocity=<-4, -1> +position=< 10539, -30904> velocity=<-1, 3> +position=< 51919, -41253> velocity=<-5, 4> +position=< 31246, 10473> velocity=<-3, -1> +position=<-20471, 20813> velocity=< 2, -2> +position=< 51910, -10222> velocity=<-5, 1> +position=<-20503, 20816> velocity=< 2, -2> +position=< 20901, -41255> velocity=<-2, 4> +position=< 31249, -41249> velocity=<-3, 4> +position=<-10139, 10477> velocity=< 1, -1> +position=< 20888, -30903> velocity=<-2, 3> +position=< 31218, 31158> velocity=<-3, -3> +position=<-30802, 51848> velocity=< 3, -5> +position=< 51923, 51854> velocity=<-5, -5> +position=<-51503, 41504> velocity=< 5, -4> +position=<-10131, 31165> velocity=< 1, -3> +position=<-30809, -10222> velocity=< 3, 1> +position=< 10551, 20818> velocity=<-1, -2> +position=< 31236, 31158> velocity=<-3, -3> +position=<-51534, 20822> velocity=< 5, -2> +position=< 20920, -41250> velocity=<-2, 4> +position=<-30841, 41504> velocity=< 3, -4> +position=< 51932, -41256> velocity=<-5, 4> +position=< 31249, 10469> velocity=<-3, -1> +position=<-41198, 41505> velocity=< 4, -4> +position=<-30833, 41510> velocity=< 3, -4> +position=<-51494, 41507> velocity=< 5, -4> +position=< 10553, 10472> velocity=<-1, -1> +position=<-41174, -20564> velocity=< 4, 2> +position=< 41578, 20816> velocity=<-4, -2> +position=<-51503, -10214> velocity=< 5, 1> +position=<-30824, -30906> velocity=< 3, 3> +position=<-41172, 20816> velocity=< 4, -2> +position=<-41198, 41507> velocity=< 4, -4> +position=< 41578, -30911> velocity=<-4, 3> +position=< 20904, 20817> velocity=<-2, -2> +position=< 51901, 41503> velocity=<-5, -4> +position=< 20872, -30906> velocity=<-2, 3> +position=< 31265, -20560> velocity=<-3, 2> +position=<-10136, -10217> velocity=< 1, 1> +position=< 31246, 20817> velocity=<-3, -2> +position=< 51927, 20820> velocity=<-5, -2> +position=<-30821, -10222> velocity=< 3, 1> +position=<-20492, -10221> velocity=< 2, 1> +position=<-20488, -51596> velocity=< 2, 5> +position=< 41610, -41249> velocity=<-4, 4> +position=< 31257, -30908> velocity=<-3, 3> +position=< 41610, 31160> velocity=<-4, -3> +position=<-10151, 41503> velocity=< 1, -4> +position=<-51527, -10216> velocity=< 5, 1> +position=< 20867, -30903> velocity=<-2, 3> +position=< 31228, 41503> velocity=<-3, -4> +position=<-10160, -41253> velocity=< 1, 4> +position=< 41595, -30907> velocity=<-4, 3> +position=<-51506, 31158> velocity=< 5, -3> +position=<-10142, -10219> velocity=< 1, 1> +position=<-10115, -10222> velocity=< 1, 1> +position=< 10572, -51601> velocity=<-1, 5> +position=< 51899, 20818> velocity=<-5, -2> +position=<-20476, -30910> velocity=< 2, 3> +position=<-41174, 31162> velocity=< 4, -3> +position=< 31246, 41509> velocity=<-3, -4> +position=<-30801, -41253> velocity=< 3, 4> +position=<-10130, 41508> velocity=< 1, -4> +position=<-20473, 10470> velocity=< 2, -1> +position=<-41150, -20565> velocity=< 4, 2> +position=< 31246, 31165> velocity=<-3, -3> +position=< 41610, -41256> velocity=<-4, 4> +position=< 41574, 31164> velocity=<-4, -3> +position=<-41157, -30903> velocity=< 4, 3> +position=< 31241, 10469> velocity=<-3, -1> +position=< 31217, -30912> velocity=<-3, 3> +position=< 10529, 41503> velocity=<-1, -4> +position=< 20901, 51853> velocity=<-2, -5> +position=<-51551, 10472> velocity=< 5, -1> +position=< 41613, 41503> velocity=<-4, -4> +position=<-10134, -41251> velocity=< 1, 4> +position=< 41595, -41253> velocity=<-4, 4> +position=<-51511, 10477> velocity=< 5, -1> +position=<-30837, -10217> velocity=< 3, 1> +position=< 51950, -51602> velocity=<-5, 5> +position=<-51541, 41503> velocity=< 5, -4> +position=< 51907, 51857> velocity=<-5, -5> +position=<-41198, 10469> velocity=< 4, -1> +position=<-30834, 20817> velocity=< 3, -2> +position=< 51947, 31163> velocity=<-5, -3> +position=<-30804, -30912> velocity=< 3, 3> +position=<-30829, -20560> velocity=< 3, 2> +position=< 10547, -30908> velocity=<-1, 3> +position=<-51531, 31166> velocity=< 5, -3> +position=< 51955, 41510> velocity=<-5, -4> +position=<-30861, -30911> velocity=< 3, 3> +position=< 20872, -51596> velocity=<-2, 5> +position=<-30829, 51854> velocity=< 3, -5> +position=<-41150, -10218> velocity=< 4, 1> +position=< 31257, -20560> velocity=<-3, 2> +position=<-20476, 20816> velocity=< 2, -2> +position=<-20468, 10470> velocity=< 2, -1> +position=<-51519, -30911> velocity=< 5, 3> +position=< 51959, 10468> velocity=<-5, -1> +position=< 20888, -51593> velocity=<-2, 5> +position=< 51947, 10475> velocity=<-5, -1> +position=< 31246, 10468> velocity=<-3, -1> +position=<-20516, -41249> velocity=< 2, 4> +position=<-51511, -41248> velocity=< 5, 4> +position=<-41147, 20817> velocity=< 4, -2> +position=<-41150, -51594> velocity=< 4, 5> +position=<-10163, -30908> velocity=< 1, 3> +position=<-10152, -10213> velocity=< 1, 1> +position=<-20460, -30903> velocity=< 2, 3> +position=<-41169, -10219> velocity=< 4, 1> +position=<-51531, -30907> velocity=< 5, 3> +position=<-30812, 41503> velocity=< 3, -4> +position=<-41169, 10477> velocity=< 4, -1> +position=< 10546, 51848> velocity=<-1, -5> +position=<-10139, 20813> velocity=< 1, -2> +position=<-30861, 51851> velocity=< 3, -5> +position=<-20497, -51593> velocity=< 2, 5> +position=< 51949, -20558> velocity=<-5, 2> +position=< 41597, -51595> velocity=<-4, 5> +position=< 51940, 31163> velocity=<-5, -3> +position=< 41589, 10473> velocity=<-4, -1> +position=<-51495, -41257> velocity=< 5, 4> +position=< 31265, -41254> velocity=<-3, 4> +position=< 10527, 10473> velocity=<-1, -1> +position=< 51927, 41509> velocity=<-5, -4> +position=< 20884, 10471> velocity=<-2, -1> +position=<-51493, 41507> velocity=< 5, -4> +position=<-41182, -30912> velocity=< 4, 3> +position=< 10575, 41509> velocity=<-1, -4> +position=< 20884, -20567> velocity=<-2, 2> +position=< 10535, -20560> velocity=<-1, 2> +position=<-51543, 41512> velocity=< 5, -4> +position=<-30825, -10214> velocity=< 3, 1> +position=<-51535, -20559> velocity=< 5, 2> +position=< 10528, -10218> velocity=<-1, 1> +position=<-51538, 41506> velocity=< 5, -4> +position=< 20892, -30905> velocity=<-2, 3> +position=< 31249, -51596> velocity=<-3, 5> +position=< 10539, 20815> velocity=<-1, -2> +position=<-20464, -41248> velocity=< 2, 4> +position=<-41186, -20567> velocity=< 4, 2> +position=<-20492, 20820> velocity=< 2, -2> +position=<-30818, 31165> velocity=< 3, -3> +position=<-10131, -51596> velocity=< 1, 5> +position=< 51919, 20814> velocity=<-5, -2> +position=<-41166, -30905> velocity=< 4, 3> +position=<-10151, 31163> velocity=< 1, -3> +position=< 10522, 10468> velocity=<-1, -1> +position=< 51911, -30912> velocity=<-5, 3> +position=<-41173, 31160> velocity=< 4, -3> +position=< 31260, -41248> velocity=<-3, 4> +position=<-10139, -10220> velocity=< 1, 1> +position=<-30857, -20558> velocity=< 3, 2> +position=< 10531, -10222> velocity=<-1, 1> +position=<-30813, -20566> velocity=< 3, 2> +position=< 51944, -30903> velocity=<-5, 3> +position=<-41198, 20820> velocity=< 4, -2> +position=<-41150, -41252> velocity=< 4, 4> +position=<-20508, 20814> velocity=< 2, -2> +position=< 41554, -41256> velocity=<-4, 4> +position=< 31238, -41248> velocity=<-3, 4> +position=< 20906, -10219> velocity=<-2, 1> +position=< 51912, 41505> velocity=<-5, -4> +position=< 20866, -51602> velocity=<-2, 5> +position=< 10519, 31164> velocity=<-1, -3> +position=<-20479, 51856> velocity=< 2, -5> +position=<-30829, -51596> velocity=< 3, 5> +position=< 51943, -10221> velocity=<-5, 1> +position=< 20917, -41249> velocity=<-2, 4> +position=< 20888, 41507> velocity=<-2, -4> +position=< 51957, 41507> velocity=<-5, -4> +position=<-20499, -10213> velocity=< 2, 1> +position=< 51911, 41503> velocity=<-5, -4> +position=<-51551, -51595> velocity=< 5, 5> +position=<-10139, 51849> velocity=< 1, -5> +position=< 41582, -10222> velocity=<-4, 1> +position=<-41150, 31159> velocity=< 4, -3> +position=< 20888, 41504> velocity=<-2, -4> +position=< 10567, 20821> velocity=<-1, -2> +position=< 51900, -10222> velocity=<-5, 1> +position=<-51503, 20815> velocity=< 5, -2> +position=<-20488, -51596> velocity=< 2, 5> +position=< 51939, -10221> velocity=<-5, 1> +position=< 31270, 10468> velocity=<-3, -1> +position=<-51527, 20816> velocity=< 5, -2> +position=< 51926, 51853> velocity=<-5, -5> +position=<-51543, -20564> velocity=< 5, 2> +position=< 20883, -20558> velocity=<-2, 2> +position=<-41166, 20816> velocity=< 4, -2> +position=< 51936, 41511> velocity=<-5, -4> +position=<-10115, -10220> velocity=< 1, 1> +position=< 31210, -51593> velocity=<-3, 5> +position=<-10115, -41248> velocity=< 1, 4> +position=< 31233, -20559> velocity=<-3, 2> +position=< 20921, -51598> velocity=<-2, 5> +position=<-41185, -30912> velocity=< 4, 3> +position=<-51531, -51600> velocity=< 5, 5> +position=< 10543, -10220> velocity=<-1, 1> +position=< 51924, -30912> velocity=<-5, 3> +position=<-30821, 20813> velocity=< 3, -2> +position=< 10545, -51602> velocity=<-1, 5> +position=<-10126, -41248> velocity=< 1, 4> +position=<-30829, -30907> velocity=< 3, 3> +position=<-51495, 20817> velocity=< 5, -2> +position=< 10548, -41256> velocity=<-1, 4> +position=< 41578, -51599> velocity=<-4, 5> +position=<-41203, -51602> velocity=< 4, 5> +position=< 31253, -10214> velocity=<-3, 1> +position=<-20457, -30908> velocity=< 2, 3> +position=<-10147, 51848> velocity=< 1, -5> +position=<-51502, -20558> velocity=< 5, 2> +position=< 41615, -10222> velocity=<-4, 1> +position=<-41182, -30906> velocity=< 4, 3> +position=< 20912, -10216> velocity=<-2, 1> +position=< 20869, -20566> velocity=<-2, 2> +position=< 10555, 41510> velocity=<-1, -4> +position=<-30835, 10472> velocity=< 3, -1> +position=<-20487, 41505> velocity=< 2, -4> +position=<-20511, -41249> velocity=< 2, 4> +position=< 20913, 20822> velocity=<-2, -2> +position=<-30824, 10469> velocity=< 3, -1> +position=< 10567, 10472> velocity=<-1, -1> +position=< 31238, 31166> velocity=<-3, -3> +position=<-41186, -10219> velocity=< 4, 1> +position=<-41169, -51602> velocity=< 4, 5> +position=< 51947, -20564> velocity=<-5, 2> +position=< 41562, -10219> velocity=<-4, 1> +position=<-10155, 20821> velocity=< 1, -2> +position=< 20884, -51598> velocity=<-2, 5> +position=< 20907, 41505> velocity=<-2, -4> +position=< 10579, 51848> velocity=<-1, -5> +position=< 41586, -30905> velocity=<-4, 3> +position=<-30859, -41248> velocity=< 3, 4> +position=< 20864, 10475> velocity=<-2, -1> +position=< 20876, -30908> velocity=<-2, 3> +position=< 10543, -41248> velocity=<-1, 4> +position=< 31246, -51598> velocity=<-3, 5> +position=<-30833, 41503> velocity=< 3, -4> +position=<-20473, -51595> velocity=< 2, 5> +position=< 31265, -30904> velocity=<-3, 3> +position=<-51493, 31158> velocity=< 5, -3> +position=< 51947, 20821> velocity=<-5, -2> +position=<-41166, -30912> velocity=< 4, 3> +position=<-30813, 41508> velocity=< 3, -4> +position=<-41198, -51601> velocity=< 4, 5> +position=<-10151, 20819> velocity=< 1, -2> +position=< 51907, 51854> velocity=<-5, -5> +position=<-10158, -41254> velocity=< 1, 4> +position=<-41170, -41249> velocity=< 4, 4> +position=< 51907, 51856> velocity=<-5, -5> +position=< 41586, -10216> velocity=<-4, 1> +position=< 31246, -20560> velocity=<-3, 2> +position=<-30826, -10217> velocity=< 3, 1> +position=< 10569, 51848> velocity=<-1, -5> +position=<-20484, -30912> velocity=< 2, 3> +position=< 10559, 41510> velocity=<-1, -4> +position=< 41555, 31167> velocity=<-4, -3> +position=< 20877, -30911> velocity=<-2, 3> +position=<-51549, 20822> velocity=< 5, -2> +position=<-51551, 51856> velocity=< 5, -5> +position=<-10163, 10476> velocity=< 1, -1> +position=<-51530, -10222> velocity=< 5, 1> +position=< 31241, 20817> velocity=<-3, -2> +position=<-51514, 20822> velocity=< 5, -2> +position=<-41155, 31158> velocity=< 4, -3> +position=< 41565, 10468> velocity=<-4, -1> +position=< 51949, 41503> velocity=<-5, -4> +position=< 20874, 10468> velocity=<-2, -1> +position=< 41611, -41253> velocity=<-4, 4> +position=<-30813, -30906> velocity=< 3, 3> +position=< 41574, 41511> velocity=<-4, -4> +position=< 51931, 51856> velocity=<-5, -5> +position=<-20508, -10220> velocity=< 2, 1> +position=< 20891, -41253> velocity=<-2, 4> +position=< 31249, 31159> velocity=<-3, -3> +position=< 41579, 31162> velocity=<-4, -3> +position=<-51527, 51853> velocity=< 5, -5> +position=<-30826, 20819> velocity=< 3, -2> +position=<-20508, 10471> velocity=< 2, -1> +position=<-20472, 10476> velocity=< 2, -1> +position=< 51924, 41507> velocity=<-5, -4> +position=<-30837, -51600> velocity=< 3, 5> +position=<-20487, 41512> velocity=< 2, -4> +position=<-51499, 41512> velocity=< 5, -4> +position=<-51508, -30910> velocity=< 5, 3> +position=<-20483, -20566> velocity=< 2, 2> +position=<-20516, -51596> velocity=< 2, 5> +position=< 20924, -30908> velocity=<-2, 3> +position=<-10144, -41257> velocity=< 1, 4> +position=<-41154, -41257> velocity=< 4, 4> +position=< 51902, -20558> velocity=<-5, 2> +position=< 41610, -10216> velocity=<-4, 1> +position=< 51917, -41248> velocity=<-5, 4> +position=<-20459, 31158> velocity=< 2, -3> +position=< 20884, 31162> velocity=<-2, -3> +position=<-20506, -30908> velocity=< 2, 3> +position=<-51533, -30903> velocity=< 5, 3> +position=<-10168, -30912> velocity=< 1, 3> +position=< 20904, 41506> velocity=<-2, -4> +position=<-51551, 31163> velocity=< 5, -3> +position=<-20500, -51595> velocity=< 2, 5> +position=< 31251, -20561> velocity=<-3, 2> +position=<-41186, -51595> velocity=< 4, 5> +position=<-20496, 31163> velocity=< 2, -3> +position=<-20458, -41257> velocity=< 2, 4> +position=< 41554, -41255> velocity=<-4, 4> +position=<-51511, 31163> velocity=< 5, -3> +position=<-51535, 20821> velocity=< 5, -2> +position=<-30853, -41249> velocity=< 3, 4> +position=< 20912, -51597> velocity=<-2, 5> +position=< 10527, -30903> velocity=<-1, 3> +position=< 41587, 41505> velocity=<-4, -4> diff --git a/src/main/resources/2018/day11.txt b/src/main/resources/2018/day11.txt new file mode 100644 index 00000000..ef1a65bf --- /dev/null +++ b/src/main/resources/2018/day11.txt @@ -0,0 +1 @@ +8141 diff --git a/src/main/resources/2018/day12.txt b/src/main/resources/2018/day12.txt new file mode 100644 index 00000000..551203dc --- /dev/null +++ b/src/main/resources/2018/day12.txt @@ -0,0 +1,34 @@ +initial state: #.#####.##.###...#...#.####..#..#.#....##.###.##...#####.#..##.#..##..#..#.#.#.#....#.####....#..# + +#.#.. => . +..### => . +...## => . +.#### => # +.###. => # +#.... => . +#.#.# => . +###.. => # +#..#. => . +##### => # +.##.# => # +.#... => . +##.## => # +#...# => # +.#.## => . +##..# => . +..... => . +.#.#. => # +#.### => # +....# => . +...#. => # +..#.# => # +##... => # +####. => # +#..## => # +##.#. => # +###.# => . +#.##. => . +..#.. => # +.#..# => . +..##. => . +.##.. => # diff --git a/src/main/resources/2018/day13.txt b/src/main/resources/2018/day13.txt new file mode 100644 index 00000000..d80900e6 --- /dev/null +++ b/src/main/resources/2018/day13.txt @@ -0,0 +1,150 @@ + /--------------------\ + /-------------------------------------------\ | | /-------------------\ + | /----------\ /-------+---------------------+-\ | | | +/--------------------------------+-------------------+----------+----+-------+-------\ | | | | | +| | | /-----+----+-------+-------+-------------+-+------------------+-------+------------\ | +| /-----+-------------------+----+-----+----+-------+-------+-------------+-+--\ | | | | +| /---------------+-----+-------------------+----+-----+----+-------+-------+-------------+-+--+\ | | | | +| | | | | | | | | /----+-------------+-+--++--------------+-------+------------+-\ | +| | | | | | | | | | | | | || | | | | | +| | | | /----+----+-----+----+-------+--+----+----------<\ | | || | | | | | +| /---+---------------+-----+--------------+----+----+-----+----+-------+--+----+-----------+-+-+--++--\ | | | | | +| /----+---+---------------+-----+--------------+----+----+-----+--<-+-------+--+\ | /---+-+-+--++--+-----------+-------+----\ | | | +| | | | | | | | | | | | || | | | | | || | | | | | | | +| | | | | | | | | | | /-+--++---+-----\ | | | | || | | | | | | | +| | | | | | | | | | | | | || | | | | | | || | |/------+----+-------+-+---\| +| | | /+---------------+-----+--------------+--\ | | |/---+-----+-+-\|| | | | | | | || | || | | | | || +| | /-+--++---------------+-----+--------------+--+-+----+-----++---+-----+-+-+++---+---\ | | | \-+--++--+-----------/| | | | | || +| | | | || /---------+-----+-\ /-----+--+-+-\ | || \-----+-+-+++---+---+-+-+---+---/ || | /------+------+----+-------+\| || +| | | | || | | | | /-+-----+--+-+-+--+-----++---------+-+-+++---+---+-+-+---+------++--+-----+------+-\ | | ||| || +| | | | || | | | | | | | | | |/-+-----++-------\ | | ||| | | | | | || | | | | | | ||| || +| | | | || | \-----+-+----+-+-----+--+-+-++-+-----++-------+-+-+-+++---+---+-+-+---+------/| | | | | /-+----+-----\ ||| || +| | | | || | | | | | |/-+-+-++-+-----++-------+-+-+-+++---+---+-+-+---+-----\ | |/----+------+-+\ | | | | ||| || +| | | | || | | | | | || | | || | || | | | ||| | | | | | | |/-++----+------+-++-+-+----+-----+-+++--\|| +| | | | || | | | | | || | | || | || | | | ||| | | | | | | || || | | || | | | | ||| ||| +| | | | || | /-----+-+----+\| || | |/++-+----\|| | | | ||| | | | | | | || || | | || | | | | ||| ||| +| | | |/-++-----+---------+----\| |/---+++-----++-+-++++-+----+++-------+-+-+-+++---+---+-+-+---+-----+-++-++----+------+-++-+\| | | ||| ||| +| | | || || | | || || ||| || | |||| | ||| | | | ||| | | | \---+-----+-++-++----+------+-++-+++----/ | ||| ||| +| | | || || | | || || ||| /--++-+-++++-+----+++-------+-+-+\||| | | | | | || || | | || ||| | ||| ||| +| | | || || | | || || ||| | || | ||||/+----+++-------+-+-+++++---+---+-+-----+-----+-++-++----+------+-++-+++-\ | ||| ||| +| | | || || | | || || ||| /+--++-+-++++++----+++-------+-+-+++++---+---+-+-----+-----+-++-++----+------+-++-+++-+---\ | ||| ||| +| | | || || | | || || ||| || || | |||||| ||| | | ||||| | | | /--+-----+-++-++----+------+-++-+++-+---+-\ | ||| ||| +| | | || || | | || || ||\-++--++-+-++/||| ||| | | ||||| /+---+-+--+--+-----+-++-++----+------+-++-+++-+---+-+--+\||| ||| +| | /+-++-++-----+\ | || || || || || | || ||| ||| | \-+++++--++---+-/ | | | || || | | || ||| | | | ||||| ||| +| | || || || || | || || || || || | || ||| ||| /---+---+++++--++---+\ | | | || || | | || ||| | | | ||||| ||| +| | || || || || | || || \+--++--++-+-++-+++----+++---+---+---+++++--++---++---+--+-----+-++-++----+------+-/| ||| | | | ||||| ||| +| | || || || || /------+----++\|| | || || | || ||| ||| | | ||||| || || | | /-+-++-++----+------+--+\||| | | | ||||| ||| +| | || || || /---++-+------+----+++++----+--++--++-+-++-+++----+++---+---+---+++++--++---++---+--+---+-+-++-++---\| | ||||| | | | ||||| ||| +| | || || || | || | \----+++++----/ || || | ||/+++----+++---+---+---+++++--++---++---+--+---+-+-++-++--\|| | ||||| | | | ||||| ||| +| | || || || |/--++-+-----------+++++-------++--++-+-++++++----+++---+---+---+++++--++---++---+--+-\ | | || || ||| | ||||| | | | ||||| ||| +| | || || || || || | |||||/------++--++-+-++++++----+++---+---+---+++++--++---++---+--+-+-+-+-++-++--+++------+--+++++-+---+\| ||||| ||| +| | || || || || || | |||||| /---++--++-+-++++++----+++---+---+---+++++--++---++---+--+-+-+-+-++-++\ ||| | ||||| | ||| ||||| ||| +| | ||/++-++-++--++-+-\ ||||||/-+---++--++-+-++++++----+++---+---+---+++++--++---++---+--+-+-+-+-++-+++-+++------+--+++++\| ||| ||||| ||| +| | ||||| || || || |/+---------+++++++-+-\ || || | |||||| /-+++---+---+---+++++--++---++---+--+-+-+-+-++-+++-+++\ | ||||||| ||| ||||| ||| +| | |\+++-++-++--++-+++---------+++++++-+-+-++--++-+-++++++--+-+++---+---+---+++++--++---/| | | | | | || ||| |||| | ||||||| ||| ||||| ||| +| | | ||| || || || ||| ||||||| | | || \+-+-++++++--+-+++---+---+---+++++--++----+---+--/ | | | || |\+-++++-----+--/|||||| ||| ||||| ||| +| | | ||| || || /++-+++---------+++++++-+-+-++---+-+-++++++--+-+++---+---+---+++++--++----+---+--\ | | | || | | |||| | |||\++---+++--+++++--++/ +| | | ||| \+-++-+++-+++---------+++++++-+-+-++---+-/ ||\+++--+-+++---+---+---+++++--++----+>--+--+-+-+-+-++-+-+-/||| | ||| || ||| ||||| || +| | | ||| | \+-+++-+++---------+++++++-+-+-++---+---++-+++--+-+++---+---+---+++++--++----+---+--+-+-+-+-++-+-+--/|| | ||| || ||| ||||| || +| | | ||| | | ||| ||| ||||||| | | || | || ||| | ||| | | ||||| || |/--+--+-+-+-+-++-+-+---++-----+---+++-++---+++--+++++--++-\ +| | | ||| | | ||| ||| ||||||| | | || | || ||| | ||| | |/--+++++--++----++--+--+-+-+-+-++-+-+---++-----+---+++-++---+++-\||||| || | +| | | ||| | | ||| ||| ||||||| | | || | || ||| | ||| | /-++--+++++--++----++--+--+-+-+-+-++-+-+---++---\ | ||| || ||| |||||| || | +| | | ||| | | ||| ||| ||||||| | | || | /++-+++--+-+++---+-+-++--+++++--++---\|| | | |/+-+-++-+-+---++---+-+---+++-++---+++-++++++--++\| +| | | ||| | | ||| ||| ||||||| | | || | ||| ||| | ||| | | || ||||| || ||| | | ||| | || | | || | | ||| || ||| |||||| |||| +| | | ||| | | ||| ||| ||||||| | | || | ||| ||| | ||| | | || ||||| || /+++--+--+-+++-+-++-+-+---++---+-+---+++-++---+++\|||||| |||| +| | | \++--+--+-+++-++/ ||||||| | | ||/--+--+++-+++--+-+++---+-+-++--+++++--++--++++--+--+-+++-+-++-+-+---++---+-+---+++-++\ |||||||||| |||| +| | | || | | ||| || ||||||| | | ||| | |\+-+++--+-+/| | | || ||||| || ||||/-+--+-+++-+-++-+-+---++---+\| ||| ||| |||||||||| |||| +| | | || | | \++-++----------+++++++-+-+-+++--+--+-+-+++--+-+-+---+-+-++--+++++--++--+++++-+--/ ||| | || | | || ||| ||| ||| |||||||||| |||| +| | | || | | ||/++----------+++++++-+-+-+++--+--+-+-+++--+-+-+---+-+-++--+++++--++-\||||| | ||| | || | | ||/--+++---+++-+++--++++++++++-\|||| +| | | || | | ||||| /-------+++++++-+-+-+++--+--+-+-+++--+-+-+---+-+\|| ||||| || |||||| | ||| | || | | ||| ||| ||| ||| |||||||||| ||||| +| | | || | | ||||| | ||||||| | | ||| | | | ||| | | | | |||| ||||| || |||||| | ||| | || | |/--+++--+++-\ ||| ||| |||||||||| ||||| +| |/+--++--+--+--+++++--+---\ |||||||/+-+-+++--+--+-+-+++-\^ | | | |||| ||||| || |||||| | ||| | || | || ||| ||| | ||| ||| |||||||||| ||||| +| ||| || |/-+--+++++--+---+---+++++++++-+-+++--+--+-+-+++-++-+-+---+-++++--+++++--++-++++++-+----+++-+-++-+-++--+++\ ||| | ||| ||| |||||||||| ||||| +| ||\--++--++-+--+/||| | | /-+++++++++-+-+++--+--+\|/+++-++-+-+---+-++++--+++++--++-++++++-+----+++-+-++-+-++--++++-+++-+-+++-+++--++++++++++\||||| +| || || \+-+--+-+++--+---+-+-+++++++++-+-+++--+--+++++++-++-+-+---+-++++--+++++--++-++++++-+----+++-+-/| | || |||| ||| | ||| ||| |||||||||||||||| +| || || | | | ||| | | | |||||||||/+-+++--+\ ||||||| || | | | |||\--+++++--++-++++++-+----+++-+--+-+-++--++++-+++-+-+++-+++--++++/||||||||||| +| || || | | | ||| | | | ||||||||||| ||| || ||||||| || | | |/+++---+++++--++-++++++-+----+++-+--+-+\|| |||| ||| | ||| ||| |||| ||||||||||| +| ||/--++---+-+--+-+++--+--\| | ||||||||||| ||| || ||||||| || | | \++++---+++++--++-+++/|| | ||| | | |||| |||| ||| | ||| ||| |||| ||||||||||| +| ||| || | | | ||| | /++-+-+++++++++++-+++--++-+++++++-++-+-+----++++---+++++--++-+++-++-+----+++-+\ | |||| |||| ||| | ||| ||| |||| ||||||||||| +| ||| || | | | ||| | ||| | ||||||||||| ||| || ||||||| || | | |||| ||||| || ||| || |/---+++-++-+-++++--++++-+++-+-+++-+++\ |||| ||||||||||| +| ||v || | | | ||| | ||| |/+++++++++++-+++--++-+++++++-++-+-+----++++---+++++--++-+++-++-++---+++-++-+-++++\ |||| ||| | ||| |||| |||| ||||||||||| +| |||/-++---+>+--+-+++--+-+++-+++++++++++++-+++--++-+++++++-++-+-+----++++---+++++--++-+++-++-++\ ||| || | ||||| |||| ||| | ||| |||| |||| ||||||||||| +| |||| || | | | ||| | ||| ||||||||||||| |v| || ||||||| || | | /--++++---+++++--++-+++-++-+++--+++-++-+\||||| |v|| ||| | ||| |||| |||| ||||||||||| +| |||| || | | | ||| | ||| ||||||||||||| ||| || ||||||| || | | | |||| ||||| || ||| || ||| ||| || ||||||| |||| ||| | ||| |||| |||| ||||||||||| +| |||| || | | | ||\--+-+++-++++++++++++/ ||| || ||||||| || | | | |||| ||||| || ||| || ||| ||| || ||||||| |||| ||| | ||| |||| |||| ||||||||||| +| |||| || | | | || | ||| |||||||||||| ||| || ||||||| || | | | |||| ||||| || ||| || ||| ||| || ||||||| |||| ||| | ||| |||| |||| ||||||||||| +| |||| || | | | |\---+-+++-++++/||||||| ||| || ||||||| || | | | |||| ||||| || ||| || ||| ||| || ||||||| |||| ||| | ||| |||| |||| ||||||||||| +| |||| || /-+-+--+-+----+-+++\|||| ||||||| ||| || ||||||\-++-+-+-+--++++---+++++--++-+++-++-+++--+++-++-+++++++-++++-+++-+-+++-++++-++++-++/|||||||| +| |||| || | | | | | | |||||||\-+++++++--+++--++-++++++--++-+-+-+--++++---/|||| || ||| || ||| ||| || ||||||| |||| ||| | ||| |||| |||| || |||||||| +| |||| || | | | | | /--+-+++++++\ ||||||| ||| || |||||| || | | | |||| |||| || ||| || ||| ||| || ||||||| |||| ||| | ||| |||| |||| || |||||||| +| |||| || | | | | | | | |||||||| ||||||| ||\--++-++++++--++-+-+-+--++++----++++--++-+++-++-+++--+++-++-+++++++-++++-+++-+-+++-++/| |||| || |||||||| +\-++++-++-+-+-+--+-+-+--+-++++++++-+++++++--++---++-++++++--++-+-+-+--++++----++++--+/ ||| || ||| ||| || \++++++-++++-+++-+-+++-++-+-++++-++-++++/||| + |||| || | | | | | | | |||||||| |\+++++--++---++-++++++--++-+-+-+--++++----++++--+--+++-++-+++--+++-++--++++++-++++-+++-+-++/ || | |||| || |||| ||| + |||| \+-+-+-+--+-+-+--+-++++++++-+-+++++--++---++-++++++--++-+-+-+--++++----++++--+--+++-++-+++--+++-++--+/|||| |||| ||| | || || | |||| || |||| ||| + |||| | | | | | | | | \+++++++-+-+++++--++---++-++++++--++-+-+-+--++++----++++--+--+++-++-+++--+++-+/ | |||| |||| ||| | || || | |||| || |||| ||| + |||| | | | | | | | | ||||||| | ||||| || ||/++++++--++-+-+-+--++++----++++--+--+++\|| ||| ||\-+---+-++++-++++-+++-+-/| || | |||| || |||| ||| + |||| | | | | | |/+--+--+++++++-+\||||| || ||||||||| || | | | |||| /--++++--+--++++++-+++--++--+-\ | |||| |||| ||\-+--+--++-+-++++-++-++++-/|| + ||\+--+-+-+-+--+-+++--+--/|||||| ||||||| || ||||||||| || | | | |||| | |||| \--++++++-+++--++--+-+-+-++++-++++-++--+--+--++-+-++++-+/ |||| || + || | | | | | | ||| | |||||| ||||||| || ||||||||| || | | | |||| | |||| |||||| \++--++--+-+-+-++++-++++-++--+--+--++-+-++/| | |||| || + || | | | | | | ||| | |||||| ||||||| || ||||||\++--++-+-+-+--++++-+--++++-----++++++--++--++--+-+-+-++++-++++-++--+--+--++-+-++-+-+--++/| || + || | | | | | | ||| | /-++++++-+++++++--++---++++++-++--++-+-+-+--++++-+--++++-----++++++--++--++--+-+-+-++++-++++-++--+--+--++-+\|| | | || | || + || | | | | | | ||| | | |||||| ||||||| || |||||| || || | | | |||| | |||| /--++++++--++--++--+-+-+-++++-++++-++-\| | || |||| | | || | || + || | | | | | | ||| | | |||||| ||||||\--++---+/|^|| || || | | | |||| | |||| | |||||| || || | | | |||| |||| || || | || |||| | | || | || + ||/+--+-+-+-+--+-+++--+\| |||||| |||||| || | |||| || ||/+-+-+--++++-+--++++\ | |||||| || || | | | |||| |||| || || | || |||| | | || | || + |||| | | | | | ||| ||| |||||| |||||| || /-+-++++-++--++++-+-+--++++-+--+++++-+--++++++--++--++--+-+-+-++++-++++-++-++--+--++\|||| | | || | || + \+++--+-+-+-+--+-+++--+++-++++++-++++++---++-+-+-++++-++--++++-+-+--++++-+--+++/| | |||||| || || | | | |||| |||| || || | ||||||| | | || | || + ||| | | | |/-+-+++--+++-++++++-++++++---++-+-+-++++-++--++++-+-+--++++-+--+++-+-+--++++++--++--++-\| | | |||| |||| || || | ||||||| | | || | || + |||/-+-+-+-++-+-+++--+++\|||||| |||||| || | | |||| || |||| | | |||| | ||| | | |||||| || || || | | |||| |||| || || | ||||||| | | || | || + |||| | | | || | ||| |||||||||| |||||| || | | |||| || |||| | | |||| | ||\-+-+--++++++--++--++-++-+-+-++++-++++-++-++--+--+++++++-+-+--+/ | || + |||| |/+-+-++-+-+++--++++++++++-++++++---++-+-+-++++-++--++++-+-+--++++-+--++--+-+->++++++--++--++-++\| | |||| |||| || || | ||||||| | | | | || + |||| ||| | || | ||| |||||||||| |||||| || | | |||| || |||| | | |||| | || | | /++++++--++--++-++++-+-++++-++++-++-++--+--+++++++-+-+--+--+\ || + |||| ||| | || | ||| |||||||\++-++++++---++-+-+-++++-++--++++-+-+--++++-+--++--+-+-+++++++--++--++-++++-+-+++/ |||| || || | ||||||| | | | || || + |\++-+++-+-++-+-+++--+/||||| || |||||| || | | \+++-++--++++-+-+--++++-+--++--+-+-++++/|| || || |||| | ||| |||| || || | ||||||| | | | || || + | || ||| | || | ||| | ||||| || |||||| || | | ||| || |||| | | \+++-+--++--+-+-++++-++--++--++-++++-+-/|| |||| || || | ||||||| | | | || || + | || ||| | || | ||\--+-+++++-+/ |||||| || | | ||| |\--++++-+-+---+++-+--++--+-+-++++-++--++--++-++++-+--++--++++-++-++--+--+/||||| | | | || || + | \+-+++-+-++-+-++---+-+++++-+--++++++---++-+-+--+++-+---++++-+-+---+++-+>-++--+-+-++++-++--+/ || |||| | || |||| || || | | ||||| | | | || || + | | ||| | || \-++---+-+++++-+--/||||| || | | ||| | |||| | \---+++-+--++--+-+-++++-++--+---++-++++-/ || |||| || || | | ||||| | | | || || + | | ||| | || || | ||||| | ||||| || | | \++-+---++++-+-----+++-+--++--+-+-+++/ || | || |||| || \+++-++-++--+--+-+++++-+-+--/ || || + | | ||| | || /++---+-+++++-+---+++++---++\| | /-++-+---++++-+-----+++-+--++--+-+-+++--++--+---++-++++----++---+++-++-++--+--+-+++++-+-+-----++\|| + | |/+++-+-++--+++---+-+++++-+---+++++--\\+++-+-+-++-+---++++-+-----+++-+--++--+-+-+++--++--+---++-++++----++---+++-++-++--+--+-+++/| | | ||||| + | ||\++-+-++--+++---+-+++++-/ ||||| | ||| | | || | |||| | ||| | || | | ||| || | || |||| || |||/++-++--+--+-+++-+-+-+---\ ||||| + | || || | || ||| | ||||| ||||\--+-+++-+-+-++-+---++++-+-----+++-+--++--+-+-+++--++--+---++-++++----/| ||||||/++--+--+-+++-+-+-+-\ | ||||| + | || || | || ||| | ||||| |||| | ||| | | v| | |||| | ||| | || | | ||| || | |\-++++-----+---+++++++++--+--+-+++-+-+-+-+-+-+++/| + | || || |/++--+++---+-+++++-----++++---+-+++-+-+-++-+--\|||| | /-+++-+--++--+-+-+++--++--+---+--++++--\ | ||||||||| | | ||| | | | | | ||| | + | || || |||| ||| | ||||| |||| | ||| | | || | ||||| \---+-+++-+--+/ | | ||| || | | |||| | | ||||||||| | | ||| | | | | | ||| | + | || || |||| ||| | ||||| |||| | ||| | | || | ||||| /-+-+++-+--+---+-+-+++--++--+---+--++++\ | | ||||||||| | | ||| | | | | | ||| | + | || || |||| ||| \-+++++-----++++---+-+++-+-+-++-+--+++++---+-+-+/| | | | \-+++--++--+---+--+++++-+--+---+++++++/| | | ||| | | | | | ||| | + | || || |||| ||| \++++-----++++---+-+++-+-+-++-+--+++++---+-+-+-+-+--+---+---+++--++--+---+--+++++-+--+---+++++++-+--+--+-++/ | | | | | ||| | + | || || |||| ||| |||| |||| | ||| | \-++-+--+++++---+-+-+-+-+--+---+---+++--++--+---+--+++++-+--+---+++++++-+--+--+-++--+-+-+-+-+-++/ | + | || || |||| |\+------++++-----++++---+-+++-+---++-+--+++++---+-+-+-+-+--+---+---+/| || | | ||||| | | ||||||| | | | || | | | | | || | + | || || |||| | | |||| |||| | ||| | || | ||||| | | | | | | | | | || \---+--+++++-+--+---+++++++-+--+--+-+/ | | | | | || | + | || \+-++++--+-+------++++-----++++---+-+++-+---++-+--+++++---+-+-+-+-+--+---+---+-+--++------+--++/|| | | |\+++++-+--+--+-+---+-+-+-+-+-/| | + \--++--+-++++--+-+------+/|| |||| | ||| | || | ||||| | | | | | | | | | || | || || | | | ||||| | | | | | | | | | | | + || | |||| | | | || |||| | ||| \---++-+--+++++---+-+-+-+-+--+---+---+-+--++------+--+/ || | | | |\+++-+--+--+-+---+-+-+-+-/ | | + || | |||| | | | |\>----++++---+-+++-----/| | ||||| | | | | | | | | | || | | || | | | | ||| | \--+-+---+-+-/ | | | + || | |||| | | | | |||| | ||| \-+--++++/ |/+-+-+-+--+---+---+-+--++---\ | | || | | | | ||| | | | | | | | | + || | |||| | | | | |||| | ||| \--++++----+++-+-/ | | | | | || | | | || | | | | ||| | | | | | | | | + |\--+-++++--+-+------+-+------++++---/ ||| |||| ||| | | | | | \--++---+--+--+--++-+--+---+-+-+++-+-----+-+---+-/ | | | + | | |||| | | | | |||| ||| |||| ^|| | | | | | || | | | || | | | | ||| | | | | | | | + | \>++++--+-+------+-/ |||| /--+++-----------++++----+++-+--\| | | | || | | | || | | | | ||| | | | | | | | + | |||| | | | |||| | ||| |||| ||| | |\--+---+---+----++---+--+--+--/| | | | | ||| | | | | | | | + | |||| | | | |||| | \++-----------++++----+++-+--+---/ | | || | | | | | | | | ||| | | | | | | | + | |||\--+-+------+--------++++--+---++-----------++++----+++-+--+-------+---+----++---+--+--/ | | | | | ||| | | | | | | | + | ||| | | | |||| | || |||| ||| | | | \----++---+--+------+-+--+---+-+-+++-+-----+-+---+-----+----/ | + \-----+++---+-+------/ |\++--+---++-----------++++----+++-+--+-------+--------++---+--+------+-+--+---+-+-+++-+-----+-+---/ | | + ||| | | | || | || |||| |\+-+--+-------+--------++---/ | | | | | | ||| | | | | | + ||| | | | || | |\-----------++++----+-+-+--+-------+--------++------+------+-+--+->-+-+-+++-+-----+-/ | | + ||| | | | || | | |||| | | | | | |\------+------+-+--+---+-+-+/| | | | | + /----------+++---+-+-\ | || | | |||| | \-+--+-------+--------+-------+------+-/ | | | | | | | | | + | ||\---+-+-+-------------+-++--+---+------------++++----+---+--+-------+--------+--->---/ | | | | | \-+-----+-----------/ | + | || | | | | || | | |||| | | | | \--------------+----+---+-+-+---+-----+-------------------/ + | || | \-+-------------/ || | | |||| | | | | | | | | | | | + | || \---+---------------++--+---/ |||| | | | | | | | | | | | + | |\--------+---------------++--+----------------/||| | \--+-------+-----------------------+----+---+-+-/ | | + | | | || | ||| | | | | \---+-+-----/ | + | | | || \-----------------+++----+------/ | | | | | + | | | || ||| \--------------+-----------------------/ | | | + | | | || |\+-------------------+--------------------------------/ | | + | | | \+--------------------+-+-------------------+----------------------------------+-----------/ + \----------+---------/ \--------------------/ \-------------------/ | + \--------------------------------------------------------------------------------------------------------/ diff --git a/src/main/resources/2018/day14.txt b/src/main/resources/2018/day14.txt new file mode 100644 index 00000000..d655e515 --- /dev/null +++ b/src/main/resources/2018/day14.txt @@ -0,0 +1 @@ +765071 diff --git a/src/main/resources/2018/day15.txt b/src/main/resources/2018/day15.txt new file mode 100644 index 00000000..a2c6869a --- /dev/null +++ b/src/main/resources/2018/day15.txt @@ -0,0 +1,32 @@ +################################ +#############..################# +#############..#.############### +############G..G.############### +#############....############### +##############.#...############# +################..############## +#############G.##..#..########## +#############.##.......#..###### +#######.####.G##.......##.###### +######..####.G.......#.##.###### +#####.....#..GG....G......###### +####..###.....#####.......###### +####.........#######..E.G..##### +####.G..G...#########....E.##### +#####....G.G#########.#...###### +###........G#########....####### +##..#.......#########....##.E.## +##.#........#########.#####...## +#............#######..#.......## +#.G...........#####........E..## +#....G........G..G.............# +#..................E#...E...E..# +#....#...##...G...E..........### +#..###...####..........G###E.### +#.###########..E.......######### +#.###############.......######## +#################.......######## +##################....#..####### +##################..####.####### +#################..#####.####### +################################ diff --git a/src/main/resources/2018/day16.txt b/src/main/resources/2018/day16.txt new file mode 100644 index 00000000..f2d279ac --- /dev/null +++ b/src/main/resources/2018/day16.txt @@ -0,0 +1,3938 @@ +Before: [3, 0, 0, 1] +0 3 0 2 +After: [3, 0, 1, 1] + +Before: [2, 0, 0, 2] +4 0 3 1 +After: [2, 1, 0, 2] + +Before: [0, 1, 1, 1] +14 0 0 2 +After: [0, 1, 0, 1] + +Before: [3, 0, 1, 1] +11 0 0 3 +After: [3, 0, 1, 1] + +Before: [1, 2, 2, 0] +9 0 2 1 +After: [1, 0, 2, 0] + +Before: [0, 2, 3, 3] +11 2 2 3 +After: [0, 2, 3, 1] + +Before: [2, 0, 1, 2] +4 0 3 2 +After: [2, 0, 1, 2] + +Before: [2, 0, 2, 2] +6 3 3 3 +After: [2, 0, 2, 0] + +Before: [0, 1, 2, 2] +1 1 2 3 +After: [0, 1, 2, 0] + +Before: [0, 3, 0, 0] +14 0 0 0 +After: [0, 3, 0, 0] + +Before: [2, 2, 0, 2] +4 0 3 3 +After: [2, 2, 0, 1] + +Before: [2, 3, 2, 1] +13 2 2 0 +After: [1, 3, 2, 1] + +Before: [2, 1, 1, 2] +4 0 3 1 +After: [2, 1, 1, 2] + +Before: [1, 2, 2, 1] +9 0 2 0 +After: [0, 2, 2, 1] + +Before: [2, 2, 0, 2] +4 0 3 1 +After: [2, 1, 0, 2] + +Before: [1, 0, 2, 3] +9 0 2 1 +After: [1, 0, 2, 3] + +Before: [1, 1, 3, 2] +10 1 3 1 +After: [1, 0, 3, 2] + +Before: [0, 2, 1, 3] +14 0 0 1 +After: [0, 0, 1, 3] + +Before: [2, 1, 2, 1] +11 0 0 1 +After: [2, 1, 2, 1] + +Before: [1, 1, 2, 2] +3 2 3 1 +After: [1, 2, 2, 2] + +Before: [3, 0, 2, 3] +8 1 0 1 +After: [3, 0, 2, 3] + +Before: [1, 3, 2, 2] +9 0 2 2 +After: [1, 3, 0, 2] + +Before: [2, 0, 3, 2] +4 0 3 2 +After: [2, 0, 1, 2] + +Before: [2, 1, 1, 2] +10 1 3 1 +After: [2, 0, 1, 2] + +Before: [2, 1, 2, 3] +1 1 2 2 +After: [2, 1, 0, 3] + +Before: [3, 1, 2, 1] +1 1 2 3 +After: [3, 1, 2, 0] + +Before: [2, 2, 2, 3] +5 2 2 1 +After: [2, 2, 2, 3] + +Before: [2, 0, 2, 2] +4 0 3 2 +After: [2, 0, 1, 2] + +Before: [2, 3, 1, 1] +11 0 0 0 +After: [1, 3, 1, 1] + +Before: [2, 3, 2, 2] +4 0 3 1 +After: [2, 1, 2, 2] + +Before: [3, 1, 3, 0] +0 1 0 1 +After: [3, 1, 3, 0] + +Before: [3, 1, 2, 3] +12 3 0 3 +After: [3, 1, 2, 1] + +Before: [1, 0, 3, 1] +6 3 3 1 +After: [1, 0, 3, 1] + +Before: [0, 1, 2, 3] +1 1 2 3 +After: [0, 1, 2, 0] + +Before: [1, 2, 1, 3] +2 1 3 1 +After: [1, 0, 1, 3] + +Before: [1, 2, 2, 3] +9 0 2 2 +After: [1, 2, 0, 3] + +Before: [3, 3, 3, 2] +11 0 2 1 +After: [3, 1, 3, 2] + +Before: [2, 1, 0, 2] +10 1 3 3 +After: [2, 1, 0, 0] + +Before: [3, 3, 3, 3] +5 3 3 0 +After: [3, 3, 3, 3] + +Before: [0, 3, 2, 0] +13 0 0 0 +After: [1, 3, 2, 0] + +Before: [3, 0, 2, 2] +3 2 3 3 +After: [3, 0, 2, 2] + +Before: [1, 3, 2, 1] +9 0 2 1 +After: [1, 0, 2, 1] + +Before: [1, 1, 2, 3] +1 1 2 0 +After: [0, 1, 2, 3] + +Before: [1, 1, 0, 2] +15 1 0 1 +After: [1, 1, 0, 2] + +Before: [0, 1, 1, 3] +2 2 3 3 +After: [0, 1, 1, 0] + +Before: [3, 1, 3, 3] +0 3 0 3 +After: [3, 1, 3, 3] + +Before: [0, 0, 3, 3] +14 0 0 3 +After: [0, 0, 3, 0] + +Before: [2, 1, 2, 2] +1 1 2 2 +After: [2, 1, 0, 2] + +Before: [2, 1, 0, 2] +4 0 3 0 +After: [1, 1, 0, 2] + +Before: [2, 1, 2, 1] +7 3 2 0 +After: [1, 1, 2, 1] + +Before: [3, 1, 2, 2] +10 1 3 2 +After: [3, 1, 0, 2] + +Before: [3, 1, 1, 3] +0 1 0 2 +After: [3, 1, 1, 3] + +Before: [3, 0, 2, 1] +7 3 2 0 +After: [1, 0, 2, 1] + +Before: [2, 2, 0, 2] +4 0 3 0 +After: [1, 2, 0, 2] + +Before: [0, 3, 3, 3] +13 3 3 0 +After: [1, 3, 3, 3] + +Before: [2, 1, 2, 3] +5 3 3 3 +After: [2, 1, 2, 3] + +Before: [1, 1, 2, 1] +7 3 2 0 +After: [1, 1, 2, 1] + +Before: [3, 0, 1, 3] +2 2 3 2 +After: [3, 0, 0, 3] + +Before: [0, 2, 2, 1] +14 0 0 2 +After: [0, 2, 0, 1] + +Before: [0, 3, 3, 1] +14 0 0 2 +After: [0, 3, 0, 1] + +Before: [0, 1, 2, 2] +3 2 3 0 +After: [2, 1, 2, 2] + +Before: [0, 3, 2, 0] +14 0 0 1 +After: [0, 0, 2, 0] + +Before: [0, 1, 2, 2] +10 1 3 0 +After: [0, 1, 2, 2] + +Before: [1, 3, 2, 1] +7 3 2 1 +After: [1, 1, 2, 1] + +Before: [1, 0, 2, 3] +9 0 2 3 +After: [1, 0, 2, 0] + +Before: [0, 3, 2, 2] +6 3 3 0 +After: [0, 3, 2, 2] + +Before: [0, 0, 0, 3] +13 3 3 0 +After: [1, 0, 0, 3] + +Before: [2, 0, 2, 2] +3 2 3 0 +After: [2, 0, 2, 2] + +Before: [0, 0, 2, 2] +3 2 3 3 +After: [0, 0, 2, 2] + +Before: [2, 2, 2, 1] +7 3 2 0 +After: [1, 2, 2, 1] + +Before: [3, 3, 1, 3] +0 3 0 2 +After: [3, 3, 3, 3] + +Before: [1, 1, 1, 1] +15 1 0 3 +After: [1, 1, 1, 1] + +Before: [1, 2, 2, 0] +9 0 2 3 +After: [1, 2, 2, 0] + +Before: [2, 2, 2, 1] +12 2 0 2 +After: [2, 2, 1, 1] + +Before: [2, 1, 2, 2] +1 1 2 0 +After: [0, 1, 2, 2] + +Before: [1, 0, 2, 2] +5 2 2 2 +After: [1, 0, 2, 2] + +Before: [0, 0, 2, 2] +3 2 3 1 +After: [0, 2, 2, 2] + +Before: [0, 1, 0, 2] +10 1 3 1 +After: [0, 0, 0, 2] + +Before: [3, 1, 1, 3] +2 2 3 1 +After: [3, 0, 1, 3] + +Before: [0, 2, 1, 0] +8 0 1 3 +After: [0, 2, 1, 0] + +Before: [1, 1, 3, 3] +2 1 3 0 +After: [0, 1, 3, 3] + +Before: [0, 0, 2, 2] +14 0 0 0 +After: [0, 0, 2, 2] + +Before: [1, 2, 2, 3] +9 0 2 3 +After: [1, 2, 2, 0] + +Before: [2, 2, 1, 3] +5 3 3 1 +After: [2, 3, 1, 3] + +Before: [2, 2, 2, 2] +4 0 3 0 +After: [1, 2, 2, 2] + +Before: [0, 0, 3, 0] +14 0 0 3 +After: [0, 0, 3, 0] + +Before: [3, 2, 2, 0] +12 2 1 1 +After: [3, 1, 2, 0] + +Before: [2, 1, 1, 2] +4 0 3 2 +After: [2, 1, 1, 2] + +Before: [3, 2, 2, 3] +5 3 3 3 +After: [3, 2, 2, 3] + +Before: [3, 2, 2, 2] +3 2 3 0 +After: [2, 2, 2, 2] + +Before: [0, 0, 0, 1] +6 3 3 0 +After: [0, 0, 0, 1] + +Before: [1, 1, 0, 0] +15 1 0 1 +After: [1, 1, 0, 0] + +Before: [0, 0, 1, 1] +14 0 0 2 +After: [0, 0, 0, 1] + +Before: [1, 3, 0, 3] +13 3 3 1 +After: [1, 1, 0, 3] + +Before: [1, 1, 3, 1] +15 1 0 3 +After: [1, 1, 3, 1] + +Before: [1, 1, 2, 1] +5 2 2 2 +After: [1, 1, 2, 1] + +Before: [3, 2, 2, 1] +7 3 2 1 +After: [3, 1, 2, 1] + +Before: [1, 1, 2, 0] +15 1 0 2 +After: [1, 1, 1, 0] + +Before: [0, 0, 3, 0] +11 2 2 0 +After: [1, 0, 3, 0] + +Before: [0, 2, 2, 3] +12 2 1 2 +After: [0, 2, 1, 3] + +Before: [0, 0, 3, 2] +14 0 0 3 +After: [0, 0, 3, 0] + +Before: [1, 3, 2, 3] +13 2 2 2 +After: [1, 3, 1, 3] + +Before: [1, 1, 2, 1] +7 3 2 3 +After: [1, 1, 2, 1] + +Before: [0, 1, 3, 0] +8 0 1 1 +After: [0, 0, 3, 0] + +Before: [1, 0, 2, 2] +9 0 2 0 +After: [0, 0, 2, 2] + +Before: [0, 1, 0, 3] +8 0 1 3 +After: [0, 1, 0, 0] + +Before: [0, 2, 1, 3] +2 1 3 3 +After: [0, 2, 1, 0] + +Before: [2, 3, 2, 3] +11 0 0 0 +After: [1, 3, 2, 3] + +Before: [0, 0, 2, 1] +6 3 3 3 +After: [0, 0, 2, 0] + +Before: [2, 2, 3, 2] +11 0 0 0 +After: [1, 2, 3, 2] + +Before: [3, 1, 2, 1] +7 3 2 1 +After: [3, 1, 2, 1] + +Before: [0, 2, 2, 1] +7 3 2 1 +After: [0, 1, 2, 1] + +Before: [0, 1, 0, 3] +14 0 0 1 +After: [0, 0, 0, 3] + +Before: [1, 1, 2, 1] +9 0 2 3 +After: [1, 1, 2, 0] + +Before: [0, 3, 3, 3] +8 0 1 3 +After: [0, 3, 3, 0] + +Before: [0, 3, 0, 3] +13 3 3 3 +After: [0, 3, 0, 1] + +Before: [0, 2, 2, 3] +8 0 3 0 +After: [0, 2, 2, 3] + +Before: [2, 3, 2, 1] +12 2 0 0 +After: [1, 3, 2, 1] + +Before: [0, 3, 3, 0] +8 0 1 0 +After: [0, 3, 3, 0] + +Before: [1, 1, 1, 2] +10 1 3 3 +After: [1, 1, 1, 0] + +Before: [0, 3, 1, 1] +8 0 3 0 +After: [0, 3, 1, 1] + +Before: [2, 1, 3, 3] +2 1 3 0 +After: [0, 1, 3, 3] + +Before: [1, 1, 2, 3] +1 1 2 2 +After: [1, 1, 0, 3] + +Before: [3, 3, 2, 3] +2 2 3 3 +After: [3, 3, 2, 0] + +Before: [0, 1, 1, 3] +13 3 2 0 +After: [0, 1, 1, 3] + +Before: [0, 2, 0, 2] +13 0 0 1 +After: [0, 1, 0, 2] + +Before: [3, 1, 2, 3] +1 1 2 0 +After: [0, 1, 2, 3] + +Before: [0, 3, 3, 3] +11 2 2 1 +After: [0, 1, 3, 3] + +Before: [0, 2, 3, 2] +8 0 2 3 +After: [0, 2, 3, 0] + +Before: [3, 1, 1, 0] +0 1 0 0 +After: [1, 1, 1, 0] + +Before: [2, 1, 2, 1] +0 2 0 3 +After: [2, 1, 2, 2] + +Before: [0, 1, 2, 3] +13 3 3 1 +After: [0, 1, 2, 3] + +Before: [1, 0, 2, 0] +9 0 2 3 +After: [1, 0, 2, 0] + +Before: [3, 1, 2, 0] +11 0 0 0 +After: [1, 1, 2, 0] + +Before: [0, 2, 1, 0] +14 0 0 1 +After: [0, 0, 1, 0] + +Before: [2, 1, 3, 2] +4 0 3 3 +After: [2, 1, 3, 1] + +Before: [0, 2, 2, 3] +2 1 3 0 +After: [0, 2, 2, 3] + +Before: [2, 3, 3, 1] +11 2 2 1 +After: [2, 1, 3, 1] + +Before: [0, 2, 2, 1] +12 2 1 2 +After: [0, 2, 1, 1] + +Before: [2, 3, 2, 2] +3 2 3 2 +After: [2, 3, 2, 2] + +Before: [2, 3, 3, 2] +4 0 3 0 +After: [1, 3, 3, 2] + +Before: [3, 1, 3, 3] +0 3 0 0 +After: [3, 1, 3, 3] + +Before: [0, 2, 1, 3] +8 0 3 2 +After: [0, 2, 0, 3] + +Before: [2, 1, 2, 2] +3 2 3 3 +After: [2, 1, 2, 2] + +Before: [2, 2, 2, 2] +12 2 1 1 +After: [2, 1, 2, 2] + +Before: [2, 1, 2, 2] +3 2 3 1 +After: [2, 2, 2, 2] + +Before: [3, 0, 3, 3] +0 3 0 2 +After: [3, 0, 3, 3] + +Before: [1, 0, 3, 0] +11 2 2 3 +After: [1, 0, 3, 1] + +Before: [0, 2, 2, 0] +12 2 1 1 +After: [0, 1, 2, 0] + +Before: [1, 1, 0, 0] +15 1 0 2 +After: [1, 1, 1, 0] + +Before: [2, 1, 0, 2] +4 0 3 1 +After: [2, 1, 0, 2] + +Before: [1, 2, 2, 3] +2 2 3 2 +After: [1, 2, 0, 3] + +Before: [3, 1, 2, 3] +2 1 3 1 +After: [3, 0, 2, 3] + +Before: [1, 1, 1, 3] +15 1 0 2 +After: [1, 1, 1, 3] + +Before: [1, 2, 3, 0] +11 2 2 3 +After: [1, 2, 3, 1] + +Before: [1, 1, 0, 2] +15 1 0 2 +After: [1, 1, 1, 2] + +Before: [3, 1, 3, 2] +10 1 3 3 +After: [3, 1, 3, 0] + +Before: [1, 1, 2, 2] +3 2 3 0 +After: [2, 1, 2, 2] + +Before: [2, 1, 2, 1] +1 1 2 1 +After: [2, 0, 2, 1] + +Before: [3, 1, 3, 1] +0 1 0 2 +After: [3, 1, 1, 1] + +Before: [3, 1, 1, 2] +0 1 0 2 +After: [3, 1, 1, 2] + +Before: [1, 3, 3, 1] +12 2 3 2 +After: [1, 3, 0, 1] + +Before: [3, 1, 1, 2] +10 1 3 3 +After: [3, 1, 1, 0] + +Before: [1, 1, 1, 2] +10 1 3 0 +After: [0, 1, 1, 2] + +Before: [0, 1, 0, 2] +8 0 3 3 +After: [0, 1, 0, 0] + +Before: [3, 0, 0, 3] +5 3 3 1 +After: [3, 3, 0, 3] + +Before: [1, 1, 2, 2] +1 1 2 1 +After: [1, 0, 2, 2] + +Before: [0, 0, 1, 1] +6 3 3 3 +After: [0, 0, 1, 0] + +Before: [1, 2, 2, 2] +6 3 3 3 +After: [1, 2, 2, 0] + +Before: [2, 3, 2, 1] +7 3 2 3 +After: [2, 3, 2, 1] + +Before: [3, 3, 1, 1] +11 0 0 0 +After: [1, 3, 1, 1] + +Before: [3, 0, 2, 1] +7 3 2 2 +After: [3, 0, 1, 1] + +Before: [2, 0, 3, 2] +4 0 3 1 +After: [2, 1, 3, 2] + +Before: [2, 3, 2, 1] +5 2 2 1 +After: [2, 2, 2, 1] + +Before: [1, 1, 0, 2] +10 1 3 3 +After: [1, 1, 0, 0] + +Before: [0, 3, 1, 3] +8 0 2 1 +After: [0, 0, 1, 3] + +Before: [2, 0, 1, 2] +4 0 3 1 +After: [2, 1, 1, 2] + +Before: [1, 3, 3, 3] +5 3 3 0 +After: [3, 3, 3, 3] + +Before: [2, 2, 2, 2] +4 0 3 3 +After: [2, 2, 2, 1] + +Before: [3, 1, 2, 0] +1 1 2 1 +After: [3, 0, 2, 0] + +Before: [1, 3, 3, 1] +6 3 3 3 +After: [1, 3, 3, 0] + +Before: [1, 1, 3, 1] +15 1 0 2 +After: [1, 1, 1, 1] + +Before: [1, 1, 1, 1] +15 1 0 1 +After: [1, 1, 1, 1] + +Before: [1, 3, 2, 3] +5 3 3 0 +After: [3, 3, 2, 3] + +Before: [2, 0, 2, 1] +7 3 2 2 +After: [2, 0, 1, 1] + +Before: [0, 1, 1, 2] +10 1 3 2 +After: [0, 1, 0, 2] + +Before: [0, 2, 1, 3] +2 2 3 2 +After: [0, 2, 0, 3] + +Before: [1, 1, 2, 0] +1 1 2 2 +After: [1, 1, 0, 0] + +Before: [1, 0, 1, 3] +2 2 3 2 +After: [1, 0, 0, 3] + +Before: [3, 1, 0, 3] +0 3 0 3 +After: [3, 1, 0, 3] + +Before: [0, 2, 0, 1] +8 0 3 0 +After: [0, 2, 0, 1] + +Before: [3, 1, 1, 0] +11 0 0 1 +After: [3, 1, 1, 0] + +Before: [1, 2, 2, 2] +6 3 3 1 +After: [1, 0, 2, 2] + +Before: [1, 2, 1, 3] +2 2 3 3 +After: [1, 2, 1, 0] + +Before: [0, 3, 3, 2] +14 0 0 1 +After: [0, 0, 3, 2] + +Before: [2, 2, 2, 1] +7 3 2 2 +After: [2, 2, 1, 1] + +Before: [2, 2, 0, 2] +4 0 3 2 +After: [2, 2, 1, 2] + +Before: [0, 1, 1, 3] +8 0 2 1 +After: [0, 0, 1, 3] + +Before: [2, 1, 1, 2] +10 1 3 3 +After: [2, 1, 1, 0] + +Before: [3, 0, 2, 3] +13 3 2 1 +After: [3, 0, 2, 3] + +Before: [0, 3, 2, 1] +14 0 0 3 +After: [0, 3, 2, 0] + +Before: [2, 3, 2, 1] +5 2 2 0 +After: [2, 3, 2, 1] + +Before: [2, 1, 2, 3] +2 2 3 0 +After: [0, 1, 2, 3] + +Before: [0, 1, 3, 2] +10 1 3 1 +After: [0, 0, 3, 2] + +Before: [1, 1, 2, 0] +9 0 2 2 +After: [1, 1, 0, 0] + +Before: [0, 3, 0, 3] +14 0 0 0 +After: [0, 3, 0, 3] + +Before: [0, 2, 0, 3] +2 1 3 0 +After: [0, 2, 0, 3] + +Before: [0, 0, 2, 1] +13 2 2 3 +After: [0, 0, 2, 1] + +Before: [0, 1, 2, 2] +1 1 2 2 +After: [0, 1, 0, 2] + +Before: [3, 1, 3, 3] +2 1 3 3 +After: [3, 1, 3, 0] + +Before: [0, 3, 2, 0] +5 2 2 0 +After: [2, 3, 2, 0] + +Before: [1, 2, 2, 1] +9 0 2 1 +After: [1, 0, 2, 1] + +Before: [1, 3, 2, 3] +2 2 3 3 +After: [1, 3, 2, 0] + +Before: [2, 3, 0, 2] +4 0 3 3 +After: [2, 3, 0, 1] + +Before: [2, 2, 3, 1] +12 2 3 0 +After: [0, 2, 3, 1] + +Before: [0, 1, 2, 2] +13 0 0 1 +After: [0, 1, 2, 2] + +Before: [1, 0, 2, 1] +7 3 2 2 +After: [1, 0, 1, 1] + +Before: [0, 3, 3, 0] +14 0 0 2 +After: [0, 3, 0, 0] + +Before: [3, 0, 3, 1] +11 0 2 0 +After: [1, 0, 3, 1] + +Before: [1, 2, 0, 1] +6 3 3 0 +After: [0, 2, 0, 1] + +Before: [2, 1, 2, 1] +1 1 2 0 +After: [0, 1, 2, 1] + +Before: [3, 3, 2, 3] +0 3 0 0 +After: [3, 3, 2, 3] + +Before: [0, 3, 2, 3] +5 3 3 0 +After: [3, 3, 2, 3] + +Before: [0, 1, 3, 3] +14 0 0 3 +After: [0, 1, 3, 0] + +Before: [0, 0, 3, 1] +13 0 0 1 +After: [0, 1, 3, 1] + +Before: [0, 3, 2, 2] +3 2 3 2 +After: [0, 3, 2, 2] + +Before: [2, 2, 2, 3] +2 1 3 0 +After: [0, 2, 2, 3] + +Before: [2, 2, 2, 3] +12 2 1 0 +After: [1, 2, 2, 3] + +Before: [0, 0, 1, 0] +14 0 0 3 +After: [0, 0, 1, 0] + +Before: [1, 1, 1, 2] +15 1 0 0 +After: [1, 1, 1, 2] + +Before: [2, 0, 2, 1] +7 3 2 0 +After: [1, 0, 2, 1] + +Before: [3, 0, 2, 1] +11 0 0 3 +After: [3, 0, 2, 1] + +Before: [3, 1, 2, 2] +10 1 3 3 +After: [3, 1, 2, 0] + +Before: [0, 1, 2, 3] +13 3 1 0 +After: [0, 1, 2, 3] + +Before: [0, 1, 0, 3] +14 0 0 3 +After: [0, 1, 0, 0] + +Before: [0, 3, 2, 3] +8 0 2 3 +After: [0, 3, 2, 0] + +Before: [1, 3, 2, 2] +9 0 2 0 +After: [0, 3, 2, 2] + +Before: [1, 0, 2, 1] +9 0 2 1 +After: [1, 0, 2, 1] + +Before: [0, 1, 0, 3] +2 1 3 1 +After: [0, 0, 0, 3] + +Before: [0, 0, 2, 3] +14 0 0 0 +After: [0, 0, 2, 3] + +Before: [2, 2, 2, 1] +12 2 1 0 +After: [1, 2, 2, 1] + +Before: [3, 3, 3, 1] +0 3 0 3 +After: [3, 3, 3, 1] + +Before: [3, 3, 0, 1] +0 3 0 1 +After: [3, 1, 0, 1] + +Before: [0, 1, 2, 3] +1 1 2 0 +After: [0, 1, 2, 3] + +Before: [3, 3, 3, 3] +0 3 0 3 +After: [3, 3, 3, 3] + +Before: [1, 0, 2, 2] +3 2 3 1 +After: [1, 2, 2, 2] + +Before: [1, 2, 2, 2] +12 2 1 3 +After: [1, 2, 2, 1] + +Before: [0, 1, 1, 2] +10 1 3 1 +After: [0, 0, 1, 2] + +Before: [1, 0, 2, 2] +9 0 2 2 +After: [1, 0, 0, 2] + +Before: [1, 1, 2, 2] +10 1 3 1 +After: [1, 0, 2, 2] + +Before: [3, 3, 1, 1] +0 3 0 1 +After: [3, 1, 1, 1] + +Before: [2, 1, 2, 2] +12 2 0 0 +After: [1, 1, 2, 2] + +Before: [2, 0, 3, 2] +4 0 3 0 +After: [1, 0, 3, 2] + +Before: [2, 2, 3, 2] +4 0 3 3 +After: [2, 2, 3, 1] + +Before: [2, 3, 3, 3] +13 3 3 2 +After: [2, 3, 1, 3] + +Before: [3, 3, 2, 1] +7 3 2 1 +After: [3, 1, 2, 1] + +Before: [0, 3, 2, 0] +8 0 2 2 +After: [0, 3, 0, 0] + +Before: [0, 1, 3, 2] +13 2 1 1 +After: [0, 0, 3, 2] + +Before: [0, 1, 2, 2] +13 0 0 0 +After: [1, 1, 2, 2] + +Before: [2, 2, 1, 3] +2 1 3 0 +After: [0, 2, 1, 3] + +Before: [1, 1, 1, 0] +15 1 0 1 +After: [1, 1, 1, 0] + +Before: [2, 2, 2, 2] +3 2 3 2 +After: [2, 2, 2, 2] + +Before: [1, 1, 2, 3] +15 1 0 3 +After: [1, 1, 2, 1] + +Before: [2, 0, 3, 2] +4 0 3 3 +After: [2, 0, 3, 1] + +Before: [3, 0, 3, 3] +0 3 0 3 +After: [3, 0, 3, 3] + +Before: [0, 2, 1, 1] +8 0 2 1 +After: [0, 0, 1, 1] + +Before: [1, 3, 2, 0] +5 2 2 3 +After: [1, 3, 2, 2] + +Before: [0, 2, 2, 1] +6 3 3 1 +After: [0, 0, 2, 1] + +Before: [1, 1, 3, 0] +15 1 0 1 +After: [1, 1, 3, 0] + +Before: [2, 0, 1, 3] +5 3 3 0 +After: [3, 0, 1, 3] + +Before: [1, 1, 2, 1] +15 1 0 1 +After: [1, 1, 2, 1] + +Before: [2, 1, 2, 2] +3 2 3 0 +After: [2, 1, 2, 2] + +Before: [1, 1, 3, 2] +15 1 0 3 +After: [1, 1, 3, 1] + +Before: [0, 2, 1, 1] +14 0 0 0 +After: [0, 2, 1, 1] + +Before: [0, 0, 2, 0] +5 2 2 1 +After: [0, 2, 2, 0] + +Before: [0, 1, 2, 3] +2 1 3 2 +After: [0, 1, 0, 3] + +Before: [3, 1, 2, 2] +3 2 3 0 +After: [2, 1, 2, 2] + +Before: [1, 2, 2, 2] +9 0 2 2 +After: [1, 2, 0, 2] + +Before: [2, 2, 2, 1] +5 2 2 1 +After: [2, 2, 2, 1] + +Before: [1, 1, 2, 1] +7 3 2 1 +After: [1, 1, 2, 1] + +Before: [3, 0, 0, 1] +0 3 0 3 +After: [3, 0, 0, 1] + +Before: [3, 2, 3, 3] +12 3 0 3 +After: [3, 2, 3, 1] + +Before: [3, 1, 2, 2] +10 1 3 1 +After: [3, 0, 2, 2] + +Before: [1, 0, 1, 3] +13 3 2 1 +After: [1, 0, 1, 3] + +Before: [0, 0, 0, 2] +14 0 0 1 +After: [0, 0, 0, 2] + +Before: [3, 0, 3, 1] +0 3 0 1 +After: [3, 1, 3, 1] + +Before: [1, 1, 2, 3] +1 1 2 3 +After: [1, 1, 2, 0] + +Before: [3, 1, 2, 1] +1 1 2 1 +After: [3, 0, 2, 1] + +Before: [3, 3, 0, 3] +13 3 3 2 +After: [3, 3, 1, 3] + +Before: [3, 3, 2, 3] +2 2 3 2 +After: [3, 3, 0, 3] + +Before: [1, 2, 2, 1] +9 0 2 2 +After: [1, 2, 0, 1] + +Before: [3, 1, 0, 1] +0 3 0 1 +After: [3, 1, 0, 1] + +Before: [2, 2, 3, 2] +4 0 3 0 +After: [1, 2, 3, 2] + +Before: [2, 0, 2, 1] +7 3 2 1 +After: [2, 1, 2, 1] + +Before: [1, 1, 2, 2] +9 0 2 2 +After: [1, 1, 0, 2] + +Before: [0, 1, 3, 2] +6 3 3 2 +After: [0, 1, 0, 2] + +Before: [3, 3, 0, 2] +6 3 3 3 +After: [3, 3, 0, 0] + +Before: [3, 1, 3, 1] +11 0 2 2 +After: [3, 1, 1, 1] + +Before: [0, 1, 2, 1] +7 3 2 3 +After: [0, 1, 2, 1] + +Before: [1, 2, 2, 1] +7 3 2 1 +After: [1, 1, 2, 1] + +Before: [3, 1, 0, 2] +10 1 3 2 +After: [3, 1, 0, 2] + +Before: [0, 1, 3, 2] +14 0 0 2 +After: [0, 1, 0, 2] + +Before: [0, 3, 0, 2] +14 0 0 1 +After: [0, 0, 0, 2] + +Before: [0, 1, 2, 1] +1 1 2 3 +After: [0, 1, 2, 0] + +Before: [1, 1, 2, 1] +9 0 2 1 +After: [1, 0, 2, 1] + +Before: [0, 1, 2, 2] +10 1 3 2 +After: [0, 1, 0, 2] + +Before: [1, 0, 2, 2] +3 2 3 2 +After: [1, 0, 2, 2] + +Before: [2, 3, 3, 1] +12 2 3 3 +After: [2, 3, 3, 0] + +Before: [2, 0, 3, 1] +12 2 3 0 +After: [0, 0, 3, 1] + +Before: [2, 1, 2, 1] +7 3 2 2 +After: [2, 1, 1, 1] + +Before: [3, 3, 2, 2] +3 2 3 0 +After: [2, 3, 2, 2] + +Before: [0, 1, 0, 1] +8 0 1 1 +After: [0, 0, 0, 1] + +Before: [1, 1, 2, 1] +6 3 3 2 +After: [1, 1, 0, 1] + +Before: [0, 1, 2, 2] +1 1 2 0 +After: [0, 1, 2, 2] + +Before: [3, 3, 1, 3] +2 2 3 2 +After: [3, 3, 0, 3] + +Before: [3, 2, 1, 3] +5 3 3 1 +After: [3, 3, 1, 3] + +Before: [2, 1, 2, 2] +4 0 3 0 +After: [1, 1, 2, 2] + +Before: [3, 3, 2, 2] +13 2 2 2 +After: [3, 3, 1, 2] + +Before: [2, 1, 3, 2] +4 0 3 2 +After: [2, 1, 1, 2] + +Before: [3, 0, 2, 2] +3 2 3 1 +After: [3, 2, 2, 2] + +Before: [2, 0, 1, 2] +4 0 3 3 +After: [2, 0, 1, 1] + +Before: [3, 2, 2, 0] +5 2 2 3 +After: [3, 2, 2, 2] + +Before: [0, 0, 3, 3] +5 3 3 3 +After: [0, 0, 3, 3] + +Before: [0, 1, 0, 3] +13 3 1 0 +After: [0, 1, 0, 3] + +Before: [2, 2, 3, 2] +4 0 3 2 +After: [2, 2, 1, 2] + +Before: [0, 3, 0, 1] +14 0 0 2 +After: [0, 3, 0, 1] + +Before: [3, 3, 3, 0] +11 0 0 2 +After: [3, 3, 1, 0] + +Before: [0, 3, 3, 3] +14 0 0 1 +After: [0, 0, 3, 3] + +Before: [2, 2, 1, 1] +6 3 3 2 +After: [2, 2, 0, 1] + +Before: [3, 2, 0, 3] +5 3 3 0 +After: [3, 2, 0, 3] + +Before: [2, 2, 2, 3] +2 1 3 1 +After: [2, 0, 2, 3] + +Before: [2, 3, 2, 2] +3 2 3 1 +After: [2, 2, 2, 2] + +Before: [0, 1, 2, 1] +7 3 2 1 +After: [0, 1, 2, 1] + +Before: [0, 1, 2, 2] +3 2 3 1 +After: [0, 2, 2, 2] + +Before: [3, 1, 2, 0] +0 1 0 2 +After: [3, 1, 1, 0] + +Before: [2, 2, 2, 0] +0 2 0 1 +After: [2, 2, 2, 0] + +Before: [1, 1, 3, 0] +15 1 0 0 +After: [1, 1, 3, 0] + +Before: [0, 3, 0, 3] +5 3 3 0 +After: [3, 3, 0, 3] + +Before: [3, 3, 3, 3] +0 3 0 0 +After: [3, 3, 3, 3] + +Before: [3, 0, 2, 0] +5 2 2 2 +After: [3, 0, 2, 0] + +Before: [2, 3, 2, 2] +6 3 3 0 +After: [0, 3, 2, 2] + +Before: [1, 0, 2, 3] +9 0 2 0 +After: [0, 0, 2, 3] + +Before: [2, 3, 2, 0] +5 2 2 1 +After: [2, 2, 2, 0] + +Before: [3, 3, 3, 1] +12 2 3 3 +After: [3, 3, 3, 0] + +Before: [1, 1, 1, 3] +2 2 3 2 +After: [1, 1, 0, 3] + +Before: [3, 1, 1, 2] +11 0 0 2 +After: [3, 1, 1, 2] + +Before: [1, 1, 0, 2] +15 1 0 3 +After: [1, 1, 0, 1] + +Before: [1, 1, 1, 1] +15 1 0 2 +After: [1, 1, 1, 1] + +Before: [0, 1, 0, 3] +2 1 3 2 +After: [0, 1, 0, 3] + +Before: [2, 0, 2, 2] +3 2 3 2 +After: [2, 0, 2, 2] + +Before: [0, 3, 3, 3] +11 2 2 3 +After: [0, 3, 3, 1] + +Before: [0, 1, 2, 2] +3 2 3 3 +After: [0, 1, 2, 2] + +Before: [0, 3, 3, 0] +8 0 1 1 +After: [0, 0, 3, 0] + +Before: [3, 1, 3, 2] +10 1 3 1 +After: [3, 0, 3, 2] + +Before: [3, 2, 2, 3] +12 2 1 2 +After: [3, 2, 1, 3] + +Before: [3, 2, 2, 0] +5 2 2 0 +After: [2, 2, 2, 0] + +Before: [3, 1, 1, 2] +10 1 3 1 +After: [3, 0, 1, 2] + +Before: [3, 0, 3, 1] +11 0 2 2 +After: [3, 0, 1, 1] + +Before: [3, 1, 0, 3] +0 1 0 1 +After: [3, 1, 0, 3] + +Before: [0, 1, 2, 1] +7 3 2 2 +After: [0, 1, 1, 1] + +Before: [2, 1, 2, 0] +12 2 0 1 +After: [2, 1, 2, 0] + +Before: [0, 1, 0, 2] +14 0 0 2 +After: [0, 1, 0, 2] + +Before: [2, 3, 2, 1] +0 2 0 3 +After: [2, 3, 2, 2] + +Before: [1, 1, 0, 2] +10 1 3 1 +After: [1, 0, 0, 2] + +Before: [3, 1, 2, 3] +13 3 3 2 +After: [3, 1, 1, 3] + +Before: [2, 3, 2, 3] +0 2 0 1 +After: [2, 2, 2, 3] + +Before: [3, 1, 2, 3] +1 1 2 3 +After: [3, 1, 2, 0] + +Before: [2, 2, 1, 2] +4 0 3 0 +After: [1, 2, 1, 2] + +Before: [0, 0, 3, 1] +14 0 0 0 +After: [0, 0, 3, 1] + +Before: [3, 2, 3, 0] +11 0 2 3 +After: [3, 2, 3, 1] + +Before: [2, 1, 1, 1] +11 0 0 1 +After: [2, 1, 1, 1] + +Before: [3, 2, 2, 2] +12 2 1 2 +After: [3, 2, 1, 2] + +Before: [0, 1, 3, 2] +10 1 3 2 +After: [0, 1, 0, 2] + +Before: [1, 1, 2, 2] +15 1 0 1 +After: [1, 1, 2, 2] + +Before: [0, 0, 3, 3] +8 0 2 3 +After: [0, 0, 3, 0] + +Before: [2, 0, 0, 0] +11 0 0 1 +After: [2, 1, 0, 0] + +Before: [3, 2, 3, 3] +0 3 0 2 +After: [3, 2, 3, 3] + +Before: [2, 2, 2, 2] +4 0 3 2 +After: [2, 2, 1, 2] + +Before: [1, 1, 1, 3] +15 1 0 0 +After: [1, 1, 1, 3] + +Before: [0, 1, 2, 0] +8 0 1 0 +After: [0, 1, 2, 0] + +Before: [3, 1, 3, 1] +12 2 3 0 +After: [0, 1, 3, 1] + +Before: [1, 1, 2, 2] +3 2 3 2 +After: [1, 1, 2, 2] + +Before: [3, 1, 2, 2] +3 2 3 1 +After: [3, 2, 2, 2] + +Before: [1, 1, 0, 1] +15 1 0 0 +After: [1, 1, 0, 1] + +Before: [2, 3, 1, 3] +2 2 3 3 +After: [2, 3, 1, 0] + +Before: [2, 0, 3, 1] +12 2 3 2 +After: [2, 0, 0, 1] + +Before: [2, 0, 0, 3] +8 1 0 0 +After: [0, 0, 0, 3] + +Before: [1, 1, 2, 0] +15 1 0 0 +After: [1, 1, 2, 0] + +Before: [3, 0, 0, 0] +8 2 0 3 +After: [3, 0, 0, 0] + +Before: [2, 0, 2, 2] +0 2 0 3 +After: [2, 0, 2, 2] + +Before: [2, 0, 2, 2] +4 0 3 3 +After: [2, 0, 2, 1] + +Before: [0, 2, 2, 1] +7 3 2 2 +After: [0, 2, 1, 1] + +Before: [2, 2, 0, 1] +6 3 3 1 +After: [2, 0, 0, 1] + +Before: [2, 1, 1, 2] +10 1 3 2 +After: [2, 1, 0, 2] + +Before: [2, 0, 1, 3] +2 2 3 0 +After: [0, 0, 1, 3] + +Before: [2, 0, 0, 2] +4 0 3 3 +After: [2, 0, 0, 1] + +Before: [1, 2, 2, 2] +3 2 3 0 +After: [2, 2, 2, 2] + +Before: [0, 3, 2, 1] +8 0 1 0 +After: [0, 3, 2, 1] + +Before: [0, 2, 2, 3] +8 0 3 2 +After: [0, 2, 0, 3] + +Before: [0, 2, 2, 0] +5 2 2 3 +After: [0, 2, 2, 2] + +Before: [3, 0, 3, 1] +12 2 3 0 +After: [0, 0, 3, 1] + +Before: [0, 2, 1, 3] +2 1 3 0 +After: [0, 2, 1, 3] + +Before: [1, 1, 2, 2] +1 1 2 0 +After: [0, 1, 2, 2] + +Before: [2, 0, 2, 0] +0 2 0 2 +After: [2, 0, 2, 0] + +Before: [0, 1, 3, 2] +10 1 3 3 +After: [0, 1, 3, 0] + +Before: [1, 1, 2, 0] +15 1 0 3 +After: [1, 1, 2, 1] + +Before: [2, 1, 2, 3] +1 1 2 0 +After: [0, 1, 2, 3] + +Before: [1, 3, 1, 3] +2 2 3 3 +After: [1, 3, 1, 0] + +Before: [2, 3, 2, 0] +12 2 0 1 +After: [2, 1, 2, 0] + +Before: [3, 0, 3, 3] +12 3 0 2 +After: [3, 0, 1, 3] + +Before: [3, 1, 1, 3] +2 2 3 0 +After: [0, 1, 1, 3] + +Before: [3, 2, 2, 3] +2 1 3 3 +After: [3, 2, 2, 0] + +Before: [2, 2, 2, 1] +7 3 2 3 +After: [2, 2, 2, 1] + +Before: [1, 1, 1, 1] +6 2 3 3 +After: [1, 1, 1, 0] + +Before: [2, 3, 2, 3] +5 2 2 2 +After: [2, 3, 2, 3] + +Before: [2, 3, 2, 2] +4 0 3 0 +After: [1, 3, 2, 2] + +Before: [0, 1, 2, 1] +13 2 2 2 +After: [0, 1, 1, 1] + +Before: [1, 3, 2, 2] +9 0 2 3 +After: [1, 3, 2, 0] + +Before: [0, 0, 0, 3] +14 0 0 1 +After: [0, 0, 0, 3] + +Before: [0, 2, 0, 0] +14 0 0 2 +After: [0, 2, 0, 0] + +Before: [1, 3, 2, 1] +9 0 2 3 +After: [1, 3, 2, 0] + +Before: [3, 2, 2, 3] +13 3 2 1 +After: [3, 0, 2, 3] + +Before: [1, 0, 2, 0] +9 0 2 0 +After: [0, 0, 2, 0] + +Before: [0, 3, 2, 1] +5 2 2 1 +After: [0, 2, 2, 1] + +Before: [3, 1, 2, 3] +1 1 2 1 +After: [3, 0, 2, 3] + +Before: [0, 3, 1, 2] +14 0 0 2 +After: [0, 3, 0, 2] + +Before: [2, 1, 1, 3] +13 3 2 1 +After: [2, 0, 1, 3] + +Before: [0, 0, 2, 2] +6 3 3 3 +After: [0, 0, 2, 0] + +Before: [0, 1, 3, 0] +8 0 2 0 +After: [0, 1, 3, 0] + +Before: [1, 1, 1, 2] +15 1 0 2 +After: [1, 1, 1, 2] + +Before: [0, 1, 3, 2] +8 0 2 3 +After: [0, 1, 3, 0] + +Before: [1, 1, 3, 3] +15 1 0 0 +After: [1, 1, 3, 3] + +Before: [2, 2, 1, 2] +11 0 1 0 +After: [1, 2, 1, 2] + +Before: [1, 0, 2, 2] +3 2 3 0 +After: [2, 0, 2, 2] + +Before: [0, 0, 2, 2] +3 2 3 0 +After: [2, 0, 2, 2] + +Before: [2, 2, 2, 2] +3 2 3 0 +After: [2, 2, 2, 2] + +Before: [2, 2, 2, 0] +12 2 0 0 +After: [1, 2, 2, 0] + +Before: [0, 1, 1, 2] +10 1 3 0 +After: [0, 1, 1, 2] + +Before: [0, 0, 0, 2] +14 0 0 3 +After: [0, 0, 0, 0] + +Before: [1, 3, 3, 3] +13 3 3 2 +After: [1, 3, 1, 3] + +Before: [3, 2, 2, 3] +5 3 3 0 +After: [3, 2, 2, 3] + +Before: [1, 1, 3, 1] +15 1 0 1 +After: [1, 1, 3, 1] + +Before: [2, 3, 2, 2] +4 0 3 2 +After: [2, 3, 1, 2] + +Before: [3, 3, 2, 3] +0 3 0 1 +After: [3, 3, 2, 3] + +Before: [1, 1, 2, 0] +9 0 2 3 +After: [1, 1, 2, 0] + +Before: [1, 2, 2, 0] +9 0 2 2 +After: [1, 2, 0, 0] + +Before: [0, 3, 2, 1] +7 3 2 1 +After: [0, 1, 2, 1] + +Before: [2, 0, 2, 3] +5 2 2 0 +After: [2, 0, 2, 3] + +Before: [2, 0, 0, 2] +4 0 3 2 +After: [2, 0, 1, 2] + +Before: [3, 3, 1, 1] +0 3 0 2 +After: [3, 3, 1, 1] + +Before: [0, 3, 3, 0] +14 0 0 1 +After: [0, 0, 3, 0] + +Before: [3, 2, 1, 1] +0 3 0 1 +After: [3, 1, 1, 1] + +Before: [1, 1, 2, 2] +15 1 0 0 +After: [1, 1, 2, 2] + +Before: [2, 2, 1, 2] +6 3 3 0 +After: [0, 2, 1, 2] + +Before: [2, 1, 2, 2] +4 0 3 2 +After: [2, 1, 1, 2] + +Before: [1, 1, 1, 2] +10 1 3 1 +After: [1, 0, 1, 2] + +Before: [1, 1, 0, 0] +15 1 0 0 +After: [1, 1, 0, 0] + +Before: [1, 2, 2, 3] +9 0 2 1 +After: [1, 0, 2, 3] + +Before: [2, 0, 1, 2] +4 0 3 0 +After: [1, 0, 1, 2] + +Before: [1, 3, 3, 3] +12 3 2 3 +After: [1, 3, 3, 1] + +Before: [3, 1, 1, 2] +0 1 0 0 +After: [1, 1, 1, 2] + +Before: [3, 0, 2, 1] +0 3 0 3 +After: [3, 0, 2, 1] + +Before: [3, 3, 0, 1] +0 3 0 0 +After: [1, 3, 0, 1] + +Before: [1, 3, 3, 2] +6 3 3 2 +After: [1, 3, 0, 2] + +Before: [0, 2, 1, 0] +8 0 2 2 +After: [0, 2, 0, 0] + +Before: [2, 2, 2, 0] +12 2 0 2 +After: [2, 2, 1, 0] + +Before: [2, 1, 2, 3] +5 2 2 0 +After: [2, 1, 2, 3] + +Before: [0, 0, 1, 3] +5 3 3 3 +After: [0, 0, 1, 3] + +Before: [1, 0, 2, 3] +13 2 2 2 +After: [1, 0, 1, 3] + +Before: [1, 1, 2, 3] +15 1 0 2 +After: [1, 1, 1, 3] + +Before: [2, 2, 2, 2] +3 2 3 3 +After: [2, 2, 2, 2] + +Before: [1, 1, 0, 1] +15 1 0 2 +After: [1, 1, 1, 1] + +Before: [1, 1, 2, 3] +15 1 0 0 +After: [1, 1, 2, 3] + +Before: [1, 1, 0, 3] +2 1 3 1 +After: [1, 0, 0, 3] + +Before: [2, 0, 2, 1] +12 2 0 1 +After: [2, 1, 2, 1] + +Before: [0, 2, 1, 2] +8 0 1 1 +After: [0, 0, 1, 2] + +Before: [1, 1, 2, 3] +1 1 2 1 +After: [1, 0, 2, 3] + +Before: [0, 3, 2, 3] +2 2 3 0 +After: [0, 3, 2, 3] + +Before: [0, 0, 2, 3] +13 3 3 2 +After: [0, 0, 1, 3] + +Before: [2, 1, 3, 2] +10 1 3 1 +After: [2, 0, 3, 2] + +Before: [1, 1, 2, 3] +2 1 3 3 +After: [1, 1, 2, 0] + +Before: [0, 0, 3, 2] +14 0 0 2 +After: [0, 0, 0, 2] + +Before: [0, 2, 2, 1] +7 3 2 3 +After: [0, 2, 2, 1] + +Before: [1, 0, 3, 2] +11 2 2 3 +After: [1, 0, 3, 1] + +Before: [3, 2, 3, 3] +11 0 0 1 +After: [3, 1, 3, 3] + +Before: [0, 3, 2, 2] +14 0 0 2 +After: [0, 3, 0, 2] + +Before: [3, 2, 1, 1] +6 3 3 2 +After: [3, 2, 0, 1] + +Before: [0, 2, 2, 3] +2 2 3 0 +After: [0, 2, 2, 3] + +Before: [1, 2, 1, 2] +6 3 3 3 +After: [1, 2, 1, 0] + +Before: [2, 1, 2, 1] +7 3 2 1 +After: [2, 1, 2, 1] + +Before: [1, 1, 1, 2] +10 1 3 2 +After: [1, 1, 0, 2] + +Before: [0, 0, 1, 1] +14 0 0 1 +After: [0, 0, 1, 1] + +Before: [3, 3, 3, 1] +11 0 2 1 +After: [3, 1, 3, 1] + +Before: [2, 1, 2, 2] +12 2 0 2 +After: [2, 1, 1, 2] + +Before: [1, 2, 2, 1] +7 3 2 0 +After: [1, 2, 2, 1] + +Before: [1, 2, 2, 2] +9 0 2 1 +After: [1, 0, 2, 2] + +Before: [3, 3, 2, 1] +7 3 2 3 +After: [3, 3, 2, 1] + +Before: [2, 1, 1, 2] +6 3 3 3 +After: [2, 1, 1, 0] + +Before: [2, 2, 1, 3] +2 2 3 2 +After: [2, 2, 0, 3] + +Before: [3, 2, 2, 2] +3 2 3 1 +After: [3, 2, 2, 2] + +Before: [2, 2, 2, 1] +0 2 0 0 +After: [2, 2, 2, 1] + +Before: [0, 1, 3, 1] +14 0 0 1 +After: [0, 0, 3, 1] + +Before: [2, 0, 3, 1] +8 1 0 0 +After: [0, 0, 3, 1] + +Before: [2, 3, 0, 2] +4 0 3 2 +After: [2, 3, 1, 2] + +Before: [2, 0, 2, 2] +3 2 3 1 +After: [2, 2, 2, 2] + +Before: [0, 0, 3, 2] +8 0 2 2 +After: [0, 0, 0, 2] + +Before: [3, 1, 1, 2] +10 1 3 2 +After: [3, 1, 0, 2] + +Before: [3, 2, 2, 1] +7 3 2 2 +After: [3, 2, 1, 1] + +Before: [2, 2, 2, 2] +4 0 3 1 +After: [2, 1, 2, 2] + +Before: [1, 1, 2, 2] +9 0 2 1 +After: [1, 0, 2, 2] + +Before: [3, 0, 2, 2] +5 2 2 1 +After: [3, 2, 2, 2] + +Before: [0, 2, 0, 1] +14 0 0 0 +After: [0, 2, 0, 1] + +Before: [2, 2, 2, 1] +5 2 2 0 +After: [2, 2, 2, 1] + +Before: [2, 1, 2, 3] +1 1 2 1 +After: [2, 0, 2, 3] + +Before: [2, 3, 0, 2] +4 0 3 1 +After: [2, 1, 0, 2] + +Before: [2, 3, 2, 1] +7 3 2 0 +After: [1, 3, 2, 1] + +Before: [2, 0, 2, 2] +12 2 0 0 +After: [1, 0, 2, 2] + +Before: [1, 2, 2, 2] +3 2 3 2 +After: [1, 2, 2, 2] + +Before: [0, 0, 2, 1] +7 3 2 0 +After: [1, 0, 2, 1] + +Before: [2, 2, 3, 3] +11 2 2 3 +After: [2, 2, 3, 1] + +Before: [3, 3, 2, 0] +5 2 2 2 +After: [3, 3, 2, 0] + +Before: [3, 2, 2, 2] +3 2 3 2 +After: [3, 2, 2, 2] + +Before: [2, 3, 2, 2] +4 0 3 3 +After: [2, 3, 2, 1] + +Before: [2, 1, 1, 2] +11 0 0 1 +After: [2, 1, 1, 2] + +Before: [0, 0, 2, 1] +7 3 2 2 +After: [0, 0, 1, 1] + +Before: [0, 2, 1, 0] +14 0 0 3 +After: [0, 2, 1, 0] + +Before: [1, 1, 2, 0] +15 1 0 1 +After: [1, 1, 2, 0] + +Before: [0, 1, 2, 3] +1 1 2 1 +After: [0, 0, 2, 3] + +Before: [0, 3, 1, 0] +14 0 0 3 +After: [0, 3, 1, 0] + +Before: [0, 2, 3, 2] +8 0 3 0 +After: [0, 2, 3, 2] + +Before: [0, 1, 3, 3] +13 0 0 0 +After: [1, 1, 3, 3] + +Before: [2, 1, 2, 0] +1 1 2 0 +After: [0, 1, 2, 0] + +Before: [3, 0, 1, 1] +11 0 0 0 +After: [1, 0, 1, 1] + +Before: [0, 2, 1, 3] +14 0 0 3 +After: [0, 2, 1, 0] + +Before: [0, 2, 2, 1] +14 0 0 0 +After: [0, 2, 2, 1] + +Before: [0, 2, 3, 0] +14 0 0 1 +After: [0, 0, 3, 0] + +Before: [2, 2, 2, 2] +3 2 3 1 +After: [2, 2, 2, 2] + +Before: [3, 0, 2, 1] +7 3 2 3 +After: [3, 0, 2, 1] + +Before: [2, 2, 2, 1] +6 3 3 0 +After: [0, 2, 2, 1] + +Before: [2, 1, 3, 2] +10 1 3 2 +After: [2, 1, 0, 2] + +Before: [2, 1, 2, 2] +5 2 2 3 +After: [2, 1, 2, 2] + +Before: [3, 2, 1, 1] +0 3 0 3 +After: [3, 2, 1, 1] + +Before: [2, 1, 2, 3] +1 1 2 3 +After: [2, 1, 2, 0] + +Before: [2, 3, 2, 0] +0 2 0 1 +After: [2, 2, 2, 0] + +Before: [3, 0, 3, 1] +11 0 0 3 +After: [3, 0, 3, 1] + +Before: [2, 3, 1, 1] +6 2 3 2 +After: [2, 3, 0, 1] + +Before: [2, 0, 3, 2] +11 2 2 0 +After: [1, 0, 3, 2] + +Before: [0, 1, 1, 2] +10 1 3 3 +After: [0, 1, 1, 0] + +Before: [0, 1, 3, 3] +12 3 2 2 +After: [0, 1, 1, 3] + +Before: [0, 1, 1, 2] +14 0 0 1 +After: [0, 0, 1, 2] + +Before: [0, 1, 2, 3] +1 1 2 2 +After: [0, 1, 0, 3] + +Before: [1, 1, 2, 2] +1 1 2 3 +After: [1, 1, 2, 0] + +Before: [0, 1, 0, 1] +14 0 0 3 +After: [0, 1, 0, 0] + +Before: [2, 0, 0, 1] +6 3 3 1 +After: [2, 0, 0, 1] + +Before: [1, 2, 1, 3] +13 3 2 3 +After: [1, 2, 1, 0] + +Before: [2, 1, 2, 1] +6 3 3 3 +After: [2, 1, 2, 0] + +Before: [0, 1, 0, 2] +6 3 3 3 +After: [0, 1, 0, 0] + +Before: [3, 1, 0, 2] +8 2 0 0 +After: [0, 1, 0, 2] + +Before: [1, 1, 3, 3] +12 3 2 0 +After: [1, 1, 3, 3] + +Before: [0, 1, 2, 1] +5 2 2 3 +After: [0, 1, 2, 2] + +Before: [1, 0, 3, 0] +11 2 2 0 +After: [1, 0, 3, 0] + +Before: [3, 3, 2, 1] +5 2 2 0 +After: [2, 3, 2, 1] + +Before: [0, 2, 2, 3] +14 0 0 3 +After: [0, 2, 2, 0] + +Before: [3, 0, 1, 3] +2 2 3 3 +After: [3, 0, 1, 0] + +Before: [2, 3, 3, 2] +4 0 3 3 +After: [2, 3, 3, 1] + +Before: [1, 1, 3, 2] +15 1 0 2 +After: [1, 1, 1, 2] + +Before: [1, 1, 2, 2] +9 0 2 0 +After: [0, 1, 2, 2] + +Before: [2, 1, 2, 2] +10 1 3 0 +After: [0, 1, 2, 2] + +Before: [3, 1, 2, 0] +1 1 2 3 +After: [3, 1, 2, 0] + +Before: [0, 1, 1, 3] +14 0 0 1 +After: [0, 0, 1, 3] + +Before: [1, 1, 2, 3] +13 3 1 0 +After: [0, 1, 2, 3] + +Before: [1, 1, 1, 2] +6 3 3 1 +After: [1, 0, 1, 2] + +Before: [2, 1, 2, 2] +5 2 2 1 +After: [2, 2, 2, 2] + +Before: [0, 2, 2, 0] +14 0 0 0 +After: [0, 2, 2, 0] + +Before: [0, 0, 2, 2] +8 0 2 2 +After: [0, 0, 0, 2] + +Before: [0, 1, 2, 0] +14 0 0 3 +After: [0, 1, 2, 0] + +Before: [1, 3, 2, 2] +9 0 2 1 +After: [1, 0, 2, 2] + +Before: [1, 2, 2, 0] +12 2 1 0 +After: [1, 2, 2, 0] + +Before: [2, 1, 3, 2] +4 0 3 0 +After: [1, 1, 3, 2] + +Before: [0, 1, 2, 1] +1 1 2 1 +After: [0, 0, 2, 1] + +Before: [3, 0, 3, 3] +11 0 0 0 +After: [1, 0, 3, 3] + +Before: [0, 3, 2, 1] +7 3 2 0 +After: [1, 3, 2, 1] + +Before: [3, 1, 1, 3] +12 3 0 0 +After: [1, 1, 1, 3] + +Before: [0, 2, 2, 1] +7 3 2 0 +After: [1, 2, 2, 1] + +Before: [1, 1, 3, 2] +10 1 3 3 +After: [1, 1, 3, 0] + +Before: [1, 1, 2, 1] +1 1 2 1 +After: [1, 0, 2, 1] + +Before: [2, 0, 1, 2] +6 3 3 0 +After: [0, 0, 1, 2] + +Before: [2, 0, 2, 0] +0 2 0 3 +After: [2, 0, 2, 2] + +Before: [0, 2, 3, 3] +13 3 3 0 +After: [1, 2, 3, 3] + +Before: [1, 1, 0, 3] +15 1 0 3 +After: [1, 1, 0, 1] + +Before: [2, 0, 1, 1] +11 0 0 2 +After: [2, 0, 1, 1] + +Before: [2, 3, 0, 2] +6 3 3 2 +After: [2, 3, 0, 2] + +Before: [3, 1, 1, 2] +10 1 3 0 +After: [0, 1, 1, 2] + +Before: [2, 3, 0, 1] +6 3 3 1 +After: [2, 0, 0, 1] + +Before: [3, 1, 2, 1] +1 1 2 0 +After: [0, 1, 2, 1] + +Before: [1, 1, 0, 2] +10 1 3 0 +After: [0, 1, 0, 2] + +Before: [2, 1, 2, 1] +1 1 2 2 +After: [2, 1, 0, 1] + +Before: [2, 1, 0, 2] +10 1 3 2 +After: [2, 1, 0, 2] + +Before: [1, 1, 2, 2] +15 1 0 2 +After: [1, 1, 1, 2] + +Before: [2, 3, 0, 2] +4 0 3 0 +After: [1, 3, 0, 2] + +Before: [1, 1, 2, 1] +1 1 2 0 +After: [0, 1, 2, 1] + +Before: [3, 1, 2, 3] +13 3 3 0 +After: [1, 1, 2, 3] + +Before: [3, 0, 2, 3] +0 3 0 1 +After: [3, 3, 2, 3] + +Before: [0, 1, 2, 1] +1 1 2 0 +After: [0, 1, 2, 1] + +Before: [2, 2, 1, 2] +4 0 3 3 +After: [2, 2, 1, 1] + +Before: [3, 3, 0, 3] +11 0 0 0 +After: [1, 3, 0, 3] + +Before: [3, 3, 2, 2] +3 2 3 1 +After: [3, 2, 2, 2] + +Before: [1, 3, 2, 3] +2 2 3 0 +After: [0, 3, 2, 3] + +Before: [1, 2, 2, 3] +9 0 2 0 +After: [0, 2, 2, 3] + +Before: [2, 1, 2, 0] +1 1 2 2 +After: [2, 1, 0, 0] + +Before: [3, 1, 2, 1] +1 1 2 2 +After: [3, 1, 0, 1] + +Before: [3, 1, 0, 2] +10 1 3 1 +After: [3, 0, 0, 2] + +Before: [3, 0, 3, 1] +12 2 3 2 +After: [3, 0, 0, 1] + +Before: [1, 0, 2, 2] +9 0 2 3 +After: [1, 0, 2, 0] + +Before: [0, 2, 2, 3] +5 3 3 1 +After: [0, 3, 2, 3] + +Before: [2, 0, 2, 1] +12 2 0 2 +After: [2, 0, 1, 1] + +Before: [2, 3, 1, 2] +11 0 0 3 +After: [2, 3, 1, 1] + +Before: [0, 2, 2, 2] +14 0 0 0 +After: [0, 2, 2, 2] + +Before: [1, 0, 3, 0] +11 2 2 2 +After: [1, 0, 1, 0] + +Before: [0, 1, 2, 3] +14 0 0 0 +After: [0, 1, 2, 3] + +Before: [2, 2, 3, 1] +6 3 3 3 +After: [2, 2, 3, 0] + +Before: [1, 1, 2, 2] +10 1 3 0 +After: [0, 1, 2, 2] + +Before: [3, 1, 2, 2] +6 3 3 1 +After: [3, 0, 2, 2] + +Before: [1, 2, 3, 3] +13 3 1 2 +After: [1, 2, 0, 3] + +Before: [1, 2, 1, 3] +2 2 3 2 +After: [1, 2, 0, 3] + +Before: [3, 1, 0, 2] +10 1 3 3 +After: [3, 1, 0, 0] + +Before: [3, 1, 3, 3] +11 2 2 3 +After: [3, 1, 3, 1] + +Before: [2, 2, 1, 2] +11 0 0 2 +After: [2, 2, 1, 2] + +Before: [3, 1, 3, 2] +10 1 3 0 +After: [0, 1, 3, 2] + +Before: [3, 0, 2, 2] +3 2 3 2 +After: [3, 0, 2, 2] + +Before: [1, 1, 0, 3] +2 1 3 0 +After: [0, 1, 0, 3] + +Before: [2, 1, 2, 2] +1 1 2 3 +After: [2, 1, 2, 0] + +Before: [2, 2, 2, 3] +2 2 3 2 +After: [2, 2, 0, 3] + +Before: [3, 0, 2, 1] +7 3 2 1 +After: [3, 1, 2, 1] + +Before: [1, 1, 2, 3] +9 0 2 0 +After: [0, 1, 2, 3] + +Before: [3, 2, 2, 3] +2 1 3 2 +After: [3, 2, 0, 3] + +Before: [2, 1, 2, 2] +4 0 3 1 +After: [2, 1, 2, 2] + +Before: [2, 0, 2, 2] +4 0 3 0 +After: [1, 0, 2, 2] + +Before: [2, 3, 1, 2] +4 0 3 2 +After: [2, 3, 1, 2] + +Before: [0, 2, 1, 0] +8 0 2 3 +After: [0, 2, 1, 0] + +Before: [3, 0, 1, 1] +6 2 3 3 +After: [3, 0, 1, 0] + +Before: [1, 2, 2, 0] +12 2 1 2 +After: [1, 2, 1, 0] + +Before: [1, 3, 2, 1] +9 0 2 2 +After: [1, 3, 0, 1] + +Before: [1, 1, 1, 3] +15 1 0 1 +After: [1, 1, 1, 3] + +Before: [0, 0, 0, 3] +8 0 3 2 +After: [0, 0, 0, 3] + +Before: [3, 1, 2, 0] +1 1 2 2 +After: [3, 1, 0, 0] + +Before: [2, 1, 2, 2] +10 1 3 2 +After: [2, 1, 0, 2] + +Before: [1, 1, 0, 1] +15 1 0 1 +After: [1, 1, 0, 1] + +Before: [1, 1, 3, 0] +13 2 1 0 +After: [0, 1, 3, 0] + +Before: [0, 0, 2, 1] +7 3 2 1 +After: [0, 1, 2, 1] + +Before: [2, 1, 3, 0] +11 0 0 3 +After: [2, 1, 3, 1] + +Before: [3, 1, 3, 0] +0 1 0 3 +After: [3, 1, 3, 1] + +Before: [1, 1, 3, 3] +13 2 1 1 +After: [1, 0, 3, 3] + +Before: [1, 3, 2, 3] +9 0 2 3 +After: [1, 3, 2, 0] + +Before: [0, 3, 1, 3] +8 0 3 1 +After: [0, 0, 1, 3] + +Before: [2, 1, 0, 2] +4 0 3 3 +After: [2, 1, 0, 1] + +Before: [2, 0, 2, 2] +3 2 3 3 +After: [2, 0, 2, 2] + +Before: [2, 3, 1, 0] +11 0 0 0 +After: [1, 3, 1, 0] + +Before: [3, 2, 3, 2] +11 0 0 2 +After: [3, 2, 1, 2] + +Before: [2, 1, 2, 2] +4 0 3 3 +After: [2, 1, 2, 1] + +Before: [3, 0, 3, 3] +5 3 3 1 +After: [3, 3, 3, 3] + +Before: [2, 2, 2, 1] +7 3 2 1 +After: [2, 1, 2, 1] + +Before: [2, 1, 2, 2] +3 2 3 2 +After: [2, 1, 2, 2] + +Before: [1, 1, 2, 1] +7 3 2 2 +After: [1, 1, 1, 1] + +Before: [2, 0, 2, 2] +5 2 2 0 +After: [2, 0, 2, 2] + +Before: [2, 1, 3, 2] +4 0 3 1 +After: [2, 1, 3, 2] + +Before: [0, 2, 2, 2] +3 2 3 3 +After: [0, 2, 2, 2] + +Before: [0, 3, 2, 2] +14 0 0 0 +After: [0, 3, 2, 2] + +Before: [2, 1, 3, 2] +10 1 3 0 +After: [0, 1, 3, 2] + +Before: [3, 1, 2, 1] +7 3 2 0 +After: [1, 1, 2, 1] + +Before: [2, 2, 1, 2] +4 0 3 2 +After: [2, 2, 1, 2] + +Before: [3, 2, 1, 1] +11 0 0 2 +After: [3, 2, 1, 1] + +Before: [0, 3, 3, 1] +13 0 0 1 +After: [0, 1, 3, 1] + +Before: [3, 0, 2, 3] +13 3 2 2 +After: [3, 0, 0, 3] + +Before: [0, 0, 0, 1] +6 3 3 2 +After: [0, 0, 0, 1] + +Before: [2, 3, 1, 2] +4 0 3 1 +After: [2, 1, 1, 2] + +Before: [2, 3, 2, 3] +0 2 0 3 +After: [2, 3, 2, 2] + +Before: [1, 3, 2, 0] +9 0 2 0 +After: [0, 3, 2, 0] + +Before: [0, 1, 0, 2] +6 3 3 0 +After: [0, 1, 0, 2] + +Before: [0, 1, 2, 1] +1 1 2 2 +After: [0, 1, 0, 1] + +Before: [1, 3, 2, 1] +7 3 2 0 +After: [1, 3, 2, 1] + +Before: [0, 3, 2, 1] +8 0 2 1 +After: [0, 0, 2, 1] + +Before: [2, 2, 0, 3] +5 3 3 1 +After: [2, 3, 0, 3] + +Before: [1, 1, 2, 2] +3 2 3 3 +After: [1, 1, 2, 2] + +Before: [0, 0, 3, 2] +11 2 2 1 +After: [0, 1, 3, 2] + +Before: [0, 3, 1, 3] +2 2 3 3 +After: [0, 3, 1, 0] + +Before: [3, 3, 3, 3] +11 2 0 0 +After: [1, 3, 3, 3] + +Before: [2, 0, 0, 2] +4 0 3 0 +After: [1, 0, 0, 2] + +Before: [0, 1, 2, 3] +2 2 3 1 +After: [0, 0, 2, 3] + +Before: [2, 3, 2, 1] +7 3 2 2 +After: [2, 3, 1, 1] + +Before: [3, 1, 2, 2] +10 1 3 0 +After: [0, 1, 2, 2] + +Before: [0, 2, 3, 3] +14 0 0 3 +After: [0, 2, 3, 0] + +Before: [3, 2, 2, 3] +13 3 1 1 +After: [3, 0, 2, 3] + +Before: [1, 1, 2, 2] +9 0 2 3 +After: [1, 1, 2, 0] + +Before: [0, 2, 1, 3] +14 0 0 2 +After: [0, 2, 0, 3] + +Before: [1, 0, 2, 1] +7 3 2 3 +After: [1, 0, 2, 1] + +Before: [0, 3, 2, 1] +7 3 2 3 +After: [0, 3, 2, 1] + +Before: [0, 1, 3, 2] +11 2 2 0 +After: [1, 1, 3, 2] + +Before: [0, 0, 2, 0] +13 0 0 2 +After: [0, 0, 1, 0] + +Before: [3, 1, 1, 3] +11 0 0 2 +After: [3, 1, 1, 3] + +Before: [3, 2, 1, 3] +0 3 0 3 +After: [3, 2, 1, 3] + +Before: [1, 2, 2, 0] +9 0 2 0 +After: [0, 2, 2, 0] + +Before: [3, 0, 0, 3] +0 3 0 0 +After: [3, 0, 0, 3] + +Before: [1, 0, 1, 3] +2 2 3 0 +After: [0, 0, 1, 3] + +Before: [0, 0, 2, 1] +7 3 2 3 +After: [0, 0, 2, 1] + +Before: [1, 1, 2, 2] +15 1 0 3 +After: [1, 1, 2, 1] + +Before: [2, 1, 1, 3] +2 1 3 0 +After: [0, 1, 1, 3] + +Before: [0, 2, 0, 2] +8 0 3 0 +After: [0, 2, 0, 2] + +Before: [3, 1, 0, 3] +0 3 0 0 +After: [3, 1, 0, 3] + +Before: [2, 3, 2, 3] +2 2 3 1 +After: [2, 0, 2, 3] + +Before: [2, 1, 2, 3] +0 2 0 0 +After: [2, 1, 2, 3] + +Before: [2, 0, 2, 3] +8 1 0 3 +After: [2, 0, 2, 0] + +Before: [1, 1, 2, 3] +2 2 3 1 +After: [1, 0, 2, 3] + +Before: [0, 0, 2, 2] +8 0 3 1 +After: [0, 0, 2, 2] + +Before: [1, 0, 2, 1] +7 3 2 0 +After: [1, 0, 2, 1] + +Before: [1, 3, 2, 3] +9 0 2 2 +After: [1, 3, 0, 3] + +Before: [1, 1, 3, 3] +11 2 2 1 +After: [1, 1, 3, 3] + +Before: [1, 1, 0, 3] +15 1 0 1 +After: [1, 1, 0, 3] + +Before: [2, 3, 3, 2] +4 0 3 1 +After: [2, 1, 3, 2] + +Before: [2, 1, 0, 1] +6 3 3 0 +After: [0, 1, 0, 1] + +Before: [1, 1, 2, 2] +10 1 3 2 +After: [1, 1, 0, 2] + +Before: [2, 0, 2, 1] +7 3 2 3 +After: [2, 0, 2, 1] + +Before: [2, 3, 2, 2] +13 2 2 3 +After: [2, 3, 2, 1] + +Before: [0, 1, 1, 0] +14 0 0 0 +After: [0, 1, 1, 0] + +Before: [0, 1, 3, 2] +14 0 0 1 +After: [0, 0, 3, 2] + +Before: [0, 3, 2, 3] +8 0 1 2 +After: [0, 3, 0, 3] + +Before: [2, 3, 1, 3] +2 2 3 0 +After: [0, 3, 1, 3] + +Before: [0, 0, 1, 1] +8 0 2 0 +After: [0, 0, 1, 1] + +Before: [0, 1, 0, 2] +10 1 3 0 +After: [0, 1, 0, 2] + +Before: [2, 3, 3, 3] +5 3 3 3 +After: [2, 3, 3, 3] + +Before: [0, 3, 2, 1] +7 3 2 2 +After: [0, 3, 1, 1] + +Before: [1, 0, 2, 3] +2 2 3 1 +After: [1, 0, 2, 3] + +Before: [2, 1, 2, 1] +7 3 2 3 +After: [2, 1, 2, 1] + +Before: [3, 1, 1, 1] +0 1 0 0 +After: [1, 1, 1, 1] + +Before: [2, 3, 0, 3] +5 3 3 3 +After: [2, 3, 0, 3] + +Before: [2, 0, 2, 0] +13 2 2 0 +After: [1, 0, 2, 0] + +Before: [3, 2, 2, 3] +13 3 2 2 +After: [3, 2, 0, 3] + +Before: [2, 0, 2, 1] +0 2 0 2 +After: [2, 0, 2, 1] + +Before: [3, 1, 2, 0] +1 1 2 0 +After: [0, 1, 2, 0] + +Before: [1, 2, 2, 1] +9 0 2 3 +After: [1, 2, 2, 0] + +Before: [3, 0, 1, 1] +0 3 0 0 +After: [1, 0, 1, 1] + +Before: [3, 1, 3, 3] +0 1 0 2 +After: [3, 1, 1, 3] + +Before: [0, 1, 1, 3] +2 1 3 1 +After: [0, 0, 1, 3] + +Before: [0, 3, 3, 3] +5 3 3 1 +After: [0, 3, 3, 3] + +Before: [3, 3, 2, 2] +13 2 2 3 +After: [3, 3, 2, 1] + +Before: [1, 1, 2, 1] +1 1 2 3 +After: [1, 1, 2, 0] + +Before: [1, 1, 3, 2] +15 1 0 0 +After: [1, 1, 3, 2] + +Before: [1, 0, 2, 2] +5 2 2 1 +After: [1, 2, 2, 2] + +Before: [2, 2, 1, 1] +11 0 1 1 +After: [2, 1, 1, 1] + +Before: [0, 0, 3, 1] +14 0 0 1 +After: [0, 0, 3, 1] + +Before: [2, 1, 2, 2] +10 1 3 1 +After: [2, 0, 2, 2] + +Before: [0, 1, 0, 2] +10 1 3 3 +After: [0, 1, 0, 0] + +Before: [3, 1, 2, 2] +1 1 2 3 +After: [3, 1, 2, 0] + +Before: [1, 0, 2, 1] +9 0 2 3 +After: [1, 0, 2, 0] + +Before: [2, 1, 2, 2] +1 1 2 1 +After: [2, 0, 2, 2] + +Before: [2, 3, 1, 2] +4 0 3 0 +After: [1, 3, 1, 2] + +Before: [2, 1, 3, 3] +5 3 3 3 +After: [2, 1, 3, 3] + +Before: [2, 2, 3, 3] +2 1 3 0 +After: [0, 2, 3, 3] + +Before: [1, 1, 3, 2] +15 1 0 1 +After: [1, 1, 3, 2] + +Before: [2, 3, 2, 1] +7 3 2 1 +After: [2, 1, 2, 1] + +Before: [1, 0, 2, 0] +9 0 2 2 +After: [1, 0, 0, 0] + +Before: [3, 3, 2, 3] +5 2 2 1 +After: [3, 2, 2, 3] + +Before: [3, 1, 2, 2] +1 1 2 1 +After: [3, 0, 2, 2] + +Before: [0, 0, 2, 3] +2 2 3 3 +After: [0, 0, 2, 0] + +Before: [3, 3, 1, 3] +2 2 3 0 +After: [0, 3, 1, 3] + +Before: [2, 2, 2, 3] +0 2 0 1 +After: [2, 2, 2, 3] + +Before: [3, 1, 2, 1] +0 1 0 2 +After: [3, 1, 1, 1] + +Before: [3, 3, 2, 1] +7 3 2 0 +After: [1, 3, 2, 1] + +Before: [0, 1, 2, 0] +1 1 2 2 +After: [0, 1, 0, 0] + +Before: [0, 0, 1, 0] +14 0 0 0 +After: [0, 0, 1, 0] + +Before: [0, 2, 2, 1] +12 2 1 3 +After: [0, 2, 2, 1] + +Before: [3, 2, 3, 1] +6 3 3 3 +After: [3, 2, 3, 0] + +Before: [1, 1, 2, 1] +1 1 2 2 +After: [1, 1, 0, 1] + +Before: [2, 3, 1, 2] +4 0 3 3 +After: [2, 3, 1, 1] + +Before: [2, 2, 1, 2] +4 0 3 1 +After: [2, 1, 1, 2] + +Before: [2, 1, 1, 2] +4 0 3 0 +After: [1, 1, 1, 2] + + + +9 2 0 1 +9 0 1 0 +9 3 0 3 +10 3 1 1 +8 1 1 1 +14 1 2 2 +7 2 2 1 +9 1 3 3 +9 1 2 0 +9 3 0 2 +8 3 2 3 +8 3 1 3 +14 3 1 1 +7 1 3 2 +9 1 2 3 +8 0 0 0 +0 0 2 0 +8 1 0 1 +0 1 3 1 +15 3 0 0 +8 0 3 0 +8 0 2 0 +14 2 0 2 +7 2 1 1 +9 1 2 2 +8 0 0 0 +0 0 3 0 +9 0 3 3 +1 0 2 2 +8 2 1 2 +14 2 1 1 +7 1 0 2 +8 2 0 3 +0 3 2 3 +9 2 1 0 +9 3 3 1 +4 0 3 0 +8 0 3 0 +14 0 2 2 +9 1 1 3 +9 1 2 1 +9 1 0 0 +14 1 3 0 +8 0 1 0 +14 0 2 2 +9 2 1 1 +9 2 2 0 +6 0 3 1 +8 1 2 1 +8 1 2 1 +14 1 2 2 +7 2 2 1 +9 1 0 0 +8 1 0 3 +0 3 0 3 +9 3 0 2 +12 3 2 0 +8 0 3 0 +8 0 1 0 +14 0 1 1 +9 1 2 0 +8 3 0 3 +0 3 1 3 +9 0 0 2 +8 0 2 2 +8 2 2 2 +14 1 2 1 +9 2 0 0 +8 0 0 2 +0 2 2 2 +6 0 3 0 +8 0 1 0 +8 0 3 0 +14 0 1 1 +7 1 0 3 +9 2 3 0 +9 3 3 2 +9 3 0 1 +1 1 2 2 +8 2 2 2 +14 3 2 3 +7 3 3 0 +9 0 1 2 +9 0 1 1 +9 3 1 3 +1 3 2 2 +8 2 3 2 +14 0 2 0 +7 0 0 3 +9 2 2 0 +9 1 1 1 +9 3 2 2 +13 0 2 1 +8 1 2 1 +8 1 2 1 +14 3 1 3 +7 3 0 1 +9 2 2 3 +9 0 1 2 +12 2 3 2 +8 2 1 2 +14 1 2 1 +8 1 0 2 +0 2 2 2 +9 1 2 3 +8 2 0 0 +0 0 1 0 +7 0 2 0 +8 0 3 0 +8 0 2 0 +14 1 0 1 +7 1 0 0 +8 3 0 2 +0 2 1 2 +9 1 3 1 +14 1 3 3 +8 3 1 3 +8 3 3 3 +14 0 3 0 +9 2 1 1 +9 0 1 3 +9 2 3 3 +8 3 2 3 +8 3 3 3 +14 0 3 0 +7 0 2 1 +9 1 2 3 +9 2 1 0 +6 0 3 2 +8 2 3 2 +14 1 2 1 +7 1 2 3 +9 1 1 0 +9 2 1 2 +9 3 1 1 +0 0 1 2 +8 2 2 2 +14 2 3 3 +7 3 1 0 +9 2 1 3 +8 0 0 2 +0 2 3 2 +9 0 0 1 +9 2 1 2 +8 2 3 2 +8 2 3 2 +14 0 2 0 +7 0 1 2 +9 1 2 3 +9 2 3 1 +9 3 2 0 +10 0 1 0 +8 0 2 0 +14 2 0 2 +7 2 0 3 +8 2 0 2 +0 2 3 2 +9 2 1 0 +8 1 0 1 +0 1 3 1 +10 1 0 1 +8 1 2 1 +8 1 3 1 +14 1 3 3 +7 3 2 0 +9 1 0 1 +9 1 3 3 +9 2 3 1 +8 1 2 1 +14 1 0 0 +7 0 3 2 +9 2 3 0 +9 3 0 3 +9 2 1 1 +10 3 0 1 +8 1 3 1 +14 2 1 2 +7 2 0 0 +9 3 0 2 +9 3 0 1 +9 2 1 3 +10 1 3 3 +8 3 2 3 +14 3 0 0 +7 0 0 2 +9 1 3 3 +9 2 0 0 +9 1 1 1 +6 0 3 0 +8 0 1 0 +14 0 2 2 +7 2 0 3 +8 2 0 0 +0 0 1 0 +9 2 0 2 +9 2 3 1 +7 0 2 0 +8 0 2 0 +14 0 3 3 +9 3 2 1 +9 1 0 2 +9 1 0 0 +0 0 1 0 +8 0 2 0 +14 3 0 3 +7 3 3 1 +9 2 2 3 +9 2 0 2 +9 1 3 0 +7 0 2 3 +8 3 3 3 +8 3 2 3 +14 1 3 1 +9 0 3 2 +9 3 3 3 +8 0 2 3 +8 3 2 3 +8 3 2 3 +14 3 1 1 +8 1 0 0 +0 0 0 0 +9 1 3 3 +9 3 0 2 +8 3 2 2 +8 2 2 2 +14 1 2 1 +7 1 0 2 +9 2 0 0 +9 0 2 1 +9 2 1 3 +5 0 3 3 +8 3 1 3 +8 3 3 3 +14 2 3 2 +9 1 2 3 +9 1 0 1 +15 3 0 0 +8 0 2 0 +14 0 2 2 +7 2 0 0 +9 1 2 2 +9 2 0 3 +15 1 3 2 +8 2 1 2 +14 2 0 0 +9 0 0 3 +8 3 0 2 +0 2 2 2 +9 0 1 1 +5 2 3 1 +8 1 1 1 +8 1 3 1 +14 0 1 0 +9 3 2 2 +9 3 0 1 +9 2 2 3 +1 1 2 2 +8 2 3 2 +14 2 0 0 +7 0 1 3 +9 2 3 2 +9 2 2 0 +11 0 1 2 +8 2 1 2 +14 3 2 3 +7 3 0 1 +9 2 3 2 +9 1 1 0 +9 3 3 3 +7 0 2 3 +8 3 1 3 +14 1 3 1 +9 3 3 2 +8 1 0 3 +0 3 3 3 +8 3 0 0 +0 0 2 0 +13 0 2 2 +8 2 2 2 +8 2 2 2 +14 1 2 1 +9 2 2 2 +9 1 3 3 +6 0 3 2 +8 2 3 2 +14 1 2 1 +7 1 0 2 +9 3 3 1 +9 1 0 0 +0 3 1 1 +8 1 3 1 +14 2 1 2 +7 2 1 1 +9 2 1 0 +8 3 0 3 +0 3 3 3 +9 3 3 2 +3 0 2 2 +8 2 1 2 +8 2 1 2 +14 2 1 1 +7 1 2 2 +8 2 0 3 +0 3 1 3 +9 0 1 1 +6 0 3 1 +8 1 1 1 +14 2 1 2 +9 0 3 1 +9 3 2 0 +9 2 3 3 +10 0 3 1 +8 1 2 1 +8 1 2 1 +14 2 1 2 +7 2 3 3 +9 0 1 2 +9 1 0 0 +9 3 3 1 +8 0 2 1 +8 1 1 1 +14 3 1 3 +7 3 1 2 +9 2 0 1 +9 0 2 3 +9 2 3 0 +5 1 3 1 +8 1 3 1 +8 1 1 1 +14 1 2 2 +7 2 0 1 +9 3 2 0 +8 0 0 2 +0 2 0 2 +9 3 2 3 +13 2 0 0 +8 0 3 0 +14 1 0 1 +8 3 0 2 +0 2 2 2 +8 1 0 0 +0 0 1 0 +7 0 2 2 +8 2 3 2 +8 2 1 2 +14 1 2 1 +7 1 2 2 +9 0 0 3 +8 2 0 1 +0 1 1 1 +14 0 0 0 +8 0 2 0 +14 2 0 2 +7 2 3 3 +8 2 0 0 +0 0 3 0 +8 0 0 1 +0 1 3 1 +9 0 0 2 +1 0 2 0 +8 0 1 0 +14 0 3 3 +7 3 2 1 +9 1 2 3 +9 2 1 0 +6 0 3 0 +8 0 2 0 +8 0 3 0 +14 0 1 1 +7 1 0 3 +9 2 0 2 +9 1 1 0 +8 2 0 1 +0 1 2 1 +7 0 2 1 +8 1 2 1 +8 1 3 1 +14 3 1 3 +9 1 1 1 +7 0 2 1 +8 1 1 1 +14 1 3 3 +7 3 3 2 +9 2 0 3 +9 3 1 1 +0 0 1 0 +8 0 1 0 +14 2 0 2 +7 2 0 3 +8 0 0 2 +0 2 1 2 +9 2 0 0 +1 1 2 1 +8 1 1 1 +14 1 3 3 +7 3 1 2 +9 1 2 1 +9 2 0 3 +15 1 3 0 +8 0 2 0 +14 0 2 2 +9 3 2 3 +9 2 0 0 +9 3 2 1 +11 0 1 0 +8 0 3 0 +14 0 2 2 +7 2 3 3 +9 3 1 0 +9 3 3 2 +9 1 2 1 +8 1 2 1 +8 1 1 1 +8 1 3 1 +14 3 1 3 +7 3 0 0 +9 2 2 2 +8 1 0 3 +0 3 0 3 +9 0 2 1 +2 3 2 1 +8 1 1 1 +14 1 0 0 +7 0 0 1 +9 2 1 0 +9 3 2 2 +12 3 2 2 +8 2 3 2 +14 2 1 1 +7 1 0 2 +8 0 0 1 +0 1 3 1 +9 2 3 3 +10 1 3 1 +8 1 2 1 +14 1 2 2 +7 2 2 1 +9 1 0 2 +5 0 3 0 +8 0 1 0 +14 0 1 1 +7 1 3 3 +9 3 3 2 +9 2 0 0 +9 3 1 1 +13 0 2 2 +8 2 3 2 +8 2 1 2 +14 3 2 3 +9 3 3 2 +8 2 0 1 +0 1 0 1 +3 0 2 1 +8 1 3 1 +8 1 3 1 +14 1 3 3 +7 3 2 1 +9 1 3 3 +13 0 2 2 +8 2 2 2 +14 2 1 1 +7 1 2 0 +9 2 1 3 +9 1 0 1 +9 2 0 2 +5 2 3 3 +8 3 1 3 +14 0 3 0 +8 1 0 3 +0 3 2 3 +9 3 1 1 +10 1 3 1 +8 1 3 1 +8 1 1 1 +14 0 1 0 +9 3 3 1 +9 3 2 3 +11 2 1 1 +8 1 2 1 +8 1 1 1 +14 1 0 0 +7 0 0 1 +9 0 2 2 +8 2 0 0 +0 0 3 0 +8 1 0 3 +0 3 2 3 +13 2 0 3 +8 3 3 3 +14 3 1 1 +9 1 1 2 +8 1 0 3 +0 3 1 3 +14 3 3 3 +8 3 3 3 +14 3 1 1 +7 1 3 3 +9 3 0 2 +9 1 0 1 +9 2 1 0 +8 0 1 0 +8 0 2 0 +14 0 3 3 +7 3 3 2 +8 3 0 0 +0 0 2 0 +8 3 0 1 +0 1 3 1 +9 1 1 3 +6 0 3 0 +8 0 2 0 +14 2 0 2 +9 1 0 1 +9 2 1 3 +9 0 2 0 +15 1 3 1 +8 1 3 1 +14 2 1 2 +7 2 3 1 +9 1 3 0 +9 3 1 2 +9 0 0 3 +12 3 2 3 +8 3 1 3 +14 3 1 1 +7 1 1 2 +9 1 1 3 +9 2 3 0 +9 0 1 1 +15 3 0 0 +8 0 2 0 +14 0 2 2 +7 2 3 0 +8 1 0 1 +0 1 2 1 +9 0 2 3 +9 2 2 2 +2 3 2 3 +8 3 3 3 +14 0 3 0 +7 0 0 2 +9 3 3 0 +9 2 2 3 +3 1 0 1 +8 1 1 1 +14 1 2 2 +9 0 1 1 +10 0 3 0 +8 0 1 0 +8 0 2 0 +14 0 2 2 +8 3 0 0 +0 0 2 0 +4 0 3 3 +8 3 3 3 +14 3 2 2 +7 2 3 0 +8 0 0 3 +0 3 1 3 +9 3 2 1 +9 2 0 2 +14 3 3 1 +8 1 3 1 +14 1 0 0 +7 0 1 2 +9 1 0 0 +9 2 0 3 +9 3 0 1 +10 1 3 3 +8 3 2 3 +14 2 3 2 +7 2 2 1 +8 3 0 3 +0 3 0 3 +9 2 1 2 +8 3 0 0 +0 0 3 0 +11 2 0 3 +8 3 1 3 +8 3 1 3 +14 1 3 1 +9 1 0 3 +9 3 2 2 +9 2 0 0 +13 0 2 3 +8 3 2 3 +14 3 1 1 +8 3 0 3 +0 3 3 3 +8 0 0 0 +0 0 1 0 +8 0 2 0 +8 0 3 0 +14 1 0 1 +7 1 1 3 +9 1 3 1 +9 2 1 0 +13 0 2 0 +8 0 2 0 +8 0 2 0 +14 3 0 3 +7 3 3 0 +8 0 0 3 +0 3 3 3 +9 0 2 1 +1 3 2 2 +8 2 2 2 +14 2 0 0 +9 3 2 2 +9 3 1 1 +1 3 2 1 +8 1 3 1 +8 1 1 1 +14 1 0 0 +7 0 2 2 +9 3 3 1 +9 1 2 0 +9 1 0 3 +0 0 1 1 +8 1 3 1 +14 2 1 2 +7 2 3 1 +8 3 0 2 +0 2 3 2 +8 3 0 0 +0 0 2 0 +9 2 1 3 +4 0 3 0 +8 0 1 0 +14 0 1 1 +9 3 1 3 +9 2 3 2 +9 2 0 0 +10 3 0 0 +8 0 3 0 +14 1 0 1 +8 0 0 3 +0 3 0 3 +9 1 0 0 +7 0 2 2 +8 2 1 2 +14 1 2 1 +9 3 0 0 +8 2 0 2 +0 2 0 2 +13 2 0 2 +8 2 3 2 +14 1 2 1 +9 3 0 2 +9 2 2 3 +9 2 2 0 +3 0 2 3 +8 3 2 3 +14 3 1 1 +7 1 2 2 +9 2 0 3 +8 1 0 1 +0 1 1 1 +4 0 3 3 +8 3 3 3 +8 3 1 3 +14 3 2 2 +7 2 2 1 +9 3 0 0 +8 0 0 2 +0 2 0 2 +9 2 1 3 +13 2 0 2 +8 2 3 2 +14 1 2 1 +7 1 1 2 +9 0 1 1 +9 1 0 0 +8 3 0 3 +0 3 3 3 +0 0 1 1 +8 1 1 1 +14 1 2 2 +7 2 3 1 +9 2 3 0 +9 2 1 3 +9 2 0 2 +4 0 3 3 +8 3 3 3 +14 1 3 1 +9 1 1 3 +8 1 0 2 +0 2 0 2 +6 0 3 3 +8 3 3 3 +14 3 1 1 +7 1 1 3 +9 1 2 0 +9 3 0 1 +9 3 1 2 +0 0 1 0 +8 0 1 0 +14 0 3 3 +7 3 3 1 +8 1 0 0 +0 0 1 0 +9 2 2 3 +9 2 0 2 +7 0 2 0 +8 0 2 0 +14 0 1 1 +7 1 0 2 +9 1 0 3 +9 2 1 1 +9 1 1 0 +14 0 0 1 +8 1 1 1 +8 1 2 1 +14 1 2 2 +7 2 1 3 +9 2 3 0 +9 3 1 2 +9 2 3 1 +13 0 2 0 +8 0 3 0 +14 3 0 3 +7 3 0 2 +9 3 1 1 +9 1 0 3 +9 2 2 0 +11 0 1 3 +8 3 1 3 +14 2 3 2 +7 2 2 1 +8 2 0 0 +0 0 1 0 +9 2 1 2 +9 1 3 3 +7 0 2 3 +8 3 3 3 +14 3 1 1 +7 1 2 0 +9 0 1 3 +9 1 1 1 +2 3 2 2 +8 2 1 2 +14 2 0 0 +7 0 3 3 +9 3 0 1 +9 1 3 0 +8 3 0 2 +0 2 2 2 +0 0 1 1 +8 1 2 1 +14 1 3 3 +7 3 1 2 +9 2 1 1 +9 1 2 3 +9 2 1 0 +6 0 3 0 +8 0 1 0 +8 0 3 0 +14 0 2 2 +9 2 1 3 +9 1 3 1 +9 2 1 0 +4 0 3 1 +8 1 3 1 +8 1 1 1 +14 1 2 2 +7 2 3 1 +9 1 3 2 +9 3 3 0 +9 0 2 3 +9 2 0 2 +8 2 1 2 +14 2 1 1 +9 3 2 3 +8 1 0 2 +0 2 0 2 +9 2 2 0 +10 3 0 3 +8 3 2 3 +14 1 3 1 +9 0 1 3 +9 2 1 2 +2 3 2 0 +8 0 2 0 +14 1 0 1 +7 1 0 3 +9 3 0 0 +9 0 3 1 +11 2 0 0 +8 0 2 0 +14 3 0 3 +9 3 3 2 +9 3 2 0 +9 2 1 1 +1 0 2 0 +8 0 3 0 +14 3 0 3 +7 3 0 2 +8 1 0 0 +0 0 2 0 +9 1 0 3 +8 0 0 1 +0 1 0 1 +6 0 3 3 +8 3 2 3 +8 3 1 3 +14 3 2 2 +7 2 0 3 +9 3 2 2 +13 0 2 2 +8 2 1 2 +14 3 2 3 +7 3 3 1 +8 0 0 3 +0 3 1 3 +9 3 1 0 +9 2 0 2 +11 2 0 3 +8 3 1 3 +14 3 1 1 +9 0 1 3 +9 0 1 0 +2 3 2 2 +8 2 2 2 +8 2 2 2 +14 2 1 1 +7 1 3 3 +9 0 2 2 +9 3 1 1 +1 1 2 2 +8 2 3 2 +14 2 3 3 +7 3 3 0 diff --git a/src/main/resources/2018/day17.txt b/src/main/resources/2018/day17.txt new file mode 100644 index 00000000..0aed2da6 --- /dev/null +++ b/src/main/resources/2018/day17.txt @@ -0,0 +1,2166 @@ +x=652, y=891..904 +x=570, y=1112..1122 +y=736, x=626..628 +x=487, y=1410..1419 +x=655, y=1170..1172 +y=1385, x=663..667 +y=891, x=700..718 +x=737, y=730..735 +x=605, y=1853..1867 +x=622, y=1115..1117 +x=628, y=1109..1120 +x=536, y=209..219 +x=730, y=1633..1637 +y=1349, x=611..679 +x=735, y=1330..1341 +x=506, y=1895..1905 +x=639, y=379..390 +y=1905, x=492..506 +x=525, y=197..225 +y=18, x=457..463 +x=536, y=300..302 +y=1584, x=483..486 +x=494, y=398..419 +y=1357, x=588..590 +x=618, y=136..155 +y=1673, x=716..718 +x=761, y=76..95 +x=437, y=1103..1120 +x=538, y=1803..1807 +y=855, x=685..692 +y=229, x=464..480 +y=1745, x=737..739 +x=679, y=1170..1189 +x=685, y=36..60 +x=610, y=1115..1117 +x=456, y=1556..1568 +x=646, y=1273..1282 +x=598, y=59..65 +x=748, y=1670..1679 +x=529, y=1798..1810 +x=695, y=764..774 +x=630, y=870..895 +y=240, x=532..541 +y=1216, x=734..736 +x=462, y=538..547 +y=616, x=479..489 +x=769, y=285..308 +x=461, y=1758..1764 +y=1620, x=713..731 +x=493, y=445..460 +x=618, y=1445..1455 +x=666, y=309..331 +y=1287, x=613..616 +y=764, x=481..507 +x=737, y=1867..1871 +x=454, y=1753..1778 +x=506, y=941..943 +x=585, y=996..1004 +x=641, y=1009..1012 +y=480, x=460..465 +y=1495, x=679..704 +x=590, y=1820..1846 +x=486, y=1345..1366 +x=620, y=364..371 +x=790, y=1105..1127 +y=1198, x=769..774 +y=1445, x=449..472 +x=645, y=1254..1259 +x=626, y=1186..1198 +x=512, y=566..568 +y=310, x=589..607 +x=612, y=485..497 +y=1309, x=713..727 +x=461, y=1117..1142 +y=472, x=637..640 +y=240, x=684..712 +x=684, y=785..794 +y=1169, x=551..569 +x=483, y=1649..1653 +y=1142, x=449..461 +x=589, y=1653..1681 +x=487, y=510..521 +x=709, y=311..336 +x=632, y=1738..1743 +x=628, y=722..736 +x=455, y=1162..1182 +x=760, y=614..626 +x=477, y=1388..1416 +x=746, y=1588..1598 +x=594, y=1880..1906 +x=747, y=438..465 +x=659, y=291..295 +x=505, y=1100..1103 +y=1521, x=573..594 +x=664, y=1858..1872 +y=1034, x=732..739 +y=1580, x=746..750 +x=770, y=611..635 +x=595, y=505..518 +y=120, x=610..628 +x=595, y=1667..1689 +x=493, y=710..729 +x=598, y=1874..1896 +y=1025, x=661..663 +x=564, y=1628..1644 +y=71, x=731..758 +x=526, y=55..68 +x=732, y=1818..1831 +y=1803, x=535..538 +y=1482, x=713..715 +x=546, y=294..306 +x=556, y=821..838 +x=541, y=321..326 +x=666, y=979..990 +x=461, y=1161..1182 +y=87, x=524..528 +y=586, x=518..520 +x=685, y=73..88 +x=538, y=1458..1462 +x=479, y=608..616 +x=446, y=1104..1120 +x=660, y=1857..1872 +x=775, y=1045..1055 +y=873, x=494..496 +x=646, y=5..26 +x=511, y=723..727 +x=696, y=1677..1693 +x=668, y=1891..1904 +x=573, y=151..153 +x=700, y=789..791 +y=147, x=446..457 +x=468, y=1514..1516 +x=579, y=1079..1091 +x=493, y=1664..1670 +x=757, y=899..921 +y=1567, x=503..513 +x=769, y=715..729 +y=774, x=679..695 +y=534, x=708..711 +x=715, y=922..924 +x=573, y=856..863 +x=476, y=1738..1748 +x=596, y=1525..1538 +y=1547, x=520..545 +y=336, x=688..709 +x=757, y=270..298 +x=748, y=1778..1789 +x=597, y=220..223 +x=543, y=1881..1902 +x=696, y=1117..1129 +x=633, y=1206..1219 +x=720, y=856..874 +y=1219, x=633..652 +x=517, y=78..90 +y=326, x=541..554 +x=687, y=911..918 +y=1520, x=455..474 +x=547, y=278..282 +x=437, y=721..728 +x=716, y=1673..1679 +x=756, y=1574..1578 +x=536, y=804..807 +y=1515, x=582..588 +x=524, y=1376..1398 +x=570, y=968..973 +x=584, y=1729..1743 +y=1119, x=588..591 +x=542, y=1412..1439 +x=551, y=1680..1697 +y=724, x=759..763 +x=674, y=865..877 +x=761, y=856..870 +y=1410, x=647..657 +y=1593, x=598..606 +x=554, y=595..600 +x=547, y=252..266 +x=656, y=1252..1265 +x=512, y=869..877 +x=755, y=585..595 +y=1621, x=774..781 +x=654, y=403..416 +y=1364, x=610..614 +x=529, y=208..219 +x=447, y=1701..1722 +x=708, y=720..731 +x=716, y=1504..1515 +y=948, x=605..619 +x=724, y=264..283 +x=544, y=406..408 +x=500, y=773..777 +x=725, y=1735..1749 +x=713, y=1115..1138 +y=53, x=464..467 +x=613, y=1621..1648 +x=702, y=432..452 +x=554, y=1305..1318 +y=408, x=544..547 +y=1623, x=774..781 +y=1443, x=777..790 +x=727, y=1160..1164 +y=1139, x=480..499 +x=626, y=1585..1611 +x=543, y=629..638 +y=1681, x=573..589 +x=651, y=99..105 +x=575, y=768..779 +x=609, y=1164..1178 +y=1058, x=716..723 +x=692, y=1399..1416 +y=1830, x=768..784 +y=1247, x=690..693 +x=562, y=1015..1031 +y=1719, x=460..462 +y=1810, x=529..544 +x=647, y=56..76 +x=662, y=94..120 +x=466, y=1534..1541 +y=633, x=512..525 +x=684, y=221..240 +y=171, x=474..559 +x=500, y=198..225 +x=474, y=888..897 +y=159, x=729..739 +y=1298, x=775..782 +y=1111, x=751..757 +y=19, x=493..495 +x=660, y=592..603 +x=557, y=1376..1383 +x=677, y=1826..1845 +y=1872, x=660..664 +y=93, x=626..637 +x=518, y=1623..1643 +y=787, x=594..618 +y=506, x=497..507 +x=671, y=594..606 +y=475, x=608..613 +x=692, y=852..855 +y=260, x=505..510 +x=573, y=1700..1723 +y=1216, x=642..645 +x=722, y=348..365 +y=510, x=478..487 +y=417, x=670..694 +y=753, x=590..597 +y=928, x=708..724 +x=497, y=495..506 +x=579, y=1006..1020 +y=1488, x=786..790 +x=553, y=400..411 +y=38, x=629..631 +x=646, y=1447..1459 +x=716, y=964..977 +x=673, y=890..904 +x=536, y=145..147 +x=569, y=151..153 +y=1273, x=717..721 +y=1643, x=513..518 +y=886, x=582..594 +y=353, x=454..471 +x=481, y=1083..1088 +y=1670, x=578..580 +x=664, y=893..895 +x=606, y=1565..1593 +x=737, y=1365..1392 +y=727, x=498..511 +x=639, y=1557..1562 +x=530, y=1735..1745 +x=629, y=1424..1434 +x=609, y=1054..1065 +x=476, y=82..85 +y=1724, x=745..764 +y=777, x=474..500 +y=210, x=480..497 +y=745, x=612..634 +x=528, y=1680..1697 +y=458, x=771..773 +x=520, y=1882..1902 +x=611, y=142..150 +x=632, y=1184..1192 +x=609, y=547..561 +x=724, y=915..928 +y=1341, x=735..751 +x=717, y=495..514 +x=463, y=18..23 +x=661, y=1040..1052 +x=707, y=1429..1441 +x=589, y=1026..1045 +x=480, y=201..210 +x=608, y=162..171 +x=607, y=1482..1495 +x=505, y=257..260 +x=602, y=1163..1178 +x=647, y=936..944 +x=560, y=616..623 +x=670, y=633..646 +x=551, y=1735..1745 +x=506, y=1299..1301 +x=751, y=1094..1111 +x=774, y=1621..1623 +x=461, y=1404..1410 +x=747, y=1211..1227 +y=1120, x=437..446 +y=1454, x=663..666 +y=533, x=731..745 +x=771, y=1447..1454 +x=608, y=142..150 +x=755, y=270..298 +y=822, x=626..632 +x=512, y=1571..1592 +x=535, y=1531..1535 +x=618, y=364..371 +y=90, x=517..536 +x=755, y=205..214 +x=684, y=555..557 +x=684, y=761..770 +x=727, y=1212..1227 +x=612, y=1226..1230 +y=325, x=604..609 +x=472, y=270..277 +y=41, x=621..637 +x=571, y=510..514 +x=623, y=618..622 +x=579, y=278..282 +x=577, y=1880..1906 +x=570, y=113..116 +x=603, y=117..124 +x=749, y=1848..1850 +x=483, y=425..432 +y=1259, x=541..551 +x=472, y=503..525 +x=648, y=404..416 +y=545, x=434..448 +x=609, y=1881..1891 +y=1679, x=716..718 +x=633, y=1531..1533 +x=442, y=604..612 +y=40, x=729..741 +x=457, y=431..439 +x=591, y=1053..1065 +y=898, x=506..534 +x=483, y=1204..1210 +x=605, y=502..515 +x=687, y=746..748 +x=638, y=1128..1141 +x=663, y=1167..1177 +x=685, y=699..708 +y=967, x=735..748 +x=721, y=1271..1273 +y=585, x=686..692 +y=1900, x=693..701 +x=627, y=276..284 +y=295, x=659..683 +x=575, y=1253..1268 +x=697, y=1434..1460 +x=479, y=1886..1910 +y=1378, x=706..730 +y=1577, x=522..535 +x=639, y=1061..1069 +y=1803, x=492..499 +y=1439, x=535..542 +x=546, y=180..194 +x=663, y=1454..1456 +y=1567, x=630..647 +x=536, y=78..90 +x=776, y=345..358 +x=468, y=1780..1807 +x=488, y=1051..1072 +x=446, y=124..147 +y=1160, x=676..678 +y=1764, x=461..472 +y=1196, x=494..507 +x=710, y=1037..1065 +x=612, y=504..518 +x=780, y=1908..1911 +x=467, y=294..310 +y=1624, x=445..461 +x=635, y=915..929 +x=497, y=1100..1103 +x=461, y=960..967 +x=577, y=1305..1318 +x=659, y=1466..1468 +y=237, x=532..541 +y=242, x=626..646 +y=1099, x=619..646 +y=1846, x=590..612 +y=1268, x=575..591 +x=682, y=721..731 +y=1069, x=639..641 +y=1682, x=704..726 +y=1048, x=608..631 +x=573, y=720..741 +y=1807, x=535..538 +x=620, y=443..448 +x=541, y=1342..1354 +x=745, y=512..533 +x=769, y=1195..1198 +x=464, y=1105..1108 +x=582, y=861..886 +x=733, y=1651..1665 +x=595, y=273..285 +x=475, y=1488..1491 +x=537, y=1739..1742 +y=1415, x=620..638 +y=770, x=684..687 +x=765, y=654..672 +x=746, y=1559..1580 +x=640, y=33..34 +x=607, y=1442..1451 +x=458, y=50..62 +x=496, y=555..561 +x=580, y=1628..1644 +x=683, y=978..990 +y=291, x=434..457 +y=129, x=556..576 +x=457, y=125..147 +x=754, y=1673..1682 +y=1045, x=589..600 +x=708, y=526..534 +x=556, y=121..129 +x=451, y=181..193 +y=1312, x=564..570 +y=729, x=751..769 +x=665, y=1313..1327 +x=588, y=1117..1119 +x=445, y=960..967 +x=599, y=906..923 +y=595, x=755..759 +x=731, y=200..211 +x=589, y=296..310 +x=759, y=585..595 +y=244, x=440..553 +x=580, y=1493..1499 +x=464, y=53..58 +x=465, y=411..416 +y=1896, x=598..624 +x=734, y=1797..1806 +x=534, y=1581..1588 +y=912, x=434..436 +y=26, x=646..665 +x=438, y=604..612 +y=1032, x=649..672 +x=674, y=198..214 +x=743, y=1800..1813 +y=1132, x=661..666 +x=679, y=613..624 +y=1826, x=557..566 +y=994, x=768..775 +x=442, y=395..397 +x=645, y=310..331 +y=867, x=751..754 +x=735, y=1691..1716 +x=755, y=484..491 +y=955, x=496..512 +x=514, y=669..696 +x=490, y=205..207 +x=779, y=1045..1055 +x=518, y=524..534 +y=1496, x=460..482 +y=491, x=738..755 +y=477, x=608..613 +x=457, y=18..23 +x=582, y=1512..1515 +y=836, x=457..466 +x=740, y=1196..1198 +x=701, y=1886..1900 +y=1881, x=609..615 +y=1347, x=769..790 +x=729, y=32..40 +x=523, y=1850..1867 +x=686, y=573..585 +y=834, x=717..733 +y=1512, x=737..748 +y=460, x=471..493 +x=520, y=907..910 +x=768, y=1688..1701 +y=863, x=751..754 +x=701, y=352..376 +x=557, y=656..667 +x=465, y=1135..1141 +x=613, y=1266..1287 +x=594, y=58..65 +x=717, y=856..874 +x=748, y=1413..1417 +y=1872, x=448..467 +y=298, x=563..569 +y=847, x=584..598 +y=1495, x=725..737 +y=658, x=703..720 +x=526, y=983..993 +y=250, x=640..652 +y=336, x=767..778 +y=336, x=460..463 +x=775, y=909..917 +x=723, y=1072..1087 +x=512, y=397..419 +x=450, y=1338..1364 +x=583, y=773..775 +x=530, y=789..801 +x=682, y=1833..1839 +x=739, y=1275..1280 +x=472, y=710..729 +y=1648, x=609..613 +y=1166, x=494..497 +x=441, y=200..212 +x=788, y=89..92 +x=782, y=707..720 +x=474, y=774..777 +y=1604, x=693..717 +y=1531, x=633..636 +y=169, x=708..711 +x=507, y=750..764 +x=737, y=827..851 +x=682, y=1170..1189 +y=171, x=608..629 +x=561, y=796..809 +x=680, y=248..261 +x=623, y=1688..1691 +y=552, x=725..736 +x=711, y=526..534 +y=900, x=720..746 +x=595, y=531..533 +y=532, x=529..533 +x=493, y=502..525 +x=580, y=1749..1773 +x=648, y=461..475 +x=573, y=1653..1681 +x=466, y=1900..1911 +x=471, y=795..821 +y=1366, x=470..486 +x=688, y=312..336 +x=513, y=1624..1643 +x=529, y=1370..1391 +x=781, y=1621..1623 +y=1698, x=463..470 +x=722, y=583..609 +x=637, y=86..93 +x=500, y=1208..1224 +x=474, y=1509..1520 +y=728, x=437..449 +x=500, y=1871..1877 +y=1065, x=591..609 +x=700, y=1766..1782 +y=1813, x=724..743 +y=1620, x=757..764 +x=632, y=1378..1387 +y=429, x=525..638 +x=534, y=883..898 +y=1386, x=493..518 +y=1259, x=642..645 +x=566, y=1810..1826 +x=439, y=1534..1541 +y=833, x=505..521 +y=722, x=759..763 +x=666, y=1114..1132 +y=1845, x=677..698 +y=328, x=604..609 +x=483, y=12..22 +x=739, y=141..159 +x=644, y=844..856 +x=750, y=149..150 +x=585, y=1256..1261 +y=1903, x=449..458 +x=517, y=254..265 +y=561, x=586..609 +x=724, y=1016..1018 +x=524, y=124..127 +x=518, y=583..586 +x=625, y=1401..1410 +x=713, y=1305..1309 +y=1192, x=632..634 +x=631, y=987..1003 +x=625, y=870..895 +x=706, y=1350..1378 +y=852, x=651..655 +y=1516, x=625..639 +x=467, y=1224..1238 +y=374, x=534..632 +x=689, y=1531..1539 +y=1087, x=723..742 +x=468, y=1488..1491 +x=665, y=592..603 +x=582, y=1256..1261 +x=616, y=1013..1018 +x=453, y=701..729 +x=653, y=1043..1045 +y=851, x=737..745 +x=566, y=787..793 +x=609, y=1442..1451 +y=1818, x=448..455 +y=184, x=749..768 +x=620, y=1404..1415 +x=507, y=571..589 +y=1904, x=668..673 +y=213, x=616..631 +x=685, y=1508..1511 +x=618, y=782..787 +x=553, y=716..736 +x=670, y=392..417 +x=725, y=986..1002 +x=611, y=1023..1025 +x=518, y=868..877 +x=761, y=1887..1897 +x=734, y=1214..1216 +y=109, x=523..545 +x=676, y=803..815 +x=521, y=815..833 +x=730, y=1350..1378 +x=768, y=1448..1454 +y=1533, x=633..636 +x=525, y=889..893 +x=510, y=596..613 +x=731, y=1608..1620 +y=1180, x=740..762 +x=475, y=1702..1722 +y=1912, x=693..701 +x=451, y=539..547 +y=568, x=512..524 +y=735, x=712..737 +x=434, y=203..215 +x=731, y=1567..1577 +x=586, y=936..938 +x=790, y=1438..1443 +x=441, y=745..765 +x=588, y=1354..1357 +x=455, y=1806..1818 +y=331, x=645..666 +x=539, y=789..801 +y=1108, x=464..468 +y=711, x=675..693 +y=352, x=549..599 +y=1768, x=736..760 +x=684, y=892..907 +x=738, y=485..491 +x=620, y=1688..1691 +y=1461, x=568..593 +y=1911, x=780..785 +y=816, x=534..558 +x=725, y=1487..1495 +x=769, y=1230..1246 +y=1867, x=724..737 +x=605, y=1739..1743 +x=786, y=1460..1488 +x=748, y=1504..1512 +x=684, y=1833..1839 +x=782, y=898..921 +x=504, y=668..696 +y=282, x=547..579 +y=583, x=518..520 +x=562, y=719..741 +x=671, y=1552..1555 +x=654, y=938..952 +y=277, x=472..476 +y=825, x=511..513 +x=513, y=1063..1071 +x=667, y=1203..1222 +x=738, y=1816..1828 +x=788, y=343..360 +x=604, y=325..328 +x=475, y=976..987 +x=688, y=1719..1738 +x=718, y=792..800 +y=1391, x=529..541 +x=706, y=884..887 +y=1888, x=627..638 +y=803, x=489..496 +y=1828, x=738..744 +x=751, y=863..867 +x=570, y=1330..1351 +y=623, x=560..573 +x=466, y=834..836 +x=553, y=235..244 +y=1611, x=626..646 +y=1531, x=535..539 +x=489, y=32..44 +x=598, y=1547..1557 +x=448, y=1858..1872 +x=485, y=76..88 +x=657, y=964..968 +x=655, y=715..720 +x=653, y=595..606 +x=496, y=848..873 +y=1191, x=575..582 +y=308, x=769..785 +x=784, y=1811..1830 +x=594, y=861..886 +y=1168, x=494..497 +x=449, y=1117..1142 +x=460, y=1836..1838 +y=1085, x=590..594 +x=586, y=1884..1890 +y=432, x=463..483 +x=452, y=1557..1568 +x=599, y=255..263 +y=1189, x=679..682 +x=521, y=1444..1454 +x=576, y=803..806 +x=754, y=863..867 +y=606, x=653..671 +x=650, y=138..165 +y=147, x=536..540 +y=1023, x=661..663 +x=509, y=176..194 +x=635, y=1041..1052 +y=88, x=665..685 +y=1539, x=679..689 +x=654, y=964..968 +y=331, x=460..463 +x=764, y=936..947 +x=769, y=1905..1915 +y=773, x=534..556 +x=674, y=79..85 +y=681, x=534..562 +x=522, y=1162..1184 +x=701, y=32..39 +x=744, y=1816..1828 +x=704, y=1664..1682 +y=1891, x=609..615 +x=648, y=961..971 +x=628, y=637..641 +y=1668, x=769..777 +x=725, y=543..552 +x=773, y=1230..1246 +x=638, y=676..695 +y=787, x=736..754 +y=736, x=541..553 +x=664, y=845..856 +y=1529, x=556..578 +x=633, y=1022..1025 +y=65, x=594..598 +x=627, y=1378..1387 +x=510, y=257..260 +x=619, y=1086..1099 +y=874, x=717..720 +x=449, y=722..728 +x=679, y=1484..1495 +x=529, y=1480..1484 +y=973, x=568..570 +x=462, y=702..729 +y=863, x=571..573 +y=1138, x=707..713 +x=661, y=1115..1132 +x=529, y=1300..1301 +y=801, x=530..539 +x=663, y=1367..1385 +x=645, y=1212..1216 +x=579, y=491..517 +x=530, y=1613..1617 +y=836, x=664..683 +y=1314, x=564..570 +x=494, y=1166..1168 +y=1511, x=685..691 +x=531, y=121..130 +y=779, x=575..590 +x=516, y=61..65 +x=726, y=133..148 +y=1229, x=438..442 +x=581, y=1389..1409 +x=745, y=148..150 +x=534, y=673..681 +x=487, y=181..193 +x=496, y=304..326 +y=1003, x=631..639 +x=764, y=909..917 +x=529, y=517..532 +y=821, x=449..471 +y=641, x=628..654 +y=1541, x=495..515 +x=645, y=1229..1241 +y=20, x=556..575 +y=1246, x=769..773 +x=764, y=1593..1620 +y=215, x=434..451 +x=665, y=74..88 +x=698, y=115..140 +y=1910, x=479..485 +x=690, y=963..977 +x=691, y=1463..1473 +x=780, y=204..214 +x=492, y=1896..1905 +y=74, x=537..539 +x=472, y=1779..1807 +x=437, y=794..802 +y=612, x=438..442 +x=557, y=1080..1106 +x=645, y=1709..1732 +x=526, y=804..810 +y=194, x=509..521 +y=365, x=713..722 +x=773, y=454..458 +x=452, y=655..664 +x=478, y=82..85 +x=615, y=1881..1891 +x=498, y=1411..1419 +x=479, y=823..842 +y=130, x=507..531 +y=895, x=625..630 +x=529, y=1458..1462 +y=1620, x=522..549 +y=193, x=451..487 +y=1722, x=447..475 +y=1045, x=653..655 +y=285, x=537..595 +x=691, y=1800..1802 +y=1745, x=530..551 +x=632, y=1401..1410 +y=1848, x=749..754 +x=642, y=1168..1177 +y=310, x=463..467 +y=1778, x=443..454 +y=1578, x=756..780 +x=478, y=510..521 +y=115, x=594..597 +x=613, y=1682..1695 +y=1617, x=530..540 +y=1141, x=616..638 +x=698, y=844..858 +x=647, y=1293..1296 +x=533, y=1179..1181 +x=582, y=1331..1351 +y=411, x=533..553 +y=284, x=609..627 +x=687, y=699..708 +x=678, y=37..60 +y=165, x=650..671 +x=690, y=1229..1247 +x=648, y=437..447 +y=1697, x=528..551 +x=649, y=677..695 +y=1742, x=537..541 +x=582, y=1191..1196 +x=594, y=1505..1521 +x=764, y=88..92 +x=637, y=470..472 +y=922, x=715..718 +y=1156, x=530..532 +y=1716, x=717..735 +y=1380, x=570..577 +y=419, x=494..512 +y=685, x=699..703 +x=443, y=1752..1778 +x=763, y=722..724 +x=604, y=1419..1424 +x=512, y=625..633 +y=971, x=648..666 +x=704, y=1528..1531 +x=581, y=677..691 +x=752, y=1652..1665 +x=440, y=1403..1410 +x=458, y=1836..1838 +x=591, y=1253..1268 +x=768, y=1524..1536 +y=603, x=660..665 +x=678, y=1148..1160 +y=219, x=529..536 +x=637, y=1557..1562 +x=537, y=63..74 +x=471, y=4..30 +y=1392, x=622..642 +y=538, x=553..577 +y=1417, x=742..748 +x=453, y=1619..1621 +x=610, y=33..47 +y=62, x=458..475 +x=720, y=656..658 +x=610, y=1364..1366 +x=476, y=1243..1254 +x=754, y=1691..1704 +y=741, x=562..573 +y=660, x=741..750 +y=517, x=560..579 +x=746, y=1192..1208 +x=691, y=526..532 +x=708, y=141..169 +y=1313, x=669..683 +x=638, y=419..429 +x=476, y=271..277 +y=153, x=569..573 +x=671, y=742..752 +x=597, y=736..753 +y=1773, x=580..591 +x=599, y=527..539 +y=1166, x=574..579 +y=1535, x=535..539 +x=500, y=1851..1867 +x=575, y=1191..1196 +x=473, y=1833..1843 +x=607, y=296..310 +x=645, y=437..447 +y=1018, x=602..616 +x=619, y=922..948 +x=480, y=1630..1638 +x=532, y=1136..1156 +y=993, x=526..546 +x=736, y=1757..1768 +x=467, y=1136..1141 +x=616, y=1266..1287 +x=562, y=1197..1221 +x=700, y=1863..1877 +x=722, y=1363..1368 +y=81, x=524..528 +x=553, y=1375..1383 +x=463, y=1273..1293 +y=1120, x=604..628 +x=578, y=803..806 +x=541, y=1245..1259 +y=1302, x=632..656 +x=435, y=1042..1051 +y=695, x=638..649 +x=788, y=1614..1630 +y=518, x=595..612 +y=1451, x=607..609 +y=1293, x=437..463 +x=470, y=656..664 +x=455, y=1338..1364 +x=600, y=1444..1455 +x=592, y=905..923 +x=711, y=1428..1441 +y=1831, x=732..750 +x=651, y=324..326 +x=520, y=583..586 +x=647, y=1396..1410 +x=481, y=750..764 +x=559, y=1582..1588 +x=489, y=609..616 +y=1004, x=585..610 +x=460, y=477..480 +x=556, y=1346..1358 +y=585, x=755..759 +y=904, x=485..501 +y=1491, x=619..621 +x=758, y=113..132 +x=609, y=277..284 +x=753, y=612..635 +x=672, y=249..261 +y=893, x=662..664 +x=458, y=1885..1903 +x=594, y=1083..1085 +x=761, y=245..256 +x=725, y=90..92 +x=767, y=1169..1178 +x=603, y=470..481 +y=514, x=717..720 +x=605, y=1832..1839 +x=613, y=475..477 +x=611, y=1337..1349 +x=680, y=891..907 +x=535, y=1412..1439 +x=767, y=578..599 +y=1354, x=514..541 +x=696, y=1359..1381 +x=634, y=717..745 +x=493, y=1369..1386 +x=534, y=811..816 +x=472, y=1580..1591 +y=144, x=624..630 +x=772, y=1490..1504 +x=572, y=1006..1020 +x=554, y=965..979 +x=479, y=55..68 +y=1227, x=727..747 +y=150, x=608..611 +y=381, x=727..748 +x=556, y=766..773 +x=750, y=638..660 +y=952, x=635..654 +y=1897, x=761..781 +y=1351, x=570..582 +x=642, y=913..926 +x=786, y=1687..1693 +y=1196, x=575..582 +y=1613, x=530..540 +x=476, y=922..929 +x=700, y=880..891 +y=676, x=714..722 +x=732, y=1023..1034 +x=717, y=831..834 +x=783, y=451..461 +y=12, x=756..766 +x=649, y=831..835 +y=148, x=722..726 +x=467, y=53..58 +y=967, x=445..461 +x=461, y=1610..1624 +x=435, y=1577..1581 +x=545, y=1346..1358 +x=519, y=1242..1248 +x=434, y=282..291 +y=893, x=513..525 +x=536, y=1822..1830 +x=773, y=1864..1877 +x=577, y=1366..1380 +x=517, y=1091..1118 +x=551, y=1146..1169 +x=541, y=237..240 +x=594, y=783..787 +y=757, x=497..500 +x=711, y=142..169 +x=574, y=935..938 +y=880, x=664..681 +y=1248, x=494..519 +y=809, x=561..587 +x=507, y=120..130 +x=713, y=1607..1620 +x=548, y=805..807 +y=793, x=551..566 +y=987, x=475..479 +x=756, y=4..12 +x=463, y=426..432 +x=513, y=820..825 +x=727, y=1112..1139 +x=497, y=200..210 +y=990, x=666..683 +y=1051, x=435..452 +x=767, y=321..336 +y=321, x=541..554 +y=1832, x=600..605 +x=573, y=1730..1743 +y=547, x=451..462 +y=1454, x=768..771 +y=1637, x=730..732 +x=513, y=889..893 +y=76, x=629..647 +y=613, x=508..510 +x=785, y=285..308 +y=1484, x=529..537 +x=594, y=1225..1230 +x=605, y=922..948 +x=481, y=1794..1822 +x=739, y=1733..1745 +x=774, y=1195..1198 +y=1558, x=740..742 +x=475, y=50..62 +y=390, x=637..639 +x=731, y=112..132 +x=667, y=95..120 +x=671, y=1677..1693 +y=1695, x=613..638 +x=511, y=32..44 +x=467, y=1857..1872 +x=554, y=321..326 +x=749, y=1892..1906 +y=909, x=764..775 +y=1108, x=487..512 +x=478, y=1836..1840 +x=624, y=461..475 +x=599, y=320..331 +y=88, x=468..485 +y=1301, x=506..529 +y=1392, x=737..745 +x=455, y=1510..1520 +y=371, x=618..620 +x=608, y=1036..1048 +x=735, y=1784..1786 +x=516, y=1748..1775 +y=1117, x=610..622 +y=1460, x=697..699 +y=1822, x=481..489 +y=533, x=592..595 +x=498, y=724..727 +y=932, x=588..597 +y=1387, x=627..632 +y=1178, x=602..609 +x=688, y=1627..1639 +x=568, y=1388..1409 +x=619, y=1480..1491 +y=450, x=638..654 +y=1640, x=570..573 +y=1762, x=768..774 +y=1410, x=625..632 +y=1072, x=475..488 +y=1129, x=674..696 +x=539, y=63..74 +x=483, y=1584..1588 +y=1854, x=713..760 +y=263, x=588..599 +y=1851, x=536..545 +x=511, y=1470..1488 +x=578, y=1542..1553 +y=1456, x=663..666 +y=1008, x=671..677 +y=1906, x=745..749 +x=742, y=1413..1417 +y=261, x=672..680 +x=560, y=490..517 +y=691, x=576..581 +x=670, y=198..214 +x=731, y=1456..1470 +x=720, y=10..15 +y=1640, x=719..744 +y=426, x=733..755 +x=738, y=263..283 +x=598, y=824..847 +x=527, y=1179..1181 +x=466, y=99..110 +x=544, y=162..168 +x=701, y=1910..1912 +x=486, y=1584..1588 +y=1748, x=469..476 +x=545, y=1845..1851 +x=657, y=1466..1468 +x=746, y=898..900 +y=513, x=673..684 +y=1184, x=522..544 +x=492, y=1781..1803 +y=1031, x=562..567 +x=729, y=142..159 +y=95, x=755..761 +x=478, y=96..107 +x=681, y=1720..1738 +x=698, y=352..376 +x=578, y=572..585 +x=600, y=1026..1045 +y=810, x=505..526 +x=581, y=38..63 +y=1911, x=466..470 +y=376, x=698..701 +x=666, y=962..971 +x=494, y=1241..1248 +x=699, y=1358..1381 +y=391, x=524..541 +x=661, y=613..624 +x=599, y=1059..1061 +x=745, y=1366..1392 +y=1789, x=726..748 +x=736, y=85..100 +x=664, y=823..836 +y=1462, x=529..538 +x=658, y=831..835 +y=405, x=701..708 +x=570, y=1637..1640 +x=699, y=1433..1460 +x=448, y=1244..1254 +x=671, y=138..165 +x=693, y=743..752 +x=511, y=303..326 +x=551, y=1246..1259 +y=838, x=536..556 +y=1562, x=637..639 +y=283, x=724..738 +y=116, x=549..570 +x=694, y=392..417 +x=595, y=617..622 +x=790, y=1343..1347 +x=757, y=46..60 +x=525, y=418..429 +x=652, y=247..250 +y=1470, x=731..747 +x=508, y=596..613 +y=917, x=764..775 +y=1771, x=688..692 +y=1693, x=786..788 +x=657, y=1396..1410 +y=68, x=479..526 +x=712, y=222..240 +x=715, y=1466..1482 +x=473, y=843..866 +x=657, y=1081..1101 +y=326, x=496..511 +y=1877, x=700..773 +x=639, y=1507..1516 +y=514, x=565..571 +x=437, y=1274..1293 +x=742, y=1073..1087 +y=977, x=690..716 +x=674, y=758..780 +y=447, x=645..648 +y=789, x=696..700 +y=92, x=764..788 +y=877, x=672..674 +x=706, y=784..794 +x=720, y=897..900 +y=825, x=618..638 +y=979, x=554..577 +y=1775, x=506..516 +x=522, y=1569..1577 +x=711, y=1261..1270 +x=654, y=637..641 +x=717, y=1270..1273 +x=442, y=794..802 +y=1743, x=605..632 +x=713, y=85..100 +x=533, y=516..532 +y=1299, x=607..629 +x=707, y=583..609 +x=469, y=1389..1416 +y=1381, x=696..699 +y=895, x=662..664 +x=449, y=1885..1903 +x=486, y=1150..1171 +x=781, y=1887..1897 +y=65, x=516..518 +x=630, y=130..144 +y=624, x=661..679 +y=1871, x=724..737 +x=649, y=1021..1032 +y=461, x=765..783 +x=638, y=1427..1437 +x=525, y=1469..1488 +x=453, y=156..173 +x=669, y=572..585 +x=740, y=1244..1263 +x=755, y=76..95 +x=570, y=1312..1314 +y=1459, x=646..673 +y=1867, x=500..523 +x=485, y=893..904 +y=1786, x=735..740 +x=724, y=1799..1813 +x=580, y=773..775 +y=22, x=483..501 +x=577, y=964..979 +y=1838, x=458..460 +y=1198, x=736..740 +x=658, y=1204..1222 +y=1689, x=595..598 +y=1410, x=440..461 +x=709, y=1313..1314 +y=794, x=684..706 +y=664, x=452..470 +x=503, y=525..534 +x=742, y=742..745 +x=597, y=930..932 +x=768, y=654..672 +x=501, y=893..904 +x=524, y=81..87 +y=917, x=510..530 +x=700, y=115..140 +x=503, y=921..929 +y=1221, x=562..564 +x=448, y=745..765 +y=889, x=513..525 +x=783, y=1034..1042 +x=613, y=1553..1578 +x=457, y=282..291 +x=693, y=676..690 +y=1830, x=536..543 +y=30, x=447..471 +x=501, y=321..323 +y=1578, x=613..627 +x=592, y=1188..1205 +x=464, y=220..229 +x=563, y=529..532 +y=1557, x=637..639 +x=671, y=1627..1639 +x=465, y=1514..1516 +x=463, y=331..336 +y=1280, x=739..758 +x=562, y=674..681 +x=607, y=1295..1299 +x=671, y=79..85 +x=598, y=1667..1689 +x=475, y=1052..1072 +y=1454, x=521..538 +x=616, y=202..213 +x=565, y=510..514 +y=1637, x=570..573 +x=497, y=753..757 +y=85, x=476..478 +x=729, y=1193..1208 +y=638, x=538..543 +y=1055, x=775..779 +x=693, y=702..711 +y=156, x=563..579 +y=1091, x=579..600 +x=524, y=381..391 +y=1296, x=647..650 +x=543, y=595..600 +y=1757, x=637..656 +y=1424, x=594..604 +y=1127, x=767..790 +y=1839, x=600..605 +x=753, y=439..465 +x=638, y=1886..1888 +x=602, y=1059..1061 +y=151, x=524..546 +x=541, y=1369..1391 +x=671, y=976..987 +x=693, y=1596..1604 +x=579, y=1154..1166 +x=598, y=1111..1122 +y=585, x=578..669 +x=460, y=1477..1496 +y=1441, x=707..711 +x=576, y=678..691 +x=537, y=273..285 +y=1531, x=696..704 +x=696, y=789..791 +x=751, y=714..729 +x=580, y=1667..1670 +x=568, y=529..532 +x=680, y=1765..1782 +x=625, y=1508..1516 +y=1172, x=648..655 +x=459, y=842..866 +y=452, x=702..730 +x=713, y=1454..1458 +x=691, y=1508..1511 +x=599, y=340..352 +x=629, y=36..38 +y=60, x=750..757 +x=528, y=571..589 +x=638, y=810..825 +x=502, y=1665..1670 +x=642, y=1212..1216 +y=266, x=547..585 +x=591, y=1750..1773 +x=736, y=1243..1263 +x=505, y=814..833 +x=474, y=217..225 +x=601, y=179..203 +x=506, y=1662..1681 +x=468, y=76..88 +x=535, y=1568..1577 +y=40, x=494..502 +y=1398, x=522..524 +x=609, y=1463..1473 +x=578, y=1667..1670 +y=389, x=473..476 +y=561, x=482..496 +x=605, y=118..124 +x=676, y=1147..1160 +x=490, y=822..842 +x=679, y=763..774 +x=673, y=487..513 +x=449, y=795..821 +y=842, x=479..490 +x=498, y=1083..1088 +x=570, y=1542..1553 +x=471, y=327..353 +y=1413, x=753..768 +x=552, y=1552..1557 +y=1665, x=733..752 +x=460, y=331..336 +x=741, y=638..660 +x=507, y=495..506 +x=525, y=626..633 +x=666, y=1228..1241 +x=722, y=1589..1598 +x=745, y=1715..1724 +x=681, y=867..880 +y=532, x=687..691 +x=609, y=1620..1648 +x=520, y=1526..1547 +x=470, y=1344..1366 +x=777, y=1111..1115 +x=624, y=131..144 +x=641, y=1061..1069 +x=676, y=177..180 +x=672, y=865..877 +x=744, y=1631..1640 +y=1416, x=685..692 +y=1302, x=535..541 +y=100, x=713..736 +y=915, x=546..559 +x=457, y=834..836 +x=586, y=465..478 +x=633, y=1063..1074 +y=1383, x=553..557 +x=569, y=1146..1169 +x=637, y=1753..1757 +y=780, x=668..674 +x=494, y=847..873 +x=626, y=442..448 +y=1807, x=468..472 +x=736, y=759..787 +x=532, y=237..240 +x=627, y=1483..1495 +x=573, y=1637..1640 +x=509, y=1570..1592 +x=447, y=5..30 +y=635, x=753..770 +x=775, y=1271..1298 +x=679, y=177..180 +y=926, x=642..645 +x=750, y=1819..1831 +x=768, y=162..184 +y=1314, x=698..709 +y=39, x=701..710 +y=140, x=698..700 +x=470, y=1683..1698 +x=746, y=1670..1679 +x=656, y=485..497 +x=626, y=819..822 +x=434, y=524..545 +x=718, y=1673..1679 +x=650, y=1566..1577 +x=671, y=998..1008 +x=654, y=324..326 +y=1553, x=570..578 +x=513, y=162..168 +y=155, x=603..618 +x=598, y=1566..1593 +y=1059, x=680..695 +x=494, y=36..40 +x=543, y=1823..1830 +x=575, y=7..20 +y=1670, x=493..502 +y=877, x=512..518 +x=628, y=117..120 +x=654, y=440..450 +x=460, y=1708..1719 +x=639, y=988..1003 +x=642, y=1187..1198 +x=636, y=1531..1533 +x=507, y=1181..1196 +y=752, x=671..693 +x=475, y=1650..1653 +y=1673, x=652..665 +y=1270, x=690..711 +x=576, y=121..129 +x=686, y=1097..1102 +x=496, y=1581..1591 +y=1682, x=738..754 +x=647, y=1554..1567 +y=923, x=592..599 +x=591, y=1117..1119 +x=683, y=823..836 +x=693, y=1230..1247 +x=600, y=1832..1839 +x=656, y=1753..1757 +x=479, y=977..987 +x=775, y=992..994 +x=536, y=821..838 +x=745, y=1893..1906 +x=521, y=177..194 +x=647, y=1010..1012 +x=713, y=1466..1482 +x=564, y=1312..1314 +x=711, y=884..887 +x=449, y=1424..1445 +y=815, x=676..690 +x=748, y=364..381 +x=499, y=1135..1139 +y=1704, x=754..774 +x=736, y=543..552 +x=573, y=1506..1521 +x=461, y=1369..1380 +x=618, y=810..825 +x=722, y=666..676 +y=110, x=466..485 +x=670, y=1526..1538 +x=734, y=860..869 +x=758, y=1275..1280 +y=1065, x=710..712 +x=778, y=320..336 +y=696, x=504..514 +x=663, y=1023..1025 +y=1541, x=439..466 +x=590, y=1083..1085 +x=741, y=376..378 +y=1473, x=609..691 +x=540, y=145..147 +x=681, y=1547..1558 +y=360, x=781..788 +x=726, y=1663..1682 +x=610, y=118..120 +y=1002, x=722..725 +y=708, x=685..687 +x=438, y=1219..1229 +x=577, y=523..538 +x=472, y=1758..1764 +x=603, y=502..515 +x=502, y=1062..1071 +y=1043, x=653..655 +y=1366, x=610..614 +x=718, y=881..891 +y=306, x=526..546 +x=616, y=1127..1141 +x=673, y=976..987 +y=1370, x=602..622 +x=512, y=1430..1436 +y=1884, x=586..588 +y=223, x=597..603 +x=774, y=1690..1704 +y=515, x=603..605 +x=759, y=722..724 +x=683, y=1292..1313 +y=1074, x=633..649 +y=1115, x=777..779 +y=47, x=587..610 +x=685, y=153..169 +y=497, x=612..656 +x=524, y=487..489 +x=502, y=941..943 +x=533, y=401..411 +x=722, y=987..1002 +x=652, y=1207..1219 +y=820, x=511..513 +x=606, y=179..203 +y=947, x=757..764 +x=477, y=687..695 +y=1644, x=564..580 +x=753, y=1406..1413 +x=451, y=1458..1464 +x=548, y=455..476 +x=655, y=100..105 +y=622, x=595..623 +y=1222, x=658..667 +y=1118, x=517..531 +y=151, x=569..573 +x=472, y=217..225 +x=465, y=476..480 +x=531, y=1091..1118 +y=173, x=442..453 +x=630, y=1555..1567 +x=541, y=382..391 +x=624, y=1424..1434 +y=475, x=624..648 +x=493, y=9..19 +y=1171, x=486..505 +x=717, y=1690..1716 +x=665, y=1648..1673 +x=707, y=1115..1138 +x=564, y=1444..1447 +x=518, y=1369..1386 +x=629, y=55..76 +y=1205, x=570..592 +y=856, x=644..664 +y=1802, x=667..691 +x=738, y=1672..1682 +y=150, x=745..750 +y=1101, x=657..671 +x=444, y=200..212 +x=768, y=1407..1413 +y=1738, x=681..688 +x=755, y=418..426 +x=468, y=1105..1108 +x=581, y=1701..1723 +y=731, x=682..708 +x=537, y=1480..1484 +x=626, y=231..242 +y=1117, x=588..591 +x=792, y=1905..1915 +y=278, x=547..579 +x=590, y=768..779 +x=634, y=1184..1192 +x=434, y=896..912 +x=570, y=1366..1380 +x=782, y=1270..1298 +x=534, y=384..388 +x=463, y=294..310 +y=690, x=693..710 +y=1588, x=483..486 +x=523, y=100..109 +x=631, y=1035..1048 +x=466, y=1368..1380 +y=1450, x=556..574 +x=627, y=1552..1578 +x=518, y=61..65 +x=717, y=1595..1604 +x=533, y=736..753 +y=929, x=476..503 +y=265, x=490..517 +y=1598, x=722..746 +y=1555, x=671..673 +y=388, x=532..534 +x=574, y=1433..1450 +y=448, x=620..626 +x=716, y=1044..1058 +x=563, y=291..298 +x=741, y=791..800 +y=748, x=682..687 +y=1499, x=580..601 +y=1327, x=620..665 +x=496, y=785..803 +x=614, y=1364..1366 +x=549, y=340..352 +y=1003, x=646..657 +x=570, y=180..194 +y=1840, x=478..497 +x=545, y=1527..1547 +y=1282, x=646..669 +x=675, y=152..169 +y=1380, x=461..466 +x=764, y=1714..1724 +x=698, y=1074..1087 +x=646, y=1085..1099 +x=630, y=1148..1158 +x=510, y=902..917 +y=1158, x=630..649 +y=1723, x=573..581 +y=557, x=684..704 +y=866, x=459..473 +x=558, y=810..816 +x=638, y=439..450 +x=735, y=946..967 +y=324, x=651..654 +x=683, y=290..295 +y=943, x=502..506 +y=60, x=678..685 +x=704, y=1484..1495 +y=329, x=533..561 +y=142, x=608..611 +x=638, y=1681..1695 +x=742, y=1554..1558 +x=762, y=1172..1180 +x=685, y=852..855 +y=194, x=546..570 +x=588, y=1853..1867 +x=568, y=1455..1461 +y=1504, x=763..772 +x=727, y=90..92 +y=918, x=687..697 +x=727, y=363..381 +x=632, y=382..394 +x=489, y=1794..1822 +y=852, x=685..692 +x=624, y=1873..1896 +x=732, y=1633..1637 +x=541, y=715..736 +y=929, x=635..652 +x=556, y=1525..1529 +y=1436, x=512..519 +x=767, y=345..358 +x=731, y=511..533 +y=529, x=563..568 +y=1087, x=684..698 +x=705, y=199..211 +x=522, y=1377..1398 +x=752, y=1368..1391 +x=506, y=1749..1775 +x=673, y=1448..1459 +x=436, y=895..912 +x=740, y=1555..1558 +y=1915, x=769..792 +x=514, y=1341..1354 +y=1020, x=572..579 +x=713, y=347..365 +x=594, y=1419..1424 +x=587, y=797..809 +x=590, y=1354..1357 +x=495, y=9..19 +x=476, y=889..897 +y=1464, x=451..457 +x=661, y=1548..1558 +y=1419, x=487..498 +x=590, y=736..753 +x=747, y=577..599 +x=712, y=729..735 +x=643, y=936..944 +x=656, y=1708..1732 +x=693, y=1886..1900 +x=632, y=361..374 +x=736, y=1196..1198 +x=751, y=1330..1341 +x=570, y=1188..1205 +y=1516, x=465..468 +x=788, y=1688..1693 +x=679, y=1531..1539 +y=1667, x=578..580 +x=741, y=1017..1018 +y=1265, x=632..656 +y=1621, x=451..453 +y=1679, x=746..748 +x=621, y=1480..1491 +x=737, y=245..256 +y=521, x=478..487 +y=1638, x=480..492 +x=649, y=1064..1074 +y=481, x=603..620 +x=669, y=1291..1313 +y=214, x=670..674 +y=1238, x=455..467 +y=394, x=632..648 +x=620, y=471..481 +y=1198, x=626..642 +y=107, x=476..478 +x=632, y=819..822 +x=766, y=3..12 +y=476, x=526..548 +x=632, y=1251..1265 +y=1256, x=582..585 +x=610, y=995..1004 +y=1538, x=596..670 +x=757, y=935..947 +y=753, x=520..533 +x=559, y=887..915 +x=769, y=1170..1178 +y=1368, x=722..724 +x=592, y=531..533 +y=775, x=580..583 +x=645, y=913..926 +x=688, y=1769..1771 +y=1254, x=448..476 +y=968, x=654..657 +x=657, y=983..1003 +x=470, y=1900..1911 +x=448, y=1807..1818 +x=603, y=135..155 +y=1177, x=642..663 +x=745, y=827..851 +x=722, y=134..148 +x=442, y=1218..1229 +y=1141, x=465..467 +x=532, y=384..388 +x=721, y=399..403 +x=761, y=1688..1701 +x=534, y=487..489 +x=588, y=256..263 +x=679, y=1337..1349 +x=695, y=1031..1059 +x=527, y=1553..1557 +x=547, y=406..408 +x=780, y=1574..1578 +x=682, y=746..748 +x=671, y=1081..1101 +y=921, x=757..782 +y=1208, x=729..746 +y=44, x=489..511 +x=637, y=26..41 +y=302, x=536..540 +y=256, x=737..761 +x=519, y=1429..1436 +x=503, y=321..323 +y=1178, x=767..769 +x=750, y=1560..1580 +x=684, y=488..513 +y=1437, x=618..638 +x=524, y=907..910 +x=546, y=983..993 +x=538, y=1443..1454 +x=769, y=1343..1347 +y=1588, x=534..559 +y=773, x=580..583 +x=677, y=998..1008 +x=697, y=911..918 +x=777, y=1438..1443 +x=708, y=396..405 +y=1836, x=458..460 +x=769, y=1644..1668 +x=768, y=991..994 +x=603, y=219..223 +y=169, x=675..685 +x=618, y=1426..1437 +x=488, y=205..207 +y=416, x=648..654 +y=162, x=513..544 +y=331, x=599..618 +y=212, x=441..444 +x=569, y=633..646 +y=1557, x=585..598 +y=1059, x=599..602 +x=618, y=320..331 +y=600, x=543..554 +y=897, x=474..476 +x=567, y=1016..1031 +x=476, y=364..389 +y=1591, x=472..496 +x=713, y=1840..1854 +y=603, x=588..597 +x=690, y=802..815 +x=642, y=1381..1392 +x=441, y=430..439 +x=482, y=1476..1496 +y=1257, x=759..763 +x=622, y=1380..1392 +x=455, y=1224..1238 +y=1867, x=588..605 +x=518, y=451..460 +x=530, y=1136..1156 +x=717, y=11..15 +y=646, x=569..670 +y=1693, x=671..696 +y=870, x=746..761 +y=800, x=718..741 +x=729, y=859..869 +x=673, y=1552..1555 +x=638, y=1403..1415 +y=1558, x=661..681 +x=454, y=327..353 +x=551, y=1081..1106 +x=559, y=158..171 +x=646, y=982..1003 +y=1061, x=599..602 +x=666, y=1454..1456 +x=735, y=741..745 +x=502, y=36..40 +x=746, y=855..870 +x=522, y=1599..1620 +x=636, y=1765..1774 +y=1261, x=582..585 +y=1577, x=650..731 +x=668, y=758..780 +x=687, y=527..532 +y=203, x=601..606 +x=773, y=1034..1042 +x=648, y=381..394 +x=733, y=830..834 +y=695, x=453..477 +x=513, y=1566..1567 +x=604, y=1108..1120 +x=485, y=1887..1910 +y=1890, x=586..588 +y=1230, x=594..612 +x=730, y=432..452 +y=1111, x=458..474 +y=63, x=555..581 +y=397, x=442..451 +y=364, x=618..620 +x=669, y=1272..1282 +x=693, y=657..667 +y=1732, x=645..656 +x=602, y=1013..1018 +x=719, y=1630..1640 +y=1263, x=736..740 +x=494, y=1180..1196 +y=589, x=507..528 +x=763, y=614..626 +x=551, y=787..793 +y=1025, x=611..633 +y=1455, x=600..618 +y=910, x=520..524 +x=511, y=820..825 +x=659, y=1765..1774 +x=714, y=665..676 +y=1691, x=620..623 +x=456, y=1578..1581 +y=23, x=457..463 +y=1653, x=475..483 +x=748, y=947..967 +x=526, y=293..306 +y=1012, x=664..684 +y=1592, x=509..512 +y=1241, x=645..666 +y=1181, x=527..533 +x=482, y=555..561 +x=534, y=361..374 +x=489, y=785..803 +x=692, y=1769..1771 +y=478, x=563..586 +x=692, y=572..585 +x=564, y=1197..1221 +x=710, y=33..39 +x=785, y=1908..1911 +y=180, x=676..679 +y=1214, x=734..736 +x=588, y=592..603 +x=555, y=38..63 +x=506, y=452..460 +y=1850, x=749..754 +x=485, y=1205..1210 +y=358, x=767..776 +x=588, y=930..932 +x=667, y=1366..1385 +x=448, y=523..545 +x=684, y=1073..1087 +x=480, y=1134..1139 +x=528, y=81..87 +x=651, y=842..852 +y=1391, x=752..775 +y=1630, x=768..788 +x=609, y=325..328 +x=474, y=158..171 +y=1701, x=761..768 +x=652, y=916..929 +x=763, y=1525..1536 +x=553, y=522..538 +x=622, y=1358..1370 +y=806, x=576..578 +y=1843, x=453..473 +x=520, y=736..753 +x=680, y=1032..1059 +x=556, y=1433..1450 +x=474, y=1089..1111 +x=578, y=1526..1529 +y=626, x=760..763 +x=672, y=1020..1032 +x=563, y=466..478 +x=707, y=1160..1164 +x=779, y=1111..1115 +x=612, y=717..745 +y=124, x=603..605 +y=672, x=765..768 +y=378, x=732..741 +x=627, y=526..539 +x=594, y=89..115 +x=649, y=1148..1158 +x=723, y=1044..1058 +x=759, y=1234..1257 +x=585, y=252..266 +x=485, y=98..110 +x=601, y=1492..1499 +x=664, y=868..880 +x=514, y=1871..1877 +x=774, y=1739..1762 +y=34, x=640..659 +x=538, y=628..638 +y=539, x=599..627 +x=771, y=454..458 +x=655, y=1043..1045 +x=561, y=318..329 +x=661, y=1023..1025 +y=745, x=735..742 +x=626, y=722..736 +x=740, y=1784..1786 +x=642, y=1254..1259 +x=549, y=1599..1620 +x=490, y=255..265 +x=664, y=1504..1515 +x=593, y=1454..1461 +y=1902, x=520..543 +y=207, x=488..490 +x=781, y=342..360 +x=650, y=1293..1296 +x=612, y=1819..1846 +x=737, y=1486..1495 +x=495, y=1525..1541 +x=662, y=893..895 +x=471, y=444..460 +y=1782, x=680..700 +x=631, y=36..38 +y=298, x=755..757 +y=1491, x=468..475 +x=608, y=475..477 +x=463, y=1684..1698 +y=1581, x=435..456 +y=1515, x=664..716 +x=602, y=1357..1370 +x=452, y=1043..1051 +x=506, y=882..898 +x=652, y=1647..1673 +x=760, y=1756..1768 +x=563, y=142..156 +x=453, y=1833..1843 +x=473, y=363..389 +x=574, y=1154..1166 +x=739, y=1023..1034 +y=807, x=536..548 +x=620, y=1313..1327 +x=496, y=937..955 +y=105, x=651..655 +x=629, y=163..171 +y=534, x=503..518 +x=693, y=1909..1912 +y=58, x=464..467 +y=1122, x=570..598 +x=635, y=939..952 +y=904, x=652..673 +x=747, y=1455..1470 +x=788, y=707..720 +y=1409, x=568..581 +x=524, y=138..151 +x=673, y=1892..1904 +y=532, x=563..568 +x=777, y=1644..1668 +x=690, y=1261..1270 +y=1557, x=527..552 +y=1839, x=682..684 +x=541, y=1739..1742 +x=790, y=1461..1488 +x=754, y=1848..1850 +x=600, y=1080..1091 +x=535, y=1288..1302 +y=802, x=437..442 +y=92, x=725..727 +x=698, y=1312..1314 +y=729, x=453..462 +x=499, y=1782..1803 +y=1182, x=455..461 +x=684, y=1001..1012 +x=545, y=99..109 +x=512, y=938..955 +x=512, y=1662..1681 +y=1774, x=636..659 +x=713, y=1096..1102 +y=1495, x=607..627 +x=544, y=1162..1184 +y=510, x=565..571 +x=536, y=1844..1851 +y=869, x=729..734 +x=451, y=202..215 +x=487, y=1095..1108 +x=515, y=1526..1541 +x=451, y=394..397 +y=1103, x=497..505 +x=540, y=300..302 +x=567, y=1444..1447 +x=727, y=1306..1309 +x=675, y=701..711 +x=749, y=161..184 +y=1906, x=577..594 +x=724, y=1363..1368 +y=120, x=662..667 +x=703, y=655..658 +y=1102, x=686..713 +y=82, x=476..478 +x=731, y=63..71 +x=525, y=1209..1224 +y=609, x=707..722 +x=445, y=1609..1624 +x=626, y=85..93 +x=530, y=903..917 +x=664, y=1000..1012 +x=763, y=1233..1257 +x=462, y=1708..1719 +x=629, y=1294..1299 +y=1042, x=773..783 +x=659, y=32..34 +y=489, x=524..534 +x=656, y=1290..1302 +y=924, x=715..718 +y=765, x=441..448 +x=703, y=674..685 +x=736, y=1214..1216 +x=648, y=714..720 +x=655, y=842..852 +y=168, x=513..544 +x=541, y=1287..1302 +x=453, y=687..695 +y=720, x=648..655 +x=718, y=922..924 +y=1052, x=635..661 +x=744, y=398..403 +x=512, y=1095..1108 +y=907, x=680..684 +y=835, x=649..658 +x=646, y=231..242 +y=819, x=626..632 +x=665, y=4..26 +y=1681, x=506..512 +x=763, y=1491..1504 +y=1458, x=713..726 +y=1224, x=500..525 +y=1488, x=511..525 +x=716, y=1112..1139 +x=757, y=1594..1620 +x=505, y=804..810 +y=1743, x=573..584 +y=1139, x=716..727 +x=539, y=1531..1535 +y=225, x=472..474 +x=627, y=1887..1888 +x=737, y=1504..1512 +y=1447, x=564..567 +x=637, y=379..390 +x=724, y=1867..1871 +y=791, x=696..700 +x=457, y=1457..1464 +x=698, y=1826..1845 +x=729, y=1797..1806 +x=696, y=1528..1531 +y=416, x=457..465 +y=439, x=441..457 +x=458, y=1090..1111 +x=597, y=593..603 +x=524, y=566..568 +x=472, y=1425..1445 +y=465, x=747..753 +x=740, y=1172..1180 +y=85, x=671..674 +y=599, x=747..767 +y=1784, x=735..740 +x=726, y=1453..1458 +x=768, y=1739..1762 +x=708, y=914..928 +y=15, x=717..720 +y=1806, x=729..734 +x=621, y=26..41 +y=460, x=506..518 +x=584, y=823..847 +x=469, y=1738..1748 +x=667, y=1801..1802 +x=556, y=7..20 +x=631, y=201..213 +x=569, y=290..298 +x=674, y=845..858 +x=500, y=753..757 +x=767, y=1105..1127 +x=546, y=888..915 +x=754, y=760..787 +x=768, y=1614..1630 +x=557, y=1810..1826 +x=687, y=761..770 +x=732, y=376..378 +x=501, y=11..22 +x=540, y=1613..1617 +y=1749, x=725..745 +y=1088, x=481..498 +y=1164, x=707..727 +x=750, y=46..60 +x=704, y=554..557 +y=225, x=500..525 +x=534, y=765..773 +y=326, x=651..654 +y=667, x=557..693 +x=549, y=113..116 +x=710, y=677..690 +x=440, y=234..244 +y=323, x=501..503 +y=720, x=782..788 +x=588, y=1884..1890 +x=712, y=1037..1065 +x=535, y=1803..1807 +x=503, y=1565..1567 +y=858, x=674..698 +x=571, y=857..863 +x=519, y=124..127 +x=526, y=456..476 +x=568, y=968..973 +x=505, y=1149..1171 +y=525, x=472..493 +x=588, y=1512..1515 +y=1416, x=469..477 +y=938, x=574..586 +x=586, y=548..561 +y=944, x=643..647 +y=132, x=731..758 +x=442, y=156..173 +y=1877, x=500..514 +y=729, x=472..493 +x=640, y=470..472 +x=726, y=1778..1789 +y=403, x=721..744 +x=701, y=397..405 +x=480, y=219..229 +x=646, y=1586..1611 +y=1536, x=763..768 +x=741, y=33..40 +y=1358, x=545..556 +x=674, y=1118..1129 +y=1012, x=641..647 +x=758, y=63..71 +y=987, x=671..673 +y=1210, x=483..485 +x=544, y=1798..1810 +x=757, y=1095..1111 +x=745, y=1736..1749 +x=587, y=32..47 +x=585, y=1546..1557 +x=579, y=142..156 +x=497, y=1836..1840 +x=768, y=1811..1830 +y=1568, x=452..456 +y=211, x=705..731 +x=720, y=495..514 +x=765, y=450..461 +x=573, y=616..623 +x=760, y=1840..1854 +y=887, x=706..711 +x=546, y=139..151 +x=775, y=1367..1391 +y=1106, x=551..557 +y=637, x=628..654 +x=699, y=674..685 +y=1071, x=502..513 +y=127, x=519..524 +x=597, y=89..115 +y=1434, x=624..629 +x=533, y=317..329 +y=1364, x=450..455 +x=451, y=1619..1621 +y=214, x=755..780 +x=733, y=418..426 +y=1639, x=671..688 +x=492, y=1631..1638 +y=1018, x=724..741 +x=648, y=1170..1172 +x=497, y=1166..1168 +y=1318, x=554..577 +x=737, y=1733..1745 +x=632, y=1290..1302 +x=685, y=1400..1416 +x=476, y=96..107 +x=457, y=410..416 +y=1468, x=657..659 +x=640, y=246..250 diff --git a/src/main/resources/2018/day18.txt b/src/main/resources/2018/day18.txt new file mode 100644 index 00000000..77f7e29e --- /dev/null +++ b/src/main/resources/2018/day18.txt @@ -0,0 +1,50 @@ +...##.....|..|#.##|#.......#...#|.|..#..#|#||#..## +|#.#...||.#|.....|#|.#.|....#......|#.|....#....#. +..#..#.#..#..||.#.##|#|.|..|........|#...#|.|.||#. +|#....|.|.#.|....||###|.|#|..........#...#....#|.# +#.....|....#...#|||#.......|#.........|#..###|.#|# +..#.|.|...||#...||.#|...#.|...###|....|||.#|.#.... +.|..#..#.##|...|##...#.##.|.|..|.#...#|..|.#|..... +#||.|||.#..###|....|.|...|||...|||.|...||||#...#|. +#|..||.#..#..#|.|##.......#|#....#...##.|#...#.#|| +..#....#...|....||.#||.##|#.#|.....#.#|.|#...#.#.| +.|#|.||......|#....#..|#|#.##.|...|....|#.|.#.#.#. +.....||##...||..#.||......#|.||..|.|..|..........| +#|#..#||.|....||.|..|...||....|..|...##........|.. +.|#.|#|..|##...||.|##.#...#|#..|.#.|.|#..|..#...#. +##.......#.|....|.|#.|.#..#.#|.#|..###...#...#..|. +#..#.....##.....#...##.|..#..##.|.#.##.....|.|..## +....#.||....|.....|...|..#...|.|.....#.##||....#.. +|#.#..#..#.........||#..|.|#...........|.|#......# +|#..#.|..#..|.#..||.##..|.#.|..||...||.|.#|....#.| +#.#|.....#..||#....#.|..#..|.#|....|..|....|#....| +......||....||||.........##|....#..||.|.......|... +#.....|..#.|.##|..|.|.|#.#..|.....|..|#.|..|.|..#. +###|.|.#..##.#.|#...##||.#|...##|#....##...#....#| +..|...##....#.....##......|.#|..|...#|#.||#..|.|.. +|.||#..||....#..|......#|.#.##.#..|.#|#.|...##||#. +#.#.|..|.....|#.#|#.##||...||.||.||.||......|....# +..#|.......|#|.|....|...#.#|..||.#.#||.#..#|.....| +...|#.##|...#.|...#.|....#.##...|.#.#..#.....#|... +.....#.....|...#.##.#.|......|...#.#|.....|.#.|.#. +..#....#..|...|||..#..#.......#|..|..#|.|...|#..#| +..||||........#|.#.##...|..|||#...|...#|.|###...|| +||#.##.||.....#..||...........|....|.....|#|||#... +..|||#..|.||..|#.|#.#...#|#...|.###.#...|...#....# +...........|||..|||#.#...#|....####.##||...|..|... +.##.#|##|....#..|.#|#|.......|.|.....#..|...|||... +..#...|.|..#..#..|###.#........|......#.#....##|.. +#.|..|#|.#.#..||...#.#.....|#.|#......#||.#.|.#... +...#.....##.|##...#..#|.#.#.#..||..|#....#####..|. +.....#...#.#|........##|#.#.#....|.|........#|||.. +|..##|#.|.|...||#..#.|..#..##..#|.......#|#.#..|.| +|..|....#..|..|....#.|...##....|#...|...|.|#.|...| +..|.|#|#...|.##..##|||..#..|...#..#||...#|.|.#|.|. +.|...||.##.#...|.#.#...###||.|###|......|#....#### +.|.#..#.|..|##.....|.|.#.#||.#|.......|#..|##.||.. +...|..||...#|.|..|.....|.#.##.#..#...|##.|..##..#. +##.|.#...#|#|...##|#.....|..|#.#.#.##.#|...||..#.. +##|.#..|....#..#|.#|..||...#......#.#|.#.#|..#|#.. +|....|.#|#......|....#.#.....|..#.|...|##....|.||# +|.#.|...#...||#.##...|.|..#||...|..##|#......#.|.. +...|#.|......#....#......#.....#.#|..||..|#..#...# diff --git a/src/main/resources/2018/day19.txt b/src/main/resources/2018/day19.txt new file mode 100644 index 00000000..f6b4ae3e --- /dev/null +++ b/src/main/resources/2018/day19.txt @@ -0,0 +1,37 @@ +#ip 1 +addi 1 16 1 +seti 1 4 5 +seti 1 4 2 +mulr 5 2 4 +eqrr 4 3 4 +addr 4 1 1 +addi 1 1 1 +addr 5 0 0 +addi 2 1 2 +gtrr 2 3 4 +addr 1 4 1 +seti 2 6 1 +addi 5 1 5 +gtrr 5 3 4 +addr 4 1 1 +seti 1 7 1 +mulr 1 1 1 +addi 3 2 3 +mulr 3 3 3 +mulr 1 3 3 +muli 3 11 3 +addi 4 3 4 +mulr 4 1 4 +addi 4 18 4 +addr 3 4 3 +addr 1 0 1 +seti 0 7 1 +setr 1 4 4 +mulr 4 1 4 +addr 1 4 4 +mulr 1 4 4 +muli 4 14 4 +mulr 4 1 4 +addr 3 4 3 +seti 0 0 0 +seti 0 1 1 diff --git a/src/main/resources/2018/day2.txt b/src/main/resources/2018/day2.txt new file mode 100644 index 00000000..2049121b --- /dev/null +++ b/src/main/resources/2018/day2.txt @@ -0,0 +1,250 @@ +mgdsdwqulhrinkatfjoyzxcbvq +megsdwpulhrinkasfjdyzxcbvk +megsdwpulhmibkatfjoyzccbvq +megsdwtuohrinkatfjoyzecbvq +megsdwpulhdinkatfyoyzxcbvb +megszwpulhrirkatfjoyexcbvq +eegsdwpulhzinkatfjoyzxdbvq +megsdwpulhginkatfjoyqucbvq +leqsdwpulhrinkatfeoyzxcbvq +megsdwpblhrandatfjoyzxcbvq +megrdwpudhrinvatfjoyzxcbvq +mlgsdwpulhrinkatfuoyzxcbyq +mensdwpunhrinsatfjoyzxcbvq +megsdwpnlhrinqatfjoyzxcbuq +megsdwpnlhrinkatfqoysxcbvq +megsdwpulhrinkjtfjoywxobvq +megsdwpclhbinkaffjoyzxcbvq +mersdwpulhrinkattjoyzxcbdq +megsddpwohrinkatfjoyzxcbvq +mejsdwpulhrinratfjoyzxcbvl +megsdwpujhrinkatfjkbzxcbvq +megsdwpujhrinkatfjoyircbvq +megsdwgulhrinkatojoyzxcbvm +qegsdwpulhrinkatfjoyzxggvq +megsdwpflhrinkatfjsazxcbvq +megsdwpulhridkagfjoyzzcbvq +mejsdwpulhriykatfjoyyxcbvq +measdwpulhriakatfjoyzacbvq +mebsdwpulhrinkatfjoyzxmyvq +megsdwpflnrinkatfjoyzxcbxq +megsdwpulhxinuatfjoytxcbvq +megsdwsflhrinkatfjoyzxcmvq +megsdwpuuhritkarfjoyzxcbvq +megsdwpulhrinkazfjoyexcjvq +megsdwpulhrifkatfjokzxcbvc +megsdwmulvrinkatfjoyzxcblq +meggdwpulhrfnkatfjoybxcbvq +megsdwptlhrindatyjoyzxcbvq +megsdwpulhrinkauqjoyzxibvq +megsdwddlhrifkatfjoyzxcbvq +megddwpulhrinkagfjoyzxcbva +messdupulhrinkatfjoyzxqbvq +megsdwpuahrinkatfjotzxchvq +megsewpulhrankathjoyzxcbvq +megsdwpulhrinkatfjoynqcbvv +megsdwpulhrifkatfjotzxcbtq +megsdjpulcrinkitfjoyzxcbvq +fefsowpulhrinkatfjoyzxcbvq +megsdwpulapinkatfjoyzvcbvq +mejsdwpularinkatfjonzxcbvq +megsxwpllrrinkatfjoyzxcbvq +megsdlpulxvinkatfjoyzxcbvq +megsdwpulhriekztfjoyzxxbvq +megspwpulhrinuatfjoyzxcgvq +megqdwpulhrinkatfjoyzujbvq +megsdtpuehrinkatfjoyzxtbvq +megsdwjulhrmnmatfjoyzxcbvq +megjdwpulhrinkztfjoyzpcbvq +megsdwpuljrinkawfjlyzxcbvq +mewsdwpulhtinkatfjodzxcbvq +megsdwpulhrinkatfcoizxcmvq +meisdwpulhrinkatawoyzxcbvq +megshwpulhrinkatfjoyzxcbtz +megsdwpulhfinkatfjowzxcbvj +megodwpulhrcskatfjoyzxcbvq +megydxpulhrinkatfjofzxcbvq +megsdwpulhrinkatljoytxdbvq +mwgsdwpulyrinkatfjoyzxvbvq +meesdwpulhrinkatfjcwzxcbvq +cegsdwpwlhrinkatfioyzxcbvq +megsdwpulhrinkatfqhyxxcbvq +megsrrpulhrxnkatfjoyzxcbvq +megsdgpulhrinkatfjoypxcbnq +xegsdwpulhrinkaxkjoyzxcbvq +mngsdwpulhrenkatfjofzxcbvq +mecsdwpulhrinkabfjoozxcbvq +pegsdkpulhrinkatfuoyzxcbvq +megpdwpughrinkatfjoyzxzbvq +mxgrdwpulhrinyatfjoyzxcbvq +megsdwpulhpigkatfjoyzxcbfq +mhgsdwpulhrinkagfjoxzxcbvq +megsdwpblhtinkatfjqyzxcbvq +megsawvulhrinkatfjoyzxcfvq +metsuwpulhrinkatfjowzxcbvq +mexsdwpulhrinkatsjoyzxvbvq +megtdwpulhrinkatfjoizxcpvq +megidwpjlhrinkatfdoyzxcbvq +megsdwpuljrivkatfjoyqxcbvq +mespdppulhrinkatfjoyzxcbvq +megsdcpulhminkatftoyzxcbvq +megsdwpulhriskatfjayzlcbvq +mejsdwpulhrinkatfvoyzxibvq +megfdwputhriykatfjoyzxcbvq +megsdwparhrinkbtfjoyzxcbvq +mtgsdwpulhmingatfjoyzxcbvq +megsdwjulhrinkatfjtyzxtbvq +megsvwpulhrinkatfjoyzecbvf +megsdwpulprinkatyqoyzxcbvq +zegsdwpulhwinkatfjoyzxcfvq +megsdwiulhrinkatfjoyzxcjcq +aegsdwpulirinkatfjoyvxcbvq +mepsdwculbrinkatfjoyzxcbvq +msgsdcpulhrinkctfjoyzxcbvq +megsdwpulhrinkatfjoozxfevq +megscwpulhrinkatmjoyzxcbsq +megsdwpulhrinkltfjoyzxtmvq +megsddpulhrixkatfjyyzxcbvq +megsdwpulhrinkctfjoqzhcbvq +megsbapblhrinkatfjoyzxcbvq +megsdwpulhrinkatfjoyyxgpvq +mwpsdwpulhrinkutfjoyzxcbvq +megsdwpulhrinvnlfjoyzxcbvq +megsdwsulorinkakfjoyzxcbvq +mbgsdwpulhrinkktfjoyzxcbvg +megddwpulhrindatfjoyzxcbvr +memsdwpulhrinkatqjoyzxcbvo +megsdwpulbrinkarfjoyzxcbxq +megsdwpulhrilkatfjoynxcgvq +mxgsdzpulhrinkatfjoydxcbvq +megsawpulhrinkotfjoyzacbvq +measdwpulhrinkctvjoyzxcbvq +medsdwpulhtinkaqfjoyzxcbvq +megsdwsulhrknkatfjoylxcbvq +megadwpulhrinkatfjkyzxcbvh +mygsdwpulhrinkatfboyzxcavq +megsdwpulhrinkaufjxyzccbvq +mtgsdwpulhrunkatfkoyzxcbvq +megsdwpulhrinkamfwryzxcbvq +meesdwpulhrgnkatnjoyzxcbvq +megddwpolhrinkatfjoyixcbvq +megsdwpulhrinsatfjoyzicwvq +mmgsdwpulhrinkltfjoyzxcgvq +meisdwpulhhinkatfjoyzxubvq +megpdwpulhrinkatfroyzxcbkq +megszwpuhhrinkatfjoyzxcbzq +mersdwpulhrikcatfjoyzxcbvq +mjgsdwpulhrinratfjoyzxcbvl +megsdwnulkxinkatfjoyzxcbvq +megsdwpulhrinkatlaoyzxpbvq +megsdwpulhribkitfjjyzxcbvq +megsdwpzlhrinkalfjoyzkcbvq +megsdwpulhrinkutfjoyzxcdnq +mfgpdwputhrinkatfjoyzxcbvq +oegshwpclhrinkatfjoyzxcbvq +megvdwxulhrinkatfjowzxcbvq +mrgydwpulhrinkatfjoyzxcbvl +megsdwpuqhrinkaxfjoyzxcbfq +megsdwpughrinixtfjoyzxcbvq +megsdwpslxrinkatfjoyzxcbvl +megsdwpukhrinkatfjovzxnbvq +megsdwpulnrinkrtojoyzxcbvq +megsdwpuvhrinkatfjjyzxclvq +vegrdwpulhrinzatfjoyzxcbvq +melsdwwulvrinkatfjoyzxcbvq +megsdwpulhrizkbtfjoyzjcbvq +megsdwpulhrinlatfjoyzkcbvr +megsdweulhrinkaofqoyzxcbvq +megsdcpulhrifkatfdoyzxcbvq +negsdwpulhainkztfjoyzxcbvq +megsdwpklhrinkttfjoyzxvbvq +megsdwpothrdnkatfjoyzxcbvq +megsdwpulvrinkatfaoyzxcbvr +mewsdwpulhrinkatfooyzxtbvq +megtdwpulhrinkatfxoyzxcbvy +zegsdwpulhrinkamljoyzxcbvq +mkgodwpulhrcnkatfjoyzxcbvq +megsdepularinkatfjoyzxybvq +segsdwpulhrinkatfmoyzycbvq +mbgsdwpulhrsnkztfjoyzxcbvq +megsdwpmlhrinkatfjxyzhcbvq +megsdwpulhrinkatfboyqxmbvq +megsdwpulhrinkadtpoyzxcbvq +megsdmpulhrjnkatfjoyzxwbvq +megsdwpulhrivkatfroywxcbvq +megsdwdulhrinkatpjwyzxcbvq +megsdwpylhrdrkatfjoyzxcbvq +megsdwpulhrvnkptfjoyzlcbvq +megsdwpuihridkatfjuyzxcbvq +megsdwpulhbiikatfjxyzxcbvq +meggdwpulurinkatfjoyaxcbvq +mehsnwpulcrinkatfjoyzxcbvq +megsdwpulhrinkatfjoczdclvq +megsdwjulhrinkatfhkyzxcbvq +megsdwpulhrinoatfjoyzxcwvy +megpdwpelhrfnkatfjoyzxcbvq +megsjwpulhrwnkatfjdyzxcbvq +megsdwpulhrbniatfjoyzxcbpq +megsdwpulhrwnkatfjoydxcpvq +megsdwrulhrinkatfjvyixcbvq +yegvdwpulhtinkatfjoyzxcbvq +meosdwpulhrinkatfjhyzxsbvq +mjgsdwpulhrinkatfjoyyxcjvq +megsdwpulhrinkatfnoyzlmbvq +mehsdfkulhrinkatfjoyzxcbvq +megsdwpuahrinkatfyoyzxcwvq +megsdwpulhyinkatfjobzkcbvq +megsdwpjlhrinkatfnoyzscbvq +megsdwiulhrinqatfjoyzxcavq +megsdwpulurinkatfjoykxcbmq +megsdwpmlhvinkatfjotzxcbvq +megswwpulhrinfatfjoytxcbvq +mxgsdwpulhrrnkatfjoyhxcbvq +megubwpulhrinkaafjoyzxcbvq +megsdwpulhrdnsztfjoyzxcbvq +megsdwpulhronkgtfjhyzxcbvq +megsdwzulhfinratfjoyzxcbvq +megsdwpulhrinkrtfjqyixcbvq +megspwpulhrinkatfjoywxcavq +megmfjpulhrinkatfjoyzxcbvq +lelsdwpulhrinsatfjoyzxcbvq +megsdwnultrinkatfjoyzxybvq +megsdwpulhdnnkatfjpyzxcbvq +megsdwpulhzinkatfjoyzhcpvq +megoddpulhrilkatfjoyzxcbvq +megsdvpulhrwnkatfjoyzxcbdq +megsdwpulhmikkatfjoyzxcbvr +meesdwpulhrinkaofjoazxcbvq +megndwhulhrinfatfjoyzxcbvq +megsdwpulhjihkatfjoyzxcbvb +jegsdwpulhrinkattjoszxcbvq +megsdwpulhrenkatfjodzxcbvp +mefsdwpulhrinkatfjoyzxcczq +megsdwpulhrknkatfjovzxcbvb +megytwpulhrinkatfjoyzxcbvo +csgsdwpulhrinkatdjoyzxcbvq +megsbwpulhrinkazfjtyzxcbvq +mrgsdwpulhjinkatfjoyzxcbvm +megsywzulhrinkatfjofzxcbvq +megxdwpulhrndkatfjoyzxcbvq +mcgsdwpuphrixkatfjoyzxcbvq +megsdlpulxvinkatfvoyzxcbvq +megsdwpulhrinfatfjoyzicbvo +megwgwpulhrinpatfjoyzxcbvq +mggsdwpulhrinkatfjtrzxcbvq +msgsdwpulirinkatfjoyzxcbaq +megsdwpulhrineatfeoyzxcbvl +megsdnpulhrinkatojoyzxcbvb +mfgsdwpulhdinkatmjoyzxcbvq +megsdwpulhrinkawfjuyzxcbvg +megsdwpulhrincatfjoyzxcxvu +mevsdwzplhrinkatfjoyzxcbvq +megskweulhfinkatfjoyzxcbvq +mebsdvpulhrinkatfjoyzxcbkq +megddwiulhrinkatfioyzxcbvq +mygsdwpulhqinkatfooyzxcbvq +megsdweulhrfnkatfjoybxcbvq +mrgsdhpulmrinkatfjoyzxcbvq +megsdwkukhrinkatftoyzxcbvq +megsqwpulhrinfatfjoyzxebvq +megsdwpulhriskanfjoyzxctvq diff --git a/src/main/resources/2018/day20.txt b/src/main/resources/2018/day20.txt new file mode 100644 index 00000000..b2813f55 --- /dev/null +++ b/src/main/resources/2018/day20.txt @@ -0,0 +1 @@ +^SEESSWNWSSEESWWSEESSWSWNN(E|WNWNENWNNWNNWNWWNNEES(W|EES(W|SE(NNNNWNNENEEENWWNWNWSWSWSSSWS(WWSSSSESE(SSE(NN|ESSSWWNWWNWSWNNWNNWWWSWNWSSESSWSWWNEN(NWSWSWSESEESESSSWNNWWN(E|WWSSWSESESSWNWWSSE(N|SSENNEENENESSESENESESSWNWSWSSSWWSSESWSESWSSESENESSSSEENESSWSESWWSESWSWSSEESSSSSWSESWWNWWS(WWWNEENEENE(NNE(NWWWWSWNWWSESWSWNNNNWWSSWNWWNEENWWNENESESENEENNESEEEE(SWSESWWWNW(SWNW|NEES)|ENNWSWWWNWNWSWNNENNNWSWWSSSE(NNEWSS|)SSW(SEENSWWN|)NWNNNNWNENNWNWSWNNWSWNWWWNNWNEENENWWWWS(EE|WWNNNNNEESEENWNWNWNEEENNWNWWNENWWNWWWSEESWSWSESWWWNWSWWNWWNWSWWNWSSSENEEEESWSWW(NEWS|)SSWNNWW(SSSSEN(EESWSSSEEEENEENNNEENWNENN(WSWW(NEWS|)SW(SSE(NENSWS|)SSWWW(NE(NNW(NEWS|)S|E)|S(WNSE|)E)|N)|ESESSSW(NN|SESWSWSSWN(NNENWESWSS|)WWSWWWWWSEESWSESWWNNWNW(SSESWSSESWSSSSSENEENWWNNENESS(EESWSSENESENESSENNESSENNENNWSWWWNWNW(SSEWNN|)NENWNW(NEENEEEESWSSSS(EEENESSEENNEEENWWWNNNEN(WWSSSS(WNNNNNN(EES(ENSW|)W|NNW(NENNNW(NENN(W(S|W)|NNE(S(SSSEWNNN|)EE(NWES|)E|N(W|N)))|SS)|WSWSESS(WWN(WSWWN(ENSW|)WWSSEN|E)|SSSE(NNNNNN|SWSWNN))))|SS)|ESSS(WNSE|)ENESSEN(N|ESE(N|ESWSWWN(E|WSWSWW(NEWS|)SSENESSENESEENWNEEESWSSE(NE(SEWN|)NNNWN(NNEWSS|)WSWWWSWN(SENEEEWWWSWN|)|SWSSSWWWNEENNWWWS(EE|WSSSSWWWNWNEEE(SWEN|)NWNWNNWSSWNWSSSE(NEEWWS|)SWWNNWNEN(WWSSWWWSWSEEESSWWSSEESES(EENESENNENESENN(WWNWWSESWWS(E|W(S|NW(WW|NNE(ESWENW|)NNW(S|WW)|S)))|ESSENNEEESWSEEESS(EEEENEN(ESE(SWWEEN|)NEEN(EEN(NESNWS|)WW|W)|NN(NN|WWSWSS(ENENSWSW|)WNNNENWWW(SESWENWN|)WWWN(EEEE|NN)))|WNWSWNW(WWS(EE|WWN(WSNE|)E)|NN)))|WWWWWWNEE(NWNENN(WSWSSWWWNENNE(SS|NWNEEE(SWSNEN|)NNNN(WWSWWW(NEENEWSWWS|)SSSSE(NNNEES(ENNSSW|)W|SSW(SSSSEEENWW(EESWWWEEENWW|)|N))|ESS(S|EEENWWN(SEESWWEENWWN|))))|EE)|EE))|NEN(NEN(WNSE|)ESE(S(WWSNEE|)EESS(WNSE|)(ENEEEE|S)|N)|W))))))))|W(SEWN|)WNENWN(NESNWS|)W)|WS(ESSWNSENNW|)WWN(E|W))|W)|NNE(NWNEWSES|)S)))|NN)|NNNNNNNNEENNEEENNNNNWNEEESSW(N|SSEESSSENNNNW(NNESENNNNEESWSESSESSWNW(NN|WSSSESS(EENESEEES(ESEESW(W|SESEENNW(NNNENWWSSWNWNWNENES(EEENNNNWNEENWNNNWSWWWSWSWSSSSWNW(NENWWNEENNNES(ENNNNENNENNWNWWWWWNWSWSSWSWSWSWWNWNENWWSSWNWSWSSEESENE(NWWWEEES|)SESESWWWS(EEEENNE(SSSWENNN|)EENWNW(SWNW(S|W)|NEEN(W|EENEESSSWWW(NEENSWWS|)(SEE(EENNNNNWN(EES(SS|E)|WSWNWSSW(ENNESEWNWSSW|))|SW(SESWENWN|)W)|W)))|WSSSWSEE(N|SWS(WNWNNW(SSSSSENN(SSWNNNSSSENN|)|NENWNEE(NEN(WNWW(SSENSWNN|)NNNNNNENNNNW(NNENEENENWWSWNNENENESES(SSSSEENWNNNESSESSESWWSSWWNENWWSWSESSES(ENN(ESENESS(ENNENNEES(ESEENWNWNNNNNEENENEENNNWSWNNNWNWWNENESENESENNESENNEESEESESWSEENNEENNNEESWSSENENEESESWW(SW(N|WWSWSSWSSWWWWSWWWSW(SWSW(WSWSW(SSEEEESSS(WWNENWW(EESWSEWNENWW|)|SESESEENNW(WNNENWNEEESESSESSENNNNESSEEESWSESSSWNWSWSWWWNNN(ESE(SWEN|)EN(W|E(NNWSNESS|)E)|W(NN(ESNW|)NW(N(N|E)|W)|SSWSWSES(WWWSWNW(S|NEEENWN(WSNE|)N(ESENEWSWNW|)N)|EEEEESEEENWWN(WWWWWN|NESEESSENENESSSSWWWWN(EEENSWWW|)WSWSESEEN(EEEES(ENNNNESENENEEE(SWWSWSWSS(WNNSSE|)ENENEE(NWES|)SSW(W|N|SSESEN(NWES|)ESSEES)|NWWWNWWSS(ENSW|)WW(NNE(NNNWNENWWSSWWW(NEENNENNNENNWSWSWNWSSS(E(SSWN|ENW)|WNWNW(SSEWNN|)WNNNESEE(NWNNWWNEENNW(SWWWWSSWNWWSWSWSESWS(SSSS|WNNWSWS(W|E)|EEENWNNE(N|ES(ENENNESS(SSW(SW(NWSNES|)SE(ENSW|)SS|N)|EE)|W)))|NEESEEESENESESSEENNESSSEENNW(S|NEESEESSESWSWSESENNEENWNNESENESESWWSSWWSSSSSSS(ENNNNEEESWSS(WNNSSE|)ENENNNESSEESSSENNESENNNWNWWNNWS(SSEESE|WNNENNWSW(SSSWSWWWNEENENW(ESWSWWEENENW|)|NNWNNEES(SENNENNENEENWNENWNWSSSWSWNNWNNESE(S|NNNWNENNWNNEENNENENENEESESESSSSWSSSWWWNWNWN(W(SSESSW(SEEEN(WNSE|)EEESSWW(NEWS|)W(SSSENEN(EESENENEENWWNENWNNENENWWSW(NNEEEESSSENESSWSSSEEESWWWW(NNNW(N(E|N|W)|S)|SESWSWNNWSWSWWSSEEN(W|E(N|EESWSSWWN(ENSW|)WSWSEESSESSESEESEEENNWNWS(SEWN|)WNNENNESSEENEESSEEEEENNESSENNNWWNWSWSS(ENSW|)WWNNNWWNNENEESS(S(SS|ENNNNWWNWWS(SWNWSSSWNNNW(NEEN(E(S|NEEES(WW|ESEENWNENNNENWWWSSS(ENNSSW|)(WWWNENWWNNWW(NNEES(EENNEEENNNEEENNWSWWNWNWSWWNENNNENNNENEEESSSSWSEESEESSSESSSSWNWWWW(SEESWSWWS(EEEEN(N(ESESEEENNENWWNEENNNEESENEEEESSEENENWNENWNENWWWNNNESSENENE(SS(SSSSSSSWSSSE(NN|SWWNNNWWSWNNWSWWWSSESENE(NWWEES|)EESE(NN|SWSEENEESSW(WWSEESWWWWSESWWNWSWWNWWSWWNENWWWNENWWN(WWSSWSSENESE(NNWNSESS|)EESWWWWSSW(SSW(NN|SEENEN(W|NNEEEEESESSSWWSEESSSENEESWSESSESSSWNWWSWSWSESWWSSSESWWNWNENWWSWNNWNNENWWSSSWNWSWNWSSESWWSSSSSSENNESEESESENNWNNWW(SEWN|)NENNEN(ESSWSESES(SSEEENEESWSWWWSW(N|SSENESSSWNWSSWNWNWNWWSWWWSSEEN(W|ESEE(NWNSES|)SWSSESSWSEENEEENWNEENWWWW(SSENSWNN|)(W|N(N|EEENESESENEESESEESWSWNWNW(N|SSESWSEEEN(EESEESWWSSSENEEESENENWNWSW(NNNNNWWS(ESWENW|)W(W|NNENWWWNWNEEES(W|ENENEESSSWW(NENSWS|)SEESENENE(NWW(NNNENWNENE(SSSSSWN(SENNNNSSSSWN|)|NWNNNE(NWNNWNEE(SS|NWNNWNNWSSWNNNWNW(NNWNNNNENNNEENWNEESEENWNNEE(N(NN|WWWSSWWWWSWSWW(NN(N|W|E(S|E))|SSSSENNNEE(NENSWS|)SSW(S|N)))|S(SSSWWSESSSE(NNN|SWSWNWWSESWS(EESEE(NWN(ENSW|)W|SSW(SESS|NWWNW))|WNNWNEN(W|NESEENNW(S|N(WSWNSENE|)N))))|W))|SSESSWWWSESSSESWSEESSWSEENNEE(NWWNWNNNN(WSSNNE|)EES(ENSW|)WSES(SEWN|)W|SWSESWS(SSSWWNENNNWSWNWWNWSWSWSWN(WSW(NWES|)SSENESSS(WNWSNESE|)ENNNENESSS(WNSE|)EEENNN(E|WSW(SEWN|)NN(W|E))|NENNE(NWWWWWN(EEEENNENN(WWSEWNEE|)NNNE(SSSESSSSW(WNENNSSWSE|)SSENE(SS|E)|EEE|N)|NW(SSSE|WNE))|S))|E))))|SS))|S)|SSSSSS(WNNWSWNNEEN(SWWSSEWNNEEN|)|SSSSSSWNWN(ENSW|)WSSESESSE(NN|SSWWSWNWNEE(NNWSWWWSESSESWSEEESESSE(SSWNWSSEESWSWWSSSSSSSSWNNNWNWNEE(S|NWWWSSSESSSSWWWNWSWNNWNWWNWNEENNNESSESS(EEE(NWNENWNWNNNEEENENEEE(NN(ESNW|)NWSWS(WNWNNNE(SSEWNN|)NNWSWSWSWNNENNE(S|NE(S|NNNWSSWWS(WWNENNWSWWNENNNNEESEEE(NNWW(SEWN|)WWWWWNWWSESESWSWWWSESSWNWWSSWWSWNNEENWWWWSSE(N|SSWWSSSWNWSWSESSESSWWN(NWN(E|WSSESSEEEENENNW(S|NN(WSNE|)ENNNEEEEN(ESSESWWSSSESSSSWNNNWWNNE(NWNN(E(E|S)|WSSS(SSSSESE(NNWESS|)SSESWSWWSEESSSWSWSWNWSWWWNEENENWNEE(NWNNNWSSSWSWWNWNNNNESENN(WWNNWNWSWNNENWWNWWSWNWSWSWNNENNEENNNESSENNESENENNWWNEEENNEESEEESSWWSWSESEE(SWWWNWNW(NNE(N(N|E(S|EE))|S)|SWSSENESE(SSWW(N(WW(SEWN|)WWW(NEEENW|WW)|E)|SS)|E))|NN(WSNE|)E(SEWN|)NNNNNNNNWSWNWSWNNENWWWWWSSESWWNWWWWNWSSESEEN(W|ESSEEN(W|ES(ENNNE(NWWEES|)SSES(W|EEN(ESSWWEENNW|)W)|SSWNWWWNWSSWSSWNNWNNN(ESESWENWNW|)NNNNEEEEENWNEEENESS(WWSSWWW(EEENNEWSSWWW|)|ENESEEENNNNWNNNNWSWWNWWWWWSSSWSEENEENWWNEEESSSS(WW(NEWS|)SWNWWS(E|WSWS(EENSWW|)WWNNWNNW(SSSESSSWNW(NEWS|)WWWWNWSWSEEEESSESSSESSSWSWNNWWSWNNWNNNEEE(NNWWWS(WNWSWWWNWSWNNWWNW(NEEEENNN(EESSSEENWNE(NWES|)EEES(WWS(SSWNWWW(W(WW|SEESEN)|NNN)|E)|E(ESNW|)N)|NWSSWWW(SEEEWWWN|)(NENE(NE(E|NW(WS|NE))|S)|W))|SSESE(S(WWWN(NWWW(S|NENWW(S|N))|E)|EEEESENESE(SWWWSWWW(NN(ESENSWNW|)W|SEESSESESSSSSSSWSSWW(SESESWSW(NN|SEEESESWWSESWSESSSWSEESENNWNNNNNENEEENNWSWNNWW(SESNWN|)W(NEENNWSWN(W|NNESENNESSEENWNENEEENNNNWSSWNWWWWSEES(SWNWSW(S|NNNNNNNENE(NWNWWSS(EN|S|WN)|SEEE(SEES(WWSWNWWW(NEEE|SEE)|ENNESSESSSWW(NENWESWS|)SSSWSSSEEESSESSENEEENNWNWNEN(WWWWW(NENE(N(WWSNEE|)NNNNNWNNWNNNNEE(NWNN(WW(SESWS|NWS)|E(S|NN))|SSW(N|SEESWSEEE(SWWSS(ENESNWSW|)SS|EEE(EE|NNW(WSE|NEE)))))|S)|WSEEEESWSESE(N|E))|EEN(E(N|SE(SWWS(WNSE|)ESSENNESSSWSWNW(SWSWNWSWWSESWSWWNENNWSWSWNWW(SWWSSWN(N|WSSEEEESWSWW(N(W|E)|SSENESENESSEENEESWS(WWWWWWN(EE|WWWWNWSS(WWNENNWSW(SS|NNENE(N(ESNW|)WNENNNN(WSW(SESW(W(W|N)|SSS)|N)|E)|S))|EEEE))|EENESEEENENWWW(SEWN|)NNNWSWNWNN(EEEES(WWW|ESSS(WNNSSE|)ENNENNW(S|WNEEESSESWSWSEENENNENNN(ESSSSWSESWWSSS(EENN(WSNE|)ESSEENNW(NWN(NNNEENWW(EESWWSNEENWW|)|EESEEEN(EEEN(ESSWWWSWSS(EEENW(NEEEESES(WWWNEWSEEE|)EEEENNESSEEEENNEEEESEEES(WWWWWN(WSNE|)E|ENEE(SWEN|)NNWWWS(EE|WNW(WWWWWWSSWWNENWNN(ESNW|)WSWS(WNNEN(EE|NWNWNNWNWWSESWSWSW(S(EESWSES(W|EENE(SSESWWNW(ESEENWESWWNW|)|NN(E|NWSSW(S|NN(NENSWS|)W))))|W)|NNNE(S|N(NENESENENEEENEESWS(WSWNWSS(WNSE|)S(ENESNWSW|)S|EE(SSESSNNWNN|)NNNNNWWWWSEEESWWWSWNWWNWW(NEENNESE(SWSEWNEN|)EENWWNWWW(NENWNNNEN(WW(S(WW|SS)|N)|ENENN(WSNE|)E(SSSEESSESWWWNENWW(SSW(WNENSWSE|)SEES(ENESS(ENE(SSEESE(SWSS(ENENSWSW|)WNNNWWWNE(WSEEESNWWWNE|)|NN)|N(NNESNWSS|)W)|WW)|WW)|N)|EN(W|NN)))|SSWNWNE(WSESENSWNWNE|))|SSS(W(S|W)|EN(E(S|E)|N))))|W))))|E)|N(NNN|EEENESENNNWSWNNENNNN(WSSSNNNE|)E(SSSS|N))|S)))|W)|WWNENW)|W)|WW))|S)|WNNWSSW(NN|W))|WSW(SEWN|)NNENN(NNNNESSSSSS(NNNNNNWESSSSSS|)|WSWWWSS(EENWESWW|)WNWWSESWW(EENWNEWSESWW|)))))|WWNWW(N|S(WNWSNESE|)SE(EESWSW(NWSWENES|)S(EEE(EESW|NW)|S)|N))))))|NENWNEENN(EESSESWW(WSEWNE|)NN|WNNNW(NEWS|)SSSWS(EE|W(SEWN|)NW(NEEWWS|)S)))|NN)|N))|WW)))|N)))|E(N|EE)))|W))|NENWNEENWWNENNWSWNNEE(ESSSNNNW|)NWNNWSWWSW(NNEEWWSS|)SSW(NWES|)SESSW(N|S(W|EENEN(ESSWSESWW(N|S(EE|S))|NW(NNE(NEWS|)S|S))))))|N))|N))|EE)|SWS(WNSE|)SEE(ESNW|)N(NN|W))|NNESESSENEE(SWSWSNENEN|)NWNNESENNNEEENNEEEEESS(ENESEENWNEESEN(NNNNNNWWNWNNWNEESSEE(SWEN|)ENNNWNENENWNN(WN(W(SSESWS(WSWS(WNWWN(EEE|WN(WNWSWWWNWNENNN(NWWNNWN(NESENNE(N|SSS(SWNSEN|)E)|WWSESWW(N|SSSEENN(WSNE|)E(SESE(SWSWN(WWSSW(SEEN(ESE(N|SE(N|SEEEEN(ESSE(EESSWWWN(EE|WWSSSSEESSEENWNENN(ESSE(ESSENESSWWWNW(NEWS|)SWSES(WWWNENWWSSWNWNENN(ESNW|)WWWNWWSSWWWWSEESESEENEE(NWN(W(N|SW(S|W))|EE)|S(WSS(ENSW|)WNWWWNWNWWWNWN(WS(SESSS(WNNSSE|)ES(ENNN(WSNE|)ESSSEES(WS(WNWSNESE|)ES(S|W)|ENE(NWWWNSEEES|)S)|W)|W)|EE(NNN(EESS(WNSE|)ENE(NEN(WWSNEE|)NENEEN(E(EE|SSWWSWSEEE(SW|NW))|WWW(S|N(NWES|)E))|S)|NWN(NESNWS|)WS(SEWN|)W)|S))|E))|SENEEENWWW(EEESWWEENWWW|))|NN)|WSWNW(N|S)))|N)|WWW)))|N)|NWN(E|NNN))|N)|N)|N)))|EESWSSE(SW|ENW))|E))|EE(SSENSWNN|)N)|E)|W)|N)|EEEESSEES(WWSWW(WSEEEWWWNE|)NENNW(S|W)|ENEEENWWWWN(WSNE|)EEEENWNNEES(W|E(SEESESS(WWSWW(S(E|WNWSW(N|SS(ENES(EN|SWW)|W)))|NNE(S|E(NWWNSEES|)E))|E)|NNWWWW(NENE(NNN(ESSENSWNNW|)WSW(N|S(SWSWENEN|)E)|S)|SSS)))))|EEESEE(NWNWESES|)S(WWWNWSS(WNWSSWWN(WSSSENESSSW(SSSSES(WWNSEE|)ENEEENWNNNWSSSWNN(WSSNNE|)NN(NN|EEESE(N|SWSE(SSSESEESWWSEEE(S(ENSW|)WWWSWS(EENSWW|)WWNENENNWSWSWNNW(SSSSEN|NENEES(WSNE|)E)|NNN(EN(W|ESENNESSSE(NNNNW(NEWS|)W|EEEEEN))|WW))|E)))|N)|E)|E)|ENESS(S|W)))|W(WN(WWSEWNEE|)E|S))))|ESENNWNNESE(N|SSESSWN(SENNWNSESSWN|))))))))|EES(WSSSW(WNEWSE|)S|ENE(ESESSWNW(N|SS)|N)))|EESWWSE(WNEENWESWWSE|))|W))|S)|WW)))|E))|SES(WWNWWW(N|SEESESW(ENWNWWEESESW|))|ESENN(E(NWES|)SSS(WWSEEWWNEE|)E|W)))|E)))|E)|SSWS(WN(NEWS|)WSWWS(WNSE|)EES(ENESNWSW|)WW|EE))|SWW(SEESENN(SSWNWWEESENN|)|W))|W(N|W)))|NNNWN(NESNWS|)WW)|E))))))|WW)|W))))))|W)|WWSSWWSSEN(SWNNEEWWSSEN|))))|NN)|N|EEESSEESENEES(ENNWNWN(EEEE(NWES|)SW(W|SEESWWS(NEENWWEESWWS|))|NW(NNNN(N|EEENEE)|SW(N|SS(WNSE|)E(E|N))))|W|S))|N)))|W)|NNNWSSW(S|NWN(E|WSWWN(E|WWSWNWWSSWSEEEEN(WWNSEE|)E(N|SSESSWWN(NWSWNWSSSEE(NWES|)SEEN(ESES(WWWWWNWWS(E|SWW(NENNNE(NNWSWNWNENE(S|NN(ESNW|)WWS(E|SWWSSE(N|SW(WNNNNEENWWWWWWWWWWWSEEE(E|SWWWSSENES(ENSW|)SWSESWWWWNWNWWNWNWSSSWNWWNNWWNEENEEEN(WWWWWWS(EE|WNWSWSSWSWNWWNEEENN(WWS(WNWSSWNNWSSWWWWNEN(EESWENWW|)WWSWNWSSESE(N|SWSESWSWNWNNN(ESSNNW|)WWSWSWWNNE(ENWNWSWWWWWNN(WWWWWSSWSWNWSWWSESWSESSWNWWSESESWSWNNWWNWNNNWSSSWSWSESSWNWSSSWNWNENNNE(S|NNE(S|ENWWNENNNNN(EEESESEENWN(EEEEES(EENWESWW|)WWS(W(SWSWSS(W(SESNWN|)NNN(E|WWS(W(S|NNE(NWES|)E)|E))|EEN(W|N))|N)|E)|W)|WSWNWSWNWWWSEESSWWWSESWWWWNWW(NNNNEEESSE(SW(SEWN|)WWNNES|E(NWNEWSES|)EE)|SSE(ESENESESWSWNWSSSWNNNW(NEWS|)SSSSEEENNEEEN(NEENWN(EESES(WSESSWWSWWWSSEESENN(E(SESWSWWWNWWWWNN(WSSSW(SSESSW(N|SSSSENESSSEENENNWNW(SS(E|S)|NNW(SSWNSENN|)NEENWWN(W|NESENESESEEEEN(WWW|ESENEEESSWSES(EENNW(NEENWNW(WWWWW(NEEEEEEESESSSWS(S|EENNENENENNWSWW(NW(S|WNN(WSWW(NENEN(ESNW|)WW(NEWS|)S|WS(WNSE|)EEE)|ESEE(EEENENWWNEENNEESSENNENWWNWSWWW(NNEN(W|EEES(WWSWENEE|)EENNW(S|W(W|NEN(W|ESE(N|SSSEENN(WSNE|)EEESSWNWSSSSSSEENEESSEENWNENNWN(ENE(SSSE(N|SSSSSSEESWWWNWWSSSWSEEESSSWWNWN(EESNWW|)WS(WNWNEENWWWNNEES(W|ENNNE(SSS|EN(WWN(WWWSWWWNW(NEN(W|NNN(WW|EESWSESSSWNN(SSENNNSSSWNN|)))|SSESWSEENE(EN(ENESSW|WW)|SSSS(SENSWN|)WWNN(ESNW|)WSWWSSWS(SEEN(NNEWSS|)W|WWNENWW(SW(N|W)|NENNNESES(S(WNSE|)S|EENNW(WN(NN(ESSENN|NN)|W)|S))))))|N)|EE(SWEN|)NNN)))|SESWSWSSWWSS(ENEES(ESE(SS|EENESENEEEENNWWNWSS(EE|WNNNWN(EENWWNNNESSENEESESEEENEENNEE(SWSS(SSSWSESE(N|SESWWNWWWSWNW(SWS(WWN(W|E)|EEEE(NEWS|)SWWWWS)|NEEE(E|NNNENW(NEWS|)WSSWNWN(WWS(W(W|NN(N|E))|ES(ESEEWWNW|)W)|E))))|E(E|N))|NNWNENWWNENWWWWWNNNESES(ENESEESSEE(SWEN|)NNE(S|ENNNNESS(S|ENEES(W|ENNWWNNN(WWNENWWSSSES(WWSSWSS(ENSW|)W(WNNNE(ENN(ENSW|)WWS(WSSWWNWWS(ESEEES|WWWW(SESSSWWW(SEEESEEN(WNNNNSSSSE|)EESE(N|SWW(SWNWSWSEESS(WNWWWNN(E(S|N(N|E))|WSWNWW(SEWN|)N)|E(SWEN|)NNESE(SWEN|)NE(N(WW|N)|E))|N))|NEN(NNWSS|ES))|NENENNEN(WWSSNNEE|)EESWSES(WW(SWEN|)N|EE(S|NWNNESE(E|S)))))|E)|SS)|SS)|E(N|S))|ESSEESEEESWSWSS(ESENN(NEESWSSENESENESSEEE(S(WWWWW(SEWN|)N(WWWWWN|E)|S)|ENNEN(WWWSS(ENSW|)WNNWNEN(ESNW|)WWW(SESWENWN|)WN(W(S|N(WNSE|)E)|E)|ESSWSE))|W)|WN(NNEWSS|)W)))))|W)|E)|WWWSWSWSESEE(SWEN|)NN(WSNE|)E(ESWSE|NW))))|W)|WNWN(WSNE|)NE(EENSWW|)S)))|N)|WSWWS(EEE|W(NNEEWWSS|)S)))))))|SESWWSSWS(W|EE))|S)))|S(S|E)))|W)|S)|S)|WWWSWWSESSWSSSWSEENNNESSESSW(WWSEEE(ENNNNEE(NWWW(N(EE|NN(NE|WSS))|S)|SS(EE|W(N|S(E|S))))|SWSESWWNWS(WNN(EE|NNW(SS|WWNNEE(SWEN|)NNWW(S(E|W(N|WS(ESNW|)WWWW(SE(E|SWSSSS)|NE(NWNEWSES|)EE)))|NNNNESENE(NEENEEN(NEWS|)WWWSWWN(WSWNW(N|SS(WNSE|)(EEE|S))|E)|SS(S(WNWSNESE|)SS|E)))))|SEES(ENSW|)WWSSWNWS(NESENNSSWNWS|)))|N))))))|NNN)|ESENNNEEENE(NWES|)E)|N)|WW)|ENNWNNE(NN(ESSNNW|)WSW(SSWWNE|N)|S))|W(S|W))|W)|N)))))|EEEE(SWWWEEEN|)EEESESENN(ESSNNW|)W)|S))|E)|E))|EEEEEESSWSS(WWNWNN(WSWWWSESW(ENWNEEWWSESW|)|ESE(NEWS|)S)|SE(SENSWN|)NN)))|SEE(N|ESWS(E|S))))))|S)|SES(ENSW|)WSSS(SENSWN|)W))|ENE(SSS|NWWNNNNN(WSNE|)EE))|W)|E))))))|N)|W)|WNW(NEEEWWWS|)SS(WWNEWSEE|)SS)|NEEEN(ESNW|)NNNWWNWS(S|WNWWNEENWNNESENNW(ESSWNWESENNW|)))|W)|SESWS(WN|EES))|S)))|WW)|SW(SSE(S(WSW(WWSEE(SS(WNSE|)S|E)|NN)|EEE(S(WSNE|)EE|NN))|N)|N))|E))|W(N|W)))))|SSW(SESSW(SEWN|)N|N))|W)|W)|N)|W)|NNESES(SEE(SWEN|)NWNNWN(EE(ESWSEWNENW|)NW(W|N)|W)|W)))|W)))|SWSSSWNW(SSEWNN|)WNENNNNNWNNWWSESSESWSS(ENSW|)WNNNWN(E|NNWSSSSESWW(NNNWWNNEE(SWEN|)NNW(S|NNWN(EESE(N|S(SSENENEE(N(WWWSNEEE|)NE(NWES|)S|SWS(EESEESW(SESWSS(ENSW|)SS|W)|W))|W))|NNWWWSSW(WNENWNEE(WWSESWENWNEE|)|SEE(SWWEEN|)NE(NWES|)S)))|SSEE(EESW|NW))))))|S(S|WW)))|SEESE(NESNWS|)SWW(S|W(NEWS|)W))|S)|SSS))|WWSESWWSWSWNNN(E(ENSW|)S|WSWSSE(N|SSS(E(E|NN)|SWNWWNEN(ESNW|)NNWSSWSWWW(NNNNNENESEES(WSWNWSSSENE(WSWNNNSSSENE|)|ENENWNWNN(WWSES(SEWN|)WWNNW(NEEEEWWWWS|)S|E(S|E)))|SEESSSENESSWWWSW(NNNE(NWWSNEES|)S|SESSSWWSSEEN(ESSEESENESESWSESWWNWN(E|WWN(WWSW(SSSW(N|WSEEEENENWN(WSSNNE|)(N|EESESESENESSESWWSW(NWN(NW(WSEWNE|)N|EE)|SSENEEN(W|ENNE(SSSSW(N|SESEESE(S(ENESNWSW|)WSWNWN(WNSE|)E|NNWWN(EE|N)))|NNNNNWW(SESWSESW(ENWNENSWSESW|)|NNEN(NEN(W|E(N|ES(E|WSWSEE(SWWWEEEN|)N)))|WW(S|WWNWNNWS(SSEWNN|)WNNNEES(E(SSESNWNN|)NN(WWW|E(NNN(W(NWWNSEES|)SS|E)|E))|W)))))))))|NWWWWN(EENNE(SSEEEWWWNN|)NWWN(ENNESE(S(ENSW|)W|N)|W)|WW(S(S|E)|N)))|E))|W)))))))|W)))))|S))|N)|N)|NNNNWNW(S|N(W|EEEESW(W|SESE(SWWNSEEN|)NNE(NWNENWW(SWWEEN|)N|SSEEENWN(WS|EENNE)))))))|N)|W)|SWSW(NNEWSS|)S)|W)|WWNNW(SSS(WSNE|)E|NNN(NE(ENSW|)S|W)))|WW)|SSS)|EE)|SS))|E)))|S)|SSS(WW(N(WNSE|)E|S)|EE(SWEN|)N(W|ENEEEE(SWEN|)NWNNWW(NENEESW(ENWWSWENEESW|)|SS(EN|WNN)))))|S)|S))|W)|SSWSE(E|S(S|WWNNNWSWNWNWN(WWSSWWSES(E(EN(W|E(NWNSES|)SE(ES(E(S|N)|W)|N))|S)|W)|EE(NNWSNESS|)SEEE(N|S))))))|W)))))|SS)|S)|E)))|E))|N)|EE(SEWN|)NNNENE)|S(SS|W)))))$ diff --git a/src/main/resources/2018/day21.txt b/src/main/resources/2018/day21.txt new file mode 100644 index 00000000..9bac3270 --- /dev/null +++ b/src/main/resources/2018/day21.txt @@ -0,0 +1,32 @@ +#ip 1 +seti 123 0 5 +bani 5 456 5 +eqri 5 72 5 +addr 5 1 1 +seti 0 0 1 +seti 0 7 5 +bori 5 65536 4 +seti 13159625 6 5 +bani 4 255 3 +addr 5 3 5 +bani 5 16777215 5 +muli 5 65899 5 +bani 5 16777215 5 +gtir 256 4 3 +addr 3 1 1 +addi 1 1 1 +seti 27 9 1 +seti 0 0 3 +addi 3 1 2 +muli 2 256 2 +gtrr 2 4 2 +addr 2 1 1 +addi 1 1 1 +seti 25 0 1 +addi 3 1 3 +seti 17 4 1 +setr 3 3 4 +seti 7 5 1 +eqrr 5 0 3 +addr 3 1 1 +seti 5 6 1 diff --git a/src/main/resources/2018/day22.txt b/src/main/resources/2018/day22.txt new file mode 100644 index 00000000..d341d054 --- /dev/null +++ b/src/main/resources/2018/day22.txt @@ -0,0 +1,2 @@ +depth: 5616 +target: 10,785 diff --git a/src/main/resources/2018/day23.txt b/src/main/resources/2018/day23.txt new file mode 100644 index 00000000..f762f205 --- /dev/null +++ b/src/main/resources/2018/day23.txt @@ -0,0 +1,1000 @@ +pos=<136613456,-512820,-739737>, r=87427481 +pos=<-53697593,55277802,49040699>, r=86116187 +pos=<3220880,75515511,53337027>, r=50746552 +pos=<88414078,70781701,66277674>, r=98943677 +pos=<-17988814,83735639,57607927>, r=84446784 +pos=<7905695,86080636,69893638>, r=73183217 +pos=<-106237978,86340882,82036549>, r=85944614 +pos=<-39951484,51796765,70217077>, r=87079969 +pos=<-41339171,48697955,55193194>, r=73297553 +pos=<-42571382,53083825,53317409>, r=74087026 +pos=<-7368751,52027496,-9560976>, r=95138965 +pos=<-8239116,41812660,62596194>, r=54485758 +pos=<-1137951,49037154,75388024>, r=52951810 +pos=<7650881,79141366,92778865>, r=89383763 +pos=<-17148778,67167319,69069673>, r=78500152 +pos=<-34682895,65463074,55433727>, r=80694128 +pos=<92864435,72243385,52889446>, r=91467469 +pos=<23342790,57278342,66486606>, r=96631618 +pos=<16097469,22492567,11010000>, r=76930041 +pos=<-27239715,74048890,47983162>, r=79486831 +pos=<48014242,79716366,40015768>, r=62251861 +pos=<511676,64398402,63621216>, r=52622716 +pos=<-29486239,66238746,61923874>, r=82763569 +pos=<92097957,57353083,58524935>, r=81446016 +pos=<-2615864,64900611,68273820>, r=60905066 +pos=<17304995,87864295,58127670>, r=53801410 +pos=<36460810,70793722,116450849>, r=97175553 +pos=<91303570,59210855,59663955>, r=83648530 +pos=<17400055,51714900,106525287>, r=65954578 +pos=<-9201950,68270611,75924360>, r=78511311 +pos=<10184185,63093052,93307967>, r=71331241 +pos=<24739666,43259195,5573675>, r=52957566 +pos=<-18267592,52724555,76111483>, r=72218039 +pos=<-35598801,54737022,27433735>, r=89083529 +pos=<35813819,73515444,94558754>, r=77358361 +pos=<6642272,22056475,91067625>, r=87832335 +pos=<17645774,89603262,67321149>, r=64393217 +pos=<-10216980,27634811,38770566>, r=70341591 +pos=<12799318,81249393,71992414>, r=65556938 +pos=<-10218046,74437078,62070349>, r=71839923 +pos=<-1309123,20674953,59788059>, r=65885225 +pos=<-27217791,66526827,53078642>, r=71937695 +pos=<-34737368,44315647,75994929>, r=91879642 +pos=<30808903,39024070,99557972>, r=65161437 +pos=<18233335,72395211,90831029>, r=70107346 +pos=<37186749,-678419,57742780>, r=69426693 +pos=<-9615179,80576697,64086230>, r=79392664 +pos=<33935621,102484176,52277559>, r=62167524 +pos=<21730454,116532754,59523052>, r=79439730 +pos=<-44299553,51849314,52674431>, r=73937932 +pos=<98820726,52369354,56304096>, r=80964285 +pos=<-14670863,53307196,63286058>, r=56378495 +pos=<21141579,52692533,60648771>, r=77839132 +pos=<106030705,57863782,38674931>, r=99756568 +pos=<3660762,56362269,113500773>, r=91316727 +pos=<-407093,36114871,62900059>, r=52655349 +pos=<17300250,90851621,82759279>, r=81425029 +pos=<3552610,79637006,46529196>, r=55736575 +pos=<19340107,84837235,62352207>, r=52963786 +pos=<8521013,89819722,24371259>, r=83109002 +pos=<14563407,28673587,78383971>, r=60610219 +pos=<105274857,48490223,59505360>, r=90108685 +pos=<6522669,68013196,92958454>, r=79563377 +pos=<61441811,62255240,63607848>, r=60775173 +pos=<-30662880,72201886,57781685>, r=85760834 +pos=<-5704121,74191612,91679671>, r=96690023 +pos=<22440794,115302243,29587291>, r=89455675 +pos=<16846226,85850758,26219592>, r=68966703 +pos=<-11181912,74609397,43701422>, r=68271328 +pos=<112019147,48094141,55257089>, r=93000920 +pos=<-58029664,63702221,52791218>, r=99637517 +pos=<56546279,54927537,104557578>, r=89501416 +pos=<13690470,51265122,54792423>, r=53548975 +pos=<-20863525,78114651,44421611>, r=80738144 +pos=<20071309,136046599,55636529>, r=96726219 +pos=<-9825817,54458897,71973514>, r=61373140 +pos=<-13643977,45813902,94182312>, r=87475383 +pos=<4214048,57552549,55230473>, r=97407755 +pos=<-44465852,38322072,54656647>, r=86263523 +pos=<-8532222,52266115,71351598>, r=57264679 +pos=<15789835,78397136,91588786>, r=79310551 +pos=<87644233,71738261,52393733>, r=85246435 +pos=<24700943,90988926,103171122>, r=94573621 +pos=<-16261249,63121025,87229161>, r=91725871 +pos=<-52294570,67135761,48053370>, r=97558456 +pos=<18918374,81332072,97803514>, r=85331838 +pos=<11760283,82388891,26779326>, r=70030661 +pos=<19928626,82449711,96833465>, r=84469124 +pos=<-18348975,19999142,52648068>, r=76460901 +pos=<-12075601,71251550,85024678>, r=93466308 +pos=<80062151,62500897,78775775>, r=94808908 +pos=<12337661,103647294,81418622>, r=97842757 +pos=<-11115387,60112851,66531714>, r=62874491 +pos=<16906477,63764749,85558216>, r=57530991 +pos=<-4672303,54855285,1301903>, r=84407059 +pos=<-37982464,58456898,68225299>, r=89779132 +pos=<-17681001,71939994,60038525>, r=74774035 +pos=<-11837172,58467855,79274314>, r=74693725 +pos=<29729949,7390010,64977794>, r=61136429 +pos=<-12679395,87224461,58161931>, r=83180457 +pos=<-11559100,72144044,77817800>, r=86635361 +pos=<-2084469,25684278,55681143>, r=57544326 +pos=<20590016,129914590,49426051>, r=86080032 +pos=<-7571416,69794846,69085384>, r=71566033 +pos=<-34145880,48469543,51820255>, r=62959690 +pos=<-8692081,31985652,52581756>, r=54751347 +pos=<-24455978,69065733,52902609>, r=71539034 +pos=<-2667941,59922398,71227376>, r=58932198 +pos=<-38020475,72881338,61644325>, r=97660532 +pos=<-21527600,53755812,51653194>, r=52050984 +pos=<-8830611,33006975,78898650>, r=80185902 +pos=<19025250,113913931,63618165>, r=83621311 +pos=<8387089,77230233,57248610>, r=51206312 +pos=<9535513,118434510,37136580>, r=97943806 +pos=<78992433,58822717,31347868>, r=81004338 +pos=<-16906193,77442482,52709412>, r=72172536 +pos=<22311017,63448797,51701106>, r=94242941 +pos=<43179406,2818296,30763106>, r=84483777 +pos=<-363630,57933199,98730777>, r=82142085 +pos=<-3421442,71654138,81584493>, r=81774527 +pos=<105294101,47765605,48049117>, r=84365008 +pos=<-14236037,92920841,48040781>, r=85297524 +pos=<5696945,87936599,71179435>, r=78533668 +pos=<70714071,41126802,64803849>, r=68209814 +pos=<-18725349,54598292,52699640>, r=51138183 +pos=<59897823,71653281,71202033>, r=76223304 +pos=<48123775,102241419,73882598>, r=97717918 +pos=<-27257912,59427348,52360090>, r=64159728 +pos=<7347141,78617861,96938400>, r=93323519 +pos=<98970812,42594863,66538549>, r=96733304 +pos=<60136017,76634280,74781184>, r=85021510 +pos=<-38514792,65847495,52025409>, r=81502116 +pos=<-5508508,4887248,43864104>, r=83287138 +pos=<21727987,54693625,95057154>, r=53137390 +pos=<-15479704,40894383,53779209>, r=53827666 +pos=<-50001012,42594012,56389944>, r=89260340 +pos=<-49970116,64164073,53317682>, r=92566258 +pos=<-56357341,55323528,59446041>, r=96241383 +pos=<625968,53683329,98614903>, r=76786891 +pos=<21482773,117944535,70699492>, r=92275780 +pos=<16203712,73330825,69917915>, r=52159463 +pos=<13906226,70337776,30608175>, r=52004893 +pos=<-21655059,68530571,79036384>, r=94336614 +pos=<-6379112,70074314,96974691>, r=98542673 +pos=<37257281,88232345,55974220>, r=54934223 +pos=<-153042,61570334,64745296>, r=51583144 +pos=<75744358,74770786,74235757>, r=98220949 +pos=<2593526,12576425,76209878>, r=86502916 +pos=<-3213601,79186838,80823018>, r=88337919 +pos=<-9431288,52885294,66308318>, r=53739421 +pos=<39457172,77981561,77781961>, r=68690851 +pos=<3658726,45027232,78570696>, r=55347772 +pos=<19540854,59560050,33221913>, r=66437344 +pos=<-23991955,53819675,65495637>, r=68421679 +pos=<-15925338,62003166,71681923>, r=74724861 +pos=<179979,95055064,72345095>, r=92334745 +pos=<32084825,113714994,57462206>, r=76732047 +pos=<-79456713,-30995940,73253681>, r=71108738 +pos=<-5085269,56556449,63274512>, r=50030649 +pos=<-1823099,53617693,74353439>, r=54908645 +pos=<-21582671,87360226,64824893>, r=98882268 +pos=<-54047120,52572271,45012396>, r=87788501 +pos=<-621964,40254302,67623764>, r=53454465 +pos=<10705962,52178757,-10564055>, r=78218262 +pos=<-27052117,72974854,68996532>, r=94137885 +pos=<-5333720,61326896,75858050>, r=67633053 +pos=<-442860,-7927774,60719749>, r=94553540 +pos=<20190232,59561903,101548027>, r=66034633 +pos=<-7907411,40629427,68521654>, r=61262635 +pos=<-9455107,66611005,94728621>, r=95909233 +pos=<22122168,62372400,119686289>, r=85051023 +pos=<-16418814,91187751,60788730>, r=93509810 +pos=<-12210203,71963130,19080036>, r=91275101 +pos=<-16069946,54585553,55218935>, r=50988886 +pos=<73589783,36919962,51760461>, r=62248915 +pos=<10988236,47525791,7585386>, r=60430836 +pos=<10516253,63819008,75162627>, r=53580091 +pos=<54978561,77777004,81843099>, r=88068740 +pos=<843965,59034530,26718598>, r=57653476 +pos=<8390445,51933284,106893232>, r=75550828 +pos=<55468357,41898786,6292104>, r=82163240 +pos=<-15657432,59791539,54996025>, r=55559386 +pos=<21925705,56064114,98432334>, r=57685472 +pos=<2045205,54926092,91406478>, r=69401804 +pos=<18964578,82009106,68170256>, r=56329266 +pos=<-5020873,58135455,83138917>, r=71409692 +pos=<11206282,18758794,90297569>, r=85795593 +pos=<60429823,65420118,62455940>, r=61775922 +pos=<-50071054,65142864,56916609>, r=97245137 +pos=<37522973,119514287,68154460>, r=98661779 +pos=<-24546116,79951244,52341069>, r=81952965 +pos=<-42895143,51426102,49103721>, r=71398899 +pos=<19847811,70965352,88276453>, r=64508398 +pos=<31969885,74676586,119451667>, r=99568484 +pos=<43133639,79493715,70091589>, r=66189023 +pos=<3536597,70013464,59700142>, r=51291540 +pos=<-43456481,62212963,55178319>, r=85962366 +pos=<66908155,61377553,55147564>, r=56903339 +pos=<-6338837,64186892,67392177>, r=63032325 +pos=<24582754,12428156,39119902>, r=50399652 +pos=<19622738,107750729,55849974>, r=69092525 +pos=<-50422280,58990076,62168244>, r=96695006 +pos=<58134510,61311825,96239969>, r=89156504 +pos=<-30966037,57564421,54587595>, r=68232489 +pos=<12569803,83417760,58547639>, r=54510046 +pos=<16028817,91085624,85099394>, r=85270691 +pos=<26948233,79274928,118354187>, r=98047375 +pos=<-52310680,47522666,64367435>, r=94618457 +pos=<-6416427,79465208,59490450>, r=70486528 +pos=<20092186,68488461,91337971>, r=64848774 +pos=<-15142198,42300705,54605738>, r=52910257 +pos=<-27837357,69166421,45527549>, r=77657747 +pos=<-40369484,73666973,51836487>, r=90987378 +pos=<85019354,56875805,38052709>, r=78379725 +pos=<-4826865,73385493,74154124>, r=77481047 +pos=<-44327050,62980445,57928726>, r=90350601 +pos=<2268051,71674062,18320627>, r=77266756 +pos=<7560942,23918555,95582539>, r=89566155 +pos=<-40522661,58387981,55190926>, r=79216025 +pos=<17493703,92481489,21602524>, r=79566649 +pos=<-549853,30548349,59679581>, r=55144150 +pos=<-11540623,61439486,75747954>, r=73842446 +pos=<-27425143,66943956,51613022>, r=71096670 +pos=<7492358,52336684,59482404>, r=62591245 +pos=<8199261,52115157,61979910>, r=52924169 +pos=<-5227038,75473558,53223397>, r=59038494 +pos=<69304179,60217316,90678830>, r=93670829 +pos=<-27825322,58595174,52943775>, r=64478650 +pos=<-3930520,44822324,83076659>, r=67647944 +pos=<-15669371,56863526,61131713>, r=58778995 +pos=<28136546,52898534,69587237>, r=88623606 +pos=<-65393666,51826191,55613912>, r=97948204 +pos=<-15477551,51180735,42248775>, r=50591359 +pos=<40449375,72513414,96662908>, r=83095857 +pos=<-33924420,53998875,71917916>, r=84955612 +pos=<10793863,52565615,51767299>, r=98060212 +pos=<9995273,60527127,91707845>, r=67354108 +pos=<-60284471,51756689,57993530>, r=95149079 +pos=<18376558,10452573,62217674>, r=58851640 +pos=<6437033,60403963,76732508>, r=55814249 +pos=<-28335460,51550727,67141191>, r=72141764 +pos=<-20795148,56783730,53199338>, r=55892601 +pos=<12754662,84841524,53799805>, r=51001164 +pos=<9355656,37410878,81929957>, r=60626411 +pos=<70162685,52698231,62479018>, r=58810202 +pos=<3593617,1103985,61329203>, r=82094839 +pos=<-11110833,76403444,81998629>, r=94627295 +pos=<-2911501,68332204,55930359>, r=52288511 +pos=<-5611352,24754525,54946306>, r=61266149 +pos=<8852382,71155727,68890982>, r=56308709 +pos=<61447488,68409236,69588689>, r=72915436 +pos=<7800512,89666253,65758055>, r=72738393 +pos=<10592995,54945607,58732681>, r=89051922 +pos=<42798128,-12649279,56562836>, r=85829241 +pos=<11562554,75630041,86875504>, r=76057543 +pos=<77961659,71510466,54153352>, r=77095503 +pos=<31055259,54921299,-9869494>, r=70383159 +pos=<-27501669,62023219,47541351>, r=68164946 +pos=<42374475,68761335,72601978>, r=57207824 +pos=<-33321254,51983321,59677321>, r=70096300 +pos=<24068578,39736961,60654009>, r=88299248 +pos=<-19116561,56737201,34200348>, r=67834972 +pos=<22969648,52249055,100644454>, r=55038258 +pos=<-42911185,51860830,61376355>, r=81262991 +pos=<-42633368,44611772,66190367>, r=89674954 +pos=<-3829240,75255688,21232601>, r=84033808 +pos=<5934856,57988042,76585113>, r=53752725 +pos=<-32964350,68530123,57108410>, r=83717261 +pos=<43876005,92164898,87846839>, r=97357843 +pos=<-2417792,58943300,65531206>, r=52006718 +pos=<54964722,89070986,53056518>, r=70562253 +pos=<-290623,31446470,65443341>, r=59750487 +pos=<7639935,101059316,58888687>, r=77422498 +pos=<-28253746,62612782,71235848>, r=87217278 +pos=<-7422094,56693858,109005575>, r=98235920 +pos=<61189820,88854622,44952918>, r=79628549 +pos=<-16010449,60503569,67814188>, r=69442584 +pos=<31995549,99041054,92811203>, r=97317853 +pos=<14407890,68606212,88656048>, r=67968926 +pos=<3797019,93897803,59385476>, r=74600640 +pos=<89982687,70799922,58816742>, r=93069386 +pos=<-47391381,58920806,47022977>, r=85470601 +pos=<-18682541,52396968,60465510>, r=56659507 +pos=<-33603071,56312429,61658802>, r=76688781 +pos=<-1966320,58483882,29754668>, r=56877265 +pos=<-6876331,35253483,65966223>, r=63052064 +pos=<-39772638,75789985,47508955>, r=94235051 +pos=<-24980812,-1938691,-46278539>, r=50540858 +pos=<-14975005,78724644,39316097>, r=80565111 +pos=<-2885944,65589513,76516656>, r=70106553 +pos=<3541691,72547980,70693895>, r=64814600 +pos=<-44510906,63214333,63320805>, r=96160422 +pos=<185135951,79371810,69897884>, r=92278734 +pos=<-15712941,69417771,56680209>, r=66925482 +pos=<3371300,64063926,70577995>, r=56385028 +pos=<20093270,89812250,83966344>, r=78799702 +pos=<-44882626,56482809,44012736>, r=83534067 +pos=<7807097,59338218,93406346>, r=70052015 +pos=<83206185,54254511,65285920>, r=76216650 +pos=<-9128452,31764042,52408460>, r=55235957 +pos=<9273140,58063106,84328894>, r=58233459 +pos=<12730173,65723179,86216535>, r=64323934 +pos=<-5370160,21333035,52408548>, r=61908782 +pos=<-50412106,36708544,57003999>, r=96170823 +pos=<-12428116,56614507,59912876>, r=54070441 +pos=<23530187,55890018,101558624>, r=59032841 +pos=<24076853,75872593,84021081>, r=60931262 +pos=<66742911,53159306,102755650>, r=96128101 +pos=<52985633,69568131,100732548>, r=96756344 +pos=<21276856,95454549,27263024>, r=73096105 +pos=<18634979,90055348,78648309>, r=75183223 +pos=<59296178,97443382,58785611>, r=88995359 +pos=<-9151924,60937196,63129967>, r=58333507 +pos=<-131439802,11932397,63801725>, r=91099003 +pos=<-15182359,51945676,96531706>, r=88774362 +pos=<37456150,58413739,90785927>, r=60125884 +pos=<55535275,58675694,68529536>, r=56210588 +pos=<-23901453,82911425,51765843>, r=83693104 +pos=<20400242,84135488,38426476>, r=51490217 +pos=<86127079,53137259,73699744>, r=86434146 +pos=<-37504970,65330192,58356041>, r=86305590 +pos=<-36229876,54144877,76073195>, r=91562525 +pos=<7122807,47260000,60037998>, r=92003347 +pos=<14241003,60321844,84135837>, r=55331088 +pos=<-58054472,54730510,42664262>, r=96302105 +pos=<11128985,-3179856,61388093>, r=78901954 +pos=<-86171724,81676146,128118766>, r=65629454 +pos=<-32477909,54111811,66095298>, r=77799414 +pos=<16473884,29685000,94881174>, r=74185298 +pos=<-39673388,54367240,60656362>, r=79811579 +pos=<-36820899,56003364,51780853>, r=69719509 +pos=<33393407,80286458,76512600>, r=63663115 +pos=<18145724,41961673,52085548>, r=82246846 +pos=<773269,56344730,109740475>, r=90426345 +pos=<23227623,20924988,89657454>, r=70967862 +pos=<29769636,51258040,101968164>, r=56466105 +pos=<-3255302,91302711,53052997>, r=72725506 +pos=<63288029,31756890,15053302>, r=91363738 +pos=<-696254,82267064,54884033>, r=62961850 +pos=<24224162,74018463,80725407>, r=55634090 +pos=<-31583375,35116342,57915541>, r=79845595 +pos=<-20265647,61458300,53421504>, r=60260040 +pos=<-3625510,70617596,85973701>, r=85331222 +pos=<38592662,72038274,107230244>, r=91331550 +pos=<20947230,95753333,5848876>, r=95138602 +pos=<65256974,42508621,53997591>, r=50564655 +pos=<56144525,-47809394,138757109>, r=88873477 +pos=<12536114,44878759,53725314>, r=86437546 +pos=<-20301103,44075250,52762962>, r=54451813 +pos=<-461902,80465125,84487814>, r=90529307 +pos=<7130680,32413231,68883794>, r=54802893 +pos=<-50296082,60195477,45850842>, r=90822087 +pos=<-14564832,72623628,17948114>, r=95421720 +pos=<-22686155,63096629,54372268>, r=65269532 +pos=<69844001,61172133,56055801>, r=60541966 +pos=<-52847704,61819166,58790940>, r=98572688 +pos=<14547281,53614270,69916715>, r=64925594 +pos=<11858628,69801510,83476504>, r=66533825 +pos=<-19237228,57038668,55663966>, r=57054287 +pos=<-2272553,98539746,62554872>, r=88481774 +pos=<-8556006,44686979,74145414>, r=63477536 +pos=<2504323,61605769,51711818>, r=54478689 +pos=<47588454,79992799,94986516>, r=96037851 +pos=<103658947,51685093,57082700>, r=85896762 +pos=<-30259191,60236324,60596487>, r=76206463 +pos=<-16899083,75972745,75204218>, r=93190621 +pos=<-16138352,72149890,57424797>, r=70827421 +pos=<-32022269,39108198,51836967>, r=70214052 +pos=<-253386,60377315,87086253>, r=72831391 +pos=<70319029,58272431,24333949>, r=78795019 +pos=<98140448,55305455,54099422>, r=81015347 +pos=<-9894221,46215061,90692267>, r=79835086 +pos=<8135694,75227546,75981649>, r=68187909 +pos=<3050471,53586527,55188089>, r=52075619 +pos=<1872493,96006217,77781926>, r=97030112 +pos=<33059309,107988331,79210607>, r=93728745 +pos=<16673776,69427534,108363123>, r=86231293 +pos=<-55714690,52582577,37933926>, r=96544709 +pos=<593835,83505567,68365123>, r=76391300 +pos=<43486018,76414497,67060559>, r=60431122 +pos=<-103710,79781165,51942827>, r=56942322 +pos=<10133283,63186363,55221028>, r=90994744 +pos=<23438290,54031653,67704842>, r=75155252 +pos=<-67769695,52775484,52431198>, r=98090761 +pos=<-18104986,52809731,54267642>, r=50296769 +pos=<109991188,53156356,60594209>, r=97211931 +pos=<-13768977,54140486,59831889>, r=52855852 +pos=<-12489665,47714331,86555741>, r=76794067 +pos=<-26482316,33973790,58911081>, r=76882915 +pos=<-160197435,53199007,15047334>, r=72701562 +pos=<23358129,69976926,85439610>, r=57172786 +pos=<24201045,82557215,112270801>, r=95741523 +pos=<72394082,20781518,37930394>, r=88568308 +pos=<45145254,31095571,82460069>, r=70328402 +pos=<-24815015,78740100,66702713>, r=95372303 +pos=<-11180118,63194518,51850772>, r=51339974 +pos=<-30260369,77069699,58001879>, r=90446543 +pos=<12841613,54905801,60405944>, r=69102701 +pos=<69379484,75759864,80677420>, r=99286807 +pos=<-19898305,56022498,52114906>, r=53150117 +pos=<23972174,63400531,63593334>, r=88610729 +pos=<-7853869,55653210,30754191>, r=58934358 +pos=<40004815,92174613,37712106>, r=69004511 +pos=<-18970401,64246847,57001969>, r=65333603 +pos=<-55945729,46641309,41200961>, r=94633445 +pos=<10448314,60832634,-13979245>, r=90545188 +pos=<104420953,54797004,51761342>, r=84449325 +pos=<-7833268,56419777,64966118>, r=54333552 +pos=<-41600051,53218447,75060610>, r=94993621 +pos=<-23285697,51988784,62294935>, r=62683806 +pos=<-6906170,52717101,66490995>, r=51228649 +pos=<-36994277,58578684,69447528>, r=90134897 +pos=<13894089,90601100,71559173>, r=73380713 +pos=<5549488,90598003,63587583>, r=73750520 +pos=<27986859,65318406,569711>, r=67272566 +pos=<11420671,52635330,54320974>, r=70384136 +pos=<58986016,64249155,26039401>, r=71732796 +pos=<5530635,65978466,18218016>, r=68411191 +pos=<-5385393,46216210,79409449>, r=64041818 +pos=<-21799629,90568144,46789063>, r=91760239 +pos=<-36265254,58098351,59809891>, r=79287875 +pos=<-85146141,88950855,-3714880>, r=50044292 +pos=<38619326,-4038243,77668519>, r=94144770 +pos=<2694518,54614333,-4908892>, r=83010409 +pos=<5313262,51345161,59838196>, r=72136128 +pos=<14843630,-1349878,43928227>, r=69108117 +pos=<22464636,120847792,40757992>, r=83806553 +pos=<-9865777,51214858,90863194>, r=77058488 +pos=<19167267,52510615,54852693>, r=90699829 +pos=<14593457,70653650,97885859>, r=79060557 +pos=<-8818822,61716404,18373136>, r=78343826 +pos=<1060,70746123,74820827>, r=70680268 +pos=<2440131,63910700,77731744>, r=64316854 +pos=<9446148,94030616,72483361>, r=82182217 +pos=<99080786,67236493,59091021>, r=98878926 +pos=<-1302538,90260423,63215145>, r=79892689 +pos=<8394619,77120518,104185074>, r=98025497 +pos=<8809237,89970368,88703357>, r=94978937 +pos=<61696969,53031317,25103817>, r=64161515 +pos=<-17945953,52730115,54562544>, r=50352996 +pos=<5573049,75894102,57995185>, r=53430728 +pos=<1734159,18182439,88390315>, r=93936719 +pos=<16427148,60790813,57255534>, r=77938471 +pos=<-5794985,58712237,72538823>, r=62160526 +pos=<114104963,48165299,48341508>, r=92483804 +pos=<66162561,63632542,48965213>, r=55367138 +pos=<-10848319,68498736,72425408>, r=76886851 +pos=<35960404,57952302,83825949>, r=51208802 +pos=<-7537899,63784540,26119781>, r=71384092 +pos=<7597577,78226192,54364713>, r=50108075 +pos=<-4944468,85203935,56866419>, r=72129314 +pos=<-31664056,74767063,66581879>, r=98127721 +pos=<-30554637,64050408,69381798>, r=89101226 +pos=<15180605,89452073,84996875>, r=84382933 +pos=<24727280,106040899,27094989>, r=80399998 +pos=<-32937600,57802552,41091533>, r=75830264 +pos=<-24285878,55135192,45900921>, r=59701557 +pos=<99942558,60451396,53076615>, r=86940865 +pos=<-8142431,63656427,70896708>, r=67810159 +pos=<19572931,72289003,88954380>, r=66784918 +pos=<17178080,32326459,98036814>, r=73995977 +pos=<-40327597,60321955,30752519>, r=96078407 +pos=<-26708621,51303087,68660841>, r=71786962 +pos=<5298440,71150886,98998933>, r=89965866 +pos=<-26727384,52712004,60606804>, r=65160630 +pos=<-42515019,36860711,54621755>, r=85739222 +pos=<-19692936,52880476,53505130>, r=51192967 +pos=<-2862751,72059619,56687442>, r=56724369 +pos=<23309701,73678498,90297260>, r=65780546 +pos=<103591531,51292218,54785000>, r=83139488 +pos=<13334478,40067215,41788503>, r=53285143 +pos=<-19529026,52222981,57621425>, r=54488069 +pos=<-1797950,83874608,63370131>, r=74157238 +pos=<-25984963,45705100,63968004>, r=69711376 +pos=<-24664085,26439550,59809899>, r=83497673 +pos=<19736100,80301464,65388701>, r=51068468 +pos=<-25320635,61777368,77622402>, r=89834801 +pos=<-17286284,77658389,79260938>, r=99320666 +pos=<70330963,53068965,53858287>, r=50728428 +pos=<-3076230,90554067,55114683>, r=73859363 +pos=<-20974395,51855715,72542126>, r=70486673 +pos=<1092644,-4119326,69709754>, r=98199427 +pos=<15938133,59416689,58855448>, r=92943839 +pos=<-9112976,52910350,69896190>, r=57034132 +pos=<52773451,30360939,79247967>, r=75479113 +pos=<-6680030,26114817,19182073>, r=87913270 +pos=<1482965,86244061,74533437>, r=84409063 +pos=<24689402,71291292,83726812>, r=55443483 +pos=<30350862,66160075,106804338>, r=76785312 +pos=<-4063590,84853935,56872509>, r=70904417 +pos=<5856723,68860058,67443259>, r=55561024 +pos=<-7092718,83599936,62097932>, r=77904977 +pos=<-10322894,95735574,63377690>, r=94550544 +pos=<19921997,12113475,95509859>, r=88937502 +pos=<11534894,57463560,99207505>, r=70250571 +pos=<12352413,63309310,95136075>, r=71207369 +pos=<41175395,95875663,40694251>, r=70893868 +pos=<59891986,74136560,19271752>, r=89293819 +pos=<-23086309,46188709,61304958>, r=63666046 +pos=<-35534522,46755845,63454442>, r=77696176 +pos=<-17431848,55911646,61066276>, r=59524206 +pos=<19833014,98941413,53373702>, r=57596603 +pos=<-28451505,62393147,51769902>, r=67729137 +pos=<8178175,-29195966,48404389>, r=99143478 +pos=<-10800811,66052879,72255412>, r=74223622 +pos=<7592515,82345414,73497606>, r=73364887 +pos=<18762382,82447623,97073423>, r=85873084 +pos=<-10487671,31987978,73584470>, r=77547158 +pos=<-9056504,62925961,53357292>, r=50454349 +pos=<27999580,85878361,92076324>, r=79424309 +pos=<51800702,30641723,78124579>, r=73102228 +pos=<12642813,82894579,64946494>, r=60312761 +pos=<-61807304,47686811,53275056>, r=92858540 +pos=<-7276796,60434304,88907028>, r=81732530 +pos=<-29599217,39708375,83129734>, r=98483597 +pos=<-23520152,26844092,62214412>, r=84353826 +pos=<-28877325,61946397,69770777>, r=85708879 +pos=<-14608106,72848679,65361364>, r=77932548 +pos=<-36824990,70391000,43020520>, r=90376960 +pos=<44969927,68147155,35692982>, r=51961138 +pos=<19011433,65149442,-12540316>, r=84859740 +pos=<18764314,69338844,96926694>, r=72615606 +pos=<-25391985,54173991,76565456>, r=81246468 +pos=<-37132499,58605126,57299821>, r=78151951 +pos=<317469,47901411,90999015>, r=68243137 +pos=<4732566,82416141,64829451>, r=67627448 +pos=<-4438337,64068128,59428063>, r=53049034 +pos=<-7510390,65454288,58686238>, r=56765295 +pos=<13297331,71022908,83309651>, r=66149656 +pos=<-2443890,-1053307,49146976>, r=80880201 +pos=<18424959,-25894837,57469563>, r=90402436 +pos=<19134835,37687041,81457411>, r=50098606 +pos=<30727267,74338302,16287433>, r=63315163 +pos=<76426391,60025595,56674928>, r=66597034 +pos=<-37764165,64665026,63738632>, r=91282254 +pos=<73841307,45244034,7979885>, r=95503095 +pos=<8518776,102619990,65620373>, r=84836052 +pos=<33279437,-14820526,57737587>, r=79656722 +pos=<-12641079,64685181,53396171>, r=55837091 +pos=<-9951596,57691018,18966738>, r=74857701 +pos=<11705830,39289792,103172595>, r=77639987 +pos=<32755328,86575935,59301361>, r=52102968 +pos=<-56381974,51244757,51903260>, r=84644396 +pos=<10573573,67254309,71343991>, r=53139256 +pos=<23178882,99249505,53062798>, r=54247805 +pos=<-30438220,43249726,63852895>, r=76504484 +pos=<-18008082,91354098,61662797>, r=96139463 +pos=<58130621,-5410250,53763204>, r=91122775 +pos=<38376500,5309795,68536851>, r=75422199 +pos=<40568207,55819371,111949414>, r=81807094 +pos=<13385608,58751181,87916220>, r=58396316 +pos=<10652780,62923714,16913699>, r=61538816 +pos=<66584605,90471059,59953467>, r=90479328 +pos=<23828597,9229466,82674549>, r=75079685 +pos=<-2374305,51653149,81806283>, r=60948119 +pos=<15686944,101308548,58364945>, r=69100929 +pos=<12725742,68880644,106967805>, r=88237088 +pos=<17716933,53898766,92455242>, r=53751453 +pos=<-33372359,56824192,52416697>, r=67727660 +pos=<4982549,62244620,102018278>, r=84394819 +pos=<9097870,2277106,23511783>, r=91643276 +pos=<104095420,52061506,57103657>, r=86730620 +pos=<38111501,86440374,53482963>, r=51504912 +pos=<58344818,61400907,63284974>, r=56500739 +pos=<16884807,19231253,82990003>, r=72336956 +pos=<-42692945,65946169,41961384>, r=92859217 +pos=<-28034754,55487947,62126726>, r=70763811 +pos=<19274376,79870506,35147693>, r=51629912 +pos=<21320145,55312624,92060702>, r=51167634 +pos=<-36291008,37650308,58389536>, r=82493243 +pos=<-10796796,41489105,66097601>, r=60868304 +pos=<-40177150,63607920,46375716>, r=83590789 +pos=<16877383,57508433,130889109>, r=96634562 +pos=<78035795,47558838,61699900>, r=65995510 +pos=<-12157529,59079739,94459705>, r=90811614 +pos=<-14719298,67293961,58776388>, r=65904037 +pos=<23165472,48319134,141014934>, r=94993386 +pos=<14483307,55545491,83869510>, r=50046127 +pos=<-13975465,72281297,75555056>, r=86926409 +pos=<54944081,54012748,104500519>, r=86928029 +pos=<15118634,63975046,120649575>, r=94620419 +pos=<18002868,89743987,46547787>, r=51375023 +pos=<118470960,53314916,47200144>, r=99123142 +pos=<-18823495,55420905,53701803>, r=53060582 +pos=<-5467064,58554591,77050896>, r=66186932 +pos=<22160794,74878846,55706389>, r=70447601 +pos=<-27826743,71164171,56998262>, r=81103878 +pos=<-60219520,57279767,54018988>, r=96632668 +pos=<11765030,64865953,25690628>, r=53591753 +pos=<-77604253,51195582,160265663>, r=82321239 +pos=<8895376,94389845,70206097>, r=80814976 +pos=<72068955,61735419,61931626>, r=69206024 +pos=<71294850,57747925,61258998>, r=63771982 +pos=<-12500311,87983348,41185110>, r=85480069 +pos=<13165281,58734390,57751380>, r=71578498 +pos=<-16519504,56287098,41988135>, r=57000006 +pos=<15702065,59567300,125776377>, r=94756321 +pos=<104067037,56353806,59893063>, r=93783989 +pos=<-2443051,34066815,59811244>, r=53650485 +pos=<78659016,53301646,58395591>, r=63826456 +pos=<-5395135,51489915,53108186>, r=54457449 +pos=<43783348,70786755,68608325>, r=56648600 +pos=<15861882,75526752,70870247>, r=55649551 +pos=<-21433110,60201366,71144216>, r=77893311 +pos=<16927373,30534856,57344675>, r=79447115 +pos=<-23582240,51182170,53671182>, r=53550212 +pos=<48377124,87322307,57807776>, r=66977272 +pos=<-24658235,34774969,55408108>, r=70754558 +pos=<-57025118,51608427,56368656>, r=90116625 +pos=<-40956808,54872377,58233637>, r=79177201 +pos=<-7940696,64406847,65491844>, r=62954392 +pos=<18514021,116278681,67137430>, r=90016641 +pos=<43358506,27845033,68486380>, r=57818557 +pos=<1110894,83500413,68255453>, r=75759354 +pos=<-37948234,63772147,53141588>, r=79976703 +pos=<13559648,85475298,69747661>, r=66777842 +pos=<52847535,100951259,70145575>, r=97414722 +pos=<-21363508,51195381,52333138>, r=50006604 +pos=<42775136,24331657,88882389>, r=81144757 +pos=<-1933203,45916056,85330850>, r=66811316 +pos=<-57987412,55995732,52031150>, r=91128682 +pos=<-42000373,57698338,58535687>, r=83348916 +pos=<-22415966,68748566,55301911>, r=71580898 +pos=<63130941,60546452,58913823>, r=56061251 +pos=<-25360,94955513,32263639>, r=88899014 +pos=<16041791,46748455,54886958>, r=52853925 +pos=<21841806,63659499,51701479>, r=64043047 +pos=<1507336,30781882,86426870>, r=79600758 +pos=<-61462214,51930278,59048201>, r=97555074 +pos=<5596619,62910768,103402603>, r=85831362 +pos=<-17947167,60351558,52786859>, r=56199984 +pos=<8310608,110445624,30715607>, r=97601075 +pos=<57809969,62546762,83913036>, r=77739845 +pos=<-4243002,78023652,59272973>, r=66654140 +pos=<-38346139,46279251,81595137>, r=99125137 +pos=<-39505659,59077659,30772250>, r=93992534 +pos=<70748692,61615798,69299886>, r=75134429 +pos=<-8927983,72196971,41805506>, r=65500828 +pos=<18230519,71253951,55091105>, r=51783470 +pos=<-82741,89299947,70860177>, r=85357733 +pos=<19408526,70959236,391121>, r=77341247 +pos=<-118838868,96481794,83622656>, r=81565538 +pos=<7699857,77112966,58676603>, r=53204091 +pos=<-5285832,98989634,54909145>, r=84299424 +pos=<-9949091,79675756,62952022>, r=77691300 +pos=<6548040,71704033,79332787>, r=69603175 +pos=<41519552,70838659,77663756>, r=63492002 +pos=<24672816,51183711,105057962>, r=56683540 +pos=<26979282,57437475,67725517>, r=91990453 +pos=<-146316585,60113902,86014018>, r=74912650 +pos=<72430683,58332575,69349806>, r=73583276 +pos=<20029551,67957881,114673401>, r=87716194 +pos=<-12896053,72374875,79141839>, r=89527418 +pos=<10238771,77142540,70645372>, r=62663967 +pos=<-3216297,27169332,60070123>, r=61580077 +pos=<-23930209,54633761,66648944>, r=70327317 +pos=<-18679703,21196655,30842395>, r=93170631 +pos=<44655563,9533925,46538296>, r=63469153 +pos=<-59378193,54454082,43217955>, r=96795689 +pos=<24496603,92577304,64368811>, r=57563942 +pos=<-27053938,59501992,52024839>, r=63695171 +pos=<-9529140,74055507,52153025>, r=60852050 +pos=<44555529,104038871,53349626>, r=75414106 +pos=<-14679818,88223002,52168606>, r=80185804 +pos=<4552719,62659754,92650998>, r=75872423 +pos=<-19881238,63944538,24064643>, r=85942719 +pos=<16076790,55601668,101552666>, r=66191930 +pos=<21912528,118540961,52911368>, r=74654179 +pos=<-42123089,64929314,59158052>, r=91325104 +pos=<10936357,81890391,20134023>, r=77001665 +pos=<10351597,9179596,62138956>, r=68070751 +pos=<92774311,53165517,56634384>, r=76044462 +pos=<14950682,78188149,16646479>, r=72772458 +pos=<-36369450,41148166,38468120>, r=83283873 +pos=<78960321,78942802,53919616>, r=85293057 +pos=<-158664912,45952974,29905855>, r=62185933 +pos=<114294274,47756105,53682861>, r=94039744 +pos=<20046552,73002532,57617045>, r=54110780 +pos=<-29832468,53561561,86264939>, r=94773352 +pos=<5152614,124285693,53684633>, r=97932108 +pos=<31373573,67528454,85096814>, r=57468866 +pos=<-34521748,54572314,66408185>, r=80616625 +pos=<21670677,109269914,16882176>, r=96898951 +pos=<-13862893,59818682,65331199>, r=64127296 +pos=<17318835,71965542,106868073>, r=86629159 +pos=<78142676,48758577,56205332>, r=59408131 +pos=<-23340878,51182474,58635784>, r=58273523 +pos=<-26740311,87129579,52453722>, r=91438117 +pos=<4303903,69818029,63437040>, r=54065753 +pos=<3266332,71031490,81452081>, r=74331764 +pos=<13702746,18039813,44354215>, r=50433215 +pos=<-3482754,38377262,76574157>, r=67142882 +pos=<-9228255,63064015,42837554>, r=55636176 +pos=<-50838633,55818579,60038300>, r=91809905 +pos=<12044855,110909031,26804479>, r=98241104 +pos=<3069579,54401690,81614434>, r=58061261 +pos=<-55632341,51473141,61974878>, r=94194739 +pos=<47405039,61876630,72051227>, r=54803065 +pos=<-54699622,62927561,51595043>, r=94336968 +pos=<-5193725,62373908,96721874>, r=89403908 +pos=<39277912,51487063,98292773>, r=62527889 +pos=<28453914,55902735,104745928>, r=62572701 +pos=<70028230,51756434,45557821>, r=50764114 +pos=<6794251,79565242,72837497>, r=70723039 +pos=<-13346572,55208620,19942682>, r=74793897 +pos=<-26551619,52981805,64542889>, r=69190740 +pos=<-43505598,52177986,74471561>, r=95270055 +pos=<-36730243,57166097,70373519>, r=89384321 +pos=<67837280,44038045,5154880>, r=93530016 +pos=<24819569,59550660,112300422>, r=72145934 +pos=<22889616,60439671,109383201>, r=72047709 +pos=<16010141,59272902,95102320>, r=63479459 +pos=<45785695,3672162,40921594>, r=76077574 +pos=<52634264,230093674,55591446>, r=92328001 +pos=<-1093816,65699672,61755421>, r=53663391 +pos=<-2927319,46551949,115336543>, r=97175126 +pos=<9846871,97494787,27660769>, r=86168853 +pos=<14575046,54156478,106441784>, r=71137652 +pos=<3693372,64829888,65085318>, r=51336253 +pos=<-14475986,58191102,40490687>, r=58358086 +pos=<-32625219,54193671,54687567>, r=66620839 +pos=<19841368,112790310,53953991>, r=72017337 +pos=<-36529548,56646542,73106232>, r=91396775 +pos=<21383461,52564742,65263630>, r=69168248 +pos=<-25544951,69296904,55993281>, r=75949615 +pos=<5520910,41049609,87926413>, r=66818890 +pos=<78361286,55145660,70961730>, r=77938767 +pos=<-12502650,52118530,26315830>, r=64486867 +pos=<-8502681,43100643,60553969>, r=51419015 +pos=<30788480,91079544,72453023>, r=67791399 +pos=<-41582270,52471539,51548548>, r=70716745 +pos=<22495328,56368486,39214022>, r=54868649 +pos=<629350,38620684,-5628651>, r=92908951 +pos=<54092772,69401105,92313004>, r=89276951 +pos=<-5909105,43864786,12211016>, r=76363299 +pos=<3912827,52322153,79041627>, r=52565376 +pos=<-58023857,53967358,52040730>, r=89146355 +pos=<-31872996,52197859,61603944>, r=70789344 +pos=<15997340,97237977,68995404>, r=75350443 +pos=<-47277488,55104503,30071304>, r=98492088 +pos=<-8126606,68416175,57612004>, r=59269187 +pos=<-41526057,70666640,40848412>, r=97525664 +pos=<73462661,56792015,64535899>, r=68260624 +pos=<17561494,61650408,18024697>, r=52245702 +pos=<18999409,83239866,79157013>, r=68511878 +pos=<-17147426,82949543,58049486>, r=83260838 +pos=<-18999109,63366752,88314976>, r=95795304 +pos=<22782196,90426553,59952512>, r=52711323 +pos=<3870299,63602471,24263373>, r=61650297 +pos=<-28961118,57302888,47585264>, r=64860112 +pos=<-54015783,52509914,54351945>, r=85992387 +pos=<-31431674,55933418,55746724>, r=68226308 +pos=<6227367,990142,64669121>, r=82914608 +pos=<5035135,38115972,99202791>, r=81514672 +pos=<-33418983,63482456,38640418>, r=84442392 +pos=<-10795967,62940846,61879242>, r=60730704 +pos=<109337482,53196724,58133710>, r=94138173 +pos=<24242369,44107239,101663495>, r=58776882 +pos=<13836970,62942011,18092686>, r=57193751 +pos=<22307447,72298904,83902781>, r=59008632 +pos=<61542152,47395133,73538238>, r=61503948 +pos=<-24075040,59046188,54656470>, r=62892239 +pos=<2709891,16928362,83441813>, r=89266699 +pos=<18108186,51788474,56989142>, r=80851857 +pos=<8783157,59841041,97619446>, r=73792049 +pos=<-11464337,-1808695,45620039>, r=94183197 +pos=<-27362762,61729073,63812346>, r=78018926 +pos=<-16479685,60701430,70404170>, r=72700118 +pos=<18072359,95490781,46478814>, r=57121005 +pos=<22305099,61060570,52457431>, r=91124722 +pos=<-3144103,35052829,41802786>, r=52818565 +pos=<14700849,76137475,4759707>, r=82858288 +pos=<24087216,72433922,86093140>, r=59554341 +pos=<78515636,57323047,62505044>, r=71813766 +pos=<-24840821,74681746,64511653>, r=89148740 +pos=<-23826296,65180883,55787778>, r=69909354 +pos=<75346962,35126022,80923207>, r=94962783 +pos=<17008079,55328336,57579351>, r=53041203 +pos=<-7356211,68676554,73449531>, r=74596693 +pos=<-17162496,73932992,66248811>, r=82458915 +pos=<-136511398,24674918,81631631>, r=52044146 +pos=<17677665,60697644,59711178>, r=87163127 +pos=<-23195799,53013298,81013306>, r=82336819 +pos=<-11747126,98444482,59328815>, r=94634945 +pos=<5844912,56397886,77450074>, r=53117462 +pos=<-34509639,55837799,78666373>, r=94128480 +pos=<5904302,91792190,56962332>, r=67964633 +pos=<-17032381,59374519,60271759>, r=61793041 +pos=<126401,73284278,37689172>, r=61650102 +pos=<13058035,58217638,117787893>, r=88061922 +pos=<13828494,55793337,5715352>, r=62430875 +pos=<-38076711,68063369,58208411>, r=89462874 +pos=<11310783,64077677,47800713>, r=90266880 +pos=<71295692,59864191,53931657>, r=58561571 +pos=<-28401409,54456913,64786142>, r=72758897 +pos=<7099165,104942769,74968888>, r=97926943 +pos=<-13995801,56919587,69332174>, r=65361965 +pos=<-26207717,59423657,75475224>, r=86221043 +pos=<6284415,23177140,26461281>, r=70607154 +pos=<215192914,61945607,54981371>, r=57239098 +pos=<570884,53692018,83080045>, r=61315597 +pos=<82035008,70009886,45451263>, r=81130714 +pos=<56491702,68916341,58674725>, r=57552984 +pos=<41387757,67423761,76216212>, r=58497788 +pos=<-13813748,54323195,39213241>, r=55105070 +pos=<-6283377,38226161,58990807>, r=52511441 +pos=<-26649360,45588196,46247152>, r=61344017 +pos=<-14376863,65982584,89020987>, r=94494818 +pos=<-3323474,29138548,66137005>, r=65784968 +pos=<58981819,73400065,67082387>, r=72934311 +pos=<-24602073,59590457,54064654>, r=63371721 +pos=<36151757,93220459,79425935>, r=82268360 +pos=<87119215,67120469,66106290>, r=93816049 +pos=<-48564056,44611797,43001926>, r=87480464 +pos=<-184831138,45972224,52522771>, r=50154575 +pos=<-15029762,39315381,53334088>, r=54511484 +pos=<-63442720,56809824,159032480>, r=72599634 +pos=<60777021,86337479,55149072>, r=75733594 +pos=<92444973,55329391,26343979>, r=95967763 +pos=<-21559036,59753239,49501583>, r=57992092 +pos=<9746816,62098999,110099681>, r=87566354 +pos=<10180395,73435400,84209682>, r=72579076 +pos=<9869506,63811097,-18666569>, r=98789533 +pos=<-13838113,59406279,58751626>, r=57110750 +pos=<64073559,55987760,56938593>, r=50470036 +pos=<122002455,-29528127,89467426>, r=76860378 +pos=<933085,106082663,68426376>, r=98690342 +pos=<-2675758,105102702,49288669>, r=84671159 +pos=<21148930,85952702,88820154>, r=78738465 +pos=<-20327181,54015158,64694298>, r=64151435 +pos=<1808162,74371192,54758455>, r=52436239 +pos=<42135947,69930651,489911>, r=86113750 +pos=<-12374999,90510715,64743102>, r=92743325 +pos=<-4294480,65880302,57264170>, r=52553487 +pos=<-11380714,79284188,78361214>, r=94140720 +pos=<-18741699,56843996,93948119>, r=94648195 +pos=<-15112925,57666102,84178102>, r=82071526 +pos=<48905117,61145192,67255382>, r=50775815 +pos=<22577383,65607571,119314309>, r=87458960 +pos=<15014461,96714632,60980637>, r=67795269 +pos=<47428343,39689983,86775385>, r=68333041 +pos=<-28078465,61095714,45936858>, r=69419061 +pos=<-23524262,42214714,78362442>, r=85135301 +pos=<11059849,57287793,87820074>, r=59162425 +pos=<3565314,29345958,18633562>, r=74985191 +pos=<66387470,53690251,35786796>, r=58828200 +pos=<3116731,79442759,52841036>, r=54281677 +pos=<-19604720,61128015,61910900>, r=67758297 +pos=<57308392,70794674,32711619>, r=69928478 +pos=<12845664,78795191,27148691>, r=64982288 +pos=<80886361,60430853,61195181>, r=75982584 +pos=<23065226,55203444,121115562>, r=78368206 +pos=<-1767172,87142211,34592050>, r=80499249 +pos=<13751120,55697434,59007891>, r=91399024 +pos=<-21912028,56562619,52196254>, r=55785461 +pos=<24434582,75675617,15708816>, r=61713746 +pos=<-752271,77413609,96554782>, r=99835052 +pos=<17710144,89394902,70841612>, r=67640873 +pos=<-29164492,60989567,53774351>, r=69042803 +pos=<65721828,57739878,71302517>, r=68234456 +pos=<51294874,74255591,89905897>, r=88926704 +pos=<122447102,164387501,54549178>, r=86167801 +pos=<-2233409,26924269,59265799>, r=60037952 +pos=<3711632,67371720,79918709>, r=68693447 +pos=<-39313716,47720889,55898562>, r=72954666 +pos=<-29988637,48099743,66238336>, r=73590241 +pos=<7092311,93600756,55598390>, r=67221312 +pos=<94926391,52295037,52035414>, r=72727059 +pos=<58322954,64494143,14681677>, r=82672475 +pos=<-30606897,52115517,55916025>, r=63752817 +pos=<33683678,52234183,65402997>, r=77026018 +pos=<2893581,30919431,63800326>, r=55450312 +pos=<-10073625,68787754,42712060>, r=62330691 +pos=<-13226028,58548045,37442239>, r=60513212 +pos=<13341702,123874963,58254419>, r=93902154 +pos=<682234,97911898,48242929>, r=75168144 +pos=<18722317,56674681,90606505>, r=53673250 +pos=<90077460,56726877,60520864>, r=80795256 +pos=<11265077,100200311,67941274>, r=81990966 +pos=<10217162,21958720,59276183>, r=52563693 +pos=<82134787,48069587,56864579>, r=64748411 +pos=<20010404,57114507,56739832>, r=95448884 +pos=<298850,62853941,18970195>, r=69766264 +pos=<-34773033,48567904,55236028>, r=66904149 +pos=<3075957,26623236,63055783>, r=58819651 +pos=<16457975,57122257,70087795>, r=86513850 +pos=<90103819,53683092,69699596>, r=86956610 +pos=<-17689799,58550974,60782619>, r=62138075 +pos=<9338392,37129212,14441408>, r=65620968 +pos=<10278172,104026582,58505957>, r=77369117 +pos=<-36648669,53313763,57070182>, r=72147006 +pos=<3644850,75873038,60944199>, r=58286859 +pos=<-55768152,64438408,48348049>, r=98040163 +pos=<23966354,61323517,66723852>, r=63170986 +pos=<83907332,75993772,60160048>, r=93531174 +pos=<-49160977,51421296,51777959>, r=77474735 +pos=<-19554495,83185945,68889433>, r=96744324 +pos=<4083844,61211766,78812607>, r=61054908 +pos=<-28740891,76035877,59783586>, r=89674749 +pos=<1477390,92187674,62374371>, r=78199589 +pos=<27555445,100617770,28346459>, r=74363771 +pos=<61157488,92524005,67778649>, r=94930233 +pos=<44509108,57672466,-14457614>, r=91176410 +pos=<-49301441,57583231,64690420>, r=96689478 +pos=<6254148,63730492,98438208>, r=81029012 +pos=<-65249177,51697848,46584216>, r=96544404 +pos=<-18251430,74523624,66136947>, r=84026579 +pos=<-38032746,59650424,49516347>, r=74348754 +pos=<1025165,71664650,57908627>, r=53662668 +pos=<-47108245,52145065,40842431>, r=84592249 +pos=<-48768564,66546374,54932017>, r=95361722 +pos=<-21610139,44024485,61168243>, r=64217401 +pos=<10087091,107246375,62170269>, r=84443931 +pos=<51033289,57777223,79683838>, r=61964875 +pos=<-1515410,54504740,89312112>, r=70446642 +pos=<6955077,59969833,119903931>, r=98033598 +pos=<-22531794,48719765,58184485>, r=57459504 +pos=<-5094294,59314583,76395596>, r=65919004 +pos=<76187323,83948474,38225082>, r=96447759 +pos=<-21294072,54806425,61700229>, r=62915134 +pos=<22543466,42317235,91615254>, r=52217555 +pos=<28314112,89701628,91872856>, r=83358628 +pos=<-4228579,64941150,75051735>, r=69335866 +pos=<50966330,77605764,84252544>, r=86294744 +pos=<-6737743,107415917,54338071>, r=93606463 +pos=<23145972,65757098,91211071>, r=58936588 +pos=<19007479,87503572,82855617>, r=76466297 +pos=<-14765231,68331156,77316912>, r=85528263 +pos=<-949424,70946763,65236949>, r=62247745 +pos=<-32803143,52738611,60060225>, r=70716401 +pos=<66822816,56906431,65665714>, r=62865107 +pos=<9680974,91968172,80327678>, r=87729365 +pos=<8343767,56768063,52291322>, r=57842575 +pos=<38074555,75932657,94592379>, r=82069623 +pos=<-19059954,72759195,75265940>, r=92199655 +pos=<17867950,85793108,72307124>, r=65346674 +pos=<4765057,109187888,51558662>, r=81095880 +pos=<-18597182,56282648,71097542>, r=71091807 +pos=<-53544594,48732733,55083403>, r=85358259 +pos=<-14162311,76553349,71226487>, r=87056545 +pos=<-47205943,48535879,60516002>, r=84649054 +pos=<-51865413,61371035,54334719>, r=92685802 +pos=<-10560072,67389213,73620186>, r=76683871 +pos=<18319316,72506183,-3063602>, r=83431987 +pos=<-3588999,72423545,64377299>, r=65504222 +pos=<11888209,56845438,49310444>, r=80146809 +pos=<21726851,54782153,26405131>, r=94721944 +pos=<-21291084,56654299,74535249>, r=77595146 +pos=<936181,103600381,67588131>, r=95367106 +pos=<-13782512,64133232,74692014>, r=77722142 +pos=<-36410139,62335051,70838270>, r=94697845 +pos=<-13219359,55905482,102146596>, r=96385842 +pos=<7982302,72795551,71059219>, r=60987001 +pos=<14814723,60392314,88790377>, r=59482349 +pos=<-46730374,59535255,39966466>, r=92480718 +pos=<-12683668,63360272,34527358>, r=67698165 +pos=<34918460,61167889,51688378>, r=99658139 +pos=<65522795,5172637,52395633>, r=86564425 +pos=<21631208,32413943,104746960>, r=76164801 +pos=<-11979634,65490331,75294207>, r=77878552 +pos=<6957102,71949660,103009238>, r=93116178 +pos=<16501855,87396298,22166944>, r=74908909 +pos=<-3903540,38079649,95576440>, r=86863330 +pos=<20206463,69766028,75938015>, r=50611973 +pos=<4305930,14987890,73560026>, r=79729291 +pos=<-7564317,16601205,60800573>, r=77226681 +pos=<78960025,77022559,51882781>, r=81335395 +pos=<-2691592,55376094,83330088>, r=66512406 +pos=<-47250869,37081123,43153632>, r=93546119 +pos=<8536338,15031904,58255252>, r=60150014 +pos=<60376108,86278760,75828759>, r=95953668 +pos=<-6882477,55533881,67317545>, r=54848322 +pos=<9678384,78681532,76529906>, r=70647662 +pos=<10075511,91722489,53804756>, r=60566307 +pos=<21285284,59022109,91758839>, r=54610451 +pos=<-37992414,58278309,25526337>, r=96925765 +pos=<-2709806,59275400,67729392>, r=54828981 +pos=<7011597,20313939,78973760>, r=77111391 +pos=<-52588778,60847764,58672703>, r=97223909 +pos=<-15256628,22229514,41271494>, r=78285813 +pos=<34156359,101451279,54422671>, r=63500492 +pos=<21509300,111056381,53419268>, r=68080733 +pos=<14593452,57851278,-19237975>, r=88677170 +pos=<1781540,75186457,59902472>, r=58421778 +pos=<-33041189,51450575,51533175>, r=61139326 +pos=<15782750,66980930,90439887>, r=66752517 +pos=<-36107313,40071259,65952487>, r=87451603 +pos=<-14638698,63394833,75249799>, r=78397768 +pos=<-22832073,77228624,62320318>, r=87495607 +pos=<87393628,62821666,29411048>, r=95341264 +pos=<-16740099,42436581,56244211>, r=56010749 +pos=<20445816,54943259,60909642>, r=73012739 +pos=<15983434,51447682,96599706>, r=57178341 +pos=<-1059151,70062397,74572375>, r=70808526 +pos=<-35739090,59134133,40541874>, r=80512741 +pos=<22868206,41119100,92637902>, r=54114178 +pos=<13457096,20227235,89352457>, r=81131188 +pos=<53583940,59655001,69818825>, r=56527814 +pos=<37367140,55788282,41622861>, r=90197118 +pos=<12409098,92091021,58284823>, r=63081300 diff --git a/src/main/resources/2018/day24.txt b/src/main/resources/2018/day24.txt new file mode 100644 index 00000000..dc4ae67f --- /dev/null +++ b/src/main/resources/2018/day24.txt @@ -0,0 +1,23 @@ +Immune System: +2749 units each with 8712 hit points (immune to radiation, cold; weak to fire) with an attack that does 30 radiation damage at initiative 18 +704 units each with 1890 hit points with an attack that does 26 fire damage at initiative 17 +1466 units each with 7198 hit points (immune to bludgeoning; weak to slashing, cold) with an attack that does 44 bludgeoning damage at initiative 6 +6779 units each with 11207 hit points with an attack that does 13 cold damage at initiative 4 +1275 units each with 11747 hit points with an attack that does 66 cold damage at initiative 2 +947 units each with 5442 hit points with an attack that does 49 radiation damage at initiative 3 +4319 units each with 2144 hit points (weak to bludgeoning, fire) with an attack that does 4 fire damage at initiative 9 +6315 units each with 5705 hit points with an attack that does 7 cold damage at initiative 16 +8790 units each with 10312 hit points with an attack that does 10 fire damage at initiative 5 +3242 units each with 4188 hit points (weak to cold; immune to radiation) with an attack that does 11 bludgeoning damage at initiative 14 + +Infection: +1230 units each with 11944 hit points (weak to cold) with an attack that does 17 bludgeoning damage at initiative 1 +7588 units each with 53223 hit points (immune to bludgeoning) with an attack that does 13 cold damage at initiative 12 +1887 units each with 40790 hit points (immune to radiation, slashing, cold) with an attack that does 43 fire damage at initiative 15 +285 units each with 8703 hit points (immune to slashing) with an attack that does 60 slashing damage at initiative 7 +1505 units each with 29297 hit points with an attack that does 38 fire damage at initiative 8 +191 units each with 24260 hit points (immune to bludgeoning; weak to slashing) with an attack that does 173 cold damage at initiative 20 +1854 units each with 12648 hit points (weak to fire, cold) with an attack that does 13 bludgeoning damage at initiative 13 +1541 units each with 49751 hit points (weak to cold, bludgeoning) with an attack that does 62 slashing damage at initiative 19 +3270 units each with 22736 hit points with an attack that does 13 slashing damage at initiative 10 +1211 units each with 56258 hit points (immune to slashing, cold) with an attack that does 73 bludgeoning damage at initiative 11 diff --git a/src/main/resources/2018/day25.txt b/src/main/resources/2018/day25.txt new file mode 100644 index 00000000..0b456154 --- /dev/null +++ b/src/main/resources/2018/day25.txt @@ -0,0 +1,1006 @@ +2,4,-1,-4 +-1,2,3,-3 +4,-8,-5,6 +-5,0,-4,-4 +8,0,5,-2 +8,-8,-6,6 +3,3,-8,-1 +-7,-4,6,-5 +-5,2,-3,5 +-5,-4,4,0 +6,4,4,-2 +0,8,7,-1 +-6,5,-8,0 +3,8,-1,8 +-3,5,7,-4 +2,4,-8,6 +-7,0,5,5 +-6,1,-4,3 +4,4,8,-2 +-6,-8,-6,-3 +3,-6,1,2 +6,-2,-8,-5 +-3,-6,-1,-6 +1,-7,-8,-4 +3,-1,0,-1 +4,-8,1,-8 +-4,-5,7,5 +1,-7,0,0 +4,-2,5,-6 +-4,-7,-5,7 +-2,0,3,0 +7,-8,-2,6 +-1,-1,1,-6 +3,0,-1,6 +1,-8,-1,6 +2,-4,-4,-5 +7,-3,-1,-6 +-5,-3,6,-3 +-3,5,-2,-8 +-6,7,7,0 +-4,-1,7,2 +7,-8,7,0 +3,-8,-1,4 +0,-3,5,-7 +-8,1,-3,-8 +2,-7,-6,-6 +-8,-8,0,-7 +-3,-5,8,8 +-1,-1,-5,-4 +-2,5,8,-7 +-1,4,-5,-4 +0,-8,6,0 +3,-8,1,-7 +3,6,-6,-2 +7,-2,1,-8 +-6,4,-3,6 +-6,-7,-1,-1 +-7,3,-1,-5 +-4,5,-8,-2 +7,5,2,-7 +2,-5,3,-7 +2,-6,-8,6 +-7,8,-3,-8 +8,-2,7,-1 +1,0,3,5 +0,3,6,-3 +-8,-1,0,5 +-5,-5,-1,7 +8,1,-1,8 +-1,-7,-8,1 +4,-8,1,-4 +8,-8,-7,3 +7,2,8,2 +-7,-3,2,4 +-8,-8,3,-3 +-1,0,-5,-6 +0,0,-5,2 +-3,0,4,-5 +-2,-5,-8,5 +4,-7,-6,-7 +-3,-4,-8,-4 +0,8,-7,-5 +-4,6,6,-3 +-4,-5,2,3 +-1,-7,2,5 +0,-8,8,-5 +7,4,4,-7 +8,-6,0,0 +1,0,8,-5 +8,7,1,-6 +-3,-2,6,-5 +-8,0,-5,-8 +5,1,5,-7 +4,2,2,-8 +-3,5,2,5 +-1,-2,-7,-7 +-8,2,2,-5 +-8,-3,-5,0 +6,4,-8,2 +-2,-7,0,4 +8,-8,8,7 +-1,-1,1,-4 +1,-8,-8,-5 +-7,-5,4,1 +6,-3,8,-1 +-7,4,4,-2 +-7,8,-8,-7 +2,-7,-8,7 +-5,-4,4,1 +-3,3,8,-3 +-5,-7,6,-2 +3,-6,0,5 +7,-7,0,6 +-5,0,2,-4 +3,2,-7,1 +1,-8,4,6 +-1,-8,-7,4 +4,-3,3,-1 +-4,-4,-5,2 +-1,0,-2,8 +-4,-2,2,6 +0,0,-1,5 +5,-5,-3,1 +-4,-7,-1,-1 +2,4,-8,-5 +-8,0,4,-1 +-7,-4,7,2 +0,-6,-2,3 +0,4,4,6 +-5,-4,-5,-6 +4,-5,5,1 +8,3,0,-8 +-4,-5,3,7 +-3,8,-7,-7 +-6,-7,-3,8 +6,0,7,7 +1,5,-7,-4 +-2,-1,8,-2 +-7,-7,2,1 +0,3,-7,1 +-6,1,-5,6 +-6,0,6,8 +3,5,4,1 +7,5,0,8 +-8,-4,3,1 +-2,7,-5,7 +-6,2,-3,-7 +-7,-6,-5,-7 +6,-4,-7,7 +-3,-6,5,1 +6,4,0,8 +0,3,3,7 +-2,-5,-7,-1 +8,7,7,-2 +-1,8,6,-7 +0,-2,6,-6 +0,-4,-5,-4 +-8,-1,-4,6 +-7,1,6,7 +7,1,-7,-6 +-1,-4,5,-6 +-6,3,6,-6 +3,1,6,-7 +-8,4,0,6 +5,-1,2,-3 +5,0,-2,-8 +-4,-2,0,-4 +-4,-4,0,-7 +-6,7,-7,-3 +2,-3,1,-2 +-8,0,-1,-5 +-3,5,4,-6 +-4,5,8,-5 +-1,-2,1,-5 +-1,-8,0,4 +0,-3,-5,5 +-7,4,6,-5 +-6,-4,8,-4 +-7,6,-7,5 +3,4,7,-6 +-2,-6,4,8 +4,-5,2,6 +2,5,0,0 +0,-3,-1,0 +-3,6,-7,8 +-6,8,0,-5 +-7,-4,6,3 +3,4,5,5 +5,-7,2,-6 +3,6,7,-7 +2,-3,-5,-7 +-5,8,-6,3 +0,-5,8,3 +2,7,3,7 +-4,4,-4,3 +-1,0,1,-5 +3,-6,-4,-7 +1,-4,5,-7 +-7,4,7,0 +8,-2,-6,-5 +7,-5,2,-4 +-5,-5,6,0 +-3,3,8,0 +-6,-5,0,-1 +-8,2,3,6 +-1,-4,7,-7 +5,6,5,-1 +3,-5,8,8 +-4,-7,3,1 +3,3,-6,0 +-2,-1,3,0 +3,-7,-3,0 +6,-4,-5,3 +-6,-6,0,-5 +3,4,-2,4 +8,7,2,-4 +-1,0,-4,-1 +0,-6,-6,-1 +2,6,6,5 +-4,4,2,-1 +-1,-1,7,0 +1,8,-4,-7 +-7,1,-5,1 +6,-3,-8,-8 +-8,7,0,6 +6,1,-1,8 +3,-6,-7,1 +-3,7,2,0 +-1,-5,-6,-6 +4,-1,-8,5 +2,0,0,6 +2,8,8,1 +-5,-4,2,-2 +2,-3,1,1 +3,4,-8,5 +3,2,-1,3 +7,8,3,-7 +7,1,4,-5 +-5,4,-5,-7 +2,-8,-4,-7 +0,-8,-8,-4 +1,-5,0,2 +7,2,-1,-3 +0,6,6,0 +1,6,-2,-5 +-1,0,7,-3 +-4,1,2,5 +-6,-8,-4,-6 +-5,7,1,-5 +-7,3,-1,0 +4,-5,-1,-6 +-4,5,-8,0 +3,0,-5,-6 +4,6,2,4 +6,0,2,8 +0,-3,-5,1 +7,8,2,4 +8,-6,8,0 +-8,6,4,-5 +2,0,-3,-3 +2,-6,7,-8 +-1,2,-8,3 +-8,-4,6,-6 +3,0,-4,-8 +6,0,4,6 +7,2,-2,4 +4,-8,0,-2 +0,-7,-4,5 +7,-1,0,2 +3,0,5,0 +-7,3,5,7 +3,5,5,-7 +1,-3,-7,6 +2,-3,-3,-2 +3,1,2,-4 +-6,0,2,1 +1,7,0,2 +3,-8,6,-3 +-6,0,-1,0 +0,2,-1,5 +-6,-3,4,1 +4,-4,-5,7 +-8,6,-5,-4 +-6,0,2,-3 +8,-3,-4,2 +8,2,-2,-4 +-3,-7,5,7 +-8,-8,-3,1 +-7,-2,5,-8 +3,6,5,1 +3,-4,-5,4 +-1,-1,-2,-5 +-4,4,5,-3 +2,-7,-4,8 +2,-7,4,-2 +0,-6,-1,6 +5,3,6,-5 +4,3,-6,2 +-2,8,0,0 +-8,-1,5,7 +2,-1,-7,-5 +-5,-2,-1,0 +-4,3,0,7 +-8,-6,7,-5 +8,-2,6,8 +5,6,-3,0 +1,1,-3,0 +3,2,7,1 +-2,-2,-5,0 +-3,-4,3,2 +0,1,-5,7 +-1,1,-4,-2 +0,-2,-1,-7 +3,-7,3,7 +-1,-8,5,-7 +-2,-4,-8,-4 +-2,7,-1,8 +6,6,6,-3 +0,4,2,-3 +7,0,6,8 +8,-6,-1,0 +0,4,-5,-3 +-7,7,1,-4 +4,1,1,-3 +-4,7,0,-6 +2,-7,2,8 +3,6,-2,-3 +1,2,-3,1 +-2,-7,0,2 +1,-6,2,4 +-4,0,6,8 +0,-6,-8,0 +8,-2,4,-8 +2,-7,0,1 +-7,1,7,6 +1,8,7,6 +4,6,-6,6 +7,4,-2,7 +0,-7,-8,0 +-4,3,-6,7 +0,6,-1,0 +-2,1,-3,6 +-6,-1,0,-4 +-1,-8,-8,-8 +-6,4,-5,8 +-6,-6,-7,-6 +-5,6,-2,7 +-7,6,4,-5 +1,0,1,1 +-2,8,-7,7 +0,3,-7,3 +6,-6,5,-6 +7,1,-4,0 +-4,0,3,1 +-4,-2,-5,-7 +7,4,-3,-1 +-8,2,6,-2 +3,2,0,-8 +0,1,-5,3 +-6,-6,0,-8 +7,3,-7,3 +-8,3,-2,7 +-8,-3,8,-8 +4,-5,-6,2 +2,3,-4,-2 +-8,-8,-1,1 +6,2,-7,8 +-5,6,-3,8 +-6,8,0,5 +-2,-5,3,-2 +1,8,3,7 +-5,6,7,-8 +-5,-2,0,-3 +1,5,-8,-4 +-5,-2,-2,7 +-2,1,1,7 +-1,-4,-7,-6 +8,5,-2,-2 +-6,7,5,-7 +6,-2,-5,-1 +-1,4,0,-8 +7,0,0,0 +-5,-3,5,-6 +0,8,8,-4 +0,6,4,-5 +2,3,-3,1 +-4,-1,4,5 +-6,2,1,1 +0,2,4,-4 +-8,0,5,4 +6,8,-1,0 +-6,-3,4,5 +7,-3,-6,3 +-6,-4,4,1 +-1,-2,-1,7 +-4,6,8,-7 +0,6,8,8 +-4,-6,-6,4 +-6,-3,7,-4 +8,4,5,0 +0,-5,-3,2 +7,7,-8,-1 +-4,-1,-6,3 +1,0,6,3 +-3,7,-5,0 +8,-6,5,-3 +-4,-2,5,-4 +-7,2,-8,7 +4,2,8,2 +6,-5,-2,1 +5,7,1,-5 +3,-1,1,-4 +6,-2,4,-5 +7,-7,8,-3 +-7,-8,3,-2 +2,3,2,0 +3,8,7,-3 +-5,4,-2,-5 +8,-8,-4,-7 +-1,-6,-6,-1 +1,6,0,-1 +5,2,6,0 +-5,-5,0,0 +1,3,0,7 +0,6,8,6 +4,7,-4,-5 +2,2,3,7 +-1,-4,1,5 +6,4,2,-1 +0,-4,-5,8 +8,-8,5,8 +3,1,-4,3 +-8,8,6,6 +2,-8,-2,-5 +8,1,1,4 +-4,6,-7,-1 +2,-6,2,0 +5,-2,-8,3 +8,3,-1,1 +-8,-3,-6,2 +-1,-3,0,-8 +4,-4,7,1 +7,0,-5,8 +2,0,-3,-1 +2,8,2,6 +1,-8,-6,-5 +-8,8,-4,-1 +0,6,-7,7 +-4,-8,0,-1 +-8,0,3,0 +8,5,-4,2 +-4,-2,-2,2 +-6,-3,-3,7 +0,-8,3,-8 +4,-1,7,0 +-8,2,-3,8 +2,-1,-5,-5 +2,-2,-7,4 +4,3,0,0 +5,-7,4,-3 +5,-3,7,1 +-4,-7,2,-8 +-6,0,-8,6 +2,-5,5,2 +1,-2,-3,-1 +-1,0,-2,0 +-6,-6,-8,8 +-2,8,2,-8 +-3,-8,0,0 +-4,-8,4,-4 +2,0,7,-7 +-4,3,-8,-2 +0,-8,-8,-6 +4,-8,7,-1 +0,4,2,8 +0,4,2,-2 +-4,4,-4,6 +5,8,-8,-1 +-7,0,-4,1 +-8,-6,-8,-4 +5,-6,1,-7 +3,5,1,-6 +-2,7,-2,-8 +0,4,0,-6 +1,1,6,5 +-7,-8,7,-1 +-4,1,-4,-7 +-2,0,3,4 +-5,0,-8,0 +-8,4,1,-6 +1,0,-5,7 +0,-5,2,-5 +-2,0,2,8 +8,0,-6,-4 +0,3,-2,7 +2,-1,6,0 +-3,3,6,5 +8,-4,-8,1 +-1,6,8,-5 +-3,8,-7,6 +-7,1,-8,-2 +-7,2,1,8 +0,-4,2,3 +-8,-6,-3,4 +-2,-1,3,5 +8,2,-8,2 +-6,5,-8,1 +7,1,7,6 +-3,6,6,8 +7,-4,0,0 +-5,-6,-7,-1 +-5,-5,-4,2 +0,-6,0,6 +3,-5,6,0 +-3,-2,-6,4 +8,0,1,5 +-8,4,7,-1 +1,0,4,6 +3,8,-7,-1 +4,-6,-3,-3 +0,-8,-3,8 +-1,-8,-8,0 +0,6,2,-5 +0,0,7,-1 +6,0,4,-3 +8,5,-8,5 +-6,-2,3,-4 +-2,0,-6,-6 +3,-4,0,2 +0,-7,6,-8 +-5,0,7,-8 +-1,6,-5,-2 +0,-2,5,0 +4,3,7,-1 +4,8,-7,7 +6,-5,-2,-6 +7,3,4,8 +-6,2,-5,5 +3,2,7,-8 +4,0,0,-5 +8,-1,-3,3 +-2,-6,6,2 +-7,3,3,3 +-8,-4,-5,-5 +7,6,6,6 +2,6,6,0 +-5,-8,-6,7 +0,-3,-2,2 +0,2,4,-8 +5,-8,-7,6 +8,-8,0,-2 +-4,-2,5,6 +3,4,0,0 +1,-7,4,2 +-4,-2,0,-5 +3,8,7,4 +-5,6,-1,0 +-6,0,-3,8 +7,1,0,-6 +3,-7,2,-4 +-6,7,-3,8 +0,-6,-7,4 +4,0,6,3 +6,-3,-7,-5 +-3,-3,-7,6 +6,-8,3,0 +-3,-1,0,6 +6,6,6,8 +8,-3,8,1 +0,-6,-5,8 +7,3,-4,-5 +-5,-3,5,3 +7,7,2,-5 +1,6,-5,4 +7,0,1,-7 +-1,6,-5,-8 +2,-3,-4,-8 +2,0,-1,3 +8,-7,6,0 +1,8,0,-4 +0,5,2,5 +0,6,-1,5 +-7,2,0,-4 +4,6,6,2 +2,7,2,-2 +-7,6,-4,0 +1,3,7,-3 +-3,-1,1,-5 +-7,4,-8,5 +3,3,2,6 +0,3,-7,4 +8,-5,3,-6 +5,3,-1,5 +1,7,-3,8 +0,-5,4,-7 +-3,-7,-6,-8 +0,-4,4,2 +-6,4,1,-2 +2,4,-7,-7 +-8,5,-1,-6 +-6,2,-3,-2 +3,2,-7,4 +-6,0,-2,0 +-3,-3,1,-7 +8,8,2,-4 +6,6,-1,-3 +-4,3,6,-3 +6,-4,0,8 +-5,6,6,7 +0,-6,-6,6 +-3,2,8,4 +7,-5,2,-1 +8,-8,2,5 +0,-3,-5,-3 +-2,-4,-1,6 +1,6,0,5 +0,-5,0,-8 +-8,0,-8,3 +-1,1,4,-1 +-2,7,-1,-3 +-1,6,-6,-2 +8,0,0,0 +5,3,3,-6 +-6,5,-5,4 +-1,2,-8,-2 +-5,-3,7,4 +-4,6,-5,0 +4,-8,-2,4 +-6,1,-5,-3 +-7,1,-7,-2 +-6,-2,-5,0 +2,0,-8,-1 +2,2,-1,6 +-4,4,8,-3 +1,-4,-8,6 +-6,2,0,-8 +-5,7,-1,-4 +5,6,-7,-3 +0,-5,-3,4 +-6,0,-7,4 +4,-5,-8,-1 +8,1,-7,-3 +-5,1,-8,1 +2,8,-7,-6 +0,-7,5,4 +-6,4,-1,-1 +3,-4,7,-4 +0,-1,2,0 +8,-8,1,-5 +-4,3,3,-2 +7,-3,1,-8 +3,-3,3,4 +0,8,2,-4 +-2,3,-6,0 +-7,-7,0,-4 +-1,2,-4,-4 +8,-3,-3,2 +0,-8,5,0 +5,-1,6,6 +-5,-4,7,4 +4,8,2,2 +6,5,-2,6 +1,2,-5,-2 +-6,-7,1,8 +-5,0,-4,-3 +3,6,8,-7 +-1,4,1,2 +8,-8,0,-4 +-7,0,3,4 +1,-6,-1,-5 +-3,7,-5,5 +-5,3,-5,3 +-8,7,0,8 +-5,-8,-7,-2 +4,-7,8,-6 +6,1,-2,-1 +-5,-4,8,-8 +2,5,7,-1 +-8,3,6,4 +0,-1,-8,5 +2,-2,-6,-3 +-7,-2,6,4 +-3,-1,-3,3 +-4,1,4,0 +4,-6,0,-5 +-2,-3,1,3 +7,0,2,0 +0,-2,3,1 +-8,0,2,-2 +3,3,8,-6 +3,-5,3,2 +1,-6,5,-2 +-8,4,-1,-5 +-2,-5,-2,-8 +-7,-5,0,2 +0,-6,-1,0 +-7,0,3,5 +-5,3,3,-2 +4,-4,5,-4 +-6,5,4,7 +-2,0,4,4 +-1,5,4,-3 +7,6,4,3 +6,-7,0,-3 +8,-8,1,2 +6,-3,0,8 +-3,6,5,-1 +-4,-6,-8,1 +-6,2,0,7 +-1,6,0,3 +0,7,-7,-8 +0,0,5,4 +-7,-1,-1,7 +7,-5,0,0 +1,-6,7,8 +2,0,7,8 +4,-8,-2,-3 +5,4,7,1 +3,0,-1,-4 +-5,-1,3,7 +0,-4,4,-3 +7,1,8,3 +6,-6,7,-4 +-6,-5,-3,-1 +-3,2,-6,2 +0,8,-3,7 +4,-4,8,-2 +0,-6,5,1 +6,0,3,-1 +-7,2,4,5 +-4,-2,4,0 +6,-4,1,8 +-7,4,8,6 +-1,-1,4,3 +8,0,5,-7 +-4,8,0,-3 +2,4,6,1 +0,-7,7,2 +-1,-4,6,8 +1,-6,4,6 +-6,6,1,-3 +-1,-6,-2,3 +-1,2,1,-2 +7,0,5,7 +-1,0,5,3 +0,4,0,1 +8,0,8,5 +4,6,-6,-8 +-7,5,1,-4 +3,7,0,4 +-2,6,-3,6 +0,2,-7,8 +3,6,-4,8 +8,-3,-8,-8 +4,6,-2,-1 +5,0,-3,-2 +-1,5,-3,-7 +-1,2,-1,0 +5,0,-5,2 +0,-3,-4,-3 +5,-5,6,6 +-5,-2,0,8 +-2,0,-7,-7 +-6,8,0,-3 +0,-2,-8,5 +7,-1,6,8 +-3,-3,0,3 +5,4,-1,8 +8,-8,5,5 +2,-1,-3,6 +7,-7,6,8 +-4,-2,-7,1 +3,6,2,-3 +-3,0,0,-7 +7,7,-4,-6 +-6,4,-1,8 +5,-3,5,4 +5,-4,0,8 +0,5,2,-8 +0,-3,0,4 +0,0,1,-1 +-8,0,0,-4 +8,0,0,-3 +4,-3,2,3 +-7,-4,8,6 +-1,-6,0,0 +3,-6,-3,-4 +-4,0,-8,5 +5,-8,0,-1 +3,-3,3,-5 +0,-3,7,7 +2,-6,5,3 +0,-1,-1,-3 +5,5,2,3 +-1,-4,6,3 +2,7,7,-4 +3,-6,3,0 +1,-2,-2,-1 +-1,6,5,-1 +7,8,7,-2 +7,3,-5,0 +7,0,-1,0 +3,3,-2,4 +-3,8,5,3 +7,8,-8,-4 +0,-7,0,-6 +5,-2,0,-7 +2,-5,-3,-1 +-8,1,-4,-7 +-3,2,-4,6 +-7,-6,-7,0 +-5,6,8,2 +4,7,8,4 +2,-8,6,0 +1,7,5,-8 +-8,1,3,-1 +4,4,1,5 +2,-2,-2,2 +-8,6,4,0 +-5,6,-5,7 +0,0,-5,4 +4,-4,7,-7 +-8,-8,4,7 +-7,4,0,5 +-4,3,6,-1 +1,1,-8,5 +0,8,-3,-1 +5,6,0,-4 +-8,8,3,-2 +1,-2,1,2 +2,-4,-7,1 +-5,1,6,0 +-1,-1,2,8 +2,6,5,7 +-2,-1,8,0 +0,-7,-8,-1 +5,1,8,0 +1,-6,6,6 +-6,-1,8,0 +6,-3,4,-4 +6,0,-3,-7 +3,1,-7,-3 +0,-7,-7,4 +2,3,1,2 +-8,0,-5,-5 +0,-8,7,-2 +-2,-1,3,7 +6,-7,1,-8 +-7,-2,1,-4 +4,-1,-8,3 +6,-7,-5,6 +-2,3,1,2 +2,8,-8,-8 +-1,6,-2,-6 +-1,-3,1,7 +-6,0,8,-7 +-7,1,2,-8 +0,2,-4,-8 +0,-8,-8,0 +7,-1,4,-8 +-5,1,3,0 +1,-8,7,-7 +-8,-5,1,4 +-4,0,3,4 +0,-7,-2,3 +-1,-2,4,-8 +-7,-4,5,7 +8,-1,-4,-8 +7,-5,-7,-4 +-8,3,0,6 +-7,5,1,-8 +-5,8,0,5 +4,1,-8,-8 +8,5,2,6 +7,-1,5,1 +-7,0,-6,-8 +-4,1,-5,0 +2,6,-2,4 +0,-7,4,2 +5,-5,5,3 +-4,7,5,-5 +4,-7,0,-3 +1,0,-3,1 +1,7,-7,-3 +2,7,0,-1 +-3,0,-8,1 +5,6,5,3 +6,-6,5,-2 +8,-1,4,-8 +0,-3,0,0 +-8,0,8,2 +-8,7,-6,0 +2,0,-7,6 +7,-3,-5,-3 +1,-5,-1,8 +6,4,0,1 +1,0,-3,4 +-8,6,4,-7 +4,8,-2,5 +0,-7,2,-3 +0,8,0,0 +-8,0,2,3 +-4,6,8,0 +-6,-2,-6,-3 +-4,2,0,-6 +0,1,6,1 +-7,0,-4,-8 +-6,-2,8,5 +8,2,0,-4 +5,5,-7,0 +-1,4,8,-5 +-8,-6,-1,-6 +0,5,-1,1 +8,-2,-7,-3 +-8,3,3,4 +3,0,-2,2 +5,-7,8,-1 +-6,0,0,-8 +2,8,5,5 +-2,0,0,4 +-2,7,7,-2 +-1,0,6,7 +-4,2,-7,3 +8,-4,-5,6 +-1,2,6,-5 +-7,-1,6,-2 +2,-4,-1,-3 +8,-3,8,2 +-8,7,-6,-7 +-3,3,5,7 +-2,5,-2,4 +0,2,-4,0 +2,5,-5,0 +6,6,5,5 +-8,5,0,-1 +3,-8,4,0 +-4,6,-2,-1 +-7,-8,2,1 +-6,8,1,3 +8,-4,-8,0 +4,-8,-8,0 +1,-5,-7,1 +1,0,3,3 +0,-8,3,5 +-4,0,0,1 +-6,0,-3,6 +-5,-4,1,-5 +-6,-3,7,-8 +4,-1,1,6 +6,5,0,7 +1,6,0,-2 +5,2,-1,4 +4,-1,0,-2 +4,-7,-1,5 +-1,-1,0,-3 +-1,-5,-1,-8 +-6,1,1,5 +-8,5,8,-5 +8,-7,0,4 +-4,4,0,3 +2,1,-3,-1 +-1,-6,-2,1 +-7,6,-1,2 +7,2,1,-6 +-5,4,6,-8 +8,8,-2,0 +-4,-7,-1,0 +7,0,-7,6 +6,-7,3,6 +-5,4,-8,6 +3,-2,-5,-6 +0,1,2,3 +7,0,-4,-7 +0,-1,7,0 +0,7,7,-2 +-5,7,-5,-2 +6,-1,-4,-6 +7,-2,4,5 +1,-2,8,3 +-6,-6,1,8 +-7,-8,4,-6 +8,-1,2,-7 +0,6,-6,5 +7,4,-6,5 +2,7,-4,-4 +1,-5,7,-7 +6,0,2,-8 +-3,5,-8,-1 +-4,0,1,-2 +8,6,1,-7 +5,4,-4,-1 +7,-5,1,0 +-5,3,6,8 +1,-8,6,-6 +-5,7,5,-8 +0,0,6,-3 +5,-1,7,0 +-8,-4,-6,-1 +-3,2,-1,-2 +-3,-4,1,1 +-3,-2,1,-1 +-2,8,-2,0 +-1,-1,2,1 +2,1,4,-6 +-5,1,7,-2 +0,7,-5,-5 diff --git a/src/main/resources/2018/day3.txt b/src/main/resources/2018/day3.txt new file mode 100644 index 00000000..96382d7c --- /dev/null +++ b/src/main/resources/2018/day3.txt @@ -0,0 +1,1307 @@ +#1 @ 755,138: 26x19 +#2 @ 952,518: 15x24 +#3 @ 304,90: 28x12 +#4 @ 237,265: 17x13 +#5 @ 219,97: 26x24 +#6 @ 512,74: 19x21 +#7 @ 868,291: 22x25 +#8 @ 908,272: 17x11 +#9 @ 432,455: 10x8 +#10 @ 309,778: 13x25 +#11 @ 569,720: 28x29 +#12 @ 557,222: 26x15 +#13 @ 899,728: 12x22 +#14 @ 966,109: 13x15 +#15 @ 403,295: 27x24 +#16 @ 320,546: 10x28 +#17 @ 871,906: 10x20 +#18 @ 233,207: 27x11 +#19 @ 672,560: 16x25 +#20 @ 422,273: 22x11 +#21 @ 314,911: 17x26 +#22 @ 36,545: 18x13 +#23 @ 18,151: 13x24 +#24 @ 655,24: 28x22 +#25 @ 538,430: 21x26 +#26 @ 749,726: 19x18 +#27 @ 41,166: 22x29 +#28 @ 595,17: 11x20 +#29 @ 691,725: 18x20 +#30 @ 427,113: 11x25 +#31 @ 491,661: 19x23 +#32 @ 479,348: 20x16 +#33 @ 415,1: 16x17 +#34 @ 780,927: 23x19 +#35 @ 780,350: 21x3 +#36 @ 415,796: 12x15 +#37 @ 783,452: 29x24 +#38 @ 702,728: 16x28 +#39 @ 350,676: 17x21 +#40 @ 611,518: 12x21 +#41 @ 813,715: 13x26 +#42 @ 317,63: 29x24 +#43 @ 484,642: 26x14 +#44 @ 237,910: 24x25 +#45 @ 325,917: 28x20 +#46 @ 567,485: 20x12 +#47 @ 464,470: 18x26 +#48 @ 389,9: 13x11 +#49 @ 92,560: 16x21 +#50 @ 532,967: 23x14 +#51 @ 762,825: 11x13 +#52 @ 606,600: 23x23 +#53 @ 848,798: 19x24 +#54 @ 311,503: 10x15 +#55 @ 72,388: 13x19 +#56 @ 28,692: 15x29 +#57 @ 965,205: 13x13 +#58 @ 472,738: 18x17 +#59 @ 732,652: 25x18 +#60 @ 676,573: 23x17 +#61 @ 859,162: 17x24 +#62 @ 775,822: 19x26 +#63 @ 343,97: 22x20 +#64 @ 945,279: 13x19 +#65 @ 446,405: 13x13 +#66 @ 293,520: 26x16 +#67 @ 852,501: 26x19 +#68 @ 924,209: 21x29 +#69 @ 469,425: 17x17 +#70 @ 192,827: 14x11 +#71 @ 944,798: 25x24 +#72 @ 161,321: 16x20 +#73 @ 930,796: 25x10 +#74 @ 460,629: 26x23 +#75 @ 777,347: 29x10 +#76 @ 320,50: 20x20 +#77 @ 417,360: 26x18 +#78 @ 579,460: 14x26 +#79 @ 20,361: 29x11 +#80 @ 55,929: 26x25 +#81 @ 532,605: 26x29 +#82 @ 152,606: 24x20 +#83 @ 255,566: 24x18 +#84 @ 54,204: 13x22 +#85 @ 837,206: 19x16 +#86 @ 555,336: 13x24 +#87 @ 878,302: 16x15 +#88 @ 356,480: 21x22 +#89 @ 261,769: 16x10 +#90 @ 884,165: 27x10 +#91 @ 374,83: 20x11 +#92 @ 514,214: 17x18 +#93 @ 346,557: 21x16 +#94 @ 260,772: 27x20 +#95 @ 337,313: 25x21 +#96 @ 140,322: 17x10 +#97 @ 81,892: 24x20 +#98 @ 432,958: 10x23 +#99 @ 533,176: 22x10 +#100 @ 186,331: 14x20 +#101 @ 910,975: 11x11 +#102 @ 756,642: 24x22 +#103 @ 251,358: 14x21 +#104 @ 30,146: 18x26 +#105 @ 307,555: 14x12 +#106 @ 150,670: 13x20 +#107 @ 643,862: 17x27 +#108 @ 98,740: 29x13 +#109 @ 347,44: 11x14 +#110 @ 105,597: 11x27 +#111 @ 918,492: 15x19 +#112 @ 824,383: 20x17 +#113 @ 227,259: 21x17 +#114 @ 103,516: 5x10 +#115 @ 170,683: 13x14 +#116 @ 397,590: 22x24 +#117 @ 577,257: 21x25 +#118 @ 575,204: 13x13 +#119 @ 245,761: 16x16 +#120 @ 802,736: 13x19 +#121 @ 193,10: 26x16 +#122 @ 393,4: 25x28 +#123 @ 122,609: 18x19 +#124 @ 635,687: 12x11 +#125 @ 898,545: 25x15 +#126 @ 293,934: 17x15 +#127 @ 224,781: 27x22 +#128 @ 952,534: 17x15 +#129 @ 557,958: 11x12 +#130 @ 248,655: 13x20 +#131 @ 334,284: 21x18 +#132 @ 663,378: 25x25 +#133 @ 892,529: 27x24 +#134 @ 428,451: 21x18 +#135 @ 263,39: 22x14 +#136 @ 68,217: 12x29 +#137 @ 560,136: 15x13 +#138 @ 163,815: 29x18 +#139 @ 627,669: 20x12 +#140 @ 23,539: 16x13 +#141 @ 101,509: 19x25 +#142 @ 895,520: 12x26 +#143 @ 409,884: 27x12 +#144 @ 368,760: 11x20 +#145 @ 557,58: 28x10 +#146 @ 438,332: 12x21 +#147 @ 76,951: 28x20 +#148 @ 406,186: 22x27 +#149 @ 302,621: 19x29 +#150 @ 920,629: 17x13 +#151 @ 849,878: 11x28 +#152 @ 780,576: 20x28 +#153 @ 757,799: 26x23 +#154 @ 116,834: 29x16 +#155 @ 729,960: 23x11 +#156 @ 137,56: 20x23 +#157 @ 556,337: 13x18 +#158 @ 294,546: 29x20 +#159 @ 22,334: 28x14 +#160 @ 565,39: 14x16 +#161 @ 173,311: 12x18 +#162 @ 191,516: 15x17 +#163 @ 280,334: 29x25 +#164 @ 835,508: 10x15 +#165 @ 413,766: 23x10 +#166 @ 922,355: 16x22 +#167 @ 231,790: 13x16 +#168 @ 363,538: 16x23 +#169 @ 333,386: 25x16 +#170 @ 901,377: 13x19 +#171 @ 722,437: 18x25 +#172 @ 666,697: 26x22 +#173 @ 0,355: 10x10 +#174 @ 475,88: 23x12 +#175 @ 51,174: 21x29 +#176 @ 546,330: 21x25 +#177 @ 707,924: 15x11 +#178 @ 530,812: 22x14 +#179 @ 73,52: 20x25 +#180 @ 936,311: 13x17 +#181 @ 723,519: 28x11 +#182 @ 662,239: 17x19 +#183 @ 309,186: 23x23 +#184 @ 584,457: 26x22 +#185 @ 575,52: 19x19 +#186 @ 327,300: 19x24 +#187 @ 376,128: 12x21 +#188 @ 573,536: 8x7 +#189 @ 420,335: 12x29 +#190 @ 886,554: 12x10 +#191 @ 820,66: 10x22 +#192 @ 5,564: 25x27 +#193 @ 942,979: 29x17 +#194 @ 116,55: 27x11 +#195 @ 423,854: 20x16 +#196 @ 331,37: 19x24 +#197 @ 715,374: 29x13 +#198 @ 873,758: 10x29 +#199 @ 661,367: 20x22 +#200 @ 521,796: 26x20 +#201 @ 582,838: 15x26 +#202 @ 548,870: 10x19 +#203 @ 357,418: 21x11 +#204 @ 651,861: 28x11 +#205 @ 166,414: 18x15 +#206 @ 403,513: 16x13 +#207 @ 10,561: 23x19 +#208 @ 259,725: 27x13 +#209 @ 505,647: 13x14 +#210 @ 25,131: 28x15 +#211 @ 414,295: 28x16 +#212 @ 421,775: 19x14 +#213 @ 214,627: 12x19 +#214 @ 642,675: 24x26 +#215 @ 561,755: 22x10 +#216 @ 469,754: 23x15 +#217 @ 533,714: 21x21 +#218 @ 21,163: 13x12 +#219 @ 11,59: 12x21 +#220 @ 47,903: 10x20 +#221 @ 538,890: 12x24 +#222 @ 114,617: 23x29 +#223 @ 462,209: 16x12 +#224 @ 206,643: 17x29 +#225 @ 890,106: 24x10 +#226 @ 276,15: 16x12 +#227 @ 663,196: 22x26 +#228 @ 660,686: 17x28 +#229 @ 474,586: 10x26 +#230 @ 900,379: 12x23 +#231 @ 2,31: 12x12 +#232 @ 937,309: 24x29 +#233 @ 450,123: 16x19 +#234 @ 302,204: 29x16 +#235 @ 199,948: 29x12 +#236 @ 958,794: 29x19 +#237 @ 779,851: 18x23 +#238 @ 730,631: 18x29 +#239 @ 111,704: 18x24 +#240 @ 488,58: 25x12 +#241 @ 572,23: 26x22 +#242 @ 307,89: 12x22 +#243 @ 510,770: 24x15 +#244 @ 45,448: 11x28 +#245 @ 590,542: 18x17 +#246 @ 678,2: 23x12 +#247 @ 796,319: 11x16 +#248 @ 152,680: 26x25 +#249 @ 938,25: 19x21 +#250 @ 56,395: 23x22 +#251 @ 590,668: 18x24 +#252 @ 839,710: 29x14 +#253 @ 792,637: 24x20 +#254 @ 700,113: 26x14 +#255 @ 25,593: 11x23 +#256 @ 924,479: 28x25 +#257 @ 223,544: 24x20 +#258 @ 680,577: 18x18 +#259 @ 342,475: 23x29 +#260 @ 533,151: 17x13 +#261 @ 142,519: 22x20 +#262 @ 902,762: 15x28 +#263 @ 332,827: 13x23 +#264 @ 10,105: 19x25 +#265 @ 417,605: 17x19 +#266 @ 578,795: 10x12 +#267 @ 308,342: 12x21 +#268 @ 239,241: 27x24 +#269 @ 312,382: 10x3 +#270 @ 770,6: 13x20 +#271 @ 350,484: 18x22 +#272 @ 897,652: 14x19 +#273 @ 518,314: 17x12 +#274 @ 675,124: 9x12 +#275 @ 787,416: 28x17 +#276 @ 512,204: 18x19 +#277 @ 243,224: 16x18 +#278 @ 266,938: 6x3 +#279 @ 305,914: 22x22 +#280 @ 68,930: 22x10 +#281 @ 312,565: 25x10 +#282 @ 562,608: 16x19 +#283 @ 55,116: 17x10 +#284 @ 253,675: 19x16 +#285 @ 304,299: 19x15 +#286 @ 786,401: 26x20 +#287 @ 391,621: 21x25 +#288 @ 437,217: 19x18 +#289 @ 675,488: 25x28 +#290 @ 47,195: 10x26 +#291 @ 881,323: 25x29 +#292 @ 24,173: 25x27 +#293 @ 816,658: 22x21 +#294 @ 915,501: 29x18 +#295 @ 886,49: 12x23 +#296 @ 885,60: 10x15 +#297 @ 257,849: 26x28 +#298 @ 899,571: 29x15 +#299 @ 714,390: 15x11 +#300 @ 915,702: 14x27 +#301 @ 489,164: 10x6 +#302 @ 389,463: 16x10 +#303 @ 229,759: 28x11 +#304 @ 4,570: 17x17 +#305 @ 547,949: 28x24 +#306 @ 696,931: 17x16 +#307 @ 241,300: 18x16 +#308 @ 790,323: 15x17 +#309 @ 483,822: 17x17 +#310 @ 463,733: 21x22 +#311 @ 98,549: 20x10 +#312 @ 364,23: 13x12 +#313 @ 490,651: 18x15 +#314 @ 887,670: 19x19 +#315 @ 326,902: 10x19 +#316 @ 793,765: 17x19 +#317 @ 733,540: 17x10 +#318 @ 768,892: 28x20 +#319 @ 317,21: 29x10 +#320 @ 668,172: 13x27 +#321 @ 496,122: 12x4 +#322 @ 911,236: 12x12 +#323 @ 430,576: 25x15 +#324 @ 606,798: 27x25 +#325 @ 903,242: 21x15 +#326 @ 128,713: 14x10 +#327 @ 293,367: 25x15 +#328 @ 610,359: 13x23 +#329 @ 284,30: 22x16 +#330 @ 561,764: 17x20 +#331 @ 558,329: 11x17 +#332 @ 536,356: 23x27 +#333 @ 606,968: 26x19 +#334 @ 420,175: 15x24 +#335 @ 676,86: 29x20 +#336 @ 908,410: 17x16 +#337 @ 558,766: 12x28 +#338 @ 917,860: 23x20 +#339 @ 253,362: 8x11 +#340 @ 429,844: 14x27 +#341 @ 56,851: 10x23 +#342 @ 309,709: 22x18 +#343 @ 165,346: 25x21 +#344 @ 17,922: 23x14 +#345 @ 702,31: 16x21 +#346 @ 328,333: 19x27 +#347 @ 302,911: 17x18 +#348 @ 15,649: 12x19 +#349 @ 966,178: 24x21 +#350 @ 544,945: 27x17 +#351 @ 261,927: 28x20 +#352 @ 705,393: 28x12 +#353 @ 732,58: 17x26 +#354 @ 213,572: 20x26 +#355 @ 358,650: 16x29 +#356 @ 754,629: 10x14 +#357 @ 708,941: 10x21 +#358 @ 153,478: 19x18 +#359 @ 950,364: 29x16 +#360 @ 765,705: 12x22 +#361 @ 779,171: 20x11 +#362 @ 670,677: 14x26 +#363 @ 405,646: 27x17 +#364 @ 346,842: 25x25 +#365 @ 902,872: 22x23 +#366 @ 166,133: 16x10 +#367 @ 692,546: 24x26 +#368 @ 883,552: 23x10 +#369 @ 153,497: 12x16 +#370 @ 928,881: 15x28 +#371 @ 316,308: 19x22 +#372 @ 582,239: 28x23 +#373 @ 285,728: 16x24 +#374 @ 790,929: 17x15 +#375 @ 369,96: 14x21 +#376 @ 904,950: 19x18 +#377 @ 205,938: 13x13 +#378 @ 132,837: 13x16 +#379 @ 279,864: 14x14 +#380 @ 718,816: 29x23 +#381 @ 120,973: 29x17 +#382 @ 422,461: 10x15 +#383 @ 208,352: 23x26 +#384 @ 904,731: 18x23 +#385 @ 61,876: 26x27 +#386 @ 533,327: 27x22 +#387 @ 2,349: 20x13 +#388 @ 399,969: 24x23 +#389 @ 805,734: 13x15 +#390 @ 190,898: 24x13 +#391 @ 117,845: 19x18 +#392 @ 368,30: 16x19 +#393 @ 406,974: 13x4 +#394 @ 35,913: 10x29 +#395 @ 228,169: 11x28 +#396 @ 505,735: 21x12 +#397 @ 737,335: 10x16 +#398 @ 261,264: 28x15 +#399 @ 965,959: 15x25 +#400 @ 14,168: 25x23 +#401 @ 693,517: 14x13 +#402 @ 54,893: 13x16 +#403 @ 186,945: 26x14 +#404 @ 117,742: 21x19 +#405 @ 185,455: 11x14 +#406 @ 203,1: 20x11 +#407 @ 175,191: 27x18 +#408 @ 634,690: 19x21 +#409 @ 650,437: 27x15 +#410 @ 623,752: 15x24 +#411 @ 790,606: 16x24 +#412 @ 851,726: 19x12 +#413 @ 68,171: 25x23 +#414 @ 336,135: 19x11 +#415 @ 427,151: 10x28 +#416 @ 313,67: 10x12 +#417 @ 144,519: 23x11 +#418 @ 606,699: 27x28 +#419 @ 66,564: 17x24 +#420 @ 219,225: 28x29 +#421 @ 911,398: 11x17 +#422 @ 971,903: 28x27 +#423 @ 909,220: 20x20 +#424 @ 64,845: 29x18 +#425 @ 448,248: 23x26 +#426 @ 726,370: 15x14 +#427 @ 951,135: 24x20 +#428 @ 557,750: 24x23 +#429 @ 487,184: 26x21 +#430 @ 427,819: 27x18 +#431 @ 243,684: 16x12 +#432 @ 362,486: 27x10 +#433 @ 631,562: 22x24 +#434 @ 43,258: 16x21 +#435 @ 855,305: 21x11 +#436 @ 216,955: 29x11 +#437 @ 709,7: 21x27 +#438 @ 308,47: 16x11 +#439 @ 251,765: 16x10 +#440 @ 737,440: 16x20 +#441 @ 142,438: 22x18 +#442 @ 405,492: 17x23 +#443 @ 216,687: 28x12 +#444 @ 323,770: 20x17 +#445 @ 373,90: 28x26 +#446 @ 670,674: 10x17 +#447 @ 292,239: 5x5 +#448 @ 369,133: 17x18 +#449 @ 81,173: 13x14 +#450 @ 954,299: 29x17 +#451 @ 390,730: 21x10 +#452 @ 933,25: 10x12 +#453 @ 340,165: 14x13 +#454 @ 459,498: 10x13 +#455 @ 787,464: 10x24 +#456 @ 476,683: 29x26 +#457 @ 877,986: 12x12 +#458 @ 393,112: 27x27 +#459 @ 957,538: 16x22 +#460 @ 815,245: 12x11 +#461 @ 777,925: 29x13 +#462 @ 200,302: 24x14 +#463 @ 780,916: 19x16 +#464 @ 355,667: 20x11 +#465 @ 310,972: 17x17 +#466 @ 591,6: 12x25 +#467 @ 429,640: 10x19 +#468 @ 888,608: 29x26 +#469 @ 47,843: 15x13 +#470 @ 457,653: 17x21 +#471 @ 589,253: 24x29 +#472 @ 586,746: 15x20 +#473 @ 339,492: 19x21 +#474 @ 562,507: 19x23 +#475 @ 283,874: 25x19 +#476 @ 277,237: 25x10 +#477 @ 478,493: 13x17 +#478 @ 37,239: 15x11 +#479 @ 948,887: 25x24 +#480 @ 883,25: 15x21 +#481 @ 203,89: 17x14 +#482 @ 422,924: 25x20 +#483 @ 838,387: 7x3 +#484 @ 114,831: 26x25 +#485 @ 906,5: 20x17 +#486 @ 17,422: 5x8 +#487 @ 664,638: 14x13 +#488 @ 948,268: 11x12 +#489 @ 36,856: 29x10 +#490 @ 538,137: 12x26 +#491 @ 367,677: 20x22 +#492 @ 116,457: 29x11 +#493 @ 963,157: 23x22 +#494 @ 559,521: 11x13 +#495 @ 881,439: 15x24 +#496 @ 487,112: 27x25 +#497 @ 433,312: 23x23 +#498 @ 270,745: 16x13 +#499 @ 121,950: 17x21 +#500 @ 866,544: 24x13 +#501 @ 280,285: 13x23 +#502 @ 52,270: 20x29 +#503 @ 208,304: 6x8 +#504 @ 226,872: 28x14 +#505 @ 267,845: 13x13 +#506 @ 345,477: 23x20 +#507 @ 633,771: 25x27 +#508 @ 715,398: 27x21 +#509 @ 36,526: 28x28 +#510 @ 745,143: 13x28 +#511 @ 57,250: 10x29 +#512 @ 573,236: 25x12 +#513 @ 715,671: 12x13 +#514 @ 69,102: 4x21 +#515 @ 692,34: 22x10 +#516 @ 274,302: 16x29 +#517 @ 22,47: 25x18 +#518 @ 590,723: 28x17 +#519 @ 95,879: 18x16 +#520 @ 275,858: 11x13 +#521 @ 486,159: 25x16 +#522 @ 249,215: 12x15 +#523 @ 615,738: 16x18 +#524 @ 766,13: 19x12 +#525 @ 297,555: 18x20 +#526 @ 362,76: 16x18 +#527 @ 488,829: 10x22 +#528 @ 248,921: 22x24 +#529 @ 80,136: 18x15 +#530 @ 880,740: 13x12 +#531 @ 584,217: 18x23 +#532 @ 716,634: 7x12 +#533 @ 370,741: 23x21 +#534 @ 385,12: 16x16 +#535 @ 587,565: 23x29 +#536 @ 397,636: 16x28 +#537 @ 208,504: 14x20 +#538 @ 241,564: 15x12 +#539 @ 553,484: 18x11 +#540 @ 351,765: 28x26 +#541 @ 498,770: 3x12 +#542 @ 610,135: 14x29 +#543 @ 2,888: 24x16 +#544 @ 631,464: 16x16 +#545 @ 716,247: 15x27 +#546 @ 380,693: 18x21 +#547 @ 690,507: 11x17 +#548 @ 950,886: 28x17 +#549 @ 188,182: 12x16 +#550 @ 604,418: 20x22 +#551 @ 544,184: 27x13 +#552 @ 367,16: 23x13 +#553 @ 508,645: 21x26 +#554 @ 906,386: 13x16 +#555 @ 681,208: 17x17 +#556 @ 254,576: 12x14 +#557 @ 867,797: 17x18 +#558 @ 776,350: 9x4 +#559 @ 249,664: 11x29 +#560 @ 656,651: 21x29 +#561 @ 884,610: 25x25 +#562 @ 329,213: 13x27 +#563 @ 958,277: 20x25 +#564 @ 603,551: 12x13 +#565 @ 91,228: 21x14 +#566 @ 171,636: 19x25 +#567 @ 509,336: 14x17 +#568 @ 428,827: 26x28 +#569 @ 546,747: 20x17 +#570 @ 951,357: 17x15 +#571 @ 892,747: 15x27 +#572 @ 219,866: 21x16 +#573 @ 617,233: 20x22 +#574 @ 271,502: 15x11 +#575 @ 159,486: 17x17 +#576 @ 925,311: 26x10 +#577 @ 731,589: 10x19 +#578 @ 16,878: 21x17 +#579 @ 421,0: 11x27 +#580 @ 313,535: 20x21 +#581 @ 659,155: 19x24 +#582 @ 707,68: 29x27 +#583 @ 119,193: 25x19 +#584 @ 165,709: 23x18 +#585 @ 663,435: 25x12 +#586 @ 356,107: 28x10 +#587 @ 446,30: 22x17 +#588 @ 17,328: 28x24 +#589 @ 601,551: 25x16 +#590 @ 697,90: 12x21 +#591 @ 764,807: 23x22 +#592 @ 493,199: 22x14 +#593 @ 687,519: 18x26 +#594 @ 799,195: 16x11 +#595 @ 543,172: 22x26 +#596 @ 671,909: 24x10 +#597 @ 188,201: 21x24 +#598 @ 52,532: 24x25 +#599 @ 20,376: 10x29 +#600 @ 669,515: 25x12 +#601 @ 645,473: 15x20 +#602 @ 695,339: 11x26 +#603 @ 218,746: 16x16 +#604 @ 97,492: 11x26 +#605 @ 551,463: 14x27 +#606 @ 931,516: 25x28 +#607 @ 830,888: 26x14 +#608 @ 413,104: 24x25 +#609 @ 181,879: 17x20 +#610 @ 524,369: 14x29 +#611 @ 861,175: 23x19 +#612 @ 366,383: 20x24 +#613 @ 315,559: 11x11 +#614 @ 287,7: 23x21 +#615 @ 949,779: 12x21 +#616 @ 507,514: 21x21 +#617 @ 768,50: 29x11 +#618 @ 323,326: 12x28 +#619 @ 933,12: 24x17 +#620 @ 578,821: 24x29 +#621 @ 564,765: 14x22 +#622 @ 974,502: 11x16 +#623 @ 613,884: 19x28 +#624 @ 824,604: 11x13 +#625 @ 56,833: 11x21 +#626 @ 347,131: 13x29 +#627 @ 501,867: 28x19 +#628 @ 325,49: 22x24 +#629 @ 503,618: 17x21 +#630 @ 761,402: 12x22 +#631 @ 604,679: 15x19 +#632 @ 915,252: 19x24 +#633 @ 487,856: 29x15 +#634 @ 147,111: 21x23 +#635 @ 904,393: 28x27 +#636 @ 242,318: 22x19 +#637 @ 359,297: 16x19 +#638 @ 714,516: 23x20 +#639 @ 155,340: 24x10 +#640 @ 840,880: 17x25 +#641 @ 433,651: 13x26 +#642 @ 643,849: 23x14 +#643 @ 782,202: 29x18 +#644 @ 465,495: 26x15 +#645 @ 197,340: 28x15 +#646 @ 389,575: 25x29 +#647 @ 178,192: 27x27 +#648 @ 110,688: 16x28 +#649 @ 852,574: 15x11 +#650 @ 253,592: 14x10 +#651 @ 254,323: 28x20 +#652 @ 651,854: 21x15 +#653 @ 566,558: 19x27 +#654 @ 885,425: 15x25 +#655 @ 579,469: 3x4 +#656 @ 776,728: 22x23 +#657 @ 66,98: 21x29 +#658 @ 613,360: 16x16 +#659 @ 668,874: 19x16 +#660 @ 439,369: 11x19 +#661 @ 735,850: 25x21 +#662 @ 307,339: 12x20 +#663 @ 403,183: 19x12 +#664 @ 700,777: 12x16 +#665 @ 580,211: 28x17 +#666 @ 678,893: 15x14 +#667 @ 623,730: 16x11 +#668 @ 464,564: 23x25 +#669 @ 505,429: 11x23 +#670 @ 107,888: 13x28 +#671 @ 61,610: 28x22 +#672 @ 584,240: 27x23 +#673 @ 560,794: 24x23 +#674 @ 746,824: 18x18 +#675 @ 629,244: 14x24 +#676 @ 570,528: 18x23 +#677 @ 828,599: 28x26 +#678 @ 159,38: 13x10 +#679 @ 947,361: 10x19 +#680 @ 431,201: 15x22 +#681 @ 801,449: 27x11 +#682 @ 44,174: 12x22 +#683 @ 797,783: 15x24 +#684 @ 600,972: 22x12 +#685 @ 791,817: 29x15 +#686 @ 293,806: 20x26 +#687 @ 908,734: 19x22 +#688 @ 84,543: 12x11 +#689 @ 508,450: 15x17 +#690 @ 887,472: 21x15 +#691 @ 390,694: 14x12 +#692 @ 882,32: 16x13 +#693 @ 708,66: 19x22 +#694 @ 695,185: 22x20 +#695 @ 790,882: 24x18 +#696 @ 773,465: 20x12 +#697 @ 158,352: 22x23 +#698 @ 681,708: 18x13 +#699 @ 52,963: 11x29 +#700 @ 139,974: 11x21 +#701 @ 696,66: 26x27 +#702 @ 183,514: 11x13 +#703 @ 110,605: 18x20 +#704 @ 394,114: 23x26 +#705 @ 701,926: 19x12 +#706 @ 426,145: 18x24 +#707 @ 228,697: 25x13 +#708 @ 204,560: 15x16 +#709 @ 454,980: 14x20 +#710 @ 434,869: 19x16 +#711 @ 460,421: 21x18 +#712 @ 858,401: 25x22 +#713 @ 916,560: 13x27 +#714 @ 1,678: 28x28 +#715 @ 804,365: 24x21 +#716 @ 65,571: 28x16 +#717 @ 623,727: 16x29 +#718 @ 414,351: 11x15 +#719 @ 569,58: 25x14 +#720 @ 638,681: 13x11 +#721 @ 260,187: 26x20 +#722 @ 797,797: 11x26 +#723 @ 210,706: 25x11 +#724 @ 177,424: 29x23 +#725 @ 301,979: 16x19 +#726 @ 772,317: 19x17 +#727 @ 400,611: 19x26 +#728 @ 139,38: 21x10 +#729 @ 303,326: 27x16 +#730 @ 898,961: 11x17 +#731 @ 517,324: 17x15 +#732 @ 616,433: 12x22 +#733 @ 9,4: 14x25 +#734 @ 467,645: 15x15 +#735 @ 551,892: 10x27 +#736 @ 553,598: 14x16 +#737 @ 280,354: 19x22 +#738 @ 694,391: 24x22 +#739 @ 390,586: 13x12 +#740 @ 658,513: 20x11 +#741 @ 25,606: 15x14 +#742 @ 257,63: 26x21 +#743 @ 921,375: 18x14 +#744 @ 551,547: 16x27 +#745 @ 446,936: 26x11 +#746 @ 56,404: 24x24 +#747 @ 771,348: 22x10 +#748 @ 649,518: 23x26 +#749 @ 680,908: 27x21 +#750 @ 636,669: 13x23 +#751 @ 275,506: 25x17 +#752 @ 763,338: 24x19 +#753 @ 3,3: 28x28 +#754 @ 625,668: 11x22 +#755 @ 597,536: 23x11 +#756 @ 316,902: 16x16 +#757 @ 55,229: 22x21 +#758 @ 84,553: 14x17 +#759 @ 279,736: 12x20 +#760 @ 639,780: 4x6 +#761 @ 873,143: 12x25 +#762 @ 116,757: 18x26 +#763 @ 257,297: 24x27 +#764 @ 138,188: 10x13 +#765 @ 692,187: 10x23 +#766 @ 596,237: 10x12 +#767 @ 246,869: 21x20 +#768 @ 154,110: 25x28 +#769 @ 37,287: 23x26 +#770 @ 779,651: 22x14 +#771 @ 153,296: 21x17 +#772 @ 294,336: 7x19 +#773 @ 803,327: 11x11 +#774 @ 542,895: 14x19 +#775 @ 501,301: 25x19 +#776 @ 703,796: 28x19 +#777 @ 966,184: 15x27 +#778 @ 13,735: 11x28 +#779 @ 652,674: 22x23 +#780 @ 609,608: 20x20 +#781 @ 663,141: 21x23 +#782 @ 708,555: 10x19 +#783 @ 317,813: 25x25 +#784 @ 205,441: 17x12 +#785 @ 689,504: 13x25 +#786 @ 715,927: 10x14 +#787 @ 726,254: 11x13 +#788 @ 525,511: 27x17 +#789 @ 562,123: 10x28 +#790 @ 386,94: 11x18 +#791 @ 409,431: 24x17 +#792 @ 657,574: 22x14 +#793 @ 127,915: 16x22 +#794 @ 127,968: 25x13 +#795 @ 487,64: 22x15 +#796 @ 610,245: 28x16 +#797 @ 514,616: 18x21 +#798 @ 38,945: 19x21 +#799 @ 794,904: 20x14 +#800 @ 474,210: 20x17 +#801 @ 340,36: 16x16 +#802 @ 774,752: 29x11 +#803 @ 785,845: 15x20 +#804 @ 789,582: 10x25 +#805 @ 726,524: 21x20 +#806 @ 4,350: 27x27 +#807 @ 218,749: 15x29 +#808 @ 423,648: 27x10 +#809 @ 69,186: 21x10 +#810 @ 607,871: 16x19 +#811 @ 766,924: 19x21 +#812 @ 59,252: 4x21 +#813 @ 185,707: 23x29 +#814 @ 495,87: 18x18 +#815 @ 16,625: 19x25 +#816 @ 673,119: 17x26 +#817 @ 893,3: 14x24 +#818 @ 14,361: 22x19 +#819 @ 502,585: 18x28 +#820 @ 293,446: 27x18 +#821 @ 25,194: 25x11 +#822 @ 789,169: 14x11 +#823 @ 423,918: 29x18 +#824 @ 956,863: 28x25 +#825 @ 49,327: 11x16 +#826 @ 529,86: 21x18 +#827 @ 902,524: 23x24 +#828 @ 254,220: 16x19 +#829 @ 571,206: 23x21 +#830 @ 66,68: 10x17 +#831 @ 233,367: 23x28 +#832 @ 677,511: 25x17 +#833 @ 895,757: 7x9 +#834 @ 314,905: 21x29 +#835 @ 870,233: 13x12 +#836 @ 599,118: 25x22 +#837 @ 34,119: 10x22 +#838 @ 602,725: 10x23 +#839 @ 481,848: 20x12 +#840 @ 696,106: 18x12 +#841 @ 566,788: 22x26 +#842 @ 845,483: 26x23 +#843 @ 614,950: 11x24 +#844 @ 831,210: 21x28 +#845 @ 133,455: 12x12 +#846 @ 20,40: 29x24 +#847 @ 642,359: 24x22 +#848 @ 689,9: 14x15 +#849 @ 694,766: 10x24 +#850 @ 613,371: 17x20 +#851 @ 399,352: 21x23 +#852 @ 24,372: 16x20 +#853 @ 150,198: 19x26 +#854 @ 539,598: 29x19 +#855 @ 122,582: 25x27 +#856 @ 164,501: 12x21 +#857 @ 158,432: 20x19 +#858 @ 98,163: 11x22 +#859 @ 696,75: 26x24 +#860 @ 413,913: 14x11 +#861 @ 853,487: 27x20 +#862 @ 293,600: 21x26 +#863 @ 927,15: 10x18 +#864 @ 597,699: 10x10 +#865 @ 357,126: 22x13 +#866 @ 758,326: 25x17 +#867 @ 195,31: 17x17 +#868 @ 620,511: 19x20 +#869 @ 62,608: 29x26 +#870 @ 211,91: 13x10 +#871 @ 900,621: 13x18 +#872 @ 184,328: 15x16 +#873 @ 222,662: 28x20 +#874 @ 489,724: 27x24 +#875 @ 585,849: 10x13 +#876 @ 559,601: 25x16 +#877 @ 385,353: 21x15 +#878 @ 881,574: 20x25 +#879 @ 542,716: 27x18 +#880 @ 62,190: 10x12 +#881 @ 832,659: 19x29 +#882 @ 909,741: 27x20 +#883 @ 859,799: 26x17 +#884 @ 301,677: 24x23 +#885 @ 529,424: 19x16 +#886 @ 289,932: 18x28 +#887 @ 705,931: 17x10 +#888 @ 208,179: 23x24 +#889 @ 369,446: 10x16 +#890 @ 410,794: 3x5 +#891 @ 265,567: 19x24 +#892 @ 471,611: 16x20 +#893 @ 821,919: 25x15 +#894 @ 757,822: 24x18 +#895 @ 285,98: 12x10 +#896 @ 737,666: 10x19 +#897 @ 974,242: 16x29 +#898 @ 383,808: 13x25 +#899 @ 266,729: 15x4 +#900 @ 726,811: 10x17 +#901 @ 654,571: 19x27 +#902 @ 691,879: 17x18 +#903 @ 40,946: 28x13 +#904 @ 482,81: 19x11 +#905 @ 806,357: 19x26 +#906 @ 421,788: 22x11 +#907 @ 843,515: 14x21 +#908 @ 488,701: 23x24 +#909 @ 880,723: 11x23 +#910 @ 167,208: 29x26 +#911 @ 334,84: 21x25 +#912 @ 319,20: 13x18 +#913 @ 977,438: 20x16 +#914 @ 15,420: 10x15 +#915 @ 633,221: 13x20 +#916 @ 881,339: 10x17 +#917 @ 54,838: 20x23 +#918 @ 369,414: 16x21 +#919 @ 505,593: 23x29 +#920 @ 354,43: 18x3 +#921 @ 284,165: 29x29 +#922 @ 925,890: 22x21 +#923 @ 615,713: 16x22 +#924 @ 487,768: 22x24 +#925 @ 4,359: 28x22 +#926 @ 923,619: 13x18 +#927 @ 576,461: 10x19 +#928 @ 31,876: 14x13 +#929 @ 588,858: 18x10 +#930 @ 602,724: 14x18 +#931 @ 79,127: 26x29 +#932 @ 335,319: 25x11 +#933 @ 313,461: 17x22 +#934 @ 186,194: 16x23 +#935 @ 278,178: 16x12 +#936 @ 458,739: 14x27 +#937 @ 557,343: 17x24 +#938 @ 187,20: 21x15 +#939 @ 445,926: 12x14 +#940 @ 816,87: 14x10 +#941 @ 857,553: 17x23 +#942 @ 818,233: 16x20 +#943 @ 697,344: 6x8 +#944 @ 967,251: 17x10 +#945 @ 878,550: 21x28 +#946 @ 585,281: 28x19 +#947 @ 393,615: 18x26 +#948 @ 151,616: 11x10 +#949 @ 347,118: 14x24 +#950 @ 203,98: 20x16 +#951 @ 415,772: 28x24 +#952 @ 723,866: 14x20 +#953 @ 787,311: 10x20 +#954 @ 575,732: 18x17 +#955 @ 288,415: 11x17 +#956 @ 403,792: 20x12 +#957 @ 307,683: 28x21 +#958 @ 955,350: 18x15 +#959 @ 873,212: 15x22 +#960 @ 963,135: 28x19 +#961 @ 184,631: 14x15 +#962 @ 46,796: 19x23 +#963 @ 19,25: 19x18 +#964 @ 241,546: 13x26 +#965 @ 43,114: 19x20 +#966 @ 7,564: 22x12 +#967 @ 598,743: 10x17 +#968 @ 83,561: 15x16 +#969 @ 873,909: 5x10 +#970 @ 808,344: 21x10 +#971 @ 73,533: 16x24 +#972 @ 188,18: 15x17 +#973 @ 568,765: 19x12 +#974 @ 835,851: 20x13 +#975 @ 603,971: 17x18 +#976 @ 964,172: 20x15 +#977 @ 179,783: 5x7 +#978 @ 610,602: 18x16 +#979 @ 935,753: 17x24 +#980 @ 200,6: 26x14 +#981 @ 330,693: 23x26 +#982 @ 352,40: 23x10 +#983 @ 855,503: 18x14 +#984 @ 954,295: 16x13 +#985 @ 661,63: 19x19 +#986 @ 843,774: 18x28 +#987 @ 897,98: 13x23 +#988 @ 433,733: 25x23 +#989 @ 893,669: 10x12 +#990 @ 733,168: 14x26 +#991 @ 575,721: 13x15 +#992 @ 728,528: 14x16 +#993 @ 438,924: 11x25 +#994 @ 928,846: 17x21 +#995 @ 583,296: 15x23 +#996 @ 854,967: 18x15 +#997 @ 61,830: 25x23 +#998 @ 708,384: 11x14 +#999 @ 10,102: 15x17 +#1000 @ 712,951: 22x22 +#1001 @ 907,716: 13x21 +#1002 @ 237,219: 26x28 +#1003 @ 536,480: 25x21 +#1004 @ 418,165: 19x29 +#1005 @ 520,802: 17x22 +#1006 @ 416,652: 24x20 +#1007 @ 909,751: 13x16 +#1008 @ 878,281: 18x29 +#1009 @ 349,171: 19x17 +#1010 @ 971,157: 28x17 +#1011 @ 714,632: 15x19 +#1012 @ 756,786: 27x17 +#1013 @ 441,417: 17x14 +#1014 @ 10,36: 13x26 +#1015 @ 903,460: 14x22 +#1016 @ 614,215: 16x26 +#1017 @ 17,664: 20x14 +#1018 @ 127,199: 20x17 +#1019 @ 693,182: 27x13 +#1020 @ 296,714: 25x19 +#1021 @ 544,881: 13x29 +#1022 @ 405,502: 12x22 +#1023 @ 557,492: 10x25 +#1024 @ 246,83: 22x22 +#1025 @ 109,738: 27x26 +#1026 @ 458,503: 14x14 +#1027 @ 69,945: 25x19 +#1028 @ 967,854: 10x10 +#1029 @ 270,848: 16x24 +#1030 @ 430,952: 13x23 +#1031 @ 352,96: 17x22 +#1032 @ 315,68: 26x11 +#1033 @ 238,533: 25x24 +#1034 @ 449,690: 28x25 +#1035 @ 703,719: 21x13 +#1036 @ 836,383: 14x11 +#1037 @ 834,363: 22x21 +#1038 @ 367,398: 28x18 +#1039 @ 714,32: 26x19 +#1040 @ 80,836: 17x16 +#1041 @ 177,781: 11x12 +#1042 @ 842,700: 28x10 +#1043 @ 591,958: 28x16 +#1044 @ 190,972: 5x18 +#1045 @ 187,970: 15x24 +#1046 @ 674,225: 21x28 +#1047 @ 944,321: 23x23 +#1048 @ 671,633: 12x25 +#1049 @ 662,579: 14x25 +#1050 @ 597,597: 25x10 +#1051 @ 642,164: 23x17 +#1052 @ 646,558: 15x14 +#1053 @ 384,598: 17x28 +#1054 @ 627,435: 16x14 +#1055 @ 839,779: 11x16 +#1056 @ 901,634: 20x28 +#1057 @ 838,212: 23x14 +#1058 @ 228,598: 14x18 +#1059 @ 730,507: 11x25 +#1060 @ 306,200: 21x22 +#1061 @ 439,156: 29x12 +#1062 @ 941,101: 20x19 +#1063 @ 412,226: 19x20 +#1064 @ 90,901: 22x22 +#1065 @ 70,172: 16x15 +#1066 @ 857,777: 19x28 +#1067 @ 826,893: 16x12 +#1068 @ 88,494: 24x18 +#1069 @ 620,803: 12x13 +#1070 @ 182,458: 29x14 +#1071 @ 349,72: 24x13 +#1072 @ 681,880: 17x22 +#1073 @ 545,550: 26x26 +#1074 @ 509,694: 14x14 +#1075 @ 203,27: 14x28 +#1076 @ 881,547: 12x26 +#1077 @ 877,983: 13x10 +#1078 @ 94,184: 10x29 +#1079 @ 846,390: 23x23 +#1080 @ 947,325: 18x21 +#1081 @ 52,775: 29x22 +#1082 @ 222,594: 15x29 +#1083 @ 549,80: 12x17 +#1084 @ 534,867: 17x17 +#1085 @ 907,46: 11x29 +#1086 @ 442,256: 11x11 +#1087 @ 933,601: 13x19 +#1088 @ 717,636: 18x25 +#1089 @ 504,56: 17x22 +#1090 @ 301,933: 17x14 +#1091 @ 518,813: 13x25 +#1092 @ 717,425: 12x25 +#1093 @ 860,978: 19x21 +#1094 @ 850,479: 12x20 +#1095 @ 522,771: 12x13 +#1096 @ 593,16: 12x10 +#1097 @ 116,297: 21x18 +#1098 @ 363,461: 22x13 +#1099 @ 735,343: 23x10 +#1100 @ 956,194: 16x20 +#1101 @ 146,178: 26x26 +#1102 @ 628,730: 11x29 +#1103 @ 131,308: 25x14 +#1104 @ 8,633: 21x29 +#1105 @ 301,188: 13x19 +#1106 @ 373,813: 23x18 +#1107 @ 122,721: 12x10 +#1108 @ 841,692: 27x11 +#1109 @ 642,155: 17x10 +#1110 @ 897,863: 17x18 +#1111 @ 849,197: 27x15 +#1112 @ 311,553: 11x28 +#1113 @ 460,814: 16x16 +#1114 @ 813,889: 15x18 +#1115 @ 422,209: 23x18 +#1116 @ 775,143: 11x24 +#1117 @ 289,400: 16x27 +#1118 @ 322,381: 21x11 +#1119 @ 932,308: 17x13 +#1120 @ 178,729: 21x21 +#1121 @ 384,802: 16x19 +#1122 @ 703,651: 11x24 +#1123 @ 664,77: 11x13 +#1124 @ 759,825: 10x12 +#1125 @ 205,185: 28x11 +#1126 @ 152,675: 5x10 +#1127 @ 233,810: 11x17 +#1128 @ 25,245: 27x17 +#1129 @ 329,6: 25x16 +#1130 @ 82,241: 23x20 +#1131 @ 743,123: 26x16 +#1132 @ 191,160: 25x28 +#1133 @ 603,729: 21x16 +#1134 @ 16,742: 3x10 +#1135 @ 582,759: 14x29 +#1136 @ 424,262: 29x22 +#1137 @ 157,607: 25x17 +#1138 @ 822,460: 29x25 +#1139 @ 949,514: 26x11 +#1140 @ 683,393: 17x27 +#1141 @ 268,849: 27x16 +#1142 @ 823,899: 21x15 +#1143 @ 703,22: 17x16 +#1144 @ 723,382: 24x25 +#1145 @ 545,758: 21x14 +#1146 @ 449,978: 25x19 +#1147 @ 386,730: 14x26 +#1148 @ 335,359: 27x11 +#1149 @ 630,3: 28x25 +#1150 @ 55,277: 23x25 +#1151 @ 56,897: 27x19 +#1152 @ 418,909: 27x12 +#1153 @ 194,828: 25x26 +#1154 @ 135,829: 12x21 +#1155 @ 186,14: 22x16 +#1156 @ 314,538: 13x22 +#1157 @ 145,163: 23x29 +#1158 @ 901,654: 18x27 +#1159 @ 180,680: 17x17 +#1160 @ 848,858: 29x27 +#1161 @ 163,295: 22x12 +#1162 @ 929,609: 20x26 +#1163 @ 658,185: 27x12 +#1164 @ 885,964: 28x17 +#1165 @ 964,339: 18x29 +#1166 @ 405,448: 23x26 +#1167 @ 144,846: 13x11 +#1168 @ 881,548: 12x15 +#1169 @ 457,705: 11x25 +#1170 @ 150,122: 22x15 +#1171 @ 86,586: 25x20 +#1172 @ 276,102: 12x11 +#1173 @ 320,904: 7x10 +#1174 @ 577,806: 22x16 +#1175 @ 805,335: 21x12 +#1176 @ 852,806: 6x10 +#1177 @ 431,904: 14x29 +#1178 @ 503,68: 24x16 +#1179 @ 742,432: 11x28 +#1180 @ 493,661: 18x27 +#1181 @ 443,561: 10x20 +#1182 @ 161,672: 26x26 +#1183 @ 50,533: 28x22 +#1184 @ 790,331: 25x20 +#1185 @ 461,496: 10x16 +#1186 @ 42,337: 11x14 +#1187 @ 249,364: 20x13 +#1188 @ 915,734: 21x23 +#1189 @ 69,143: 18x15 +#1190 @ 626,206: 22x14 +#1191 @ 299,928: 29x19 +#1192 @ 406,209: 15x24 +#1193 @ 220,90: 20x19 +#1194 @ 308,373: 19x19 +#1195 @ 497,835: 19x18 +#1196 @ 442,327: 26x12 +#1197 @ 123,920: 14x25 +#1198 @ 945,654: 16x15 +#1199 @ 78,587: 11x17 +#1200 @ 176,713: 19x17 +#1201 @ 348,848: 13x20 +#1202 @ 855,707: 21x20 +#1203 @ 765,118: 16x15 +#1204 @ 84,542: 15x20 +#1205 @ 249,755: 12x19 +#1206 @ 891,40: 21x25 +#1207 @ 689,386: 28x14 +#1208 @ 270,937: 12x25 +#1209 @ 263,841: 24x24 +#1210 @ 604,244: 22x12 +#1211 @ 251,552: 19x17 +#1212 @ 930,381: 29x13 +#1213 @ 414,523: 10x19 +#1214 @ 450,813: 17x19 +#1215 @ 709,102: 19x19 +#1216 @ 108,601: 25x29 +#1217 @ 420,780: 11x11 +#1218 @ 376,801: 25x29 +#1219 @ 44,950: 23x15 +#1220 @ 118,456: 25x17 +#1221 @ 447,42: 25x19 +#1222 @ 333,29: 19x13 +#1223 @ 598,552: 16x15 +#1224 @ 390,355: 11x9 +#1225 @ 362,293: 13x10 +#1226 @ 251,876: 23x10 +#1227 @ 559,811: 18x16 +#1228 @ 844,735: 22x26 +#1229 @ 973,204: 12x10 +#1230 @ 370,73: 16x13 +#1231 @ 124,241: 15x24 +#1232 @ 150,324: 3x5 +#1233 @ 942,359: 13x10 +#1234 @ 111,355: 17x24 +#1235 @ 157,275: 19x17 +#1236 @ 192,440: 14x24 +#1237 @ 265,191: 28x16 +#1238 @ 607,426: 23x28 +#1239 @ 782,718: 13x24 +#1240 @ 90,138: 24x18 +#1241 @ 861,670: 24x22 +#1242 @ 429,446: 15x15 +#1243 @ 620,971: 17x21 +#1244 @ 778,811: 22x17 +#1245 @ 175,164: 13x18 +#1246 @ 448,141: 20x13 +#1247 @ 578,848: 13x24 +#1248 @ 61,392: 25x19 +#1249 @ 217,811: 28x28 +#1250 @ 548,186: 11x7 +#1251 @ 725,652: 16x27 +#1252 @ 448,719: 24x28 +#1253 @ 124,254: 29x10 +#1254 @ 334,224: 21x19 +#1255 @ 466,506: 22x15 +#1256 @ 266,598: 12x21 +#1257 @ 744,42: 28x25 +#1258 @ 700,645: 23x13 +#1259 @ 716,31: 17x29 +#1260 @ 974,418: 14x24 +#1261 @ 476,333: 24x19 +#1262 @ 158,148: 29x26 +#1263 @ 685,497: 29x19 +#1264 @ 876,672: 22x12 +#1265 @ 963,100: 27x19 +#1266 @ 725,583: 26x11 +#1267 @ 266,954: 13x11 +#1268 @ 140,620: 27x15 +#1269 @ 465,317: 18x20 +#1270 @ 942,85: 16x22 +#1271 @ 774,594: 18x10 +#1272 @ 115,370: 10x26 +#1273 @ 680,178: 24x11 +#1274 @ 589,387: 29x13 +#1275 @ 545,585: 26x26 +#1276 @ 416,310: 10x28 +#1277 @ 226,100: 10x25 +#1278 @ 444,500: 20x13 +#1279 @ 390,461: 10x26 +#1280 @ 941,891: 22x14 +#1281 @ 978,278: 11x26 +#1282 @ 183,317: 15x13 +#1283 @ 930,361: 13x24 +#1284 @ 134,204: 12x17 +#1285 @ 710,389: 6x5 +#1286 @ 197,501: 22x13 +#1287 @ 284,773: 28x24 +#1288 @ 130,449: 22x26 +#1289 @ 310,489: 14x27 +#1290 @ 528,540: 20x11 +#1291 @ 958,541: 25x11 +#1292 @ 705,734: 8x13 +#1293 @ 344,745: 26x23 +#1294 @ 556,603: 20x25 +#1295 @ 335,781: 23x19 +#1296 @ 887,584: 26x12 +#1297 @ 760,386: 10x19 +#1298 @ 486,627: 22x23 +#1299 @ 180,820: 22x15 +#1300 @ 141,206: 11x15 +#1301 @ 833,914: 16x25 +#1302 @ 536,596: 17x21 +#1303 @ 18,870: 25x16 +#1304 @ 550,445: 13x24 +#1305 @ 163,257: 22x24 +#1306 @ 932,665: 19x11 +#1307 @ 42,472: 13x14 diff --git a/src/main/resources/2018/day4.txt b/src/main/resources/2018/day4.txt new file mode 100644 index 00000000..e708e748 --- /dev/null +++ b/src/main/resources/2018/day4.txt @@ -0,0 +1,1267 @@ +[1518-09-14 00:54] wakes up +[1518-04-15 23:58] Guard #373 begins shift +[1518-07-25 00:53] wakes up +[1518-07-04 00:45] wakes up +[1518-07-26 00:51] wakes up +[1518-06-21 00:43] falls asleep +[1518-04-24 00:57] falls asleep +[1518-11-20 00:52] wakes up +[1518-04-20 00:39] falls asleep +[1518-05-31 00:48] wakes up +[1518-09-03 00:16] falls asleep +[1518-03-26 23:50] Guard #173 begins shift +[1518-03-14 00:34] falls asleep +[1518-04-09 00:20] wakes up +[1518-09-05 00:40] falls asleep +[1518-06-12 23:59] Guard #2339 begins shift +[1518-05-09 23:46] Guard #373 begins shift +[1518-08-08 00:59] wakes up +[1518-06-06 00:08] falls asleep +[1518-09-10 00:58] wakes up +[1518-10-08 00:02] Guard #751 begins shift +[1518-04-23 00:49] wakes up +[1518-10-13 23:59] Guard #2339 begins shift +[1518-10-14 00:28] falls asleep +[1518-06-27 00:21] falls asleep +[1518-04-11 00:49] wakes up +[1518-02-06 00:46] falls asleep +[1518-08-16 00:14] wakes up +[1518-11-19 00:34] falls asleep +[1518-03-05 00:12] falls asleep +[1518-05-24 23:57] Guard #523 begins shift +[1518-06-22 00:42] wakes up +[1518-02-14 23:57] Guard #3229 begins shift +[1518-09-10 00:48] falls asleep +[1518-10-24 00:09] falls asleep +[1518-04-23 00:45] falls asleep +[1518-07-05 00:30] falls asleep +[1518-05-10 00:54] wakes up +[1518-10-24 00:57] wakes up +[1518-02-09 00:04] Guard #173 begins shift +[1518-05-29 00:51] falls asleep +[1518-02-14 00:41] falls asleep +[1518-04-08 00:40] wakes up +[1518-09-06 00:33] wakes up +[1518-02-07 23:57] Guard #2339 begins shift +[1518-05-20 00:42] falls asleep +[1518-10-03 00:01] falls asleep +[1518-10-28 00:03] Guard #1031 begins shift +[1518-02-18 00:37] wakes up +[1518-01-16 00:55] wakes up +[1518-08-03 00:04] Guard #373 begins shift +[1518-08-28 23:48] Guard #2857 begins shift +[1518-03-12 00:00] Guard #431 begins shift +[1518-05-20 00:32] wakes up +[1518-05-24 00:42] falls asleep +[1518-01-29 00:54] wakes up +[1518-07-20 00:24] wakes up +[1518-06-20 00:04] Guard #173 begins shift +[1518-08-05 00:51] wakes up +[1518-10-29 00:34] falls asleep +[1518-10-13 00:12] falls asleep +[1518-01-24 00:58] wakes up +[1518-02-21 23:49] Guard #419 begins shift +[1518-10-22 00:49] wakes up +[1518-06-15 23:52] Guard #1627 begins shift +[1518-06-11 00:57] wakes up +[1518-02-28 00:25] wakes up +[1518-03-01 00:36] wakes up +[1518-08-02 00:10] falls asleep +[1518-10-14 00:54] wakes up +[1518-08-29 23:59] Guard #3229 begins shift +[1518-11-15 00:19] wakes up +[1518-09-24 00:30] wakes up +[1518-11-01 23:59] Guard #1031 begins shift +[1518-06-18 00:13] falls asleep +[1518-06-25 00:59] wakes up +[1518-04-09 00:01] falls asleep +[1518-05-22 00:02] Guard #2857 begins shift +[1518-05-13 00:57] wakes up +[1518-06-15 00:41] falls asleep +[1518-02-25 00:53] wakes up +[1518-10-26 00:32] wakes up +[1518-06-08 00:12] falls asleep +[1518-03-06 00:34] wakes up +[1518-04-04 00:38] falls asleep +[1518-05-29 00:09] falls asleep +[1518-10-02 23:48] Guard #431 begins shift +[1518-04-10 00:49] falls asleep +[1518-05-06 00:16] falls asleep +[1518-10-10 00:00] falls asleep +[1518-01-20 00:57] wakes up +[1518-08-10 00:03] Guard #419 begins shift +[1518-02-05 00:58] wakes up +[1518-04-30 00:44] wakes up +[1518-08-10 00:11] falls asleep +[1518-05-16 00:00] Guard #863 begins shift +[1518-11-23 00:42] wakes up +[1518-09-11 00:34] falls asleep +[1518-07-22 00:03] Guard #2857 begins shift +[1518-04-15 00:36] wakes up +[1518-06-09 23:57] Guard #3209 begins shift +[1518-07-02 00:39] wakes up +[1518-01-15 00:50] wakes up +[1518-11-08 00:51] wakes up +[1518-04-16 00:44] wakes up +[1518-05-19 23:56] Guard #431 begins shift +[1518-10-01 00:10] falls asleep +[1518-03-22 00:02] Guard #751 begins shift +[1518-07-12 00:58] wakes up +[1518-11-11 00:12] falls asleep +[1518-10-02 00:48] wakes up +[1518-04-05 00:24] wakes up +[1518-02-10 00:35] wakes up +[1518-07-24 00:53] wakes up +[1518-05-18 00:57] wakes up +[1518-01-20 00:21] falls asleep +[1518-06-29 00:43] wakes up +[1518-03-15 00:40] falls asleep +[1518-07-08 00:32] wakes up +[1518-05-30 00:43] wakes up +[1518-02-02 00:25] falls asleep +[1518-02-05 00:25] falls asleep +[1518-05-11 00:31] falls asleep +[1518-02-22 00:59] wakes up +[1518-08-16 00:31] falls asleep +[1518-02-10 00:58] wakes up +[1518-07-11 00:56] wakes up +[1518-09-01 00:55] falls asleep +[1518-09-16 00:36] falls asleep +[1518-10-04 00:17] falls asleep +[1518-04-06 23:57] Guard #2857 begins shift +[1518-11-19 00:01] falls asleep +[1518-11-16 00:32] wakes up +[1518-10-08 00:30] falls asleep +[1518-02-10 00:06] falls asleep +[1518-07-08 00:36] falls asleep +[1518-04-19 00:00] Guard #3229 begins shift +[1518-08-19 00:52] wakes up +[1518-07-21 00:57] wakes up +[1518-05-12 00:00] Guard #3187 begins shift +[1518-05-23 00:47] wakes up +[1518-11-02 00:46] wakes up +[1518-11-04 00:24] falls asleep +[1518-10-20 00:21] falls asleep +[1518-05-19 00:54] wakes up +[1518-07-07 00:00] Guard #1637 begins shift +[1518-10-08 00:56] wakes up +[1518-08-12 00:52] wakes up +[1518-08-03 00:28] falls asleep +[1518-04-01 00:03] Guard #1627 begins shift +[1518-08-26 00:30] falls asleep +[1518-04-26 00:43] wakes up +[1518-05-27 00:51] falls asleep +[1518-04-10 23:56] Guard #2143 begins shift +[1518-02-15 00:14] falls asleep +[1518-06-02 00:52] wakes up +[1518-05-28 00:29] falls asleep +[1518-10-12 00:00] Guard #2143 begins shift +[1518-11-21 23:58] Guard #2339 begins shift +[1518-10-25 00:32] falls asleep +[1518-09-05 00:00] Guard #3229 begins shift +[1518-10-08 00:47] falls asleep +[1518-03-09 00:40] falls asleep +[1518-04-26 00:35] wakes up +[1518-05-17 00:02] Guard #173 begins shift +[1518-08-13 23:59] Guard #431 begins shift +[1518-10-23 00:38] falls asleep +[1518-03-20 00:49] falls asleep +[1518-06-17 00:38] falls asleep +[1518-03-31 00:57] wakes up +[1518-04-01 00:57] wakes up +[1518-08-31 00:45] falls asleep +[1518-04-04 00:15] wakes up +[1518-04-18 00:48] falls asleep +[1518-03-10 00:13] falls asleep +[1518-04-26 00:41] falls asleep +[1518-10-04 00:02] Guard #521 begins shift +[1518-09-16 00:00] Guard #863 begins shift +[1518-07-03 00:58] wakes up +[1518-05-22 00:49] wakes up +[1518-04-15 00:49] falls asleep +[1518-05-08 00:23] falls asleep +[1518-10-15 23:59] Guard #863 begins shift +[1518-07-18 00:20] wakes up +[1518-05-23 00:27] falls asleep +[1518-06-03 00:38] falls asleep +[1518-11-15 00:06] falls asleep +[1518-03-12 00:50] wakes up +[1518-11-23 00:56] wakes up +[1518-03-02 00:29] falls asleep +[1518-03-07 00:33] falls asleep +[1518-02-28 00:46] wakes up +[1518-06-16 00:37] falls asleep +[1518-07-28 23:58] Guard #1597 begins shift +[1518-05-21 00:52] wakes up +[1518-09-30 00:55] wakes up +[1518-04-16 00:57] wakes up +[1518-08-02 00:22] wakes up +[1518-06-28 00:00] falls asleep +[1518-05-08 00:11] wakes up +[1518-04-02 00:02] falls asleep +[1518-01-17 23:51] Guard #3187 begins shift +[1518-03-01 00:59] wakes up +[1518-01-26 00:51] falls asleep +[1518-09-27 00:23] falls asleep +[1518-09-09 00:31] falls asleep +[1518-02-02 00:56] wakes up +[1518-03-09 00:55] falls asleep +[1518-02-13 00:02] Guard #2143 begins shift +[1518-08-09 00:43] wakes up +[1518-04-29 00:29] falls asleep +[1518-09-25 00:14] falls asleep +[1518-02-08 00:29] falls asleep +[1518-04-19 00:40] wakes up +[1518-10-25 00:59] wakes up +[1518-06-26 00:13] falls asleep +[1518-08-14 23:59] Guard #521 begins shift +[1518-03-04 00:54] falls asleep +[1518-10-17 00:52] wakes up +[1518-08-23 00:30] wakes up +[1518-08-13 00:07] falls asleep +[1518-02-05 23:56] Guard #1627 begins shift +[1518-06-19 00:02] Guard #173 begins shift +[1518-07-05 00:48] wakes up +[1518-10-26 00:47] wakes up +[1518-04-20 00:55] wakes up +[1518-10-25 00:50] wakes up +[1518-07-02 00:12] falls asleep +[1518-02-14 00:02] Guard #2539 begins shift +[1518-02-21 00:34] wakes up +[1518-10-14 23:59] Guard #3209 begins shift +[1518-03-27 00:27] falls asleep +[1518-08-17 00:13] falls asleep +[1518-07-31 00:00] falls asleep +[1518-05-30 00:35] falls asleep +[1518-10-04 00:55] wakes up +[1518-07-18 00:56] wakes up +[1518-07-19 23:50] Guard #3209 begins shift +[1518-03-16 00:39] wakes up +[1518-07-18 00:49] falls asleep +[1518-09-20 00:16] falls asleep +[1518-03-19 00:50] wakes up +[1518-10-29 00:03] Guard #419 begins shift +[1518-08-09 00:06] falls asleep +[1518-04-24 00:58] wakes up +[1518-06-01 00:24] wakes up +[1518-04-05 00:19] falls asleep +[1518-02-17 00:53] wakes up +[1518-11-17 23:57] Guard #1597 begins shift +[1518-03-07 00:50] wakes up +[1518-06-26 00:00] Guard #3187 begins shift +[1518-10-16 00:51] falls asleep +[1518-07-09 00:55] wakes up +[1518-09-05 00:36] wakes up +[1518-09-21 23:57] Guard #173 begins shift +[1518-06-30 23:48] Guard #2143 begins shift +[1518-03-24 00:15] wakes up +[1518-04-17 23:59] Guard #2339 begins shift +[1518-09-11 00:04] Guard #2143 begins shift +[1518-04-08 23:50] Guard #173 begins shift +[1518-01-23 00:07] falls asleep +[1518-04-01 00:48] wakes up +[1518-08-11 00:44] wakes up +[1518-01-26 00:20] falls asleep +[1518-07-13 00:02] falls asleep +[1518-04-14 00:02] falls asleep +[1518-11-12 00:44] wakes up +[1518-06-06 00:35] falls asleep +[1518-03-28 00:00] Guard #419 begins shift +[1518-09-29 23:56] Guard #1597 begins shift +[1518-09-09 00:25] wakes up +[1518-07-11 00:01] Guard #2339 begins shift +[1518-09-10 00:43] wakes up +[1518-08-07 00:28] falls asleep +[1518-10-23 00:35] wakes up +[1518-10-31 00:04] Guard #3187 begins shift +[1518-08-18 00:44] falls asleep +[1518-03-25 00:48] falls asleep +[1518-08-03 00:47] wakes up +[1518-06-20 00:34] falls asleep +[1518-03-13 00:01] falls asleep +[1518-06-10 00:27] wakes up +[1518-05-26 00:31] falls asleep +[1518-11-10 00:58] wakes up +[1518-07-01 00:58] wakes up +[1518-08-11 00:57] wakes up +[1518-10-16 00:46] falls asleep +[1518-03-14 00:36] wakes up +[1518-09-27 23:56] Guard #3187 begins shift +[1518-06-30 00:46] falls asleep +[1518-03-10 00:02] Guard #863 begins shift +[1518-04-04 00:03] Guard #523 begins shift +[1518-09-14 00:01] Guard #3229 begins shift +[1518-02-08 00:17] falls asleep +[1518-03-23 00:39] falls asleep +[1518-09-28 00:19] falls asleep +[1518-10-04 23:56] Guard #521 begins shift +[1518-02-16 00:57] wakes up +[1518-04-27 23:59] Guard #373 begins shift +[1518-02-19 00:31] falls asleep +[1518-11-23 00:10] falls asleep +[1518-04-08 00:04] Guard #2339 begins shift +[1518-06-01 00:02] Guard #1031 begins shift +[1518-09-19 00:23] falls asleep +[1518-07-14 00:30] wakes up +[1518-11-01 00:45] wakes up +[1518-03-26 00:27] falls asleep +[1518-04-23 00:02] Guard #521 begins shift +[1518-04-28 00:26] falls asleep +[1518-03-07 00:27] wakes up +[1518-09-23 00:57] wakes up +[1518-04-01 00:12] falls asleep +[1518-11-11 00:01] Guard #3209 begins shift +[1518-08-08 00:09] falls asleep +[1518-11-09 00:04] Guard #523 begins shift +[1518-11-19 00:58] wakes up +[1518-03-16 00:03] falls asleep +[1518-04-22 00:04] falls asleep +[1518-10-11 00:00] Guard #2143 begins shift +[1518-09-27 00:52] wakes up +[1518-05-07 00:00] falls asleep +[1518-02-11 00:53] wakes up +[1518-09-24 00:57] wakes up +[1518-08-24 00:52] wakes up +[1518-09-04 00:18] falls asleep +[1518-07-14 00:28] falls asleep +[1518-09-15 00:25] falls asleep +[1518-11-23 00:01] Guard #2857 begins shift +[1518-08-08 00:46] falls asleep +[1518-08-04 00:58] wakes up +[1518-02-22 00:01] falls asleep +[1518-03-25 00:36] wakes up +[1518-03-02 00:55] wakes up +[1518-09-23 23:46] Guard #2143 begins shift +[1518-08-28 00:35] falls asleep +[1518-04-15 00:06] falls asleep +[1518-07-24 00:32] wakes up +[1518-07-12 00:57] falls asleep +[1518-11-04 00:00] Guard #3229 begins shift +[1518-02-08 00:23] wakes up +[1518-04-12 00:46] wakes up +[1518-09-04 00:54] wakes up +[1518-02-21 00:11] falls asleep +[1518-10-30 00:02] Guard #2339 begins shift +[1518-07-04 00:35] falls asleep +[1518-04-15 00:00] Guard #1597 begins shift +[1518-08-18 00:23] falls asleep +[1518-07-29 00:51] wakes up +[1518-06-06 00:21] wakes up +[1518-06-17 00:41] wakes up +[1518-04-19 00:28] falls asleep +[1518-02-10 00:47] wakes up +[1518-08-28 00:32] wakes up +[1518-03-15 00:27] falls asleep +[1518-05-11 00:00] Guard #1031 begins shift +[1518-08-04 00:11] falls asleep +[1518-05-03 00:02] Guard #3209 begins shift +[1518-07-20 00:39] falls asleep +[1518-05-09 00:52] wakes up +[1518-06-29 00:23] wakes up +[1518-05-26 23:47] Guard #863 begins shift +[1518-07-28 00:58] wakes up +[1518-11-10 00:24] wakes up +[1518-06-24 23:57] Guard #863 begins shift +[1518-03-23 00:04] falls asleep +[1518-03-06 00:49] falls asleep +[1518-10-14 00:49] wakes up +[1518-07-04 00:36] wakes up +[1518-02-05 00:33] falls asleep +[1518-01-22 00:01] Guard #2339 begins shift +[1518-11-14 00:48] wakes up +[1518-05-17 00:57] wakes up +[1518-08-23 00:18] falls asleep +[1518-11-12 00:14] falls asleep +[1518-03-18 00:44] wakes up +[1518-04-14 00:17] wakes up +[1518-06-04 00:58] wakes up +[1518-11-07 00:55] wakes up +[1518-05-19 00:23] falls asleep +[1518-02-13 00:47] falls asleep +[1518-09-18 23:59] Guard #419 begins shift +[1518-09-25 23:56] Guard #419 begins shift +[1518-07-19 00:18] falls asleep +[1518-03-24 23:48] Guard #1597 begins shift +[1518-08-21 00:18] falls asleep +[1518-07-27 00:44] wakes up +[1518-11-04 00:36] wakes up +[1518-01-13 23:56] Guard #751 begins shift +[1518-01-18 00:32] wakes up +[1518-09-17 23:57] Guard #521 begins shift +[1518-11-03 00:47] wakes up +[1518-10-09 00:58] wakes up +[1518-07-15 00:01] Guard #419 begins shift +[1518-09-17 00:10] falls asleep +[1518-06-24 00:20] falls asleep +[1518-03-23 00:36] wakes up +[1518-01-30 00:55] wakes up +[1518-01-26 00:45] wakes up +[1518-02-03 00:33] wakes up +[1518-02-02 23:47] Guard #3229 begins shift +[1518-11-05 23:56] Guard #523 begins shift +[1518-06-26 00:22] wakes up +[1518-01-28 00:56] wakes up +[1518-05-27 00:05] falls asleep +[1518-11-16 00:14] falls asleep +[1518-08-24 00:22] wakes up +[1518-07-16 00:57] wakes up +[1518-04-10 00:54] wakes up +[1518-03-13 00:43] wakes up +[1518-09-08 00:00] Guard #173 begins shift +[1518-09-26 00:45] wakes up +[1518-07-27 00:18] falls asleep +[1518-07-22 00:59] wakes up +[1518-06-11 00:04] Guard #2339 begins shift +[1518-07-05 00:01] Guard #173 begins shift +[1518-03-12 00:33] wakes up +[1518-04-03 00:20] falls asleep +[1518-11-05 00:42] falls asleep +[1518-11-22 00:22] falls asleep +[1518-06-26 00:41] wakes up +[1518-07-01 00:34] wakes up +[1518-08-08 23:57] Guard #3209 begins shift +[1518-10-07 00:22] wakes up +[1518-04-17 00:43] falls asleep +[1518-08-02 00:36] falls asleep +[1518-06-05 00:46] falls asleep +[1518-03-06 00:52] wakes up +[1518-02-10 00:53] falls asleep +[1518-05-10 00:05] falls asleep +[1518-02-18 00:47] falls asleep +[1518-05-31 00:00] Guard #3187 begins shift +[1518-07-23 00:54] wakes up +[1518-08-27 00:53] wakes up +[1518-10-10 00:34] wakes up +[1518-10-09 00:02] Guard #863 begins shift +[1518-11-15 23:59] Guard #3209 begins shift +[1518-08-25 00:39] falls asleep +[1518-01-21 00:56] wakes up +[1518-06-07 23:57] Guard #3209 begins shift +[1518-08-09 00:46] falls asleep +[1518-06-06 00:01] Guard #1637 begins shift +[1518-05-18 00:26] falls asleep +[1518-06-02 23:53] Guard #431 begins shift +[1518-09-30 00:15] falls asleep +[1518-07-02 00:03] Guard #2857 begins shift +[1518-02-24 00:07] falls asleep +[1518-08-19 00:01] Guard #1637 begins shift +[1518-01-15 00:27] falls asleep +[1518-05-16 00:51] falls asleep +[1518-07-09 00:54] falls asleep +[1518-07-03 00:35] wakes up +[1518-10-20 00:31] wakes up +[1518-09-04 00:27] wakes up +[1518-10-05 23:58] Guard #1597 begins shift +[1518-02-12 00:59] wakes up +[1518-06-22 00:01] Guard #3209 begins shift +[1518-01-31 00:34] falls asleep +[1518-05-19 00:32] wakes up +[1518-01-27 00:44] wakes up +[1518-05-23 00:08] wakes up +[1518-02-27 00:18] wakes up +[1518-06-03 23:56] Guard #373 begins shift +[1518-03-22 00:11] falls asleep +[1518-04-30 00:31] falls asleep +[1518-09-09 23:59] Guard #1597 begins shift +[1518-05-26 00:01] Guard #431 begins shift +[1518-01-30 23:59] Guard #2143 begins shift +[1518-02-27 23:56] Guard #751 begins shift +[1518-07-03 00:01] Guard #373 begins shift +[1518-04-05 00:46] falls asleep +[1518-10-27 00:02] Guard #991 begins shift +[1518-10-17 00:01] Guard #3229 begins shift +[1518-08-27 00:47] falls asleep +[1518-10-12 00:43] falls asleep +[1518-09-20 00:53] wakes up +[1518-11-22 00:37] wakes up +[1518-04-04 00:08] falls asleep +[1518-09-07 00:49] wakes up +[1518-06-08 00:27] wakes up +[1518-06-30 00:03] Guard #523 begins shift +[1518-04-21 00:46] falls asleep +[1518-05-12 00:15] wakes up +[1518-07-26 00:18] falls asleep +[1518-10-15 00:15] falls asleep +[1518-02-14 00:48] wakes up +[1518-03-04 00:57] wakes up +[1518-06-21 00:54] wakes up +[1518-08-23 23:56] Guard #523 begins shift +[1518-07-26 00:00] Guard #1627 begins shift +[1518-05-24 00:44] wakes up +[1518-04-05 00:01] Guard #2539 begins shift +[1518-02-06 00:52] falls asleep +[1518-04-07 00:55] falls asleep +[1518-08-18 00:53] wakes up +[1518-09-22 00:34] falls asleep +[1518-04-25 00:01] Guard #2339 begins shift +[1518-11-21 00:54] wakes up +[1518-01-23 00:00] Guard #1627 begins shift +[1518-11-13 23:58] Guard #173 begins shift +[1518-10-11 00:41] wakes up +[1518-09-02 00:46] falls asleep +[1518-05-07 00:49] wakes up +[1518-01-24 00:00] Guard #373 begins shift +[1518-03-12 00:28] falls asleep +[1518-01-14 00:57] wakes up +[1518-04-24 00:53] wakes up +[1518-07-15 23:59] Guard #1627 begins shift +[1518-03-03 00:58] wakes up +[1518-11-04 23:58] Guard #523 begins shift +[1518-03-14 00:04] falls asleep +[1518-05-02 00:00] Guard #2339 begins shift +[1518-10-13 00:03] Guard #173 begins shift +[1518-01-30 00:09] falls asleep +[1518-09-12 00:07] falls asleep +[1518-06-29 00:21] falls asleep +[1518-02-14 00:16] falls asleep +[1518-05-25 00:36] falls asleep +[1518-08-05 00:42] falls asleep +[1518-07-10 00:44] wakes up +[1518-09-16 00:54] falls asleep +[1518-02-01 00:59] wakes up +[1518-02-28 00:32] falls asleep +[1518-09-26 23:59] Guard #373 begins shift +[1518-09-05 00:18] wakes up +[1518-03-12 23:52] Guard #373 begins shift +[1518-10-10 00:55] wakes up +[1518-09-16 00:49] wakes up +[1518-02-06 00:49] wakes up +[1518-05-02 00:38] falls asleep +[1518-03-18 00:37] falls asleep +[1518-02-24 00:56] wakes up +[1518-08-14 00:27] falls asleep +[1518-08-31 00:55] wakes up +[1518-05-29 23:57] Guard #419 begins shift +[1518-11-02 00:12] falls asleep +[1518-09-18 00:26] falls asleep +[1518-09-05 00:52] falls asleep +[1518-02-18 00:54] wakes up +[1518-05-16 00:17] falls asleep +[1518-03-03 00:40] wakes up +[1518-03-27 00:06] wakes up +[1518-05-13 00:44] falls asleep +[1518-09-12 00:30] wakes up +[1518-02-13 00:58] wakes up +[1518-08-20 00:43] falls asleep +[1518-06-10 00:08] falls asleep +[1518-07-12 23:46] Guard #373 begins shift +[1518-07-30 00:08] falls asleep +[1518-03-01 00:08] falls asleep +[1518-06-28 23:59] Guard #173 begins shift +[1518-04-21 00:37] falls asleep +[1518-03-28 00:33] falls asleep +[1518-07-13 00:55] falls asleep +[1518-08-12 00:27] falls asleep +[1518-07-05 23:48] Guard #431 begins shift +[1518-10-06 23:57] Guard #3187 begins shift +[1518-06-21 00:40] wakes up +[1518-03-28 00:48] wakes up +[1518-03-20 00:03] Guard #431 begins shift +[1518-08-02 00:00] Guard #1627 begins shift +[1518-02-11 00:50] falls asleep +[1518-03-08 00:18] falls asleep +[1518-09-09 00:59] wakes up +[1518-10-07 00:57] wakes up +[1518-10-21 00:58] wakes up +[1518-07-20 00:03] falls asleep +[1518-09-29 00:53] wakes up +[1518-02-20 00:01] Guard #601 begins shift +[1518-05-24 00:03] falls asleep +[1518-09-06 23:59] Guard #523 begins shift +[1518-06-30 00:55] wakes up +[1518-07-09 23:59] Guard #1627 begins shift +[1518-11-18 00:36] falls asleep +[1518-05-14 00:59] wakes up +[1518-02-15 23:52] Guard #173 begins shift +[1518-04-25 23:50] Guard #1637 begins shift +[1518-02-22 23:58] Guard #863 begins shift +[1518-07-27 23:46] Guard #1597 begins shift +[1518-07-01 00:00] falls asleep +[1518-01-26 00:52] wakes up +[1518-06-21 00:37] falls asleep +[1518-01-18 00:04] falls asleep +[1518-06-16 00:50] wakes up +[1518-08-20 00:53] wakes up +[1518-01-20 00:00] Guard #2339 begins shift +[1518-03-19 00:47] falls asleep +[1518-09-05 00:25] falls asleep +[1518-04-14 00:40] falls asleep +[1518-07-08 00:48] wakes up +[1518-10-31 00:51] wakes up +[1518-03-12 00:42] falls asleep +[1518-08-17 00:57] wakes up +[1518-03-31 00:21] falls asleep +[1518-04-13 00:00] falls asleep +[1518-01-17 00:17] falls asleep +[1518-11-07 00:00] falls asleep +[1518-07-24 00:00] Guard #863 begins shift +[1518-10-06 00:28] falls asleep +[1518-05-23 00:05] falls asleep +[1518-03-29 23:57] Guard #3209 begins shift +[1518-09-30 23:56] Guard #419 begins shift +[1518-01-27 00:32] falls asleep +[1518-01-13 00:21] wakes up +[1518-04-13 23:47] Guard #3187 begins shift +[1518-06-07 00:02] Guard #3187 begins shift +[1518-02-18 00:11] falls asleep +[1518-07-29 00:16] falls asleep +[1518-08-17 00:52] wakes up +[1518-10-05 00:11] falls asleep +[1518-02-05 00:38] wakes up +[1518-05-13 00:36] falls asleep +[1518-10-24 00:44] wakes up +[1518-07-25 00:00] Guard #373 begins shift +[1518-02-13 00:54] wakes up +[1518-04-05 00:57] wakes up +[1518-07-09 00:02] Guard #373 begins shift +[1518-06-23 00:45] falls asleep +[1518-03-13 23:54] Guard #1637 begins shift +[1518-11-06 23:53] Guard #1637 begins shift +[1518-02-26 23:58] Guard #419 begins shift +[1518-05-18 00:48] falls asleep +[1518-02-06 23:58] Guard #2857 begins shift +[1518-01-20 00:56] falls asleep +[1518-05-08 00:58] wakes up +[1518-10-25 00:56] falls asleep +[1518-02-01 00:01] Guard #2857 begins shift +[1518-11-08 00:01] Guard #521 begins shift +[1518-02-05 00:53] wakes up +[1518-10-08 00:42] wakes up +[1518-08-24 23:58] Guard #521 begins shift +[1518-01-24 00:29] falls asleep +[1518-03-23 23:54] Guard #523 begins shift +[1518-09-08 00:20] wakes up +[1518-10-22 00:54] falls asleep +[1518-09-18 00:54] wakes up +[1518-05-09 00:47] wakes up +[1518-09-28 00:54] falls asleep +[1518-07-12 00:51] wakes up +[1518-07-30 00:00] Guard #173 begins shift +[1518-11-20 23:50] Guard #751 begins shift +[1518-10-19 00:25] falls asleep +[1518-07-24 00:08] falls asleep +[1518-03-03 00:14] falls asleep +[1518-10-16 00:47] wakes up +[1518-10-10 00:47] falls asleep +[1518-01-12 23:57] Guard #3209 begins shift +[1518-04-06 00:01] Guard #419 begins shift +[1518-06-05 00:04] Guard #2539 begins shift +[1518-07-14 00:59] wakes up +[1518-05-26 00:45] falls asleep +[1518-09-12 00:01] Guard #1597 begins shift +[1518-08-11 00:03] Guard #3209 begins shift +[1518-10-07 00:20] falls asleep +[1518-10-28 00:35] wakes up +[1518-10-04 00:14] wakes up +[1518-03-15 23:47] Guard #431 begins shift +[1518-05-01 00:11] falls asleep +[1518-05-28 00:36] falls asleep +[1518-04-02 00:39] wakes up +[1518-10-20 23:57] Guard #1637 begins shift +[1518-10-30 00:44] wakes up +[1518-09-24 00:05] falls asleep +[1518-11-06 00:49] wakes up +[1518-10-22 00:16] falls asleep +[1518-06-23 00:57] wakes up +[1518-07-09 00:43] wakes up +[1518-02-03 00:03] falls asleep +[1518-02-01 23:57] Guard #3229 begins shift +[1518-06-04 00:40] falls asleep +[1518-09-19 00:31] wakes up +[1518-05-19 00:03] Guard #2539 begins shift +[1518-02-07 00:12] falls asleep +[1518-09-26 00:33] falls asleep +[1518-05-26 00:58] wakes up +[1518-08-29 00:38] wakes up +[1518-09-12 23:50] Guard #521 begins shift +[1518-09-15 00:34] wakes up +[1518-08-22 00:47] wakes up +[1518-03-25 00:01] falls asleep +[1518-10-04 00:45] wakes up +[1518-11-01 00:02] Guard #373 begins shift +[1518-03-30 00:56] wakes up +[1518-01-26 00:38] wakes up +[1518-03-17 00:59] wakes up +[1518-03-29 00:49] wakes up +[1518-03-26 00:41] falls asleep +[1518-01-29 00:23] falls asleep +[1518-03-11 00:41] falls asleep +[1518-04-11 23:57] Guard #2857 begins shift +[1518-09-19 00:56] falls asleep +[1518-03-22 00:46] wakes up +[1518-07-16 00:38] falls asleep +[1518-03-08 00:00] Guard #1597 begins shift +[1518-06-07 00:18] falls asleep +[1518-06-01 00:45] wakes up +[1518-09-24 23:58] Guard #1627 begins shift +[1518-05-21 00:35] falls asleep +[1518-01-28 00:50] falls asleep +[1518-01-25 00:19] falls asleep +[1518-10-16 00:59] wakes up +[1518-03-02 00:00] Guard #1031 begins shift +[1518-07-30 00:35] wakes up +[1518-11-13 00:04] Guard #419 begins shift +[1518-03-09 00:52] wakes up +[1518-06-12 00:59] wakes up +[1518-03-15 00:00] Guard #2339 begins shift +[1518-09-06 00:00] Guard #1637 begins shift +[1518-03-10 23:50] Guard #863 begins shift +[1518-02-15 00:36] wakes up +[1518-04-21 00:59] wakes up +[1518-03-11 00:33] wakes up +[1518-09-23 00:14] falls asleep +[1518-09-09 00:49] wakes up +[1518-10-13 00:32] wakes up +[1518-10-14 00:52] falls asleep +[1518-02-12 00:51] falls asleep +[1518-08-05 00:02] Guard #751 begins shift +[1518-09-03 00:52] wakes up +[1518-04-12 00:55] wakes up +[1518-06-15 00:20] wakes up +[1518-08-07 23:56] Guard #3229 begins shift +[1518-04-30 00:55] falls asleep +[1518-04-02 00:36] falls asleep +[1518-05-16 00:52] wakes up +[1518-09-25 00:55] wakes up +[1518-03-29 00:00] Guard #431 begins shift +[1518-02-18 00:00] Guard #373 begins shift +[1518-10-03 00:45] falls asleep +[1518-05-25 00:19] falls asleep +[1518-10-21 00:44] falls asleep +[1518-11-18 00:58] wakes up +[1518-09-20 00:00] Guard #3209 begins shift +[1518-11-20 00:00] Guard #1627 begins shift +[1518-09-16 00:59] wakes up +[1518-05-04 00:29] falls asleep +[1518-04-18 00:41] wakes up +[1518-06-17 00:08] falls asleep +[1518-09-22 00:40] wakes up +[1518-10-23 23:58] Guard #1627 begins shift +[1518-01-21 00:54] falls asleep +[1518-02-09 23:58] Guard #3229 begins shift +[1518-01-17 00:03] Guard #523 begins shift +[1518-04-16 00:39] falls asleep +[1518-09-09 00:54] falls asleep +[1518-09-08 00:56] wakes up +[1518-06-07 00:19] wakes up +[1518-06-22 00:06] falls asleep +[1518-02-24 00:47] wakes up +[1518-03-19 00:58] wakes up +[1518-06-14 23:57] Guard #1637 begins shift +[1518-07-30 23:46] Guard #2857 begins shift +[1518-08-10 00:49] falls asleep +[1518-08-22 00:51] falls asleep +[1518-03-24 00:58] wakes up +[1518-04-29 00:50] wakes up +[1518-09-13 00:51] wakes up +[1518-05-24 00:33] wakes up +[1518-04-30 23:58] Guard #2539 begins shift +[1518-04-09 00:24] falls asleep +[1518-06-19 00:06] falls asleep +[1518-04-12 00:38] falls asleep +[1518-04-24 00:03] Guard #751 begins shift +[1518-07-06 00:00] falls asleep +[1518-10-03 00:30] falls asleep +[1518-07-22 23:58] Guard #1031 begins shift +[1518-08-31 23:56] Guard #3187 begins shift +[1518-04-14 00:58] wakes up +[1518-03-16 23:57] Guard #863 begins shift +[1518-04-13 00:45] wakes up +[1518-06-23 23:58] Guard #3229 begins shift +[1518-01-28 00:43] falls asleep +[1518-03-04 00:27] wakes up +[1518-04-06 00:23] falls asleep +[1518-05-25 00:22] wakes up +[1518-06-09 00:30] wakes up +[1518-02-06 00:19] wakes up +[1518-06-16 00:00] falls asleep +[1518-01-30 00:04] Guard #3187 begins shift +[1518-09-08 00:32] falls asleep +[1518-09-06 00:08] falls asleep +[1518-03-05 00:57] wakes up +[1518-07-04 00:42] falls asleep +[1518-09-17 00:52] wakes up +[1518-06-12 00:40] falls asleep +[1518-03-19 00:03] Guard #1637 begins shift +[1518-08-28 00:58] wakes up +[1518-07-20 00:46] wakes up +[1518-08-24 00:51] falls asleep +[1518-02-22 00:53] falls asleep +[1518-10-22 00:57] wakes up +[1518-05-11 00:56] wakes up +[1518-05-15 00:18] falls asleep +[1518-02-06 00:07] falls asleep +[1518-04-30 00:58] wakes up +[1518-09-02 00:50] wakes up +[1518-11-19 00:24] wakes up +[1518-08-11 00:53] falls asleep +[1518-07-08 00:04] Guard #173 begins shift +[1518-08-22 00:53] wakes up +[1518-11-09 23:58] Guard #2143 begins shift +[1518-08-24 00:13] falls asleep +[1518-03-22 23:51] Guard #601 begins shift +[1518-08-26 23:59] Guard #3187 begins shift +[1518-02-27 00:16] falls asleep +[1518-08-08 00:42] wakes up +[1518-02-06 00:58] wakes up +[1518-05-07 23:58] Guard #173 begins shift +[1518-01-26 00:43] falls asleep +[1518-03-15 00:50] wakes up +[1518-11-13 00:49] wakes up +[1518-04-30 00:04] Guard #1031 begins shift +[1518-07-01 00:54] falls asleep +[1518-08-09 00:32] falls asleep +[1518-09-19 00:34] falls asleep +[1518-01-27 00:00] Guard #3229 begins shift +[1518-04-16 00:47] falls asleep +[1518-05-14 00:03] falls asleep +[1518-06-20 00:37] wakes up +[1518-03-06 00:27] falls asleep +[1518-04-27 00:08] falls asleep +[1518-05-09 00:50] falls asleep +[1518-10-07 00:34] falls asleep +[1518-04-10 00:12] falls asleep +[1518-04-27 00:04] Guard #601 begins shift +[1518-08-02 00:55] wakes up +[1518-08-22 00:24] falls asleep +[1518-02-23 00:57] wakes up +[1518-10-29 00:41] wakes up +[1518-06-03 00:44] wakes up +[1518-08-20 23:56] Guard #1637 begins shift +[1518-11-02 00:39] falls asleep +[1518-01-16 00:37] falls asleep +[1518-02-22 00:45] wakes up +[1518-11-05 00:49] wakes up +[1518-03-25 00:57] wakes up +[1518-11-14 00:25] falls asleep +[1518-06-21 00:00] Guard #3209 begins shift +[1518-01-24 23:56] Guard #863 begins shift +[1518-03-04 00:14] falls asleep +[1518-06-03 00:35] wakes up +[1518-07-19 00:58] wakes up +[1518-09-08 00:09] falls asleep +[1518-10-03 00:26] wakes up +[1518-09-07 00:47] falls asleep +[1518-05-14 23:58] Guard #1597 begins shift +[1518-06-18 00:46] wakes up +[1518-10-23 00:24] falls asleep +[1518-04-15 00:59] wakes up +[1518-07-03 23:57] Guard #2143 begins shift +[1518-06-09 00:54] wakes up +[1518-06-11 00:42] falls asleep +[1518-09-29 00:18] falls asleep +[1518-11-06 00:08] falls asleep +[1518-07-13 00:47] wakes up +[1518-08-13 00:36] wakes up +[1518-08-20 00:02] Guard #1627 begins shift +[1518-03-27 00:39] wakes up +[1518-07-03 00:46] falls asleep +[1518-02-11 23:47] Guard #521 begins shift +[1518-04-20 00:05] falls asleep +[1518-05-24 00:47] falls asleep +[1518-11-12 00:00] Guard #2143 begins shift +[1518-06-02 00:01] falls asleep +[1518-06-25 00:31] falls asleep +[1518-06-27 23:50] Guard #3209 begins shift +[1518-08-18 00:38] wakes up +[1518-10-05 00:43] wakes up +[1518-11-04 00:45] falls asleep +[1518-04-29 00:01] Guard #523 begins shift +[1518-05-17 00:40] falls asleep +[1518-10-21 00:51] wakes up +[1518-10-26 00:41] falls asleep +[1518-02-14 00:35] wakes up +[1518-09-16 23:57] Guard #601 begins shift +[1518-08-25 23:58] Guard #2143 begins shift +[1518-11-18 23:50] Guard #523 begins shift +[1518-09-21 00:04] Guard #991 begins shift +[1518-11-01 00:11] falls asleep +[1518-08-25 00:21] wakes up +[1518-01-29 00:01] Guard #1031 begins shift +[1518-08-12 00:00] Guard #863 begins shift +[1518-07-13 00:59] wakes up +[1518-07-31 00:47] wakes up +[1518-06-01 23:54] Guard #3187 begins shift +[1518-03-26 00:01] Guard #3229 begins shift +[1518-07-24 00:38] falls asleep +[1518-06-15 00:52] wakes up +[1518-05-24 00:59] wakes up +[1518-09-05 00:10] falls asleep +[1518-09-04 00:04] Guard #1031 begins shift +[1518-08-18 00:51] falls asleep +[1518-05-28 00:04] Guard #1627 begins shift +[1518-08-11 00:20] falls asleep +[1518-10-23 00:03] Guard #2339 begins shift +[1518-04-18 00:51] wakes up +[1518-02-19 00:03] Guard #521 begins shift +[1518-03-29 00:31] falls asleep +[1518-02-20 00:13] falls asleep +[1518-11-23 00:55] falls asleep +[1518-01-28 00:44] wakes up +[1518-07-15 00:46] wakes up +[1518-04-20 23:58] Guard #373 begins shift +[1518-03-11 00:03] falls asleep +[1518-06-24 00:51] wakes up +[1518-06-29 00:32] falls asleep +[1518-08-30 00:56] wakes up +[1518-03-20 00:34] falls asleep +[1518-04-10 00:04] Guard #1031 begins shift +[1518-04-24 00:49] falls asleep +[1518-03-03 00:53] falls asleep +[1518-05-08 00:06] falls asleep +[1518-11-21 00:02] falls asleep +[1518-06-07 00:59] wakes up +[1518-10-07 00:45] wakes up +[1518-02-01 00:19] falls asleep +[1518-02-19 00:58] wakes up +[1518-05-27 00:36] wakes up +[1518-07-03 00:38] falls asleep +[1518-05-19 00:41] wakes up +[1518-08-07 00:34] wakes up +[1518-05-07 00:24] wakes up +[1518-02-25 00:19] falls asleep +[1518-09-02 00:00] Guard #521 begins shift +[1518-07-08 00:58] wakes up +[1518-11-17 00:02] Guard #1999 begins shift +[1518-10-26 00:27] falls asleep +[1518-05-02 00:54] wakes up +[1518-09-20 00:24] wakes up +[1518-03-17 00:21] falls asleep +[1518-09-10 00:36] falls asleep +[1518-10-17 00:09] falls asleep +[1518-06-05 00:57] wakes up +[1518-06-11 23:56] Guard #373 begins shift +[1518-11-13 00:37] falls asleep +[1518-08-16 00:46] wakes up +[1518-02-13 00:57] falls asleep +[1518-06-14 00:59] wakes up +[1518-05-20 00:24] falls asleep +[1518-09-29 00:00] Guard #2339 begins shift +[1518-02-06 00:22] falls asleep +[1518-11-02 23:56] Guard #1637 begins shift +[1518-08-29 00:05] falls asleep +[1518-04-11 00:26] falls asleep +[1518-10-04 00:07] falls asleep +[1518-08-10 00:31] wakes up +[1518-03-23 00:47] wakes up +[1518-05-29 00:57] wakes up +[1518-08-25 00:51] wakes up +[1518-09-26 00:48] falls asleep +[1518-05-03 00:58] wakes up +[1518-05-06 23:46] Guard #373 begins shift +[1518-11-08 00:13] falls asleep +[1518-07-14 00:00] Guard #431 begins shift +[1518-07-03 00:11] falls asleep +[1518-04-21 00:42] wakes up +[1518-09-14 23:58] Guard #3209 begins shift +[1518-06-09 00:00] Guard #431 begins shift +[1518-03-11 00:52] wakes up +[1518-07-10 00:23] falls asleep +[1518-07-14 00:40] falls asleep +[1518-06-06 00:51] wakes up +[1518-07-19 00:03] Guard #863 begins shift +[1518-01-23 00:54] wakes up +[1518-07-23 00:26] falls asleep +[1518-08-26 00:45] wakes up +[1518-07-22 00:17] falls asleep +[1518-09-26 00:57] wakes up +[1518-05-18 00:37] wakes up +[1518-10-09 00:49] falls asleep +[1518-02-08 00:47] wakes up +[1518-09-14 00:25] falls asleep +[1518-08-31 00:41] wakes up +[1518-01-25 00:51] wakes up +[1518-07-28 00:01] falls asleep +[1518-10-28 00:16] falls asleep +[1518-02-17 00:01] Guard #2857 begins shift +[1518-06-26 23:59] Guard #523 begins shift +[1518-03-06 00:44] wakes up +[1518-08-18 00:48] wakes up +[1518-07-18 00:46] wakes up +[1518-08-06 00:01] falls asleep +[1518-05-09 00:02] Guard #521 begins shift +[1518-10-09 23:50] Guard #523 begins shift +[1518-02-28 00:18] falls asleep +[1518-05-29 00:00] Guard #3187 begins shift +[1518-10-24 00:50] falls asleep +[1518-07-06 00:44] wakes up +[1518-08-28 00:31] falls asleep +[1518-01-17 00:48] wakes up +[1518-10-02 00:29] falls asleep +[1518-07-02 00:27] falls asleep +[1518-11-09 00:38] falls asleep +[1518-06-12 00:57] falls asleep +[1518-04-26 00:20] wakes up +[1518-05-10 00:14] wakes up +[1518-08-13 00:04] Guard #2857 begins shift +[1518-04-25 00:53] wakes up +[1518-03-15 00:33] wakes up +[1518-04-03 00:30] wakes up +[1518-08-21 23:58] Guard #3187 begins shift +[1518-01-18 23:58] Guard #1999 begins shift +[1518-06-22 23:56] Guard #3187 begins shift +[1518-10-06 00:59] wakes up +[1518-10-21 23:57] Guard #863 begins shift +[1518-08-28 00:00] Guard #1637 begins shift +[1518-02-11 00:44] wakes up +[1518-07-07 00:16] falls asleep +[1518-10-15 00:43] wakes up +[1518-09-05 00:56] wakes up +[1518-01-22 00:12] falls asleep +[1518-01-14 23:57] Guard #2857 begins shift +[1518-08-30 00:36] falls asleep +[1518-08-07 00:01] Guard #1597 begins shift +[1518-05-05 00:00] Guard #3229 begins shift +[1518-01-13 00:13] falls asleep +[1518-11-10 00:55] falls asleep +[1518-04-22 00:55] wakes up +[1518-10-07 00:54] falls asleep +[1518-11-02 00:20] wakes up +[1518-10-30 00:32] falls asleep +[1518-05-06 00:00] Guard #863 begins shift +[1518-03-10 00:59] wakes up +[1518-09-19 00:59] wakes up +[1518-06-07 00:35] falls asleep +[1518-04-21 23:49] Guard #3209 begins shift +[1518-07-07 00:47] wakes up +[1518-04-09 00:45] wakes up +[1518-09-06 00:45] falls asleep +[1518-03-26 00:34] wakes up +[1518-03-03 00:01] Guard #419 begins shift +[1518-10-11 00:21] falls asleep +[1518-09-20 00:33] falls asleep +[1518-07-15 00:24] falls asleep +[1518-03-17 00:40] wakes up +[1518-05-23 00:46] falls asleep +[1518-03-20 00:40] wakes up +[1518-11-11 00:55] wakes up +[1518-07-12 00:03] Guard #2143 begins shift +[1518-08-16 00:13] falls asleep +[1518-05-13 00:41] wakes up +[1518-04-18 00:58] wakes up +[1518-09-01 00:59] wakes up +[1518-05-05 00:37] falls asleep +[1518-09-09 00:02] Guard #521 begins shift +[1518-06-09 00:44] falls asleep +[1518-02-12 00:44] wakes up +[1518-05-26 00:40] wakes up +[1518-09-04 00:37] falls asleep +[1518-09-11 00:54] wakes up +[1518-08-01 00:02] falls asleep +[1518-07-03 00:43] wakes up +[1518-11-10 00:09] falls asleep +[1518-10-14 00:33] wakes up +[1518-04-21 00:47] wakes up +[1518-02-03 23:59] Guard #1999 begins shift +[1518-10-05 00:47] falls asleep +[1518-03-18 00:04] Guard #431 begins shift +[1518-01-28 00:00] Guard #3209 begins shift +[1518-08-09 00:52] wakes up +[1518-10-03 00:55] wakes up +[1518-10-20 00:03] Guard #863 begins shift +[1518-08-17 00:03] Guard #2539 begins shift +[1518-10-26 00:02] Guard #751 begins shift +[1518-07-16 23:49] Guard #419 begins shift +[1518-09-24 00:55] falls asleep +[1518-03-06 00:42] falls asleep +[1518-06-13 23:50] Guard #3209 begins shift +[1518-07-08 00:17] falls asleep +[1518-05-23 23:50] Guard #1627 begins shift +[1518-03-07 00:07] falls asleep +[1518-04-07 00:31] falls asleep +[1518-05-15 00:39] wakes up +[1518-06-01 00:27] falls asleep +[1518-07-17 23:51] Guard #1637 begins shift +[1518-02-07 00:48] falls asleep +[1518-03-14 00:18] wakes up +[1518-02-07 00:51] wakes up +[1518-07-31 23:47] Guard #863 begins shift +[1518-08-21 00:47] wakes up +[1518-05-05 00:57] wakes up +[1518-10-24 23:56] Guard #863 begins shift +[1518-10-19 00:58] wakes up +[1518-10-01 23:58] Guard #431 begins shift +[1518-02-23 00:39] falls asleep +[1518-02-04 23:58] Guard #601 begins shift +[1518-07-06 00:50] wakes up +[1518-08-09 00:14] wakes up +[1518-08-05 23:51] Guard #373 begins shift +[1518-02-11 00:26] falls asleep +[1518-11-03 00:37] falls asleep +[1518-05-12 00:11] falls asleep +[1518-02-09 00:39] wakes up +[1518-02-05 00:45] falls asleep +[1518-01-20 00:49] wakes up +[1518-10-23 00:56] wakes up +[1518-08-15 00:13] falls asleep +[1518-02-06 00:33] wakes up +[1518-10-12 00:47] wakes up +[1518-03-21 00:02] Guard #991 begins shift +[1518-08-15 00:52] falls asleep +[1518-06-16 00:10] wakes up +[1518-11-20 00:06] falls asleep +[1518-03-24 00:25] falls asleep +[1518-05-25 00:57] wakes up +[1518-01-21 00:00] Guard #2857 begins shift +[1518-02-24 00:54] falls asleep +[1518-04-02 00:27] wakes up +[1518-10-14 00:36] falls asleep +[1518-02-16 00:04] falls asleep +[1518-08-24 00:47] wakes up +[1518-05-04 00:54] wakes up +[1518-03-17 00:46] falls asleep +[1518-02-17 00:48] falls asleep +[1518-02-24 00:04] Guard #419 begins shift +[1518-02-10 00:46] falls asleep +[1518-02-28 23:59] Guard #173 begins shift +[1518-06-17 00:04] Guard #523 begins shift +[1518-04-07 00:56] wakes up +[1518-07-17 00:02] falls asleep +[1518-05-28 00:33] wakes up +[1518-06-17 23:58] Guard #751 begins shift +[1518-02-09 00:34] falls asleep +[1518-06-15 00:08] falls asleep +[1518-05-17 23:58] Guard #521 begins shift +[1518-01-25 23:57] Guard #3229 begins shift +[1518-03-09 00:59] wakes up +[1518-10-01 00:51] wakes up +[1518-03-01 00:40] falls asleep +[1518-05-28 00:41] wakes up +[1518-02-25 00:00] Guard #2143 begins shift +[1518-08-16 00:57] wakes up +[1518-07-08 00:57] falls asleep +[1518-05-06 00:56] wakes up +[1518-05-09 00:45] falls asleep +[1518-04-25 00:40] falls asleep +[1518-06-13 00:35] wakes up +[1518-08-15 00:24] wakes up +[1518-07-06 00:49] falls asleep +[1518-08-10 00:53] wakes up +[1518-06-05 00:52] wakes up +[1518-05-31 00:35] falls asleep +[1518-03-05 00:03] Guard #2857 begins shift +[1518-04-10 00:15] wakes up +[1518-05-22 23:51] Guard #1597 begins shift +[1518-09-23 00:03] Guard #431 begins shift +[1518-07-12 00:40] falls asleep +[1518-05-29 00:36] wakes up +[1518-03-24 00:01] falls asleep +[1518-08-17 23:57] Guard #3187 begins shift +[1518-08-19 00:07] falls asleep +[1518-06-27 00:58] wakes up +[1518-10-21 00:55] falls asleep +[1518-01-31 00:51] wakes up +[1518-09-02 23:58] Guard #3229 begins shift +[1518-02-10 23:57] Guard #2539 begins shift +[1518-07-21 00:01] Guard #1637 begins shift +[1518-03-30 00:23] falls asleep +[1518-08-25 00:15] falls asleep +[1518-04-01 23:50] Guard #1637 begins shift +[1518-06-17 00:27] wakes up +[1518-07-02 00:16] wakes up +[1518-08-31 00:08] falls asleep +[1518-04-30 00:10] falls asleep +[1518-08-14 00:35] wakes up +[1518-04-01 00:54] falls asleep +[1518-07-18 00:32] falls asleep +[1518-06-12 00:45] wakes up +[1518-05-02 00:30] wakes up +[1518-04-26 00:24] falls asleep +[1518-04-12 00:51] falls asleep +[1518-09-19 00:46] wakes up +[1518-08-30 23:57] Guard #1627 begins shift +[1518-04-21 00:50] falls asleep +[1518-05-22 00:09] falls asleep +[1518-05-10 00:20] falls asleep +[1518-04-08 00:22] falls asleep +[1518-07-17 00:45] wakes up +[1518-07-25 00:32] falls asleep +[1518-04-07 00:35] wakes up +[1518-04-30 00:25] wakes up +[1518-10-31 00:41] falls asleep +[1518-08-15 00:56] wakes up +[1518-08-16 00:01] Guard #2539 begins shift +[1518-02-20 00:33] wakes up +[1518-06-09 00:26] falls asleep +[1518-07-11 00:37] falls asleep +[1518-07-18 00:00] falls asleep +[1518-08-16 00:51] falls asleep +[1518-10-18 00:00] Guard #991 begins shift +[1518-06-01 00:18] falls asleep +[1518-01-14 00:54] falls asleep +[1518-09-06 00:57] wakes up +[1518-05-23 00:35] wakes up +[1518-04-06 00:51] wakes up +[1518-02-21 00:00] Guard #2143 begins shift +[1518-03-04 00:04] Guard #2857 begins shift +[1518-02-12 00:01] falls asleep +[1518-06-28 00:16] wakes up +[1518-06-19 00:34] wakes up +[1518-08-01 00:52] wakes up +[1518-07-27 00:02] Guard #419 begins shift +[1518-09-05 00:44] wakes up +[1518-09-13 00:05] falls asleep +[1518-11-14 23:59] Guard #1597 begins shift +[1518-09-28 00:44] wakes up +[1518-02-07 00:44] wakes up +[1518-03-05 23:57] Guard #523 begins shift +[1518-10-03 00:39] wakes up +[1518-08-04 00:03] Guard #2339 begins shift +[1518-10-05 00:55] wakes up +[1518-06-14 00:03] falls asleep +[1518-08-22 23:59] Guard #601 begins shift +[1518-04-26 00:01] falls asleep +[1518-06-03 00:01] falls asleep +[1518-03-06 23:57] Guard #2857 begins shift +[1518-08-17 00:56] falls asleep +[1518-05-03 00:13] falls asleep +[1518-11-04 00:54] wakes up +[1518-01-30 00:35] wakes up +[1518-04-28 00:58] wakes up +[1518-04-03 00:01] Guard #3209 begins shift +[1518-09-09 00:11] falls asleep +[1518-05-21 00:00] Guard #2339 begins shift +[1518-05-27 00:54] wakes up +[1518-01-30 00:51] falls asleep +[1518-04-17 00:57] wakes up +[1518-01-16 00:04] Guard #2339 begins shift +[1518-03-19 00:54] falls asleep +[1518-04-20 00:33] wakes up +[1518-05-19 00:48] falls asleep +[1518-06-05 00:56] falls asleep +[1518-04-27 00:56] wakes up +[1518-04-19 23:47] Guard #521 begins shift +[1518-02-25 23:57] Guard #829 begins shift +[1518-01-22 00:42] wakes up +[1518-08-24 00:31] falls asleep +[1518-04-18 00:09] falls asleep +[1518-05-16 00:38] wakes up +[1518-05-12 23:59] Guard #373 begins shift +[1518-05-20 00:43] wakes up +[1518-04-18 00:54] falls asleep +[1518-03-30 23:59] Guard #751 begins shift +[1518-03-08 00:59] wakes up +[1518-03-09 00:01] Guard #2143 begins shift +[1518-03-26 00:53] wakes up +[1518-05-13 23:54] Guard #523 begins shift +[1518-06-13 00:34] falls asleep +[1518-03-27 00:02] falls asleep +[1518-11-09 00:55] wakes up +[1518-02-05 00:57] falls asleep +[1518-02-05 00:27] wakes up +[1518-09-28 00:55] wakes up +[1518-03-20 00:51] wakes up +[1518-08-06 00:20] wakes up +[1518-04-16 23:59] Guard #1627 begins shift +[1518-10-18 23:56] Guard #431 begins shift +[1518-07-21 00:52] falls asleep +[1518-05-19 00:36] falls asleep +[1518-04-12 23:48] Guard #173 begins shift +[1518-05-07 00:37] falls asleep +[1518-10-04 00:53] falls asleep +[1518-06-26 00:36] falls asleep +[1518-04-04 00:52] wakes up +[1518-05-04 00:04] Guard #3229 begins shift +[1518-07-09 00:38] falls asleep +[1518-05-01 00:32] wakes up +[1518-05-02 00:27] falls asleep diff --git a/src/main/resources/2018/day5.txt b/src/main/resources/2018/day5.txt new file mode 100644 index 00000000..03f77c1f --- /dev/null +++ b/src/main/resources/2018/day5.txt @@ -0,0 +1 @@ +VRrQqmPoOpMdAaDMQqmDZwWzfFdJjGmMgtTyYMmVkKgGvOOooLixXIlpPqfFFfFfciICBbRrJjGgQchHIiKkTtCSspPVlLJPpGgSsSsYyjSsqwWTsqQStjOkyYKiHhwWIoIfFHhOYgGJjyOoFfvVAaopVtTYyNitTIdvVkKgGYyWwDZwWNnlLwWzZYFfyDdyYVvLlgGUuhHMmzfFmMQqtaNnATDUuWwMjJRrdDmdyYkKkKCjzZJpzZPnEephHPNuUBbgGNncbBXZzxSsnAaVvNnqQvWPpwoOusSRrPpUvVCcwWStTSssHsSTzZtbBhAahHfFrgIhHibuUBCcGkKUucPpnNgGKfFkHhkKCGgRrCcwWhzZhHWNnwHEefFsRraNnASRSsKeEkkKUhHpPuoOEeRLxNnXUuEelEemXxMAxXanGgTtYyNNNnnryYtToOHhFftTcxXCPVvvVMmFfYyxXyYCcGqQgGgmMQrRqfFaAdhHDpPKkpyYPXxDcCduUILljIiBbMmJiZcCvVSsziHIiqQeEIikKhVnNvSDdcCImduUCcDMiJjeKkESrRPkKeEpsoTDdtOnNTtbBWIXxFYZzyfgGDDRrddlQYyZzqLcCQvVdDDdqVvabBAzZhHWwgoOiQqIlLGmMlLUuPpiSHhJjgGsuUIDSsgGuUmJBbjVvfFMmdDJjTtMNSsGgVvklLlLxIiXypPaGgAcCoOJDdWwfVveEFeAaElLZzIMmYyijYtcCTKvDHhdJjLJjxhHXlVNnzsSxXrRZfFEelnNQqUnNvVtWwTuqGgQRrCAKHhnNkZzpPCcjJjJbspPSBrVqQvkKRWrRwhHcCXxaPIqQAaFfyYipjJRQqrZzxZPpCAkKVvyYaDdmMgxXGSsLlnNjpPsSxeEXJcFfUuCjJwQqWwsSWcNHhnuRrtTUyYRQnNqYIpPiyKCRkKuUwWlLMmxXgGDxXdQqLMmlFfTuUtdvVDrNnckgGusSUOormyFfNcCnoAamxdVvDXMeTtEbBZICcimMsSkKyGgYIiStTsFlLJjyYfmMjJyKkofHhEeWwJLlkKfFBbnSjJsSOoMmsSyYwIiWsHhKbcCBSscsSTFNngnfIiFNkKAarRUuMmAXxasDvVdbBSjJYyfOjJoTtFFHLlAaBbnNhfwjxZzXUuJOoBboOEZzeLDRrdyYlWkKjgGJGEegGGPCkaAKcpyYglLfFfEeoORrNnqQJjJjxxRrXXerEeoOgGRZznNEEexFfRrXnNFdiIpPDpuUEeFNnRBbrKkfNqEQqevVdDQGgyYHwWhSHhclLldDLCcCcCpPvCchHVDljJLiInoONefqQFEkKcNnHhCwDdiIoOWdaADdkkbBKPpiIHnNXLlxfFaARrheDdOoEAadDhHWwjSSszZSszDdZfFsdDGgiquUQIoOWkUuKhVYynNmDdgGfFBbMvhHVvnNpPuUNkFfnQqjJNnNXpPxKnQiIqHEeguUGxBiIbXiIWeoOEfFkkKjJKaIiAHhngEeGbBNMmHhOorgGeXxFvVxXfjrRQZzqJeEAdDaEBaAOobRJcHhghHaAKkEeIwWiGCjwIirAacUuBbZRCcrzCkKMmQWwMmqrRoZYtTyQqBHAahboBbOVvgGcCAaTtbBlLPwWmMsIiueEgGZzLlUTtzZvuUVnqQNeERrMdwWDqVvgGQBNKknhHbIivRrVHlLhROMmjmMJPpSVvJjZmMztTyYBbOoJjsZyYyHhWwYvVDQqduUxXshHdBbdbsSBpPDwWDupPUMOomSdDDdAxXkKdDazffWeEwFwWlhHLjRrJmMFdDifKkFGrfFRzikKIZZzoOTNnLeElAaFfXxtWSskKWwcCoGMmEegbfFZzBKkRrEetTLlddDEeuUkrRJkKKksSrRQqFfYFYyfyzqQhHcCZubBKcCKvVckFfUuKCktTNeAaEnXxkUOyYxXTtRreGgdbBDmMLlETcCiIvVtYyobNnBeEaAabRrSsBmMAoOWeEwGgSsYqnNQuUviIVCiaVvEeAIRmMYyWwyYyYymoOZzMMlXxLDfFWwJTtqQauUAjTXxpPtlLNtTBgGhHbwWsSQnNkKVvqtiINnBfFqvVQbPAapRgGotTQqjJOXxrspPSdDIiymMPDdpYxXTVvneEUuNyYHGgwWsSaAjJhmMnwWecCytTzZYHiIoOpPiIhcCTqQtEgpPwMmrSsRwWvVvNxXwvVyBbDdQBbqbBnNFfLlIiwRmMLllLrWYMmuXxUXCcxUAadDDfFrRUudoAaOTtuUQqmDqQHhdzsuUSZPpZrRVvLlcNnxobaABOCcXgGfSsFCoEeOcKkiRrdDxdDbbpsSnJjNnBbFfZZzzlLHOobCcBSPpsjXxJIHhiBKkwWbbBPpmLlcbBeIiECudxXnNizZIwWbMuUmMLlKkdDoOsSOAXxrRJjtTZzakKLpPlNnoldDqQMmWwsHheEGgSSsMBjJbmAayYtJLcCljdDaAnNTtkKDdPpvVJoOgGeEGglLrKJAajkKkiIPpBbRrzjtThkKHkKBbJaFfocOoCOLlgXzZxGBbOIiJjnNoSNnwtWMmwTOAmMKkoOaiIAaNnRrHhBEebkKtTkKiIjJgYyGLwWlxXlLPEepOoAaVzZvpPrBbrRRoiRrlbBLIbylLYBJjUCcgGHhCcMYsqQBbSvmMpiIPWFfwVQqyYTjJxyYXUulLaABbmMfForlLRoKhhHHuUEekBVvhlLHbieEIGgVbdfFDxXwWBWEHhewXxgGviIaiQqotTOHtThEeIzZAsSQDdIxPpXSzHaAhzXpiYAamMyAaHVqQGgxXtTvqQQqhPistkKTSImMpbAaBIPDBbcXxCfogGSsOlLUuFHhPLlrRxLoOlXEXxZzJjxAoOaWwXUupPbBDdZzNnSshHVvKwtTgGdDWFfUukeERrhHzZNniIXZzxiIbVvhNngGSuWwUYysAYNnjUNnuJyfdTtJjBbHrRhdBbDYyQqDSsmoOrRfIiFYyOoSmMsSaAYyFfsunNWhHwgGlLqQWwLlUZzUumMMHhWwzWrRwZGGgyRREeLFflkDdKrrpPRSsBbrHlLhSsYupPBbNnUyYDaAdgTWwoOIDdJjxXFfyYYyimMQqRKAakDxXaAdrwWnPpYyZzWVvwHzZhkhHQqmMZbBzSsDdKNkKoOaEeAhSstzZTAauUfNeWwErRzZKcCkFfbBRrAOJjTtLPplthLLllKEevVklLHJXOoxjTRrgcqQCnNCgGcGoIhHicCTeHiOTtaAsSTtJjBbGPmZzMpDUuSsxXZzzQqwnNxXvVcoOZuUtTzCWZkKYNDzlLZAAaamPpFfogfFODdoUuEenNnGgakKaXxAAqQtDYycCEFfOAaoedAnNasSwWGazZAFfgTNPpbBHhyiIGzZrROogFfjUuBrRuUbEeEeQIiWhHwnNKhHIikLltqQdoODYyiIOoBgGbjJcCbZHLlhzeEHhBiglLGOoOozWwBbzZNnZIeEMmDdyYiWBboOwnNIUuAaOoTgMcClLmeEtLTtiQqtTUdDuvVPpYNvVnyksgGSHXxhImMiaQqAtTBbzgGZWwpPRlLriMmIVvKUukVkKvUfFuxXPpOolzZLrRKbMeXxEmZMmJtTeZzGWwsSgbBEWyYhJjHuxXUYeEOoxXHhSLlfJjFCCccLyYiInNIFfimMVLlvlIiCnCcNUguUGuYyxyYYydDuUOWrRNnwlLNnsSruURoOoXjJkvryYRVYyWwiTtgGiIWwIKnNkHhyeEYnNZfFgGUuDuUGgiRrIBuUdDKzZkIZyYzQqrKkwWRGgpPMmkKJjpWtbBTwPGKkgeEifuUjJNnFyYkKtqAaQHrRhHhAaTlLFuUdDKkjJYXxMmXxhEergGRNcbBuUCAAaMYymlLcCoOadDyjsSJBVvbwWbBHiIlLhXuTjJJkKZzyYjtUDdJiIjjAaNpPoumMUOtnvVNGqQgZzYhaAQqIrRiHOoBYybHlLmQqjJlUuLoOvVBaAbAaMUuaaAAuUteCcCcSzZsBvaAVbEmMyYTlUrtjJQWwqlLVLlRYKkXxEezWPpdkKDfBFfbXyYALcCOoqIiQrcCRltTQqpqZzQPaiIMNnzZSZzfFJjTtsmUXzZJfFjxYPufFUFsSNnflLpfiIDdZzFQhHqidDdDtKZdDNYynzOokTWwAOoaxXIaAPYLlnYVvyNyuRrUOtTEeLOoAalogKrRkMmXxGpDQMzZibiIARrSsagGoObBWwBRrRrIlNnZzLuUzZPUuPsSpBbyWLJcPpCjlqQKkgGEemMbBpYyqQPZzxXTqQQAaiIXxOoqAannbmhHQVvEekKqMGQqgjJcsSPpCtEeTLwWlhkKWJEejfFmMzZRrwItuUkKAiIWwfFaFfKkuuEeUOolLEOoeUOoPgaAGIipJjcCCnNcdDqpPQDCAacdMwWVvEkKemaheTMmtVvECcvXxVnTLldDYeEyTttjJUuaDdbBOgGSsoWwWwAeEOoPpMQZvVzJjqmLoyqoOQYfgGFZzGqQYygWwbBxGPlLpLlgXzDdPAaSsrRVCcoOvsSrjFfJZPpiIGgzRmZeEGgzNndDdiIVvYXxyJjaADMRNXxmWwMmMoOnoOuUyAaVOovcCQqYaAaAwWnNxXRrGgpIiPzlhHCcPNneEplLfFvVFfLOiIonwWNOoPSoOsFtdDaAIiFAaYLlWwyLtTfCcFlPyYyYpTtfaAmMiImMUubRrnNfFAXxTCcfFYwqiIuUrRzZQyYWIijJTAavVUutNnxeEDdXiIOowTIitMmPpfLlZzFuUJjKLAaPlLplkWoOZMKpPkUuHnNeycSeEsCXxYqfFRibBIiUuIiItToZGDdgBbZzAhHGgPbqQtTeExXmlLcxKkXCtTjEbUuBqQVoQqOrRSsoOyYaAdDwiIiIdDWUlSsNnLMmufFxtTwWoOXUFftSsTHhcCGqQgxJjmMZzGSJjsYFHRNnPzZVBuqQwWUbyYuUvpyYUurDiIOADOIiNeKklHtnNKuUjiIuUJkgixMmVvcKkCzZXeDddXxMmrRZZzKFjBXHhzZxYLlzaAZrjJHhOIzZiomMwWwpPeEeEWnNRyTOotbwuUvVWhHkcCdDKAaxXeiIEbBzZUuUugpPtQqPHSKkgGscCfFdDRwWEnNdDBUWyAZzeEoOLsSpLVvlPlQSNnsBbqRrldDAaLYcCySdRrAaQqmMttNJjJjVvnFMmfhHDbBdhfpcCIiEePnNrRqFDMmgyYKkGmMJaAbLQlLQpLlPqrRxXbBYZltTkOooOMmnNJjSsNnNnNnkKGYyglLGHjJhYygZzgGxCcXxeEwLlWYEeyfuUdDakKyYFfpPBbAlLUuQqGAakcCsQCcjJXxmgGMpPpQhHmMeqLSsxXbbxVvbBXuUBkKhHXqnNRrbGgBzsSZWjJoOeEwQyWwlHhLmMGgYDdsSMmmWwqQMxViIZzhjkmMKXxJjJvVAaUuvpPqjJQVwWjZriIREOQJjMmqoeLqQpPlcCCWIiUuCfbeEBsnNSpPFUuSPpgEiIfFzZeGsfmFBbfMfFFuUfFMnNwOoWmPpDmMNnayYAZzdrSNkKnaAhHsRqnNtkKrKiQnNqghHGfFIZztTQKkzGMmgEphHFfPEeeOdAaDvtbBTVvVMmPpgZzfwWWwoOEeFfFYgGkejJinNIEvgGVVvLlKVvrCTwWtYyoJjOcvVMnNmaATwWtrqtYyTrRIiAaQHhsSRkKbBIZziTeEtNSseNnvVVmMYywWvvVMNWOoMmzZxfFLRpPTtWjnNJbBuUZzwykPuUJjpFmjJMfoLLllOWwqiIdDQJjbBBIPXxRLdkKMmDhDdnNvVHlZWwJjOoPpXxgGzaeEcAgGaCDdGEehHYUuiIolLOPuxXKliWwILEexoOXCZuUaAJjuUPHhpzCYVvxwWXyKSsMzzQsSqmMIizZiIcMmFfFfwWCZbBYycBaAbCXhxoOGgXHcHIzZbWUcCNwlLGgzZOeEwZdDzWiVvwWXEexkKDdrRepYyVXVQkKqTtLlxXzQqZxHhhHaIifFOoaOXxosuzZUuuxYynNXDdmMOKkKkGXyYjJUHhCcLnpPgCtpPTcPpPpEHhYyedDdfFaADbBSsmMaAlQjJjYySYysPCcGgSCxlSsfZGVAaFEefqQuUIiDdRrOrRoEecpYyBlgGLDhHPIicCxmAaMXUuaAuPeECcvVpUgGRmMrLOBbmDsSYyyyzaAPpUTtTtirRkRrryYpPRDEScCnNsebBdDKFfkdKpPOogGivVIIdDuWkKwbBZizzQQqEeqoOLlPYOoaIiiGbBgAahvVpDgGiIcCMmoOmMLliIYqQEeykWwKHjJhytTbBYBqQwSpXiImgGPHhIYZBCcwWtzZLdpPCcRiIACcaRrQucLlCioOIUXBbViIvnpQQydDYhHhHqbBEeqPNKQqKkYykmMtTsmGgMrRkKTaARrcpPbaAjJZCczBkfFKXsSxIidarRAtkzZKTDJNncCjJjCuHjJzZhVcCvjGgsEeSHZmMZeEzzSYdDGgrRORrovVbSGgTtcChQCcMmvVIKkiiIALlrRVvtTasSBfFbEwWeylLlLxXKkpSAwWIiVvaeaxWwXAEYyuUsSPpnNoOsRYyrMmBbhHhHhrHhOoRrRHwiIWHoqQOXlLqQIoOiyYxZqVvhykVvKEeuUhfFHTWxXvVAavmMVSjJqQspPwdUuDhSsqRrFfLldqQDFMmwWqDeEeEVvdSIibBWwsjJQEeqcCQwWpRvCcVrHhNuUkvFqQJjurRUAaaAihHwLEelcLSsPplChcCXxVvTtHjJWIyYfKuFfHLlhGgFfUeEkHhBbKFfktrRWTtwZzgGTXxwWlNnLUuArRamMFftlLTqfFQKzMjJOoaAmZzwWVvaAjbfBRrbfFcYyCsSWwKkKUukoIiOgGOKkRryvWwhHKkVYSsEeouUSmWwYfFgDdGhhHHoCdDNKkOpPoMmCcMIiZzMPpUummTtyYclhHlYyAahFfLKklbBcClzZLHiOQqozZklLyQzZqYaRvgGlLVZsSRNweEeEqTtQrRWrbEeBtkneENJxxXXjdEwWaAfLlEeFLQTtkKhJjyHhYHqSsSxXslqsDdQqSQTtuISRoYIibGgdDnKkxKkmMXfFaKeEkyCWwcYcsjcjJQfFSsKkSYyHHhHGghvTtVhgGXxyYZztOAaoCcHYaAILtTlglLGLmMcCBXxUubYybygGgaAGPEewlLWdzZhHYZzwIiaAUuDJjiRrzZZdAoAaTtUvYnNMaAvVmyTylLYMJjgnNKkiIMNnmKgGkaKSvVssSeEAamMLljJRrpPuVvgGUkMeEnngvVWwGBHWwPNnAaOlLouUhdDcCZPJjpzHvLlVwCcWpHhPpXfFdGgDVvWAOovVLpcCgGAkKtTabBZbBzfFQLPpPNnqQpTtlKkJjquUEeoQqOuUfYyRGgrFAaVqBbzZfHrRtQMRCcrJjxHtdwWkxXPpKDSsRrSsYyTVvJjtTYXxyItQiJMmjAOoJQqKkjzlTZuUztLdEKkeoOREZzerDrRRrZbBROnmMbvVkKMMmmwWQVsSBbKoOJnNyKkaATtFXxfEeRrhHoOFfBbrIoOXLltVvnCcnNNTOobLlQtTOAlLFmTJjkKJaAjVvaACkKmMeEkKnUAUDduXxbBdVZfdDFgGDmMCJCcjmMpPjJYyccCdbBwPppgqGgQYyOjwWaSiIsuUuUMwWcCiLlWwDnjJaAAaXxNHmMFfhcCZztcbbxXjmMAalfFIizGeEViOCcoITtzwWZveEkAavVGHhgRrUEedDUuuIcCFfrRJjimWwMfFJjuUDJjdRrmUUrBbHhHjJhbfMmOomMFBbSsBYhihHIHysShHSsHhbucCgGvcJjBbCcCVanNAbBcRrCMmpPsMLOiIoKuUTtkLllSskKHhmSKksjIiHNnHhhmMeEoOJRcCrhAaKkHfDPpdxDdXzjYymMJZzZFdyYyYoAtTxXXxaOWwOmKkMxahHAKVvksSgeXIRrxxXpPDVSsvyYAbBGIXxomjPPqgGMmLCcISsqQYyfFJYyjLvVvNnADPpFfSsFvDdDdVzYiIJjVvpCcPyYyYsSTpzpdDPZFqQfkTcCiIEJjetTtYvdDXxVKkwUuWXxMmyyYBbDdysSYOoDZnNzDddhwWYyVverRxXnICDdclrOoYxXHOzZoSAGgaycFfCUUuGpslLgtTDdGtTtmMTSHbBlkaTtwWNnCcvVAmFzMQnNrgGRmMqDdWUuwmzGgQjJDdLlqZFfCyYuUqOooOYycCuEeUtfYfFWxXKSsvBbVzjOkKbjfFJThHtkmvVMEaAeeURxXMVDdvmFGsSgfBRrbaSslLPUupXxfFAueEiIGgYFOoDSTFUufQLhzTtLnNnNEebBBblyUuYSzVvWwFfZRdDrMmCRreEcsbeEMmmMmfFoOtLbBLlpLlPIBboeEIidDYyjgCtUuSsTLGgkNnKFMmfwIAaUuTbBtgGiWDqdDrRNrMmRYpdDPrzZtTMNnCrrhcdtTDYyCXxTRCrUuOIXjCcJxiwWgGorRdDrTGgFfKkhHmMPpMesSEKkNnmnNHhtcChHzLlOowWUBwDdWlLJwWgGjoOtTCmHhFrRTtvYyfFAaPpVfOoWwsYySGgLKVvgGbBzZuEHhGgWweSTSoGjJDUvVWwQqwYFaAQHhkxXWUuFfcCeEZcPptlIicoOCGtEeoOuUChHcTgGgzaAZmsMZzmSMUueEiLlVFdDwMmWbJOojrRUAXmMIuUixauOoZzDIOoYfvrRCcEesSbBrovVeDFfbXsSUuKkJcCjxjfastiIwbgGBvVWnDdwHvmMuUaEeAfFVhmMqiImXxMMwdedDEScsSlLKkyBbYCsDQqDvVdmMDdhHJpPfJjrvVKkWwPpRqQdEeDOoqQWwqXxKpPkCcqXxVvQoOtThZwfoJsSnzZlLNjDdqQKkhIxXmMNnlvVwRrWGgLUuWwmMntTYGnNyYgDdyyALlKEeyOoSsgGYSQqskUuFfaAIaOoAQypPYjJCcqpmuUMvPpBoObSPjJjJpNnzZsQwWmMgGMmqNNVviIUudfFCcDOBbETtbzjJlLlQqLTmmMuUMWwtFoOfWuUwzVvZxXkKhyYHYHhchHsSFfRCcrzZZlLmMkgcCGqQKNGdDZAmMaUXxpWwoOPWzZAawusSTgnpPtGgKkjVIivGRlLYrRxCccqQZzqTtQCXgAWPbUuBFsSTrRtKNnkfNHfFHhhsrWweNnyalLAbBmwCqQrRcvOoVWFfPwCFfcWsSYypZZzziIrRczZCioOYYRTFZzCeEcHOohfkmMKDdvVuUEeXgGxEoWtiITbGEaAeEezjUsSNnGDPpddDiIQqpjJzZRrTtTxdDxXsQqSGgGglMmLRrJjLltmMTEevmVUHwWpORcCGvVPFHhfpgrzuUZEeOooPRdcCDoEecKkJXMeEbFJtCPpkKgoMOomUuOSsOoDZzdHyIDdjvVeEpPJRrKGgkpPXnWnNwjJgPRrcPpCcCLhLSslsIiGxZzXgSEdDyYeySTtJHpGgSfDdpJjTHiIhdDJHhHhJjZCcwWTLAavVfFQpbIiwDBDbBdzZbyGgCUTwjUubuUBJUubiIBdCrRBbBxXuUrSsFCyYlVvigGgGuUgXxtBXxNndwWgGfncCyNnUoOCsSMBcZzCsSbPpmBMvJjVmtUmMuvJjVaApPLlyaAWwYSvVsyOophcCimsSrIiRVvwWDdMlrRCqOAaFUYvqQFjJGgdLxXXmMJjtTxKklKkNnhHkBOGzpmCcxGgyUuYzPQqRWwaDwWCzZcbwjJIxnNXiWBnNnNadYyDAFfdYyKqiIQZXjJUQqjwWpQpvDaAeVFfvEdtOoRrFfdDfFenNEPAampfFPmODpqQPdoEebBbBmUuMaAIiTeuKTJjSsEoOeykKlLpPpPDdDdYdUYMmzZhHyyYukrumoOMxXycCYKYyCHhPpcerjJRaAEiIaEeaARaAOSspPokKebKkCiHJwCcWWySSwWpPPpgcCVWwPppPOfaAVvGgFjtTJovNnEbBpPtZzPpQwXxmMrRdDrLVoOzwsSLPpDdlXUvJecCTtxXsScCsIiBbSxXdDEgRAHuUhejJEarVgGvHhWtTzZnNeAadDKkdDEwHaAJjnlLNGgVYFXTPqQtJjTpzqQLlZAaeEtiIGgqLlQaAWKkwABbnNaFfdlKkHhzZLDdMmIiwWVvDHtBbiIoOWweEgGfFkjJKTMmxXGgtTMmaAvTtVpPhrWmMQqJIcLlCOoivUDdMmuSEezqJjQtpPCcpCOoSOMmbBosqNGgJpPjnchcOoeAaZmMpPzpPFfQrvVRqKkWUucfdfFGoUuYCeKXxksSUuKkzZNuUqQTtnEVveEYfLlGmAxdDXpUcCUoPcDdfzZhHFCQgGqjJQqkKpoLZzlOsrRsSOkKYEeDdxXMyYwfFHrRoeQqEHhkhpFlLtTfPHlrRSspPQqrCzqQZwWcCnNfGgcWwxXGlrqQRjJhRJUuYNnyuUixXjxUuXJmpMeEWXEesSXxaEOoVOiIomrVvAaRMUuDVnGiSsUusJjOoEZzeqQSVmMtmWEeZsSzwaAMHdDwWaDWwfVfFpPvfFliILNAeEeEJjYYhHyKkanNAGKxXLlhiyYixAapqQPXCmAalbBLLHhlCSqQqQzZscNnYHhSamjTtbBZzsIkwWKiSdDgFfRrciOxeMmOoFfEQqdVvbdDcCTqQtpPoklLfUusXxPpNaeqQyYAzuLQqtTqWwiCcIxXiwWzUuzqSsDFLjJTtrRzfWwzZFZlJuUYytTjJjpPRrSsrRNoUuGgqQWwuUlLxnNXPprJjybBmRrMYGgqQPOlXxDdmMDAaSaAYeFfphHPYluHhULlLjJMmXvCcmMlzZLhHuUBbfFjJCrRkKcYyxXLlUNnBEefFbDdhHumOoMlpPtjmnNNhHnPkLeEdDlfrRdPqQYyvVRbiBbVvdSOoYsSbBxXxkcCGMmmPtTpNnZwWyYaDdAhTtlHhAaODdoiILHMmzSGCKuUkPXxtDgGoLpcUuvPiRfPpcCFXdFfpkcCcCjJKLvVlrzZkKtdDHhcCKZJjzkkXQqxgGGglLLUGguWwALIihHKkKJuGkeErDuUdPpatTpPAATvVnNvVtaZhHzVGMmKKkeuTOotQqtHhbBgGKXxkTmaKQkWWwwGgHEeIiIkKiBAaYybBAkMmCdDTYyTtLlLlqQMIBUWXxgQRrqPpnAcCmxefFyeLlEuUAakwEebBVvOoWYyrgODnzmLJjEKNdEeDnNnbmZzMBbZzkyYKRrZknLkKXjTtqYgkmMKGtIcCifFTtBGgsSTtwHEekKiSFfagBHhLlbNWyYDwfFWYwWcCccKoOPvVrRHhkfuoOUbUNPpPpQqeEiILlnusfFSGgeEzZBPpFKpmsOoSuULlMKiIkgPkgRuCnOfFoGePpERrervxXVRJjsSTtCchTtHNlLnvkPpKVanSsXVlsSLvARrRrgGVvZUuztlKHhiIOokNnnNLLwaoJjOATtNOoPpTtbBXVvuUSsBwWYyrSSsxEYRIiIiSsrRslLxXVvoOSYsMlLmSbBCckgGpPEezmaaIilLAYyjJYCoOOLlnlLliqQJeEqQQqEeUvVuIvVdiIXOLrQqkKFwYySrTtRsbOaABfFboBRuUQfFhHWOKoOrRoyLldvSsVyCDvVdrRVvjGgGgJcNbBSsXnNhHczZCYPprXVKLlOohhbetTvVEqrRtTQSUuxXsJjSdDsLxXBbaoOmkKigJjGgbpPIKoOwQqWHhnNkaldDIBbhLCclHiXPHLlhRFUWxXZzteNnEtTpeAaTMmWSsSsgmMEmMGgZcXIjJBDBbkKjzZKIilLkJUuGWrRJqQKqCDSsdrXxRYyTdDmrnNRMgaAnNrjJRqeXyYSKQqkHhoOFfVvFxXftKZziYbByzwWSsZhCCIiPwxZzdsRhlrRmMLpIibFTtfegoOGEZorMmRFfMjJuUXxvRYyrVzZGgKkjDnbvVPpzZtTdDBbBxXixXRrkLCyYMREEegnSsPXxPpQqpWqEegGQUmMEdpRrNnsSPCcmMMmYyWUOojJjJujJIikKoCcgGOYorROxXboBpPbOFfeEcDeSqQpPLljJshHyzZGiTTtLAItJVvDVvtTtNnTZYWwCcyzlLdvXIibjJHhBtsSmMTUHaAhuCnNqsPZdDmMbQZzIiIRryivaAHxkvVIeqQYpPmyiILlKEekseESXxYZzMfQYyuWwFqQTypDdwWPMmsShHYtQSsqlLvVSsXAaxXYyOovVnUuNnnNNHULkvQqkmMXeEZgGrREnNeXxMmenNiIluwpWweExXIiPAaxXRrQqmMWwTpPleCcnNEefkejJctTQRbJsXKkFYyfBFfGVvWCUZbvVnNBFaqDmiIMnrRNQBbqgJLKLWWvVlxnNYlhHLfFpJjxeMmePpghHKkqQEeGFfEEXdDPJjCMmcKkuUjJNdrRfdDSsnNFHhutIyJmMEeBbLIilfKOlpPLlfKJjmMSspPjCcJHmoPpDdmwISOEGuUuvVYIiBSWwsRxXrbBbQeLcCCclSARMmrZUSsDvVEuUANLlntTaeRNnyyYMKcCoWwxXKMCGgKrCOoYyHtYyfFxRrXNnrRTRNnocCOLlbqWwZzVvJlufFRrAaaAIFseeEvVTjJTbAaBZWwLzZlzYAXxTqQtbBamgtTMmhHcCUTtqGgtCetXlwWDNkZznNSsoOKkbMHhAbzZxQqrqXYbBeEyxxzZXscXMhHksLlMmSKmKBbkdDxtTviIxXYazPpZASzZbIDPpdgqlLTKkteExXQIVvcCySudqQWTpeeKyzZTtiTtBbCciIAaDdxXJIiExXejNXxCZzkKqQEeddDDEetbBrRdiopPIGcbAjJaaABsnNKkfhGgATvOzKLlkgGkYEeGtTRrwWgQqEXuwKJWAawgmMceEwWqFftTmMfQqqQoOmMIiZzczArRtHhQjJgGqTmOoMnNPWQqhHdDwdDpYyYLlvVRCoOtTonNhEeHxqQgAaGXOZhHzZzJVvjUQquQPKkNDfFdRreaAtdzZaAQWXiPpIxwzPzZjJIKkXxVcmMHsSNnleELYyjCcCpPchNBOeCcEmBLlNHhnXfUmMkKCuUcIWZzwhHlQqjQTtTIdlLWujJbByacCAUurRrRtUykKeHhHhEYtaWwWZIiBDdzlLGgTuUGraAXxKgUuGiIxSmTtaWwPvVjJpwvkKZSjfFWTbBtUFbBfyEsMkIioODpajhOoHraAfLIluMmlWpfFPQqwWDdsxXmMtTSwLHyuUYPnNRrphUrfnkUeEGvUYXNWfFwvVMiImnnIidDfEJUujECQqYyLlQqxzldoOpPMmmnNPMmmMqQMtjVvJnNYUuyJCDdKkDBZzbuUdcLlzZtTTawQqjuHRrfBZDdFSMmORfFBbAalrRsnyYNwxwVUuZhwmMtcCUpuUPuQqTRGgnbWUuwBDdGgHPpjeTgGcCfwjWwTtcFfqQTsStMmUuZtTzuUMouUokKOssSSvSfdbrKsSnNhYXVvYywWeExyvVBZtYyUuTcCFfGgLlPbBYKqFfRxXOMmHhooOEIYxXyiMeWwCWwnZePjJpUuNnPXxsSKkprRRMmdpPcvjJrRPpKOoTtBHlLzZhUvVuFfvVpqVadVvCcPpdjJXxQqNntIiTDWHhtTlNnLljIAaRofFIPNKknvHhVMmxXpipyYsxxXXSXxFWwfPhHpwWfFPgfKkFrbBRXxGqQaAOkSWTlogGVQtTRHUoONnuALKkNEZAByYlLbzAaJnWwYyaEXxfFjJVTtFfbBGgtBknMmFfNKbBDdKJjxTdnPLBxXVOPJlUuLZPSiIspQNxRsiISfFxRrnkyYVYynvVDKkztkbUKZzoORwElLeqEeBbcCiIQWrAmEeBbtsFaACcVvQqrOoRrSgGsHhPJtTIijbYNnyYkvoOQqmOMmJLeEKBbcCSsUcCqTGEnGXfmxXIbYzZEeyBRIubHhqdnKNsSuSsFfaAtTgGypEetThHvgYVvyvVwGgWGRrvVpPOWoOwOoWHlQRxXVvBeFftTKkEeEYmMTtZzYyWdDrYyRjJwvQmGswWDrbHhptgGbBpQDOBJMmoyOqyYWwauYyjJhHdfdtFfMmLOtTgGXqQxdDzZOoxiIFVavVBboOdYyDCAacCnNqQTBaIiKkAbrLlZkKOoAUqQNCBxGyivVDTtNnmMRiIHvVhaAexZzXEiGgDCtqbByWfrdYvblCcxfEeFXTJggGTVvkuUIiMkSLppPMmoDdOMswldDSoaIBbpPraAdKhHRaAAaxXlLghHfFLCWwgGVRrlqhQqWLIibBbBlUupPHPpTMmthwHVjJctYaAoOiAaAmpDKFfUVhjFRrtTjJzZayYAfEerRpPFphHtrXkKGcOoBbEpPeVvCgxMzCQqcjrRCvoUEiIYyASAaZjJzevVEAHhOosSGsSBDNnqQnAUuUgxKoOQZzBlLbqiIbBkzZnNnNHZzQlLlpPkEDnNgmukKKActfnwWQqeSGgsbfoOgGyoEemqhEeALlAaDnDkqQqQxAapQqsSRrFKkfPfOgGpUuPDhyYuUHdAjPpJtTkKKqQkAwWMoOQYymKkQqvwYWwaAqeEqHhHYCcCOocCKkbsPoeDKkjRbFZjJzfjFfLlcgOoJjYiPWwJKtiITVeuUEvrzESEesOooKXSsxBbkKCcBDdvVxOomoOMXVvmMHhtTPktVfAaFQqCJjHhHImYyTtEeMJjfpPVvdWXBbxwDiIHNrLClLqXxmMmMMmjJQclnqQNbBmqBbyYpwWRdZUuhaAmMoOHzmPSzqruUaMvsSWwVZzuUWUuwvqBPpvrlLRVwjJNOSsZzUuonZxeAabBGXxbBgbBBbbBxXbkKBmMwvVsStTtLlTcCooOOaAgGXQXhHtrnawHfrXHXNamoOmqmLZCRWzZwTTBaAjJARpSsPrExXPTtvVzWwifPhoIoOicpPxLlXCZzyYwWhHfFOSaxVvlKAaZclLNnrRDuUddDqsjPwhHxXOrRodDGavVLCNnwWXxZzjMZzPpTyYRrzbWwHhWwGxakKAhhAXxVQovVPpcCOJPyYpvFVvfVcsHMPabBmOWxXxrAavVIIjJbUnNuIiBixXLmMHmMhHSEMKsAzZadDAadDXQnNSsnNeiMmjJIcHnldiCpPPpMVBASsDGgVvTPETJAamMkEkszNNnDvVrsmMSRdEKkeNfFxtgYYGRrxDgKHWwsKTXtmMTOPpvVRyKkMmboOodDORtJjTrAaqQQmYxlLRurRPBCcPpUJjuEjJKkWwCuXxlotNHeCcCcpiIPpfPHhpcRgEiIQtKkoOEeOojJbBedIfFvVEkiISxXmgGEeoOMDeEiIyYEeBeZzEMfKktAlCjDOHhrJcdbwSsZTebBEtAgmMdDvVgGdDGSsYyaLlIXQqZftTFzFfzCaATUuqiIAJrRjaQtmkiyNnPUupwiIWeEzXsSJhWwRRyxXMmYPpngGjsVKjUEeAajJXOoQqhorROEaCcAeyDpSXIitTfFeUuoJXjJwFAanNQqfGgFGcCiIpTtqKkDdVvFzZeZAazcCqQakKAQNeEAXzPpAYsSRDtFfTVvXjxSsIiEQqeETbBshHJjGgdDJxKYSswjJdpvVVvkKCZNMLrRjYJRdMmJrRjHhMFfPgZEZOoyfxzZXFUusSyYOrUnNuSbBnRrUullLLSfzYJIAaiCCciLloTNntdzSdHhOoCFBgGSPHRwWZzeErqQayzZYAyYWwzuoOUDSjUuOomfFfMmZWpPrItTVviqsDdQxXewsdDSRrxBmMbwWWXxnNoPIVzZRrJkPpKFfHhpAmOyYkKxXBCcbIvVioMxXPpeYMshHzZJjjJeDdIiuUtvtFnRnNCcrdCWGuuUwnNDuuCcUeanNhHuIUuIVvjJCcnzZNCZKoOnrFfcqBFfbBXxRUiIcCuhwhVjJvBetTEbeuUuRdDrUaqQAOehHccmCaAYhHyspPSYJjRLEeSsNnOsSOxQjJnUudPpTzZmMTtpbMmWwBMeDdCcKavBbBNVxXFfBfFbvUunbfsiehHbhHpPhMdDnzXoOgGCcwWPphHOpgvVHhvVHCJWDLlrRyEeUuEcfwtwWFkKxVveEDdAzZagGXWwqQFnTPptAawWrpUuBbUmsSeEookKQDdqwWOOVdXXxxDtzGgkCckKoUDrRdMmiMmfFmMgzZGoOPNnzMnNmZpgGIfOoeDRxXrKkDeEdNnNqQzOIFffXyVWKkJULqQrRKcCwWBbkNqnjkqMtohhHmMzZDdHwzCcavVUpuiIHkRzpPPqQpJjJmuUnPyYmMJQqjDCLxoMmOURqyYSQqUgUnRJBBqSsKkFxXoOvpPmMFCcSdDIisJWeaApKRcHhFFfphHPFKkfZfFKCSsJrDdEXkyEejeEJrRGmFjYyjJzZgGNnUuRrMUumzOoZBbWwqQVRrvEAQqDmbBEQqCdDbRaPpAPpUbqfFQqrDdDDdTDdwKQwPxXsZercCwSqQVyWwHxXhzpPZEeHNnCcHhLlHgGhzZbLlFhHpPurRGVcXxKkCqQvBlnNLPFfYyGgLlEPpaAaAJQoRrOqxXAajeXVRrvDwRrKQUuqWwkgHsjVvfMWxeVMUSsNnqQFfiIrRMYyXxxvVZuttTyYvdhHuWEepBAabyqjQNXhZzHODdoqaAKihHAaXJBWJJjjOoeKCxTiIrJSYTtgGpSrRIEwWyYeZlLzdDyUsSudHdDhNnOjpJjPqXaANXxngNnSsGJjAmuUMIUewiJaCcBFfZaTtAQRrqnNAmjJPpPJcCWwBEKNRAazZiYNnyJJqSCuRdbBWwsSwWZzNnFfwadGCcihPpuTNBbRrnbBORrTtLYJjDRhHeErRzQqZNniYyTyYtALWwlamMmMjQqJjRMFdlNDZsQKkZzAaMmsSzZCcITtTSwWtTseXlsSmVvjeyEtFRZmMVvlLesuNnFiISgGPwWpJHhvVYGgEeyOopIiHXpPxhaHhPJtrmiBbRvVrRpPwLpWnNZXzswbAaARraqUAaAqiIIqzKFzSaAsgGooLpZLlVvUqfFQsiTGVrAjIiDdJwCcnaAgGQGKkDdzcCeEZCrRhHMmcdvTtJUcNnagGdoOIpmYMmbfLLwOoevVEWOqeETdKkDtktDKeraABIirRkWwKKBXxbbBjJgGipPiIIkrzQKcQqetTmlLJjPpxXaAAbpPdWxnndAsSxGXxgfWwUfEMmePxpbPuUZjuUhnRjlcCLUKGuyPDDkkXQwwWShDkKdHslJCXxpmmXsxXMGOsvVqBsSZzjMmiIDdrRwNSCNYAEeLyYmoCyXgGJjxYeCjTPWAdXcCsjJJWwMFZzIjgWakKXxoVVvIiNDbBnFCtKkTvjRGiVkpPKocdDuQRdDqQBtxwWIivOoTARratVqCmqQmMMcyYfkZzSsdwWlnVvNKkwqLlaimFrRGgfeEcMDPXxKoWwNgGcMmAZzaaCyiOuUulDfFdCczZLrFffFhDorYyRrhPUeNnGjJJvikRJLnNnNPnXxXAnjwotzsHhrRJhNGgjrRMmJzBbsSoPOpPatdXxUmxvVXLmMlxXxaeEILZYxEJgBRrqaAStnHLohHYPpxAaRrVyEPpetijJyByYNOotToAanNMdDKgaATbBEoDEuUszZJjSzwgGBQWwyYZZcxbemMiIYyLHhIsSSaJYyjUuWXZzOoxaASsBjsScCyhHRFNFfnJKgOhHNvCcgSteebwonyPSGidDYTAalLPAaBiIiqwwWuUWwDCkKFDmMDdXZQqXlLXLlxMFwQqVlLEedDdMhjMtKvVqQXXxNnWWnjJsSSyYUZZaNTIbFCzptyZzVvyYcPpYdUeUuEuFfDnLwiInNWuxXYFfyOxXocClLkNnTODRCHQqprRPhcUfFHUuUQgGCoDdutGfFgnnUuhRIGwWpPgqvNnvToOQlExXeTIgGRrtiuGjcfYgVsjiInNykVvgLUUYbSsBsbHtTccXxZlcgbEemGgQqzDdPpyVxTtggjJWXxzZlVzPOcCoaEvVSsCGNRrZzPYqQWHeEhRrwpncUHbIitDdFfHhqQTdFfwTtsUvhHbPpcaAueLUJUbSNnIJZWwCcXeOoEkkKULPplXUDSsFMQLtPCLlgRrkKfAaXxtTFXxgmMgGgxXqcCuXxkNZTOwWolQqtTBbBJayXtJOOowWqQyhtTWOoOofFLcCzHhpBbvWwHhlhShHeORVerywWYVpYIBNnQSsdDYXEmMJtNnTJAcZnDbBisSPHMmhvWEtTePpcCoOKkuUKkuUslLNXLlpIEeiFgvqvVYyhuRrYyOtTgGQqIJlUpfdQlnNaKuoOaAEKkRZgoVpPOoeBboOAazDdZwJCgPWwvFfFciInUAaCcQqQqjXxXTWpGwWgPwtiJyzgGlLZEMmaAevhWQskKaySlWQqDObPZzpYUuyHnNOCcohDwWdYNomzjzZZjOWwwVWwxojJOXunNUvrUVvumMBbGRrnjHhJNwWIicUjmMKUuQIjJBnNhAaEVYbbXxpPBBLlQtTeKkESyxXoOFyWlcCZzkgSsNmzZMntAaKxSsPbBpeEXrRRWwrrzUuZlkKxXvVLcDYLlPIihHpYyyYAWTtDRrdDxlZVvZzTUIGHMFfBbmdDbBeEsrrpFfAaGunsIxdDJgLlPmBNnYyHLTwZPpuUigiMqQTttTmAahHJlLvVSZeGgvhAUwgGBDdNCfmMcCOoXDEePpIARraFkCxXcgGtTApuWwSBbosaAeEOojZzJFfmRbBZDDzgCcTCwEJomZzMONWLvkxeYmUHhGGghPwbFOohLzPpZeErLXqQxmSsTROzYpxiIXwrRpUewlBbLyfUuFBbjNYnNkPhmMfFZMmzYyvyLUtPuBYcbBCYmkKwOmMyYtToIHpPaAhiEebBOoIAmNpHsiYgRrkivxiNnRKfFPrvVFFjJjJffbrQqgGcLlYFaNDWwdOojJywWwjJxXvcCdDwHhbxODvAyYnqHYOowefFNLlnUUZuYaomMxxHGumMbuUoUuBkpPvuHCXxCcwWcjJhBvICaexjqQJiIlLMdDDnNdsSuUgGJkTKNlndDNeEZnRePoOpGLaAVJHvRjcCCGVvUNUOGKTlLsCytTYcLzZExFhHWesjJSshHvdyicCsVElTEYNzVEeytPpPpGrjWjKpPbBCGgGuEerzZzZRUfdDrRuoavztPJjNcCnsZiKDHhsLlKjJkjhLamrTtSLzwxqQRrXnpnNJgGjSXsSDdsSuULlxHhfFiMmqQqirabnnPFmMaAmMzZOonNdVqEFuUCAaAobBhdxXDaAtaARnNrXxTzbBZnnRKHgKktTGhcEeWshWpMmAaXEjCcJRriCuFIHhaDdjJeApPCdTwLybMmWYrRwpPWQIkXxOodZzDKcNnJXxjGgrXoOtyWwYftfTrRaVFNnZxXzaAcnjcCJWTtWoOwwmZGYyggRszZzmHUfsWIiSeERxTtSeqUuhXxMinjbONnSuLaAlQqkBRpBaOgnQprRPTtIeEtTbzaAnAafFJfFUcCuRlLueGgljQBBbByCaAcYLloOCdUAMmKsNCpPQXiIsiWwIHloOLRMmVtjJGiIgazaAZMLOowcELimMIhbBolFLXxliIHrAaRjcIHeQqUuMFfiIiLyZlXaAzZTkPpKTtyHHOOwbBNgBmMbGbKAoUOZzoxNOnvVPqQoOoOJntTZLYNSsnyjjiISdVSsvvVVVTgROorGuVvUHlKcSvGgxvkKVQgKkGEZFfcCGWTgGEmtTxXaxmMXtlLYyXxIcUAGgQVOobmeDSvDXxdXeQAPUuKkIvYwWIbPrRKkDdZTZztUupEegoVtKkASsoFQqFeQlXguUKjrmKoOkIaAiMmeLTtlUuVvWsSmJoOjXYJVVvLHhEYfXMgiDnONGLsSYCUucEsCrrzkuUAkxXRuUwtaVvmMAcCCVnzZKkKROKkoysxghHJBbuQqqQtDWOIiqFfviAPzZLfmKkMJjotPdDRrMuUmCMFGDdvfAKkPpqZjJzQIZiPpqqhHCiJvVWnNTgNnJjDdHvlLVbQveRrCcGMOoHZzBboxXBbBbOxquUQMVgdcvZFrRfYsyOopPBbpPYOCYNtAycmMoRrOSyYdYZxqtAeZBnIiHXxStaAgGpoOFvNlHSgznNKSsFfwedDRNnqcCZzZzEnNxXPpOPUTJiJcCoEeJkAaoOKjCYykKVNuAaWwuUweZUNTUiFfzZXxhHsSSZzNnbIiTEsSePplKzZkqQWwfqPpTuUtRBUMwaAPpQdDjJqEnhapFfRThHkKfkNlOoKksulHhOEzayYjuYyGJjebxNlGtHQqGaAmaAMbOzZjZzVvsSyYIcCigFtAoONkKHhXKkoOUFXjmvVcCydDvmMfFzFfMWffFFyYxJjEilrYyRcNnUvxzxNaAKtGggGlNnTLGgSkaAGmMdDgVrRMmcCUJjwGgovfgcoQbgeHhETCLjVvlLeGgGfFVvoHhNnKHktcCTKhAaYyDdGlJOVUuoOeEvZzoturRUnNjesSErRJXkyoLIizbBZYyHSmMaGaQmMiNlLlyJhhhHCcMlLDoOdejJCcRrNXxRmMBbnuWwmMUUufMveEDwWqwuMuUnNmUrRrWHhHhGZVjgSgKwneENWgGMePOWnzWjEGbBFALuUOpvVvGgKkQqgSQqsYHhuqfAzndHzZizfoTeBbWwyYEAjCJjjJcJZzCcTtOmRtgiFHyYlLcyMUyYuoIUKqwcuzZxsAQqiPdBwWoLkKZcCgvItTinqQSErmITafahHfoOFhIMdOnfFNQXxHEehqAuUKeVkKXxCDwsSorMqnNQcsSCHhrtToUuORuTdDeWraxZzXjqQTtXEexsSEeaAHBdBEebafryYOeEoEECceJrFmMLIillISeNNntWKQARohHfJFLlHhfjJjTwWLlLldLBVvllzZdDifQCLliKycCTtYknXBbGhHlnNLBbjKkIiFBbfRraAMrzqcLVEOPaCTgGqQDTvVLltcApMdLbBltTrDnFfUuNtfFSnPpjXxZzXrCexXdQLlMXxTPaAleiOoIKkMmkSsDcsaAHhhHxZvaAbGgsvQqQqtDdcCXHCVvrPpHYyuzZbBUhmMbuwNnzfFRPSsuFWwhogGOwAbmlSGgsiIOqfFQqpPQFGrRWdBxNJELuULlQnrtHPpdDhTRvNYqQqQzTfPZzYQqynNuUvJirbmaACcdhquzooIiREeyYqDvVsDdicCcCGgISdQrcCvMCchbBFfTDVJJXyYxRrUuxxttTVPpIintaVvaQqAZzZUuwWwVBQqyfRvcvVuXoKAMGsbQBQqNEQcFsMQRgoLLwOoQqIiIixXQXqmmMMyvRnbYifeKuURbBDEOdHEeWsTQSsVtTdyRIiBvdyYFkKXTQBbdZLlzaQqTtmMAqqWYyQvSwsuYQqSFLuiqzsnNSAavVtnkKHbBTtcCgGvVjgezZErRlLeqwbBcyYTxIhHijTtTtwWAhHFftUxgCHBDsSOseEYyTtSlXdVkqxBCcUgGdDKkPpNyYNuYhUeEhHfLdoODNnKqwWQSskVvZVvxgTkmUuMxDvYGgXxxPOPEQqiniNRrjJkKSsMaxDRKiIjJXDeESTndmgGdDCUyAaxXbBTtGnNZssSbJCGhdLlOojJYFtTaAGpCOomhpPdDXrRxHnFCpJjPZJVFfvrlLtZRrznTJZzjIxupYJjyPWtTQqwUuXxPYyshVEYcFOQDdZeEtanNGgmMEiIeAcdwJjWNShXUQqdtcpRgGOoAaTtrbKqQkCJoEeJjOwWtNMGPaATUQquwWAIiaPflGjzZJQuUPyXxYYWKHWXhmfFpPMHWmsuMmRrIadjJDGkePYExXFQqasFiIaAdiAQGCcgqaeAbTXkxxXvVJVvmqbBKdAVrZHAUuavVujXfpPFIZuWwaJpxNkKnEeXOovVPFfHZyYKazmsDbhHNAtUPuUpGhHXAatQYiIvOorijyYBbFfLtpyzyYZJebyUYUktTnQhHhHHhrhlLrRWyzVvZtTtfLVSYyVMnNDXnCMhrOoOocCRRbbBivJjVIWwoLvwaviIBZxCMPdLlNEMsgSXzOhxIHOoCRrchoDGgGTXxjJYTVOobBZsStWPqDiIWwCcKYRfRrgtJfFVviIYtQICfdaCcCFAawWIimMoGgHhuoFOnofIiSsrSdDsgzZloOsqYSRSMmXWwYQqysgGLMmfQGYyHVvhxDdzRFZzfpwXyYKBbdzJvFnXxoiZBZvVBdsSDbzRxDFMmpHlzZfFpPUudtTbrRlLWwYysOwtlRpPcJjCryGUuQeZyWDrYySXpseEnpVdbBSZzCFfCccxwQeEsYRNntTrFFNALXxAZzPyYtEyYdkKDhncCWXxwTtkwFVEiNQctWoZzvPMmfFNnFKmDMnAXxazXQqjecCwaAaIFfTWNqQmUNGfFbndgMYyeEblmFIaQqJjkKpkKobBbYRrWwnNesSpjJAYgcHrWUuwFZWwuBLEePHhHUWwGuBbDdMmUWwJMmuLRnNhxZHhxvVXFfzksKkNnwMCDDgGYyUGhHbBPpEDkptOmDHYyDdSsocCvVnNtAEEeMHtXxuUAGAdIXGgxXxnHhfWweGmMgXKjtQqLlTsSrgGKkdDXxtHhjRVooEeqLrcifzZKbiZADxgNDJWLHXMnmXxMdDyYgCsuUSJvinsSXuUSodvEiPpIebULltYyDdyYumUAaYmMnHaIBbAsSgXNJmMjnaArRHIVfFcLleECPthZDhAaGZHQtbEeHZHhMysSSaAsaAhHcKkVAaTepwWQqPhPWwuUDLbnYjIgqGgVsCvidlQpBaAepUFfbBuvihgGiiIrRQKqTpxQNnNzOaABbNJPziFdIqpgMQqyYyRrkkKtuiIoOthjJHTYBUusIiwpPKxvVzZoNZzBPpbPpCVvPdDASXDdCLVvtnNOoQqiygGYDhHKPdDpbBQqPKkbyYcjJKkAaZzAyNnymNOkKozpPaJRrAiRrBZzgEsSiCpCcWhgMzaAUSUiDGgcCgGnoaADIHhvySVbRHsAKhylLYRkeFGgVoNnPeEnNgclNnCcPXxvjuovsLjJdLKCcyYLyxXMmAasfFpPcCAgkdqKkQHhQeNFdDfyoHhOrItxhHUOoKxzBbTtbihCcBNIoJjOoOLChHEejSskQDSPqfWwGgKUaAIiDiGhGFQmMFfYyDhOTNntpPYySVLOHhsOTlESrRKksevVdIipPgtkQqgcCTUutuEeUsxtedDgFbZJwLKklrRsPRrPKTxuzluEeUHSLlPpRcmMwGxXgUlttMHCilhyCGuUtIiTGgCBbgGcbljFJriIuURjJJjtbSivVLsSrMmozyYyVvlOoGcQpeGniNNnNnOsGpPgIIVvaIAfigGIRsodDIwKkKFfpqQKkbnkKGgthcCHjJHTthxFmMnNfUtTYbkTtYXeKkyOUbxLdetTzZLtWwZzTlEecPpCiIYyivDdEeFKPpKkVXgkKmYAKCQQdgcWhAawWHYwWKkftgHqQhqslVCVrbZOBWGEoCzZvhqwBLDWwWBmzPpZJTHcCIeCPpjJcSpEAqQRFhCrnFNnOodtSsFlEeBYyUUaHhJKMmsSkbEsCcrszQqnceEknkbBNnkJdWwwPyYIiVQqwWUuBVvzalqvNgGnVMmotxytTQXOuyWLlmARJjZzkXVvPEuUesGlNVkderejHkPNDPofeEFOCcChZEQIIbGwWwegoSwFfTtFOoPTcCdDXoAUqQbTtBhWcIxXhHdyuhHOqeTtMmRrEQSsqtTMmImpmMiIZzEeIXhJjHhqQkKDFmiIMfwJjTChoEYGmJCcCXhAJCcEKvzFUAwWcWEzZzNnwpnNeEmQqUmTPCcpRLeTttlkqYlIlibFaAjJnNErzeuUBURrgSmyxbbieEHhVvYyosujKkdWBzPlIPpXinmxFfUTUtPpuUqSrRsZjUwWlGoOJjoOeoOVMEeDVjQqFIFljTJhdqkEeJdDPpKVjyoeFfgxNIiMXiixtiIGfFgPpfFfFozJjiUoOypcBXZKYIiXfFNpPnTuUtfbaHhDEoZxIICQJwXdgkqQhNceEDdWwgQTtQjngyYGSOGgTFByWUTzmmRWDIfCuUcAcFIidDhHfOoRRrSZejSIijJwIidfFDqQraAniVaLxMmalLwKujJUtVfECxjKiIPKWoFRrisXkvVPpiOAaonduQuuUFxDmMdXUDhLuFuGYNkKnAYqSCzZnkMZnSRjOibBdZoDdvVlzmxXeEytTzOGWOcwHrFfLwvZzrJeTnQGyoJnAXUqPGwEpPrRjkKJePpEfGgFeghhoUuOHUXLQmROsdHPeEpiBHWwhFfcCKkFXxifdQqiIMLlLbvntXxordOawCiqQnslkbjtTWTJiGOofOoBbiVgRKZHPphIietrZHkYuuPGgeydsqQrWlLARcONxflSGgsXuJiIjQqlaUmMdSLcSsClAaTtjbOFTBSmfgjJWhHhCcOoojGgrjJNgGUqQunDtTTvMeVTtvEmgGWXxAaryRrYQBcyfFmbBMMAamYEQjrDsDspPSkmMKdDkJjCFfAwgMPBebtMdDvKNmxlZEaZGgtEaZzAVvYYmMGgNnKytiuqcTtQWFmoYVgpPSswWHpYyaOMmtZzDNbBndjJHDuUwWkmabWwBmLJGfqQFTxCoPYsSMbrRTOMZcUeETyUHRGhiItDdTKalLAGIijJLlYyDVrRqOoQvgmMEeRhHPQnDvVdNfUjmEeJjzxROoqkFthJjgFfiIuQGrzZlyYqQLqQTsCcSwoAShHVvbvVRVqvgGNKENavliDzNncOoKNnQhxsYaRQqlkJyrOFfotsqQSZDIdxrwWwOZPBfFGasxilLCeUUdDqhlEIPfxXNgQNnqOsaASoGnFIZzipiEeeLHQuuEcIXSrRsSAgxXbpkKzFfoWRXbBNnDidzZmMzTRYjKLrAySXHqkOyYMPpmotufJTHhcSsCtYyjFUkKTCZdILDdVAneknVtTQvrBsaOWjJMmtGgRgqUGHTfKQrXZMJuFtTOAaoqpxXMmrGdOoHdDheEgkDdxXHgrPpJWwjhuYPRJjrptuCzuxXUmotBmypOcXtNRrzZuUngjlMsNNnnSAMTtKuUdhToAPhIiGGgEevyOMfwqCQUITLlYkyYyyCcIikKvVgGzbBKkqQZFFfGgfeWfFRrwTzAezLXMnkVLlmfhHZzlLFRrTBQqEbpmGWkKauUcpPKFfZzdSoOdRJqeCJjbqRwVtdRJOvVeECcHhFfdDHwGFwWtTMsbuUtqQfoBJsDuALVvQsYWwySqUxLFXSsnokKCrafzZFwRSDYEpUUyKhzRTENKkncCzVvkrGvIBMmdDXxlyYLbFaAgIjtwIkKiJBKLSNIrRcTQqtWnTtNACconNDPNnpROTNyYVBlmDFIIifyYbIhDSorMqlxuHGgMmGdDWNEengpQuxaWwNjOYgqNtEDIidSsjRVWlRrRhWCowgoZUuYMZLKkHhVvPpOJjzDlLIoXxJGgrxXsNzmKNcCcsQLlZzyaBbqQygUfeEUlHdtTuwNnWfUqpPUDNIUyYuKxOoLNnlSIfOwkdDpkEeJXIiceFvTkWAxCcXIrRytTYibGbcCBiIkPpKgBXlAvINRVvWJjszZEeJfFEzsrCaFiTtdwrMMjJZtFfuwYbftAfnNFaosNJqqGqQCnHKGuSjJsUuWwUDxWjqciiXsnNyYSzOedukKuUUHhABIiFxykzyeEYxbCPmMsSYuIZHhaAObBwUuWrRyYdDTrRXIIxmnXGEHhadDANIinOYJvZzkjKQJjFeSsETtfiQqIDHjtJLfihHpPQqzGKkghHZfJvCcdmvEbBgLfFuFfJzdDQIiHeEBbhVgGvTutuFPjJpfXMNIxiLpPpZbwDJqQUSAaOMzZkKmKkYydDHhWwIznNZBBXYMrRsGubSsSsNnEZRenNVvfBILiLyQHYyiIhKQqLTjJElrtMLMmluHhMUbBQquzZPWZewCaufGgZVcCkejaHxcIijMGgTtgyeWwOHctWvRrVdHfFxiyYPMiQiIoUYDqaxXHhAuUQhSsHiCwHuaOxtpfWoOsOCcGEnJjNWgBiisSqezHcbBlLopnNNnPOpdnpKxXhJERcCEDKvniILgSpeExKIiraUuNnMZzwYUDdoxBbqyYiIzzZZYXyZzSsYTOYyQLAZbuUEeQtTqvpWDjRrKKNKCNZSyYRSMmeBjVvAjJbAaBuOoubLfTDfNRcHfraecCPstYymMTEbBicCGghtenNHhEjXxcCMCcbwdfFtTTBbtlbWQKkHmMVQqcOeKkgwMmbNOonozKkBRvDdcCcvLSQGTFyMmwZzCGDqSsqckauUyMGwWWwOoxbBvwWkKkfVkKItxXTEDlXBuUEetTuosSYExyKByuFfXfFvVTGgNBPmMkWiOSrFfFadNnDiAVviiIiSoCcnOoINKkgvVgGEPqCgLYuUsSZORXxYyxXlwWIMmsBTJjCcjfoOEeJLBjJgcYnNHcCLIchmTUuTvVLuGgWyYezZETtCmMrAasUuhLZYyUXtkpuqQNnGgUpSWjzBGgGgfaAGuUETmMXSjJRrUuGHhRERrerFIifKTmMAaRrGbBDLtoSolvZzsPpoHdRMmriIYymMEeqfgHcCgjJIdgGukGgFQpsdqKJclineEbHILCclBZLlXkOouXvVTiRxXYSNnsnEqDKGaSirREezZAaIGgoOoOcCGgYlVvYykOeEolDbBlSVOmMUJVkKSspLCGpOvDdfEKrHkaSVvhraZzABvqQsFRqQrfYVKkidONCEecoOdIusJjuZmGHxxXXOonNRrwPtUuTcIeGbIajARrdjJFfDDdBbjJZnEeIiRrMIiYYYyaPpCBprRVvkiIdInNZzTFflcaAxsGNngapVaAvclLnoXxXxOOqsSvVQvVUuXkWSbyJDdjUTtTZkKzyYxXLlKYMmmGQqiIPQiDfIZpEejnTtoOoOouUZnqXPtKqQkQwWkqImMHYyLlJjIVPEbPqLDIVcSvQGilkKLJeDdGgEyNEeBldqQpHEthYXxyHvCZzKkYmtdDTzhBTqhzgEeHdzKkHtTTpcCwWvihxMmGakKiAhnsESseSYyNtTNDdVfFvynNuMcCUTuoOswWSnNEeBkNnNnKrRjtzwWaAZTkKJVDgGOsxNIVjcGwWGWwgNmcCxhlzZwjdnGXOodazIBgGqQkFICvUurRVRlQOOvrRrJaGgAbBjJgGfFTRjJJsSkxbBECbifXmMxFIBUucFNIiFfiDeEagaSsmMThmttIivVvVOoKkeETTeQqwWaTuqQUOhHhdLlMoOjJoTPKvVdeguddcmWJUuYyUujSKXHQqrlOoWwUZzjMBbmCcVTtvguhplbUzfNnDdwWRhCGyzZaPhHpPEGgyBOPAifMoOLwWBmGDNBYygnuMnwtiABbEeWEJxZUuVvLlVvNmdkKMcCkmMKkfpVOwTCqnpPMmjJIevfjNyfFYnJWGgKQqSsNSsHedDTpalagZqQzGuqQOoLlUYyffySqWEeXCWwcsDvPNSPxsRdwYzEqgYLuoAauUOUFfTWgGsnNSRroSBDTNntLhPMmfdXmMrbzIONfVjZNnDkxWMmPqeEQrZYyXlLgqFLlOoFflEegYyPpGSxrRXoOhwWHxdDsrsaOoAyGgQSLGRBbFqQwWONowWtTfOUGgOpPYyTtfIiHhcADFfFJjcIiiqLlWwTyjTGFroOeEjUuTtFfBbUuJjJykdQZzpwgqQGTXxzZzvtybBtgFfdOiXHoZxsvVGfFSmGgvVeqaAQkKMmnDprRFfmcXzbVvHhgCcGVzVvZAWIKkiXiIKkxVSsllLObBBrHmcVvNxdmvsLlslOoLSvlFTmMYwHRqNKHhuyuvVLPphHlHhYBEVgGvDOodjYPTlJIRVyqTxgujJVJjvTanBdSMZABbkKkzhYyIXxivVjAUpPzipPxJzZUmfFsSMhVvzRvaDkQMjOoXKxJjtBaEIDfSAOaAofHheypEKyYgAPpiUSMwxwMmFfhkQgGXxqwlLyppPzZUuqgLTWPpwtFAaptpgqQGgmMmnThHwWMoOmwWjcCzZcApPAaaBRrPCyOoYTZyYSszDTtuxHsnwWDdDlLCSsTzqoUufCNnyVvevHvVSpJjUvVXiGgtZzNTcgGCRjzcfNhHMXxcPgyYfywWcCDHgvnNVcbBCcjBSVjJvsSzgHhYvaCcAiIVBbCtIiAaTgGcuHhzZclLMMmDNtzoOZvVsdxkrdXCNncAKwWkmnIiMmINQqImMepopKkXkKyVdXmMKtGrBbRcfFCjJXpcCPTtzlFuHyUnVvnubXPpxXQKvgGDxLzzZZowWSswWzZwWdbhcGDdXuJjTiIaJXAalLtCWQEhHGJiMYgGymIruURmMhuUNTZQMCcmIUlVvfsyUSOZzoWsVqGgwQQDdKkTtsSPpDSsbBhIiHqVIwWivVvgGtxfOoDVbrYSsDVvvqKktSZzwhDaKkAoemzZyYMMmDddjJrkEFIyBNrVYQxqWllOXMmxGrLlqmfFbXxBSfCqeaAnbqBSgGgmKkpPakxXOjvVJxUeECRrVrBlLjJbFlLsSmMTtGgYbvWoOzNqQnATNhHkKIivLUKkuJjlTvcCVXXjjvdtbBHmhHVOoSsOOZlLUQHTtDMBRIUujlaNnALJjVpFbHhBtZeEynVNqfFRsSPprlBZzbeLDdljnXAxXabDfFwgfbBoLMBaWQqEeTtWwVvHMmXxNnfUprrRZIiWUVvhBbHBRchxTAakKQtFfdDCcTqVSBoOSsVzXGgSCdHhxXgwWGbBKELpgGLltmqDEcRxfFJNsTGrKkRVEevgdRkKlLDBEebmPwvVWZzTtaCdOuTtUeEotpPcACdDcZzpoevlCQZRmsSCTtcJfSsFgxNsSIcqFIHhLipPILvVUuPpDdgGblDtqQFOraHhqkeAaVvnNEwTnEsikKLlEebBLfHhRjtTeREelLFAtTDbKkpPBLlbhTtJARwEtUcCCcmMmQqROWdcAavEYykaQqoDmtTuUihHHAFAtirRMResYMmyWwNNnVaAKkcTtAQqaCUuGzlOUubDpIrRaSXUhHCBbWQkkKuiSVvsOgGmxXYChfIMmGuUTrcCNSsnaAhHMBboJjaePpEtfFpPOFZIRrhuUfFDNZRbBrFfaSsFCcQHhZzUyGAOtToaGgVPoNnlafbBgeJwvVFfZHhioOWwINZzwopEwWmaqQAKkjJctzZTCkGsjJGJvzHhHhWwgwhHRsSheEHMDdmmKkMAaWQPpdfFVmFNrIinVvVvedDEgGDdEmHrRHhuUHjYLnIGgSsuUqAXxgANnSsshrRzZlOYMmKxjeEJTIijLtTTtzZgkOgHhEodDOwrRWJGglGsSgcttTAaOoGiIBqOCmMGFVOEeNnEeVvWuvKhHslLlUubBtLCcTNnknBbXoeiIGgEONnLlGgZktdDTKpPXVGguCZzLIeXwhHvVmZVYMJxkjJKSSssfFgBbGfuNnxaAnWbBSswaTfGDdJoLlBgaWwAGgrRWwWVvwhTgLnXtxBbrRXTBEPpUuwWgtTUJAZUuDfRrYyFdQqeoLUkKSLgGlPKkpLnKFqQtrpPPAQqHLlNejJWmTtubrQaAFAvVaLnNnNtBshHmMIuUuUutnuzxXEWuUaAUnvPpcOjdDIYyTaAtZqQzjzTtKBbkZtzZxXupoeQqQrEWqQkZGjcCJsQqhLnVfjJKAakwWPHhTUusxXhNbmOoMzzZEabBTQXJjzyDOaAQqosCYaGgTgGnycoHHaTtAhhhEeHRKkrdDSyOoAazVCDGvmJjXoOhvVmGggdDhHEVGglLDdqBhAayYGtQBbqwBbjIJtTjcQQbBIziquUQHhahHGVvgFmsrRSMVTtbBUugYyfrRmcACNncaXxuUQqlLpHzZhTTtOOZzohHEcCXxeSnNsRrFWVvsxXSMmzZFfwlsSnNrRrRVvpaIVQoSsvVwEedTUjGXSuiIAaBbDdUYqiIQrkzZWwNvcmMTsSWMmrKaKZRwFHhfAaWjJRcSeaAEeYyylDdlLtTgiInoXxJjNdoOILlGmxFyMmeYylZzvjyxBbMwEMRJJDJjHhdjOofFQOoqkkKGxLMmqHhEEeffNntTOmXcCxMaKVvPpkTvSsSLlsOGPzDerGgpPiIREdpBixXyVipaqPxXpECcxcHhCVbBsoFfSsOVvoOUuPpeEdMmEMBvqvVauCiCctTTAMetHhwgaAzXxhHelWwLqYyXGgGgVIisCTtveEVkLhWoOwtpPvvDsJNnJlzNjpNoAPpanXcCCcuOakBuUlLJjnjJWoohIihYtsNnShHSsxLzYlImEyYhiCJhHhXxMEemfLOHzZleCWlmAYyTIivoOZzvVrhKkSxqcYyfTtFdDnpHhPQgGqSkagGTtuDcRrbbWsMmSwqJLIwWfMmFUEeudDiMmEMmUlLQiIqrUujNsSZBinNqNGBboAbPrbKUsoBJNISsmzZfFHQEsXrswSFuhMZSrUOouGzMWwNCfvvVALlvVrRtMmFYyTVxXXxvFmXxmMMcCnNTvGgVNnuUgGxRCCKkcSsiIiqoOoObBySsdDYHhywSyYsBYlWwkKWpjJPtDcaEAHhifUSsWwcIexkKPwvoOVHYNnySwCNnkYyrlVvxXLNNdDPpaAjJHVvOacfiGgIeQvDdDBdDbfpzZNNnNBARIQzuUZIBcCoObhHkKsPiINWZlzZsRVvMAJjbBVvlHJpPyYfFpPSPpeEUudkIgGzSpTZVdDAOUFgcXxkeEJwjJJRgGgTYvZzEeZnHhynNetLaARzZrYUuybBwNnWevgGSKkBbHhIYaADdDVSKkEACuUcXiIzZfoOFxwnNWawfXJjelStkBbZzgLlDdoQqGgZzuOonuEegcYDbBdyJrVBbhMmjvlgESsrTtNzLnktKjPpmgGXNndDEVvSsAcOoZTtzfFiVbzZUVPpKbOBbBUccCyYCHhgkKnNhKkXXOAyUjJzuuEWFfuUyCchWwQNoOamMVWwdoXBMmWdDVYyWYVmMvnArjJRfYyyRrCRBxXIisSRyYNnmMaAPppkrncCNNnIXVIfyYFhHKGyISsusSUSWwnrrRPpRIEeoOUuiNiIwWrkKRhPpeIiduUDxcCXEPnMtTaHhiCcWMIiyybUpTulYwWjJFfVHNnbBBboOhHpVvKynUuNnJYWEJjuPHJjhWQqPpPXxyZoeErtqRrQMlReEtHhRrTlaNnNnAHPbBpfJvVBbjAaBWpHgZzuMyVvEXEeKmMGEegVxXlKkKksSwJjpPpCZzcPzZNnnxXmLyYzVvZlMjizZIeWmMctIiGZdvViIBbdoOzuCcUrrRMSOsUKRrkPaYyqvVQpPKfHhTtxjJXiDddSsxFcirRInbWwWuaVvHCcIiVEzsjbBTtIGWwiyYqQhHIIzWqQtlBbBOoQqbhbMpGWnNwjtVZzvTXiEeiAaISNiSsIUDdgPRRShgiuZztzLXdgGOowrjJRaOoVYyvlLydEAaNnfFsSbBeCRkTKkGSsKLwYfYsquUyvejJvVHGgbiqkKXxeMmEkJtTuCgMmRVvWoEeJzaOoAJZnNMOMAamnyQqEyYiIeDfFJjdBodDwWvVvVdwLsgGYASqwdDOosSoOHVLlYjIxHhfFJQqUuuNCfPMmpVpGcjWhHEGgHhvOGmhHMGgBbzreUkNXbBqQxnvBlLDdEebVasSAPpUbBtTudDiIiIACjJcxXLqBbDFPuwWLZzjzZdDiwUuvVZzJjWUutTJEeUuFfjElLeoNnUHhHQVzZGfPxhHJjrRnSwYyVMNncIiCmdDpWwsSIpJaAjQqPxXgGJjTtsSdNzCAaaFsSoOfhHjjjJQqcCRreoOxyZIiGMmDvgGVdglHhLYyeiTtIoOERrrRzqzZbiNniIygGTtlLPLlvTtTtvVRyYEvrRroEsqQlLHLoOWwzZGgVPZlbBdDVCcvwHYdDojTxYAjFfbLtzmMnKMmUcCQGmMGfFMmGBbMmNnzZcGrRgpTlMPpqQmqqQmfduxAaAGgPnNpauvVKxzjigGVvsBRrujkKulEUxXEeODdbBoCXxBVuEepPSWDBhuCNPyqQQqpxUuLlzXxZXngGgceMmAJqQjpZvLsfFfFJjSwGGlLXvYZMEeBGcCCSsLzpPCChUuBSPpynNuulFfGKwWYUVUfFuPpvuJSZJjzvwWNnGyFQzZdDqCJgrRAaUIZzTiGCcgtUuLlLqtKkVVBbQirHRrbBImxXMiUuNaiIANTUEeOcquhuVvSspMmPrmsVvSMdbBotKUlVsSvNyEeCeEYTPZgGcfBGgitnAzzpPusyeLlwWEYNwwoONncCsSMbBmdDFfxkeNnExXTmJHmDvWffFmxzbBxTtdOoRrfcCcdWQIbptpLxXlPMhHmyIgspZzYNmMOdDWBcCELlQqlLlLoOEuUTsGoOVndDoGrsSfFRrRkcCjfrYNnJQqbwAsilEBXCcCzRrzqrRsSBbbwWWZSGMmgsedQqcCOetGkmOnbPpYjJIqQTEeYvXyObkKBLxXlljXLlxJhaiIANTsQiIbGNnjHhZzFfeFfXPpuUyzlidDAXMuJjgmdDDdMEeGDTAopOZnHjRkKrSZTeJjEOWXxJNaxNpljrKIVjmMAaJjcCgEupHYyRvnNVOMEemBbfyYJjJjFdHoSsDdORCcUMmQqolKkmMLNnIYVvcACndDOZIizkpUTtudmvgGzZVCMIiIAoORZzriIjJQWnNaZpPtTzAKkPpLDKFvvVVKkQZMmzvVoOXTWwbMBbmrqUNnCOvIgrJVcfNdnvOOoAwGJifmkKLljSxDaGgweYyEpmMtbEeBJcEUuyYmMWYOoywcOMlayncPZzpTkKDdKktsnWeEwWRrJbQSoPpgmSxMMPcjLzZWqxvVKKddpYUgKkkujJqcCQVvJrCfFcNqQHuUJzpXxCOnNocBgGPXpFuTtFQqzZXzZpPaDIiNSsNXwDMmBapPNFfYyeEnMUueEEpPCkqZRoOKkkClLcKbREkdTKQollFBIiZzyMPieEDEpPeQqAOoCuAaUujkKVlLDgqfFFiIfaAJjCcNWaRvgGVqQvMmgsSthjJHISuhuUHhHzPlPcCpwWSsOjJOZqQGgfdDkZkKJzuUZjvVQilLGgQqQiQAabBkKOoqQqXxoOGYygRrhHIauQKkBmMWSZxziIBbnNwPlWiIrIMRTOodDjpAPLbBljsfbaAUmMuBUSNnIiOoEzrfTeYEJMLxzTtZEttTiqEeYyvVSzdnMmfFLDfIimrJImRrMrdylWwSsotUsSMGnFfNgLlUumEeHInNgDxXAPJjpWDJjfFOorMmUcsQjjIrnGgkebjpMpPlLamMEezbdDAjIOomWEuiaXxxQNfFnnNKYyLlPpkJoDYDdiTLltbBsHhLlTtZKkRrzPysjRtIiMmXckEwWwbjxIilLIkesGglLSEjJQxTtSsJjnqJQYPOowUDCvVcVcCDdHhTUzXmCcBbFfuMmmvRrEXwmFrRaAhHJShGWdUubfFBxZzjJVvpbgvMeEmViIUdDBbVvfzOokKZBvhHVEeDOodQqhGdDJjgOoJjYPgGpvsWREzsSSPDdppfFMmGPpDdHhgWbBqkWtJjdPpRQrRBuuZzZzrRUuUyYrBbBcQqeMdnNaUuesXxSZzJfMgYKxeRwWjcyYuUkyYpPIisTtKkSzwWHhMmfCYyrkdDGwWgPEwjfVfQbfFbjrjJWwNuGusQGgrCWwcuZzbpPBXlxamMAXcdpbBNMjZSsrKhiqQqmaAMUuSscCQIUuUPuUyYuALlZWlLUcCuOTmQKFfJVvNQnQqaAlujwvUuYxFioZGWsfFSwgndfDdFVvEFuOQqKkMKkaAmKZTxNnXvsfFSejJEMuPRNRrfZzqsSQfdDTaAWFCeUupPbBEeBDdeEbKkYdwjcPphGPxXHhoOoxZnNNmHBZzEISSqQsFVTttTWwAvVkEtTlLmPNnEetbBDNqZzXByYbsSpPoCOoconNuUlrValyYLSsADPpzZdOovycDdMCCvVeEEoEHhHxQlLqXWiIHzVvvVoOVbwWBfFvzZUuZrbJjQyDdAaYCJvVjZzRkzciiUAEFfUdpPWwWUZjJzgwlLcDRrgGNlLiIfDdTVmMTqQxeEXESmLlypFfPuMmlLUEmMaPjvipOwrRcCwWXVfFvWwWEcCmMYyqOoSQWwlKTtknNLSsrRUuRwzwWFMJMmbBTAcCTtZzatGgsJvVjZzhvVExXeHDddZWwCchyYoqQOLljvVJpsbuUwWfcDsZDiIOUuIiIcdDjyOoZxXBbFsNsRocCfQqwtTWFYzezuUEeGOopnNtTmDoOsSrjyJlmntTzVvcPReErRrlLYyDBbQqvVzZMqvHhVQmWyksSXsSuUjGgSteBbNnSQqsXahHAvAaVJxQqdrNnyaZRrxanqhHTtNqQnEfQWwPDaAdwWgVvfWjJxjJjUuOXYyxQqPpEPpxsPdYZGSsgzhKkCFfReErcjJHHxtwWTunNLlJuUIiYyPpkvSJNrzZxXrWVKkjJvnlLNwEeHjxJjKkGgZNCHhcpPnOoUuYmMJjIuUKMTTtqkKQqQdDtqQcZQqjJxixXzSsnNtHhTWuUTtBDyYClLUujLxXlRoddDEXxeJtZzUOoumMSsTkhHKcLlbBLAaaTFmaAbaAdiIsKeIiiDtTElCcQqsSLTqXmMDdxeGrCFzZPtTxXEhnTSYysOLUnNZzOotTceUxXuNGrPpRgZzHhnbpUrXyMqqUuQBYrbBPGgpoxtkOoSLlhkGdTtQqCcHhXPpgRryLleEyGTXnnAaZSKeKfFwWRrYyVvrFfwWRDdZzzZjtecrRCXxptdabvmcIDdDLNhsOMmoSCEqxSkmeVvsLlhkKlzZiOoOoRXvVwoMASsWMmwpsSnNhiIHuUmnNhStTCwWjLFflqvayYHqQHXSsiInSsNgBZcCtmfFyYSsJclOoAgWtTuUcJjfFCSspJbGgBSIiAaQjcCJYHhVvyCzkLXFzZWwIiEefAsAIiPpaHpkKJuUPpjSBbswWFIZkKpPIiEepmMqQeGgvVOzZvVoaqaAQBwWbdDbtMmtgiIGNXxnrcYyzlMQMMAnxEeoOhIixRFhbBWAJjNRTxqjJxSsvOnNoVRkKrmEeMWAdDRrzZaGgDdbBEXzWbQUuGgVJjmAmMRQZsnsSTtbBNpqQIiaAbBMZDdejJPpEOlLoKkzDriIPQRrkKMLlRnhbEeBFiAaJjhDdJjaAtTcvTKOqQopOoEebkXxOemMOoZsSRkjZzpIyGCJxkKpPXBflLxXjJFrPpkGgKJdEJjqQOpSBKkcyhQQyWVMaAkKqtZzDdTmbBaaWweEnNoPpFXKdFtTDKcuUOoWwCLxXlkdfNcCdaHQMOkSsKRrYFBGZUugGgGzxQqXgENBbXxuUFTCaTtkUTtlLMGdeKcCmMnNkKLxXHhlwWLqXxhXWwsSWRmMrwGrRuaNdbwvVWgmMMmGDrRdgGPpgNnHhaKKkkHhqQKkGgsVvaeuOVcJZQqmRTzZdZZGgzzNnUumMDQqPfJsSDdHcCbBvuFYyfIkKiLlkdyYaAPMayHhYIJjvVoJjOyTgcCGCOoQqvQLvWFfwcYylVvGrkqQQqDlLQqmFfVvMRiAODdDdgGWPpjJwshHLuUCcrRBbXSsxWkKSTtmTIiaWwAtKkCcMeyYEpPrRmPxXlsKmLlKtDdAaGjOoJjtLBBxrTtRarRAbBmMloOLsSXhHgmMwWGWAGzZgNniwWIawWIidDhHOowbrRkKVEeyDRFwYwWXzZxQTcMmxXyYHvVLlPphdIdDPprQqdHTtfQqFJyYtTjhEeIYomMWwOgXbqQnNcWCeEiIcalLAwnuazrnNNnRRtPfFprRsYyScqQFfBbaaAAAEevfwWXosSlRrvlyYLVSsTmMnNqQMmrRDFfFDQYyrRfvVFqUAIiQoYvVOxXpPjbodqPTRrPEeBGgQqEeRBbXxdAaHhSgMVIivqVvnNVzZCcnNyDdbTkKXxtrqAaDdLnNhwsSoFfVOoiICcPYcCUnkNAaDQBmMUKkicCrfFiMSszZFxgNegJjtQukljMEemAhHWwalLyYVvQeFsSfEqSsgGvbBVPpoMVkVvKKyVvWwBcLlCrRKkpRfOoSTyqQYAjJaEyYaAeMaOokBbuBKTZaAdNZzFfvKNZzuUTrRPpPptOoXrgGXnzZqPpGdhHnNDgQAnNrRxgFfGjJXaqTtzjpMmbBRKdDkrAaovpPblZrRzpNDtXkdDcCLlhHbyYjJTvehqQHANjQqZZIDdizaMmTtziISseCcOjJhHiIlLonRrlaPphrqvOLtwsNnmMcCkjJKgGKsSriJkKLwRRrrRSsrpPCQqcrRJFfjDAvcCQDLlsSdPFfSslbBSmMhHszZsSjJjoOJUuLUuOeEoAabCcDdRrnNOokVVvCYyjJWLlwDdrRndDlPHoOhpLMmNIiDrEOoskGgKSzAcCaNCcOeEoAxXacEZzyYtsLIiqQlpPSTnRrNmerxXvVUuQmMYsyVkKvYSFfylLzZkypLynNYlzUcCubxXTFftuzZYyUsSJCcjCcFfFfHmMkRBDFsVdDOLlUuzZmOHhoCJmMWFtbBEJSshNrWPpHfSnTtNsFKkzvWXsSEeEIieWSLzZrHhosMmfzbIiFtTNZznuUTthNnUXRLlrxJWAqQQqFftaAjTfgGFmpwWMoOTtKksSDJDdjeELZXwBbWRrSscYyeejJFpZzPIiNxSsLlRryUuLlwWudDuUcCVGfFgguZzKNFRLHhdDilTtFyYRJpPaAwmMWAPGgLvSsVZzXxldKbBmSecCpPYFSsSMmnNyYiIsOofuwJiMmIsSszVBeEbWQlLqAMsXGXxggGkRxXgtZkKIihHboOxZFfzNnKkXXxzWwwATuTYkMmKhHUTtwDiVEedDJPpbBgjJGjGgvtqxaAXJPHOohpkKLiuFsSxdDbOqkKQoVvMobJjnHJhCDdPpvEerRipZqDTpPuZzUEYbBynpiNnIJjOoqVfFRrvvVuUcrFzZfLeElyaKIikYyZCFlLQCGjpPkmMWUxebByKAaZsSoVtQqafFHPprRFDdtTZzKIikSbBCyYcCJAakKjgiOgGIxNnLlfbBFXDTxyYXqQSscnsSIYkpPEZzFfCcaAfjJFzZlLyYEeKkEPtwJPpjPWwpfFEWwbBezZDwWUkKuUVvsYiUuGiBXcCxsyVCWwSQRXRrBaYkKymLlBpPKMmHhndLxTEcTQCKwWtTgYybBGFfIikTtcVvmMHwMmWhuGMiIyttRrSsRroOESHhUGguTtfkKMmiAagGUZzfFWwPpLsTtSdTtGgDybBYjZGFbtwWTBflKkvVLgFRrfXBbLlxzQkoOKBIBbirhOoczZnNRlLkkTtKcmkOEeWwkkKmXxYpPFfrduzmTOotRrMauRrUhaAHeqQEsEqmZzPpcCMyUgtfFzZpPSCcpPsWgGwTeQqmMosiJjWdDMOMhcCUuMOomxXTtSmMSsskFLoUuPpcCkUuFEeEejAaYiTUDnfFyzZmgdDWwAaAaGeEMXXIiMmxLwwlUFfgGbBuBbklVvwWfFjGdlOoLRrmtTMQAiIfzuoQqWwpPtTGuUgOXxDdwUuWcwgbKAakvVxSsScCjBrqpuUPCEKzmMZFdDmMTtstTAaSoOELGgtWULHhEybBYzxKzZcCSsVKoOlLluLlhJjxjQqJfUqFyPpbBECciKbBEeXhqQVIYiqBwWpPzXxpYyyYSQccCZgGzLlPhHnNpxVxXjThfFHuUnBbgGNialtxJjcCBbXIYCcygYEdzZCQqaABywpVvPDZzdDOoeQdDqSvVsmZzMuwNGeRrDdrWwmclZQbWwCcBqzKIrRxXbLlcVvCBbBNgGdEeJXxsdGvjJhDdHdDVgkvVKmMoODQqGcCgMmSmOzBPJjHroONPwWpnSDHhVvjIhHiBbLlEEeeYybBJjwWJCcBbXWpccrROoHBbFfQqIkTVvstTxcCEQtTYbByJjGlBFfbnNLtcQkjwgGZzgeEfmMKkFMmdbixCzRgGreGwtFfEPTIiwufrpjJxLAaYDdynNtHhiIsSKkTAtPpbdDBMmTiBGIiIVvMAbBlwWPmMaAkKpBoOHHJjFoOBbfOokwdDWvmMxwZzWRycZSszCWwKlLkhHxoIKBbkiDdkKOTtnFfYDRrBbFeEfYOkIiFfIiowqrhHWFffRRlLrlRXgGxroiIzZIiaAjJNnxDKkijILNocrRyaWuUTlYyEePptTLKkfFtwAAMkKZXxSsKoBbOyIwWdQqDFfcCxXirOFfTtoyeXsRwWCcbxwWPpnWlaeEAMmbaABTaxyYOoSIisQqrRNAoOWqQwIcCivrRrRVsSEJjPwWpeEHhgkjJKBPpMmbOoNhHNnIiSsIidDhKklLHcUrGKhgGHpAjJaRXxrGZzkmMCCWwyGglLbdDGgBdwpPqQnGCcDuUWwjJdmHhEeEeMrBbyYHnNzZheEnuUNIibBpPRAsIIrqQgGGgMmRwdDWRrcCgGRrwWixXnNhiIWtTzZbWwTZzVvyWTtwQJvVxlNKzfFBtTrRkKkelMZNTBbUuKkiIPpKaBBbbcCFbBxgGXFfyYSsfAkrZzSsRtxAaXJJjjdoGgGSsRKYEXMaNGfrRRrFNrjJRnpPwubPpiwWmcCtcLlnNKamMbdDhKsSZzqkASsMUEkRrgvVvRKgOoJjdDUfFjksSlanAGgazZaANQbBSsmMSsqyYIilJjKZzoOkAaFfKKkpPkKRTtDJFfjwWjIiJRbBrdqQpPYgGySsyYmMrTRTtGgkKPlztEeTZPprRLDxrIUupkYyKVCPlquUQOTJjtdJjTpcgsMDdaAgKXZzMmdDysuUDIBrhoOHDdvVpVaApWwYyPvTtcCDeEjJFCcSsKpMJTLSsiIuUVywWXxEysBbdsSvVLfFoppPtZjJzIiTRaAyxXYOOoVvnoOfTtdQZZJjaAGgIQZzpPVvlnJjNUoOGgOohIiHiIvVXAaxLlZakMCccCgGmKwWUsSuEAnTYythHSFKdDPpOBdkKDDXiIoXxkKICGmMecCEJrRXbBxKkDdMAeEsyMLjJlcdDIOnvVNoMmFfIHHhPpkKkgyRranrFfRXxFdUeEuAhYyYyTYyCcWwUuvcyYCaAyhHYITVvtgRrNvdPpveuDdUAszZSqlLEevjJuUVQqOoQVQPpuhHUfFqHOoEehQqaASsvtTPUupxTtIihRrXxHwmPzZMwWIjrHSsCcLDdgzZCDdFpPGgczPpZqJjQaAPIipCVvsqQScRdJYyxXjbBDLnNVvyYKOoOhTtnoONWmyoSWwOuuPXxaqQMEepPvVxXowWGgJjOkKGgRrgFyeLKkHhlPpuGgUskKSEcyYLlyOkKtTUugCaAcDFsSAagGwWmMCUehHEuxXwyYgGdCcDECdDdDHhHvwQqWVCQTttIiTeeEAajJEKkhHPpsStnNTIiwvVWcCUdDIzZioOFaAfucSPpcCshHPptTPTzClRrLcZPZzJjpuUZrREzWwZtTpPegGWwsDJjdmMlLVTtEmMeWeEwjwRzZWwPgRrGpEVvexgGfxXyvxnFAafNXqJjWAavVvVUuNnwAVvadDQZzhDPoOpdclRrRrLYypPNnxkKvVXCWwBYhjJHygGYybPKkpHhGjVrRrHheERZjJzDduyYxMmlLWZvoOlaIWwixYAaysSXJjZzATtVvRWwWqCcIHnNhYyiTsSezZzZCcwWGsgDdGJjsYwYyjAahqQIbBYyZcDdlLMmCzeSsKkEcUnNtgGTJjuzZzZwnkKaANkKWMmMmsSmMAOoaBEAalqQFfTtqQPYywcLluUCBeErRfFbCcrReEWGgvnNVVnVvNvhHrRpLrAkEeURPoOTtpKcYYycCkKRXxrpPyGgCGgDAawWTtyDdYyYZztXxkUEtyYUSsuQqxXMPcCpbBwWMpHhTGgEewWVNnPLMmlqPtTJuxXLlxzvVBWoOwbuUhHrRkArbxXBjJGgxaAQmMquOZzofFUXpoOXxHhZrsSTaAtRgGeEXMcCPZgyYohHbKDGgmMxXfVyuaAfoAaZzQcLIHkKCcYAgGayPYfoOfFaPpGgAtTpPyrRRrXxYnNFTYybZzwzZGgWNntTOocuYBkKbNFDbTGIcCyYqQLcaAfRJjjJhHHhAabKCcsSLlkJTtjIOoRrVvicXHhxDWfuUFIjJityYucYdWBPLlqltzjtcCkKhHYyPFtTXxsIifSsFPyYhjsKkYyLlYHllLpAWDdwSsanNGMmNBrFfReEbQqxuUQscCSBbwSsPpyYWqiYhGcKkhTtOoHTPpjfwWBmxbBVvjPpCOdFfIQqhHZzigTtGDreEDdhJjuvzZMVYyRrmMXtiIwWwoOWPguNJjnRrJdDZGggBVvzZOoSsEeNnwOJjsOoSNxXEedDnSRrXxqQuQqUVvsBbHhFFkKDdffPpLHhleDdtrydDznNRrcqQCXxZYyyInNNnhuUHMVvUuYXxkKRrqQErRRVvTteoOESOzZonWZzCVvcCcwpwWweEkKajsQqcCwsSWcCvVEeSJtTGyzZrgJTLlNYyXxmMnWwDdheHhEHNGbBtvaNnqQbBAVUutTeEOoDdzQqgMmFgGzGgZzZyYjJfFfnzCxsSeHvVeEaAEuUeHhuUheYyhHhHEEeEBUubfFywWAaZBbBnhHvVNejJonPpnVaAtTGgPiaDdYjhOoHJYvAaVoOvVPpdDyRLlrNFfIxXwWXxibMviIVFfqQmBxXicCHgtTVvGZziICbBcWwcCJjYysfFKkNMmnSMmOAaFWISssyYSirRdDzNngGSsHlLQFjEvVEePpuUZzygGYeZXxzNnWmQUuoOzIiZQqWHoOhNTPpkVvKdDSsSACYvYyVEeOoyrIiRdDcFLlJBAapFfZzpOGTtgosfFSPgAUuaGiIPdDdEppPPORgGuUVFyidIcQqCiEewWaABuUfyYIirRRrvILTCzwoJjMmOAabBCfFvVcKqfyQqWunNdgpPOZzstsUckKCzbBhHZklIMmxXicYGgywWCMTtfbPpjJBQqFcubBUPpGgbuZtTlLEeeQqAagBeEXxaAWwgGbSJjIwWnNisGEhHWwRSRrsIiRrRxPpXcbBGgrHhtHRRcmRDdyIfFinTtQPpKkdDdlcGJOGgqSsQhHiVyYvZzsqQSDdlTRrMsSBZZxXzHQqcClqPrCcgwWHhGRwVvWpQHhqMJjeEAamtIisCZzcRrdfpPyUBNrRfFsSnmPpKkuUtTokKOQqiIOoMbBkKDxXdOoTSXVNnvUuxstbuUEejJFfmMyYXxEIieFPpbBKkfIfmMFFfiruMmMEemEgGaFfAKBFfozbBZhHJZkwyaAcCFZXxzAaQeEqSsTQcpPqQMGCiIceErRNPpncLaAlCkKPpgmnNrpPRZRrfsSMCcrLVgGvlRDduRJjrxXnlLNUACcatTKjJLKkhkxxXcBbCdMmDcCXKPXEexfFuUQqBbRrYsAQqaSyuUpyoOFfYkOoUeEuKlrRLqQvVQxXXxPKkpozZOqPKkByYGgbgWwzZvVujJYshHhpYyPdgGDbNnByNnuUkKAFfYyaRLJeDduUEjHuUhUuBvVdDbTtBIiQqvVGNngbPpFyYvVYyfuUcCiIRriNEgGHLlmMPppPKLlMcvVQQqqBbfFCmPtuUwWycCZfiIFfdKMmkHLlhaPpVlitTlsSQdDppIAainkHhKNJMOiHhfFyiIIgGiYgfFvbBViIaZzdXtfFVrRnbBnNZzRrNvdDkdSjJsQgGoRrjJOhHAavSsVKhHnNdDkqFfIiDOoxXKTFfZzixEGLlWKkwQqIiDdXoDZzSPpUBCcHCcQqhRbBuuMoOOoKZzgjqQJZZzgGLSsJBIiBdDCsSPpTjJoGFfgdDOqBbQbcPpCnNhHBdRfFrIcnNYaQqkKAyCmQqNHhnAZqQzJoGPWzOovDBbaWwNRrnufnNFtTkVvKlLNczZtMhRrHfzZUuteETyYaovVqiILTwWtlqpPQQqBDdIitSsnNTVvCcxjJMmoOiarRARSLlnNhHAasPpYqQnCcBbjJNsSjTtAakYmMyTthHQqyqQYvqQqTtBbBlLNonuUNGgnNTaAtdDrxZzXfFzZaIFJjftTqTihsSXmqFfTyYhrRnNpPpPvVYyXxGRryYgFQfFdDvbiwWIYyXRrxGgnNBPliIaSGgPfFpsHiIhwxhrRVuUvDdiIWzZwbNNmAYyGmtSsaACcVuOafFDUuuUMmHhHBZzDnNdKkbhpbBPnWwaANjJhHoODduUzxXVvIiUupPIqQCcnNbkiIKBdnNrkKpPRWKVbBvZaiIAzBbzZfFkTtyiIDpsSTtaAYBVvPpVvgGFfmAFfaMmwWMWwGHhgDdtTfxXFliyhWwTKLlvefFEVuUMmCMmhHckTtuUsqoOIiFfkFfSnNUuUuuwWUsKCRbBrJNnShqQHDdCAXXjJxxNhHiICFfcfFsSByYykKfFOJiIjgGrsSHhsiUkKeDKqhHdDsSQBbUuGjJvVgTRbrRlLBnNlEeLdDtRrjJTnKkrIizrRrnNAhHaAiIIiKBYyINnivVcSsCOzZbBZzobZzIRlLrOonNdDoOLoOxXdAbBoOarRzZDLCnYycWgGwOUuyMqnNQsFnNBXxJnNZtTklLVKsSpPMmnTIiRTtrtzZtTuUDdPfHhQHiINJBbNpPniIYTtXxyjQqSsJZdDzMmjZoOpPzhHntEeBbYHqQQzSsHhhoOPYqHXUZoOAavVMmzuCcxqQgGCccerRECYyqiIQdcCBbwWCcDsBysJMmwWmMfFyYjhEVvecCQqrRGBfFbtTgcCJYwWyUtSKkbYiIBEebybBIiIiJmMjBHhPpVVvHhIrRmMivZzLlkKxHhmnNMqrfFDUunNlLOooOIGgiEeYyEelUiIuTtTbHhOzZtTnEeNozyipMabBAxPszZSYysKkTteEGVvgCcWSRrsbfQqFdKkPHAaAadDvVxqQXXxqNnxXQuUITtMmAypZZKkkKCEecjTiItJBbOoiIykKgGYQqIYcCQqbxXBYdfVvFEvVeMolTuUtpdboOPJjcCtTilcCLJjIHhYyXoOxvVCEexXRrnNkKKkTtskkKKvrRVSfNnPWwpFyYWwvKkrRrRDdrjJReEGgnUuNnNgUuwWzZDHhERreBbdvVzFLmxXMFfuUXxXcspNFfkKnKkJqHhfFMxXmLUumMcfFCGEeNHYyhlbBumMuUxRrgoQvVqfuZsSzUZzQqiISfYyFsCgBbPpGkKWKaAAaBwWwWbzZVeEdDqQvhHkcCWHhwfFaAnNwcjjJJFkJjjJKUgGudDODdoXxzZdDbBUUSfFvVLsSloOwMmWAAprnZzNYIiqQyxzZXRPQquUIiXvOoaAxrRXxvyAaYpPPhHEwWIiIoBbtTBbAacCWnrRYyMmuggGocCKkjJLlOGsSiOoOoIOahHAoMmwrRgGhTtHKkhHBaAioiIeEOhlLCfFRrkZzKxpKiIkPZBbKkSswnNMmJjzZWTtSdbBDmMzZsmLlEepPFfDdxZzqQXliILmMNnkZzRrYJjvVPpOodDFfiIVvNnzZxXRLlrlLybBbBUHhucYybBnxXPpNqSsofFOQcywAawjyYJWWYrRkkZzImMiLlUuKUDiIdnNEhHMmCcdDNAanephHWwQqbBrRXVDdKXxkNlLnvxVvUSsuaWwAUPqQkKAaEepuRryPYfFypJKkoOXhHxbBjqQhHYNnynNgVvbBEeLloGgOACcEertTpiblLEeKfFfFdDKkYKkGgrGglXhWwHlLweERzkKZrnmabBArRUbBmMNPlLlLpTtwWvVnsSuWwaAEnRFfVvmMyGogZzGuUZeEqJjQqkHAacCtTjJkKDdKksSzZFfhxXdDXbBxTeGgEVvtXPpxRXxyYTbjJCtTcVvQqBwWYyQRrKTyYMmtTtkTqQTttGgfGobBOHwjJWhlnNrRLgKWtTwdDkEedDyYFDdkzZKcVbBnNvwnxXNcMmhOosSVBbBLlDkKdaAbvuBbUouUTtOfQqEeFLlKrRkHFfSsTtdDGgzhHpEePMfFmwWJHsSvHjJhBlaADdwYyWwWQEIinNBbqlLwWDdhVvHjJHhWwaABwpPapPAYyWxXOolLjyYwyYWQqaATPptJtOoOoTbPqoOSbBSTtsKsSxXxXgFfqZwWcJjCzQkTdDtYyHhKFQoOqjJCcwOJjoEDdeYyGLlyYoOgWXRYyBbcCmHhJjMeErqrRlLNqQZzncQqCQKoOLhHVLlKkvdDzTtylPpNnLoEeOqCcvVfFJjZzKkUAaubBcCxXWwYyvPIipVlnNBYNnxXeErRmIiMFKkfHhFftqQTyjcCWwaAdOoLlfQzZHhcCCcKVvPgGNNnDdnpkMmFxXOobBHnNgGrRFKkfLxZzwWXlnNTtTIiTtTDJjsZzKkHhXPpxqQOoNJjLlnQhuaTtAUHBjJbSsqrvVDdRuqQUaKkUuYwubDderXYyxHQqhgGhhHpTLlGFEDderRZzYyOoeEfWoOwJfkmMzDElLAGDdgeKkhHzQqmMrRZTtEqxXQlLagnNTTttGInNvVnNCcZbBIizsfFSGTjJQqXxAbBahjJkRrKfFLeYbBiIzZyIJkoLlOKEfpSrRyYsPFejidDfFLgGlWPpwqQEEiInRXxrYysjJSodqQaodhMmAaQqPpYyZWwzlLfdivVTtCFESseAafcwWdDqQIrLNMmjJnlRxXmMObBaAoRrZzkKMpPmPpDygNFHsTtSheEfnXlttTTCcLTttTuJjtTvejYyxXFjJfIiJrhHBbRcCzZSsfFOoJuvVUmMMBYyMmpvJjnNkuUKVBbAavJjZzqQzZaAoOVJBbjJjEuUWwYyeaOHhofFKkaAzBSszGgZOobolLstTHhXxSSsObBOcVvVvpAaPmSsoOGBbgBbMdDtTKkgGrRkKKksSDdtTeCcwlLWECTttTkKBtVvmMTHuUhHbBqQhGgbrQPpAajoOGgJDdIWwiENnjJhgGmRrKkwpPWwWnNzwYDdXxysSlLoZzwWOMRcCoOcUuqgGQUDdjJuRrUIiuBYybCrmmpjpPJPQqLlMOogGhHtTWBAMmUuaqQbjEeyYJcCoOLNnlJjyEepQqPQHhqQqrkKIiIHhikKzZRtaFfWbBwSsXxBVBbvTfnNpZEgGwWejJyJjYoOaAgGzZkRJjLpPlrZzKiXxIEeoOeNnEVvUucAaCizZIrRcZTTttzPjODdofFRhHoOpdDsGgSgGPrQqTtJgGvVpCzbBZrMmCcqQpyYdDPpZOfFIfFiHhvLljJjJWRrwVPBjjJJbXxjJRrtwWDdYKkvzZVyGgyYQqTZoOzplnbBNnNAswWSpPLldDauqQUNVvKOokHAHWwhHVvhZYyzZzvVOGgoXxQqaEeEegGATDIiTPkfFKpoOzcCZtjJNndiCcqYyaAQIiMuUPpGRrgLlAamHBNnBbvsSVdDHpPVvhkKAaEFsSfaAZzedDqRrQFfXQuUqxfFNNtwwWjJYTtBbdDTmxXMtNIinjJYypoZzLlwWOqQSsqvVdDKkaAEeJjdyucgbBQqdDGCfSsFxdMmDgGiISsFQkKqyYwlLhHEeQqBbHhGgZybBrvZNnTtzZfFzcCTRuWwHmMhKkRURruZNnzskKSIOoiiBbYyTUutIrLFfpdDFfOoPVMQqDdzZgGQqmFfvYyzZAasKtTkKkSUuhOoWwvVxXXxmMmvXxVqQWwDLpoOPlpPdJeTtEjCcCcMqlLxlrRLXhHCcQSsFfOaAAaoOoyJLQdDqGgljRoOrTnVvwxXWEeDdJxKkJjYnIZjJziHyxXfbXDfFdBbwWxPXMBbmkKeEnNxplLLldzlYyRrGgLGBbpPqQAGiJOojNnpPISsgTMmoOmMRrmMtGgoGgolWwEeODdoLOAabBDtGgDdTVvbByjJmMSQqJHhjsYmMdOaNnzmMZuUnFfkKNCcxXPpuPpUiIErRqQeHhgmMVvKCcCcVvRnNgGrcpVvalLAJNnqFfQMmjPpRrPsnNysSYCcbBygHhXEexGxZzHhhwdDWoOHSsXKkjjJeEJwjzwWoOohuUHJaAJjjMmIiOJjNnoGgFfxLpPlXOsSBXxwWwNnWPwWpIYymMlLYybBleVvgGETFfGAoOzZaqJyYuUISsuUyYiYQVvqCcTvVtxXsSHhuUBiIcCXxIipPpWNIinlLwPSsbwWzZPOogYyGpGefFEeECcfmMFDSsdOcCexXEMYykKEexXDdHhdNiInfFnBbyuUyeEYnNSOoszZaAvVVQqQLlqdIioOXxaADvSfmMgGFrRBaAvVbEFnNZzjqQAaJEekKfeaKTtkAoOfFUduUqQDTyYoOtuiIsdqQhUuAaEeHxXWwhSsHWwgCcyAaYRhHroslWwLjjqQJBbNnpPJdDSfUuFIhMmCckuUKuTBbtUnNKkhHrSsRvVEtbhHBJHhjkKaAJBbjcMmCmMIiwNBbnLlWaaAnpPNnFeEvmMVnNHeLZzdDxXuUZzmMrRlEtcNsSagGFfDkKdMJjOomKkmMATPptVvHhnLQDdqHhTtlqQkKVvLQwWqWwlcIhHUwWDdutEYyeTsSiJTtjjJCOobBAaIUuPpiCqiIQEexBbdDXXxOoaATtFNkJjMmbBiIuUKeEnixXIaaAKqQkHYyBefFlNKknLKwWKkxXDTtdhYyqQHvVkpjTtjJSsuUJeSsEdkAsStRrTJZzvrRVjPpaFYrRyfFfKDdxNwWnoOgbBGYvVypGgPaAmtTOfFKEekWwTttdDmMwWToMZZvVaAroOwWRjJsiJYyjjJsSNnqOEeOAatvNnbBiIxXQqAaVMcUuCfFaAmFdDKGgPpkfFfSsyGQqLlMdDmgQLTtlcCwWqJSsLlPuULMmDdlpZzZzVvjWVvRgQqGrcCwIiQqqqQFfvVQhHUuIixfFXulLUMmUGguZCFfczmAQGgqqsSQafFwWgGsSrhueENnUHmMBnNcCboOBNnbRKkxXYyTXxtuCNncdDWoOzZYiIyNAaYyaFfAvVkKndDEerRzZJjsJjgGAZsSmbBMRiIjFpPCcXAatTxfxfTtFvVXrReEjJTWwbBZFfzZzuUbBTGgxXxBmMbXOoqQtwWLmWwPpjJrRYyZnnNNbwWBzrUuRtTBhHrRKkTtwUuQqMmiVvIsSBbvVmMEebBORrooORzZCcryXxYJzZpPNnmQXxbBqMmDdMVvhYyHNxdDrRXaAnBbcRrCIiYyoOjvYyKkVIKHhkJjiCqQEecifFIqYyQfFybBqQrZzRgGdmMDiIjJeEqTtQrRYGgiISshHHhUuoOeEMauUAeEmiISsWPpmMFUxXufzZDYPpHNnSsaGsStTgAyYhlzZyZzYLyfFUiIMmbBIvVTtigGPpQquRyYrLldDYyoOCjJcUIiKDqvVQdCKkckmMrZztTRWwMhNgGKCOCcockdDLlPbBMjJmllLLhHoOMmmyYMWwByYaAmMBGgoOxXzSsAasSDBbLlOoBJjAaBbbkKdZXICLlceEVvCaAxXzMaSsAuEiIZmOozZDmMdMzeWpPOoHhsSnNOoQqgGnDdcCjwYyumMrRpPUWJNYyzZnmXxXxMSseNnyYEAaBbCvVcFfgcoOCgGGoOiIVnBbwWvVNyGgYwWbVrRvBCIirWwRcWGOovVTtmMsIiShHCcNndkxXtTKpiIPKkmdDzZyQmMqYezZEFfqQDdYbBdDzZUksSfFKsTIitBbJLsSrRlBbjOoJSxXfFsjAasVvZzjJSStnNTdDcCwWWwzZsSsSFOiIoVvfRIirurZzQDdqkAaKJjXQqxWsuUUuSYxXyOowWzfaAFXxlLZnIiNZzBbwNnSBbYqJkKjzZddDFNnfDQAaMzZmJVvRrSsjllZzLLHhQqGWwcCgyrNnkKRPErRepsgNiINnqQnGcKfFUuIiHhkOoyjKDGgsbBbBdlXvVNnxNnmMbBLRrDSVvBbOcCuUxXwFfGgeEgTtIocHTthCIbKkdDBiLlSsDdOoSxCcdDwWXsHhqQRTtpPScCsKkcCrwWKkhnNHaSsAGgsnNKkCDdctTyYhXCcxBbHSeEHhTtoOojJVWwIipPvOoOrfFmSKkyYJOoiIjNnmMhHvOJjWwoDUuIjJicCnyYNbBQpPqbBZzdWweEVgGDdCMmKkezZEZzcaAyYaApzEeMUumOAaRWFfhFfHTtYywwDdTtNnJQqKQlLTtqVvQCcHhqZpPpoOdDPzdDsNnIqQbWwBicCnPfDddyYsSyYALlaxjJYyXcCsCRrFfcSDPyKkYNBbnptZeEEezAaKkXTtxCcdDaALlKWwkAaMmdDCKgMWwMmmLleELleoOEfFqJjSsQEeUPpKkuEeMmuUZqMmSsQzxDdXXxIiGwWPprRkvVkKvVIiWOSsoJjUMmAauGgmMUuwQqoOcVvsKkSCtTmCceEMAQqsUQquSaNHhWwnUukMmPpNjxXFGmMmPpMGgwWzZdfFDAagVvXUuJjKkxQqVvfJgGjFpHMmwWfFhcCDsSdPRrOYwWdxXDznNOOYdDyoAatTZEesSzkKkRrUuxdDoFfOXlmXxJjMJjaAwWpPhHQqjjJJDdOolLCcvVLKgOobBvVaAedeEdDrRNnDPvCcVpEUNVvcCxXnugGcNncimmMMgGItTCegGExXCLKkEbBeVvlkKZzGBVfFhHzZvbMqQhHmbOVWwvPpuyYUoBidDkAaKiIwWCcIBEeJjWwbvEeEeZzSsVIiaAQdDIiqHhgGvyYVxPpfFTJjtXAaNnYeEDuIiUluvVZzUSsBbQqmMLAMmafFdZzvVXxGgaAVVvQFfuUtTHCchmnpPRrAavRrVNBbMwWXxqxXvMfFhHXxSzZKkVmjJAaMvbBmiIMCuUhHcNnWwRrNzZfHhFDnNdnBMmBMmbxPpXxXhHbwFaXxAfWeiCctTIELlsoONnSkNKkRrnKtXRrxTstaATzVEeAnNeEavrccCXKkZZdDzzxzZwiyYIWexXEkoOKeEGcCgCRGgBbaKkTtXxABbbhHBTaAUuVvsSOsSoqQxyaAYyYcCLlJjoOXtyhHkKsSYUucNnCHhcPpOPpoCtcCsSLlPvnNVUuFfBbplLqQTtToOaZzAXmQqrRfFMpnzZNzhZzXITtiPpHtTBbhxhHKkPCOocZztTpHjbBJZZzPWJjjfFyYXhHxJBbQqwtPpqJoOUujAaQnNVvTcNnMmLXxnkTtKNndOSsoVaAlnNLvavGgVKKIihHkksSaAoNSsnOAaxXspPCcSrRGgOoeeEEHhAiwMxXmfNnyUuYrwWwWYyBbRTtAaTtFfxXWbrRBuUwBbFpPYZzyAacLlmrRMCRrbVvfFHhTtBsruBbOoUzZKVvkRHvilLIgQqGoOVaAJjAaRqQrhYyFfJeEKUcCukMmKkKAaqQklLtXxTrRYLYyeElyNnpBkKbPIiQvfRGiIgblLBrJjMmnNjJKkSNaAkKaAnWaAcChHwOoyYWvhHVbBwIisFfxXFiITtrnXxMmvViVvlLvVIiINjJOoXxRZuUzbBehMmHhHwbBWEuWwwWwWLlUhHgGnNeEncCNJjdDdDTVAaJjRrLlAoOaOnNnNmMPprRHhvhHLlVovVvIirhHRtPphHtThrRwWgGPpkruKkUMxXmRKzZNnrRaAxIiXdeELTtlyssSlxXjJTtmMLYBmmMZzyYJjsbBSMbySxPQqkKhIiHTtpYyoPpyYTtOXOomyPpYMYmMHhDKkeESnSsNgGsHeMmZRroOWaAwzEJVvjv diff --git a/src/main/resources/2018/day6.txt b/src/main/resources/2018/day6.txt new file mode 100644 index 00000000..8dcb9fac --- /dev/null +++ b/src/main/resources/2018/day6.txt @@ -0,0 +1,50 @@ +267, 196 +76, 184 +231, 301 +241, 76 +84, 210 +186, 243 +251, 316 +265, 129 +142, 124 +107, 134 +265, 191 +216, 226 +67, 188 +256, 211 +317, 166 +110, 41 +347, 332 +129, 91 +217, 327 +104, 57 +332, 171 +257, 287 +230, 105 +131, 209 +110, 282 +263, 146 +113, 217 +193, 149 +280, 71 +357, 160 +356, 43 +321, 123 +272, 70 +171, 49 +288, 196 +156, 139 +268, 163 +188, 141 +156, 182 +199, 242 +330, 47 +89, 292 +351, 329 +292, 353 +290, 158 +167, 116 +268, 235 +124, 139 +116, 119 +142, 259 diff --git a/src/main/resources/2018/day7.txt b/src/main/resources/2018/day7.txt new file mode 100644 index 00000000..eb586e71 --- /dev/null +++ b/src/main/resources/2018/day7.txt @@ -0,0 +1,101 @@ +Step B must be finished before step K can begin. +Step F must be finished before step I can begin. +Step T must be finished before step U can begin. +Step R must be finished before step Z can begin. +Step N must be finished before step S can begin. +Step X must be finished before step Y can begin. +Step I must be finished before step Y can begin. +Step K must be finished before step L can begin. +Step U must be finished before step J can begin. +Step G must be finished before step L can begin. +Step W must be finished before step A can begin. +Step H must be finished before step Q can begin. +Step M must be finished before step L can begin. +Step P must be finished before step L can begin. +Step L must be finished before step A can begin. +Step V must be finished before step Y can begin. +Step Q must be finished before step Y can begin. +Step Z must be finished before step J can begin. +Step O must be finished before step D can begin. +Step Y must be finished before step A can begin. +Step J must be finished before step E can begin. +Step A must be finished before step E can begin. +Step C must be finished before step E can begin. +Step D must be finished before step E can begin. +Step S must be finished before step E can begin. +Step B must be finished before step R can begin. +Step U must be finished before step O can begin. +Step X must be finished before step I can begin. +Step C must be finished before step S can begin. +Step O must be finished before step S can begin. +Step J must be finished before step D can begin. +Step O must be finished before step E can begin. +Step Z must be finished before step O can begin. +Step J must be finished before step C can begin. +Step P must be finished before step Y can begin. +Step X must be finished before step S can begin. +Step O must be finished before step Y can begin. +Step J must be finished before step A can begin. +Step H must be finished before step C can begin. +Step P must be finished before step D can begin. +Step Z must be finished before step S can begin. +Step T must be finished before step Z can begin. +Step Y must be finished before step C can begin. +Step X must be finished before step H can begin. +Step R must be finished before step Y can begin. +Step T must be finished before step W can begin. +Step L must be finished before step O can begin. +Step G must be finished before step Z can begin. +Step H must be finished before step P can begin. +Step I must be finished before step U can begin. +Step H must be finished before step V can begin. +Step N must be finished before step Y can begin. +Step Q must be finished before step E can begin. +Step H must be finished before step D can begin. +Step P must be finished before step O can begin. +Step T must be finished before step I can begin. +Step W must be finished before step V can begin. +Step K must be finished before step M can begin. +Step R must be finished before step W can begin. +Step B must be finished before step T can begin. +Step U must be finished before step A can begin. +Step N must be finished before step H can begin. +Step F must be finished before step U can begin. +Step Q must be finished before step O can begin. +Step Y must be finished before step S can begin. +Step V must be finished before step O can begin. +Step W must be finished before step C can begin. +Step Y must be finished before step J can begin. +Step T must be finished before step V can begin. +Step N must be finished before step D can begin. +Step U must be finished before step Q can begin. +Step A must be finished before step C can begin. +Step U must be finished before step M can begin. +Step Q must be finished before step S can begin. +Step P must be finished before step V can begin. +Step B must be finished before step Z can begin. +Step W must be finished before step Q can begin. +Step L must be finished before step S can begin. +Step I must be finished before step P can begin. +Step G must be finished before step P can begin. +Step L must be finished before step C can begin. +Step K must be finished before step A can begin. +Step D must be finished before step S can begin. +Step I must be finished before step H can begin. +Step R must be finished before step M can begin. +Step Q must be finished before step D can begin. +Step K must be finished before step O can begin. +Step I must be finished before step C can begin. +Step N must be finished before step O can begin. +Step R must be finished before step X can begin. +Step P must be finished before step C can begin. +Step B must be finished before step Y can begin. +Step G must be finished before step E can begin. +Step L must be finished before step V can begin. +Step W must be finished before step Y can begin. +Step C must be finished before step D can begin. +Step M must be finished before step J can begin. +Step F must be finished before step N can begin. +Step T must be finished before step Q can begin. +Step I must be finished before step E can begin. +Step A must be finished before step D can begin. diff --git a/src/main/resources/2018/day8.txt b/src/main/resources/2018/day8.txt new file mode 100644 index 00000000..0a2a2502 --- /dev/null +++ b/src/main/resources/2018/day8.txt @@ -0,0 +1 @@ +9 11 7 3 5 5 3 6 1 6 0 7 1 5 3 5 3 6 1 3 2 1 1 3 1 1 5 0 11 9 7 4 6 9 1 1 8 1 9 2 1 3 2 2 1 1 8 0 10 8 2 8 7 7 1 9 1 8 5 3 3 2 3 1 3 1 1 4 4 5 1 3 4 3 5 1 6 0 10 1 4 7 3 8 7 4 7 1 4 3 3 1 1 1 2 1 8 0 11 1 1 7 1 1 8 5 5 4 1 5 2 3 3 3 1 1 2 3 1 9 0 11 9 1 7 3 1 6 7 2 9 5 3 3 1 3 1 3 1 2 2 2 2 3 4 5 2 3 6 1 9 0 6 1 7 4 3 6 9 3 2 2 1 1 1 3 1 3 1 7 0 9 7 7 1 8 3 2 5 9 6 3 1 1 1 3 2 3 1 6 0 9 1 6 5 4 7 9 3 2 8 3 1 2 1 3 1 2 2 1 3 2 4 3 7 1 7 0 10 8 7 9 5 9 6 4 2 1 6 2 3 2 2 3 1 3 1 5 0 10 1 4 4 7 1 9 8 9 7 6 1 2 3 3 1 1 8 0 11 3 5 3 9 7 4 9 6 6 6 1 2 3 3 1 2 1 3 3 5 5 1 4 1 2 3 3 5 1 6 0 6 9 7 8 3 1 1 1 1 1 1 1 1 1 9 0 11 8 9 7 4 9 5 5 5 8 5 1 3 2 1 1 2 2 2 2 1 1 6 0 9 3 4 4 3 7 2 1 5 7 1 2 1 1 3 2 3 5 2 5 3 4 6 7 5 4 5 4 3 7 1 7 0 11 3 2 2 1 8 8 8 2 9 6 5 1 1 1 3 1 1 1 1 7 0 11 8 9 4 9 8 7 8 7 3 1 6 3 1 1 2 3 3 2 1 9 0 7 8 1 2 1 3 1 4 1 2 3 2 2 1 2 1 3 3 1 2 3 5 3 1 3 4 1 5 0 10 8 9 4 1 3 9 3 5 2 1 1 1 1 1 2 1 6 0 10 8 7 3 7 7 4 8 1 1 3 3 2 1 2 3 2 1 6 0 6 1 3 7 7 4 2 1 2 3 3 1 2 3 1 3 4 3 5 1 6 0 11 6 1 8 3 6 2 4 2 2 7 1 2 3 2 1 1 3 1 6 0 11 8 3 2 5 1 7 5 2 5 2 1 1 1 2 1 2 3 1 8 0 7 6 9 1 9 1 7 1 2 2 3 2 3 3 1 2 2 4 5 2 1 3 7 1 6 0 9 7 5 9 9 7 6 1 3 8 3 3 2 1 3 1 1 5 0 9 8 6 6 6 9 1 5 1 9 3 3 3 1 1 1 8 0 8 1 9 6 7 6 4 7 7 2 2 2 1 3 1 2 1 1 5 4 1 3 5 3 3 6 1 6 0 8 5 8 3 4 9 7 1 1 1 1 3 3 1 3 1 9 0 11 2 9 4 3 6 2 1 6 9 8 2 1 2 1 2 3 3 2 1 3 1 5 0 8 1 7 6 7 8 9 1 5 1 1 1 1 3 2 5 2 3 4 2 2 5 3 4 4 3 3 6 1 9 0 7 9 8 3 2 4 1 8 2 1 3 2 2 2 2 1 1 1 8 0 11 2 2 1 5 5 6 6 5 8 5 4 3 3 2 1 1 2 1 2 1 8 0 10 5 6 7 3 9 1 5 7 3 9 1 2 3 1 2 2 2 2 1 2 3 3 4 5 3 4 1 5 0 6 3 1 2 1 7 1 1 3 3 1 2 1 5 0 10 1 5 8 3 1 4 2 3 1 1 1 2 1 3 2 1 6 0 10 5 9 7 3 8 8 4 1 1 3 3 1 2 3 2 2 5 3 2 1 3 7 1 5 0 10 6 2 6 1 4 2 1 5 4 1 2 3 1 1 1 1 8 0 11 8 9 4 3 6 2 2 1 1 3 3 1 3 1 2 2 1 1 2 1 8 0 9 6 8 3 5 4 5 4 1 8 2 1 3 3 1 2 1 3 2 1 3 5 3 3 4 3 6 1 6 0 6 6 4 3 8 4 1 2 2 1 3 3 1 1 5 0 10 6 2 4 6 8 4 8 1 5 2 1 1 2 3 2 1 5 0 9 5 7 1 6 2 5 7 5 2 2 3 1 1 3 1 2 1 5 1 4 3 3 5 5 5 3 5 1 9 0 11 4 7 6 6 9 3 9 3 1 3 1 3 3 3 1 1 2 3 2 1 1 8 0 8 3 9 8 4 1 1 9 4 1 2 1 1 3 2 2 3 1 8 0 7 2 1 9 6 8 3 8 3 1 3 1 3 1 1 2 2 2 1 5 1 3 7 1 5 0 10 4 3 6 7 1 5 9 1 8 9 2 1 3 1 1 1 9 0 9 6 5 4 7 3 7 1 8 5 1 1 1 2 2 3 2 2 2 1 5 0 11 1 5 4 5 9 9 3 4 6 4 9 3 3 1 2 1 5 3 3 1 2 4 1 3 6 1 9 0 7 4 6 2 1 3 5 8 3 3 3 2 3 1 2 1 2 1 7 0 8 6 2 9 5 7 9 1 1 2 1 2 1 1 3 3 1 8 0 6 2 1 3 3 1 2 1 1 1 1 1 3 3 1 1 2 4 5 2 5 3 5 1 9 0 8 8 7 2 3 1 4 8 3 3 3 2 2 1 1 3 3 1 1 6 0 10 7 2 9 6 7 1 5 5 6 2 1 1 1 1 2 2 1 9 0 7 4 5 6 1 7 4 3 2 2 1 1 1 3 1 2 2 4 1 1 3 1 3 5 1 6 0 9 1 4 8 8 9 5 3 2 9 3 3 1 3 1 3 1 9 0 9 7 1 7 1 1 3 6 3 4 2 1 2 3 3 2 1 3 3 1 6 0 11 8 1 7 5 9 1 6 1 7 4 4 3 2 1 2 2 2 5 2 1 5 2 1 2 2 5 4 5 3 3 5 1 7 0 8 2 5 1 8 9 6 7 1 2 2 1 3 3 2 1 1 6 0 6 9 1 6 7 9 8 2 3 3 1 1 3 1 5 0 7 4 5 1 8 7 6 6 1 1 1 1 3 3 1 2 1 1 3 4 1 6 0 8 9 9 7 1 5 2 2 4 2 2 1 2 1 1 1 5 0 6 6 2 1 4 7 1 2 3 3 2 1 1 7 0 8 3 5 4 1 2 1 1 4 1 1 2 3 3 2 1 2 4 2 2 3 5 1 8 0 6 3 5 3 1 9 7 1 1 2 1 3 1 3 2 1 9 0 6 3 4 7 7 8 1 1 2 1 1 2 3 1 2 2 1 7 0 6 1 1 7 8 6 1 2 3 3 3 3 1 2 1 5 3 2 4 3 7 1 5 0 6 6 8 1 4 9 6 3 1 2 1 3 1 6 0 9 9 2 4 2 1 7 1 1 3 2 1 3 3 1 1 1 7 0 6 7 4 8 8 1 8 1 2 3 1 1 1 1 2 1 5 3 4 2 2 3 6 1 6 0 7 7 5 1 5 4 4 4 3 1 1 1 2 2 1 9 0 9 1 6 6 4 9 5 6 1 5 1 3 2 3 3 2 1 1 1 1 8 0 10 9 4 1 1 5 7 4 4 2 8 3 1 1 1 2 2 1 2 5 5 3 1 1 5 6 1 4 5 3 3 6 1 8 0 8 1 3 8 2 1 8 8 1 3 2 3 1 1 2 2 2 1 7 0 6 5 7 1 6 3 1 1 2 2 3 3 2 2 1 6 0 8 2 7 9 1 4 3 5 5 1 3 1 2 1 1 3 1 3 4 2 3 3 7 1 9 0 6 1 7 7 7 4 3 3 2 2 1 2 2 3 2 1 1 5 0 7 8 5 3 7 1 3 7 3 1 2 2 1 1 5 0 7 1 4 3 7 4 6 1 1 2 1 1 3 1 2 3 3 2 5 4 3 4 1 5 0 7 7 6 1 1 4 3 1 3 1 2 2 2 1 7 0 10 8 5 1 9 3 7 4 5 3 5 2 2 3 1 2 3 3 1 9 0 10 5 5 8 2 4 1 9 9 7 9 1 2 1 1 2 1 2 3 3 3 1 2 2 3 7 1 9 0 7 5 1 5 5 5 5 5 3 1 1 1 2 1 1 1 2 1 5 0 11 1 8 7 8 2 7 4 3 8 9 2 1 2 2 3 1 1 5 0 11 7 4 1 8 9 5 7 4 1 1 8 2 1 3 1 3 1 3 5 4 4 4 4 3 4 1 7 0 10 9 1 6 7 5 7 3 3 5 9 1 1 1 3 3 1 1 1 9 0 8 8 8 5 1 6 9 4 4 3 1 3 3 3 1 1 2 1 1 7 0 6 9 1 4 6 7 2 1 1 3 3 2 1 3 3 3 3 5 5 3 5 4 4 3 6 1 9 0 9 7 4 5 7 1 6 4 2 9 1 1 1 2 2 1 2 2 1 1 8 0 10 7 5 6 9 6 5 3 7 1 1 3 1 3 3 1 3 3 3 1 7 0 9 6 1 9 8 9 9 1 9 3 2 3 2 1 3 1 3 4 4 1 2 3 2 3 7 1 5 0 10 1 1 8 5 2 1 3 9 8 8 3 3 1 1 2 1 6 0 11 9 2 3 5 2 9 8 4 6 1 4 3 3 1 1 2 2 1 6 0 11 1 8 2 6 3 1 6 6 6 1 6 3 3 1 3 3 2 3 1 2 4 3 4 3 3 7 1 7 0 6 1 9 4 7 1 4 2 3 3 1 1 2 3 1 6 0 9 5 4 5 1 8 4 5 7 2 2 1 3 2 3 1 1 8 0 7 5 1 9 3 9 3 3 3 1 3 3 2 2 2 1 2 4 4 1 3 2 2 3 7 1 6 0 9 1 4 8 8 5 2 7 1 1 3 1 1 2 3 2 1 7 0 8 4 7 6 6 1 6 7 2 2 2 1 2 2 3 3 1 7 0 8 3 3 6 1 1 6 1 7 2 3 1 2 3 3 1 5 3 5 3 1 4 5 4 4 4 6 3 4 3 7 3 4 5 3 6 1 7 0 6 7 1 8 5 1 5 1 3 2 1 2 1 3 1 5 0 8 9 3 4 5 7 1 9 3 2 1 1 2 3 1 9 0 11 1 7 5 4 1 7 2 1 4 2 7 3 1 3 3 3 3 1 1 2 5 2 1 2 5 3 3 4 1 5 0 9 8 5 4 5 1 8 8 1 1 2 3 1 3 1 1 8 0 9 8 6 3 5 6 6 8 1 5 1 3 1 3 2 1 2 2 1 9 0 9 8 8 1 1 3 2 4 7 8 3 1 2 1 3 1 1 2 1 1 2 1 3 3 7 1 5 0 11 3 1 3 3 9 1 5 9 6 4 6 1 3 3 1 3 1 7 0 7 5 2 1 1 4 8 4 1 2 3 3 1 1 3 1 7 0 11 7 3 6 3 5 5 1 6 1 8 7 1 1 1 2 1 1 3 3 5 1 3 1 3 5 3 6 1 7 0 6 6 1 3 8 5 1 2 1 1 1 3 2 2 1 6 0 10 7 6 6 3 6 2 1 8 4 5 1 1 1 1 2 3 1 5 0 11 1 1 1 3 4 2 5 1 4 3 5 3 1 3 2 3 2 1 1 1 5 2 4 4 5 4 5 5 4 3 4 1 5 0 7 8 6 1 1 8 3 1 2 2 1 3 1 1 6 0 7 1 6 7 3 4 1 1 1 1 2 1 3 2 1 9 0 10 1 9 6 1 4 7 4 4 6 2 3 1 2 1 2 3 1 1 2 2 1 3 1 3 4 1 9 0 10 6 7 7 9 1 1 8 2 3 9 1 3 3 2 2 3 3 3 1 1 9 0 10 2 6 1 9 7 1 4 6 1 4 1 3 1 2 2 2 2 3 1 1 6 0 10 6 1 3 9 4 1 7 7 5 3 3 1 1 1 3 3 1 4 4 2 3 5 1 6 0 7 5 1 3 4 7 3 8 1 1 3 3 1 2 1 6 0 6 1 7 1 1 5 4 1 1 3 1 1 1 1 9 0 7 3 9 1 9 9 1 9 2 2 2 2 1 1 3 1 2 5 5 3 5 2 3 7 1 6 0 8 1 2 5 4 5 3 2 6 3 3 2 1 1 2 1 6 0 8 3 6 5 5 4 1 1 9 2 2 2 2 1 2 1 7 0 11 1 4 1 4 2 5 1 6 9 6 5 2 1 2 2 1 2 2 1 3 1 2 1 5 1 3 6 1 5 0 9 5 8 6 6 1 1 4 5 3 1 2 1 1 3 1 9 0 7 1 8 8 3 2 2 1 2 1 3 2 3 3 1 2 1 1 9 0 10 1 8 4 8 1 2 4 3 1 6 3 2 2 1 1 1 3 1 3 1 2 2 2 1 2 1 3 1 6 5 5 3 6 1 5 0 7 4 1 2 1 2 9 3 2 2 2 1 1 1 8 0 6 6 1 1 5 2 4 1 2 1 1 3 1 2 1 1 7 0 8 9 6 3 5 7 4 9 1 1 1 3 3 1 3 3 1 2 1 5 2 1 3 7 1 6 0 9 5 9 2 1 4 4 5 5 6 2 3 3 1 2 1 1 6 0 7 9 6 1 8 8 2 1 1 3 3 1 2 1 1 5 0 6 8 3 4 8 2 1 1 1 3 1 3 5 1 2 2 4 2 1 3 5 1 9 0 8 3 3 1 1 2 9 1 6 1 3 1 1 3 1 1 1 2 1 6 0 10 4 6 6 5 5 9 6 1 1 5 3 2 2 1 3 2 1 9 0 11 7 2 1 3 1 9 7 1 7 1 5 2 2 1 1 1 1 2 3 3 5 5 1 1 2 3 5 1 8 0 10 4 5 1 8 2 6 2 5 9 4 2 1 2 2 3 3 3 3 1 8 0 8 7 3 7 1 3 2 1 3 3 3 1 3 1 1 3 3 1 6 0 11 5 1 4 6 1 6 9 8 1 2 2 1 2 1 1 2 2 3 2 2 2 3 3 4 1 5 0 8 2 2 1 6 8 4 9 1 3 1 1 2 1 1 8 0 8 8 8 3 6 9 5 2 1 2 2 1 3 3 1 3 3 1 6 0 6 4 4 6 1 2 6 3 1 1 3 3 3 4 5 2 4 4 4 5 7 3 5 5 3 7 1 7 0 7 7 2 3 1 9 1 6 3 1 1 2 2 3 1 1 5 0 8 1 1 8 1 8 6 6 4 3 1 1 1 1 1 8 0 8 6 1 1 1 3 6 3 2 2 1 3 1 1 1 2 1 3 2 1 4 1 1 1 3 6 1 8 0 7 4 1 5 1 9 6 5 3 3 1 1 2 3 3 2 1 8 0 7 1 6 9 4 7 1 7 3 1 2 2 2 2 1 1 1 5 0 8 7 9 1 8 1 3 8 3 1 3 1 3 3 2 3 3 2 3 5 3 7 1 7 0 8 2 5 6 1 3 1 5 2 1 3 2 1 2 2 1 1 7 0 9 4 1 1 1 5 6 3 1 9 2 3 3 1 2 2 1 1 8 0 8 1 6 1 1 7 3 2 7 2 1 2 3 3 3 1 1 3 3 2 1 4 3 4 3 7 1 9 0 11 1 7 5 7 8 7 6 5 6 2 5 2 3 3 2 3 3 1 3 1 1 7 0 7 4 8 4 5 1 2 6 1 1 3 1 3 3 2 1 8 0 11 4 8 2 8 6 8 4 1 7 3 5 2 2 2 1 2 2 1 1 5 3 1 2 2 1 4 3 5 1 9 0 10 4 4 3 9 2 1 1 5 4 8 2 3 1 3 2 1 1 3 1 1 8 0 9 6 7 7 3 1 9 2 5 9 1 2 1 3 1 2 3 3 1 9 0 9 7 4 3 6 3 1 8 7 3 3 1 1 3 1 1 2 1 3 3 1 1 3 1 7 6 5 5 7 5 5 3 7 1 8 0 9 6 6 1 9 7 3 5 2 3 2 3 1 3 3 1 3 3 1 7 0 8 8 8 5 4 4 5 1 8 1 3 1 2 1 1 3 1 7 0 6 8 8 4 9 9 1 2 3 3 3 1 1 2 4 3 3 4 1 3 3 3 4 1 5 0 10 2 1 5 6 4 5 1 6 1 7 3 1 3 3 3 1 5 0 9 2 6 5 8 7 5 1 7 7 1 1 3 2 3 1 7 0 8 2 8 7 7 3 3 6 1 1 1 2 2 1 3 1 1 2 2 3 3 5 1 9 0 6 8 3 7 1 6 1 1 1 1 1 2 1 1 2 1 1 7 0 10 6 2 7 1 8 9 1 8 1 1 2 2 1 2 3 2 2 1 5 0 10 1 5 3 9 2 1 7 6 7 9 3 3 3 3 1 2 1 2 2 3 3 5 1 5 0 10 9 4 4 7 6 2 2 1 2 2 3 3 3 1 2 1 8 0 8 7 2 5 7 1 6 3 1 2 3 1 1 2 1 3 2 1 7 0 8 5 9 7 5 5 2 1 9 1 2 3 3 2 2 3 5 5 2 5 3 3 4 1 7 0 8 3 5 8 8 1 5 8 2 3 2 1 2 1 3 1 1 8 0 6 3 9 9 3 1 7 1 1 2 2 2 1 1 1 1 8 0 11 1 2 9 1 8 7 8 8 2 6 2 3 3 2 1 3 3 1 3 3 1 5 3 1 5 2 3 6 5 4 3 4 1 5 0 11 9 1 7 6 1 7 3 4 7 4 6 2 1 3 1 1 1 5 0 9 1 9 7 7 1 8 5 1 1 1 3 3 1 3 1 7 0 6 5 2 7 1 3 1 1 1 2 3 2 1 3 2 3 1 2 3 6 1 7 0 9 1 5 3 2 3 6 7 2 7 1 3 3 3 3 1 1 1 6 0 6 1 1 4 8 2 9 3 3 1 1 3 3 1 9 0 7 3 8 8 6 2 1 8 3 1 3 3 1 2 3 3 2 2 2 5 3 4 2 3 4 1 9 0 8 1 4 2 6 7 8 1 3 2 3 1 3 2 2 2 3 3 1 9 0 11 3 2 3 1 8 8 3 7 9 9 7 1 2 3 1 1 1 1 2 1 1 6 0 7 5 7 8 6 9 8 1 1 2 2 2 2 1 4 1 2 5 3 6 1 8 0 10 8 7 5 7 5 8 8 5 7 1 3 3 2 1 2 2 1 2 1 6 0 7 8 7 6 6 1 1 8 2 2 2 3 1 1 1 7 0 6 7 2 9 8 4 1 3 3 3 1 1 1 2 2 2 1 1 1 1 3 4 1 9 0 9 5 9 1 2 6 2 6 3 1 1 3 3 1 1 1 2 1 1 1 6 0 11 7 8 6 9 2 9 6 2 1 1 8 3 1 3 1 2 2 1 9 0 10 7 1 7 1 9 1 6 5 2 2 1 1 3 3 2 3 1 1 1 3 4 1 1 5 2 3 2 5 5 3 5 1 7 0 10 7 5 9 9 2 1 5 8 3 1 1 1 1 3 1 2 3 1 9 0 6 1 1 5 4 6 8 1 1 3 3 3 1 2 1 1 1 8 0 11 8 9 6 6 4 1 3 7 6 1 7 3 2 2 2 1 2 1 2 1 2 3 2 4 3 5 1 9 0 10 6 1 9 1 7 8 5 5 1 2 2 2 3 2 3 1 1 3 1 1 5 0 9 6 3 3 9 7 1 2 4 3 3 3 2 1 2 1 7 0 11 1 8 7 3 7 2 8 5 1 6 5 1 1 1 1 1 2 2 2 1 4 1 2 3 5 1 8 0 6 8 2 1 7 8 9 2 1 3 1 3 1 2 3 1 6 0 9 2 3 1 3 1 9 9 3 9 2 3 3 3 3 1 1 6 0 11 5 3 8 1 6 1 9 9 3 9 6 3 1 1 3 1 3 3 5 2 1 5 3 4 1 5 0 7 6 8 4 1 9 2 5 3 2 3 1 2 1 5 0 11 9 5 3 7 1 8 5 5 4 2 7 1 1 2 3 2 1 6 0 9 2 1 3 5 2 4 1 3 4 3 1 3 3 2 3 1 2 1 1 3 7 1 7 0 11 8 2 1 8 4 9 8 1 4 1 7 2 2 1 3 3 1 2 1 6 0 10 6 4 2 1 5 3 1 4 7 8 2 2 1 2 2 1 1 8 0 8 7 8 6 1 6 5 9 4 1 3 3 3 1 3 1 2 4 5 4 1 5 4 4 3 7 2 6 2 2 1 5 7 3 4 5 3 7 1 7 0 7 6 9 2 6 5 1 7 3 3 1 2 3 2 1 1 9 0 8 9 3 1 9 2 7 1 7 2 1 1 2 1 2 2 1 1 1 9 0 9 4 4 6 1 1 5 7 7 2 3 1 1 2 1 2 3 3 3 2 4 2 1 3 4 2 3 4 1 5 0 11 7 3 1 6 6 2 3 6 5 2 5 1 3 3 1 2 1 5 0 8 5 8 8 4 4 3 1 4 3 2 3 2 1 1 9 0 10 6 2 6 1 9 4 1 5 2 1 2 3 3 1 2 3 1 1 1 2 1 4 3 3 7 1 9 0 9 1 9 1 7 5 9 8 3 2 3 2 1 2 3 3 3 3 2 1 9 0 11 2 3 2 7 7 3 3 4 1 4 7 1 3 3 1 2 2 2 2 1 1 5 0 7 6 1 7 3 9 8 1 2 3 2 1 1 4 1 5 4 4 3 3 3 7 1 9 0 7 4 3 1 8 2 2 7 2 1 2 1 2 2 1 1 3 1 8 0 9 7 9 1 6 6 2 3 1 5 2 3 1 1 1 2 3 2 1 8 0 10 6 1 8 9 6 4 3 8 8 3 3 3 1 3 2 2 3 3 2 1 2 4 4 2 1 4 4 6 3 6 5 5 3 5 1 7 0 9 8 1 7 6 4 4 3 1 5 3 3 3 1 2 1 1 1 7 0 6 2 5 3 1 9 2 1 2 2 1 2 1 1 1 5 0 9 5 9 7 7 2 1 7 9 3 1 1 2 1 3 3 1 4 2 3 3 4 1 9 0 11 4 6 2 4 2 6 1 9 4 1 9 2 2 1 2 2 2 1 1 1 1 8 0 6 5 1 9 1 9 8 2 3 2 1 3 1 1 2 1 6 0 7 4 1 2 8 1 6 4 1 1 2 3 2 2 3 4 1 3 3 6 1 9 0 11 6 3 4 1 5 5 1 8 8 8 6 3 2 2 3 3 2 1 2 2 1 5 0 8 6 8 6 6 1 8 7 2 1 1 2 1 3 1 5 0 6 1 6 9 9 1 3 1 3 3 3 2 3 2 5 2 3 5 3 6 1 6 0 9 2 6 1 3 6 3 8 4 6 3 2 2 1 1 1 1 9 0 11 1 7 1 4 9 5 5 4 6 5 5 2 2 2 2 1 1 1 1 3 1 6 0 9 5 4 7 2 4 1 7 1 2 3 1 2 3 1 2 4 3 4 2 1 5 3 6 1 6 0 7 1 1 5 8 1 2 2 3 3 1 1 2 2 1 5 0 9 1 4 7 1 7 6 7 1 7 1 2 1 1 1 1 9 0 10 1 1 6 5 9 1 9 1 1 7 1 3 3 3 1 2 1 3 3 4 2 3 4 2 1 2 5 5 5 1 4 3 3 4 1 7 0 8 9 1 6 2 8 3 5 9 3 2 3 3 1 2 3 1 9 0 6 6 6 1 2 5 9 1 2 3 1 1 3 3 1 2 1 7 0 7 7 3 9 2 3 8 1 1 3 1 1 2 2 3 3 1 4 2 3 4 1 6 0 10 1 1 1 8 3 2 1 8 7 2 3 1 1 1 1 1 1 8 0 8 1 3 4 7 7 8 6 1 2 1 1 2 1 2 2 2 1 8 0 6 2 1 8 3 5 7 1 2 1 1 1 2 1 1 5 3 1 5 3 4 1 5 0 7 4 3 3 1 5 7 9 2 1 1 3 1 1 6 0 7 5 7 1 7 3 2 7 3 2 1 3 2 1 1 6 0 6 1 7 3 3 2 1 1 2 1 2 2 1 1 2 4 2 3 6 1 5 0 9 1 1 6 6 4 6 9 8 2 3 2 1 2 1 1 8 0 11 8 2 1 5 8 4 8 8 9 4 4 1 2 2 1 2 1 1 1 1 7 0 11 1 8 1 7 6 9 4 5 7 8 7 2 3 3 2 1 1 2 2 1 1 1 5 2 1 4 4 4 3 3 7 1 7 0 9 2 9 5 6 1 9 6 5 6 3 1 1 2 1 2 2 1 7 0 10 1 6 6 1 6 2 5 2 3 3 3 3 1 1 1 2 1 1 9 0 8 1 1 4 3 6 4 3 1 3 2 1 1 1 2 3 3 2 1 2 1 4 3 3 3 3 6 1 9 0 8 4 4 4 7 2 8 7 1 3 3 1 2 1 2 3 1 1 1 8 0 6 1 7 8 3 9 7 2 3 2 1 2 3 1 1 1 8 0 11 8 8 9 1 1 7 5 3 7 1 1 3 3 2 1 1 3 1 1 3 5 2 4 3 3 3 6 1 9 0 11 1 7 3 8 5 8 1 3 8 9 1 3 2 1 1 2 1 3 1 1 1 9 0 11 3 7 8 1 3 2 5 5 1 2 5 1 2 3 1 3 1 3 2 2 1 7 0 11 2 2 4 2 3 7 1 3 4 1 2 1 2 3 1 2 2 2 3 3 2 3 1 2 3 4 1 6 0 10 7 3 4 7 6 6 4 3 1 6 2 1 3 1 1 3 1 8 0 10 1 6 2 9 2 1 7 8 4 5 3 1 3 1 2 3 1 2 1 8 0 7 2 1 1 4 4 4 3 3 1 1 2 2 1 3 1 5 5 2 3 4 3 1 5 5 3 6 1 9 0 8 3 2 5 6 6 5 1 9 3 1 2 2 3 1 2 3 2 1 6 0 7 9 1 8 8 6 1 9 2 1 2 1 1 3 1 7 0 6 2 5 5 1 5 4 2 1 3 3 2 1 2 4 5 2 3 1 3 3 7 1 9 0 8 7 1 7 1 1 2 9 9 1 3 2 1 3 1 1 1 1 1 6 0 6 6 1 9 7 3 7 1 1 1 2 3 3 1 8 0 6 1 1 3 3 4 2 3 3 1 2 3 1 2 1 2 1 5 2 4 2 3 3 6 1 5 0 11 1 3 4 9 1 5 7 1 1 8 1 1 3 2 2 1 1 8 0 10 1 3 3 6 1 9 5 3 4 8 1 3 3 1 1 1 1 1 1 7 0 7 2 1 5 2 4 6 2 1 3 2 1 3 2 2 4 2 5 5 3 2 3 5 1 5 0 8 9 2 9 4 1 4 1 9 1 3 3 1 1 1 7 0 7 4 1 6 5 6 3 4 2 1 2 1 3 2 1 1 5 0 7 9 7 1 5 3 5 4 3 3 2 1 2 4 4 5 1 1 3 4 1 8 0 11 7 8 1 1 9 8 6 9 5 1 7 2 1 1 1 2 1 1 3 1 5 0 11 5 4 2 1 3 2 2 1 5 4 5 2 2 2 2 1 1 7 0 8 4 8 1 9 5 7 2 3 2 1 2 1 1 3 1 3 3 1 4 6 4 1 5 4 5 3 3 6 1 9 0 6 2 2 7 9 1 1 1 3 2 3 1 3 2 1 1 1 8 0 8 2 4 7 1 3 1 7 9 3 3 1 1 3 3 3 1 1 8 0 11 9 3 4 9 1 8 7 4 7 9 9 1 2 1 2 2 1 3 3 1 3 2 4 3 2 3 6 1 9 0 11 2 9 3 7 3 2 8 4 1 7 1 1 2 1 3 2 3 2 2 2 1 5 0 11 3 2 8 2 1 1 5 3 4 1 4 3 1 1 1 3 1 8 0 9 8 6 6 2 5 2 1 3 6 2 2 2 3 2 1 3 1 3 5 1 1 4 3 3 4 1 7 0 7 9 6 3 1 1 6 7 1 2 1 2 3 3 1 1 6 0 10 9 3 9 1 9 2 8 4 4 7 1 1 1 3 2 1 1 7 0 8 1 9 9 9 5 5 4 7 2 1 3 3 1 1 2 1 2 1 1 3 6 1 8 0 8 2 1 3 9 3 4 9 5 3 1 1 2 2 3 2 1 1 7 0 9 8 4 9 8 3 1 5 4 9 1 1 1 2 2 1 2 1 7 0 6 2 6 1 8 8 3 2 2 1 2 2 1 3 1 2 1 4 4 3 3 5 1 8 0 11 6 3 4 2 6 1 7 3 8 2 4 1 2 3 1 3 1 3 2 1 8 0 8 7 2 4 1 4 2 6 6 1 1 1 1 3 1 3 3 1 6 0 10 3 3 2 3 1 7 6 5 9 9 1 3 2 1 3 1 5 3 1 1 4 1 5 2 5 5 3 4 1 5 0 10 2 4 6 6 3 1 5 2 6 3 1 3 3 2 2 1 9 0 10 1 7 1 9 4 6 5 8 5 1 1 1 3 3 3 1 1 1 2 1 6 0 9 3 5 8 9 4 7 6 1 6 1 1 1 1 1 3 2 2 2 3 3 7 1 8 0 10 9 9 5 4 5 5 9 4 1 7 1 1 2 3 1 1 3 1 1 9 0 8 3 7 3 7 8 7 8 1 3 1 1 1 3 3 1 1 3 1 7 0 10 1 6 3 5 9 8 2 7 3 6 3 1 3 1 2 1 2 5 1 3 1 3 1 3 3 4 1 9 0 10 8 6 4 3 4 3 1 9 8 4 3 1 3 1 3 1 3 1 1 1 9 0 9 7 7 8 9 6 9 3 1 1 1 1 1 3 2 3 2 1 3 1 7 0 11 9 1 6 2 3 3 6 5 8 1 9 1 1 2 1 3 3 2 3 1 2 4 3 7 1 5 0 8 5 1 1 5 3 4 2 3 2 1 2 1 1 1 5 0 10 6 3 6 6 3 9 8 2 1 3 1 1 2 2 1 1 8 0 8 4 1 9 4 6 8 7 6 1 2 2 1 3 2 3 3 1 3 2 3 3 5 1 3 6 1 5 0 9 8 9 4 2 1 5 2 4 8 3 1 3 2 1 1 5 0 7 5 4 1 2 5 1 4 1 1 3 3 1 1 9 0 6 9 8 1 9 9 8 3 3 2 1 1 2 1 2 3 2 3 2 5 5 3 7 6 3 7 2 3 1 5 6 3 5 5 3 7 1 7 0 10 5 2 8 1 9 9 2 5 4 2 2 1 1 3 1 3 1 1 5 0 10 9 3 2 8 9 4 6 8 6 1 2 2 1 3 3 1 6 0 9 6 7 8 5 2 5 2 5 1 3 1 1 2 2 2 5 3 5 4 2 1 5 3 6 1 6 0 8 4 4 1 2 1 2 9 8 2 1 2 1 2 1 1 8 0 11 7 2 8 1 4 1 3 3 9 8 3 1 2 1 1 3 1 1 1 1 8 0 11 1 5 4 1 5 2 5 3 6 4 1 1 3 3 1 3 2 3 1 2 3 3 5 5 4 3 6 1 9 0 10 3 1 9 7 6 8 4 5 9 7 3 2 3 3 1 3 1 2 2 1 6 0 6 6 2 4 9 5 1 3 1 1 3 2 2 1 9 0 11 1 3 4 8 3 8 1 4 3 1 5 3 3 1 2 3 2 1 1 1 2 2 4 1 1 3 3 7 1 7 0 9 4 9 9 8 1 2 5 1 7 1 1 1 1 3 3 3 1 6 0 11 6 5 9 5 2 1 2 6 9 4 3 1 2 1 3 2 1 1 8 0 7 1 2 5 6 3 6 9 2 2 2 1 1 3 3 1 3 2 3 3 2 5 1 3 7 1 7 0 6 3 1 8 1 4 9 1 1 1 2 1 3 1 1 7 0 6 1 2 6 7 8 1 1 2 1 1 3 2 1 1 6 0 9 3 9 5 1 4 3 4 4 1 3 2 1 3 3 2 4 4 2 1 4 3 4 4 5 3 3 6 4 5 3 6 1 6 0 7 5 2 6 1 2 1 1 2 3 3 1 1 2 1 9 0 10 1 5 1 9 5 2 1 6 1 1 3 1 1 3 3 1 3 3 1 1 5 0 8 9 7 3 7 4 1 7 4 3 2 2 1 3 3 1 3 4 1 5 3 7 1 8 0 6 1 5 7 2 1 3 1 1 3 3 1 1 1 1 1 9 0 6 3 1 8 2 5 5 3 1 3 1 3 1 1 2 3 1 8 0 7 9 1 4 7 1 5 5 3 2 2 1 1 1 3 1 5 2 1 2 5 5 3 3 6 1 9 0 10 1 8 3 1 1 3 6 5 8 3 1 2 2 2 2 1 1 1 1 1 7 0 8 9 5 1 4 3 5 7 5 1 1 1 3 1 1 3 1 6 0 8 6 2 8 2 9 1 5 1 2 1 2 1 3 1 1 5 5 3 1 5 3 4 1 6 0 6 6 1 5 4 7 8 1 2 2 2 2 1 1 7 0 6 6 5 3 1 2 8 1 2 2 3 3 1 1 1 5 0 8 7 3 6 8 1 1 9 3 2 3 1 3 1 2 4 2 2 5 2 5 2 2 4 5 3 7 1 5 0 9 1 1 2 8 2 3 6 2 8 1 3 3 1 1 1 9 0 11 2 5 1 8 1 2 1 7 9 7 1 2 2 1 3 3 1 1 3 1 1 5 0 8 6 5 7 9 1 5 3 2 2 1 3 1 1 1 2 3 3 5 3 3 3 5 1 6 0 7 8 6 8 6 1 5 8 2 1 3 2 3 1 1 9 0 8 7 4 1 3 8 7 4 8 2 3 1 2 2 1 2 1 1 1 7 0 7 6 3 2 5 1 1 1 1 2 2 1 2 2 3 2 5 5 3 2 3 6 1 6 0 11 3 2 1 2 5 8 7 9 7 7 6 1 3 1 3 1 2 1 8 0 6 8 9 1 3 7 8 3 3 3 1 2 1 3 2 1 7 0 6 1 7 1 7 8 4 2 3 2 1 2 1 2 5 3 4 5 3 1 3 5 1 6 0 7 3 1 9 5 7 7 2 3 1 2 2 1 2 1 6 0 10 5 1 5 8 4 7 8 1 1 4 3 1 2 2 1 2 1 8 0 9 3 2 2 8 1 7 3 9 1 2 1 3 2 3 2 1 1 4 2 1 5 3 5 5 6 4 6 5 5 3 4 1 8 0 7 3 1 7 4 8 8 7 2 3 3 1 1 1 1 3 1 6 0 7 1 1 6 1 7 7 3 3 3 2 3 3 1 1 5 0 7 5 3 9 4 1 2 6 1 3 1 2 2 3 1 2 5 3 7 1 6 0 8 3 1 2 5 6 8 1 7 2 1 3 1 1 2 1 6 0 10 1 4 7 9 8 8 4 5 3 6 3 2 1 1 2 3 1 7 0 10 4 7 3 4 7 7 1 8 8 3 1 1 1 3 1 2 2 4 3 2 2 3 4 4 3 5 1 6 0 10 5 7 2 1 1 1 1 9 6 6 3 2 1 3 1 2 1 7 0 7 9 7 2 3 2 1 6 3 3 1 2 1 3 1 1 7 0 6 6 1 9 7 7 7 2 1 2 1 2 1 1 1 3 2 2 1 3 6 1 8 0 9 1 6 8 3 1 2 2 3 4 1 3 1 1 1 1 3 3 1 6 0 6 2 7 1 6 7 3 1 1 1 1 3 3 1 7 0 9 1 2 5 8 9 7 6 8 5 1 2 1 1 1 1 1 1 3 3 3 2 2 3 7 1 8 0 11 2 1 3 1 3 8 3 3 2 6 9 2 3 1 2 3 1 3 1 1 6 0 9 1 4 2 1 9 4 4 9 4 3 2 1 1 1 2 1 9 0 6 7 4 9 5 1 9 3 3 1 2 1 2 2 2 3 3 4 3 2 1 1 1 2 4 3 1 3 5 5 3 4 1 5 0 6 3 6 1 4 3 4 1 3 2 3 3 1 8 0 8 8 1 1 8 2 1 1 2 2 1 2 3 1 2 3 3 1 7 0 8 4 8 5 9 1 2 1 5 3 3 3 3 1 3 1 1 3 4 5 3 6 1 6 0 6 2 9 5 1 1 5 2 2 1 1 3 3 1 7 0 11 8 4 9 1 1 6 9 9 8 9 7 3 3 2 3 2 2 1 1 8 0 6 2 1 9 1 5 8 1 1 1 2 3 2 1 3 1 1 5 1 2 5 3 6 1 9 0 10 5 6 1 7 8 2 9 8 8 7 1 3 3 1 3 3 2 2 1 1 9 0 7 1 2 2 7 2 1 6 2 1 1 1 2 3 1 1 3 1 8 0 11 1 4 4 7 8 1 7 1 1 4 3 3 1 1 3 1 3 1 2 2 1 5 1 5 3 3 5 1 8 0 6 1 6 5 9 1 1 3 1 1 1 3 2 2 3 1 8 0 6 1 5 7 6 1 2 1 3 2 1 1 1 1 3 1 8 0 9 8 6 5 4 4 1 4 7 1 3 1 2 2 2 2 3 1 3 3 1 3 4 3 7 1 6 0 8 3 9 3 2 7 1 9 1 1 3 2 3 1 3 1 7 0 9 8 3 1 2 1 2 6 6 7 1 2 1 3 1 1 1 1 8 0 11 3 3 4 1 9 7 1 3 1 4 1 1 2 3 2 2 2 1 2 4 3 3 1 4 1 3 2 3 2 6 1 5 4 3 7 1 6 0 8 7 1 7 4 5 1 7 9 1 1 3 1 1 1 1 6 0 11 1 7 1 3 9 7 3 7 1 5 7 1 2 2 3 1 1 1 9 0 7 7 9 1 2 5 5 1 3 1 1 3 1 1 3 1 3 4 2 1 1 5 1 4 3 4 1 6 0 7 5 7 2 5 4 6 1 2 1 3 3 1 1 1 9 0 6 2 3 1 5 1 5 2 2 1 2 3 2 2 1 3 1 6 0 10 1 9 4 8 5 1 7 3 9 3 1 1 1 3 3 1 5 2 3 1 3 6 1 6 0 6 2 6 1 3 1 6 3 2 2 1 1 1 1 9 0 11 9 9 9 1 1 5 3 1 5 2 3 2 2 2 2 1 1 1 2 3 1 9 0 8 3 4 7 8 6 2 9 1 1 2 2 2 1 1 2 2 2 1 1 1 2 3 3 3 4 1 8 0 11 9 1 7 9 3 5 7 2 8 2 1 1 3 2 3 2 1 2 1 1 9 0 11 2 3 1 1 2 1 2 3 5 8 3 2 1 1 1 3 3 2 2 2 1 7 0 7 8 4 4 8 9 1 2 2 2 1 1 1 2 3 3 5 3 2 3 4 1 7 0 7 2 1 7 4 2 7 8 3 2 1 2 3 1 1 1 9 0 10 1 9 7 9 3 6 3 8 5 4 2 1 2 2 1 2 1 2 3 1 6 0 7 1 1 9 1 5 5 1 1 1 1 2 1 3 2 2 3 5 3 1 5 5 3 7 1 6 3 5 5 3 7 1 8 0 10 4 4 5 9 5 9 6 7 1 8 2 1 1 2 2 3 2 1 1 8 0 7 5 8 1 5 8 9 7 3 2 1 2 3 3 2 1 1 7 0 11 9 5 7 1 3 1 8 7 3 1 3 1 1 2 2 3 3 3 2 5 1 3 5 3 5 3 4 1 9 0 9 9 7 6 6 8 9 1 5 7 3 2 3 1 1 2 1 3 2 1 9 0 7 6 1 5 6 1 3 2 1 3 3 1 2 3 2 2 3 1 6 0 7 1 9 6 8 2 1 5 1 3 2 2 1 1 3 1 2 3 3 6 1 6 0 11 7 2 4 4 4 1 7 1 5 1 4 2 1 1 2 2 1 1 6 0 9 1 8 5 8 5 9 7 5 1 2 3 1 3 3 2 1 9 0 10 1 2 8 5 1 1 9 2 1 1 1 3 3 2 2 1 2 1 1 1 1 5 1 4 4 3 6 1 9 0 7 8 1 9 4 5 4 3 2 3 1 1 1 2 1 3 3 1 9 0 10 2 1 6 1 8 2 3 4 1 5 1 1 3 1 1 1 1 1 1 1 6 0 8 1 4 2 1 3 9 1 2 3 1 2 2 1 2 5 2 1 3 2 1 3 6 1 8 0 7 1 1 1 5 1 1 2 1 3 2 1 1 3 3 2 1 5 0 7 5 9 1 8 5 2 5 3 3 1 3 3 1 9 0 7 7 1 8 6 6 4 7 3 1 3 3 1 3 3 3 3 5 2 4 3 3 4 3 4 1 4 5 5 3 3 7 1 5 0 10 6 9 8 1 5 7 8 7 1 7 2 2 3 1 3 1 6 0 10 1 6 7 5 2 8 9 4 5 1 3 1 1 2 1 1 1 6 0 7 8 1 1 9 3 4 8 2 1 3 1 1 3 1 5 3 2 5 2 3 3 5 1 9 0 11 2 3 1 6 6 3 7 3 5 8 5 2 3 1 1 3 1 2 3 2 1 7 0 8 2 1 1 7 3 8 7 9 3 1 2 2 2 2 1 1 6 0 7 1 6 8 4 7 3 6 2 2 2 1 2 3 3 2 2 1 1 3 5 1 9 0 9 4 1 1 5 3 5 6 7 1 1 3 3 2 2 1 2 2 1 1 5 0 8 9 5 9 2 1 8 1 6 3 3 3 2 1 1 8 0 10 7 1 8 6 5 8 7 1 1 1 1 2 3 1 2 1 3 1 4 3 3 3 3 3 6 1 7 0 8 1 7 4 6 2 2 9 7 1 1 3 2 3 1 2 1 6 0 11 2 8 4 1 8 8 7 6 6 6 5 3 1 1 3 3 1 1 8 0 8 4 1 4 6 4 1 6 2 1 2 2 2 1 3 1 3 4 3 2 3 1 2 3 5 1 6 0 11 4 6 1 4 1 3 8 7 1 9 4 3 2 1 1 1 2 1 5 0 10 8 1 4 7 2 1 9 1 7 1 3 1 2 2 1 1 9 0 10 7 1 9 9 1 9 8 3 9 4 1 2 1 2 1 2 1 3 1 4 4 5 3 2 2 4 1 5 4 3 7 1 8 0 10 5 7 1 2 7 7 1 1 4 8 2 2 3 1 1 3 1 2 1 7 0 9 4 2 9 1 5 4 4 1 8 1 2 1 3 1 3 3 1 6 0 6 4 1 4 7 9 1 1 3 2 1 1 2 3 4 4 3 1 4 3 3 5 1 7 0 9 5 2 9 1 2 6 5 2 3 1 3 3 2 3 1 2 1 8 0 10 6 5 2 1 4 1 2 3 2 1 2 2 2 2 2 2 1 1 1 8 0 6 9 1 8 1 8 4 1 1 2 1 2 2 1 1 1 3 1 4 2 3 7 1 6 0 8 2 1 5 6 9 1 7 1 1 3 2 1 1 1 1 8 0 11 6 7 6 7 1 3 5 3 3 3 4 1 1 2 2 3 2 2 2 1 8 0 9 4 9 4 9 5 2 7 1 1 3 1 2 3 2 3 2 1 3 1 4 5 2 2 2 3 7 1 9 0 11 5 9 1 2 3 2 5 3 1 9 4 1 1 2 2 2 1 2 3 1 1 9 0 8 1 8 1 1 9 6 8 8 2 2 2 3 2 2 1 2 1 1 8 0 9 5 7 9 2 5 1 3 9 5 3 3 2 1 1 3 1 3 2 1 3 1 5 3 2 3 5 1 6 0 8 1 8 3 8 6 2 3 9 1 1 3 3 1 3 1 9 0 11 1 4 5 1 9 6 7 2 1 7 9 2 1 3 2 3 3 3 2 2 1 5 0 9 2 7 1 7 5 4 5 4 4 1 1 3 3 2 3 2 2 3 4 1 2 5 1 4 4 3 5 1 6 0 11 8 8 1 3 3 7 8 2 1 8 2 3 2 2 1 1 3 1 8 0 6 7 1 8 8 5 8 1 1 2 3 2 2 3 1 1 5 0 9 3 6 1 5 1 6 6 1 3 3 1 1 1 1 1 4 1 2 3 3 5 1 8 0 8 7 3 1 8 1 3 4 4 1 3 3 1 1 1 3 2 1 7 0 9 3 4 8 8 2 7 6 2 1 1 1 1 2 1 1 1 1 7 0 10 8 3 8 1 1 1 3 7 8 5 3 1 3 1 2 1 3 2 2 2 2 2 3 5 1 5 0 10 1 1 7 8 4 8 9 4 6 6 1 2 1 3 2 1 9 0 11 9 2 5 2 7 1 2 4 8 1 9 2 1 2 2 1 2 2 3 3 1 6 0 8 9 7 5 8 2 1 2 2 2 3 1 3 3 1 1 4 1 3 5 3 6 1 5 0 8 9 7 1 3 5 2 1 4 1 1 3 2 3 1 9 0 11 9 3 9 8 1 7 6 7 6 7 1 3 3 1 1 2 1 3 3 2 1 8 0 11 8 5 9 1 7 2 6 8 7 1 4 1 1 1 3 1 1 3 1 2 3 2 5 5 3 6 2 2 2 5 5 3 5 1 6 0 11 1 9 6 1 8 8 8 2 3 4 7 2 1 2 1 3 2 1 9 0 6 1 1 2 3 5 9 2 2 3 1 3 2 3 1 1 1 5 0 10 8 1 7 6 5 5 2 4 5 2 1 1 1 2 1 4 5 2 1 3 3 4 1 8 0 11 4 1 8 4 8 9 2 3 6 6 3 1 1 2 3 1 3 3 3 1 8 0 8 2 2 8 7 1 3 4 3 3 3 1 3 2 3 1 2 1 7 0 8 5 5 9 5 8 3 5 1 2 3 3 2 1 1 1 2 1 2 1 3 6 1 7 0 11 7 1 5 2 4 8 4 1 8 1 7 2 1 2 1 3 1 1 1 9 0 8 5 7 1 2 5 4 5 9 1 2 3 2 1 1 2 1 3 1 9 0 11 9 8 9 8 4 1 5 1 2 4 1 1 3 2 1 1 3 3 1 2 1 1 3 4 2 3 3 6 1 9 0 10 2 1 6 6 1 9 4 7 4 7 2 2 2 3 2 2 3 1 2 1 9 0 9 7 8 5 1 3 1 4 8 1 3 2 3 3 2 3 1 2 1 1 6 0 7 4 6 5 1 6 2 7 1 3 2 1 1 3 1 3 3 4 4 4 3 6 1 7 0 9 5 7 6 4 9 4 4 1 7 2 3 1 1 2 2 2 1 8 0 10 1 2 4 5 1 7 8 3 3 3 3 1 3 3 1 2 3 3 1 6 0 10 3 8 1 2 2 2 9 9 1 8 3 2 2 3 1 1 3 5 3 5 1 3 1 4 4 7 5 5 4 3 6 1 8 0 10 4 1 2 4 6 8 8 8 2 6 2 3 1 2 1 1 3 1 1 5 0 8 5 3 5 2 1 7 9 9 3 1 1 3 3 1 8 0 8 1 2 6 8 1 3 8 7 2 3 2 3 3 1 3 2 5 3 1 5 5 5 3 5 1 7 0 9 6 9 4 1 7 9 8 2 9 2 1 2 1 3 1 3 1 9 0 6 2 9 5 7 9 1 3 1 1 1 3 3 1 3 2 1 6 0 7 6 2 9 1 1 7 7 3 1 2 2 1 3 3 3 1 3 3 3 4 1 9 0 11 1 7 9 1 1 1 4 6 7 9 1 3 3 1 3 2 2 3 3 1 1 6 0 8 2 2 5 4 1 1 7 1 1 1 2 1 3 2 1 5 0 6 7 4 1 1 3 2 2 2 1 1 2 5 5 3 2 3 4 1 9 0 6 8 5 2 8 1 1 2 1 1 1 2 3 3 1 3 1 8 0 8 4 8 1 6 2 8 1 8 3 3 3 2 1 2 2 2 1 8 0 6 2 8 8 8 1 7 1 1 2 3 2 2 3 3 3 1 1 4 3 7 1 6 0 8 1 5 8 2 7 6 9 1 3 1 3 2 1 2 1 7 0 6 6 9 6 1 6 1 1 1 1 1 3 1 1 1 6 0 7 3 7 5 4 5 1 3 2 3 1 2 2 3 3 5 1 1 3 2 5 6 4 1 5 4 3 2 6 3 5 5 3 6 1 9 0 8 1 5 4 1 6 8 6 4 2 2 2 2 1 1 3 1 3 1 5 0 7 1 7 4 5 6 6 7 3 1 1 3 1 1 6 0 9 5 1 4 8 3 9 9 1 6 3 1 1 2 1 3 1 3 2 3 1 1 3 5 1 5 0 11 6 1 7 9 9 1 5 7 3 7 8 2 1 3 3 1 1 9 0 7 3 2 8 7 7 1 2 1 2 1 1 2 1 3 3 3 1 9 0 11 6 3 6 8 8 7 1 1 6 5 1 3 3 3 3 1 3 3 2 2 3 2 5 4 2 3 5 1 6 0 11 4 1 7 1 6 3 1 6 6 4 2 1 2 2 1 1 3 1 9 0 10 1 9 2 4 4 6 6 8 9 5 2 2 1 2 1 3 3 3 3 1 8 0 7 8 7 2 4 5 1 6 3 3 1 1 1 1 2 1 5 4 4 5 2 3 7 1 6 0 8 1 9 6 5 1 8 5 5 1 2 1 1 1 2 1 7 0 10 6 6 6 5 4 9 1 8 3 1 2 1 3 2 1 1 3 1 8 0 8 8 7 1 8 3 3 7 8 1 1 1 3 1 1 2 3 1 2 4 3 4 3 2 3 6 1 6 0 8 3 4 6 7 7 1 8 3 3 1 1 3 1 1 1 8 0 8 5 1 5 7 1 7 3 6 1 1 3 1 1 2 3 2 1 8 0 10 7 1 8 1 3 5 8 4 3 4 2 1 2 1 1 2 2 2 5 1 1 3 4 2 4 2 1 1 4 5 3 3 7 1 5 0 7 9 1 2 8 1 5 2 3 3 1 1 2 1 9 0 8 7 1 6 9 1 6 1 3 1 2 3 1 1 2 3 1 2 1 5 0 9 1 6 3 7 6 5 9 7 2 1 3 1 2 3 2 1 3 3 1 3 3 3 5 1 8 0 7 8 9 1 3 2 1 3 2 2 2 1 3 2 3 1 1 9 0 9 9 1 6 5 8 5 8 6 1 3 1 1 1 1 3 3 2 2 1 9 0 11 1 4 8 5 1 1 2 6 1 9 1 2 1 1 3 1 1 2 1 3 4 3 4 3 3 3 5 1 9 0 7 9 9 8 8 1 5 6 3 2 1 2 1 1 2 1 1 1 6 0 10 4 5 1 5 7 4 1 9 5 9 1 2 1 1 2 2 1 6 0 7 7 5 8 1 9 7 4 1 3 1 2 2 2 3 4 3 3 2 3 4 1 9 0 9 3 2 1 6 9 1 5 1 1 3 1 2 3 2 1 1 2 2 1 5 0 6 7 7 5 9 1 1 2 3 3 1 3 1 9 0 8 5 1 8 5 5 5 3 2 1 3 3 3 3 1 2 2 2 5 2 5 3 3 4 1 8 0 7 8 4 4 1 9 8 1 3 2 1 1 1 1 3 3 1 6 0 9 1 3 8 8 4 8 7 7 7 2 3 1 3 1 2 1 8 0 7 8 5 8 1 7 9 3 2 2 1 3 3 3 3 3 1 3 4 2 7 4 5 5 3 3 4 1 8 0 9 4 1 3 5 2 8 7 7 2 1 3 3 1 1 3 2 1 1 7 0 7 9 9 1 9 6 2 6 3 1 3 3 1 2 2 1 7 0 8 2 4 7 3 1 6 8 1 1 3 2 1 3 1 1 3 2 4 2 3 7 1 8 0 10 7 9 3 6 1 1 9 3 5 2 3 2 3 2 1 1 2 1 1 7 0 7 9 5 2 3 6 4 1 1 2 2 3 1 2 1 1 9 0 9 7 4 9 9 4 3 1 1 6 2 3 1 3 1 1 2 1 2 5 2 1 5 2 2 1 3 4 1 5 0 11 2 6 3 8 1 9 6 5 8 3 2 3 2 1 2 2 1 6 0 8 2 1 3 4 3 1 5 4 2 2 3 1 2 3 1 7 0 10 1 3 4 6 7 9 6 2 5 3 2 1 2 1 1 3 1 5 5 1 4 3 7 1 5 0 7 5 2 3 8 1 8 4 1 1 1 3 1 1 6 0 6 4 3 1 3 5 1 1 2 1 2 3 1 1 9 0 8 7 9 8 1 7 1 2 6 1 3 2 3 1 2 1 2 1 4 4 2 2 2 1 1 3 4 1 5 0 7 3 5 2 6 1 2 3 3 2 1 1 1 1 5 0 8 9 4 9 8 4 1 1 6 1 2 1 1 1 1 5 0 6 2 1 4 5 7 9 1 1 2 1 1 2 3 5 1 4 4 6 4 5 3 5 1 8 0 11 6 5 2 5 6 5 1 5 4 5 1 2 2 1 1 2 3 1 1 1 8 0 7 1 4 4 2 1 2 7 2 3 1 1 1 3 3 3 1 8 0 10 6 5 2 7 1 1 9 1 2 6 1 1 3 1 3 2 2 2 1 2 5 5 3 3 6 1 5 0 10 4 9 8 3 2 2 5 2 2 1 1 1 2 2 1 1 7 0 8 4 1 7 2 1 1 1 3 1 3 3 2 3 1 3 1 5 0 7 1 7 2 4 3 6 1 1 2 2 2 3 3 4 5 4 1 1 3 6 1 5 0 10 8 9 1 1 1 2 6 9 2 6 1 1 2 2 1 1 9 0 10 7 7 7 9 4 6 1 4 9 2 2 2 2 2 1 2 2 1 3 1 7 0 8 1 4 9 9 9 3 6 2 3 3 3 1 2 2 1 5 4 3 3 5 1 3 4 1 5 0 6 5 5 3 7 1 9 3 1 1 2 2 1 5 0 6 1 1 8 4 7 6 1 1 1 2 3 1 6 0 6 6 7 9 1 2 8 2 1 2 3 2 2 1 4 5 4 3 1 2 1 3 4 5 3 7 1 9 0 9 5 1 2 3 9 3 8 5 4 3 1 2 3 3 1 3 3 1 1 6 0 10 2 8 1 5 9 5 8 3 1 1 2 2 2 1 3 3 1 5 0 11 8 1 1 8 9 5 1 3 2 1 6 3 1 2 2 2 5 5 4 3 2 4 4 3 6 1 5 0 7 6 8 3 5 1 1 1 3 1 1 1 1 1 8 0 7 9 2 1 1 6 3 8 2 1 2 1 2 2 2 2 1 6 0 7 5 9 2 3 1 6 6 1 1 3 1 3 2 1 4 2 1 2 2 3 4 1 9 0 8 3 8 2 6 9 2 1 8 3 1 3 1 3 1 1 1 3 1 7 0 8 1 9 5 6 2 8 9 8 2 3 3 2 1 3 2 1 5 0 9 1 9 1 2 7 6 8 2 3 3 3 3 1 2 4 4 5 3 3 7 1 8 0 10 4 3 9 1 6 9 8 3 3 8 1 1 2 3 2 1 1 1 1 8 0 6 4 9 4 1 8 1 3 3 2 1 1 1 1 1 1 7 0 7 3 8 2 1 6 1 6 3 1 1 3 3 1 2 2 3 2 2 1 3 1 6 1 4 4 1 5 5 3 7 1 5 0 8 5 1 3 7 6 1 8 9 2 3 3 1 1 1 7 0 9 9 9 2 1 8 3 1 2 6 1 1 1 2 3 1 1 1 5 0 6 5 1 1 1 6 1 3 1 3 1 2 2 3 2 2 1 5 4 3 6 1 7 0 7 1 8 1 4 4 6 5 1 3 2 1 1 2 2 1 7 0 11 5 7 6 3 4 6 1 6 4 9 6 2 1 1 3 1 3 3 1 8 0 6 2 9 5 6 1 2 3 3 1 2 1 2 3 2 3 1 1 3 4 3 3 4 1 5 0 8 1 5 6 3 6 4 8 8 2 2 2 1 3 1 5 0 11 8 5 5 1 1 8 8 3 5 9 9 1 1 1 3 2 1 8 0 10 5 7 5 6 8 8 2 1 5 4 2 3 1 1 3 1 2 2 5 3 2 2 3 4 1 6 0 8 7 5 3 2 8 1 6 9 3 3 2 1 1 1 1 6 0 7 4 9 2 5 1 6 9 2 1 2 1 2 3 1 7 0 10 3 8 7 2 5 1 1 3 3 7 2 2 1 1 3 2 2 5 1 1 3 3 5 1 7 0 6 3 2 2 1 1 7 3 1 1 1 2 1 1 1 8 0 10 6 4 7 8 8 1 6 9 5 1 3 2 3 1 1 1 3 3 1 8 0 6 3 1 8 8 5 9 3 2 1 3 2 3 2 1 3 3 1 5 2 5 4 5 2 1 1 7 6 7 2 4 4 3 6 1 5 0 11 4 1 1 4 8 3 4 5 5 8 6 1 1 2 1 1 1 6 0 10 4 8 1 3 6 9 9 4 8 4 3 1 2 1 3 1 1 6 0 11 6 9 9 1 5 8 9 7 4 9 1 2 2 1 3 1 2 2 4 1 1 3 4 3 5 1 9 0 6 6 8 3 2 7 1 1 1 1 1 2 2 1 2 1 1 5 0 7 4 3 1 6 4 1 1 2 1 1 3 2 1 9 0 9 5 7 7 4 1 9 2 9 7 1 2 2 1 3 2 3 3 2 4 3 1 3 1 3 6 1 5 0 9 1 3 9 2 7 1 5 1 8 2 1 3 1 3 1 9 0 9 8 8 4 1 7 4 1 2 2 1 1 2 1 2 2 1 1 3 1 9 0 6 1 1 5 4 8 5 3 1 3 2 3 1 3 2 3 2 2 1 4 3 2 3 6 1 8 0 6 4 5 5 1 9 1 3 1 3 2 3 1 3 1 1 5 0 11 1 7 5 7 2 1 7 4 1 5 6 1 2 3 3 3 1 9 0 10 2 5 2 3 5 1 5 1 7 9 3 1 1 3 2 3 3 3 3 3 3 2 3 1 4 3 4 1 2 5 3 3 5 1 9 0 10 1 9 3 9 8 1 8 4 9 4 1 1 3 3 2 2 2 1 2 1 5 0 8 6 4 3 6 2 6 9 1 1 1 1 2 2 1 5 0 9 5 1 1 4 4 4 7 8 1 3 3 3 1 1 3 2 3 1 5 3 4 1 8 0 9 5 4 7 7 1 6 2 3 5 3 3 3 3 2 2 2 1 1 7 0 9 8 6 1 4 7 9 7 2 3 3 3 1 2 3 1 2 1 8 0 8 1 2 1 2 6 8 1 4 1 3 2 3 1 2 1 1 2 3 4 1 3 5 1 8 0 10 7 4 9 1 8 8 2 8 6 9 3 3 1 1 1 2 1 1 1 8 0 8 6 2 3 1 7 9 1 8 2 2 1 1 3 1 2 1 1 7 0 6 3 6 6 3 1 3 2 1 3 1 2 1 1 2 4 5 5 2 3 4 1 6 0 10 9 1 3 1 2 7 3 6 5 3 1 1 1 2 2 1 1 8 0 7 9 8 8 6 1 1 6 1 1 2 1 3 1 2 1 1 8 0 8 4 7 5 8 7 5 2 1 3 1 2 3 3 3 1 2 2 4 4 1 3 6 1 6 0 11 2 2 4 1 2 3 2 9 6 1 9 1 3 2 1 3 1 1 7 0 7 3 1 8 8 2 2 9 2 3 3 1 2 1 1 1 5 0 7 9 4 3 3 4 8 1 2 3 3 2 1 5 3 2 5 1 2 5 1 5 5 4 3 7 1 7 0 8 2 6 7 8 4 8 1 1 3 1 1 2 2 1 1 1 8 0 6 3 9 1 1 7 6 2 2 3 1 3 3 3 1 1 8 0 10 2 5 2 1 9 8 2 3 8 2 1 2 3 3 2 1 2 2 1 5 5 2 2 1 3 3 7 1 6 0 6 1 6 3 6 3 4 1 2 1 3 2 1 1 6 0 8 3 1 5 4 8 1 2 2 1 1 2 3 3 3 1 6 0 10 8 1 5 2 1 4 3 6 8 5 1 2 1 1 2 1 3 4 3 3 5 2 4 3 6 1 9 0 10 8 1 1 2 7 4 2 4 9 7 3 2 1 1 3 2 2 1 3 1 5 0 6 4 9 8 1 8 9 1 1 3 2 1 1 5 0 10 3 3 8 4 6 6 1 7 9 1 1 3 2 2 1 4 4 1 5 3 2 3 6 1 5 0 10 4 7 5 6 4 6 1 8 3 9 1 3 1 3 1 1 9 0 10 5 4 2 5 7 4 4 1 1 4 1 1 2 1 1 2 2 2 1 1 6 0 7 2 2 1 9 7 5 2 3 2 2 2 1 1 2 3 5 4 4 3 3 4 1 9 0 8 2 2 1 9 8 1 2 4 1 2 3 3 2 3 2 3 1 1 5 0 10 9 6 9 8 1 4 1 3 1 9 2 3 1 3 2 1 8 0 9 9 3 3 3 3 1 7 1 7 1 1 1 2 3 3 1 3 3 5 1 1 7 6 5 1 4 3 3 4 1 9 0 7 3 1 8 9 8 2 1 3 2 1 1 2 3 2 3 1 1 9 0 9 9 7 6 3 8 4 8 1 3 3 2 2 2 1 1 1 1 1 1 9 0 10 7 3 3 5 3 1 7 1 9 8 3 3 3 1 2 3 1 2 1 1 2 4 1 3 7 1 9 0 10 3 1 1 1 8 2 1 9 3 3 3 2 2 2 2 3 3 2 1 1 9 0 8 1 4 2 9 5 5 7 2 1 1 1 3 3 1 3 3 2 1 8 0 10 3 7 4 5 1 2 3 8 1 9 2 1 3 2 1 2 3 2 3 1 5 1 5 3 2 3 7 1 7 0 8 9 2 8 4 2 5 7 1 3 2 2 3 2 2 1 1 5 0 10 7 8 7 7 7 1 1 1 2 6 2 1 1 3 1 1 9 0 8 5 1 1 4 2 1 5 5 3 2 3 1 1 3 2 2 2 1 3 5 1 1 1 4 3 7 1 5 0 10 6 1 7 1 3 5 3 1 3 4 1 3 1 1 1 1 9 0 11 6 6 4 6 9 8 1 9 1 1 1 1 3 1 1 1 1 1 2 1 1 6 0 7 5 8 1 2 1 8 9 2 3 2 3 2 1 1 2 1 1 3 1 1 4 6 2 5 5 3 6 1 5 0 11 2 8 4 3 6 8 6 1 2 8 1 1 2 2 3 1 1 6 0 11 6 1 7 3 6 8 7 3 2 6 1 1 1 3 2 3 1 1 9 0 11 2 1 2 4 8 9 7 8 8 5 3 1 2 2 1 1 3 3 3 2 2 1 3 3 2 4 3 4 1 5 0 9 9 8 2 4 1 9 1 9 8 2 3 2 1 3 1 8 0 8 2 1 5 2 4 1 6 8 1 2 1 2 3 3 3 1 1 5 0 11 2 3 7 1 7 7 4 2 1 2 4 2 3 3 3 1 2 5 2 3 3 6 1 8 0 8 7 7 1 3 3 4 5 7 1 1 2 3 2 1 3 2 1 8 0 10 7 3 1 4 3 1 5 5 1 5 3 2 1 1 3 3 3 1 1 5 0 11 2 3 5 8 1 8 5 4 8 6 1 3 3 1 1 1 4 2 1 5 1 4 3 6 1 7 0 9 7 1 6 3 1 8 4 1 9 3 2 3 1 2 1 2 1 7 0 6 9 1 3 6 1 6 3 1 1 2 1 1 1 1 5 0 6 3 9 1 5 3 8 1 1 1 2 1 5 4 2 2 5 1 3 4 1 9 0 11 4 9 4 2 6 1 5 8 5 7 9 1 1 3 3 2 3 1 2 1 1 6 0 10 7 6 5 3 8 6 1 5 1 6 1 1 2 1 1 2 1 7 0 11 8 8 8 4 4 8 4 1 7 2 6 1 1 1 2 3 1 1 1 1 2 2 3 3 5 6 3 5 5 3 4 1 7 0 11 2 6 8 3 1 6 4 4 2 1 7 3 1 1 3 2 3 3 1 7 0 10 9 5 2 7 7 7 6 1 5 8 2 2 3 1 2 1 1 1 5 0 10 5 5 7 9 3 4 9 8 1 8 2 2 1 2 3 2 5 3 3 3 4 1 8 0 7 9 1 7 1 2 4 1 3 2 1 1 3 1 3 3 1 5 0 8 8 4 2 4 2 4 2 1 1 1 1 1 3 1 5 0 11 4 3 6 7 3 9 1 4 2 6 4 1 3 3 1 3 2 5 2 3 3 7 1 9 0 10 3 3 6 5 5 1 1 1 3 9 2 3 2 3 1 2 1 2 1 1 8 0 10 5 7 5 2 1 3 1 4 3 6 1 1 2 3 2 2 2 3 1 7 0 8 7 2 1 7 4 1 4 5 3 1 1 2 2 2 2 2 2 2 5 2 3 4 3 5 1 8 0 10 3 2 1 5 9 1 6 8 8 9 1 3 3 1 1 1 3 2 1 5 0 6 9 4 1 8 1 5 3 1 3 2 1 1 7 0 9 7 7 2 6 1 2 4 6 2 2 3 2 3 2 3 1 1 5 1 2 3 3 4 1 6 0 10 7 6 6 5 3 9 3 2 5 1 3 1 2 3 1 3 1 8 0 7 8 1 5 7 3 9 6 2 2 2 1 2 3 1 1 1 7 0 11 8 2 6 9 9 5 1 2 4 1 2 1 3 1 2 2 3 1 1 4 3 5 5 5 6 3 4 4 4 3 4 1 9 0 7 1 5 3 4 1 1 4 1 1 1 3 2 3 1 3 2 1 6 0 6 1 3 3 8 1 8 2 2 1 2 3 3 1 6 0 6 7 1 9 3 5 7 1 1 2 2 3 1 5 1 3 1 3 7 1 9 0 9 8 4 3 5 9 1 8 8 2 2 1 2 1 1 2 3 1 2 1 9 0 8 4 2 2 1 1 2 7 4 1 1 2 2 1 2 3 2 1 1 9 0 11 1 3 2 8 3 1 5 9 3 8 2 2 3 1 3 2 3 1 2 1 4 2 2 2 2 3 2 3 7 1 7 0 7 1 3 4 8 2 2 5 2 2 1 2 1 2 3 1 5 0 8 4 3 8 1 2 5 7 3 3 3 1 3 3 1 6 0 7 6 3 5 1 9 9 1 2 3 2 1 1 3 2 5 1 1 4 5 1 3 7 1 6 0 6 3 1 5 2 5 7 1 1 2 1 1 3 1 7 0 10 1 8 1 1 8 4 2 3 7 6 1 3 3 1 3 2 3 1 5 0 11 1 1 8 1 5 6 5 7 5 1 4 1 3 1 1 3 4 1 3 4 4 1 3 5 4 5 5 9 5 7 3 5 4 3 7 1 9 0 11 1 1 1 9 1 9 2 1 1 2 8 3 1 2 3 3 1 3 1 3 1 9 0 7 1 4 2 8 5 2 1 2 2 1 2 1 3 2 1 2 1 5 0 10 9 1 7 4 9 3 7 7 3 5 2 1 3 2 3 3 3 3 4 4 1 3 3 5 1 5 0 10 9 3 7 2 5 1 4 8 3 6 1 1 3 2 2 1 5 0 6 1 3 5 7 4 4 3 2 1 2 1 1 9 0 6 2 9 9 4 1 8 1 1 2 1 2 2 2 3 1 1 1 2 3 1 3 7 1 7 0 10 9 3 8 7 6 1 1 9 3 3 2 1 2 3 2 1 1 1 7 0 6 1 9 7 5 7 3 1 3 2 1 1 3 2 1 8 0 7 3 4 7 6 4 3 1 1 3 3 3 3 3 2 1 2 2 2 2 4 5 2 3 7 1 6 0 11 1 6 2 4 1 8 1 9 8 4 3 2 3 1 2 1 2 1 6 0 9 4 7 2 8 1 9 7 3 2 3 2 2 2 3 1 1 9 0 10 3 7 1 1 2 4 2 7 7 7 2 2 1 3 1 1 3 2 1 1 1 5 1 3 2 1 3 5 1 6 0 9 8 4 1 5 9 1 5 1 1 2 1 3 1 3 3 1 8 0 7 2 2 6 3 1 2 7 1 1 3 1 2 1 3 2 1 9 0 8 4 1 4 9 5 1 6 3 2 2 3 1 1 3 1 3 2 5 2 1 1 4 5 1 7 2 5 4 3 5 1 8 0 9 5 3 1 3 2 5 3 8 5 1 2 1 3 2 3 3 3 1 7 0 6 1 7 9 3 2 2 1 2 2 1 2 2 1 1 6 0 10 6 8 6 7 9 2 9 6 9 1 2 3 1 3 3 3 4 5 1 1 2 3 6 1 9 0 8 5 1 7 2 2 1 3 3 3 1 3 1 2 1 2 3 2 1 5 0 10 4 3 3 8 1 3 9 3 2 5 1 2 1 3 3 1 7 0 10 8 1 4 8 9 9 3 1 1 5 2 1 1 1 1 2 3 4 5 3 2 5 1 3 6 1 9 0 8 2 1 8 1 5 5 6 8 1 3 1 1 1 2 2 1 2 1 9 0 11 3 8 1 4 1 3 1 7 5 1 1 3 3 2 3 3 1 2 2 3 1 8 0 7 9 6 1 9 8 1 2 2 3 1 1 3 3 3 1 1 5 4 4 4 2 3 6 1 7 0 7 2 1 5 1 6 4 6 2 1 1 3 1 3 2 1 8 0 11 2 1 1 9 6 4 3 8 6 8 8 3 3 3 1 1 2 1 3 1 7 0 11 5 4 7 4 1 8 7 6 8 7 1 1 1 2 1 1 2 2 3 4 5 3 2 5 3 4 1 8 0 11 3 4 1 8 4 3 6 4 6 8 1 2 3 2 2 3 3 3 1 1 8 0 8 3 3 4 1 9 3 1 6 2 3 2 1 1 3 1 3 1 6 0 7 3 1 3 7 9 6 4 1 1 3 3 1 2 5 5 3 3 6 3 5 4 5 3 3 4 1 5 0 6 6 9 3 9 1 3 1 3 3 1 3 1 9 0 7 5 1 9 6 9 6 3 2 1 2 3 3 2 1 2 1 1 5 0 7 8 6 4 4 4 1 1 1 2 2 1 3 4 3 4 1 3 5 1 8 0 8 5 1 8 4 4 8 4 9 1 1 2 1 1 1 1 1 1 6 0 9 9 9 1 2 1 7 4 4 7 3 1 2 3 2 2 1 7 0 11 7 4 8 6 8 5 9 1 4 1 3 1 3 1 1 1 3 1 4 4 1 1 5 3 7 1 7 0 9 3 6 3 1 9 1 3 3 3 1 1 2 2 1 3 1 1 5 0 6 6 7 8 3 1 1 1 1 1 1 2 1 5 0 10 5 5 1 1 7 5 1 4 2 4 2 2 1 1 3 3 4 1 2 1 2 3 3 7 1 5 0 8 6 1 9 5 1 5 3 7 2 1 1 3 3 1 9 0 8 1 2 6 4 6 4 6 1 3 3 1 3 3 1 3 2 2 1 8 0 11 1 3 3 3 1 8 2 3 5 2 9 2 1 1 1 3 1 2 2 1 4 3 3 4 4 3 3 4 1 5 0 10 8 7 1 8 1 7 1 6 8 4 3 1 1 2 2 1 5 0 6 4 8 9 2 8 1 3 1 2 1 1 1 7 0 6 5 7 4 1 1 3 1 3 3 1 2 1 1 3 3 3 4 2 5 3 5 4 3 4 1 8 0 11 8 1 7 5 3 7 1 9 8 2 1 2 1 3 1 2 1 3 1 1 5 0 7 7 7 7 5 1 4 8 1 1 3 1 1 1 7 0 10 1 7 4 4 1 5 3 2 8 1 1 1 1 1 1 2 2 3 2 4 3 3 5 1 8 0 11 3 1 4 4 7 2 7 1 6 7 6 3 3 1 1 2 1 1 2 1 5 0 6 7 1 2 8 3 9 1 1 3 3 1 1 5 0 9 9 4 4 6 7 1 5 7 2 3 2 3 1 1 5 1 3 2 2 3 4 1 8 0 11 1 1 9 9 1 9 4 2 3 8 9 1 1 2 1 1 2 3 1 1 6 0 9 1 1 7 6 1 1 6 9 9 3 2 2 1 1 1 1 9 0 10 2 1 1 6 1 8 3 4 1 6 1 1 2 1 3 2 1 3 1 1 4 2 4 3 7 1 5 0 10 7 1 4 7 2 1 4 6 8 7 2 3 1 1 3 1 8 0 7 2 3 9 1 5 1 4 3 1 1 1 1 1 3 1 1 6 0 9 3 1 9 1 5 9 9 8 8 1 2 3 2 1 1 2 5 3 1 3 2 2 3 4 1 6 0 10 2 1 6 4 4 1 4 5 5 8 1 3 2 3 2 3 1 8 0 7 1 5 4 2 9 9 6 2 2 2 1 3 2 1 2 1 8 0 8 9 9 1 9 7 4 3 7 2 1 2 3 2 3 3 1 3 5 1 2 3 4 5 7 5 3 3 7 1 7 0 10 3 9 8 8 6 5 1 1 9 5 1 2 1 1 3 2 1 1 9 0 11 1 6 6 4 4 5 8 1 1 5 4 1 3 1 2 2 2 1 3 1 1 9 0 6 1 7 5 6 5 2 3 1 1 1 3 1 1 2 3 1 2 3 3 5 3 5 3 4 1 9 0 8 5 8 1 9 8 1 9 2 3 3 1 1 2 2 1 2 1 1 5 0 6 5 3 4 9 1 3 2 1 3 2 3 1 9 0 11 4 1 2 9 6 4 7 9 8 6 8 3 3 2 1 3 2 2 3 3 2 1 5 3 3 7 1 9 0 11 1 9 1 3 4 6 7 2 4 6 8 3 3 2 1 2 3 1 3 1 1 9 0 8 1 8 2 2 4 8 6 6 2 1 1 2 1 3 1 1 1 1 5 0 9 3 1 6 2 1 3 1 4 9 3 3 1 2 1 3 5 1 2 2 1 5 3 4 1 6 0 11 5 9 1 3 5 2 1 5 9 1 1 3 1 1 3 3 1 1 6 0 8 5 4 3 9 1 2 4 1 3 1 1 3 1 2 1 8 0 6 8 4 1 1 7 1 3 1 3 3 1 3 1 2 2 5 5 2 3 4 1 6 0 10 5 1 9 8 7 1 8 4 2 4 1 3 1 3 3 1 1 8 0 11 4 5 1 1 7 2 3 2 8 7 7 1 1 1 2 3 1 2 1 1 5 0 9 7 2 1 7 4 5 3 1 3 1 2 2 3 1 1 2 2 5 1 3 3 5 3 3 7 1 6 0 11 7 1 6 2 8 8 1 5 4 9 5 1 2 1 2 3 2 1 6 0 11 4 1 4 8 7 3 5 2 4 4 4 1 3 3 1 1 2 1 9 0 8 8 8 1 1 1 9 3 8 2 2 1 2 3 1 3 1 3 2 2 4 1 2 5 2 3 6 1 7 0 7 1 8 2 1 1 5 8 2 2 3 1 2 1 3 1 5 0 10 1 1 2 2 5 5 8 7 5 7 2 1 1 2 3 1 7 0 9 5 6 1 6 7 8 5 8 6 3 2 1 1 1 1 3 5 2 3 3 2 4 3 6 1 9 0 7 6 9 5 3 1 6 8 2 1 1 1 1 3 1 1 1 1 5 0 11 8 1 7 3 1 9 6 6 7 9 8 1 1 3 2 1 1 8 0 10 4 5 2 1 3 3 7 9 3 9 1 1 1 1 1 3 2 1 1 1 5 1 1 3 3 4 1 9 0 11 6 6 5 2 4 1 6 7 6 5 7 3 1 1 3 1 1 2 1 2 1 9 0 6 1 5 4 1 5 8 2 2 3 3 2 3 2 1 2 1 6 0 6 1 3 5 2 6 8 2 2 2 1 1 3 3 4 5 3 3 6 1 6 0 7 1 4 8 2 8 4 3 2 2 1 1 3 2 1 7 0 8 7 1 5 1 8 7 8 3 1 3 3 2 2 1 3 1 7 0 8 1 9 9 8 5 1 7 2 1 1 1 2 2 2 3 1 5 2 4 1 5 2 5 4 4 3 3 6 1 6 0 10 7 5 9 6 7 7 1 6 3 1 2 2 1 1 3 3 1 6 0 9 2 5 6 8 3 1 2 3 5 3 1 2 2 1 1 1 6 0 9 7 7 4 1 7 9 1 5 7 2 2 1 3 3 1 1 5 5 3 1 1 3 5 1 8 0 6 9 8 1 5 8 1 1 1 1 3 2 3 1 2 1 7 0 11 6 7 3 2 9 8 1 6 6 5 1 1 2 3 2 1 2 2 1 5 0 6 9 1 1 6 8 7 2 2 1 1 1 5 5 2 4 2 3 4 1 5 0 9 2 1 7 6 8 6 8 6 4 1 2 2 3 1 1 9 0 6 6 6 7 9 1 4 1 1 2 2 3 1 1 1 3 1 7 0 10 1 1 1 3 7 5 6 5 8 6 1 3 3 2 3 1 3 3 2 4 5 3 7 1 5 0 11 1 8 1 3 9 3 5 6 4 3 6 1 1 2 1 1 1 5 0 6 1 5 9 7 5 1 3 1 1 2 3 1 9 0 7 2 2 4 1 4 8 6 2 2 2 1 2 2 1 2 3 2 1 2 5 2 3 3 4 3 3 5 9 5 7 3 4 4 3 4 1 6 0 7 1 9 3 9 5 8 5 3 3 1 3 2 1 1 7 0 7 2 6 4 1 6 3 9 2 3 1 2 2 1 1 1 5 0 9 2 1 1 6 7 9 3 9 8 2 3 1 1 3 1 1 3 4 3 5 1 5 0 10 6 8 7 8 7 7 1 3 1 9 1 2 1 1 3 1 5 0 8 3 6 3 8 8 1 5 4 1 1 2 1 1 1 7 0 10 1 8 5 6 5 9 5 6 8 8 2 1 1 1 3 1 2 4 5 3 3 2 3 6 1 6 0 10 1 8 3 5 3 3 7 9 9 3 1 1 1 2 2 3 1 6 0 6 7 1 8 4 1 5 1 1 3 1 1 2 1 9 0 9 5 1 5 4 6 1 7 1 3 1 2 1 2 3 1 3 1 2 1 3 4 2 5 2 3 6 1 8 0 11 4 9 8 7 3 5 3 1 8 8 8 3 1 3 1 2 3 1 3 1 8 0 10 5 9 4 1 8 3 1 3 1 9 3 1 2 3 2 2 1 1 1 6 0 9 8 3 9 2 9 5 7 1 7 1 1 1 1 2 3 5 2 3 5 2 5 4 4 1 3 5 4 3 4 1 9 0 7 1 3 9 8 3 7 9 1 2 1 1 1 1 3 3 2 1 6 0 6 9 3 3 1 6 1 2 2 1 2 1 3 1 8 0 6 3 6 1 4 5 2 2 3 1 1 2 1 3 2 4 1 1 2 3 6 1 9 0 8 2 1 3 1 9 6 1 6 2 2 3 3 1 1 1 1 3 1 9 0 6 6 2 2 2 9 1 1 1 1 3 1 2 2 3 3 1 9 0 8 7 9 8 8 2 8 7 1 1 3 2 2 3 1 3 1 3 1 2 4 2 2 3 3 5 1 9 0 11 4 1 5 1 2 2 2 7 7 9 4 3 2 1 1 3 1 1 2 2 1 7 0 6 9 8 6 5 1 2 2 1 1 1 1 2 1 1 7 0 9 9 7 3 8 7 5 8 9 1 3 1 3 1 1 1 1 3 4 1 2 3 3 6 1 7 0 11 2 4 3 5 6 6 6 4 2 1 9 1 1 1 1 1 1 1 1 6 0 10 3 6 1 7 7 8 7 8 2 9 2 1 2 1 1 3 1 8 0 8 1 8 7 9 7 6 8 1 2 2 1 1 1 1 3 3 5 4 1 3 4 2 3 7 1 6 0 7 3 1 2 8 7 9 9 3 1 3 3 2 1 1 9 0 9 5 3 3 3 1 1 3 2 1 1 1 1 1 1 3 1 3 3 1 7 0 7 1 4 7 3 8 3 5 3 2 2 1 3 2 1 3 2 1 1 5 2 4 6 6 2 1 4 4 3 5 1 6 0 6 8 1 4 3 5 8 2 1 2 1 2 2 1 8 0 11 2 6 8 2 7 8 5 1 8 1 3 2 3 1 3 2 3 2 3 1 7 0 6 9 8 9 1 8 7 1 3 1 3 3 3 1 1 2 1 3 5 3 5 1 7 0 11 1 1 7 6 9 1 6 8 2 7 9 1 2 3 1 2 3 2 1 9 0 11 4 9 9 6 2 1 7 1 7 4 1 3 2 3 2 2 3 1 1 1 1 6 0 9 5 8 8 5 6 1 5 4 7 3 1 1 1 1 2 2 5 3 5 5 3 5 1 7 0 6 1 1 5 4 9 5 2 1 2 2 1 2 3 1 8 0 9 1 7 3 6 8 6 8 4 1 3 3 2 2 2 1 1 1 1 8 0 10 9 8 1 9 4 1 1 8 2 3 2 1 1 3 2 2 1 2 3 3 4 1 3 3 7 1 9 0 10 5 9 5 1 3 2 3 1 3 7 3 1 2 2 1 3 1 2 1 1 8 0 11 3 7 4 6 1 6 9 6 1 1 2 2 2 2 3 1 1 1 2 1 8 0 7 7 4 6 8 4 7 1 1 1 3 3 1 3 2 2 5 5 5 2 1 4 4 1 6 3 3 4 5 3 7 1 5 0 9 2 1 7 8 7 1 3 5 1 3 1 2 3 1 1 8 0 8 3 8 7 7 1 2 1 1 1 2 1 1 1 3 3 2 1 9 0 6 6 1 1 5 2 1 1 3 1 1 1 3 2 1 2 2 4 5 1 5 5 4 3 4 1 9 0 7 4 2 7 9 3 1 3 3 1 1 1 2 3 2 3 1 1 9 0 6 1 2 7 2 4 5 1 2 3 1 1 1 2 3 1 1 7 0 9 3 4 4 1 9 5 6 8 9 1 2 2 1 3 1 3 2 1 5 2 3 6 1 7 0 9 4 6 8 4 1 2 1 3 3 1 3 2 1 1 1 2 1 6 0 10 3 5 9 7 5 1 4 8 5 7 3 1 3 1 1 2 1 5 0 6 5 4 7 8 1 2 1 2 3 3 1 1 2 4 1 2 2 3 7 1 7 0 7 4 9 5 1 9 9 5 3 1 3 1 3 2 3 1 6 0 7 2 3 1 5 6 1 7 1 1 1 2 3 3 1 6 0 7 3 9 4 1 4 7 3 1 3 1 3 1 2 1 2 1 4 5 1 5 4 4 6 6 6 5 3 3 7 1 9 0 11 8 1 8 8 1 4 5 4 3 6 6 1 2 3 3 3 2 1 1 1 1 6 0 7 5 1 6 1 4 2 5 1 1 1 1 2 1 1 5 0 9 2 1 3 3 2 4 7 2 5 3 2 3 1 1 4 1 2 2 3 1 1 3 5 1 9 0 9 1 1 3 3 1 7 5 2 9 3 1 2 3 3 1 3 2 2 1 8 0 10 8 4 9 1 5 4 9 4 8 4 2 2 3 3 2 1 3 3 1 8 0 8 1 2 5 5 8 1 6 7 3 3 2 2 2 3 2 1 5 3 3 1 2 3 6 1 8 0 8 2 8 3 2 8 6 4 1 2 1 2 1 2 2 1 1 1 5 0 9 6 7 7 4 1 8 6 1 3 1 1 3 3 1 1 8 0 11 1 1 8 4 1 3 1 2 3 6 9 3 1 2 1 1 3 1 1 1 1 1 4 1 1 3 4 1 7 0 7 1 9 8 6 7 3 1 1 3 1 2 3 2 2 1 5 0 8 7 7 8 8 6 1 1 8 1 2 2 3 2 1 6 0 6 1 8 8 8 6 4 2 2 2 3 1 1 2 3 2 3 3 5 1 8 0 10 8 1 7 3 5 9 2 7 4 8 2 2 1 1 3 3 1 1 1 8 0 6 7 7 1 1 6 7 2 1 3 1 3 1 3 2 1 9 0 8 1 8 6 4 4 7 3 8 3 2 1 3 1 3 1 2 2 1 2 4 3 2 1 2 1 5 4 3 5 1 6 0 10 6 1 5 1 3 8 8 4 1 9 3 1 1 3 2 2 1 5 0 6 5 4 4 1 7 1 1 3 3 2 1 1 8 0 11 3 3 2 2 1 2 1 5 1 8 6 1 1 1 1 1 1 2 1 5 2 2 1 1 3 4 1 7 0 11 8 7 2 1 6 7 5 1 1 5 6 1 3 2 2 3 1 1 1 7 0 7 6 8 2 1 1 2 2 1 1 3 2 1 3 1 1 5 0 7 7 3 6 1 6 9 2 3 2 1 1 1 3 1 3 4 3 7 1 5 0 11 3 2 9 8 6 2 1 1 4 1 4 1 2 1 3 1 1 9 0 11 4 9 8 9 6 2 6 5 1 8 1 3 2 1 1 2 3 1 1 3 1 5 0 11 5 1 8 2 4 5 4 3 1 8 5 2 1 3 1 1 2 4 2 3 5 1 4 3 7 1 5 0 9 6 9 5 2 4 5 4 1 2 1 2 1 1 2 1 5 0 9 6 2 9 8 2 1 5 1 3 2 3 1 1 1 1 8 0 6 7 8 4 8 7 1 3 2 2 3 2 1 2 1 2 1 3 5 3 2 5 3 6 1 9 0 11 4 7 1 2 4 1 8 7 8 1 1 3 1 1 3 2 3 1 2 1 1 6 0 9 8 1 9 6 8 7 1 9 8 1 3 1 1 1 3 1 8 0 7 7 3 3 1 1 6 9 1 2 3 3 2 1 3 1 4 1 1 1 1 3 3 6 1 4 4 5 3 4 1 7 0 8 7 5 5 3 1 1 5 7 1 1 2 1 1 1 1 1 8 0 9 7 8 2 5 5 1 3 3 6 2 2 2 1 1 3 3 3 1 8 0 7 5 1 1 1 3 4 3 1 3 1 1 1 1 2 2 5 3 5 2 3 7 1 9 0 10 7 1 8 9 3 3 5 7 4 7 1 3 2 3 2 3 1 1 1 1 8 0 7 1 5 1 9 2 7 4 2 2 2 3 1 2 2 1 1 6 0 7 4 3 1 7 8 4 9 2 3 3 1 1 1 3 1 3 4 1 5 3 3 7 1 9 0 10 1 1 3 4 2 9 2 7 5 3 3 2 3 3 3 1 1 1 1 1 9 0 6 7 5 5 1 6 1 3 2 3 1 3 3 3 2 1 1 5 0 6 1 8 6 6 1 6 2 3 2 1 2 4 3 2 3 2 1 4 3 7 1 7 0 6 2 7 1 2 1 2 3 2 3 1 3 1 3 1 5 0 6 2 5 3 1 4 1 2 1 3 1 1 1 6 0 8 6 6 2 5 8 1 1 3 1 1 2 3 1 1 1 1 5 1 2 2 2 4 4 2 1 3 3 4 4 7 7 1 7 8 4 3 2 8 8 2 diff --git a/src/main/resources/2018/day9.txt b/src/main/resources/2018/day9.txt new file mode 100644 index 00000000..2d2b1f06 --- /dev/null +++ b/src/main/resources/2018/day9.txt @@ -0,0 +1 @@ +431 players; last marble is worth 70950 points diff --git a/src/main/resources/2019-examples/day10-1.txt b/src/main/resources/2019-examples/day10-1.txt new file mode 100644 index 00000000..737ae7f6 --- /dev/null +++ b/src/main/resources/2019-examples/day10-1.txt @@ -0,0 +1,5 @@ +.#..# +..... +##### +....# +...## diff --git a/src/main/resources/2019-examples/day10-10.txt b/src/main/resources/2019-examples/day10-10.txt new file mode 100644 index 00000000..33e65a99 --- /dev/null +++ b/src/main/resources/2019-examples/day10-10.txt @@ -0,0 +1,5 @@ +.#....###.....#.. +##...##...#.....# +##...#......1234. +..#.....X...5##.. +..#.9.....8....76 diff --git a/src/main/resources/2019-examples/day10-11.txt b/src/main/resources/2019-examples/day10-11.txt new file mode 100644 index 00000000..08ff9f7b --- /dev/null +++ b/src/main/resources/2019-examples/day10-11.txt @@ -0,0 +1,5 @@ +.8....###.....#.. +56...9#...#.....# +34...7........... +..2.....X....##.. +..1.............. diff --git a/src/main/resources/2019-examples/day10-12.txt b/src/main/resources/2019-examples/day10-12.txt new file mode 100644 index 00000000..551609d1 --- /dev/null +++ b/src/main/resources/2019-examples/day10-12.txt @@ -0,0 +1,5 @@ +......234.....6.. +......1...5.....7 +................. +........X....89.. +................. diff --git a/src/main/resources/2019-examples/day10-2.txt b/src/main/resources/2019-examples/day10-2.txt new file mode 100644 index 00000000..71482513 --- /dev/null +++ b/src/main/resources/2019-examples/day10-2.txt @@ -0,0 +1,5 @@ +.7..7 +..... +67775 +....7 +...87 diff --git a/src/main/resources/2019-examples/day10-3.txt b/src/main/resources/2019-examples/day10-3.txt new file mode 100644 index 00000000..119fe6c5 --- /dev/null +++ b/src/main/resources/2019-examples/day10-3.txt @@ -0,0 +1,10 @@ +#......... +...A...... +...B..a... +.EDCG....a +..F.c.b... +.....c.... +..efd.c.gb +.......c.. +....f...c. +...e..d..c diff --git a/src/main/resources/2019-examples/day10-4.txt b/src/main/resources/2019-examples/day10-4.txt new file mode 100644 index 00000000..987698fb --- /dev/null +++ b/src/main/resources/2019-examples/day10-4.txt @@ -0,0 +1,10 @@ +......#.#. +#..#.#.... +..#######. +.#.#.###.. +.#..#..... +..#....#.# +#..#....#. +.##.#..### +##...#..#. +.#....#### diff --git a/src/main/resources/2019-examples/day10-5.txt b/src/main/resources/2019-examples/day10-5.txt new file mode 100644 index 00000000..e28e4241 --- /dev/null +++ b/src/main/resources/2019-examples/day10-5.txt @@ -0,0 +1,10 @@ +#.#...#.#. +.###....#. +.#....#... +##.#.#.#.# +....#.#.#. +.##..###.# +..#...##.. +..##....## +......#... +.####.###. diff --git a/src/main/resources/2019-examples/day10-6.txt b/src/main/resources/2019-examples/day10-6.txt new file mode 100644 index 00000000..af5b6e90 --- /dev/null +++ b/src/main/resources/2019-examples/day10-6.txt @@ -0,0 +1,10 @@ +.#..#..### +####.###.# +....###.#. +..###.##.# +##.##.#.#. +....###..# +..#.#..#.# +#..#.#.### +.##...##.# +.....#.#.. diff --git a/src/main/resources/2019-examples/day10-7.txt b/src/main/resources/2019-examples/day10-7.txt new file mode 100644 index 00000000..33437ba6 --- /dev/null +++ b/src/main/resources/2019-examples/day10-7.txt @@ -0,0 +1,20 @@ +.#..##.###...####### +##.############..##. +.#.######.########.# +.###.#######.####.#. +#####.##.#.##.###.## +..#####..#.######### +#################### +#.####....###.#.#.## +##.################# +#####.##.###..####.. +..######..##.####### +####.##.####...##..# +.#####..#.######.### +##...#.##########... +#.##########.####### +.####.#.###.###.#.## +....##.##.###..##### +.#.#.###########.### +#.#.#.#####.####.### +###.##.####.##.#..## diff --git a/src/main/resources/2019-examples/day10-8.txt b/src/main/resources/2019-examples/day10-8.txt new file mode 100644 index 00000000..ecf3f24b --- /dev/null +++ b/src/main/resources/2019-examples/day10-8.txt @@ -0,0 +1,5 @@ +.#....#####...#.. +##...##.#####..## +##...#...#.#####. +..#.....X...###.. +..#.#.....#....## diff --git a/src/main/resources/2019-examples/day10-9.txt b/src/main/resources/2019-examples/day10-9.txt new file mode 100644 index 00000000..fccd47a1 --- /dev/null +++ b/src/main/resources/2019-examples/day10-9.txt @@ -0,0 +1,5 @@ +.#....###24...#.. +##...##.13#67..9# +##...#...5.8####. +..#.....X...###.. +..#.#.....#....## diff --git a/src/main/resources/2019-examples/day11-1.txt b/src/main/resources/2019-examples/day11-1.txt new file mode 100644 index 00000000..48b167de --- /dev/null +++ b/src/main/resources/2019-examples/day11-1.txt @@ -0,0 +1,5 @@ +..... +..... +..^.. +..... +..... diff --git a/src/main/resources/2019-examples/day11-2.txt b/src/main/resources/2019-examples/day11-2.txt new file mode 100644 index 00000000..4e6e5ce3 --- /dev/null +++ b/src/main/resources/2019-examples/day11-2.txt @@ -0,0 +1,5 @@ +..... +..... +.<#.. +..... +..... diff --git a/src/main/resources/2019-examples/day11-3.txt b/src/main/resources/2019-examples/day11-3.txt new file mode 100644 index 00000000..b61fa7f2 --- /dev/null +++ b/src/main/resources/2019-examples/day11-3.txt @@ -0,0 +1,5 @@ +..... +..... +..#.. +.v... +..... diff --git a/src/main/resources/2019-examples/day11-4.txt b/src/main/resources/2019-examples/day11-4.txt new file mode 100644 index 00000000..35d9f3a6 --- /dev/null +++ b/src/main/resources/2019-examples/day11-4.txt @@ -0,0 +1,5 @@ +..... +..... +..^.. +.##.. +..... diff --git a/src/main/resources/2019-examples/day11-5.txt b/src/main/resources/2019-examples/day11-5.txt new file mode 100644 index 00000000..ae47a447 --- /dev/null +++ b/src/main/resources/2019-examples/day11-5.txt @@ -0,0 +1,5 @@ +..... +..<#. +...#. +.##.. +..... diff --git a/src/main/resources/2019-examples/day12-1.txt b/src/main/resources/2019-examples/day12-1.txt new file mode 100644 index 00000000..30247416 --- /dev/null +++ b/src/main/resources/2019-examples/day12-1.txt @@ -0,0 +1,4 @@ +<x=-1, y=0, z=2> +<x=2, y=-10, z=-7> +<x=4, y=-8, z=8> +<x=3, y=5, z=-1> diff --git a/src/main/resources/2019-examples/day12-2.txt b/src/main/resources/2019-examples/day12-2.txt new file mode 100644 index 00000000..b6b7954f --- /dev/null +++ b/src/main/resources/2019-examples/day12-2.txt @@ -0,0 +1,65 @@ +After 0 steps: +pos=<x=-1, y= 0, z= 2>, vel=<x= 0, y= 0, z= 0> +pos=<x= 2, y=-10, z=-7>, vel=<x= 0, y= 0, z= 0> +pos=<x= 4, y= -8, z= 8>, vel=<x= 0, y= 0, z= 0> +pos=<x= 3, y= 5, z=-1>, vel=<x= 0, y= 0, z= 0> + +After 1 step: +pos=<x= 2, y=-1, z= 1>, vel=<x= 3, y=-1, z=-1> +pos=<x= 3, y=-7, z=-4>, vel=<x= 1, y= 3, z= 3> +pos=<x= 1, y=-7, z= 5>, vel=<x=-3, y= 1, z=-3> +pos=<x= 2, y= 2, z= 0>, vel=<x=-1, y=-3, z= 1> + +After 2 steps: +pos=<x= 5, y=-3, z=-1>, vel=<x= 3, y=-2, z=-2> +pos=<x= 1, y=-2, z= 2>, vel=<x=-2, y= 5, z= 6> +pos=<x= 1, y=-4, z=-1>, vel=<x= 0, y= 3, z=-6> +pos=<x= 1, y=-4, z= 2>, vel=<x=-1, y=-6, z= 2> + +After 3 steps: +pos=<x= 5, y=-6, z=-1>, vel=<x= 0, y=-3, z= 0> +pos=<x= 0, y= 0, z= 6>, vel=<x=-1, y= 2, z= 4> +pos=<x= 2, y= 1, z=-5>, vel=<x= 1, y= 5, z=-4> +pos=<x= 1, y=-8, z= 2>, vel=<x= 0, y=-4, z= 0> + +After 4 steps: +pos=<x= 2, y=-8, z= 0>, vel=<x=-3, y=-2, z= 1> +pos=<x= 2, y= 1, z= 7>, vel=<x= 2, y= 1, z= 1> +pos=<x= 2, y= 3, z=-6>, vel=<x= 0, y= 2, z=-1> +pos=<x= 2, y=-9, z= 1>, vel=<x= 1, y=-1, z=-1> + +After 5 steps: +pos=<x=-1, y=-9, z= 2>, vel=<x=-3, y=-1, z= 2> +pos=<x= 4, y= 1, z= 5>, vel=<x= 2, y= 0, z=-2> +pos=<x= 2, y= 2, z=-4>, vel=<x= 0, y=-1, z= 2> +pos=<x= 3, y=-7, z=-1>, vel=<x= 1, y= 2, z=-2> + +After 6 steps: +pos=<x=-1, y=-7, z= 3>, vel=<x= 0, y= 2, z= 1> +pos=<x= 3, y= 0, z= 0>, vel=<x=-1, y=-1, z=-5> +pos=<x= 3, y=-2, z= 1>, vel=<x= 1, y=-4, z= 5> +pos=<x= 3, y=-4, z=-2>, vel=<x= 0, y= 3, z=-1> + +After 7 steps: +pos=<x= 2, y=-2, z= 1>, vel=<x= 3, y= 5, z=-2> +pos=<x= 1, y=-4, z=-4>, vel=<x=-2, y=-4, z=-4> +pos=<x= 3, y=-7, z= 5>, vel=<x= 0, y=-5, z= 4> +pos=<x= 2, y= 0, z= 0>, vel=<x=-1, y= 4, z= 2> + +After 8 steps: +pos=<x= 5, y= 2, z=-2>, vel=<x= 3, y= 4, z=-3> +pos=<x= 2, y=-7, z=-5>, vel=<x= 1, y=-3, z=-1> +pos=<x= 0, y=-9, z= 6>, vel=<x=-3, y=-2, z= 1> +pos=<x= 1, y= 1, z= 3>, vel=<x=-1, y= 1, z= 3> + +After 9 steps: +pos=<x= 5, y= 3, z=-4>, vel=<x= 0, y= 1, z=-2> +pos=<x= 2, y=-9, z=-3>, vel=<x= 0, y=-2, z= 2> +pos=<x= 0, y=-8, z= 4>, vel=<x= 0, y= 1, z=-2> +pos=<x= 1, y= 1, z= 5>, vel=<x= 0, y= 0, z= 2> + +After 10 steps: +pos=<x= 2, y= 1, z=-3>, vel=<x=-3, y=-2, z= 1> +pos=<x= 1, y=-8, z= 0>, vel=<x=-1, y= 1, z= 3> +pos=<x= 3, y=-6, z= 1>, vel=<x= 3, y= 2, z=-3> +pos=<x= 2, y= 0, z= 4>, vel=<x= 1, y=-1, z=-1> diff --git a/src/main/resources/2019-examples/day12-3.txt b/src/main/resources/2019-examples/day12-3.txt new file mode 100644 index 00000000..90286841 --- /dev/null +++ b/src/main/resources/2019-examples/day12-3.txt @@ -0,0 +1,6 @@ +Energy after 10 steps: +pot: 2 + 1 + 3 = 6; kin: 3 + 2 + 1 = 6; total: 6 * 6 = 36 +pot: 1 + 8 + 0 = 9; kin: 1 + 1 + 3 = 5; total: 9 * 5 = 45 +pot: 3 + 6 + 1 = 10; kin: 3 + 2 + 3 = 8; total: 10 * 8 = 80 +pot: 2 + 0 + 4 = 6; kin: 1 + 1 + 1 = 3; total: 6 * 3 = 18 +Sum of total energy: 36 + 45 + 80 + 18 = 179 diff --git a/src/main/resources/2019-examples/day12-4.txt b/src/main/resources/2019-examples/day12-4.txt new file mode 100644 index 00000000..ace1dfbd --- /dev/null +++ b/src/main/resources/2019-examples/day12-4.txt @@ -0,0 +1,4 @@ +<x=-8, y=-10, z=0> +<x=5, y=5, z=10> +<x=2, y=-7, z=3> +<x=9, y=-8, z=-3> diff --git a/src/main/resources/2019-examples/day12-5.txt b/src/main/resources/2019-examples/day12-5.txt new file mode 100644 index 00000000..1f133fa9 --- /dev/null +++ b/src/main/resources/2019-examples/day12-5.txt @@ -0,0 +1,72 @@ +After 0 steps: +pos=<x= -8, y=-10, z= 0>, vel=<x= 0, y= 0, z= 0> +pos=<x= 5, y= 5, z= 10>, vel=<x= 0, y= 0, z= 0> +pos=<x= 2, y= -7, z= 3>, vel=<x= 0, y= 0, z= 0> +pos=<x= 9, y= -8, z= -3>, vel=<x= 0, y= 0, z= 0> + +After 10 steps: +pos=<x= -9, y=-10, z= 1>, vel=<x= -2, y= -2, z= -1> +pos=<x= 4, y= 10, z= 9>, vel=<x= -3, y= 7, z= -2> +pos=<x= 8, y=-10, z= -3>, vel=<x= 5, y= -1, z= -2> +pos=<x= 5, y=-10, z= 3>, vel=<x= 0, y= -4, z= 5> + +After 20 steps: +pos=<x=-10, y= 3, z= -4>, vel=<x= -5, y= 2, z= 0> +pos=<x= 5, y=-25, z= 6>, vel=<x= 1, y= 1, z= -4> +pos=<x= 13, y= 1, z= 1>, vel=<x= 5, y= -2, z= 2> +pos=<x= 0, y= 1, z= 7>, vel=<x= -1, y= -1, z= 2> + +After 30 steps: +pos=<x= 15, y= -6, z= -9>, vel=<x= -5, y= 4, z= 0> +pos=<x= -4, y=-11, z= 3>, vel=<x= -3, y=-10, z= 0> +pos=<x= 0, y= -1, z= 11>, vel=<x= 7, y= 4, z= 3> +pos=<x= -3, y= -2, z= 5>, vel=<x= 1, y= 2, z= -3> + +After 40 steps: +pos=<x= 14, y=-12, z= -4>, vel=<x= 11, y= 3, z= 0> +pos=<x= -1, y= 18, z= 8>, vel=<x= -5, y= 2, z= 3> +pos=<x= -5, y=-14, z= 8>, vel=<x= 1, y= -2, z= 0> +pos=<x= 0, y=-12, z= -2>, vel=<x= -7, y= -3, z= -3> + +After 50 steps: +pos=<x=-23, y= 4, z= 1>, vel=<x= -7, y= -1, z= 2> +pos=<x= 20, y=-31, z= 13>, vel=<x= 5, y= 3, z= 4> +pos=<x= -4, y= 6, z= 1>, vel=<x= -1, y= 1, z= -3> +pos=<x= 15, y= 1, z= -5>, vel=<x= 3, y= -3, z= -3> + +After 60 steps: +pos=<x= 36, y=-10, z= 6>, vel=<x= 5, y= 0, z= 3> +pos=<x=-18, y= 10, z= 9>, vel=<x= -3, y= -7, z= 5> +pos=<x= 8, y=-12, z= -3>, vel=<x= -2, y= 1, z= -7> +pos=<x=-18, y= -8, z= -2>, vel=<x= 0, y= 6, z= -1> + +After 70 steps: +pos=<x=-33, y= -6, z= 5>, vel=<x= -5, y= -4, z= 7> +pos=<x= 13, y= -9, z= 2>, vel=<x= -2, y= 11, z= 3> +pos=<x= 11, y= -8, z= 2>, vel=<x= 8, y= -6, z= -7> +pos=<x= 17, y= 3, z= 1>, vel=<x= -1, y= -1, z= -3> + +After 80 steps: +pos=<x= 30, y= -8, z= 3>, vel=<x= 3, y= 3, z= 0> +pos=<x= -2, y= -4, z= 0>, vel=<x= 4, y=-13, z= 2> +pos=<x=-18, y= -7, z= 15>, vel=<x= -8, y= 2, z= -2> +pos=<x= -2, y= -1, z= -8>, vel=<x= 1, y= 8, z= 0> + +After 90 steps: +pos=<x=-25, y= -1, z= 4>, vel=<x= 1, y= -3, z= 4> +pos=<x= 2, y= -9, z= 0>, vel=<x= -3, y= 13, z= -1> +pos=<x= 32, y= -8, z= 14>, vel=<x= 5, y= -4, z= 6> +pos=<x= -1, y= -2, z= -8>, vel=<x= -3, y= -6, z= -9> + +After 100 steps: +pos=<x= 8, y=-12, z= -9>, vel=<x= -7, y= 3, z= 0> +pos=<x= 13, y= 16, z= -3>, vel=<x= 3, y=-11, z= -5> +pos=<x=-29, y=-11, z= -1>, vel=<x= -3, y= 7, z= 4> +pos=<x= 16, y=-13, z= 23>, vel=<x= 7, y= 1, z= 1> + +Energy after 100 steps: +pot: 8 + 12 + 9 = 29; kin: 7 + 3 + 0 = 10; total: 29 * 10 = 290 +pot: 13 + 16 + 3 = 32; kin: 3 + 11 + 5 = 19; total: 32 * 19 = 608 +pot: 29 + 11 + 1 = 41; kin: 3 + 7 + 4 = 14; total: 41 * 14 = 574 +pot: 16 + 13 + 23 = 52; kin: 7 + 1 + 1 = 9; total: 52 * 9 = 468 +Sum of total energy: 290 + 608 + 574 + 468 = 1940 diff --git a/src/main/resources/2019-examples/day12-6.txt b/src/main/resources/2019-examples/day12-6.txt new file mode 100644 index 00000000..925c7f53 --- /dev/null +++ b/src/main/resources/2019-examples/day12-6.txt @@ -0,0 +1,23 @@ +After 0 steps: +pos=<x= -1, y= 0, z= 2>, vel=<x= 0, y= 0, z= 0> +pos=<x= 2, y=-10, z= -7>, vel=<x= 0, y= 0, z= 0> +pos=<x= 4, y= -8, z= 8>, vel=<x= 0, y= 0, z= 0> +pos=<x= 3, y= 5, z= -1>, vel=<x= 0, y= 0, z= 0> + +After 2770 steps: +pos=<x= 2, y= -1, z= 1>, vel=<x= -3, y= 2, z= 2> +pos=<x= 3, y= -7, z= -4>, vel=<x= 2, y= -5, z= -6> +pos=<x= 1, y= -7, z= 5>, vel=<x= 0, y= -3, z= 6> +pos=<x= 2, y= 2, z= 0>, vel=<x= 1, y= 6, z= -2> + +After 2771 steps: +pos=<x= -1, y= 0, z= 2>, vel=<x= -3, y= 1, z= 1> +pos=<x= 2, y=-10, z= -7>, vel=<x= -1, y= -3, z= -3> +pos=<x= 4, y= -8, z= 8>, vel=<x= 3, y= -1, z= 3> +pos=<x= 3, y= 5, z= -1>, vel=<x= 1, y= 3, z= -1> + +After 2772 steps: +pos=<x= -1, y= 0, z= 2>, vel=<x= 0, y= 0, z= 0> +pos=<x= 2, y=-10, z= -7>, vel=<x= 0, y= 0, z= 0> +pos=<x= 4, y= -8, z= 8>, vel=<x= 0, y= 0, z= 0> +pos=<x= 3, y= 5, z= -1>, vel=<x= 0, y= 0, z= 0> diff --git a/src/main/resources/2019-examples/day12-7.txt b/src/main/resources/2019-examples/day12-7.txt new file mode 100644 index 00000000..ace1dfbd --- /dev/null +++ b/src/main/resources/2019-examples/day12-7.txt @@ -0,0 +1,4 @@ +<x=-8, y=-10, z=0> +<x=5, y=5, z=10> +<x=2, y=-7, z=3> +<x=9, y=-8, z=-3> diff --git a/src/main/resources/2019-examples/day14-1.txt b/src/main/resources/2019-examples/day14-1.txt new file mode 100644 index 00000000..2ad3c614 --- /dev/null +++ b/src/main/resources/2019-examples/day14-1.txt @@ -0,0 +1,6 @@ +10 ORE => 10 A +1 ORE => 1 B +7 A, 1 B => 1 C +7 A, 1 C => 1 D +7 A, 1 D => 1 E +7 A, 1 E => 1 FUEL diff --git a/src/main/resources/2019-examples/day14-2.txt b/src/main/resources/2019-examples/day14-2.txt new file mode 100644 index 00000000..86599f2c --- /dev/null +++ b/src/main/resources/2019-examples/day14-2.txt @@ -0,0 +1,7 @@ +9 ORE => 2 A +8 ORE => 3 B +7 ORE => 5 C +3 A, 4 B => 1 AB +5 B, 7 C => 1 BC +4 C, 1 A => 1 CA +2 AB, 3 BC, 4 CA => 1 FUEL diff --git a/src/main/resources/2019-examples/day14-3.txt b/src/main/resources/2019-examples/day14-3.txt new file mode 100644 index 00000000..e7992c2c --- /dev/null +++ b/src/main/resources/2019-examples/day14-3.txt @@ -0,0 +1,9 @@ +157 ORE => 5 NZVS +165 ORE => 6 DCFZ +44 XJWVT, 5 KHKGT, 1 QDVJ, 29 NZVS, 9 GPVTF, 48 HKGWZ => 1 FUEL +12 HKGWZ, 1 GPVTF, 8 PSHF => 9 QDVJ +179 ORE => 7 PSHF +177 ORE => 5 HKGWZ +7 DCFZ, 7 PSHF => 2 XJWVT +165 ORE => 2 GPVTF +3 DCFZ, 7 NZVS, 5 HKGWZ, 10 PSHF => 8 KHKGT diff --git a/src/main/resources/2019-examples/day14-4.txt b/src/main/resources/2019-examples/day14-4.txt new file mode 100644 index 00000000..e7a9cad7 --- /dev/null +++ b/src/main/resources/2019-examples/day14-4.txt @@ -0,0 +1,12 @@ +2 VPVL, 7 FWMGM, 2 CXFTF, 11 MNCFX => 1 STKFG +17 NVRVD, 3 JNWZP => 8 VPVL +53 STKFG, 6 MNCFX, 46 VJHF, 81 HVMC, 68 CXFTF, 25 GNMV => 1 FUEL +22 VJHF, 37 MNCFX => 5 FWMGM +139 ORE => 4 NVRVD +144 ORE => 7 JNWZP +5 MNCFX, 7 RFSQX, 2 FWMGM, 2 VPVL, 19 CXFTF => 3 HVMC +5 VJHF, 7 MNCFX, 9 VPVL, 37 CXFTF => 6 GNMV +145 ORE => 6 MNCFX +1 NVRVD => 8 CXFTF +1 VJHF, 6 MNCFX => 4 RFSQX +176 ORE => 6 VJHF diff --git a/src/main/resources/2019-examples/day14-5.txt b/src/main/resources/2019-examples/day14-5.txt new file mode 100644 index 00000000..ad2c7460 --- /dev/null +++ b/src/main/resources/2019-examples/day14-5.txt @@ -0,0 +1,17 @@ +171 ORE => 8 CNZTR +7 ZLQW, 3 BMBT, 9 XCVML, 26 XMNCP, 1 WPTQ, 2 MZWV, 1 RJRHP => 4 PLWSL +114 ORE => 4 BHXH +14 VRPVC => 6 BMBT +6 BHXH, 18 KTJDG, 12 WPTQ, 7 PLWSL, 31 FHTLT, 37 ZDVW => 1 FUEL +6 WPTQ, 2 BMBT, 8 ZLQW, 18 KTJDG, 1 XMNCP, 6 MZWV, 1 RJRHP => 6 FHTLT +15 XDBXC, 2 LTCX, 1 VRPVC => 6 ZLQW +13 WPTQ, 10 LTCX, 3 RJRHP, 14 XMNCP, 2 MZWV, 1 ZLQW => 1 ZDVW +5 BMBT => 4 WPTQ +189 ORE => 9 KTJDG +1 MZWV, 17 XDBXC, 3 XCVML => 2 XMNCP +12 VRPVC, 27 CNZTR => 2 XDBXC +15 KTJDG, 12 BHXH => 5 XCVML +3 BHXH, 2 VRPVC => 7 MZWV +121 ORE => 7 VRPVC +7 XCVML => 6 RJRHP +5 BHXH, 4 VRPVC => 5 LTCX diff --git a/src/main/resources/2019-examples/day15-1.txt b/src/main/resources/2019-examples/day15-1.txt new file mode 100644 index 00000000..f4783f53 --- /dev/null +++ b/src/main/resources/2019-examples/day15-1.txt @@ -0,0 +1,5 @@ + + + D + + diff --git a/src/main/resources/2019-examples/day15-10.txt b/src/main/resources/2019-examples/day15-10.txt new file mode 100644 index 00000000..74a26838 --- /dev/null +++ b/src/main/resources/2019-examples/day15-10.txt @@ -0,0 +1,5 @@ + ## +#O.## +#O#OO# +#OOO# + ### diff --git a/src/main/resources/2019-examples/day15-11.txt b/src/main/resources/2019-examples/day15-11.txt new file mode 100644 index 00000000..5de3ed21 --- /dev/null +++ b/src/main/resources/2019-examples/day15-11.txt @@ -0,0 +1,5 @@ + ## +#OO## +#O#OO# +#OOO# + ### diff --git a/src/main/resources/2019-examples/day15-2.txt b/src/main/resources/2019-examples/day15-2.txt new file mode 100644 index 00000000..6791f1c0 --- /dev/null +++ b/src/main/resources/2019-examples/day15-2.txt @@ -0,0 +1,5 @@ + + # + D + + diff --git a/src/main/resources/2019-examples/day15-3.txt b/src/main/resources/2019-examples/day15-3.txt new file mode 100644 index 00000000..70399633 --- /dev/null +++ b/src/main/resources/2019-examples/day15-3.txt @@ -0,0 +1,5 @@ + + # + .D + + diff --git a/src/main/resources/2019-examples/day15-4.txt b/src/main/resources/2019-examples/day15-4.txt new file mode 100644 index 00000000..9679dcdf --- /dev/null +++ b/src/main/resources/2019-examples/day15-4.txt @@ -0,0 +1,5 @@ + + ## + .D# + # + diff --git a/src/main/resources/2019-examples/day15-5.txt b/src/main/resources/2019-examples/day15-5.txt new file mode 100644 index 00000000..918acc3d --- /dev/null +++ b/src/main/resources/2019-examples/day15-5.txt @@ -0,0 +1,5 @@ + + ## + D.# + # + diff --git a/src/main/resources/2019-examples/day15-6.txt b/src/main/resources/2019-examples/day15-6.txt new file mode 100644 index 00000000..cf1ff48f --- /dev/null +++ b/src/main/resources/2019-examples/day15-6.txt @@ -0,0 +1,5 @@ + + ## + #..# + D.# + # diff --git a/src/main/resources/2019-examples/day15-7.txt b/src/main/resources/2019-examples/day15-7.txt new file mode 100644 index 00000000..78b58630 --- /dev/null +++ b/src/main/resources/2019-examples/day15-7.txt @@ -0,0 +1,5 @@ + ## +#..## +#.#..# +#.O.# + ### diff --git a/src/main/resources/2019-examples/day15-8.txt b/src/main/resources/2019-examples/day15-8.txt new file mode 100644 index 00000000..ee3c1433 --- /dev/null +++ b/src/main/resources/2019-examples/day15-8.txt @@ -0,0 +1,5 @@ + ## +#..## +#.#..# +#OOO# + ### diff --git a/src/main/resources/2019-examples/day15-9.txt b/src/main/resources/2019-examples/day15-9.txt new file mode 100644 index 00000000..fd4a56b1 --- /dev/null +++ b/src/main/resources/2019-examples/day15-9.txt @@ -0,0 +1,5 @@ + ## +#..## +#O#O.# +#OOO# + ### diff --git a/src/main/resources/2019-examples/day16-1.txt b/src/main/resources/2019-examples/day16-1.txt new file mode 100644 index 00000000..d84f5fda --- /dev/null +++ b/src/main/resources/2019-examples/day16-1.txt @@ -0,0 +1,45 @@ +Input signal: 12345678 + +1*1 + 2*0 + 3*-1 + 4*0 + 5*1 + 6*0 + 7*-1 + 8*0 = 4 +1*0 + 2*1 + 3*1 + 4*0 + 5*0 + 6*-1 + 7*-1 + 8*0 = 8 +1*0 + 2*0 + 3*1 + 4*1 + 5*1 + 6*0 + 7*0 + 8*0 = 2 +1*0 + 2*0 + 3*0 + 4*1 + 5*1 + 6*1 + 7*1 + 8*0 = 2 +1*0 + 2*0 + 3*0 + 4*0 + 5*1 + 6*1 + 7*1 + 8*1 = 6 +1*0 + 2*0 + 3*0 + 4*0 + 5*0 + 6*1 + 7*1 + 8*1 = 1 +1*0 + 2*0 + 3*0 + 4*0 + 5*0 + 6*0 + 7*1 + 8*1 = 5 +1*0 + 2*0 + 3*0 + 4*0 + 5*0 + 6*0 + 7*0 + 8*1 = 8 + +After 1 phase: 48226158 + +4*1 + 8*0 + 2*-1 + 2*0 + 6*1 + 1*0 + 5*-1 + 8*0 = 3 +4*0 + 8*1 + 2*1 + 2*0 + 6*0 + 1*-1 + 5*-1 + 8*0 = 4 +4*0 + 8*0 + 2*1 + 2*1 + 6*1 + 1*0 + 5*0 + 8*0 = 0 +4*0 + 8*0 + 2*0 + 2*1 + 6*1 + 1*1 + 5*1 + 8*0 = 4 +4*0 + 8*0 + 2*0 + 2*0 + 6*1 + 1*1 + 5*1 + 8*1 = 0 +4*0 + 8*0 + 2*0 + 2*0 + 6*0 + 1*1 + 5*1 + 8*1 = 4 +4*0 + 8*0 + 2*0 + 2*0 + 6*0 + 1*0 + 5*1 + 8*1 = 3 +4*0 + 8*0 + 2*0 + 2*0 + 6*0 + 1*0 + 5*0 + 8*1 = 8 + +After 2 phases: 34040438 + +3*1 + 4*0 + 0*-1 + 4*0 + 0*1 + 4*0 + 3*-1 + 8*0 = 0 +3*0 + 4*1 + 0*1 + 4*0 + 0*0 + 4*-1 + 3*-1 + 8*0 = 3 +3*0 + 4*0 + 0*1 + 4*1 + 0*1 + 4*0 + 3*0 + 8*0 = 4 +3*0 + 4*0 + 0*0 + 4*1 + 0*1 + 4*1 + 3*1 + 8*0 = 1 +3*0 + 4*0 + 0*0 + 4*0 + 0*1 + 4*1 + 3*1 + 8*1 = 5 +3*0 + 4*0 + 0*0 + 4*0 + 0*0 + 4*1 + 3*1 + 8*1 = 5 +3*0 + 4*0 + 0*0 + 4*0 + 0*0 + 4*0 + 3*1 + 8*1 = 1 +3*0 + 4*0 + 0*0 + 4*0 + 0*0 + 4*0 + 3*0 + 8*1 = 8 + +After 3 phases: 03415518 + +0*1 + 3*0 + 4*-1 + 1*0 + 5*1 + 5*0 + 1*-1 + 8*0 = 0 +0*0 + 3*1 + 4*1 + 1*0 + 5*0 + 5*-1 + 1*-1 + 8*0 = 1 +0*0 + 3*0 + 4*1 + 1*1 + 5*1 + 5*0 + 1*0 + 8*0 = 0 +0*0 + 3*0 + 4*0 + 1*1 + 5*1 + 5*1 + 1*1 + 8*0 = 2 +0*0 + 3*0 + 4*0 + 1*0 + 5*1 + 5*1 + 1*1 + 8*1 = 9 +0*0 + 3*0 + 4*0 + 1*0 + 5*0 + 5*1 + 1*1 + 8*1 = 4 +0*0 + 3*0 + 4*0 + 1*0 + 5*0 + 5*0 + 1*1 + 8*1 = 9 +0*0 + 3*0 + 4*0 + 1*0 + 5*0 + 5*0 + 1*0 + 8*1 = 8 + +After 4 phases: 01029498 diff --git a/src/main/resources/2019-examples/day17-1.txt b/src/main/resources/2019-examples/day17-1.txt new file mode 100644 index 00000000..f9c709c1 --- /dev/null +++ b/src/main/resources/2019-examples/day17-1.txt @@ -0,0 +1,7 @@ +..#.......... +..#.......... +#######...### +#.#...#...#.# +############# +..#...#...#.. +..#####...^.. diff --git a/src/main/resources/2019-examples/day17-2.txt b/src/main/resources/2019-examples/day17-2.txt new file mode 100644 index 00000000..02b96d6f --- /dev/null +++ b/src/main/resources/2019-examples/day17-2.txt @@ -0,0 +1,7 @@ +..#.......... +..#.......... +##O####...### +#.#...#...#.# +##O###O###O## +..#...#...#.. +..#####...^.. diff --git a/src/main/resources/2019-examples/day17-3.txt b/src/main/resources/2019-examples/day17-3.txt new file mode 100644 index 00000000..da6fc674 --- /dev/null +++ b/src/main/resources/2019-examples/day17-3.txt @@ -0,0 +1,15 @@ +#######...##### +#.....#...#...# +#.....#...#...# +......#...#...# +......#...###.# +......#.....#.# +^########...#.# +......#.#...#.# +......######### +........#...#.. +....#########.. +....#...#...... +....#...#...... +....#...#...... +....#####...... diff --git a/src/main/resources/2019-examples/day17-4.txt b/src/main/resources/2019-examples/day17-4.txt new file mode 100644 index 00000000..41814ac8 --- /dev/null +++ b/src/main/resources/2019-examples/day17-4.txt @@ -0,0 +1 @@ +R,8,R,8,R,4,R,4,R,8,L,6,L,2,R,4,R,4,R,8,R,8,R,8,L,6,L,2 \ No newline at end of file diff --git a/src/main/resources/2019-examples/day17-5.txt b/src/main/resources/2019-examples/day17-5.txt new file mode 100644 index 00000000..1f4b4e43 --- /dev/null +++ b/src/main/resources/2019-examples/day17-5.txt @@ -0,0 +1,18 @@ +A, B, C, B, A, C +R,8,R,8, R,4,R,4,R,8, L,6,L,2, R,4,R,4,R,8, R,8,R,8, L,6,L,2 + +CCCCCCA...BBBBB +C.....A...B...B +C.....A...B...B +......A...B...B +......A...CCC.B +......A.....C.B +^AAAAAAAA...C.B +......A.A...C.B +......AAAAAA#AB +........A...C.. +....BBBB#BBBB.. +....B...A...... +....B...A...... +....B...A...... +....BBBBA...... diff --git a/src/main/resources/2019-examples/day18-1.txt b/src/main/resources/2019-examples/day18-1.txt new file mode 100644 index 00000000..33802e1d --- /dev/null +++ b/src/main/resources/2019-examples/day18-1.txt @@ -0,0 +1,3 @@ +######### +#b.A.@.a# +######### diff --git a/src/main/resources/2019-examples/day18-10.txt b/src/main/resources/2019-examples/day18-10.txt new file mode 100644 index 00000000..d5d888b1 --- /dev/null +++ b/src/main/resources/2019-examples/day18-10.txt @@ -0,0 +1,9 @@ +################# +#i.G..c...e..H.p# +########.######## +#j.A..b...f..D.o# +########@######## +#k.E..a...g..B.n# +########.######## +#l.F..d...h..C.m# +################# diff --git a/src/main/resources/2019-examples/day18-11.txt b/src/main/resources/2019-examples/day18-11.txt new file mode 100644 index 00000000..ee6598e6 --- /dev/null +++ b/src/main/resources/2019-examples/day18-11.txt @@ -0,0 +1,6 @@ +######################## +#@..............ac.GI.b# +###d#e#f################ +###A#B#C################ +###g#h#i################ +######################## diff --git a/src/main/resources/2019-examples/day18-12.txt b/src/main/resources/2019-examples/day18-12.txt new file mode 100644 index 00000000..effc0952 --- /dev/null +++ b/src/main/resources/2019-examples/day18-12.txt @@ -0,0 +1,3 @@ +... +.@. +... diff --git a/src/main/resources/2019-examples/day18-13.txt b/src/main/resources/2019-examples/day18-13.txt new file mode 100644 index 00000000..36625788 --- /dev/null +++ b/src/main/resources/2019-examples/day18-13.txt @@ -0,0 +1,3 @@ +@#@ +### +@#@ diff --git a/src/main/resources/2019-examples/day18-14.txt b/src/main/resources/2019-examples/day18-14.txt new file mode 100644 index 00000000..e8d22b04 --- /dev/null +++ b/src/main/resources/2019-examples/day18-14.txt @@ -0,0 +1,7 @@ +####### ####### +#a.#Cd# #a.#Cd# +##...## ##@#@## +##.@.## --> ####### +##...## ##@#@## +#cB#Ab# #cB#Ab# +####### ####### diff --git a/src/main/resources/2019-examples/day18-15.txt b/src/main/resources/2019-examples/day18-15.txt new file mode 100644 index 00000000..db9f9176 --- /dev/null +++ b/src/main/resources/2019-examples/day18-15.txt @@ -0,0 +1,7 @@ +####### +#@.#Cd# +##.#@## +####### +##@#@## +#cB#.b# +####### diff --git a/src/main/resources/2019-examples/day18-16.txt b/src/main/resources/2019-examples/day18-16.txt new file mode 100644 index 00000000..916f26c6 --- /dev/null +++ b/src/main/resources/2019-examples/day18-16.txt @@ -0,0 +1,7 @@ +####### +#@.#Cd# +##.#@## +####### +##@#.## +#c.#.@# +####### diff --git a/src/main/resources/2019-examples/day18-17.txt b/src/main/resources/2019-examples/day18-17.txt new file mode 100644 index 00000000..d38635ec --- /dev/null +++ b/src/main/resources/2019-examples/day18-17.txt @@ -0,0 +1,7 @@ +####### +#@.#.d# +##.#@## +####### +##.#.## +#@.#.@# +####### diff --git a/src/main/resources/2019-examples/day18-18.txt b/src/main/resources/2019-examples/day18-18.txt new file mode 100644 index 00000000..64644ce7 --- /dev/null +++ b/src/main/resources/2019-examples/day18-18.txt @@ -0,0 +1,7 @@ +####### +#@.#.@# +##.#.## +####### +##.#.## +#@.#.@# +####### diff --git a/src/main/resources/2019-examples/day18-19.txt b/src/main/resources/2019-examples/day18-19.txt new file mode 100644 index 00000000..c449a427 --- /dev/null +++ b/src/main/resources/2019-examples/day18-19.txt @@ -0,0 +1,7 @@ +############### +#d.ABC.#.....a# +######@#@###### +############### +######@#@###### +#b.....#.....c# +############### diff --git a/src/main/resources/2019-examples/day18-2.txt b/src/main/resources/2019-examples/day18-2.txt new file mode 100644 index 00000000..b3e58165 --- /dev/null +++ b/src/main/resources/2019-examples/day18-2.txt @@ -0,0 +1,3 @@ +######### +#b.....@# +######### diff --git a/src/main/resources/2019-examples/day18-20.txt b/src/main/resources/2019-examples/day18-20.txt new file mode 100644 index 00000000..5f99dd6f --- /dev/null +++ b/src/main/resources/2019-examples/day18-20.txt @@ -0,0 +1,7 @@ +############# +#DcBa.#.GhKl# +#.###@#@#I### +#e#d#####j#k# +###C#@#@###J# +#fEbA.#.FgHi# +############# diff --git a/src/main/resources/2019-examples/day18-21.txt b/src/main/resources/2019-examples/day18-21.txt new file mode 100644 index 00000000..97c85afc --- /dev/null +++ b/src/main/resources/2019-examples/day18-21.txt @@ -0,0 +1,9 @@ +############# +#g#f.D#..h#l# +#F###e#E###.# +#dCba@#@BcIJ# +############# +#nK.L@#@G...# +#M###N#H###.# +#o#m..#i#jk.# +############# diff --git a/src/main/resources/2019-examples/day18-3.txt b/src/main/resources/2019-examples/day18-3.txt new file mode 100644 index 00000000..81500e9a --- /dev/null +++ b/src/main/resources/2019-examples/day18-3.txt @@ -0,0 +1,3 @@ +######### +#@......# +######### diff --git a/src/main/resources/2019-examples/day18-4.txt b/src/main/resources/2019-examples/day18-4.txt new file mode 100644 index 00000000..af485bc3 --- /dev/null +++ b/src/main/resources/2019-examples/day18-4.txt @@ -0,0 +1,5 @@ +######################## +#f.D.E.e.C.b.A.@.a.B.c.# +######################.# +#d.....................# +######################## diff --git a/src/main/resources/2019-examples/day18-5.txt b/src/main/resources/2019-examples/day18-5.txt new file mode 100644 index 00000000..c3828dca --- /dev/null +++ b/src/main/resources/2019-examples/day18-5.txt @@ -0,0 +1,5 @@ +######################## +#f.D.E.e.C.b.....@.B.c.# +######################.# +#d.....................# +######################## diff --git a/src/main/resources/2019-examples/day18-6.txt b/src/main/resources/2019-examples/day18-6.txt new file mode 100644 index 00000000..588c2b47 --- /dev/null +++ b/src/main/resources/2019-examples/day18-6.txt @@ -0,0 +1,5 @@ +######################## +#f.D.E.e.C.@.........c.# +######################.# +#d.....................# +######################## diff --git a/src/main/resources/2019-examples/day18-7.txt b/src/main/resources/2019-examples/day18-7.txt new file mode 100644 index 00000000..86078d64 --- /dev/null +++ b/src/main/resources/2019-examples/day18-7.txt @@ -0,0 +1,5 @@ +######################## +#f.D.E.e.............@.# +######################.# +#d.....................# +######################## diff --git a/src/main/resources/2019-examples/day18-8.txt b/src/main/resources/2019-examples/day18-8.txt new file mode 100644 index 00000000..8e7e456f --- /dev/null +++ b/src/main/resources/2019-examples/day18-8.txt @@ -0,0 +1,5 @@ +######################## +#f...E.e...............# +######################.# +#@.....................# +######################## diff --git a/src/main/resources/2019-examples/day18-9.txt b/src/main/resources/2019-examples/day18-9.txt new file mode 100644 index 00000000..b650235d --- /dev/null +++ b/src/main/resources/2019-examples/day18-9.txt @@ -0,0 +1,5 @@ +######################## +#...............b.C.D.f# +#.###################### +#.....@.a.B.c.d.A.e.F.g# +######################## diff --git a/src/main/resources/2019-examples/day19-1.txt b/src/main/resources/2019-examples/day19-1.txt new file mode 100644 index 00000000..8e9f5caf --- /dev/null +++ b/src/main/resources/2019-examples/day19-1.txt @@ -0,0 +1,12 @@ + X + 0-> 9 + 0#......... + |.#........ + v..##...... + ...###.... + ....###... +Y .....####. + ......#### + ......#### + .......### + 9........## diff --git a/src/main/resources/2019-examples/day19-2.txt b/src/main/resources/2019-examples/day19-2.txt new file mode 100644 index 00000000..feed715c --- /dev/null +++ b/src/main/resources/2019-examples/day19-2.txt @@ -0,0 +1,35 @@ +#....................................... +.#...................................... +..##.................................... +...###.................................. +....###................................. +.....####............................... +......#####............................. +......######............................ +.......#######.......................... +........########........................ +.........#########...................... +..........#########..................... +...........##########................... +...........############................. +............############................ +.............#############.............. +..............##############............ +...............###############.......... +................###############......... +................#################....... +.................########OOOOOOOOOO..... +..................#######OOOOOOOOOO#.... +...................######OOOOOOOOOO###.. +....................#####OOOOOOOOOO##### +.....................####OOOOOOOOOO##### +.....................####OOOOOOOOOO##### +......................###OOOOOOOOOO##### +.......................##OOOOOOOOOO##### +........................#OOOOOOOOOO##### +.........................OOOOOOOOOO##### +..........................############## +..........................############## +...........................############# +............................############ +.............................########### diff --git a/src/main/resources/2019-examples/day2-1.txt b/src/main/resources/2019-examples/day2-1.txt new file mode 100644 index 00000000..d3e65874 --- /dev/null +++ b/src/main/resources/2019-examples/day2-1.txt @@ -0,0 +1 @@ +1,9,10,3,2,3,11,0,99,30,40,50 \ No newline at end of file diff --git a/src/main/resources/2019-examples/day2-2.txt b/src/main/resources/2019-examples/day2-2.txt new file mode 100644 index 00000000..d9730d11 --- /dev/null +++ b/src/main/resources/2019-examples/day2-2.txt @@ -0,0 +1,4 @@ +1,9,10,3, +2,3,11,0, +99, +30,40,50 diff --git a/src/main/resources/2019-examples/day2-3.txt b/src/main/resources/2019-examples/day2-3.txt new file mode 100644 index 00000000..805b122c --- /dev/null +++ b/src/main/resources/2019-examples/day2-3.txt @@ -0,0 +1,4 @@ +1,9,10,70, +2,3,11,0, +99, +30,40,50 diff --git a/src/main/resources/2019-examples/day2-4.txt b/src/main/resources/2019-examples/day2-4.txt new file mode 100644 index 00000000..68cd7a47 --- /dev/null +++ b/src/main/resources/2019-examples/day2-4.txt @@ -0,0 +1,4 @@ +3500,9,10,70, +2,3,11,0, +99, +30,40,50 diff --git a/src/main/resources/2019-examples/day20-1.txt b/src/main/resources/2019-examples/day20-1.txt new file mode 100644 index 00000000..1e8d56fa --- /dev/null +++ b/src/main/resources/2019-examples/day20-1.txt @@ -0,0 +1,19 @@ + A + A + #######.######### + #######.........# + #######.#######.# + #######.#######.# + #######.#######.# + ##### B ###.# +BC...## C ###.# + ##.## ###.# + ##...DE F ###.# + ##### G ###.# + #########.#####.# +DE..#######...###.# + #.#########.###.# +FG..#########.....# + ###########.##### + Z + Z diff --git a/src/main/resources/2019-examples/day20-2.txt b/src/main/resources/2019-examples/day20-2.txt new file mode 100644 index 00000000..6f61581a --- /dev/null +++ b/src/main/resources/2019-examples/day20-2.txt @@ -0,0 +1,37 @@ + A + A + #################.############# + #.#...#...................#.#.# + #.#.#.###.###.###.#########.#.# + #.#.#.......#...#.....#.#.#...# + #.#########.###.#####.#.#.###.# + #.............#.#.....#.......# + ###.###########.###.#####.#.#.# + #.....# A C #.#.#.# + ####### S P #####.# + #.#...# #......VT + #.#.#.# #.##### + #...#.# YN....#.# + #.###.# #####.# +DI....#.# #.....# + #####.# #.###.# +ZZ......# QG....#..AS + ###.### ####### +JO..#.#.# #.....# + #.#.#.# ###.#.# + #...#..DI BU....#..LF + #####.# #.##### +YN......# VT..#....QG + #.###.# #.###.# + #.#...# #.....# + ###.### J L J #.#.### + #.....# O F P #.#...# + #.###.#####.#.#####.#####.###.# + #...#.#.#...#.....#.....#.#...# + #.#####.###.###.#.#.#########.# + #...#.#.....#...#.#.#.#.....#.# + #.###.#####.###.###.#.#.####### + #.#.........#...#.............# + #########.###.###.############# + B J C + U P P diff --git a/src/main/resources/2019-examples/day20-3.txt b/src/main/resources/2019-examples/day20-3.txt new file mode 100644 index 00000000..d0511332 --- /dev/null +++ b/src/main/resources/2019-examples/day20-3.txt @@ -0,0 +1,37 @@ + Z L X W C + Z P Q B K + ###########.#.#.#.#######.############### + #...#.......#.#.......#.#.......#.#.#...# + ###.#.#.#.#.#.#.#.###.#.#.#######.#.#.### + #.#...#.#.#...#.#.#...#...#...#.#.......# + #.###.#######.###.###.#.###.###.#.####### + #...#.......#.#...#...#.............#...# + #.#########.#######.#.#######.#######.### + #...#.# F R I Z #.#.#.# + #.###.# D E C H #.#.#.# + #.#...# #...#.# + #.###.# #.###.# + #.#....OA WB..#.#..ZH + #.###.# #.#.#.# +CJ......# #.....# + ####### ####### + #.#....CK #......IC + #.###.# #.###.# + #.....# #...#.# + ###.### #.#.#.# +XF....#.# RF..#.#.# + #####.# ####### + #......CJ NM..#...# + ###.#.# #.###.# +RE....#.# #......RF + ###.### X X L #.#.#.# + #.....# F Q P #.#.#.# + ###.###########.###.#######.#########.### + #.....#...#.....#.......#...#.....#.#...# + #####.#.###.#######.#######.###.###.#.#.# + #.......#.......#.#.#.#.#...#...#...#.#.# + #####.###.#####.#.#.#.#.###.###.#.###.### + #.......#.....#.#...#...............#...# + #############.#.#.###.################### + A O F N + A A D M diff --git a/src/main/resources/2019-examples/day21-1.txt b/src/main/resources/2019-examples/day21-1.txt new file mode 100644 index 00000000..7eb50b8b --- /dev/null +++ b/src/main/resources/2019-examples/day21-1.txt @@ -0,0 +1,6 @@ +NOT A J +NOT B T +AND T J +NOT C T +AND T J +AND D J diff --git a/src/main/resources/2019-examples/day21-2.txt b/src/main/resources/2019-examples/day21-2.txt new file mode 100644 index 00000000..b3f0bf4c --- /dev/null +++ b/src/main/resources/2019-examples/day21-2.txt @@ -0,0 +1,2 @@ +NOT D J +WALK diff --git a/src/main/resources/2019-examples/day21-3.txt b/src/main/resources/2019-examples/day21-3.txt new file mode 100644 index 00000000..3e1abfa3 --- /dev/null +++ b/src/main/resources/2019-examples/day21-3.txt @@ -0,0 +1,34 @@ +................. +................. +@................ +#####.########### + +................. +................. +.@............... +#####.########### + +................. +..@.............. +................. +#####.########### + +...@............. +................. +................. +#####.########### + +................. +....@............ +................. +#####.########### + +................. +................. +.....@........... +#####.########### + +................. +................. +................. +#####@########### diff --git a/src/main/resources/2019-examples/day22-1.txt b/src/main/resources/2019-examples/day22-1.txt new file mode 100644 index 00000000..f5b19d5a --- /dev/null +++ b/src/main/resources/2019-examples/day22-1.txt @@ -0,0 +1,20 @@ +Top Bottom +0 1 2 3 4 5 6 7 8 9 Your deck + New stack + + 1 2 3 4 5 6 7 8 9 Your deck + 0 New stack + + 2 3 4 5 6 7 8 9 Your deck + 1 0 New stack + + 3 4 5 6 7 8 9 Your deck + 2 1 0 New stack + +Several steps later... + + 9 Your deck + 8 7 6 5 4 3 2 1 0 New stack + + Your deck +9 8 7 6 5 4 3 2 1 0 New stack diff --git a/src/main/resources/2019-examples/day22-2.txt b/src/main/resources/2019-examples/day22-2.txt new file mode 100644 index 00000000..7d60260e --- /dev/null +++ b/src/main/resources/2019-examples/day22-2.txt @@ -0,0 +1,10 @@ +Top Bottom +0 1 2 3 4 5 6 7 8 9 Your deck + + 3 4 5 6 7 8 9 Your deck +0 1 2 Cut cards + +3 4 5 6 7 8 9 Your deck + 0 1 2 Cut cards + +3 4 5 6 7 8 9 0 1 2 Your deck diff --git a/src/main/resources/2019-examples/day22-3.txt b/src/main/resources/2019-examples/day22-3.txt new file mode 100644 index 00000000..29420462 --- /dev/null +++ b/src/main/resources/2019-examples/day22-3.txt @@ -0,0 +1,10 @@ +Top Bottom +0 1 2 3 4 5 6 7 8 9 Your deck + +0 1 2 3 4 5 Your deck + 6 7 8 9 Cut cards + + 0 1 2 3 4 5 Your deck +6 7 8 9 Cut cards + +6 7 8 9 0 1 2 3 4 5 Your deck diff --git a/src/main/resources/2019-examples/day22-4.txt b/src/main/resources/2019-examples/day22-4.txt new file mode 100644 index 00000000..e772815b --- /dev/null +++ b/src/main/resources/2019-examples/day22-4.txt @@ -0,0 +1,44 @@ + +0 1 2 3 4 5 6 7 8 9 Your deck +. . . . . . . . . . Space on table +^ Current position + +Deal the top card to the current position: + + 1 2 3 4 5 6 7 8 9 Your deck +0 . . . . . . . . . Space on table +^ Current position + +Move the current position right 3: + + 1 2 3 4 5 6 7 8 9 Your deck +0 . . . . . . . . . Space on table + ^ Current position + +Deal the top card: + + 2 3 4 5 6 7 8 9 Your deck +0 . . 1 . . . . . . Space on table + ^ Current position + +Move right 3 and deal: + + 3 4 5 6 7 8 9 Your deck +0 . . 1 . . 2 . . . Space on table + ^ Current position + +Move right 3 and deal: + + 4 5 6 7 8 9 Your deck +0 . . 1 . . 2 . . 3 Space on table + ^ Current position + +Move right 3, wrapping around, and deal: + + 5 6 7 8 9 Your deck +0 . 4 1 . . 2 . . 3 Space on table + ^ Current position + +And so on: + +0 7 4 1 8 5 2 9 6 3 Space on table diff --git a/src/main/resources/2019-examples/day22-5.txt b/src/main/resources/2019-examples/day22-5.txt new file mode 100644 index 00000000..b121f672 --- /dev/null +++ b/src/main/resources/2019-examples/day22-5.txt @@ -0,0 +1,4 @@ +deal with increment 7 +deal into new stack +deal into new stack +Result: 0 3 6 9 2 5 8 1 4 7 diff --git a/src/main/resources/2019-examples/day22-6.txt b/src/main/resources/2019-examples/day22-6.txt new file mode 100644 index 00000000..741ec20f --- /dev/null +++ b/src/main/resources/2019-examples/day22-6.txt @@ -0,0 +1,4 @@ +cut 6 +deal with increment 7 +deal into new stack +Result: 3 0 7 4 1 8 5 2 9 6 diff --git a/src/main/resources/2019-examples/day22-7.txt b/src/main/resources/2019-examples/day22-7.txt new file mode 100644 index 00000000..01a9e358 --- /dev/null +++ b/src/main/resources/2019-examples/day22-7.txt @@ -0,0 +1,4 @@ +deal with increment 7 +deal with increment 9 +cut -2 +Result: 6 3 0 7 4 1 8 5 2 9 diff --git a/src/main/resources/2019-examples/day22-8.txt b/src/main/resources/2019-examples/day22-8.txt new file mode 100644 index 00000000..d4a1e7ae --- /dev/null +++ b/src/main/resources/2019-examples/day22-8.txt @@ -0,0 +1,11 @@ +deal into new stack +cut -2 +deal with increment 7 +cut 8 +cut -4 +deal with increment 7 +cut 3 +deal with increment 9 +deal with increment 3 +cut -1 +Result: 9 2 5 8 1 4 7 0 3 6 diff --git a/src/main/resources/2019-examples/day24-1.txt b/src/main/resources/2019-examples/day24-1.txt new file mode 100644 index 00000000..e1b0f601 --- /dev/null +++ b/src/main/resources/2019-examples/day24-1.txt @@ -0,0 +1,34 @@ +Initial state: +....# +#..#. +#..## +..#.. +#.... + +After 1 minute: +#..#. +####. +###.# +##.## +.##.. + +After 2 minutes: +##### +....# +....# +...#. +#.### + +After 3 minutes: +#.... +####. +...## +#.##. +.##.# + +After 4 minutes: +####. +....# +##..# +..... +##... diff --git a/src/main/resources/2019-examples/day24-2.txt b/src/main/resources/2019-examples/day24-2.txt new file mode 100644 index 00000000..77d1d37d --- /dev/null +++ b/src/main/resources/2019-examples/day24-2.txt @@ -0,0 +1,5 @@ +..... +..... +..... +#.... +.#... diff --git a/src/main/resources/2019-examples/day24-3.txt b/src/main/resources/2019-examples/day24-3.txt new file mode 100644 index 00000000..f64e7cfb --- /dev/null +++ b/src/main/resources/2019-examples/day24-3.txt @@ -0,0 +1,25 @@ + | | | | + | | | | + | | | | +-----+-----+---------+-----+----- + | | | | + | | | | + | | | | +-----+-----+---------+-----+----- + | | | | | | | | + | |-+-+-+-+-| | + | | | | | | | | + | |-+-+-+-+-| | + | | | |?| | | | + | |-+-+-+-+-| | + | | | | | | | | + | |-+-+-+-+-| | + | | | | | | | | +-----+-----+---------+-----+----- + | | | | + | | | | + | | | | +-----+-----+---------+-----+----- + | | | | + | | | | + | | | | diff --git a/src/main/resources/2019-examples/day24-4.txt b/src/main/resources/2019-examples/day24-4.txt new file mode 100644 index 00000000..91bec850 --- /dev/null +++ b/src/main/resources/2019-examples/day24-4.txt @@ -0,0 +1,25 @@ + | | | | + 1 | 2 | 3 | 4 | 5 + | | | | +-----+-----+---------+-----+----- + | | | | + 6 | 7 | 8 | 9 | 10 + | | | | +-----+-----+---------+-----+----- + | |A|B|C|D|E| | + | |-+-+-+-+-| | + | |F|G|H|I|J| | + | |-+-+-+-+-| | + 11 | 12 |K|L|?|N|O| 14 | 15 + | |-+-+-+-+-| | + | |P|Q|R|S|T| | + | |-+-+-+-+-| | + | |U|V|W|X|Y| | +-----+-----+---------+-----+----- + | | | | + 16 | 17 | 18 | 19 | 20 + | | | | +-----+-----+---------+-----+----- + | | | | + 21 | 22 | 23 | 24 | 25 + | | | | diff --git a/src/main/resources/2019-examples/day24-5.txt b/src/main/resources/2019-examples/day24-5.txt new file mode 100644 index 00000000..e15911a0 --- /dev/null +++ b/src/main/resources/2019-examples/day24-5.txt @@ -0,0 +1,5 @@ +....# +#..#. +#.?## +..#.. +#.... diff --git a/src/main/resources/2019-examples/day24-6.txt b/src/main/resources/2019-examples/day24-6.txt new file mode 100644 index 00000000..47e687d5 --- /dev/null +++ b/src/main/resources/2019-examples/day24-6.txt @@ -0,0 +1,76 @@ +Depth -5: +..#.. +.#.#. +..?.# +.#.#. +..#.. + +Depth -4: +...#. +...## +..?.. +...## +...#. + +Depth -3: +#.#.. +.#... +..?.. +.#... +#.#.. + +Depth -2: +.#.## +....# +..?.# +...## +.###. + +Depth -1: +#..## +...## +..?.. +...#. +.#### + +Depth 0: +.#... +.#.## +.#?.. +..... +..... + +Depth 1: +.##.. +#..## +..?.# +##.## +##### + +Depth 2: +###.. +##.#. +#.?.. +.#.## +#.#.. + +Depth 3: +..### +..... +#.?.. +#.... +#...# + +Depth 4: +.###. +#..#. +#.?.. +##.#. +..... + +Depth 5: +####. +#..#. +#.?#. +####. +..... diff --git a/src/main/resources/2019-examples/day3-1.txt b/src/main/resources/2019-examples/day3-1.txt new file mode 100644 index 00000000..baf98e9a --- /dev/null +++ b/src/main/resources/2019-examples/day3-1.txt @@ -0,0 +1,10 @@ +........... +........... +........... +....+----+. +....|....|. +....|....|. +....|....|. +.........|. +.o-------+. +........... diff --git a/src/main/resources/2019-examples/day3-2.txt b/src/main/resources/2019-examples/day3-2.txt new file mode 100644 index 00000000..bdea86b1 --- /dev/null +++ b/src/main/resources/2019-examples/day3-2.txt @@ -0,0 +1,10 @@ +........... +.+-----+... +.|.....|... +.|..+--X-+. +.|..|..|.|. +.|.-X--+.|. +.|..|....|. +.|.......|. +.o-------+. +........... diff --git a/src/main/resources/2019-examples/day3-3.txt b/src/main/resources/2019-examples/day3-3.txt new file mode 100644 index 00000000..bdea86b1 --- /dev/null +++ b/src/main/resources/2019-examples/day3-3.txt @@ -0,0 +1,10 @@ +........... +.+-----+... +.|.....|... +.|..+--X-+. +.|..|..|.|. +.|.-X--+.|. +.|..|....|. +.|.......|. +.o-------+. +........... diff --git a/src/main/resources/2019-examples/day5-1.txt b/src/main/resources/2019-examples/day5-1.txt new file mode 100644 index 00000000..32dcd238 --- /dev/null +++ b/src/main/resources/2019-examples/day5-1.txt @@ -0,0 +1,8 @@ +ABCDE + 1002 + +DE - two-digit opcode, 02 == opcode 2 + C - mode of 1st parameter, 0 == position mode + B - mode of 2nd parameter, 1 == immediate mode + A - mode of 3rd parameter, 0 == position mode, + omitted due to being a leading zero diff --git a/src/main/resources/2019-examples/day5-2.txt b/src/main/resources/2019-examples/day5-2.txt new file mode 100644 index 00000000..df60949f --- /dev/null +++ b/src/main/resources/2019-examples/day5-2.txt @@ -0,0 +1,3 @@ +3,21,1008,21,8,20,1005,20,22,107,8,21,20,1006,20,31, +1106,0,36,98,0,0,1002,21,125,20,4,20,1105,1,46,104, +999,1105,1,46,1101,1000,1,20,4,20,1105,1,46,98,99 diff --git a/src/main/resources/2019-examples/day6-1.txt b/src/main/resources/2019-examples/day6-1.txt new file mode 100644 index 00000000..012cf5ad --- /dev/null +++ b/src/main/resources/2019-examples/day6-1.txt @@ -0,0 +1,9 @@ + \ + \ + | + | +AAA--> o o <--BBB + | + | + / + / diff --git a/src/main/resources/2019-examples/day6-2.txt b/src/main/resources/2019-examples/day6-2.txt new file mode 100644 index 00000000..183242d5 --- /dev/null +++ b/src/main/resources/2019-examples/day6-2.txt @@ -0,0 +1,11 @@ +COM)B +B)C +C)D +D)E +E)F +B)G +G)H +D)I +E)J +J)K +K)L diff --git a/src/main/resources/2019-examples/day6-3.txt b/src/main/resources/2019-examples/day6-3.txt new file mode 100644 index 00000000..d20aa29b --- /dev/null +++ b/src/main/resources/2019-examples/day6-3.txt @@ -0,0 +1,5 @@ + G - H J - K - L + / / +COM - B - C - D - E - F + \ + I diff --git a/src/main/resources/2019-examples/day6-4.txt b/src/main/resources/2019-examples/day6-4.txt new file mode 100644 index 00000000..a1007c60 --- /dev/null +++ b/src/main/resources/2019-examples/day6-4.txt @@ -0,0 +1,13 @@ +COM)B +B)C +C)D +D)E +E)F +B)G +G)H +D)I +E)J +J)K +K)L +K)YOU +I)SAN diff --git a/src/main/resources/2019-examples/day6-5.txt b/src/main/resources/2019-examples/day6-5.txt new file mode 100644 index 00000000..a28d5ccb --- /dev/null +++ b/src/main/resources/2019-examples/day6-5.txt @@ -0,0 +1,7 @@ + YOU + / + G - H J - K - L + / / +COM - B - C - D - E - F + \ + I - SAN diff --git a/src/main/resources/2019-examples/day6-6.txt b/src/main/resources/2019-examples/day6-6.txt new file mode 100644 index 00000000..18cb222d --- /dev/null +++ b/src/main/resources/2019-examples/day6-6.txt @@ -0,0 +1,7 @@ + G - H J - K - L + / / +COM - B - C - D - E - F + \ + I - SAN + \ + YOU diff --git a/src/main/resources/2019-examples/day7-1.txt b/src/main/resources/2019-examples/day7-1.txt new file mode 100644 index 00000000..9187ee78 --- /dev/null +++ b/src/main/resources/2019-examples/day7-1.txt @@ -0,0 +1,3 @@ + O-------O O-------O O-------O O-------O O-------O +0 ->| Amp A |->| Amp B |->| Amp C |->| Amp D |->| Amp E |-> (to thrusters) + O-------O O-------O O-------O O-------O O-------O diff --git a/src/main/resources/2019-examples/day7-2.txt b/src/main/resources/2019-examples/day7-2.txt new file mode 100644 index 00000000..993e2e04 --- /dev/null +++ b/src/main/resources/2019-examples/day7-2.txt @@ -0,0 +1 @@ +3,15,3,16,1002,16,10,16,1,16,15,15,4,15,99,0,0 \ No newline at end of file diff --git a/src/main/resources/2019-examples/day7-3.txt b/src/main/resources/2019-examples/day7-3.txt new file mode 100644 index 00000000..1a7a957b --- /dev/null +++ b/src/main/resources/2019-examples/day7-3.txt @@ -0,0 +1 @@ +3,23,3,24,1002,24,10,24,1002,23,-1,23,101,5,23,23,1,24,23,23,4,23,99,0,0 \ No newline at end of file diff --git a/src/main/resources/2019-examples/day7-4.txt b/src/main/resources/2019-examples/day7-4.txt new file mode 100644 index 00000000..eb61459a --- /dev/null +++ b/src/main/resources/2019-examples/day7-4.txt @@ -0,0 +1 @@ +3,31,3,32,1002,32,10,32,1001,31,-2,31,1007,31,0,33,1002,33,7,33,1,33,31,31,1,32,31,31,4,31,99,0,0,0 \ No newline at end of file diff --git a/src/main/resources/2019-examples/day7-5.txt b/src/main/resources/2019-examples/day7-5.txt new file mode 100644 index 00000000..e1c5f9c7 --- /dev/null +++ b/src/main/resources/2019-examples/day7-5.txt @@ -0,0 +1,8 @@ + O-------O O-------O O-------O O-------O O-------O +0 -+->| Amp A |->| Amp B |->| Amp C |->| Amp D |->| Amp E |-. + | O-------O O-------O O-------O O-------O O-------O | + | | + '--------------------------------------------------------+ + | + v + (to thrusters) diff --git a/src/main/resources/2019-examples/day7-6.txt b/src/main/resources/2019-examples/day7-6.txt new file mode 100644 index 00000000..4363e8ee --- /dev/null +++ b/src/main/resources/2019-examples/day7-6.txt @@ -0,0 +1 @@ +3,26,1001,26,-4,26,3,27,1002,27,2,27,1,27,26,27,4,27,1001,28,-1,28,1005,28,6,99,0,0,5 \ No newline at end of file diff --git a/src/main/resources/2019-examples/day7-7.txt b/src/main/resources/2019-examples/day7-7.txt new file mode 100644 index 00000000..5ed292ba --- /dev/null +++ b/src/main/resources/2019-examples/day7-7.txt @@ -0,0 +1 @@ +3,52,1001,52,-5,52,3,53,1,52,56,54,1007,54,5,55,1005,55,26,1001,54,-5,54,1105,1,12,1,53,54,53,1008,54,0,55,1001,55,1,55,2,53,55,53,4,53,1001,56,-1,56,1005,56,6,99,0,0,0,0,10 \ No newline at end of file diff --git a/src/main/resources/2019-examples/day8-1.txt b/src/main/resources/2019-examples/day8-1.txt new file mode 100644 index 00000000..70cf409f --- /dev/null +++ b/src/main/resources/2019-examples/day8-1.txt @@ -0,0 +1,5 @@ +Layer 1: 123 + 456 + +Layer 2: 789 + 012 diff --git a/src/main/resources/2019-examples/day8-2.txt b/src/main/resources/2019-examples/day8-2.txt new file mode 100644 index 00000000..f97825a4 --- /dev/null +++ b/src/main/resources/2019-examples/day8-2.txt @@ -0,0 +1,11 @@ +Layer 1: 02 + 22 + +Layer 2: 11 + 22 + +Layer 3: 22 + 12 + +Layer 4: 00 + 00 diff --git a/src/main/resources/2019-examples/day8-3.txt b/src/main/resources/2019-examples/day8-3.txt new file mode 100644 index 00000000..a733e4c6 --- /dev/null +++ b/src/main/resources/2019-examples/day8-3.txt @@ -0,0 +1,2 @@ +01 +10 diff --git a/src/main/resources/2020-examples/day1-1.txt b/src/main/resources/2020-examples/day1-1.txt new file mode 100644 index 00000000..e3fb011e --- /dev/null +++ b/src/main/resources/2020-examples/day1-1.txt @@ -0,0 +1,6 @@ +1721 +979 +366 +299 +675 +1456 diff --git a/src/main/resources/2020-examples/day10-1.txt b/src/main/resources/2020-examples/day10-1.txt new file mode 100644 index 00000000..ec4a03f5 --- /dev/null +++ b/src/main/resources/2020-examples/day10-1.txt @@ -0,0 +1,11 @@ +16 +10 +15 +5 +1 +11 +7 +19 +6 +12 +4 diff --git a/src/main/resources/2020-examples/day10-2.txt b/src/main/resources/2020-examples/day10-2.txt new file mode 100644 index 00000000..e6376dca --- /dev/null +++ b/src/main/resources/2020-examples/day10-2.txt @@ -0,0 +1,31 @@ +28 +33 +18 +42 +31 +14 +46 +20 +48 +47 +24 +23 +49 +45 +19 +38 +39 +11 +1 +32 +25 +35 +8 +17 +7 +9 +4 +2 +34 +10 +3 diff --git a/src/main/resources/2020-examples/day10-3.txt b/src/main/resources/2020-examples/day10-3.txt new file mode 100644 index 00000000..035d5902 --- /dev/null +++ b/src/main/resources/2020-examples/day10-3.txt @@ -0,0 +1,8 @@ +(0), 1, 4, 5, 6, 7, 10, 11, 12, 15, 16, 19, (22) +(0), 1, 4, 5, 6, 7, 10, 12, 15, 16, 19, (22) +(0), 1, 4, 5, 7, 10, 11, 12, 15, 16, 19, (22) +(0), 1, 4, 5, 7, 10, 12, 15, 16, 19, (22) +(0), 1, 4, 6, 7, 10, 11, 12, 15, 16, 19, (22) +(0), 1, 4, 6, 7, 10, 12, 15, 16, 19, (22) +(0), 1, 4, 7, 10, 11, 12, 15, 16, 19, (22) +(0), 1, 4, 7, 10, 12, 15, 16, 19, (22) diff --git a/src/main/resources/2020-examples/day10-4.txt b/src/main/resources/2020-examples/day10-4.txt new file mode 100644 index 00000000..4b891aaf --- /dev/null +++ b/src/main/resources/2020-examples/day10-4.txt @@ -0,0 +1,29 @@ +(0), 1, 2, 3, 4, 7, 8, 9, 10, 11, 14, 17, 18, 19, 20, 23, 24, 25, 28, 31, +32, 33, 34, 35, 38, 39, 42, 45, 46, 47, 48, 49, (52) + +(0), 1, 2, 3, 4, 7, 8, 9, 10, 11, 14, 17, 18, 19, 20, 23, 24, 25, 28, 31, +32, 33, 34, 35, 38, 39, 42, 45, 46, 47, 49, (52) + +(0), 1, 2, 3, 4, 7, 8, 9, 10, 11, 14, 17, 18, 19, 20, 23, 24, 25, 28, 31, +32, 33, 34, 35, 38, 39, 42, 45, 46, 48, 49, (52) + +(0), 1, 2, 3, 4, 7, 8, 9, 10, 11, 14, 17, 18, 19, 20, 23, 24, 25, 28, 31, +32, 33, 34, 35, 38, 39, 42, 45, 46, 49, (52) + +(0), 1, 2, 3, 4, 7, 8, 9, 10, 11, 14, 17, 18, 19, 20, 23, 24, 25, 28, 31, +32, 33, 34, 35, 38, 39, 42, 45, 47, 48, 49, (52) + +(0), 3, 4, 7, 10, 11, 14, 17, 20, 23, 25, 28, 31, 34, 35, 38, 39, 42, 45, +46, 48, 49, (52) + +(0), 3, 4, 7, 10, 11, 14, 17, 20, 23, 25, 28, 31, 34, 35, 38, 39, 42, 45, +46, 49, (52) + +(0), 3, 4, 7, 10, 11, 14, 17, 20, 23, 25, 28, 31, 34, 35, 38, 39, 42, 45, +47, 48, 49, (52) + +(0), 3, 4, 7, 10, 11, 14, 17, 20, 23, 25, 28, 31, 34, 35, 38, 39, 42, 45, +47, 49, (52) + +(0), 3, 4, 7, 10, 11, 14, 17, 20, 23, 25, 28, 31, 34, 35, 38, 39, 42, 45, +48, 49, (52) diff --git a/src/main/resources/2020-examples/day11-1.txt b/src/main/resources/2020-examples/day11-1.txt new file mode 100644 index 00000000..1beaede3 --- /dev/null +++ b/src/main/resources/2020-examples/day11-1.txt @@ -0,0 +1,10 @@ +L.LL.LL.LL +LLLLLLL.LL +L.L.L..L.. +LLLL.LL.LL +L.LL.LL.LL +L.LLLLL.LL +..L.L..... +LLLLLLLLLL +L.LLLLLL.L +L.LLLLL.LL diff --git a/src/main/resources/2020-examples/day11-10.txt b/src/main/resources/2020-examples/day11-10.txt new file mode 100644 index 00000000..1beaede3 --- /dev/null +++ b/src/main/resources/2020-examples/day11-10.txt @@ -0,0 +1,10 @@ +L.LL.LL.LL +LLLLLLL.LL +L.L.L..L.. +LLLL.LL.LL +L.LL.LL.LL +L.LLLLL.LL +..L.L..... +LLLLLLLLLL +L.LLLLLL.L +L.LLLLL.LL diff --git a/src/main/resources/2020-examples/day11-11.txt b/src/main/resources/2020-examples/day11-11.txt new file mode 100644 index 00000000..cdea6b56 --- /dev/null +++ b/src/main/resources/2020-examples/day11-11.txt @@ -0,0 +1,10 @@ +#.##.##.## +#######.## +#.#.#..#.. +####.##.## +#.##.##.## +#.#####.## +..#.#..... +########## +#.######.# +#.#####.## diff --git a/src/main/resources/2020-examples/day11-12.txt b/src/main/resources/2020-examples/day11-12.txt new file mode 100644 index 00000000..0bfbfc35 --- /dev/null +++ b/src/main/resources/2020-examples/day11-12.txt @@ -0,0 +1,10 @@ +#.LL.LL.L# +#LLLLLL.LL +L.L.L..L.. +LLLL.LL.LL +L.LL.LL.LL +L.LLLLL.LL +..L.L..... +LLLLLLLLL# +#.LLLLLL.L +#.LLLLL.L# diff --git a/src/main/resources/2020-examples/day11-13.txt b/src/main/resources/2020-examples/day11-13.txt new file mode 100644 index 00000000..543d5e0b --- /dev/null +++ b/src/main/resources/2020-examples/day11-13.txt @@ -0,0 +1,10 @@ +#.L#.##.L# +#L#####.LL +L.#.#..#.. +##L#.##.## +#.##.#L.## +#.#####.#L +..#.#..... +LLL####LL# +#.L#####.L +#.L####.L# diff --git a/src/main/resources/2020-examples/day11-14.txt b/src/main/resources/2020-examples/day11-14.txt new file mode 100644 index 00000000..5f1eaba2 --- /dev/null +++ b/src/main/resources/2020-examples/day11-14.txt @@ -0,0 +1,10 @@ +#.L#.L#.L# +#LLLLLL.LL +L.L.L..#.. +##LL.LL.L# +L.LL.LL.L# +#.LLLLL.LL +..L.L..... +LLLLLLLLL# +#.LLLLL#.L +#.L#LL#.L# diff --git a/src/main/resources/2020-examples/day11-15.txt b/src/main/resources/2020-examples/day11-15.txt new file mode 100644 index 00000000..2ae36751 --- /dev/null +++ b/src/main/resources/2020-examples/day11-15.txt @@ -0,0 +1,10 @@ +#.L#.L#.L# +#LLLLLL.LL +L.L.L..#.. +##L#.#L.L# +L.L#.#L.L# +#.L####.LL +..#.#..... +LLL###LLL# +#.LLLLL#.L +#.L#LL#.L# diff --git a/src/main/resources/2020-examples/day11-16.txt b/src/main/resources/2020-examples/day11-16.txt new file mode 100644 index 00000000..3113fba8 --- /dev/null +++ b/src/main/resources/2020-examples/day11-16.txt @@ -0,0 +1,10 @@ +#.L#.L#.L# +#LLLLLL.LL +L.L.L..#.. +##L#.#L.L# +L.L#.LL.L# +#.LLLL#.LL +..#.L..... +LLL###LLL# +#.LLLLL#.L +#.L#LL#.L# diff --git a/src/main/resources/2020-examples/day11-2.txt b/src/main/resources/2020-examples/day11-2.txt new file mode 100644 index 00000000..cdea6b56 --- /dev/null +++ b/src/main/resources/2020-examples/day11-2.txt @@ -0,0 +1,10 @@ +#.##.##.## +#######.## +#.#.#..#.. +####.##.## +#.##.##.## +#.#####.## +..#.#..... +########## +#.######.# +#.#####.## diff --git a/src/main/resources/2020-examples/day11-3.txt b/src/main/resources/2020-examples/day11-3.txt new file mode 100644 index 00000000..350f31df --- /dev/null +++ b/src/main/resources/2020-examples/day11-3.txt @@ -0,0 +1,10 @@ +#.LL.L#.## +#LLLLLL.L# +L.L.L..L.. +#LLL.LL.L# +#.LL.LL.LL +#.LLLL#.## +..L.L..... +#LLLLLLLL# +#.LLLLLL.L +#.#LLLL.## diff --git a/src/main/resources/2020-examples/day11-4.txt b/src/main/resources/2020-examples/day11-4.txt new file mode 100644 index 00000000..bbc370ba --- /dev/null +++ b/src/main/resources/2020-examples/day11-4.txt @@ -0,0 +1,10 @@ +#.##.L#.## +#L###LL.L# +L.#.#..#.. +#L##.##.L# +#.##.LL.LL +#.###L#.## +..#.#..... +#L######L# +#.LL###L.L +#.#L###.## diff --git a/src/main/resources/2020-examples/day11-5.txt b/src/main/resources/2020-examples/day11-5.txt new file mode 100644 index 00000000..86646eda --- /dev/null +++ b/src/main/resources/2020-examples/day11-5.txt @@ -0,0 +1,10 @@ +#.#L.L#.## +#LLL#LL.L# +L.L.L..#.. +#LLL.##.L# +#.LL.LL.LL +#.LL#L#.## +..L.L..... +#L#LLLL#L# +#.LLLLLL.L +#.#L#L#.## diff --git a/src/main/resources/2020-examples/day11-6.txt b/src/main/resources/2020-examples/day11-6.txt new file mode 100644 index 00000000..dbd760e3 --- /dev/null +++ b/src/main/resources/2020-examples/day11-6.txt @@ -0,0 +1,10 @@ +#.#L.L#.## +#LLL#LL.L# +L.#.L..#.. +#L##.##.L# +#.#L.LL.LL +#.#L#L#.## +..L.L..... +#L#L##L#L# +#.LLLLLL.L +#.#L#L#.## diff --git a/src/main/resources/2020-examples/day11-7.txt b/src/main/resources/2020-examples/day11-7.txt new file mode 100644 index 00000000..a486e35c --- /dev/null +++ b/src/main/resources/2020-examples/day11-7.txt @@ -0,0 +1,9 @@ +.......#. +...#..... +.#....... +......... +..#L....# +....#.... +......... +#........ +...#..... diff --git a/src/main/resources/2020-examples/day11-8.txt b/src/main/resources/2020-examples/day11-8.txt new file mode 100644 index 00000000..bb0b8133 --- /dev/null +++ b/src/main/resources/2020-examples/day11-8.txt @@ -0,0 +1,3 @@ +............. +.L.L.#.#.#.#. +............. diff --git a/src/main/resources/2020-examples/day11-9.txt b/src/main/resources/2020-examples/day11-9.txt new file mode 100644 index 00000000..68e65439 --- /dev/null +++ b/src/main/resources/2020-examples/day11-9.txt @@ -0,0 +1,7 @@ +.##.##. +#.#.#.# +##...## +...L... +##...## +#.#.#.# +.##.##. diff --git a/src/main/resources/2020-examples/day12-1.txt b/src/main/resources/2020-examples/day12-1.txt new file mode 100644 index 00000000..d3822918 --- /dev/null +++ b/src/main/resources/2020-examples/day12-1.txt @@ -0,0 +1,5 @@ +F10 +N3 +F7 +R90 +F11 diff --git a/src/main/resources/2020-examples/day13-1.txt b/src/main/resources/2020-examples/day13-1.txt new file mode 100644 index 00000000..d76f6197 --- /dev/null +++ b/src/main/resources/2020-examples/day13-1.txt @@ -0,0 +1,2 @@ +939 +7,13,x,x,59,x,31,19 diff --git a/src/main/resources/2020-examples/day13-2.txt b/src/main/resources/2020-examples/day13-2.txt new file mode 100644 index 00000000..219d85f7 --- /dev/null +++ b/src/main/resources/2020-examples/day13-2.txt @@ -0,0 +1,22 @@ +time bus 7 bus 13 bus 59 bus 31 bus 19 +929 . . . . . +930 . . . D . +931 D . . . D +932 . . . . . +933 . . . . . +934 . . . . . +935 . . . . . +936 . D . . . +937 . . . . . +938 D . . . . +939 . . . . . +940 . . . . . +941 . . . . . +942 . . . . . +943 . . . . . +944 . . D . . +945 D . . . . +946 . . . . . +947 . . . . . +948 . . . . . +949 . D . . . diff --git a/src/main/resources/2020-examples/day13-3.txt b/src/main/resources/2020-examples/day13-3.txt new file mode 100644 index 00000000..79d21b07 --- /dev/null +++ b/src/main/resources/2020-examples/day13-3.txt @@ -0,0 +1 @@ +7,13,x,x,59,x,31,19 \ No newline at end of file diff --git a/src/main/resources/2020-examples/day13-4.txt b/src/main/resources/2020-examples/day13-4.txt new file mode 100644 index 00000000..0ccbb850 --- /dev/null +++ b/src/main/resources/2020-examples/day13-4.txt @@ -0,0 +1,26 @@ +time bus 7 bus 13 bus 59 bus 31 bus 19 +1068773 . . . . . +1068774 D . . . . +1068775 . . . . . +1068776 . . . . . +1068777 . . . . . +1068778 . . . . . +1068779 . . . . . +1068780 . . . . . +1068781 D . . . . +1068782 . D . . . +1068783 . . . . . +1068784 . . . . . +1068785 . . D . . +1068786 . . . . . +1068787 . . . D . +1068788 D . . . D +1068789 . . . . . +1068790 . . . . . +1068791 . . . . . +1068792 . . . . . +1068793 . . . . . +1068794 . . . . . +1068795 D D . . . +1068796 . . . . . +1068797 . . . . . diff --git a/src/main/resources/2020-examples/day14-1.txt b/src/main/resources/2020-examples/day14-1.txt new file mode 100644 index 00000000..e15150a2 --- /dev/null +++ b/src/main/resources/2020-examples/day14-1.txt @@ -0,0 +1,4 @@ +mask = XXXXXXXXXXXXXXXXXXXXXXXXXXXXX1XXXX0X +mem[8] = 11 +mem[7] = 101 +mem[8] = 0 diff --git a/src/main/resources/2020-examples/day14-2.txt b/src/main/resources/2020-examples/day14-2.txt new file mode 100644 index 00000000..719a4e08 --- /dev/null +++ b/src/main/resources/2020-examples/day14-2.txt @@ -0,0 +1,3 @@ +value: 000000000000000000000000000000001011 (decimal 11) +mask: XXXXXXXXXXXXXXXXXXXXXXXXXXXXX1XXXX0X +result: 000000000000000000000000000001001001 (decimal 73) diff --git a/src/main/resources/2020-examples/day14-3.txt b/src/main/resources/2020-examples/day14-3.txt new file mode 100644 index 00000000..9071e2ae --- /dev/null +++ b/src/main/resources/2020-examples/day14-3.txt @@ -0,0 +1,3 @@ +value: 000000000000000000000000000001100101 (decimal 101) +mask: XXXXXXXXXXXXXXXXXXXXXXXXXXXXX1XXXX0X +result: 000000000000000000000000000001100101 (decimal 101) diff --git a/src/main/resources/2020-examples/day14-4.txt b/src/main/resources/2020-examples/day14-4.txt new file mode 100644 index 00000000..7d58f02e --- /dev/null +++ b/src/main/resources/2020-examples/day14-4.txt @@ -0,0 +1,3 @@ +value: 000000000000000000000000000000000000 (decimal 0) +mask: XXXXXXXXXXXXXXXXXXXXXXXXXXXXX1XXXX0X +result: 000000000000000000000000000001000000 (decimal 64) diff --git a/src/main/resources/2020-examples/day14-5.txt b/src/main/resources/2020-examples/day14-5.txt new file mode 100644 index 00000000..2e961e3e --- /dev/null +++ b/src/main/resources/2020-examples/day14-5.txt @@ -0,0 +1,4 @@ +mask = 000000000000000000000000000000X1001X +mem[42] = 100 +mask = 00000000000000000000000000000000X0XX +mem[26] = 1 diff --git a/src/main/resources/2020-examples/day14-6.txt b/src/main/resources/2020-examples/day14-6.txt new file mode 100644 index 00000000..0250ee71 --- /dev/null +++ b/src/main/resources/2020-examples/day14-6.txt @@ -0,0 +1,3 @@ +address: 000000000000000000000000000000101010 (decimal 42) +mask: 000000000000000000000000000000X1001X +result: 000000000000000000000000000000X1101X diff --git a/src/main/resources/2020-examples/day14-7.txt b/src/main/resources/2020-examples/day14-7.txt new file mode 100644 index 00000000..54fcb65d --- /dev/null +++ b/src/main/resources/2020-examples/day14-7.txt @@ -0,0 +1,4 @@ +000000000000000000000000000000011010 (decimal 26) +000000000000000000000000000000011011 (decimal 27) +000000000000000000000000000000111010 (decimal 58) +000000000000000000000000000000111011 (decimal 59) diff --git a/src/main/resources/2020-examples/day14-8.txt b/src/main/resources/2020-examples/day14-8.txt new file mode 100644 index 00000000..c6652acb --- /dev/null +++ b/src/main/resources/2020-examples/day14-8.txt @@ -0,0 +1,3 @@ +address: 000000000000000000000000000000011010 (decimal 26) +mask: 00000000000000000000000000000000X0XX +result: 00000000000000000000000000000001X0XX diff --git a/src/main/resources/2020-examples/day14-9.txt b/src/main/resources/2020-examples/day14-9.txt new file mode 100644 index 00000000..b1103927 --- /dev/null +++ b/src/main/resources/2020-examples/day14-9.txt @@ -0,0 +1,8 @@ +000000000000000000000000000000010000 (decimal 16) +000000000000000000000000000000010001 (decimal 17) +000000000000000000000000000000010010 (decimal 18) +000000000000000000000000000000010011 (decimal 19) +000000000000000000000000000000011000 (decimal 24) +000000000000000000000000000000011001 (decimal 25) +000000000000000000000000000000011010 (decimal 26) +000000000000000000000000000000011011 (decimal 27) diff --git a/src/main/resources/2020-examples/day16-1.txt b/src/main/resources/2020-examples/day16-1.txt new file mode 100644 index 00000000..e78bf388 --- /dev/null +++ b/src/main/resources/2020-examples/day16-1.txt @@ -0,0 +1,6 @@ +.--------------------------------------------------------. +| ????: 101 ?????: 102 ??????????: 103 ???: 104 | +| | +| ??: 301 ??: 302 ???????: 303 ??????? | +| ??: 401 ??: 402 ???? ????: 403 ????????? | +'--------------------------------------------------------' diff --git a/src/main/resources/2020-examples/day16-2.txt b/src/main/resources/2020-examples/day16-2.txt new file mode 100644 index 00000000..fe34e403 --- /dev/null +++ b/src/main/resources/2020-examples/day16-2.txt @@ -0,0 +1,12 @@ +class: 1-3 or 5-7 +row: 6-11 or 33-44 +seat: 13-40 or 45-50 + +your ticket: +7,1,14 + +nearby tickets: +7,3,47 +40,4,50 +55,2,20 +38,6,12 diff --git a/src/main/resources/2020-examples/day16-3.txt b/src/main/resources/2020-examples/day16-3.txt new file mode 100644 index 00000000..b48bf373 --- /dev/null +++ b/src/main/resources/2020-examples/day16-3.txt @@ -0,0 +1,11 @@ +class: 0-1 or 4-19 +row: 0-5 or 8-19 +seat: 0-13 or 16-19 + +your ticket: +11,12,13 + +nearby tickets: +3,9,18 +15,1,5 +5,14,9 diff --git a/src/main/resources/2020-examples/day17-1.txt b/src/main/resources/2020-examples/day17-1.txt new file mode 100644 index 00000000..eedd3d21 --- /dev/null +++ b/src/main/resources/2020-examples/day17-1.txt @@ -0,0 +1,3 @@ +.#. +..# +### diff --git a/src/main/resources/2020-examples/day17-2.txt b/src/main/resources/2020-examples/day17-2.txt new file mode 100644 index 00000000..abebc3ac --- /dev/null +++ b/src/main/resources/2020-examples/day17-2.txt @@ -0,0 +1,110 @@ +Before any cycles: + +z=0 +.#. +..# +### + + +After 1 cycle: + +z=-1 +#.. +..# +.#. + +z=0 +#.# +.## +.#. + +z=1 +#.. +..# +.#. + + +After 2 cycles: + +z=-2 +..... +..... +..#.. +..... +..... + +z=-1 +..#.. +.#..# +....# +.#... +..... + +z=0 +##... +##... +#.... +....# +.###. + +z=1 +..#.. +.#..# +....# +.#... +..... + +z=2 +..... +..... +..#.. +..... +..... + + +After 3 cycles: + +z=-2 +....... +....... +..##... +..###.. +....... +....... +....... + +z=-1 +..#.... +...#... +#...... +.....## +.#...#. +..#.#.. +...#... + +z=0 +...#... +....... +#...... +....... +.....## +.##.#.. +...#... + +z=1 +..#.... +...#... +#...... +.....## +.#...#. +..#.#.. +...#... + +z=2 +....... +....... +..##... +..###.. +....... +....... +....... diff --git a/src/main/resources/2020-examples/day17-3.txt b/src/main/resources/2020-examples/day17-3.txt new file mode 100644 index 00000000..b671c219 --- /dev/null +++ b/src/main/resources/2020-examples/day17-3.txt @@ -0,0 +1,232 @@ +Before any cycles: + +z=0, w=0 +.#. +..# +### + + +After 1 cycle: + +z=-1, w=-1 +#.. +..# +.#. + +z=0, w=-1 +#.. +..# +.#. + +z=1, w=-1 +#.. +..# +.#. + +z=-1, w=0 +#.. +..# +.#. + +z=0, w=0 +#.# +.## +.#. + +z=1, w=0 +#.. +..# +.#. + +z=-1, w=1 +#.. +..# +.#. + +z=0, w=1 +#.. +..# +.#. + +z=1, w=1 +#.. +..# +.#. + + +After 2 cycles: + +z=-2, w=-2 +..... +..... +..#.. +..... +..... + +z=-1, w=-2 +..... +..... +..... +..... +..... + +z=0, w=-2 +###.. +##.## +#...# +.#..# +.###. + +z=1, w=-2 +..... +..... +..... +..... +..... + +z=2, w=-2 +..... +..... +..#.. +..... +..... + +z=-2, w=-1 +..... +..... +..... +..... +..... + +z=-1, w=-1 +..... +..... +..... +..... +..... + +z=0, w=-1 +..... +..... +..... +..... +..... + +z=1, w=-1 +..... +..... +..... +..... +..... + +z=2, w=-1 +..... +..... +..... +..... +..... + +z=-2, w=0 +###.. +##.## +#...# +.#..# +.###. + +z=-1, w=0 +..... +..... +..... +..... +..... + +z=0, w=0 +..... +..... +..... +..... +..... + +z=1, w=0 +..... +..... +..... +..... +..... + +z=2, w=0 +###.. +##.## +#...# +.#..# +.###. + +z=-2, w=1 +..... +..... +..... +..... +..... + +z=-1, w=1 +..... +..... +..... +..... +..... + +z=0, w=1 +..... +..... +..... +..... +..... + +z=1, w=1 +..... +..... +..... +..... +..... + +z=2, w=1 +..... +..... +..... +..... +..... + +z=-2, w=2 +..... +..... +..#.. +..... +..... + +z=-1, w=2 +..... +..... +..... +..... +..... + +z=0, w=2 +###.. +##.## +#...# +.#..# +.###. + +z=1, w=2 +..... +..... +..... +..... +..... + +z=2, w=2 +..... +..... +..#.. +..... +..... diff --git a/src/main/resources/2020-examples/day18-1.txt b/src/main/resources/2020-examples/day18-1.txt new file mode 100644 index 00000000..5f810dc8 --- /dev/null +++ b/src/main/resources/2020-examples/day18-1.txt @@ -0,0 +1,6 @@ +1 + 2 * 3 + 4 * 5 + 6 + 3 * 3 + 4 * 5 + 6 + 9 + 4 * 5 + 6 + 13 * 5 + 6 + 65 + 6 + 71 diff --git a/src/main/resources/2020-examples/day18-2.txt b/src/main/resources/2020-examples/day18-2.txt new file mode 100644 index 00000000..93678d68 --- /dev/null +++ b/src/main/resources/2020-examples/day18-2.txt @@ -0,0 +1,6 @@ +1 + (2 * 3) + (4 * (5 + 6)) +1 + 6 + (4 * (5 + 6)) + 7 + (4 * (5 + 6)) + 7 + (4 * 11 ) + 7 + 44 + 51 diff --git a/src/main/resources/2020-examples/day18-3.txt b/src/main/resources/2020-examples/day18-3.txt new file mode 100644 index 00000000..3b7a73b0 --- /dev/null +++ b/src/main/resources/2020-examples/day18-3.txt @@ -0,0 +1,6 @@ +1 + 2 * 3 + 4 * 5 + 6 + 3 * 3 + 4 * 5 + 6 + 3 * 7 * 5 + 6 + 3 * 7 * 11 + 21 * 11 + 231 diff --git a/src/main/resources/2020-examples/day19-1.txt b/src/main/resources/2020-examples/day19-1.txt new file mode 100644 index 00000000..56eb7fbe --- /dev/null +++ b/src/main/resources/2020-examples/day19-1.txt @@ -0,0 +1,4 @@ +0: 1 2 +1: "a" +2: 1 3 | 3 1 +3: "b" diff --git a/src/main/resources/2020-examples/day19-2.txt b/src/main/resources/2020-examples/day19-2.txt new file mode 100644 index 00000000..6322c1be --- /dev/null +++ b/src/main/resources/2020-examples/day19-2.txt @@ -0,0 +1,6 @@ +0: 4 1 5 +1: 2 3 | 3 2 +2: 4 4 | 5 5 +3: 4 5 | 5 4 +4: "a" +5: "b" diff --git a/src/main/resources/2020-examples/day19-3.txt b/src/main/resources/2020-examples/day19-3.txt new file mode 100644 index 00000000..591df2ee --- /dev/null +++ b/src/main/resources/2020-examples/day19-3.txt @@ -0,0 +1,12 @@ +0: 4 1 5 +1: 2 3 | 3 2 +2: 4 4 | 5 5 +3: 4 5 | 5 4 +4: "a" +5: "b" + +ababbb +bababa +abbbab +aaabbb +aaaabbb diff --git a/src/main/resources/2020-examples/day19-4.txt b/src/main/resources/2020-examples/day19-4.txt new file mode 100644 index 00000000..811af37a --- /dev/null +++ b/src/main/resources/2020-examples/day19-4.txt @@ -0,0 +1,2 @@ +8: 42 | 42 8 +11: 42 31 | 42 11 31 diff --git a/src/main/resources/2020-examples/day19-5.txt b/src/main/resources/2020-examples/day19-5.txt new file mode 100644 index 00000000..0c639944 --- /dev/null +++ b/src/main/resources/2020-examples/day19-5.txt @@ -0,0 +1,47 @@ +42: 9 14 | 10 1 +9: 14 27 | 1 26 +10: 23 14 | 28 1 +1: "a" +11: 42 31 +5: 1 14 | 15 1 +19: 14 1 | 14 14 +12: 24 14 | 19 1 +16: 15 1 | 14 14 +31: 14 17 | 1 13 +6: 14 14 | 1 14 +2: 1 24 | 14 4 +0: 8 11 +13: 14 3 | 1 12 +15: 1 | 14 +17: 14 2 | 1 7 +23: 25 1 | 22 14 +28: 16 1 +4: 1 1 +20: 14 14 | 1 15 +3: 5 14 | 16 1 +27: 1 6 | 14 18 +14: "b" +21: 14 1 | 1 14 +25: 1 1 | 1 14 +22: 14 14 +8: 42 +26: 14 22 | 1 20 +18: 15 15 +7: 14 5 | 1 21 +24: 14 1 + +abbbbbabbbaaaababbaabbbbabababbbabbbbbbabaaaa +bbabbbbaabaabba +babbbbaabbbbbabbbbbbaabaaabaaa +aaabbbbbbaaaabaababaabababbabaaabbababababaaa +bbbbbbbaaaabbbbaaabbabaaa +bbbababbbbaaaaaaaabbababaaababaabab +ababaaaaaabaaab +ababaaaaabbbaba +baabbaaaabbaaaababbaababb +abbbbabbbbaaaababbbbbbaaaababb +aaaaabbaabaaaaababaa +aaaabbaaaabbaaa +aaaabbaabbaaaaaaabbbabbbaaabbaabaaa +babaaabbbaaabaababbaabababaaab +aabbbbbaabbbaaaaaabbbbbababaaaaabbaaabba diff --git a/src/main/resources/2020-examples/day2-1.txt b/src/main/resources/2020-examples/day2-1.txt new file mode 100644 index 00000000..fe19c03a --- /dev/null +++ b/src/main/resources/2020-examples/day2-1.txt @@ -0,0 +1,3 @@ +1-3 a: abcde +1-3 b: cdefg +2-9 c: ccccccccc diff --git a/src/main/resources/2020-examples/day20-1.txt b/src/main/resources/2020-examples/day20-1.txt new file mode 100644 index 00000000..b07aa4ba --- /dev/null +++ b/src/main/resources/2020-examples/day20-1.txt @@ -0,0 +1,107 @@ +Tile 2311: +..##.#..#. +##..#..... +#...##..#. +####.#...# +##.##.###. +##...#.### +.#.#.#..## +..#....#.. +###...#.#. +..###..### + +Tile 1951: +#.##...##. +#.####...# +.....#..## +#...###### +.##.#....# +.###.##### +###.##.##. +.###....#. +..#.#..#.# +#...##.#.. + +Tile 1171: +####...##. +#..##.#..# +##.#..#.#. +.###.####. +..###.#### +.##....##. +.#...####. +#.##.####. +####..#... +.....##... + +Tile 1427: +###.##.#.. +.#..#.##.. +.#.##.#..# +#.#.#.##.# +....#...## +...##..##. +...#.##### +.#.####.#. +..#..###.# +..##.#..#. + +Tile 1489: +##.#.#.... +..##...#.. +.##..##... +..#...#... +#####...#. +#..#.#.#.# +...#.#.#.. +##.#...##. +..##.##.## +###.##.#.. + +Tile 2473: +#....####. +#..#.##... +#.##..#... +######.#.# +.#...#.#.# +.######### +.###.#..#. +########.# +##...##.#. +..###.#.#. + +Tile 2971: +..#.#....# +#...###... +#.#.###... +##.##..#.. +.#####..## +.#..####.# +#..#.#..#. +..####.### +..#.#.###. +...#.#.#.# + +Tile 2729: +...#.#.#.# +####.#.... +..#.#..... +....#..#.# +.##..##.#. +.#.####... +####.#.#.. +##.####... +##..#.##.. +#.##...##. + +Tile 3079: +#.#.#####. +.#..###### +..#....... +######.... +####.#..#. +.#...#.##. +#.#####.## +..#.###... +..#....... +..#.###... diff --git a/src/main/resources/2020-examples/day20-2.txt b/src/main/resources/2020-examples/day20-2.txt new file mode 100644 index 00000000..f10b5651 --- /dev/null +++ b/src/main/resources/2020-examples/day20-2.txt @@ -0,0 +1,32 @@ +#...##.#.. ..###..### #.#.#####. +..#.#..#.# ###...#.#. .#..###### +.###....#. ..#....#.. ..#....... +###.##.##. .#.#.#..## ######.... +.###.##### ##...#.### ####.#..#. +.##.#....# ##.##.###. .#...#.##. +#...###### ####.#...# #.#####.## +.....#..## #...##..#. ..#.###... +#.####...# ##..#..... ..#....... +#.##...##. ..##.#..#. ..#.###... + +#.##...##. ..##.#..#. ..#.###... +##..#.##.. ..#..###.# ##.##....# +##.####... .#.####.#. ..#.###..# +####.#.#.. ...#.##### ###.#..### +.#.####... ...##..##. .######.## +.##..##.#. ....#...## #.#.#.#... +....#..#.# #.#.#.##.# #.###.###. +..#.#..... .#.##.#..# #.###.##.. +####.#.... .#..#.##.. .######... +...#.#.#.# ###.##.#.. .##...#### + +...#.#.#.# ###.##.#.. .##...#### +..#.#.###. ..##.##.## #..#.##..# +..####.### ##.#...##. .#.#..#.## +#..#.#..#. ...#.#.#.. .####.###. +.#..####.# #..#.#.#.# ####.###.. +.#####..## #####...#. .##....##. +##.##..#.. ..#...#... .####...#. +#.#.###... .##..##... .####.##.# +#...###... ..##...#.. ...#..#### +..#.#....# ##.#.#.... ...##..... diff --git a/src/main/resources/2020-examples/day20-3.txt b/src/main/resources/2020-examples/day20-3.txt new file mode 100644 index 00000000..a77bc42a --- /dev/null +++ b/src/main/resources/2020-examples/day20-3.txt @@ -0,0 +1,3 @@ +1951 2311 3079 +2729 1427 2473 +2971 1489 1171 diff --git a/src/main/resources/2020-examples/day20-4.txt b/src/main/resources/2020-examples/day20-4.txt new file mode 100644 index 00000000..855a3c5a --- /dev/null +++ b/src/main/resources/2020-examples/day20-4.txt @@ -0,0 +1,26 @@ +.#.#..#. ##...#.# #..##### +###....# .#....#. .#...... +##.##.## #.#.#..# #####... +###.#### #...#.## ###.#..# +##.#.... #.##.### #...#.## +...##### ###.#... .#####.# +....#..# ...##..# .#.###.. +.####... #..#.... .#...... + +#..#.##. .#..###. #.##.... +#.####.. #.####.# .#.###.. +###.#.#. ..#.#### ##.#..## +#.####.. ..##..## ######.# +##..##.# ...#...# .#.#.#.. +...#..#. .#.#.##. .###.### +.#.#.... #.##.#.. .###.##. +###.#... #..#.##. ######.. + +.#.#.### .##.##.# ..#.##.. +.####.## #.#...## #.#..#.# +..#.#..# ..#.#.#. ####.### +#..####. ..#.#.#. ###.###. +#####..# ####...# ##....## +#.##..#. .#...#.. ####...# +.#.###.. ##..##.. ####.##. +...###.. .##...#. ..#..### diff --git a/src/main/resources/2020-examples/day20-5.txt b/src/main/resources/2020-examples/day20-5.txt new file mode 100644 index 00000000..c04a7784 --- /dev/null +++ b/src/main/resources/2020-examples/day20-5.txt @@ -0,0 +1,24 @@ +.#.#..#.##...#.##..##### +###....#.#....#..#...... +##.##.###.#.#..######... +###.#####...#.#####.#..# +##.#....#.##.####...#.## +...########.#....#####.# +....#..#...##..#.#.###.. +.####...#..#.....#...... +#..#.##..#..###.#.##.... +#.####..#.####.#.#.###.. +###.#.#...#.######.#..## +#.####....##..########.# +##..##.#...#...#.#.#.#.. +...#..#..#.#.##..###.### +.#.#....#.##.#...###.##. +###.#...#..#.##.######.. +.#.#.###.##.##.#..#.##.. +.####.###.#...###.#..#.# +..#.#..#..#.#.#.####.### +#..####...#.#.#.###.###. +#####..#####...###....## +#.##..#..#...#..####...# +.#.###..##..##..####.##. +...###...##...#...#..### diff --git a/src/main/resources/2020-examples/day20-6.txt b/src/main/resources/2020-examples/day20-6.txt new file mode 100644 index 00000000..ab9cbbfa --- /dev/null +++ b/src/main/resources/2020-examples/day20-6.txt @@ -0,0 +1,3 @@ + # +# ## ## ### + # # # # # # diff --git a/src/main/resources/2020-examples/day20-7.txt b/src/main/resources/2020-examples/day20-7.txt new file mode 100644 index 00000000..8ec453bd --- /dev/null +++ b/src/main/resources/2020-examples/day20-7.txt @@ -0,0 +1,24 @@ +.####...#####..#...###.. +#####..#..#.#.####..#.#. +.#.#...#.###...#.##.O#.. +#.O.##.OO#.#.OO.##.OOO## +..#O.#O#.O##O..O.#O##.## +...#.#..##.##...#..#..## +#.##.#..#.#..#..##.#.#.. +.###.##.....#...###.#... +#.####.#.#....##.#..#.#. +##...#..#....#..#...#### +..#.##...###..#.#####..# +....#.##.#.#####....#... +..##.##.###.....#.##..#. +#...#...###..####....##. +.#.##...#.##.#.#.###...# +#.###.#..####...##..#... +#.###...#.##...#.##O###. +.O##.#OO.###OO##..OOO##. +..O#.O..O..O.#O##O##.### +#.#..##.########..#..##. +#.#####..#.#...##..#.... +#....##..#.#########..## +#...#.....#..##...###.## +#..###....##.#...##.##.# diff --git a/src/main/resources/2020-examples/day21-1.txt b/src/main/resources/2020-examples/day21-1.txt new file mode 100644 index 00000000..1c0ea2f1 --- /dev/null +++ b/src/main/resources/2020-examples/day21-1.txt @@ -0,0 +1,4 @@ +mxmxvkd kfcds sqjhc nhms (contains dairy, fish) +trh fvjkl sbzzf mxmxvkd (contains dairy) +sqjhc fvjkl (contains soy) +sqjhc mxmxvkd sbzzf (contains fish) diff --git a/src/main/resources/2020-examples/day22-1.txt b/src/main/resources/2020-examples/day22-1.txt new file mode 100644 index 00000000..391cd244 --- /dev/null +++ b/src/main/resources/2020-examples/day22-1.txt @@ -0,0 +1,13 @@ +Player 1: +9 +2 +6 +3 +1 + +Player 2: +5 +8 +4 +7 +10 diff --git a/src/main/resources/2020-examples/day22-2.txt b/src/main/resources/2020-examples/day22-2.txt new file mode 100644 index 00000000..7ee9be89 --- /dev/null +++ b/src/main/resources/2020-examples/day22-2.txt @@ -0,0 +1,62 @@ +-- Round 1 -- +Player 1's deck: 9, 2, 6, 3, 1 +Player 2's deck: 5, 8, 4, 7, 10 +Player 1 plays: 9 +Player 2 plays: 5 +Player 1 wins the round! + +-- Round 2 -- +Player 1's deck: 2, 6, 3, 1, 9, 5 +Player 2's deck: 8, 4, 7, 10 +Player 1 plays: 2 +Player 2 plays: 8 +Player 2 wins the round! + +-- Round 3 -- +Player 1's deck: 6, 3, 1, 9, 5 +Player 2's deck: 4, 7, 10, 8, 2 +Player 1 plays: 6 +Player 2 plays: 4 +Player 1 wins the round! + +-- Round 4 -- +Player 1's deck: 3, 1, 9, 5, 6, 4 +Player 2's deck: 7, 10, 8, 2 +Player 1 plays: 3 +Player 2 plays: 7 +Player 2 wins the round! + +-- Round 5 -- +Player 1's deck: 1, 9, 5, 6, 4 +Player 2's deck: 10, 8, 2, 7, 3 +Player 1 plays: 1 +Player 2 plays: 10 +Player 2 wins the round! + +...several more rounds pass... + +-- Round 27 -- +Player 1's deck: 5, 4, 1 +Player 2's deck: 8, 9, 7, 3, 2, 10, 6 +Player 1 plays: 5 +Player 2 plays: 8 +Player 2 wins the round! + +-- Round 28 -- +Player 1's deck: 4, 1 +Player 2's deck: 9, 7, 3, 2, 10, 6, 8, 5 +Player 1 plays: 4 +Player 2 plays: 9 +Player 2 wins the round! + +-- Round 29 -- +Player 1's deck: 1 +Player 2's deck: 7, 3, 2, 10, 6, 8, 5, 9, 4 +Player 1 plays: 1 +Player 2 plays: 7 +Player 2 wins the round! + + +== Post-game results == +Player 1's deck: +Player 2's deck: 3, 2, 10, 6, 8, 5, 9, 4, 7, 1 diff --git a/src/main/resources/2020-examples/day22-3.txt b/src/main/resources/2020-examples/day22-3.txt new file mode 100644 index 00000000..8aa598da --- /dev/null +++ b/src/main/resources/2020-examples/day22-3.txt @@ -0,0 +1,11 @@ + 3 * 10 ++ 2 * 9 ++ 10 * 8 ++ 6 * 7 ++ 8 * 6 ++ 5 * 5 ++ 9 * 4 ++ 4 * 3 ++ 7 * 2 ++ 1 * 1 += 306 diff --git a/src/main/resources/2020-examples/day22-4.txt b/src/main/resources/2020-examples/day22-4.txt new file mode 100644 index 00000000..a29e13aa --- /dev/null +++ b/src/main/resources/2020-examples/day22-4.txt @@ -0,0 +1,8 @@ +Player 1: +43 +19 + +Player 2: +2 +29 +14 diff --git a/src/main/resources/2020-examples/day22-5.txt b/src/main/resources/2020-examples/day22-5.txt new file mode 100644 index 00000000..d03ecf29 --- /dev/null +++ b/src/main/resources/2020-examples/day22-5.txt @@ -0,0 +1,234 @@ +=== Game 1 === + +-- Round 1 (Game 1) -- +Player 1's deck: 9, 2, 6, 3, 1 +Player 2's deck: 5, 8, 4, 7, 10 +Player 1 plays: 9 +Player 2 plays: 5 +Player 1 wins round 1 of game 1! + +-- Round 2 (Game 1) -- +Player 1's deck: 2, 6, 3, 1, 9, 5 +Player 2's deck: 8, 4, 7, 10 +Player 1 plays: 2 +Player 2 plays: 8 +Player 2 wins round 2 of game 1! + +-- Round 3 (Game 1) -- +Player 1's deck: 6, 3, 1, 9, 5 +Player 2's deck: 4, 7, 10, 8, 2 +Player 1 plays: 6 +Player 2 plays: 4 +Player 1 wins round 3 of game 1! + +-- Round 4 (Game 1) -- +Player 1's deck: 3, 1, 9, 5, 6, 4 +Player 2's deck: 7, 10, 8, 2 +Player 1 plays: 3 +Player 2 plays: 7 +Player 2 wins round 4 of game 1! + +-- Round 5 (Game 1) -- +Player 1's deck: 1, 9, 5, 6, 4 +Player 2's deck: 10, 8, 2, 7, 3 +Player 1 plays: 1 +Player 2 plays: 10 +Player 2 wins round 5 of game 1! + +-- Round 6 (Game 1) -- +Player 1's deck: 9, 5, 6, 4 +Player 2's deck: 8, 2, 7, 3, 10, 1 +Player 1 plays: 9 +Player 2 plays: 8 +Player 1 wins round 6 of game 1! + +-- Round 7 (Game 1) -- +Player 1's deck: 5, 6, 4, 9, 8 +Player 2's deck: 2, 7, 3, 10, 1 +Player 1 plays: 5 +Player 2 plays: 2 +Player 1 wins round 7 of game 1! + +-- Round 8 (Game 1) -- +Player 1's deck: 6, 4, 9, 8, 5, 2 +Player 2's deck: 7, 3, 10, 1 +Player 1 plays: 6 +Player 2 plays: 7 +Player 2 wins round 8 of game 1! + +-- Round 9 (Game 1) -- +Player 1's deck: 4, 9, 8, 5, 2 +Player 2's deck: 3, 10, 1, 7, 6 +Player 1 plays: 4 +Player 2 plays: 3 +Playing a sub-game to determine the winner... + +=== Game 2 === + +-- Round 1 (Game 2) -- +Player 1's deck: 9, 8, 5, 2 +Player 2's deck: 10, 1, 7 +Player 1 plays: 9 +Player 2 plays: 10 +Player 2 wins round 1 of game 2! + +-- Round 2 (Game 2) -- +Player 1's deck: 8, 5, 2 +Player 2's deck: 1, 7, 10, 9 +Player 1 plays: 8 +Player 2 plays: 1 +Player 1 wins round 2 of game 2! + +-- Round 3 (Game 2) -- +Player 1's deck: 5, 2, 8, 1 +Player 2's deck: 7, 10, 9 +Player 1 plays: 5 +Player 2 plays: 7 +Player 2 wins round 3 of game 2! + +-- Round 4 (Game 2) -- +Player 1's deck: 2, 8, 1 +Player 2's deck: 10, 9, 7, 5 +Player 1 plays: 2 +Player 2 plays: 10 +Player 2 wins round 4 of game 2! + +-- Round 5 (Game 2) -- +Player 1's deck: 8, 1 +Player 2's deck: 9, 7, 5, 10, 2 +Player 1 plays: 8 +Player 2 plays: 9 +Player 2 wins round 5 of game 2! + +-- Round 6 (Game 2) -- +Player 1's deck: 1 +Player 2's deck: 7, 5, 10, 2, 9, 8 +Player 1 plays: 1 +Player 2 plays: 7 +Player 2 wins round 6 of game 2! +The winner of game 2 is player 2! + +...anyway, back to game 1. +Player 2 wins round 9 of game 1! + +-- Round 10 (Game 1) -- +Player 1's deck: 9, 8, 5, 2 +Player 2's deck: 10, 1, 7, 6, 3, 4 +Player 1 plays: 9 +Player 2 plays: 10 +Player 2 wins round 10 of game 1! + +-- Round 11 (Game 1) -- +Player 1's deck: 8, 5, 2 +Player 2's deck: 1, 7, 6, 3, 4, 10, 9 +Player 1 plays: 8 +Player 2 plays: 1 +Player 1 wins round 11 of game 1! + +-- Round 12 (Game 1) -- +Player 1's deck: 5, 2, 8, 1 +Player 2's deck: 7, 6, 3, 4, 10, 9 +Player 1 plays: 5 +Player 2 plays: 7 +Player 2 wins round 12 of game 1! + +-- Round 13 (Game 1) -- +Player 1's deck: 2, 8, 1 +Player 2's deck: 6, 3, 4, 10, 9, 7, 5 +Player 1 plays: 2 +Player 2 plays: 6 +Playing a sub-game to determine the winner... + +=== Game 3 === + +-- Round 1 (Game 3) -- +Player 1's deck: 8, 1 +Player 2's deck: 3, 4, 10, 9, 7, 5 +Player 1 plays: 8 +Player 2 plays: 3 +Player 1 wins round 1 of game 3! + +-- Round 2 (Game 3) -- +Player 1's deck: 1, 8, 3 +Player 2's deck: 4, 10, 9, 7, 5 +Player 1 plays: 1 +Player 2 plays: 4 +Playing a sub-game to determine the winner... + +=== Game 4 === + +-- Round 1 (Game 4) -- +Player 1's deck: 8 +Player 2's deck: 10, 9, 7, 5 +Player 1 plays: 8 +Player 2 plays: 10 +Player 2 wins round 1 of game 4! +The winner of game 4 is player 2! + +...anyway, back to game 3. +Player 2 wins round 2 of game 3! + +-- Round 3 (Game 3) -- +Player 1's deck: 8, 3 +Player 2's deck: 10, 9, 7, 5, 4, 1 +Player 1 plays: 8 +Player 2 plays: 10 +Player 2 wins round 3 of game 3! + +-- Round 4 (Game 3) -- +Player 1's deck: 3 +Player 2's deck: 9, 7, 5, 4, 1, 10, 8 +Player 1 plays: 3 +Player 2 plays: 9 +Player 2 wins round 4 of game 3! +The winner of game 3 is player 2! + +...anyway, back to game 1. +Player 2 wins round 13 of game 1! + +-- Round 14 (Game 1) -- +Player 1's deck: 8, 1 +Player 2's deck: 3, 4, 10, 9, 7, 5, 6, 2 +Player 1 plays: 8 +Player 2 plays: 3 +Player 1 wins round 14 of game 1! + +-- Round 15 (Game 1) -- +Player 1's deck: 1, 8, 3 +Player 2's deck: 4, 10, 9, 7, 5, 6, 2 +Player 1 plays: 1 +Player 2 plays: 4 +Playing a sub-game to determine the winner... + +=== Game 5 === + +-- Round 1 (Game 5) -- +Player 1's deck: 8 +Player 2's deck: 10, 9, 7, 5 +Player 1 plays: 8 +Player 2 plays: 10 +Player 2 wins round 1 of game 5! +The winner of game 5 is player 2! + +...anyway, back to game 1. +Player 2 wins round 15 of game 1! + +-- Round 16 (Game 1) -- +Player 1's deck: 8, 3 +Player 2's deck: 10, 9, 7, 5, 6, 2, 4, 1 +Player 1 plays: 8 +Player 2 plays: 10 +Player 2 wins round 16 of game 1! + +-- Round 17 (Game 1) -- +Player 1's deck: 3 +Player 2's deck: 9, 7, 5, 6, 2, 4, 1, 10, 8 +Player 1 plays: 3 +Player 2 plays: 9 +Player 2 wins round 17 of game 1! +The winner of game 1 is player 2! + + +== Post-game results == +Player 1's deck: +Player 2's deck: 7, 5, 6, 2, 4, 1, 10, 8, 9, 3 diff --git a/src/main/resources/2020-examples/day23-1.txt b/src/main/resources/2020-examples/day23-1.txt new file mode 100644 index 00000000..19083b95 --- /dev/null +++ b/src/main/resources/2020-examples/day23-1.txt @@ -0,0 +1,52 @@ +-- move 1 -- +cups: (3) 8 9 1 2 5 4 6 7 +pick up: 8, 9, 1 +destination: 2 + +-- move 2 -- +cups: 3 (2) 8 9 1 5 4 6 7 +pick up: 8, 9, 1 +destination: 7 + +-- move 3 -- +cups: 3 2 (5) 4 6 7 8 9 1 +pick up: 4, 6, 7 +destination: 3 + +-- move 4 -- +cups: 7 2 5 (8) 9 1 3 4 6 +pick up: 9, 1, 3 +destination: 7 + +-- move 5 -- +cups: 3 2 5 8 (4) 6 7 9 1 +pick up: 6, 7, 9 +destination: 3 + +-- move 6 -- +cups: 9 2 5 8 4 (1) 3 6 7 +pick up: 3, 6, 7 +destination: 9 + +-- move 7 -- +cups: 7 2 5 8 4 1 (9) 3 6 +pick up: 3, 6, 7 +destination: 8 + +-- move 8 -- +cups: 8 3 6 7 4 1 9 (2) 5 +pick up: 5, 8, 3 +destination: 1 + +-- move 9 -- +cups: 7 4 1 5 8 3 9 2 (6) +pick up: 7, 4, 1 +destination: 5 + +-- move 10 -- +cups: (5) 7 4 1 8 3 9 2 6 +pick up: 7, 4, 1 +destination: 3 + +-- final -- +cups: 5 (8) 3 7 4 1 9 2 6 diff --git a/src/main/resources/2020-examples/day24-1.txt b/src/main/resources/2020-examples/day24-1.txt new file mode 100644 index 00000000..3dc2f673 --- /dev/null +++ b/src/main/resources/2020-examples/day24-1.txt @@ -0,0 +1,20 @@ +sesenwnenenewseeswwswswwnenewsewsw +neeenesenwnwwswnenewnwwsewnenwseswesw +seswneswswsenwwnwse +nwnwneseeswswnenewneswwnewseswneseene +swweswneswnenwsewnwneneseenw +eesenwseswswnenwswnwnwsewwnwsene +sewnenenenesenwsewnenwwwse +wenwwweseeeweswwwnwwe +wsweesenenewnwwnwsenewsenwwsesesenwne +neeswseenwwswnwswswnw +nenwswwsewswnenenewsenwsenwnesesenew +enewnwewneswsewnwswenweswnenwsenwsw +sweneswneswneneenwnewenewwneswswnese +swwesenesewenwneswnwwneseswwne +enesenwswwswneneswsenwnewswseenwsese +wnwnesenesenenwwnenwsewesewsesesew +nenewswnwewswnenesenwnesewesw +eneswnwswnwsenenwnwnwwseeswneewsenese +neswnwewnwnwseenwseesewsenwsweewe +wseweeenwnesenwwwswnew diff --git a/src/main/resources/2020-examples/day24-2.txt b/src/main/resources/2020-examples/day24-2.txt new file mode 100644 index 00000000..591897fa --- /dev/null +++ b/src/main/resources/2020-examples/day24-2.txt @@ -0,0 +1,20 @@ +Day 1: 15 +Day 2: 12 +Day 3: 25 +Day 4: 14 +Day 5: 23 +Day 6: 28 +Day 7: 41 +Day 8: 37 +Day 9: 49 +Day 10: 37 + +Day 20: 132 +Day 30: 259 +Day 40: 406 +Day 50: 566 +Day 60: 788 +Day 70: 1106 +Day 80: 1373 +Day 90: 1844 +Day 100: 2208 diff --git a/src/main/resources/2020-examples/day3-1.txt b/src/main/resources/2020-examples/day3-1.txt new file mode 100644 index 00000000..7e88cdc8 --- /dev/null +++ b/src/main/resources/2020-examples/day3-1.txt @@ -0,0 +1,11 @@ +..##....... +#...#...#.. +.#....#..#. +..#.#...#.# +.#...##..#. +..#.##..... +.#.#.#....# +.#........# +#.##...#... +#...##....# +.#..#...#.# diff --git a/src/main/resources/2020-examples/day3-2.txt b/src/main/resources/2020-examples/day3-2.txt new file mode 100644 index 00000000..d6d854c9 --- /dev/null +++ b/src/main/resources/2020-examples/day3-2.txt @@ -0,0 +1,11 @@ +..##.........##.........##.........##.........##.........##....... ---> +#...#...#..#...#...#..#...#...#..#...#...#..#...#...#..#...#...#.. +.#....#..#..#....#..#..#....#..#..#....#..#..#....#..#..#....#..#. +..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.# +.#...##..#..#...##..#..#...##..#..#...##..#..#...##..#..#...##..#. +..#.##.......#.##.......#.##.......#.##.......#.##.......#.##..... ---> +.#.#.#....#.#.#.#....#.#.#.#....#.#.#.#....#.#.#.#....#.#.#.#....# +.#........#.#........#.#........#.#........#.#........#.#........# +#.##...#...#.##...#...#.##...#...#.##...#...#.##...#...#.##...#... +#...##....##...##....##...##....##...##....##...##....##...##....# +.#..#...#.#.#..#...#.#.#..#...#.#.#..#...#.#.#..#...#.#.#..#...#.# ---> diff --git a/src/main/resources/2020-examples/day3-3.txt b/src/main/resources/2020-examples/day3-3.txt new file mode 100644 index 00000000..d9b7a71e --- /dev/null +++ b/src/main/resources/2020-examples/day3-3.txt @@ -0,0 +1,11 @@ +..##.........##.........##.........##.........##.........##....... ---> +#..O#...#..#...#...#..#...#...#..#...#...#..#...#...#..#...#...#.. +.#....X..#..#....#..#..#....#..#..#....#..#..#....#..#..#....#..#. +..#.#...#O#..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.# +.#...##..#..X...##..#..#...##..#..#...##..#..#...##..#..#...##..#. +..#.##.......#.X#.......#.##.......#.##.......#.##.......#.##..... ---> +.#.#.#....#.#.#.#.O..#.#.#.#....#.#.#.#....#.#.#.#....#.#.#.#....# +.#........#.#........X.#........#.#........#.#........#.#........# +#.##...#...#.##...#...#.X#...#...#.##...#...#.##...#...#.##...#... +#...##....##...##....##...#X....##...##....##...##....##...##....# +.#..#...#.#.#..#...#.#.#..#...X.#.#..#...#.#.#..#...#.#.#..#...#.# ---> diff --git a/src/main/resources/2020-examples/day4-1.txt b/src/main/resources/2020-examples/day4-1.txt new file mode 100644 index 00000000..0ff208e5 --- /dev/null +++ b/src/main/resources/2020-examples/day4-1.txt @@ -0,0 +1,13 @@ +ecl:gry pid:860033327 eyr:2020 hcl:#fffffd +byr:1937 iyr:2017 cid:147 hgt:183cm + +iyr:2013 ecl:amb cid:350 eyr:2023 pid:028048884 +hcl:#cfa07d byr:1929 + +hcl:#ae17e1 iyr:2013 +eyr:2024 +ecl:brn pid:760753108 byr:1931 +hgt:179cm + +hcl:#cfa07d eyr:2025 pid:166559648 +iyr:2011 ecl:brn hgt:59in diff --git a/src/main/resources/2020-examples/day4-2.txt b/src/main/resources/2020-examples/day4-2.txt new file mode 100644 index 00000000..4045b003 --- /dev/null +++ b/src/main/resources/2020-examples/day4-2.txt @@ -0,0 +1,17 @@ +byr valid: 2002 +byr invalid: 2003 + +hgt valid: 60in +hgt valid: 190cm +hgt invalid: 190in +hgt invalid: 190 + +hcl valid: #123abc +hcl invalid: #123abz +hcl invalid: 123abc + +ecl valid: brn +ecl invalid: wat + +pid valid: 000000001 +pid invalid: 0123456789 diff --git a/src/main/resources/2020-examples/day4-3.txt b/src/main/resources/2020-examples/day4-3.txt new file mode 100644 index 00000000..a7fa5bb8 --- /dev/null +++ b/src/main/resources/2020-examples/day4-3.txt @@ -0,0 +1,13 @@ +eyr:1972 cid:100 +hcl:#18171d ecl:amb hgt:170 pid:186cm iyr:2018 byr:1926 + +iyr:2019 +hcl:#602927 eyr:1967 hgt:170cm +ecl:grn pid:012533040 byr:1946 + +hcl:dab227 iyr:2012 +ecl:brn hgt:182cm pid:021572410 eyr:2020 byr:1992 cid:277 + +hgt:59cm ecl:zzz +eyr:2038 hcl:74454a iyr:2023 +pid:3556412378 byr:2007 diff --git a/src/main/resources/2020-examples/day4-4.txt b/src/main/resources/2020-examples/day4-4.txt new file mode 100644 index 00000000..ca41800e --- /dev/null +++ b/src/main/resources/2020-examples/day4-4.txt @@ -0,0 +1,12 @@ +pid:087499704 hgt:74in ecl:grn iyr:2012 eyr:2030 byr:1980 +hcl:#623a2f + +eyr:2029 ecl:blu cid:129 byr:1989 +iyr:2014 pid:896056539 hcl:#a97842 hgt:165cm + +hcl:#888785 +hgt:164cm byr:2001 iyr:2015 cid:88 +pid:545766238 ecl:hzl +eyr:2022 + +iyr:2010 hgt:158cm hcl:#b6652a ecl:blu byr:1944 eyr:2021 pid:093154719 diff --git a/src/main/resources/2020-examples/day6-1.txt b/src/main/resources/2020-examples/day6-1.txt new file mode 100644 index 00000000..a1bf3ea1 --- /dev/null +++ b/src/main/resources/2020-examples/day6-1.txt @@ -0,0 +1,3 @@ +abcx +abcy +abcz diff --git a/src/main/resources/2020-examples/day6-2.txt b/src/main/resources/2020-examples/day6-2.txt new file mode 100644 index 00000000..0f5b3bc1 --- /dev/null +++ b/src/main/resources/2020-examples/day6-2.txt @@ -0,0 +1,15 @@ +abc + +a +b +c + +ab +ac + +a +a +a +a + +b diff --git a/src/main/resources/2020-examples/day6-3.txt b/src/main/resources/2020-examples/day6-3.txt new file mode 100644 index 00000000..0f5b3bc1 --- /dev/null +++ b/src/main/resources/2020-examples/day6-3.txt @@ -0,0 +1,15 @@ +abc + +a +b +c + +ab +ac + +a +a +a +a + +b diff --git a/src/main/resources/2020-examples/day7-1.txt b/src/main/resources/2020-examples/day7-1.txt new file mode 100644 index 00000000..1cec74fb --- /dev/null +++ b/src/main/resources/2020-examples/day7-1.txt @@ -0,0 +1,9 @@ +light red bags contain 1 bright white bag, 2 muted yellow bags. +dark orange bags contain 3 bright white bags, 4 muted yellow bags. +bright white bags contain 1 shiny gold bag. +muted yellow bags contain 2 shiny gold bags, 9 faded blue bags. +shiny gold bags contain 1 dark olive bag, 2 vibrant plum bags. +dark olive bags contain 3 faded blue bags, 4 dotted black bags. +vibrant plum bags contain 5 faded blue bags, 6 dotted black bags. +faded blue bags contain no other bags. +dotted black bags contain no other bags. diff --git a/src/main/resources/2020-examples/day7-2.txt b/src/main/resources/2020-examples/day7-2.txt new file mode 100644 index 00000000..2723ca04 --- /dev/null +++ b/src/main/resources/2020-examples/day7-2.txt @@ -0,0 +1,7 @@ +shiny gold bags contain 2 dark red bags. +dark red bags contain 2 dark orange bags. +dark orange bags contain 2 dark yellow bags. +dark yellow bags contain 2 dark green bags. +dark green bags contain 2 dark blue bags. +dark blue bags contain 2 dark violet bags. +dark violet bags contain no other bags. diff --git a/src/main/resources/2020-examples/day8-1.txt b/src/main/resources/2020-examples/day8-1.txt new file mode 100644 index 00000000..178df531 --- /dev/null +++ b/src/main/resources/2020-examples/day8-1.txt @@ -0,0 +1,9 @@ +nop +0 +acc +1 +jmp +4 +acc +3 +jmp -3 +acc -99 +acc +1 +jmp -4 +acc +6 diff --git a/src/main/resources/2020-examples/day8-2.txt b/src/main/resources/2020-examples/day8-2.txt new file mode 100644 index 00000000..37253fad --- /dev/null +++ b/src/main/resources/2020-examples/day8-2.txt @@ -0,0 +1,9 @@ +nop +0 | 1 +acc +1 | 2, 8(!) +jmp +4 | 3 +acc +3 | 6 +jmp -3 | 7 +acc -99 | +acc +1 | 4 +jmp -4 | 5 +acc +6 | diff --git a/src/main/resources/2020-examples/day8-3.txt b/src/main/resources/2020-examples/day8-3.txt new file mode 100644 index 00000000..178df531 --- /dev/null +++ b/src/main/resources/2020-examples/day8-3.txt @@ -0,0 +1,9 @@ +nop +0 +acc +1 +jmp +4 +acc +3 +jmp -3 +acc -99 +acc +1 +jmp -4 +acc +6 diff --git a/src/main/resources/2020-examples/day8-4.txt b/src/main/resources/2020-examples/day8-4.txt new file mode 100644 index 00000000..4cdbeaad --- /dev/null +++ b/src/main/resources/2020-examples/day8-4.txt @@ -0,0 +1,9 @@ +nop +0 | 1 +acc +1 | 2 +jmp +4 | 3 +acc +3 | +jmp -3 | +acc -99 | +acc +1 | 4 +nop -4 | 5 +acc +6 | 6 diff --git a/src/main/resources/2020-examples/day9-1.txt b/src/main/resources/2020-examples/day9-1.txt new file mode 100644 index 00000000..28d66e4f --- /dev/null +++ b/src/main/resources/2020-examples/day9-1.txt @@ -0,0 +1,20 @@ +35 +20 +15 +25 +47 +40 +62 +55 +65 +95 +102 +117 +150 +182 +127 +219 +299 +277 +309 +576 diff --git a/src/main/resources/2020-examples/day9-2.txt b/src/main/resources/2020-examples/day9-2.txt new file mode 100644 index 00000000..28d66e4f --- /dev/null +++ b/src/main/resources/2020-examples/day9-2.txt @@ -0,0 +1,20 @@ +35 +20 +15 +25 +47 +40 +62 +55 +65 +95 +102 +117 +150 +182 +127 +219 +299 +277 +309 +576 From 95631eba2ad51ea1b39e8009eeef08346ca3bcc4 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Fri, 5 Nov 2021 23:45:58 +0100 Subject: [PATCH 231/433] Preparing some utils --- .../com/sbaars/adventofcode/common/Grid.java | 21 ++++++++++++++ .../adventofcode/common/InfiniteGrid.java | 28 +++++++++++++++++++ .../sbaars/adventofcode/year20/days/Day2.java | 11 ++------ 3 files changed, 51 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode/common/Grid.java create mode 100644 src/main/java/com/sbaars/adventofcode/common/InfiniteGrid.java diff --git a/src/main/java/com/sbaars/adventofcode/common/Grid.java b/src/main/java/com/sbaars/adventofcode/common/Grid.java new file mode 100644 index 00000000..e5bae8ac --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/common/Grid.java @@ -0,0 +1,21 @@ +package com.sbaars.adventofcode.common; + +import java.util.Arrays; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +public class Grid { + char[][] grid; + + public Grid(char[][] grid){ + this.grid = grid; + } + + public int countChar(char...c){ + return Math.toIntExact(iterate().filter(e -> new String(c).chars().anyMatch(i -> i == e)).count()); + } + + public IntStream iterate(){ + return Arrays.stream(grid).map(String::new).flatMapToInt(String::chars); + } +} diff --git a/src/main/java/com/sbaars/adventofcode/common/InfiniteGrid.java b/src/main/java/com/sbaars/adventofcode/common/InfiniteGrid.java new file mode 100644 index 00000000..25ce3c0e --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/common/InfiniteGrid.java @@ -0,0 +1,28 @@ +package com.sbaars.adventofcode.common; + +import java.awt.*; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.stream.IntStream; + +public class InfiniteGrid { + final Map grid = new HashMap<>(); + Point currentPos = new Point(0, 0); + + public InfiniteGrid(char[][] g){ + for(int i = 0; i new String(c).chars().anyMatch(i -> i == e)).count()); + } + + public IntStream iterate(){ + return Arrays.stream(grid).map(String::new).flatMapToInt(String::chars); + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day2.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day2.java index 6691e5e5..856830b0 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day2.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day2.java @@ -25,21 +25,14 @@ public Object part1() { } private long pwCount(Predicate validator) { - List s = dayStream().map(Day2::mapPassword).collect(Collectors.toList()); - return s.stream().filter(validator).count(); + return dayStream().map(Day2::mapPassword).filter(validator).count(); } public static Password mapPassword(String s) { return readString(s, "%n-%n %c: %s", Password.class); } - @Value - @Data - public static class Password { - long lower; - long higher; - char character; - String password; + record Password (long lower, long higher, char character, String password) { public boolean isValid() { long count = password.chars().filter(c -> c == character).count(); From ce85b55e4f298078e19045082b7f5c68ebcbe254 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Sun, 7 Nov 2021 13:05:14 +0100 Subject: [PATCH 232/433] Getting rid of lombok --- adventofcode2019.iml | 1 - pom.xml | 6 -- .../sbaars/adventofcode/year20/days/Day1.java | 6 +- .../adventofcode/year20/days/Day15.java | 16 ++--- .../adventofcode/year20/days/Day16.java | 12 +--- .../adventofcode/year20/days/Day17.java | 25 +------- .../adventofcode/year20/days/Day18.java | 3 - .../adventofcode/year20/days/Day19.java | 61 ++++++++----------- .../sbaars/adventofcode/year20/days/Day2.java | 4 -- .../adventofcode/year20/days/Day20.java | 22 +------ .../adventofcode/year20/days/Day21.java | 21 ++----- .../sbaars/adventofcode/year20/days/Day8.java | 4 -- 12 files changed, 47 insertions(+), 134 deletions(-) diff --git a/adventofcode2019.iml b/adventofcode2019.iml index 842a5127..1fd9ad3b 100644 --- a/adventofcode2019.iml +++ b/adventofcode2019.iml @@ -17,7 +17,6 @@ - diff --git a/pom.xml b/pom.xml index d69d727e..87972c3e 100644 --- a/pom.xml +++ b/pom.xml @@ -31,12 +31,6 @@ 4.13.2 test - - org.projectlombok - lombok - 1.18.22 - provided - com.google.guava guava diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day1.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day1.java index 6e7f0c1d..a08bf2ce 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day1.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day1.java @@ -1,6 +1,7 @@ package com.sbaars.adventofcode.year20.days; import com.sbaars.adventofcode.year20.Day2020; +import java.util.stream.LongStream; public class Day1 extends Day2020 { public static void main(String[] args) { @@ -13,8 +14,9 @@ public Day1() { @Override public Object part1() { - return dayNumberStream().flatMap(a -> - dayNumberStream().filter(b -> a + b == 2020L).map(b -> a * b) + LongStream nums = dayNumberStream(); + return nums.flatMap(a -> + nums.filter(b -> a + b == 2020L).map(b -> a * b) ).findAny().getAsLong(); } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day15.java index 9b40156b..6210bd61 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day15.java @@ -1,19 +1,11 @@ package com.sbaars.adventofcode.year20.days; -import com.sbaars.adventofcode.year20.Day2020; -import lombok.Data; -import lombok.Value; - -import java.util.*; - -import static com.google.common.primitives.Longs.asList; -import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; -import static java.lang.Long.parseLong; -import static java.lang.Long.toBinaryString; -import static java.util.Optional.empty; -import static java.util.Optional.of; import static java.util.stream.IntStream.range; +import com.sbaars.adventofcode.year20.Day2020; +import java.util.HashMap; +import java.util.Map; + public class Day15 extends Day2020 { public static void main(String[] args) { new Day15().printParts(); diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day16.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day16.java index 1dab0925..8ae77c1a 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day16.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day16.java @@ -15,8 +15,6 @@ import java.util.Map; import java.util.Optional; import java.util.Set; -import lombok.Data; -import lombok.Value; public class Day16 extends Day2020 { public static void main(String[] args) { @@ -41,15 +39,7 @@ public Object part1() { return tickets.stream().flatMapToLong(t -> t.stream().filter(n -> stream(rules).noneMatch(r -> r.check(n))).mapToLong(e -> e)).sum(); } - @Data - @Value - public static class Rule { - String name; - long lower1; - long upper1; - long lower2; - long upper2; - + record Rule (String name, long lower1, long upper1, long lower2, long upper2) { public boolean check(long val) { return (val >= lower1 && val <= upper1) || (val >= lower2 && val <= upper2); } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day17.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day17.java index 6efaeed2..7e61ac4a 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day17.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day17.java @@ -1,16 +1,9 @@ package com.sbaars.adventofcode.year20.days; import com.sbaars.adventofcode.year20.Day2020; -import lombok.Data; -import lombok.Value; - -import java.util.ArrayList; import java.util.HashSet; -import java.util.List; import java.util.Set; -import static java.util.Arrays.stream; - public class Day17 extends Day2020 { public static void main(String[] args) { new Day17().printParts(); @@ -65,23 +58,9 @@ public void addNeighbors(Set pos, Set newPos, Set checkedPos, Pos } } - @Data - @Value - public static class Pos { - long x; - long y; - long z; - } + public static record Pos (long x, long y, long z) {} - - @Data - @Value - public static class Pos4 { - long x; - long y; - long z; - long w; - } + public static record Pos4 (long x, long y, long z, long w) {} @Override public Object part2() { diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day18.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day18.java index 9df12287..5f934910 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day18.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day18.java @@ -1,11 +1,8 @@ package com.sbaars.adventofcode.year20.days; import static java.util.Arrays.stream; -import static java.util.stream.IntStream.range; import com.sbaars.adventofcode.year20.Day2020; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import org.apache.commons.lang3.tuple.Pair; public class Day18 extends Day2020 { diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day19.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day19.java index 8ee2fb0b..7e1be548 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day19.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day19.java @@ -1,18 +1,19 @@ package com.sbaars.adventofcode.year20.days; -import com.sbaars.adventofcode.year20.Day2020; -import lombok.Data; -import lombok.Value; - -import java.util.*; -import java.util.stream.Collectors; -import java.util.stream.Stream; - import static java.lang.Long.parseLong; -import static java.util.Arrays.asList; import static java.util.Arrays.stream; import static java.util.Collections.singletonList; +import com.sbaars.adventofcode.year20.Day2020; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + public class Day19 extends Day2020 { public static void main(String[] args) { new Day19().printParts(); @@ -41,37 +42,29 @@ private long getSolution(String inputFile) { .count(); } - @Data - @Value - public static class Rule{ - long id; - Optional letter; - long[] rule1; - long[] rule2; + private static Optional getLetter(String rule){ + return rule.startsWith("\"") ? Optional.of(rule.charAt(1)+"") : Optional.empty(); + } + private static long[] getRule(String rule, boolean num){ + if(rule.startsWith("\"")){ + return new long[]{}; + } + String[] r = rule.split(" \\| "); + if (!num || r.length > 1) { + return Arrays.stream(r[num ? 1 : 0].split(" ")).mapToLong(Long::parseLong).toArray(); + } else { + return new long[]{}; + } + } + + public static record Rule (long id, Optional letter, long[] rule1, long[] rule2) { public Rule(long id, String rule){ - this.id = id; - if(rule.startsWith("\"")){ - letter = Optional.of(rule.charAt(1)+""); - rule2 = new long[]{}; - rule1 = new long[]{}; - } else { - letter = Optional.empty(); - String[] r = rule.split(" \\| "); - rule1 = Arrays.stream(r[0].split(" ")).mapToLong(Long::parseLong).toArray(); - if (r.length > 1) { - rule2 = Arrays.stream(r[1].split(" ")).mapToLong(Long::parseLong).toArray(); - } else { - rule2 = new long[]{}; - } - } + this(id, getLetter(rule), getRule(rule, false), getRule(rule, true)); } public Set getPossibilities(Map m, Map> sol){ if(sol.containsKey(id)) return sol.get(id); -// if(id == 8){ -// System.out.println("hi"); -// } if(letter.isEmpty()){ Rule[] r = stream(rule1).mapToObj(m::get).toArray(Rule[]::new); Rule[] orRule = stream(rule2).mapToObj(m::get).toArray(Rule[]::new); diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day2.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day2.java index 856830b0..205ea868 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day2.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day2.java @@ -4,11 +4,7 @@ import static java.lang.Math.toIntExact; import com.sbaars.adventofcode.year20.Day2020; -import java.util.List; import java.util.function.Predicate; -import java.util.stream.Collectors; -import lombok.Data; -import lombok.Value; public class Day2 extends Day2020 { public static void main(String[] args) { diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day20.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day20.java index 599019d9..51f485ea 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day20.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day20.java @@ -14,17 +14,13 @@ import com.sbaars.adventofcode.year20.Day2020; import java.awt.*; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.EnumMap; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import lombok.Data; -import lombok.Value; import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.lang3.StringUtils; public class Day20 extends Day2020 { public static void main(String[] args) { @@ -51,15 +47,9 @@ public Object part1() { return answer.stream().mapToLong(e -> e).reduce((a,b) -> a * b).getAsLong(); } - @Data - @Value - public static class Grid{ - long id; - char[][] grid; - + public static record Grid (long id, char[][] grid) { public Grid(String s){ - this.id = parseLong(s.substring(5,9)); - this.grid = stream(s.substring(11).split("\n")).map(String::toCharArray).toArray(char[][]::new); + this(parseLong(s.substring(5,9)), stream(s.substring(11).split("\n")).map(String::toCharArray).toArray(char[][]::new)); } public Multimap getSides(Multimap map){ @@ -113,13 +103,7 @@ public long countWithoutSides(){ } } - @Data - @Value - public static class Metadata{ - long id; - Direction dir; - boolean flipped; - + public static record Metadata (long id, Direction dir, boolean flipped) { public boolean validMetadata(List l){ Map map = new EnumMap(Direction.class); for(Metadata m : l){ diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day21.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day21.java index 98fcf25b..3a60967c 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day21.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day21.java @@ -1,22 +1,16 @@ package com.sbaars.adventofcode.year20.days; -import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; import static java.util.Arrays.asList; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; import com.sbaars.adventofcode.year20.Day2020; -import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.Comparator; import java.util.HashSet; -import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; -import lombok.Data; -import lombok.Value; public class Day21 extends Day2020 { public static void main(String[] args) { @@ -63,19 +57,16 @@ private Multimap getAllergens(Rule[] input) { return allergens; } - @Data - @Value - public static class Rule { - String[] ingredients; - String[] allergens; - + public static record Rule (String[] ingredients, String[] allergens) { public Rule (String s){ - String[] split = s.substring(0, s.length()-1).split(" \\(contains "); - this.ingredients = split[0].split(" "); - this.allergens = split[1].split(", "); + this(getSplit(s)[0].split(" "), getSplit(s)[1].split(", ")); } } + private static String[] getSplit(String s) { + return s.substring(0, s.length()-1).split(" \\(contains "); + } + @Override public Object part2() { Rule[] input = Arrays.stream(day().split("\n")).map(Rule::new).toArray(Rule[]::new); diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day8.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day8.java index 2207c792..d6887bc8 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day8.java @@ -1,13 +1,9 @@ package com.sbaars.adventofcode.year20.days; -import static java.util.Arrays.stream; - import com.sbaars.adventofcode.year20.Day2020; import com.sbaars.adventofcode.year20.gamepad.Gamepad; import java.util.HashSet; import java.util.Set; -import lombok.AllArgsConstructor; -import lombok.Data; public class Day8 extends Day2020 { From 6f91cf3875ea7d8ae77bf093f65788e94cbf5c82 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Sun, 7 Nov 2021 13:24:06 +0100 Subject: [PATCH 233/433] Okay --- .../common/{Grid.java => grid/CharGrid.java} | 7 +++---- .../sbaars/adventofcode/common/grid/Grid.java | 11 +++++++++++ .../common/{ => grid}/InfiniteGrid.java | 11 +++-------- .../sbaars/adventofcode/year19/days/Day17.java | 17 ++--------------- 4 files changed, 19 insertions(+), 27 deletions(-) rename src/main/java/com/sbaars/adventofcode/common/{Grid.java => grid/CharGrid.java} (74%) create mode 100644 src/main/java/com/sbaars/adventofcode/common/grid/Grid.java rename src/main/java/com/sbaars/adventofcode/common/{ => grid}/InfiniteGrid.java (56%) diff --git a/src/main/java/com/sbaars/adventofcode/common/Grid.java b/src/main/java/com/sbaars/adventofcode/common/grid/CharGrid.java similarity index 74% rename from src/main/java/com/sbaars/adventofcode/common/Grid.java rename to src/main/java/com/sbaars/adventofcode/common/grid/CharGrid.java index e5bae8ac..5ccab253 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Grid.java +++ b/src/main/java/com/sbaars/adventofcode/common/grid/CharGrid.java @@ -1,13 +1,12 @@ -package com.sbaars.adventofcode.common; +package com.sbaars.adventofcode.common.grid; import java.util.Arrays; import java.util.stream.IntStream; -import java.util.stream.Stream; -public class Grid { +public class CharGrid implements Grid { char[][] grid; - public Grid(char[][] grid){ + public CharGrid(char[][] grid){ this.grid = grid; } diff --git a/src/main/java/com/sbaars/adventofcode/common/grid/Grid.java b/src/main/java/com/sbaars/adventofcode/common/grid/Grid.java new file mode 100644 index 00000000..def26320 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/common/grid/Grid.java @@ -0,0 +1,11 @@ +package com.sbaars.adventofcode.common.grid; + +import java.util.stream.IntStream; + +public interface Grid { + default int countChar(char...c){ + return Math.toIntExact(iterate().filter(e -> new String(c).chars().anyMatch(i -> i == e)).count()); + } + + IntStream iterate(); +} diff --git a/src/main/java/com/sbaars/adventofcode/common/InfiniteGrid.java b/src/main/java/com/sbaars/adventofcode/common/grid/InfiniteGrid.java similarity index 56% rename from src/main/java/com/sbaars/adventofcode/common/InfiniteGrid.java rename to src/main/java/com/sbaars/adventofcode/common/grid/InfiniteGrid.java index 25ce3c0e..17b98654 100644 --- a/src/main/java/com/sbaars/adventofcode/common/InfiniteGrid.java +++ b/src/main/java/com/sbaars/adventofcode/common/grid/InfiniteGrid.java @@ -1,12 +1,11 @@ -package com.sbaars.adventofcode.common; +package com.sbaars.adventofcode.common.grid; import java.awt.*; -import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.stream.IntStream; -public class InfiniteGrid { +public class InfiniteGrid implements Grid { final Map grid = new HashMap<>(); Point currentPos = new Point(0, 0); @@ -18,11 +17,7 @@ public InfiniteGrid(char[][] g){ } } - public int countChar(char...c){ - return Math.toIntExact(iterate().filter(e -> new String(c).chars().anyMatch(i -> i == e)).count()); - } - public IntStream iterate(){ - return Arrays.stream(grid).map(String::new).flatMapToInt(String::chars); + return grid.values().stream().mapToInt(Character::getNumericValue); } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day17.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day17.java index 97a1060d..6c57508c 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day17.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day17.java @@ -1,18 +1,14 @@ package com.sbaars.adventofcode.year19.days; -import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.common.Direction; import com.sbaars.adventofcode.year19.Day2019; import com.sbaars.adventofcode.year19.intcode.IntcodeComputer; -import java.awt.Point; -import java.io.IOException; +import java.awt.*; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; -import lombok.EqualsAndHashCode; - public class Day17 extends Day2019 { char[][] grid = new char[48][48]; @@ -143,16 +139,7 @@ private List findPos(char[][] grid, char tile) { } enum Dir{L,R} - @EqualsAndHashCode class Instruction{ - int amount; - Dir dir; - - public Instruction(int amount, Dir dir) { - super(); - this.amount = amount; - this.dir = dir; - } - + record Instruction (int amount, Dir dir) { @Override public String toString() { return dir.name()+","+amount; From ab638c9f7aed41db3ea3bf7669a5c4943f48ad98 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Sun, 7 Nov 2021 20:46:57 +0100 Subject: [PATCH 234/433] Fix compile errors --- .../haskell/year20/days/Day2.java | 4 +- .../haskell/year20/days/Day8.java | 4 +- .../adventofcode/year19/days/Day10.java | 29 +- .../adventofcode/year19/days/Day18.java | 254 +++++++++--------- .../adventofcode/year19/days/Day20.java | 47 +--- .../adventofcode/year19/days/Day22.java | 29 +- .../adventofcode/year19/days/Day24.java | 19 +- .../sbaars/adventofcode/year19/days/Day3.java | 28 +- .../sbaars/adventofcode/year20/days/Day1.java | 8 +- .../adventofcode/year20/days/Day12.java | 19 +- .../adventofcode/year20/days/Day14.java | 32 +-- .../sbaars/adventofcode/year20/days/Day2.java | 2 +- .../adventofcode/year20/gamepad/Gamepad.java | 95 ++++--- 13 files changed, 262 insertions(+), 308 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day2.java b/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day2.java index 2f5c3bba..02f6f46b 100644 --- a/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day2.java +++ b/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day2.java @@ -2,8 +2,6 @@ import com.sbaars.adventofcode.haskell.year20.HaskellDay2020; -import java.util.stream.Collectors; - public class Day2 extends HaskellDay2020 { public Day2() { super(2); @@ -16,7 +14,7 @@ public static void main(String[] args) { @Override public Object part1() { return dayStream().map(com.sbaars.adventofcode.year20.days.Day2::mapPassword) - .map(p -> tuple(tup(p.getLower(), p.getHigher()), p.getCharacter(), convert(p.getPassword()))) + .map(p -> tuple(tup(p.lower(), p.higher()), p.character(), convert(p.password()))) .collect(haskellList()); } diff --git a/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day8.java b/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day8.java index 61e7d61c..9b70e5c7 100644 --- a/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day8.java @@ -3,8 +3,6 @@ import static java.util.Arrays.stream; import com.sbaars.adventofcode.haskell.year20.HaskellDay2020; -import com.sbaars.adventofcode.year20.days.Day7.Item; -import com.sbaars.adventofcode.year20.days.Day7.Trade; import com.sbaars.adventofcode.year20.gamepad.Gamepad; public class Day8 extends HaskellDay2020 { @@ -19,7 +17,7 @@ public static void main(String[] args) { @Override public Object part1() { return stream(new Gamepad(dayStream()).getInstructions()) - .map(i -> tup(i.getOperation(), i.getNumber())) + .map(i -> tup(i.operation(), i.number())) .collect(haskellList()); } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day10.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day10.java index e11be1a7..c6f44a2c 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day10.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day10.java @@ -1,18 +1,14 @@ package com.sbaars.adventofcode.year19.days; -import java.awt.Point; -import java.io.IOException; +import com.google.common.base.Objects; +import com.sbaars.adventofcode.year19.Day2019; +import java.awt.*; import java.util.Arrays; import java.util.List; import java.util.OptionalDouble; import java.util.stream.Collectors; import java.util.stream.IntStream; -import com.sbaars.adventofcode.common.Day; - -import com.sbaars.adventofcode.year19.Day2019; -import lombok.EqualsAndHashCode; - public class Day10 extends Day2019 { private final List asteroids; @@ -56,9 +52,9 @@ private long countNVisible(Point asteroid) { return asteroids.stream().map(e -> new Asteroid(asteroid, e)).mapToDouble(e -> e.rotation).distinct().count(); } - @EqualsAndHashCode class Asteroid { - @EqualsAndHashCode.Exclude double rotation; - @EqualsAndHashCode.Exclude double distance; + class Asteroid { + double rotation; + double distance; Point position; public Asteroid(Point center, Point me) { @@ -76,5 +72,18 @@ private double calcRotationAngleInDegrees(Point centerPt, Point targetPt) { double angle = Math.toDegrees(theta); return angle < 0 ? angle + 360 : angle; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Asteroid asteroid = (Asteroid) o; + return Objects.equal(position, asteroid.position); + } + + @Override + public int hashCode() { + return Objects.hashCode(position); + } } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day18.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day18.java index 784e2098..154fdeb2 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day18.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day18.java @@ -1,9 +1,9 @@ package com.sbaars.adventofcode.year19.days; -import java.awt.Point; -import java.io.IOException; +import com.sbaars.adventofcode.year19.Day2019; +import com.sbaars.adventofcode.year19.pathfinding.CharGrid2d; +import java.awt.*; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -11,135 +11,125 @@ import java.util.TreeSet; import java.util.stream.Collectors; -import com.sbaars.adventofcode.common.Day; -import com.sbaars.adventofcode.year19.Day2019; -import com.sbaars.adventofcode.year19.pathfinding.CharGrid2d; - -import lombok.*; - public class Day18 extends Day2019 { - private final char[][] grid; - private final CharGrid2d charGrid; - private final Map cachedResult = new HashMap<>(); - private static final char[][] CHANGE_GRID = { - {'@', '#', '@'}, - {'#', '#', '#'}, - {'@', '#', '@'} - }; - private final Point middle; - - public Day18() { - super(18); - grid = dayStream().map(String::toCharArray).toArray(char[][]::new); - charGrid = new CharGrid2d(grid, false); - middle = findPos('@').get(0); - } - - public static void main(String[] args) { - new Day18().printParts(); - } - - @Data @AllArgsConstructor class Route { - Point start; - Point end; - } - - @Data @AllArgsConstructor class State{ - List me; - TreeSet keys; - } - - @Override - public Object part1() { - List me = new ArrayList<>(); - me.add(middle); - return findRoutes(me); - } - - private Object findRoutes(List me) { - List keys = findPos('a', 'z'); - Map> routes = new HashMap<>(); - List requiredRoutes = new ArrayList<>(keys); - requiredRoutes.addAll(me); - for(int i = 0; i r = charGrid.findPath(requiredRoutes.get(i), requiredRoutes.get(j)); - if(!r.isEmpty()) - routes.put(new Route(requiredRoutes.get(i), requiredRoutes.get(j)), r); - } - } - return findSteps(me, new TreeSet<>(), keys, routes); - } - - public List getRoute(Map> routes, Point p1, Point p2){ - List p = routes.get(new Route(p1, p2)); - if(p != null) - return p; - else return routes.get(new Route(p2, p1)); - } - - public boolean canTakeRoute(List route, TreeSet keys) { - for(Point p : route) { - if(grid[p.y][p.x]>='A' && grid[p.y][p.x]<='Z' && !keys.contains(grid[p.y][p.x])) { - return false; - } - } - return true; - } - - public int findSteps(List me, TreeSet collectedKeys, List keys, Map> routes) { - Integer cachedRes = cachedResult.get(new State(me, collectedKeys)); - if(cachedRes!=null) return cachedRes; - val possibleMoves = me.stream().flatMap(m -> keys.stream().map(p -> getRoute(routes, m, p))).filter(Objects::nonNull).filter(e -> canTakeRoute(e, collectedKeys)).collect(Collectors.toList()); - List nSteps = new ArrayList<>(); - for(List takenMove : possibleMoves) { - val myKeys = new TreeSet<>(collectedKeys); - val keyLocs = new ArrayList<>(keys); - Point newLoc = me.contains(takenMove.get(0)) ? takenMove.get(takenMove.size()-1) : takenMove.get(0); - Point oldLoc = me.contains(takenMove.get(0)) ? takenMove.get(0) : takenMove.get(takenMove.size()-1); - char collected = grid[newLoc.y][newLoc.x]; - myKeys.add(Character.toUpperCase(collected)); - keyLocs.remove(newLoc); - val me2 = new ArrayList<>(me); - me2.set(me.indexOf(oldLoc), newLoc); - nSteps.add(findSteps(me2, myKeys, keyLocs, routes) + takenMove.size()-1); - } - int res = nSteps.stream().mapToInt(e -> e).min().orElse(0); - cachedResult.put(new State(me, collectedKeys), res); - return res; - } - - private List findPos(char tile) { - List positions = new ArrayList<>(); - for(int y = 0; y findPos(char tile, char tile2) { - List positions = new ArrayList<>(); - for(int y = 0; y= tile && grid[y][x] <= tile2) - positions.add(new Point(x, y)); - } - } - return positions; - } - - @Override - public Object part2() { - for(int y = 0; y cachedResult = new HashMap<>(); + private static final char[][] CHANGE_GRID = { + {'@', '#', '@'}, + {'#', '#', '#'}, + {'@', '#', '@'} + }; + private final Point middle; + + public Day18() { + super(18); + grid = dayStream().map(String::toCharArray).toArray(char[][]::new); + charGrid = new CharGrid2d(grid, false); + middle = findPos('@').get(0); + } + + public static void main(String[] args) { + new Day18().printParts(); + } + + record Route(Point start, Point end) { + } + + record State(List me, TreeSet keys) { + } + + @Override + public Object part1() { + List me = new ArrayList<>(); + me.add(middle); + return findRoutes(me); + } + + private Object findRoutes(List me) { + List keys = findPos('a', 'z'); + Map> routes = new HashMap<>(); + List requiredRoutes = new ArrayList<>(keys); + requiredRoutes.addAll(me); + for (int i = 0; i < requiredRoutes.size(); i++) { + for (int j = i + 1; j < requiredRoutes.size(); j++) { + List r = charGrid.findPath(requiredRoutes.get(i), requiredRoutes.get(j)); + if (!r.isEmpty()) + routes.put(new Route(requiredRoutes.get(i), requiredRoutes.get(j)), r); + } + } + return findSteps(me, new TreeSet<>(), keys, routes); + } + + public List getRoute(Map> routes, Point p1, Point p2) { + List p = routes.get(new Route(p1, p2)); + if (p != null) + return p; + else return routes.get(new Route(p2, p1)); + } + + public boolean canTakeRoute(List route, TreeSet keys) { + for (Point p : route) { + if (grid[p.y][p.x] >= 'A' && grid[p.y][p.x] <= 'Z' && !keys.contains(grid[p.y][p.x])) { + return false; + } + } + return true; + } + + public int findSteps(List me, TreeSet collectedKeys, List keys, Map> routes) { + Integer cachedRes = cachedResult.get(new State(me, collectedKeys)); + if (cachedRes != null) return cachedRes; + var possibleMoves = me.stream().flatMap(m -> keys.stream().map(p -> getRoute(routes, m, p))).filter(Objects::nonNull).filter(e -> canTakeRoute(e, collectedKeys)).collect(Collectors.toList()); + List nSteps = new ArrayList<>(); + for (List takenMove : possibleMoves) { + var myKeys = new TreeSet<>(collectedKeys); + var keyLocs = new ArrayList<>(keys); + Point newLoc = me.contains(takenMove.get(0)) ? takenMove.get(takenMove.size() - 1) : takenMove.get(0); + Point oldLoc = me.contains(takenMove.get(0)) ? takenMove.get(0) : takenMove.get(takenMove.size() - 1); + char collected = grid[newLoc.y][newLoc.x]; + myKeys.add(Character.toUpperCase(collected)); + keyLocs.remove(newLoc); + var me2 = new ArrayList<>(me); + me2.set(me.indexOf(oldLoc), newLoc); + nSteps.add(findSteps(me2, myKeys, keyLocs, routes) + takenMove.size() - 1); + } + int res = nSteps.stream().mapToInt(e -> e).min().orElse(0); + cachedResult.put(new State(me, collectedKeys), res); + return res; + } + + private List findPos(char tile) { + List positions = new ArrayList<>(); + for (int y = 0; y < grid.length; y++) { + for (int x = 0; x < grid[y].length; x++) { + if (grid[y][x] == tile) + positions.add(new Point(x, y)); + } + } + return positions; + } + + private List findPos(char tile, char tile2) { + List positions = new ArrayList<>(); + for (int y = 0; y < grid.length; y++) { + for (int x = 0; x < grid[y].length; x++) { + if (grid[y][x] >= tile && grid[y][x] <= tile2) + positions.add(new Point(x, y)); + } + } + return positions; + } + + @Override + public Object part2() { + for (int y = 0; y < CHANGE_GRID.length; y++) { + for (int x = 0; x < CHANGE_GRID[y].length; x++) { + grid[middle.y - 1 + y][middle.x - 1 + x] = CHANGE_GRID[y][x]; + } + } + cachedResult.clear(); + return findRoutes(findPos('@')); + } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day20.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day20.java index 862d6f8a..a1228a6f 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day20.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day20.java @@ -1,14 +1,11 @@ package com.sbaars.adventofcode.year19.days; import com.google.common.collect.ArrayListMultimap; -import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year19.Day2019; import com.sbaars.adventofcode.year19.pathfinding.CharGrid2d; -import java.awt.Point; -import java.io.IOException; +import java.awt.*; import java.util.ArrayDeque; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -16,12 +13,6 @@ import java.util.Queue; import java.util.Set; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -import lombok.ToString; - public class Day20 extends Day2019 { char[][] grid; CharGrid2d charGrid; @@ -32,29 +23,13 @@ public class Day20 extends Day2019 { private Portal entry; private Portal exit; - @Data @AllArgsConstructor class Portal { - Point pos; - boolean isOuter; - } + record Portal (Point pos, boolean isOuter) {} - @Data @AllArgsConstructor class Route { - Portal goal; - int distance; - } + record Route (Portal goal, int distance) {} - @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) @AllArgsConstructor class State extends Visited { - int totalSteps; + record State (Visited vis, int totalSteps) {} - public State(int totalSteps, Visited vis) { - super(vis.pos, vis.level); - this.totalSteps = totalSteps; - } - } - - @Data @AllArgsConstructor @NoArgsConstructor class Visited { - Portal pos; - int level; - } + record Visited (Portal pos, int level) {} public Day20() { super(20); @@ -115,20 +90,20 @@ public Object part1() { private int findRoutes(boolean b) { final Queue queue = new ArrayDeque<>(); final Set visited = new HashSet<>(); - queue.add(new State(-1, new Visited(entry, 0))); + queue.add(new State(new Visited(entry, 0), -1)); while(true) { State s = queue.poll(); - if(!routes.containsKey(s.pos)) determineRoutes(s.pos); - for(Route route : routes.get(s.pos)) { - int level = s.level; + if(!routes.containsKey(s.vis.pos)) determineRoutes(s.vis.pos); + for(Route route : routes.get(s.vis.pos)) { + int level = s.vis.level; if(level == 0 && route.goal.equals(exit)) return route.distance + s.totalSteps; else if(route.goal.equals(exit)) continue; if(b) level+=route.goal.isOuter ? 1 : -1; - if(s.level < 0) continue; + if(s.vis.level < 0) continue; Visited vis = new Visited(route.goal, level); if(!visited.contains(vis)) { visited.add(vis); - queue.add(new State(s.totalSteps + route.distance, vis)); + queue.add(new State(vis, s.totalSteps + route.distance)); } } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day22.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day22.java index 9e856705..29576dea 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day22.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day22.java @@ -1,7 +1,6 @@ package com.sbaars.adventofcode.year19.days; -import com.sbaars.adventofcode.common.Day; -import java.io.IOException; +import com.sbaars.adventofcode.year19.Day2019; import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; @@ -10,45 +9,41 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -import com.sbaars.adventofcode.year19.Day2019; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.Value; - public class Day22 extends Day2019 { Move[] moves; public Day22() { super(22); - this.moves = Arrays.stream(day().split(System.lineSeparator())).map(Move::new).toArray(Move[]::new); + this.moves = Arrays.stream(day().split(System.lineSeparator())).map(Move::parse).toArray(Move[]::new); } public static void main(String[] args) { new Day22().printParts(); } - @AllArgsConstructor enum Action { + enum Action { DEAL_WITH_INCREMENT("deal with increment "), DEAL_NEW_STACK("deal into new stack"), CUT("cut "); String name; + private Action(String name){ + this.name = name; + } + public static Action actionByText(String text) { return Arrays.stream(values()).filter(a -> text.startsWith(a.name)).findAny().get(); } } - @Value @Data class Move { - Action action; - int amount; + record Move (Action action, int amount) { - public Move(String s) { - this.action = Action.actionByText(s); + public static Move parse(String s) { + Action action = Action.actionByText(s); s = s.replace(action.name, ""); - if(!s.isEmpty()) amount = Integer.parseInt(s); - else amount = 0; + return new Move(action, !s.isEmpty() ? Integer.parseInt(s) : 0); } public List execute(List cards) { @@ -87,7 +82,7 @@ public void execute(BigInteger[] input, BigInteger deckSize) { } } - private BigInteger num(long n) { + private static BigInteger num(long n) { return new BigInteger(Long.toString(n)); } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day24.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day24.java index bf41bf19..a9190498 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day24.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day24.java @@ -1,7 +1,9 @@ package com.sbaars.adventofcode.year19.days; -import java.awt.Point; -import java.io.IOException; +import com.sbaars.adventofcode.common.grid.CharGrid; +import com.sbaars.adventofcode.common.grid.Grid; +import com.sbaars.adventofcode.year19.Day2019; +import java.awt.*; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; @@ -13,23 +15,12 @@ import java.util.stream.IntStream; import java.util.stream.Stream; -import com.sbaars.adventofcode.common.Day; - -import com.sbaars.adventofcode.year19.Day2019; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; - public class Day24 extends Day2019 { private final Set grids = new HashSet<>(); private Map layers = new HashMap<>(); private final char[][] initialGrid; - @EqualsAndHashCode @AllArgsConstructor @Data class Grid{ - char[][] grid; - } - public Day24() { super(24); this.initialGrid = dayGrid(); @@ -43,7 +34,7 @@ public static void main(String[] args) { public Object part1() { char[][] grid = initialGrid; while(true) { - if(!grids.add(new Grid(grid))) return calcRes(grid); + if(!grids.add(new CharGrid(grid))) return calcRes(grid); char[][] newGrid = copy(grid); final char[][] g = grid; streamGrid(grid).forEach(p -> simulate(g, newGrid, p)); diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day3.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day3.java index 4c58d394..f784ba3c 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day3.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day3.java @@ -1,16 +1,13 @@ package com.sbaars.adventofcode.year19.days; -import com.sbaars.adventofcode.common.Day; +import com.google.common.base.Objects; import com.sbaars.adventofcode.common.Direction; -import java.awt.Point; -import java.io.IOException; +import com.sbaars.adventofcode.year19.Day2019; +import java.awt.*; import java.util.Arrays; import java.util.HashSet; import java.util.Set; -import com.sbaars.adventofcode.year19.Day2019; -import lombok.EqualsAndHashCode; - public class Day3 extends Day2019 { private Set intersect; @@ -87,10 +84,10 @@ public Walk(String code) { } } - @EqualsAndHashCode class Step { + class Step { private final Point point; - @EqualsAndHashCode.Exclude private int steps; - @EqualsAndHashCode.Exclude private boolean isCombined = false; + private int steps; + private boolean isCombined = false; public Step(Point point, int steps) { this.point = point; @@ -103,5 +100,18 @@ public void combine(Step step) { isCombined = true; } } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Step step = (Step) o; + return Objects.equal(point, step.point); + } + + @Override + public int hashCode() { + return Objects.hashCode(point); + } } } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day1.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day1.java index a08bf2ce..0ce40d61 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day1.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day1.java @@ -1,7 +1,7 @@ package com.sbaars.adventofcode.year20.days; import com.sbaars.adventofcode.year20.Day2020; -import java.util.stream.LongStream; +import java.util.Arrays; public class Day1 extends Day2020 { public static void main(String[] args) { @@ -14,9 +14,9 @@ public Day1() { @Override public Object part1() { - LongStream nums = dayNumberStream(); - return nums.flatMap(a -> - nums.filter(b -> a + b == 2020L).map(b -> a * b) + long[] nums = dayNumbers(); + return Arrays.stream(nums).flatMap(a -> + Arrays.stream(nums).filter(b -> a + b == 2020L).map(b -> a * b) ).findAny().getAsLong(); } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day12.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day12.java index efe7a285..1b25a2de 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day12.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day12.java @@ -1,17 +1,15 @@ package com.sbaars.adventofcode.year20.days; +import static com.sbaars.adventofcode.common.Direction.EAST; +import static com.sbaars.adventofcode.common.Direction.turnDegrees; +import static java.lang.Math.abs; +import static java.util.stream.Collectors.toList; + import com.sbaars.adventofcode.common.Direction; import com.sbaars.adventofcode.year20.Day2020; -import lombok.Data; -import lombok.Value; - import java.awt.*; import java.util.List; -import static com.sbaars.adventofcode.common.Direction.*; -import static java.lang.Math.abs; -import static java.util.stream.Collectors.toList; - public class Day12 extends Day2020 { public static void main(String[] args) { new Day12().printParts(); @@ -41,12 +39,7 @@ private List convertInput() { return dayStream().map(e -> new Flight(e.charAt(0), Integer.parseInt(e.substring(1)))).collect(toList()); } - @Data - @Value - class Flight { - char dir; - int distance; - } + record Flight (char dir, int distance) {} @Override public Object part2() { diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day14.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day14.java index 7ad80751..061bf76a 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day14.java @@ -1,21 +1,18 @@ package com.sbaars.adventofcode.year20.days; -import com.sbaars.adventofcode.common.ReadsFormattedString; -import com.sbaars.adventofcode.year20.Day2020; -import lombok.Data; -import lombok.Value; - -import java.util.*; -import org.apache.commons.text.TextStringBuilder; - import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; -import static java.lang.Integer.parseInt; import static java.lang.Long.parseLong; import static java.lang.Long.toBinaryString; -import static java.util.Arrays.stream; import static java.util.Optional.empty; import static java.util.Optional.of; -import static java.util.stream.IntStream.range; + +import com.sbaars.adventofcode.year20.Day2020; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import org.apache.commons.text.TextStringBuilder; public class Day14 extends Day2020 { public static void main(String[] args) { @@ -38,23 +35,14 @@ public Object part1() { return memory.values().stream().mapToLong(e -> e).sum(); } - @Data - @Value - public static class Instruction { - String mem; - String value; + public static record Instruction (String mem, String value) { public Optional getMem(){ return mem.startsWith("mem") ? of(readString(mem+value, "mem[%n]%n", Mem.class)) : empty(); } } - @Data - @Value - public static class Mem { - long index; - long value; - } + public static record Mem (long index, long value) {} @Override public Object part2() { diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day2.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day2.java index 205ea868..1e26adc5 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day2.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day2.java @@ -28,7 +28,7 @@ public static Password mapPassword(String s) { return readString(s, "%n-%n %c: %s", Password.class); } - record Password (long lower, long higher, char character, String password) { + public record Password (long lower, long higher, char character, String password) { public boolean isValid() { long count = password.chars().filter(c -> c == character).count(); diff --git a/src/main/java/com/sbaars/adventofcode/year20/gamepad/Gamepad.java b/src/main/java/com/sbaars/adventofcode/year20/gamepad/Gamepad.java index 9cf12607..cf18bf7e 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/gamepad/Gamepad.java +++ b/src/main/java/com/sbaars/adventofcode/year20/gamepad/Gamepad.java @@ -1,59 +1,66 @@ package com.sbaars.adventofcode.year20.gamepad; -import static java.util.Arrays.stream; - import java.util.stream.Stream; -import lombok.AllArgsConstructor; -import lombok.Data; public class Gamepad { - private final Instruction[] instructions; - private long acc = 0; - private int current = 0; - - public Gamepad(Stream input){ - this.instructions = input.map(s -> s.replace("+", "")) - .map(s -> s.split(" ")) - .map(s -> new Instruction(s[0], Long.parseLong(s[1]))) - .toArray(Instruction[]::new); - } + private final Instruction[] instructions; + private long acc = 0; + private int current = 0; - public int executeInstruction(){ - Instruction instruction = instructions[current]; - switch (instruction.operation) { - case "acc": acc += instruction.number; break; - case "jmp": current += instruction.number - 1; break; - case "nop": break; - default: throw new IllegalStateException(); - } - return current++; - } + public Gamepad(Stream input) { + this.instructions = input.map(s -> s.replace("+", "")) + .map(s -> s.split(" ")) + .map(s -> new Instruction(s[0], Long.parseLong(s[1]))) + .toArray(Instruction[]::new); + } - public void replaceInstruction(String instruction, String replacement, int occurrence) { - Instruction[] those = stream(instructions).filter(e -> e.operation.equals(instruction)).toArray(Instruction[]::new); - those[occurrence].operation = replacement; + public int executeInstruction() { + Instruction instruction = instructions[current]; + switch (instruction.operation) { + case "acc": + acc += instruction.number; + break; + case "jmp": + current += instruction.number - 1; + break; + case "nop": + break; + default: + throw new IllegalStateException(); } + return current++; + } - public Instruction[] getInstructions(){ - return instructions; + public void replaceInstruction(String instruction, String replacement, int occurrence) { + int numMatch = 0; + for(int i = 0; i Date: Sun, 7 Nov 2021 20:48:35 +0100 Subject: [PATCH 235/433] Clean up code --- .../common/CircularLinkedList.java | 119 +++--- .../com/sbaars/adventofcode/common/Day.java | 173 ++++----- .../sbaars/adventofcode/common/Direction.java | 256 +++++++------ .../adventofcode/common/HexDirection.java | 98 ++--- .../adventofcode/common/ProcessesImages.java | 6 +- .../common/ReadsFormattedString.java | 81 ++-- .../adventofcode/common/SmartArray.java | 80 ++-- .../adventofcode/common/grid/CharGrid.java | 6 +- .../sbaars/adventofcode/common/grid/Grid.java | 2 +- .../common/grid/InfiniteGrid.java | 8 +- .../haskell/year20/HaskellDay2020.java | 67 ++-- .../haskell/year20/days/Day1.java | 30 +- .../haskell/year20/days/Day10.java | 28 +- .../haskell/year20/days/Day11.java | 34 +- .../haskell/year20/days/Day2.java | 32 +- .../haskell/year20/days/Day3.java | 35 +- .../haskell/year20/days/Day4.java | 39 +- .../haskell/year20/days/Day5.java | 30 +- .../haskell/year20/days/Day6.java | 34 +- .../haskell/year20/days/Day7.java | 41 +- .../haskell/year20/days/Day8.java | 32 +- .../haskell/year20/days/Day9.java | 28 +- .../sbaars/adventofcode/util/FetchInput.java | 16 +- .../sbaars/adventofcode/year18/Day2018.java | 6 +- .../com/sbaars/adventofcode/year18/Main.java | 14 +- .../sbaars/adventofcode/year18/days/Day1.java | 49 ++- .../sbaars/adventofcode/year19/Day2019.java | 6 +- .../com/sbaars/adventofcode/year19/Main.java | 19 +- .../sbaars/adventofcode/year19/days/Day1.java | 58 ++- .../adventofcode/year19/days/Day10.java | 128 +++---- .../adventofcode/year19/days/Day11.java | 104 +++-- .../adventofcode/year19/days/Day12.java | 169 ++++----- .../adventofcode/year19/days/Day13.java | 110 +++--- .../adventofcode/year19/days/Day14.java | 171 +++++---- .../adventofcode/year19/days/Day15.java | 167 ++++---- .../adventofcode/year19/days/Day16.java | 97 +++-- .../adventofcode/year19/days/Day17.java | 269 ++++++------- .../adventofcode/year19/days/Day18.java | 18 +- .../adventofcode/year19/days/Day19.java | 54 +-- .../sbaars/adventofcode/year19/days/Day2.java | 71 ++-- .../adventofcode/year19/days/Day20.java | 234 ++++++------ .../adventofcode/year19/days/Day21.java | 80 ++-- .../adventofcode/year19/days/Day22.java | 216 +++++------ .../adventofcode/year19/days/Day23.java | 92 ++--- .../adventofcode/year19/days/Day24.java | 244 ++++++------ .../adventofcode/year19/days/Day25.java | 84 ++--- .../sbaars/adventofcode/year19/days/Day3.java | 216 ++++++----- .../sbaars/adventofcode/year19/days/Day4.java | 100 +++-- .../sbaars/adventofcode/year19/days/Day5.java | 37 +- .../sbaars/adventofcode/year19/days/Day6.java | 117 +++--- .../sbaars/adventofcode/year19/days/Day7.java | 124 +++--- .../sbaars/adventofcode/year19/days/Day8.java | 107 +++--- .../sbaars/adventofcode/year19/days/Day9.java | 29 +- .../year19/intcode/IntcodeComputer.java | 355 ++++++++++-------- .../year19/intcode/RetentionPolicy.java | 2 +- .../year19/pathfinding/CharGrid2d.java | 226 ++++++----- .../year19/pathfinding/Grid2d.java | 224 ++++++----- .../adventofcode/year19/pathfinding/Node.java | 56 ++- .../year19/pathfinding/PathFinding.java | 112 +++--- .../adventofcode/year19/util/CountMap.java | 98 ++--- .../year19/util/LongCountMap.java | 98 ++--- .../sbaars/adventofcode/year20/Day2020.java | 6 +- .../com/sbaars/adventofcode/year20/Main.java | 16 +- .../sbaars/adventofcode/year20/days/Day1.java | 50 +-- .../adventofcode/year20/days/Day10.java | 83 ++-- .../adventofcode/year20/days/Day11.java | 155 ++++---- .../adventofcode/year20/days/Day12.java | 90 +++-- .../adventofcode/year20/days/Day13.java | 68 ++-- .../adventofcode/year20/days/Day14.java | 127 +++---- .../adventofcode/year20/days/Day15.java | 50 +-- .../adventofcode/year20/days/Day16.java | 101 +++-- .../adventofcode/year20/days/Day17.java | 178 ++++----- .../adventofcode/year20/days/Day18.java | 107 +++--- .../adventofcode/year20/days/Day19.java | 208 +++++----- .../sbaars/adventofcode/year20/days/Day2.java | 58 +-- .../adventofcode/year20/days/Day20.java | 184 ++++----- .../adventofcode/year20/days/Day21.java | 96 ++--- .../adventofcode/year20/days/Day22.java | 150 ++++---- .../adventofcode/year20/days/Day23.java | 87 +++-- .../adventofcode/year20/days/Day24.java | 126 ++++--- .../adventofcode/year20/days/Day25.java | 54 +-- .../sbaars/adventofcode/year20/days/Day3.java | 46 +-- .../sbaars/adventofcode/year20/days/Day4.java | 88 ++--- .../sbaars/adventofcode/year20/days/Day5.java | 70 ++-- .../sbaars/adventofcode/year20/days/Day6.java | 42 +-- .../sbaars/adventofcode/year20/days/Day7.java | 146 +++---- .../sbaars/adventofcode/year20/days/Day8.java | 50 +-- .../sbaars/adventofcode/year20/days/Day9.java | 68 ++-- .../adventofcode/year20/gamepad/Gamepad.java | 6 +- 89 files changed, 4073 insertions(+), 4073 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/common/CircularLinkedList.java b/src/main/java/com/sbaars/adventofcode/common/CircularLinkedList.java index 98a76518..37604b83 100644 --- a/src/main/java/com/sbaars/adventofcode/common/CircularLinkedList.java +++ b/src/main/java/com/sbaars/adventofcode/common/CircularLinkedList.java @@ -3,80 +3,77 @@ import java.util.HashMap; import java.util.Map; -import static java.util.stream.IntStream.range; - /** * A circular linked list of fixed length where all operations are O(1) */ public class CircularLinkedList { - public class Node{ - public int value; - public Node prev; - public Node next; + private final Map valueMap = new HashMap<>(); + private Node current; + public CircularLinkedList(int[] elements) { + Node prev = null; + Node first = null; + for (int element : elements) { + Node n = new Node(); + n.value = element; + n.prev = prev; + valueMap.put(element, n); + if (prev != null) prev.next = n; + else first = n; + prev = n; } + prev.next = first; + first.prev = prev; + this.current = first; + } - private Node current; - private final Map valueMap = new HashMap<>(); + public int current() { + return current.value; + } - public CircularLinkedList(int[] elements){ - Node prev = null; - Node first = null; - for (int element : elements) { - Node n = new Node(); - n.value = element; - n.prev = prev; - valueMap.put(element, n); - if (prev != null) prev.next = n; - else first = n; - prev = n; - } - prev.next = first; - first.prev = prev; - this.current = first; - } + public void next() { + current = current.next; + } - public int current(){ - return current.value; + public int[] next(int n) { + int[] arr = new int[n]; + Node node = current; + for (int i = 0; i < n; i++) { + node = node.next; + arr[i] = node.value; } + return arr; + } - public void next(){ - current = current.next; - } - - public int[] next(int n){ - int[] arr = new int[n]; - Node node = current; - for(int i = 0; i dayStream() { - return dayStream(DEFAULT_DELIMITER); - } - - protected Stream dayStream(String delimiter) { - return Arrays.stream(day().split(delimiter)); - } - - protected IntStream dayIntStream() { - return dayIntStream(DEFAULT_DELIMITER); - } - - protected IntStream dayIntStream(String delimiter) { - return Arrays.stream(day().split(delimiter)).mapToInt(Integer::parseInt); - } - - protected long[] dayNumbers() { - return dayNumbers(DEFAULT_DELIMITER); - } - - protected long[] dayNumbers(String delimiter) { - return dayNumberStream(delimiter).toArray(); - } - - protected double[] dayDoubles() { - return dayDoubles(DEFAULT_DELIMITER); - } - - protected double[] dayDoubles(String delimiter) { - return dayStream(delimiter).mapToDouble(Double::parseDouble).toArray(); - } - - protected LongStream dayNumberStream() { - return dayNumberStream(DEFAULT_DELIMITER); - } - - protected LongStream dayNumberStream(String delimiter) { - return dayStream(delimiter).mapToLong(Long::parseLong); - } - - protected char[][] dayGrid() { - return dayGrid(DEFAULT_DELIMITER); - } - - protected char[][] dayGrid(String delimiter) { - return dayStream(delimiter).map(String::toCharArray).toArray(char[][]::new); - } + private static final String DEFAULT_DELIMITER = System.lineSeparator(); + protected final int year; + protected final int day; + + public Day(int year, int day) { + this.year = year; + this.day = day; + } + + public static String getResourceAsString(String resource) { + try { + return readFileToString(new File(Day.class.getClassLoader().getResource(resource).getFile())); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + public abstract Object part1(); + + public abstract Object part2(); + + public void printParts() { + System.out.println("Part 1: " + part1()); + System.out.println("Part 2: " + part2()); + } + + protected String day() { + return getResourceAsString(year + "/day" + day + ".txt"); + } + + protected String[] dayStrings() { + return dayStrings(DEFAULT_DELIMITER); + } + + protected String[] dayStrings(String delimiter) { + return Arrays.stream(day().split(delimiter)).toArray(String[]::new); + } + + protected Stream dayStream() { + return dayStream(DEFAULT_DELIMITER); + } + + protected Stream dayStream(String delimiter) { + return Arrays.stream(day().split(delimiter)); + } + + protected IntStream dayIntStream() { + return dayIntStream(DEFAULT_DELIMITER); + } + + protected IntStream dayIntStream(String delimiter) { + return Arrays.stream(day().split(delimiter)).mapToInt(Integer::parseInt); + } + + protected long[] dayNumbers() { + return dayNumbers(DEFAULT_DELIMITER); + } + + protected long[] dayNumbers(String delimiter) { + return dayNumberStream(delimiter).toArray(); + } + + protected double[] dayDoubles() { + return dayDoubles(DEFAULT_DELIMITER); + } + + protected double[] dayDoubles(String delimiter) { + return dayStream(delimiter).mapToDouble(Double::parseDouble).toArray(); + } + + protected LongStream dayNumberStream() { + return dayNumberStream(DEFAULT_DELIMITER); + } + + protected LongStream dayNumberStream(String delimiter) { + return dayStream(delimiter).mapToLong(Long::parseLong); + } + + protected char[][] dayGrid() { + return dayGrid(DEFAULT_DELIMITER); + } + + protected char[][] dayGrid(String delimiter) { + return dayStream(delimiter).map(String::toCharArray).toArray(char[][]::new); + } } diff --git a/src/main/java/com/sbaars/adventofcode/common/Direction.java b/src/main/java/com/sbaars/adventofcode/common/Direction.java index 70167cd8..bb404274 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Direction.java +++ b/src/main/java/com/sbaars/adventofcode/common/Direction.java @@ -1,126 +1,142 @@ package com.sbaars.adventofcode.common; -import java.awt.Point; -import java.util.Arrays; - import static java.lang.Math.abs; +import java.awt.*; +import java.util.Arrays; + public enum Direction { - NORTH(1, 'U'), EAST(4, 'R'), SOUTH(2, 'D'), WEST(3, 'L'), - NORTHEAST(4, 'E'), EASTSOUTH(5, 'E'), SOUTHWEST(6, 'E'), WESTNORTH(7, 'E'); - - public final int num; - public final int code; - - Direction(int num, char code) { - this.num = num; - this.code = code; - } - - public static Direction getByDirCode(char code) { - return Arrays.stream(values()).filter(e -> e.code == code).findAny().get(); - } - - public static Direction getByDir(char code) { - return Arrays.stream(values()).filter(e -> e.name().charAt(0) == code).findAny().get(); - } - - public Direction turn(boolean right) { - int cur = ordinal() + (right ? 1 : -1); - if(cur == fourDirections().length) cur = 0; - else if(cur == -1) cur = 3; - return fourDirections()[cur]; - } - - public Point move(Point currentLocation, int amount) { - switch (this) { - case SOUTH: return new Point(currentLocation.x, currentLocation.y+amount); - case NORTH: return new Point(currentLocation.x, currentLocation.y-amount); - case EAST: return new Point(currentLocation.x+amount, currentLocation.y); - case WEST: return new Point(currentLocation.x-amount, currentLocation.y); - case SOUTHWEST: return new Point(currentLocation.x-amount, currentLocation.y+amount); - case NORTHEAST: return new Point(currentLocation.x+amount, currentLocation.y-amount); - case EASTSOUTH: return new Point(currentLocation.x+amount, currentLocation.y+amount); - case WESTNORTH: return new Point(currentLocation.x-amount, currentLocation.y-amount); - } - throw new IllegalStateException("Non-existent Direction: "+this); - } - - public char getInGrid(char[][] grid, Point p, char none){ - if(p.x>=0 && p.x=0 && p.y from.x) return EAST; - else if(to.x < from.x) return WEST; - else if(to.y > from.y) return SOUTH; - else if(to.y < from.y) return NORTH; - throw new IllegalStateException("From and to location are the same: "+from+", "+to); - } - - public boolean leftOf(Direction robotDir) { - int n = this.ordinal()-1; - if(n == -1) n = values().length-1; - return robotDir.ordinal() == n; - } - - public Direction turnDegrees(int degrees, boolean right){ - int num = degrees % 360; - Direction dir = this; - while(num>0){ - dir = turn(right); - num-=90; - } - return dir; - } - - public Direction turnDegrees(int degrees){ - return turnDegrees(abs(degrees), degrees > 0); - } - - public static Point turn(Point w, boolean b) { - return b ? new Point(-w.y, w.x) : new Point(w.y, -w.x); - } - - public static Point turnDegrees(Point w, int distance, boolean b) { - int num = distance % 360; - while(num>0){ - w = turn(w, b); - num-=90; - } - return w; - } - - public static Point turnDegrees(Point w, int distance) { - return turnDegrees(w, abs(distance), distance > 0); - } - - public static Direction[] fourDirections(){ - return new Direction[]{NORTH, EAST, SOUTH, WEST}; - } + NORTH(1, 'U'), EAST(4, 'R'), SOUTH(2, 'D'), WEST(3, 'L'), + NORTHEAST(4, 'E'), EASTSOUTH(5, 'E'), SOUTHWEST(6, 'E'), WESTNORTH(7, 'E'); + + public final int num; + public final int code; + + Direction(int num, char code) { + this.num = num; + this.code = code; + } + + public static Direction getByDirCode(char code) { + return Arrays.stream(values()).filter(e -> e.code == code).findAny().get(); + } + + public static Direction getByDir(char code) { + return Arrays.stream(values()).filter(e -> e.name().charAt(0) == code).findAny().get(); + } + + public static Direction getByMove(Point from, Point to) { + if (to.x > from.x) return EAST; + else if (to.x < from.x) return WEST; + else if (to.y > from.y) return SOUTH; + else if (to.y < from.y) return NORTH; + throw new IllegalStateException("From and to location are the same: " + from + ", " + to); + } + + public static Point turn(Point w, boolean b) { + return b ? new Point(-w.y, w.x) : new Point(w.y, -w.x); + } + + public static Point turnDegrees(Point w, int distance, boolean b) { + int num = distance % 360; + while (num > 0) { + w = turn(w, b); + num -= 90; + } + return w; + } + + public static Point turnDegrees(Point w, int distance) { + return turnDegrees(w, abs(distance), distance > 0); + } + + public static Direction[] fourDirections() { + return new Direction[]{NORTH, EAST, SOUTH, WEST}; + } + + public Direction turn(boolean right) { + int cur = ordinal() + (right ? 1 : -1); + if (cur == fourDirections().length) cur = 0; + else if (cur == -1) cur = 3; + return fourDirections()[cur]; + } + + public Point move(Point currentLocation, int amount) { + switch (this) { + case SOUTH: + return new Point(currentLocation.x, currentLocation.y + amount); + case NORTH: + return new Point(currentLocation.x, currentLocation.y - amount); + case EAST: + return new Point(currentLocation.x + amount, currentLocation.y); + case WEST: + return new Point(currentLocation.x - amount, currentLocation.y); + case SOUTHWEST: + return new Point(currentLocation.x - amount, currentLocation.y + amount); + case NORTHEAST: + return new Point(currentLocation.x + amount, currentLocation.y - amount); + case EASTSOUTH: + return new Point(currentLocation.x + amount, currentLocation.y + amount); + case WESTNORTH: + return new Point(currentLocation.x - amount, currentLocation.y - amount); + } + throw new IllegalStateException("Non-existent Direction: " + this); + } + + public char getInGrid(char[][] grid, Point p, char none) { + if (p.x >= 0 && p.x < grid.length && p.y >= 0 && p.y < grid[0].length) { + return grid[p.x][p.y]; + } + return none; + } + + public char getInGrid(char[][] grid, Point p) { + return getInGrid(grid, p, '.'); + } + + public Point move(Point currentLocation) { + return move(currentLocation, 1); + } + + public Direction opposite() { + switch (this) { + case NORTH: + return SOUTH; + case SOUTH: + return NORTH; + case EAST: + return WEST; + case WEST: + return EAST; + case NORTHEAST: + return SOUTHWEST; + case SOUTHWEST: + return NORTHEAST; + case EASTSOUTH: + return WESTNORTH; + case WESTNORTH: + return EASTSOUTH; + } + throw new IllegalStateException("Non-existent Direction: " + this); + } + + public boolean leftOf(Direction robotDir) { + int n = this.ordinal() - 1; + if (n == -1) n = values().length - 1; + return robotDir.ordinal() == n; + } + + public Direction turnDegrees(int degrees, boolean right) { + int num = degrees % 360; + Direction dir = this; + while (num > 0) { + dir = turn(right); + num -= 90; + } + return dir; + } + + public Direction turnDegrees(int degrees) { + return turnDegrees(abs(degrees), degrees > 0); + } } \ No newline at end of file diff --git a/src/main/java/com/sbaars/adventofcode/common/HexDirection.java b/src/main/java/com/sbaars/adventofcode/common/HexDirection.java index 2e00c9e4..7ac6d8d3 100644 --- a/src/main/java/com/sbaars/adventofcode/common/HexDirection.java +++ b/src/main/java/com/sbaars/adventofcode/common/HexDirection.java @@ -4,49 +4,59 @@ import java.util.Arrays; import java.util.Optional; -import static java.lang.Math.abs; - public enum HexDirection { - NORTHWEST(1, "nw"), EAST(4, "e"), SOUTHEAST(2, "se"), WEST(3, "w"), - NORTHEAST(4, "ne"), SOUTHWEST(5, "sw"); - - public final int num; - public final String code; - - HexDirection(int num, String code) { - this.num = num; - this.code = code; - } - - public static Optional get(String code) { - return Arrays.stream(values()).filter(e -> e.code.equals(code)).findAny(); - } - - public Point move(Point currentLocation, int amount) { - switch (this) { - case EAST: return new Point(currentLocation.x+(amount*2), currentLocation.y); - case WEST: return new Point(currentLocation.x-(amount*2), currentLocation.y); - case SOUTHWEST: return new Point(currentLocation.x-amount, currentLocation.y+amount); - case NORTHEAST: return new Point(currentLocation.x+amount, currentLocation.y-amount); - case SOUTHEAST: return new Point(currentLocation.x+amount, currentLocation.y+amount); - case NORTHWEST: return new Point(currentLocation.x-amount, currentLocation.y-amount); - } - throw new IllegalStateException("Non-existent Direction: "+this); - } - - public Point move(Point currentLocation) { - return move(currentLocation, 1); - } - - public HexDirection opposite() { - switch (this) { - case EAST: return WEST; - case WEST: return EAST; - case NORTHEAST: return SOUTHWEST; - case SOUTHWEST: return NORTHEAST; - case SOUTHEAST: return NORTHWEST; - case NORTHWEST: return SOUTHEAST; - } - throw new IllegalStateException("Non-existent Direction: "+this); - } + NORTHWEST(1, "nw"), EAST(4, "e"), SOUTHEAST(2, "se"), WEST(3, "w"), + NORTHEAST(4, "ne"), SOUTHWEST(5, "sw"); + + public final int num; + public final String code; + + HexDirection(int num, String code) { + this.num = num; + this.code = code; + } + + public static Optional get(String code) { + return Arrays.stream(values()).filter(e -> e.code.equals(code)).findAny(); + } + + public Point move(Point currentLocation, int amount) { + switch (this) { + case EAST: + return new Point(currentLocation.x + (amount * 2), currentLocation.y); + case WEST: + return new Point(currentLocation.x - (amount * 2), currentLocation.y); + case SOUTHWEST: + return new Point(currentLocation.x - amount, currentLocation.y + amount); + case NORTHEAST: + return new Point(currentLocation.x + amount, currentLocation.y - amount); + case SOUTHEAST: + return new Point(currentLocation.x + amount, currentLocation.y + amount); + case NORTHWEST: + return new Point(currentLocation.x - amount, currentLocation.y - amount); + } + throw new IllegalStateException("Non-existent Direction: " + this); + } + + public Point move(Point currentLocation) { + return move(currentLocation, 1); + } + + public HexDirection opposite() { + switch (this) { + case EAST: + return WEST; + case WEST: + return EAST; + case NORTHEAST: + return SOUTHWEST; + case SOUTHWEST: + return NORTHEAST; + case SOUTHEAST: + return NORTHWEST; + case NORTHWEST: + return SOUTHEAST; + } + throw new IllegalStateException("Non-existent Direction: " + this); + } } \ No newline at end of file diff --git a/src/main/java/com/sbaars/adventofcode/common/ProcessesImages.java b/src/main/java/com/sbaars/adventofcode/common/ProcessesImages.java index 752a4e47..86c17836 100644 --- a/src/main/java/com/sbaars/adventofcode/common/ProcessesImages.java +++ b/src/main/java/com/sbaars/adventofcode/common/ProcessesImages.java @@ -4,7 +4,7 @@ import java.util.stream.Collectors; public interface ProcessesImages { - default String printAsciiArray(int[][] pixels) { - return System.lineSeparator()+Arrays.stream(pixels).map(a -> Arrays.stream(a).boxed().map(x -> x == 0 ? " " : "â–ˆ").collect(Collectors.joining())).collect(Collectors.joining(System.lineSeparator())); - } + default String printAsciiArray(int[][] pixels) { + return System.lineSeparator() + Arrays.stream(pixels).map(a -> Arrays.stream(a).boxed().map(x -> x == 0 ? " " : "â–ˆ").collect(Collectors.joining())).collect(Collectors.joining(System.lineSeparator())); + } } diff --git a/src/main/java/com/sbaars/adventofcode/common/ReadsFormattedString.java b/src/main/java/com/sbaars/adventofcode/common/ReadsFormattedString.java index 75b32015..dc4fedc7 100644 --- a/src/main/java/com/sbaars/adventofcode/common/ReadsFormattedString.java +++ b/src/main/java/com/sbaars/adventofcode/common/ReadsFormattedString.java @@ -5,47 +5,54 @@ import java.util.List; public interface ReadsFormattedString { - static T readString(String s, String pattern, Class target){ - List mappedObjs = new ArrayList<>(); - while(s.length()>0){ - if(pattern.length() > 1 && pattern.charAt(0) == '%'){ - int size = mappedObjs.size(); - switch(pattern.charAt(1)){ - case 'n': mappedObjs.add(crunchNumber(s, pattern)); break; - case 'c': mappedObjs.add(s.charAt(0)); break; - case 's': mappedObjs.add(crunchString(s, pattern)); break; - default: break; - } - if(mappedObjs.size() != size){ - s = s.substring(mappedObjs.get(size).toString().length()); - pattern = pattern.substring(2); - continue; - } - } - if(pattern.charAt(0) == s.charAt(0)){ - s = s.substring(1); - pattern = pattern.substring(1); - } else { - throw new IllegalStateException("Illegal crunch, pattern = "+pattern+" and s = "+s); - } + static T readString(String s, String pattern, Class target) { + List mappedObjs = new ArrayList<>(); + while (s.length() > 0) { + if (pattern.length() > 1 && pattern.charAt(0) == '%') { + int size = mappedObjs.size(); + switch (pattern.charAt(1)) { + case 'n': + mappedObjs.add(crunchNumber(s, pattern)); + break; + case 'c': + mappedObjs.add(s.charAt(0)); + break; + case 's': + mappedObjs.add(crunchString(s, pattern)); + break; + default: + break; } - try { - return (T)Arrays.stream(target.getConstructors()).filter(c -> c.getParameterCount() == mappedObjs.size()).findAny().get()//.getConstructor(mappedObjs.stream().map(Object::getClass).toArray(Class[]::new)) - .newInstance(mappedObjs.toArray()); - } catch (Exception e){ - throw new RuntimeException(e); + if (mappedObjs.size() != size) { + s = s.substring(mappedObjs.get(size).toString().length()); + pattern = pattern.substring(2); + continue; } + } + if (pattern.charAt(0) == s.charAt(0)) { + s = s.substring(1); + pattern = pattern.substring(1); + } else { + throw new IllegalStateException("Illegal crunch, pattern = " + pattern + " and s = " + s); + } } - - static long crunchNumber(String s, String pattern){ - return Long.parseLong(crunchString(s, pattern)); + try { + return (T) Arrays.stream(target.getConstructors()).filter(c -> c.getParameterCount() == mappedObjs.size()).findAny().get()//.getConstructor(mappedObjs.stream().map(Object::getClass).toArray(Class[]::new)) + .newInstance(mappedObjs.toArray()); + } catch (Exception e) { + throw new RuntimeException(e); } + } - static String crunchString(String s, String pattern){ - return pattern.length() > 2 ? s.substring(0, s.indexOf(pattern.charAt(2))) : s; - } + static long crunchNumber(String s, String pattern) { + return Long.parseLong(crunchString(s, pattern)); + } - default int i (long n){ - return Math.toIntExact(n); - } + static String crunchString(String s, String pattern) { + return pattern.length() > 2 ? s.substring(0, s.indexOf(pattern.charAt(2))) : s; + } + + default int i(long n) { + return Math.toIntExact(n); + } } diff --git a/src/main/java/com/sbaars/adventofcode/common/SmartArray.java b/src/main/java/com/sbaars/adventofcode/common/SmartArray.java index 6e1d7fed..34f0fde1 100644 --- a/src/main/java/com/sbaars/adventofcode/common/SmartArray.java +++ b/src/main/java/com/sbaars/adventofcode/common/SmartArray.java @@ -1,51 +1,51 @@ package com.sbaars.adventofcode.common; -import java.util.*; - -import static com.google.common.primitives.Ints.asList; import static java.util.stream.IntStream.range; +import java.util.HashMap; +import java.util.Map; + /** * A set of fixed length where all operations are O(1) */ public class SmartArray { - private final int[] order; - private final int[] elements; - private final Map elementIndex = new HashMap<>(); - - public SmartArray(int[] elements){ - this.elements = elements; - this.order = range(0, elements.length).toArray(); - for(int i = 0; i elementIndex = new HashMap<>(); + + public SmartArray(int[] elements) { + this.elements = elements; + this.order = range(0, elements.length).toArray(); + for (int i = 0; i < elements.length; i++) { + elementIndex.put(elements[i], order[i]); } - - public int size(){ - return order.length; - } - - public int indexOf(int element){ - return elementIndex.get(element); - } - - public int[] toArray(){ - int[] arr = new int[order.length]; - for(int i = 0; i new String(c).chars().anyMatch(i -> i == e)).count()); } - public IntStream iterate(){ + public IntStream iterate() { return Arrays.stream(grid).map(String::new).flatMapToInt(String::chars); } } diff --git a/src/main/java/com/sbaars/adventofcode/common/grid/Grid.java b/src/main/java/com/sbaars/adventofcode/common/grid/Grid.java index def26320..13bf364d 100644 --- a/src/main/java/com/sbaars/adventofcode/common/grid/Grid.java +++ b/src/main/java/com/sbaars/adventofcode/common/grid/Grid.java @@ -3,7 +3,7 @@ import java.util.stream.IntStream; public interface Grid { - default int countChar(char...c){ + default int countChar(char... c) { return Math.toIntExact(iterate().filter(e -> new String(c).chars().anyMatch(i -> i == e)).count()); } diff --git a/src/main/java/com/sbaars/adventofcode/common/grid/InfiniteGrid.java b/src/main/java/com/sbaars/adventofcode/common/grid/InfiniteGrid.java index 17b98654..b2eb3613 100644 --- a/src/main/java/com/sbaars/adventofcode/common/grid/InfiniteGrid.java +++ b/src/main/java/com/sbaars/adventofcode/common/grid/InfiniteGrid.java @@ -9,15 +9,15 @@ public class InfiniteGrid implements Grid { final Map grid = new HashMap<>(); Point currentPos = new Point(0, 0); - public InfiniteGrid(char[][] g){ - for(int i = 0; i haskellList(){ - return joining(", ", "[", "]"); - } - - protected String tuple(Object...elements){ - return stream(elements).map(Object::toString).collect(joining(", ", "(", ")")); - } - - protected String tup(Object a, Object b){ - return "("+convert(a)+", "+convert(b)+")"; - } - - protected String convert(Object[] a){ - return stream(a).map(this::convert).collect(haskellList()); - } - - protected String convert(List a){ - return a.stream().map(this::convert).collect(haskellList()); - } - - protected String convert(Object a){ - if(a instanceof Number){ - return a.toString(); - } else if (a instanceof Character){ - return "'"+a+"'"; - } - return "\""+a+"\""; - } + protected HaskellDay2020(int day) { + super(day); + } + + protected Collector haskellList() { + return joining(", ", "[", "]"); + } + + protected String tuple(Object... elements) { + return stream(elements).map(Object::toString).collect(joining(", ", "(", ")")); + } + + protected String tup(Object a, Object b) { + return "(" + convert(a) + ", " + convert(b) + ")"; + } + + protected String convert(Object[] a) { + return stream(a).map(this::convert).collect(haskellList()); + } + + protected String convert(List a) { + return a.stream().map(this::convert).collect(haskellList()); + } + + protected String convert(Object a) { + if (a instanceof Number) { + return a.toString(); + } else if (a instanceof Character) { + return "'" + a + "'"; + } + return "\"" + a + "\""; + } } diff --git a/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day1.java b/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day1.java index fca2ba8e..203e7ef3 100644 --- a/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day1.java +++ b/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day1.java @@ -2,24 +2,22 @@ import com.sbaars.adventofcode.haskell.year20.HaskellDay2020; -import java.util.stream.Collectors; - public class Day1 extends HaskellDay2020 { - public Day1() { - super(1); - } + public Day1() { + super(1); + } - public static void main(String[] args) { - new Day1().printParts(); - } + public static void main(String[] args) { + new Day1().printParts(); + } - @Override - public Object part1() { - return dayNumberStream().mapToObj(Long::toString).collect(haskellList()); - } + @Override + public Object part1() { + return dayNumberStream().mapToObj(Long::toString).collect(haskellList()); + } - @Override - public Object part2() { - return null; - } + @Override + public Object part2() { + return null; + } } diff --git a/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day10.java b/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day10.java index 60240e9e..2f46a4b1 100644 --- a/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day10.java +++ b/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day10.java @@ -3,21 +3,21 @@ import com.sbaars.adventofcode.haskell.year20.HaskellDay2020; public class Day10 extends HaskellDay2020 { - public Day10() { - super(10); - } + public Day10() { + super(10); + } - public static void main(String[] args) { - new Day10().printParts(); - } + public static void main(String[] args) { + new Day10().printParts(); + } - @Override - public Object part1() { - return dayNumberStream().mapToObj(Long::toString).collect(haskellList()); - } + @Override + public Object part1() { + return dayNumberStream().mapToObj(Long::toString).collect(haskellList()); + } - @Override - public Object part2() { - return null; - } + @Override + public Object part2() { + return null; + } } diff --git a/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day11.java b/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day11.java index d33c5e81..e8feb3b6 100644 --- a/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day11.java +++ b/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day11.java @@ -4,24 +4,24 @@ import java.util.Arrays; public class Day11 extends HaskellDay2020 { - public Day11() { - super(11); - } + public Day11() { + super(11); + } - public static void main(String[] args) { - new Day11().printParts(); - } + public static void main(String[] args) { + new Day11().printParts(); + } - @Override - public Object part1() { - return Arrays.stream(dayGrid()).map(Arrays::toString) - .map(s -> s.replace(".", "False")) - .map(s -> s.replace("L", "True")) - .collect(haskellList()); - } + @Override + public Object part1() { + return Arrays.stream(dayGrid()).map(Arrays::toString) + .map(s -> s.replace(".", "False")) + .map(s -> s.replace("L", "True")) + .collect(haskellList()); + } - @Override - public Object part2() { - return null; - } + @Override + public Object part2() { + return null; + } } diff --git a/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day2.java b/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day2.java index 02f6f46b..fc8d19c3 100644 --- a/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day2.java +++ b/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day2.java @@ -3,23 +3,23 @@ import com.sbaars.adventofcode.haskell.year20.HaskellDay2020; public class Day2 extends HaskellDay2020 { - public Day2() { - super(2); - } + public Day2() { + super(2); + } - public static void main(String[] args) { - new Day2().printParts(); - } + public static void main(String[] args) { + new Day2().printParts(); + } - @Override - public Object part1() { - return dayStream().map(com.sbaars.adventofcode.year20.days.Day2::mapPassword) - .map(p -> tuple(tup(p.lower(), p.higher()), p.character(), convert(p.password()))) - .collect(haskellList()); - } + @Override + public Object part1() { + return dayStream().map(com.sbaars.adventofcode.year20.days.Day2::mapPassword) + .map(p -> tuple(tup(p.lower(), p.higher()), p.character(), convert(p.password()))) + .collect(haskellList()); + } - @Override - public Object part2() { - return null; - } + @Override + public Object part2() { + return null; + } } diff --git a/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day3.java b/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day3.java index d399327d..272bb76d 100644 --- a/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day3.java +++ b/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day3.java @@ -2,27 +2,26 @@ import com.sbaars.adventofcode.haskell.year20.HaskellDay2020; import java.util.Arrays; -import java.util.stream.Collectors; public class Day3 extends HaskellDay2020 { - public Day3() { - super(3); - } + public Day3() { + super(3); + } - public static void main(String[] args) { - new Day3().printParts(); - } + public static void main(String[] args) { + new Day3().printParts(); + } - @Override - public Object part1() { - return Arrays.stream(dayGrid()).map(Arrays::toString) - .map(s -> s.replace('.', '0')) - .map(s -> s.replace('#', '1')) - .collect(haskellList()); - } + @Override + public Object part1() { + return Arrays.stream(dayGrid()).map(Arrays::toString) + .map(s -> s.replace('.', '0')) + .map(s -> s.replace('#', '1')) + .collect(haskellList()); + } - @Override - public Object part2() { - return null; - } + @Override + public Object part2() { + return null; + } } diff --git a/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day4.java b/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day4.java index 3bd2a011..f7741b67 100644 --- a/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day4.java +++ b/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day4.java @@ -2,30 +2,29 @@ import com.sbaars.adventofcode.haskell.year20.HaskellDay2020; import java.util.Arrays; -import java.util.stream.Collectors; public class Day4 extends HaskellDay2020 { - public Day4() { - super(4); - } + public Day4() { + super(4); + } - public static void main(String[] args) { - new Day4().printParts(); - } + public static void main(String[] args) { + new Day4().printParts(); + } - @Override - public Object part1() { - String[][] passports = Arrays.stream(day().split("\n\n")) - .map(str -> str.replace("\n", " ")) - .map(str -> str.split(" ")).toArray(String[][]::new); - return Arrays.stream(passports).map(passport -> - Arrays.stream(passport).map(s -> s.split(":")) + @Override + public Object part1() { + String[][] passports = Arrays.stream(day().split("\n\n")) + .map(str -> str.replace("\n", " ")) + .map(str -> str.split(" ")).toArray(String[][]::new); + return Arrays.stream(passports).map(passport -> + Arrays.stream(passport).map(s -> s.split(":")) .map(s -> tup(s[0], s[1])).collect(haskellList())) - .collect(haskellList()); - } + .collect(haskellList()); + } - @Override - public Object part2() { - return null; - } + @Override + public Object part2() { + return null; + } } diff --git a/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day5.java b/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day5.java index eb397c8c..9f17e2bf 100644 --- a/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day5.java +++ b/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day5.java @@ -1,25 +1,23 @@ package com.sbaars.adventofcode.haskell.year20.days; import com.sbaars.adventofcode.haskell.year20.HaskellDay2020; -import java.util.Arrays; -import java.util.stream.Collectors; public class Day5 extends HaskellDay2020 { - public Day5() { - super(5); - } + public Day5() { + super(5); + } - public static void main(String[] args) { - new Day5().printParts(); - } + public static void main(String[] args) { + new Day5().printParts(); + } - @Override - public Object part1() { - return convert(dayStrings()); - } + @Override + public Object part1() { + return convert(dayStrings()); + } - @Override - public Object part2() { - return null; - } + @Override + public Object part2() { + return null; + } } diff --git a/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day6.java b/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day6.java index 525c6bc7..232292c4 100644 --- a/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day6.java +++ b/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day6.java @@ -1,28 +1,26 @@ package com.sbaars.adventofcode.haskell.year20.days; -import static java.util.stream.Collectors.joining; - import com.sbaars.adventofcode.haskell.year20.HaskellDay2020; import java.util.Arrays; public class Day6 extends HaskellDay2020 { - public Day6() { - super(6); - } + public Day6() { + super(6); + } - public static void main(String[] args) { - new Day6().printParts(); - } + public static void main(String[] args) { + new Day6().printParts(); + } - @Override - public Object part1() { - return Arrays.stream(day().split("\n\n")) - .map(i -> convert(i.split("\n"))) - .collect(haskellList()); - } + @Override + public Object part1() { + return Arrays.stream(day().split("\n\n")) + .map(i -> convert(i.split("\n"))) + .collect(haskellList()); + } - @Override - public Object part2() { - return null; - } + @Override + public Object part2() { + return null; + } } diff --git a/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day7.java b/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day7.java index af50411d..94f1bf53 100644 --- a/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day7.java +++ b/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day7.java @@ -1,34 +1,33 @@ package com.sbaars.adventofcode.haskell.year20.days; import static java.util.Arrays.stream; -import static java.util.stream.Collectors.joining; import com.sbaars.adventofcode.haskell.year20.HaskellDay2020; -import com.sbaars.adventofcode.year20.days.Day7.Trade; import com.sbaars.adventofcode.year20.days.Day7.Item; +import com.sbaars.adventofcode.year20.days.Day7.Trade; public class Day7 extends HaskellDay2020 { - public Day7() { - super(7); - } + public Day7() { + super(7); + } - public static void main(String[] args) { - new Day7().printParts(); - } + public static void main(String[] args) { + new Day7().printParts(); + } - @Override - public Object part1() { - return dayStream().filter(s -> !s.contains("no other bags")).map(Trade::new) - .map(t -> tuple(convert(t.input.item), stream(t.output).map(this::convertItem).collect(haskellList()))) - .collect(haskellList()); - } + @Override + public Object part1() { + return dayStream().filter(s -> !s.contains("no other bags")).map(Trade::new) + .map(t -> tuple(convert(t.input.item), stream(t.output).map(this::convertItem).collect(haskellList()))) + .collect(haskellList()); + } - private String convertItem(Item i){ - return tup(i.amount, i.item); - } + private String convertItem(Item i) { + return tup(i.amount, i.item); + } - @Override - public Object part2() { - return null; - } + @Override + public Object part2() { + return null; + } } diff --git a/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day8.java b/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day8.java index 9b70e5c7..b116cc4a 100644 --- a/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day8.java @@ -6,23 +6,23 @@ import com.sbaars.adventofcode.year20.gamepad.Gamepad; public class Day8 extends HaskellDay2020 { - public Day8() { - super(8); - } + public Day8() { + super(8); + } - public static void main(String[] args) { - new Day8().printParts(); - } + public static void main(String[] args) { + new Day8().printParts(); + } - @Override - public Object part1() { - return stream(new Gamepad(dayStream()).getInstructions()) - .map(i -> tup(i.operation(), i.number())) - .collect(haskellList()); - } + @Override + public Object part1() { + return stream(new Gamepad(dayStream()).getInstructions()) + .map(i -> tup(i.operation(), i.number())) + .collect(haskellList()); + } - @Override - public Object part2() { - return null; - } + @Override + public Object part2() { + return null; + } } diff --git a/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day9.java b/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day9.java index 4b69497a..e10f996f 100644 --- a/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day9.java +++ b/src/main/java/com/sbaars/adventofcode/haskell/year20/days/Day9.java @@ -3,21 +3,21 @@ import com.sbaars.adventofcode.haskell.year20.HaskellDay2020; public class Day9 extends HaskellDay2020 { - public Day9() { - super(9); - } + public Day9() { + super(9); + } - public static void main(String[] args) { - new Day9().printParts(); - } + public static void main(String[] args) { + new Day9().printParts(); + } - @Override - public Object part1() { - return dayNumberStream().mapToObj(Long::toString).collect(haskellList()); - } + @Override + public Object part1() { + return dayNumberStream().mapToObj(Long::toString).collect(haskellList()); + } - @Override - public Object part2() { - return null; - } + @Override + public Object part2() { + return null; + } } diff --git a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java index c664090c..36127796 100644 --- a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java +++ b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java @@ -61,17 +61,17 @@ private void retrieveDay(String day, String year) { private void retrieveExamples(String day, String year) { var matches = getMatchesByXpath(doRequest(year + "/day/" + day), "//pre/code"); - for(int i = 0; i< matches.size(); i++){ - File file = getFile(day + "-" + (i + 1), year+"-examples"); + for (int i = 0; i < matches.size(); i++) { + File file = getFile(day + "-" + (i + 1), year + "-examples"); file.getParentFile().mkdirs(); - if(!file.exists()) { + if (!file.exists()) { writeFile(file, matches.get(i)); } } } private void runForYear(String year) { - for(int day = 1; day<=25; day++){ + for (int day = 1; day <= 25; day++) { retrieveDay(Integer.toString(day), year); } } @@ -79,7 +79,7 @@ private void runForYear(String year) { private void retrieveInput(String day, String year) { File dayFile = getFile(day, year); dayFile.getParentFile().mkdirs(); - if(!dayFile.exists()){ + if (!dayFile.exists()) { writeFile(dayFile, doRequest(year + "/day/" + day + "/input")); } } @@ -97,11 +97,11 @@ private void writeFile(File file, String content) { } private File getResource(String path) { - return new File("src/main/resources/"+path); + return new File("src/main/resources/" + path); } - private List getMatchesByXpath(String html, String xpath){ - try{ + private List getMatchesByXpath(String html, String xpath) { + try { TagNode tagNode = new HtmlCleaner().clean(html); org.w3c.dom.Document doc = new DomSerializer( new CleanerProperties()).createDOM(tagNode); diff --git a/src/main/java/com/sbaars/adventofcode/year18/Day2018.java b/src/main/java/com/sbaars/adventofcode/year18/Day2018.java index a56e44cb..b2aa6905 100644 --- a/src/main/java/com/sbaars/adventofcode/year18/Day2018.java +++ b/src/main/java/com/sbaars/adventofcode/year18/Day2018.java @@ -3,7 +3,7 @@ import com.sbaars.adventofcode.common.Day; public abstract class Day2018 extends Day { - protected Day2018(int day){ - super(2018, day); - } + protected Day2018(int day) { + super(2018, day); + } } diff --git a/src/main/java/com/sbaars/adventofcode/year18/Main.java b/src/main/java/com/sbaars/adventofcode/year18/Main.java index 7d375a0e..7969f69a 100644 --- a/src/main/java/com/sbaars/adventofcode/year18/Main.java +++ b/src/main/java/com/sbaars/adventofcode/year18/Main.java @@ -5,12 +5,12 @@ import java.lang.reflect.InvocationTargetException; public class Main { - public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException, InvocationTargetException, NoSuchMethodException { - for(int day = 1; day<=1; day++) { - System.out.println("Day "+day+":"); - Day instance = (Day)Class.forName("com.sbaars.adventofcode.year18.days.Day"+day).getDeclaredConstructor().newInstance(); - instance.printParts(); - System.out.println(); - } + public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException, InvocationTargetException, NoSuchMethodException { + for (int day = 1; day <= 1; day++) { + System.out.println("Day " + day + ":"); + Day instance = (Day) Class.forName("com.sbaars.adventofcode.year18.days.Day" + day).getDeclaredConstructor().newInstance(); + instance.printParts(); + System.out.println(); } + } } diff --git a/src/main/java/com/sbaars/adventofcode/year18/days/Day1.java b/src/main/java/com/sbaars/adventofcode/year18/days/Day1.java index 998a2f74..309306d7 100644 --- a/src/main/java/com/sbaars/adventofcode/year18/days/Day1.java +++ b/src/main/java/com/sbaars/adventofcode/year18/days/Day1.java @@ -1,36 +1,35 @@ package com.sbaars.adventofcode.year18.days; import com.sbaars.adventofcode.year18.Day2018; - -import java.io.IOException; -import java.util.Arrays; import java.util.HashSet; import java.util.Set; -import java.util.concurrent.atomic.AtomicInteger; public class Day1 extends Day2018 { - public static void main(String[] args) { - new Day1().printParts(); - } + public Day1() { + super(1); + } - public Day1(){super(1);} + public static void main(String[] args) { + new Day1().printParts(); + } - @Override - public Object part1() { - return dayNumberStream().sum(); - } + @Override + public Object part1() { + return dayNumberStream().sum(); + } - @Override - public Object part2() { - Set encountered = new HashSet<>(); - long[] ns = dayNumbers(); - long acc = 0; - outerloop: while(true) { - for (long n : ns) { - acc += n; - if (!encountered.add(acc)) break outerloop; - } - } - return acc; - } + @Override + public Object part2() { + Set encountered = new HashSet<>(); + long[] ns = dayNumbers(); + long acc = 0; + outerloop: + while (true) { + for (long n : ns) { + acc += n; + if (!encountered.add(acc)) break outerloop; + } + } + return acc; + } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/Day2019.java b/src/main/java/com/sbaars/adventofcode/year19/Day2019.java index 4ed0860d..710d3b14 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/Day2019.java +++ b/src/main/java/com/sbaars/adventofcode/year19/Day2019.java @@ -3,7 +3,7 @@ import com.sbaars.adventofcode.common.Day; public abstract class Day2019 extends Day { - protected Day2019(int day){ - super(2019, day); - } + protected Day2019(int day) { + super(2019, day); + } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/Main.java b/src/main/java/com/sbaars/adventofcode/year19/Main.java index 7e110282..af0c8786 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/Main.java +++ b/src/main/java/com/sbaars/adventofcode/year19/Main.java @@ -1,17 +1,16 @@ package com.sbaars.adventofcode.year19; +import com.sbaars.adventofcode.common.Day; import java.io.IOException; import java.lang.reflect.InvocationTargetException; -import com.sbaars.adventofcode.common.Day; - public class Main { - public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException, InvocationTargetException, NoSuchMethodException { - for(int day = 1; day<=25; day++) { - System.out.println("Day "+day+":"); - Day instance = (Day)Class.forName("com.sbaars.adventofcode.year19.days.Day"+day).getDeclaredConstructor().newInstance(); - instance.printParts(); - System.out.println(); - } - } + public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException, InvocationTargetException, NoSuchMethodException { + for (int day = 1; day <= 25; day++) { + System.out.println("Day " + day + ":"); + Day instance = (Day) Class.forName("com.sbaars.adventofcode.year19.days.Day" + day).getDeclaredConstructor().newInstance(); + instance.printParts(); + System.out.println(); + } + } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day1.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day1.java index be7a0571..abfac02f 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day1.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day1.java @@ -1,38 +1,32 @@ package com.sbaars.adventofcode.year19.days; -import java.io.IOException; -import java.util.Arrays; -import java.util.stream.IntStream; - -import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year19.Day2019; public class Day1 extends Day2019 { - public Day1(){ - super(1); - } - - public static void main(String[] args) - { - new Day1().printParts(); - } - - @Override - public Object part1() { - return dayIntStream().map(this::getFuel).sum(); - } - - @Override - public Object part2() { - return dayIntStream().map(this::getRequiredFuel).sum(); - } - - private int getRequiredFuel(int mass) { - int fuel = getFuel(mass); - return fuel>0 ? fuel+getRequiredFuel(fuel) : 0; - } - - private int getFuel(int mass) { - return (mass/3)-2; - } + public Day1() { + super(1); + } + + public static void main(String[] args) { + new Day1().printParts(); + } + + @Override + public Object part1() { + return dayIntStream().map(this::getFuel).sum(); + } + + @Override + public Object part2() { + return dayIntStream().map(this::getRequiredFuel).sum(); + } + + private int getRequiredFuel(int mass) { + int fuel = getFuel(mass); + return fuel > 0 ? fuel + getRequiredFuel(fuel) : 0; + } + + private int getFuel(int mass) { + return (mass / 3) - 2; + } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day10.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day10.java index c6f44a2c..94d1cf42 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day10.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day10.java @@ -11,79 +11,79 @@ public class Day10 extends Day2019 { - private final List asteroids; - private Point baseLocation; + private final List asteroids; + private Point baseLocation; - public Day10() { - super(10); - String[] mapString = dayStrings(); - this.asteroids = IntStream.range(0, mapString.length).boxed().flatMap(i -> IntStream.range(0, mapString[i].length()).mapToObj(j -> new Point(j, i))).filter(p -> mapString[p.y].charAt(p.x) == '#').collect(Collectors.toList()); - } + public Day10() { + super(10); + String[] mapString = dayStrings(); + this.asteroids = IntStream.range(0, mapString.length).boxed().flatMap(i -> IntStream.range(0, mapString[i].length()).mapToObj(j -> new Point(j, i))).filter(p -> mapString[p.y].charAt(p.x) == '#').collect(Collectors.toList()); + } - public static void main(String[] args) { - new Day10().printParts(); - } + public static void main(String[] args) { + new Day10().printParts(); + } - @Override - public Object part1() { - long[] nVisible = new long[asteroids.size()]; - for(int i = 0; i nVisible[i] > nVisible[j] ? i : j).getAsInt()); - return Arrays.stream(nVisible).max().getAsLong(); - } + @Override + public Object part1() { + long[] nVisible = new long[asteroids.size()]; + for (int i = 0; i < nVisible.length; i++) nVisible[i] = countNVisible(asteroids.get(i)); + baseLocation = asteroids.get(IntStream.range(0, nVisible.length).reduce((i, j) -> nVisible[i] > nVisible[j] ? i : j).getAsInt()); + return Arrays.stream(nVisible).max().getAsLong(); + } - @Override - public Object part2() { - List asteroidList = asteroids.stream().map(e -> new Asteroid(baseLocation, e)).collect(Collectors.toList()); - Asteroid prevDestroyed = new Asteroid(); - for(int destroyed = 1; destroyed<200; destroyed++) { - Asteroid prev = prevDestroyed; - OptionalDouble nextRot = asteroidList.stream().mapToDouble(e -> e.rotation).filter(e -> e > prev.rotation).min(); - if(nextRot.isPresent()) { - double nextRotation = nextRot.getAsDouble(); - prevDestroyed = asteroidList.stream().filter(e -> e.rotation == nextRotation).reduce((a1, a2) -> a1.distance < a2.distance ? a1 : a2).get(); - asteroidList.remove(prevDestroyed); - } - } - return prevDestroyed.position.x*100+prevDestroyed.position.y; - } + @Override + public Object part2() { + List asteroidList = asteroids.stream().map(e -> new Asteroid(baseLocation, e)).collect(Collectors.toList()); + Asteroid prevDestroyed = new Asteroid(); + for (int destroyed = 1; destroyed < 200; destroyed++) { + Asteroid prev = prevDestroyed; + OptionalDouble nextRot = asteroidList.stream().mapToDouble(e -> e.rotation).filter(e -> e > prev.rotation).min(); + if (nextRot.isPresent()) { + double nextRotation = nextRot.getAsDouble(); + prevDestroyed = asteroidList.stream().filter(e -> e.rotation == nextRotation).reduce((a1, a2) -> a1.distance < a2.distance ? a1 : a2).get(); + asteroidList.remove(prevDestroyed); + } + } + return prevDestroyed.position.x * 100 + prevDestroyed.position.y; + } - private long countNVisible(Point asteroid) { - return asteroids.stream().map(e -> new Asteroid(asteroid, e)).mapToDouble(e -> e.rotation).distinct().count(); - } + private long countNVisible(Point asteroid) { + return asteroids.stream().map(e -> new Asteroid(asteroid, e)).mapToDouble(e -> e.rotation).distinct().count(); + } - class Asteroid { - double rotation; - double distance; - Point position; + class Asteroid { + double rotation; + double distance; + Point position; - public Asteroid(Point center, Point me) { - this.rotation = calcRotationAngleInDegrees(center, me); - this.distance = me.distance(center); - this.position = me; - } + public Asteroid(Point center, Point me) { + this.rotation = calcRotationAngleInDegrees(center, me); + this.distance = me.distance(center); + this.position = me; + } - public Asteroid() { - this.rotation = Double.MIN_VALUE; - } + public Asteroid() { + this.rotation = Double.MIN_VALUE; + } - private double calcRotationAngleInDegrees(Point centerPt, Point targetPt) { - double theta = Math.atan2(targetPt.y - centerPt.y, targetPt.x - centerPt.x) + Math.PI/2.0; - double angle = Math.toDegrees(theta); - return angle < 0 ? angle + 360 : angle; - } + private double calcRotationAngleInDegrees(Point centerPt, Point targetPt) { + double theta = Math.atan2(targetPt.y - centerPt.y, targetPt.x - centerPt.x) + Math.PI / 2.0; + double angle = Math.toDegrees(theta); + return angle < 0 ? angle + 360 : angle; + } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Asteroid asteroid = (Asteroid) o; - return Objects.equal(position, asteroid.position); - } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Asteroid asteroid = (Asteroid) o; + return Objects.equal(position, asteroid.position); + } - @Override - public int hashCode() { - return Objects.hashCode(position); - } - } + @Override + public int hashCode() { + return Objects.hashCode(position); + } + } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day11.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day11.java index 9031cca7..06145249 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day11.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day11.java @@ -1,70 +1,68 @@ package com.sbaars.adventofcode.year19.days; -import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.common.Direction; import com.sbaars.adventofcode.common.ProcessesImages; import com.sbaars.adventofcode.year19.Day2019; import com.sbaars.adventofcode.year19.intcode.IntcodeComputer; -import java.awt.Point; -import java.io.IOException; +import java.awt.*; import java.util.HashSet; import java.util.Set; public class Day11 extends Day2019 implements ProcessesImages { - public Day11(){ - super(11); - } + public Day11() { + super(11); + } - public static void main(String[] args) { - new Day11().printParts(); - } + public static void main(String[] args) { + new Day11().printParts(); + } - @Override - public Object part1() { - return robotWalk(false); - } + @Override + public Object part1() { + return robotWalk(false); + } - private Object robotWalk(boolean startWhite) { - IntcodeComputer c = new IntcodeComputer(11); - Point currentLocation = new Point(0,0); - Direction dir = Direction.NORTH; - final Set paintedOnce = new HashSet<>(); - final Set whitePlaces = new HashSet<>(); - if(startWhite) - whitePlaces.add(currentLocation); - while(true) { - c.setInput(whitePlaces.contains(currentLocation) ? 1 : 0); - long paintColor = c.run(); - if(paintColor == IntcodeComputer.STOP_CODE) - break; - long turn = c.run(); - paintedOnce.add(currentLocation); - if(paintColor == 1L) { - whitePlaces.add(currentLocation); - } else if(paintColor == 0L) { - whitePlaces.remove(currentLocation); - } + private Object robotWalk(boolean startWhite) { + IntcodeComputer c = new IntcodeComputer(11); + Point currentLocation = new Point(0, 0); + Direction dir = Direction.NORTH; + final Set paintedOnce = new HashSet<>(); + final Set whitePlaces = new HashSet<>(); + if (startWhite) + whitePlaces.add(currentLocation); + while (true) { + c.setInput(whitePlaces.contains(currentLocation) ? 1 : 0); + long paintColor = c.run(); + if (paintColor == IntcodeComputer.STOP_CODE) + break; + long turn = c.run(); + paintedOnce.add(currentLocation); + if (paintColor == 1L) { + whitePlaces.add(currentLocation); + } else if (paintColor == 0L) { + whitePlaces.remove(currentLocation); + } - dir = dir.turn(turn == 1L); - currentLocation = dir.move(currentLocation); - } - return startWhite ? constructImage(whitePlaces) : paintedOnce.size(); - } + dir = dir.turn(turn == 1L); + currentLocation = dir.move(currentLocation); + } + return startWhite ? constructImage(whitePlaces) : paintedOnce.size(); + } - private String constructImage(Set whitePlaces) { - int cornerX = whitePlaces.stream().mapToInt(e -> e.x).min().getAsInt(); - int cornerY = whitePlaces.stream().mapToInt(e -> e.y).min().getAsInt(); - whitePlaces.forEach(e -> e.move(e.x - cornerX, e.y - cornerY)); - int sizex = whitePlaces.stream().mapToInt(e -> e.x).max().getAsInt()+1; - int sizey = whitePlaces.stream().mapToInt(e -> e.y).max().getAsInt()+1; - int[][] places = new int[sizey][sizex]; - for(Point p : whitePlaces) - places[p.y][p.x] = 1; - return printAsciiArray(places); - } + private String constructImage(Set whitePlaces) { + int cornerX = whitePlaces.stream().mapToInt(e -> e.x).min().getAsInt(); + int cornerY = whitePlaces.stream().mapToInt(e -> e.y).min().getAsInt(); + whitePlaces.forEach(e -> e.move(e.x - cornerX, e.y - cornerY)); + int sizex = whitePlaces.stream().mapToInt(e -> e.x).max().getAsInt() + 1; + int sizey = whitePlaces.stream().mapToInt(e -> e.y).max().getAsInt() + 1; + int[][] places = new int[sizey][sizex]; + for (Point p : whitePlaces) + places[p.y][p.x] = 1; + return printAsciiArray(places); + } - @Override - public Object part2() { - return robotWalk(true); - } + @Override + public Object part2() { + return robotWalk(true); + } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day12.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day12.java index 9b21b8ea..fc7429f1 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day12.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day12.java @@ -1,106 +1,101 @@ package com.sbaars.adventofcode.year19.days; -import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year19.Day2019; - -import java.io.IOException; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; public class Day12 extends Day2019 { - public Day12(){ - super(12); - } - - int[][] moons = {{-5,6,-11},{-8,-4,-2},{1,16,4},{11,11,-4}}; - int[][] velocity = {{0,0,0},{0,0,0},{0,0,0},{0,0,0}}; - - public static void main(String[] args) { - new Day12().printParts(); - } + int[][] moons = {{-5, 6, -11}, {-8, -4, -2}, {1, 16, 4}, {11, 11, -4}}; + int[][] velocity = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}}; + public Day12() { + super(12); + } - @Override - public Object part1() { - for(int n = 0; n<1000; n++) { - determineVelocity(); - moveMoonsUsingVelocity(); - } - int[] res = new int[moons.length]; - for(int i = 0; i()); - long[] res = new long[sets.size()]; - for(long n = 0; true; n++) { - determineVelocity(); - moveMoonsUsingVelocity(); + private static long gcd(long a, long b) { + while (b > 0) { + long temp = b; + b = a % b; // % is remainder + a = temp; + } + return a; + } - for(int i = 0; i x == 0)) { - return lcm(res); - } - } - } - } - } + private static long lcm(long a, long b) { + return a * (b / gcd(a, b)); + } - private void moveMoonsUsingVelocity() { - for(int i = 0; i moon2) { - velocity[i][dim]--; - velocity[j][dim]++; - } - } - } - } - } + @Override + public Object part1() { + for (int n = 0; n < 1000; n++) { + determineVelocity(); + moveMoonsUsingVelocity(); + } + int[] res = new int[moons.length]; + for (int i = 0; i < res.length; i++) { + res[i] = Arrays.stream(moons[i]).map(Math::abs).sum() * Arrays.stream(velocity[i]).map(Math::abs).sum(); + } + return Arrays.stream(res).sum(); + } - private static long gcd(long a, long b) { - while (b > 0) { - long temp = b; - b = a % b; // % is remainder - a = temp; - } - return a; - } + @Override + public Object part2() { + var sets = Collections.nCopies(moons[0].length, new HashSet<>()); + long[] res = new long[sets.size()]; + for (long n = 0; true; n++) { + determineVelocity(); + moveMoonsUsingVelocity(); - private static long lcm(long a, long b) { - return a * (b / gcd(a, b)); - } + for (int i = 0; i < sets.size(); i++) { + if (res[i] == 0 && !sets.get(i).add(Arrays.asList(moons[0][i], moons[1][i], moons[2][i], moons[3][i], velocity[0][i], velocity[1][i], velocity[2][i], velocity[3][i]))) { + res[i] = n; + if (Arrays.stream(res).noneMatch(x -> x == 0)) { + return lcm(res); + } + } + } + } + } - private static long lcm(long[] input) { - long result = input[0]; - for(int i = 1; i < input.length; i++) result = lcm(result, input[i]); - return result; - } + private void moveMoonsUsingVelocity() { + for (int i = 0; i < moons.length; i++) { + for (int j = 0; j < moons[0].length; j++) { + moons[i][j] += velocity[i][j]; + } + } + } + private void determineVelocity() { + for (int i = 0; i < moons.length; i++) { + for (int j = i + 1; j < moons.length; j++) { + for (int dim = 0; dim < moons[0].length; dim++) { + int moon1 = moons[i][dim], moon2 = moons[j][dim]; + if (moon1 < moon2) { + velocity[i][dim]++; + velocity[j][dim]--; + } else if (moon1 > moon2) { + velocity[i][dim]--; + velocity[j][dim]++; + } + } + } + } + } - short[][] copy(short[][] arr){ - short [][] myInt = new short[arr.length][]; - for(int i = 0; i < arr.length; i++) - myInt[i] = arr[i].clone(); - return myInt; - } + short[][] copy(short[][] arr) { + short[][] myInt = new short[arr.length][]; + for (int i = 0; i < arr.length; i++) + myInt[i] = arr[i].clone(); + return myInt; + } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day13.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day13.java index 16b2ef94..27b876f2 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day13.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day13.java @@ -1,71 +1,69 @@ package com.sbaars.adventofcode.year19.days; -import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year19.Day2019; import com.sbaars.adventofcode.year19.intcode.IntcodeComputer; -import java.awt.Point; -import java.io.IOException; +import java.awt.*; import java.util.HashSet; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; public class Day13 extends Day2019 { - public Day13(){ - super(13); - } + public Day13() { + super(13); + } - public static void main(String[] args) { - new Day13().printParts(); - } + public static void main(String[] args) { + new Day13().printParts(); + } - @Override - public Object part1() { - IntcodeComputer cp = new IntcodeComputer(13); - Set n = new HashSet(); - while(true) { - long x = cp.run(); - if(x == IntcodeComputer.STOP_CODE) return n.size(); - long y = cp.run(); - long tile = cp.run(); - if(tile == 2) - n.add(new Point(Math.toIntExact(x), Math.toIntExact(y))); - } - } + @Override + public Object part1() { + IntcodeComputer cp = new IntcodeComputer(13); + Set n = new HashSet(); + while (true) { + long x = cp.run(); + if (x == IntcodeComputer.STOP_CODE) return n.size(); + long y = cp.run(); + long tile = cp.run(); + if (tile == 2) + n.add(new Point(Math.toIntExact(x), Math.toIntExact(y))); + } + } - @Override - public Object part2() { - IntcodeComputer cp = new IntcodeComputer(13, 1); - cp.setElement(0, 2); - int[][] field = new int[21][38]; - int score = 0; - AtomicInteger paddlePos = new AtomicInteger(), ballPos = new AtomicInteger(); - while(true) { - long x = cp.run(); - if(x == IntcodeComputer.STOP_CODE) - return score; - long y = cp.run(); - long tile = cp.run(); - score = simulateField(cp, field, score, paddlePos, ballPos, Math.toIntExact(x), Math.toIntExact(y), Math.toIntExact(tile)); - } - } + @Override + public Object part2() { + IntcodeComputer cp = new IntcodeComputer(13, 1); + cp.setElement(0, 2); + int[][] field = new int[21][38]; + int score = 0; + AtomicInteger paddlePos = new AtomicInteger(), ballPos = new AtomicInteger(); + while (true) { + long x = cp.run(); + if (x == IntcodeComputer.STOP_CODE) + return score; + long y = cp.run(); + long tile = cp.run(); + score = simulateField(cp, field, score, paddlePos, ballPos, Math.toIntExact(x), Math.toIntExact(y), Math.toIntExact(tile)); + } + } - private int simulateField(IntcodeComputer cp, int[][] field, int score, AtomicInteger paddlePos, AtomicInteger ballPos, int x, int y, int tile) { - if(x == -1) - return tile; - else { - field[y][x] = tile; - if (tile == 3) { - paddlePos.set(x); - } else if (tile == 4) { - ballPos.set(x); - cp.setInput(provideInput(paddlePos, ballPos)); - } - } - return score; - } + private int simulateField(IntcodeComputer cp, int[][] field, int score, AtomicInteger paddlePos, AtomicInteger ballPos, int x, int y, int tile) { + if (x == -1) + return tile; + else { + field[y][x] = tile; + if (tile == 3) { + paddlePos.set(x); + } else if (tile == 4) { + ballPos.set(x); + cp.setInput(provideInput(paddlePos, ballPos)); + } + } + return score; + } - private int provideInput(AtomicInteger paddlePos, AtomicInteger ballPos) { - int ball = ballPos.get(), paddle = paddlePos.get(); - return Integer.compare(ball, paddle); - } + private int provideInput(AtomicInteger paddlePos, AtomicInteger ballPos) { + int ball = ballPos.get(), paddle = paddlePos.get(); + return Integer.compare(ball, paddle); + } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day14.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day14.java index 2d1a2e19..a1feaf91 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day14.java @@ -1,95 +1,92 @@ package com.sbaars.adventofcode.year19.days; -import java.io.IOException; -import java.util.Arrays; - -import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year19.Day2019; import com.sbaars.adventofcode.year19.util.LongCountMap; +import java.util.Arrays; public class Day14 extends Day2019 { - private Trade[] trades; - - public Day14() { - super(14); - this.trades = dayStream().map(Trade::new).toArray(Trade[]::new); - } - - public static void main(String[] args) { - new Day14().printParts(); - } - - @Override - public Object part1() { - return findCost(new Item(1, "FUEL"), new LongCountMap<>()); - } - - private Trade getTrade(String key) { - return Arrays.stream(trades).filter(e -> e.output.item.equals(key)).findAny().get(); - } - - private long findCost(Item buyingItem, LongCountMap leftOver) { - if(buyingItem.item.equals("ORE")) - return buyingItem.amount; - else if(buyingItem.amount <= leftOver.get(buyingItem.item)) { - leftOver.increment(buyingItem.item, -buyingItem.amount); - return 0; - } - buyingItem.amount-=leftOver.get(buyingItem.item); - leftOver.put(buyingItem.item, 0L); - - return performTrade(buyingItem, leftOver); - } - - private long performTrade(Item buyingItem, LongCountMap leftOver) { - Trade fuelTrade = getTrade(buyingItem.item); - long timesApplied = (long)Math.ceil((double)buyingItem.amount/(double)fuelTrade.output.amount); - long totalCost = 0; - for(Item cost : fuelTrade.input) - totalCost+=findCost(new Item(cost.amount*timesApplied, cost.item), leftOver); - leftOver.increment(buyingItem.item, fuelTrade.output.amount * timesApplied - buyingItem.amount); - return totalCost; - } - - @Override - public Object part2() { - long oreLeft = 1000000000000L; - long fuel = 1; - while(true) { - long cost = findCost(new Item(fuel + 1, "FUEL"), new LongCountMap<>()); - if (cost > oreLeft) { - return fuel; - } else { - fuel = Math.max(fuel + 1, (fuel + 1) * oreLeft / cost); - } - } - } - - class Trade { - private final Item[] input; - private final Item output; - - public Trade(String trade) { - String[] inputOutput = trade.split(" => "); - input = Arrays.stream(inputOutput[0].split(", ")).map(Item::new).toArray(Item[]::new); - output = new Item(inputOutput[1]); - } - } - - class Item { - private long amount; - private final String item; - - public Item(String item) { - String[] i = item.split(" "); - amount = Integer.parseInt(i[0]); - this.item = i[1]; - } - - public Item(long i, String string) { - amount = i; - item = string; - } - } + private final Trade[] trades; + + public Day14() { + super(14); + this.trades = dayStream().map(Trade::new).toArray(Trade[]::new); + } + + public static void main(String[] args) { + new Day14().printParts(); + } + + @Override + public Object part1() { + return findCost(new Item(1, "FUEL"), new LongCountMap<>()); + } + + private Trade getTrade(String key) { + return Arrays.stream(trades).filter(e -> e.output.item.equals(key)).findAny().get(); + } + + private long findCost(Item buyingItem, LongCountMap leftOver) { + if (buyingItem.item.equals("ORE")) + return buyingItem.amount; + else if (buyingItem.amount <= leftOver.get(buyingItem.item)) { + leftOver.increment(buyingItem.item, -buyingItem.amount); + return 0; + } + buyingItem.amount -= leftOver.get(buyingItem.item); + leftOver.put(buyingItem.item, 0L); + + return performTrade(buyingItem, leftOver); + } + + private long performTrade(Item buyingItem, LongCountMap leftOver) { + Trade fuelTrade = getTrade(buyingItem.item); + long timesApplied = (long) Math.ceil((double) buyingItem.amount / (double) fuelTrade.output.amount); + long totalCost = 0; + for (Item cost : fuelTrade.input) + totalCost += findCost(new Item(cost.amount * timesApplied, cost.item), leftOver); + leftOver.increment(buyingItem.item, fuelTrade.output.amount * timesApplied - buyingItem.amount); + return totalCost; + } + + @Override + public Object part2() { + long oreLeft = 1000000000000L; + long fuel = 1; + while (true) { + long cost = findCost(new Item(fuel + 1, "FUEL"), new LongCountMap<>()); + if (cost > oreLeft) { + return fuel; + } else { + fuel = Math.max(fuel + 1, (fuel + 1) * oreLeft / cost); + } + } + } + + class Trade { + private final Item[] input; + private final Item output; + + public Trade(String trade) { + String[] inputOutput = trade.split(" => "); + input = Arrays.stream(inputOutput[0].split(", ")).map(Item::new).toArray(Item[]::new); + output = new Item(inputOutput[1]); + } + } + + class Item { + private final String item; + private long amount; + + public Item(String item) { + String[] i = item.split(" "); + amount = Integer.parseInt(i[0]); + this.item = i[1]; + } + + public Item(long i, String string) { + amount = i; + item = string; + } + } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day15.java index 60a77b25..e0d54227 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day15.java @@ -1,104 +1,101 @@ package com.sbaars.adventofcode.year19.days; -import java.awt.Point; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.common.Direction; import com.sbaars.adventofcode.year19.Day2019; import com.sbaars.adventofcode.year19.intcode.IntcodeComputer; import com.sbaars.adventofcode.year19.pathfinding.Grid2d; +import java.awt.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; public class Day15 extends Day2019 { - public static final int UNEXPLORED = 3; - public static final int WALL = 0; - private static final int PATH = 1; - private static final int FINISH = 2; - private static final int BOARD_SIZE = 41; - private static final Point START_POINT = new Point(BOARD_SIZE/2+1,BOARD_SIZE/2+1); - int[][] grid = new int[BOARD_SIZE][BOARD_SIZE]; + public static final int UNEXPLORED = 3; + public static final int WALL = 0; + private static final int PATH = 1; + private static final int FINISH = 2; + private static final int BOARD_SIZE = 41; + private static final Point START_POINT = new Point(BOARD_SIZE / 2 + 1, BOARD_SIZE / 2 + 1); + int[][] grid = new int[BOARD_SIZE][BOARD_SIZE]; - public Day15(){ - super(15); - } + public Day15() { + super(15); + } - public static void main(String[] args) { - new Day15().printParts(); - } + public static void main(String[] args) { + new Day15().printParts(); + } - @Override - public Object part1() { - IntcodeComputer ic = new IntcodeComputer(15); - Point pos = START_POINT; - for(int[] row : grid) Arrays.fill(row, UNEXPLORED); - grid[pos.y][pos.x] = 1; - while(true) { - explore(pos, ic); - pos = moveToUnexploredPlace(pos, ic); - if(pos == null) { - Grid2d map2d = new Grid2d(grid, false); - return map2d.findPath(START_POINT, findPos(FINISH).get(0)).size()-1; - } - } - } + @Override + public Object part1() { + IntcodeComputer ic = new IntcodeComputer(15); + Point pos = START_POINT; + for (int[] row : grid) Arrays.fill(row, UNEXPLORED); + grid[pos.y][pos.x] = 1; + while (true) { + explore(pos, ic); + pos = moveToUnexploredPlace(pos, ic); + if (pos == null) { + Grid2d map2d = new Grid2d(grid, false); + return map2d.findPath(START_POINT, findPos(FINISH).get(0)).size() - 1; + } + } + } - private Point moveToUnexploredPlace(Point pos, IntcodeComputer ic) { - List corridorSpaces = findPos(PATH); - for(Point p : corridorSpaces) { - if(hasAdjecent(p, UNEXPLORED)) { - Grid2d map2d = new Grid2d(grid, false); - List route = map2d.findPath(pos, p); - traverseRoute(ic, pos, route.subList(1, route.size())); - return p; - } - } - return null; - } + private Point moveToUnexploredPlace(Point pos, IntcodeComputer ic) { + List corridorSpaces = findPos(PATH); + for (Point p : corridorSpaces) { + if (hasAdjecent(p, UNEXPLORED)) { + Grid2d map2d = new Grid2d(grid, false); + List route = map2d.findPath(pos, p); + traverseRoute(ic, pos, route.subList(1, route.size())); + return p; + } + } + return null; + } - private void traverseRoute(IntcodeComputer ic, Point pos, List route) { - for(Point p : route) { - if(ic.run(Direction.getByMove(pos, p).num)!=1L) - throw new IllegalStateException("Illegal state at "+pos+" execute to "+p); - pos = p; - } - } + private void traverseRoute(IntcodeComputer ic, Point pos, List route) { + for (Point p : route) { + if (ic.run(Direction.getByMove(pos, p).num) != 1L) + throw new IllegalStateException("Illegal state at " + pos + " execute to " + p); + pos = p; + } + } - private boolean hasAdjecent(Point pos, int tile) { - return grid[pos.y+1][pos.x] == tile || grid[pos.y][pos.x+1] == tile || grid[pos.y-1][pos.x] == tile || grid[pos.y][pos.x-1] == tile; - } + private boolean hasAdjecent(Point pos, int tile) { + return grid[pos.y + 1][pos.x] == tile || grid[pos.y][pos.x + 1] == tile || grid[pos.y - 1][pos.x] == tile || grid[pos.y][pos.x - 1] == tile; + } - private List findPos(int tile) { - List positions = new ArrayList<>(); - for(int y = 0; y findPos(int tile) { + List positions = new ArrayList<>(); + for (int y = 0; y < grid.length; y++) { + for (int x = 0; x < grid[y].length; x++) { + if (grid[y][x] == tile) + positions.add(new Point(x, y)); + } + } + return positions; + } - private void explore(Point pos, IntcodeComputer ic) { - Direction dir = Direction.NORTH; - for(int i = 0; i<4;i++) { - Point move = dir.move(pos); - if(grid[move.y][move.x] == UNEXPLORED) { - grid[move.y][move.x] = Math.toIntExact(ic.run(dir.num)); - if(grid[move.y][move.x] != WALL) { - ic.run(dir.opposite().num); // Move back - } - } - dir = dir.turn(true); - } - } + private void explore(Point pos, IntcodeComputer ic) { + Direction dir = Direction.NORTH; + for (int i = 0; i < 4; i++) { + Point move = dir.move(pos); + if (grid[move.y][move.x] == UNEXPLORED) { + grid[move.y][move.x] = Math.toIntExact(ic.run(dir.num)); + if (grid[move.y][move.x] != WALL) { + ic.run(dir.opposite().num); // Move back + } + } + dir = dir.turn(true); + } + } - @Override - public Object part2() { - Point oxygenLeak = findPos(FINISH).get(0); - return findPos(PATH).stream().mapToInt(e -> new Grid2d(grid, false).findPath(oxygenLeak, e).size()-1).max().getAsInt(); - } + @Override + public Object part2() { + Point oxygenLeak = findPos(FINISH).get(0); + return findPos(PATH).stream().mapToInt(e -> new Grid2d(grid, false).findPath(oxygenLeak, e).size() - 1).max().getAsInt(); + } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day16.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day16.java index 7da62d59..ca6c6b01 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day16.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day16.java @@ -1,69 +1,66 @@ package com.sbaars.adventofcode.year19.days; -import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year19.Day2019; - -import java.io.IOException; import java.util.Arrays; import java.util.stream.Collectors; public class Day16 extends Day2019 { - private static final int TARGET_POS = 5977341; - private final int[] input; + private static final int TARGET_POS = 5977341; + private final int[] input; - public Day16() { - super(16); - input = day().chars().map(Character::getNumericValue).toArray(); - } + public Day16() { + super(16); + input = day().chars().map(Character::getNumericValue).toArray(); + } - public static void main(String[] args) { - new Day16().printParts(); - } + public static void main(String[] args) { + new Day16().printParts(); + } - @Override - public Object part1() { - return calcRes(Arrays.copyOf(input, input.length), 0); - } + public static int[] repeat(int[] arr, int newLength) { + newLength = newLength * arr.length; + int[] dup = Arrays.copyOf(arr, newLength); + for (int last = arr.length; last != 0 && last < newLength; last <<= 1) { + System.arraycopy(dup, 0, dup, last, Math.min(last << 1, newLength) - last); + } + return dup; + } - @Override - public Object part2() { - return calcRes(repeat(input, 10000), TARGET_POS); - } + @Override + public Object part1() { + return calcRes(Arrays.copyOf(input, input.length), 0); + } - private Object calcRes(int[] nums, final int offset) { - int[] pattern = {0, 1, 0, -1}; + @Override + public Object part2() { + return calcRes(repeat(input, 10000), TARGET_POS); + } - int[] res = new int[nums.length]; - for(int phase = 0; phase<100; phase++) { - int[] newNums = new int[nums.length+1]; - for(int i=0;i= res.length) break; - loc=k; - } - res[i]=Math.abs(sum)%10; - } + int[] res = new int[nums.length]; + for (int phase = 0; phase < 100; phase++) { + int[] newNums = new int[nums.length + 1]; + for (int i = 0; i < nums.length; i++) { + newNums[i + 1] = newNums[i] + nums[i]; + } + for (int i = 0; i < nums.length; i++) { + int sum = 0, loc = 0; + for (int j = 0; true; j++) { - System.arraycopy(res, 0, nums, 0, res.length); - } - return Arrays.stream(res, offset, offset + 8).mapToObj(Integer::toString).collect(Collectors.joining()); - } + int k = ((j + 1) * (i + 1)) - 1; + sum += (newNums[Math.min(k, res.length)] - newNums[loc]) * pattern[j % 4]; + if (k >= res.length) break; + loc = k; + } + res[i] = Math.abs(sum) % 10; + } - public static int[] repeat(int[] arr, int newLength) { - newLength = newLength * arr.length; - int[] dup = Arrays.copyOf(arr, newLength); - for (int last = arr.length; last != 0 && last < newLength; last <<= 1) { - System.arraycopy(dup, 0, dup, last, Math.min(last << 1, newLength) - last); - } - return dup; - } + System.arraycopy(res, 0, nums, 0, res.length); + } + return Arrays.stream(res, offset, offset + 8).mapToObj(Integer::toString).collect(Collectors.joining()); + } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day17.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day17.java index 6c57508c..53a826d6 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day17.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day17.java @@ -11,138 +11,139 @@ public class Day17 extends Day2019 { - char[][] grid = new char[48][48]; - - public Day17() { - super(17); - IntcodeComputer ic = new IntcodeComputer(17, 1); - long res; - int x = 0, y =0; - while((res = ic.run()) != IntcodeComputer.STOP_CODE) { - if(res == 10) { - y++; - x= 0; - } else { - grid[y][x] = (char)res; - x++; - } - } - } - - public static void main(String[] args) { - new Day17().printParts(); - } - - @Override - public Object part1() { - int result = 0; - for(int y = 1; y instructions = new ArrayList<>(); - List traversed = new ArrayList<>(); - Direction dir; - Direction robotDir = Direction.NORTH; - while((dir = directionContainsSomethingAndUntraversed(grid, pos, traversed)) != null) { - int n; - for(n = 1; getGrid(grid, dir.move(pos, n)) == '#'; n++) traversed.add(dir.move(pos, n)); - pos = dir.move(pos, n-1); - instructions.add(new Instruction(n-1, dir.leftOf(robotDir) ? Dir.R : Dir.L)); - robotDir = dir; - } - String patterns = findPatterns(instructions) + "\nn\n"; - IntcodeComputer ic = new IntcodeComputer(17, 2); - ic.setInput(patterns); - while(true) { - long res = ic.run(); - if(res>255L) - return res; - } - } - - private String findPatterns(List instructions) { - List> patterns = new ArrayList<>(); - String patternString = ""; - int start = 0; - for(int i = 0; i pattern = existing(instructions, patterns, i); - if(pattern!=null && start == i) { - start += pattern.size(); - i+=pattern.size()-1; - patternString += ","+patterns.indexOf(pattern); - continue; - } else if(start!=i && (pattern != null || occurrences(instructions, instructions.subList(start, i+1))<3)) { - patternString += ","+patterns.size(); - patterns.add(instructions.subList(start, i)); - start = i; - i--; - } - } - return patternString.substring(1).replace("0", "A").replace("1", "B").replace("2", "C")+"\n"+patterns.stream().map(this::toString).collect(Collectors.joining("\n")); - } - - private List existing(List instructions, List> patterns, int i){ - for(List pattern : patterns) - if(i+pattern.size() <= instructions.size() && instructions.subList(i, i+pattern.size()).equals(pattern)) - return pattern; - return null; - } - - private int occurrences(List instructions, List subList) { - return Math.toIntExact(IntStream.range(0, instructions.size()-subList.size()).filter(i -> toString(instructions.subList(i, i+subList.size())).equals(toString(subList))).count()); - } - - public String toString(List i) { - return i.stream().map(Instruction::toString).collect(Collectors.joining(",")); - } - - private char getGrid(char[][] grid, Point p) { - if(p.x < 0 || p.y < 0 || p.x>=grid[0].length || p.y>=grid.length) return '.'; - return grid[p.y][p.x]; - } - - private Direction directionContainsSomethingAndUntraversed(char[][] grid, Point pos, List traversed) { - Direction dir = Direction.NORTH; - for(int i = 0; i<4; i++) { - Point p = dir.move(pos); - if(getGrid(grid, p) == '#' && !traversed.contains(p)) { - return dir; - } - dir = dir.turn(true); - } - return null; - } - - private List findPos(char[][] grid, char tile) { - List positions = new ArrayList<>(); - for(int y = 0; y instructions = new ArrayList<>(); + List traversed = new ArrayList<>(); + Direction dir; + Direction robotDir = Direction.NORTH; + while ((dir = directionContainsSomethingAndUntraversed(grid, pos, traversed)) != null) { + int n; + for (n = 1; getGrid(grid, dir.move(pos, n)) == '#'; n++) traversed.add(dir.move(pos, n)); + pos = dir.move(pos, n - 1); + instructions.add(new Instruction(n - 1, dir.leftOf(robotDir) ? Dir.R : Dir.L)); + robotDir = dir; + } + String patterns = findPatterns(instructions) + "\nn\n"; + IntcodeComputer ic = new IntcodeComputer(17, 2); + ic.setInput(patterns); + while (true) { + long res = ic.run(); + if (res > 255L) + return res; + } + } + + private String findPatterns(List instructions) { + List> patterns = new ArrayList<>(); + String patternString = ""; + int start = 0; + for (int i = 0; i < instructions.size() - 1; i++) { + List pattern = existing(instructions, patterns, i); + if (pattern != null && start == i) { + start += pattern.size(); + i += pattern.size() - 1; + patternString += "," + patterns.indexOf(pattern); + continue; + } else if (start != i && (pattern != null || occurrences(instructions, instructions.subList(start, i + 1)) < 3)) { + patternString += "," + patterns.size(); + patterns.add(instructions.subList(start, i)); + start = i; + i--; + } + } + return patternString.substring(1).replace("0", "A").replace("1", "B").replace("2", "C") + "\n" + patterns.stream().map(this::toString).collect(Collectors.joining("\n")); + } + + private List existing(List instructions, List> patterns, int i) { + for (List pattern : patterns) + if (i + pattern.size() <= instructions.size() && instructions.subList(i, i + pattern.size()).equals(pattern)) + return pattern; + return null; + } + + private int occurrences(List instructions, List subList) { + return Math.toIntExact(IntStream.range(0, instructions.size() - subList.size()).filter(i -> toString(instructions.subList(i, i + subList.size())).equals(toString(subList))).count()); + } + + public String toString(List i) { + return i.stream().map(Instruction::toString).collect(Collectors.joining(",")); + } + + private char getGrid(char[][] grid, Point p) { + if (p.x < 0 || p.y < 0 || p.x >= grid[0].length || p.y >= grid.length) return '.'; + return grid[p.y][p.x]; + } + + private Direction directionContainsSomethingAndUntraversed(char[][] grid, Point pos, List traversed) { + Direction dir = Direction.NORTH; + for (int i = 0; i < 4; i++) { + Point p = dir.move(pos); + if (getGrid(grid, p) == '#' && !traversed.contains(p)) { + return dir; + } + dir = dir.turn(true); + } + return null; + } + + private List findPos(char[][] grid, char tile) { + List positions = new ArrayList<>(); + for (int y = 0; y < grid.length; y++) { + for (int x = 0; x < grid[y].length; x++) { + if (grid[y][x] == tile) + positions.add(new Point(x, y)); + } + } + return positions; + } + + enum Dir {L, R} + + record Instruction(int amount, Dir dir) { + @Override + public String toString() { + return dir.name() + "," + amount; + } + } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day18.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day18.java index 154fdeb2..6a6b874e 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day18.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day18.java @@ -13,14 +13,14 @@ public class Day18 extends Day2019 { - private final char[][] grid; - private final CharGrid2d charGrid; - private final Map cachedResult = new HashMap<>(); private static final char[][] CHANGE_GRID = { {'@', '#', '@'}, {'#', '#', '#'}, {'@', '#', '@'} }; + private final char[][] grid; + private final CharGrid2d charGrid; + private final Map cachedResult = new HashMap<>(); private final Point middle; public Day18() { @@ -34,12 +34,6 @@ public static void main(String[] args) { new Day18().printParts(); } - record Route(Point start, Point end) { - } - - record State(List me, TreeSet keys) { - } - @Override public Object part1() { List me = new ArrayList<>(); @@ -132,4 +126,10 @@ public Object part2() { cachedResult.clear(); return findRoutes(findPos('@')); } + + record Route(Point start, Point end) { + } + + record State(List me, TreeSet keys) { + } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day19.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day19.java index bda7cf4b..e09108a8 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day19.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day19.java @@ -1,39 +1,39 @@ package com.sbaars.adventofcode.year19.days; -import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year19.Day2019; import com.sbaars.adventofcode.year19.intcode.IntcodeComputer; -import java.io.IOException; public class Day19 extends Day2019 { - public static void main(String[] args) { - new Day19().printParts(); - } + public Day19() { + super(19); + } - public Day19(){super(19);} + public static void main(String[] args) { + new Day19().printParts(); + } - @Override - public Object part1() { - long res = 0; - for(int x = 0; x<50;x++) - for(int y = 0; y<50;y++) - res+=new IntcodeComputer(19).run(x, y); - return res; - } + @Override + public Object part1() { + long res = 0; + for (int x = 0; x < 50; x++) + for (int y = 0; y < 50; y++) + res += new IntcodeComputer(19).run(x, y); + return res; + } - @Override - public Object part2() { - int x = 500, y = 0; - while(true) { - if(beam(x, y)) { - if(beam(x-99, y+99)) return 10000 * (x - 99) + y; - else x++; - } else y++; - } - } + @Override + public Object part2() { + int x = 500, y = 0; + while (true) { + if (beam(x, y)) { + if (beam(x - 99, y + 99)) return 10000 * (x - 99) + y; + else x++; + } else y++; + } + } - private boolean beam(int x, int y) { - return new IntcodeComputer(19).run(x, y) == 1L; - } + private boolean beam(int x, int y) { + return new IntcodeComputer(19).run(x, y) == 1L; + } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day2.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day2.java index 35391c9c..6bbeca6e 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day2.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day2.java @@ -1,44 +1,41 @@ package com.sbaars.adventofcode.year19.days; -import java.io.IOException; - -import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year19.Day2019; import com.sbaars.adventofcode.year19.intcode.IntcodeComputer; public class Day2 extends Day2019 { - public Day2(){ - super(2); - } - - public static void main(String[] args) { - new Day2().printParts(); - } - - @Override - public Object part1() { - return execute(12,2); - } - - @Override - public Object part2() { - return bruteForceFindingNumber(19690720, 99); - } - - private int bruteForceFindingNumber(int number, int bound) { - for(int i = 0; i portals = new HashMap<>(); - private final Map portalLabel = new HashMap<>(); - private final ArrayListMultimap routes = ArrayListMultimap.create(); - private final List portalsToTake = new ArrayList<>(); - private Portal entry; - private Portal exit; - - record Portal (Point pos, boolean isOuter) {} - - record Route (Portal goal, int distance) {} - - record State (Visited vis, int totalSteps) {} - - record Visited (Portal pos, int level) {} - - public Day20() { - super(20); - grid = dayGrid(); - charGrid = new CharGrid2d(grid, false); - - int[] rows = {2, 26, 80, 104}; - for(int row : rows) { - boolean addPortal = row == rows[0] || row == rows[rows.length-1]; - for(int i = 2; i queue = new ArrayDeque<>(); - final Set visited = new HashSet<>(); - queue.add(new State(new Visited(entry, 0), -1)); - while(true) { - State s = queue.poll(); - if(!routes.containsKey(s.vis.pos)) determineRoutes(s.vis.pos); - for(Route route : routes.get(s.vis.pos)) { - int level = s.vis.level; - if(level == 0 && route.goal.equals(exit)) return route.distance + s.totalSteps; - else if(route.goal.equals(exit)) continue; - if(b) level+=route.goal.isOuter ? 1 : -1; - if(s.vis.level < 0) continue; - Visited vis = new Visited(route.goal, level); - if(!visited.contains(vis)) { - visited.add(vis); - queue.add(new State(vis, s.totalSteps + route.distance)); - } - } - } - } - - private void determineRoutes(Portal p) { - for(Portal portal : portalsToTake) { - if(!portal.pos.equals(p.pos)) { - List route = charGrid.findPath(p.pos, portal.pos); - if(!route.isEmpty()) routes.put(p, new Route(teleport(portal), route.size())); - } - } - } - - private Portal teleport(Portal portal) { - Portal[] thisPortal = portals.get(portalLabel.get(portal)); - if(portal.equals(exit)) return exit; - if(portal.equals(thisPortal[0])) return thisPortal[1]; - return thisPortal[0]; - } - - @Override - public Object part2() { - return findRoutes(true); - } + private final Map portals = new HashMap<>(); + private final Map portalLabel = new HashMap<>(); + private final ArrayListMultimap routes = ArrayListMultimap.create(); + private final List portalsToTake = new ArrayList<>(); + char[][] grid; + CharGrid2d charGrid; + private Portal entry; + private Portal exit; + + public Day20() { + super(20); + grid = dayGrid(); + charGrid = new CharGrid2d(grid, false); + + int[] rows = {2, 26, 80, 104}; + for (int row : rows) { + boolean addPortal = row == rows[0] || row == rows[rows.length - 1]; + for (int i = 2; i < grid.length - 2; i++) { + if (grid[i][row] == '.') { + if (Character.isAlphabetic(grid[i][row - 1])) { + addPortal("" + grid[i][row - 2] + grid[i][row - 1], new Point(row, i), addPortal); + grid[i][row - 1] = '#'; + } else if (Character.isAlphabetic(grid[i][row + 1])) { + addPortal("" + grid[i][row + 1] + grid[i][row + 2], new Point(row, i), addPortal); + grid[i][row + 1] = '#'; + } + } + if (grid[row][i] == '.') { + if (Character.isAlphabetic(grid[row - 1][i])) { + addPortal("" + grid[row - 2][i] + grid[row - 1][i], new Point(i, row), addPortal); + grid[row - 1][i] = '#'; + } else if (Character.isAlphabetic(grid[row + 1][i])) { + addPortal("" + grid[row + 1][i] + grid[row + 2][i], new Point(i, row), addPortal); + grid[row + 1][i] = '#'; + } + } + } + } + portalsToTake.addAll(portalLabel.keySet()); + portalsToTake.add(exit); + } + + public static void main(String[] args) { + new Day20().printParts(); + } + + public void addPortal(String label, Point pos, boolean outerRing) { + Portal p = new Portal(pos, outerRing); + if (label.equals("AA")) this.entry = p; + else if (label.equals("ZZ")) this.exit = p; + else { + Portal[] portal = portals.get(label); + if (portal == null) { + portals.put(label, new Portal[]{p, null}); + } else portal[1] = p; + portalLabel.put(p, label); + } + + } + + @Override + public Object part1() { + return findRoutes(false); + } + + private int findRoutes(boolean b) { + final Queue queue = new ArrayDeque<>(); + final Set visited = new HashSet<>(); + queue.add(new State(new Visited(entry, 0), -1)); + while (true) { + State s = queue.poll(); + if (!routes.containsKey(s.vis.pos)) determineRoutes(s.vis.pos); + for (Route route : routes.get(s.vis.pos)) { + int level = s.vis.level; + if (level == 0 && route.goal.equals(exit)) return route.distance + s.totalSteps; + else if (route.goal.equals(exit)) continue; + if (b) level += route.goal.isOuter ? 1 : -1; + if (s.vis.level < 0) continue; + Visited vis = new Visited(route.goal, level); + if (!visited.contains(vis)) { + visited.add(vis); + queue.add(new State(vis, s.totalSteps + route.distance)); + } + } + } + } + + private void determineRoutes(Portal p) { + for (Portal portal : portalsToTake) { + if (!portal.pos.equals(p.pos)) { + List route = charGrid.findPath(p.pos, portal.pos); + if (!route.isEmpty()) routes.put(p, new Route(teleport(portal), route.size())); + } + } + } + + private Portal teleport(Portal portal) { + Portal[] thisPortal = portals.get(portalLabel.get(portal)); + if (portal.equals(exit)) return exit; + if (portal.equals(thisPortal[0])) return thisPortal[1]; + return thisPortal[0]; + } + + @Override + public Object part2() { + return findRoutes(true); + } + + record Portal(Point pos, boolean isOuter) { + } + + record Route(Portal goal, int distance) { + } + + record State(Visited vis, int totalSteps) { + } + + record Visited(Portal pos, int level) { + } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day21.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day21.java index fb44f4e5..0665a04f 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day21.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day21.java @@ -1,51 +1,51 @@ package com.sbaars.adventofcode.year19.days; -import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year19.Day2019; import com.sbaars.adventofcode.year19.intcode.IntcodeComputer; -import java.io.IOException; public class Day21 extends Day2019 { - public static void main(String[] args) { - new Day21().printParts(); - } + public Day21() { + super(21); + } - public Day21(){super(21);} + public static void main(String[] args) { + new Day21().printParts(); + } - @Override - public Object part1() { - IntcodeComputer ic = new IntcodeComputer(21); - // !(A && B && C) && D - ic.setInput("OR A T\n" + - "AND B T\n" + - "AND C T\n" + - "NOT T T\n" + //flip T - "AND D T\n" + - "OR T J\n" + - "WALK\n"); - long res; - while((res = ic.run()) != IntcodeComputer.STOP_CODE) - if(res>255) return res; - return 0; - } + @Override + public Object part1() { + IntcodeComputer ic = new IntcodeComputer(21); + // !(A && B && C) && D + ic.setInput("OR A T\n" + + "AND B T\n" + + "AND C T\n" + + "NOT T T\n" + //flip T + "AND D T\n" + + "OR T J\n" + + "WALK\n"); + long res; + while ((res = ic.run()) != IntcodeComputer.STOP_CODE) + if (res > 255) return res; + return 0; + } - @Override - public Object part2() { - IntcodeComputer ic = new IntcodeComputer(21); - // (((!B && H) || !A) || (!C && H)) && D - ic.setInput("NOT A J\n" + - "NOT B T\n" + - "AND H T\n" + - "OR T J\n" + - "NOT C T\n" + - "AND H T\n" + - "OR T J\n" + - "AND D J\n" + - "RUN\n"); - long res; - while((res = ic.run()) != IntcodeComputer.STOP_CODE) - if(res>255) return res; - return 0; - } + @Override + public Object part2() { + IntcodeComputer ic = new IntcodeComputer(21); + // (((!B && H) || !A) || (!C && H)) && D + ic.setInput("NOT A J\n" + + "NOT B T\n" + + "AND H T\n" + + "OR T J\n" + + "NOT C T\n" + + "AND H T\n" + + "OR T J\n" + + "AND D J\n" + + "RUN\n"); + long res; + while ((res = ic.run()) != IntcodeComputer.STOP_CODE) + if (res > 255) return res; + return 0; + } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day22.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day22.java index 29576dea..fe09b906 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day22.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day22.java @@ -11,109 +11,115 @@ public class Day22 extends Day2019 { - Move[] moves; - - public Day22() { - super(22); - this.moves = Arrays.stream(day().split(System.lineSeparator())).map(Move::parse).toArray(Move[]::new); - } - - public static void main(String[] args) { - new Day22().printParts(); - } - - enum Action { - DEAL_WITH_INCREMENT("deal with increment "), - DEAL_NEW_STACK("deal into new stack"), - CUT("cut "); - - String name; - - private Action(String name){ - this.name = name; - } - - public static Action actionByText(String text) { - return Arrays.stream(values()).filter(a -> text.startsWith(a.name)).findAny().get(); - } - } - - record Move (Action action, int amount) { - - public static Move parse(String s) { - Action action = Action.actionByText(s); - s = s.replace(action.name, ""); - return new Move(action, !s.isEmpty() ? Integer.parseInt(s) : 0); - } - - public List execute(List cards) { - switch(action) { - case DEAL_NEW_STACK: Collections.reverse(cards); break; - case CUT: { - int n = amount > 0 ? amount : cards.size()+amount; - List sub = new ArrayList<>(cards.subList(n, cards.size())); - sub.addAll(cards.subList(0, n)); - return sub; - } - case DEAL_WITH_INCREMENT: { - Integer[] deck = new Integer[cards.size()] ; - for(int i = 0, card = 0; i cards = IntStream.range(0, 10007).boxed().collect(Collectors.toList()); - for(Move move : moves) cards = move.execute(cards); - return cards.indexOf(2019); - } - - @Override - public Object part2() { - return seekPosition(num(119315717514047L), num(101741582076661L), 2020); - } - - private BigInteger seekPosition(BigInteger deckSize, BigInteger timesShuffled, int position) { - BigInteger[] calc = new BigInteger[] {num(1), num(0)}; - for(Move move : reverseArray(moves)) { - move.execute(calc, deckSize); - for(int i = 0; i T[] reverseArray(T[] arr) { - for(int i = 0; i < arr.length / 2; i++) { - T temp = arr[i]; - arr[i] = arr[arr.length - i - 1]; - arr[arr.length - i - 1] = temp; - } - return arr; - } + Move[] moves; + + public Day22() { + super(22); + this.moves = Arrays.stream(day().split(System.lineSeparator())).map(Move::parse).toArray(Move[]::new); + } + + public static void main(String[] args) { + new Day22().printParts(); + } + + private static BigInteger num(long n) { + return new BigInteger(Long.toString(n)); + } + + @Override + public Object part1() { + List cards = IntStream.range(0, 10007).boxed().collect(Collectors.toList()); + for (Move move : moves) cards = move.execute(cards); + return cards.indexOf(2019); + } + + @Override + public Object part2() { + return seekPosition(num(119315717514047L), num(101741582076661L), 2020); + } + + private BigInteger seekPosition(BigInteger deckSize, BigInteger timesShuffled, int position) { + BigInteger[] calc = new BigInteger[]{num(1), num(0)}; + for (Move move : reverseArray(moves)) { + move.execute(calc, deckSize); + for (int i = 0; i < calc.length; i++) calc[i] = calc[i].mod(deckSize); + } + BigInteger pow = calc[0].modPow(timesShuffled, deckSize); + return pow.multiply(num(position)).add(calc[1].multiply(pow.add(deckSize).subtract(num(1))).multiply(calc[0].subtract(num(1)).modPow(deckSize.subtract(num(2)), deckSize))).mod(deckSize); + } + + private T[] reverseArray(T[] arr) { + for (int i = 0; i < arr.length / 2; i++) { + T temp = arr[i]; + arr[i] = arr[arr.length - i - 1]; + arr[arr.length - i - 1] = temp; + } + return arr; + } + + enum Action { + DEAL_WITH_INCREMENT("deal with increment "), + DEAL_NEW_STACK("deal into new stack"), + CUT("cut "); + + String name; + + Action(String name) { + this.name = name; + } + + public static Action actionByText(String text) { + return Arrays.stream(values()).filter(a -> text.startsWith(a.name)).findAny().get(); + } + } + + record Move(Action action, int amount) { + + public static Move parse(String s) { + Action action = Action.actionByText(s); + s = s.replace(action.name, ""); + return new Move(action, !s.isEmpty() ? Integer.parseInt(s) : 0); + } + + public List execute(List cards) { + switch (action) { + case DEAL_NEW_STACK: + Collections.reverse(cards); + break; + case CUT: { + int n = amount > 0 ? amount : cards.size() + amount; + List sub = new ArrayList<>(cards.subList(n, cards.size())); + sub.addAll(cards.subList(0, n)); + return sub; + } + case DEAL_WITH_INCREMENT: { + Integer[] deck = new Integer[cards.size()]; + for (int i = 0, card = 0; i < cards.size(); i++) { + deck[card] = cards.get(i); + card = (card + amount) % deck.length; + } + return Arrays.asList(deck); + } + } + return cards; + } + + public void execute(BigInteger[] input, BigInteger deckSize) { + switch (action) { + case DEAL_NEW_STACK: { + input[0] = input[0].multiply(num(-1)); + input[1] = input[1].add(num(1)).multiply(num(-1)); + } + break; + case CUT: + input[1] = input[1].add(num(amount)); + break; + case DEAL_WITH_INCREMENT: { + BigInteger p = num(amount).modPow(deckSize.subtract(num(2)), deckSize); + for (int i = 0; i < input.length; i++) input[i] = input[i].multiply(p); + } + break; + } + } + } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day23.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day23.java index abdd925e..aafe8a1b 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day23.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day23.java @@ -1,56 +1,56 @@ package com.sbaars.adventofcode.year19.days; -import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year19.Day2019; import com.sbaars.adventofcode.year19.intcode.IntcodeComputer; import com.sbaars.adventofcode.year19.intcode.RetentionPolicy; -import java.io.IOException; import java.util.stream.IntStream; public class Day23 extends Day2019 { - public static void main(String[] args) { - new Day23().printParts(); - } - - public Day23(){super(23);} - - @Override - public Object part1() { - return getNetworkNumber(true); - } - - @Override - public Object part2() { - return getNetworkNumber(false); - } - - private long getNetworkNumber(boolean returnNatY) { - long[] program = dayNumbers(","); - IntcodeComputer[] ic = IntStream.range(0, 50).mapToObj(i -> new IntcodeComputer(RetentionPolicy.EXIT_ON_EMPTY_INPUT, program, i, -1)).toArray(IntcodeComputer[]::new); - long[] nat = new long[2]; - long sentByNat = -1; - - long input; - while(true) { - boolean idle = true; - for(int i = 0; i new IntcodeComputer(RetentionPolicy.EXIT_ON_EMPTY_INPUT, program, i, -1)).toArray(IntcodeComputer[]::new); + long[] nat = new long[2]; + long sentByNat = -1; + + long input; + while (true) { + boolean idle = true; + for (int i = 0; i < ic.length; i++) { + if ((input = ic[i].run()) != IntcodeComputer.STOP_CODE) { + int pc = Math.toIntExact(input); + long x = ic[i].run(), y = ic[i].run(); + if (pc == 255) { + if (returnNatY) return y; + nat[0] = x; + nat[1] = y; + } else ic[pc].addInput(x, y); + idle = false; + } + } + if (idle) { + ic[0].addInput(nat[0], nat[1]); + if (sentByNat == nat[1]) return nat[1]; + sentByNat = nat[1]; + } + } + } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day24.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day24.java index a9190498..4cc18a31 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day24.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day24.java @@ -17,126 +17,126 @@ public class Day24 extends Day2019 { - private final Set grids = new HashSet<>(); - private Map layers = new HashMap<>(); - private final char[][] initialGrid; - - public Day24() { - super(24); - this.initialGrid = dayGrid(); - } - - public static void main(String[] args) { - new Day24().printParts(); - } - - @Override - public Object part1() { - char[][] grid = initialGrid; - while(true) { - if(!grids.add(new CharGrid(grid))) return calcRes(grid); - char[][] newGrid = copy(grid); - final char[][] g = grid; - streamGrid(grid).forEach(p -> simulate(g, newGrid, p)); - grid = newGrid; - } - } - - private void simulate(char[][] grid, char[][] newGrid, Point p) { - int adj = nAdjecent(grid, p); - if(get(grid, p) == '#' && adj != 1) { - set(newGrid, p, '.'); - } else if(get(grid, p) == '.' && (adj == 1 || adj == 2)) { - set(newGrid, p, '#'); - } - } - - private long calcRes(char[][] grid) { - return (long)streamGrid(grid).filter(p -> get(grid, p) == '#').mapToDouble(p -> Math.pow(2, (p.y*grid.length)+p.x)).sum(); - } - - public char[][] copy(char[][] grid){ - char[][] g2 = new char[grid.length][]; - for(int i = 0; i=grid.length || p.y>=grid.length) return 0; - return get(grid, p) == '#' ? 1 : 0; - } - - @Override - public Object part2() { - char[][] grid = dayGrid(); - for(int i = -200; i<=200; i++) layers.put(i, fill(new char[grid.length][grid[0].length], '.')); - layers.put(0, grid); - for(int i =0; i<200; i++) { - final Map layers2 = new HashMap<>(); - for(int layer = -200; layer<=200; layer++) { - char[][] newGrid = copy(layers.get(layer)); - final int l = layer; - streamGrid(grid).filter(p -> p.x != 2 || p.y!=2).forEach(p -> simulate(l, newGrid, p)); - layers2.put(layer, newGrid); - } - layers = layers2; - } - return layers.values().stream().mapToLong(e -> count(e, '#')).sum(); - } - - public Stream streamGrid(int sizex, int sizey) { - return IntStream.range(0, sizey).boxed().flatMap(y -> IntStream.range(0, sizex).mapToObj(x -> new Point(x,y))); - } - - public Stream streamGrid(char[][] grid) { - return streamGrid(grid[0].length, grid.length); - } - - private long count(char[][] grid, char c) { - return streamGrid(grid).filter(p -> get(grid, p) == '#').count(); - } - - private void simulate(int layer, char[][] newGrid, Point p) { - int adj = nAdjecent(layer, p); - if(get(layers.get(layer), p) == '#' && adj != 1) { - set(newGrid, p, '.'); - } else if(get(layers.get(layer), p) == '.' && (adj == 1 || adj == 2)) { - set(newGrid, p, '#'); - } - } - - private char get(char[][] grid, Point pos) { - return grid[pos.y][pos.x]; - } - - private void set(char[][] grid, Point pos, char c) { - grid[pos.y][pos.x] = c; - } - - private int nAdjecent(int layer, Point pos) { - int res = 0; - Point[] surround = new Point[] {new Point(2, 1), new Point(1, 2), new Point(2, 3), new Point(3, 2)}; - if(layers.containsKey(layer+1)) { - List> conditions = Arrays.asList(() -> pos.y == 0, () -> pos.x == 0, () -> pos.y == 4, () -> pos.x == 4); - res += IntStream.range(0, conditions.size()).filter(i -> conditions.get(i).get()).map(i -> num(layers.get(layer + 1), surround[i])).sum(); - } - if(layers.containsKey(layer-1)) { - List> fs = Arrays.asList(i -> new Point(i, 0), i -> new Point(0, i), i -> new Point(i, 4), i -> new Point(4, i)); - res += IntStream.range(0, fs.size()).filter(i -> pos.equals(surround[i])).map(i -> nLayer(layer, fs.get(i))).sum(); - } - return res + nAdjecent(layers.get(layer), pos); - } - - public int nLayer(int layer, Function f) { - return IntStream.range(0,5).map(i -> num(layers.get(layer-1), f.apply(i))).sum(); - } - - public char[][] fill(char[][] arr, char el) { - streamGrid(arr).forEach(p -> set(arr, p, el)); - return arr; - } + private final Set grids = new HashSet<>(); + private final char[][] initialGrid; + private Map layers = new HashMap<>(); + + public Day24() { + super(24); + this.initialGrid = dayGrid(); + } + + public static void main(String[] args) { + new Day24().printParts(); + } + + @Override + public Object part1() { + char[][] grid = initialGrid; + while (true) { + if (!grids.add(new CharGrid(grid))) return calcRes(grid); + char[][] newGrid = copy(grid); + final char[][] g = grid; + streamGrid(grid).forEach(p -> simulate(g, newGrid, p)); + grid = newGrid; + } + } + + private void simulate(char[][] grid, char[][] newGrid, Point p) { + int adj = nAdjecent(grid, p); + if (get(grid, p) == '#' && adj != 1) { + set(newGrid, p, '.'); + } else if (get(grid, p) == '.' && (adj == 1 || adj == 2)) { + set(newGrid, p, '#'); + } + } + + private long calcRes(char[][] grid) { + return (long) streamGrid(grid).filter(p -> get(grid, p) == '#').mapToDouble(p -> Math.pow(2, (p.y * grid.length) + p.x)).sum(); + } + + public char[][] copy(char[][] grid) { + char[][] g2 = new char[grid.length][]; + for (int i = 0; i < grid.length; i++) g2[i] = Arrays.copyOf(grid[i], grid[i].length); + return g2; + } + + public int nAdjecent(char[][] grid, Point pos) { + return num(grid, new Point(pos.x, pos.y - 1)) + num(grid, new Point(pos.x, pos.y + 1)) + num(grid, new Point(pos.x - 1, pos.y)) + num(grid, new Point(pos.x + 1, pos.y)); + } + + private int num(char[][] grid, Point p) { + if (p.x < 0 || p.y < 0 || p.x >= grid.length || p.y >= grid.length) return 0; + return get(grid, p) == '#' ? 1 : 0; + } + + @Override + public Object part2() { + char[][] grid = dayGrid(); + for (int i = -200; i <= 200; i++) layers.put(i, fill(new char[grid.length][grid[0].length], '.')); + layers.put(0, grid); + for (int i = 0; i < 200; i++) { + final Map layers2 = new HashMap<>(); + for (int layer = -200; layer <= 200; layer++) { + char[][] newGrid = copy(layers.get(layer)); + final int l = layer; + streamGrid(grid).filter(p -> p.x != 2 || p.y != 2).forEach(p -> simulate(l, newGrid, p)); + layers2.put(layer, newGrid); + } + layers = layers2; + } + return layers.values().stream().mapToLong(e -> count(e, '#')).sum(); + } + + public Stream streamGrid(int sizex, int sizey) { + return IntStream.range(0, sizey).boxed().flatMap(y -> IntStream.range(0, sizex).mapToObj(x -> new Point(x, y))); + } + + public Stream streamGrid(char[][] grid) { + return streamGrid(grid[0].length, grid.length); + } + + private long count(char[][] grid, char c) { + return streamGrid(grid).filter(p -> get(grid, p) == '#').count(); + } + + private void simulate(int layer, char[][] newGrid, Point p) { + int adj = nAdjecent(layer, p); + if (get(layers.get(layer), p) == '#' && adj != 1) { + set(newGrid, p, '.'); + } else if (get(layers.get(layer), p) == '.' && (adj == 1 || adj == 2)) { + set(newGrid, p, '#'); + } + } + + private char get(char[][] grid, Point pos) { + return grid[pos.y][pos.x]; + } + + private void set(char[][] grid, Point pos, char c) { + grid[pos.y][pos.x] = c; + } + + private int nAdjecent(int layer, Point pos) { + int res = 0; + Point[] surround = new Point[]{new Point(2, 1), new Point(1, 2), new Point(2, 3), new Point(3, 2)}; + if (layers.containsKey(layer + 1)) { + List> conditions = Arrays.asList(() -> pos.y == 0, () -> pos.x == 0, () -> pos.y == 4, () -> pos.x == 4); + res += IntStream.range(0, conditions.size()).filter(i -> conditions.get(i).get()).map(i -> num(layers.get(layer + 1), surround[i])).sum(); + } + if (layers.containsKey(layer - 1)) { + List> fs = Arrays.asList(i -> new Point(i, 0), i -> new Point(0, i), i -> new Point(i, 4), i -> new Point(4, i)); + res += IntStream.range(0, fs.size()).filter(i -> pos.equals(surround[i])).map(i -> nLayer(layer, fs.get(i))).sum(); + } + return res + nAdjecent(layers.get(layer), pos); + } + + public int nLayer(int layer, Function f) { + return IntStream.range(0, 5).map(i -> num(layers.get(layer - 1), f.apply(i))).sum(); + } + + public char[][] fill(char[][] arr, char el) { + streamGrid(arr).forEach(p -> set(arr, p, el)); + return arr; + } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day25.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day25.java index eff7ba90..86c03966 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day25.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day25.java @@ -1,51 +1,51 @@ package com.sbaars.adventofcode.year19.days; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; - -import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year19.Day2019; import com.sbaars.adventofcode.year19.intcode.IntcodeComputer; import com.sbaars.adventofcode.year19.intcode.RetentionPolicy; +import java.io.BufferedReader; +import java.io.InputStreamReader; public class Day25 extends Day2019 { - public static void main(String[] args) { - new Day25().play(); - } - - public Day25(){super(25);} - - private void play() { - IntcodeComputer ic = new IntcodeComputer(RetentionPolicy.EXIT_ON_EMPTY_INPUT, dayNumbers()); - while(true) { - long res; - while((res = ic.run()) != IntcodeComputer.STOP_CODE) System.out.print((char)res); - try { - ic.setInput(new BufferedReader(new InputStreamReader(System.in)).readLine() + "\n"); - } catch (Exception e){} - } - } - - @Override - public Object part1() { - IntcodeComputer ic = new IntcodeComputer(RetentionPolicy.EXIT_ON_EMPTY_INPUT, dayNumbers()); - String[] inputs = new String [] {"west", "take semiconductor", "west", "take planetoid", "west", "take food ration", "west", "take fixed point", "east", "east", "south", "east", "east", "north", "east", "north"}; - String numbers = ""; - for(int i = 0; i<=inputs.length; i++) { - long res; - while((res = ic.run()) != IntcodeComputer.STOP_CODE) { - if(Character.isDigit((char)res)) numbers += (char)res; - } - if(i == inputs.length) return numbers.substring(1); - ic.setInput(inputs[i]+"\n"); - } - return 0; - } - - @Override - public Object part2() { - return "MERRY CHRISTMAS!!"; - } + public Day25() { + super(25); + } + + public static void main(String[] args) { + new Day25().play(); + } + + private void play() { + IntcodeComputer ic = new IntcodeComputer(RetentionPolicy.EXIT_ON_EMPTY_INPUT, dayNumbers()); + while (true) { + long res; + while ((res = ic.run()) != IntcodeComputer.STOP_CODE) System.out.print((char) res); + try { + ic.setInput(new BufferedReader(new InputStreamReader(System.in)).readLine() + "\n"); + } catch (Exception e) { + } + } + } + + @Override + public Object part1() { + IntcodeComputer ic = new IntcodeComputer(RetentionPolicy.EXIT_ON_EMPTY_INPUT, dayNumbers()); + String[] inputs = new String[]{"west", "take semiconductor", "west", "take planetoid", "west", "take food ration", "west", "take fixed point", "east", "east", "south", "east", "east", "north", "east", "north"}; + String numbers = ""; + for (int i = 0; i <= inputs.length; i++) { + long res; + while ((res = ic.run()) != IntcodeComputer.STOP_CODE) { + if (Character.isDigit((char) res)) numbers += (char) res; + } + if (i == inputs.length) return numbers.substring(1); + ic.setInput(inputs[i] + "\n"); + } + return 0; + } + + @Override + public Object part2() { + return "MERRY CHRISTMAS!!"; + } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day3.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day3.java index f784ba3c..a17906e4 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day3.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day3.java @@ -10,108 +10,116 @@ public class Day3 extends Day2019 { - private Set intersect; - - public Day3() { - super(3); - String[] strings = dayStrings(); - Walk[] walks1 = mapToWalks(strings[0]), walks2 = mapToWalks(strings[1]); - Set walkedLocations = new HashSet<>(); - calculateDistance(walks1, walkedLocations, false); - this.intersect = calculateDistance(walks2, walkedLocations, true); - } - - public static void main(String[] args) { - new Day3().printParts(); - } - - @Override - public Object part1() { - return intersect.stream().mapToInt(e -> distance(e.point)).min().orElse(Integer.MAX_VALUE); - } - - @Override - public Object part2() { - return intersect.stream().mapToInt(e -> e.steps).min().orElse(Integer.MAX_VALUE); - } - - private Set calculateDistance(Walk[] walks1, Set walkedLocations, boolean collect) { - Set intersectingLocations = new HashSet<>(); - int x = 0, y = 0, steps = 0; - for(Walk walk : walks1) { - for(;walk.distance>0;walk.distance--) { - switch(walk.dir) { - case NORTH: y++; break; - case SOUTH: y--; break; - case WEST: x--; break; - case EAST: x++; break; - } - performStep(walkedLocations, collect, intersectingLocations, x, y, steps); - steps++; - } - } - return intersectingLocations; - } - - private void performStep(Set walkedLocations, boolean collect, Set intersectingLocations, int x, int y, int steps) { - Step currentStep = new Step(new Point(x,y), steps); - if(collect) { - if(walkedLocations.contains(currentStep) && !intersectingLocations.contains(currentStep)) { - Step step = walkedLocations.stream().filter(e -> e.equals(currentStep)).findAny().get(); - intersectingLocations.add(step); - step.combine(currentStep); - } - } else { - walkedLocations.add(currentStep); - } - } - - public int distance(Point p) { - return Math.abs(p.x) + Math.abs(p.y); - } - - private Walk[] mapToWalks(String string) { - return Arrays.stream(string.split(",")).map(Walk::new).toArray(Walk[]::new); - } - - class Walk { - private final Direction dir; - private int distance; - - public Walk(String code) { - this.dir = Direction.getByDirCode(code.charAt(0)); - this.distance = Integer.parseInt(code.substring(1)); - } - } - - class Step { - private final Point point; - private int steps; - private boolean isCombined = false; - - public Step(Point point, int steps) { - this.point = point; - this.steps = steps + 1; - } - - public void combine(Step step) { - if(!isCombined) { - steps+=step.steps; - isCombined = true; - } - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Step step = (Step) o; - return Objects.equal(point, step.point); - } - - @Override - public int hashCode() { - return Objects.hashCode(point); - } - } + private final Set intersect; + + public Day3() { + super(3); + String[] strings = dayStrings(); + Walk[] walks1 = mapToWalks(strings[0]), walks2 = mapToWalks(strings[1]); + Set walkedLocations = new HashSet<>(); + calculateDistance(walks1, walkedLocations, false); + this.intersect = calculateDistance(walks2, walkedLocations, true); + } + + public static void main(String[] args) { + new Day3().printParts(); + } + + @Override + public Object part1() { + return intersect.stream().mapToInt(e -> distance(e.point)).min().orElse(Integer.MAX_VALUE); + } + + @Override + public Object part2() { + return intersect.stream().mapToInt(e -> e.steps).min().orElse(Integer.MAX_VALUE); + } + + private Set calculateDistance(Walk[] walks1, Set walkedLocations, boolean collect) { + Set intersectingLocations = new HashSet<>(); + int x = 0, y = 0, steps = 0; + for (Walk walk : walks1) { + for (; walk.distance > 0; walk.distance--) { + switch (walk.dir) { + case NORTH: + y++; + break; + case SOUTH: + y--; + break; + case WEST: + x--; + break; + case EAST: + x++; + break; + } + performStep(walkedLocations, collect, intersectingLocations, x, y, steps); + steps++; + } + } + return intersectingLocations; + } + + private void performStep(Set walkedLocations, boolean collect, Set intersectingLocations, int x, int y, int steps) { + Step currentStep = new Step(new Point(x, y), steps); + if (collect) { + if (walkedLocations.contains(currentStep) && !intersectingLocations.contains(currentStep)) { + Step step = walkedLocations.stream().filter(e -> e.equals(currentStep)).findAny().get(); + intersectingLocations.add(step); + step.combine(currentStep); + } + } else { + walkedLocations.add(currentStep); + } + } + + public int distance(Point p) { + return Math.abs(p.x) + Math.abs(p.y); + } + + private Walk[] mapToWalks(String string) { + return Arrays.stream(string.split(",")).map(Walk::new).toArray(Walk[]::new); + } + + class Walk { + private final Direction dir; + private int distance; + + public Walk(String code) { + this.dir = Direction.getByDirCode(code.charAt(0)); + this.distance = Integer.parseInt(code.substring(1)); + } + } + + class Step { + private final Point point; + private int steps; + private boolean isCombined = false; + + public Step(Point point, int steps) { + this.point = point; + this.steps = steps + 1; + } + + public void combine(Step step) { + if (!isCombined) { + steps += step.steps; + isCombined = true; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Step step = (Step) o; + return Objects.equal(point, step.point); + } + + @Override + public int hashCode() { + return Objects.hashCode(point); + } + } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day4.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day4.java index 29dca5c7..136d1c96 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day4.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day4.java @@ -1,59 +1,55 @@ package com.sbaars.adventofcode.year19.days; -import java.io.IOException; -import java.util.stream.IntStream; - -import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year19.Day2019; +import java.util.stream.IntStream; public class Day4 extends Day2019 { - public Day4(){ - super(4); - } - - public static void main(String[] args) { - new Day4().printParts(); - } - - @Override - public Object part1() { - return checkPasswords(false); - } - - @Override - public Object part2() { - return checkPasswords(true); - } - - public long meetsCriteria(int lowerBound, int higherBound, boolean checkGroup) { - return IntStream.range(lowerBound, higherBound+1).filter(e -> meetsCriteria(e, checkGroup)).count(); - } - - public boolean meetsCriteria(int input, boolean checkGroup) - { - int lastSeen = 10, current, adjacentTheSame = -2, skip = 10; - - for (int i = 0; input > 0; i++) { - current = input % 10; - if(skip != current && current == lastSeen) { - if(checkGroup && adjacentTheSame+1 == i) { - adjacentTheSame = -2; - skip = current; - } else if(adjacentTheSame == -2) { - adjacentTheSame = i; - } - } - if (lastSeen < current) - return false; - lastSeen = current; - input /= 10; - } - - return adjacentTheSame!=-2; - } - - private int checkPasswords(boolean checkGroup) { - return Math.toIntExact(meetsCriteria(372037, 905157, checkGroup)); - } + public Day4() { + super(4); + } + + public static void main(String[] args) { + new Day4().printParts(); + } + + @Override + public Object part1() { + return checkPasswords(false); + } + + @Override + public Object part2() { + return checkPasswords(true); + } + + public long meetsCriteria(int lowerBound, int higherBound, boolean checkGroup) { + return IntStream.range(lowerBound, higherBound + 1).filter(e -> meetsCriteria(e, checkGroup)).count(); + } + + public boolean meetsCriteria(int input, boolean checkGroup) { + int lastSeen = 10, current, adjacentTheSame = -2, skip = 10; + + for (int i = 0; input > 0; i++) { + current = input % 10; + if (skip != current && current == lastSeen) { + if (checkGroup && adjacentTheSame + 1 == i) { + adjacentTheSame = -2; + skip = current; + } else if (adjacentTheSame == -2) { + adjacentTheSame = i; + } + } + if (lastSeen < current) + return false; + lastSeen = current; + input /= 10; + } + + return adjacentTheSame != -2; + } + + private int checkPasswords(boolean checkGroup) { + return Math.toIntExact(meetsCriteria(372037, 905157, checkGroup)); + } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day5.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day5.java index 135e9c7b..4b7c7e8b 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day5.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day5.java @@ -1,30 +1,27 @@ package com.sbaars.adventofcode.year19.days; -import java.io.IOException; - -import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year19.Day2019; import com.sbaars.adventofcode.year19.intcode.IntcodeComputer; public class Day5 extends Day2019 { - public Day5(){ - super(5); - } + public Day5() { + super(5); + } - public static void main(String[] args) { - new Day5().printParts(); - } + public static void main(String[] args) { + new Day5().printParts(); + } - @Override - public Object part1() { - long res; - IntcodeComputer intcodeComputer = new IntcodeComputer(5, 1); - while((res = intcodeComputer.run()) == 0); - return res; - } + @Override + public Object part1() { + long res; + IntcodeComputer intcodeComputer = new IntcodeComputer(5, 1); + while ((res = intcodeComputer.run()) == 0) ; + return res; + } - @Override - public Object part2() { - return new IntcodeComputer(5, 5).run(); - } + @Override + public Object part2() { + return new IntcodeComputer(5, 5).run(); + } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day6.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day6.java index 7f7a33fb..b0e25ea2 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day6.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day6.java @@ -1,82 +1,77 @@ package com.sbaars.adventofcode.year19.days; import com.google.common.collect.ArrayListMultimap; -import java.io.IOException; +import com.sbaars.adventofcode.year19.Day2019; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Map.Entry; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; -import com.sbaars.adventofcode.common.Day; -import com.sbaars.adventofcode.year19.Day2019; - public class Day6 extends Day2019 { - public Day6(){ - super(6); - } + ArrayListMultimap orbits = ArrayListMultimap.create(); - ArrayListMultimap orbits = ArrayListMultimap.create(); + public Day6() { + super(6); + } - public static void main(String[] args) - { - new Day6().printParts(); - } + public static void main(String[] args) { + new Day6().printParts(); + } - @Override - public Object part1() { - String[] nums = dayStrings(); - for(String num : nums) { - String[] parts = num.split("\\)"); - orbits.put(parts[0], parts[1]); - } - AtomicInteger o = new AtomicInteger(); - for(Entry> entry : orbits.asMap().entrySet()) - countOrbitsInList(orbits, o, entry.getValue()); - return o.get(); - } + @Override + public Object part1() { + String[] nums = dayStrings(); + for (String num : nums) { + String[] parts = num.split("\\)"); + orbits.put(parts[0], parts[1]); + } + AtomicInteger o = new AtomicInteger(); + for (Entry> entry : orbits.asMap().entrySet()) + countOrbitsInList(orbits, o, entry.getValue()); + return o.get(); + } - private void countOrbitsInList(ArrayListMultimap orbits, AtomicInteger o, Collection entry) { - for(String str : entry) { - o.incrementAndGet(); - if(orbits.containsKey(str)) { - countOrbitsInList(orbits, o, orbits.get(str)); - } - } - } + private void countOrbitsInList(ArrayListMultimap orbits, AtomicInteger o, Collection entry) { + for (String str : entry) { + o.incrementAndGet(); + if (orbits.containsKey(str)) { + countOrbitsInList(orbits, o, orbits.get(str)); + } + } + } - @Override - public Object part2() { - return findRoute("YOU", "SAN"); - } + @Override + public Object part2() { + return findRoute("YOU", "SAN"); + } - private int findRoute(String from, String to) { - return findRoute(from, to, new ArrayList<>(), 0); - } + private int findRoute(String from, String to) { + return findRoute(from, to, new ArrayList<>(), 0); + } - private int findRoute(String from, String to, List visited, int depth) { - if(visited.contains(from)) - return 0; - visited.add(from); - List str = collectAll(from); - if(str.contains(to)) - return depth-1; - for(String s : str) { - int findRoute = findRoute(s, to, visited, depth + 1); - if(findRoute>0) return findRoute; - } - return -1; - } + private int findRoute(String from, String to, List visited, int depth) { + if (visited.contains(from)) + return 0; + visited.add(from); + List str = collectAll(from); + if (str.contains(to)) + return depth - 1; + for (String s : str) { + int findRoute = findRoute(s, to, visited, depth + 1); + if (findRoute > 0) return findRoute; + } + return -1; + } - private List collectAll(String s1) { - List s = findOrbit(s1); - s.addAll(orbits.get(s1)); - return s; - } + private List collectAll(String s1) { + List s = findOrbit(s1); + s.addAll(orbits.get(s1)); + return s; + } - public List findOrbit(String orbitValue) { - return orbits.asMap().entrySet().stream().filter(e -> e.getValue().contains(orbitValue)).map(e -> e.getKey()).collect(Collectors.toList()); - } + public List findOrbit(String orbitValue) { + return orbits.asMap().entrySet().stream().filter(e -> e.getValue().contains(orbitValue)).map(e -> e.getKey()).collect(Collectors.toList()); + } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day7.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day7.java index d7292cec..c7155770 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day7.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day7.java @@ -1,77 +1,75 @@ package com.sbaars.adventofcode.year19.days; -import java.io.IOException; +import com.sbaars.adventofcode.year19.Day2019; +import com.sbaars.adventofcode.year19.intcode.IntcodeComputer; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import com.sbaars.adventofcode.common.Day; -import com.sbaars.adventofcode.year19.Day2019; -import com.sbaars.adventofcode.year19.intcode.IntcodeComputer; - public class Day7 extends Day2019 { - public Day7(){ - super(7); - } + public Day7() { + super(7); + } - public static void main(String[] args) { - new Day7().printParts(); - } + public static void main(String[] args) { + new Day7().printParts(); + } - @Override - public Object part1() { - var permutations = generatePerm(new ArrayList<>(Arrays.asList(0,1,2,3,4))); - List results = new ArrayList<>(); - for(List perm : permutations) { - long lastVal = 0; - for(Integer i : perm) - lastVal = new IntcodeComputer(7, i, lastVal).run(); - results.add(lastVal); + @Override + public Object part1() { + var permutations = generatePerm(new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4))); + List results = new ArrayList<>(); + for (List perm : permutations) { + long lastVal = 0; + for (Integer i : perm) + lastVal = new IntcodeComputer(7, i, lastVal).run(); + results.add(lastVal); - } - return results.stream().mapToLong(e -> e).max().getAsLong(); - } + } + return results.stream().mapToLong(e -> e).max().getAsLong(); + } - @Override - public Object part2() { - var permutations = generatePerm(new ArrayList<>(Arrays.asList(5,6,7,8,9))); - List results = new ArrayList<>(); - perms: for(List shuffle : permutations) { - IntcodeComputer[] computers = new IntcodeComputer[5]; - for(int i = 0; i(Arrays.asList(5, 6, 7, 8, 9))); + List results = new ArrayList<>(); + perms: + for (List shuffle : permutations) { + IntcodeComputer[] computers = new IntcodeComputer[5]; + for (int i = 0; i < computers.length; i++) computers[i] = new IntcodeComputer(7, shuffle.get(i)); + long lastVal = 0; + while (true) { + for (IntcodeComputer c : computers) { + c.addInput(lastVal); + long thruster = lastVal; + lastVal = c.run(); + if (lastVal == IntcodeComputer.STOP_CODE) { + results.add(thruster); + continue perms; + } + } + } - } - return results.stream().mapToLong(e -> e).max().getAsLong(); - } + } + return results.stream().mapToLong(e -> e).max().getAsLong(); + } - public List> generatePerm(List original) { - if (original.isEmpty()) { - List> result = new ArrayList<>(); - result.add(new ArrayList()); - return result; - } - E firstElement = original.remove(0); - List> returnValue = new ArrayList<>(); - List> permutations = generatePerm(original); - for (List smallerPermutated : permutations) { - for (int index=0; index <= smallerPermutated.size(); index++) { - List temp = new ArrayList<>(smallerPermutated); - temp.add(index, firstElement); - returnValue.add(temp); - } - } - return returnValue; - } + public List> generatePerm(List original) { + if (original.isEmpty()) { + List> result = new ArrayList<>(); + result.add(new ArrayList()); + return result; + } + E firstElement = original.remove(0); + List> returnValue = new ArrayList<>(); + List> permutations = generatePerm(original); + for (List smallerPermutated : permutations) { + for (int index = 0; index <= smallerPermutated.size(); index++) { + List temp = new ArrayList<>(smallerPermutated); + temp.add(index, firstElement); + returnValue.add(temp); + } + } + return returnValue; + } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day8.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day8.java index e7761225..674603d1 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day8.java @@ -1,73 +1,70 @@ package com.sbaars.adventofcode.year19.days; -import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.common.ProcessesImages; import com.sbaars.adventofcode.year19.Day2019; import com.sbaars.adventofcode.year19.util.CountMap; -import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.stream.IntStream; public class Day8 extends Day2019 implements ProcessesImages { - public Day8(){ - super(8); - } + private static final int DIM_X = 6; + private static final int DIM_Y = 25; + private static final int SIZE = DIM_X * DIM_Y; + public Day8() { + super(8); + } - private static final int DIM_X = 6; - private static final int DIM_Y = 25; - private static final int SIZE = DIM_X*DIM_Y; + public static void main(String[] args) { + new Day8().printParts(); + } - public static void main(String[] args) { - new Day8().printParts(); - } + @Override + public Object part1() { + int[] pixels = readPixels(); + var pixelCounts = countPixels(pixels); + var cm = pixelCounts.stream().reduce((e1, e2) -> e1.get(0) > e2.get(0) ? e2 : e1).get(); + return cm.get(1) * cm.get(2); + } - @Override - public Object part1() { - int[] pixels = readPixels(); - var pixelCounts = countPixels(pixels); - var cm = pixelCounts.stream().reduce((e1, e2) -> e1.get(0) > e2.get(0) ? e2 : e1).get(); - return cm.get(1) * cm.get(2); - } + private int[] readPixels() { + char[] chars = day().toCharArray(); + return IntStream.range(0, chars.length).map(i -> Character.getNumericValue(chars[i])).toArray(); + } - private int[] readPixels() { - char[] chars = day().toCharArray(); - return IntStream.range(0, chars.length).map(i -> Character.getNumericValue(chars[i])).toArray(); - } + private List> countPixels(int[] pixels) { + List> pixelCounts = new ArrayList<>(); + for (int i = 0; i < pixels.length; i += SIZE) { + CountMap cm = new CountMap<>(); + for (int j = i; j < i + SIZE; j++) { + cm.increment(pixels[j]); + } + pixelCounts.add(cm); + } + return pixelCounts; + } - private List> countPixels(int[] pixels) { - List> pixelCounts = new ArrayList<>(); - for(int i = 0; i cm = new CountMap<>(); - for(int j = i; j input = new ArrayDeque<>(2); - private long lastInput; - private long relativeBase = 0; - private static final int[] DO_NOT_TRANSFORM_FINAL_ARGUMENT = {1, 2, 3, 7, 8}; - public static final long STOP_CODE = Long.MIN_VALUE+1; - private static final long CONTINUE_CODE = Long.MIN_VALUE; - public RetentionPolicy policy; - - public IntcodeComputer(RetentionPolicy policy, long[] program, long...input) { - super(0); - this.program = Arrays.copyOf(program, 10000); - setInput(input); - this.policy = policy; - } - - public IntcodeComputer(int day, long...input) { - super(day); - this.program = dayNumbers(","); - this.program = Arrays.copyOf(this.program, 10000); - if(day == 2) { - this.program[1] = input[0]; - this.program[2] = input[1]; - } else if(day == 17) { - this.program[0] = input[0]; - } - setInput(input); - this.policy = RetentionPolicy.EXIT_ON_OUTPUT; - } - - public long run(long...input) { - setInput(input); - return run(); - } - - public long run() { - long result; - while((result = executeInstruction(Math.toIntExact(program[instructionCounter]))) == CONTINUE_CODE); - return result; - } - - private long executeInstruction(int instruction) { - if(instruction>99) - return parseComplexInstruction(instruction); - return execute(instruction); - } - - private long execute(int instruction) { - return execute(new int[3], instruction); - } - - private long execute(int[] method, int instruction) { - int nParams = nParams(instruction); - long[] args = IntStream.range(1, nParams+1).mapToLong(j -> program[instructionCounter+j]).toArray(); - transformParameters(method, args, instruction); - return executeInstruction(args, instruction); - } - - private void transformParameters(int[] method, long[] args, int instruction) { - IntStream.range(0, args.length).filter(i -> method[i] != 1).filter(i -> i+1 != args.length || !Arrays.stream(DO_NOT_TRANSFORM_FINAL_ARGUMENT).anyMatch(j -> j==instruction)) - .forEach(i -> args[i] = program[Math.toIntExact((method[i] == 2 ? relativeBase : 0) + args[i])]); - if(Arrays.stream(DO_NOT_TRANSFORM_FINAL_ARGUMENT).anyMatch(j -> j==instruction) && method[args.length-1] == 2) { - args[args.length-1] += relativeBase; - } - } - - private long readInput() { - if(input.isEmpty()) - return lastInput; - lastInput = input.poll(); - return lastInput; - } - - public void addInput(long...num) { - for(long n : num) - input.add(n); - } - - public long firstElement() { - return program[0]; - } - - public void setInput(long...input) { - this.input.clear(); - addInput(input); - } - - private long executeInstruction(long[] args, int instruction) { - if(instruction == 3 && policy == RetentionPolicy.EXIT_ON_EMPTY_INPUT && input.size() == 0) - return STOP_CODE; - instructionCounter+=nParams(instruction) + 1; - switch(instruction) { - case 1: program[Math.toIntExact(args[2])] = args[0] + args[1]; break; - case 2: program[Math.toIntExact(args[2])] = args[0] * args[1]; break; - case 3: program[Math.toIntExact(args[0])] = readInput(); break; - case 4: return args[0]; - case 5: if(args[0] != 0) instructionCounter = Math.toIntExact(args[1]); break; - case 6: if(args[0] == 0) instructionCounter = Math.toIntExact(args[1]); break; - case 7: program[Math.toIntExact(args[2])] = args[0] < args[1] ? 1 : 0; break; - case 8: program[Math.toIntExact(args[2])] = args[0] == args[1] ? 1 : 0; break; - case 9: relativeBase += Math.toIntExact(args[0]); break; - case 99: return STOP_CODE; - default: throw new IllegalStateException("Something went wrong!"); - } - return CONTINUE_CODE; - } - - private long parseComplexInstruction(int instruction) { - int[] instructions = getInstructions(instruction); - int opcode = getOpCode(instructions); - return execute(new int[] {instructions[2], instructions[1], instructions[0]}, opcode); - } - - private int getOpCode(int instruction) { - return getOpCode(getInstructions(instruction)); - } - - private int getOpCode(int[] instructions) { - return (instructions[3] * 10) + instructions[4]; - } - - private int[] getInstructions(int instruction) { - int[] instructions = new int[5]; - for(int j = instructions.length-1; instruction>0; j--) { - instructions[j] = instruction % 10; - instruction /= 10; - } - return instructions; - } - - private int nParams(int instruction) { - switch(instruction) { - case 99: return -1; - case 3: - case 4: - case 9: return 1; - case 5: - case 6: return 2; - case 1: - case 2: - case 7: - case 8: return 3; - default: if(instruction>99) return nParams(getOpCode(instruction)); - else throw new IllegalStateException("Something went wrong! "+instruction); - } - } - - public void setElement(int i, long j) { - program[i] = j; - } - - public void setInput(String patterns) { - setInput(patterns.chars().mapToLong(e -> e).toArray()); - } - - @Override - public Object part1() { - return null; - } - - @Override - public Object part2() { - return null; - } + public static final long STOP_CODE = Long.MIN_VALUE + 1; + private static final int[] DO_NOT_TRANSFORM_FINAL_ARGUMENT = {1, 2, 3, 7, 8}; + private static final long CONTINUE_CODE = Long.MIN_VALUE; + private final Queue input = new ArrayDeque<>(2); + public RetentionPolicy policy; + private long[] program; + private int instructionCounter = 0; + private long lastInput; + private long relativeBase = 0; + + public IntcodeComputer(RetentionPolicy policy, long[] program, long... input) { + super(0); + this.program = Arrays.copyOf(program, 10000); + setInput(input); + this.policy = policy; + } + + public IntcodeComputer(int day, long... input) { + super(day); + this.program = dayNumbers(","); + this.program = Arrays.copyOf(this.program, 10000); + if (day == 2) { + this.program[1] = input[0]; + this.program[2] = input[1]; + } else if (day == 17) { + this.program[0] = input[0]; + } + setInput(input); + this.policy = RetentionPolicy.EXIT_ON_OUTPUT; + } + + public long run(long... input) { + setInput(input); + return run(); + } + + public long run() { + long result; + while ((result = executeInstruction(Math.toIntExact(program[instructionCounter]))) == CONTINUE_CODE) ; + return result; + } + + private long executeInstruction(int instruction) { + if (instruction > 99) + return parseComplexInstruction(instruction); + return execute(instruction); + } + + private long execute(int instruction) { + return execute(new int[3], instruction); + } + + private long execute(int[] method, int instruction) { + int nParams = nParams(instruction); + long[] args = IntStream.range(1, nParams + 1).mapToLong(j -> program[instructionCounter + j]).toArray(); + transformParameters(method, args, instruction); + return executeInstruction(args, instruction); + } + + private void transformParameters(int[] method, long[] args, int instruction) { + IntStream.range(0, args.length).filter(i -> method[i] != 1).filter(i -> i + 1 != args.length || !Arrays.stream(DO_NOT_TRANSFORM_FINAL_ARGUMENT).anyMatch(j -> j == instruction)) + .forEach(i -> args[i] = program[Math.toIntExact((method[i] == 2 ? relativeBase : 0) + args[i])]); + if (Arrays.stream(DO_NOT_TRANSFORM_FINAL_ARGUMENT).anyMatch(j -> j == instruction) && method[args.length - 1] == 2) { + args[args.length - 1] += relativeBase; + } + } + + private long readInput() { + if (input.isEmpty()) + return lastInput; + lastInput = input.poll(); + return lastInput; + } + + public void addInput(long... num) { + for (long n : num) + input.add(n); + } + + public long firstElement() { + return program[0]; + } + + public void setInput(long... input) { + this.input.clear(); + addInput(input); + } + + private long executeInstruction(long[] args, int instruction) { + if (instruction == 3 && policy == RetentionPolicy.EXIT_ON_EMPTY_INPUT && input.size() == 0) + return STOP_CODE; + instructionCounter += nParams(instruction) + 1; + switch (instruction) { + case 1: + program[Math.toIntExact(args[2])] = args[0] + args[1]; + break; + case 2: + program[Math.toIntExact(args[2])] = args[0] * args[1]; + break; + case 3: + program[Math.toIntExact(args[0])] = readInput(); + break; + case 4: + return args[0]; + case 5: + if (args[0] != 0) instructionCounter = Math.toIntExact(args[1]); + break; + case 6: + if (args[0] == 0) instructionCounter = Math.toIntExact(args[1]); + break; + case 7: + program[Math.toIntExact(args[2])] = args[0] < args[1] ? 1 : 0; + break; + case 8: + program[Math.toIntExact(args[2])] = args[0] == args[1] ? 1 : 0; + break; + case 9: + relativeBase += Math.toIntExact(args[0]); + break; + case 99: + return STOP_CODE; + default: + throw new IllegalStateException("Something went wrong!"); + } + return CONTINUE_CODE; + } + + private long parseComplexInstruction(int instruction) { + int[] instructions = getInstructions(instruction); + int opcode = getOpCode(instructions); + return execute(new int[]{instructions[2], instructions[1], instructions[0]}, opcode); + } + + private int getOpCode(int instruction) { + return getOpCode(getInstructions(instruction)); + } + + private int getOpCode(int[] instructions) { + return (instructions[3] * 10) + instructions[4]; + } + + private int[] getInstructions(int instruction) { + int[] instructions = new int[5]; + for (int j = instructions.length - 1; instruction > 0; j--) { + instructions[j] = instruction % 10; + instruction /= 10; + } + return instructions; + } + + private int nParams(int instruction) { + switch (instruction) { + case 99: + return -1; + case 3: + case 4: + case 9: + return 1; + case 5: + case 6: + return 2; + case 1: + case 2: + case 7: + case 8: + return 3; + default: + if (instruction > 99) return nParams(getOpCode(instruction)); + else throw new IllegalStateException("Something went wrong! " + instruction); + } + } + + public void setElement(int i, long j) { + program[i] = j; + } + + public void setInput(String patterns) { + setInput(patterns.chars().mapToLong(e -> e).toArray()); + } + + @Override + public Object part1() { + return null; + } + + @Override + public Object part2() { + return null; + } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/intcode/RetentionPolicy.java b/src/main/java/com/sbaars/adventofcode/year19/intcode/RetentionPolicy.java index 48820c45..719d0b1f 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/intcode/RetentionPolicy.java +++ b/src/main/java/com/sbaars/adventofcode/year19/intcode/RetentionPolicy.java @@ -1,5 +1,5 @@ package com.sbaars.adventofcode.year19.intcode; public enum RetentionPolicy { - EXIT_ON_EMPTY_INPUT, EXIT_ON_OUTPUT + EXIT_ON_EMPTY_INPUT, EXIT_ON_OUTPUT } diff --git a/src/main/java/com/sbaars/adventofcode/year19/pathfinding/CharGrid2d.java b/src/main/java/com/sbaars/adventofcode/year19/pathfinding/CharGrid2d.java index 813e6b9b..56706ad7 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/pathfinding/CharGrid2d.java +++ b/src/main/java/com/sbaars/adventofcode/year19/pathfinding/CharGrid2d.java @@ -1,6 +1,6 @@ package com.sbaars.adventofcode.year19.pathfinding; -import java.awt.Point; +import java.awt.*; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -10,124 +10,120 @@ * Creates nodes and neighbours from a 2d grid. Each point in the map has an * integer value that specifies the cost of crossing that point. If this value * is negative, the point is unreachable. - * + *

* If diagonal movement is allowed, the Chebyshev distance is used, else * Manhattan distance is used. - * + * * @author Ben Ruijl - * */ public class CharGrid2d { - private final char[][] map; - private final boolean allowDiagonal; - List collectedKeys; - - /** - * A node in a 2d map. This is simply the coordinates of the point. - * - * @author Ben Ruijl - * - */ - public class MapNode implements Node { - private final int x, y; - - public MapNode(int x, int y) { - this.x = x; - this.y = y; - } - - public double getHeuristic(MapNode goal) { - if (allowDiagonal) { - return Math.max(Math.abs(x - goal.x), Math.abs(y - goal.y)); - } else { - return Math.abs(x - goal.x) + Math.abs(y - goal.y); - } - } - - public double getTraversalCost(MapNode neighbour) { - return 1 + map[neighbour.y][neighbour.x]; - } - - public Set getNeighbours() { - Set neighbours = new HashSet(); - - for (int i = x - 1; i <= x + 1; i++) { - for (int j = y - 1; j <= y + 1; j++) { - if ((i == x && j == y) || i < 0 || j < 0 || j >= map.length - || i >= map[j].length) { - continue; - } - - if (!allowDiagonal && - ((i < x && j < y) || - (i < x && j > y) || - (i > x && j > y) || - (i > x && j < y))) { - continue; - } - - if (map[j][i] == '#') { - continue; - } - - // TODO: create cache instead of recreation - neighbours.add(new MapNode(i, j)); - } - } - - return neighbours; - } - - @Override - public String toString() { - return "(" + x + ", " + y + ")"; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + getOuterType().hashCode(); - result = prime * result + x; - result = prime * result + y; - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - MapNode other = (MapNode) obj; - if (!getOuterType().equals(other.getOuterType())) - return false; - if (x != other.x) - return false; - if (y != other.y) - return false; - return true; - } - - public Point toPoint() { - return new Point(x, y); - } - - private CharGrid2d getOuterType() { - return CharGrid2d.this; - } - - } - - public CharGrid2d(char[][] map, boolean allowDiagonal) { - this.map = map; - this.allowDiagonal = allowDiagonal; - } - - public List findPath(Point start, Point end) { - return PathFinding.doAStar(new MapNode(start.x, start.y), new MapNode(end.x, end.y)).stream().map(MapNode::toPoint).collect(Collectors.toList()); - } + private final char[][] map; + private final boolean allowDiagonal; + List collectedKeys; + + public CharGrid2d(char[][] map, boolean allowDiagonal) { + this.map = map; + this.allowDiagonal = allowDiagonal; + } + + public List findPath(Point start, Point end) { + return PathFinding.doAStar(new MapNode(start.x, start.y), new MapNode(end.x, end.y)).stream().map(MapNode::toPoint).collect(Collectors.toList()); + } + + /** + * A node in a 2d map. This is simply the coordinates of the point. + * + * @author Ben Ruijl + */ + public class MapNode implements Node { + private final int x, y; + + public MapNode(int x, int y) { + this.x = x; + this.y = y; + } + + public double getHeuristic(MapNode goal) { + if (allowDiagonal) { + return Math.max(Math.abs(x - goal.x), Math.abs(y - goal.y)); + } else { + return Math.abs(x - goal.x) + Math.abs(y - goal.y); + } + } + + public double getTraversalCost(MapNode neighbour) { + return 1 + map[neighbour.y][neighbour.x]; + } + + public Set getNeighbours() { + Set neighbours = new HashSet(); + + for (int i = x - 1; i <= x + 1; i++) { + for (int j = y - 1; j <= y + 1; j++) { + if ((i == x && j == y) || i < 0 || j < 0 || j >= map.length + || i >= map[j].length) { + continue; + } + + if (!allowDiagonal && + ((i < x && j < y) || + (i < x && j > y) || + (i > x && j > y) || + (i > x && j < y))) { + continue; + } + + if (map[j][i] == '#') { + continue; + } + + // TODO: create cache instead of recreation + neighbours.add(new MapNode(i, j)); + } + } + + return neighbours; + } + + @Override + public String toString() { + return "(" + x + ", " + y + ")"; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + getOuterType().hashCode(); + result = prime * result + x; + result = prime * result + y; + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + MapNode other = (MapNode) obj; + if (!getOuterType().equals(other.getOuterType())) + return false; + if (x != other.x) + return false; + return y == other.y; + } + + public Point toPoint() { + return new Point(x, y); + } + + private CharGrid2d getOuterType() { + return CharGrid2d.this; + } + + } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/pathfinding/Grid2d.java b/src/main/java/com/sbaars/adventofcode/year19/pathfinding/Grid2d.java index 3c2e98ee..b3d1b666 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/pathfinding/Grid2d.java +++ b/src/main/java/com/sbaars/adventofcode/year19/pathfinding/Grid2d.java @@ -1,7 +1,7 @@ package com.sbaars.adventofcode.year19.pathfinding; import com.sbaars.adventofcode.year19.days.Day15; -import java.awt.Point; +import java.awt.*; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -11,123 +11,119 @@ * Creates nodes and neighbours from a 2d grid. Each point in the map has an * integer value that specifies the cost of crossing that point. If this value * is negative, the point is unreachable. - * + *

* If diagonal movement is allowed, the Chebyshev distance is used, else * Manhattan distance is used. - * + * * @author Ben Ruijl - * */ public class Grid2d { - private final int[][] map; - private final boolean allowDiagonal; - - /** - * A node in a 2d map. This is simply the coordinates of the point. - * - * @author Ben Ruijl - * - */ - public class MapNode implements Node { - private final int x, y; - - public MapNode(int x, int y) { - this.x = x; - this.y = y; - } - - public double getHeuristic(MapNode goal) { - if (allowDiagonal) { - return Math.max(Math.abs(x - goal.x), Math.abs(y - goal.y)); - } else { - return Math.abs(x - goal.x) + Math.abs(y - goal.y); - } - } - - public double getTraversalCost(MapNode neighbour) { - return 1 + map[neighbour.y][neighbour.x]; - } - - public Set getNeighbours() { - Set neighbours = new HashSet(); - - for (int i = x - 1; i <= x + 1; i++) { - for (int j = y - 1; j <= y + 1; j++) { - if ((i == x && j == y) || i < 0 || j < 0 || j >= map.length - || i >= map[j].length) { - continue; - } - - if (!allowDiagonal && - ((i < x && j < y) || - (i < x && j > y) || - (i > x && j > y) || - (i > x && j < y))) { - continue; - } - - if (map[j][i] == Day15.WALL || map[j][i] == Day15.UNEXPLORED) { - continue; - } - - // TODO: create cache instead of recreation - neighbours.add(new MapNode(i, j)); - } - } - - return neighbours; - } - - @Override - public String toString() { - return "(" + x + ", " + y + ")"; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + getOuterType().hashCode(); - result = prime * result + x; - result = prime * result + y; - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - MapNode other = (MapNode) obj; - if (!getOuterType().equals(other.getOuterType())) - return false; - if (x != other.x) - return false; - if (y != other.y) - return false; - return true; - } - - public Point toPoint() { - return new Point(x, y); - } - - private Grid2d getOuterType() { - return Grid2d.this; - } - - } - - public Grid2d(int[][] map, boolean allowDiagonal) { - this.map = map; - this.allowDiagonal = allowDiagonal; - } - - public List findPath(Point start, Point end) { - return PathFinding.doAStar(new MapNode(start.x, start.y), new MapNode(end.x, end.y)).stream().map(MapNode::toPoint).collect(Collectors.toList()); - } + private final int[][] map; + private final boolean allowDiagonal; + + public Grid2d(int[][] map, boolean allowDiagonal) { + this.map = map; + this.allowDiagonal = allowDiagonal; + } + + public List findPath(Point start, Point end) { + return PathFinding.doAStar(new MapNode(start.x, start.y), new MapNode(end.x, end.y)).stream().map(MapNode::toPoint).collect(Collectors.toList()); + } + + /** + * A node in a 2d map. This is simply the coordinates of the point. + * + * @author Ben Ruijl + */ + public class MapNode implements Node { + private final int x, y; + + public MapNode(int x, int y) { + this.x = x; + this.y = y; + } + + public double getHeuristic(MapNode goal) { + if (allowDiagonal) { + return Math.max(Math.abs(x - goal.x), Math.abs(y - goal.y)); + } else { + return Math.abs(x - goal.x) + Math.abs(y - goal.y); + } + } + + public double getTraversalCost(MapNode neighbour) { + return 1 + map[neighbour.y][neighbour.x]; + } + + public Set getNeighbours() { + Set neighbours = new HashSet(); + + for (int i = x - 1; i <= x + 1; i++) { + for (int j = y - 1; j <= y + 1; j++) { + if ((i == x && j == y) || i < 0 || j < 0 || j >= map.length + || i >= map[j].length) { + continue; + } + + if (!allowDiagonal && + ((i < x && j < y) || + (i < x && j > y) || + (i > x && j > y) || + (i > x && j < y))) { + continue; + } + + if (map[j][i] == Day15.WALL || map[j][i] == Day15.UNEXPLORED) { + continue; + } + + // TODO: create cache instead of recreation + neighbours.add(new MapNode(i, j)); + } + } + + return neighbours; + } + + @Override + public String toString() { + return "(" + x + ", " + y + ")"; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + getOuterType().hashCode(); + result = prime * result + x; + result = prime * result + y; + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + MapNode other = (MapNode) obj; + if (!getOuterType().equals(other.getOuterType())) + return false; + if (x != other.x) + return false; + return y == other.y; + } + + public Point toPoint() { + return new Point(x, y); + } + + private Grid2d getOuterType() { + return Grid2d.this; + } + + } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/pathfinding/Node.java b/src/main/java/com/sbaars/adventofcode/year19/pathfinding/Node.java index f7f9294a..8bbccfeb 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/pathfinding/Node.java +++ b/src/main/java/com/sbaars/adventofcode/year19/pathfinding/Node.java @@ -1,40 +1,38 @@ package com.sbaars.adventofcode.year19.pathfinding; + import java.util.Set; /** * A node in a graph, useful for pathfinding. - * + * + * @param Actual type of the node * @author Ben Ruijl - * - * @param - * Actual type of the node */ public interface Node { - /** - * The heuristic cost to move from the current node to the goal. In most - * cases this is the Manhattan distance or Chebyshev distance. - * - * @param goal - * @return - */ - double getHeuristic(T goal); + /** + * The heuristic cost to move from the current node to the goal. In most + * cases this is the Manhattan distance or Chebyshev distance. + * + * @param goal + * @return + */ + double getHeuristic(T goal); - /** - * The cost of moving from the current node to the neighbour. In most cases - * this is just the distance between the nodes, but additional terrain cost - * can be added as well (for example climbing a mountain is more expensive - * than walking on a road). - * - * @param neighbour - * Neighbour of current node - * @return Traversal cost - */ - double getTraversalCost(T neighbour); + /** + * The cost of moving from the current node to the neighbour. In most cases + * this is just the distance between the nodes, but additional terrain cost + * can be added as well (for example climbing a mountain is more expensive + * than walking on a road). + * + * @param neighbour Neighbour of current node + * @return Traversal cost + */ + double getTraversalCost(T neighbour); - /** - * Gets the set of neighbouring nodes. - * - * @return Neighbouring nodes - */ - Set getNeighbours(); + /** + * Gets the set of neighbouring nodes. + * + * @return Neighbouring nodes + */ + Set getNeighbours(); } diff --git a/src/main/java/com/sbaars/adventofcode/year19/pathfinding/PathFinding.java b/src/main/java/com/sbaars/adventofcode/year19/pathfinding/PathFinding.java index 8f17862f..792b9e6a 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/pathfinding/PathFinding.java +++ b/src/main/java/com/sbaars/adventofcode/year19/pathfinding/PathFinding.java @@ -1,4 +1,5 @@ package com.sbaars.adventofcode.year19.pathfinding; + import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; @@ -11,77 +12,74 @@ /** * Helper class containing pathfinding algorithms. - * + * * @author Ben Ruijl - * */ public class PathFinding { - /** - * A Star pathfinding. Note that the heuristic has to be monotonic: - * {@code h(x) <= - * d(x, y) + h(y)}. - * - * @param start - * Starting node - * @param goal - * Goal node - * @return Shortest path from start to goal, or null if none found - */ - public static > List doAStar(T start, T goal) { - Set closed = new HashSet(); - Map fromMap = new HashMap(); - List route = new LinkedList(); - Map gScore = new HashMap(); - final Map fScore = new HashMap(); - PriorityQueue open = new PriorityQueue(11, new Comparator() { + /** + * A Star pathfinding. Note that the heuristic has to be monotonic: + * {@code h(x) <= + * d(x, y) + h(y)}. + * + * @param start Starting node + * @param goal Goal node + * @return Shortest path from start to goal, or null if none found + */ + public static > List doAStar(T start, T goal) { + Set closed = new HashSet(); + Map fromMap = new HashMap(); + List route = new LinkedList(); + Map gScore = new HashMap(); + final Map fScore = new HashMap(); + PriorityQueue open = new PriorityQueue(11, new Comparator() { - public int compare(T nodeA, T nodeB) { - return Double.compare(fScore.get(nodeA), fScore.get(nodeB)); - } - }); + public int compare(T nodeA, T nodeB) { + return Double.compare(fScore.get(nodeA), fScore.get(nodeB)); + } + }); - gScore.put(start, 0.0); - fScore.put(start, start.getHeuristic(goal)); - open.offer(start); + gScore.put(start, 0.0); + fScore.put(start, start.getHeuristic(goal)); + open.offer(start); - while (!open.isEmpty()) { - T current = open.poll(); - if (current.equals(goal)) { - while (current != null) { - route.add(0, current); - current = fromMap.get(current); - } + while (!open.isEmpty()) { + T current = open.poll(); + if (current.equals(goal)) { + while (current != null) { + route.add(0, current); + current = fromMap.get(current); + } - return route; - } + return route; + } - closed.add(current); + closed.add(current); - for (T neighbour : current.getNeighbours()) { - if (closed.contains(neighbour)) { - continue; - } + for (T neighbour : current.getNeighbours()) { + if (closed.contains(neighbour)) { + continue; + } - double tentG = gScore.get(current) - + current.getTraversalCost(neighbour); + double tentG = gScore.get(current) + + current.getTraversalCost(neighbour); - boolean contains = open.contains(neighbour); - if (!contains || tentG < gScore.get(neighbour)) { - gScore.put(neighbour, tentG); - fScore.put(neighbour, tentG + neighbour.getHeuristic(goal)); + boolean contains = open.contains(neighbour); + if (!contains || tentG < gScore.get(neighbour)) { + gScore.put(neighbour, tentG); + fScore.put(neighbour, tentG + neighbour.getHeuristic(goal)); - if (contains) { - open.remove(neighbour); - } + if (contains) { + open.remove(neighbour); + } - open.offer(neighbour); - fromMap.put(neighbour, current); - } - } - } + open.offer(neighbour); + fromMap.put(neighbour, current); + } + } + } - return new ArrayList<>(); - } + return new ArrayList<>(); + } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/util/CountMap.java b/src/main/java/com/sbaars/adventofcode/year19/util/CountMap.java index 8e6e779d..1498360d 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/util/CountMap.java +++ b/src/main/java/com/sbaars/adventofcode/year19/util/CountMap.java @@ -5,54 +5,54 @@ import java.util.stream.Collectors; public class CountMap extends HashMap { - /** - * - */ - private static final long serialVersionUID = 1L; - - public CountMap() { - } - - public CountMap(int initialCapacity, float loadFactor) { - super(initialCapacity, loadFactor); - } - - public CountMap(int initialCapacity) { - super(initialCapacity); - } - - public CountMap(Map m) { - super(m); - } - - public Integer increment(K key) { - return super.put(key, super.containsKey(key) ? super.get(key) + 1 : 1); + /** + * + */ + private static final long serialVersionUID = 1L; + + public CountMap() { + } + + public CountMap(int initialCapacity, float loadFactor) { + super(initialCapacity, loadFactor); + } + + public CountMap(int initialCapacity) { + super(initialCapacity); + } + + public CountMap(Map m) { + super(m); + } + + public Integer increment(K key) { + return super.put(key, super.containsKey(key) ? super.get(key) + 1 : 1); + } + + public Integer increment(K key, int amount) { + return super.put(key, super.containsKey(key) ? super.get(key) + amount : amount); + } + + @SuppressWarnings("unchecked") + @Override + public Integer get(Object key) { + if (!super.containsKey(key)) + super.put((K) key, 0); + return super.get(key); + } + + @Override + public String toString() { + return keySet().stream().sorted().map(e -> e + "\t" + get(e)).collect(Collectors.joining(System.lineSeparator())); + } + + public void addAll(CountMap amountPerCloneClassSize) { + amountPerCloneClassSize.entrySet().stream().forEach(e -> this.increment(e.getKey(), e.getValue())); + } + + public void incrementAll(CountMap input) { + for (Entry i : input.entrySet()) { + increment(i.getKey(), i.getValue()); } - - public Integer increment(K key, int amount) { - return super.put(key, super.containsKey(key) ? super.get(key) + amount : amount); - } - - @SuppressWarnings("unchecked") - @Override - public Integer get(Object key){ - if(!super.containsKey(key)) - super.put((K) key, 0); - return super.get(key); - } - - @Override - public String toString() { - return keySet().stream().sorted().map(e -> e+"\t"+get(e)).collect(Collectors.joining(System.lineSeparator())); - } - - public void addAll(CountMap amountPerCloneClassSize) { - amountPerCloneClassSize.entrySet().stream().forEach(e -> this.increment(e.getKey(), e.getValue())); - } - - public void incrementAll(CountMap input) { - for(Entry i : input.entrySet()) { - increment(i.getKey(), i.getValue()); - } - } + } } diff --git a/src/main/java/com/sbaars/adventofcode/year19/util/LongCountMap.java b/src/main/java/com/sbaars/adventofcode/year19/util/LongCountMap.java index 7943e574..c77ecd48 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/util/LongCountMap.java +++ b/src/main/java/com/sbaars/adventofcode/year19/util/LongCountMap.java @@ -5,54 +5,54 @@ import java.util.stream.Collectors; public class LongCountMap extends HashMap { - /** - * - */ - private static final long serialVersionUID = 1L; - - public LongCountMap() { - } - - public LongCountMap(int initialCapacity, float loadFactor) { - super(initialCapacity, loadFactor); - } - - public LongCountMap(int initialCapacity) { - super(initialCapacity); - } - - public LongCountMap(Map m) { - super(m); - } - - public Long increment(K key) { - return super.put(key, super.containsKey(key) ? super.get(key) + 1 : 1); + /** + * + */ + private static final long serialVersionUID = 1L; + + public LongCountMap() { + } + + public LongCountMap(int initialCapacity, float loadFactor) { + super(initialCapacity, loadFactor); + } + + public LongCountMap(int initialCapacity) { + super(initialCapacity); + } + + public LongCountMap(Map m) { + super(m); + } + + public Long increment(K key) { + return super.put(key, super.containsKey(key) ? super.get(key) + 1 : 1); + } + + public Long increment(K key, long amount) { + return super.put(key, super.containsKey(key) ? super.get(key) + amount : amount); + } + + @SuppressWarnings("unchecked") + @Override + public Long get(Object key) { + if (!super.containsKey(key)) + super.put((K) key, 0L); + return super.get(key); + } + + @Override + public String toString() { + return keySet().stream().sorted().map(e -> e + "\t" + get(e)).collect(Collectors.joining(System.lineSeparator())); + } + + public void addAll(LongCountMap amountPerCloneClassSize) { + amountPerCloneClassSize.entrySet().stream().forEach(e -> this.increment(e.getKey(), e.getValue())); + } + + public void incrementAll(LongCountMap input) { + for (Entry i : input.entrySet()) { + increment(i.getKey(), i.getValue()); } - - public Long increment(K key, long amount) { - return super.put(key, super.containsKey(key) ? super.get(key) + amount : amount); - } - - @SuppressWarnings("unchecked") - @Override - public Long get(Object key){ - if(!super.containsKey(key)) - super.put((K) key, 0L); - return super.get(key); - } - - @Override - public String toString() { - return keySet().stream().sorted().map(e -> e+"\t"+get(e)).collect(Collectors.joining(System.lineSeparator())); - } - - public void addAll(LongCountMap amountPerCloneClassSize) { - amountPerCloneClassSize.entrySet().stream().forEach(e -> this.increment(e.getKey(), e.getValue())); - } - - public void incrementAll(LongCountMap input) { - for(Entry i : input.entrySet()) { - increment(i.getKey(), i.getValue()); - } - } + } } diff --git a/src/main/java/com/sbaars/adventofcode/year20/Day2020.java b/src/main/java/com/sbaars/adventofcode/year20/Day2020.java index 7f47b6dc..abc1429d 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/Day2020.java +++ b/src/main/java/com/sbaars/adventofcode/year20/Day2020.java @@ -3,7 +3,7 @@ import com.sbaars.adventofcode.common.Day; public abstract class Day2020 extends Day { - protected Day2020(int day){ - super(2020, day); - } + protected Day2020(int day) { + super(2020, day); + } } diff --git a/src/main/java/com/sbaars/adventofcode/year20/Main.java b/src/main/java/com/sbaars/adventofcode/year20/Main.java index db28f944..eacfa11b 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/Main.java +++ b/src/main/java/com/sbaars/adventofcode/year20/Main.java @@ -1,18 +1,16 @@ package com.sbaars.adventofcode.year20; import com.sbaars.adventofcode.common.Day; -import com.sbaars.adventofcode.year19.Day2019; - import java.io.IOException; import java.lang.reflect.InvocationTargetException; public class Main { - public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException, InvocationTargetException, NoSuchMethodException { - for(int day = 1; day<=25; day++) { - System.out.println("Day "+day+":"); - Day instance = (Day)Class.forName("com.sbaars.adventofcode.year20.days.Day"+day).getDeclaredConstructor().newInstance(); - instance.printParts(); - System.out.println(); - } + public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException, InvocationTargetException, NoSuchMethodException { + for (int day = 1; day <= 25; day++) { + System.out.println("Day " + day + ":"); + Day instance = (Day) Class.forName("com.sbaars.adventofcode.year20.days.Day" + day).getDeclaredConstructor().newInstance(); + instance.printParts(); + System.out.println(); } + } } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day1.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day1.java index 0ce40d61..7730f234 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day1.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day1.java @@ -4,34 +4,34 @@ import java.util.Arrays; public class Day1 extends Day2020 { - public static void main(String[] args) { - new Day1().printParts(); - } + public Day1() { + super(1); + } - public Day1() { - super(1); - } + public static void main(String[] args) { + new Day1().printParts(); + } - @Override - public Object part1() { - long[] nums = dayNumbers(); - return Arrays.stream(nums).flatMap(a -> - Arrays.stream(nums).filter(b -> a + b == 2020L).map(b -> a * b) - ).findAny().getAsLong(); - } + @Override + public Object part1() { + long[] nums = dayNumbers(); + return Arrays.stream(nums).flatMap(a -> + Arrays.stream(nums).filter(b -> a + b == 2020L).map(b -> a * b) + ).findAny().getAsLong(); + } - @Override - public Object part2() { - long[] s = dayNumbers(); - for (long a : s) { - for (long b : s) { - for (long c : s) { - if (a != b && b != c && a + b + c == 2020L) { - return a * b * c; - } - } - } + @Override + public Object part2() { + long[] s = dayNumbers(); + for (long a : s) { + for (long b : s) { + for (long c : s) { + if (a != b && b != c && a + b + c == 2020L) { + return a * b * c; + } } - return 0; + } } + return 0; + } } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day10.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day10.java index cfcf52e6..59f06af7 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day10.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day10.java @@ -1,62 +1,51 @@ package com.sbaars.adventofcode.year20.days; -import static java.lang.Math.pow; -import static java.util.Arrays.copyOfRange; import static java.util.Arrays.sort; -import static java.util.Arrays.stream; -import static java.util.Comparator.reverseOrder; -import static java.util.stream.LongStream.range; import com.sbaars.adventofcode.year19.util.CountMap; import com.sbaars.adventofcode.year19.util.LongCountMap; import com.sbaars.adventofcode.year20.Day2020; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; -import java.util.List; -import java.util.ArrayList; import org.apache.commons.lang3.ArrayUtils; -import org.checkerframework.checker.units.qual.C; public class Day10 extends Day2020 { - public Day10() { - super(10); - } + public Day10() { + super(10); + } - public static void main(String[] args) { - new Day10().printParts(); - } + public static void main(String[] args) { + new Day10().printParts(); + } - @Override - public Object part1() { - long[] input = getInput(); - CountMap diffs = new CountMap<>(); - for(int i = 1; i diffs = new CountMap<>(); + for (int i = 1; i < input.length; i++) { + diffs.increment(input[i] - input[i - 1]); + } + return diffs.get(1L) * diffs.get(3L); + } - @Override - public Object part2() { - long[] input = getInput(); - LongCountMap nRoutes = new LongCountMap<>(); - nRoutes.increment(input[input.length - 1]); - for (int i = input.length - 2; i >= 0; i--) { - for (int j = i + 1; j < input.length && j <= i + 3; j++) { - if (input[j] - input[i] <= 3) { - nRoutes.increment(input[i], nRoutes.get(input[j])); - } - } - } - return nRoutes.get(0L); - } + @Override + public Object part2() { + long[] input = getInput(); + LongCountMap nRoutes = new LongCountMap<>(); + nRoutes.increment(input[input.length - 1]); + for (int i = input.length - 2; i >= 0; i--) { + for (int j = i + 1; j < input.length && j <= i + 3; j++) { + if (input[j] - input[i] <= 3) { + nRoutes.increment(input[i], nRoutes.get(input[j])); + } + } + } + return nRoutes.get(0L); + } - private long[] getInput() { - long[] input = dayNumbers(); - sort(input); - input = ArrayUtils.add( input, input[input.length-1]+3); - input = ArrayUtils.addFirst(input, 0L); - return input; - } + private long[] getInput() { + long[] input = dayNumbers(); + sort(input); + input = ArrayUtils.add(input, input[input.length - 1] + 3); + input = ArrayUtils.addFirst(input, 0L); + return input; + } } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day11.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day11.java index 5a33ded5..5a54acc7 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day11.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day11.java @@ -1,96 +1,91 @@ package com.sbaars.adventofcode.year20.days; -import static java.util.Arrays.deepToString; -import static java.util.Arrays.sort; import static java.util.Arrays.stream; import com.sbaars.adventofcode.common.Direction; -import com.sbaars.adventofcode.year19.util.CountMap; -import com.sbaars.adventofcode.year19.util.LongCountMap; import com.sbaars.adventofcode.year20.Day2020; import java.awt.*; -import org.apache.commons.lang3.ArrayUtils; public class Day11 extends Day2020 { - public Day11() { - super(11); - } + public Day11() { + super(11); + } - public static void main(String[] args) { - new Day11().printParts(); - } + public static void main(String[] args) { + new Day11().printParts(); + } - @Override - public Object part1() { - char[][] input = dayGrid(); - int changes; - do{ - changes = 0; - char[][] newGrid = new char[input.length][input[0].length]; - for(int i = 0; i - d.getInGrid(finalInput, d.move(p)) == '#' - ).count(); - changes = getChanges(input, changes, newGrid, i, j, occupied, 4L); - } - } - input = newGrid; - } while(changes > 0); - return getCount(input, '#'); - } + @Override + public Object part1() { + char[][] input = dayGrid(); + int changes; + do { + changes = 0; + char[][] newGrid = new char[input.length][input[0].length]; + for (int i = 0; i < input.length; i++) { + for (int j = 0; j < input[0].length; j++) { + Point p = new Point(i, j); + char[][] finalInput = input; + long occupied = stream(Direction.values()).filter(d -> + d.getInGrid(finalInput, d.move(p)) == '#' + ).count(); + changes = getChanges(input, changes, newGrid, i, j, occupied, 4L); + } + } + input = newGrid; + } while (changes > 0); + return getCount(input, '#'); + } - private int getChanges(char[][] input, int changes, char[][] newGrid, int i, int j, long occupied, long numOccupied) { - if(occupied == 0L && input[i][j] == 'L'){ - newGrid[i][j] = '#'; - changes++; - } else if(occupied >= numOccupied && input[i][j] == '#'){ - newGrid[i][j] = 'L'; - changes++; - } else { - newGrid[i][j] = input[i][j]; - } - return changes; - } + private int getChanges(char[][] input, int changes, char[][] newGrid, int i, int j, long occupied, long numOccupied) { + if (occupied == 0L && input[i][j] == 'L') { + newGrid[i][j] = '#'; + changes++; + } else if (occupied >= numOccupied && input[i][j] == '#') { + newGrid[i][j] = 'L'; + changes++; + } else { + newGrid[i][j] = input[i][j]; + } + return changes; + } - private long getCount(char[][] input, char ch) { - return stream(input).flatMapToInt(c -> new String(c).chars()).filter(c -> c == ch).count(); - } + private long getCount(char[][] input, char ch) { + return stream(input).flatMapToInt(c -> new String(c).chars()).filter(c -> c == ch).count(); + } - @Override - public Object part2() { - char[][] input = dayGrid(); - int changes; - do{ - changes = 0; - char[][] newGrid = new char[input.length][input[0].length]; - for(int i = 0; i 0); - return getCount(input, '#'); - } + @Override + public Object part2() { + char[][] input = dayGrid(); + int changes; + do { + changes = 0; + char[][] newGrid = new char[input.length][input[0].length]; + for (int i = 0; i < input.length; i++) { + for (int j = 0; j < input[0].length; j++) { + int occupied = countOccupied(input, i, j); + changes = getChanges(input, changes, newGrid, i, j, occupied, 5L); + } + } + input = newGrid; + } while (changes > 0); + return getCount(input, '#'); + } - private int countOccupied(char[][] input, int i, int j) { - int occupied = 0; - Direction[] dirs = Direction.values(); - for(Direction dir : dirs){ - Point p = new Point(i, j); - p = dir.move(p, 1); - while(p.x>=0 && p.x< input.length && p.y>=0 && p.y< input[0].length && input[p.x][p.y] != 'L'){ - if(input[p.x][p.y] == '#'){ - occupied++; - break; - } - p = dir.move(p, 1); - } - } - return occupied; - } + private int countOccupied(char[][] input, int i, int j) { + int occupied = 0; + Direction[] dirs = Direction.values(); + for (Direction dir : dirs) { + Point p = new Point(i, j); + p = dir.move(p, 1); + while (p.x >= 0 && p.x < input.length && p.y >= 0 && p.y < input[0].length && input[p.x][p.y] != 'L') { + if (input[p.x][p.y] == '#') { + occupied++; + break; + } + p = dir.move(p, 1); + } + } + return occupied; + } } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day12.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day12.java index 1b25a2de..6a0c04fb 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day12.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day12.java @@ -11,50 +11,64 @@ import java.util.List; public class Day12 extends Day2020 { - public static void main(String[] args) { - new Day12().printParts(); - } + public Day12() { + super(12); + } - public Day12() { - super(12); - } + public static void main(String[] args) { + new Day12().printParts(); + } - @Override - public Object part1() { - List input = convertInput(); - Direction face = EAST; - Point location = new Point(0, 0); - for(Flight f : input){ - switch(f.dir){ - case 'L': - case 'R': face = face.turnDegrees(f.distance, f.dir == 'R'); break; - case 'F': location = face.move(location, f.distance); break; - default: location = Direction.getByDir(f.dir).move(location, f.distance); break; - } - } - return abs(location.x) + abs(location.y); + @Override + public Object part1() { + List input = convertInput(); + Direction face = EAST; + Point location = new Point(0, 0); + for (Flight f : input) { + switch (f.dir) { + case 'L': + case 'R': + face = face.turnDegrees(f.distance, f.dir == 'R'); + break; + case 'F': + location = face.move(location, f.distance); + break; + default: + location = Direction.getByDir(f.dir).move(location, f.distance); + break; + } } + return abs(location.x) + abs(location.y); + } - private List convertInput() { - return dayStream().map(e -> new Flight(e.charAt(0), Integer.parseInt(e.substring(1)))).collect(toList()); - } + private List convertInput() { + return dayStream().map(e -> new Flight(e.charAt(0), Integer.parseInt(e.substring(1)))).collect(toList()); + } - record Flight (char dir, int distance) {} - - @Override - public Object part2() { - List input = convertInput(); - Point waypoint = new Point(10, -1); - Point location = new Point(0, 0); - for(Flight f : input){ - switch(f.dir){ - case 'L':case 'R': waypoint = turnDegrees(waypoint, f.distance, f.dir == 'R'); break; - case 'F': location = new Point(location.x+(waypoint.x*f.distance), location.y+(waypoint.y*f.distance)); break; - default: waypoint = Direction.getByDir(f.dir).move(waypoint, f.distance); break; - } - } - return abs(location.x) + abs(location.y); + @Override + public Object part2() { + List input = convertInput(); + Point waypoint = new Point(10, -1); + Point location = new Point(0, 0); + for (Flight f : input) { + switch (f.dir) { + case 'L': + case 'R': + waypoint = turnDegrees(waypoint, f.distance, f.dir == 'R'); + break; + case 'F': + location = new Point(location.x + (waypoint.x * f.distance), location.y + (waypoint.y * f.distance)); + break; + default: + waypoint = Direction.getByDir(f.dir).move(waypoint, f.distance); + break; + } } + return abs(location.x) + abs(location.y); + } + + record Flight(char dir, int distance) { + } } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day13.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day13.java index 0b8a737c..c7b9c1cd 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day13.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day13.java @@ -8,45 +8,45 @@ import com.sbaars.adventofcode.year20.Day2020; public class Day13 extends Day2020 { - public static void main(String[] args) { - new Day13().printParts(); - } + public Day13() { + super(13); + } - public Day13() { - super(13); - } + public static void main(String[] args) { + new Day13().printParts(); + } - @Override - public Object part1() { - String[] day = dayStrings(); - int timestamp = parseInt(day[0]); - int[] times = stream(day[1].replace(",x", "").split(",")) - .mapToInt(Integer::parseInt).toArray(); - for(int i = timestamp; true; i++){ - for(int j : times){ - if(i%j == 0){ - return j * (i-timestamp); - } - } + @Override + public Object part1() { + String[] day = dayStrings(); + int timestamp = parseInt(day[0]); + int[] times = stream(day[1].replace(",x", "").split(",")) + .mapToInt(Integer::parseInt).toArray(); + for (int i = timestamp; true; i++) { + for (int j : times) { + if (i % j == 0) { + return j * (i - timestamp); } + } } + } - @Override - public Object part2() { - String[] s = dayStrings()[1].split(","); - long[][] nums = range(0, s.length).filter(i -> !s[i].equals("x")) - .mapToObj(i -> new long[]{parseLong(s[i]), i}) - .toArray(long[][]::new); - long product = stream(nums).mapToLong(a -> a[0]).reduce((a, b) -> a * b).getAsLong(); - long sum = stream(nums).mapToLong(a -> a[1] * (product/a[0]) * inverseModulo(product/a[0], a[0])).sum(); - return product - sum % product; - } + @Override + public Object part2() { + String[] s = dayStrings()[1].split(","); + long[][] nums = range(0, s.length).filter(i -> !s[i].equals("x")) + .mapToObj(i -> new long[]{parseLong(s[i]), i}) + .toArray(long[][]::new); + long product = stream(nums).mapToLong(a -> a[0]).reduce((a, b) -> a * b).getAsLong(); + long sum = stream(nums).mapToLong(a -> a[1] * (product / a[0]) * inverseModulo(product / a[0], a[0])).sum(); + return product - sum % product; + } - long inverseModulo(long x, long y){ - if(x!=0){ - long modulo = y % x; - return modulo == 0 ? 1 : y - inverseModulo(modulo, x) * y / x; - } - return 0; + long inverseModulo(long x, long y) { + if (x != 0) { + long modulo = y % x; + return modulo == 0 ? 1 : y - inverseModulo(modulo, x) * y / x; } + return 0; + } } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day14.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day14.java index 061bf76a..9d617876 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day14.java @@ -15,82 +15,83 @@ import org.apache.commons.text.TextStringBuilder; public class Day14 extends Day2020 { - public static void main(String[] args) { - new Day14().printParts(); - } + public Day14() { + super(14); + } - public Day14() { - super(14); - } + public static void main(String[] args) { + new Day14().printParts(); + } - @Override - public Object part1() { - Instruction[] input = getInput(); - Map memory = new HashMap<>(); - final TextStringBuilder currentMask = new TextStringBuilder(); - for(Instruction i : input){ - i.getMem().ifPresentOrElse(m -> memory.put(m.index, m.value | parseLong(currentMask.toString(), 2)), - () -> currentMask.set(i.value).replaceAll("X", "0")); - } - return memory.values().stream().mapToLong(e -> e).sum(); + @Override + public Object part1() { + Instruction[] input = getInput(); + Map memory = new HashMap<>(); + final TextStringBuilder currentMask = new TextStringBuilder(); + for (Instruction i : input) { + i.getMem().ifPresentOrElse(m -> memory.put(m.index, m.value | parseLong(currentMask.toString(), 2)), + () -> currentMask.set(i.value).replaceAll("X", "0")); } + return memory.values().stream().mapToLong(e -> e).sum(); + } - public static record Instruction (String mem, String value) { - - public Optional getMem(){ - return mem.startsWith("mem") ? of(readString(mem+value, "mem[%n]%n", Mem.class)) : empty(); - } + @Override + public Object part2() { + Instruction[] input = getInput(); + Map memory = new HashMap<>(); + String currentMask = ""; + for (Instruction i : input) { + Optional mem = i.getMem(); + if (mem.isPresent()) { + StringBuilder bin = binWithLength(mem.get().index, currentMask.length()); + List floaters = applyMask(currentMask, bin); + fillMemory(memory, mem, bin, floaters); + } else { + currentMask = i.value; + } } + return memory.values().stream().mapToLong(e -> e).sum(); + } - public static record Mem (long index, long value) {} + private Instruction[] getInput() { + return dayStream().map(s -> readString(s, "%s = %s", Instruction.class)).toArray(Instruction[]::new); + } - @Override - public Object part2() { - Instruction[] input = getInput(); - Map memory = new HashMap<>(); - String currentMask = ""; - for(Instruction i : input){ - Optional mem = i.getMem(); - if(mem.isPresent()){ - StringBuilder bin = binWithLength(mem.get().index, currentMask.length()); - List floaters = applyMask(currentMask, bin); - fillMemory(memory, mem, bin, floaters); - } else { - currentMask = i.value; - } - } - return memory.values().stream().mapToLong(e -> e).sum(); + private void fillMemory(Map memory, Optional mem, StringBuilder bin, List floaters) { + StringBuilder binary; + for (long j = 0; (binary = binWithLength(j, floaters.size())).length() == floaters.size(); j++) { + for (int k = 0; k < floaters.size(); k++) { + bin.setCharAt(floaters.get(k), binary.charAt(k)); + } + memory.put(parseLong(bin.toString(), 2), mem.get().value); } + } - private Instruction[] getInput() { - return dayStream().map(s -> readString(s, "%s = %s", Instruction.class)).toArray(Instruction[]::new); + private List applyMask(String currentMask, StringBuilder bin) { + List floaters = new ArrayList<>(); + for (int j = 0; j < bin.length(); j++) { + char c = currentMask.charAt(j); + if (c == 'X') floaters.add(j); + else if (c == '1') bin.setCharAt(j, c); } + return floaters; + } - private void fillMemory(Map memory, Optional mem, StringBuilder bin, List floaters) { - StringBuilder binary; - for(long j = 0; (binary = binWithLength(j, floaters.size())).length() == floaters.size(); j++){ - for(int k = 0; k< floaters.size(); k++){ - bin.setCharAt(floaters.get(k), binary.charAt(k)); - } - memory.put(parseLong(bin.toString(), 2), mem.get().value); - } + private StringBuilder binWithLength(long val, int s) { + StringBuilder bin = new StringBuilder(toBinaryString(val)); + while (bin.length() < s) { + bin.insert(0, '0'); } + return bin; + } - private List applyMask(String currentMask, StringBuilder bin) { - List floaters = new ArrayList<>(); - for(int j = 0; j< bin.length(); j++){ - char c = currentMask.charAt(j); - if(c=='X') floaters.add(j); - else if(c == '1') bin.setCharAt(j, c); - } - return floaters; - } + public static record Instruction(String mem, String value) { - private StringBuilder binWithLength(long val, int s) { - StringBuilder bin = new StringBuilder(toBinaryString(val)); - while (bin.length() < s) { - bin.insert(0, '0'); - } - return bin; + public Optional getMem() { + return mem.startsWith("mem") ? of(readString(mem + value, "mem[%n]%n", Mem.class)) : empty(); } + } + + public static record Mem(long index, long value) { + } } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day15.java index 6210bd61..3f928271 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day15.java @@ -7,34 +7,34 @@ import java.util.Map; public class Day15 extends Day2020 { - public static void main(String[] args) { - new Day15().printParts(); - } + public Day15() { + super(15); + } - public Day15() { - super(15); - } + public static void main(String[] args) { + new Day15().printParts(); + } - @Override - public Object part1() { - return getSolution(2020L); - } + @Override + public Object part1() { + return getSolution(2020L); + } - @Override - public Object part2() { - return getSolution(30000000L); - } + @Override + public Object part2() { + return getSolution(30000000L); + } - private long getSolution(long offset) { - Map turnNumbers = new HashMap<>(); - long[] nums = dayNumbers(","); - range(0, nums.length-1).forEach(i -> turnNumbers.put(nums[i], (long)i)); - long lastNumber = nums[nums.length-1]; - for(long turnNumber = turnNumbers.size(); turnNumber < offset - 1; turnNumber++){ - long newLastNumber = turnNumbers.containsKey(lastNumber) ? turnNumber - turnNumbers.get(lastNumber) : 0; - turnNumbers.put(lastNumber, turnNumber); - lastNumber = newLastNumber; - } - return lastNumber; + private long getSolution(long offset) { + Map turnNumbers = new HashMap<>(); + long[] nums = dayNumbers(","); + range(0, nums.length - 1).forEach(i -> turnNumbers.put(nums[i], (long) i)); + long lastNumber = nums[nums.length - 1]; + for (long turnNumber = turnNumbers.size(); turnNumber < offset - 1; turnNumber++) { + long newLastNumber = turnNumbers.containsKey(lastNumber) ? turnNumber - turnNumbers.get(lastNumber) : 0; + turnNumbers.put(lastNumber, turnNumber); + lastNumber = newLastNumber; } + return lastNumber; + } } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day16.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day16.java index 8ae77c1a..5adc382c 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day16.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day16.java @@ -17,67 +17,66 @@ import java.util.Set; public class Day16 extends Day2020 { - public static void main(String[] args) { - new Day16().printParts(); - } + private final Rule[] rules; + private final long[] myTicket; + private final List> tickets; + public Day16() { + super(16); + String[] input = day().split("\n\n"); + this.rules = stream(input[0].split("\n")).map(s -> readString(s, "%s: %n-%n or %n-%n", Rule.class)).toArray(Rule[]::new); + this.myTicket = stream(input[1].split("\n")[1].split(",")).mapToLong(Long::parseLong).toArray(); + String[] ticketStrings = input[2].split("\n"); + this.tickets = stream(subarray(ticketStrings, 1, ticketStrings.length)).map(s -> stream(s.split(",")).map(Long::parseLong).collect(toList())).collect(toList()); + } - private final Rule[] rules; - private final long[] myTicket; - private final List> tickets; + public static void main(String[] args) { + new Day16().printParts(); + } - public Day16() { - super(16); - String[] input = day().split("\n\n"); - this.rules = stream(input[0].split("\n")).map(s -> readString(s, "%s: %n-%n or %n-%n", Rule.class)).toArray(Rule[]::new); - this.myTicket = stream(input[1].split("\n")[1].split(",")).mapToLong(Long::parseLong).toArray(); - String[] ticketStrings = input[2].split("\n"); - this.tickets = stream(subarray(ticketStrings, 1, ticketStrings.length)).map(s -> stream(s.split(",")).map(Long::parseLong).collect(toList())).collect(toList()); - } + @Override + public Object part1() { + return tickets.stream().flatMapToLong(t -> t.stream().filter(n -> stream(rules).noneMatch(r -> r.check(n))).mapToLong(e -> e)).sum(); + } - @Override - public Object part1() { - return tickets.stream().flatMapToLong(t -> t.stream().filter(n -> stream(rules).noneMatch(r -> r.check(n))).mapToLong(e -> e)).sum(); - } + @Override + public Object part2() { + List> valid = tickets.stream().filter(t -> t.stream().allMatch(n -> stream(rules).anyMatch(r -> r.check(n)))).collect(toList()); - record Rule (String name, long lower1, long upper1, long lower2, long upper2) { - public boolean check(long val) { - return (val >= lower1 && val <= upper1) || (val >= lower2 && val <= upper2); + Multimap ruleIndex = MultimapBuilder.hashKeys().arrayListValues().build(); + for (Rule r : rules) { + for (int j = 0; j < valid.get(0).size(); j++) { + int finalJ = j; + if (valid.stream().allMatch(t -> r.check(t.get(finalJ)))) { + ruleIndex.put(j, r); } + } + } - public boolean isDeparture() { - return name.startsWith("departure"); + Optional>> rs; + Set indices = new HashSet<>(); + while ((rs = ruleIndex.asMap().entrySet().stream().filter(e -> e.getValue().size() == 1 && !indices.contains(e.getKey())).findAny()).isPresent()) { + Map.Entry> r = rs.get(); + int index = r.getKey(); + Rule rule = ((List) r.getValue()).get(0); + for (int i = 0; i < rules.length; i++) { + Map.Entry> t = new ArrayList<>(ruleIndex.asMap().entrySet()).get(i); + if (t.getKey() != index) { + t.getValue().remove(rule); } + } + indices.add(index); } - @Override - public Object part2() { - List> valid = tickets.stream().filter(t -> t.stream().allMatch(n -> stream(rules).anyMatch(r -> r.check(n)))).collect(toList()); + return ruleIndex.asMap().entrySet().stream().filter(e -> e.getValue().stream().anyMatch(Rule::isDeparture)).mapToLong(e -> myTicket[e.getKey()]).reduce((a, b) -> a * b).getAsLong(); + } - Multimap ruleIndex = MultimapBuilder.hashKeys().arrayListValues().build(); - for (Rule r : rules) { - for (int j = 0; j < valid.get(0).size(); j++) { - int finalJ = j; - if (valid.stream().allMatch(t -> r.check(t.get(finalJ)))) { - ruleIndex.put(j, r); - } - } - } - - Optional>> rs; - Set indices = new HashSet<>(); - while ((rs = ruleIndex.asMap().entrySet().stream().filter(e -> e.getValue().size() == 1 && !indices.contains(e.getKey())).findAny()).isPresent()) { - Map.Entry> r = rs.get(); - int index = r.getKey(); - Rule rule = ((List) r.getValue()).get(0); - for (int i = 0; i < rules.length; i++) { - Map.Entry> t = new ArrayList<>(ruleIndex.asMap().entrySet()).get(i); - if (t.getKey() != index) { - t.getValue().remove(rule); - } - } - indices.add(index); - } + record Rule(String name, long lower1, long upper1, long lower2, long upper2) { + public boolean check(long val) { + return (val >= lower1 && val <= upper1) || (val >= lower2 && val <= upper2); + } - return ruleIndex.asMap().entrySet().stream().filter(e -> e.getValue().stream().anyMatch(Rule::isDeparture)).mapToLong(e -> myTicket[e.getKey()]).reduce((a, b) -> a * b).getAsLong(); + public boolean isDeparture() { + return name.startsWith("departure"); } + } } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day17.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day17.java index 7e61ac4a..33d0dbab 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day17.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day17.java @@ -5,107 +5,109 @@ import java.util.Set; public class Day17 extends Day2020 { - public static void main(String[] args) { - new Day17().printParts(); - } + public Day17() { + super(17); + } - public Day17() { - super(17); - } + public static void main(String[] args) { + new Day17().printParts(); + } - @Override - public Object part1() { - Set pos = new HashSet<>(); - char[][] input = dayGrid(); - for(int i = 0; i newPos = new HashSet<>(); - Set checkedPos = new HashSet<>(); - for(Pos p : pos) { - addNeighbors(pos, newPos, checkedPos, p, true); - } - pos = newPos; + @Override + public Object part1() { + Set pos = new HashSet<>(); + char[][] input = dayGrid(); + for (int i = 0; i < input.length; i++) { + for (int j = 0; j < input[i].length; j++) { + if (input[i][j] == '#') { + pos.add(new Pos(i, j, 0)); } - return pos.size(); + } + } + for (int i = 0; i < 6; i++) { + Set newPos = new HashSet<>(); + Set checkedPos = new HashSet<>(); + for (Pos p : pos) { + addNeighbors(pos, newPos, checkedPos, p, true); + } + pos = newPos; } + return pos.size(); + } - public void addNeighbors(Set pos, Set newPos, Set checkedPos, Pos p, boolean active){ - if(!checkedPos.contains(p)) { - long neighbours = active ? -1 : 0; - checkedPos.add(p); - for (int a = -1; a <= 1; a++) { - for (int b = -1; b <= 1; b++) { - for (int c = -1; c <= 1; c++) { - Pos x = new Pos(p.x + a, p.y + b, p.z + c); - if (pos.contains(x)) { - neighbours++; - } else if(active) { - addNeighbors(pos, newPos, checkedPos, x, false); - } - } - } - } - if((active && (neighbours == 2 || neighbours == 3)) || - (!active && neighbours == 3)){ - newPos.add(p); + public void addNeighbors(Set pos, Set newPos, Set checkedPos, Pos p, boolean active) { + if (!checkedPos.contains(p)) { + long neighbours = active ? -1 : 0; + checkedPos.add(p); + for (int a = -1; a <= 1; a++) { + for (int b = -1; b <= 1; b++) { + for (int c = -1; c <= 1; c++) { + Pos x = new Pos(p.x + a, p.y + b, p.z + c); + if (pos.contains(x)) { + neighbours++; + } else if (active) { + addNeighbors(pos, newPos, checkedPos, x, false); } + } } + } + if ((active && (neighbours == 2 || neighbours == 3)) || + (!active && neighbours == 3)) { + newPos.add(p); + } } + } - public static record Pos (long x, long y, long z) {} - - public static record Pos4 (long x, long y, long z, long w) {} - - @Override - public Object part2() { - Set pos = new HashSet<>(); - char[][] input = dayGrid(); - for(int i = 0; i newPos = new HashSet<>(); - Set checkedPos = new HashSet<>(); - for(Pos4 p : pos) { - addNeighbors(pos, newPos, checkedPos, p, true); - } - pos = newPos; + @Override + public Object part2() { + Set pos = new HashSet<>(); + char[][] input = dayGrid(); + for (int i = 0; i < input.length; i++) { + for (int j = 0; j < input[i].length; j++) { + if (input[i][j] == '#') { + pos.add(new Pos4(i, j, 0, 0)); } - return pos.size(); + } } + for (int i = 0; i < 6; i++) { + Set newPos = new HashSet<>(); + Set checkedPos = new HashSet<>(); + for (Pos4 p : pos) { + addNeighbors(pos, newPos, checkedPos, p, true); + } + pos = newPos; + } + return pos.size(); + } - public void addNeighbors(Set pos, Set newPos, Set checkedPos, Pos4 p, boolean active){ - if(!checkedPos.contains(p)) { - long neighbours = active ? -1 : 0; - checkedPos.add(p); - for (int a = -1; a <= 1; a++) { - for (int b = -1; b <= 1; b++) { - for (int c = -1; c <= 1; c++) { - for (int d = -1; d <= 1; d++) { - Pos4 x = new Pos4(p.x + a, p.y + b, p.z + c, p.w + d); - if (pos.contains(x)) { - neighbours++; - } else if (active) { - addNeighbors(pos, newPos, checkedPos, x, false); - } - } - } - } - } - if((active && (neighbours == 2 || neighbours == 3)) || - (!active && neighbours == 3)){ - newPos.add(p); + public void addNeighbors(Set pos, Set newPos, Set checkedPos, Pos4 p, boolean active) { + if (!checkedPos.contains(p)) { + long neighbours = active ? -1 : 0; + checkedPos.add(p); + for (int a = -1; a <= 1; a++) { + for (int b = -1; b <= 1; b++) { + for (int c = -1; c <= 1; c++) { + for (int d = -1; d <= 1; d++) { + Pos4 x = new Pos4(p.x + a, p.y + b, p.z + c, p.w + d); + if (pos.contains(x)) { + neighbours++; + } else if (active) { + addNeighbors(pos, newPos, checkedPos, x, false); + } } + } } + } + if ((active && (neighbours == 2 || neighbours == 3)) || + (!active && neighbours == 3)) { + newPos.add(p); + } } + } + + public static record Pos(long x, long y, long z) { + } + + public static record Pos4(long x, long y, long z, long w) { + } } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day18.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day18.java index 5f934910..6ee3c933 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day18.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day18.java @@ -6,68 +6,67 @@ import org.apache.commons.lang3.tuple.Pair; public class Day18 extends Day2020 { - public static void main(String[] args) { - new Day18().printParts(); - } + public Day18() { + super(18); + } - public Day18() { - super(18); - } + public static void main(String[] args) { + new Day18().printParts(); + } - @Override - public Object part1() { - return getSolution(true); - } + @Override + public Object part1() { + return getSolution(true); + } - @Override - public Object part2() { - return getSolution(false); - } + @Override + public Object part2() { + return getSolution(false); + } - public long resolveExpression(StringBuilder s, boolean part1){ - var a = solve(s, part1); - return getSolution(a.getRight(), s, a.getLeft(), part1); - } + public long resolveExpression(StringBuilder s, boolean part1) { + var a = solve(s, part1); + return getSolution(a.getRight(), s, a.getLeft(), part1); + } - private long getSolution(boolean part1){ - return stream(dayStrings()).mapToLong(i -> resolveExpression(new StringBuilder(i), part1)).sum(); - } + private long getSolution(boolean part1) { + return stream(dayStrings()).mapToLong(i -> resolveExpression(new StringBuilder(i), part1)).sum(); + } - private Pair solve(StringBuilder s, boolean part1){ - long leftHand; - int i = s.length()-2; - if(s.charAt(s.length()-1) == ')'){ - for(int nBrackets = 1; nBrackets>0; i--){ - if(s.charAt(i) == '(') nBrackets--; - else if(s.charAt(i) == ')') nBrackets++; - } - i++; - leftHand = resolveExpression(new StringBuilder(s.substring(i+1, s.length()-1)), part1); - } else { - leftHand = Long.parseLong(s.substring(s.length()-1, s.length())); - i = s.length()-1; - } - return Pair.of(leftHand, i); + private Pair solve(StringBuilder s, boolean part1) { + long leftHand; + int i = s.length() - 2; + if (s.charAt(s.length() - 1) == ')') { + for (int nBrackets = 1; nBrackets > 0; i--) { + if (s.charAt(i) == '(') nBrackets--; + else if (s.charAt(i) == ')') nBrackets++; + } + i++; + leftHand = resolveExpression(new StringBuilder(s.substring(i + 1, s.length() - 1)), part1); + } else { + leftHand = Long.parseLong(s.substring(s.length() - 1, s.length())); + i = s.length() - 1; } + return Pair.of(leftHand, i); + } - private long getSolution(int i, StringBuilder s, long leftHand, boolean part1){ - if(i>0) { - char operator = s.charAt(i-2); - StringBuilder leftSide = new StringBuilder(s.substring(0, i-3)); - if (operator == '*'){ - return resolveExpression(new StringBuilder(s.substring(0, i-3)), part1) * leftHand; - } - else if (operator == '+'){ - if(part1) { - return resolveExpression(new StringBuilder(s.substring(0, i-3)), true) + leftHand; - } else { - var sol = solve(leftSide, false); - return getSolution(sol.getRight(), leftSide, sol.getKey() + leftHand, false); - } - } - } else if(i == 0){ - return leftHand; + private long getSolution(int i, StringBuilder s, long leftHand, boolean part1) { + if (i > 0) { + char operator = s.charAt(i - 2); + StringBuilder leftSide = new StringBuilder(s.substring(0, i - 3)); + if (operator == '*') { + return resolveExpression(new StringBuilder(s.substring(0, i - 3)), part1) * leftHand; + } else if (operator == '+') { + if (part1) { + return resolveExpression(new StringBuilder(s.substring(0, i - 3)), true) + leftHand; + } else { + var sol = solve(leftSide, false); + return getSolution(sol.getRight(), leftSide, sol.getKey() + leftHand, false); } - throw new IllegalStateException(); + } + } else if (i == 0) { + return leftHand; } + throw new IllegalStateException(); + } } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day19.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day19.java index 7e1be548..be0ecbf8 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day19.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day19.java @@ -15,97 +15,51 @@ import java.util.stream.Collectors; public class Day19 extends Day2020 { - public static void main(String[] args) { - new Day19().printParts(); - } + Map> sol = new HashMap<>(); - Map> sol = new HashMap<>(); + public Day19() { + super(19); + } - public Day19() { - super(19); - } + public static void main(String[] args) { + new Day19().printParts(); + } - @Override - public Object part1() { - return getSolution(day()); - } + private static Optional getLetter(String rule) { + return rule.startsWith("\"") ? Optional.of(rule.charAt(1) + "") : Optional.empty(); + } - private long getSolution(String inputFile) { - String[] input = inputFile.split("\n\n"); - Map rules = Arrays.stream(input[0].split("\n")) - .map(e -> e.split(": ")) - .collect(Collectors.toMap(e -> parseLong(e[0]), e -> new Rule(parseLong(e[0]), e[1]))); - - rules.values().forEach(e -> e.getPossibilities(rules, sol)); - return stream(input[1].split("\n")) - .filter(e -> sol.values().stream().anyMatch(r -> r.contains(e))) - .count(); + private static long[] getRule(String rule, boolean num) { + if (rule.startsWith("\"")) { + return new long[]{}; } - - private static Optional getLetter(String rule){ - return rule.startsWith("\"") ? Optional.of(rule.charAt(1)+"") : Optional.empty(); + String[] r = rule.split(" \\| "); + if (!num || r.length > 1) { + return Arrays.stream(r[num ? 1 : 0].split(" ")).mapToLong(Long::parseLong).toArray(); + } else { + return new long[]{}; } + } - private static long[] getRule(String rule, boolean num){ - if(rule.startsWith("\"")){ - return new long[]{}; - } - String[] r = rule.split(" \\| "); - if (!num || r.length > 1) { - return Arrays.stream(r[num ? 1 : 0].split(" ")).mapToLong(Long::parseLong).toArray(); - } else { - return new long[]{}; - } - } + @Override + public Object part1() { + return getSolution(day()); + } - public static record Rule (long id, Optional letter, long[] rule1, long[] rule2) { - public Rule(long id, String rule){ - this(id, getLetter(rule), getRule(rule, false), getRule(rule, true)); - } + private long getSolution(String inputFile) { + String[] input = inputFile.split("\n\n"); + Map rules = Arrays.stream(input[0].split("\n")) + .map(e -> e.split(": ")) + .collect(Collectors.toMap(e -> parseLong(e[0]), e -> new Rule(parseLong(e[0]), e[1]))); - public Set getPossibilities(Map m, Map> sol){ - if(sol.containsKey(id)) return sol.get(id); - if(letter.isEmpty()){ - Rule[] r = stream(rule1).mapToObj(m::get).toArray(Rule[]::new); - Rule[] orRule = stream(rule2).mapToObj(m::get).toArray(Rule[]::new); - Set output = r[0].getPossibilities(m, sol); - if(sol.containsKey(id)) return sol.get(id); - for(int i = 1; i output2 = r[i].getPossibilities(m, sol); - if(sol.containsKey(id)) return sol.get(id); - Set newOne = new HashSet<>(); - for(String o : output){ - for(String o2 : output2){ - newOne.add(o+o2); - } - } - output = newOne; - } - if(orRule.length>0){ - Set outputOr = orRule[0].getPossibilities(m, sol); - if(sol.containsKey(id)) return sol.get(id); - for(int i = 1; i outputOr2 = orRule[i].getPossibilities(m, sol); - if(sol.containsKey(id)) return sol.get(id); - Set newOne = new HashSet<>(); - for(String o : outputOr){ - for(String o2 : outputOr2){ - newOne.add(o+o2); - } - } - outputOr = newOne; - } - output.addAll(outputOr); - } - sol.put(id, output); - return output; - } - return new HashSet<>(singletonList(letter.get())); - } - } + rules.values().forEach(e -> e.getPossibilities(rules, sol)); + return stream(input[1].split("\n")) + .filter(e -> sol.values().stream().anyMatch(r -> r.contains(e))) + .count(); + } - @Override - public Object part2() { + @Override + public Object part2() { // int maxDepth = 2; // StringBuilder s = new StringBuilder("8: 42 "); // StringBuilder s2 = new StringBuilder("11: 42 31 "); @@ -117,15 +71,15 @@ public Object part2() { // return getSolution(day() // .replace("8: 42", s.toString().trim()) // .replace("11: 42 31", s2.toString().trim())); - int maxDepth = 10; - String[] input = day().split("\n\n"); - Set all = sol.values().stream().flatMap(Collection::stream).collect(Collectors.toUnmodifiableSet()); - Set s42 = sol.get(42L); - Set s31 = sol.get(31L); - Set s11 = sol.get(11L); - for(int i = 2; i<=maxDepth; i++){ - Set add = new HashSet<>(s42.size() * s31.size()); - Set add2 = new HashSet<>(s42.size() * s31.size() * s11.size()); + int maxDepth = 10; + String[] input = day().split("\n\n"); + Set all = sol.values().stream().flatMap(Collection::stream).collect(Collectors.toUnmodifiableSet()); + Set s42 = sol.get(42L); + Set s31 = sol.get(31L); + Set s11 = sol.get(11L); + for (int i = 2; i <= maxDepth; i++) { + Set add = new HashSet<>(s42.size() * s31.size()); + Set add2 = new HashSet<>(s42.size() * s31.size() * s11.size()); // for(int i = 0; i sol.values().stream().anyMatch(r -> r.contains(e))) + .count(); + } + + public static record Rule(long id, Optional letter, long[] rule1, long[] rule2) { + public Rule(long id, String rule) { + this(id, getLetter(rule), getRule(rule, false), getRule(rule, true)); + } + + public Set getPossibilities(Map m, Map> sol) { + if (sol.containsKey(id)) return sol.get(id); + if (letter.isEmpty()) { + Rule[] r = stream(rule1).mapToObj(m::get).toArray(Rule[]::new); + Rule[] orRule = stream(rule2).mapToObj(m::get).toArray(Rule[]::new); + Set output = r[0].getPossibilities(m, sol); + if (sol.containsKey(id)) return sol.get(id); + for (int i = 1; i < r.length; i++) { + Set output2 = r[i].getPossibilities(m, sol); + if (sol.containsKey(id)) return sol.get(id); + Set newOne = new HashSet<>(); + for (String o : output) { + for (String o2 : output2) { + newOne.add(o + o2); + } + } + output = newOne; + } + if (orRule.length > 0) { + Set outputOr = orRule[0].getPossibilities(m, sol); + if (sol.containsKey(id)) return sol.get(id); + for (int i = 1; i < orRule.length; i++) { + Set outputOr2 = orRule[i].getPossibilities(m, sol); + if (sol.containsKey(id)) return sol.get(id); + Set newOne = new HashSet<>(); + for (String o : outputOr) { + for (String o2 : outputOr2) { + newOne.add(o + o2); + } } - s42.addAll(add); - s11.addAll(add2); + outputOr = newOne; + } + output.addAll(outputOr); } - return stream(input[1].split("\n")) - .filter(e -> sol.values().stream().anyMatch(r -> r.contains(e))) - .count(); + sol.put(id, output); + return output; + } + return new HashSet<>(singletonList(letter.get())); } + } } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day2.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day2.java index 1e26adc5..293587d7 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day2.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day2.java @@ -7,43 +7,43 @@ import java.util.function.Predicate; public class Day2 extends Day2020 { - public static void main(String[] args) { - new Day2().printParts(); - } + public Day2() { + super(2); + } - public Day2() { - super(2); - } + public static void main(String[] args) { + new Day2().printParts(); + } - @Override - public Object part1() { - return pwCount(Password::isValid); - } + public static Password mapPassword(String s) { + return readString(s, "%n-%n %c: %s", Password.class); + } - private long pwCount(Predicate validator) { - return dayStream().map(Day2::mapPassword).filter(validator).count(); - } + @Override + public Object part1() { + return pwCount(Password::isValid); + } - public static Password mapPassword(String s) { - return readString(s, "%n-%n %c: %s", Password.class); - } + private long pwCount(Predicate validator) { + return dayStream().map(Day2::mapPassword).filter(validator).count(); + } - public record Password (long lower, long higher, char character, String password) { + @Override + public Object part2() { + return pwCount(Password::isValid2); + } - public boolean isValid() { - long count = password.chars().filter(c -> c == character).count(); - return count >= lower && count <= higher; - } + public record Password(long lower, long higher, char character, String password) { - public boolean isValid2() { - int char1 = password.charAt(toIntExact(lower - 1)); - int char2 = password.charAt(toIntExact(higher - 1)); - return char1 != char2 && (char1 == character || char2 == character); - } + public boolean isValid() { + long count = password.chars().filter(c -> c == character).count(); + return count >= lower && count <= higher; } - @Override - public Object part2() { - return pwCount(Password::isValid2); + public boolean isValid2() { + int char1 = password.charAt(toIntExact(lower - 1)); + int char2 = password.charAt(toIntExact(higher - 1)); + return char1 != char2 && (char1 == character || char2 == character); } + } } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day20.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day20.java index 51f485ea..d0d35495 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day20.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day20.java @@ -23,112 +23,112 @@ import org.apache.commons.lang3.ArrayUtils; public class Day20 extends Day2020 { - public static void main(String[] args) { - new Day20().printParts(); - } + public Day20() { + super(20); + } - public Day20() { - super(20); - } + public static void main(String[] args) { + new Day20().printParts(); + } - @Override - public Object part1() { - Grid[] input = stream(day().split("\n\n")).map(Grid::new).toArray(Grid[]::new); - Multimap map = ArrayListMultimap.create(); - stream(input).forEach(e -> e.getSides(map)); - Map> map2 = map.asMap(); - List answer = new ArrayList<>(); - for(Grid g : input){ - List possibleSides = Streams.concat(g.findSides(false).values().stream(), g.findSides(true).values().stream()).collect(Collectors.toList()); - if(possibleSides.stream().filter(e -> map2.get(e).size() > 1).count() == 4L){ - answer.add(g.id); - } - } - return answer.stream().mapToLong(e -> e).reduce((a,b) -> a * b).getAsLong(); + @Override + public Object part1() { + Grid[] input = stream(day().split("\n\n")).map(Grid::new).toArray(Grid[]::new); + Multimap map = ArrayListMultimap.create(); + stream(input).forEach(e -> e.getSides(map)); + Map> map2 = map.asMap(); + List answer = new ArrayList<>(); + for (Grid g : input) { + List possibleSides = Streams.concat(g.findSides(false).values().stream(), g.findSides(true).values().stream()).collect(Collectors.toList()); + if (possibleSides.stream().filter(e -> map2.get(e).size() > 1).count() == 4L) { + answer.add(g.id); + } } + return answer.stream().mapToLong(e -> e).reduce((a, b) -> a * b).getAsLong(); + } - public static record Grid (long id, char[][] grid) { - public Grid(String s){ - this(parseLong(s.substring(5,9)), stream(s.substring(11).split("\n")).map(String::toCharArray).toArray(char[][]::new)); - } + @Override + public Object part2() { + Grid[] input = stream(day().split("\n\n")).map(Grid::new).toArray(Grid[]::new); + long total = 0; + for (Grid g : input) { + total += g.countWithoutSides(); + } + long seaMonsterSize = 15; + for (long n = 0; total - n > 0; n += seaMonsterSize) { + System.out.println((n / 15) + ". " + (total - n)); + } + return total - (35 * seaMonsterSize); + } - public Multimap getSides(Multimap map){ - findSides(map, false); - findSides(map, true); - return map; - } + public static record Grid(long id, char[][] grid) { + public Grid(String s) { + this(parseLong(s.substring(5, 9)), stream(s.substring(11).split("\n")).map(String::toCharArray).toArray(char[][]::new)); + } - private void findSides(Multimap map, boolean flipped) { - Point p = new Point(flipped ? grid.length-1 : 0, flipped ? 0 : grid.length-1); - Direction[] d = Direction.fourDirections(); - if(flipped) ArrayUtils.reverse(d); - for(Direction dir : d){ - StringBuilder res = new StringBuilder(); - for(int i = 0; i getSides(Multimap map) { + findSides(map, false); + findSides(map, true); + return map; + } - private Map findSides(boolean flipped) { - Map map = new HashMap<>(); - Point p = new Point(flipped ? grid.length-1 : 0, flipped ? 0 : grid.length-1); - Direction[] d = Direction.fourDirections(); - if(flipped) ArrayUtils.reverse(d); - for(Direction dir : d){ - StringBuilder res = new StringBuilder(); - for(int i = 0; i map, boolean flipped) { + Point p = new Point(flipped ? grid.length - 1 : 0, flipped ? 0 : grid.length - 1); + Direction[] d = Direction.fourDirections(); + if (flipped) ArrayUtils.reverse(d); + for (Direction dir : d) { + StringBuilder res = new StringBuilder(); + for (int i = 0; i < grid.length; i++) { + res.append(dir.getInGrid(grid, p)); + if (i != grid.length - 1) + p = dir.move(p); } + map.put(res.toString(), new Metadata(id, dir.turn(false), flipped)); + } + } - public long countWithoutSides(){ - long total = 0; - for(int i = 1; i findSides(boolean flipped) { + Map map = new HashMap<>(); + Point p = new Point(flipped ? grid.length - 1 : 0, flipped ? 0 : grid.length - 1); + Direction[] d = Direction.fourDirections(); + if (flipped) ArrayUtils.reverse(d); + for (Direction dir : d) { + StringBuilder res = new StringBuilder(); + for (int i = 0; i < grid.length; i++) { + res.append(dir.getInGrid(grid, p)); + if (i != grid.length - 1) + p = dir.move(p); } + map.put(dir, res.toString()); + } + return map; } - public static record Metadata (long id, Direction dir, boolean flipped) { - public boolean validMetadata(List l){ - Map map = new EnumMap(Direction.class); - for(Metadata m : l){ - map.put(m.dir, m.flipped); - } - return l.size() == 4 && - map.size() == 4 && - l.stream().map(n -> n.id).distinct().count() == 4L && - map.get(NORTH).equals(map.get(SOUTH)) && - map.get(EAST).equals(map.get(WEST)) && - map.get(NORTH).equals(map.get(EAST)); + public long countWithoutSides() { + long total = 0; + for (int i = 1; i < grid.length - 1; i++) { + for (int j = 1; j < grid[i].length - 1; j++) { + if (grid[i][j] == '#') { + total++; + } } + } + return total; } + } - @Override - public Object part2() { - Grid[] input = stream(day().split("\n\n")).map(Grid::new).toArray(Grid[]::new); - long total = 0; - for(Grid g : input){ - total+=g.countWithoutSides(); - } - long seaMonsterSize = 15; - for(long n = 0; total-n>0; n+=seaMonsterSize){ - System.out.println((n/15)+". "+(total-n)); - } - return total-(35*seaMonsterSize); + public static record Metadata(long id, Direction dir, boolean flipped) { + public boolean validMetadata(List l) { + Map map = new EnumMap(Direction.class); + for (Metadata m : l) { + map.put(m.dir, m.flipped); + } + return l.size() == 4 && + map.size() == 4 && + l.stream().map(n -> n.id).distinct().count() == 4L && + map.get(NORTH).equals(map.get(SOUTH)) && + map.get(EAST).equals(map.get(WEST)) && + map.get(NORTH).equals(map.get(EAST)); } + } } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day21.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day21.java index 3a60967c..63845960 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day21.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day21.java @@ -13,64 +13,64 @@ import java.util.stream.Collectors; public class Day21 extends Day2020 { - public static void main(String[] args) { - new Day21().printParts(); - } + public Day21() { + super(21); + } - public Day21() { - super(21); - } + public static void main(String[] args) { + new Day21().printParts(); + } - @Override - public Object part1() { - Rule[] input = Arrays.stream(day().split("\n")).map(Rule::new).toArray(Rule[]::new); - Multimap allergens = getAllergens(input); + private static String[] getSplit(String s) { + return s.substring(0, s.length() - 1).split(" \\(contains "); + } - long total = 0; - for(Rule r : input) { - for (String ingredient : r.ingredients) { - if(!allergens.containsValue(ingredient)){ - total++; - } - } - } - return total; - } + @Override + public Object part1() { + Rule[] input = Arrays.stream(day().split("\n")).map(Rule::new).toArray(Rule[]::new); + Multimap allergens = getAllergens(input); - private Multimap getAllergens(Rule[] input) { - Multimap allergens = ArrayListMultimap.create(); - Set found = new HashSet<>(); - for (Rule r : input) { - for (String allergen : r.allergens) { - if (!found.contains(allergen)) { - allergens.putAll(allergen, asList(r.ingredients)); - } else if (allergens.containsKey(allergen)) { - for (String s : new HashSet<>(allergens.get(allergen))) { - if (!asList(r.ingredients).contains(s)) { - allergens.remove(allergen, s); - } - } - } - found.add(allergen); - } + long total = 0; + for (Rule r : input) { + for (String ingredient : r.ingredients) { + if (!allergens.containsValue(ingredient)) { + total++; } - return allergens; + } } + return total; + } - public static record Rule (String[] ingredients, String[] allergens) { - public Rule (String s){ - this(getSplit(s)[0].split(" "), getSplit(s)[1].split(", ")); + private Multimap getAllergens(Rule[] input) { + Multimap allergens = ArrayListMultimap.create(); + Set found = new HashSet<>(); + for (Rule r : input) { + for (String allergen : r.allergens) { + if (!found.contains(allergen)) { + allergens.putAll(allergen, asList(r.ingredients)); + } else if (allergens.containsKey(allergen)) { + for (String s : new HashSet<>(allergens.get(allergen))) { + if (!asList(r.ingredients).contains(s)) { + allergens.remove(allergen, s); + } + } } + found.add(allergen); + } } + return allergens; + } - private static String[] getSplit(String s) { - return s.substring(0, s.length()-1).split(" \\(contains "); - } + @Override + public Object part2() { + Rule[] input = Arrays.stream(day().split("\n")).map(Rule::new).toArray(Rule[]::new); + Multimap allergens = getAllergens(input); + return allergens.asMap().entrySet().stream().sorted(Comparator.comparing(Map.Entry::getKey)).map(e -> e.getValue().stream().findAny().get()).collect(Collectors.joining(",")); + } - @Override - public Object part2() { - Rule[] input = Arrays.stream(day().split("\n")).map(Rule::new).toArray(Rule[]::new); - Multimap allergens = getAllergens(input); - return allergens.asMap().entrySet().stream().sorted(Comparator.comparing(Map.Entry::getKey)).map(e -> e.getValue().stream().findAny().get()).collect(Collectors.joining(",")); + public static record Rule(String[] ingredients, String[] allergens) { + public Rule(String s) { + this(getSplit(s)[0].split(" "), getSplit(s)[1].split(", ")); } + } } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day22.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day22.java index 1c257d8e..d272e158 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day22.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day22.java @@ -1,94 +1,94 @@ package com.sbaars.adventofcode.year20.days; -import com.google.common.collect.Comparators; -import com.sbaars.adventofcode.year20.Day2020; - -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.PrintStream; -import java.util.*; -import java.util.stream.LongStream; - import static java.lang.Math.toIntExact; -import static java.util.Arrays.asList; import static java.util.stream.Collectors.toCollection; -import static org.apache.commons.lang3.ArrayUtils.subarray; + +import com.sbaars.adventofcode.year20.Day2020; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.Deque; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.LongStream; public class Day22 extends Day2020 { - public static void main(String[] args) { - new Day22().printParts(); - } + public Day22() { + super(22); + } - public Day22() { - super(22); - } + public static void main(String[] args) { + new Day22().printParts(); + } - @Override - public Object part1() { - String[] input = day().split("\n\n"); - Deque p1 = getInput(0, input); - Deque p2 = getInput(1, input); + @Override + public Object part1() { + String[] input = day().split("\n\n"); + Deque p1 = getInput(0, input); + Deque p2 = getInput(1, input); - while(p1.size()>0 && p2.size() > 0){ - long l1 = p1.pop(); - long l2 = p2.pop(); - if(l1 > l2){ - p1.add(l1); - p1.add(l2); - } else { - p2.add(l2); - p2.add(l1); - } - } - Deque winner = p1.size()>0 ? p1 : p2; - return calcScore(winner); + while (p1.size() > 0 && p2.size() > 0) { + long l1 = p1.pop(); + long l2 = p2.pop(); + if (l1 > l2) { + p1.add(l1); + p1.add(l2); + } else { + p2.add(l2); + p2.add(l1); + } } + Deque winner = p1.size() > 0 ? p1 : p2; + return calcScore(winner); + } - private long calcScore(Deque winner) { - return LongStream.rangeClosed(1, winner.size()).boxed().sorted(Comparator.reverseOrder()).mapToLong(l -> winner.pop() * l).sum(); - } + private long calcScore(Deque winner) { + return LongStream.rangeClosed(1, winner.size()).boxed().sorted(Comparator.reverseOrder()).mapToLong(l -> winner.pop() * l).sum(); + } - @Override - public Object part2() { - String[] input = day().split("\n\n"); - Deque p1 = getInput(0, input); - Deque p2 = getInput(1, input); - return calcScore(playGame(p1, p2) == Player.P1 ? p1 : p2); - } + @Override + public Object part2() { + String[] input = day().split("\n\n"); + Deque p1 = getInput(0, input); + Deque p2 = getInput(1, input); + return calcScore(playGame(p1, p2) == Player.P1 ? p1 : p2); + } - private ArrayDeque getInput(int i, String[] input) { - return Arrays.stream(input[i].split("\n")).filter(e -> !e.startsWith("Player")).map(Long::parseLong).collect(toCollection(ArrayDeque::new)); - } + private ArrayDeque getInput(int i, String[] input) { + return Arrays.stream(input[i].split("\n")).filter(e -> !e.startsWith("Player")).map(Long::parseLong).collect(toCollection(ArrayDeque::new)); + } - public Player playGame(Deque p1, Deque p2){ - Set> playedGames = new HashSet<>(); - while(p1.size()>0 && p2.size() > 0){ - if(!playedGames.add(new ArrayList<>(p1))){ - return Player.P1; - } + public Player playGame(Deque p1, Deque p2) { + Set> playedGames = new HashSet<>(); + while (p1.size() > 0 && p2.size() > 0) { + if (!playedGames.add(new ArrayList<>(p1))) { + return Player.P1; + } - long l1 = p1.pop(); - long l2 = p2.pop(); - if(p1.size() < l1 || p2.size() < l2){ - if(l1 > l2){ - p1.add(l1); - p1.add(l2); - } else { - p2.add(l2); - p2.add(l1); - } - } else { - if(playGame(new ArrayDeque<>(new ArrayList<>(p1).subList(0, toIntExact(l1))), new ArrayDeque<>(new ArrayList<>(p2).subList(0, toIntExact(l2)))) == Player.P1){ - p1.add(l1); - p1.add(l2); - } else { - p2.add(l2); - p2.add(l1); - } - } + long l1 = p1.pop(); + long l2 = p2.pop(); + if (p1.size() < l1 || p2.size() < l2) { + if (l1 > l2) { + p1.add(l1); + p1.add(l2); + } else { + p2.add(l2); + p2.add(l1); + } + } else { + if (playGame(new ArrayDeque<>(new ArrayList<>(p1).subList(0, toIntExact(l1))), new ArrayDeque<>(new ArrayList<>(p2).subList(0, toIntExact(l2)))) == Player.P1) { + p1.add(l1); + p1.add(l2); + } else { + p2.add(l2); + p2.add(l1); } - return p1.size()>0 ? Player.P1 : Player.P2; + } } + return p1.size() > 0 ? Player.P1 : Player.P2; + } - enum Player{P1, P2} + enum Player {P1, P2} } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java index 059e4427..61354f5f 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java @@ -1,58 +1,57 @@ package com.sbaars.adventofcode.year20.days; +import static java.lang.Long.parseLong; +import static java.util.Arrays.stream; + import com.google.common.collect.Streams; import com.sbaars.adventofcode.common.CircularLinkedList; import com.sbaars.adventofcode.common.CircularLinkedList.Node; import com.sbaars.adventofcode.year20.Day2020; - import java.util.stream.Collectors; import java.util.stream.IntStream; -import static java.lang.Long.parseLong; -import static java.util.Arrays.stream; - public class Day23 extends Day2020 { - public static void main(String[] args) { - new Day23().printParts(); - } - - public Day23() { - super(23); - } - - @Override - public Object part1() { - return getSolution(true); - } - - @Override - public Object part2() { - return getSolution(false); - } - - private long getSolution(boolean part1) { - int[] input = day().chars().map(Character::getNumericValue).toArray(); - CircularLinkedList cups = new CircularLinkedList( - Streams.concat(stream(input), part1 ? IntStream.empty() : IntStream.rangeClosed(10, 1000000) + public Day23() { + super(23); + } + + public static void main(String[] args) { + new Day23().printParts(); + } + + @Override + public Object part1() { + return getSolution(true); + } + + @Override + public Object part2() { + return getSolution(false); + } + + private long getSolution(boolean part1) { + int[] input = day().chars().map(Character::getNumericValue).toArray(); + CircularLinkedList cups = new CircularLinkedList( + Streams.concat(stream(input), part1 ? IntStream.empty() : IntStream.rangeClosed(10, 1000000) ).toArray()); - for(int i = 0; i<(part1 ? 100 : 10000000); i++){ - int current = cups.current(); - int j; - Node next = cups.currentNode().next; - Node last = next.next.next; - for(j = current - 2 + cups.size(); j>0; j--){ - int n = j % cups.size() + 1; - if(next.value != n && next.next.value != n && last.value != n){ - break; - } - } - int d = j % cups.size() + 1; - cups.insertAfter(next, last, d); - cups.next(); + for (int i = 0; i < (part1 ? 100 : 10000000); i++) { + int current = cups.current(); + int j; + Node next = cups.currentNode().next; + Node last = next.next.next; + for (j = current - 2 + cups.size(); j > 0; j--) { + int n = j % cups.size() + 1; + if (next.value != n && next.next.value != n && last.value != n) { + break; } - cups.setCurrent(1); - if(part1) return parseLong(stream(cups.next(8)).mapToObj(Integer::toString).collect(Collectors.joining())); - int[] next = cups.next(2); - return (long)next[0] * next[1]; + } + int d = j % cups.size() + 1; + cups.insertAfter(next, last, d); + cups.next(); } + cups.setCurrent(1); + if (part1) return parseLong(stream(cups.next(8)).mapToObj(Integer::toString).collect(Collectors.joining())); + int[] next = cups.next(2); + return (long) next[0] * next[1]; + } } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day24.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day24.java index 82dca1f5..c52780e6 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day24.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day24.java @@ -1,82 +1,84 @@ package com.sbaars.adventofcode.year20.days; +import static java.util.Arrays.stream; +import static java.util.stream.Collectors.toList; + import com.sbaars.adventofcode.common.HexDirection; import com.sbaars.adventofcode.year20.Day2020; - import java.awt.*; -import java.util.*; +import java.util.ArrayList; +import java.util.HashSet; import java.util.List; - -import static java.util.Arrays.stream; -import static java.util.stream.Collectors.toList; +import java.util.Optional; +import java.util.Set; public class Day24 extends Day2020 { - public static void main(String[] args) { - new Day24().printParts(); - } + Set visited = new HashSet<>(); - Set visited = new HashSet<>(); + public Day24() { + super(24); + } - public Day24() { - super(24); - } + public static void main(String[] args) { + new Day24().printParts(); + } - @Override - public Object part1() { - var input = stream(dayStrings()).map(this::read).collect(toList()); - for(List dirs : input){ - Point pos = new Point(0,0); - for(HexDirection dir : dirs){ - pos = dir.move(pos); - } - if(!visited.add(pos)){ - visited.remove(pos); - } - } - return visited.size(); + @Override + public Object part1() { + var input = stream(dayStrings()).map(this::read).collect(toList()); + for (List dirs : input) { + Point pos = new Point(0, 0); + for (HexDirection dir : dirs) { + pos = dir.move(pos); + } + if (!visited.add(pos)) { + visited.remove(pos); + } } + return visited.size(); + } - public List read(String dirs){ - List res = new ArrayList<>(dirs.length()); - while(dirs.length()>0){ - Optional direction; - if(dirs.length()>1 && (direction = HexDirection.get(dirs.substring(0,2))).isPresent()){ - res.add(direction.get()); - dirs = dirs.substring(2); - } else if ((direction = HexDirection.get(dirs.substring(0,1))).isPresent()){ - res.add(direction.get()); - dirs = dirs.substring(1); - } - } - return res; + public List read(String dirs) { + List res = new ArrayList<>(dirs.length()); + while (dirs.length() > 0) { + Optional direction; + if (dirs.length() > 1 && (direction = HexDirection.get(dirs.substring(0, 2))).isPresent()) { + res.add(direction.get()); + dirs = dirs.substring(2); + } else if ((direction = HexDirection.get(dirs.substring(0, 1))).isPresent()) { + res.add(direction.get()); + dirs = dirs.substring(1); + } } + return res; + } - @Override - public Object part2() { - for(int i = 0; i<100; i++){ - Set newPos = new HashSet<>(); - visited.forEach(p -> addNeighbors(visited, newPos, new HashSet<>(), p, true)); - visited = newPos; - } - return visited.size(); + @Override + public Object part2() { + for (int i = 0; i < 100; i++) { + Set newPos = new HashSet<>(); + visited.forEach(p -> addNeighbors(visited, newPos, new HashSet<>(), p, true)); + visited = newPos; } + return visited.size(); + } - public void addNeighbors(Set pos, Set newPos, Set checkedPos, Point p, boolean active){ - if(!checkedPos.contains(p)) { - int neighbours = 0; - checkedPos.add(p); - for(HexDirection dir : HexDirection.values()) { - Point x = dir.move(p); - if (pos.contains(x)) { - neighbours++; - } else if (active) { - addNeighbors(pos, newPos, checkedPos, x, false); - } - } - if((active && (neighbours == 1 || neighbours == 2)) || - (!active && neighbours == 2)){ - newPos.add(p); - } + public void addNeighbors(Set pos, Set newPos, Set checkedPos, Point p, boolean active) { + if (!checkedPos.contains(p)) { + int neighbours = 0; + checkedPos.add(p); + for (HexDirection dir : HexDirection.values()) { + Point x = dir.move(p); + if (pos.contains(x)) { + neighbours++; + } else if (active) { + addNeighbors(pos, newPos, checkedPos, x, false); } + } + if ((active && (neighbours == 1 || neighbours == 2)) || + (!active && neighbours == 2)) { + newPos.add(p); + } } + } } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day25.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day25.java index 2c53535f..c00a9c9f 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day25.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day25.java @@ -3,37 +3,37 @@ import com.sbaars.adventofcode.year20.Day2020; public class Day25 extends Day2020 { - public static void main(String[] args) { - new Day25().printParts(); - } + public Day25() { + super(25); + } - public Day25() { - super(25); - } + public static void main(String[] args) { + new Day25().printParts(); + } - @Override - public Object part1() { - long cardPublicKey = 1965712L; - long doorPublicKey = 19072108L; - long value = 1; - for(int loopSize = 1; true; loopSize++) { - value = transform(value, loopSize-1, loopSize, 7); - if(value == cardPublicKey) { - return transform(1, 0, loopSize, doorPublicKey); - } - } + @Override + public Object part1() { + long cardPublicKey = 1965712L; + long doorPublicKey = 19072108L; + long value = 1; + for (int loopSize = 1; true; loopSize++) { + value = transform(value, loopSize - 1, loopSize, 7); + if (value == cardPublicKey) { + return transform(1, 0, loopSize, doorPublicKey); + } } + } - public long transform (long value, int start, int loopSize, long subjectNumber){ - for (int i = start; i < loopSize; i++) { - value *= subjectNumber; - value %= 20201227; - } - return value; + public long transform(long value, int start, int loopSize, long subjectNumber) { + for (int i = start; i < loopSize; i++) { + value *= subjectNumber; + value %= 20201227; } + return value; + } - @Override - public Object part2() { - return "That's all folks"; - } + @Override + public Object part2() { + return "That's all folks"; + } } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day3.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day3.java index 6c1e28fe..b7602b88 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day3.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day3.java @@ -3,32 +3,32 @@ import com.sbaars.adventofcode.year20.Day2020; public class Day3 extends Day2020 { - public static void main(String[] args) { - new Day3().printParts(); - } + public Day3() { + super(3); + } - public Day3() { - super(3); - } + public static void main(String[] args) { + new Day3().printParts(); + } - @Override - public Object part1() { - return trees(dayGrid(), 3, 1); - } + @Override + public Object part1() { + return trees(dayGrid(), 3, 1); + } - @Override - public Object part2() { - char[][] g = dayGrid(); - return trees(g, 1, 1) * trees(g, 3, 1) * trees(g, 5, 1) * trees(g, 7, 1) * trees(g, 1, 2); - } + @Override + public Object part2() { + char[][] g = dayGrid(); + return trees(g, 1, 1) * trees(g, 3, 1) * trees(g, 5, 1) * trees(g, 7, 1) * trees(g, 1, 2); + } - int trees(char[][] grid, int x, int y) { - int trees = 0; - for (int i = 0; i * y < grid.length; i++) { - if (grid[i * y][i * x % grid[0].length] == '#') { - trees++; - } - } - return trees; + int trees(char[][] grid, int x, int y) { + int trees = 0; + for (int i = 0; i * y < grid.length; i++) { + if (grid[i * y][i * x % grid[0].length] == '#') { + trees++; + } } + return trees; + } } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day4.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day4.java index a1ca3993..5cc7f2c2 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day4.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day4.java @@ -9,48 +9,48 @@ import java.util.regex.Pattern; public class Day4 extends Day2020 { - private static final Map expected = Map.of("byr", "^(200[0-2]|19[2-9][0-9])$", - "iyr", "^(2020|201[0-9])$", - "eyr", "^(2030|202[0-9])$", - "hgt", "^((1([5-8][0-9]|9[0-3])cm)|((59|6[0-9]|7[0-6])in))$", - "hcl", "^(#[0-9a-f]{6})$", - "ecl", "^(amb|blu|brn|gry|grn|hzl|oth)$", - "pid", "^[0-9]{9}$"); - - public static void main(String[] args) { - new Day4().printParts(); - } - - public Day4() { - super(4); - } - - @Override - public Object part1() { - return verifyPassports(this::valid1); - } - - @Override - public Object part2() { - return verifyPassports(this::valid2); - } - - public long verifyPassports(Predicate verifyFunction) { - String[][] passports = Arrays.stream(day().split("\n\n")).map(str -> str.replace("\n", " ")).map(str -> str.split(" ")).toArray(String[][]::new); - return Arrays.stream(passports).filter(verifyFunction).count(); - } - - public boolean valid1(String[] passport) { - return Arrays.stream(passport).map(s -> s.substring(0, 3)).collect(toImmutableSet()).containsAll(expected.keySet()); - } - - public boolean valid2(String[] passport) { - return valid1(passport) && Arrays.stream(passport).map(s -> s.split(":")).allMatch(s -> matchesRegex(s[0], s[1])); - } - - public boolean matchesRegex(String key, String validate) { - if (!expected.containsKey(key)) return true; - final Pattern pattern = Pattern.compile(expected.get(key)); - return pattern.matcher(validate).matches(); - } + private static final Map expected = Map.of("byr", "^(200[0-2]|19[2-9][0-9])$", + "iyr", "^(2020|201[0-9])$", + "eyr", "^(2030|202[0-9])$", + "hgt", "^((1([5-8][0-9]|9[0-3])cm)|((59|6[0-9]|7[0-6])in))$", + "hcl", "^(#[0-9a-f]{6})$", + "ecl", "^(amb|blu|brn|gry|grn|hzl|oth)$", + "pid", "^[0-9]{9}$"); + + public Day4() { + super(4); + } + + public static void main(String[] args) { + new Day4().printParts(); + } + + @Override + public Object part1() { + return verifyPassports(this::valid1); + } + + @Override + public Object part2() { + return verifyPassports(this::valid2); + } + + public long verifyPassports(Predicate verifyFunction) { + String[][] passports = Arrays.stream(day().split("\n\n")).map(str -> str.replace("\n", " ")).map(str -> str.split(" ")).toArray(String[][]::new); + return Arrays.stream(passports).filter(verifyFunction).count(); + } + + public boolean valid1(String[] passport) { + return Arrays.stream(passport).map(s -> s.substring(0, 3)).collect(toImmutableSet()).containsAll(expected.keySet()); + } + + public boolean valid2(String[] passport) { + return valid1(passport) && Arrays.stream(passport).map(s -> s.split(":")).allMatch(s -> matchesRegex(s[0], s[1])); + } + + public boolean matchesRegex(String key, String validate) { + if (!expected.containsKey(key)) return true; + final Pattern pattern = Pattern.compile(expected.get(key)); + return pattern.matcher(validate).matches(); + } } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day5.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day5.java index 9ac59781..294e92ca 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day5.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day5.java @@ -6,45 +6,45 @@ public class Day5 extends Day2020 { - public static void main(String[] args) { - new Day5().printParts(); - } + public Day5() { + super(5); + } - public Day5() { - super(5); - } + public static void main(String[] args) { + new Day5().printParts(); + } - @Override - public Object part1() { - return getSeatIds(dayStrings()).stream().mapToInt(e -> e).max().getAsInt(); - } + @Override + public Object part1() { + return getSeatIds(dayStrings()).stream().mapToInt(e -> e).max().getAsInt(); + } - private Set getSeatIds(String[] boardingPasses) { - Set l = new HashSet<>(); - for (String s : boardingPasses) { - int rowLow = 0; - int rowHigh = 127; - int columnLow = 0; - int columnHigh = 7; - for (char c : s.toCharArray()) { - if (c == 'F') { - rowHigh -= (rowHigh - rowLow + 1) / 2; - } else if (c == 'B') { - rowLow += (rowHigh - rowLow + 1) / 2; - } else if (c == 'L') { - columnHigh -= (columnHigh - columnLow + 1) / 2; - } else if (c == 'R') { - columnLow += (columnHigh - columnLow + 1) / 2; - } - } - l.add(rowHigh * 8 + columnHigh); + private Set getSeatIds(String[] boardingPasses) { + Set l = new HashSet<>(); + for (String s : boardingPasses) { + int rowLow = 0; + int rowHigh = 127; + int columnLow = 0; + int columnHigh = 7; + for (char c : s.toCharArray()) { + if (c == 'F') { + rowHigh -= (rowHigh - rowLow + 1) / 2; + } else if (c == 'B') { + rowLow += (rowHigh - rowLow + 1) / 2; + } else if (c == 'L') { + columnHigh -= (columnHigh - columnLow + 1) / 2; + } else if (c == 'R') { + columnLow += (columnHigh - columnLow + 1) / 2; } - return l; + } + l.add(rowHigh * 8 + columnHigh); } + return l; + } - @Override - public Object part2() { - Set l = getSeatIds(dayStrings()); - return l.stream().mapToInt(e -> e).filter(n -> l.contains(n) && l.contains(n + 2) && !l.contains(n + 1)).sum() + 1; - } + @Override + public Object part2() { + Set l = getSeatIds(dayStrings()); + return l.stream().mapToInt(e -> e).filter(n -> l.contains(n) && l.contains(n + 2) && !l.contains(n + 1)).sum() + 1; + } } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day6.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day6.java index 7b83f853..3e611be1 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day6.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day6.java @@ -10,28 +10,28 @@ public class Day6 extends Day2020 { - public static void main(String[] args) { - new Day6().printParts(); - } + public Day6() { + super(6); + } - public Day6() { - super(6); - } + public static void main(String[] args) { + new Day6().printParts(); + } - @Override - public Object part1() { - return Arrays.stream(day().split("\n\n")) - .map(i -> i.replace("\n", "")) - .mapToLong(i -> i.chars().distinct().count()).sum(); - } + @Override + public Object part1() { + return Arrays.stream(day().split("\n\n")) + .map(i -> i.replace("\n", "")) + .mapToLong(i -> i.chars().distinct().count()).sum(); + } - @Override - public Object part2() { - return Arrays.stream(day().split("\n\n")).mapToInt(group -> { - String[] people = group.split("\n"); - List c = new ArrayList<>(asList(people[0].chars().toArray())); - range(1, people.length).forEach(i -> c.retainAll(asList(people[i].chars().toArray()))); - return c.size(); - }).sum(); - } + @Override + public Object part2() { + return Arrays.stream(day().split("\n\n")).mapToInt(group -> { + String[] people = group.split("\n"); + List c = new ArrayList<>(asList(people[0].chars().toArray())); + range(1, people.length).forEach(i -> c.retainAll(asList(people[i].chars().toArray()))); + return c.size(); + }).sum(); + } } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day7.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day7.java index a6ff9c7f..c74b6ead 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day7.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day7.java @@ -14,77 +14,77 @@ public class Day7 extends Day2020 { - private Trade[] trades; - - public Day7() { - super(7); - this.trades = dayStream().filter(s -> !s.contains("no other bags")).map(Trade::new).toArray(Trade[]::new); - } - - public static void main(String[] args) { - new Day7().printParts(); - } - - @Override - public Object part1() { - return findBagTypes(new Item(1, "shiny gold"), new HashSet<>()).size() - 1; - } - - @Override - public Object part2() { - return findNumberOfBags(new LinkedList<>(singletonList(new Item(1, "shiny gold")))) - 1; - } - - private Trade[] getTrades(Item i) { - return stream(trades).filter(e -> stream(e.output).anyMatch(t -> t.item.equals(i.item) && t.amount >= i.amount)).toArray(Trade[]::new); - } - - private Optional getTrade(Item i) { - return stream(trades).filter(e -> e.input.item.equals(i.item)).findAny(); - } - - private Set findBagTypes(Item buyingItem, Set visitedColors) { - visitedColors.add(buyingItem.item); - Trade[] possibleTrades = getTrades(buyingItem); - stream(possibleTrades).forEach(t -> findBagTypes(t.input, visitedColors)); - return visitedColors; - } - - private long findNumberOfBags(Deque leftOver) { - long total = 0; - while (!leftOver.isEmpty()) total += findBagsInside(leftOver, leftOver.pop()); - return total; - } - - private long findBagsInside(Deque leftOver, Item buyingItem) { - Optional fuelTrade = getTrade(buyingItem); - fuelTrade.ifPresent(trade -> stream(trade.output).flatMap(i -> IntStream.rangeClosed(1, toIntExact(i.amount)).mapToObj(e -> new Item(1, i.item))).forEach(leftOver::add)); - return buyingItem.amount; - } - - public static class Trade { - public final Item input; - public final Item[] output; - - public Trade(String trade) { - String[] inputOutput = trade.split(" contain "); - output = stream(inputOutput[1].split(", ")).map(Item::new).toArray(Item[]::new); - input = new Item(1, inputOutput[0].replace(" bags", "")); - } - } - - public static class Item { - public long amount; - public final String item; - - public Item(String item) { - amount = Integer.parseInt(item.substring(0,1)); - this.item = item.substring(2).replaceAll(" bags?\\.?", ""); - } - - public Item(long i, String string) { - amount = i; - item = string; - } - } + private final Trade[] trades; + + public Day7() { + super(7); + this.trades = dayStream().filter(s -> !s.contains("no other bags")).map(Trade::new).toArray(Trade[]::new); + } + + public static void main(String[] args) { + new Day7().printParts(); + } + + @Override + public Object part1() { + return findBagTypes(new Item(1, "shiny gold"), new HashSet<>()).size() - 1; + } + + @Override + public Object part2() { + return findNumberOfBags(new LinkedList<>(singletonList(new Item(1, "shiny gold")))) - 1; + } + + private Trade[] getTrades(Item i) { + return stream(trades).filter(e -> stream(e.output).anyMatch(t -> t.item.equals(i.item) && t.amount >= i.amount)).toArray(Trade[]::new); + } + + private Optional getTrade(Item i) { + return stream(trades).filter(e -> e.input.item.equals(i.item)).findAny(); + } + + private Set findBagTypes(Item buyingItem, Set visitedColors) { + visitedColors.add(buyingItem.item); + Trade[] possibleTrades = getTrades(buyingItem); + stream(possibleTrades).forEach(t -> findBagTypes(t.input, visitedColors)); + return visitedColors; + } + + private long findNumberOfBags(Deque leftOver) { + long total = 0; + while (!leftOver.isEmpty()) total += findBagsInside(leftOver, leftOver.pop()); + return total; + } + + private long findBagsInside(Deque leftOver, Item buyingItem) { + Optional fuelTrade = getTrade(buyingItem); + fuelTrade.ifPresent(trade -> stream(trade.output).flatMap(i -> IntStream.rangeClosed(1, toIntExact(i.amount)).mapToObj(e -> new Item(1, i.item))).forEach(leftOver::add)); + return buyingItem.amount; + } + + public static class Trade { + public final Item input; + public final Item[] output; + + public Trade(String trade) { + String[] inputOutput = trade.split(" contain "); + output = stream(inputOutput[1].split(", ")).map(Item::new).toArray(Item[]::new); + input = new Item(1, inputOutput[0].replace(" bags", "")); + } + } + + public static class Item { + public final String item; + public long amount; + + public Item(String item) { + amount = Integer.parseInt(item.substring(0, 1)); + this.item = item.substring(2).replaceAll(" bags?\\.?", ""); + } + + public Item(long i, String string) { + amount = i; + item = string; + } + } } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day8.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day8.java index d6887bc8..02e3abea 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day8.java @@ -7,34 +7,34 @@ public class Day8 extends Day2020 { - public static void main(String[] args) { - new Day8().printParts(); - } + public Day8() { + super(8); + } - public Day8() { - super(8); - } + public static void main(String[] args) { + new Day8().printParts(); + } - @Override - public Object part1() { - Gamepad gamepad = new Gamepad(dayStream()); - Set visited = new HashSet<>(); - while (visited.add(gamepad.executeInstruction())); - return gamepad.getAccumulator(); - } + @Override + public Object part1() { + Gamepad gamepad = new Gamepad(dayStream()); + Set visited = new HashSet<>(); + while (visited.add(gamepad.executeInstruction())) ; + return gamepad.getAccumulator(); + } - @Override - public Object part2() { - for (int i = 0; i < 223; i++) { - Gamepad gamepad = new Gamepad(dayStream()); - gamepad.replaceInstruction("jmp", "nop", i); - Set visited = new HashSet<>(); - while (visited.add(gamepad.executeInstruction())){ - if (gamepad.getCurrent() == gamepad.getSize()){ - return gamepad.getAccumulator(); - } - } + @Override + public Object part2() { + for (int i = 0; i < 223; i++) { + Gamepad gamepad = new Gamepad(dayStream()); + gamepad.replaceInstruction("jmp", "nop", i); + Set visited = new HashSet<>(); + while (visited.add(gamepad.executeInstruction())) { + if (gamepad.getCurrent() == gamepad.getSize()) { + return gamepad.getAccumulator(); } - throw new IllegalStateException(); + } } + throw new IllegalStateException(); + } } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day9.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day9.java index 8b4ae614..0899da17 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day9.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day9.java @@ -8,43 +8,43 @@ import java.util.Set; public class Day9 extends Day2020 { - public Day9() { - super(9); - } + public Day9() { + super(9); + } - public static void main(String[] args) { - new Day9().printParts(); - } + public static void main(String[] args) { + new Day9().printParts(); + } - @Override - public Object part1() { - long[] input = dayNumbers(); - for (int k = 0; k < input.length - 25; k++) { - Set sums = new HashSet<>(); - for (int i = k; i < k + 25; i++) { - for (int j = i + 1; j < k + 25; j++) { - sums.add(input[i] + input[j]); - } - } - if (!sums.contains(input[k + 25])) { - return input[k + 25]; - } + @Override + public Object part1() { + long[] input = dayNumbers(); + for (int k = 0; k < input.length - 25; k++) { + Set sums = new HashSet<>(); + for (int i = k; i < k + 25; i++) { + for (int j = i + 1; j < k + 25; j++) { + sums.add(input[i] + input[j]); } - return 0; + } + if (!sums.contains(input[k + 25])) { + return input[k + 25]; + } } + return 0; + } - @Override - public Object part2() { - long[] input = dayNumbers(); - long part1Solution = (long)part1(); - for(int i = 2; i Date: Tue, 30 Nov 2021 22:18:25 +0100 Subject: [PATCH 236/433] Prepare 2021 --- .idea/codeStyles/Project.xml | 24 +++++++++---------- .../com/sbaars/adventofcode/common/Day.java | 1 + .../sbaars/adventofcode/util/FetchInput.java | 7 +++--- .../sbaars/adventofcode/year21/Day2021.java | 9 +++++++ .../com/sbaars/adventofcode/year21/Main.java | 16 +++++++++++++ .../sbaars/adventofcode/year21/days/Day1.java | 24 +++++++++++++++++++ .../adventofcode/year21/days/Day10.java | 23 ++++++++++++++++++ .../adventofcode/year21/days/Day11.java | 23 ++++++++++++++++++ .../adventofcode/year21/days/Day12.java | 23 ++++++++++++++++++ .../adventofcode/year21/days/Day13.java | 23 ++++++++++++++++++ .../adventofcode/year21/days/Day14.java | 23 ++++++++++++++++++ .../adventofcode/year21/days/Day15.java | 23 ++++++++++++++++++ .../adventofcode/year21/days/Day16.java | 24 +++++++++++++++++++ .../adventofcode/year21/days/Day17.java | 23 ++++++++++++++++++ .../adventofcode/year21/days/Day18.java | 23 ++++++++++++++++++ .../adventofcode/year21/days/Day19.java | 24 +++++++++++++++++++ .../sbaars/adventofcode/year21/days/Day2.java | 23 ++++++++++++++++++ .../adventofcode/year21/days/Day20.java | 23 ++++++++++++++++++ .../adventofcode/year21/days/Day21.java | 23 ++++++++++++++++++ .../adventofcode/year21/days/Day22.java | 23 ++++++++++++++++++ .../adventofcode/year21/days/Day23.java | 23 ++++++++++++++++++ .../adventofcode/year21/days/Day24.java | 24 +++++++++++++++++++ .../adventofcode/year21/days/Day25.java | 23 ++++++++++++++++++ .../sbaars/adventofcode/year21/days/Day3.java | 23 ++++++++++++++++++ .../sbaars/adventofcode/year21/days/Day4.java | 24 +++++++++++++++++++ .../sbaars/adventofcode/year21/days/Day5.java | 24 +++++++++++++++++++ .../sbaars/adventofcode/year21/days/Day6.java | 24 +++++++++++++++++++ .../sbaars/adventofcode/year21/days/Day7.java | 24 +++++++++++++++++++ .../sbaars/adventofcode/year21/days/Day8.java | 24 +++++++++++++++++++ .../sbaars/adventofcode/year21/days/Day9.java | 23 ++++++++++++++++++ 30 files changed, 625 insertions(+), 16 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode/year21/Day2021.java create mode 100644 src/main/java/com/sbaars/adventofcode/year21/Main.java create mode 100644 src/main/java/com/sbaars/adventofcode/year21/days/Day1.java create mode 100644 src/main/java/com/sbaars/adventofcode/year21/days/Day10.java create mode 100644 src/main/java/com/sbaars/adventofcode/year21/days/Day11.java create mode 100644 src/main/java/com/sbaars/adventofcode/year21/days/Day12.java create mode 100644 src/main/java/com/sbaars/adventofcode/year21/days/Day13.java create mode 100644 src/main/java/com/sbaars/adventofcode/year21/days/Day14.java create mode 100644 src/main/java/com/sbaars/adventofcode/year21/days/Day15.java create mode 100644 src/main/java/com/sbaars/adventofcode/year21/days/Day16.java create mode 100644 src/main/java/com/sbaars/adventofcode/year21/days/Day17.java create mode 100644 src/main/java/com/sbaars/adventofcode/year21/days/Day18.java create mode 100644 src/main/java/com/sbaars/adventofcode/year21/days/Day19.java create mode 100644 src/main/java/com/sbaars/adventofcode/year21/days/Day2.java create mode 100644 src/main/java/com/sbaars/adventofcode/year21/days/Day20.java create mode 100644 src/main/java/com/sbaars/adventofcode/year21/days/Day21.java create mode 100644 src/main/java/com/sbaars/adventofcode/year21/days/Day22.java create mode 100644 src/main/java/com/sbaars/adventofcode/year21/days/Day23.java create mode 100644 src/main/java/com/sbaars/adventofcode/year21/days/Day24.java create mode 100644 src/main/java/com/sbaars/adventofcode/year21/days/Day25.java create mode 100644 src/main/java/com/sbaars/adventofcode/year21/days/Day3.java create mode 100644 src/main/java/com/sbaars/adventofcode/year21/days/Day4.java create mode 100644 src/main/java/com/sbaars/adventofcode/year21/days/Day5.java create mode 100644 src/main/java/com/sbaars/adventofcode/year21/days/Day6.java create mode 100644 src/main/java/com/sbaars/adventofcode/year21/days/Day7.java create mode 100644 src/main/java/com/sbaars/adventofcode/year21/days/Day8.java create mode 100644 src/main/java/com/sbaars/adventofcode/year21/days/Day9.java diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index 38b3ad24..8b4afbf5 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -1,17 +1,5 @@ - - -

")){ + res = res.substring(res.indexOf("
"), res.indexOf("
")); + } + System.out.println(res); + } + + private String doRequest(String answer, int year, int day, int part) { + System.out.println("level="+part+"&answer="+answer); + try { + HttpRequest req = HttpRequest.newBuilder() + .uri(URI.create("https://adventofcode.com/"+year+"/day/"+day+"/answer")) + .header("Content-Type", "application/x-www-form-urlencoded") + .POST(HttpRequest.BodyPublishers.ofString("level="+part+"&answer="+answer)).build(); + System.out.println(req); + return client.send(req, HttpResponse.BodyHandlers.ofString()).body(); + } catch (Exception e) { + throw new IllegalStateException(e); + } + } +} diff --git a/src/main/java/com/sbaars/adventofcode/util/WebClient.java b/src/main/java/com/sbaars/adventofcode/util/WebClient.java new file mode 100644 index 00000000..a4b5f141 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/util/WebClient.java @@ -0,0 +1,33 @@ +package com.sbaars.adventofcode.util; + +import static com.sbaars.adventofcode.common.Day.getResourceAsString; + +import java.net.CookieHandler; +import java.net.CookieManager; +import java.net.HttpCookie; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.http.HttpClient; +import java.time.Duration; + +public class WebClient { + public static HttpClient getClient() { + String session = getResourceAsString("APIKEY"); + CookieHandler.setDefault(new CookieManager()); + + HttpCookie sessionCookie = new HttpCookie("session", session); + sessionCookie.setPath("/"); + sessionCookie.setVersion(0); + + try { + ((CookieManager) CookieHandler.getDefault()).getCookieStore().add(new URI("https://adventofcode.com"), sessionCookie); + } catch (URISyntaxException e) { + throw new IllegalStateException(e); + } + + return HttpClient.newBuilder() + .cookieHandler(CookieHandler.getDefault()) + .connectTimeout(Duration.ofSeconds(10)) + .build(); + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year18/days/Day1.java b/src/main/java/com/sbaars/adventofcode/year18/days/Day1.java index 309306d7..4aab5186 100644 --- a/src/main/java/com/sbaars/adventofcode/year18/days/Day1.java +++ b/src/main/java/com/sbaars/adventofcode/year18/days/Day1.java @@ -23,13 +23,11 @@ public Object part2() { Set encountered = new HashSet<>(); long[] ns = dayNumbers(); long acc = 0; - outerloop: while (true) { for (long n : ns) { acc += n; - if (!encountered.add(acc)) break outerloop; + if (!encountered.add(acc)) return acc; } } - return acc; } } From 8488208f6d6a8dd10c362b8028f3afd616bb56b6 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Wed, 1 Dec 2021 07:52:29 +0100 Subject: [PATCH 241/433] 2018 Day 2 --- .../sbaars/adventofcode/year18/days/Day2.java | 42 +++++++++++++++++-- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year18/days/Day2.java b/src/main/java/com/sbaars/adventofcode/year18/days/Day2.java index 9abbc24c..266222e6 100644 --- a/src/main/java/com/sbaars/adventofcode/year18/days/Day2.java +++ b/src/main/java/com/sbaars/adventofcode/year18/days/Day2.java @@ -1,6 +1,13 @@ package com.sbaars.adventofcode.year18.days; +import static java.util.Optional.empty; + +import com.google.common.collect.Sets; import com.sbaars.adventofcode.year18.Day2018; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; public class Day2 extends Day2018 { public Day2() { @@ -8,16 +15,45 @@ public Day2() { } public static void main(String[] args) { - new Day2().printParts(); + new Day2().submitPart2(); } @Override public Object part1() { - return ""; + int two = 0, three = 0; + String[] input = dayStrings(); + for(String i : input){ + List counts = i.chars().mapToObj(c -> (i+"_").split(Character.toString(c)).length - 1).toList(); + if(counts.contains(2)) { + two++; + } + if(counts.contains(3)) { + three++; + } + } + return two * three; } @Override public Object part2() { - return ""; + var com = Sets.combinations(dayStream().collect(Collectors.toSet()), 2); + return com.stream().map(this::compareStrings).filter(Optional::isPresent).map(Optional::get).findFirst().get(); + } + + private Optional compareStrings(Set str) { + var it = str.iterator(); + String str1 = it.next(), str2 = it.next(); + if (str1.length() != str2.length() || str1.equals(str2)) return empty(); + int differences = 0; + int diffIndex = -1; + for (int i = 0; i < str1.length(); i++) { + if(str1.charAt(i) != str2.charAt(i)) { + diffIndex = i; + if (++differences > 1) { + return empty(); + } + } + } + return Optional.of(new StringBuilder(str1).deleteCharAt(diffIndex).toString()); } } From a603ae1cadde332ce45289ba40ad74b87c56fe54 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Wed, 1 Dec 2021 08:56:09 +0100 Subject: [PATCH 242/433] Playing around with code --- .../com/sbaars/adventofcode/common/Day.java | 2 +- .../com/sbaars/adventofcode/common/Loc.java | 236 ++++++++++++++++++ .../haskell/year21/HaskellDay2021.java | 43 ++++ .../haskell/year21/days/Day1.java | 23 ++ .../sbaars/adventofcode/year18/days/Day3.java | 28 ++- .../sbaars/adventofcode/year21/days/Day2.java | 5 +- src/main/resources/2018/day3.txt | 2 +- 7 files changed, 334 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode/common/Loc.java create mode 100644 src/main/java/com/sbaars/adventofcode/haskell/year21/HaskellDay2021.java create mode 100644 src/main/java/com/sbaars/adventofcode/haskell/year21/days/Day1.java diff --git a/src/main/java/com/sbaars/adventofcode/common/Day.java b/src/main/java/com/sbaars/adventofcode/common/Day.java index 2677706a..073bb3aa 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Day.java +++ b/src/main/java/com/sbaars/adventofcode/common/Day.java @@ -94,7 +94,7 @@ protected LongStream dayNumberStream() { } protected LongStream dayNumberStream(String delimiter) { - return dayStream(delimiter).filter(e -> !e.equals("")).mapToLong(Long::parseLong); + return dayStream(delimiter).filter(e -> !e.isEmpty()).mapToLong(Long::parseLong); } protected char[][] dayGrid() { diff --git a/src/main/java/com/sbaars/adventofcode/common/Loc.java b/src/main/java/com/sbaars/adventofcode/common/Loc.java new file mode 100644 index 00000000..64b290e4 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/common/Loc.java @@ -0,0 +1,236 @@ +/* + * Copyright (c) 1995, 2021, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sbaars.adventofcode.common; + +import java.awt.geom.Point2D; +import java.beans.Transient; +import java.io.Serial; + +/** + * A point representing a location in {@code (x,y)} coordinate space, + * specified in integer precision. + * + * @author Sami Shaio + * @since 1.0 + */ +public class Loc extends Point2D implements java.io.Serializable { + /** + * The X coordinate of this {@code Point}. + * If no X coordinate is set it will default to 0. + * + * @serial + * @see #getLocation() + * @see #move(int, int) + * @since 1.0 + */ + public long x; + + /** + * The Y coordinate of this {@code Point}. + * If no Y coordinate is set it will default to 0. + * + * @serial + * @see #getLocation() + * @see #move(int, int) + * @since 1.0 + */ + public long y; + + /** + * Use serialVersionUID from JDK 1.1 for interoperability. + */ + @Serial + private static final long serialVersionUID = -5276940640259749850L; + + /** + * Constructs and initializes a point at the origin + * (0, 0) of the coordinate space. + * @since 1.1 + */ + public Loc() { + this(0, 0); + } + + /** + * Constructs and initializes a point with the same location as + * the specified {@code Point} object. + * @param p a point + * @since 1.1 + */ + public Loc(Loc p) { + this(p.x, p.y); + } + + /** + * Constructs and initializes a point at the specified + * {@code (x,y)} location in the coordinate space. + * @param x the X coordinate of the newly constructed {@code Point} + * @param y the Y coordinate of the newly constructed {@code Point} + * @since 1.0 + */ + public Loc(long x, long y) { + this.x = x; + this.y = y; + } + + /** + * {@inheritDoc} + * @since 1.2 + */ + public double getX() { + return x; + } + + /** + * {@inheritDoc} + * @since 1.2 + */ + public double getY() { + return y; + } + + /** + * Returns the location of this point. + * This method is included for completeness, to parallel the + * {@code getLocation} method of {@code Component}. + * @return a copy of this point, at the same location + * @see java.awt.Component#getLocation + * @see java.awt.Point#setLocation(java.awt.Point) + * @see java.awt.Point#setLocation(int, int) + * @since 1.1 + */ + @Transient + public Loc getLocation() { + return new Loc(x, y); + } + + /** + * Sets the location of the point to the specified location. + * This method is included for completeness, to parallel the + * {@code setLocation} method of {@code Component}. + * @param p a point, the new location for this point + * @see java.awt.Component#setLocation(java.awt.Point) + * @see java.awt.Point#getLocation + * @since 1.1 + */ + public void setLocation(Loc p) { + setLocation(p.x, p.y); + } + + /** + * Changes the point to have the specified location. + *

+ * This method is included for completeness, to parallel the + * {@code setLocation} method of {@code Component}. + * Its behavior is identical with move(int, int). + * @param x the X coordinate of the new location + * @param y the Y coordinate of the new location + * @see java.awt.Component#setLocation(int, int) + * @see java.awt.Point#getLocation + * @see java.awt.Point#move(int, int) + * @since 1.1 + */ + public void setLocation(int x, int y) { + move(x, y); + } + + /** + * Sets the location of this point to the specified double coordinates. + * The double values will be rounded to integer values. + * Any number smaller than {@code Integer.MIN_VALUE} + * will be reset to {@code MIN_VALUE}, and any number + * larger than {@code Integer.MAX_VALUE} will be + * reset to {@code MAX_VALUE}. + * + * @param x the X coordinate of the new location + * @param y the Y coordinate of the new location + * @see #getLocation + */ + public void setLocation(double x, double y) { + this.x = (int) Math.floor(x+0.5); + this.y = (int) Math.floor(y+0.5); + } + + /** + * Moves this point to the specified location in the + * {@code (x,y)} coordinate plane. This method + * is identical with setLocation(int, int). + * @param x the X coordinate of the new location + * @param y the Y coordinate of the new location + * @see java.awt.Component#setLocation(int, int) + */ + public void move(int x, int y) { + this.x = x; + this.y = y; + } + + /** + * Translates this point, at location {@code (x,y)}, + * by {@code dx} along the {@code x} axis and {@code dy} + * along the {@code y} axis so that it now represents the point + * {@code (x+dx,y+dy)}. + * + * @param dx the distance to move this point + * along the X axis + * @param dy the distance to move this point + * along the Y axis + */ + public void translate(int dx, int dy) { + this.x += dx; + this.y += dy; + } + + /** + * Determines whether or not two points are equal. Two instances of + * {@code Point2D} are equal if the values of their + * {@code x} and {@code y} member fields, representing + * their position in the coordinate space, are the same. + * @param obj an object to be compared with this {@code Point2D} + * @return {@code true} if the object to be compared is + * an instance of {@code Point2D} and has + * the same values; {@code false} otherwise. + */ + public boolean equals(Object obj) { + if (obj instanceof Loc) { + Loc pt = (Loc)obj; + return (x == pt.x) && (y == pt.y); + } + return super.equals(obj); + } + + /** + * Returns a string representation of this point and its location + * in the {@code (x,y)} coordinate space. This method is + * intended to be used only for debugging purposes, and the content + * and format of the returned string may vary between implementations. + * The returned string may be empty but may not be {@code null}. + * + * @return a string representation of this point + */ + public String toString() { + return getClass().getName() + "[x=" + x + ",y=" + y + "]"; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/haskell/year21/HaskellDay2021.java b/src/main/java/com/sbaars/adventofcode/haskell/year21/HaskellDay2021.java new file mode 100644 index 00000000..1661109a --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/haskell/year21/HaskellDay2021.java @@ -0,0 +1,43 @@ +package com.sbaars.adventofcode.haskell.year21; + +import static java.util.Arrays.stream; +import static java.util.stream.Collectors.joining; + +import com.sbaars.adventofcode.year21.Day2021; +import java.util.List; +import java.util.stream.Collector; + +public abstract class HaskellDay2021 extends Day2021 { + protected HaskellDay2021(int day) { + super(day); + } + + protected Collector haskellList() { + return joining(", ", "[", "]"); + } + + protected String tuple(Object... elements) { + return stream(elements).map(Object::toString).collect(joining(", ", "(", ")")); + } + + protected String tup(Object a, Object b) { + return "(" + convert(a) + ", " + convert(b) + ")"; + } + + protected String convert(Object[] a) { + return stream(a).map(this::convert).collect(haskellList()); + } + + protected String convert(List a) { + return a.stream().map(this::convert).collect(haskellList()); + } + + protected String convert(Object a) { + if (a instanceof Number) { + return a.toString(); + } else if (a instanceof Character) { + return "'" + a + "'"; + } + return "\"" + a + "\""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/haskell/year21/days/Day1.java b/src/main/java/com/sbaars/adventofcode/haskell/year21/days/Day1.java new file mode 100644 index 00000000..893ff151 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/haskell/year21/days/Day1.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.haskell.year21.days; + +import com.sbaars.adventofcode.haskell.year21.HaskellDay2021; + +public class Day1 extends HaskellDay2021 { + public Day1() { + super(1); + } + + public static void main(String[] args) { + new Day1().printParts(); + } + + @Override + public Object part1() { + return dayNumberStream().mapToObj(Long::toString).collect(haskellList()); + } + + @Override + public Object part2() { + return null; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year18/days/Day3.java b/src/main/java/com/sbaars/adventofcode/year18/days/Day3.java index 68e8750c..10872688 100644 --- a/src/main/java/com/sbaars/adventofcode/year18/days/Day3.java +++ b/src/main/java/com/sbaars/adventofcode/year18/days/Day3.java @@ -1,6 +1,12 @@ package com.sbaars.adventofcode.year18.days; +import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; + +import com.sbaars.adventofcode.common.Loc; import com.sbaars.adventofcode.year18.Day2018; +import java.util.HashSet; +import java.util.List; +import java.util.Set; public class Day3 extends Day2018 { public Day3() { @@ -9,15 +15,33 @@ public Day3() { public static void main(String[] args) { new Day3().printParts(); +// new Day3().submitPart1(); +// new Day3().submitPart2(); } @Override public Object part1() { - return ""; + List input = dayStream().map(e -> readString(e, "#%n @ %n,%n: %nx%n", Claim.class)).toList(); + Set all = new HashSet<>(); + Set overlap = new HashSet<>(); + for(Claim c : input){ + for(int i = 0; i Date: Thu, 2 Dec 2021 06:21:07 +0100 Subject: [PATCH 243/433] 2021 Day 2 --- .../sbaars/adventofcode/year21/days/Day2.java | 43 +++++++++++++++++-- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day2.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day2.java index 029bb96a..91e51692 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day2.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day2.java @@ -1,6 +1,12 @@ package com.sbaars.adventofcode.year21.days; +import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; +import static java.util.stream.Collectors.toList; + +import com.sbaars.adventofcode.common.Direction; import com.sbaars.adventofcode.year21.Day2021; +import java.awt.*; +import java.util.List; public class Day2 extends Day2021 { public Day2() { @@ -15,12 +21,43 @@ public static void main(String[] args) { @Override public Object part1() { - String input = day(); - return input; + List input = dayStream().map(e -> readString(e, "%s %n", Move.class)).collect(toList()); + Point p = new Point(0, 0); + for(Move m : input) { + Direction d = m.direction(); + p = d.move(p, Math.toIntExact(m.n)); + } + return p.x * p.y; } @Override public Object part2() { - return ""; + List input = dayStream().map(e -> readString(e, "%s %n", Move.class)).collect(toList()); + Point p = new Point(0, 0); + long aim = 0; + for(Move m : input) { + Direction d = m.direction(); + switch (d) { + case NORTH -> aim -= m.n; + case SOUTH -> aim += m.n; + case EAST -> { + p = Direction.EAST.move(p, Math.toIntExact(m.n)); + p = Direction.SOUTH.move(p, Math.toIntExact(aim * m.n)); + } + default -> throw new IllegalStateException("There must be a direction."); + } + } + return p.x * p.y; + } + + public record Move (String dir, long n) { + public Direction direction(){ + return switch (dir) { + case "forward" -> Direction.EAST; + case "up" -> Direction.NORTH; + case "down" -> Direction.SOUTH; + default -> throw new IllegalStateException("Unknown dir: " + dir); + }; + } } } From 3cb291aacb21ee2b0e7e147d657393565b1aaf63 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Thu, 2 Dec 2021 06:21:44 +0100 Subject: [PATCH 244/433] Random changes --- .../com/sbaars/adventofcode/common/Loc.java | 35 +- .../common/ReadsFormattedString.java | 3 + .../sbaars/adventofcode/util/FetchInput.java | 2 +- .../sbaars/adventofcode/year18/days/Day3.java | 9 +- src/main/resources/2021-examples/day2-1.txt | 6 + src/main/resources/2021/day2.txt | 1000 +++++++++++++++++ 6 files changed, 1031 insertions(+), 24 deletions(-) create mode 100644 src/main/resources/2021-examples/day2-1.txt create mode 100644 src/main/resources/2021/day2.txt diff --git a/src/main/java/com/sbaars/adventofcode/common/Loc.java b/src/main/java/com/sbaars/adventofcode/common/Loc.java index 64b290e4..06f7d49c 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Loc.java +++ b/src/main/java/com/sbaars/adventofcode/common/Loc.java @@ -25,6 +25,7 @@ package com.sbaars.adventofcode.common; +import com.google.common.base.Objects; import java.awt.geom.Point2D; import java.beans.Transient; import java.io.Serial; @@ -203,25 +204,21 @@ public void translate(int dx, int dy) { this.y += dy; } - /** - * Determines whether or not two points are equal. Two instances of - * {@code Point2D} are equal if the values of their - * {@code x} and {@code y} member fields, representing - * their position in the coordinate space, are the same. - * @param obj an object to be compared with this {@code Point2D} - * @return {@code true} if the object to be compared is - * an instance of {@code Point2D} and has - * the same values; {@code false} otherwise. - */ - public boolean equals(Object obj) { - if (obj instanceof Loc) { - Loc pt = (Loc)obj; - return (x == pt.x) && (y == pt.y); - } - return super.equals(obj); - } - - /** + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + Loc loc = (Loc) o; + return x == loc.x && y == loc.y; + } + + @Override + public int hashCode() { + return Objects.hashCode(super.hashCode(), x, y); + } + + /** * Returns a string representation of this point and its location * in the {@code (x,y)} coordinate space. This method is * intended to be used only for debugging purposes, and the content diff --git a/src/main/java/com/sbaars/adventofcode/common/ReadsFormattedString.java b/src/main/java/com/sbaars/adventofcode/common/ReadsFormattedString.java index dc4fedc7..324828f6 100644 --- a/src/main/java/com/sbaars/adventofcode/common/ReadsFormattedString.java +++ b/src/main/java/com/sbaars/adventofcode/common/ReadsFormattedString.java @@ -1,5 +1,7 @@ package com.sbaars.adventofcode.common; +import static com.google.common.base.Preconditions.checkState; + import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -37,6 +39,7 @@ static T readString(String s, String pattern, Class target) { } } try { + checkState(target.getConstructors().length > 0, "Class "+target+" has no constructor!"); return (T) Arrays.stream(target.getConstructors()).filter(c -> c.getParameterCount() == mappedObjs.size()).findAny().get()//.getConstructor(mappedObjs.stream().map(Object::getClass).toArray(Class[]::new)) .newInstance(mappedObjs.toArray()); } catch (Exception e) { diff --git a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java index 6d5c01eb..58fbbbab 100644 --- a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java +++ b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java @@ -27,7 +27,7 @@ private FetchInput() { } public static void main(String[] args) throws Exception { - new FetchInput().retrieveDay("1", "2021"); + new FetchInput().retrieveDay("2", "2021"); } private void retrieveDay(String day, String year) { diff --git a/src/main/java/com/sbaars/adventofcode/year18/days/Day3.java b/src/main/java/com/sbaars/adventofcode/year18/days/Day3.java index 10872688..c6f616ed 100644 --- a/src/main/java/com/sbaars/adventofcode/year18/days/Day3.java +++ b/src/main/java/com/sbaars/adventofcode/year18/days/Day3.java @@ -27,7 +27,7 @@ public Object part1() { for(Claim c : input){ for(int i = 0; i input = dayStream().map(e -> readString(e, "#%n @ %n,%n: %nx%n", Claim.class)).toList(); + + return ""; } - record Claim(long id, long x, long y, long sizex, long sizey){} + public record Claim(long id, long x, long y, long sizex, long sizey){} } diff --git a/src/main/resources/2021-examples/day2-1.txt b/src/main/resources/2021-examples/day2-1.txt new file mode 100644 index 00000000..b7172ac1 --- /dev/null +++ b/src/main/resources/2021-examples/day2-1.txt @@ -0,0 +1,6 @@ +forward 5 +down 5 +forward 8 +up 3 +down 8 +forward 2 diff --git a/src/main/resources/2021/day2.txt b/src/main/resources/2021/day2.txt new file mode 100644 index 00000000..d054d4e1 --- /dev/null +++ b/src/main/resources/2021/day2.txt @@ -0,0 +1,1000 @@ +forward 5 +forward 1 +forward 3 +down 8 +up 6 +down 5 +forward 6 +down 9 +down 7 +up 9 +down 9 +forward 5 +forward 3 +down 3 +forward 1 +forward 8 +down 8 +forward 6 +forward 9 +forward 5 +down 8 +up 1 +forward 4 +forward 8 +down 4 +forward 2 +down 1 +up 8 +up 9 +down 4 +forward 5 +up 9 +forward 1 +down 9 +down 7 +down 4 +down 6 +down 3 +forward 5 +up 4 +up 7 +forward 1 +down 1 +up 3 +forward 8 +down 8 +up 2 +forward 2 +down 7 +down 7 +down 4 +forward 3 +down 5 +up 8 +down 6 +up 2 +down 7 +forward 8 +down 7 +down 7 +up 6 +forward 8 +up 1 +down 4 +forward 1 +down 1 +down 9 +down 1 +down 7 +forward 2 +forward 3 +up 8 +up 1 +forward 4 +forward 7 +forward 9 +up 8 +down 9 +down 3 +down 5 +down 5 +forward 7 +forward 3 +up 7 +forward 6 +up 6 +forward 3 +down 2 +down 5 +down 2 +up 6 +down 5 +down 5 +forward 7 +forward 2 +forward 7 +down 6 +forward 1 +forward 8 +up 6 +forward 2 +down 5 +forward 3 +up 2 +forward 3 +down 2 +forward 4 +forward 6 +down 8 +forward 7 +forward 6 +down 1 +down 8 +forward 7 +up 2 +forward 2 +down 7 +up 6 +forward 7 +down 9 +down 7 +forward 4 +down 9 +down 4 +forward 6 +up 6 +up 5 +down 5 +up 7 +forward 6 +down 1 +down 5 +forward 1 +up 6 +forward 1 +down 7 +forward 7 +forward 4 +up 5 +down 3 +forward 7 +forward 6 +up 9 +forward 8 +forward 1 +up 2 +up 8 +forward 7 +up 7 +down 1 +forward 9 +down 5 +forward 5 +forward 2 +forward 2 +forward 6 +up 5 +up 1 +forward 6 +up 3 +down 7 +down 6 +down 1 +forward 1 +forward 8 +forward 8 +down 8 +up 3 +down 7 +down 2 +down 9 +forward 9 +down 7 +forward 4 +down 9 +forward 8 +down 1 +down 5 +down 9 +down 8 +forward 8 +down 3 +forward 4 +forward 6 +up 3 +forward 4 +down 9 +down 6 +up 6 +up 3 +down 2 +up 1 +forward 5 +down 7 +down 3 +forward 5 +up 1 +forward 2 +down 3 +down 3 +forward 6 +down 5 +down 7 +down 1 +down 2 +down 7 +forward 4 +forward 7 +down 7 +forward 6 +forward 2 +down 1 +down 8 +forward 5 +forward 5 +down 7 +forward 6 +forward 7 +up 2 +forward 5 +down 8 +forward 7 +down 7 +up 6 +forward 6 +down 2 +down 7 +forward 6 +forward 4 +down 5 +down 7 +forward 2 +forward 6 +forward 6 +down 7 +down 9 +forward 9 +forward 4 +up 9 +up 2 +up 2 +forward 4 +down 6 +forward 7 +up 5 +forward 1 +forward 6 +down 8 +forward 2 +down 8 +forward 9 +forward 5 +forward 1 +up 8 +down 4 +down 2 +down 9 +up 6 +forward 8 +down 9 +forward 3 +down 3 +down 9 +down 9 +down 6 +forward 7 +down 4 +forward 8 +down 7 +down 8 +up 4 +up 3 +forward 1 +up 9 +up 1 +up 9 +up 7 +down 1 +forward 5 +forward 7 +forward 3 +forward 8 +up 4 +forward 7 +down 5 +forward 9 +up 3 +up 3 +down 2 +forward 3 +up 3 +down 3 +down 4 +up 6 +down 7 +down 1 +down 7 +forward 1 +down 4 +forward 9 +down 9 +up 8 +up 5 +down 7 +up 1 +forward 6 +down 1 +down 4 +down 3 +forward 7 +forward 4 +up 6 +down 2 +down 1 +forward 1 +up 5 +down 2 +down 9 +up 2 +up 3 +forward 5 +forward 5 +down 8 +down 4 +up 4 +down 1 +forward 8 +up 7 +down 1 +down 4 +forward 3 +up 4 +down 4 +down 5 +down 9 +down 1 +down 7 +up 2 +down 6 +up 9 +down 3 +down 1 +down 8 +down 4 +up 2 +forward 6 +forward 9 +down 6 +forward 6 +forward 4 +forward 8 +forward 5 +forward 6 +forward 9 +down 3 +forward 8 +forward 6 +forward 7 +up 9 +forward 3 +up 3 +forward 5 +down 5 +up 9 +forward 1 +forward 9 +down 7 +forward 5 +forward 5 +forward 6 +forward 5 +forward 9 +forward 8 +forward 3 +down 2 +forward 6 +forward 8 +down 4 +forward 4 +forward 1 +forward 1 +down 2 +forward 2 +forward 5 +up 4 +forward 3 +down 3 +down 5 +down 6 +forward 4 +down 8 +down 4 +forward 5 +down 7 +up 3 +up 6 +forward 3 +forward 2 +forward 5 +down 9 +down 4 +down 8 +down 2 +forward 4 +forward 7 +down 4 +up 5 +forward 8 +down 8 +down 1 +forward 5 +down 6 +down 9 +up 6 +forward 9 +down 3 +forward 6 +forward 2 +down 5 +forward 1 +down 1 +down 1 +forward 2 +up 9 +down 1 +up 8 +forward 9 +up 8 +forward 2 +forward 8 +up 2 +forward 4 +down 5 +forward 8 +up 2 +up 1 +forward 4 +up 4 +up 3 +up 5 +down 1 +forward 3 +forward 6 +forward 9 +forward 6 +up 8 +forward 2 +forward 1 +down 2 +down 3 +down 2 +up 4 +forward 5 +up 2 +forward 3 +forward 9 +up 5 +forward 1 +down 7 +forward 9 +down 5 +up 7 +down 6 +forward 7 +forward 9 +up 6 +forward 3 +down 1 +forward 1 +down 8 +down 2 +up 9 +down 4 +down 4 +down 7 +forward 4 +forward 1 +forward 6 +down 9 +down 9 +down 9 +forward 1 +forward 6 +forward 3 +forward 7 +forward 3 +forward 9 +up 8 +forward 5 +down 1 +down 6 +up 8 +forward 3 +up 8 +down 6 +forward 6 +up 2 +up 8 +up 5 +forward 9 +down 4 +up 1 +up 3 +up 2 +down 9 +down 1 +forward 7 +down 2 +forward 6 +up 4 +down 7 +forward 1 +down 3 +down 5 +forward 1 +down 3 +down 1 +forward 8 +up 5 +forward 5 +forward 8 +forward 8 +forward 8 +forward 2 +down 3 +down 6 +up 2 +up 2 +down 1 +up 7 +down 9 +up 1 +up 4 +forward 1 +forward 4 +up 4 +up 6 +forward 5 +forward 2 +forward 7 +up 8 +up 3 +down 5 +down 9 +forward 4 +forward 5 +forward 5 +down 1 +up 8 +up 2 +forward 3 +up 2 +forward 8 +up 2 +down 6 +up 7 +forward 6 +down 3 +forward 3 +down 6 +forward 6 +forward 4 +forward 8 +down 8 +up 7 +down 7 +down 2 +up 5 +up 2 +down 4 +forward 5 +down 3 +up 4 +down 2 +up 2 +down 7 +forward 4 +forward 3 +forward 6 +down 2 +down 8 +forward 3 +forward 4 +forward 4 +down 4 +down 3 +up 6 +down 2 +forward 7 +forward 4 +down 7 +forward 1 +up 6 +forward 3 +up 3 +up 7 +forward 6 +down 9 +down 8 +down 3 +forward 8 +forward 1 +up 3 +down 5 +down 3 +forward 1 +up 9 +down 6 +forward 3 +down 9 +up 7 +forward 5 +forward 4 +forward 7 +up 3 +forward 3 +down 5 +forward 7 +forward 9 +down 6 +forward 7 +forward 5 +up 6 +forward 3 +forward 3 +down 7 +forward 4 +up 2 +forward 8 +down 7 +up 7 +down 7 +forward 6 +up 3 +forward 2 +up 7 +down 3 +down 4 +down 1 +forward 3 +forward 5 +up 7 +forward 3 +down 1 +down 2 +up 4 +forward 2 +up 5 +down 4 +forward 1 +down 6 +up 1 +forward 5 +forward 1 +down 8 +forward 7 +down 7 +forward 4 +forward 7 +forward 3 +forward 2 +forward 1 +forward 7 +down 1 +forward 9 +forward 9 +forward 8 +forward 9 +forward 8 +forward 5 +forward 1 +up 5 +forward 3 +forward 6 +forward 1 +up 4 +down 1 +down 9 +down 6 +forward 4 +up 9 +down 3 +forward 2 +down 3 +up 2 +forward 4 +forward 4 +down 7 +forward 9 +forward 3 +down 4 +up 4 +down 4 +forward 7 +forward 3 +forward 6 +forward 9 +down 4 +down 5 +down 2 +forward 4 +up 6 +forward 8 +forward 3 +down 2 +down 5 +forward 4 +down 8 +up 5 +down 3 +forward 6 +down 8 +up 9 +forward 3 +forward 8 +forward 6 +forward 7 +down 3 +up 6 +down 7 +down 4 +forward 2 +forward 5 +down 1 +down 5 +down 5 +forward 6 +forward 6 +down 1 +forward 2 +up 1 +down 2 +down 3 +forward 3 +forward 9 +down 9 +down 1 +up 8 +down 5 +down 2 +up 7 +forward 8 +up 7 +forward 3 +forward 6 +down 2 +down 3 +forward 1 +down 6 +down 1 +forward 4 +up 2 +down 3 +up 7 +down 3 +down 2 +up 8 +up 7 +down 3 +forward 4 +down 8 +up 2 +down 6 +forward 9 +down 1 +up 3 +up 1 +down 4 +up 6 +down 2 +forward 1 +down 6 +forward 4 +forward 3 +down 7 +down 2 +down 6 +down 2 +down 7 +forward 2 +down 1 +up 8 +up 6 +up 1 +forward 5 +down 9 +down 5 +up 7 +down 4 +forward 4 +forward 5 +up 5 +forward 6 +forward 1 +forward 5 +forward 1 +forward 6 +down 6 +forward 3 +up 4 +forward 6 +down 6 +forward 1 +forward 5 +forward 8 +down 3 +forward 6 +forward 1 +up 1 +up 7 +forward 7 +forward 8 +up 6 +forward 9 +up 5 +forward 1 +forward 5 +down 3 +up 3 +up 9 +forward 9 +forward 5 +forward 3 +forward 2 +forward 4 +down 6 +up 5 +down 2 +forward 5 +down 2 +down 5 +down 6 +forward 7 +down 2 +forward 7 +forward 2 +forward 8 +up 1 +forward 9 +down 2 +up 1 +down 9 +forward 8 +forward 3 +up 9 +down 1 +down 1 +down 8 +up 4 +up 9 +forward 9 +forward 3 +down 9 +forward 3 +forward 4 +down 8 +forward 8 +forward 7 +down 9 +up 2 +down 9 +down 8 +down 9 +forward 4 +up 6 +down 4 +forward 8 +forward 5 +up 2 +forward 5 +down 3 +forward 6 +down 5 +forward 8 +up 3 +down 5 +down 4 +forward 5 +up 3 +up 8 +forward 1 +up 8 +forward 4 +down 4 +forward 7 +forward 5 +forward 7 +forward 9 +up 1 +down 6 +forward 8 +up 1 +down 5 +up 6 +down 9 +down 5 +forward 3 +up 1 +forward 4 +up 4 +down 4 +forward 5 +forward 8 +down 2 +up 7 +down 6 +forward 7 +up 7 +forward 5 +down 2 +forward 9 +forward 1 +down 9 +down 8 +forward 7 +forward 7 +forward 1 +up 3 +up 1 +forward 2 +down 2 +up 9 +down 2 +forward 7 +down 1 +down 5 +down 4 +up 7 +forward 1 +down 3 +forward 9 +down 6 +forward 4 +down 4 +down 9 +down 3 +up 3 +down 3 +up 8 +down 2 +forward 1 +forward 5 +forward 5 +down 2 +forward 7 +down 7 +down 6 +forward 6 +up 5 +down 4 +down 8 +down 7 +forward 7 +up 3 +down 3 +down 3 +forward 8 +forward 5 +down 1 +up 6 +down 3 +up 2 +down 6 +up 7 +down 4 +up 2 +forward 4 +forward 9 +forward 9 +up 1 +forward 7 +up 7 +forward 7 +forward 6 +forward 3 +forward 1 +down 5 +down 3 +forward 4 +up 9 +down 5 +up 2 +down 6 +down 5 +forward 6 +forward 4 +up 7 +up 6 +down 9 +forward 4 +up 1 +up 6 +up 3 +forward 9 +forward 3 +forward 9 +down 7 +forward 6 +down 6 +forward 8 From 18084b4c5eea0e6f910e18c1f24c49985b62868e Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Thu, 2 Dec 2021 07:24:03 +0100 Subject: [PATCH 245/433] Use reduce --- .../com/sbaars/adventofcode/common/Loc.java | 307 +++++++----------- .../sbaars/adventofcode/year21/days/Day2.java | 17 +- 2 files changed, 135 insertions(+), 189 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/common/Loc.java b/src/main/java/com/sbaars/adventofcode/common/Loc.java index 06f7d49c..cdd08a1d 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Loc.java +++ b/src/main/java/com/sbaars/adventofcode/common/Loc.java @@ -26,183 +26,128 @@ package com.sbaars.adventofcode.common; import com.google.common.base.Objects; -import java.awt.geom.Point2D; -import java.beans.Transient; +import java.awt.*; import java.io.Serial; +import java.io.Serializable; /** * A point representing a location in {@code (x,y)} coordinate space, * specified in integer precision. * - * @author Sami Shaio - * @since 1.0 + * @author Sami Shaio + * @since 1.0 */ -public class Loc extends Point2D implements java.io.Serializable { - /** - * The X coordinate of this {@code Point}. - * If no X coordinate is set it will default to 0. - * - * @serial - * @see #getLocation() - * @see #move(int, int) - * @since 1.0 - */ - public long x; - - /** - * The Y coordinate of this {@code Point}. - * If no Y coordinate is set it will default to 0. - * - * @serial - * @see #getLocation() - * @see #move(int, int) - * @since 1.0 - */ - public long y; - - /** - * Use serialVersionUID from JDK 1.1 for interoperability. - */ - @Serial - private static final long serialVersionUID = -5276940640259749850L; - - /** - * Constructs and initializes a point at the origin - * (0, 0) of the coordinate space. - * @since 1.1 - */ - public Loc() { - this(0, 0); - } - - /** - * Constructs and initializes a point with the same location as - * the specified {@code Point} object. - * @param p a point - * @since 1.1 - */ - public Loc(Loc p) { - this(p.x, p.y); - } - - /** - * Constructs and initializes a point at the specified - * {@code (x,y)} location in the coordinate space. - * @param x the X coordinate of the newly constructed {@code Point} - * @param y the Y coordinate of the newly constructed {@code Point} - * @since 1.0 - */ - public Loc(long x, long y) { - this.x = x; - this.y = y; - } - - /** - * {@inheritDoc} - * @since 1.2 - */ - public double getX() { - return x; - } - - /** - * {@inheritDoc} - * @since 1.2 - */ - public double getY() { - return y; - } - - /** - * Returns the location of this point. - * This method is included for completeness, to parallel the - * {@code getLocation} method of {@code Component}. - * @return a copy of this point, at the same location - * @see java.awt.Component#getLocation - * @see java.awt.Point#setLocation(java.awt.Point) - * @see java.awt.Point#setLocation(int, int) - * @since 1.1 - */ - @Transient - public Loc getLocation() { - return new Loc(x, y); - } - - /** - * Sets the location of the point to the specified location. - * This method is included for completeness, to parallel the - * {@code setLocation} method of {@code Component}. - * @param p a point, the new location for this point - * @see java.awt.Component#setLocation(java.awt.Point) - * @see java.awt.Point#getLocation - * @since 1.1 - */ - public void setLocation(Loc p) { - setLocation(p.x, p.y); - } - - /** - * Changes the point to have the specified location. - *

- * This method is included for completeness, to parallel the - * {@code setLocation} method of {@code Component}. - * Its behavior is identical with move(int, int). - * @param x the X coordinate of the new location - * @param y the Y coordinate of the new location - * @see java.awt.Component#setLocation(int, int) - * @see java.awt.Point#getLocation - * @see java.awt.Point#move(int, int) - * @since 1.1 - */ - public void setLocation(int x, int y) { - move(x, y); - } - - /** - * Sets the location of this point to the specified double coordinates. - * The double values will be rounded to integer values. - * Any number smaller than {@code Integer.MIN_VALUE} - * will be reset to {@code MIN_VALUE}, and any number - * larger than {@code Integer.MAX_VALUE} will be - * reset to {@code MAX_VALUE}. - * - * @param x the X coordinate of the new location - * @param y the Y coordinate of the new location - * @see #getLocation - */ - public void setLocation(double x, double y) { - this.x = (int) Math.floor(x+0.5); - this.y = (int) Math.floor(y+0.5); - } - - /** - * Moves this point to the specified location in the - * {@code (x,y)} coordinate plane. This method - * is identical with setLocation(int, int). - * @param x the X coordinate of the new location - * @param y the Y coordinate of the new location - * @see java.awt.Component#setLocation(int, int) - */ - public void move(int x, int y) { - this.x = x; - this.y = y; - } - - /** - * Translates this point, at location {@code (x,y)}, - * by {@code dx} along the {@code x} axis and {@code dy} - * along the {@code y} axis so that it now represents the point - * {@code (x+dx,y+dy)}. - * - * @param dx the distance to move this point - * along the X axis - * @param dy the distance to move this point - * along the Y axis - */ - public void translate(int dx, int dy) { - this.x += dx; - this.y += dy; - } +public class Loc implements Serializable { + /** + * The X coordinate of this {@code Point}. + * If no X coordinate is set it will default to 0. + * + * @serial + * @see #move(int, int) + * @since 1.0 + */ + public final long x; + + /** + * The Y coordinate of this {@code Point}. + * If no Y coordinate is set it will default to 0. + * + * @serial + * @see #move(int, int) + * @since 1.0 + */ + public final long y; + + /** + * Use serialVersionUID from JDK 1.1 for interoperability. + */ + @Serial + private static final long serialVersionUID = -5276940640259749850L; + + /** + * Constructs and initializes a point at the origin + * (0, 0) of the coordinate space. + * + * @since 1.1 + */ + public Loc() { + this(0, 0); + } + + /** + * Constructs and initializes a point with the same location as + * the specified {@code Point} object. + * + * @param p a point + * @since 1.1 + */ + public Loc(Loc p) { + this(p.x, p.y); + } + + /** + * Constructs and initializes a point at the specified + * {@code (x,y)} location in the coordinate space. + * + * @param x the X coordinate of the newly constructed {@code Point} + * @param y the Y coordinate of the newly constructed {@code Point} + * @since 1.0 + */ + public Loc(long x, long y) { + this.x = x; + this.y = y; + } + + public Loc(int x, int y) { + this.x = x; + this.y = y; + } + + public Loc(Point p) { + this.x = p.x; + this.y = p.y; + } + + /** + * {@inheritDoc} + * + * @since 1.2 + */ + public double getX() { + return x; + } + + /** + * {@inheritDoc} + * + * @since 1.2 + */ + public double getY() { + return y; + } + + /** + * Translates this point, at location {@code (x,y)}, + * by {@code dx} along the {@code x} axis and {@code dy} + * along the {@code y} axis so that it now represents the point + * {@code (x+dx,y+dy)}. + * + * @param dx the distance to move this point + * along the X axis + * @param dy the distance to move this point + * along the Y axis + */ + public Loc move(int dx, int dy) { + return new Loc(x + dx, y + dy); + } + + public Loc move(Loc l) { + return new Loc(x + l.x, y + l.y); + } + + public Point getPoint() { + return new Point(Math.toIntExact(x), Math.toIntExact(y)); + } @Override public boolean equals(Object o) { @@ -219,15 +164,15 @@ public int hashCode() { } /** - * Returns a string representation of this point and its location - * in the {@code (x,y)} coordinate space. This method is - * intended to be used only for debugging purposes, and the content - * and format of the returned string may vary between implementations. - * The returned string may be empty but may not be {@code null}. - * - * @return a string representation of this point - */ - public String toString() { - return getClass().getName() + "[x=" + x + ",y=" + y + "]"; - } + * Returns a string representation of this point and its location + * in the {@code (x,y)} coordinate space. This method is + * intended to be used only for debugging purposes, and the content + * and format of the returned string may vary between implementations. + * The returned string may be empty but may not be {@code null}. + * + * @return a string representation of this point + */ + public String toString() { + return getClass().getName() + "[x=" + x + ",y=" + y + "]"; + } } diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day2.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day2.java index 91e51692..11f77846 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day2.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day2.java @@ -1,9 +1,9 @@ package com.sbaars.adventofcode.year21.days; import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; -import static java.util.stream.Collectors.toList; import com.sbaars.adventofcode.common.Direction; +import com.sbaars.adventofcode.common.Loc; import com.sbaars.adventofcode.year21.Day2021; import java.awt.*; import java.util.List; @@ -21,18 +21,19 @@ public static void main(String[] args) { @Override public Object part1() { - List input = dayStream().map(e -> readString(e, "%s %n", Move.class)).collect(toList()); - Point p = new Point(0, 0); - for(Move m : input) { - Direction d = m.direction(); - p = d.move(p, Math.toIntExact(m.n)); - } + Loc p = dayStream() + .map(e -> readString(e, "%s %n", Move.class)) + .reduce( + new Loc(), + (acc, m) -> new Loc(m.direction().move(acc.getPoint(), Math.toIntExact(m.n))), + Loc::move + ); return p.x * p.y; } @Override public Object part2() { - List input = dayStream().map(e -> readString(e, "%s %n", Move.class)).collect(toList()); + List input = dayStream().map(e -> readString(e, "%s %n", Move.class)).toList(); Point p = new Point(0, 0); long aim = 0; for(Move m : input) { From acb41fdca4dfc0e094d72c2895af77a3eaa7384b Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Thu, 2 Dec 2021 07:33:28 +0100 Subject: [PATCH 246/433] Prepare day 3 --- src/main/java/com/sbaars/adventofcode/util/FetchInput.java | 2 +- src/main/java/com/sbaars/adventofcode/year21/days/Day3.java | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java index 58fbbbab..5306278d 100644 --- a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java +++ b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java @@ -27,7 +27,7 @@ private FetchInput() { } public static void main(String[] args) throws Exception { - new FetchInput().retrieveDay("2", "2021"); + new FetchInput().retrieveDay("3", "2021"); } private void retrieveDay(String day, String year) { diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day3.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day3.java index 0659effa..a6742e33 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day3.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day3.java @@ -9,10 +9,13 @@ public Day3() { public static void main(String[] args) { new Day3().printParts(); +// new Day3().submitPart1(); +// new Day3().submitPart2(); } @Override public Object part1() { + var in = day(); return ""; } From 9fc14d380329490e3cb4c9fa1ceb83a5d64e5a02 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Thu, 2 Dec 2021 07:46:00 +0100 Subject: [PATCH 247/433] Docs are useless --- .../com/sbaars/adventofcode/common/Loc.java | 86 +------------------ 1 file changed, 2 insertions(+), 84 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/common/Loc.java b/src/main/java/com/sbaars/adventofcode/common/Loc.java index cdd08a1d..5af972f2 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Loc.java +++ b/src/main/java/com/sbaars/adventofcode/common/Loc.java @@ -27,72 +27,19 @@ import com.google.common.base.Objects; import java.awt.*; -import java.io.Serial; -import java.io.Serializable; -/** - * A point representing a location in {@code (x,y)} coordinate space, - * specified in integer precision. - * - * @author Sami Shaio - * @since 1.0 - */ -public class Loc implements Serializable { - /** - * The X coordinate of this {@code Point}. - * If no X coordinate is set it will default to 0. - * - * @serial - * @see #move(int, int) - * @since 1.0 - */ +public class Loc { public final long x; - - /** - * The Y coordinate of this {@code Point}. - * If no Y coordinate is set it will default to 0. - * - * @serial - * @see #move(int, int) - * @since 1.0 - */ public final long y; - /** - * Use serialVersionUID from JDK 1.1 for interoperability. - */ - @Serial - private static final long serialVersionUID = -5276940640259749850L; - - /** - * Constructs and initializes a point at the origin - * (0, 0) of the coordinate space. - * - * @since 1.1 - */ public Loc() { this(0, 0); } - /** - * Constructs and initializes a point with the same location as - * the specified {@code Point} object. - * - * @param p a point - * @since 1.1 - */ public Loc(Loc p) { this(p.x, p.y); } - /** - * Constructs and initializes a point at the specified - * {@code (x,y)} location in the coordinate space. - * - * @param x the X coordinate of the newly constructed {@code Point} - * @param y the Y coordinate of the newly constructed {@code Point} - * @since 1.0 - */ public Loc(long x, long y) { this.x = x; this.y = y; @@ -108,35 +55,14 @@ public Loc(Point p) { this.y = p.y; } - /** - * {@inheritDoc} - * - * @since 1.2 - */ public double getX() { return x; } - /** - * {@inheritDoc} - * - * @since 1.2 - */ public double getY() { return y; } - /** - * Translates this point, at location {@code (x,y)}, - * by {@code dx} along the {@code x} axis and {@code dy} - * along the {@code y} axis so that it now represents the point - * {@code (x+dx,y+dy)}. - * - * @param dx the distance to move this point - * along the X axis - * @param dy the distance to move this point - * along the Y axis - */ public Loc move(int dx, int dy) { return new Loc(x + dx, y + dy); } @@ -163,15 +89,7 @@ public int hashCode() { return Objects.hashCode(super.hashCode(), x, y); } - /** - * Returns a string representation of this point and its location - * in the {@code (x,y)} coordinate space. This method is - * intended to be used only for debugging purposes, and the content - * and format of the returned string may vary between implementations. - * The returned string may be empty but may not be {@code null}. - * - * @return a string representation of this point - */ + @Override public String toString() { return getClass().getName() + "[x=" + x + ",y=" + y + "]"; } From 3a209606c6cf97599fecd87f9752395c9e89b9aa Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Thu, 2 Dec 2021 18:48:40 +0100 Subject: [PATCH 248/433] Update Readme --- README.md | 132 ++++++++++++++++++ .../com/sbaars/adventofcode/year18/Main.java | 2 +- .../adventofcode/year20/days/Day16.java | 2 +- .../adventofcode/year20/days/Day19.java | 20 +-- .../adventofcode/year20/days/Day20.java | 6 +- 5 files changed, 138 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index a7366463..4cdfbb19 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,44 @@ # adventOfCode(Language.JAVA) +## 2021 +### Days +- [Day 1](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year21/days/Day1.java) +- [Day 2](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year21/days/Day2.java) +- [Day 3](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year21/days/Day3.java) +- [Day 4](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year21/days/Day4.java) +- [Day 5](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year21/days/Day5.java) +- [Day 6](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year21/days/Day6.java) +- [Day 7](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year21/days/Day7.java) +- [Day 8](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java) +- [Day 9](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year21/days/Day9.java) +- [Day 10](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year21/days/Day10.java) +- [Day 11](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year21/days/Day11.java) +- [Day 12](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year21/days/Day12.java) +- [Day 13](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year21/days/Day13.java) +- [Day 14](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year21/days/Day14.java) +- [Day 15](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java) +- [Day 16](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year21/days/Day16.java) +- [Day 17](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year21/days/Day17.java) +- [Day 18](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year21/days/Day18.java) +- [Day 19](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java) +- [Day 20](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java) +- [Day 21](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year21/days/Day21.java) +- [Day 22](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year21/days/Day22.java) +- [Day 23](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year21/days/Day23.java) +- [Day 24](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year21/days/Day24.java) +- [Day 25](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year21/days/Day25.java) + +### Console output +``` +Day 1: +Part 1: 1184 +Part 2: 1158 + +Day 2: +Part 1: 1507611 +Part 2: 1880593125 +``` + ## 2020 ### Days - [Day 1](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year20/days/Day1.java) @@ -65,6 +104,70 @@ Part 2: 1245 Day 9: Part 1: 373803594 Part 2: 51152360 + +Day 10: +Part 1: 2812 +Part 2: 386869246296064 + +Day 11: +Part 1: 2243 +Part 2: 2027 + +Day 12: +Part 1: 1578 +Part 2: 66614 + +Day 13: +Part 1: 2935 +Part 2: 836024966345345 + +Day 14: +Part 1: 14732563016887 +Part 2: 3618217244644 + +Day 15: +Part 1: 1294 +Part 2: 573522 + +Day 16: +Part 1: 26988 +Part 2: 426362917709 + +Day 17: +Part 1: 295 +Part 2: 1972 + +Day 18: +Part 1: 9535936849815 +Part 2: 472171581333710 + +Day 19: +Part 1: 104 +Part 2: 314 + +Day 20: +Part 1: 111936085519519 +Part 2: 1792 + +Day 21: +Part 1: 2786 +Part 2: lxjtns,knprxg,knprxg,clg,lxjtns,clg,cxfz,cxfz + +Day 22: +Part 1: 33925 +Part 2: 33441 + +Day 23: +Part 1: 69425837 +Part 2: 218882971435 + +Day 24: +Part 1: 479 +Part 2: 4135 + +Day 25: +Part 1: 16881444 +Part 2: That's all folks ``` ## 2019 @@ -216,9 +319,38 @@ I never did the 2018 advent of code puzzles when the event was ongoing. I'm just ### Days - [Day 1](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year18/days/Day1.java) +- [Day 2](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year18/days/Day2.java) +- [Day 3](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year18/days/Day3.java) +- [Day 4](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year18/days/Day4.java) +- [Day 5](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year18/days/Day5.java) +- [Day 6](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year18/days/Day6.java) +- [Day 7](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year18/days/Day7.java) +- [Day 8](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year18/days/Day8.java) +- [Day 9](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year18/days/Day9.java) +- [Day 10](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year18/days/Day10.java) +- [Day 11](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year18/days/Day11.java) +- [Day 12](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year18/days/Day12.java) +- [Day 13](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year18/days/Day13.java) +- [Day 14](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year18/days/Day14.java) +- [Day 15](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year18/days/Day15.java) +- [Day 16](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year18/days/Day16.java) +- [Day 17](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year18/days/Day17.java) +- [Day 18](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year18/days/Day18.java) +- [Day 19](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year18/days/Day19.java) +- [Day 20](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year18/days/Day20.java) +- [Day 21](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year18/days/Day21.java) +- [Day 22](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year18/days/Day22.java) +- [Day 23](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year18/days/Day23.java) +- [Day 24](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year18/days/Day24.java) +- [Day 25](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year18/days/Day25.java) ### Console output ``` +Day 1: Part 1: 433 Part 2: 256 + +Day 2: +Part 1: 5456 +Part 2: megsdlpulxvinkatfoyzxcbvq ``` diff --git a/src/main/java/com/sbaars/adventofcode/year18/Main.java b/src/main/java/com/sbaars/adventofcode/year18/Main.java index 7969f69a..bd210152 100644 --- a/src/main/java/com/sbaars/adventofcode/year18/Main.java +++ b/src/main/java/com/sbaars/adventofcode/year18/Main.java @@ -6,7 +6,7 @@ public class Main { public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException, InvocationTargetException, NoSuchMethodException { - for (int day = 1; day <= 1; day++) { + for (int day = 1; day <= 25; day++) { System.out.println("Day " + day + ":"); Day instance = (Day) Class.forName("com.sbaars.adventofcode.year18.days.Day" + day).getDeclaredConstructor().newInstance(); instance.printParts(); diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day16.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day16.java index 5adc382c..4a46b37b 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day16.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day16.java @@ -70,7 +70,7 @@ public Object part2() { return ruleIndex.asMap().entrySet().stream().filter(e -> e.getValue().stream().anyMatch(Rule::isDeparture)).mapToLong(e -> myTicket[e.getKey()]).reduce((a, b) -> a * b).getAsLong(); } - record Rule(String name, long lower1, long upper1, long lower2, long upper2) { + public record Rule(String name, long lower1, long upper1, long lower2, long upper2) { public boolean check(long val) { return (val >= lower1 && val <= upper1) || (val >= lower2 && val <= upper2); } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day19.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day19.java index be0ecbf8..919a835e 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day19.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day19.java @@ -60,17 +60,6 @@ private long getSolution(String inputFile) { @Override public Object part2() { -// int maxDepth = 2; -// StringBuilder s = new StringBuilder("8: 42 "); -// StringBuilder s2 = new StringBuilder("11: 42 31 "); -// for(int i = 2; i<=maxDepth; i++){ -// s.append("| ").append(i + 198).append("\n").append(i + 198).append(": ").append("42 ".repeat(i)); -// s2.append("| ").append(i + 298).append("\n").append(i + 298).append(": ").append("42 ".repeat(i)).append("31 ".repeat(i)); -// -// } -// return getSolution(day() -// .replace("8: 42", s.toString().trim()) -// .replace("11: 42 31", s2.toString().trim())); int maxDepth = 10; String[] input = day().split("\n\n"); Set all = sol.values().stream().flatMap(Collection::stream).collect(Collectors.toUnmodifiableSet()); @@ -80,13 +69,6 @@ public Object part2() { for (int i = 2; i <= maxDepth; i++) { Set add = new HashSet<>(s42.size() * s31.size()); Set add2 = new HashSet<>(s42.size() * s31.size() * s11.size()); -// for(int i = 0; i letter, long[] rule1, long[] rule2) { + public record Rule(long id, Optional letter, long[] rule1, long[] rule2) { public Rule(long id, String rule) { this(id, getLetter(rule), getRule(rule, false), getRule(rule, true)); } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day20.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day20.java index d0d35495..40f91f5d 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day20.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day20.java @@ -55,9 +55,9 @@ public Object part2() { total += g.countWithoutSides(); } long seaMonsterSize = 15; - for (long n = 0; total - n > 0; n += seaMonsterSize) { - System.out.println((n / 15) + ". " + (total - n)); - } +// for (long n = 0; total - n > 0; n += seaMonsterSize) { +// System.out.println((n / 15) + ". " + (total - n)); +// } return total - (35 * seaMonsterSize); } From a9862384962e649288ea45de9890ef161f6bfc15 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Thu, 2 Dec 2021 19:13:51 +0100 Subject: [PATCH 249/433] Allow example files to be executed --- src/main/java/com/sbaars/adventofcode/common/Day.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/sbaars/adventofcode/common/Day.java b/src/main/java/com/sbaars/adventofcode/common/Day.java index 073bb3aa..faa733b6 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Day.java +++ b/src/main/java/com/sbaars/adventofcode/common/Day.java @@ -14,6 +14,7 @@ public abstract class Day { private static final String DEFAULT_DELIMITER = System.lineSeparator(); protected final int year; protected final int day; + private int example = 0; public Day(int year, int day) { this.year = year; @@ -37,6 +38,12 @@ public void printParts() { System.out.println("Part 2: " + part2()); } + public void printParts(int example) { + this.example = example; + System.out.println("Part 1: " + part1()); + System.out.println("Part 2: " + part2()); + } + public void submitPart1() { new Submit().submit(part1(), year, day, 1); } @@ -46,7 +53,8 @@ public void submitPart2() { } protected String day() { - return getResourceAsString(year + "/day" + day + ".txt"); + boolean b = example != 0; + return getResourceAsString(year + (b ? "-examples" : "") + "/day" + day + (b ? "-" + example : "") + ".txt"); } protected String[] dayStrings() { From 8f1b86d9dfa9996e6568b5a1fc0dfaf48144f133 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Fri, 3 Dec 2021 06:35:38 +0100 Subject: [PATCH 250/433] 2021 Day 3 --- .../sbaars/adventofcode/year21/days/Day3.java | 42 +- .../sbaars/adventofcode/year21/days/Day4.java | 3 + src/main/resources/2021-examples/day3-1.txt | 12 + src/main/resources/2021/day3.txt | 1000 +++++++++++++++++ 4 files changed, 1054 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/2021-examples/day3-1.txt create mode 100644 src/main/resources/2021/day3.txt diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day3.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day3.java index a6742e33..51807f84 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day3.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day3.java @@ -1,6 +1,10 @@ package com.sbaars.adventofcode.year21.days; +import static java.lang.Integer.parseInt; + import com.sbaars.adventofcode.year21.Day2021; +import java.util.ArrayList; +import java.util.List; public class Day3 extends Day2021 { public Day3() { @@ -15,12 +19,44 @@ public static void main(String[] args) { @Override public Object part1() { - var in = day(); - return ""; + var in = dayStrings(); + String most = ""; + String least = ""; + + for(int i = 0; i findVal(List in, boolean high, int pos) { + List res = new ArrayList<>(in); + res.removeIf(e -> e.charAt(pos) == (!moreZeros(in.toArray(String[]::new), pos)^high ? '1' : '0')); + if(res.size() == 1) return res; + return findVal(res, high, pos+1); } } diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day4.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day4.java index 656e79b1..96db841c 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day4.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day4.java @@ -10,10 +10,13 @@ public Day4() { public static void main(String[] args) { new Day4().printParts(); +// new Day3().submitPart1(); +// new Day3().submitPart2(); } @Override public Object part1() { + var in = day(); return ""; } diff --git a/src/main/resources/2021-examples/day3-1.txt b/src/main/resources/2021-examples/day3-1.txt new file mode 100644 index 00000000..a6366a8a --- /dev/null +++ b/src/main/resources/2021-examples/day3-1.txt @@ -0,0 +1,12 @@ +00100 +11110 +10110 +10111 +10101 +01111 +00111 +11100 +10000 +11001 +00010 +01010 diff --git a/src/main/resources/2021/day3.txt b/src/main/resources/2021/day3.txt new file mode 100644 index 00000000..e0461ad7 --- /dev/null +++ b/src/main/resources/2021/day3.txt @@ -0,0 +1,1000 @@ +001001100101 +010100011100 +100000110001 +001111110101 +100010110101 +111010100100 +011011000110 +100000011101 +011001100111 +000001011110 +000010100011 +110100111110 +001101100101 +011011011101 +010000011010 +011100100100 +001111000011 +100111000111 +100111100011 +101100011011 +001110101101 +110010101000 +111110110111 +111100100010 +001001000000 +001111101011 +101100110011 +011010001111 +100010100001 +110011001010 +101000001100 +111010101100 +101010101100 +110011101000 +001110010110 +010101001001 +000010101100 +010101101010 +111001101100 +010000000000 +011011111000 +001110110011 +101000001011 +110101100101 +111001010111 +110001111111 +010010100110 +011010011001 +011101100000 +100110010101 +111000101101 +110011110000 +011001011000 +001101000010 +001110011111 +100010101100 +010011100101 +000011110000 +101100001111 +010001011000 +001101011101 +011110001110 +111110101101 +010000000011 +111000000011 +000100010100 +111110011001 +111001010011 +011000100010 +100001110000 +111111000100 +010100101110 +010011100110 +101100110111 +101001101001 +000001110111 +101100000001 +011010111011 +110011011111 +001001011001 +010110101100 +001100101100 +101001011101 +100101000010 +010101000010 +111101011110 +000000100010 +111010010010 +100001111011 +110000010011 +000101111001 +111101100111 +110101011100 +000111110101 +011110111001 +010000101011 +001001011000 +010110011100 +111111111000 +110100000101 +110101010011 +010011110010 +100110111100 +111000001101 +110001001001 +111101111100 +111111101001 +100101001010 +010101010100 +010010001111 +000010110000 +011001110110 +111101111011 +011001011100 +110101010101 +110111011111 +110101111000 +110010100110 +110000000010 +011001100001 +011000110010 +010110100000 +011110000001 +100101011010 +100111111011 +001110000011 +100110011011 +000100011101 +110000110110 +000001000010 +011111111010 +001010100100 +011000100100 +001100001111 +010111100111 +010001101101 +011001010000 +001010101000 +001001100011 +000011001010 +010010010100 +100001011000 +000011011011 +111011110111 +100010010000 +111001110000 +011100010100 +000101101011 +010000000010 +001101110100 +111010111111 +011000011110 +111110000110 +011011011011 +010001000100 +110111010010 +001110010100 +001001011010 +010111100011 +110110110101 +110101000101 +001011100011 +001111010110 +110111011000 +110001011110 +011101000001 +101111100000 +110001101110 +010101101100 +010010100010 +000111101010 +010000001010 +011001000010 +100000010110 +111101010010 +111011001011 +000010100010 +011111111001 +111001001011 +101001111010 +110100000001 +010010101111 +110011111001 +110111100110 +100111001111 +100101101001 +011111100100 +011111011011 +111100101101 +110010000111 +110110010000 +011101111011 +001101101000 +001001100110 +110001101000 +111100101110 +000101110111 +011110101111 +000100010010 +011010000011 +010010100001 +111001111110 +001111101010 +101110100011 +100111111001 +110110011010 +000100001000 +111011010010 +011001101110 +001011011010 +101110111100 +110011010110 +001010100011 +111010111110 +011100010011 +100011010100 +110000111010 +110001010001 +001111101001 +010011100111 +101010111010 +110101001101 +000100111000 +100101001001 +101110111011 +001110011000 +011000010010 +001000010001 +000111011101 +100000111100 +001110000100 +011111111100 +000100100100 +100101001000 +100011011110 +011110100010 +011110111110 +010001010110 +000101000000 +001001100000 +010001101100 +110010110101 +100001000010 +100001001001 +000111000011 +111000100010 +000000011101 +111111000110 +100111100100 +111100011101 +101011110011 +001010110101 +100000000110 +111100011001 +010110010010 +000010010010 +001011111001 +001000011100 +011000011000 +111111110000 +100001110010 +011011110010 +000110011101 +001101001010 +011010100111 +100000011100 +001000111011 +011010100110 +000001111111 +001010010111 +011100001010 +110110001000 +110010101111 +111100010111 +100001111010 +101110010110 +000010110011 +111001010100 +101101110110 +111111111100 +011101101011 +011011110100 +111010100011 +001101000110 +111101111001 +110001111000 +010110000111 +110110100101 +111101011100 +100001000011 +010011101000 +000111110000 +111011110100 +011010111110 +101011001000 +111100110101 +100100001001 +100011110100 +010101010011 +010110011011 +100111001101 +000111001010 +110111011011 +100000111011 +111011000001 +011111100011 +110010000010 +100110101111 +101001111000 +111001111010 +000111111000 +111110100100 +111001111011 +100010110111 +110111001111 +100011001001 +110011001101 +100011101111 +011011110000 +101100011110 +110110111011 +011010100000 +111000000010 +000010010011 +110101101001 +101011011101 +011101100110 +111111000010 +010110100101 +010010011110 +010000101111 +010110101001 +001111010101 +111000101110 +100000010111 +111001000101 +111101101100 +011000000110 +000001110010 +110011010001 +011110011011 +100000010001 +000100100001 +011110001100 +001101011111 +100000000001 +000010011001 +110111000110 +100110110111 +011000110000 +100101000101 +100100111110 +000101010100 +001110100111 +111011001010 +010111001001 +110101001110 +111000100111 +000101011100 +100010111000 +000111110111 +010110010100 +110101100100 +111000011111 +000101001100 +000001011111 +011001111101 +110001111001 +111111110100 +010100111111 +011001100110 +010110101101 +011111011001 +101000010100 +010001100101 +101000100101 +001001010010 +000100011000 +000000000111 +001110011001 +100000001011 +011011101001 +111001000000 +110011100000 +011001100011 +000010011100 +000111000000 +000110011111 +010100011101 +001100010111 +100011000001 +001011000110 +010000011111 +011101001100 +101111011110 +000101001001 +110100101100 +000100010101 +010011001000 +010000010100 +111111010000 +000101000111 +000010010110 +001010000001 +100110110010 +010101100010 +111110010100 +111011111110 +010110110101 +011111000011 +001001001000 +101100001101 +100010101001 +010001101011 +000011011101 +010110011111 +101001001010 +100100001111 +100110100011 +000101001010 +100000100101 +011000100110 +110100000110 +000000010101 +000011110010 +100010010101 +001000100111 +111010000101 +000011000010 +000101001110 +000100110000 +101110010001 +101110100100 +111111001101 +111011101110 +010011000100 +000001001000 +100010111110 +111100101001 +001011111101 +000110000011 +100111111100 +111000000110 +001001011110 +111011110000 +110110000110 +110110011100 +010111111010 +011011001110 +110110001100 +000111100010 +011001100101 +111111000011 +011001111000 +110111010100 +000011111010 +011111101001 +011001011010 +010111101101 +001100100110 +001110101100 +001011011111 +000110001010 +100100001101 +011001101111 +010000100110 +110110010100 +000000110010 +011000101101 +110101111011 +110011111011 +010010001000 +001101110000 +100111100000 +111001011100 +001000110010 +011000011100 +001110010111 +010111011101 +010001110001 +111111101110 +000010111000 +001001000110 +101101100010 +000010000000 +111100100100 +101111011010 +111110011111 +010011110100 +010010010001 +011100011101 +111100000100 +011110011000 +000101100000 +101000111100 +101011110001 +001010000100 +001100101110 +010101010101 +111101110010 +011110100100 +001101100000 +000000110011 +100101100000 +101111100011 +101010101001 +100110110011 +000110100010 +101010000100 +001011010011 +010100110101 +000011101101 +100001001100 +111101101110 +100111101001 +010110111010 +011110000110 +100101011101 +000000001000 +000111001011 +011001000101 +011101001111 +111010001011 +010011011111 +101100001011 +001110110001 +101110110100 +100100011000 +000111010111 +111011111011 +011011100111 +110000110010 +101110110000 +010001111011 +010011111100 +110100110011 +011000111110 +000010111010 +001110001001 +011001100000 +100100100110 +011111001010 +000101000100 +101001010010 +010011101100 +110100101110 +010110001001 +111000011011 +010001110000 +011111011000 +010011000011 +001100001010 +100011100010 +011011111100 +010110101111 +000101100001 +101101100000 +111000110101 +110011010100 +000111011010 +011111010010 +111011111000 +100101110111 +000000111111 +011100110010 +110110011011 +010001011101 +100110110000 +110111110010 +010001111101 +100001101001 +110000111111 +010111110000 +100011001000 +011000101111 +111100100101 +010111010010 +111100110110 +101001100010 +110100010000 +110010111000 +011100010010 +000000001001 +010100011110 +110101010110 +111100100001 +111000010010 +110000010111 +001011100000 +001001010101 +110101101111 +001010010101 +010000110100 +111001011010 +000001111100 +101101011111 +110100111011 +100111010000 +110001110100 +101011000110 +101100111110 +001010010001 +011111101011 +010100001001 +010110100001 +000000110000 +110010111111 +111010000100 +111100001111 +100100110000 +001000110001 +011010001011 +110101111010 +001110000001 +000010100110 +010101111010 +011110100101 +011011100100 +000000011111 +100010011001 +100101000100 +110010011011 +011000000000 +001111111110 +001111010011 +100000110111 +100011011000 +110011111110 +010001000001 +011100011111 +101110001000 +101110000111 +001101100011 +111100100000 +101001110010 +100011110110 +100110101101 +011101100100 +111001011110 +110001101101 +100101101110 +111101001100 +100100100001 +100000011110 +000000000011 +010100010111 +001010010110 +110010110000 +100011110101 +110110110110 +100101101100 +000111011011 +001001001011 +101111010010 +011011010111 +010001100001 +111110101100 +010100100010 +001101101111 +011111100001 +100011011111 +110011111100 +100110001110 +101010100000 +100111011010 +101110101001 +101111001011 +110111000010 +100110001001 +000011111101 +110100010011 +101001000010 +101101011100 +001110010010 +001111000010 +110011101110 +001010011000 +011001000011 +110001101111 +001011001011 +011001111111 +000101010101 +101101100110 +110100101101 +011000111000 +011110100011 +010101110111 +110010001000 +101110100010 +111010001010 +011000001010 +001010110111 +110011111111 +011111101010 +000101110000 +101101000001 +111110111001 +110010111011 +100111101111 +101111000100 +011101110000 +001101010010 +110110011101 +000110000001 +001011111011 +011100001111 +110010101100 +110010010100 +110010100000 +110110000100 +010110011001 +100101101101 +010010010101 +101011111000 +100001001000 +011100011110 +101110010011 +110110001010 +110010110001 +110000000100 +011000000011 +000011111000 +010111000111 +000111000100 +111101100100 +101000101111 +001000000110 +000100000001 +101001100101 +001001111110 +001000010011 +111100001110 +001010111011 +011110011101 +001111101000 +000001110100 +110101000110 +000101000010 +001110101010 +101101011101 +011100101001 +011110000000 +001001101011 +001001011111 +011101111101 +101111100111 +001110110110 +011010110001 +011111000001 +000100101101 +001010010011 +010010110000 +111011101111 +110110000111 +001011110101 +100001101011 +110101100000 +010011111101 +000101110010 +100100111010 +101101101111 +010110111001 +110100110110 +111111001111 +100110010000 +100010100000 +011001101000 +000000111010 +010001100000 +000011001101 +111100011111 +100010111011 +000010100111 +100101000001 +011001001010 +100101010001 +101001001101 +010011101001 +000001000101 +000010011000 +111011100001 +001100111010 +010011011000 +000001011101 +010100111001 +001010110000 +011011101000 +010010111011 +100101100100 +010111000011 +001001111001 +011111011110 +011110111011 +101010010111 +101101111011 +001100011101 +011011010010 +000011000100 +010010110010 +001111011110 +011100011001 +011011101111 +010110101010 +111011010000 +111111010110 +001100110110 +010000110111 +000011110100 +011011000001 +101100101110 +100011001110 +011000010100 +000110001011 +011000000001 +000000111100 +101100110101 +111110010011 +111110101001 +110110101111 +101110110101 +110101111001 +000010001101 +111010101000 +010010100101 +001111101111 +100110100110 +000001010000 +000011110101 +110100111000 +101010111100 +000000010100 +010100010101 +010001100010 +100011010010 +011101001001 +000010101111 +000101000101 +001001101100 +111111100101 +100111111010 +110011101011 +000011100000 +111111011100 +010100001010 +000011100110 +110011111101 +001100000000 +011010101111 +101010101011 +111011000111 +010100110010 +011110110101 +010000011001 +100011010110 +000000001110 +000010101101 +111110100011 +111110010000 +101011101010 +011011001101 +101011111111 +100101101011 +111001000100 +010010000101 +011001010101 +110001100010 +010100001101 +111111101101 +101101000111 +001110110101 +001101000101 +001000100110 +000011011000 +101001001001 +010001001000 +110110111010 +111110011100 +000111111100 +000110101111 +000001110001 +011101101010 +100001001101 +010100010011 +001001001110 +111110110101 +001110001011 +111010101110 +100111000000 +110100000010 +000010111110 +100100000100 +111111001000 +111010001000 +101011100111 +001111111100 +001001101110 +011000001111 +001001100001 +001110000110 +111011011011 +001010101111 +101110110110 +110010000110 +001100010100 +110100111001 +111111110110 +100011001011 +111111000101 +000111010010 +010100100110 +101010110110 +011110110100 +110110101100 +100100111111 +101101110100 +010110101110 +101001101101 +001101010011 +001000100101 +010111010011 +000011110011 +010011111111 +101000000110 +010001111110 +100111010010 +010100010100 +110100001111 +001100000001 +010010110110 +011010011011 +101000010001 +101100010110 +111010011000 +001001101111 +111101010001 +010101111111 +000111010110 +010111100100 +000111101111 +110010100001 +100101111100 +010010010011 +100100001000 +010110000001 +000011000110 +101100110100 +000001100101 +010110101000 +101010100010 +101001110000 +101111000001 +110001111110 +101011010101 +111000010001 +010000101101 +000101010011 +101100011100 +010101000000 +010001110010 +111000001010 +101001011100 +001101111101 +111000101011 +100100000000 +010001011111 +000101000011 +111000011000 +000000100101 +110100001010 +011111111101 +100001010100 +110000011000 +011110011100 +000000110110 +101100100101 +000110001110 +110101110100 +010011111011 +101011100110 +110110010101 +001110011100 +110101110000 +111001001111 +000010101011 +010011100001 +100101010111 +000111100101 +000011001110 +111001000111 +011001100100 +001110001101 +110101010100 +100101100111 +011001000000 +100000110100 +100011101101 +100100110101 +011000110110 +101110011011 +110101100001 From 38e85a09f2566b77ada4776a22b5abb72f79bd30 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Fri, 3 Dec 2021 20:24:31 +0100 Subject: [PATCH 251/433] Ignore SonarLint --- .gitignore | 2 ++ .idea/runConfigurations.xml | 10 ---------- 2 files changed, 2 insertions(+), 10 deletions(-) delete mode 100644 .idea/runConfigurations.xml diff --git a/.gitignore b/.gitignore index 812bbc36..b5de45b6 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,8 @@ buildNumber.properties .idea/**/usage.statistics.xml .idea/**/dictionaries .idea/**/shelf +.idea/**/sonarlint +.idea/sonarlint # Generated files .idea/**/contentModel.xml diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml deleted file mode 100644 index 797acea5..00000000 --- a/.idea/runConfigurations.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - \ No newline at end of file From d18c7b4083dd53bd4e427ccef37f24a6eb303c20 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Sat, 4 Dec 2021 06:37:00 +0100 Subject: [PATCH 252/433] 2021 Day 4: Bingo! --- .../sbaars/adventofcode/util/FetchInput.java | 4 +- .../sbaars/adventofcode/year21/days/Day4.java | 86 ++- src/main/resources/2021-examples/day4-1.txt | 19 + src/main/resources/2021-examples/day4-2.txt | 5 + src/main/resources/2021-examples/day4-3.txt | 5 + src/main/resources/2021-examples/day4-4.txt | 5 + src/main/resources/2021/day4.txt | 601 ++++++++++++++++++ 7 files changed, 721 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/2021-examples/day4-1.txt create mode 100644 src/main/resources/2021-examples/day4-2.txt create mode 100644 src/main/resources/2021-examples/day4-3.txt create mode 100644 src/main/resources/2021-examples/day4-4.txt create mode 100644 src/main/resources/2021/day4.txt diff --git a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java index 5306278d..5bfd479c 100644 --- a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java +++ b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java @@ -26,8 +26,8 @@ private FetchInput() { this.client = WebClient.getClient(); } - public static void main(String[] args) throws Exception { - new FetchInput().retrieveDay("3", "2021"); + public static void main(String[] args) { + new FetchInput().retrieveDay("4", "2021"); } private void retrieveDay(String day, String year) { diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day4.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day4.java index 96db841c..8297d581 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day4.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day4.java @@ -1,6 +1,11 @@ package com.sbaars.adventofcode.year21.days; import com.sbaars.adventofcode.year21.Day2021; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; public class Day4 extends Day2021 { @@ -10,18 +15,95 @@ public Day4() { public static void main(String[] args) { new Day4().printParts(); -// new Day3().submitPart1(); -// new Day3().submitPart2(); +// new Day4().submitPart1(); +// new Day4().submitPart2(); } @Override public Object part1() { var in = day(); + String[] split = in.split("\n\n"); + long[] nums = Arrays.stream(split[0].split(",")).mapToLong(Long::parseLong).toArray(); + List cards = IntStream.range(1, split.length).mapToObj(i -> numGrid(split[i])).toList(); + for(long num : nums){ + for(long[][] card : cards){ + if(markCard(card, num) && checkCard(card)){ + return result(card, num); + } + } + } return ""; } + private long result(long[][] card, long num) { + long res = 0; + for(int i = 0; i< card.length; i++){ + for(int j = 0; j< card[i].length; j++){ + if(card[i][j] != -1){ + res += card[i][j]; + } + } + } + return res * num; + } + + private boolean markCard(long[][] card, long num){ + for(int i = 0; i< card.length; i++){ + for(int j = 0; j< card[i].length; j++){ + if(card[i][j] == num){ + card[i][j] = -1; + return true; + } + } + } + return false; + } + + private boolean checkCard(long[][] card){ + for(long[] nums : card){ + if(Arrays.stream(nums).allMatch(n -> n==-1)){ + return true; + } + } + out: for(int i = 0; i !e.isEmpty()).mapToLong(Long::parseLong).toArray(); + } + return res; + } + @Override public Object part2() { + var in = day(); + String[] split = in.split("\n\n"); + long[] nums = Arrays.stream(split[0].split(",")).mapToLong(Long::parseLong).toArray(); + List cards = IntStream.range(1, split.length).mapToObj(i -> numGrid(split[i])).collect(Collectors.toCollection(ArrayList::new)); + for(long num : nums){ + for(int i = 0; i Date: Sat, 4 Dec 2021 06:44:17 +0100 Subject: [PATCH 253/433] Create NumGrid utility --- .../adventofcode/common/grid/NumGrid.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java diff --git a/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java b/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java new file mode 100644 index 00000000..9f973d23 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java @@ -0,0 +1,34 @@ +package com.sbaars.adventofcode.common.grid; + +import java.util.Arrays; +import java.util.stream.IntStream; +import java.util.stream.LongStream; + +public class NumGrid implements Grid { + long[][] grid; + + public NumGrid(String stringToParse, String lineDelimiter, String itemDelimiter) { + this.grid = numGrid(stringToParse, lineDelimiter, itemDelimiter); + } + + public NumGrid(String stringToParse) { + this.grid = numGrid(stringToParse, "\n", " "); + } + + private long[][] numGrid(String str, String lineDelimiter, String itemDelimiter) { + String[] lines = str.split(lineDelimiter); + long[][] res = new long[lines.length][]; + for(int i = 0; i !e.isEmpty()).mapToLong(Long::parseLong).toArray(); + } + return res; + } + + public int countChar(char... c) { + return Math.toIntExact(iterate().filter(e -> new String(c).chars().anyMatch(i -> i == e)).count()); + } + + public IntStream iterate() { + return LongStream.range(0, grid.length).flatMap(i -> LongStream.of(grid[Math.toIntExact(i)])).mapToInt(Math::toIntExact); + } +} From d586c5b667fad1b22cdf15357ea7f9f62d6a4668 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Sat, 4 Dec 2021 07:02:57 +0100 Subject: [PATCH 254/433] Apply utility --- .../adventofcode/common/grid/NumGrid.java | 39 ++++++++++++++-- .../sbaars/adventofcode/year21/days/Day4.java | 45 +++++-------------- 2 files changed, 47 insertions(+), 37 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java b/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java index 9f973d23..1f47bd7e 100644 --- a/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java +++ b/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java @@ -5,7 +5,7 @@ import java.util.stream.LongStream; public class NumGrid implements Grid { - long[][] grid; + public long[][] grid; public NumGrid(String stringToParse, String lineDelimiter, String itemDelimiter) { this.grid = numGrid(stringToParse, lineDelimiter, itemDelimiter); @@ -24,11 +24,44 @@ private long[][] numGrid(String str, String lineDelimiter, String itemDelimiter) return res; } - public int countChar(char... c) { - return Math.toIntExact(iterate().filter(e -> new String(c).chars().anyMatch(i -> i == e)).count()); + public long count(long...n) { + return iterateLong().filter(e -> LongStream.of(n).anyMatch(i -> i == e)).count(); + } + + public long countExcept(long...n) { + return Math.toIntExact(iterateLong().filter(e -> LongStream.of(n).noneMatch(i -> i == e)).count()); + } + + public long sum() { + return iterateLong().sum(); + } + + public long sum(long...n) { + return iterateLong().filter(e -> LongStream.of(n).anyMatch(i -> i == e)).sum(); + } + + public long sumExcept(long...n) { + return iterateLong().filter(e -> LongStream.of(n).noneMatch(i -> i == e)).sum(); + } + + public boolean replace(long orig, long replacement){ + boolean changed = false; + for(int i = 0; i< grid.length; i++){ + for(int j = 0; j< grid[i].length; j++){ + if(grid[i][j] == orig){ + grid[i][j] = replacement; + changed = true; + } + } + } + return changed; } public IntStream iterate() { return LongStream.range(0, grid.length).flatMap(i -> LongStream.of(grid[Math.toIntExact(i)])).mapToInt(Math::toIntExact); } + + public LongStream iterateLong() { + return LongStream.range(0, grid.length).flatMap(i -> LongStream.of(grid[Math.toIntExact(i)])); + } } diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day4.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day4.java index 8297d581..2b25d6ae 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day4.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day4.java @@ -1,5 +1,6 @@ package com.sbaars.adventofcode.year21.days; +import com.sbaars.adventofcode.common.grid.NumGrid; import com.sbaars.adventofcode.year21.Day2021; import java.util.ArrayList; import java.util.Arrays; @@ -24,9 +25,9 @@ public Object part1() { var in = day(); String[] split = in.split("\n\n"); long[] nums = Arrays.stream(split[0].split(",")).mapToLong(Long::parseLong).toArray(); - List cards = IntStream.range(1, split.length).mapToObj(i -> numGrid(split[i])).toList(); + List cards = IntStream.range(1, split.length).mapToObj(i -> split[i]).map(NumGrid::new).toList(); for(long num : nums){ - for(long[][] card : cards){ + for(NumGrid card : cards){ if(markCard(card, num) && checkCard(card)){ return result(card, num); } @@ -35,31 +36,16 @@ public Object part1() { return ""; } - private long result(long[][] card, long num) { - long res = 0; - for(int i = 0; i< card.length; i++){ - for(int j = 0; j< card[i].length; j++){ - if(card[i][j] != -1){ - res += card[i][j]; - } - } - } - return res * num; + private long result(NumGrid card, long num) { + return card.sumExcept(-1) * num; } - private boolean markCard(long[][] card, long num){ - for(int i = 0; i< card.length; i++){ - for(int j = 0; j< card[i].length; j++){ - if(card[i][j] == num){ - card[i][j] = -1; - return true; - } - } - } - return false; + private boolean markCard(NumGrid card, long num){ + return card.replace(num, -1); } - private boolean checkCard(long[][] card){ + private boolean checkCard(NumGrid grid){ + long[][] card = grid.grid; for(long[] nums : card){ if(Arrays.stream(nums).allMatch(n -> n==-1)){ return true; @@ -76,24 +62,15 @@ private boolean checkCard(long[][] card){ return false; } - private long[][] numGrid(String str) { - String[] lines = str.split("\n"); - long[][] res = new long[lines.length][]; - for(int i = 0; i !e.isEmpty()).mapToLong(Long::parseLong).toArray(); - } - return res; - } - @Override public Object part2() { var in = day(); String[] split = in.split("\n\n"); long[] nums = Arrays.stream(split[0].split(",")).mapToLong(Long::parseLong).toArray(); - List cards = IntStream.range(1, split.length).mapToObj(i -> numGrid(split[i])).collect(Collectors.toCollection(ArrayList::new)); + List cards = IntStream.range(1, split.length).mapToObj(i -> new NumGrid(split[i])).collect(Collectors.toCollection(ArrayList::new)); for(long num : nums){ for(int i = 0; i Date: Sun, 5 Dec 2021 07:13:31 +0100 Subject: [PATCH 255/433] 2021 Day 5 --- .../sbaars/adventofcode/util/FetchInput.java | 2 +- .../sbaars/adventofcode/year21/days/Day5.java | 76 ++- src/main/resources/2021-examples/day5-1.txt | 10 + src/main/resources/2021-examples/day5-2.txt | 10 + src/main/resources/2021/day5.txt | 500 ++++++++++++++++++ 5 files changed, 594 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/2021-examples/day5-1.txt create mode 100644 src/main/resources/2021-examples/day5-2.txt create mode 100644 src/main/resources/2021/day5.txt diff --git a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java index 5bfd479c..0142a569 100644 --- a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java +++ b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java @@ -27,7 +27,7 @@ private FetchInput() { } public static void main(String[] args) { - new FetchInput().retrieveDay("4", "2021"); + new FetchInput().retrieveDay("5", "2021"); } private void retrieveDay(String day, String year) { diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day5.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day5.java index 831f595d..ad634f95 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day5.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day5.java @@ -1,6 +1,11 @@ package com.sbaars.adventofcode.year21.days; +import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; + import com.sbaars.adventofcode.year21.Day2021; +import java.awt.*; +import java.util.HashSet; +import java.util.Set; public class Day5 extends Day2021 { @@ -9,16 +14,81 @@ public Day5() { } public static void main(String[] args) { - new Day5().printParts(); + new Day5().printParts(1); +// new Day5().submitPart1(); +// new Day5().submitPart2(); } @Override public Object part1() { - return ""; + var in = dayStream().map(e -> readString(e, "%n,%n -> %n,%n", Coords.class)).toList(); + Set all = new HashSet<>(); + Set vis = new HashSet<>(); + for(Coords c : in) { + if(c.x1 == c.x2){ + for(long y = Math.min(c.y1, c.y2); y<=Math.max(c.y1, c.y2); y++){ + var l = new Point(Math.toIntExact(c.x1), Math.toIntExact(y)); + if(!all.add(l)){ + vis.add(l); + } + } + } else if(c.y1 == c.y2){ + for(long x = Math.min(c.x1, c.x2); x<=Math.max(c.x1, c.x2); x++){ + var l = new Point(Math.toIntExact(x), Math.toIntExact(c.y1)); + if(!all.add(l)){ + vis.add(l); + } + } + } + } + return vis.size(); } @Override public Object part2() { - return ""; + var in = dayStream().map(e -> readString(e, "%n,%n -> %n,%n", Coords.class)).toList(); + Set all = new HashSet<>(); + Set vis = new HashSet<>(); + for(Coords c : in) { + if(c.x1 == c.x2){ + for(long y = Math.min(c.y1, c.y2); y<=Math.max(c.y1, c.y2); y++){ + var l = new Point(Math.toIntExact(c.x1), Math.toIntExact(y)); + if(!all.add(l)){ + vis.add(l); + } + } + } else if(c.y1 == c.y2){ + for(long x = Math.min(c.x1, c.x2); x<=Math.max(c.x1, c.x2); x++){ + var l = new Point(Math.toIntExact(x), Math.toIntExact(c.y1)); + if(!all.add(l)){ + vis.add(l); + } + } + } else if((c.x1 > c.x2 && c.y1 > c.y2) || (c.x1 < c.x2 && c.y1 < c.y2)){ + for(long x = 0; x<=Math.max(c.x1, c.x2)-Math.min(c.x1, c.x2); x++){ + var l = new Point(Math.toIntExact(Math.min(c.x1, c.x2)+x), Math.toIntExact(Math.min(c.y1, c.y2)+x)); + if(!all.add(l)){ + vis.add(l); + } + } + }else if(c.x1 < c.x2 && c.y1 > c.y2){ + for(long x = 0; x<=Math.max(c.x1, c.x2)-Math.min(c.x1, c.x2); x++){ + var l = new Point(Math.toIntExact(c.x1+x), Math.toIntExact(c.y1-x)); + if(!all.add(l)){ + vis.add(l); + } + } + }else if(c.x1 > c.x2 && c.y1 < c.y2){ + for(long x = 0; x<=Math.max(c.x1, c.x2)-Math.min(c.x1, c.x2); x++){ + var l = new Point(Math.toIntExact(c.x1-x), Math.toIntExact(c.y1+x)); + if(!all.add(l)){ + vis.add(l); + } + } + } else throw new IllegalStateException("not covered "+c); + } + return vis.size(); } + + public record Coords(long x1, long y1, long x2, long y2) {} } diff --git a/src/main/resources/2021-examples/day5-1.txt b/src/main/resources/2021-examples/day5-1.txt new file mode 100644 index 00000000..b258f682 --- /dev/null +++ b/src/main/resources/2021-examples/day5-1.txt @@ -0,0 +1,10 @@ +0,9 -> 5,9 +8,0 -> 0,8 +9,4 -> 3,4 +2,2 -> 2,1 +7,0 -> 7,4 +6,4 -> 2,0 +0,9 -> 2,9 +3,4 -> 1,4 +0,0 -> 8,8 +5,5 -> 8,2 diff --git a/src/main/resources/2021-examples/day5-2.txt b/src/main/resources/2021-examples/day5-2.txt new file mode 100644 index 00000000..b17a4597 --- /dev/null +++ b/src/main/resources/2021-examples/day5-2.txt @@ -0,0 +1,10 @@ +.......1.. +..1....1.. +..1....1.. +.......1.. +.112111211 +.......... +.......... +.......... +.......... +222111.... diff --git a/src/main/resources/2021/day5.txt b/src/main/resources/2021/day5.txt new file mode 100644 index 00000000..0d0563de --- /dev/null +++ b/src/main/resources/2021/day5.txt @@ -0,0 +1,500 @@ +777,778 -> 777,676 +500,510 -> 378,510 +441,657 -> 441,638 +724,480 -> 724,778 +702,85 -> 44,85 +973,961 -> 28,16 +913,125 -> 483,125 +714,895 -> 870,739 +273,774 -> 273,795 +623,450 -> 623,616 +157,49 -> 987,879 +430,775 -> 382,775 +58,938 -> 718,278 +290,366 -> 604,680 +75,252 -> 760,937 +46,947 -> 788,205 +731,197 -> 28,197 +25,15 -> 964,954 +317,440 -> 66,691 +166,427 -> 544,805 +686,800 -> 50,164 +858,569 -> 447,569 +596,50 -> 596,327 +739,218 -> 739,278 +382,852 -> 382,960 +11,984 -> 970,25 +911,390 -> 790,511 +739,299 -> 739,254 +989,172 -> 989,567 +36,335 -> 249,335 +60,900 -> 121,900 +299,380 -> 299,178 +701,932 -> 701,224 +626,282 -> 641,282 +83,532 -> 83,91 +246,125 -> 95,125 +73,446 -> 308,446 +902,907 -> 26,31 +841,298 -> 841,547 +264,737 -> 974,27 +170,199 -> 170,120 +135,428 -> 319,244 +431,240 -> 431,691 +406,935 -> 889,935 +192,526 -> 192,82 +236,54 -> 236,574 +667,369 -> 667,559 +501,42 -> 620,42 +130,973 -> 208,973 +213,639 -> 542,639 +943,266 -> 247,962 +545,864 -> 423,864 +252,698 -> 359,698 +314,501 -> 314,948 +203,974 -> 472,974 +947,125 -> 175,897 +956,544 -> 512,544 +862,264 -> 549,577 +606,138 -> 606,862 +239,123 -> 902,786 +201,643 -> 201,473 +916,375 -> 916,807 +10,10 -> 988,988 +490,659 -> 490,559 +72,66 -> 967,961 +215,225 -> 215,281 +930,856 -> 203,856 +172,481 -> 172,23 +867,684 -> 349,166 +843,45 -> 843,971 +250,779 -> 884,779 +973,464 -> 973,794 +543,868 -> 39,364 +968,424 -> 968,289 +470,489 -> 936,489 +411,573 -> 411,206 +120,691 -> 120,401 +134,649 -> 412,649 +452,203 -> 452,597 +155,604 -> 155,278 +914,854 -> 685,854 +38,972 -> 975,35 +153,403 -> 418,403 +731,152 -> 295,588 +242,560 -> 513,289 +930,619 -> 506,195 +547,320 -> 899,320 +237,368 -> 479,126 +417,842 -> 26,842 +213,581 -> 506,288 +741,597 -> 742,596 +79,440 -> 79,108 +424,946 -> 985,946 +535,833 -> 716,833 +249,328 -> 772,328 +616,905 -> 981,905 +46,877 -> 227,877 +841,770 -> 747,770 +202,44 -> 633,475 +556,354 -> 556,829 +617,864 -> 129,376 +318,310 -> 318,927 +259,300 -> 259,485 +167,482 -> 167,265 +349,184 -> 885,184 +616,199 -> 921,199 +710,162 -> 710,373 +499,87 -> 499,214 +905,51 -> 258,51 +134,739 -> 858,739 +879,428 -> 496,45 +208,599 -> 208,908 +68,225 -> 268,225 +581,456 -> 86,456 +898,318 -> 278,318 +84,910 -> 940,54 +344,206 -> 798,660 +51,75 -> 909,933 +783,780 -> 94,91 +907,935 -> 808,836 +556,736 -> 556,592 +39,611 -> 859,611 +29,73 -> 29,438 +898,390 -> 898,518 +777,647 -> 163,33 +144,962 -> 523,962 +827,676 -> 469,318 +267,647 -> 360,647 +742,438 -> 660,438 +214,76 -> 214,873 +550,177 -> 923,550 +182,191 -> 329,191 +765,737 -> 765,118 +387,322 -> 895,322 +174,785 -> 714,245 +733,453 -> 852,453 +497,136 -> 131,502 +574,931 -> 574,568 +282,198 -> 282,412 +971,324 -> 940,355 +827,358 -> 130,358 +954,726 -> 311,83 +207,195 -> 936,195 +42,935 -> 921,56 +955,46 -> 35,966 +627,361 -> 627,888 +37,202 -> 91,202 +697,599 -> 155,57 +227,264 -> 285,264 +50,790 -> 797,43 +717,693 -> 88,64 +145,234 -> 628,234 +358,791 -> 835,791 +765,739 -> 765,888 +900,204 -> 581,204 +544,789 -> 367,789 +508,424 -> 689,424 +23,964 -> 976,11 +404,728 -> 404,949 +327,891 -> 327,431 +596,204 -> 596,95 +686,201 -> 686,982 +132,836 -> 132,11 +574,434 -> 574,862 +41,60 -> 936,955 +283,246 -> 283,11 +29,226 -> 962,226 +483,916 -> 483,562 +962,913 -> 131,82 +455,316 -> 729,42 +858,503 -> 165,503 +795,68 -> 388,475 +697,477 -> 986,477 +932,633 -> 932,114 +376,730 -> 270,730 +598,672 -> 833,672 +69,46 -> 935,46 +178,95 -> 862,779 +633,73 -> 34,672 +488,690 -> 517,661 +784,450 -> 784,986 +955,560 -> 955,760 +651,959 -> 172,480 +406,330 -> 406,439 +955,737 -> 987,737 +194,272 -> 843,921 +18,553 -> 93,553 +422,387 -> 249,387 +318,79 -> 494,79 +181,814 -> 709,814 +63,62 -> 987,986 +636,357 -> 162,357 +973,15 -> 27,961 +444,415 -> 58,415 +884,531 -> 447,968 +320,928 -> 73,928 +154,357 -> 426,357 +200,482 -> 367,315 +505,872 -> 505,861 +314,432 -> 502,244 +912,676 -> 912,618 +683,590 -> 881,788 +761,708 -> 761,758 +40,941 -> 543,438 +847,370 -> 801,370 +701,297 -> 619,297 +140,618 -> 725,618 +72,24 -> 968,920 +767,396 -> 434,63 +710,918 -> 213,421 +917,770 -> 92,770 +20,979 -> 987,12 +909,62 -> 152,62 +932,987 -> 56,111 +460,382 -> 797,719 +518,388 -> 964,388 +456,299 -> 456,15 +84,783 -> 786,783 +982,669 -> 58,669 +140,156 -> 140,130 +613,264 -> 613,582 +267,636 -> 267,805 +141,631 -> 762,631 +575,26 -> 243,358 +318,900 -> 704,514 +118,914 -> 118,757 +952,846 -> 99,846 +673,353 -> 673,633 +422,130 -> 228,130 +738,52 -> 717,73 +307,307 -> 126,307 +484,161 -> 942,619 +576,886 -> 52,362 +375,297 -> 505,297 +950,82 -> 243,789 +411,57 -> 411,844 +879,137 -> 879,334 +483,703 -> 483,213 +192,24 -> 74,142 +561,286 -> 263,584 +493,121 -> 493,604 +715,576 -> 715,945 +238,258 -> 461,258 +331,470 -> 851,470 +435,22 -> 435,273 +315,377 -> 135,557 +128,195 -> 794,861 +391,143 -> 391,580 +33,680 -> 814,680 +611,50 -> 611,79 +650,28 -> 650,57 +196,538 -> 622,964 +333,222 -> 333,457 +313,254 -> 803,254 +508,581 -> 41,581 +40,411 -> 55,411 +458,600 -> 775,283 +105,678 -> 105,345 +397,546 -> 814,963 +915,669 -> 915,793 +773,952 -> 395,574 +884,198 -> 404,198 +408,929 -> 408,623 +123,158 -> 340,158 +418,927 -> 757,588 +304,338 -> 304,990 +505,184 -> 505,28 +938,869 -> 938,181 +11,959 -> 949,21 +232,949 -> 232,660 +479,826 -> 479,69 +323,427 -> 834,427 +460,385 -> 460,94 +199,529 -> 493,823 +767,58 -> 134,691 +901,320 -> 861,320 +31,354 -> 28,354 +335,165 -> 980,810 +586,394 -> 277,394 +106,807 -> 567,346 +814,987 -> 79,987 +166,766 -> 166,990 +883,213 -> 676,420 +458,454 -> 936,454 +878,953 -> 878,682 +868,340 -> 868,503 +778,252 -> 778,159 +237,611 -> 928,611 +221,357 -> 643,779 +793,775 -> 509,491 +719,78 -> 719,878 +764,722 -> 107,65 +696,323 -> 696,816 +49,726 -> 385,726 +730,974 -> 386,974 +973,310 -> 973,748 +12,173 -> 200,173 +164,482 -> 473,482 +802,807 -> 648,807 +104,843 -> 747,843 +154,919 -> 802,271 +919,837 -> 150,837 +882,930 -> 882,752 +717,468 -> 461,468 +925,112 -> 925,329 +714,688 -> 714,66 +35,781 -> 737,79 +644,139 -> 819,139 +340,500 -> 340,195 +10,909 -> 524,909 +914,790 -> 82,790 +962,271 -> 257,976 +352,170 -> 352,239 +666,39 -> 614,39 +854,937 -> 818,901 +88,865 -> 852,101 +121,796 -> 907,10 +836,572 -> 836,649 +976,953 -> 976,54 +566,584 -> 566,216 +927,702 -> 927,703 +896,441 -> 896,741 +20,30 -> 958,968 +934,804 -> 238,804 +562,323 -> 12,323 +789,550 -> 356,550 +906,225 -> 906,886 +513,819 -> 513,157 +129,80 -> 977,928 +37,815 -> 50,802 +325,30 -> 899,604 +183,614 -> 647,614 +497,170 -> 662,170 +598,134 -> 228,134 +57,636 -> 57,390 +11,938 -> 649,300 +911,952 -> 850,952 +35,950 -> 698,950 +161,239 -> 536,239 +359,569 -> 359,238 +711,945 -> 599,945 +866,756 -> 866,987 +674,978 -> 96,400 +254,653 -> 254,590 +655,810 -> 256,810 +942,892 -> 394,344 +895,744 -> 895,408 +549,478 -> 395,478 +162,193 -> 162,527 +347,242 -> 823,242 +251,867 -> 251,77 +167,233 -> 285,233 +189,969 -> 866,292 +847,118 -> 52,913 +206,650 -> 131,725 +34,790 -> 34,824 +872,441 -> 475,838 +242,538 -> 718,62 +456,514 -> 233,514 +384,761 -> 640,761 +782,388 -> 782,949 +928,809 -> 928,618 +461,415 -> 869,823 +240,487 -> 215,487 +970,687 -> 737,920 +63,749 -> 63,493 +274,99 -> 462,99 +941,989 -> 58,106 +142,594 -> 788,594 +120,705 -> 535,705 +680,248 -> 631,248 +544,807 -> 544,737 +972,606 -> 972,706 +846,800 -> 84,38 +836,108 -> 35,909 +691,290 -> 691,377 +979,883 -> 293,197 +766,851 -> 955,851 +737,551 -> 713,551 +247,70 -> 247,592 +855,153 -> 715,13 +432,263 -> 797,263 +495,839 -> 184,839 +544,923 -> 544,45 +887,676 -> 875,676 +922,230 -> 922,900 +168,612 -> 31,749 +505,446 -> 625,326 +504,370 -> 504,511 +943,538 -> 943,784 +653,40 -> 653,712 +613,973 -> 760,973 +152,824 -> 550,426 +335,35 -> 57,313 +614,334 -> 614,938 +399,205 -> 961,767 +387,903 -> 583,903 +218,395 -> 190,395 +935,524 -> 935,402 +821,111 -> 821,372 +609,621 -> 220,621 +503,288 -> 467,324 +641,139 -> 641,369 +420,924 -> 420,532 +344,504 -> 344,698 +340,96 -> 169,96 +835,505 -> 640,700 +464,344 -> 464,133 +946,396 -> 946,10 +295,313 -> 437,171 +330,286 -> 291,286 +608,653 -> 608,613 +360,410 -> 749,410 +115,288 -> 115,334 +915,550 -> 915,858 +902,16 -> 143,775 +201,901 -> 170,932 +37,968 -> 987,18 +40,332 -> 586,878 +271,407 -> 271,858 +836,674 -> 624,674 +308,715 -> 361,715 +733,818 -> 449,818 +23,36 -> 862,875 +278,655 -> 685,655 +924,764 -> 924,913 +479,250 -> 850,621 +312,116 -> 468,272 +10,954 -> 891,73 +554,313 -> 918,677 +846,773 -> 846,476 +681,948 -> 681,961 +418,835 -> 263,835 +352,222 -> 557,222 +782,188 -> 782,11 +609,845 -> 954,845 +866,882 -> 310,882 +479,180 -> 119,540 +278,866 -> 140,866 +874,617 -> 505,617 +491,942 -> 280,942 +584,574 -> 839,829 +475,466 -> 620,466 +652,215 -> 652,85 +906,746 -> 906,824 +381,317 -> 749,685 +294,837 -> 294,165 +450,893 -> 430,893 +99,374 -> 99,864 +919,313 -> 99,313 +187,91 -> 187,304 +654,982 -> 654,324 +662,223 -> 471,223 +848,554 -> 848,13 +14,851 -> 14,855 +438,287 -> 531,287 +611,277 -> 309,277 +630,379 -> 630,99 +621,531 -> 787,531 +12,292 -> 12,11 +18,985 -> 162,985 +49,919 -> 530,438 +329,828 -> 369,868 +725,976 -> 725,267 +826,591 -> 826,562 +249,651 -> 280,651 +467,461 -> 759,461 +720,968 -> 745,968 +414,29 -> 54,389 +204,740 -> 91,853 +694,300 -> 694,393 +517,748 -> 517,231 +465,946 -> 718,946 +252,322 -> 902,972 +109,641 -> 692,641 +973,969 -> 104,100 +302,368 -> 302,914 +385,19 -> 385,192 +460,851 -> 387,851 +310,221 -> 660,571 +684,147 -> 642,147 +371,711 -> 169,913 +810,727 -> 810,559 +428,576 -> 88,236 +381,33 -> 655,307 +37,428 -> 37,68 +11,29 -> 962,980 +880,698 -> 227,45 +624,361 -> 624,351 +487,917 -> 183,613 +725,498 -> 725,889 +880,71 -> 27,924 +856,752 -> 274,752 +541,419 -> 516,419 +803,688 -> 152,37 +835,304 -> 964,304 +480,249 -> 74,655 +742,883 -> 213,883 +943,41 -> 378,41 +869,924 -> 869,563 From d007c37b5d048515ddcf3e8c749c8ef87471941f Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Mon, 6 Dec 2021 07:35:49 +0100 Subject: [PATCH 256/433] 2021 Day 6 --- .../com/sbaars/adventofcode/common/Day.java | 2 +- .../sbaars/adventofcode/util/FetchInput.java | 6 ++-- .../sbaars/adventofcode/year21/days/Day6.java | 35 ++++++++++++++++--- src/main/resources/2021-examples/day6-1.txt | 1 + src/main/resources/2021-examples/day6-2.txt | 19 ++++++++++ src/main/resources/2021/day6.txt | 1 + 6 files changed, 57 insertions(+), 7 deletions(-) create mode 100644 src/main/resources/2021-examples/day6-1.txt create mode 100644 src/main/resources/2021-examples/day6-2.txt create mode 100644 src/main/resources/2021/day6.txt diff --git a/src/main/java/com/sbaars/adventofcode/common/Day.java b/src/main/java/com/sbaars/adventofcode/common/Day.java index faa733b6..2797e7e7 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Day.java +++ b/src/main/java/com/sbaars/adventofcode/common/Day.java @@ -102,7 +102,7 @@ protected LongStream dayNumberStream() { } protected LongStream dayNumberStream(String delimiter) { - return dayStream(delimiter).filter(e -> !e.isEmpty()).mapToLong(Long::parseLong); + return dayStream(delimiter).filter(e -> !e.isEmpty()).map(e -> e.replace("\n", "").trim()).mapToLong(Long::parseLong); } protected char[][] dayGrid() { diff --git a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java index 0142a569..431c1d1b 100644 --- a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java +++ b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java @@ -27,7 +27,7 @@ private FetchInput() { } public static void main(String[] args) { - new FetchInput().retrieveDay("5", "2021"); + new FetchInput().retrieveDay("6", "2021"); } private void retrieveDay(String day, String year) { @@ -48,7 +48,9 @@ private void retrieveExamples(String day, String year) { // Turn Windows line separators into *nix ones private String clean(String file){ - return file.replace("\r\n", "\n"); + return file + .replace("\r\n", "\n") + .replace(">", ">"); } private void runForYear(String year) { diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day6.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day6.java index 48f0b0bd..e9c295a0 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day6.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day6.java @@ -1,24 +1,51 @@ package com.sbaars.adventofcode.year21.days; +import com.sbaars.adventofcode.year19.util.LongCountMap; import com.sbaars.adventofcode.year21.Day2021; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.stream.Collectors; public class Day6 extends Day2021 { - public Day6() { + public Day6() throws IOException { super(6); } - public static void main(String[] args) { + public static void main(String[] args) throws IOException { new Day6().printParts(); + System.in.read(); +// new Day6().submitPart1(); + new Day6().submitPart2(); } @Override public Object part1() { - return ""; + var in = Arrays.stream(day().replace("\n", "").split(",")).map(e -> Long.parseLong(e)).collect(Collectors.toCollection(ArrayList::new)); + for(int j = 0; j<80; j++) { + int size = in.size(); + for (int i = 0; i < size; i++) { + if (in.get(i) == 0) in.add(8L); + in.set(i, in.get(i) > 0 ? in.get(i) - 1 : 6); + } + } + return in.size(); } @Override public Object part2() { - return ""; + var in = Arrays.stream(day().replace("\n", "").split(",")).map(e -> Long.parseLong(e)).collect(Collectors.toCollection(ArrayList::new)); + LongCountMap cm = new LongCountMap<>(); + for(var i : in) cm.increment(i); + LongCountMap nc = new LongCountMap<>(); + for(int j = 0; j<256; j++) { + for(var e : cm.entrySet()) { + if(e.getKey() == 0){ nc.increment(8L, e.getValue()); nc.increment(6L, e.getValue()); }else {nc.increment(e.getKey()-1, e.getValue()); } + } + cm = nc; + nc = new LongCountMap<>(); + } + return cm.values().stream().mapToLong(e -> e).sum(); } } diff --git a/src/main/resources/2021-examples/day6-1.txt b/src/main/resources/2021-examples/day6-1.txt new file mode 100644 index 00000000..a7af2b1c --- /dev/null +++ b/src/main/resources/2021-examples/day6-1.txt @@ -0,0 +1 @@ +3,4,3,1,2 \ No newline at end of file diff --git a/src/main/resources/2021-examples/day6-2.txt b/src/main/resources/2021-examples/day6-2.txt new file mode 100644 index 00000000..09e953e1 --- /dev/null +++ b/src/main/resources/2021-examples/day6-2.txt @@ -0,0 +1,19 @@ +Initial state: 3,4,3,1,2 +After 1 day: 2,3,2,0,1 +After 2 days: 1,2,1,6,0,8 +After 3 days: 0,1,0,5,6,7,8 +After 4 days: 6,0,6,4,5,6,7,8,8 +After 5 days: 5,6,5,3,4,5,6,7,7,8 +After 6 days: 4,5,4,2,3,4,5,6,6,7 +After 7 days: 3,4,3,1,2,3,4,5,5,6 +After 8 days: 2,3,2,0,1,2,3,4,4,5 +After 9 days: 1,2,1,6,0,1,2,3,3,4,8 +After 10 days: 0,1,0,5,6,0,1,2,2,3,7,8 +After 11 days: 6,0,6,4,5,6,0,1,1,2,6,7,8,8,8 +After 12 days: 5,6,5,3,4,5,6,0,0,1,5,6,7,7,7,8,8 +After 13 days: 4,5,4,2,3,4,5,6,6,0,4,5,6,6,6,7,7,8,8 +After 14 days: 3,4,3,1,2,3,4,5,5,6,3,4,5,5,5,6,6,7,7,8 +After 15 days: 2,3,2,0,1,2,3,4,4,5,2,3,4,4,4,5,5,6,6,7 +After 16 days: 1,2,1,6,0,1,2,3,3,4,1,2,3,3,3,4,4,5,5,6,8 +After 17 days: 0,1,0,5,6,0,1,2,2,3,0,1,2,2,2,3,3,4,4,5,7,8 +After 18 days: 6,0,6,4,5,6,0,1,1,2,6,0,1,1,1,2,2,3,3,4,6,7,8,8,8,8 diff --git a/src/main/resources/2021/day6.txt b/src/main/resources/2021/day6.txt new file mode 100644 index 00000000..ac8320d3 --- /dev/null +++ b/src/main/resources/2021/day6.txt @@ -0,0 +1 @@ +2,5,5,3,2,2,5,1,4,5,2,1,5,5,1,2,3,3,4,1,4,1,4,4,2,1,5,5,3,5,4,3,4,1,5,4,1,5,5,5,4,3,1,2,1,5,1,4,4,1,4,1,3,1,1,1,3,1,1,2,1,3,1,1,1,2,3,5,5,3,2,3,3,2,2,1,3,1,3,1,5,5,1,2,3,2,1,1,2,1,2,1,2,2,1,3,5,4,3,3,2,2,3,1,4,2,2,1,3,4,5,4,2,5,4,1,2,1,3,5,3,3,5,4,1,1,5,2,4,4,1,2,2,5,5,3,1,2,4,3,3,1,4,2,5,1,5,1,2,1,1,1,1,3,5,5,1,5,5,1,2,2,1,2,1,2,1,2,1,4,5,1,2,4,3,3,3,1,5,3,2,2,1,4,2,4,2,3,2,5,1,5,1,1,1,3,1,1,3,5,4,2,5,3,2,2,1,4,5,1,3,2,5,1,2,1,4,1,5,5,1,2,2,1,2,4,5,3,3,1,4,4,3,1,4,2,4,4,3,4,1,4,5,3,1,4,2,2,3,4,4,4,1,4,3,1,3,4,5,1,5,4,4,4,5,5,5,2,1,3,4,3,2,5,3,1,3,2,2,3,1,4,5,3,5,5,3,2,3,1,2,5,2,1,3,1,1,1,5,1 From ce39aa31d4903a72c49cb926e5562fb0c99473f9 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Mon, 6 Dec 2021 07:54:02 +0100 Subject: [PATCH 257/433] Refactor day 6 2021 --- .../year19/util/LongCountMap.java | 11 ++++++ .../sbaars/adventofcode/year21/days/Day6.java | 38 +++++++++---------- 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year19/util/LongCountMap.java b/src/main/java/com/sbaars/adventofcode/year19/util/LongCountMap.java index c77ecd48..32dca808 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/util/LongCountMap.java +++ b/src/main/java/com/sbaars/adventofcode/year19/util/LongCountMap.java @@ -3,6 +3,7 @@ import java.util.HashMap; import java.util.Map; import java.util.stream.Collectors; +import java.util.stream.LongStream; public class LongCountMap extends HashMap { /** @@ -55,4 +56,14 @@ public void incrementAll(LongCountMap input) { increment(i.getKey(), i.getValue()); } } + + public long sumValues() { + return values().stream().mapToLong(e -> e).sum(); + } + + public static LongCountMap ofFrequencies(LongStream frequencies) { + var lcm = new LongCountMap(); + frequencies.forEach(lcm::increment); + return lcm; + } } diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day6.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day6.java index e9c295a0..fc211983 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day6.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day6.java @@ -3,9 +3,6 @@ import com.sbaars.adventofcode.year19.util.LongCountMap; import com.sbaars.adventofcode.year21.Day2021; import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.stream.Collectors; public class Day6 extends Day2021 { @@ -15,37 +12,36 @@ public Day6() throws IOException { public static void main(String[] args) throws IOException { new Day6().printParts(); - System.in.read(); +// System.in.read(); // new Day6().submitPart1(); - new Day6().submitPart2(); +// new Day6().submitPart2(); } @Override public Object part1() { - var in = Arrays.stream(day().replace("\n", "").split(",")).map(e -> Long.parseLong(e)).collect(Collectors.toCollection(ArrayList::new)); - for(int j = 0; j<80; j++) { - int size = in.size(); - for (int i = 0; i < size; i++) { - if (in.get(i) == 0) in.add(8L); - in.set(i, in.get(i) > 0 ? in.get(i) - 1 : 6); - } - } - return in.size(); + return countFishes(80); } @Override public Object part2() { - var in = Arrays.stream(day().replace("\n", "").split(",")).map(e -> Long.parseLong(e)).collect(Collectors.toCollection(ArrayList::new)); - LongCountMap cm = new LongCountMap<>(); - for(var i : in) cm.increment(i); - LongCountMap nc = new LongCountMap<>(); - for(int j = 0; j<256; j++) { + return countFishes(256); + } + + private long countFishes(int iterations) { + var cm = LongCountMap.ofFrequencies(dayNumberStream(",")); + var nc = new LongCountMap(); + for(int j = 0; j(); } - return cm.values().stream().mapToLong(e -> e).sum(); + return cm.sumValues(); } } From 58cfafd5c027736df1768a6c7e48c4ccd2b39f0c Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Tue, 7 Dec 2021 06:19:52 +0100 Subject: [PATCH 258/433] 2021 Day 7 --- .../sbaars/adventofcode/util/FetchInput.java | 2 +- .../sbaars/adventofcode/year21/days/Day2.java | 2 - .../sbaars/adventofcode/year21/days/Day3.java | 2 - .../sbaars/adventofcode/year21/days/Day4.java | 2 - .../sbaars/adventofcode/year21/days/Day5.java | 2 - .../sbaars/adventofcode/year21/days/Day6.java | 3 -- .../sbaars/adventofcode/year21/days/Day7.java | 38 +++++++++++++++++-- src/main/resources/2021-examples/day7-1.txt | 1 + src/main/resources/2021/day7.txt | 1 + 9 files changed, 38 insertions(+), 15 deletions(-) create mode 100644 src/main/resources/2021-examples/day7-1.txt create mode 100644 src/main/resources/2021/day7.txt diff --git a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java index 431c1d1b..3b45d010 100644 --- a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java +++ b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java @@ -27,7 +27,7 @@ private FetchInput() { } public static void main(String[] args) { - new FetchInput().retrieveDay("6", "2021"); + new FetchInput().retrieveDay("7", "2021"); } private void retrieveDay(String day, String year) { diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day2.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day2.java index 11f77846..6e01b4e3 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day2.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day2.java @@ -15,8 +15,6 @@ public Day2() { public static void main(String[] args) { new Day2().printParts(); -// new Day2().submitPart1(); -// new Day2().submitPart2(); } @Override diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day3.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day3.java index 51807f84..efdd7ac6 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day3.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day3.java @@ -13,8 +13,6 @@ public Day3() { public static void main(String[] args) { new Day3().printParts(); -// new Day3().submitPart1(); -// new Day3().submitPart2(); } @Override diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day4.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day4.java index 2b25d6ae..7500ef66 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day4.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day4.java @@ -16,8 +16,6 @@ public Day4() { public static void main(String[] args) { new Day4().printParts(); -// new Day4().submitPart1(); -// new Day4().submitPart2(); } @Override diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day5.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day5.java index ad634f95..a77de10c 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day5.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day5.java @@ -15,8 +15,6 @@ public Day5() { public static void main(String[] args) { new Day5().printParts(1); -// new Day5().submitPart1(); -// new Day5().submitPart2(); } @Override diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day6.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day6.java index fc211983..6d24cd97 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day6.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day6.java @@ -12,9 +12,6 @@ public Day6() throws IOException { public static void main(String[] args) throws IOException { new Day6().printParts(); -// System.in.read(); -// new Day6().submitPart1(); -// new Day6().submitPart2(); } @Override diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day7.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day7.java index b67d7af6..3de2c08f 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day7.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day7.java @@ -1,6 +1,11 @@ package com.sbaars.adventofcode.year21.days; +import static java.lang.Math.toIntExact; + import com.sbaars.adventofcode.year21.Day2021; +import java.io.IOException; +import java.math.BigInteger; +import java.util.stream.LongStream; public class Day7 extends Day2021 { @@ -8,17 +13,44 @@ public Day7() { super(7); } - public static void main(String[] args) { + public static void main(String[] args) throws IOException { new Day7().printParts(); + System.in.read(); +// new D?ay7().submitPart1(); + new Day7().submitPart2(); } @Override public Object part1() { - return ""; + var in = dayNumbers(","); + + return LongStream.of(in).map(e -> sol(in, e)).min().getAsLong(); + } + + private long sol(long[] nums, long guess){ + long sol = 0; + for(long n : nums){ + sol += guess > n ? guess-n : n-guess; + } + return sol; + } + + private BigInteger sol2(long[] nums, long guess){ + BigInteger sol = new BigInteger("0"); + for(long n : nums){ + sol = sol.add(guess > n ? fac(toIntExact(guess-n)) : fac(toIntExact(n-guess))); + } + return sol; + } + + public BigInteger fac(long n) { + return new BigInteger(Long.toString(n*(n+1)/2)); } @Override public Object part2() { - return ""; + var in = dayNumbers(","); + + return LongStream.of(in).mapToObj(e -> sol2(in, e)).reduce((a,b) -> a.compareTo(b) == -1 ? a : b).get(); } } diff --git a/src/main/resources/2021-examples/day7-1.txt b/src/main/resources/2021-examples/day7-1.txt new file mode 100644 index 00000000..2bdd92f4 --- /dev/null +++ b/src/main/resources/2021-examples/day7-1.txt @@ -0,0 +1 @@ +16,1,2,0,4,2,7,1,2,14 \ No newline at end of file diff --git a/src/main/resources/2021/day7.txt b/src/main/resources/2021/day7.txt new file mode 100644 index 00000000..9ee8ca0f --- /dev/null +++ b/src/main/resources/2021/day7.txt @@ -0,0 +1 @@ +1101,1,29,67,1102,0,1,65,1008,65,35,66,1005,66,28,1,67,65,20,4,0,1001,65,1,65,1106,0,8,99,35,67,101,99,105,32,110,39,101,115,116,32,112,97,115,32,117,110,101,32,105,110,116,99,111,100,101,32,112,114,111,103,114,97,109,10,51,13,782,658,1369,575,693,395,898,552,57,374,155,541,279,428,338,390,0,181,952,350,123,57,483,449,715,672,619,910,254,308,104,682,560,928,406,4,1328,878,36,1397,1111,1586,548,106,284,20,462,1248,1033,229,108,336,888,289,464,757,19,58,1,262,1202,576,101,928,265,781,145,829,1183,1220,181,194,1181,11,792,1542,1330,728,273,493,1753,327,1736,33,1547,750,1623,374,1603,26,116,169,1270,191,11,47,312,136,46,486,1478,28,64,258,74,351,85,105,1137,531,1573,56,676,532,141,955,98,4,541,1546,1771,432,844,228,103,281,404,2,1431,865,1094,12,134,483,152,308,135,135,257,439,5,174,906,148,1000,160,304,190,478,199,395,693,257,84,148,140,76,354,595,1,633,284,24,83,782,1359,1187,351,290,704,23,692,952,1417,192,868,349,56,936,279,277,115,1579,476,261,50,46,1144,568,11,495,170,726,888,548,509,1265,179,93,834,180,143,866,899,292,958,126,1608,1066,327,1149,74,227,346,110,736,592,989,27,12,123,325,650,49,76,0,299,85,261,729,1135,46,479,879,226,1146,781,852,426,184,274,1323,449,419,90,758,378,134,219,333,833,55,59,358,175,293,36,100,27,764,564,188,814,612,299,1057,829,322,235,122,330,280,1397,654,370,320,770,1082,92,1513,1085,563,455,322,664,14,1122,40,381,750,145,381,422,553,227,20,503,368,43,316,71,479,438,222,204,355,67,264,882,1168,416,14,74,371,293,3,1005,237,422,570,1391,818,451,987,529,79,28,664,454,820,1425,50,49,32,486,397,680,1247,207,6,742,84,1362,540,233,1082,847,28,199,84,111,858,362,23,1755,61,144,652,82,1379,372,329,900,255,850,1006,21,1345,252,938,214,394,12,333,354,834,298,132,246,167,140,423,50,35,463,1502,390,672,2,123,78,588,1202,523,1507,64,68,130,511,263,734,112,1463,1097,99,552,53,1189,343,496,16,260,225,1065,855,12,24,88,958,848,173,1131,1639,559,344,216,19,872,287,288,911,775,1722,1049,17,223,375,378,1109,977,520,350,138,376,75,638,284,167,328,467,146,1379,947,149,890,661,56,1339,148,346,693,52,812,963,198,120,1194,231,7,1558,148,545,325,1038,57,52,936,117,531,684,266,687,394,851,1068,571,627,558,172,998,909,1403,358,13,419,0,1247,81,46,647,833,1370,340,287,74,51,691,198,129,257,769,108,163,480,295,150,1944,1897,161,1081,1521,733,351,376,126,191,94,228,76,957,652,487,805,10,347,217,394,1142,725,780,50,234,654,233,119,1035,226,110,757,75,6,13,649,396,13,191,115,368,60,731,485,621,1454,669,518,29,41,495,768,504,209,222,1168,34,1061,1654,973,979,55,802,139,489,386,757,1258,1720,757,994,172,572,266,15,267,830,1105,30,112,188,26,54,205,1206,1193,688,8,1149,1355,983,1073,434,62,1242,264,181,146,8,20,968,418,607,105,22,221,392,127,388,1055,98,241,58,805,2,801,925,241,931,1184,472,563,167,398,388,1290,111,237,1167,332,293,166,51,319,201,40,128,58,90,270,525,1171,1222,1129,1657,525,427,69,340,547,1486,174,383,900,763,160,193,696,896,477,564,558,870,294,868,951,267,178,454,35,1042,627,1451,740,2,107,4,632,114,754,83,244,43,699,83,1001,226,404,956,522,73,505,193,662,548,525,110,1241,415,794,1954,1062,1217,32,98,4,355,143,146,900,369,1418,250,404,703,469,34,326,62,231,564,44,655,511,1139,1010,1438,354,1117,591,118,509,496,1438,232,1179,526,259,984,643,169,165,50,1136,86,702,412,1762,62,219,1089,687,10,29,330,893,1658,732,48,806,1158,854,14,44,548,627,811,41,1212,341,474,943,25,699,204,1449,769,134,23,28,1216,622,1371,366,233,8,29,615,16,166,256,324,169,657,21,854,674,10,1217,1499,1512,88,369,771,60,317,28,1251,14,1318,376,264,55,658,1873,1280,581,850,147,267,1147,150,6,18,1166,331,163,281,773,1284,501,588,1055,681,41,506,270,104,1212,440,181,1177,257,1444,406,111,662,75,28,214,892,349,380,1677,1885,88,398,713,1596,99,541,219,149,1222,455,29,78,217,618,33,94,335,1050,848,958,67,12,61,9,1133,96,151,1057,60,167,324,99,49,1159,571,270,1291,217,276,42,8,20,652,949,134,132,552,365,112,355,952,167,33,1053,994,445,277,652,569,1594,248 From fb2092d57e9963bf9b706b2d28f44a7ab4465c9b Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Tue, 7 Dec 2021 06:27:41 +0100 Subject: [PATCH 259/433] Day 7 refactored --- .../sbaars/adventofcode/year21/days/Day7.java | 36 ++++++------------- 1 file changed, 11 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day7.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day7.java index 3de2c08f..4a60b82b 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day7.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day7.java @@ -1,10 +1,7 @@ package com.sbaars.adventofcode.year21.days; -import static java.lang.Math.toIntExact; - import com.sbaars.adventofcode.year21.Day2021; import java.io.IOException; -import java.math.BigInteger; import java.util.stream.LongStream; public class Day7 extends Day2021 { @@ -15,42 +12,31 @@ public Day7() { public static void main(String[] args) throws IOException { new Day7().printParts(); - System.in.read(); -// new D?ay7().submitPart1(); - new Day7().submitPart2(); } @Override public Object part1() { - var in = dayNumbers(","); + return input().map(this::sol).min().getAsLong(); + } - return LongStream.of(in).map(e -> sol(in, e)).min().getAsLong(); + private LongStream input() { + return dayNumberStream(","); } - private long sol(long[] nums, long guess){ - long sol = 0; - for(long n : nums){ - sol += guess > n ? guess-n : n-guess; - } - return sol; + private long sol(long guess){ + return getSteps(guess).sum(); } - private BigInteger sol2(long[] nums, long guess){ - BigInteger sol = new BigInteger("0"); - for(long n : nums){ - sol = sol.add(guess > n ? fac(toIntExact(guess-n)) : fac(toIntExact(n-guess))); - } - return sol; + private LongStream getSteps(long guess) { + return input().map(n -> guess > n ? guess - n : n - guess); } - public BigInteger fac(long n) { - return new BigInteger(Long.toString(n*(n+1)/2)); + private long sol2(long guess){ + return getSteps(guess).map(n -> n*(n+1)/2).sum(); } @Override public Object part2() { - var in = dayNumbers(","); - - return LongStream.of(in).mapToObj(e -> sol2(in, e)).reduce((a,b) -> a.compareTo(b) == -1 ? a : b).get(); + return input().map(this::sol2).min().getAsLong(); } } From 3eb9d3846d4c9f70a6e25d45171dd18447dc8753 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Tue, 7 Dec 2021 07:37:15 +0100 Subject: [PATCH 260/433] Clean up --- src/main/java/com/sbaars/adventofcode/year21/days/Day7.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day7.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day7.java index 4a60b82b..f4c454ba 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day7.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day7.java @@ -1,5 +1,8 @@ package com.sbaars.adventofcode.year21.days; +import static java.lang.Math.max; +import static java.lang.Math.min; + import com.sbaars.adventofcode.year21.Day2021; import java.io.IOException; import java.util.stream.LongStream; @@ -28,7 +31,7 @@ private long sol(long guess){ } private LongStream getSteps(long guess) { - return input().map(n -> guess > n ? guess - n : n - guess); + return input().map(n -> max(guess, n) - min(guess, n)); } private long sol2(long guess){ From 8b45b83c0c2935356d7559bf5515279dbe5cd507 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Wed, 8 Dec 2021 08:06:41 +0100 Subject: [PATCH 261/433] 2021 Day 8 --- .../sbaars/adventofcode/util/FetchInput.java | 2 +- .../sbaars/adventofcode/year21/days/Day8.java | 90 +++++++- src/main/resources/2021-examples/day8-1.txt | 17 ++ src/main/resources/2021-examples/day8-2.txt | 2 + src/main/resources/2021-examples/day8-3.txt | 10 + src/main/resources/2021/day8.txt | 200 ++++++++++++++++++ 6 files changed, 317 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/2021-examples/day8-1.txt create mode 100644 src/main/resources/2021-examples/day8-2.txt create mode 100644 src/main/resources/2021-examples/day8-3.txt create mode 100644 src/main/resources/2021/day8.txt diff --git a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java index 3b45d010..c962cc8f 100644 --- a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java +++ b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java @@ -27,7 +27,7 @@ private FetchInput() { } public static void main(String[] args) { - new FetchInput().retrieveDay("7", "2021"); + new FetchInput().retrieveDay("8", "2021"); } private void retrieveDay(String day, String year) { diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java index b4a5072b..7d96acdd 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java @@ -1,6 +1,16 @@ package com.sbaars.adventofcode.year21.days; +import static com.google.common.collect.ObjectArrays.concat; +import static java.util.Arrays.asList; + import com.sbaars.adventofcode.year21.Day2021; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; public class Day8 extends Day2021 { @@ -8,17 +18,91 @@ public Day8() { super(8); } - public static void main(String[] args) { + public static void main(String[] args) throws IOException { new Day8().printParts(); +// System.in.read(); +// new Day8().submitPart1(); +// new Day8().submitPart2(); } @Override public Object part1() { - return ""; + //System.out.println(Arrays.toString(dayStream().flatMap(e -> Stream.of(e.split(" "))).filter(e -> e.length() == 2 || e.length() == 3 || e.length() == 4 || e.length() == 7).toArray())); + return dayStream().filter(e -> !e.isBlank()).map(e -> e.split("\\|")[1]).flatMap(e -> Stream.of(e.split(" "))).filter(e -> e.length() == 2 || e.length() == 3 || e.length() == 4 || e.length() == 7).count(); } @Override public Object part2() { - return ""; + return dayStream() +// .peek(System.out::println) + .filter(e -> !e.isBlank()).map(e -> e.split("\\|")) + .map(e -> new String[][]{e[0].split(" "), Arrays.stream(e[1].split(" ")).filter(f -> !f.isBlank()).toArray(String[]::new)}) +// .peek(e -> System.out.println(Arrays.toString(e[1]))) + .mapToInt(line -> Integer.parseInt(Stream.of(line[1]).map(e -> getNum(concat(line[0], line[1], String.class), e)).collect(Collectors.joining()))) +// .peek(e -> System.out.println(e)) + .sum(); + + } + + private String getNum(String[] line, String w) { + if(w.length() == 2){ + return "1"; + } else if(w.length() == 3) { + return "7"; + } else if(w.length() == 4) { + return "4"; + } else if(w.length() == 7) { + return "8"; + } else if(w.length() == 6) { + String unique1 = getUnique1(line); + if(w.contains(unique1)) { + return "6"; + } else return "9"; + } else if(w.length() == 5) { + String unique1 = getUnique1(line); + if(w.contains(unique1)) { + return "2"; + } + String unique2 = getUnique2(line); + if(w.contains(unique2)){ + return "3"; + } else return "5"; + } else throw new IllegalStateException("Unrecognized word "+w); + } + + private String getUnique1(String[] line){ + List l = asList(line); + List possible = new ArrayList<>(asList((int)'a', (int)'b', (int)'c', (int)'d', (int)'e', (int)'f', (int)'g')); + l.stream().filter(e -> e.length() >=2 && e.length() <=4).forEach(e -> e.chars().forEach(i -> possible.remove(Integer.valueOf(i)))); +// System.out.println(Arrays.toString(possible.stream().map(e -> (char)e.intValue()).toArray())); + if(possible.size()>1){ +// System.out.println(Arrays.toString(getPotentialUniques(line).stream().filter(e -> possible.contains(e)).toArray())); + return Character.toString(getPotentialUniques(line).stream().filter(e -> possible.contains(e)).findAny().get()); + } + return Character.toString(possible.get(0)); + } + + public Set getPotentialUniques(String[] line){ + return Stream.of(line).filter(e -> e.length() == 6).map(e -> difference(e)).map(e -> (int)e.toCharArray()[0]).collect(Collectors.toSet()); + } + + private String getUnique2(String[] line){ + List l = asList(line); + List possible = new ArrayList<>(asList((int)'a', (int)'b', (int)'c', (int)'d', (int)'e', (int)'f', (int)'g')); + l.stream().filter(e -> e.length() >=2 && e.length() <=4) +// .peek(e -> System.out.println(e+", "+difference(e))) + .forEach(e -> difference(e).chars().forEach(i -> possible.remove(Integer.valueOf(i)))); +// System.out.println(Arrays.toString(possible.stream().map(e -> (char)e.intValue()).toArray())); + if(possible.size()>1){ +// System.out.println(Arrays.toString(getPotentialUniques(line).stream().filter(e -> possible.contains(e)).toArray())); + return Character.toString(getPotentialUniques(line).stream().filter(e -> possible.contains(e)).findAny().get()); + } + return Character.toString(possible.get(0)); + } + + private String difference(String a){ + var arr = new ArrayList<>(asList('a', 'b', 'c', 'd', 'e', 'f', 'g')); + arr.removeAll(a.chars().mapToObj(c -> (char) c).toList()); + return arr.stream().map(e -> e.toString()).collect(Collectors.joining()); } } diff --git a/src/main/resources/2021-examples/day8-1.txt b/src/main/resources/2021-examples/day8-1.txt new file mode 100644 index 00000000..83696f2e --- /dev/null +++ b/src/main/resources/2021-examples/day8-1.txt @@ -0,0 +1,17 @@ + 0: 1: 2: 3: 4: + aaaa .... aaaa aaaa .... +b c . c . c . c b c +b c . c . c . c b c + .... .... dddd dddd dddd +e f . f e . . f . f +e f . f e . . f . f + gggg .... gggg gggg .... + + 5: 6: 7: 8: 9: + aaaa aaaa aaaa aaaa aaaa +b . b . . c b c b c +b . b . . c b c b c + dddd dddd .... dddd dddd +. f e f . f e f . f +. f e f . f e f . f + gggg gggg .... gggg gggg diff --git a/src/main/resources/2021-examples/day8-2.txt b/src/main/resources/2021-examples/day8-2.txt new file mode 100644 index 00000000..0e7fc8dd --- /dev/null +++ b/src/main/resources/2021-examples/day8-2.txt @@ -0,0 +1,2 @@ +acedgfb cdfbe gcdfa fbcad dab cefabd cdfgeb eafb cagedb ab | +cdfeb fcadb cdfeb cdbaf \ No newline at end of file diff --git a/src/main/resources/2021-examples/day8-3.txt b/src/main/resources/2021-examples/day8-3.txt new file mode 100644 index 00000000..c9f629b7 --- /dev/null +++ b/src/main/resources/2021-examples/day8-3.txt @@ -0,0 +1,10 @@ +be cfbegad cbdgef fgaecd cgeb fdcge agebfd fecdb fabcd edb | fdgacbe cefdb cefbgd gcbe +edbfga begcd cbg gc gcadebf fbgde acbgfd abcde gfcbed gfec | fcgedb cgb dgebacf gc +fgaebd cg bdaec gdafb agbcfd gdcbef bgcad gfac gcb cdgabef | cg cg fdcagb cbg +fbegcd cbd adcefb dageb afcb bc aefdc ecdab fgdeca fcdbega | efabcd cedba gadfec cb +aecbfdg fbg gf bafeg dbefa fcge gcbea fcaegb dgceab fcbdga | gecf egdcabf bgf bfgea +fgeab ca afcebg bdacfeg cfaedg gcfdb baec bfadeg bafgc acf | gebdcfa ecba ca fadegcb +dbcfg fgd bdegcaf fgec aegbdf ecdfab fbedc dacgb gdcebf gf | cefg dcbef fcge gbcadfe +bdfegc cbegaf gecbf dfcage bdacg ed bedf ced adcbefg gebcd | ed bcgafe cdgba cbgef +egadfb cdbfeg cegd fecab cgb gbdefca cg fgcdab egfdb bfceg | gbdfcae bgc cg cgb +gcafb gcf dcaebfg ecagb gf abcdeg gaef cafbge fdbac fegbdc | fgae cfgab fg bagce diff --git a/src/main/resources/2021/day8.txt b/src/main/resources/2021/day8.txt new file mode 100644 index 00000000..8402be30 --- /dev/null +++ b/src/main/resources/2021/day8.txt @@ -0,0 +1,200 @@ +bg gcdaeb aebg efabdcg abdce cafdbe fcbdeg bdacg gbd cafgd | daecb dcbae gb eabg +eabfdc fgd cegd aedgf fbacgd dceaf dg aebdcgf efbag edgfac | cgebadf dgce deafc acdbfg +dcgfb fe bcgefd adecfb fgdec dfe egadc fadgceb facbgd befg | fdacgb fbcdg dcefbg bcdfg +gebdcf eg ecgabd gabed agdfb dbace fgbacde facebd egd gcea | agdbe gde deg agcebd +efb fgeacbd efcdb adfe fcdabg cabfd dcebg deafcb cgbfae ef | bgcde adcgbf feb adfe +gfdcaeb cdgfa agefc cge cgadfb fegdbc ecda eagbf gdfcae ec | dfbecg degcaf gafcd cge +eacbdg gdfb dfcbge cgd egcdf gd bfedc aedcfb fcgea bdafceg | gd gcbefd begadcf gcd +gafced dcge ec gafcbde efgca agefb defabc eac cafdg dagbfc | fegba edcbagf efacg eca +ebfdc dbfae cbfgd agbecd ced ec dcefbga ecfg fgbdac fbedcg | ce ce cgadfb ecd +dgbfe gcbdaf cbegfa gfcda gadfce gbafedc ecg ce cgdfe aecd | efbcgda fbaegc cdae dcae +fca gcbfed ecadfbg fbgcda gfbdc cfadb afcbeg fa baced fagd | afc fdcbge af badcfg +fdegc defgacb acged gf deacfg cfg fbaecg abcgde dfag befcd | fgc egfdc cdaebg ebgcad +afgdbce ebfcd dfbecg bafged bg bcged egcda fabcde bdg fbgc | dbg gbd dgfeab fdebc +ecdbfa cage cdaegf dfgea cadbfge dbagfc ea dbfge efa cfdga | ea afe fgcad dgfcab +dafge cebf cgebd ecbgadf gbf bf debgf cdgfbe dbgcae gdacbf | defag edbcg becf bgf +gdb egfabc dbcfeg fagd gd abcde gdabfe fabge fcabedg debga | gfda bdg gaebf gbd +cbdfg fbcdgea ebdc bc cgb egfdb facgd egdfcb fbgade facbeg | gcfbd dbce dcbe fbdceg +fg afg agedcb fbdgeac gbfca eacgfd fceab cgabd bfdgac bgdf | bgdf afebgcd dbgafc bdfg +fbagced cegfd feabc dfbacg bg eagb bcaefd abegfc gfb ebfcg | gfb gb gbf gdfce +dfceba bdcaf decab ea bae acebdfg egabfd bdgec cbadgf efac | dcbeg bdceafg ae abcfd +gbfeac deagc geafc efgb agfcdeb dbacgf ecbfa cfg fg edbcaf | cgeda fegb aebfc gf +acgbfed cabdef gfbcde abced ca dbafgc adc fcedb feca aebdg | gecfdb caefdb baedcf cgeabfd +ed bdge dceagb gafceb dce cgaed bdgecfa gabec fdagc aedbfc | acdeg dce dcbega dfgca +ecgdb cbefdg fgbc cfegad cf fce fadeb bdgeac agecfbd fdcbe | fc bgdace cfe edfacg +ed fdbgc cfeab adbgfc adgebf ebdcf fgedbc gecd def dcgaebf | dfagbc bagdcf gdce ed +bgdfa gefbcd fdceab fe fabde edf caebd acfe deagbc dcbfeag | fe fbgedc abecdg fdebac +bafgde cfgba dcbag fcbgae dafc fdgebac da bdcagf gad cgdbe | dfca ad dga fcbgdea +abecgd agbec bcfegd gfacbde ca bafced fabeg acb cgbed agdc | gdceb cfdbage afbdgce begac +cfb gdafb dfcgba facbde cdefabg egdcf gfcbd cb agbc febgda | cb efbacd agbc cb +bdce dgaec dcefga dcaegb fbgae dba db afdbcg fceagbd gdabe | eagbdcf bd febgacd cebd +bad fgeab bd agfdce fcadeb agdec edbfgca dcbg bcegda edgba | dbfeac bfecda bfgecda dbgc +egcbfad gdfec faced ecdgfb decfga fac fa fdag cfbgae baced | gcfaed aedcfg fadg fa +ebfdc gadcfb fcgdea ace abcde ea gecdabf gdcba gbae dacbeg | bfdgac gadcb acbgd ae +gcafe abfged egfadbc fbdec dg gdebfc gfedc dbcg fcbead gde | gdbc faegc gde deagbfc +decabg gdcfa dfbca cgdefab bdegfa afcdeb bdcea bdf bf becf | aebdfc efbc dfegab bf +cdfegb gcdaf fa bfdacge egfa daf gdbac degcf adfecg ebcfda | cedgbaf fdgec afd gadcf +gd bcfde adegfc cegbfd gdc dgbe bdgcf gfaebcd cabfg edacfb | daecgf agbcf caebfd cbedaf +decbf ebcfg egcaf gfaecb gbf gaeb cadegf ecgfabd agdbfc gb | fgb dfcgae cfbge abfgce +bgfed cedgf cegabf gfc fc eagbdc caegd fcad dbaecgf dfceag | fcda efdbg fedgb bfaedcg +dcafbg aebdc fgdcb efc fgedca fe gbfe fdbagec cfebd cebdgf | gbef gfcbd cef ef +fabdgc cbd db cfgda cfabd eacgdf dagb abefdgc fbeac gdfcbe | bfdca ebdagfc dcb bdag +bgdface geabdc edabg aeb agec ea fcagbd acdfbe acdbg bdegf | cbedgaf bgcaed ea abfedc +abfeg fedbag fbegc dcgfbae fbgcd ec abefcg eafdcg fec aebc | gabef ec geabf fcgdb +gdcbef edfbg cg cafgbd gedc gcefb acfegdb eacbf dbfgea gcb | cgb bfdge gefbc agbfdc +gecbfad fdga debagc da bcdgaf abcfd abcfg bad dfebc aefbcg | cbfga dbcaf cfbda fgad +cbegdf cdga bfaecg egdfc dfaceg fbedagc dgeaf ga gfa efbda | gcdaef agf fga efdag +abd dcaf ad cbgefd abcge ecdbfag cbedf fgbade adebc acdebf | bagec dcfa ad dbaec +efcdb cedgaf edfcab dgecb dgbf egd baegc dg efdgbc gbefcda | afcdeb dg cfbdge gcbed +bgdfca bgf bfgac gdfc cedabg gabedf fdbagec cebfa gbdac fg | facbg cfagb abcgd edagbc +ebagdcf ecgbfa bgadf bdfac cfb cbdgfa ceadb cf dgcf fabdeg | cdfab eagfdb gdfeba fc +gbc bc fegac cfgeda gfcba acbe bcegfd abfgd dgaefcb ecbgfa | edfbgc ecab cbfag efagdbc +de gacfeb fabce ecgbdf adbef cbgdeaf aced dfe bfadg fcabde | gbdefca daefb cgedfb cead +dbf edbfa bedcgfa begafc fdega db cadb facebd fcaeb fdcgbe | bcgfea cbefda fabce cabfe +fcb cegbdf fgdeb fcdeb cfdae cgdb cfgabe bc agcbfde aebfdg | gcdb fcb bdefg edfbg +gfead fgdcbe egdfacb gacd cdf ecgfda edacf adbgfe dc ebcfa | agdc fdc geacbfd fagdbe +gcfabe cefag dafg agecd ad decbg fcedgba cedafg cda ebcfda | aebcfd bfdeagc afecg cgbedaf +gcefdb aecbfgd fdegb ga fgcbda eagf aedgb dceba befdga gad | edagfb gad fgae ebgad +abdfge gfcea bcdg decabf gadbf cafgd dc cdf cdabgf dfceagb | gfdca bcagdf eagdbf dfc +ab dfagbe efbacd fba acfdeg efgad eabdgfc bfgea egcbf adgb | dafgbe gbafe ab dagbcef +febgd gbf bf cdebga gdebc bfcedg befc agcedfb cbgafd agfed | bf degaf gcdeb fbg +cegdfa db cafegdb decga gbd aedb gecfb bdcgfa cdagbe becdg | agbdefc cadbefg fgbce db +gcdfabe fcabg gafdc fbagec bf agbce gbf dcebga feab gcfdbe | cegba fb bdcgefa bgf +bfc cedafb bacfg gedcba acdbg dcfbega gdfb acfge bf adbgcf | fb fcb bf dfcbea +bdgca fca edfbac gcdf fc cbgeda afbgc afebg fbdgac gfeadbc | bfcdga adbfce gbedca cf +cf abdfce fabdg bcdgfa fgcb caebdfg cgdfa ecadg cdf gbedaf | fc acdfbg gcbf cfd +dcbea dfgcbe dbefag dcbaf cgfa fa cbgdf bfa begcfda adgfcb | fba abf edcbfg gcbdef +gd fgbacd geda dfecb cdg ceagb ecgdb dceafbg afcgeb cdebga | dacfbge efacgb eadg gdcbe +dfbcae fe bfcgea cefg fgeab fgdab dgecab fdgeabc eagbc aef | ef fbdcaeg aefcbg efa +fdcgb cdeabf gdafcb efcg bfagced fe gfebcd gdbfe feb bgeda | fcgbd fe bdegf gefc +cdgaeb gfeabdc dbfg bdc gcadbf fdbac db gcabf cgeafb eafcd | decfa bdfg bfadcg bd +fdgea ab eafb dafcge cdbaefg eadbgf edacbg fbdgc gfbad gba | ba ab ab gdbfae +bacdfe defab fbeg egfad dfbagce fg febgda gfdbca fga gdaec | dgbfac dcgae bedfa bfeg +feadb cbd fgbedac bdceag bcaf aefcdb cb decbf edgcf bfdeag | fabged egdcf fbgdace bfedca +cdafe agfedbc gebc aeb fegdba cabgfe cfbea dabcfg eb cbgfa | gacbdf egfbcad cadfe gcbe +deg dbecg abdce agcfebd dg defgcb fagecb febgda fcdg ebfgc | debfcg egcbafd cfadbeg cgdf +cebfad efc dbcfg gfdcbe cfdgba agfed ec becg dfgec gedbfac | bgfdc fce gfedc gbfadc +eabdcf bfcgd gabdfe bacfe bde eadc cbdagfe ebcfd ed afegcb | cdea fcgeba cbfgd bafdeg +gcdab bdafge dc aefcdg acbgfd bdfc cdg eagbc gdeacbf fgadb | dfbc gaedfbc bcfd bdcf +efdca gced dbagefc afdeg feagbd fce ce dcabf adcegf efcabg | gfebac ecafd adbegfc abfdc +bfadcg cgfda bc fbcegd fbac ebagd cagbd egcafbd cbd dfgaec | dbeag cb adgcb abdgfc +dgbef gbacf bcde cd degafc dbefag fcd gcdbf bedcfga cebfgd | cd bdcgf ebdc bagcf +gc fegdac dgefa cefab bcafdeg decg fcg dafbcg fegbda ecgfa | ceagf cg gfeca cgf +fbage cfdaegb dcfgb dbae gefacd de cbagef gfbed deg ebgdfa | fgdace fegcba ed dge +geb ebfacg gbeca gcbedf eafb egadc fbcag cfadbg fbecgad eb | fcgab baef bdagcf gfebac +egbcaf fcgab gaebdf bf dcfeabg befc aebgc bgf adcgf bgdaec | gbface dcbage fgb abcge +bgcdae fdab becadf fa beacd fae gebfc fdeagc acfeb ecabfgd | cfbea fdaebgc afe gfdeca +gefc bgadf dcebfa ef gcaebd dcbafeg cgdbef dbcge efd fgbed | acbfde gcbde dbecg fe +cadefb degbc degfb dc dfcabeg ced cabeg cbefga adgcbe agdc | efdbac acgd agebdc ecd +fcgbea gdfceb eadcb gdef gdbcafe fdc fdbec febgc bcgfda fd | cfd dfcegab dcbfga fd +gabdec dgfcea dagbe gf dgf cabgfed bagf befcd bfdage fbdge | gfcabed bfdge fagb abecdgf +abc gdcea cgbfad egcfabd eafb gfceb cfaebg fbdegc gecba ba | cab ab efcdbg efcgadb +bafdcg gdbaef cf abfc dceag fcg fadgb ebfgdac fdcga ecdgbf | gedfbc gadce adcge fcg +afb fadce dafcb ab degfbc abdcefg gabdcf fagbde bdfgc abgc | dfacbeg ebdagf afb acfdb +cfaedb dce edgcbaf bgdfc dcefb ce cbea fdgaec aebfd fgadeb | ced acgdef dfeagbc ce +egfcdb cdfgbea cgafb efgd gcdbae ecdabf bcdge df bfd fcdbg | cdebg df bfd dfebcg +gbecdfa ce ebacd dgafbc bec dfabc baedg bgacfe efdc fdbeca | cfdba ecb ec bgecfa +cadfbe bfgdeac gdeab ebfcg degfb dfag edf degabf gcebad fd | fgbed abcfde becgf begdf +fgd egdbf fgbce gcbaed dabeg dafe fd cagbefd bgedaf abfcdg | fadbgc df dfea adebfg +fdb gcadbfe fd acbde gdcf cfgbe gfbcde bdfec gabcfe ebagdf | dgfebc dgcf bfgec fcbgdea +dgcbf daegfcb ec cfae dbcega cge gbaecf fgbce fagedb befag | fcgbae cbgedaf bcfega fcae +cbadge eg dbecgf edbgf dcabef gecf fgbad ebg edbcf adcbfge | egb eafdbc geb bdfga +afebg gfcaeb bgfdce cfea af bgade fba bcefg edfgcab cadgbf | ebcfg cfageb gdbae egabd +agfdc fegb badfg fbcdgea dfbaec gdeab eafdgb abf bf cdaegb | gadbe cbdfae gdafeb gdabef +cgdeba gadcbf gebca ad afegbdc acgbfe gcade fegcd dac bdea | ebgcad becgda cad dac +becafdg gd cdg cgebfd efbcg cbaed febgac becdg bdfg ecfgda | cbgfe gd adcbe efdcagb +efcb aebgfd aecdfgb gdcaf bfa bf aecfgb cadebg gbfac ceabg | bcfe fb bf fcbe +bgaf bgedcfa ecdbfa cgfea gea baefc ag cgdfe gdcaeb ecfbga | gea ebcaf gfecd ega +adfegb degcb dgb bg adgfceb cdeagf acged gdecab abcg cfdbe | gedac gfbdace becgd ebgacd +af fgcdba bgecf bcfage dgcfeba cfa ebfa cegfbd fecag edgca | bgfaced fa fa cbgef +egbfcda deacb gfdacb fdcabe bgedc ae fade afbcd gfcaeb bae | ea bcaedfg gcaefb deaf +feagd becafg ebca eb geb cdafgb feabg faegcbd cebgdf bcagf | afcbeg afgcb facbgd fgdea +cdbfea efagd bafegc deb dgaecb dbgae db ecagdbf dbgc ecabg | gdaeb bdcg aegdcb agefd +abe cdbgafe cabef befgc fbadce ba facgde adfce bacged badf | abcedg adefc bfad bfda +beafc efdabc fbdgae dcaegbf beadc adcgb ecabfg decf de dea | egbdfa fedc febca fcabe +bd dbeg dcbfeg cgfad dfbgc ebcgf bgecaf cfadeb fbd abfdgce | deagcfb gfdca fbgec decbfg +febadgc df gecfa cebad fdeac fad gadebf dbfc eacdgb cfeadb | bafdcge afcdgeb cdgaebf fda +cgedabf debfga gfe fg gfba gacfed dfbeg bdfea dbcefa bdgec | dceagfb ebdfa dbfeg fadeb +egafcb cg ceg ebgcfad dacbef afedg gcbdea bcfae cefag gbcf | gdfea egc ecgaf fdgbcea +egfba adecfb gc cfg cfdbeg gdac eafgcd dfcea cgefa bfaecgd | gc aecdbf cgf dcbegf +abcfde eafbd dagfebc bgea aefdg dga dgbfac faebgd edcfg ga | eabg eabcgfd abeg deacbfg +ac fbgeda begcfa decgf gfcbad eagcbdf gbaef eabc gac egcaf | eafdgbc fgabdc agc cagfe +abdfg gefba ecafb eg egf febcdag egac beagfc edgcfb acbdfe | bcafed gfe eg febdgc +fgcba bge efgcab bfgae adbecg fcge defgcba bedfa abgcfd eg | ge abdef badef gfcdeab +gdecbf fcbdae acedf acfb cdbae cgdeba fc gafed fgacdbe ecf | bacf bdaecg cebad cfgdbea +abfcde fa afd degba cdgbeaf bafed eadcgf cbaf bdcfe cedbgf | dgbae bfedc fcba aedgbfc +egfadc ec ecbf abgcd gfdbae eac abedf fegacdb bcedfa cdbae | ce cdbga ceabd beagdf +bdcae bfc fb bfcdeg ebacgd aecfgdb bfdcea acdfg cbadf baef | cfbdae fbc abgedc fcb +bf afged adbegc ebfc gbadfce bdf fbcdeg bdcge efgdb fbadgc | cfeb ebcfgad febgcda fbd +fbeda dfega bf becda fba dfcb cagbed abfdec cfagbe aebdcfg | bdcf eacbd abdecg ebafdc +baecfd dg gbdc edagb bdaec ebgaf bcefadg dge eagcbd acgfde | deg dg deg bdacef +degabf gdbef cedg bgfcd dfacegb dcb dbgfec fcagb cedabf dc | gecd bdc gbedf acbfg +efdag ce cabe bcfdga egcad gcbad bdagce cde cdfebga dfgecb | agdec cde dagce cgade +adbgc bgecd ebdgcf dgafbce abcefg gefdab ec edcf dgfbe ebc | geabdfc edagbf efdc ec +deagf bdcf dgc fbegcd deabcfg cd edfgc aebgcd fecgab efcgb | gcefbd fbdc edcfbg efgbc +fbgedc bacged egbacf cbf gaecb fc fdcbeag ecaf cbgaf agdbf | cfagb bgacf eacbgd fgbca +abdeg gdcea bdfega fgadb eb bgfe aecdfb facbdg gdebfca abe | aeb efacdgb eba be +fcdgab cbgfa gc gfdc bcg fageb cbfgdea cgaebd fcdab dceafb | fcabg gc cfdg bcadfe +dfgcb ebgadc efb ecgba becfg feagbd cgebaf ceaf cgfbdea fe | fe bfe bef fcbgd +fabde cbdg gcbae fegbac acfgde edgab bedgacf deg cdbega gd | dcgb cgfeda eafdb egd +gfac bcaegf cf fcb ebcda edcbgaf dgfbce agfeb geafdb cabfe | ecadb fc ebadgf efcba +fbgcad bfcae cf afbeg dcfe cbf cbgaed ceadb bcedaf fabcged | adfegbc fbc ceabd fc +dabf dacbg fgabc db cgdafeb eacbgf cgfdba bgd dgcae gdfceb | bacegf cbgfed bd bd +dfec dgcabe cf bfdca fgadbce bfceag edabc fcb fdabg bcfeda | fbc bdfga efdc cbefag +edcbga fcagb gb dagcef fgeb egcfa dfbagec agb gcfeab dcfba | bcdefag ceagbfd efbg fecga +eacdgf cb ebc afgecb dbeaf cbfea ebfcdga edfgcb egafc acgb | efbad cebaf deafb aedbf +gedba fegdbc dgf deafg gceadf afcdeb gfca fg eadfc dbcfgea | gdacfbe gf faecbd egfad +fe gef adebgc fcde eadgc gfcaed bfcga gafce bdgcfea fbgeda | dabfge cefd afdgce feg +gafd feadbc cfbage ceabdgf edgcb acgbf ad fbadgc acdgb adb | ecbafd cdabg abd bad +gea defga egdc dafbg fbadec fbcega aedcf ge cgafde cabdfge | ge fdceag efcad cdbfea +gecdbfa bgdfca cdbfa ecdfba dgfca cbag ga ebdagf fdgec gaf | fgcdeab bcedaf gbca cgab +defcgb edcfg gcadf fac dgfcae bgafec cfagebd aced ac afdgb | afdcg dgfce fcegbad ac +eab cfdega ab bfgaec gbdfeca gdeca dfecb abgedc ebacd badg | gcafbed ecdagf bcfgade ba +cbd acdfbg bgefda cb fgedbc acfb bafdegc dgafb dbacg gaedc | bc baefgd gbdefa cb +edc gfead edgbfa efbca dc dcgbafe dcgf aecfd gafdce bdcgea | bfeca fbaec bfaec fdaec +dagef efgcbad gcbd ebagfc db eafcbd efcgb deb bedfg cfedgb | cgadbef bd dgacbfe befgd +gcefbad cebgaf efcgb bdge bdafc cdfgea de dfe bfdgec cebfd | dfecb de fdebc fde +fe aef cgbea dbfcga dfagce cbafed cebagdf cgeaf afcdg efgd | fadbce fe aegdcf ef +adbgf dcbfae cebgdaf bf gafde gdcba cdaegb fab gcbf dbcafg | adbgf gbedacf afb gcbaefd +cfagb geb dagbcf edbfa egdfacb efgba fcbeag eadcbg gecf eg | ge cfeg bafde afdbe +ge bfedca adgbf dfceb dfgaec egfbd gfcdbe fcgedba gebc ged | fcbde cgdafeb cdfaebg eg +cdebaf cgdefb fdbcega bdaf fgecad afc af abefc acgeb bcfde | abfd fbad fdecb geabc +edfga dcagb afgcbd facb dbegcf fb bgf gfcbdae gabfd cegadb | fbdcga fbdga fb gfb +dcegba dfb adbec cdbafe df fcbeg dbfce dfabcg edfa cbedafg | fd efgcb cbafed dagceb +afcbe cfa agbef bfgacd cf cgef cbgeafd aefbgc gefbad abcde | gfcabde afc fca fabgde +bacdge dfbc bc ecgfdab edgbcf cgafde gbaef cgefb ecb edfcg | bgdcef bgedafc cdaebgf cbfd +egdc cbdgfa def dcafe de dcgaf abefc dbaegf fdgcea ebgacfd | edgc gbcedaf fgcaed geadcfb +dbac bfdge cgb bcgde cb gbfdcea acfebg bdcgea adecfg edgca | dgeac feabcg aegcd gcb +dcbeg dcgef acdfg efabgcd dfaceb efgb fbcdge aegbcd ef efd | dfbcge bgef gcdef cfdag +dfgb gfc afcde egbcd cfgde cdbegf agbecf gf bcdeag fgdebca | becgd gf edgabc dfcabge +cd bdaefg cabfed cdgfbae bgceda eadbg egdc cabgd bcd fagbc | dbgac fedacb edbfacg dgce +acde faegd dfa bgeaf efacgd fbagcd da bcaefdg ecdgf febdgc | dfegc dgbcef adf cedfag +fag cbafe ecbfag gcbdf edfcba cgea bagefd agdcefb ag bagcf | fcabg ebagcf gdcfb egfbda +badf fgdbace gfced fdcea efacbd ade bcfeag ad cabef dacgbe | afbd edgcf fabd fagebc +ac cfdabge bgac gfade fdbgc dac dbcfge dgcfa dcgfba fbdcae | cbagdf geadf dbcagf adc +dcgba dc gadfeb fcdg baedcf aegbc dbacgf eagbfdc bdc gbdaf | abgcd cbd gbfad gbcea +bfagec fcbeg ce dfagcb bfcade ebc dfegb acgdbfe gcae agcbf | gcae afdgbec bfagc ebagfcd +bgacf gfdabc abgcef fdab cdbag decbg geadcf ebfacdg ad cad | bcaefg cgbdaf bgcaefd agbcf +fbadeg gbe dgcbea gb bcgd bdecgaf agecb cegda cefadg bacef | aedgc cgdb aegcd agdcef +gbecdf aefg eg gec bcefa gcbad egcba cefbad fecgab badfecg | ge afbec edfcba agcfdbe +fbga cedbf ba ebagdf baegdfc aeb bagced gfcdea bfead afged | gdafce ba eba efcdgab +beafdc bca defac ab edfcga edcbg cabed bacgdfe gbadcf eabf | cfdage cafbde efcbda cdgeaf +efg agfcde abgfd efbc cdebg febgd ef cdgbae fegbdc befgcad | ef efbc dfgba fge +acgfb eabgc cfdab fg afg gcef gfdbea becfag beafdcg gebcda | fgec gefc agbefc cgfdeba +adfeg cgdfeab feba fgeabd dgabe egbcfd aebgdc def cgdaf ef | febgda adfgc bgdcea gadfe +cgabf bcg bfgd edbcgaf acegf adbefc ebadcg bg cdbfa cbfdga | eadcbf deagfbc fcage dfbgac +dge ceabdg fdbce cedgb acfdgb cbdagfe gdabc gabe fdaceg ge | eg gde cdebf abecdg +cdage eagcf ade gebcaf faecgd gcbed abdfeg cdaf ad degbcfa | bdgec aegcd adcgbfe feacbg +debg gec dbfegca ge acdeb acgfd abegfc bcadge eadgc efdacb | cfdbae ge cgabef dgafc +gcfabe ed adcgf febac bgdfea dfaec deafcb acfbegd dcbe ade | fcgda dea fcdag de +bdfecg adgbefc dfbeg dabecf agefd gdba ad dfa faecg beadfg | cgfabed abdg cfdgbae adefbc +cdbge cbaegd cde afcdbg cbadegf efgadc agdcb fgcbe ed daeb | ecd ecd dcgeab dbcge +ebcg fbgae fbaec cefbgda ecf bdfac efbadg gfceda cfbage ec | cfdage ec caebgf cgeb +cgfbead fed fgecda dfeagb ecfg efcda cfbda fe dcbgae edacg | fedac efd ceadg cgdae +dgbae acbfedg acbe ceagd gacebd dgbefc cadfg ecg fdbaeg ec | dgfbae ec fedbcag abec +ecbgadf ab afbe fgcba fgcead bgfaec cgafe dgabec dfcgb abg | bafe bfea cgbdea ba +cf dfbce dfc befda abdefcg gaebdc dfacbg cefg gbdec fgbedc | cdf cabgdf cfdabg bgecd +gbadef bcfd gabedfc bd cbfag fegbac gcdab gafbdc dgeac bgd | db dbaegf gaebfd cgaed +ebgafc ecg agfcd ecab dbfgea eagcbfd edcbgf bgaef ce acegf | egbfa bcgfaed abec ce +acdfbg afgdb ea bea ebgda agecfbd bcgde cfgeab aefd defgba | agbed ae fgbaed defa +gcebadf ed bafce bgcfad daefb bfadg aefbgd fgcdeb daeg ebd | cdgfba ecbfdg edbaf gade From 138f95cbc38b7f8992e7db73b1a7c3bcd0d8be12 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Wed, 8 Dec 2021 12:38:29 +0100 Subject: [PATCH 262/433] Zero case --- .../com/sbaars/adventofcode/year21/days/Day8.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java index 7d96acdd..8f97e745 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java @@ -55,15 +55,20 @@ private String getNum(String[] line, String w) { return "8"; } else if(w.length() == 6) { String unique1 = getUnique1(line); +// System.out.println("Unique 1: "+unique1); if(w.contains(unique1)) { - return "6"; + if(fitsOneSeven(line, w)){ + return "0"; + } else return "6"; } else return "9"; } else if(w.length() == 5) { String unique1 = getUnique1(line); +// System.out.println("Unique 1: "+unique1); if(w.contains(unique1)) { return "2"; } String unique2 = getUnique2(line); +// System.out.println("Unique 2: "+unique2); if(w.contains(unique2)){ return "3"; } else return "5"; @@ -105,4 +110,12 @@ private String difference(String a){ arr.removeAll(a.chars().mapToObj(c -> (char) c).toList()); return arr.stream().map(e -> e.toString()).collect(Collectors.joining()); } + + private boolean fitsOneSeven(String[] line, String a){ + return Stream.of(line).filter(e -> e.length() == 2 || e.length() == 3).allMatch(e -> subset(e, a)); + } + + private boolean subset(String a, String b){ + return a.chars().allMatch(c -> b.chars().anyMatch(d -> d == c)); + } } From add2cc8b6f76978b36648ed3abb4de6b3a464f39 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Wed, 8 Dec 2021 12:45:21 +0100 Subject: [PATCH 263/433] Day 8 refactor --- .../sbaars/adventofcode/year21/days/Day8.java | 31 ++++++------------- .../sbaars/adventofcode/year21/days/Day9.java | 3 ++ 2 files changed, 12 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java index 8f97e745..305ef177 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java @@ -1,6 +1,5 @@ package com.sbaars.adventofcode.year21.days; -import static com.google.common.collect.ObjectArrays.concat; import static java.util.Arrays.asList; import com.sbaars.adventofcode.year21.Day2021; @@ -20,26 +19,22 @@ public Day8() { public static void main(String[] args) throws IOException { new Day8().printParts(); -// System.in.read(); -// new Day8().submitPart1(); -// new Day8().submitPart2(); } @Override public Object part1() { - //System.out.println(Arrays.toString(dayStream().flatMap(e -> Stream.of(e.split(" "))).filter(e -> e.length() == 2 || e.length() == 3 || e.length() == 4 || e.length() == 7).toArray())); - return dayStream().filter(e -> !e.isBlank()).map(e -> e.split("\\|")[1]).flatMap(e -> Stream.of(e.split(" "))).filter(e -> e.length() == 2 || e.length() == 3 || e.length() == 4 || e.length() == 7).count(); + return dayStream() + .map(e -> e.split("\\|")[1]).flatMap(e -> Stream.of(e.split(" "))) + .filter(e -> e.length() == 2 || e.length() == 3 || e.length() == 4 || e.length() == 7) + .count(); } @Override public Object part2() { return dayStream() -// .peek(System.out::println) .filter(e -> !e.isBlank()).map(e -> e.split("\\|")) .map(e -> new String[][]{e[0].split(" "), Arrays.stream(e[1].split(" ")).filter(f -> !f.isBlank()).toArray(String[]::new)}) -// .peek(e -> System.out.println(Arrays.toString(e[1]))) - .mapToInt(line -> Integer.parseInt(Stream.of(line[1]).map(e -> getNum(concat(line[0], line[1], String.class), e)).collect(Collectors.joining()))) -// .peek(e -> System.out.println(e)) + .mapToInt(line -> Integer.parseInt(Stream.of(line[1]).map(e -> getNum(line[0], e)).collect(Collectors.joining()))) .sum(); } @@ -55,7 +50,6 @@ private String getNum(String[] line, String w) { return "8"; } else if(w.length() == 6) { String unique1 = getUnique1(line); -// System.out.println("Unique 1: "+unique1); if(w.contains(unique1)) { if(fitsOneSeven(line, w)){ return "0"; @@ -63,12 +57,10 @@ private String getNum(String[] line, String w) { } else return "9"; } else if(w.length() == 5) { String unique1 = getUnique1(line); -// System.out.println("Unique 1: "+unique1); if(w.contains(unique1)) { return "2"; } String unique2 = getUnique2(line); -// System.out.println("Unique 2: "+unique2); if(w.contains(unique2)){ return "3"; } else return "5"; @@ -79,28 +71,23 @@ private String getUnique1(String[] line){ List l = asList(line); List possible = new ArrayList<>(asList((int)'a', (int)'b', (int)'c', (int)'d', (int)'e', (int)'f', (int)'g')); l.stream().filter(e -> e.length() >=2 && e.length() <=4).forEach(e -> e.chars().forEach(i -> possible.remove(Integer.valueOf(i)))); -// System.out.println(Arrays.toString(possible.stream().map(e -> (char)e.intValue()).toArray())); if(possible.size()>1){ -// System.out.println(Arrays.toString(getPotentialUniques(line).stream().filter(e -> possible.contains(e)).toArray())); - return Character.toString(getPotentialUniques(line).stream().filter(e -> possible.contains(e)).findAny().get()); + return Character.toString(getPotentialUniques(line).stream().filter(possible::contains).findAny().get()); } return Character.toString(possible.get(0)); } public Set getPotentialUniques(String[] line){ - return Stream.of(line).filter(e -> e.length() == 6).map(e -> difference(e)).map(e -> (int)e.toCharArray()[0]).collect(Collectors.toSet()); + return Stream.of(line).filter(e -> e.length() == 6).map(this::difference).map(e -> (int)e.toCharArray()[0]).collect(Collectors.toSet()); } private String getUnique2(String[] line){ List l = asList(line); List possible = new ArrayList<>(asList((int)'a', (int)'b', (int)'c', (int)'d', (int)'e', (int)'f', (int)'g')); l.stream().filter(e -> e.length() >=2 && e.length() <=4) -// .peek(e -> System.out.println(e+", "+difference(e))) .forEach(e -> difference(e).chars().forEach(i -> possible.remove(Integer.valueOf(i)))); -// System.out.println(Arrays.toString(possible.stream().map(e -> (char)e.intValue()).toArray())); if(possible.size()>1){ -// System.out.println(Arrays.toString(getPotentialUniques(line).stream().filter(e -> possible.contains(e)).toArray())); - return Character.toString(getPotentialUniques(line).stream().filter(e -> possible.contains(e)).findAny().get()); + return Character.toString(getPotentialUniques(line).stream().filter(possible::contains).findAny().get()); } return Character.toString(possible.get(0)); } @@ -108,7 +95,7 @@ private String getUnique2(String[] line){ private String difference(String a){ var arr = new ArrayList<>(asList('a', 'b', 'c', 'd', 'e', 'f', 'g')); arr.removeAll(a.chars().mapToObj(c -> (char) c).toList()); - return arr.stream().map(e -> e.toString()).collect(Collectors.joining()); + return arr.stream().map(Object::toString).collect(Collectors.joining()); } private boolean fitsOneSeven(String[] line, String a){ diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day9.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day9.java index ac8d798f..a067a809 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day9.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day9.java @@ -5,6 +5,9 @@ public class Day9 extends Day2021 { public Day9() { super(9); +// System.in.read(); +// new Day8().submitPart1(); +// new Day8().submitPart2(); } public static void main(String[] args) { From bdcc9f36e406fca6997a91817b27ec836d74866f Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Wed, 8 Dec 2021 13:51:52 +0100 Subject: [PATCH 264/433] Renaming --- README.md | 24 +++++++++++++++++++ .../sbaars/adventofcode/year21/days/Day8.java | 20 ++++++++-------- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 4cdfbb19..6b335c8f 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,30 @@ Part 2: 1158 Day 2: Part 1: 1507611 Part 2: 1880593125 + +Day 3: +Part 1: 3901196 +Part 2: 4412188 + +Day 4: +Part 1: 45031 +Part 2: 2568 + +Day 5: +Part 1: 6283 +Part 2: 18864 + +Day 6: +Part 1: 352151 +Part 2: 1601616884019 + +Day 7: +Part 1: 356992 +Part 2: 101268110 + +Day 8: +Part 1: 383 +Part 2: 998900 ``` ## 2020 diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java index 305ef177..2b42a965 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java @@ -49,25 +49,25 @@ private String getNum(String[] line, String w) { } else if(w.length() == 7) { return "8"; } else if(w.length() == 6) { - String unique1 = getUnique1(line); - if(w.contains(unique1)) { - if(fitsOneSeven(line, w)){ + String bottomLeft = getBottomLeft(line); + if(w.contains(bottomLeft)) { + if(getMiddle(line, w)){ return "0"; } else return "6"; } else return "9"; } else if(w.length() == 5) { - String unique1 = getUnique1(line); - if(w.contains(unique1)) { + String bottomLeft = getBottomLeft(line); + if(w.contains(bottomLeft)) { return "2"; } - String unique2 = getUnique2(line); - if(w.contains(unique2)){ + String topRight = getTopRight(line); + if(w.contains(topRight)){ return "3"; } else return "5"; } else throw new IllegalStateException("Unrecognized word "+w); } - private String getUnique1(String[] line){ + private String getBottomLeft(String[] line){ List l = asList(line); List possible = new ArrayList<>(asList((int)'a', (int)'b', (int)'c', (int)'d', (int)'e', (int)'f', (int)'g')); l.stream().filter(e -> e.length() >=2 && e.length() <=4).forEach(e -> e.chars().forEach(i -> possible.remove(Integer.valueOf(i)))); @@ -81,7 +81,7 @@ public Set getPotentialUniques(String[] line){ return Stream.of(line).filter(e -> e.length() == 6).map(this::difference).map(e -> (int)e.toCharArray()[0]).collect(Collectors.toSet()); } - private String getUnique2(String[] line){ + private String getTopRight(String[] line){ List l = asList(line); List possible = new ArrayList<>(asList((int)'a', (int)'b', (int)'c', (int)'d', (int)'e', (int)'f', (int)'g')); l.stream().filter(e -> e.length() >=2 && e.length() <=4) @@ -98,7 +98,7 @@ private String difference(String a){ return arr.stream().map(Object::toString).collect(Collectors.joining()); } - private boolean fitsOneSeven(String[] line, String a){ + private boolean getMiddle(String[] line, String a){ return Stream.of(line).filter(e -> e.length() == 2 || e.length() == 3).allMatch(e -> subset(e, a)); } From f054079046305a56bb306aa8843e65007cd0327d Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Wed, 8 Dec 2021 19:30:47 +0100 Subject: [PATCH 265/433] Make SmartArray smarter --- .../adventofcode/common/SmartArray.java | 48 ++++++++++++------- .../adventofcode/common/StringTools.java | 11 +++++ .../sbaars/adventofcode/year21/days/Day8.java | 7 ++- 3 files changed, 45 insertions(+), 21 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode/common/StringTools.java diff --git a/src/main/java/com/sbaars/adventofcode/common/SmartArray.java b/src/main/java/com/sbaars/adventofcode/common/SmartArray.java index 34f0fde1..793bb779 100644 --- a/src/main/java/com/sbaars/adventofcode/common/SmartArray.java +++ b/src/main/java/com/sbaars/adventofcode/common/SmartArray.java @@ -1,51 +1,65 @@ package com.sbaars.adventofcode.common; -import static java.util.stream.IntStream.range; - import java.util.HashMap; import java.util.Map; +import java.util.stream.IntStream; /** - * A set of fixed length where all operations are O(1) + * A fixed length array where all operations are O(1) */ public class SmartArray { - private final int[] order; private final int[] elements; private final Map elementIndex = new HashMap<>(); + private int size; public SmartArray(int[] elements) { this.elements = elements; - this.order = range(0, elements.length).toArray(); for (int i = 0; i < elements.length; i++) { - elementIndex.put(elements[i], order[i]); + elementIndex.put(elements[i], i); } + this.size = elements.length; + } + + public SmartArray(IntStream elements) { + this(elements.toArray()); } public void move(int oldIndex, int newIndex) { - elementIndex.put(elements[order[oldIndex]], order[newIndex]); - elementIndex.put(elements[order[newIndex]], order[oldIndex]); - int old = order[oldIndex]; - order[oldIndex] = order[newIndex]; - order[newIndex] = old; + elementIndex.put(elements[oldIndex], newIndex); + elementIndex.put(elements[newIndex], oldIndex); + int old = elements[oldIndex]; + elements[oldIndex] = elements[newIndex]; + elements[newIndex] = old; } public int get(int i) { - return elements[order[i]]; + return elements[i]; } public int size() { - return order.length; + return size; } public int indexOf(int element) { return elementIndex.get(element); } + public void remove(int index) { + move(index, --size); + } + + public void removeElement(int element) { + remove(indexOf(element)); + } + public int[] toArray() { - int[] arr = new int[order.length]; - for (int i = 0; i < arr.length; i++) { - arr[i] = elements[order[i]]; - } + if(size == elements.length) return elements; + int[] arr = new int[size]; + System.arraycopy(elements, 0, arr, 0, size); return arr; } + + public IntStream stream() { + return IntStream.of(toArray()); + } } diff --git a/src/main/java/com/sbaars/adventofcode/common/StringTools.java b/src/main/java/com/sbaars/adventofcode/common/StringTools.java new file mode 100644 index 00000000..8d14ece5 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/common/StringTools.java @@ -0,0 +1,11 @@ +package com.sbaars.adventofcode.common; + +import java.util.stream.Collectors; + +public class StringTools { + public static String removeAll(String str, String remove) { + var arr = new SmartArray(str.chars()); + remove.chars().forEach(arr::removeElement); + return arr.stream().mapToObj(Character::toString).collect(Collectors.joining()); + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java index 2b42a965..47a6fa4b 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java @@ -2,6 +2,7 @@ import static java.util.Arrays.asList; +import com.sbaars.adventofcode.common.StringTools; import com.sbaars.adventofcode.year21.Day2021; import java.io.IOException; import java.util.ArrayList; @@ -92,10 +93,8 @@ private String getTopRight(String[] line){ return Character.toString(possible.get(0)); } - private String difference(String a){ - var arr = new ArrayList<>(asList('a', 'b', 'c', 'd', 'e', 'f', 'g')); - arr.removeAll(a.chars().mapToObj(c -> (char) c).toList()); - return arr.stream().map(Object::toString).collect(Collectors.joining()); + private String difference(String a) { + return StringTools.removeAll("abcdefg", a); } private boolean getMiddle(String[] line, String a){ From 495b879fdd247cdd4b3cd67574bd89c496845703 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Wed, 8 Dec 2021 19:56:03 +0100 Subject: [PATCH 266/433] Clean it up some more --- .../adventofcode/common/SmartArray.java | 13 ++- .../adventofcode/common/StringTools.java | 4 + .../sbaars/adventofcode/year21/days/Day8.java | 95 +++++++++---------- 3 files changed, 60 insertions(+), 52 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/common/SmartArray.java b/src/main/java/com/sbaars/adventofcode/common/SmartArray.java index 793bb779..a1f7e40f 100644 --- a/src/main/java/com/sbaars/adventofcode/common/SmartArray.java +++ b/src/main/java/com/sbaars/adventofcode/common/SmartArray.java @@ -48,8 +48,17 @@ public void remove(int index) { move(index, --size); } - public void removeElement(int element) { - remove(indexOf(element)); + public boolean removeElement(int element) { + if(elementIndex.containsKey(element)) { + remove(indexOf(element)); + elementIndex.remove(element); + return true; + } + return false; + } + + public boolean contains(int element){ + return elementIndex.containsKey(element); } public int[] toArray() { diff --git a/src/main/java/com/sbaars/adventofcode/common/StringTools.java b/src/main/java/com/sbaars/adventofcode/common/StringTools.java index 8d14ece5..9bc733b5 100644 --- a/src/main/java/com/sbaars/adventofcode/common/StringTools.java +++ b/src/main/java/com/sbaars/adventofcode/common/StringTools.java @@ -8,4 +8,8 @@ public static String removeAll(String str, String remove) { remove.chars().forEach(arr::removeElement); return arr.stream().mapToObj(Character::toString).collect(Collectors.joining()); } + + public static boolean charSubset(String a, String b){ + return a.chars().allMatch(c -> b.chars().anyMatch(d -> d == c)); + } } diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java index 47a6fa4b..faa01215 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java @@ -1,12 +1,13 @@ package com.sbaars.adventofcode.year21.days; +import static com.sbaars.adventofcode.common.StringTools.charSubset; import static java.util.Arrays.asList; +import static java.util.Arrays.stream; +import com.sbaars.adventofcode.common.SmartArray; import com.sbaars.adventofcode.common.StringTools; import com.sbaars.adventofcode.year21.Day2021; import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -24,54 +25,63 @@ public static void main(String[] args) throws IOException { @Override public Object part1() { - return dayStream() - .map(e -> e.split("\\|")[1]).flatMap(e -> Stream.of(e.split(" "))) + return readInput() + .flatMap(e -> stream(e[1])) .filter(e -> e.length() == 2 || e.length() == 3 || e.length() == 4 || e.length() == 7) .count(); } @Override public Object part2() { - return dayStream() - .filter(e -> !e.isBlank()).map(e -> e.split("\\|")) - .map(e -> new String[][]{e[0].split(" "), Arrays.stream(e[1].split(" ")).filter(f -> !f.isBlank()).toArray(String[]::new)}) + return readInput() .mapToInt(line -> Integer.parseInt(Stream.of(line[1]).map(e -> getNum(line[0], e)).collect(Collectors.joining()))) .sum(); + } + private Stream readInput() { + return dayStream() + .map(e -> e.split("\\|")) + .map(e -> new String[][]{e[0].split(" "), stream(e[1].split(" ")).filter(f -> !f.isBlank()).toArray(String[]::new)}); } private String getNum(String[] line, String w) { - if(w.length() == 2){ - return "1"; - } else if(w.length() == 3) { - return "7"; - } else if(w.length() == 4) { - return "4"; - } else if(w.length() == 7) { - return "8"; - } else if(w.length() == 6) { - String bottomLeft = getBottomLeft(line); - if(w.contains(bottomLeft)) { - if(getMiddle(line, w)){ - return "0"; - } else return "6"; - } else return "9"; - } else if(w.length() == 5) { - String bottomLeft = getBottomLeft(line); - if(w.contains(bottomLeft)) { - return "2"; + switch (w.length()) { + case 2: + return "1"; + case 3: + return "7"; + case 4: + return "4"; + case 7: + return "8"; + case 6: { + String bottomLeft = getBottomLeft(line, false); + if (w.contains(bottomLeft)) { + if (getMiddle(line, w)) { + return "0"; + } else return "6"; + } else return "9"; + } + case 5: { + String bottomLeft = getBottomLeft(line, false); + if (w.contains(bottomLeft)) { + return "2"; + } + String topRight = getBottomLeft(line, true); + if (w.contains(topRight)) { + return "3"; + } else return "5"; } - String topRight = getTopRight(line); - if(w.contains(topRight)){ - return "3"; - } else return "5"; - } else throw new IllegalStateException("Unrecognized word "+w); + default: + throw new IllegalStateException("Unrecognized word " + w); + } } - private String getBottomLeft(String[] line){ + private String getBottomLeft(String[] line, boolean mirror){ List l = asList(line); - List possible = new ArrayList<>(asList((int)'a', (int)'b', (int)'c', (int)'d', (int)'e', (int)'f', (int)'g')); - l.stream().filter(e -> e.length() >=2 && e.length() <=4).forEach(e -> e.chars().forEach(i -> possible.remove(Integer.valueOf(i)))); + SmartArray possible = new SmartArray("abcdefg".chars()); + l.stream().filter(e -> e.length() >=2 && e.length() <=4) + .forEach(e -> (mirror ? difference(e) : e).chars().forEach(possible::removeElement)); if(possible.size()>1){ return Character.toString(getPotentialUniques(line).stream().filter(possible::contains).findAny().get()); } @@ -82,26 +92,11 @@ public Set getPotentialUniques(String[] line){ return Stream.of(line).filter(e -> e.length() == 6).map(this::difference).map(e -> (int)e.toCharArray()[0]).collect(Collectors.toSet()); } - private String getTopRight(String[] line){ - List l = asList(line); - List possible = new ArrayList<>(asList((int)'a', (int)'b', (int)'c', (int)'d', (int)'e', (int)'f', (int)'g')); - l.stream().filter(e -> e.length() >=2 && e.length() <=4) - .forEach(e -> difference(e).chars().forEach(i -> possible.remove(Integer.valueOf(i)))); - if(possible.size()>1){ - return Character.toString(getPotentialUniques(line).stream().filter(possible::contains).findAny().get()); - } - return Character.toString(possible.get(0)); - } - private String difference(String a) { return StringTools.removeAll("abcdefg", a); } private boolean getMiddle(String[] line, String a){ - return Stream.of(line).filter(e -> e.length() == 2 || e.length() == 3).allMatch(e -> subset(e, a)); - } - - private boolean subset(String a, String b){ - return a.chars().allMatch(c -> b.chars().anyMatch(d -> d == c)); + return Stream.of(line).filter(e -> e.length() == 2 || e.length() == 3).allMatch(e -> charSubset(e, a)); } } From b548ee639cddb7b6ca2811b814d246d1b9683687 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Wed, 8 Dec 2021 20:10:51 +0100 Subject: [PATCH 267/433] LongArray --- .../common/{SmartArray.java => IntArray.java} | 6 +- .../sbaars/adventofcode/common/LongArray.java | 74 +++++++++++++++++++ .../adventofcode/common/StringTools.java | 2 +- .../sbaars/adventofcode/year21/days/Day8.java | 4 +- 4 files changed, 80 insertions(+), 6 deletions(-) rename src/main/java/com/sbaars/adventofcode/common/{SmartArray.java => IntArray.java} (93%) create mode 100644 src/main/java/com/sbaars/adventofcode/common/LongArray.java diff --git a/src/main/java/com/sbaars/adventofcode/common/SmartArray.java b/src/main/java/com/sbaars/adventofcode/common/IntArray.java similarity index 93% rename from src/main/java/com/sbaars/adventofcode/common/SmartArray.java rename to src/main/java/com/sbaars/adventofcode/common/IntArray.java index a1f7e40f..92e912eb 100644 --- a/src/main/java/com/sbaars/adventofcode/common/SmartArray.java +++ b/src/main/java/com/sbaars/adventofcode/common/IntArray.java @@ -7,12 +7,12 @@ /** * A fixed length array where all operations are O(1) */ -public class SmartArray { +public class IntArray { private final int[] elements; private final Map elementIndex = new HashMap<>(); private int size; - public SmartArray(int[] elements) { + public IntArray(int[] elements) { this.elements = elements; for (int i = 0; i < elements.length; i++) { elementIndex.put(elements[i], i); @@ -20,7 +20,7 @@ public SmartArray(int[] elements) { this.size = elements.length; } - public SmartArray(IntStream elements) { + public IntArray(IntStream elements) { this(elements.toArray()); } diff --git a/src/main/java/com/sbaars/adventofcode/common/LongArray.java b/src/main/java/com/sbaars/adventofcode/common/LongArray.java new file mode 100644 index 00000000..1f999f65 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/common/LongArray.java @@ -0,0 +1,74 @@ +package com.sbaars.adventofcode.common; + +import java.util.HashMap; +import java.util.Map; +import java.util.stream.LongStream; + +/** + * A fixed length array where all operations are O(1) + */ +public class LongArray { + private final long[] elements; + private final Map elementIndex = new HashMap<>(); + private int size; + + public LongArray(long[] elements) { + this.elements = elements; + for (int i = 0; i < elements.length; i++) { + elementIndex.put(elements[i], i); + } + this.size = elements.length; + } + + public LongArray(LongStream elements) { + this(elements.toArray()); + } + + public void move(int oldIndex, int newIndex) { + elementIndex.put(elements[oldIndex], newIndex); + elementIndex.put(elements[newIndex], oldIndex); + long old = elements[oldIndex]; + elements[oldIndex] = elements[newIndex]; + elements[newIndex] = old; + } + + public long get(int i) { + return elements[i]; + } + + public int size() { + return size; + } + + public int indexOf(long element) { + return elementIndex.get(element); + } + + public void remove(int index) { + move(index, --size); + } + + public boolean removeElement(long element) { + if(elementIndex.containsKey(element)) { + remove(indexOf(element)); + elementIndex.remove(element); + return true; + } + return false; + } + + public boolean contains(long element){ + return elementIndex.containsKey(element); + } + + public long[] toArray() { + if(size == elements.length) return elements; + long[] arr = new long[size]; + System.arraycopy(elements, 0, arr, 0, size); + return arr; + } + + public LongStream stream() { + return LongStream.of(toArray()); + } +} diff --git a/src/main/java/com/sbaars/adventofcode/common/StringTools.java b/src/main/java/com/sbaars/adventofcode/common/StringTools.java index 9bc733b5..a2cf1783 100644 --- a/src/main/java/com/sbaars/adventofcode/common/StringTools.java +++ b/src/main/java/com/sbaars/adventofcode/common/StringTools.java @@ -4,7 +4,7 @@ public class StringTools { public static String removeAll(String str, String remove) { - var arr = new SmartArray(str.chars()); + var arr = new IntArray(str.chars()); remove.chars().forEach(arr::removeElement); return arr.stream().mapToObj(Character::toString).collect(Collectors.joining()); } diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java index faa01215..2818dc12 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java @@ -4,7 +4,7 @@ import static java.util.Arrays.asList; import static java.util.Arrays.stream; -import com.sbaars.adventofcode.common.SmartArray; +import com.sbaars.adventofcode.common.IntArray; import com.sbaars.adventofcode.common.StringTools; import com.sbaars.adventofcode.year21.Day2021; import java.io.IOException; @@ -79,7 +79,7 @@ private String getNum(String[] line, String w) { private String getBottomLeft(String[] line, boolean mirror){ List l = asList(line); - SmartArray possible = new SmartArray("abcdefg".chars()); + IntArray possible = new IntArray("abcdefg".chars()); l.stream().filter(e -> e.length() >=2 && e.length() <=4) .forEach(e -> (mirror ? difference(e) : e).chars().forEach(possible::removeElement)); if(possible.size()>1){ From 0f08a7d16cc38bf495ca05dd20acf68bb468ee9e Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Wed, 8 Dec 2021 20:26:58 +0100 Subject: [PATCH 268/433] Fancy switches --- .../sbaars/adventofcode/year21/days/Day8.java | 35 ++++++++----------- .../sbaars/adventofcode/year21/days/Day9.java | 7 ++-- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java index 2818dc12..d43066b8 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java @@ -45,36 +45,31 @@ private Stream readInput() { } private String getNum(String[] line, String w) { - switch (w.length()) { - case 2: - return "1"; - case 3: - return "7"; - case 4: - return "4"; - case 7: - return "8"; - case 6: { + return switch (w.length()) { + case 2 -> "1"; + case 3 -> "7"; + case 4 -> "4"; + case 7 -> "8"; + case 6 -> { String bottomLeft = getBottomLeft(line, false); if (w.contains(bottomLeft)) { if (getMiddle(line, w)) { - return "0"; - } else return "6"; - } else return "9"; + yield "0"; + } else yield "6"; + } else yield "9"; } - case 5: { + case 5 -> { String bottomLeft = getBottomLeft(line, false); if (w.contains(bottomLeft)) { - return "2"; + yield "2"; } String topRight = getBottomLeft(line, true); if (w.contains(topRight)) { - return "3"; - } else return "5"; + yield "3"; + } else yield "5"; } - default: - throw new IllegalStateException("Unrecognized word " + w); - } + default -> throw new IllegalStateException("Unrecognized word " + w); + }; } private String getBottomLeft(String[] line, boolean mirror){ diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day9.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day9.java index a067a809..cf9f9123 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day9.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day9.java @@ -5,17 +5,18 @@ public class Day9 extends Day2021 { public Day9() { super(9); -// System.in.read(); -// new Day8().submitPart1(); -// new Day8().submitPart2(); } public static void main(String[] args) { new Day9().printParts(); +// System.in.read(); +// new Day8().submitPart1(); +// new Day8().submitPart2(); } @Override public Object part1() { + var in = day(); return ""; } From dba1e108ce0fb991243312ef975ebbcf9fe4f174 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Thu, 9 Dec 2021 06:58:28 +0100 Subject: [PATCH 269/433] 2021 Day 9 --- .../sbaars/adventofcode/common/Direction.java | 11 +- .../sbaars/adventofcode/util/FetchInput.java | 2 +- .../sbaars/adventofcode/year21/days/Day6.java | 5 +- .../sbaars/adventofcode/year21/days/Day7.java | 3 +- .../sbaars/adventofcode/year21/days/Day8.java | 3 +- .../sbaars/adventofcode/year21/days/Day9.java | 73 +++++++++++-- src/main/resources/2021-examples/day9-1.txt | 5 + src/main/resources/2021/day9.txt | 100 ++++++++++++++++++ 8 files changed, 186 insertions(+), 16 deletions(-) create mode 100644 src/main/resources/2021-examples/day9-1.txt create mode 100644 src/main/resources/2021/day9.txt diff --git a/src/main/java/com/sbaars/adventofcode/common/Direction.java b/src/main/java/com/sbaars/adventofcode/common/Direction.java index bb404274..057c1e99 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Direction.java +++ b/src/main/java/com/sbaars/adventofcode/common/Direction.java @@ -84,6 +84,15 @@ public Point move(Point currentLocation, int amount) { } public char getInGrid(char[][] grid, Point p, char none) { + p = this.move(p); + if (p.x >= 0 && p.x < grid.length && p.y >= 0 && p.y < grid[0].length) { + return grid[p.x][p.y]; + } + return none; + } + + public long getInGrid(long[][] grid, Point p, int none) { + p = this.move(p); if (p.x >= 0 && p.x < grid.length && p.y >= 0 && p.y < grid[0].length) { return grid[p.x][p.y]; } @@ -139,4 +148,4 @@ public Direction turnDegrees(int degrees, boolean right) { public Direction turnDegrees(int degrees) { return turnDegrees(abs(degrees), degrees > 0); } -} \ No newline at end of file +} diff --git a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java index c962cc8f..787c4580 100644 --- a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java +++ b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java @@ -27,7 +27,7 @@ private FetchInput() { } public static void main(String[] args) { - new FetchInput().retrieveDay("8", "2021"); + new FetchInput().retrieveDay("9", "2021"); } private void retrieveDay(String day, String year) { diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day6.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day6.java index 6d24cd97..4c1a0357 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day6.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day6.java @@ -2,15 +2,14 @@ import com.sbaars.adventofcode.year19.util.LongCountMap; import com.sbaars.adventofcode.year21.Day2021; -import java.io.IOException; public class Day6 extends Day2021 { - public Day6() throws IOException { + public Day6() { super(6); } - public static void main(String[] args) throws IOException { + public static void main(String[] args) { new Day6().printParts(); } diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day7.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day7.java index f4c454ba..ae86e612 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day7.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day7.java @@ -4,7 +4,6 @@ import static java.lang.Math.min; import com.sbaars.adventofcode.year21.Day2021; -import java.io.IOException; import java.util.stream.LongStream; public class Day7 extends Day2021 { @@ -13,7 +12,7 @@ public Day7() { super(7); } - public static void main(String[] args) throws IOException { + public static void main(String[] args) { new Day7().printParts(); } diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java index d43066b8..59d195cb 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java @@ -7,7 +7,6 @@ import com.sbaars.adventofcode.common.IntArray; import com.sbaars.adventofcode.common.StringTools; import com.sbaars.adventofcode.year21.Day2021; -import java.io.IOException; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -19,7 +18,7 @@ public Day8() { super(8); } - public static void main(String[] args) throws IOException { + public static void main(String[] args) { new Day8().printParts(); } diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day9.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day9.java index cf9f9123..d83d2f67 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day9.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day9.java @@ -1,27 +1,86 @@ package com.sbaars.adventofcode.year21.days; +import static com.sbaars.adventofcode.common.Direction.fourDirections; + +import com.sbaars.adventofcode.common.Direction; +import com.sbaars.adventofcode.common.grid.NumGrid; import com.sbaars.adventofcode.year21.Day2021; +import java.awt.*; +import java.io.IOException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import java.util.stream.IntStream; public class Day9 extends Day2021 { public Day9() { super(9); } - public static void main(String[] args) { + public static void main(String[] args) throws IOException { new Day9().printParts(); -// System.in.read(); -// new Day8().submitPart1(); -// new Day8().submitPart2(); + System.in.read(); +// new Day9().submitPart1(); + new Day9().submitPart2(); } @Override public Object part1() { - var in = day(); - return ""; + var in = new NumGrid(day(), "\n", "").grid; + long sum = 0; + for(int i = 0; i d.getInGrid(in, new Point(x,y), Integer.MAX_VALUE)).allMatch(n -> n > in[x][y])){ + sum+=1+in[x][y]; + } + } + } + return sum; } @Override public Object part2() { - return ""; + var in = new NumGrid(day(), "\n", "").grid; + int[] b = new int[3]; + for(int i = 0; i(), in, loc); + if(b[0] <= b[1] && b[0] <= b[2] && basin > b[0]){ + b[0] = basin; + } else if(b[1] <= b[0] && b[1] <= b[2] && basin > b[1]){ + b[1] = basin; + } else if(b[2] <= b[1] && b[2] <= b[0] && basin > b[2]){ + b[2] = basin; + } + } + } + } + return IntStream.of(b).reduce((c, d) -> c*d).getAsInt(); + } + + private boolean isLowPoint(long[][] in, Point loc) { + return Arrays.stream(fourDirections()).map(d -> d.getInGrid(in, loc, Integer.MAX_VALUE)).allMatch(n -> n > in[loc.x][loc.y]); + } + + private boolean isLowPoint(long[][] in, Point loc, Set ex) { + if(Arrays.stream(fourDirections()).filter(d -> !ex.contains(d.move(loc))).map(d -> d.getInGrid(in, loc, Integer.MAX_VALUE)).allMatch(e -> e == Integer.MAX_VALUE)){ + return false; + } + return Arrays.stream(fourDirections()).filter(d -> !ex.contains(d.move(loc))).map(d -> d.getInGrid(in, loc, Integer.MAX_VALUE)).allMatch(n -> n > in[loc.x][loc.y]); + } + + private int findBasins(Set illegal, long[][] in, Point loc) { + illegal.add(loc); + int amount = 1; + for(Direction d : fourDirections()){ + Point p = d.move(loc); + if(d.getInGrid(in, loc, -1) != -1 && !illegal.contains(p) && isLowPoint(in, p, illegal)){ + amount += findBasins(illegal, in, p); + } + } + return amount; } } diff --git a/src/main/resources/2021-examples/day9-1.txt b/src/main/resources/2021-examples/day9-1.txt new file mode 100644 index 00000000..6dee4a42 --- /dev/null +++ b/src/main/resources/2021-examples/day9-1.txt @@ -0,0 +1,5 @@ +2199943210 +3987894921 +9856789892 +8767896789 +9899965678 diff --git a/src/main/resources/2021/day9.txt b/src/main/resources/2021/day9.txt new file mode 100644 index 00000000..c75e9233 --- /dev/null +++ b/src/main/resources/2021/day9.txt @@ -0,0 +1,100 @@ +9821016789345689876545245989999932987654349769898765104567898765634567899765432123788999891045698701 +7632145894234599987432134567898799999979498956789854323458999854323456789898321094567988789234987612 +6543234789345987654321015778987678987898987545678987634569899843212349899987432989679875678949896543 +7654345678956798765692126789854567896587898621567898545698789765103478999876549878998754599998789654 +8765496789987899976989238898763459965456999533478999768789678973212567899989698767898765989987678967 +9876787898798989899879345997652378954345987644567899878893467895323878989998987658999879878876567998 +6987898987689876789768959876543789993234599785698999989912457895456989878987898767899998767765456899 +5798999996579765878957892987984578989356679876789998692101567896569999765496789878989789856312345788 +4569899987498654567898901499876789678967889987896987543213456998778998954345678989775698543201234567 +3659789986329943458999212345987894569898995498945998764394967899989987893236789998664987656312345678 +2545678965439892347895425457998913456789654329434898765989898901298546789959899899543498765453456789 +1234568896798789456789434569879324599998993210125679899876789312987634567892998798992379879567867899 +0123456797987689967897545698765434987876789321234567989865695459896523498921987657989467988789878978 +1294968999996579898998656789876549976745898934545679876974489598765434789439876545878989499999989767 +2989899998765458789998767897997698865434567896898789995432378999876555678998765434567894345678997656 +9878789987654323678999898956798987654323456987899893496321267899989666789019896325679921234899876545 +7654678998765412567899999543459876543212369898934912985432456789999879894323998437789210345799985632 +6543568999654323456999897632498765432101458799329899876543569899985997995439896558994351456989994321 +9854567898798654567896789321239878543212345679498798997854679999874356789998797667895942349878989990 +8767698999899766878925459210123987654323457789989657998965989398765234567895689978999893598769878789 +9878989896999987989412368991234598765454769898878945899876793219876347698924567899998789699754965679 +7989876765788998994323456789947699876767899987653434678987894101987456999213345978987678987643434678 +6799995454567899987434569896899789989878978998762123789098999919598567895101234569876549876542123689 +5678989323456799876565678935678993497989767895421012392129998798439878963214395678987634984321034599 +4895678910167976987676789124569012976593656789532323679245987656522989954323689989876545695432234569 +3434799321279875498787891013689929876432545678993434568956798743210197895434567899987656987954345778 +2223789534569989329898999124567898954321434567989546979767898654321356789545679989998967899876456989 +1012578945678998910949678935678987895910125789879999899898998765432459997676989878999878956987867891 +2123459656989987921234568945989876789891234598767889789999649899543567898787894567898989347898978932 +3436578987899976899499689656798765676799345987655678678998767988999878939898923456957893236799989893 +4547678998999894988988998767998654545678957898743244569759889876789989923969212367898994345689998789 +5789789349987673976567899879876543234569768997542123458945998765678998799654323459999987658789989656 +6998993299876542987678943989995432123456979876543764567896987654589987678976434598989998767898978942 +9887894986987431099789992199986543434567895998654876678929876543498943569996565987878999878987867891 +8656789875698549129897889249897696545678934569765987989210987654567892456789699876569689989876545990 +7645878954987678998965678956798987858789124579876898999391998765678921239999987943489597898787434689 +5434567893298899987654667897899298767891035899989929998989899877889210198789876542123456789632123599 +2123678942109959876543456989999019888989186789891012987678789988994323987678998753244897896521012678 +1034589543212345987632345678978999999679997898752129876567679999995439876567899894556789965432123789 +2137897654323459876321234789567989656567898999643498765434567999987656985498956965678890986563234599 +3246789765434598765430125897679878643456789998756569876323456789598767976989999876899921987784346789 +4557999876545679898641236998789966532345899899867891987212345895459899899876989987999932398765659897 +5768954987786789989752347939899854321236998789878990195323467932378998789765678998989893459876789956 +6879543098899899879765458949998767432347897678989989996934589549999987678954367899876789598987892345 +7889632129978999769878569998769876543456976456799879889895697698789996589895256989865679987798931234 +8996543234567898754989678999654987656567965345898767679789899789678985456789345679654598765679892349 +9987656745678987643298789998743298777678954234987654545699967998799876789895458989765987654566789598 +9898787898789999732109898999856899988989432129876543236789656899893997897987667899879996532345699987 +8789898989898998743412967899987967799996573236987664127894346789965698976498788921989987621234789876 +7678949678987987658583456999998956667899794345698543234993237899876989899329899990199998710123898765 +7543234567896798867678967898999345556798989456987656786789379912999876788934998789239879823939999654 +7654949698965679878789989987893212445987678998998767897895467902987665677945987698998765439898998743 +8969898989754567989896899876789901239879567899999878998996598929876554566899876567899876598767897632 +9997767879543456798945698765899892398768456789898989879987679939875432345789985458912998987656789541 +9986556568912345987656987654356789987654345698767694767998789898954321234679876345793989876545997679 +8765432457893959898979876543245678998743256789654543459899899767899434348789965457989878976434569898 +7654321348999898769899985432123899987654569896543232498789987856798995679892396769876767994323498987 +9874210156789787656789876543012790198767698989692101987679876543456789989921987898765456789434987876 +1984321347896576545699987654125691239988987678989919976567985532345999897899598999876345699949876545 +2995432348954321034989998876234789545699876563479898765459874321248789766998439998765236789899975434 +9876543456796542129878969984345897676798987432365679876398765210123678955987645989854101896789964323 +6987678567897656298767456798767898987987654321234795988987654321234569543499659876543212345899873210 +5498987678998967987658345679878999898999865672347894399598765432345678932398767997654345456998754321 +6399798789899879876543238899989998789999876989456789212459976576556789543459898998785456767898765452 +7987659896789989998630127678999989679899987896567893101969897677679897659569989129886578898969876599 +9876545965678999987621234569999876567789998999879964239898798988989998998998678998997889949658987987 +9987631274798999876542355679987654345678939989998999398787689899196569896987589897698995432347899876 +9999820123457899876543498789898543234599649878987678987654578789023498785876456797549876545756998765 +8987634799598910987656569898765455125989998769876587898743434679234987654212356789432987659867987654 +7898545678919999998767898999874321039878898654322456987652123678949799765101347894321098792998996543 +6999657889209878999898987598765432398767789863210345698543234589998652976432456985432129891239987432 +5878968994398767892999763459876543987654598754321239789654345678999430987543479876549298910129876521 +4659878965943658991987642398989656798543459865434678998766556789987521987674569989998987621234987632 +3234989879892345789986543987898767929432123998765989659877677894987432398989678999887996545345698783 +2123699998789496892397959876789878912949234899876796546989788943596543459998789898656989656957989894 +1014568987678989989998999765678989109898946798987895432399899912987896578959895697645678969898979965 +2123456798545678979899987854569993298767958897699976541034987893498997989543934985434567899789569876 +3654567899434989656789876543458954987658969989549865432123456794579989895432129876323458987693456987 +4765878998745699967895998652367969876549878978934976543234569896989877789541034965434569876532345698 +5878999987658999878944349763456893989689989569019987894345698999998765678952199876545679986321236789 +7989398798867989989431239854567892199789893459198898765467987898987654567893988998756798765445789899 +9895497659978978998532345967678943239897654598976789876879886767897653678999877899767899876556895978 +8789989431299567897644459878789765456998765987865678987998765458975542768998756789898954987667954567 +7655978990123456789765567989899876769999979896754569899019876769654321658789546678969993298778943458 +6544567789236767899899698998910987878989998765443475698998989989643210145678934589654989109899432346 +5432345678945988912998999987891298989878987654321254567897694498754321234789123498799878912954321234 +4321234989856789923987899876789349998969899863210123458976543239865632355678934599988767899765432345 +5430129899767899899876798765478956997658789654431734567899854129876548766789545989877656778998545458 +4321239788978998798995459854357899876545678966545675678998765934987656878999769878965437567987657867 +5432998657899987656789345965456798765434567899656789789219999896798787989659898767894323456898768978 +9659876545699986547893239879767989854323456998767890998909878789899898997545999656789214356789899989 +8769985434589997656792123989979876543412397899878921457898767679989949876434398769898901234589998991 +9898767124567998767891012995989989872101289998989762345987654568975439877321239898987892345678987890 +9949656012369899889952129894398799965432378987899843569898743678954321965452345987676789657989996789 +9239743223456789996543298765219679878554567896987654698769832367895932987565459976585778967898965678 +8949854337567894987964987674101567987669878965498765987654321456789793498976798765434567898987874567 +7698765445878943299899876543212346798778989874349876799776532368995689569987998654323456999876553656 +8549977656989654998754987894334587899899498763256997899897543479434568978999876543213797898765432347 +7632988767899879879543498985455679945954349854367898965999654567925678989456988654435678999897321055 +6543499878921998765432459876576789656891298768478999654298776778936899994345699766576789998765432123 From 12d499c9326e6bba964eb8a5212626965bd512a8 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Thu, 9 Dec 2021 16:29:41 +0100 Subject: [PATCH 270/433] Movin' and groovin' --- .../sbaars/adventofcode/common/Direction.java | 1 - .../adventofcode/common/grid/NumGrid.java | 35 ++++++++- .../sbaars/adventofcode/year21/days/Day9.java | 75 ++++++------------- 3 files changed, 58 insertions(+), 53 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/common/Direction.java b/src/main/java/com/sbaars/adventofcode/common/Direction.java index 057c1e99..b4755ef6 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Direction.java +++ b/src/main/java/com/sbaars/adventofcode/common/Direction.java @@ -84,7 +84,6 @@ public Point move(Point currentLocation, int amount) { } public char getInGrid(char[][] grid, Point p, char none) { - p = this.move(p); if (p.x >= 0 && p.x < grid.length && p.y >= 0 && p.y < grid[0].length) { return grid[p.x][p.y]; } diff --git a/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java b/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java index 1f47bd7e..3687cce6 100644 --- a/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java +++ b/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java @@ -1,8 +1,11 @@ package com.sbaars.adventofcode.common.grid; +import java.awt.*; import java.util.Arrays; +import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.LongStream; +import java.util.stream.Stream; public class NumGrid implements Grid { public long[][] grid; @@ -12,7 +15,11 @@ public NumGrid(String stringToParse, String lineDelimiter, String itemDelimiter) } public NumGrid(String stringToParse) { - this.grid = numGrid(stringToParse, "\n", " "); + this(stringToParse, "\n", " "); + } + + public NumGrid(long[][] grid) { + this.grid = grid; } private long[][] numGrid(String str, String lineDelimiter, String itemDelimiter) { @@ -64,4 +71,30 @@ public IntStream iterate() { public LongStream iterateLong() { return LongStream.range(0, grid.length).flatMap(i -> LongStream.of(grid[Math.toIntExact(i)])); } + + public Stream stream() { + return IntStream.range(0, grid.length).boxed().flatMap(x -> IntStream.range(0, grid[x].length).mapToObj(y -> new Point(x, y))); + } + + @Override + public String toString(){ + StringBuilder res = new StringBuilder(); + for(long[] nums : grid) res.append(LongStream.of(nums).mapToObj(Long::toString).collect(Collectors.joining(","))); + return res.toString(); + } + + public long get(Point p) { + if (p.x >= 0 && p.x < grid.length && p.y >= 0 && p.y < grid[0].length) { + return grid[p.x][p.y]; + } + return -1; + } + + public int sizeX(){ + return grid.length; + } + + public int sizeY(){ + return grid[0].length; + } } diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day9.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day9.java index d83d2f67..cbb160ff 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day9.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day9.java @@ -1,16 +1,16 @@ package com.sbaars.adventofcode.year21.days; import static com.sbaars.adventofcode.common.Direction.fourDirections; +import static java.lang.Math.toIntExact; +import static java.util.Arrays.stream; +import static java.util.Collections.reverseOrder; -import com.sbaars.adventofcode.common.Direction; import com.sbaars.adventofcode.common.grid.NumGrid; import com.sbaars.adventofcode.year21.Day2021; import java.awt.*; import java.io.IOException; -import java.util.Arrays; import java.util.HashSet; import java.util.Set; -import java.util.stream.IntStream; public class Day9 extends Day2021 { public Day9() { @@ -19,67 +19,40 @@ public Day9() { public static void main(String[] args) throws IOException { new Day9().printParts(); - System.in.read(); -// new Day9().submitPart1(); - new Day9().submitPart2(); } @Override public Object part1() { - var in = new NumGrid(day(), "\n", "").grid; - long sum = 0; - for(int i = 0; i d.getInGrid(in, new Point(x,y), Integer.MAX_VALUE)).allMatch(n -> n > in[x][y])){ - sum+=1+in[x][y]; - } - } - } - return sum; + NumGrid in = new NumGrid(day(), "\n", ""); + var grid = in.grid; + return in.stream() + .filter(p -> isLowPoint(grid, p)) + .mapToLong(p -> 1+grid[p.x][p.y]) + .sum(); } @Override public Object part2() { - var in = new NumGrid(day(), "\n", "").grid; - int[] b = new int[3]; - for(int i = 0; i(), in, loc); - if(b[0] <= b[1] && b[0] <= b[2] && basin > b[0]){ - b[0] = basin; - } else if(b[1] <= b[0] && b[1] <= b[2] && basin > b[1]){ - b[1] = basin; - } else if(b[2] <= b[1] && b[2] <= b[0] && basin > b[2]){ - b[2] = basin; - } - } - } - } - return IntStream.of(b).reduce((c, d) -> c*d).getAsInt(); + NumGrid in = new NumGrid(day(), "\n", ""); + var grid = in.grid; + return in.stream() + .filter(p -> isLowPoint(grid, p)) + .map(p -> findBasins(new HashSet<>(), in, p, -1)) + .sorted(reverseOrder()) + .limit(3) + .reduce((a,b) -> a*b) + .get(); } private boolean isLowPoint(long[][] in, Point loc) { - return Arrays.stream(fourDirections()).map(d -> d.getInGrid(in, loc, Integer.MAX_VALUE)).allMatch(n -> n > in[loc.x][loc.y]); - } - - private boolean isLowPoint(long[][] in, Point loc, Set ex) { - if(Arrays.stream(fourDirections()).filter(d -> !ex.contains(d.move(loc))).map(d -> d.getInGrid(in, loc, Integer.MAX_VALUE)).allMatch(e -> e == Integer.MAX_VALUE)){ - return false; - } - return Arrays.stream(fourDirections()).filter(d -> !ex.contains(d.move(loc))).map(d -> d.getInGrid(in, loc, Integer.MAX_VALUE)).allMatch(n -> n > in[loc.x][loc.y]); + return stream(fourDirections()).map(d -> d.getInGrid(in, loc, -1)).filter(n -> n != -1).allMatch(n -> n > in[loc.x][loc.y]); } - private int findBasins(Set illegal, long[][] in, Point loc) { - illegal.add(loc); - int amount = 1; - for(Direction d : fourDirections()){ - Point p = d.move(loc); - if(d.getInGrid(in, loc, -1) != -1 && !illegal.contains(p) && isLowPoint(in, p, illegal)){ - amount += findBasins(illegal, in, p); - } + private int findBasins(Set illegal, NumGrid in, Point loc, int height) { + int amount = 0; + if(in.get(loc) != -1 && !illegal.contains(loc) && in.get(loc) > height && in.get(loc) < 9){ + amount+=stream(fourDirections()).map(d -> d.move(loc)).filter(e -> in.get(loc) != -1).mapToInt(p -> findBasins(illegal, in, p, toIntExact(in.get(loc)))).sum() + 1; + illegal.add(loc); } return amount; } From 0b657e5366df6cfc6c5102b385ddf11ba6047687 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Thu, 9 Dec 2021 16:31:24 +0100 Subject: [PATCH 271/433] Prepare next day --- .../java/com/sbaars/adventofcode/year21/days/Day10.java | 7 ++++++- .../java/com/sbaars/adventofcode/year21/days/Day9.java | 3 +-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day10.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day10.java index defbd4d7..0376d5ee 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day10.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day10.java @@ -1,18 +1,23 @@ package com.sbaars.adventofcode.year21.days; import com.sbaars.adventofcode.year21.Day2021; +import java.io.IOException; public class Day10 extends Day2021 { public Day10() { super(10); } - public static void main(String[] args) { + public static void main(String[] args) throws IOException { new Day10().printParts(); + System.in.read(); + new Day10().submitPart1(); + new Day10().submitPart2(); } @Override public Object part1() { + var in = day(); return ""; } diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day9.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day9.java index cbb160ff..d1a88df5 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day9.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day9.java @@ -8,7 +8,6 @@ import com.sbaars.adventofcode.common.grid.NumGrid; import com.sbaars.adventofcode.year21.Day2021; import java.awt.*; -import java.io.IOException; import java.util.HashSet; import java.util.Set; @@ -17,7 +16,7 @@ public Day9() { super(9); } - public static void main(String[] args) throws IOException { + public static void main(String[] args) { new Day9().printParts(); } From b548bbee786ae412d6877247d961b9638869785e Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Fri, 10 Dec 2021 06:46:22 +0100 Subject: [PATCH 272/433] 2021 Day 10 --- .../sbaars/adventofcode/util/FetchInput.java | 2 +- .../adventofcode/year21/days/Day10.java | 66 ++++++++++- src/main/resources/2021-examples/day10-1.txt | 1 + src/main/resources/2021-examples/day10-2.txt | 10 ++ src/main/resources/2021/day10.txt | 110 ++++++++++++++++++ 5 files changed, 184 insertions(+), 5 deletions(-) create mode 100644 src/main/resources/2021-examples/day10-1.txt create mode 100644 src/main/resources/2021-examples/day10-2.txt create mode 100644 src/main/resources/2021/day10.txt diff --git a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java index 787c4580..b3900cc4 100644 --- a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java +++ b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java @@ -27,7 +27,7 @@ private FetchInput() { } public static void main(String[] args) { - new FetchInput().retrieveDay("9", "2021"); + new FetchInput().retrieveDay("10", "2021"); } private void retrieveDay(String day, String year) { diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day10.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day10.java index 0376d5ee..0743b22f 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day10.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day10.java @@ -2,6 +2,10 @@ import com.sbaars.adventofcode.year21.Day2021; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Stack; public class Day10 extends Day2021 { public Day10() { @@ -11,18 +15,72 @@ public Day10() { public static void main(String[] args) throws IOException { new Day10().printParts(); System.in.read(); - new Day10().submitPart1(); +// new Day10().submitPart1(); new Day10().submitPart2(); } @Override public Object part1() { - var in = day(); - return ""; + Map m = Map.of(')', '(', ']', '[', '>', '<', '}', '{'); + Map p = Map.of(')', 3, ']', 57, '>', 25137, '}', 1197); + var in = dayStrings(); + int score = 0; + out: for(String line : in){ + Stack s = new Stack<>(); + for(Character c : line.toCharArray()){ + if(m.containsKey(c)){ + if(!s.isEmpty()){ + Character stackC = s.pop(); + if(!m.get(c).equals(stackC)){ + score+=p.get(c); + continue out; + } + } + } else { + s.push(c); + } + } + } + return score; } @Override public Object part2() { - return ""; + Map m = Map.of(')', '(', ']', '[', '>', '<', '}', '{'); + Map m2 = Map.of('(', ')', '[', ']', '<', '>', '{', '}'); + Map p = Map.of(')', 3, ']', 57, '>', 25137, '}', 1197); + Map p2 = Map.of('(', 1, '[', 2, '{', 3, '<', 4); + var in = dayStrings(); + List scores = new ArrayList<>(); + out: for(String line : in){ + Stack s = new Stack<>(); + for(Character c : line.toCharArray()){ + if(m.containsKey(c)){ + if(!s.isEmpty()){ + Character stackC = s.pop(); + if(!m.get(c).equals(stackC)){ + //score+=p.get(c); + continue out; + } + } + } else { + s.push(c); + } + } + long score = 0; + while(!s.isEmpty()){ + Character c = s.pop(); + score = (score * 5) + p2.get(c); +// score += switch ((char)m2.get(c)){ +// case '(' -> 1; +// case '[' -> 2; +// case '{' -> 3; +// case '<' -> 4; +// default -> throw new IllegalStateException("Not in switch "+c); +// }; + } + scores.add(score); + } + return scores.stream().sorted().skip(scores.size()/2).findFirst().get(); } } diff --git a/src/main/resources/2021-examples/day10-1.txt b/src/main/resources/2021-examples/day10-1.txt new file mode 100644 index 00000000..1d2d383f --- /dev/null +++ b/src/main/resources/2021-examples/day10-1.txt @@ -0,0 +1 @@ +{<[[]]>}<{[{[{[]{()[[[] diff --git a/src/main/resources/2021-examples/day10-2.txt b/src/main/resources/2021-examples/day10-2.txt new file mode 100644 index 00000000..e756077f --- /dev/null +++ b/src/main/resources/2021-examples/day10-2.txt @@ -0,0 +1,10 @@ +[({(<(())[]>[[{[]{<()<>> +[(()[<>])]({[<{<<[]>>( +{([(<{}[<>[]}>{[]{[(<()> +(((({<>}<{<{<>}{[]{[]{} +[[<[([]))<([[{}[[()]]] +[{[{({}]{}}([{[{{{}}([] +{<[[]]>}<{[{[{[]{()[[[] +[<(<(<(<{}))><([]([]() +<{([([[(<>()){}]>(<<{{ +<{([{{}}[<[[[<>{}]]]>[]] diff --git a/src/main/resources/2021/day10.txt b/src/main/resources/2021/day10.txt new file mode 100644 index 00000000..6981ec29 --- /dev/null +++ b/src/main/resources/2021/day10.txt @@ -0,0 +1,110 @@ +<<{<[<<<{<<(<({}())({}[]))[[{}[]]<{}[]>])[<[{}[]]{()()}>{((){})<<><>>}]>>[<(<<{}>>[<()()><<><>>] +{[[[{<[(([[{(({}))([<>[]]((){}))}<<<[][]>[{}{}]>[{()[]}(()())]>][[[{<>()}[{}[]]]]]]<{{{{()[]}}}[[{[][]}{{ +([((<(<(<<([{{[][]}([]<>)}({<>{}}[[]()])]<[[()()](()[])]([[][]](<><>))>>{{<(<><>)[<>()]>([[]()])}<<[[]()]<[][ +{{{([((([({[{{()()}{<>[]}}({{}{}}([]{}))]{([{}<>])<(<><>){[]<>}}}})({{{(()())[[][]]}{<{}{}> +{{([[((({(({({<><>}([]{}))([()()]{[]{}})}[[({}{})<(){}>]<<()<>>>]){[[[()()][<>[]]}<[{}()]{{}<>} +{([<[[<<({[<(<()<>>(()())){<<>[]><()[]>}>[({{}<>})]][[(<()<>>{(){}})[{[]<>}[[]{}])][[(()()){[][]}]<{{}{}}<[ +[<{[((<([[([<<{}()>{{}()}>{(()[])[<>{}]}]<{[<><>]{<>{}}}>)]{[{{{()<>}[{}<>]}<<()>{{}{}}>}]({{< +[<((<<({[{<{[[<><>](<>{})]{<()()><[]{}>}}<<[{}()]<[][]>><({}<>)>>>{<[[()<>]<{}[]>]<(<>()){<>{}}>>[{(()[])[{ +([(<<{{<[<(<<[[]{}]({}{})><[()[]]{<><>}>>[[{[]<>}[{}()]][({}{})({}())]>){(<{(){}}[{}[]]>[{[][]}<< +([<{<<<[[<{[{({}{})[{}[]]}])[[(({}{}){()<>})<[()[]]<[][]>>]<(<()()>{()()}){(<><>)([]())}>]>]]<<{ +[{((<<{[{[<<<(()[])[[][]]>>><{<{<>[]>{[]{}}>{<<>()>[<><>]}}[{{<>{}}([]())}{({}[])[<><>]}]>][(<({<>()}[[]{}])[ +<(<[[<{(<[(<[([]())]({<>()}({}()))>[({(){}})[[[][]][<>{}]]]){{[[<><>]{{}[]}]<[(){}]<{}()>>}(<(<>{ +{{{([[(<<<{[{(<><>){<>[]}}<<[][]><()<>>>]<[[(){}][<>[]]]{{()<>}[{}()]}>}[{{({}<>)}[[{}{}]{{}[]}]}[([()()] +{(<[{[{([({[[{<>}]{[<>{}]([][])}]{[(<>[])({}())]<{<><>}({}<>)>}}<[[(<>()){()[]}][<()()>{[]{}}]]<{[[]][[]()] +<{(({({(<{{<{{()()}<()[]>}{[[]()](<>[])}>}<<({{}()}<[]{}>)[{[]()}]><<<<><>>[<>[]]>>>}([<[{()[]}(()() +[[[{<({{[[<[{[(){}]<[]<>>}[[<>[]]{()<>}]]({<{}[]>[<>[]]}{({}{})<{}[]>})>{[[{[]{}}{<><>}]{( +<([<[(([[[[([<[][]>]<([]()){<>()}>){[{[]()}([][])]<{[]<>}({}<>)>}]<[[[[]<>][<>{}]]{{{}()]{<>( +<({{<<<{<<[[[<()<>>[()[]]]](<[{}<>]{[][]}>[{<>()}<()()>])]><{<[<()<>>[[]()]]<<[][]><()()>>> +[[{{(([[<{[[(<[][]><<><>>}[{{}()}]]{(<<><>>({}<>))[[[][]]<[]{}>]}]<[{({}<>)[[]]}({()()}[<><> +([<[([[<{<((<<{}()>[<>()]>)(<{{}()}>(<[]<>>{()()})))>({<<{(){}}{{}}><[<>{}]<<>{}>>>{([(){}](<>)){{()<>}({ +[{[[<((({[{[<[[]()]<{}[]>>{<{}<>>(<>[])}]<{({}{}){{}[]}}{[[]<>]([][])}>}(<{(<>)[()<>]>>(({{}()})[[{}[]]{[]} +[{[[({<<{([{{({}())[()[]]}<[<>()]({}{})>}({[{}<>]<<><>>}{{[]<>}{()]})][<([<>()]({}[])){[{}{}](<>[])}>[((() +{{((<[{{[[(<{({}()){()<>}}[{{}<>)({}{})]>({<(){}>[[]{}]}[[[]()]<{}>]))<<{[[]{}]({}[])}{<()>({} +<{<({[[({<(<<<[][]>[<>[]]><(()[])>>{([[]<>]({}{}>)})((<[{}][{}<>]>{(()<>)})<<<<>[]>[(){}]>[(<>{})<<>[]>]>)>} +[[[{[[{<{({<({{}<>}({}<>))>{[({}())]}})[<[[([][])][<{}<>><()<>>]]([[<><>]<[]()>]<({}{})(<><> +[<({{[(<{(<<((<>)<{}[]>){{<>[]}<{}{}>}>(<(<><>)<{}<>>><{{}()}[{}()]>)>([([[]{}][{}[]])]))}>((({{ +<<{({{(<([[(<[<>()]<<><>>>(<[]()>{{}<>})){{<{}[]>[()()]}<(<>[])<()[]>]}]{({<(){}>{[]()}}[(<> +(({<[({{[[{{[[()[]]([][])]{(<>[])<(){}>}}<<({}{})([]())><({}[])>>}<<<<{}[]>{[]{}}>(<[][]>[{}{}])>(({()<> +{[[([<[{[{<[[({}[])<{}[]>]([<>[]]({}{}))][({()[]}(()()))]>{<<({})([]{})>{[[]()](()()]}>[(((){})(()[]))<[[]<> +({[(<[(<({<[[[{}()]][<()()>[()[]]]]<{{<>[]}}[[[]{}]([]<>)]>>})<<{[<[()[]](()()}><(()())[<><>]> +((<[{([[{(([([<>()][[][]])]))}]])<{(<<{{<<[]{}>({}())>}}>>[{([[{{}()}{(){}}]](((()[])[(){}])<[<>< +{(<{[{<<(<<[<<{}{}>><[[][]}{(){}}>]{{{[]<>}[[]<>]}}>{({<{}<>>({}<>)}<<[]<>>>)[(<{}<>>(<>))<[ +[<({<<({[{[<[([]<>)]{[(){}]({})}>{{((){})}[<[][]>]}]({(<{}<>>(<>())){{[]()}(()())}}(((<>{}){()()}){{[]()}<<> +[[{{[<<[[[<<[{{}[]}<(){}>][{(){}}<{}[]>]>>(({({}{}}{<>{}}}([<>[]](()[]))))]{[[{((){})<<>()>}{{()[]}{<>()}}]< +{(([([<({[[{{[<>[]][<>[]]}[([][])[{}()]]}[([()()][{}()])([<>{}])]]][[{[([]{}){[]()}][<(){} +<{{[{<(((({[{<[]()>({}{})}]}))<[((<([]<>)[{}[]]>{<(){}>[[][]]}))[{<[()()][{}()]>(({}[])<<>[]>)}[((<>()){{} +[(<[{[[<{[([{{[]()}<()>}(([]())<(){}>)][(({}{})<{}<>>)])(<({{}()}({}))<[()[]]{<>[]}>><(<{}<>><{}<>>)<({}<> +{([({<<((({[({[][]})<{{}{}}<{}()>>]}<(<<[]()><()<>>>{{[]<>}([][])})(<{[]<>}[[]<>]>)>){([{<[]()>[<>[]]}[{<>< +[{{<<[<<<<{<({[]}[()[]]){{{}<>}[(){}]}>({([]())({}[])>)}><[[{[()<>]({}{})}<<<>{}>{()[]}>]{{[[][]]}(<<>()>< +(({({[{({[{[{([][])[[][]]}]{{{[]()}({}[])}({<>[]}(<>))}}[<<([]<>)>(<{}{}>{()})>[{[<><>][<>{}]}]]]}([{ +(({{<[{[([({([{}{}][{}<>])<<{}{}><<>()>>})]([((<[]()>[{}()])<<{}<>>((){})>)]<{[[{}<>]<[][]>]<(()[] +{<[({<[[<[(<<({}[])[[]()]>([<>{}]{{}<>})>[<<{}[]>{<>()}><[<>{}]({}[])>])]{{{({{}{}}<[]()>) +{<(({<[({<<[[[()[]]<{}<>>]]>><[{<{<><>}(<><>)>[[()[]]{<><>}]}[[{<><>}{{}<>}]({{}{}}[[][]])]]<<[{{}{}}<<>[]>] +[<{({{(({([{(<{}[]>(<>{}))<[[]{}](()[])>}<{(<>{})(<>{})}>])<<<<({}<>){<>{}}>[(()()>(()())]> +({((({[(<{{({({}())[[]<>]}([<>[]]{{}()}))<({{}()}<{}{}>)[{[]{}}({}[])]>}[([{{}<>}<{}>])[{{()[]}{{}()}}[([]{ +[<[{<{([<({<[[{}<>]{[][]}]{<<>{}><<><>>}>({[[]{}]<{}<>>}{{{}<>}(()[])})}){{{[<[]()><[][]>] +<<{<{[[{([{<[<{}[]>{[]<>}]<<{}{}>[{}[]]>>}([([{}{}]{<><>})[{<>{}})])]){{([[<{}[]>({}[])][[<><>] +([[(<([[[<[((([]{}){[]<>}))<{<[][]>[[]()]}[(()<>)<[]{}>]>]{[([[][]][()[]]){{(){}}[{}<>]}]}>< +<[{{<{<({{([[[[]{}]<{}()>><([]()){[]{}}>]<{<()[]>([]())}>)}<<{{((){}){[][]}}(({}<>)(()()))}([{[ +({{({[[{<({[({<>{}}[<>()])(([][]){{}{}])][({{}<>}(()[]))[<[]()><[]{}>]]}[{(<()[]><[]()>)[<{}()>{()[]}]} +<<<{<{[([[[[(<()[]>){<[]()><[]()>}]<<([])<[]<>>><[[]<>][<>[]]>>]<<[[()()](<><>)]({()()}[<>[]])>([<[] +((([{([({({<(<{}()>[()<>])<[{}<>]<{}[]>>>][{<[[][]]{{}()}>[({}()){[]<>}]}([{{}{}}[[]()]])])<[(({<>()} +([<<[(<{<<[<[{()[]}{()[]}](({}[]){{}[]})>]{([{()[]}])({{<>()}(()())})}>((({{()()}(()<>)}][[(<>()){()} +({[{[((<[<{<([[][]]{{}()})[{<>()}(<>{})]>{{{{}}}{{()}({}[])}}}>]<(<{<(<>())(()())>}>[<{[{}<>]{{ +{({[<{<[[[[<({<>{}}{()[]}){<[]()><[]()>}>([(<>())[[]()]](({}{})[()<>]))]]({([[<>{}]<{}[]>](<()()><()<>>)) +([<[<{<<<<((({<>}[<>{}])<({}())<()<>>>)[[[[]()][{}{}]]<(()<>)[<>]>]){{[({}())][([][])<()[]>]}{ +[{[({{<[{[<<[[<>()]]<([]())>><<<[][]>>{[()<>]{{}}}>>]}]{<{{{{[<>{}]({}[])}<{{}}{<>{}}>}{<({}){<> +{<<{{({([{[([{[]<>}{<>[]}](<()[]>))[([{}]<()<>>)<<<>[]>[()<>]>]]}{[{<[()[]][{}{}]>{[[]()][{}[]]}}({[[]{ +((<(<{{<([{[{{()[]}{<><>}}{{<>}({}{})})[([(){}][[][]])[<()[]><(){}>]]}<([(<>()){[][]}][([]())([]())])[ +<<{[{{<{<[[[<<()<>>[()[]]>([()]{{}[]})]](<[(()<>)[()[]]]>{<[{}{}]>[<<><>><<><>>]})][{((<{}{}>[() +<<<[[<[[([{[(<()><[]{}>)[(()[])[[]{}]]]{[{{}<>}[{}<>]]}}[(<<<>()><()[]>>[({}())<(){}>])[[[[][]][< +[[<(({[(([{{<([][])[[][]]>[{{}{}}{<>[]}]}<[(<><>)](<[][]>[<>{}])>}]{{{([(){}]([]))<[{}<>](())>}([[( +[<{[([<{({([((()>[{}[]])[(<><>){[][]}]])([{([]<>){[][]}}<(()[]){[]()}>]<((<>{}){[][]})({{}()}<()[ +((((<<<({([<{[{}()]{[]{}}}{({}[]){(){}}}>[[{()[]}[<>()]]<(()<>){(){}}>]]{[<(()())[{}[]]>(<<>()>({} +(<({((((<{{{[{{}{}}[(){}]][{<>{}}{(){}}]}([[{}[]]{<><>}]<[[]{}]<[][]>>)}({[[{}<>]<(){}>]}<{{<>[]}}<<<>[]> +{(<{(<{({(([{{()()}}][(({}{})<{}>)])<<(<()<>>{{}<>})(((){})[[]{}])><[[<>{})[<><>]][{()()}]> +<{[(<[[{(<({[<{}()>{{}{}}]{(()){[]{}}}}[{{[]<>}[{}{}]}])({({[][]}{[]()})})>(<{{(()[])<<>>>[<<>[]><[]< +([<[<[[{<[<(([<>{}]){[(){}]<()()>})<{([]{}}<{}<>>}{<{}{}><[]()>}>>(<<{<><>}(<>())>({<>}[{}{}])>(<(<><>) +([{[[(<[(([{[{<>[]}{<>()}]<[(){}](<>{})>]<<<<>[]>>{(<><>)<[]{}>}>])){{{{<([]<>)([]{})><{{}{ +[<{({{(({<[([[()<>]{[][]}]({<>[]}(()[])))](<<({}())([][])>[{()<>}(()())]><{[<>{}]<<>()>}[[{}()]{<><>}]>)>{ +{({{{{[{{[<{{<[][]>([])}<[[]{}][{}()]>}>]{{[[<<>[]>[[][]>]<<{}<>>(()<>)>]{[[<>{}]{{}[]}]}}<[[[<><>]<< +<({{({(({{<{{([]{}){<><>}}<(<>())({}{}]>}[{((){})(<>())}]>(({<[]()>([]{})}({{}{}}<<>()>)))}[[([<{}<>> +[[<{<{<((<<({(<>())(<>())}{{(){}}[{}()]})<(<{}<>>{(){}})>>{{({[][]}{{}[]})<<{}<>>(()<>)>}<<<<>()>>{({}{}){() +{[(<<<{(<{<<({<>{}}{()[]}>({<>[]}({}()))>>}>)<{(<(<({}[]){()[]}>)>((({()[]}[[][]]){<[][]><<>()>})[(([]<>)< +<[<[{<[{[[<([<{}()>[<>]]{[[][]]<{}()>}}>({{{<>[]}{()[]}}{{()}<<><>>}}<<([])([][])>{[{}<>](( +{[<<[[(<<{[<[[[]]({}())]([{}()][[]<>])>]}<({{(()[])<[][]>}{({})<()<>>}})([((()[])<[]<>>)<{(){}}([]()) +<{{<[[[(((<[{({}()){()()}}(<{}()>{()<>})]{{{()()}}{[[]{}]({}())}}>))<{<(((()<>)[{}[]])){[<[]<>>{{}() +<([((<<(((({{[{}<>]<[]<>>}(<[]{}><[]{}>)}[{{<>[]}}{(<>{}){[]<>}}])<<{(()())<<>{}>}[[{}[]][{}()]]>[<[[]() +{({{({[[({[<[<<><>)<{}{}>][<(){}>{[]{}}]>({(<>{})(<>())}<({})({})>)]})]<({[[({[]<>}{()()}){({}() +((([[(<(<[([({{}()})[{{}()}({}{})]]{({[]()}{{}()})(<()[]><<>[]>)}){{([{}()])}}]<[(<(<><>)[()[]}>[{{}<>}])]>>[ +{(([(<[[[[<<([(){}][<>[]]){({}())[[]{}]}>>[[<{()[]}{(){}}>(<{}{}><{}{}>)]<([()[]]<{}>)(<()[]>{ +{({([(<{<[[<<[<><>]<<><>>>>[<<{}<>>[{}<>]>{[[]{}][{}<>]}]]][{{<[{}[]]({})><[()()]>}}<[<{[]<>}[[]()]>]{[ +(((<{([<[(<[{([][])<[][]>}({{}<>}[{}{}])]>[[({[]<>}{<>{}})]})[{({(()[])([][])}{<()()>[[][] +<(<{{<([<(<{<{{}}{<>{}}>}([([]{}){(){}>]{<()<>>([])})>)<<({<[]<>>})({[()[]]}<[(){}]{{}()}>)>{[<<[][]>>({[]{ +({{(<(([[{((<<()[]><{}<>>>])}][<({<[{}[]][{}{}]><(()())([]())>})>{<(<{[]{}}{{}<>}>{{[]<>}{<><>}})>}]]{<[{[[ +{<[<([(((<[{[(())]}[(<{}()>)([[]][{}])]]{({<[]{}><()[]>}{{[]()}<{}<>>})}>){(({{<(){}>{<>[]}}(<(){}>( +([[{<{{{({{<[<[][]><()()>>><<[<>()]>>}{[[(())]<{[]<>}<()<>>>]}})(<({[([]<>)<<>[]>]({<>()}[ +{<[<<[((<<{<{([]<>)(<><>)}([()<>][{}[]])>}<<{{[]()}(<>{})}([<><>]({}[]))>{<[()<>]<{}()>>{<()( +{<{(<[[[<[{<[({}())<()<>>]>[{([]{})([]<>)}[<[][]>]>}][<([[()<>]{[][]}]){<[[]()](()())>({()}(()()))}>({<[()< +[{({<<<({{<[(({}[]){{}()})[{[]{}}{<><>}]]<{<[][]>(<>())}([<>{}])>>}[(<{{<>}([][])}>{{[[]()][[][]]}{<<>()>< +<<([{{[(<[([<{[]()}<<><>>><(()())<()[]>>][{<[]()><{}()>}{<<><>>[()<>]}])(<<<<>{}][{}[]]>[{<>}({} +((<<<<[{<[[<[{()()}<[][]>]{(()<>)}><{[[]{}]<{}{}>}>]<<{{[]<>}([])}{({}())([]{})]><[(<>())(<>{})]>>]><([<(([] +{[[<(<[({[[[{{<>()}<()()>}]]]}[({(<[[][]]>(<{}<>>))}[<{<[]{}>(()<>)}{<{}{}>[()<>]}>])(<{([[]<>]){ +{{<<{([<{[[[(<{}{}>[[]<>])({<><>}{{}[]})]]][([([()[]])[(()<>)<[]{}>]]<{{()<>}{[]()}}<<[]{}>{ +<(([[<(({{(<{{()<>}[<>()]}[({}())[[][]]]>{{[{}<>]((){})][<<>{}><[]{}>]})<<({{}()}<<>{}>){(<>())[<>{}]}>( +(<[(<<(((([<[<{}[]>][[()()]<<>()>]><[<{}{}>{()<>}](<()()])>][{{[{}<>]{<>()}}[<()()><{}>]}<(<{}{ +({{({[(<[{[<[((){})({}{})]([<>[]][[]()])>](<(<(){}><()()>)({<>{}}<{}()>)><{{<>()}(())}<{()()}<[]()>> +{<([(<<{([[[[(()<>)(()())]][[([]{})({}())]<[[]<>]{()[]}>)]([[<(){}>{<>{}}]((()())[()()])])] +(<<(((<[[{[{<[()<>]{<>{}}>([[]()][()()])}]{([<[]<>>{<>[]}]<<[][]>[{}()]>){<{[][]}[<>{}]><[<>[]]({}{} +<([[[(<[([{((<<>()>{()[]}){(<>())([])})[{<{}[]>([][])}[({}[])[<>()]]]}[(<<<>{}><()<>>><<<>[]>{( +[[{<[[(<<<(([(<><>)([][])](([]{}){[]{}}))[<[[]{}]>([[]()]{[][]})])>{{{[<()[]>[[]{}]][{()<>}[<>[]]]}} +([(<{<<(<{{{[[<>[]]<(){}>]([()[]][()[]])}{((<>()))}}{<[<{}<>>(<><>)](([][])<<>()>)}}}(<<[<{}[] +<[{{({{<[<[{(<<>[]>(<>()))<([]<>)[{}<>]>}]>{<<{<[]{}>(<>())}>([<(){}><(){}>]{[<>()]([]())})>}]>}})}}{((( +[<(((<{<<[(<{(<>[])}>){(<<{}<>>([]<>)>{<{}()>}}[[<{}{}>{[][]}](<<>[]>{{}[]})]}]><<([<[(){}]<()>><[(){}] +({[[(<[{(<((<[()[]]{[]<>}>){<(<>){()<>}>})(({<(){}>[{}[]]})[[(()[]){[]<>})<{[]()}>])>)<<<(<({}())(<>[]) +[{([<<<[{{([<<{}{}>>[{{}[]]]])}<<[<{{}}{<><>}>(({}{})[<>[]])]({[<><>]([][])}{(()<>)<<><>>}) +[[<(<<[{([[[[<[]{}><[]()>]][{[[][]]<()<>>}]]]{{{(<[]{}>(()<>))<(<>[])<<><>>>}]({{(()[]){{}()}} +({<<<{[<[[[{([{}<>]{<>()})(<<><>>)}(<(<>[])<{}>))][({<{}[]>[[][]]}(([]())(()[])))<<[[]()]{<><>}>> +[{<[[{{[<<([([<><>]([]<>))]({[()[]][{}{}]}{{()()}[[]<>]})){(<(()[])<[]()>><[[]()]<()<>>>)(<<()( +{<({((<([<(({{[]<>}[{}<>]}[<()[]><[]{}>]){<{[][]}{<><>]>})(({({}())[()()]}{[{}()][[]<>]}))>])<(<{(<{ From 747063c3e7b5afebece01a70e6979d184ce176b4 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Fri, 10 Dec 2021 07:39:45 +0100 Subject: [PATCH 273/433] Worst code ever --- .../adventofcode/year21/days/Day10.java | 50 +++++-------------- 1 file changed, 13 insertions(+), 37 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day10.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day10.java index 0743b22f..ffcd06a9 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day10.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day10.java @@ -14,44 +14,25 @@ public Day10() { public static void main(String[] args) throws IOException { new Day10().printParts(); - System.in.read(); -// new Day10().submitPart1(); - new Day10().submitPart2(); } @Override public Object part1() { - Map m = Map.of(')', '(', ']', '[', '>', '<', '}', '{'); - Map p = Map.of(')', 3, ']', 57, '>', 25137, '}', 1197); - var in = dayStrings(); - int score = 0; - out: for(String line : in){ - Stack s = new Stack<>(); - for(Character c : line.toCharArray()){ - if(m.containsKey(c)){ - if(!s.isEmpty()){ - Character stackC = s.pop(); - if(!m.get(c).equals(stackC)){ - score+=p.get(c); - continue out; - } - } - } else { - s.push(c); - } - } - } - return score; + return getScore(false).get(0); } @Override public Object part2() { + List scores = getScore(true); + return scores.stream().sorted().skip(scores.size()/2).findFirst().get(); + } + + private List getScore(boolean part) { Map m = Map.of(')', '(', ']', '[', '>', '<', '}', '{'); - Map m2 = Map.of('(', ')', '[', ']', '<', '>', '{', '}'); - Map p = Map.of(')', 3, ']', 57, '>', 25137, '}', 1197); - Map p2 = Map.of('(', 1, '[', 2, '{', 3, '<', 4); + Map p = part ? Map.of('(', 1, '[', 2, '{', 3, '<', 4) : Map.of(')', 3, ']', 57, '>', 25137, '}', 1197); var in = dayStrings(); List scores = new ArrayList<>(); + long score1 = 0; out: for(String line : in){ Stack s = new Stack<>(); for(Character c : line.toCharArray()){ @@ -59,7 +40,7 @@ public Object part2() { if(!s.isEmpty()){ Character stackC = s.pop(); if(!m.get(c).equals(stackC)){ - //score+=p.get(c); + if(!part) score1+=p.get(c); continue out; } } @@ -67,20 +48,15 @@ public Object part2() { s.push(c); } } + if(!part) continue; long score = 0; while(!s.isEmpty()){ Character c = s.pop(); - score = (score * 5) + p2.get(c); -// score += switch ((char)m2.get(c)){ -// case '(' -> 1; -// case '[' -> 2; -// case '{' -> 3; -// case '<' -> 4; -// default -> throw new IllegalStateException("Not in switch "+c); -// }; + score = (score * 5) + p.get(c); } scores.add(score); } - return scores.stream().sorted().skip(scores.size()/2).findFirst().get(); + if(!part) return List.of(score1); + return scores; } } From 5352df9fb7445485ac32ff7c49bbc717bbaa9522 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Sat, 11 Dec 2021 06:17:35 +0100 Subject: [PATCH 274/433] 2021 Day 11 --- .../adventofcode/common/grid/NumGrid.java | 4 + .../sbaars/adventofcode/util/FetchInput.java | 2 +- .../adventofcode/year21/days/Day11.java | 36 ++++- src/main/resources/2021-examples/day11-1.txt | 10 ++ src/main/resources/2021-examples/day11-2.txt | 20 +++ src/main/resources/2021-examples/day11-3.txt | 131 ++++++++++++++++++ src/main/resources/2021-examples/day11-4.txt | 107 ++++++++++++++ src/main/resources/2021/day11.txt | 10 ++ 8 files changed, 316 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/2021-examples/day11-1.txt create mode 100644 src/main/resources/2021-examples/day11-2.txt create mode 100644 src/main/resources/2021-examples/day11-3.txt create mode 100644 src/main/resources/2021-examples/day11-4.txt create mode 100644 src/main/resources/2021/day11.txt diff --git a/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java b/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java index 3687cce6..16c0b4b3 100644 --- a/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java +++ b/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java @@ -97,4 +97,8 @@ public int sizeX(){ public int sizeY(){ return grid[0].length; } + + public void set(Point p, long i) { + grid[p.x][p.y] = i; + } } diff --git a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java index b3900cc4..0bddffa2 100644 --- a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java +++ b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java @@ -27,7 +27,7 @@ private FetchInput() { } public static void main(String[] args) { - new FetchInput().retrieveDay("10", "2021"); + new FetchInput().retrieveDay("11", "2021"); } private void retrieveDay(String day, String year) { diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day11.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day11.java index 3a16f6d6..032f5710 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day11.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day11.java @@ -1,23 +1,53 @@ package com.sbaars.adventofcode.year21.days; +import com.sbaars.adventofcode.common.Direction; +import com.sbaars.adventofcode.common.grid.NumGrid; import com.sbaars.adventofcode.year21.Day2021; +import java.awt.*; +import java.io.IOException; +import java.util.Arrays; public class Day11 extends Day2021 { public Day11() { super(11); } - public static void main(String[] args) { + public static void main(String[] args) throws IOException { new Day11().printParts(); + System.in.read(); + new Day11().submitPart1(); +// new Day11().submitPart2(); } @Override public Object part1() { - return ""; + var in = new NumGrid(day(), "\n", ""); + long flashes = 0; + for(int i = 0; i<100; i++){ + flashes+=in.stream().mapToLong(e -> flash(in, e)).sum(); + in.stream().filter(p -> in.get(p) > 9).forEach(p -> in.set(p, 0)); + } + return flashes; + } + + private long flash(NumGrid in, Point e) { + long n = 0; + in.grid[e.x][e.y]++; + if(in.get(e) == 10){ + n+=Arrays.stream(Direction.values()).map(d -> d.move(e)).filter(p -> in.get(p) != -1).mapToLong(p -> flash(in, p)).sum() + 1; + } + return n; } @Override public Object part2() { - return ""; + var in = new NumGrid(day(), "\n", ""); + for(int step = 1; true; step++){ + in.stream().forEach(e -> flash(in, e)); + in.stream().filter(p -> in.get(p) > 9).forEach(p -> in.set(p, 0)); + if(in.stream().mapToLong(p -> in.get(p)).allMatch(e -> e == 0L)){ + return step; + } + } } } diff --git a/src/main/resources/2021-examples/day11-1.txt b/src/main/resources/2021-examples/day11-1.txt new file mode 100644 index 00000000..03743f6c --- /dev/null +++ b/src/main/resources/2021-examples/day11-1.txt @@ -0,0 +1,10 @@ +5483143223 +2745854711 +5264556173 +6141336146 +6357385478 +4167524645 +2176841721 +6882881134 +4846848554 +5283751526 diff --git a/src/main/resources/2021-examples/day11-2.txt b/src/main/resources/2021-examples/day11-2.txt new file mode 100644 index 00000000..2c7d0972 --- /dev/null +++ b/src/main/resources/2021-examples/day11-2.txt @@ -0,0 +1,20 @@ +Before any steps: +11111 +19991 +19191 +19991 +11111 + +After step 1: +34543 +40004 +50005 +40004 +34543 + +After step 2: +45654 +51115 +61116 +51115 +45654 diff --git a/src/main/resources/2021-examples/day11-3.txt b/src/main/resources/2021-examples/day11-3.txt new file mode 100644 index 00000000..f11e0007 --- /dev/null +++ b/src/main/resources/2021-examples/day11-3.txt @@ -0,0 +1,131 @@ +Before any steps: +5483143223 +2745854711 +5264556173 +6141336146 +6357385478 +4167524645 +2176841721 +6882881134 +4846848554 +5283751526 + +After step 1: +6594254334 +3856965822 +6375667284 +7252447257 +7468496589 +5278635756 +3287952832 +7993992245 +5957959665 +6394862637 + +After step 2: +8807476555 +5089087054 +8597889608 +8485769600 +8700908800 +6600088989 +6800005943 +0000007456 +9000000876 +8700006848 + +After step 3: +0050900866 +8500800575 +9900000039 +9700000041 +9935080063 +7712300000 +7911250009 +2211130000 +0421125000 +0021119000 + +After step 4: +2263031977 +0923031697 +0032221150 +0041111163 +0076191174 +0053411122 +0042361120 +5532241122 +1532247211 +1132230211 + +After step 5: +4484144000 +2044144000 +2253333493 +1152333274 +1187303285 +1164633233 +1153472231 +6643352233 +2643358322 +2243341322 + +After step 6: +5595255111 +3155255222 +3364444605 +2263444496 +2298414396 +2275744344 +2264583342 +7754463344 +3754469433 +3354452433 + +After step 7: +6707366222 +4377366333 +4475555827 +3496655709 +3500625609 +3509955566 +3486694453 +8865585555 +4865580644 +4465574644 + +After step 8: +7818477333 +5488477444 +5697666949 +4608766830 +4734946730 +4740097688 +6900007564 +0000009666 +8000004755 +6800007755 + +After step 9: +9060000644 +7800000976 +6900000080 +5840000082 +5858000093 +6962400000 +8021250009 +2221130009 +9111128097 +7911119976 + +After step 10: +0481112976 +0031112009 +0041112504 +0081111406 +0099111306 +0093511233 +0442361130 +5532252350 +0532250600 +0032240000 diff --git a/src/main/resources/2021-examples/day11-4.txt b/src/main/resources/2021-examples/day11-4.txt new file mode 100644 index 00000000..49569b7a --- /dev/null +++ b/src/main/resources/2021-examples/day11-4.txt @@ -0,0 +1,107 @@ +After step 20: +3936556452 +5686556806 +4496555690 +4448655580 +4456865570 +5680086577 +7000009896 +0000000344 +6000000364 +4600009543 + +After step 30: +0643334118 +4253334611 +3374333458 +2225333337 +2229333338 +2276733333 +2754574565 +5544458511 +9444447111 +7944446119 + +After step 40: +6211111981 +0421111119 +0042111115 +0003111115 +0003111116 +0065611111 +0532351111 +3322234597 +2222222976 +2222222762 + +After step 50: +9655556447 +4865556805 +4486555690 +4458655580 +4574865570 +5700086566 +6000009887 +8000000533 +6800000633 +5680000538 + +After step 60: +2533334200 +2743334640 +2264333458 +2225333337 +2225333338 +2287833333 +3854573455 +1854458611 +1175447111 +1115446111 + +After step 70: +8211111164 +0421111166 +0042111114 +0004211115 +0000211116 +0065611111 +0532351111 +7322235117 +5722223475 +4572222754 + +After step 80: +1755555697 +5965555609 +4486555680 +4458655580 +4570865570 +5700086566 +7000008666 +0000000990 +0000000800 +0000000000 + +After step 90: +7433333522 +2643333522 +2264333458 +2226433337 +2222433338 +2287833333 +2854573333 +4854458333 +3387779333 +3333333333 + +After step 100: +0397666866 +0749766918 +0053976933 +0004297822 +0004229892 +0053222877 +0532222966 +9322228966 +7922286866 +6789998766 diff --git a/src/main/resources/2021/day11.txt b/src/main/resources/2021/day11.txt new file mode 100644 index 00000000..b6997c36 --- /dev/null +++ b/src/main/resources/2021/day11.txt @@ -0,0 +1,10 @@ +2682551651 +3223134263 +5848471412 +7438334862 +8731321573 +6415233574 +5564726843 +6683456445 +8582346112 +4617588236 From dc1d7818e74dace5781d29fc44273f5610cd9f87 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Sat, 11 Dec 2021 06:19:13 +0100 Subject: [PATCH 275/433] Day 11 refactoring --- src/main/java/com/sbaars/adventofcode/year21/days/Day11.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day11.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day11.java index 032f5710..06f1e35e 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day11.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day11.java @@ -45,7 +45,7 @@ public Object part2() { for(int step = 1; true; step++){ in.stream().forEach(e -> flash(in, e)); in.stream().filter(p -> in.get(p) > 9).forEach(p -> in.set(p, 0)); - if(in.stream().mapToLong(p -> in.get(p)).allMatch(e -> e == 0L)){ + if(in.stream().mapToLong(in::get).allMatch(e -> e == 0L)){ return step; } } From cb646bd2d096540376f4f58eaf10f252f854a947 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Sat, 11 Dec 2021 11:33:31 +0100 Subject: [PATCH 276/433] Some more refactoring --- .../sbaars/adventofcode/common/grid/NumGrid.java | 9 +++++++++ .../com/sbaars/adventofcode/util/FetchInput.java | 2 +- .../com/sbaars/adventofcode/year21/days/Day11.java | 14 +++----------- .../com/sbaars/adventofcode/year21/days/Day12.java | 6 +++++- 4 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java b/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java index 16c0b4b3..f75a20ff 100644 --- a/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java +++ b/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java @@ -99,6 +99,15 @@ public int sizeY(){ } public void set(Point p, long i) { + if(get(p) == -1) return; grid[p.x][p.y] = i; } + + public void increment(Point p) { + increment(p, 1); + } + + public void increment(Point p, int n) { + set(p, get(p)+n); + } } diff --git a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java index 0bddffa2..93230dfb 100644 --- a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java +++ b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java @@ -27,7 +27,7 @@ private FetchInput() { } public static void main(String[] args) { - new FetchInput().retrieveDay("11", "2021"); + new FetchInput().retrieveDay("12", "2021"); } private void retrieveDay(String day, String year) { diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day11.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day11.java index 06f1e35e..869fda74 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day11.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day11.java @@ -4,7 +4,6 @@ import com.sbaars.adventofcode.common.grid.NumGrid; import com.sbaars.adventofcode.year21.Day2021; import java.awt.*; -import java.io.IOException; import java.util.Arrays; public class Day11 extends Day2021 { @@ -12,11 +11,8 @@ public Day11() { super(11); } - public static void main(String[] args) throws IOException { + public static void main(String[] args) { new Day11().printParts(); - System.in.read(); - new Day11().submitPart1(); -// new Day11().submitPart2(); } @Override @@ -31,12 +27,8 @@ public Object part1() { } private long flash(NumGrid in, Point e) { - long n = 0; - in.grid[e.x][e.y]++; - if(in.get(e) == 10){ - n+=Arrays.stream(Direction.values()).map(d -> d.move(e)).filter(p -> in.get(p) != -1).mapToLong(p -> flash(in, p)).sum() + 1; - } - return n; + in.increment(e); + return in.get(e) == 10 ? Arrays.stream(Direction.values()).map(d -> d.move(e)).filter(p -> in.get(p) != -1).mapToLong(p -> flash(in, p)).sum() + 1 : 0; } @Override diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day12.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day12.java index ef7f84a7..abbf1d4c 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day12.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day12.java @@ -1,14 +1,18 @@ package com.sbaars.adventofcode.year21.days; import com.sbaars.adventofcode.year21.Day2021; +import java.io.IOException; public class Day12 extends Day2021 { public Day12() { super(12); } - public static void main(String[] args) { + public static void main(String[] args) throws IOException { new Day12().printParts(); + System.in.read(); + new Day11().submitPart1(); +// new Day11().submitPart2(); } @Override From c828bfe64791806b7a1237d53f6aa9eca63c5a61 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Sun, 12 Dec 2021 06:30:10 +0100 Subject: [PATCH 277/433] Day 12 2021 --- .../adventofcode/year21/days/Day12.java | 56 ++++++++++++++++--- .../adventofcode/year21/days/Day13.java | 3 + src/main/resources/2021-examples/day12-1.txt | 7 +++ src/main/resources/2021-examples/day12-2.txt | 5 ++ src/main/resources/2021-examples/day12-3.txt | 10 ++++ src/main/resources/2021-examples/day12-4.txt | 10 ++++ src/main/resources/2021-examples/day12-5.txt | 19 +++++++ src/main/resources/2021-examples/day12-6.txt | 18 ++++++ src/main/resources/2021/day12.txt | 25 +++++++++ 9 files changed, 146 insertions(+), 7 deletions(-) create mode 100644 src/main/resources/2021-examples/day12-1.txt create mode 100644 src/main/resources/2021-examples/day12-2.txt create mode 100644 src/main/resources/2021-examples/day12-3.txt create mode 100644 src/main/resources/2021-examples/day12-4.txt create mode 100644 src/main/resources/2021-examples/day12-5.txt create mode 100644 src/main/resources/2021-examples/day12-6.txt create mode 100644 src/main/resources/2021/day12.txt diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day12.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day12.java index abbf1d4c..9947589c 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day12.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day12.java @@ -1,27 +1,69 @@ package com.sbaars.adventofcode.year21.days; +import static com.google.common.collect.ImmutableListMultimap.toImmutableListMultimap; + +import com.google.common.collect.ImmutableListMultimap; +import com.sbaars.adventofcode.year19.util.CountMap; import com.sbaars.adventofcode.year21.Day2021; -import java.io.IOException; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Stream; public class Day12 extends Day2021 { + + public static final String START = "start"; + public Day12() { super(12); } - public static void main(String[] args) throws IOException { + public static void main(String[] args) { new Day12().printParts(); - System.in.read(); - new Day11().submitPart1(); -// new Day11().submitPart2(); } @Override public Object part1() { - return ""; + return findPos(START, getInput(), Set.of(START)); + } + + private ImmutableListMultimap getInput() { + return dayStream().map(e -> e.split("-")).flatMap(e -> Stream.of(new String[]{e[0], e[1]}, new String[]{e[1], e[0]})).collect(toImmutableListMultimap(e -> e[0], e -> e[1])); + } + + private long findPos(String s, ImmutableListMultimap in, Set visited) { + if(s.equals("end")) return 1; + long n = 0; + List reachable = in.get(s); + for(String l : reachable){ + if(!visited.contains(l)) { + Set newSet = new HashSet<>(visited); + if(!l.toUpperCase().equals(l)) newSet.add(l); + n+=findPos(l, in, newSet); + } + } + return n; } @Override public Object part2() { - return ""; + return findPos2(START, getInput(), Map.of(START, 2)); + } + + private long findPos2(String s, ImmutableListMultimap in, Map visited) { + if(s.equals("end")) { + return 1; + } + long n = 0; + List reachable = in.get(s); + for(String l : reachable){ + if((!visited.containsKey(l) || visited.get(l) < 2) && visited.values().stream().filter(e -> e==2).count() <= 2) { + CountMap newSet = new CountMap<>(visited); + if(!l.toUpperCase().equals(l)) newSet.increment(l); + n+=findPos2(l, in, newSet); + } + } + return n; } } diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day13.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day13.java index a2d4e9ff..2346b90a 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day13.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day13.java @@ -5,6 +5,9 @@ public class Day13 extends Day2021 { public Day13() { super(13); +// System.in.read(); +// new Day11().submitPart1(); +// new Day11().submitPart2(); } public static void main(String[] args) { diff --git a/src/main/resources/2021-examples/day12-1.txt b/src/main/resources/2021-examples/day12-1.txt new file mode 100644 index 00000000..6fd8c415 --- /dev/null +++ b/src/main/resources/2021-examples/day12-1.txt @@ -0,0 +1,7 @@ +start-A +start-b +A-c +A-b +b-d +A-end +b-end diff --git a/src/main/resources/2021-examples/day12-2.txt b/src/main/resources/2021-examples/day12-2.txt new file mode 100644 index 00000000..7048cd54 --- /dev/null +++ b/src/main/resources/2021-examples/day12-2.txt @@ -0,0 +1,5 @@ + start + / \ +c--A-----b--d + \ / + end diff --git a/src/main/resources/2021-examples/day12-3.txt b/src/main/resources/2021-examples/day12-3.txt new file mode 100644 index 00000000..ef84176a --- /dev/null +++ b/src/main/resources/2021-examples/day12-3.txt @@ -0,0 +1,10 @@ +start,A,b,A,c,A,end +start,A,b,A,end +start,A,b,end +start,A,c,A,b,A,end +start,A,c,A,b,end +start,A,c,A,end +start,A,end +start,b,A,c,A,end +start,b,A,end +start,b,end diff --git a/src/main/resources/2021-examples/day12-4.txt b/src/main/resources/2021-examples/day12-4.txt new file mode 100644 index 00000000..62cc7147 --- /dev/null +++ b/src/main/resources/2021-examples/day12-4.txt @@ -0,0 +1,10 @@ +dc-end +HN-start +start-kj +dc-start +dc-HN +LN-dc +HN-end +kj-sa +kj-HN +kj-dc diff --git a/src/main/resources/2021-examples/day12-5.txt b/src/main/resources/2021-examples/day12-5.txt new file mode 100644 index 00000000..bbafd511 --- /dev/null +++ b/src/main/resources/2021-examples/day12-5.txt @@ -0,0 +1,19 @@ +start,HN,dc,HN,end +start,HN,dc,HN,kj,HN,end +start,HN,dc,end +start,HN,dc,kj,HN,end +start,HN,end +start,HN,kj,HN,dc,HN,end +start,HN,kj,HN,dc,end +start,HN,kj,HN,end +start,HN,kj,dc,HN,end +start,HN,kj,dc,end +start,dc,HN,end +start,dc,HN,kj,HN,end +start,dc,end +start,dc,kj,HN,end +start,kj,HN,dc,HN,end +start,kj,HN,dc,end +start,kj,HN,end +start,kj,dc,HN,end +start,kj,dc,end diff --git a/src/main/resources/2021-examples/day12-6.txt b/src/main/resources/2021-examples/day12-6.txt new file mode 100644 index 00000000..65f38333 --- /dev/null +++ b/src/main/resources/2021-examples/day12-6.txt @@ -0,0 +1,18 @@ +fs-end +he-DX +fs-he +start-DX +pj-DX +end-zg +zg-sl +zg-pj +pj-he +RW-he +fs-DX +pj-RW +zg-RW +start-pj +he-WI +zg-he +pj-fs +start-RW diff --git a/src/main/resources/2021/day12.txt b/src/main/resources/2021/day12.txt new file mode 100644 index 00000000..86357e38 --- /dev/null +++ b/src/main/resources/2021/day12.txt @@ -0,0 +1,25 @@ +ey-dv +AL-ms +ey-lx +zw-YT +hm-zw +start-YT +start-ms +dv-YT +hm-ms +end-ey +AL-ey +end-hm +rh-hm +dv-ms +AL-dv +ey-SP +hm-lx +dv-start +end-lx +zw-AL +hm-AL +lx-zw +ey-zw +zw-dv +YT-ms From 59104a4c7b9a681104267c25912fccf7161ec366 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Mon, 13 Dec 2021 07:13:48 +0100 Subject: [PATCH 278/433] Day 13 2021 --- .../adventofcode/common/grid/NumGrid.java | 2 +- .../sbaars/adventofcode/util/FetchInput.java | 2 +- .../adventofcode/year21/days/Day13.java | 37 +- src/main/resources/2021-examples/day13-1.txt | 2 + src/main/resources/2021-examples/day13-2.txt | 21 + src/main/resources/2021-examples/day13-3.txt | 15 + src/main/resources/2021-examples/day13-4.txt | 15 + src/main/resources/2021-examples/day13-5.txt | 7 + src/main/resources/2021-examples/day13-6.txt | 7 + src/main/resources/2021-examples/day13-7.txt | 7 + src/main/resources/2021/day13.txt | 800 ++++++++++++++++++ 11 files changed, 908 insertions(+), 7 deletions(-) create mode 100644 src/main/resources/2021-examples/day13-1.txt create mode 100644 src/main/resources/2021-examples/day13-2.txt create mode 100644 src/main/resources/2021-examples/day13-3.txt create mode 100644 src/main/resources/2021-examples/day13-4.txt create mode 100644 src/main/resources/2021-examples/day13-5.txt create mode 100644 src/main/resources/2021-examples/day13-6.txt create mode 100644 src/main/resources/2021-examples/day13-7.txt create mode 100644 src/main/resources/2021/day13.txt diff --git a/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java b/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java index f75a20ff..18059f05 100644 --- a/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java +++ b/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java @@ -79,7 +79,7 @@ public Stream stream() { @Override public String toString(){ StringBuilder res = new StringBuilder(); - for(long[] nums : grid) res.append(LongStream.of(nums).mapToObj(Long::toString).collect(Collectors.joining(","))); + for(long[] nums : grid) res.append(LongStream.of(nums).mapToObj(Long::toString).collect(Collectors.joining(","))+"\n"); return res.toString(); } diff --git a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java index 93230dfb..e48cae7c 100644 --- a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java +++ b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java @@ -27,7 +27,7 @@ private FetchInput() { } public static void main(String[] args) { - new FetchInput().retrieveDay("12", "2021"); + new FetchInput().retrieveDay("13", "2021"); } private void retrieveDay(String day, String year) { diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day13.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day13.java index 2346b90a..408a9e56 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day13.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day13.java @@ -1,26 +1,53 @@ package com.sbaars.adventofcode.year21.days; +import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; +import static java.lang.Math.toIntExact; + +import com.sbaars.adventofcode.common.grid.NumGrid; import com.sbaars.adventofcode.year21.Day2021; +import java.awt.*; +import java.util.Arrays; +import java.util.stream.Collectors; public class Day13 extends Day2021 { public Day13() { super(13); -// System.in.read(); -// new Day11().submitPart1(); -// new Day11().submitPart2(); } public static void main(String[] args) { new Day13().printParts(); +// new Day13().submitPart1(); +// new Day13().submitPart2(); } @Override public Object part1() { - return ""; + var in = day().split("\n\n"); + var dots = Arrays.stream(in[0].split("\n")).map(e -> e.split(",")).map(e -> new Point(Integer.parseInt(e[0]), Integer.parseInt(e[1]))).collect(Collectors.toSet()); + var folds = Arrays.stream(in[1].split("\n")).map(e -> readString(e, "fold along %s=%n", Fold.class)).toList(); + dots = dots.stream().map(e -> e.x>folds.get(0).n ? new Point(toIntExact(folds.get(0).n-(e.x-folds.get(0).n)), e.y) : e).collect(Collectors.toSet()); + return dots.size(); } + public record Fold (String axis, long n){} + @Override public Object part2() { - return ""; + var in = day().split("\n\n"); + var dots = Arrays.stream(in[0].split("\n")).map(e -> e.split(",")).map(e -> new Point(Integer.parseInt(e[0]), Integer.parseInt(e[1]))).collect(Collectors.toSet()); + var folds = Arrays.stream(in[1].split("\n")).map(e -> readString(e, "fold along %s=%n", Fold.class)).toList(); + for(Fold f : folds) { + dots = dots.stream().map(e -> fold(f, e)).collect(Collectors.toSet()); + } + NumGrid g = new NumGrid(new long[dots.stream().mapToInt(e -> e.y).max().getAsInt()][dots.stream().mapToInt(e -> e.x).max().getAsInt()]); + dots.stream().map(e -> new Point(e.y, e.x)).forEach(e -> g.set(e, 1L)); + return "\n"+g.toString().replace(",", "").replace("0", " "); + } + + private Point fold(Fold f, Point e) { + if(f.axis.equals("y")){ + return e.y > f.n ? new Point(e.x, toIntExact(f.n - (e.y - f.n))) : e; + } + return e.x > f.n ? new Point(toIntExact(f.n - (e.x - f.n)), e.y) : e; } } diff --git a/src/main/resources/2021-examples/day13-1.txt b/src/main/resources/2021-examples/day13-1.txt new file mode 100644 index 00000000..bc63ff84 --- /dev/null +++ b/src/main/resources/2021-examples/day13-1.txt @@ -0,0 +1,2 @@ +Congratulations on your purchase! To activate this infrared thermal imaging +camera system, please enter the code found on page 1 of the manual. diff --git a/src/main/resources/2021-examples/day13-2.txt b/src/main/resources/2021-examples/day13-2.txt new file mode 100644 index 00000000..282114cf --- /dev/null +++ b/src/main/resources/2021-examples/day13-2.txt @@ -0,0 +1,21 @@ +6,10 +0,14 +9,10 +0,3 +10,4 +4,11 +6,0 +6,12 +4,1 +0,13 +10,12 +3,4 +3,0 +8,4 +1,10 +2,14 +8,10 +9,0 + +fold along y=7 +fold along x=5 diff --git a/src/main/resources/2021-examples/day13-3.txt b/src/main/resources/2021-examples/day13-3.txt new file mode 100644 index 00000000..4a6d6fe3 --- /dev/null +++ b/src/main/resources/2021-examples/day13-3.txt @@ -0,0 +1,15 @@ +...#..#..#. +....#...... +........... +#.......... +...#....#.# +........... +........... +........... +........... +........... +.#....#.##. +....#...... +......#...# +#.......... +#.#........ diff --git a/src/main/resources/2021-examples/day13-4.txt b/src/main/resources/2021-examples/day13-4.txt new file mode 100644 index 00000000..eb2caa0f --- /dev/null +++ b/src/main/resources/2021-examples/day13-4.txt @@ -0,0 +1,15 @@ +...#..#..#. +....#...... +........... +#.......... +...#....#.# +........... +........... +----------- +........... +........... +.#....#.##. +....#...... +......#...# +#.......... +#.#........ diff --git a/src/main/resources/2021-examples/day13-5.txt b/src/main/resources/2021-examples/day13-5.txt new file mode 100644 index 00000000..8d475a31 --- /dev/null +++ b/src/main/resources/2021-examples/day13-5.txt @@ -0,0 +1,7 @@ +#.##..#..#. +#...#...... +......#...# +#...#...... +.#.#..#.### +........... +........... diff --git a/src/main/resources/2021-examples/day13-6.txt b/src/main/resources/2021-examples/day13-6.txt new file mode 100644 index 00000000..bfcca033 --- /dev/null +++ b/src/main/resources/2021-examples/day13-6.txt @@ -0,0 +1,7 @@ +#.##.|#..#. +#...#|..... +.....|#...# +#...#|..... +.#.#.|#.### +.....|..... +.....|..... diff --git a/src/main/resources/2021-examples/day13-7.txt b/src/main/resources/2021-examples/day13-7.txt new file mode 100644 index 00000000..d59120b0 --- /dev/null +++ b/src/main/resources/2021-examples/day13-7.txt @@ -0,0 +1,7 @@ +##### +#...# +#...# +#...# +##### +..... +..... diff --git a/src/main/resources/2021/day13.txt b/src/main/resources/2021/day13.txt new file mode 100644 index 00000000..56c3fc94 --- /dev/null +++ b/src/main/resources/2021/day13.txt @@ -0,0 +1,800 @@ +440,442 +440,617 +132,849 +758,512 +956,840 +796,364 +413,476 +530,417 +484,467 +436,465 +1303,208 +524,61 +552,512 +36,371 +52,702 +229,646 +469,803 +103,483 +447,635 +605,630 +738,661 +1031,760 +164,547 +1169,131 +331,235 +686,793 +216,35 +997,591 +448,641 +534,9 +1064,592 +465,653 +249,421 +1198,617 +743,176 +318,124 +1173,646 +497,313 +970,287 +152,820 +20,484 +1303,14 +167,123 +763,656 +1237,581 +207,546 +1007,808 +1002,152 +1081,696 +905,365 +393,875 +47,865 +845,248 +1039,859 +0,476 +159,644 +1243,303 +238,220 +721,339 +982,866 +1146,570 +149,81 +917,507 +753,248 +602,35 +222,700 +1059,556 +569,245 +878,684 +1208,624 +261,834 +1235,7 +996,607 +300,616 +416,2 +870,4 +497,581 +75,439 +551,483 +150,686 +475,814 +303,93 +687,341 +857,523 +1057,878 +159,420 +806,119 +1133,813 +838,610 +236,427 +431,259 +62,714 +669,583 +510,722 +82,806 +589,339 +759,411 +863,635 +800,680 +495,474 +547,238 +544,856 +1044,158 +1279,665 +237,301 +105,422 +1079,246 +18,77 +566,892 +1059,281 +1228,579 +1039,478 +432,5 +964,781 +862,148 +415,561 +669,739 +566,35 +102,512 +1258,35 +341,645 +1123,704 +1059,439 +885,810 +1282,870 +862,746 +525,575 +364,523 +214,72 +447,348 +355,129 +656,540 +487,17 +1282,24 +487,877 +1228,200 +484,427 +624,793 +75,7 +1073,301 +692,735 +900,88 +534,522 +3,21 +1140,770 +1230,9 +405,459 +1146,771 +74,768 +492,862 +65,890 +805,627 +756,856 +1210,87 +440,4 +1015,208 +920,162 +736,437 +431,635 +459,656 +1280,465 +408,144 +544,663 +806,791 +1295,576 +1059,887 +782,35 +425,732 +440,218 +1133,135 +1140,124 +112,617 +321,561 +761,222 +279,582 +863,348 +428,486 +1222,674 +1031,281 +452,333 +80,9 +313,515 +1059,108 +435,14 +760,812 +1176,645 +346,113 +566,450 +375,582 +162,324 +57,472 +812,546 +423,742 +102,382 +567,785 +766,35 +62,610 +415,277 +137,696 +477,305 +935,613 +88,444 +0,521 +239,337 +393,427 +217,130 +793,763 +897,476 +897,771 +905,399 +189,696 +922,382 +1274,371 +668,383 +803,814 +979,21 +102,830 +460,800 +977,331 +135,474 +1103,187 +370,70 +1110,483 +333,779 +1133,533 +700,63 +1046,610 +1091,86 +0,885 +62,834 +566,483 +1047,100 +1206,229 +813,350 +446,831 +1059,729 +1143,17 +753,57 +162,772 +719,548 +353,522 +592,284 +333,245 +791,644 +641,67 +417,749 +231,191 +1212,842 +264,508 +547,126 +659,877 +74,220 +109,647 +465,708 +845,584 +261,610 +1133,725 +253,430 +3,588 +736,816 +820,137 +1091,360 +52,192 +110,215 +574,816 +80,78 +1057,430 +27,336 +873,316 +1134,511 +669,695 +636,270 +237,749 +1073,749 +1121,696 +542,254 +1074,427 +989,320 +477,589 +1171,317 +264,610 +326,28 +1059,837 +1287,823 +1146,261 +811,380 +12,383 +565,525 +1208,400 +813,331 +490,476 +813,544 +443,193 +589,644 +907,7 +211,389 +1004,858 +73,688 +279,281 +390,610 +504,238 +894,2 +893,749 +440,452 +390,490 +119,707 +641,585 +577,645 +1297,583 +1099,841 +393,35 +1222,187 +1133,471 +488,430 +959,534 +1111,176 +1248,714 +244,9 +736,116 +577,473 +348,36 +1304,842 +155,542 +264,490 +567,176 +1166,382 +30,465 +341,393 +497,350 +833,697 +12,119 +1248,732 +200,411 +692,159 +1048,856 +82,25 +1235,455 +971,19 +1108,58 +435,584 +705,630 +1064,302 +884,374 +592,869 +490,261 +202,781 +184,596 +510,721 +455,624 +299,336 +1099,389 +1280,17 +182,173 +380,262 +164,123 +73,287 +62,284 +1093,578 +1230,885 +738,25 +987,274 +388,382 +490,757 +823,877 +875,360 +308,742 +194,773 +393,162 +75,455 +940,701 +1304,780 +311,603 +514,530 +1200,679 +895,561 +1061,253 +870,890 +85,473 +1255,808 +918,856 +895,277 +1305,873 +520,137 +387,315 +355,317 +1061,813 +610,831 +251,729 +502,372 +792,583 +1046,162 +962,36 +31,665 +879,259 +504,791 +833,23 +300,54 +517,241 +917,162 +1087,523 +633,763 +88,226 +249,253 +487,547 +950,621 +100,628 +935,582 +592,197 +833,197 +219,808 +271,320 +1297,85 +674,284 +264,284 +858,561 +763,320 +845,696 +30,17 +119,187 +308,834 +897,418 +917,834 +1245,427 +1146,633 +395,618 +219,584 +1146,585 +791,784 +917,732 +495,584 +455,270 +1059,57 +58,658 +721,644 +760,677 +1155,94 +1237,688 +776,325 +1161,81 +863,796 +749,749 +77,701 +1173,241 +261,859 +1148,32 +885,165 +1108,836 +999,592 +1123,429 +1213,277 +351,375 +547,656 +492,235 +1310,418 +698,641 +196,161 +1057,464 +150,208 +984,802 +1191,707 +1184,159 +484,803 +1307,588 +410,437 +1175,577 +211,841 +1310,476 +833,589 +1094,35 +977,333 +425,696 +550,530 +241,418 +879,187 +355,782 +161,598 +1096,72 +6,780 +425,198 +1072,544 +62,361 +758,64 +663,656 +572,197 +618,523 +1307,309 +448,148 +1262,56 +1046,490 +760,866 +557,248 +187,280 +984,866 +452,360 +569,869 +321,320 +12,775 +815,306 +1163,603 +403,7 +104,530 +1049,57 +1126,596 +900,661 +6,114 +818,862 +710,68 +776,9 +923,315 +1217,749 +907,444 +647,686 +833,85 +1184,735 +560,775 +1266,63 +1151,420 +577,193 +552,46 +1088,194 +674,610 +535,348 +800,721 +331,469 +718,284 +1093,894 +858,333 +1230,610 +1146,137 +1158,820 +1213,617 +1225,623 +217,578 +905,495 +274,30 +100,807 +920,714 +191,110 +7,880 +97,84 +1119,110 +766,254 +177,725 +97,696 +437,670 +1002,834 +795,541 +159,758 +504,343 +405,399 +744,35 +544,640 +1066,437 +1268,253 +933,40 +253,878 +698,253 +1235,439 +539,172 +1250,176 +946,371 +1245,698 +452,113 +1046,714 +1310,9 +478,383 +238,350 +1200,215 +547,544 +80,437 +940,70 +1216,567 +1277,127 +351,534 +574,116 +1091,808 +269,248 +266,512 +572,25 +85,623 +776,522 +845,519 +1099,837 +269,646 +167,771 +1247,346 +763,126 +177,423 +244,457 +338,36 +52,411 +733,645 +65,843 +878,866 +303,808 +251,556 +1031,134 +331,425 +567,718 +7,208 +261,162 +618,511 +845,241 +98,822 +592,60 +465,696 +771,253 +870,218 +920,145 +497,331 +751,600 +490,570 +1069,421 +1233,249 +236,467 +967,592 +987,620 +1036,192 +874,168 +661,21 +1258,702 +969,249 +321,115 +539,253 +504,775 +214,822 +321,779 +624,465 +7,14 +698,170 +388,512 +669,311 +1207,483 +155,514 +65,4 +574,186 +89,189 +377,329 +599,416 +274,192 +311,592 +855,624 +1146,757 +144,494 +743,785 +517,455 +552,64 +162,130 +189,689 +989,561 +589,835 +62,473 +915,618 +57,422 +923,411 +1046,284 +1228,315 +674,270 +112,277 +763,574 +956,726 +1011,129 +251,281 +806,887 +823,140 +1007,136 +581,206 +217,316 +360,621 +875,584 +580,668 +1093,316 +572,869 +130,833 +1279,217 +378,277 +341,851 +505,135 +313,53 +1304,114 +477,169 +1262,504 +266,624 +933,329 +663,208 +170,124 +1228,763 +202,836 +907,439 +1173,696 +797,259 +955,765 +557,646 +303,534 +1049,837 +1173,86 +954,859 +144,721 +67,375 +1208,830 +758,624 +867,53 +1206,217 +231,152 +62,628 +140,588 +453,523 +969,501 +251,165 +251,837 +1079,424 +187,190 +750,119 +977,201 +393,60 +1307,21 +1280,57 +1153,133 +1103,707 +833,871 +760,364 +557,57 +766,856 +55,416 +641,739 +425,834 +870,442 +591,548 +618,371 +231,742 +1297,576 +1096,520 +321,574 +1011,336 +1072,350 +107,656 +1170,588 +1230,312 +428,408 +237,145 +97,617 +1081,646 +331,683 +977,245 +490,691 +796,530 +344,38 +137,86 +202,724 +182,845 +566,444 +920,490 +870,617 +313,527 +556,842 +1128,397 +900,200 +100,266 +30,205 +59,329 +822,464 +1248,749 +984,373 +602,262 +1176,25 +753,613 +343,302 +443,53 +401,16 +738,197 +878,28 +425,646 +878,194 +592,593 +393,837 +1084,180 +872,411 +517,186 +1119,784 +393,732 +271,859 +5,873 +992,124 +1173,808 +902,144 +793,455 +547,798 + +fold along x=655 +fold along y=447 +fold along x=327 +fold along y=223 +fold along x=163 +fold along y=111 +fold along x=81 +fold along y=55 +fold along x=40 +fold along y=27 +fold along y=13 +fold along y=6 From c3747ba1af8bd6e1f78b48db4a7e0deccbbf64fa Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Mon, 13 Dec 2021 08:25:09 +0100 Subject: [PATCH 279/433] Refactor --- .../com/sbaars/adventofcode/common/Day.java | 4 +- .../adventofcode/common/grid/Coordinates.java | 62 +++++++++++++++++++ .../adventofcode/common/grid/NumGrid.java | 22 +++++++ .../sbaars/adventofcode/util/FetchInput.java | 2 +- .../adventofcode/year21/days/Day13.java | 28 ++++----- .../adventofcode/year21/days/Day14.java | 2 + 6 files changed, 101 insertions(+), 19 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode/common/grid/Coordinates.java diff --git a/src/main/java/com/sbaars/adventofcode/common/Day.java b/src/main/java/com/sbaars/adventofcode/common/Day.java index 2797e7e7..50ae1fa1 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Day.java +++ b/src/main/java/com/sbaars/adventofcode/common/Day.java @@ -11,10 +11,10 @@ import java.util.stream.Stream; public abstract class Day { - private static final String DEFAULT_DELIMITER = System.lineSeparator(); + public static final String DEFAULT_DELIMITER = System.lineSeparator(); protected final int year; protected final int day; - private int example = 0; + protected int example = 0; public Day(int year, int day) { this.year = year; diff --git a/src/main/java/com/sbaars/adventofcode/common/grid/Coordinates.java b/src/main/java/com/sbaars/adventofcode/common/grid/Coordinates.java new file mode 100644 index 00000000..aa24fd02 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/common/grid/Coordinates.java @@ -0,0 +1,62 @@ +package com.sbaars.adventofcode.common.grid; + +import static com.sbaars.adventofcode.common.Day.DEFAULT_DELIMITER; + +import java.awt.*; +import java.util.Arrays; +import java.util.Set; +import java.util.function.UnaryOperator; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class Coordinates { + public final Set coords; + + public Coordinates(Set c) { + this.coords = c; + } + + public Coordinates(Stream c) { + this.coords = c.collect(Collectors.toSet()); + } + + public Coordinates(String s){ + this(s, DEFAULT_DELIMITER, ","); + } + + public Coordinates(String s, String delimiter, String coordDelimiter) { + this.coords = Arrays.stream(s.split(delimiter)).map(e -> e.split(coordDelimiter)).map(e -> new Point(Integer.parseInt(e[0]), Integer.parseInt(e[1]))).collect(Collectors.toSet()); + } + + public Coordinates transform(UnaryOperator f){ + return new Coordinates(stream().map(f)); + } + + public Stream stream(){ + return coords.stream(); + } + + public NumGrid toGrid(){ + NumGrid g = new NumGrid(new long[sizeY()+1][sizeX()+1]); + coords.stream().map(e -> new Point(e.y, e.x)).forEach(e -> g.set(e, 1L)); + return g; + } + + private int sizeX() { + return stream().mapToInt(e -> e.x).max().getAsInt(); + } + + private int sizeY() { + return stream().mapToInt(e -> e.y).max().getAsInt(); + } + + public Coordinates mirrorX(){ + int sizeX = sizeX(); + return new Coordinates(coords.stream().map(p -> new Point(sizeX - p.x, p.y))); + } + + public Coordinates mirrorY(){ + int sizeY = sizeY(); + return new Coordinates(coords.stream().map(p -> new Point(p.x, sizeY - p.y))); + } +} diff --git a/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java b/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java index 18059f05..b321273d 100644 --- a/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java +++ b/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java @@ -39,6 +39,28 @@ public long countExcept(long...n) { return Math.toIntExact(iterateLong().filter(e -> LongStream.of(n).noneMatch(i -> i == e)).count()); } + public NumGrid mirrorX(){ + long[][] newGrid = new long[sizeX()][sizeY()]; + for(int i = 0; i folds; + public Day13() { super(13); + var in = day().split("\n\n"); + dots = new Coordinates(in[0]); + folds = Arrays.stream(in[1].split("\n")).map(e -> readString(e, "fold along %s=%n", Fold.class)).toList(); } public static void main(String[] args) { new Day13().printParts(); -// new Day13().submitPart1(); -// new Day13().submitPart2(); } @Override public Object part1() { - var in = day().split("\n\n"); - var dots = Arrays.stream(in[0].split("\n")).map(e -> e.split(",")).map(e -> new Point(Integer.parseInt(e[0]), Integer.parseInt(e[1]))).collect(Collectors.toSet()); - var folds = Arrays.stream(in[1].split("\n")).map(e -> readString(e, "fold along %s=%n", Fold.class)).toList(); - dots = dots.stream().map(e -> e.x>folds.get(0).n ? new Point(toIntExact(folds.get(0).n-(e.x-folds.get(0).n)), e.y) : e).collect(Collectors.toSet()); - return dots.size(); + return dots.stream().map(e -> fold(folds.get(0), e)).distinct().count(); } public record Fold (String axis, long n){} @Override public Object part2() { - var in = day().split("\n\n"); - var dots = Arrays.stream(in[0].split("\n")).map(e -> e.split(",")).map(e -> new Point(Integer.parseInt(e[0]), Integer.parseInt(e[1]))).collect(Collectors.toSet()); - var folds = Arrays.stream(in[1].split("\n")).map(e -> readString(e, "fold along %s=%n", Fold.class)).toList(); + var d = dots; for(Fold f : folds) { - dots = dots.stream().map(e -> fold(f, e)).collect(Collectors.toSet()); + d = d.transform(e -> fold(f, e)); } - NumGrid g = new NumGrid(new long[dots.stream().mapToInt(e -> e.y).max().getAsInt()][dots.stream().mapToInt(e -> e.x).max().getAsInt()]); - dots.stream().map(e -> new Point(e.y, e.x)).forEach(e -> g.set(e, 1L)); - return "\n"+g.toString().replace(",", "").replace("0", " "); + return "\n"+d.toGrid().toString().replace(",", "").replace("0", " "); } private Point fold(Fold f, Point e) { diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day14.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day14.java index 76013e7d..5075c8ad 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day14.java @@ -9,6 +9,8 @@ public Day14() { public static void main(String[] args) { new Day14().printParts(); +// new Day14().submitPart1(); +// new Day14().submitPart2(); } @Override From 08b27cd1c51d73e6623efd995b929af6e585b32c Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Mon, 13 Dec 2021 08:27:52 +0100 Subject: [PATCH 280/433] Line separator is system independent --- src/main/java/com/sbaars/adventofcode/common/Day.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/sbaars/adventofcode/common/Day.java b/src/main/java/com/sbaars/adventofcode/common/Day.java index 50ae1fa1..70bfe486 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Day.java +++ b/src/main/java/com/sbaars/adventofcode/common/Day.java @@ -11,7 +11,7 @@ import java.util.stream.Stream; public abstract class Day { - public static final String DEFAULT_DELIMITER = System.lineSeparator(); + public static final String DEFAULT_DELIMITER = "\n"; protected final int year; protected final int day; protected int example = 0; From adb061b3b726fd51681958681280dbc24d230c31 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Mon, 13 Dec 2021 12:20:48 +0100 Subject: [PATCH 281/433] Stuff --- README.md | 26 +++++++++++++++++++ .../adventofcode/common/grid/NumGrid.java | 4 +-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6b335c8f..c7ddd6c2 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,32 @@ Part 2: 101268110 Day 8: Part 1: 383 Part 2: 998900 + +Day 9: +Part 1: 468 +Part 2: 1280496 + +Day 10: +Part 1: 392421 +Part 2: 2769449099 + +Day 11: +Part 1: 1594 +Part 2: 437 + +Day 12: +Part 1: 3779 +Part 2: 96988 + +Day 13: +Part 1: 647 +Part 2: +1 1 1111 11 1 1 11 111 11 11 +1 1 1 1 1 1 1 1 1 1 1 1 +1111 111 1 1111 1 1 1 1 1 +1 1 1 1 1 1 1 111 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1111 11 1 1 11 1 1 11 11 ``` ## 2020 diff --git a/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java b/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java index b321273d..6493f123 100644 --- a/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java +++ b/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java @@ -101,7 +101,7 @@ public Stream stream() { @Override public String toString(){ StringBuilder res = new StringBuilder(); - for(long[] nums : grid) res.append(LongStream.of(nums).mapToObj(Long::toString).collect(Collectors.joining(","))+"\n"); + for(long[] nums : grid) res.append(LongStream.of(nums).mapToObj(Long::toString).collect(Collectors.joining(","))).append("\n"); return res.toString(); } @@ -121,7 +121,7 @@ public int sizeY(){ } public void set(Point p, long i) { - if(get(p) == -1) return; + if(get(p) == -1) throw new IllegalStateException("Trying to write to coordinate outside of grid: "+p+", "+i); grid[p.x][p.y] = i; } From 1de5dc348a11b9bc6815bdbc6177cf72e73035c2 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Tue, 14 Dec 2021 06:28:42 +0100 Subject: [PATCH 282/433] 2021 Day 14 --- .../sbaars/adventofcode/util/FetchInput.java | 2 +- .../adventofcode/year21/days/Day14.java | 39 ++++++- .../adventofcode/year21/days/Day15.java | 3 + src/main/resources/2021-examples/day14-1.txt | 18 ++++ src/main/resources/2021-examples/day14-2.txt | 5 + src/main/resources/2021/day14.txt | 102 ++++++++++++++++++ 6 files changed, 164 insertions(+), 5 deletions(-) create mode 100644 src/main/resources/2021-examples/day14-1.txt create mode 100644 src/main/resources/2021-examples/day14-2.txt create mode 100644 src/main/resources/2021/day14.txt diff --git a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java index 57dcdd2a..85217a56 100644 --- a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java +++ b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java @@ -27,7 +27,7 @@ private FetchInput() { } public static void main(String[] args) { - new FetchInput().retrieveDay("14", "2021"); + new FetchInput().retrieveDay("15", "2021"); } private void retrieveDay(String day, String year) { diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day14.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day14.java index 5075c8ad..872a68b2 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day14.java @@ -1,6 +1,9 @@ package com.sbaars.adventofcode.year21.days; +import com.sbaars.adventofcode.year19.util.LongCountMap; import com.sbaars.adventofcode.year21.Day2021; +import java.util.Arrays; +import java.util.stream.Collectors; public class Day14 extends Day2021 { public Day14() { @@ -9,17 +12,45 @@ public Day14() { public static void main(String[] args) { new Day14().printParts(); -// new Day14().submitPart1(); -// new Day14().submitPart2(); } @Override public Object part1() { - return ""; + return simulateSteps(10); + } + + private long simulateSteps(int steps) { + var in = day().split("\n\n"); + var init = in[0]; + var strs = Arrays.stream(in[1].split("\n")).map(e -> e.split(" -> ")).collect(Collectors.toMap(e -> e[0], e -> e[1])); + var pairs = new LongCountMap(); + for(int i = 0; i chCounts = new LongCountMap<>(); + init.chars().forEach(e -> chCounts.increment((char)e)); + for(int step = 1; step <= steps; step++){ + var newPairs = new LongCountMap(); + for(String pair : pairs.keySet()){ + long increment = pairs.get(pair); + if(strs.containsKey(pair)) { + String key = strs.get(pair); + String n1 = pair.substring(0, 1) + key; + String n2 = key + pair.substring(1, 2); + newPairs.increment(n1, increment); + newPairs.increment(n2, increment); + chCounts.increment(key.charAt(0), increment); + } else { + newPairs.increment(pair, increment); + } + } + pairs = newPairs; + } + return chCounts.values().stream().mapToLong(e -> e).max().getAsLong() - chCounts.values().stream().mapToLong(e -> e).min().getAsLong(); } @Override public Object part2() { - return ""; + return simulateSteps(40); } } diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java index 509ada2b..e886640b 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java @@ -9,10 +9,13 @@ public Day15() { public static void main(String[] args) { new Day15().printParts(); +// new Day15().submitPart1(); +// new Day15().submitPart2(); } @Override public Object part1() { + var in = day(); return ""; } diff --git a/src/main/resources/2021-examples/day14-1.txt b/src/main/resources/2021-examples/day14-1.txt new file mode 100644 index 00000000..b5594ddf --- /dev/null +++ b/src/main/resources/2021-examples/day14-1.txt @@ -0,0 +1,18 @@ +NNCB + +CH -> B +HH -> N +CB -> H +NH -> C +HB -> C +HC -> B +HN -> C +NN -> C +BH -> H +NC -> B +NB -> B +BN -> B +BB -> N +BC -> B +CC -> N +CN -> C diff --git a/src/main/resources/2021-examples/day14-2.txt b/src/main/resources/2021-examples/day14-2.txt new file mode 100644 index 00000000..71d2d9e5 --- /dev/null +++ b/src/main/resources/2021-examples/day14-2.txt @@ -0,0 +1,5 @@ +Template: NNCB +After step 1: NCNBCHB +After step 2: NBCCNBBBCBHCB +After step 3: NBBBCNCCNBBNBNBBCHBHHBCHB +After step 4: NBBNBNBBCCNBCNCCNBBNBBNBBBNBBNBBCBHCBHHNHCBBCBHCB diff --git a/src/main/resources/2021/day14.txt b/src/main/resources/2021/day14.txt new file mode 100644 index 00000000..5f2faae7 --- /dev/null +++ b/src/main/resources/2021/day14.txt @@ -0,0 +1,102 @@ +OFSVVSFOCBNONHKFHNPK + +HN -> C +VB -> K +PF -> C +BO -> F +PB -> F +OH -> H +OB -> N +PN -> O +KO -> V +CK -> V +FP -> H +PC -> V +PP -> N +FN -> N +CC -> F +FC -> N +BP -> N +SH -> F +NS -> V +KK -> B +HS -> C +NV -> N +FO -> B +VO -> S +KN -> F +SC -> V +NB -> H +CH -> B +SF -> V +NP -> V +FB -> P +CV -> B +PO -> P +SV -> P +OO -> V +PS -> C +CO -> N +SP -> B +KP -> H +KH -> S +KS -> S +NH -> K +SS -> P +PV -> P +KV -> V +ON -> N +BS -> C +HP -> K +SB -> P +VC -> B +HB -> N +FS -> V +VP -> K +BB -> N +FK -> S +CS -> P +SO -> F +HF -> F +VV -> C +BC -> S +SN -> K +KB -> H +BN -> H +HO -> S +KC -> F +CP -> S +HC -> S +OS -> K +NK -> N +BF -> S +VN -> B +SK -> K +HV -> B +KF -> H +FV -> B +VF -> H +BH -> S +NN -> O +HH -> K +CN -> H +PH -> V +NF -> S +OV -> P +OC -> V +OK -> H +OF -> H +HK -> N +FH -> P +BK -> N +VS -> H +NO -> V +VK -> K +CF -> N +CB -> N +NC -> K +PK -> B +VH -> F +FF -> C +BV -> P +OP -> K From 0195023d0e50f01aeeffed7cb0ca00f6eb5833f8 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Tue, 14 Dec 2021 07:16:12 +0100 Subject: [PATCH 283/433] Fix session key by trimming it --- src/main/java/com/sbaars/adventofcode/util/WebClient.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/sbaars/adventofcode/util/WebClient.java b/src/main/java/com/sbaars/adventofcode/util/WebClient.java index a4b5f141..6526e916 100644 --- a/src/main/java/com/sbaars/adventofcode/util/WebClient.java +++ b/src/main/java/com/sbaars/adventofcode/util/WebClient.java @@ -12,7 +12,7 @@ public class WebClient { public static HttpClient getClient() { - String session = getResourceAsString("APIKEY"); + String session = getResourceAsString("APIKEY").trim(); CookieHandler.setDefault(new CookieManager()); HttpCookie sessionCookie = new HttpCookie("session", session); From 17a4f71dbd273d4b54e35f73eac88729809289c7 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Wed, 15 Dec 2021 06:30:19 +0100 Subject: [PATCH 284/433] Day 15 Part 1 --- .../adventofcode/year21/days/Day15.java | 137 +++++++++++++++++- src/main/resources/2021-examples/day15-1.txt | 10 ++ src/main/resources/2021-examples/day15-2.txt | 10 ++ src/main/resources/2021/day15.txt | 100 +++++++++++++ 4 files changed, 255 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/2021-examples/day15-1.txt create mode 100644 src/main/resources/2021-examples/day15-2.txt create mode 100644 src/main/resources/2021/day15.txt diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java index e886640b..78b8cbea 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java @@ -1,6 +1,9 @@ package com.sbaars.adventofcode.year21.days; +import com.sbaars.adventofcode.common.grid.NumGrid; import com.sbaars.adventofcode.year21.Day2021; +import java.util.Comparator; +import java.util.PriorityQueue; public class Day15 extends Day2021 { public Day15() { @@ -15,8 +18,138 @@ public static void main(String[] args) { @Override public Object part1() { - var in = day(); - return ""; + var in = new NumGrid(day(), "\n", ""); + return shortestPath(in, in.sizeX()-1, in.sizeY()-1) - 1; + } + + static class Cell + { + int x; + int y; + long distance; + + Cell(int x, int y, long distance) + { + this.x = x; + this.y = y; + this.distance = distance; + } + } + + // Custom comparator for inserting cells +// into Priority Queue + static class distanceComparator + implements Comparator + { + public int compare(Cell a, Cell b) + { + if (a.distance < b.distance) + { + return -1; + } + else if (a.distance > b.distance) + { + return 1; + } + else {return 0;} + } + } + + // Method to return shortest path from +// top-corner to bottom-corner in 2D grid + static long shortestPath(NumGrid g, int row, + int col) + { + long[][] grid = g.grid; + long[][] dist = new long[row][col]; + int[] dx = { 1, 0 }; + int[] dy = { 0, 1 }; + + // Initializing distance array by INT_MAX + for(int i = 0; i < row; i++) + { + for(int j = 0; j < col; j++) + { + dist[i][j] = Integer.MAX_VALUE; + } + } + + // Initialized source distance as + // initial grid position value + dist[0][0] = grid[0][0]; + + PriorityQueue pq = new PriorityQueue( + row * col, new distanceComparator()); + + // Insert source cell to priority queue + pq.add(new Cell(0, 0, dist[0][0])); + while (!pq.isEmpty()) + { + Cell curr = pq.poll(); + for(int i = 0; i < dx.length; i++) + { + int rows = curr.x + dx[i]; + int cols = curr.y + dy[i]; + + if (isInsideGrid(rows, cols, dist.length, dist[0].length)) + { + if (dist[rows][cols] > dist[curr.x][curr.y] + grid[rows][cols]) + { + + // If Cell is already been reached once, + // remove it from priority queue + if (dist[rows][cols] != Integer.MAX_VALUE) + { + Cell adj = new Cell(rows, cols, + dist[rows][cols]); + + pq.remove(adj); + } + + // Insert cell with updated distance + dist[rows][cols] = dist[curr.x][curr.y] + + grid[rows][cols]; + + pq.add(new Cell(rows, cols, + dist[rows][cols])); + } + } + } + } + return dist[row - 1][col - 1]; + } + +// +// static long min(long x, long y, long z) +// { +// if (x < y) +// return (x < z) ? x : z; +// else +// return (y < z) ? y : z; +// } + +// /* Returns cost of minimum cost path +// from (0,0) to (m, n) in mat[R][C]*/ +// static long minCost(long cost[][], int m, +// int n) +// { +// Map +// queue.clear(); +// if (n < 0 || m < 0) +// return Integer.MAX_VALUE; +// else if (m == 0 && n == 0) +// return cost[m][n]; +// else +// return cost[m][n] + +// Math.min( +// minCost(cost, m-1, n), +// minCost(cost, m, n-1) ); +// } + + static boolean isInsideGrid(int i, int j, int sizex, int sizey) + { + return (i >= 0 && i < sizex && + j >= 0 && j < sizey); } @Override diff --git a/src/main/resources/2021-examples/day15-1.txt b/src/main/resources/2021-examples/day15-1.txt new file mode 100644 index 00000000..ab80887e --- /dev/null +++ b/src/main/resources/2021-examples/day15-1.txt @@ -0,0 +1,10 @@ +1163751742 +1381373672 +2136511328 +3694931569 +7463417111 +1319128137 +1359912421 +3125421639 +1293138521 +2311944581 diff --git a/src/main/resources/2021-examples/day15-2.txt b/src/main/resources/2021-examples/day15-2.txt new file mode 100644 index 00000000..ab80887e --- /dev/null +++ b/src/main/resources/2021-examples/day15-2.txt @@ -0,0 +1,10 @@ +1163751742 +1381373672 +2136511328 +3694931569 +7463417111 +1319128137 +1359912421 +3125421639 +1293138521 +2311944581 diff --git a/src/main/resources/2021/day15.txt b/src/main/resources/2021/day15.txt new file mode 100644 index 00000000..aec1dc0b --- /dev/null +++ b/src/main/resources/2021/day15.txt @@ -0,0 +1,100 @@ +9197799967142949711924912559857266425989892895795349989935678852856491866597249883454355721838994689 +9454699428952977916248797687374199797579937166959985575934687799286278395799834599823725191768264239 +1476124567678962892998242114658368169969196949893799969968932492875835669928535888516585889557294857 +5791918239996678837798182119995286749674958736799996579937942199999478117296491681956799173479469697 +7169635399716469741872348399984999149999916841724586589959931149912818998567241788593818767699883858 +2926741911914636315187918554497249439756557979631699768168949899866796175449994999986688215771687939 +5589949979145888769995885998892975199254611397986145389381187633664799879995799643887357299151772988 +8889465966717911191788336792214278123584765871499472917878297279329199386164989887784939824172612679 +4449128566587999796639991816798948898951855942998816126957898821255977428897977658516999988855449929 +3999895395663995233116579986688778269699389615982998939659193247918999668975597863299499276267179878 +9989933899158995519999896763539929676935591584991626616943495964888658981438483529376937899999918183 +4829998579654495951971971638691618176277519996856988429168266495831212992486396955413697829886599968 +1853513748489779798696199795337967571689486839899518982881879699995999878971985995885285319954968987 +3342299981292915486979299839195993258148889649679616595927478298168379999445161915519894982439638946 +5741832898766672398489974989541186971799425919242686599739939448731546446299879192192895526548848951 +3898679419518979696926476691872981828746218226918199699898828285487879261678997791767663979571336987 +4545997398729587476481757668995896459799851954917678912468571968713532133518634849896488769111976969 +7176919181998999666976198114775775798299797193972885999975499799991922929283534929891716288936629899 +9795297985299599814789928888579191456982553599491674489819963299121598519964298979361694995981918669 +5647159999798466469859785261859791688182892567989542289667144152647594189396864175439725912999894891 +6854155179889746985993265989674997919485741213772961693991919182852979468522779889946746945979139453 +6849999911316858193858699583834199555997997298798955876892868311369313778113995754199257992891592559 +1988966163847446296579892411648896918797968187847519149178391233772828798998561969939976192876594877 +7445186982744995399469915773579589785637114845746289739271566921956439346833864949599959561392652394 +3457499487895199558673758745718298693289788928968598234991939776753988979879884594869769919728168682 +6996592996822655364687387657828999681917991869422948671996356522399889425477419816794863249587691838 +6963522693998786991158579735619989997779699892985724296997797588989857395266828998498892969725581196 +9859966989665161194892178862589775985492499749698891478876986292862589878985699921967994865598972548 +1951799998898999888869856412883984488695132895819836992634797721986196995697288654968728619832457546 +7746279941985434489778669988695998998439885687679569278711958998865855737897118129117847196853321494 +9957647198999793952568873984933619771962796482459488211592975286761921259894198995991177799599947499 +5957899335983477859964986862162667699875586266873467199919735154293718617894984899199896937396169696 +4896218869754451981289699181969462479929965399769819937374193998929686992335854771796763991919183598 +7963369964836263326663688188689148549887888951793951217896899686213646979917379984981861249989999549 +5651487588851599919775191184948759985836569954819197496898639599422949846969583849582827172889781259 +9235786148996892968113972727222986857799699985848999699389987299798673597919859879142818978191972699 +6268697925898964971528988971776886593959277157692478749421918568187987285285135794835198267899129444 +9613855792729968968874877878798998856696549799999913939938579165969969665999919899989935397982894528 +4997991949899429999159159577397714989959998878621218913971667491519691231899789262795929815768874159 +9965848836163359381441957989236819923219977614754398952174759999868197879998492826999779999614619568 +9916479998414596768939496337988287974996399692819868258768657938573834799119189969847332997799632969 +5698447299748197429895187981999374113864719439577495356699467714279996684998225889418687785989668887 +9688999296549647577489651538861651536198886343717392492893999157912496817872939573767915879229444698 +7945998891978892984213828992819989424969949768551929992192128218217979514375299388969726393999499369 +3584919181979999899979852691745679631417252595865981248933848728931198122729313884939499699196979282 +8858721793437795394466977529919919969898771537432681496711998968886579589984829981259798525932187987 +9588959797973868917749898922898847727866979662399888886799981719567732464855989797669812177692858535 +7988797967989166987697149888751549873389785967924498738998179527778487979748999358518578993477944998 +8392255427879688981984196873699686714549989266862782196183895285962499989186484692151849999723391279 +8437165279966699964797868697998719161124994112294916994518516866198924776139989889587889979986973818 +9999579881886267995145198999799886398912847997191746855988699599911799599898975959729735998989189975 +8878929798597768927495551149914988384939936997932243691336699915979516239489822517874899851799315136 +7999937717928948478557923788987292447971689615966385935897391982999178899753365199984698878762193326 +8739178873349956119674999899899922517642862785199198189839768689799987895289957563983787873796927158 +3817196699929999634811599428583198399931978688187175989163313588911897784917986562919151677117114699 +5998827143845268748266989727984179597967556224858671494997248677843425189898194987624713779882979969 +1291199757967569999681279489899999698569168979799631778127984994974999291683887763915481598891197984 +6596739399885895975872877952961612873986668999381529399939575996779494715118543849969191539989723991 +6488878279986978392869749226828917999488959898183448591336188881881342378769238973895889159556799994 +7789977876961783236719451481787118498693824114361919936786189899181887229316982176859199279192424145 +8187849893991985235499899257668519419992986629984899637874749832449368983739929946889995497697325581 +1999982976844663788727661849815985519275791155239799816978282652839694868889597292189945989632996979 +5996994949412446932824171982727298987629311193781981698399298991594594318144966895296816539941754949 +4499757999646423149686819991849992649795216851367986996698575817689371687185996929563284536999154386 +2781727997917211978984917918358938837999218781629649869594796149935179779682659626959939761694881741 +9699391853588289298623919874976619984895139963999399988216318999974869174298698357691152898189998496 +4692148898295579969948321265945989989678928997293841391798864427891761873993391876712881438989147999 +9385356844999749799945931891327611796839596933696939993396192727919575919518191178749822279279367589 +4178987198748999878181711949999695619267692321571299944319696913971989366952788997529689965967283949 +9956943168197988495985856862549149864798959861938533689969366917899972839492619882179391815935536891 +9994859897582628653476292984929998647975796929748931992994879889878464879929465595995992499919947572 +6499868699811766722988787191388665966891869899747691981279799666949896666275972998579926239169811939 +2572961395969294529184998258989427519999852294469971796436995767291982749996658711449539791567874971 +9499369277479918778697894247918649998897952638574461819998871478917181981936547491991768414982337918 +9139161883819343891979967499192937131885599318821172899173915229917976858689192989939199991289159588 +4587788966993732467999991118887435975882488728997989199779497777813778259387411882768829389897869948 +6997871988679928999697816865977788699836897997854449113119982463997827969671859996988242232984999889 +7669989748189979988148659979989987372886949695793489235995874977587946688195985837946785781783754816 +9949977989988894882969918629379321181514166935688979461975779949979998632331698911979279798659979815 +5739999517928987777759268697378941991838969832887199538988396198131293696546792877869527666136992871 +6911198997889976167798919887987969916181719673692949986396122688692969199128693334898362117657497517 +9883388858893695671398924917987816149792972888297996689846999676959672799729896341199962982814179963 +1987996499791423676141938518943291126997238886492375594975195733297999897928779997671984971349299794 +9797999699795947998399566993717699681855989845386398419161478733246296117437796411784118959196917998 +8918619981898886893637776664327129356976966478348969779281122928599816797994927899617318362459879958 +9971138998498917194898897279183767784951818668325759559698816239496896576197991168919876998549693617 +8864749334257944937895657676795539372789673639872688475887819638876957529359787979549486769488261586 +5675561487189788698114476929665946299225219355166913169787589274369169599695999791361786439583994855 +9999956599855466924168799196849941988317721987382287618899839584541991357959855181948139679757198596 +9298494784765969999565792229687116986883978789756616279977893754489916919955299588991939854273184891 +1996653993894556999967399479699996198846899917783471221742335181981132427871897521999889788298436396 +9758778754778989199415992499539647886721912925345489999475288846844991977933449238525898929369479361 +3799665999998683118595895926116918889199463219817924394877958956698592828621676399199495183592857893 +5747926316986915679999389948959192389893246767655852888242899482429279815191681819582769989759282619 +8557944289929978419989549449497998796197294159289979966862799744989186832759979889797777669569898889 +8887698917197579219988794948269467999589319398686198699795225872219199592696935791919185797715588919 +1498696799724916519515862974893197748928697249299992999324589578163647988841492955996651937876156824 +8213962617983488919185253728699798941119614245999164229898897586922898965749999199113889146668885849 +9547881767999183972817991938941799195699921244999582934834983168189915191587942659337539518189911869 +9958877559791958745797981284916899539983986257869698291725831953753946984998659154999916977712958828 From 3073b78dfbaf885a12c165387a54c82c4fb512b6 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Wed, 15 Dec 2021 06:50:41 +0100 Subject: [PATCH 285/433] Part 2 progress --- .../adventofcode/year21/days/Day15.java | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java index 78b8cbea..f4652cf5 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java @@ -11,7 +11,7 @@ public Day15() { } public static void main(String[] args) { - new Day15().printParts(); + new Day15().printParts(1); // new Day15().submitPart1(); // new Day15().submitPart2(); } @@ -19,7 +19,7 @@ public static void main(String[] args) { @Override public Object part1() { var in = new NumGrid(day(), "\n", ""); - return shortestPath(in, in.sizeX()-1, in.sizeY()-1) - 1; + return shortestPath(in, in.sizeX()-1, in.sizeY()-1, 1); } static class Cell @@ -58,17 +58,17 @@ else if (a.distance > b.distance) // Method to return shortest path from // top-corner to bottom-corner in 2D grid static long shortestPath(NumGrid g, int row, - int col) + int col, int resize) { long[][] grid = g.grid; - long[][] dist = new long[row][col]; + long[][] dist = new long[g.sizeX()*resize][g.sizeY()*resize]; int[] dx = { 1, 0 }; int[] dy = { 0, 1 }; // Initializing distance array by INT_MAX - for(int i = 0; i < row; i++) + for(int i = 0; i < dist.length; i++) { - for(int j = 0; j < col; j++) + for(int j = 0; j < dist[0].length; j++) { dist[i][j] = Integer.MAX_VALUE; } @@ -76,10 +76,9 @@ static long shortestPath(NumGrid g, int row, // Initialized source distance as // initial grid position value - dist[0][0] = grid[0][0]; + dist[0][0] = 0; - PriorityQueue pq = new PriorityQueue( - row * col, new distanceComparator()); + PriorityQueue pq = new PriorityQueue<>(row * col, new distanceComparator()); // Insert source cell to priority queue pq.add(new Cell(0, 0, dist[0][0])); @@ -93,7 +92,8 @@ static long shortestPath(NumGrid g, int row, if (isInsideGrid(rows, cols, dist.length, dist[0].length)) { - if (dist[rows][cols] > dist[curr.x][curr.y] + grid[rows][cols]) + long gridNum = (grid[rows % grid.length][cols % grid.length] + (rows/dist.length)) % 10; + if (dist[rows][cols] > dist[curr.x][curr.y] + gridNum) { // If Cell is already been reached once, @@ -108,7 +108,7 @@ static long shortestPath(NumGrid g, int row, // Insert cell with updated distance dist[rows][cols] = dist[curr.x][curr.y] + - grid[rows][cols]; + gridNum; pq.add(new Cell(rows, cols, dist[rows][cols])); @@ -116,7 +116,7 @@ static long shortestPath(NumGrid g, int row, } } } - return dist[row - 1][col - 1]; + return dist[dist.length-1][dist[0].length-1]; } // @@ -148,12 +148,12 @@ static long shortestPath(NumGrid g, int row, static boolean isInsideGrid(int i, int j, int sizex, int sizey) { - return (i >= 0 && i < sizex && - j >= 0 && j < sizey); + return (i >= 0 && i < sizex && j >= 0 && j < sizey); } @Override public Object part2() { - return ""; + var in = new NumGrid(day(), "\n", ""); + return shortestPath(in, (in.sizeX()*5)-1, (in.sizeY()*5)-1, 5) - 1; } } From ba4872fc897c822d342bd165897c577e0fb6522e Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Wed, 15 Dec 2021 07:10:13 +0100 Subject: [PATCH 286/433] Simulate grid correctly --- .../adventofcode/year21/days/Day15.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java index f4652cf5..3559a015 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java @@ -8,10 +8,12 @@ public class Day15 extends Day2021 { public Day15() { super(15); + this.example = 1; } public static void main(String[] args) { - new Day15().printParts(1); +// new Day15().printParts(1); + System.out.println(new Day15().part2()); // new Day15().submitPart1(); // new Day15().submitPart2(); } @@ -61,6 +63,17 @@ static long shortestPath(NumGrid g, int row, int col, int resize) { long[][] grid = g.grid; + + long[][] grid2 = new long[g.sizeX()*resize][g.sizeY()*resize]; + for(int i = 0; i < grid2.length; i++) + { + for(int j = 0; j < grid2[0].length; j++) + { + grid2[i][j] = (grid[i % grid.length][j % grid.length] + (i/grid.length) + (j/grid[0].length)) % 10; +// System.out.println(grid2[i][j]); + } + } + long[][] dist = new long[g.sizeX()*resize][g.sizeY()*resize]; int[] dx = { 1, 0 }; int[] dy = { 0, 1 }; @@ -92,7 +105,8 @@ static long shortestPath(NumGrid g, int row, if (isInsideGrid(rows, cols, dist.length, dist[0].length)) { - long gridNum = (grid[rows % grid.length][cols % grid.length] + (rows/dist.length)) % 10; + long gridNum = (grid[rows % grid.length][cols % grid.length] + (rows/grid.length) + (cols/grid[0].length)) % 10; +// System.out.println("("+grid[rows % grid.length][cols % grid.length]+" + "+(rows/grid.length)+") % 10 -> " + ((grid[rows % grid.length][cols % grid.length] + (rows/grid.length)) % 10)); if (dist[rows][cols] > dist[curr.x][curr.y] + gridNum) { @@ -154,6 +168,6 @@ static boolean isInsideGrid(int i, int j, int sizex, int sizey) @Override public Object part2() { var in = new NumGrid(day(), "\n", ""); - return shortestPath(in, (in.sizeX()*5)-1, (in.sizeY()*5)-1, 5) - 1; + return shortestPath(in, (in.sizeX()*5)-1, (in.sizeY()*5)-1, 5); } } From b78c52eb0474cb02f6a4cfe335b0bec36a5c5236 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Wed, 15 Dec 2021 07:16:17 +0100 Subject: [PATCH 287/433] Finish up --- .../adventofcode/year21/days/Day15.java | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java index 3559a015..ac2dacb4 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java @@ -8,12 +8,10 @@ public class Day15 extends Day2021 { public Day15() { super(15); - this.example = 1; } public static void main(String[] args) { -// new Day15().printParts(1); - System.out.println(new Day15().part2()); + new Day15().printParts(); // new Day15().submitPart1(); // new Day15().submitPart2(); } @@ -105,27 +103,20 @@ static long shortestPath(NumGrid g, int row, if (isInsideGrid(rows, cols, dist.length, dist[0].length)) { - long gridNum = (grid[rows % grid.length][cols % grid.length] + (rows/grid.length) + (cols/grid[0].length)) % 10; + long gridNum = grid[rows % grid.length][cols % grid.length] + (rows/grid.length) + (cols/grid[0].length); + if(gridNum >= 10) gridNum -= 9; // System.out.println("("+grid[rows % grid.length][cols % grid.length]+" + "+(rows/grid.length)+") % 10 -> " + ((grid[rows % grid.length][cols % grid.length] + (rows/grid.length)) % 10)); if (dist[rows][cols] > dist[curr.x][curr.y] + gridNum) { - - // If Cell is already been reached once, - // remove it from priority queue if (dist[rows][cols] != Integer.MAX_VALUE) { - Cell adj = new Cell(rows, cols, - dist[rows][cols]); - + Cell adj = new Cell(rows, cols, dist[rows][cols]); pq.remove(adj); } - // Insert cell with updated distance - dist[rows][cols] = dist[curr.x][curr.y] + - gridNum; + dist[rows][cols] = dist[curr.x][curr.y] + gridNum; - pq.add(new Cell(rows, cols, - dist[rows][cols])); + pq.add(new Cell(rows, cols, dist[rows][cols])); } } } From 6780999c1e2a35ab3538c8d5f8588a7003c29518 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Wed, 15 Dec 2021 07:31:41 +0100 Subject: [PATCH 288/433] Refactoring --- .../adventofcode/year21/days/Day15.java | 101 +++--------------- 1 file changed, 12 insertions(+), 89 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java index ac2dacb4..841b54a7 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java @@ -22,53 +22,17 @@ public Object part1() { return shortestPath(in, in.sizeX()-1, in.sizeY()-1, 1); } - static class Cell - { - int x; - int y; - long distance; - - Cell(int x, int y, long distance) - { - this.x = x; - this.y = y; - this.distance = distance; - } - } - - // Custom comparator for inserting cells -// into Priority Queue - static class distanceComparator - implements Comparator - { - public int compare(Cell a, Cell b) - { - if (a.distance < b.distance) - { - return -1; - } - else if (a.distance > b.distance) - { - return 1; - } - else {return 0;} - } - } + public record Cell(int x, int y, long distance){} - // Method to return shortest path from -// top-corner to bottom-corner in 2D grid static long shortestPath(NumGrid g, int row, int col, int resize) { long[][] grid = g.grid; long[][] grid2 = new long[g.sizeX()*resize][g.sizeY()*resize]; - for(int i = 0; i < grid2.length; i++) - { - for(int j = 0; j < grid2[0].length; j++) - { + for(int i = 0; i < grid2.length; i++) { + for(int j = 0; j < grid2[0].length; j++) { grid2[i][j] = (grid[i % grid.length][j % grid.length] + (i/grid.length) + (j/grid[0].length)) % 10; -// System.out.println(grid2[i][j]); } } @@ -76,11 +40,8 @@ static long shortestPath(NumGrid g, int row, int[] dx = { 1, 0 }; int[] dy = { 0, 1 }; - // Initializing distance array by INT_MAX - for(int i = 0; i < dist.length; i++) - { - for(int j = 0; j < dist[0].length; j++) - { + for(int i = 0; i < dist.length; i++) { + for(int j = 0; j < dist[0].length; j++) { dist[i][j] = Integer.MAX_VALUE; } } @@ -89,27 +50,21 @@ static long shortestPath(NumGrid g, int row, // initial grid position value dist[0][0] = 0; - PriorityQueue pq = new PriorityQueue<>(row * col, new distanceComparator()); + PriorityQueue pq = new PriorityQueue<>(row * col, Comparator.comparing(Cell::distance).reversed()); // Insert source cell to priority queue pq.add(new Cell(0, 0, dist[0][0])); - while (!pq.isEmpty()) - { + while (!pq.isEmpty()) { Cell curr = pq.poll(); - for(int i = 0; i < dx.length; i++) - { + for(int i = 0; i < dx.length; i++) { int rows = curr.x + dx[i]; int cols = curr.y + dy[i]; - if (isInsideGrid(rows, cols, dist.length, dist[0].length)) - { + if (rows >= 0 && rows < dist.length && cols >= 0 && cols < dist[0].length) { long gridNum = grid[rows % grid.length][cols % grid.length] + (rows/grid.length) + (cols/grid[0].length); - if(gridNum >= 10) gridNum -= 9; -// System.out.println("("+grid[rows % grid.length][cols % grid.length]+" + "+(rows/grid.length)+") % 10 -> " + ((grid[rows % grid.length][cols % grid.length] + (rows/grid.length)) % 10)); - if (dist[rows][cols] > dist[curr.x][curr.y] + gridNum) - { - if (dist[rows][cols] != Integer.MAX_VALUE) - { + while(gridNum >= 10) gridNum -= 9; + if (dist[rows][cols] > dist[curr.x][curr.y] + gridNum) { + if (dist[rows][cols] != Integer.MAX_VALUE) { Cell adj = new Cell(rows, cols, dist[rows][cols]); pq.remove(adj); } @@ -124,38 +79,6 @@ static long shortestPath(NumGrid g, int row, return dist[dist.length-1][dist[0].length-1]; } -// -// static long min(long x, long y, long z) -// { -// if (x < y) -// return (x < z) ? x : z; -// else -// return (y < z) ? y : z; -// } - -// /* Returns cost of minimum cost path -// from (0,0) to (m, n) in mat[R][C]*/ -// static long minCost(long cost[][], int m, -// int n) -// { -// Map -// queue.clear(); -// if (n < 0 || m < 0) -// return Integer.MAX_VALUE; -// else if (m == 0 && n == 0) -// return cost[m][n]; -// else -// return cost[m][n] + -// Math.min( -// minCost(cost, m-1, n), -// minCost(cost, m, n-1) ); -// } - - static boolean isInsideGrid(int i, int j, int sizex, int sizey) - { - return (i >= 0 && i < sizex && j >= 0 && j < sizey); - } - @Override public Object part2() { var in = new NumGrid(day(), "\n", ""); From 62722d3b5624e84cb949f0bb27600b395785395a Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Wed, 15 Dec 2021 07:35:10 +0100 Subject: [PATCH 289/433] More refactoring --- .../adventofcode/year21/days/Day15.java | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java index 841b54a7..7bdb88b8 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java @@ -22,7 +22,7 @@ public Object part1() { return shortestPath(in, in.sizeX()-1, in.sizeY()-1, 1); } - public record Cell(int x, int y, long distance){} + record Cell (int x, int y, long distance) {} static long shortestPath(NumGrid g, int row, int col, int resize) @@ -30,8 +30,10 @@ static long shortestPath(NumGrid g, int row, long[][] grid = g.grid; long[][] grid2 = new long[g.sizeX()*resize][g.sizeY()*resize]; - for(int i = 0; i < grid2.length; i++) { - for(int j = 0; j < grid2[0].length; j++) { + for(int i = 0; i < grid2.length; i++) + { + for(int j = 0; j < grid2[0].length; j++) + { grid2[i][j] = (grid[i % grid.length][j % grid.length] + (i/grid.length) + (j/grid[0].length)) % 10; } } @@ -46,13 +48,9 @@ static long shortestPath(NumGrid g, int row, } } - // Initialized source distance as - // initial grid position value dist[0][0] = 0; - PriorityQueue pq = new PriorityQueue<>(row * col, Comparator.comparing(Cell::distance).reversed()); - - // Insert source cell to priority queue + PriorityQueue pq = new PriorityQueue<>(row * col, Comparator.comparing(Cell::distance)); pq.add(new Cell(0, 0, dist[0][0])); while (!pq.isEmpty()) { Cell curr = pq.poll(); @@ -60,9 +58,10 @@ static long shortestPath(NumGrid g, int row, int rows = curr.x + dx[i]; int cols = curr.y + dy[i]; - if (rows >= 0 && rows < dist.length && cols >= 0 && cols < dist[0].length) { + if (isInsideGrid(rows, cols, dist.length, dist[0].length)) { long gridNum = grid[rows % grid.length][cols % grid.length] + (rows/grid.length) + (cols/grid[0].length); - while(gridNum >= 10) gridNum -= 9; + if(gridNum >= 10) gridNum -= 9; + if (dist[rows][cols] > dist[curr.x][curr.y] + gridNum) { if (dist[rows][cols] != Integer.MAX_VALUE) { Cell adj = new Cell(rows, cols, dist[rows][cols]); @@ -78,6 +77,10 @@ static long shortestPath(NumGrid g, int row, } return dist[dist.length-1][dist[0].length-1]; } + + static boolean isInsideGrid(int i, int j, int sizex, int sizey) { + return i >= 0 && i < sizex && j >= 0 && j < sizey; + } @Override public Object part2() { From 17a9478d80e985696eed15fb9634aa6f742deca4 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Wed, 15 Dec 2021 07:51:02 +0100 Subject: [PATCH 290/433] Remove test code --- .../sbaars/adventofcode/year21/days/Day15.java | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java index 7bdb88b8..c4687851 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java @@ -24,20 +24,9 @@ public Object part1() { record Cell (int x, int y, long distance) {} - static long shortestPath(NumGrid g, int row, - int col, int resize) + static long shortestPath(NumGrid g, int row, int col, int resize) { long[][] grid = g.grid; - - long[][] grid2 = new long[g.sizeX()*resize][g.sizeY()*resize]; - for(int i = 0; i < grid2.length; i++) - { - for(int j = 0; j < grid2[0].length; j++) - { - grid2[i][j] = (grid[i % grid.length][j % grid.length] + (i/grid.length) + (j/grid[0].length)) % 10; - } - } - long[][] dist = new long[g.sizeX()*resize][g.sizeY()*resize]; int[] dx = { 1, 0 }; int[] dy = { 0, 1 }; @@ -77,7 +66,7 @@ static long shortestPath(NumGrid g, int row, } return dist[dist.length-1][dist[0].length-1]; } - + static boolean isInsideGrid(int i, int j, int sizex, int sizey) { return i >= 0 && i < sizex && j >= 0 && j < sizey; } From df3cdafc6c36b53f479a853464ce39fa8bbf4e43 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Thu, 16 Dec 2021 06:59:20 +0100 Subject: [PATCH 291/433] Day 16 Progress --- .../sbaars/adventofcode/util/FetchInput.java | 2 +- .../adventofcode/year21/days/Day15.java | 2 - .../adventofcode/year21/days/Day16.java | 106 +++++++++++++++++- src/main/resources/2021-examples/day16-1.txt | 16 +++ src/main/resources/2021-examples/day16-2.txt | 2 + src/main/resources/2021-examples/day16-3.txt | 2 + src/main/resources/2021-examples/day16-4.txt | 2 + src/main/resources/2021/day16.txt | 1 + 8 files changed, 128 insertions(+), 5 deletions(-) create mode 100644 src/main/resources/2021-examples/day16-1.txt create mode 100644 src/main/resources/2021-examples/day16-2.txt create mode 100644 src/main/resources/2021-examples/day16-3.txt create mode 100644 src/main/resources/2021-examples/day16-4.txt create mode 100644 src/main/resources/2021/day16.txt diff --git a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java index 85217a56..31330810 100644 --- a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java +++ b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java @@ -27,7 +27,7 @@ private FetchInput() { } public static void main(String[] args) { - new FetchInput().retrieveDay("15", "2021"); + new FetchInput().retrieveDay("16", "2021"); } private void retrieveDay(String day, String year) { diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java index c4687851..e2ef0516 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java @@ -12,8 +12,6 @@ public Day15() { public static void main(String[] args) { new Day15().printParts(); -// new Day15().submitPart1(); -// new Day15().submitPart2(); } @Override diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day16.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day16.java index 66c5f004..864a8dc1 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day16.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day16.java @@ -1,6 +1,9 @@ package com.sbaars.adventofcode.year21.days; import com.sbaars.adventofcode.year21.Day2021; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; public class Day16 extends Day2021 { @@ -10,15 +13,114 @@ public Day16() { public static void main(String[] args) { new Day16().printParts(); +// new Day16().submitPart1(); +// new Day16().submitPart2(); } + + @Override public Object part1() { - return ""; +// System.out.println(findSum("D2FE28")); +// System.out.println(findSum("38006F45291200")); +// System.out.println(findSum("EE00D40C823060")); +// System.out.println(findSum("8A004A801A8002F478")); + return findSum(day()); + } + + private long findSum(String hex) { + var in = hexToBin(hex.trim()); + return findPackets(in); + } + + private long findPackets(String in) { + long sum = 0; + for(int i = 0; i< in.length();){ + if(in.substring(i).chars().allMatch(e -> e == '0')) break; + int version = binToDec(in.substring(i, i+3)); + sum+=version; + int id = binToDec(in.substring(i+3, i+6)); + i+=6; + if(id == 4){ + for(;;i+=5){ + if(in.charAt(i) == '0'){ + i+=5; + break; + } + } + } else { + int lengthLength = 15; + boolean b = in.charAt(i) == '1'; + if(b){ + lengthLength = 11; + } + i++; + int length = binToDec(in.substring(i, i+lengthLength)); + i+=lengthLength; + if(!b) { + sum += findPackets(in.substring(i, i + length)); + i += length; + } + } + } + return sum; + } + + String hexToBin(String s) { + return String.format("%"+(s.length()*4)+"s", new BigInteger(s, 16).toString(2)).replace(" ", "0"); + } + + int binToDec(String s) { + return Integer.parseInt(new BigInteger(s, 2).toString(10)); } @Override public Object part2() { - return ""; + return findSum2(day()); + } + + private long findSum2(String hex) { + var in = hexToBin(hex.trim()); + return findPackets2(in, Integer.MAX_VALUE).get(0); + } + + private List findPackets2(String in, int toParse) { + List res = new ArrayList<>(); + long sum = 0; + for(int i = 0, parsed = 0; i< in.length();parsed++){ + if(parsed >= toParse) break; + if(in.substring(i).chars().allMatch(e -> e == '0')) break; + int version = binToDec(in.substring(i, i+3)); + int id = binToDec(in.substring(i+3, i+6)); + i+=6; + if(id == 4){ + String s = ""; + for(;;i+=5){ + s+=in.substring(i+1, i+5); + if(in.charAt(i) == '0'){ + i+=5; + break; + } + } + res.add((long)binToDec(s)); + } else { + int lengthLength = 15; + boolean b = in.charAt(i) == '1'; + if(b){ + lengthLength = 11; + } + i++; + int length = binToDec(in.substring(i, i+lengthLength)); + i+=lengthLength; + List op = findPackets2(in.substring(i, b ? in.length() : (i + length)), b ? length : Integer.MAX_VALUE); + performOp(op, id); + i += length; + } + } + return res; + } + + private void performOp(List op, int id) { + } } diff --git a/src/main/resources/2021-examples/day16-1.txt b/src/main/resources/2021-examples/day16-1.txt new file mode 100644 index 00000000..6f3b77b4 --- /dev/null +++ b/src/main/resources/2021-examples/day16-1.txt @@ -0,0 +1,16 @@ +0 = 0000 +1 = 0001 +2 = 0010 +3 = 0011 +4 = 0100 +5 = 0101 +6 = 0110 +7 = 0111 +8 = 1000 +9 = 1001 +A = 1010 +B = 1011 +C = 1100 +D = 1101 +E = 1110 +F = 1111 diff --git a/src/main/resources/2021-examples/day16-2.txt b/src/main/resources/2021-examples/day16-2.txt new file mode 100644 index 00000000..e9e6c2dc --- /dev/null +++ b/src/main/resources/2021-examples/day16-2.txt @@ -0,0 +1,2 @@ +110100101111111000101000 +VVVTTTAAAAABBBBBCCCCC diff --git a/src/main/resources/2021-examples/day16-3.txt b/src/main/resources/2021-examples/day16-3.txt new file mode 100644 index 00000000..d2d7df74 --- /dev/null +++ b/src/main/resources/2021-examples/day16-3.txt @@ -0,0 +1,2 @@ +00111000000000000110111101000101001010010001001000000000 +VVVTTTILLLLLLLLLLLLLLLAAAAAAAAAAABBBBBBBBBBBBBBBB diff --git a/src/main/resources/2021-examples/day16-4.txt b/src/main/resources/2021-examples/day16-4.txt new file mode 100644 index 00000000..2651a833 --- /dev/null +++ b/src/main/resources/2021-examples/day16-4.txt @@ -0,0 +1,2 @@ +11101110000000001101010000001100100000100011000001100000 +VVVTTTILLLLLLLLLLLAAAAAAAAAAABBBBBBBBBBBCCCCCCCCCCC diff --git a/src/main/resources/2021/day16.txt b/src/main/resources/2021/day16.txt new file mode 100644 index 00000000..d1c52737 --- /dev/null +++ b/src/main/resources/2021/day16.txt @@ -0,0 +1 @@ +60556F980272DCE609BC01300042622C428BC200DC128C50FCC0159E9DB9AEA86003430BE5EFA8DB0AC401A4CA4E8A3400E6CFF7518F51A554100180956198529B6A700965634F96C0B99DCF4A13DF6D200DCE801A497FF5BE5FFD6B99DE2B11250034C00F5003900B1270024009D610031400E70020C0093002980652700298051310030C00F50028802B2200809C00F999EF39C79C8800849D398CE4027CCECBDA25A00D4040198D31920C8002170DA37C660009B26EFCA204FDF10E7A85E402304E0E60066A200F4638311C440198A11B635180233023A0094C6186630C44017E500345310FF0A65B0273982C929EEC0000264180390661FC403006E2EC1D86A600F43285504CC02A9D64931293779335983D300568035200042A29C55886200FC6A8B31CE647880323E0068E6E175E9B85D72525B743005646DA57C007CE6634C354CC698689BDBF1005F7231A0FE002F91067EF2E40167B17B503E666693FD9848803106252DFAD40E63D42020041648F24460400D8ECE007CBF26F92B0949B275C9402794338B329F88DC97D608028D9982BF802327D4A9FC10B803F33BD804E7B5DDAA4356014A646D1079E8467EF702A573FAF335EB74906CF5F2ACA00B43E8A460086002A3277BA74911C9531F613009A5CCE7D8248065000402B92D47F14B97C723B953C7B22392788A7CD62C1EC00D14CC23F1D94A3D100A1C200F42A8C51A00010A847176380002110EA31C713004A366006A0200C47483109C0010F8C10AE13C9CA9BDE59080325A0068A6B4CF333949EE635B495003273F76E000BCA47E2331A9DE5D698272F722200DDE801F098EDAC7131DB58E24F5C5D300627122456E58D4C01091C7A283E00ACD34CB20426500BA7F1EBDBBD209FAC75F579ACEB3E5D8FD2DD4E300565EBEDD32AD6008CCE3A492F98E15CC013C0086A5A12E7C46761DBB8CDDBD8BE656780 From 3a3f025ca50e980afc83951e4ddf2e101eb392ca Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Thu, 16 Dec 2021 07:28:23 +0100 Subject: [PATCH 292/433] 2021 Day 16 Part 2 --- .../adventofcode/year21/days/Day16.java | 37 ++++++++++++++++--- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day16.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day16.java index 864a8dc1..428cefbf 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day16.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day16.java @@ -74,8 +74,20 @@ int binToDec(String s) { return Integer.parseInt(new BigInteger(s, 2).toString(10)); } + long binToLongDec(String s) { + return Long.parseLong(new BigInteger(s, 2).toString(10)); + } + @Override public Object part2() { + System.out.println(findSum2("C200B40A82")); + System.out.println(findSum2("04005AC33890")); + System.out.println(findSum2("880086C3E88112")); + System.out.println(findSum2("CE00C43D881120")); + System.out.println(findSum2("D8005AC2A8F0")); + System.out.println(findSum2("F600BC2D8F")); + System.out.println(findSum2("9C005AC2F8F0")); + System.out.println(findSum2("9C0141080250320F1802104A08")); return findSum2(day()); } @@ -84,11 +96,14 @@ private long findSum2(String hex) { return findPackets2(in, Integer.MAX_VALUE).get(0); } + int prevI = 0; private List findPackets2(String in, int toParse) { List res = new ArrayList<>(); long sum = 0; for(int i = 0, parsed = 0; i< in.length();parsed++){ - if(parsed >= toParse) break; + if(parsed >= toParse){ + break; + } if(in.substring(i).chars().allMatch(e -> e == '0')) break; int version = binToDec(in.substring(i, i+3)); int id = binToDec(in.substring(i+3, i+6)); @@ -102,7 +117,7 @@ private List findPackets2(String in, int toParse) { break; } } - res.add((long)binToDec(s)); + res.add(binToLongDec(s)); } else { int lengthLength = 15; boolean b = in.charAt(i) == '1'; @@ -113,14 +128,24 @@ private List findPackets2(String in, int toParse) { int length = binToDec(in.substring(i, i+lengthLength)); i+=lengthLength; List op = findPackets2(in.substring(i, b ? in.length() : (i + length)), b ? length : Integer.MAX_VALUE); - performOp(op, id); - i += length; + res.add(performOp(op, id)); + i += b ? prevI : length; } + prevI = i; } return res; } - private void performOp(List op, int id) { - + private long performOp(List op, int id) { + return switch (id) { + case 0 -> op.stream().mapToLong(e -> e).sum(); + case 1 -> op.stream().mapToLong(e -> e).reduce((a,b) -> a*b).getAsLong(); + case 2 -> op.stream().mapToLong(e -> e).min().getAsLong(); + case 3 -> op.stream().mapToLong(e -> e).max().getAsLong(); + case 5 -> op.get(0) > op.get(1) ? 1L : 0L; + case 6 -> op.get(0) < op.get(1) ? 1L : 0L; + case 7 -> op.get(0).equals(op.get(1)) ? 1L : 0L; + default -> throw new IllegalStateException("Not known id: "+id); + }; } } From 9ba8595158dda07f6234f3156c3d7d482e390073 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Thu, 16 Dec 2021 07:35:25 +0100 Subject: [PATCH 293/433] Prepare day 17 --- .../com/sbaars/adventofcode/util/FetchInput.java | 2 +- .../sbaars/adventofcode/year21/days/Day16.java | 15 --------------- .../sbaars/adventofcode/year21/days/Day17.java | 4 ++++ 3 files changed, 5 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java index 31330810..a7f3ee54 100644 --- a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java +++ b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java @@ -27,7 +27,7 @@ private FetchInput() { } public static void main(String[] args) { - new FetchInput().retrieveDay("16", "2021"); + new FetchInput().retrieveDay("17", "2021"); } private void retrieveDay(String day, String year) { diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day16.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day16.java index 428cefbf..a0353f23 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day16.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day16.java @@ -13,18 +13,12 @@ public Day16() { public static void main(String[] args) { new Day16().printParts(); -// new Day16().submitPart1(); -// new Day16().submitPart2(); } @Override public Object part1() { -// System.out.println(findSum("D2FE28")); -// System.out.println(findSum("38006F45291200")); -// System.out.println(findSum("EE00D40C823060")); -// System.out.println(findSum("8A004A801A8002F478")); return findSum(day()); } @@ -80,14 +74,6 @@ long binToLongDec(String s) { @Override public Object part2() { - System.out.println(findSum2("C200B40A82")); - System.out.println(findSum2("04005AC33890")); - System.out.println(findSum2("880086C3E88112")); - System.out.println(findSum2("CE00C43D881120")); - System.out.println(findSum2("D8005AC2A8F0")); - System.out.println(findSum2("F600BC2D8F")); - System.out.println(findSum2("9C005AC2F8F0")); - System.out.println(findSum2("9C0141080250320F1802104A08")); return findSum2(day()); } @@ -105,7 +91,6 @@ private List findPackets2(String in, int toParse) { break; } if(in.substring(i).chars().allMatch(e -> e == '0')) break; - int version = binToDec(in.substring(i, i+3)); int id = binToDec(in.substring(i+3, i+6)); i+=6; if(id == 4){ diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day17.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day17.java index a557bdd1..5a47d420 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day17.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day17.java @@ -9,10 +9,14 @@ public Day17() { public static void main(String[] args) { new Day17().printParts(); +// new Day17().submitPart1(); +// new Day17().submitPart2(); } @Override public Object part1() { + var in = day(); + return ""; } From a63f8cfee622ce5827a8cbaf4d1aecb0b9fe74a6 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Thu, 16 Dec 2021 07:36:18 +0100 Subject: [PATCH 294/433] Code quality 100 --- src/main/java/com/sbaars/adventofcode/year21/days/Day16.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day16.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day16.java index a0353f23..88a97f9b 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day16.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day16.java @@ -15,8 +15,6 @@ public static void main(String[] args) { new Day16().printParts(); } - - @Override public Object part1() { return findSum(day()); From 75d2d9f641cca8abe402e9c130d39b6d7efdbe65 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Thu, 16 Dec 2021 07:42:34 +0100 Subject: [PATCH 295/433] Fix day 15 --- src/main/java/com/sbaars/adventofcode/year21/days/Day15.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java index e2ef0516..cf55f13f 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day15.java @@ -26,8 +26,8 @@ static long shortestPath(NumGrid g, int row, int col, int resize) { long[][] grid = g.grid; long[][] dist = new long[g.sizeX()*resize][g.sizeY()*resize]; - int[] dx = { 1, 0 }; - int[] dy = { 0, 1 }; + int[] dx = { 1, 0, -1, 0 }; + int[] dy = { 0, 1, 0, -1 }; for(int i = 0; i < dist.length; i++) { for(int j = 0; j < dist[0].length; j++) { From 48ecfd73df9df1495baae1e3addd26e0b34601ad Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Thu, 16 Dec 2021 09:16:18 +0100 Subject: [PATCH 296/433] Minor refactoring --- src/main/java/com/sbaars/adventofcode/year21/days/Day16.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day16.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day16.java index 88a97f9b..58091b7d 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day16.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day16.java @@ -21,8 +21,7 @@ public Object part1() { } private long findSum(String hex) { - var in = hexToBin(hex.trim()); - return findPackets(in); + return findPackets(hexToBin(hex.trim())); } private long findPackets(String in) { From 84b2d33a6542218315ccdc36ab61b769a954511f Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Fri, 17 Dec 2021 07:20:45 +0100 Subject: [PATCH 297/433] 2021 Day 17 --- .../adventofcode/year21/days/Day17.java | 56 ++++++++++++++++++- src/main/resources/2021-examples/day17-1.txt | 1 + src/main/resources/2021-examples/day17-2.txt | 14 +++++ src/main/resources/2021-examples/day17-3.txt | 17 ++++++ src/main/resources/2021-examples/day17-4.txt | 11 ++++ src/main/resources/2021-examples/day17-5.txt | 23 ++++++++ src/main/resources/2021/day17.txt | 1 + 7 files changed, 120 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/2021-examples/day17-1.txt create mode 100644 src/main/resources/2021-examples/day17-2.txt create mode 100644 src/main/resources/2021-examples/day17-3.txt create mode 100644 src/main/resources/2021-examples/day17-4.txt create mode 100644 src/main/resources/2021-examples/day17-5.txt create mode 100644 src/main/resources/2021/day17.txt diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day17.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day17.java index 5a47d420..007770de 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day17.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day17.java @@ -1,6 +1,11 @@ package com.sbaars.adventofcode.year21.days; +import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; +import static java.lang.Long.MIN_VALUE; +import static java.lang.Math.toIntExact; + import com.sbaars.adventofcode.year21.Day2021; +import java.awt.*; public class Day17 extends Day2021 { public Day17() { @@ -15,13 +20,58 @@ public static void main(String[] args) { @Override public Object part1() { - var in = day(); + var in = readString(day().trim(), "target area: x=%n..%n, y=%n..%n", Target.class); + var area = new Area(new Point(toIntExact(in.xStart), toIntExact(in.yStart)), new Point(toIntExact(in.xEnd), toIntExact(in.yEnd))); + long highest = 0; + for(int x = 1; x<500; x++){ + for(int y = 0; y<500; y++) { + Point p = new Point(x, y); + long res = simulateSteps(area, p); + if(res > highest) { + highest = res; + } + } + } + return highest; + } - return ""; + public long simulateSteps(Area target, Point p){ + Point curr = new Point(0,0); + long highest = 0; + while(curr.y>target.bottomRight.y) { + curr = new Point(curr.x + p.x, curr.y + p.y); + p = new Point(p.x > 0 ? p.x - 1 : (p.x < 0 ? p.x - 1 : p.x), p.y - 1); + if(curr.y > highest) highest = curr.y; + if(curr.x == 0 && (curr.y < target.topLeft.y || curr.y > target.bottomRight.y)) break; + } + if(target.inArea(curr)){ + return highest; + } + return MIN_VALUE; } @Override public Object part2() { - return ""; + var in = readString(day().trim(), "target area: x=%n..%n, y=%n..%n", Target.class); + var area = new Area(new Point(toIntExact(in.xStart), toIntExact(in.yStart)), new Point(toIntExact(in.xEnd), toIntExact(in.yEnd))); + long sum = 0; + for(int x = -500; x<500; x++){ + for(int y = -500; y<500; y++) { + Point p = new Point(x, y); + long res = simulateSteps(area, p); + if(res!=MIN_VALUE) { + sum++; + } + } + } + return sum; + } + + public record Target(long xStart, long xEnd, long yStart, long yEnd){} + + public record Area(Point topLeft, Point bottomRight){ + public boolean inArea(Point p){ + return p.x>=topLeft.x && p.y >= topLeft.y && p.x <=bottomRight.x && p.y <= bottomRight.y; + } } } diff --git a/src/main/resources/2021-examples/day17-1.txt b/src/main/resources/2021-examples/day17-1.txt new file mode 100644 index 00000000..a07e02d3 --- /dev/null +++ b/src/main/resources/2021-examples/day17-1.txt @@ -0,0 +1 @@ +target area: x=20..30, y=-10..-5 diff --git a/src/main/resources/2021-examples/day17-2.txt b/src/main/resources/2021-examples/day17-2.txt new file mode 100644 index 00000000..b7bfb0fb --- /dev/null +++ b/src/main/resources/2021-examples/day17-2.txt @@ -0,0 +1,14 @@ +.............#....#............ +.......#..............#........ +............................... +S........................#..... +............................... +............................... +...........................#... +............................... +....................TTTTTTTTTTT +....................TTTTTTTTTTT +....................TTTTTTTT#TT +....................TTTTTTTTTTT +....................TTTTTTTTTTT +....................TTTTTTTTTTT diff --git a/src/main/resources/2021-examples/day17-3.txt b/src/main/resources/2021-examples/day17-3.txt new file mode 100644 index 00000000..d98a0fc4 --- /dev/null +++ b/src/main/resources/2021-examples/day17-3.txt @@ -0,0 +1,17 @@ +...............#..#............ +...........#........#.......... +............................... +......#..............#......... +............................... +............................... +S....................#......... +............................... +............................... +............................... +.....................#......... +....................TTTTTTTTTTT +....................TTTTTTTTTTT +....................TTTTTTTTTTT +....................TTTTTTTTTTT +....................T#TTTTTTTTT +....................TTTTTTTTTTT diff --git a/src/main/resources/2021-examples/day17-4.txt b/src/main/resources/2021-examples/day17-4.txt new file mode 100644 index 00000000..0d65d8dd --- /dev/null +++ b/src/main/resources/2021-examples/day17-4.txt @@ -0,0 +1,11 @@ +S........#..................... +.................#............. +............................... +........................#...... +............................... +....................TTTTTTTTTTT +....................TTTTTTTTTT# +....................TTTTTTTTTTT +....................TTTTTTTTTTT +....................TTTTTTTTTTT +....................TTTTTTTTTTT diff --git a/src/main/resources/2021-examples/day17-5.txt b/src/main/resources/2021-examples/day17-5.txt new file mode 100644 index 00000000..68f68519 --- /dev/null +++ b/src/main/resources/2021-examples/day17-5.txt @@ -0,0 +1,23 @@ +S.............................................................. +............................................................... +............................................................... +............................................................... +.................#............................................. +....................TTTTTTTTTTT................................ +....................TTTTTTTTTTT................................ +....................TTTTTTTTTTT................................ +....................TTTTTTTTTTT................................ +....................TTTTTTTTTTT..#............................. +....................TTTTTTTTTTT................................ +............................................................... +............................................................... +............................................................... +............................................................... +................................................#.............. +............................................................... +............................................................... +............................................................... +............................................................... +............................................................... +............................................................... +..............................................................# diff --git a/src/main/resources/2021/day17.txt b/src/main/resources/2021/day17.txt new file mode 100644 index 00000000..52bdf2b2 --- /dev/null +++ b/src/main/resources/2021/day17.txt @@ -0,0 +1 @@ +target area: x=175..227, y=-134..-79 From 6bdf3957b2a55023827e71d17bac6dc27504de86 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Fri, 17 Dec 2021 07:44:01 +0100 Subject: [PATCH 298/433] Day 17 refactor --- .../sbaars/adventofcode/util/FetchInput.java | 2 +- .../adventofcode/year21/days/Day17.java | 36 +++++-------------- .../adventofcode/year21/days/Day18.java | 4 +++ 3 files changed, 14 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java index a7f3ee54..ab539895 100644 --- a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java +++ b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java @@ -27,7 +27,7 @@ private FetchInput() { } public static void main(String[] args) { - new FetchInput().retrieveDay("17", "2021"); + new FetchInput().retrieveDay("18", "2021"); } private void retrieveDay(String day, String year) { diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day17.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day17.java index 007770de..761a08a1 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day17.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day17.java @@ -6,6 +6,8 @@ import com.sbaars.adventofcode.year21.Day2021; import java.awt.*; +import java.util.stream.IntStream; +import java.util.stream.LongStream; public class Day17 extends Day2021 { public Day17() { @@ -14,31 +16,23 @@ public Day17() { public static void main(String[] args) { new Day17().printParts(); -// new Day17().submitPart1(); -// new Day17().submitPart2(); } @Override public Object part1() { + return getSol().max().getAsLong(); + } + + private LongStream getSol() { var in = readString(day().trim(), "target area: x=%n..%n, y=%n..%n", Target.class); var area = new Area(new Point(toIntExact(in.xStart), toIntExact(in.yStart)), new Point(toIntExact(in.xEnd), toIntExact(in.yEnd))); - long highest = 0; - for(int x = 1; x<500; x++){ - for(int y = 0; y<500; y++) { - Point p = new Point(x, y); - long res = simulateSteps(area, p); - if(res > highest) { - highest = res; - } - } - } - return highest; + return IntStream.range(-200, 300).boxed().flatMap(x -> IntStream.range(-200, 300).mapToObj(y -> new Point(x, y))).mapToLong(p -> simulateSteps(area, p)); } public long simulateSteps(Area target, Point p){ Point curr = new Point(0,0); long highest = 0; - while(curr.y>target.bottomRight.y) { + while(curr.y>target.topLeft.y && !target.inArea(curr)) { curr = new Point(curr.x + p.x, curr.y + p.y); p = new Point(p.x > 0 ? p.x - 1 : (p.x < 0 ? p.x - 1 : p.x), p.y - 1); if(curr.y > highest) highest = curr.y; @@ -52,19 +46,7 @@ public long simulateSteps(Area target, Point p){ @Override public Object part2() { - var in = readString(day().trim(), "target area: x=%n..%n, y=%n..%n", Target.class); - var area = new Area(new Point(toIntExact(in.xStart), toIntExact(in.yStart)), new Point(toIntExact(in.xEnd), toIntExact(in.yEnd))); - long sum = 0; - for(int x = -500; x<500; x++){ - for(int y = -500; y<500; y++) { - Point p = new Point(x, y); - long res = simulateSteps(area, p); - if(res!=MIN_VALUE) { - sum++; - } - } - } - return sum; + return getSol().filter(e -> e!=MIN_VALUE).count(); } public record Target(long xStart, long xEnd, long yStart, long yEnd){} diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day18.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day18.java index 0d61d687..68358af9 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day18.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day18.java @@ -9,10 +9,14 @@ public Day18() { public static void main(String[] args) { new Day18().printParts(); +// new Day18().submitPart1(); +// new Day18().submitPart2(); } @Override public Object part1() { + var in = day(); + return ""; } From b9041f76efddb7d33da4dd6083686efeb8d79497 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Sat, 18 Dec 2021 07:36:18 +0100 Subject: [PATCH 299/433] Day 18 Part 1 --- .../adventofcode/year21/days/Day18.java | 79 +++++++++++++- src/main/resources/2021-examples/day18-1.txt | 7 ++ src/main/resources/2021-examples/day18-2.txt | 6 ++ src/main/resources/2021-examples/day18-3.txt | 4 + src/main/resources/2021-examples/day18-4.txt | 5 + src/main/resources/2021-examples/day18-5.txt | 6 ++ src/main/resources/2021-examples/day18-6.txt | 10 ++ src/main/resources/2021-examples/day18-7.txt | 35 ++++++ src/main/resources/2021-examples/day18-8.txt | 10 ++ src/main/resources/2021-examples/day18-9.txt | 1 + src/main/resources/2021/day18.txt | 100 ++++++++++++++++++ 11 files changed, 260 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/2021-examples/day18-1.txt create mode 100644 src/main/resources/2021-examples/day18-2.txt create mode 100644 src/main/resources/2021-examples/day18-3.txt create mode 100644 src/main/resources/2021-examples/day18-4.txt create mode 100644 src/main/resources/2021-examples/day18-5.txt create mode 100644 src/main/resources/2021-examples/day18-6.txt create mode 100644 src/main/resources/2021-examples/day18-7.txt create mode 100644 src/main/resources/2021-examples/day18-8.txt create mode 100644 src/main/resources/2021-examples/day18-9.txt create mode 100644 src/main/resources/2021/day18.txt diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day18.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day18.java index 68358af9..59c41892 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day18.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day18.java @@ -1,6 +1,9 @@ package com.sbaars.adventofcode.year21.days; import com.sbaars.adventofcode.year21.Day2021; +import java.util.ArrayList; +import java.util.Optional; +import java.util.stream.Collectors; public class Day18 extends Day2021 { public Day18() { @@ -8,20 +11,90 @@ public Day18() { } public static void main(String[] args) { - new Day18().printParts(); + new Day18().printParts(8); // new Day18().submitPart1(); // new Day18().submitPart2(); } @Override public Object part1() { - var in = day(); + var in = dayStream().filter(e -> !e.isEmpty()).map(this::reduce).collect(Collectors.toCollection(ArrayList::new)); + while(in.size()>1){ + String one = in.remove(0); + String two = in.remove(0); + in.add(0, reduce("["+one+","+two+"]")); + } + int[] res = in.get(0).chars().map(c -> charToInt((char)c)).filter(e -> e!=-1).toArray(); - return ""; + return (((res[0]*3+res[1]*2)*3 + (res[2]*3+res[3]*2)*2)*3 + ((res[4]*3+res[5]*2)*3 + (res[6]*3+res[7]*2)*2)*2); + } + + private String reduce(String s) { + String prev = ""; + while(!prev.equals(s)) { + prev = s; + s = explodeAll(s); + } + return s; + } + + private String explodeAll(String s) { + int depth = 0; + for(int i = 0; i=4) { + String pair = s.substring(i, i + 5); + if (pair.replaceFirst("\\[[0-9],[0-9]\\]", "").isEmpty()) { + int leftNum = 0; + int rightNum = 0; + int leftIndex = -1; + int rightIndex = -1; + for(int j = i-1; j>=0; j--){ + char c = s.charAt(j); + if(c >= '0' && c <= '9'){ + leftNum = c - '0'; + leftIndex = j; + break; + } + } + for(int k = i+5; k= '0' && c <= '9'){ + rightNum = c - '0'; + rightIndex = k; + break; + } + } + leftNum+=s.charAt(i+1)-'0'; + rightNum+=s.charAt(i+3)-'0'; + String leftPair = Integer.toString(leftNum); + if(leftNum>=10) { + leftPair = "["+(leftNum/2)+","+(leftNum%2==0 ? leftNum/2 : (leftNum/2)+1)+"]"; + } + String rightPair = Integer.toString(rightNum); + if(rightNum>=10) { + rightPair = "["+(rightNum/2)+","+(rightNum%2==0 ? rightNum/2 : (rightNum/2)+1)+"]"; + } + String leftPart = leftIndex == -1 ? s.substring(0, i) : s.substring(0, leftIndex) + leftPair + s.substring(leftIndex+1, i); + String rightPart = rightIndex == -1 ? s.substring(i+5) : s.substring(i+5, rightIndex) + rightPair + s.substring(rightIndex+1); + return leftPart + 0 + rightPart; + } + } + } + return s; + } + + int charToInt(char c){ + int res = c - '0'; + if(res>=0 && res<=9) return res; + return -1; } @Override public Object part2() { return ""; } + + public record Pair (Optional p1, Optional p2, Optional num1, Optional num2, Integer depth) { } } diff --git a/src/main/resources/2021-examples/day18-1.txt b/src/main/resources/2021-examples/day18-1.txt new file mode 100644 index 00000000..93e9d14a --- /dev/null +++ b/src/main/resources/2021-examples/day18-1.txt @@ -0,0 +1,7 @@ +[1,2] +[[1,2],3] +[9,[8,7]] +[[1,9],[8,5]] +[[[[1,2],[3,4]],[[5,6],[7,8]]],9] +[[[9,[3,8]],[[0,9],6]],[[[3,7],[4,9]],3]] +[[[[1,3],[5,3]],[[1,3],[8,7]]],[[[4,9],[6,9]],[[8,2],[7,3]]]] diff --git a/src/main/resources/2021-examples/day18-2.txt b/src/main/resources/2021-examples/day18-2.txt new file mode 100644 index 00000000..2d0ec334 --- /dev/null +++ b/src/main/resources/2021-examples/day18-2.txt @@ -0,0 +1,6 @@ +after addition: [[[[[4,3],4],4],[7,[[8,4],9]]],[1,1]] +after explode: [[[[0,7],4],[7,[[8,4],9]]],[1,1]] +after explode: [[[[0,7],4],[15,[0,13]]],[1,1]] +after split: [[[[0,7],4],[[7,8],[0,13]]],[1,1]] +after split: [[[[0,7],4],[[7,8],[0,[6,7]]]],[1,1]] +after explode: [[[[0,7],4],[[7,8],[6,0]]],[8,1]] diff --git a/src/main/resources/2021-examples/day18-3.txt b/src/main/resources/2021-examples/day18-3.txt new file mode 100644 index 00000000..f212f838 --- /dev/null +++ b/src/main/resources/2021-examples/day18-3.txt @@ -0,0 +1,4 @@ +[1,1] +[2,2] +[3,3] +[4,4] diff --git a/src/main/resources/2021-examples/day18-4.txt b/src/main/resources/2021-examples/day18-4.txt new file mode 100644 index 00000000..13fdd197 --- /dev/null +++ b/src/main/resources/2021-examples/day18-4.txt @@ -0,0 +1,5 @@ +[1,1] +[2,2] +[3,3] +[4,4] +[5,5] diff --git a/src/main/resources/2021-examples/day18-5.txt b/src/main/resources/2021-examples/day18-5.txt new file mode 100644 index 00000000..85acce58 --- /dev/null +++ b/src/main/resources/2021-examples/day18-5.txt @@ -0,0 +1,6 @@ +[1,1] +[2,2] +[3,3] +[4,4] +[5,5] +[6,6] diff --git a/src/main/resources/2021-examples/day18-6.txt b/src/main/resources/2021-examples/day18-6.txt new file mode 100644 index 00000000..70e9071b --- /dev/null +++ b/src/main/resources/2021-examples/day18-6.txt @@ -0,0 +1,10 @@ +[[[0,[4,5]],[0,0]],[[[4,5],[2,6]],[9,5]]] +[7,[[[3,7],[4,3]],[[6,3],[8,8]]]] +[[2,[[0,8],[3,4]]],[[[6,7],1],[7,[1,6]]]] +[[[[2,4],7],[6,[0,5]]],[[[6,8],[2,8]],[[2,1],[4,5]]]] +[7,[5,[[3,8],[1,4]]]] +[[2,[2,2]],[8,[8,1]]] +[2,9] +[1,[[[9,3],9],[[9,0],[0,7]]]] +[[[5,[7,4]],7],1] +[[[[4,2],2],6],[8,7]] diff --git a/src/main/resources/2021-examples/day18-7.txt b/src/main/resources/2021-examples/day18-7.txt new file mode 100644 index 00000000..d66a0b54 --- /dev/null +++ b/src/main/resources/2021-examples/day18-7.txt @@ -0,0 +1,35 @@ + [[[0,[4,5]],[0,0]],[[[4,5],[2,6]],[9,5]]] ++ [7,[[[3,7],[4,3]],[[6,3],[8,8]]]] += [[[[4,0],[5,4]],[[7,7],[6,0]]],[[8,[7,7]],[[7,9],[5,0]]]] + + [[[[4,0],[5,4]],[[7,7],[6,0]]],[[8,[7,7]],[[7,9],[5,0]]]] ++ [[2,[[0,8],[3,4]]],[[[6,7],1],[7,[1,6]]]] += [[[[6,7],[6,7]],[[7,7],[0,7]]],[[[8,7],[7,7]],[[8,8],[8,0]]]] + + [[[[6,7],[6,7]],[[7,7],[0,7]]],[[[8,7],[7,7]],[[8,8],[8,0]]]] ++ [[[[2,4],7],[6,[0,5]]],[[[6,8],[2,8]],[[2,1],[4,5]]]] += [[[[7,0],[7,7]],[[7,7],[7,8]]],[[[7,7],[8,8]],[[7,7],[8,7]]]] + + [[[[7,0],[7,7]],[[7,7],[7,8]]],[[[7,7],[8,8]],[[7,7],[8,7]]]] ++ [7,[5,[[3,8],[1,4]]]] += [[[[7,7],[7,8]],[[9,5],[8,7]]],[[[6,8],[0,8]],[[9,9],[9,0]]]] + + [[[[7,7],[7,8]],[[9,5],[8,7]]],[[[6,8],[0,8]],[[9,9],[9,0]]]] ++ [[2,[2,2]],[8,[8,1]]] += [[[[6,6],[6,6]],[[6,0],[6,7]]],[[[7,7],[8,9]],[8,[8,1]]]] + + [[[[6,6],[6,6]],[[6,0],[6,7]]],[[[7,7],[8,9]],[8,[8,1]]]] ++ [2,9] += [[[[6,6],[7,7]],[[0,7],[7,7]]],[[[5,5],[5,6]],9]] + + [[[[6,6],[7,7]],[[0,7],[7,7]]],[[[5,5],[5,6]],9]] ++ [1,[[[9,3],9],[[9,0],[0,7]]]] += [[[[7,8],[6,7]],[[6,8],[0,8]]],[[[7,7],[5,0]],[[5,5],[5,6]]]] + + [[[[7,8],[6,7]],[[6,8],[0,8]]],[[[7,7],[5,0]],[[5,5],[5,6]]]] ++ [[[5,[7,4]],7],1] += [[[[7,7],[7,7]],[[8,7],[8,7]]],[[[7,0],[7,7]],9]] + + [[[[7,7],[7,7]],[[8,7],[8,7]]],[[[7,0],[7,7]],9]] ++ [[[[4,2],2],6],[8,7]] += [[[[8,7],[7,7]],[[8,6],[7,7]]],[[[0,7],[6,6]],[8,7]]] diff --git a/src/main/resources/2021-examples/day18-8.txt b/src/main/resources/2021-examples/day18-8.txt new file mode 100644 index 00000000..1368dc4d --- /dev/null +++ b/src/main/resources/2021-examples/day18-8.txt @@ -0,0 +1,10 @@ +[[[0,[5,8]],[[1,7],[9,6]]],[[4,[1,2]],[[1,4],2]]] +[[[5,[2,8]],4],[5,[[9,9],0]]] +[6,[[[6,2],[5,6]],[[7,6],[4,7]]]] +[[[6,[0,7]],[0,9]],[4,[9,[9,0]]]] +[[[7,[6,4]],[3,[1,3]]],[[[5,5],1],9]] +[[6,[[7,3],[3,2]]],[[[3,8],[5,7]],4]] +[[[[5,4],[7,7]],8],[[8,3],8]] +[[9,3],[[9,9],[6,[4,9]]]] +[[2,[[7,7],7]],[[5,8],[[9,3],[0,2]]]] +[[[[5,2],5],[8,[3,7]]],[[5,[7,5]],[4,4]]] diff --git a/src/main/resources/2021-examples/day18-9.txt b/src/main/resources/2021-examples/day18-9.txt new file mode 100644 index 00000000..6b23a92a --- /dev/null +++ b/src/main/resources/2021-examples/day18-9.txt @@ -0,0 +1 @@ +[[[[6,6],[7,6]],[[7,7],[7,0]]],[[[7,7],[7,7]],[[7,8],[9,9]]]] \ No newline at end of file diff --git a/src/main/resources/2021/day18.txt b/src/main/resources/2021/day18.txt new file mode 100644 index 00000000..5cb1e484 --- /dev/null +++ b/src/main/resources/2021/day18.txt @@ -0,0 +1,100 @@ +[[[[3,0],[0,0]],1],4] +[[[[3,4],0],[7,7]],[1,6]] +[[[[2,0],5],7],[[[3,1],[2,6]],[[0,8],6]]] +[[[[5,5],0],1],[[[0,0],1],[[0,6],[0,9]]]] +[[0,[0,[1,7]]],[3,[1,[7,6]]]] +[[[9,[5,2]],[[5,2],[6,8]]],[[[7,0],7],[[2,3],[9,4]]]] +[[[[3,8],7],[[0,7],[2,0]]],[0,[[2,9],0]]] +[[[7,[2,2]],[3,4]],[6,7]] +[8,[[[3,3],8],[[7,1],[6,7]]]] +[[9,[9,8]],[[1,[9,1]],[2,5]]] +[[[7,8],[[1,2],[2,6]]],[[9,7],[6,[7,0]]]] +[[[3,3],[[5,6],5]],[[[2,8],1],9]] +[[[2,[5,0]],[[9,9],[4,0]]],[0,5]] +[[[9,3],[[9,4],[5,8]]],[[[3,2],[7,1]],[[3,8],1]]] +[[3,2],[[6,[0,9]],[8,3]]] +[[[5,7],[[7,4],[4,6]]],[[[9,8],3],3]] +[[[4,[2,8]],9],[[[8,5],[9,7]],[[8,9],[2,6]]]] +[[[1,[2,4]],6],[[8,[5,2]],[[0,7],[4,1]]]] +[[[[4,3],6],[[6,4],[4,2]]],[[9,0],[[5,9],9]]] +[[[[3,0],6],[4,[7,5]]],4] +[[[[1,0],[7,1]],0],[[[8,5],8],2]] +[[[[2,9],[4,1]],[[8,9],[3,3]]],[9,[[0,7],2]]] +[[1,[4,[4,2]]],[[[3,5],[8,8]],2]] +[[[8,[1,4]],[[6,5],5]],[[7,[4,7]],4]] +[[[[0,5],2],[[9,2],0]],0] +[[[[6,2],[2,4]],[0,[7,3]]],[9,[8,[5,9]]]] +[[8,0],2] +[[[[0,2],2],[[9,2],[8,1]]],[[[7,6],[5,3]],6]] +[[[[8,7],[5,3]],[[3,0],8]],[[[8,4],[2,2]],[[8,1],2]]] +[[[[1,5],[4,6]],[[4,0],[2,4]]],[[1,1],[[0,7],[7,3]]]] +[[7,2],[[7,[6,7]],[8,5]]] +[[[9,7],[[6,6],9]],8] +[[4,2],[[[1,0],[9,1]],[[0,7],[8,0]]]] +[[[[5,9],5],[8,9]],[[2,4],[[5,2],[8,3]]]] +[[[[4,5],[7,0]],[4,5]],[[7,[6,4]],[[1,7],[6,3]]]] +[[2,0],4] +[[2,[[5,1],[2,1]]],[[5,[7,2]],[[2,3],[7,0]]]] +[[4,[4,9]],[9,[6,8]]] +[[[[6,1],[1,5]],[0,[4,0]]],[[[7,0],2],4]] +[[[[3,3],[2,2]],[[2,4],2]],[[8,[1,1]],4]] +[[[[1,5],8],[[9,4],[7,7]]],[[[8,7],[7,2]],[0,[7,3]]]] +[9,[[7,[0,4]],4]] +[4,[0,8]] +[[[[2,6],1],[8,[8,4]]],[[8,2],[1,[8,4]]]] +[[7,[8,[8,8]]],[4,1]] +[[0,6],[[7,[5,9]],[[7,1],8]]] +[4,6] +[[[[3,2],[5,6]],[0,7]],[8,[7,[9,5]]]] +[[[3,7],[4,5]],6] +[[[0,[3,9]],[9,1]],6] +[[[[7,3],8],[6,7]],[[1,0],[1,7]]] +[[[5,[4,8]],2],[[[7,1],6],[[0,3],2]]] +[[1,0],[[1,2],[[2,0],1]]] +[[8,[[6,1],[7,1]]],0] +[[9,[2,0]],[[7,[6,2]],4]] +[[[9,[9,4]],[[4,8],3]],[[9,0],[[2,2],[0,6]]]] +[[[7,5],[[2,9],6]],[[2,4],[[1,1],[8,2]]]] +[[[1,[6,3]],[[2,2],[1,8]]],[[[7,3],[6,0]],[4,[7,6]]]] +[6,5] +[[3,[9,[4,4]]],[[6,9],[4,5]]] +[[[4,[1,8]],[[4,0],6]],[[[9,0],[8,3]],[[8,6],[3,2]]]] +[[[8,[1,2]],[[3,9],6]],[[3,0],1]] +[[1,[2,[4,0]]],6] +[0,[[[1,3],[9,1]],[[3,8],[9,4]]]] +[2,[2,[[2,7],[7,8]]]] +[[[3,0],[[4,6],2]],[9,2]] +[[[5,[2,2]],[[2,7],[9,9]]],[[3,[4,4]],[8,[9,8]]]] +[[[[7,5],[7,9]],[[8,5],6]],[[1,[8,4]],[8,2]]] +[[[6,4],[5,5]],[[[8,1],5],[[6,4],[6,9]]]] +[[[[8,9],0],[[4,6],7]],[[[3,9],[6,4]],[8,[7,4]]]] +[4,[[7,7],4]] +[[[[4,9],[1,2]],[8,[4,7]]],[[8,[4,8]],[0,[5,4]]]] +[1,[7,9]] +[[[5,[2,0]],[[4,3],[6,8]]],[9,9]] +[[[[3,9],9],[4,3]],[1,[3,[8,1]]]] +[[[[8,7],[6,1]],[3,9]],[5,[[8,0],4]]] +[[[[8,2],[4,6]],[6,[9,9]]],[1,[[7,7],4]]] +[[7,5],[[5,0],[0,3]]] +[[[6,0],[9,1]],[[[4,3],[5,0]],[[9,5],[0,0]]]] +[8,[[3,6],3]] +[[[[9,3],7],[1,3]],[[[6,4],[8,4]],[1,5]]] +[[[[3,8],2],[5,4]],[[[1,8],5],[2,[2,7]]]] +[[2,9],[6,[0,2]]] +[[2,[7,9]],[[4,1],[[9,2],[0,7]]]] +[[0,[6,4]],[[9,2],[0,[0,7]]]] +[[[[7,2],[8,6]],[6,2]],[[[1,6],[2,2]],1]] +[[1,6],[[[4,3],[8,2]],[3,[9,4]]]] +[[9,[7,3]],[[[7,0],4],[[1,7],[2,2]]]] +[[7,[5,[9,8]]],[[[7,5],[7,6]],[7,[9,8]]]] +[[[[6,1],[4,3]],4],[[[5,9],4],2]] +[[[[5,1],[2,5]],0],[[7,[5,7]],[[4,4],9]]] +[9,2] +[4,[[[6,6],5],7]] +[[8,[[7,3],[0,7]]],8] +[[[3,4],[[2,3],0]],[[[9,6],[1,1]],[4,[0,4]]]] +[[[[3,3],[2,3]],[2,5]],[[4,[2,7]],3]] +[[[8,[0,3]],2],[4,4]] +[[[3,5],[[2,1],[3,4]]],[[0,3],4]] +[[[[4,1],4],2],[[[3,7],2],[[8,1],3]]] +[[[[0,6],[7,3]],[5,[3,9]]],[7,[[4,1],8]]] From a358c3f3c3e88cfc8b10bb290d7fd7189f500fb7 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Sat, 18 Dec 2021 08:06:32 +0100 Subject: [PATCH 300/433] Day 18 Part 2 --- .../adventofcode/year21/days/Day18.java | 50 +++++++++++++++++-- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day18.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day18.java index 59c41892..2107fbce 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day18.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day18.java @@ -1,9 +1,13 @@ package com.sbaars.adventofcode.year21.days; +import static java.lang.Integer.parseInt; + import com.sbaars.adventofcode.year21.Day2021; +import java.awt.*; import java.util.ArrayList; import java.util.Optional; import java.util.stream.Collectors; +import java.util.stream.IntStream; public class Day18 extends Day2021 { public Day18() { @@ -24,9 +28,7 @@ public Object part1() { String two = in.remove(0); in.add(0, reduce("["+one+","+two+"]")); } - int[] res = in.get(0).chars().map(c -> charToInt((char)c)).filter(e -> e!=-1).toArray(); - - return (((res[0]*3+res[1]*2)*3 + (res[2]*3+res[3]*2)*2)*3 + ((res[4]*3+res[5]*2)*3 + (res[6]*3+res[7]*2)*2)*2); + return magnitude(in.get(0)); } private String reduce(String s) { @@ -85,6 +87,45 @@ private String explodeAll(String s) { return s; } + private int magnitude(String s) { + String prev = ""; + while(!prev.equals(s)) { + prev = s; + s = calcMag(s); + } + return Integer.parseInt(s); + } + + private String calcMag(String s) { + for(int i = 0; i '9'){ + leftNum = parseInt(s.substring(i+1, j)); + leftIndex = j; + break; + } + } + for(int k = leftIndex+1; k '9'){ + rightNum = parseInt(s.substring(leftIndex+1, k)); + rightIndex = k; + break; + } + } + return s.substring(0, i) + ((leftNum*3)+(rightNum*2)) + s.substring(rightIndex+1); + } + } + return s; + } + int charToInt(char c){ int res = c - '0'; if(res>=0 && res<=9) return res; @@ -93,7 +134,8 @@ int charToInt(char c){ @Override public Object part2() { - return ""; + var in = dayStream().filter(e -> !e.isEmpty()).map(this::reduce).collect(Collectors.toCollection(ArrayList::new)); + return IntStream.range(0, in.size()).boxed().flatMap(x -> IntStream.range(0, in.size()).filter(y -> x!=y).mapToObj(y -> new Point(x, y))).mapToInt(p -> magnitude(reduce("["+in.get(p.x)+","+in.get(p.y)+"]"))).max().getAsInt(); } public record Pair (Optional p1, Optional p2, Optional num1, Optional num2, Integer depth) { } From b6549f62b87e10691d1640669c70917bc4d1e31c Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Sat, 18 Dec 2021 21:21:40 +0100 Subject: [PATCH 301/433] Refactoring --- .../adventofcode/year21/days/Day18.java | 81 ++++++++++++------- 1 file changed, 53 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day18.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day18.java index 2107fbce..ecff2355 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day18.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day18.java @@ -12,10 +12,13 @@ public class Day18 extends Day2021 { public Day18() { super(18); +// System.out.println(add("[[[0,[4,5]],[0,0]],[[[4,5],[2,6]],[9,5]]]", "[7,[[[3,7],[4,3]],[[6,3],[8,8]]]]")); +// System.out.println(add("[[[[6,6],[6,6]],[[6,0],[6,7]]],[[[7,7],[8,9]],[8,[8,1]]]]", "[2,9]")); } public static void main(String[] args) { - new Day18().printParts(8); +// new Day18(); + new Day18().printParts(); // new Day18().submitPart1(); // new Day18().submitPart2(); } @@ -23,63 +26,73 @@ public static void main(String[] args) { @Override public Object part1() { var in = dayStream().filter(e -> !e.isEmpty()).map(this::reduce).collect(Collectors.toCollection(ArrayList::new)); +// System.out.println("Reducing complete"); while(in.size()>1){ String one = in.remove(0); String two = in.remove(0); - in.add(0, reduce("["+one+","+two+"]")); +// System.out.println("One: "+one); +// System.out.println("Two: "+two); + in.add(0, add(one, two)); +// System.out.println("Add: "+in.get(0)); } +// System.out.println("Commence magnitude"); return magnitude(in.get(0)); } + private String add(String one, String two) { + return reduce("[" + one + "," + two + "]"); + } + private String reduce(String s) { String prev = ""; while(!prev.equals(s)) { prev = s; - s = explodeAll(s); + s = explode(s); + if(prev.equals(s)) s = split(s); +// System.out.println(s); } return s; } - private String explodeAll(String s) { + private String split(String s) { + for (int i = 0; i < s.length(); i++) { + int num = parseNumAt(i, s); + if(num>=10) { + String pair = "["+(num/2)+","+(num%2==0 ? num/2 : (num/2)+1)+"]"; + return s.substring(0, i) + pair + s.substring(i + 2); + } + } + return s; + } + + private String explode(String s) { int depth = 0; for(int i = 0; i=4) { - String pair = s.substring(i, i + 5); - if (pair.replaceFirst("\\[[0-9],[0-9]\\]", "").isEmpty()) { - int leftNum = 0; - int rightNum = 0; + if(depth>4) { + String pair = s.substring(i); + String repl = pair.replaceFirst("\\[[0-9]*,[0-9]*\\]", ""); + if (repl.length()=0; j--){ - char c = s.charAt(j); - if(c >= '0' && c <= '9'){ - leftNum = c - '0'; + if(isNum(s.charAt(j))){ leftIndex = j; break; } } - for(int k = i+5; k= '0' && c <= '9'){ - rightNum = c - '0'; + for(int k = i+pair.length(); k=10) { - leftPair = "["+(leftNum/2)+","+(leftNum%2==0 ? leftNum/2 : (leftNum/2)+1)+"]"; - } - String rightPair = Integer.toString(rightNum); - if(rightNum>=10) { - rightPair = "["+(rightNum/2)+","+(rightNum%2==0 ? rightNum/2 : (rightNum/2)+1)+"]"; - } - String leftPart = leftIndex == -1 ? s.substring(0, i) : s.substring(0, leftIndex) + leftPair + s.substring(leftIndex+1, i); - String rightPart = rightIndex == -1 ? s.substring(i+5) : s.substring(i+5, rightIndex) + rightPair + s.substring(rightIndex+1); + String leftPart = leftIndex == -1 ? s.substring(0, i) : s.substring(0, leftIndex-(Integer.toString(parseNumAt(leftIndex, s)).length()-1)) + (leftNum+parseNumAt(leftIndex, s)) + s.substring(leftIndex+1, i); + String rightPart = rightIndex == -1 ? s.substring(i+pair.length()) : s.substring(i+pair.length(), rightIndex) + (rightNum+parseNumAt(rightIndex, s)) + s.substring(rightIndex+Integer.toString(parseNumAt(rightIndex, s)).length()); return leftPart + 0 + rightPart; } } @@ -126,6 +139,18 @@ private String calcMag(String s) { return s; } + int parseNumAt(int i, String s){ + if(!isNum(s.charAt(i))) return -1; + int j = i; + for(; isNum(s.charAt(j)); j++); + for(; isNum(s.charAt(i)); i--); + return parseInt(s.substring(i+1, j)); + } + + boolean isNum(char c){ + return c >= '0' && c <= '9'; + } + int charToInt(char c){ int res = c - '0'; if(res>=0 && res<=9) return res; From 93d4941c6d1963401571969e193e50748c9f8d3f Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Sat, 18 Dec 2021 21:24:30 +0100 Subject: [PATCH 302/433] Prepare day 19 --- .../sbaars/adventofcode/util/FetchInput.java | 2 +- .../adventofcode/year21/days/Day18.java | 20 ------------------- .../adventofcode/year21/days/Day19.java | 4 ++++ 3 files changed, 5 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java index ab539895..57a97fa7 100644 --- a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java +++ b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java @@ -27,7 +27,7 @@ private FetchInput() { } public static void main(String[] args) { - new FetchInput().retrieveDay("18", "2021"); + new FetchInput().retrieveDay("19", "2021"); } private void retrieveDay(String day, String year) { diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day18.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day18.java index ecff2355..122e244e 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day18.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day18.java @@ -5,37 +5,26 @@ import com.sbaars.adventofcode.year21.Day2021; import java.awt.*; import java.util.ArrayList; -import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.IntStream; public class Day18 extends Day2021 { public Day18() { super(18); -// System.out.println(add("[[[0,[4,5]],[0,0]],[[[4,5],[2,6]],[9,5]]]", "[7,[[[3,7],[4,3]],[[6,3],[8,8]]]]")); -// System.out.println(add("[[[[6,6],[6,6]],[[6,0],[6,7]]],[[[7,7],[8,9]],[8,[8,1]]]]", "[2,9]")); } public static void main(String[] args) { -// new Day18(); new Day18().printParts(); -// new Day18().submitPart1(); -// new Day18().submitPart2(); } @Override public Object part1() { var in = dayStream().filter(e -> !e.isEmpty()).map(this::reduce).collect(Collectors.toCollection(ArrayList::new)); -// System.out.println("Reducing complete"); while(in.size()>1){ String one = in.remove(0); String two = in.remove(0); -// System.out.println("One: "+one); -// System.out.println("Two: "+two); in.add(0, add(one, two)); -// System.out.println("Add: "+in.get(0)); } -// System.out.println("Commence magnitude"); return magnitude(in.get(0)); } @@ -49,7 +38,6 @@ private String reduce(String s) { prev = s; s = explode(s); if(prev.equals(s)) s = split(s); -// System.out.println(s); } return s; } @@ -151,17 +139,9 @@ boolean isNum(char c){ return c >= '0' && c <= '9'; } - int charToInt(char c){ - int res = c - '0'; - if(res>=0 && res<=9) return res; - return -1; - } - @Override public Object part2() { var in = dayStream().filter(e -> !e.isEmpty()).map(this::reduce).collect(Collectors.toCollection(ArrayList::new)); return IntStream.range(0, in.size()).boxed().flatMap(x -> IntStream.range(0, in.size()).filter(y -> x!=y).mapToObj(y -> new Point(x, y))).mapToInt(p -> magnitude(reduce("["+in.get(p.x)+","+in.get(p.y)+"]"))).max().getAsInt(); } - - public record Pair (Optional p1, Optional p2, Optional num1, Optional num2, Integer depth) { } } diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java index 3e1a16f8..38d981ee 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java @@ -10,10 +10,14 @@ public Day19() { public static void main(String[] args) { new Day19().printParts(); +// new Day19().submitPart1(); +// new Day19().submitPart2(); } @Override public Object part1() { + var in = day(); + return ""; } From 3fd255f576df5a71aa950b236a3b48bdd961f8a5 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Sun, 19 Dec 2021 07:23:10 +0100 Subject: [PATCH 303/433] Day 19 Progress --- .../com/sbaars/adventofcode/common/Loc.java | 2 +- .../com/sbaars/adventofcode/common/Loc3D.java | 104 +++ .../adventofcode/year21/days/Day19.java | 61 +- src/main/resources/2021-examples/day19-1.txt | 9 + src/main/resources/2021-examples/day19-10.txt | 79 ++ src/main/resources/2021-examples/day19-2.txt | 4 + src/main/resources/2021-examples/day19-3.txt | 3 + src/main/resources/2021-examples/day19-4.txt | 4 + src/main/resources/2021-examples/day19-5.txt | 39 + src/main/resources/2021-examples/day19-6.txt | 136 ++++ src/main/resources/2021-examples/day19-7.txt | 12 + src/main/resources/2021-examples/day19-8.txt | 12 + src/main/resources/2021-examples/day19-9.txt | 12 + src/main/resources/2021/day19.txt | 748 ++++++++++++++++++ 14 files changed, 1221 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode/common/Loc3D.java create mode 100644 src/main/resources/2021-examples/day19-1.txt create mode 100644 src/main/resources/2021-examples/day19-10.txt create mode 100644 src/main/resources/2021-examples/day19-2.txt create mode 100644 src/main/resources/2021-examples/day19-3.txt create mode 100644 src/main/resources/2021-examples/day19-4.txt create mode 100644 src/main/resources/2021-examples/day19-5.txt create mode 100644 src/main/resources/2021-examples/day19-6.txt create mode 100644 src/main/resources/2021-examples/day19-7.txt create mode 100644 src/main/resources/2021-examples/day19-8.txt create mode 100644 src/main/resources/2021-examples/day19-9.txt create mode 100644 src/main/resources/2021/day19.txt diff --git a/src/main/java/com/sbaars/adventofcode/common/Loc.java b/src/main/java/com/sbaars/adventofcode/common/Loc.java index 5af972f2..ca1f5dc7 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Loc.java +++ b/src/main/java/com/sbaars/adventofcode/common/Loc.java @@ -86,7 +86,7 @@ public boolean equals(Object o) { @Override public int hashCode() { - return Objects.hashCode(super.hashCode(), x, y); + return Objects.hashCode(x, y); } @Override diff --git a/src/main/java/com/sbaars/adventofcode/common/Loc3D.java b/src/main/java/com/sbaars/adventofcode/common/Loc3D.java new file mode 100644 index 00000000..38aef8d0 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/common/Loc3D.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 1995, 2021, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sbaars.adventofcode.common; + +import com.google.common.base.Objects; +import java.util.List; + +public class Loc3D { + public final long x; + public final long y; + public final long z; + + public Loc3D() { + this(0, 0, 0); + } + + public Loc3D(Loc3D p) { + this(p.x, p.y, p.z); + } + + public Loc3D(long x, long y, long z) { + this.x = x; + this.y = y; + this.z = z; + } + + public Loc3D(int x, int y, int z) { + this.x = x; + this.y = y; + this.z = z; + } + + public Loc3D(long[] l) { + this.x = l[0]; + this.y = l[1]; + this.z = l[2]; + } + + public List toList(){ + return List.of(x,y,z); + } + + public double getX() { + return x; + } + + public double getY() { + return y; + } + + public double getZ() { + return z; + } + + public Loc3D move(long dx, long dy, long dz) { + return new Loc3D(x + dx, y + dy, z + dz); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + Loc3D loc = (Loc3D) o; + return x == loc.x && y == loc.y && z == loc.z; + } + + @Override + public int hashCode() { + return Objects.hashCode(x, y, z); + } + + @Override + public String toString() { + return "Loc3D{" + + "x=" + x + + ", y=" + y + + ", z=" + z + + '}'; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java index 38d981ee..a5baeb36 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java @@ -1,6 +1,16 @@ package com.sbaars.adventofcode.year21.days; +import static java.lang.Integer.parseInt; +import static java.lang.Math.abs; + +import com.google.common.collect.ArrayListMultimap; +import com.sbaars.adventofcode.common.Loc3D; import com.sbaars.adventofcode.year21.Day2021; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.apache.commons.lang3.tuple.Pair; public class Day19 extends Day2021 { @@ -9,20 +19,65 @@ public Day19() { } public static void main(String[] args) { - new Day19().printParts(); + new Day19().printParts(5); // new Day19().submitPart1(); // new Day19().submitPart2(); } @Override public Object part1() { - var in = day(); + var in = Arrays.stream(day().trim().split("\n\n")).map(Scanner::new).toList(); + for(Scanner s : in) { + for(int i = 0; i unique = new HashSet<>(); + for(Scanner s : in) { + s.locs.forEach(e -> unique.add(getRelative(e))); + } + System.out.println(Arrays.stream(in).flatMap(e -> e.locs.stream()).count()); + return unique.size(); + } + + public String getRelatives(Loc3D l1){ + System.out.println(Arrays.toString(List.of(abs(l1.x-l1.y), abs(l1.y - l1.z), abs(l1.z - l1.x)).stream().sorted().toArray())); + return Arrays.toString(List.of(abs(l1.x-l1.y), abs(l1.y - l1.z), abs(l1.z - l1.x)).stream().sorted().toArray()); + } + + public Loc3D getRelative(Loc3D l1, Loc3D l2){ + var s1 = l1.toList().stream().map(Math::abs).sorted().toList(); + var s2 = l2.toList().stream().map(Math::abs).sorted().toList(); + return new Loc3D(abs(s1.get(0) - s2.get(0)), abs(s1.get(1) - s2.get(1)), abs(s1.get(2) - s2.get(2)) ); } @Override public Object part2() { return ""; } + + public record Scanner(long id, List locs, ArrayListMultimap> mm) { + public Scanner(String s){ + this(parseNumAt(12, s), Arrays.stream(s.substring(s.indexOf("\n")+1).split("\n")).map(e -> Arrays.stream(e.split(",")).mapToLong(Long::parseLong).toArray()).map(Loc3D::new).toList(), ArrayListMultimap.create()); + } + } + + public boolean isDetectedSame(Loc3D l1, Loc3D l2){ + return l1.toList().stream().map(Math::abs).sorted().toList().equals(l2.toList().stream().map(Math::abs).sorted().toList()); + } + + static int parseNumAt(int i, String s){ + if(!isNum(s.charAt(i))) return -1; + int j = i; + for(; isNum(s.charAt(j)); j++); + for(; isNum(s.charAt(i)); i--); + return parseInt(s.substring(i+1, j)); + } + + static boolean isNum(char c){ + return c >= '0' && c <= '9'; + } } diff --git a/src/main/resources/2021-examples/day19-1.txt b/src/main/resources/2021-examples/day19-1.txt new file mode 100644 index 00000000..9704cbaa --- /dev/null +++ b/src/main/resources/2021-examples/day19-1.txt @@ -0,0 +1,9 @@ +--- scanner 0 --- +0,2 +4,1 +3,3 + +--- scanner 1 --- +-1,-1 +-5,0 +-2,1 diff --git a/src/main/resources/2021-examples/day19-10.txt b/src/main/resources/2021-examples/day19-10.txt new file mode 100644 index 00000000..a29e82d0 --- /dev/null +++ b/src/main/resources/2021-examples/day19-10.txt @@ -0,0 +1,79 @@ +-892,524,684 +-876,649,763 +-838,591,734 +-789,900,-551 +-739,-1745,668 +-706,-3180,-659 +-697,-3072,-689 +-689,845,-530 +-687,-1600,576 +-661,-816,-575 +-654,-3158,-753 +-635,-1737,486 +-631,-672,1502 +-624,-1620,1868 +-620,-3212,371 +-618,-824,-621 +-612,-1695,1788 +-601,-1648,-643 +-584,868,-557 +-537,-823,-458 +-532,-1715,1894 +-518,-1681,-600 +-499,-1607,-770 +-485,-357,347 +-470,-3283,303 +-456,-621,1527 +-447,-329,318 +-430,-3130,366 +-413,-627,1469 +-345,-311,381 +-36,-1284,1171 +-27,-1108,-65 +7,-33,-71 +12,-2351,-103 +26,-1119,1091 +346,-2985,342 +366,-3059,397 +377,-2827,367 +390,-675,-793 +396,-1931,-563 +404,-588,-901 +408,-1815,803 +423,-701,434 +432,-2009,850 +443,580,662 +455,729,728 +456,-540,1869 +459,-707,401 +465,-695,1988 +474,580,667 +496,-1584,1900 +497,-1838,-617 +527,-524,1933 +528,-643,409 +534,-1912,768 +544,-627,-890 +553,345,-567 +564,392,-477 +568,-2007,-577 +605,-1665,1952 +612,-1593,1893 +630,319,-379 +686,-3108,-505 +776,-3184,-501 +846,-3110,-434 +1135,-1161,1235 +1243,-1093,1063 +1660,-552,429 +1693,-557,386 +1735,-437,1738 +1749,-1800,1813 +1772,-405,1572 +1776,-675,371 +1779,-442,1789 +1780,-1548,337 +1786,-1538,337 +1847,-1591,415 +1889,-1729,1762 +1994,-1805,1792 diff --git a/src/main/resources/2021-examples/day19-2.txt b/src/main/resources/2021-examples/day19-2.txt new file mode 100644 index 00000000..af24610b --- /dev/null +++ b/src/main/resources/2021-examples/day19-2.txt @@ -0,0 +1,4 @@ +...B. +B.... +....B +S.... diff --git a/src/main/resources/2021-examples/day19-3.txt b/src/main/resources/2021-examples/day19-3.txt new file mode 100644 index 00000000..cc6219a2 --- /dev/null +++ b/src/main/resources/2021-examples/day19-3.txt @@ -0,0 +1,3 @@ +...B.. +B....S +....B. diff --git a/src/main/resources/2021-examples/day19-4.txt b/src/main/resources/2021-examples/day19-4.txt new file mode 100644 index 00000000..151c427e --- /dev/null +++ b/src/main/resources/2021-examples/day19-4.txt @@ -0,0 +1,4 @@ +...B.. +B....S +....B. +S..... diff --git a/src/main/resources/2021-examples/day19-5.txt b/src/main/resources/2021-examples/day19-5.txt new file mode 100644 index 00000000..68353468 --- /dev/null +++ b/src/main/resources/2021-examples/day19-5.txt @@ -0,0 +1,39 @@ +--- scanner 0 --- +-1,-1,1 +-2,-2,2 +-3,-3,3 +-2,-3,1 +5,6,-4 +8,0,7 + +--- scanner 0 --- +1,-1,1 +2,-2,2 +3,-3,3 +2,-1,3 +-5,4,-6 +-8,-7,0 + +--- scanner 0 --- +-1,-1,-1 +-2,-2,-2 +-3,-3,-3 +-1,-3,-2 +4,6,5 +-7,0,8 + +--- scanner 0 --- +1,1,-1 +2,2,-2 +3,3,-3 +1,3,-2 +-4,-6,5 +7,0,8 + +--- scanner 0 --- +1,1,1 +2,2,2 +3,3,3 +3,1,2 +-6,-4,-5 +0,7,-8 diff --git a/src/main/resources/2021-examples/day19-6.txt b/src/main/resources/2021-examples/day19-6.txt new file mode 100644 index 00000000..4e496e9e --- /dev/null +++ b/src/main/resources/2021-examples/day19-6.txt @@ -0,0 +1,136 @@ +--- scanner 0 --- +404,-588,-901 +528,-643,409 +-838,591,734 +390,-675,-793 +-537,-823,-458 +-485,-357,347 +-345,-311,381 +-661,-816,-575 +-876,649,763 +-618,-824,-621 +553,345,-567 +474,580,667 +-447,-329,318 +-584,868,-557 +544,-627,-890 +564,392,-477 +455,729,728 +-892,524,684 +-689,845,-530 +423,-701,434 +7,-33,-71 +630,319,-379 +443,580,662 +-789,900,-551 +459,-707,401 + +--- scanner 1 --- +686,422,578 +605,423,415 +515,917,-361 +-336,658,858 +95,138,22 +-476,619,847 +-340,-569,-846 +567,-361,727 +-460,603,-452 +669,-402,600 +729,430,532 +-500,-761,534 +-322,571,750 +-466,-666,-811 +-429,-592,574 +-355,545,-477 +703,-491,-529 +-328,-685,520 +413,935,-424 +-391,539,-444 +586,-435,557 +-364,-763,-893 +807,-499,-711 +755,-354,-619 +553,889,-390 + +--- scanner 2 --- +649,640,665 +682,-795,504 +-784,533,-524 +-644,584,-595 +-588,-843,648 +-30,6,44 +-674,560,763 +500,723,-460 +609,671,-379 +-555,-800,653 +-675,-892,-343 +697,-426,-610 +578,704,681 +493,664,-388 +-671,-858,530 +-667,343,800 +571,-461,-707 +-138,-166,112 +-889,563,-600 +646,-828,498 +640,759,510 +-630,509,768 +-681,-892,-333 +673,-379,-804 +-742,-814,-386 +577,-820,562 + +--- scanner 3 --- +-589,542,597 +605,-692,669 +-500,565,-823 +-660,373,557 +-458,-679,-417 +-488,449,543 +-626,468,-788 +338,-750,-386 +528,-832,-391 +562,-778,733 +-938,-730,414 +543,643,-506 +-524,371,-870 +407,773,750 +-104,29,83 +378,-903,-323 +-778,-728,485 +426,699,580 +-438,-605,-362 +-469,-447,-387 +509,732,623 +647,635,-688 +-868,-804,481 +614,-800,639 +595,780,-596 + +--- scanner 4 --- +727,592,562 +-293,-554,779 +441,611,-461 +-714,465,-776 +-743,427,-804 +-660,-479,-426 +832,-632,460 +927,-485,-438 +408,393,-506 +466,436,-512 +110,16,151 +-258,-428,682 +-393,719,612 +-211,-452,876 +808,-476,-593 +-575,615,604 +-485,667,467 +-680,325,-822 +-627,-443,-432 +872,-547,-609 +833,512,582 +807,604,487 +839,-516,451 +891,-625,532 +-652,-548,-490 +30,-46,-14 diff --git a/src/main/resources/2021-examples/day19-7.txt b/src/main/resources/2021-examples/day19-7.txt new file mode 100644 index 00000000..ca00bff7 --- /dev/null +++ b/src/main/resources/2021-examples/day19-7.txt @@ -0,0 +1,12 @@ +-618,-824,-621 +-537,-823,-458 +-447,-329,318 +404,-588,-901 +544,-627,-890 +528,-643,409 +-661,-816,-575 +390,-675,-793 +423,-701,434 +-345,-311,381 +459,-707,401 +-485,-357,347 diff --git a/src/main/resources/2021-examples/day19-8.txt b/src/main/resources/2021-examples/day19-8.txt new file mode 100644 index 00000000..e3762faa --- /dev/null +++ b/src/main/resources/2021-examples/day19-8.txt @@ -0,0 +1,12 @@ +686,422,578 +605,423,415 +515,917,-361 +-336,658,858 +-476,619,847 +-460,603,-452 +729,430,532 +-322,571,750 +-355,545,-477 +413,935,-424 +-391,539,-444 +553,889,-390 diff --git a/src/main/resources/2021-examples/day19-9.txt b/src/main/resources/2021-examples/day19-9.txt new file mode 100644 index 00000000..738dc326 --- /dev/null +++ b/src/main/resources/2021-examples/day19-9.txt @@ -0,0 +1,12 @@ +459,-707,401 +-739,-1745,668 +-485,-357,347 +432,-2009,850 +528,-643,409 +423,-701,434 +-345,-311,381 +408,-1815,803 +534,-1912,768 +-687,-1600,576 +-447,-329,318 +-635,-1737,486 diff --git a/src/main/resources/2021/day19.txt b/src/main/resources/2021/day19.txt new file mode 100644 index 00000000..2cbcd2f3 --- /dev/null +++ b/src/main/resources/2021/day19.txt @@ -0,0 +1,748 @@ +--- scanner 0 --- +-373,-505,495 +726,-431,-735 +969,-333,525 +974,-314,431 +-282,574,699 +588,476,-482 +12,23,-110 +-347,-413,630 +-307,484,-878 +698,631,705 +760,538,748 +913,-376,524 +688,-374,-647 +-258,463,-934 +718,500,661 +-476,-823,-648 +-419,435,-860 +549,684,-453 +657,-349,-883 +-365,555,740 +-519,542,672 +511,436,-465 +98,-84,19 +-404,-506,511 +-570,-813,-631 +-436,-831,-723 + +--- scanner 1 --- +382,-438,840 +-403,544,749 +824,583,394 +-580,-795,-437 +-830,587,-494 +95,-16,-49 +660,-776,-365 +-662,-430,486 +665,-750,-317 +-513,-848,-520 +396,-449,873 +629,-774,-443 +-585,-442,577 +-706,568,-482 +-752,551,-598 +750,431,-791 +701,397,-848 +-18,-160,29 +831,633,628 +-443,-475,502 +-290,667,716 +-442,675,734 +801,531,561 +409,-498,724 +-527,-732,-378 +746,420,-850 + +--- scanner 2 --- +-757,416,-610 +630,444,-341 +-471,-355,-807 +-512,-587,748 +866,-507,940 +618,659,823 +-455,-706,841 +-522,429,-644 +861,-601,921 +309,-710,-826 +-29,-58,2 +-519,-544,-797 +653,377,-387 +805,-600,878 +-437,-528,-743 +-678,555,441 +-544,647,423 +-481,-571,749 +-614,375,-625 +300,-648,-637 +549,807,905 +64,50,130 +580,571,880 +-584,572,431 +356,-783,-718 +641,522,-355 + +--- scanner 3 --- +-397,741,649 +613,283,796 +-138,40,36 +560,267,677 +601,321,-513 +-36,-88,-134 +-884,-417,-545 +-891,-435,-712 +-641,-652,540 +-673,-728,470 +-617,575,-408 +304,-368,627 +682,-781,-355 +633,265,-717 +-489,733,486 +-550,684,566 +295,-418,674 +333,-402,854 +-479,610,-482 +-616,617,-548 +-865,-415,-662 +480,267,822 +815,-855,-362 +653,392,-662 +707,-919,-427 +-789,-585,482 + +--- scanner 4 --- +-893,708,478 +702,458,659 +-362,-770,-661 +668,-333,-616 +-458,699,-625 +664,371,701 +-455,-837,-636 +540,-648,591 +628,420,-341 +-821,846,453 +698,-631,631 +-586,-465,507 +571,414,639 +801,-368,-728 +609,-614,776 +647,379,-424 +-34,-124,39 +67,62,-47 +660,447,-578 +-531,-338,527 +-512,-735,-755 +-592,590,-679 +-886,782,345 +793,-409,-648 +-508,699,-613 +-735,-394,559 + +--- scanner 5 --- +507,-397,537 +754,617,-598 +-512,-507,655 +-769,835,-443 +-587,-564,642 +-517,722,494 +-222,-719,-274 +596,600,-558 +-284,-626,-335 +92,-7,-38 +973,611,780 +-433,895,535 +649,-426,523 +-674,-529,580 +-241,-625,-279 +592,-489,-530 +723,-445,-550 +685,583,-413 +715,-395,582 +913,764,801 +-462,718,457 +630,-402,-488 +-641,714,-472 +146,83,123 +-628,767,-519 +948,665,679 + +--- scanner 6 --- +-347,-802,628 +740,-472,669 +-407,-823,781 +814,-610,634 +560,660,451 +-690,466,-385 +59,-23,-55 +-813,-559,-380 +795,714,-860 +-372,-701,682 +510,-884,-376 +-724,536,617 +-635,391,600 +505,640,324 +677,-877,-358 +860,822,-796 +560,-858,-356 +709,608,380 +-728,508,-472 +-70,-108,50 +-671,-545,-409 +-605,-604,-378 +-566,576,634 +674,-609,676 +-597,528,-428 +867,689,-722 + +--- scanner 7 --- +-591,-929,-536 +442,553,477 +-562,-752,649 +399,-918,-480 +-436,-728,613 +-510,-873,-401 +-103,-138,128 +328,-839,-583 +-967,419,577 +-402,-920,-474 +685,433,-309 +754,-427,882 +275,605,454 +509,655,447 +-501,645,-431 +721,-416,896 +-584,611,-612 +719,304,-282 +-910,453,528 +-548,683,-493 +-484,-754,618 +-969,442,532 +605,-476,869 +443,-859,-559 +558,307,-310 +-12,-7,16 + +--- scanner 8 --- +-846,632,-808 +-753,513,-751 +331,-827,668 +621,484,742 +620,-449,-649 +600,552,595 +639,-503,-741 +-436,-646,-679 +-36,-79,-63 +605,-490,-506 +792,470,-744 +412,-904,606 +-454,713,743 +-481,702,777 +463,-798,635 +-754,497,-782 +802,281,-792 +-498,-872,782 +-576,681,720 +-446,-629,-585 +-532,-784,785 +738,454,-826 +590,572,812 +-370,-857,781 +-428,-721,-719 + +--- scanner 9 --- +-279,518,-679 +822,788,-555 +-665,-616,708 +590,-595,727 +663,-722,632 +97,14,179 +-352,-770,-485 +-787,674,944 +160,-104,6 +-651,-607,854 +-324,358,-718 +390,691,495 +924,775,-406 +-290,495,-793 +-403,-719,-404 +931,-557,-715 +913,783,-608 +881,-514,-590 +-664,768,877 +726,-574,606 +-701,714,804 +-239,-816,-374 +-625,-438,778 +385,741,585 +404,760,449 +806,-484,-669 + +--- scanner 10 --- +-825,-457,-510 +-416,358,-647 +521,-577,369 +-457,-465,496 +677,-750,-672 +-464,362,-748 +-407,-375,640 +718,-607,-687 +-402,-508,572 +-405,383,-619 +-536,462,527 +716,660,-449 +538,-671,379 +286,556,843 +-482,539,695 +-821,-437,-438 +-100,-73,-67 +571,648,-417 +446,-537,361 +522,587,818 +434,625,761 +-704,-478,-385 +664,-515,-706 +-530,446,581 +649,637,-403 +-5,66,97 + +--- scanner 11 --- +737,-219,-555 +-663,-771,440 +-586,676,-684 +359,763,-968 +-829,550,227 +500,759,328 +-618,606,-608 +-55,165,-84 +-670,-578,449 +500,811,223 +-772,489,333 +375,-410,659 +762,-291,-417 +-829,-409,-919 +-734,618,-751 +388,990,-934 +455,-349,714 +356,839,315 +-810,-526,-921 +-863,674,324 +339,-455,703 +-753,-683,524 +870,-226,-481 +350,810,-918 +-836,-576,-901 +74,39,-143 + +--- scanner 12 --- +620,-417,735 +-749,-645,-414 +477,-548,-412 +482,848,542 +-776,901,-452 +-132,87,-6 +-792,847,-370 +-965,911,-404 +741,-289,764 +-813,-836,933 +513,770,544 +-733,-644,-445 +-719,-817,928 +465,-563,-597 +436,583,-705 +-720,-774,872 +477,896,568 +473,497,-579 +437,-608,-570 +-537,822,423 +-672,741,367 +-614,-737,-388 +467,655,-630 +673,-430,688 +-610,930,376 +-188,-25,130 + +--- scanner 13 --- +-795,743,584 +-735,-655,-479 +403,-652,296 +-869,666,-558 +487,-795,-471 +-816,749,-625 +-651,-457,424 +362,-568,469 +325,-623,473 +530,588,-797 +-170,33,69 +410,395,705 +376,338,656 +-604,-444,477 +625,-883,-518 +542,-815,-534 +566,692,-875 +-771,869,620 +-45,56,-102 +-785,-775,-563 +-753,808,-572 +399,336,701 +-575,-316,356 +547,704,-751 +-729,-690,-518 +-797,821,615 + +--- scanner 14 --- +906,-535,672 +-840,-337,492 +-829,-312,464 +869,-495,468 +-781,-316,363 +71,-36,-1 +598,796,-581 +592,908,-608 +-639,705,-769 +546,809,606 +-475,710,-879 +633,-494,-452 +-541,524,726 +840,-595,608 +628,-704,-443 +-420,503,601 +624,-716,-443 +-699,-393,-806 +-424,483,673 +-576,690,-837 +-687,-342,-678 +-1,120,-99 +554,761,707 +515,765,-554 +-679,-408,-614 +566,889,728 + +--- scanner 15 --- +409,988,-523 +-459,868,-528 +502,973,-349 +57,154,-109 +579,-469,436 +543,-478,-669 +-686,-678,786 +542,-343,522 +880,733,694 +571,-451,-624 +-643,-634,-706 +583,-636,-609 +-859,-644,850 +10,11,17 +-656,890,669 +-627,-603,-705 +-438,925,-433 +-508,-660,-798 +-588,743,648 +-568,960,638 +573,-418,594 +-670,-596,840 +360,937,-330 +796,731,534 +689,745,607 +-427,891,-406 + +--- scanner 16 --- +-823,562,316 +368,476,811 +-737,522,456 +-753,-613,472 +569,532,-508 +-828,-667,631 +-452,894,-738 +386,-574,-884 +-456,953,-749 +-401,-458,-638 +-501,951,-772 +-671,-672,502 +647,-560,419 +-700,468,383 +354,545,765 +-10,84,-125 +112,124,23 +-371,-525,-536 +760,-645,463 +-378,-291,-586 +688,568,-580 +507,485,-546 +745,-651,475 +385,-701,-758 +349,495,675 +358,-735,-887 + +--- scanner 17 --- +778,811,568 +387,-443,-821 +-438,-781,-858 +-152,88,-129 +457,579,-448 +606,-427,-866 +-18,-69,0 +-770,-491,769 +-452,-814,-847 +-685,502,-522 +471,437,-564 +-721,376,-546 +538,-438,692 +529,-518,-854 +-716,424,-520 +-689,-371,793 +-731,617,652 +524,-325,616 +584,811,488 +647,840,550 +652,-309,714 +-762,689,727 +-706,-309,810 +-725,775,601 +-465,-665,-798 +524,496,-501 + +--- scanner 18 --- +446,708,451 +-653,-546,-866 +-714,-775,480 +65,33,-46 +-598,368,-941 +545,-648,737 +685,-548,766 +-530,501,-946 +-539,-453,-818 +661,-390,-943 +-816,-711,424 +552,450,-523 +480,430,-527 +-701,678,680 +-688,681,583 +-485,-469,-812 +425,836,463 +790,-369,-884 +-640,741,555 +-454,458,-891 +481,-588,803 +547,756,443 +427,471,-644 +689,-365,-932 +-714,-680,314 + +--- scanner 19 --- +-499,677,856 +-525,682,904 +-427,-496,701 +644,-694,-675 +483,-675,-712 +-501,646,778 +-543,-510,843 +640,694,-555 +613,722,-600 +-567,-456,-655 +-561,-417,-620 +673,692,663 +455,682,-540 +509,-623,469 +589,-817,469 +571,-686,440 +-721,418,-281 +578,-676,-577 +-511,-501,-740 +-692,539,-409 +-480,-563,784 +622,686,505 +748,723,591 +62,44,-2 +-645,486,-422 + +--- scanner 20 --- +808,-763,595 +-108,-142,81 +-8,32,19 +489,811,-772 +570,817,-853 +-416,-393,710 +-358,292,430 +-726,-843,-392 +-390,-377,577 +-730,475,-692 +-535,-377,657 +544,-700,-824 +477,-865,-783 +-646,-794,-453 +-672,542,-544 +521,693,900 +498,-637,-811 +-538,308,392 +774,-792,647 +601,585,920 +-742,618,-576 +428,781,-764 +807,-789,765 +-585,258,401 +-563,-851,-300 +602,674,813 + +--- scanner 21 --- +-666,722,-484 +-491,813,705 +-806,808,-524 +746,-892,-415 +-703,-662,598 +856,345,-840 +51,-59,12 +693,-801,-410 +-447,-364,-457 +817,300,-680 +544,-903,-423 +-620,656,710 +717,614,845 +762,-449,646 +-647,-760,689 +603,-404,637 +-659,-775,683 +667,-374,580 +931,311,-703 +678,653,815 +-650,738,651 +709,738,795 +-357,-369,-507 +-739,685,-430 +-311,-383,-438 + +--- scanner 22 --- +888,-585,-603 +-572,-609,569 +-493,-729,-833 +852,522,740 +-734,-684,591 +-577,-770,-660 +698,436,776 +899,591,-302 +32,-49,54 +589,-741,488 +913,-484,-549 +-591,422,-659 +857,498,-259 +447,-727,459 +-476,644,655 +-624,670,718 +-522,-807,-656 +770,519,-255 +-582,568,-673 +831,377,679 +-760,498,-633 +-647,-622,626 +-603,549,582 +655,-682,457 +853,-463,-702 + +--- scanner 23 --- +567,-750,-881 +-649,667,-700 +-385,658,701 +-399,800,730 +849,-880,388 +-698,-573,754 +-551,-328,-607 +-724,-523,734 +-717,-690,752 +688,584,682 +874,-808,250 +92,35,11 +626,677,725 +487,-689,-826 +451,-644,-870 +798,739,-505 +982,-873,314 +837,531,-476 +875,779,-488 +-563,682,-603 +180,-22,-174 +-652,727,-584 +-558,-521,-616 +-444,592,732 +-641,-416,-691 +668,715,638 + +--- scanner 24 --- +-288,581,-726 +-315,-775,396 +-318,-863,362 +570,515,-707 +-505,561,-736 +706,593,-688 +-380,690,440 +527,-599,-852 +-465,-789,-599 +786,812,404 +-358,493,-757 +825,668,377 +738,-351,421 +-494,-895,-548 +677,568,-751 +760,809,370 +-319,-848,234 +-323,711,345 +729,-432,253 +-357,722,318 +-432,-818,-467 +738,-382,358 +458,-647,-954 +446,-614,-880 +100,-21,-57 + +--- scanner 25 --- +-520,-766,-683 +-561,-939,-767 +446,-758,-559 +814,534,599 +-798,491,642 +-534,-579,223 +637,-651,628 +-71,34,-179 +758,399,680 +309,582,-916 +-681,463,-688 +-606,485,-526 +417,-879,-431 +-557,-534,221 +-726,610,606 +-760,429,689 +-483,-762,-738 +805,472,788 +248,675,-978 +639,-620,706 +-568,-530,280 +-668,520,-613 +253,581,-959 +493,-811,-572 +613,-615,754 +-84,-140,-28 + +--- scanner 26 --- +-589,648,-588 +636,927,249 +-548,-598,503 +456,656,-715 +-572,793,-677 +413,718,-622 +-756,687,636 +730,932,230 +421,-407,-639 +489,-561,-626 +531,-389,329 +462,-324,-658 +650,-446,422 +-291,-599,-618 +-703,734,649 +36,56,-73 +637,871,292 +-367,-631,-493 +-326,-711,-485 +666,-415,421 +-824,763,777 +-520,-571,458 +-606,608,-746 +-560,-413,518 +500,676,-584 From 909840ff2f3072b1f77df628e45d71beb76daceb Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Sun, 19 Dec 2021 07:57:15 +0100 Subject: [PATCH 304/433] Multimap not gonna work --- .../java/com/sbaars/adventofcode/common/Loc.java | 1 - .../java/com/sbaars/adventofcode/common/Loc3D.java | 1 - .../com/sbaars/adventofcode/year21/days/Day19.java | 12 +++--------- 3 files changed, 3 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/common/Loc.java b/src/main/java/com/sbaars/adventofcode/common/Loc.java index ca1f5dc7..dffb77db 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Loc.java +++ b/src/main/java/com/sbaars/adventofcode/common/Loc.java @@ -79,7 +79,6 @@ public Point getPoint() { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; Loc loc = (Loc) o; return x == loc.x && y == loc.y; } diff --git a/src/main/java/com/sbaars/adventofcode/common/Loc3D.java b/src/main/java/com/sbaars/adventofcode/common/Loc3D.java index 38aef8d0..c2652b4f 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Loc3D.java +++ b/src/main/java/com/sbaars/adventofcode/common/Loc3D.java @@ -83,7 +83,6 @@ public Loc3D move(long dx, long dy, long dz) { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; Loc3D loc = (Loc3D) o; return x == loc.x && y == loc.y && z == loc.z; } diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java index a5baeb36..ba0304fd 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java @@ -7,9 +7,8 @@ import com.sbaars.adventofcode.common.Loc3D; import com.sbaars.adventofcode.year21.Day2021; import java.util.Arrays; -import java.util.HashSet; import java.util.List; -import java.util.Set; +import java.util.stream.Stream; import org.apache.commons.lang3.tuple.Pair; public class Day19 extends Day2021 { @@ -19,7 +18,7 @@ public Day19() { } public static void main(String[] args) { - new Day19().printParts(5); + new Day19().printParts(6); // new Day19().submitPart1(); // new Day19().submitPart2(); } @@ -35,12 +34,7 @@ public Object part1() { } } - Set unique = new HashSet<>(); - for(Scanner s : in) { - s.locs.forEach(e -> unique.add(getRelative(e))); - } - System.out.println(Arrays.stream(in).flatMap(e -> e.locs.stream()).count()); - return unique.size(); + return in.get(0).mm.keySet().stream().filter(e -> in.get(1).mm.containsKey(e)).flatMap(e -> in.get(0).mm.get(e).stream().flatMap(p -> Stream.of(p.getLeft(), p.getRight()))).distinct().count(); } public String getRelatives(Loc3D l1){ From bee9da4a62c33893fcbec709a9a742347d153bea Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Sun, 19 Dec 2021 08:19:21 +0100 Subject: [PATCH 305/433] Stuff --- src/main/java/com/sbaars/adventofcode/common/Loc3D.java | 4 ++++ .../java/com/sbaars/adventofcode/year21/days/Day19.java | 8 ++------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/common/Loc3D.java b/src/main/java/com/sbaars/adventofcode/common/Loc3D.java index c2652b4f..ffbcccbb 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Loc3D.java +++ b/src/main/java/com/sbaars/adventofcode/common/Loc3D.java @@ -79,6 +79,10 @@ public Loc3D move(long dx, long dy, long dz) { return new Loc3D(x + dx, y + dy, z + dz); } + public double distance(Loc3D p) { + return Math.sqrt(Math.pow(x - p.getX(), 2) + Math.pow(y - p.getY(), 2) + Math.pow(z - p.getZ(), 2)); + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java index ba0304fd..e71af34e 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java @@ -37,15 +37,11 @@ public Object part1() { return in.get(0).mm.keySet().stream().filter(e -> in.get(1).mm.containsKey(e)).flatMap(e -> in.get(0).mm.get(e).stream().flatMap(p -> Stream.of(p.getLeft(), p.getRight()))).distinct().count(); } - public String getRelatives(Loc3D l1){ - System.out.println(Arrays.toString(List.of(abs(l1.x-l1.y), abs(l1.y - l1.z), abs(l1.z - l1.x)).stream().sorted().toArray())); - return Arrays.toString(List.of(abs(l1.x-l1.y), abs(l1.y - l1.z), abs(l1.z - l1.x)).stream().sorted().toArray()); - } - public Loc3D getRelative(Loc3D l1, Loc3D l2){ var s1 = l1.toList().stream().map(Math::abs).sorted().toList(); var s2 = l2.toList().stream().map(Math::abs).sorted().toList(); - return new Loc3D(abs(s1.get(0) - s2.get(0)), abs(s1.get(1) - s2.get(1)), abs(s1.get(2) - s2.get(2)) ); + var res = Stream.of(abs(s1.get(0) - s2.get(0)), abs(s1.get(1) - s2.get(1)), abs(s1.get(2) - s2.get(2))).sorted().mapToLong(e -> e).toArray(); + return new Loc3D(res); } @Override From 22fad994b9abfa6912c56a65c1796712f75f81fe Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Sun, 19 Dec 2021 08:41:19 +0100 Subject: [PATCH 306/433] Part 1 --- .../adventofcode/year21/days/Day19.java | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java index e71af34e..c90b4ced 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java @@ -6,6 +6,7 @@ import com.google.common.collect.ArrayListMultimap; import com.sbaars.adventofcode.common.Loc3D; import com.sbaars.adventofcode.year21.Day2021; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Stream; @@ -29,12 +30,27 @@ public Object part1() { for(Scanner s : in) { for(int i = 0; i> overlap = new ArrayList<>(); + for(int i = 0; i=12) { + overlap.add(Pair.of(in.get(i), in.get(j))); + break; + } + } + } + + + return in.stream().flatMap(e -> e.mm.keySet().stream()).distinct().count(); + } - return in.get(0).mm.keySet().stream().filter(e -> in.get(1).mm.containsKey(e)).flatMap(e -> in.get(0).mm.get(e).stream().flatMap(p -> Stream.of(p.getLeft(), p.getRight()))).distinct().count(); + private long overlap(Scanner a, Scanner b) { + return a.mm.keySet().stream().filter(e -> b.mm.containsKey(e)).flatMap(e -> a.mm.get(e).stream().flatMap(p -> Stream.of(p.getLeft(), p.getRight()))).distinct().count(); } public Loc3D getRelative(Loc3D l1, Loc3D l2){ @@ -49,7 +65,7 @@ public Object part2() { return ""; } - public record Scanner(long id, List locs, ArrayListMultimap> mm) { + public record Scanner(long id, List locs, ArrayListMultimap> mm) { public Scanner(String s){ this(parseNumAt(12, s), Arrays.stream(s.substring(s.indexOf("\n")+1).split("\n")).map(e -> Arrays.stream(e.split(",")).mapToLong(Long::parseLong).toArray()).map(Loc3D::new).toList(), ArrayListMultimap.create()); } From b0a2cdb471bd656cce670f7b4fc424d4809e2412 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Sun, 19 Dec 2021 12:00:38 +0100 Subject: [PATCH 307/433] Day 19 Refactor --- .../sbaars/adventofcode/common/IntLoc.java | 96 ++++++++++++ .../com/sbaars/adventofcode/common/Loc.java | 10 +- .../com/sbaars/adventofcode/common/Loc3D.java | 22 +++ .../sbaars/adventofcode/util/FetchInput.java | 2 +- .../adventofcode/year21/days/Day19.java | 144 +++++++++++++----- .../adventofcode/year21/days/Day20.java | 4 + 6 files changed, 238 insertions(+), 40 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode/common/IntLoc.java diff --git a/src/main/java/com/sbaars/adventofcode/common/IntLoc.java b/src/main/java/com/sbaars/adventofcode/common/IntLoc.java new file mode 100644 index 00000000..5893c2bd --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/common/IntLoc.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 1995, 2021, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sbaars.adventofcode.common; + +import com.google.common.base.Objects; +import java.awt.*; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +public class IntLoc { + public final int x; + public final int y; + + public IntLoc() { + this(0, 0); + } + + public IntLoc(IntLoc p) { + this(p.x, p.y); + } + + public IntLoc(int x, int y) { + this.x = x; + this.y = y; + } + + public IntLoc(Point p) { + this.x = p.x; + this.y = p.y; + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + public IntLoc move(int dx, int dy) { + return new IntLoc(x + dx, y + dy); + } + + public IntLoc move(IntLoc l) { + return new IntLoc(x + l.x, y + l.y); + } + + public Point getPoint() { + return new Point(Math.toIntExact(x), Math.toIntExact(y)); + } + + public static Stream range(int i, int j){ + return IntStream.range(0, i).boxed().flatMap(x -> IntStream.range(0, j).mapToObj(y -> new IntLoc(x, y))); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + IntLoc loc = (IntLoc) o; + return x == loc.x && y == loc.y; + } + + @Override + public int hashCode() { + return Objects.hashCode(x, y); + } + + @Override + public String toString() { + return getClass().getName() + "[x=" + x + ",y=" + y + "]"; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/common/Loc.java b/src/main/java/com/sbaars/adventofcode/common/Loc.java index dffb77db..e0741230 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Loc.java +++ b/src/main/java/com/sbaars/adventofcode/common/Loc.java @@ -27,6 +27,8 @@ import com.google.common.base.Objects; import java.awt.*; +import java.util.stream.IntStream; +import java.util.stream.Stream; public class Loc { public final long x; @@ -55,11 +57,11 @@ public Loc(Point p) { this.y = p.y; } - public double getX() { + public long getX() { return x; } - public double getY() { + public long getY() { return y; } @@ -75,6 +77,10 @@ public Point getPoint() { return new Point(Math.toIntExact(x), Math.toIntExact(y)); } + public static Stream range(int i, int j){ + return IntStream.range(0, i).boxed().flatMap(x -> IntStream.range(0, j).mapToObj(y -> new Loc(x, y))); + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/com/sbaars/adventofcode/common/Loc3D.java b/src/main/java/com/sbaars/adventofcode/common/Loc3D.java index ffbcccbb..fe1ba528 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Loc3D.java +++ b/src/main/java/com/sbaars/adventofcode/common/Loc3D.java @@ -83,6 +83,28 @@ public double distance(Loc3D p) { return Math.sqrt(Math.pow(x - p.getX(), 2) + Math.pow(y - p.getY(), 2) + Math.pow(z - p.getZ(), 2)); } + public Loc3D flip(int flip) { + return switch (flip) { + case 0 -> this; + case 1 -> new Loc3D(x, -y, -z); + case 2 -> new Loc3D(x, -z, y); + case 3 -> new Loc3D(-y, -z, x); + case 4 -> new Loc3D(-x, -z, -y); + case 5 -> new Loc3D(y, -z, -x); + default -> throw new IllegalStateException("Invalid flip value: "+flip); + }; + } + + public Loc3D rotate(int rot) { + return switch (rot) { + case 0 -> this; + case 1 -> new Loc3D(-y, x, z); + case 2 -> new Loc3D(-x, -y, z); + case 3 -> new Loc3D(y, -x, z); + default -> throw new IllegalStateException("Invalid rotation value: "+rot); + }; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java index 57a97fa7..0f307d31 100644 --- a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java +++ b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java @@ -27,7 +27,7 @@ private FetchInput() { } public static void main(String[] args) { - new FetchInput().retrieveDay("19", "2021"); + new FetchInput().retrieveDay("20", "2021"); } private void retrieveDay(String day, String year) { diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java index c90b4ced..540529d8 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java @@ -1,15 +1,16 @@ package com.sbaars.adventofcode.year21.days; import static java.lang.Integer.parseInt; -import static java.lang.Math.abs; -import com.google.common.collect.ArrayListMultimap; +import com.sbaars.adventofcode.common.IntLoc; import com.sbaars.adventofcode.common.Loc3D; import com.sbaars.adventofcode.year21.Day2021; +import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.stream.Stream; +import java.util.Optional; +import java.util.Queue; import org.apache.commons.lang3.tuple.Pair; public class Day19 extends Day2021 { @@ -19,60 +20,129 @@ public Day19() { } public static void main(String[] args) { - new Day19().printParts(6); -// new Day19().submitPart1(); -// new Day19().submitPart2(); + new Day19().printParts(); } @Override public Object part1() { - var in = Arrays.stream(day().trim().split("\n\n")).map(Scanner::new).toList(); - for(Scanner s : in) { - for(int i = 0; i> overlap = new ArrayList<>(); - for(int i = 0; i=12) { - overlap.add(Pair.of(in.get(i), in.get(j))); - break; + return findScannerPositions().getLeft().locs.size(); + } + + private static class ScannerVariants { + final Scanner[] variations; + + public ScannerVariants(Scanner sc) { + variations = new Scanner[24]; + for (int up = 0; up < 6; up++) { + for (int rot = 0; rot < 4; rot++) { + variations[rot + up*4] = new Scanner(sc, up, rot); } } } - - - return in.stream().flatMap(e -> e.mm.keySet().stream()).distinct().count(); } - private long overlap(Scanner a, Scanner b) { - return a.mm.keySet().stream().filter(e -> b.mm.containsKey(e)).flatMap(e -> a.mm.get(e).stream().flatMap(p -> Stream.of(p.getLeft(), p.getRight()))).distinct().count(); + private List orientations(List scanners) { + List result = new ArrayList<>(); + for (var s : scanners) result.add(new ScannerVariants(s)); + return result; } - public Loc3D getRelative(Loc3D l1, Loc3D l2){ - var s1 = l1.toList().stream().map(Math::abs).sorted().toList(); - var s2 = l2.toList().stream().map(Math::abs).sorted().toList(); - var res = Stream.of(abs(s1.get(0) - s2.get(0)), abs(s1.get(1) - s2.get(1)), abs(s1.get(2) - s2.get(2))).sorted().mapToLong(e -> e).toArray(); - return new Loc3D(res); + protected Pair findScannerPositions() { + var in = Arrays.stream(day().trim().split("\n\n")).map(Scanner::new).toList(); + var scanners = orientations(in).toArray(ScannerVariants[]::new); + var orientation = new Scanner[scanners.length]; + var position = new Loc3D[scanners.length]; + + orientation[0] = scanners[0].variations[0]; + position[0] = new Loc3D(0,0,0); + + Queue frontier = new ArrayDeque<>(); + frontier.add(0); + + while (!frontier.isEmpty()) { + var front = frontier.poll(); + for (int i = 0; i < scanners.length; i++) { + if (position[i] == null) { + var match = orientation[front].match(scanners[i]); + if (match.isPresent()) { + orientation[i] = match.get().getLeft(); + Loc3D one = position[front]; + Loc3D two = match.get().getRight(); + position[i] = new Loc3D(one.x+two.x, one.y+two.y, one.z+two.z); + frontier.add(i); + } + } + } + } + + var result = new Scanner(orientation[0].id, new ArrayList<>(orientation[0].locs)); + for (int i = 1; i < scanners.length; i++) { + result.add(orientation[i], position[i]); + } + return Pair.of(result, position); } @Override public Object part2() { - return ""; + var p = findScannerPositions().getRight(); + return IntLoc.range(p.length, p.length).mapToLong(l -> Math.abs(p[l.x].x-p[l.y].x) + Math.abs(p[l.x].y-p[l.y].y) + Math.abs(p[l.x].z-p[l.y].z)).max().getAsLong(); } - public record Scanner(long id, List locs, ArrayListMultimap> mm) { + public record Scanner(long id, List locs) { + public Scanner(){ + this(0L, List.of()); + } + public Scanner(String s){ - this(parseNumAt(12, s), Arrays.stream(s.substring(s.indexOf("\n")+1).split("\n")).map(e -> Arrays.stream(e.split(",")).mapToLong(Long::parseLong).toArray()).map(Loc3D::new).toList(), ArrayListMultimap.create()); + this(parseNumAt(12, s), Arrays.stream(s.substring(s.indexOf("\n")+1).split("\n")).map(e -> Arrays.stream(e.split(",")).mapToLong(Long::parseLong).toArray()).map(Loc3D::new).toList()); + } + + public Scanner(Scanner other, int up, int rot) { + this(other.id, other.locs.stream().map(e -> e.flip(up).rotate(rot)).toList()); + } + + private Optional findMatch(Scanner s) { + for (int i = 0; i < locs.size(); i++) { + for (int j = 0; j < s.locs.size(); j++) { + var a = locs.get(i); + var b = s.locs.get(j); + var relx = b.x - a.x; + var rely = b.y - a.y; + var relz = b.z - a.z; + int count = 0; + for (int k = 0; k < locs.size(); k++) { + if ((count + locs.size() - k) < 12) break; + for (int l = 0; l < s.locs.size(); l++) { + var m = locs.get(k); + var n = s.locs.get(l); + if ((relx + m.x) == n.x && (rely + m.y) == n.y && (relz + m.z) == n.z) { + count++; + if (count >= 12) return Optional.of(new Loc3D(relx, rely, relz)); + break; + } + } + } + } + } + return Optional.empty(); + } + + public Optional> match(ScannerVariants other) { + for (int i = 0; i < other.variations.length; i++) { + var sc = other.variations[i]; + var mat = findMatch(sc); + if (mat.isPresent()) return Optional.of(Pair.of(sc, mat.get())); + } + return Optional.empty(); } - } - public boolean isDetectedSame(Loc3D l1, Loc3D l2){ - return l1.toList().stream().map(Math::abs).sorted().toList().equals(l2.toList().stream().map(Math::abs).sorted().toList()); + public void add(Scanner s, Loc3D p) { + for (int l = 0; l < s.locs.size(); l++) { + var n = s.locs.get(l); + n = new Loc3D(n.x - p.x, n.y - p.y, n.z - p.z); + if (!locs.contains(n)) locs.add(n); + } + } } static int parseNumAt(int i, String s){ diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java index da702604..e9bfad3e 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java @@ -5,6 +5,8 @@ public class Day20 extends Day2021 { public Day20() { super(20); +// new Day20().submitPart1(); +// new Day20().submitPart2(); } public static void main(String[] args) { @@ -13,6 +15,8 @@ public static void main(String[] args) { @Override public Object part1() { + var in = day(); + return ""; } From b240b973117b9fe3de8c48a6473ea62be0d72502 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Sun, 19 Dec 2021 12:05:01 +0100 Subject: [PATCH 308/433] Refactor --- .../adventofcode/year21/days/Day19.java | 32 +++++++------------ 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java index 540529d8..d6994b4c 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java @@ -28,32 +28,22 @@ public Object part1() { return findScannerPositions().getLeft().locs.size(); } - private static class ScannerVariants { - final Scanner[] variations; - - public ScannerVariants(Scanner sc) { - variations = new Scanner[24]; - for (int up = 0; up < 6; up++) { - for (int rot = 0; rot < 4; rot++) { - variations[rot + up*4] = new Scanner(sc, up, rot); - } + private Scanner[] scannerVariants(Scanner sc){ + Scanner[] variations = new Scanner[24]; + for (int up = 0; up < 6; up++) { + for (int rot = 0; rot < 4; rot++) { + variations[rot + up*4] = new Scanner(sc, up, rot); } } - } - - private List orientations(List scanners) { - List result = new ArrayList<>(); - for (var s : scanners) result.add(new ScannerVariants(s)); - return result; + return variations; } protected Pair findScannerPositions() { - var in = Arrays.stream(day().trim().split("\n\n")).map(Scanner::new).toList(); - var scanners = orientations(in).toArray(ScannerVariants[]::new); + Scanner[][] scanners = Arrays.stream(day().trim().split("\n\n")).map(Scanner::new).map(this::scannerVariants).toArray(Scanner[][]::new); var orientation = new Scanner[scanners.length]; var position = new Loc3D[scanners.length]; - orientation[0] = scanners[0].variations[0]; + orientation[0] = scanners[0][0]; position[0] = new Loc3D(0,0,0); Queue frontier = new ArrayDeque<>(); @@ -127,9 +117,9 @@ private Optional findMatch(Scanner s) { return Optional.empty(); } - public Optional> match(ScannerVariants other) { - for (int i = 0; i < other.variations.length; i++) { - var sc = other.variations[i]; + public Optional> match(Scanner[] other) { + for (int i = 0; i < other.length; i++) { + var sc = other[i]; var mat = findMatch(sc); if (mat.isPresent()) return Optional.of(Pair.of(sc, mat.get())); } From 87bca0c3c7a56bb475404d1cc78443ec622400ce Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Sun, 19 Dec 2021 12:31:48 +0100 Subject: [PATCH 309/433] Scanners n stuff --- .../com/sbaars/adventofcode/common/Loc.java | 12 ++++++- .../com/sbaars/adventofcode/common/Loc3D.java | 8 +++++ .../adventofcode/year21/days/Day19.java | 34 +++---------------- 3 files changed, 24 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/common/Loc.java b/src/main/java/com/sbaars/adventofcode/common/Loc.java index e0741230..f04fe6e1 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Loc.java +++ b/src/main/java/com/sbaars/adventofcode/common/Loc.java @@ -25,6 +25,8 @@ package com.sbaars.adventofcode.common; +import static java.lang.Math.toIntExact; + import com.google.common.base.Objects; import java.awt.*; import java.util.stream.IntStream; @@ -74,7 +76,7 @@ public Loc move(Loc l) { } public Point getPoint() { - return new Point(Math.toIntExact(x), Math.toIntExact(y)); + return new Point(toIntExact(x), toIntExact(y)); } public static Stream range(int i, int j){ @@ -98,4 +100,12 @@ public int hashCode() { public String toString() { return getClass().getName() + "[x=" + x + ",y=" + y + "]"; } + + public int intX() { + return toIntExact(x); + } + + public int intY() { + return toIntExact(y); + } } diff --git a/src/main/java/com/sbaars/adventofcode/common/Loc3D.java b/src/main/java/com/sbaars/adventofcode/common/Loc3D.java index fe1ba528..b67c356a 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Loc3D.java +++ b/src/main/java/com/sbaars/adventofcode/common/Loc3D.java @@ -83,6 +83,10 @@ public double distance(Loc3D p) { return Math.sqrt(Math.pow(x - p.getX(), 2) + Math.pow(y - p.getY(), 2) + Math.pow(z - p.getZ(), 2)); } + public Loc3D distanceTo(Loc3D b) { + return new Loc3D(b.x - x, b.y - y, b.z - z); + } + public Loc3D flip(int flip) { return switch (flip) { case 0 -> this; @@ -126,4 +130,8 @@ public String toString() { ", z=" + z + '}'; } + + public boolean sameDistance(Loc3D m, Loc3D n) { + return (x + m.x) == n.x && (y + m.y) == n.y && (z + m.z) == n.z; + } } diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java index d6994b4c..740b36c6 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java @@ -92,38 +92,14 @@ public Scanner(Scanner other, int up, int rot) { } private Optional findMatch(Scanner s) { - for (int i = 0; i < locs.size(); i++) { - for (int j = 0; j < s.locs.size(); j++) { - var a = locs.get(i); - var b = s.locs.get(j); - var relx = b.x - a.x; - var rely = b.y - a.y; - var relz = b.z - a.z; - int count = 0; - for (int k = 0; k < locs.size(); k++) { - if ((count + locs.size() - k) < 12) break; - for (int l = 0; l < s.locs.size(); l++) { - var m = locs.get(k); - var n = s.locs.get(l); - if ((relx + m.x) == n.x && (rely + m.y) == n.y && (relz + m.z) == n.z) { - count++; - if (count >= 12) return Optional.of(new Loc3D(relx, rely, relz)); - break; - } - } - } - } - } - return Optional.empty(); + return IntLoc.range(locs.size(), s.locs.size()) + .map(l -> locs.get(l.x).distanceTo(s.locs.get(l.y))) + .filter(rel -> IntLoc.range(locs.size(), s.locs.size()).filter(l -> rel.sameDistance(locs.get(l.x), s.locs.get(l.y))).count() >= 12) + .findFirst(); } public Optional> match(Scanner[] other) { - for (int i = 0; i < other.length; i++) { - var sc = other[i]; - var mat = findMatch(sc); - if (mat.isPresent()) return Optional.of(Pair.of(sc, mat.get())); - } - return Optional.empty(); + return Arrays.stream(other).map(e -> Pair.of(e, findMatch(e))).filter(e -> e.getRight().isPresent()).map(e -> Pair.of(e.getLeft(), e.getRight().get())).findFirst(); } public void add(Scanner s, Loc3D p) { From 4224072502a7cf1e211a92e1de26844c258e4283 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Sun, 19 Dec 2021 12:35:42 +0100 Subject: [PATCH 310/433] Final solution --- .../adventofcode/year21/days/Day19.java | 50 +++++++++---------- 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java index 740b36c6..d428694c 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java @@ -11,6 +11,7 @@ import java.util.List; import java.util.Optional; import java.util.Queue; +import java.util.stream.IntStream; import org.apache.commons.lang3.tuple.Pair; public class Day19 extends Day2021 { @@ -28,11 +29,11 @@ public Object part1() { return findScannerPositions().getLeft().locs.size(); } - private Scanner[] scannerVariants(Scanner sc){ + private Scanner[] scannerVariants(Scanner sc) { Scanner[] variations = new Scanner[24]; for (int up = 0; up < 6; up++) { for (int rot = 0; rot < 4; rot++) { - variations[rot + up*4] = new Scanner(sc, up, rot); + variations[rot + up * 4] = new Scanner(sc, up, rot); } } return variations; @@ -44,25 +45,22 @@ protected Pair findScannerPositions() { var position = new Loc3D[scanners.length]; orientation[0] = scanners[0][0]; - position[0] = new Loc3D(0,0,0); + position[0] = new Loc3D(0, 0, 0); - Queue frontier = new ArrayDeque<>(); - frontier.add(0); + Queue frontier = new ArrayDeque<>(List.of(0)); while (!frontier.isEmpty()) { var front = frontier.poll(); - for (int i = 0; i < scanners.length; i++) { - if (position[i] == null) { - var match = orientation[front].match(scanners[i]); - if (match.isPresent()) { - orientation[i] = match.get().getLeft(); - Loc3D one = position[front]; - Loc3D two = match.get().getRight(); - position[i] = new Loc3D(one.x+two.x, one.y+two.y, one.z+two.z); - frontier.add(i); - } + IntStream.range(0, scanners.length).filter(i -> position[i] != null).forEach(i -> { + var match = orientation[front].match(scanners[i]); + if (match.isPresent()) { + orientation[i] = match.get().getLeft(); + Loc3D one = position[front]; + Loc3D two = match.get().getRight(); + position[i] = new Loc3D(one.x + two.x, one.y + two.y, one.z + two.z); + frontier.add(i); } - } + }); } var result = new Scanner(orientation[0].id, new ArrayList<>(orientation[0].locs)); @@ -75,16 +73,16 @@ protected Pair findScannerPositions() { @Override public Object part2() { var p = findScannerPositions().getRight(); - return IntLoc.range(p.length, p.length).mapToLong(l -> Math.abs(p[l.x].x-p[l.y].x) + Math.abs(p[l.x].y-p[l.y].y) + Math.abs(p[l.x].z-p[l.y].z)).max().getAsLong(); + return IntLoc.range(p.length, p.length).mapToLong(l -> Math.abs(p[l.x].x - p[l.y].x) + Math.abs(p[l.x].y - p[l.y].y) + Math.abs(p[l.x].z - p[l.y].z)).max().getAsLong(); } public record Scanner(long id, List locs) { - public Scanner(){ + public Scanner() { this(0L, List.of()); } - public Scanner(String s){ - this(parseNumAt(12, s), Arrays.stream(s.substring(s.indexOf("\n")+1).split("\n")).map(e -> Arrays.stream(e.split(",")).mapToLong(Long::parseLong).toArray()).map(Loc3D::new).toList()); + public Scanner(String s) { + this(parseNumAt(12, s), Arrays.stream(s.substring(s.indexOf("\n") + 1).split("\n")).map(e -> Arrays.stream(e.split(",")).mapToLong(Long::parseLong).toArray()).map(Loc3D::new).toList()); } public Scanner(Scanner other, int up, int rot) { @@ -111,15 +109,15 @@ public void add(Scanner s, Loc3D p) { } } - static int parseNumAt(int i, String s){ - if(!isNum(s.charAt(i))) return -1; + static int parseNumAt(int i, String s) { + if (!isNum(s.charAt(i))) return -1; int j = i; - for(; isNum(s.charAt(j)); j++); - for(; isNum(s.charAt(i)); i--); - return parseInt(s.substring(i+1, j)); + for (; isNum(s.charAt(j)); j++) ; + for (; isNum(s.charAt(i)); i--) ; + return parseInt(s.substring(i + 1, j)); } - static boolean isNum(char c){ + static boolean isNum(char c) { return c >= '0' && c <= '9'; } } From ba6b4e2e3e110a81694cd160a7c43a607d0a2a53 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Sun, 19 Dec 2021 12:37:22 +0100 Subject: [PATCH 311/433] Id was not needed --- .../adventofcode/year21/days/Day19.java | 26 +++---------------- 1 file changed, 4 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java index d428694c..43d9bb29 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java @@ -1,7 +1,5 @@ package com.sbaars.adventofcode.year21.days; -import static java.lang.Integer.parseInt; - import com.sbaars.adventofcode.common.IntLoc; import com.sbaars.adventofcode.common.Loc3D; import com.sbaars.adventofcode.year21.Day2021; @@ -63,7 +61,7 @@ protected Pair findScannerPositions() { }); } - var result = new Scanner(orientation[0].id, new ArrayList<>(orientation[0].locs)); + var result = new Scanner(new ArrayList<>(orientation[0].locs)); for (int i = 1; i < scanners.length; i++) { result.add(orientation[i], position[i]); } @@ -76,17 +74,13 @@ public Object part2() { return IntLoc.range(p.length, p.length).mapToLong(l -> Math.abs(p[l.x].x - p[l.y].x) + Math.abs(p[l.x].y - p[l.y].y) + Math.abs(p[l.x].z - p[l.y].z)).max().getAsLong(); } - public record Scanner(long id, List locs) { - public Scanner() { - this(0L, List.of()); - } - + public record Scanner(List locs) { public Scanner(String s) { - this(parseNumAt(12, s), Arrays.stream(s.substring(s.indexOf("\n") + 1).split("\n")).map(e -> Arrays.stream(e.split(",")).mapToLong(Long::parseLong).toArray()).map(Loc3D::new).toList()); + this(Arrays.stream(s.substring(s.indexOf("\n") + 1).split("\n")).map(e -> Arrays.stream(e.split(",")).mapToLong(Long::parseLong).toArray()).map(Loc3D::new).toList()); } public Scanner(Scanner other, int up, int rot) { - this(other.id, other.locs.stream().map(e -> e.flip(up).rotate(rot)).toList()); + this(other.locs.stream().map(e -> e.flip(up).rotate(rot)).toList()); } private Optional findMatch(Scanner s) { @@ -108,16 +102,4 @@ public void add(Scanner s, Loc3D p) { } } } - - static int parseNumAt(int i, String s) { - if (!isNum(s.charAt(i))) return -1; - int j = i; - for (; isNum(s.charAt(j)); j++) ; - for (; isNum(s.charAt(i)); i--) ; - return parseInt(s.substring(i + 1, j)); - } - - static boolean isNum(char c) { - return c >= '0' && c <= '9'; - } } From 901f51fe378ce3e7ef90d4f74a994c86bcd17deb Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Mon, 20 Dec 2021 07:05:35 +0100 Subject: [PATCH 312/433] Day 20 --- .../adventofcode/common/grid/CharGrid.java | 6 +- .../adventofcode/common/grid/Coordinates.java | 23 +++- .../adventofcode/year21/days/Day20.java | 61 +++++++++-- src/main/resources/2021-examples/day20-1.txt | 7 ++ src/main/resources/2021-examples/day20-2.txt | 5 + src/main/resources/2021-examples/day20-3.txt | 3 + src/main/resources/2021-examples/day20-4.txt | 15 +++ src/main/resources/2021-examples/day20-5.txt | 15 +++ src/main/resources/2021-examples/day20-6.txt | 15 +++ src/main/resources/2021/day20.txt | 102 ++++++++++++++++++ 10 files changed, 242 insertions(+), 10 deletions(-) create mode 100644 src/main/resources/2021-examples/day20-1.txt create mode 100644 src/main/resources/2021-examples/day20-2.txt create mode 100644 src/main/resources/2021-examples/day20-3.txt create mode 100644 src/main/resources/2021-examples/day20-4.txt create mode 100644 src/main/resources/2021-examples/day20-5.txt create mode 100644 src/main/resources/2021-examples/day20-6.txt create mode 100644 src/main/resources/2021/day20.txt diff --git a/src/main/java/com/sbaars/adventofcode/common/grid/CharGrid.java b/src/main/java/com/sbaars/adventofcode/common/grid/CharGrid.java index 3dd60b03..08bca5b5 100644 --- a/src/main/java/com/sbaars/adventofcode/common/grid/CharGrid.java +++ b/src/main/java/com/sbaars/adventofcode/common/grid/CharGrid.java @@ -4,12 +4,16 @@ import java.util.stream.IntStream; public class CharGrid implements Grid { - char[][] grid; + public char[][] grid; public CharGrid(char[][] grid) { this.grid = grid; } + public CharGrid(String s) { + grid = Arrays.stream(s.split("\n")).map(String::toCharArray).toArray(char[][]::new); + } + public int countChar(char... c) { return Math.toIntExact(iterate().filter(e -> new String(c).chars().anyMatch(i -> i == e)).count()); } diff --git a/src/main/java/com/sbaars/adventofcode/common/grid/Coordinates.java b/src/main/java/com/sbaars/adventofcode/common/grid/Coordinates.java index aa24fd02..055df527 100644 --- a/src/main/java/com/sbaars/adventofcode/common/grid/Coordinates.java +++ b/src/main/java/com/sbaars/adventofcode/common/grid/Coordinates.java @@ -1,9 +1,11 @@ package com.sbaars.adventofcode.common.grid; import static com.sbaars.adventofcode.common.Day.DEFAULT_DELIMITER; +import static java.lang.Math.abs; import java.awt.*; import java.util.Arrays; +import java.util.HashSet; import java.util.Set; import java.util.function.UnaryOperator; import java.util.stream.Collectors; @@ -28,6 +30,15 @@ public Coordinates(String s, String delimiter, String coordDelimiter) { this.coords = Arrays.stream(s.split(delimiter)).map(e -> e.split(coordDelimiter)).map(e -> new Point(Integer.parseInt(e[0]), Integer.parseInt(e[1]))).collect(Collectors.toSet()); } + public Coordinates() { + coords = new HashSet<>(); + } + + public Point add(Point a){ + coords.add(a); + return a; + } + public Coordinates transform(UnaryOperator f){ return new Coordinates(stream().map(f)); } @@ -38,16 +49,18 @@ public Stream stream(){ public NumGrid toGrid(){ NumGrid g = new NumGrid(new long[sizeY()+1][sizeX()+1]); - coords.stream().map(e -> new Point(e.y, e.x)).forEach(e -> g.set(e, 1L)); + int minX = stream().mapToInt(e -> e.x).min().getAsInt(); + int minY = stream().mapToInt(e -> e.y).min().getAsInt(); + coords.stream().map(e -> new Point(e.y-minY, e.x-minX)).forEach(e -> g.set(e, 1L)); return g; } private int sizeX() { - return stream().mapToInt(e -> e.x).max().getAsInt(); + return stream().mapToInt(e -> e.x).max().getAsInt() + abs(stream().mapToInt(e -> e.x).min().getAsInt()); } private int sizeY() { - return stream().mapToInt(e -> e.y).max().getAsInt(); + return stream().mapToInt(e -> e.y).max().getAsInt() + abs(stream().mapToInt(e -> e.y).min().getAsInt()); } public Coordinates mirrorX(){ @@ -59,4 +72,8 @@ public Coordinates mirrorY(){ int sizeY = sizeY(); return new Coordinates(coords.stream().map(p -> new Point(p.x, sizeY - p.y))); } + + public int size() { + return coords.size(); + } } diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java index e9bfad3e..64335b84 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java @@ -1,27 +1,76 @@ package com.sbaars.adventofcode.year21.days; +import static com.sbaars.adventofcode.common.Direction.EAST; +import static com.sbaars.adventofcode.common.Direction.EASTSOUTH; +import static com.sbaars.adventofcode.common.Direction.NORTH; +import static com.sbaars.adventofcode.common.Direction.NORTHEAST; +import static com.sbaars.adventofcode.common.Direction.SOUTH; +import static com.sbaars.adventofcode.common.Direction.SOUTHWEST; +import static com.sbaars.adventofcode.common.Direction.WEST; +import static com.sbaars.adventofcode.common.Direction.WESTNORTH; + +import com.sbaars.adventofcode.common.Direction; +import com.sbaars.adventofcode.common.IntLoc; +import com.sbaars.adventofcode.common.grid.CharGrid; +import com.sbaars.adventofcode.common.grid.Coordinates; +import com.sbaars.adventofcode.common.grid.NumGrid; import com.sbaars.adventofcode.year21.Day2021; +import java.awt.*; +import java.math.BigInteger; +import java.util.stream.Collectors; public class Day20 extends Day2021 { public Day20() { super(20); -// new Day20().submitPart1(); -// new Day20().submitPart2(); } public static void main(String[] args) { - new Day20().printParts(); + new Day20().printParts(1); +// new Day20().submitPart1(); +// new Day20().submitPart2(); } @Override public Object part1() { - var in = day(); + return doDay(2); + } + + private int doDay(int times) { + var in = day().split("\n\n"); + char[] replace = in[0].toCharArray(); + CharGrid inputImage = new CharGrid(in[1]); + Coordinates inputCoords = new Coordinates(IntLoc.range(inputImage.grid.length, inputImage.grid[0].length).filter(e -> inputImage.grid[e.x][e.y]=='#').map(IntLoc::getPoint).collect(Collectors.toSet())); + Coordinates outputImage = new Coordinates(); + System.out.println(inputCoords.toGrid()); + for(int it = 0; it Date: Mon, 20 Dec 2021 07:21:59 +0100 Subject: [PATCH 313/433] Refactoring --- .../sbaars/adventofcode/common/Direction.java | 70 ++++++++----------- .../adventofcode/year20/days/Day11.java | 4 +- .../adventofcode/year21/days/Day11.java | 2 +- .../adventofcode/year21/days/Day20.java | 27 +++---- 4 files changed, 47 insertions(+), 56 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/common/Direction.java b/src/main/java/com/sbaars/adventofcode/common/Direction.java index b4755ef6..176c2205 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Direction.java +++ b/src/main/java/com/sbaars/adventofcode/common/Direction.java @@ -6,8 +6,8 @@ import java.util.Arrays; public enum Direction { - NORTH(1, 'U'), EAST(4, 'R'), SOUTH(2, 'D'), WEST(3, 'L'), - NORTHEAST(4, 'E'), EASTSOUTH(5, 'E'), SOUTHWEST(6, 'E'), WESTNORTH(7, 'E'); + NORTH(1, 'U'), EAST(4, 'R'), SOUTH(2, 'D'), WEST(3, 'L'), CENTER(8, 'C'), + NORTHEAST(4, 'E'), SOUTHEAST(5, 'E'), SOUTHWEST(6, 'E'), NORTHWEST(7, 'E'); public final int num; public final int code; @@ -30,7 +30,7 @@ public static Direction getByMove(Point from, Point to) { else if (to.x < from.x) return WEST; else if (to.y > from.y) return SOUTH; else if (to.y < from.y) return NORTH; - throw new IllegalStateException("From and to location are the same: " + from + ", " + to); + else return CENTER; } public static Point turn(Point w, boolean b) { @@ -54,6 +54,10 @@ public static Direction[] fourDirections() { return new Direction[]{NORTH, EAST, SOUTH, WEST}; } + public static Direction[] eightDirections() { + return new Direction[]{NORTH, EAST, SOUTH, WEST, NORTHEAST, SOUTHEAST, SOUTHWEST, NORTHWEST}; + } + public Direction turn(boolean right) { int cur = ordinal() + (right ? 1 : -1); if (cur == fourDirections().length) cur = 0; @@ -62,25 +66,17 @@ public Direction turn(boolean right) { } public Point move(Point currentLocation, int amount) { - switch (this) { - case SOUTH: - return new Point(currentLocation.x, currentLocation.y + amount); - case NORTH: - return new Point(currentLocation.x, currentLocation.y - amount); - case EAST: - return new Point(currentLocation.x + amount, currentLocation.y); - case WEST: - return new Point(currentLocation.x - amount, currentLocation.y); - case SOUTHWEST: - return new Point(currentLocation.x - amount, currentLocation.y + amount); - case NORTHEAST: - return new Point(currentLocation.x + amount, currentLocation.y - amount); - case EASTSOUTH: - return new Point(currentLocation.x + amount, currentLocation.y + amount); - case WESTNORTH: - return new Point(currentLocation.x - amount, currentLocation.y - amount); - } - throw new IllegalStateException("Non-existent Direction: " + this); + return switch (this) { + case SOUTH -> new Point(currentLocation.x, currentLocation.y + amount); + case NORTH -> new Point(currentLocation.x, currentLocation.y - amount); + case EAST -> new Point(currentLocation.x + amount, currentLocation.y); + case WEST -> new Point(currentLocation.x - amount, currentLocation.y); + case SOUTHWEST -> new Point(currentLocation.x - amount, currentLocation.y + amount); + case NORTHEAST -> new Point(currentLocation.x + amount, currentLocation.y - amount); + case SOUTHEAST -> new Point(currentLocation.x + amount, currentLocation.y + amount); + case NORTHWEST -> new Point(currentLocation.x - amount, currentLocation.y - amount); + case CENTER -> new Point(currentLocation.x, currentLocation.y); + }; } public char getInGrid(char[][] grid, Point p, char none) { @@ -107,25 +103,17 @@ public Point move(Point currentLocation) { } public Direction opposite() { - switch (this) { - case NORTH: - return SOUTH; - case SOUTH: - return NORTH; - case EAST: - return WEST; - case WEST: - return EAST; - case NORTHEAST: - return SOUTHWEST; - case SOUTHWEST: - return NORTHEAST; - case EASTSOUTH: - return WESTNORTH; - case WESTNORTH: - return EASTSOUTH; - } - throw new IllegalStateException("Non-existent Direction: " + this); + return switch (this) { + case NORTH -> SOUTH; + case SOUTH -> NORTH; + case EAST -> WEST; + case WEST -> EAST; + case NORTHEAST -> SOUTHWEST; + case SOUTHWEST -> NORTHEAST; + case SOUTHEAST -> NORTHWEST; + case NORTHWEST -> SOUTHEAST; + case CENTER -> CENTER; + }; } public boolean leftOf(Direction robotDir) { diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day11.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day11.java index 5a54acc7..54c91b22 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day11.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day11.java @@ -26,7 +26,7 @@ public Object part1() { for (int j = 0; j < input[0].length; j++) { Point p = new Point(i, j); char[][] finalInput = input; - long occupied = stream(Direction.values()).filter(d -> + long occupied = stream(Direction.eightDirections()).filter(d -> d.getInGrid(finalInput, d.move(p)) == '#' ).count(); changes = getChanges(input, changes, newGrid, i, j, occupied, 4L); @@ -74,7 +74,7 @@ public Object part2() { private int countOccupied(char[][] input, int i, int j) { int occupied = 0; - Direction[] dirs = Direction.values(); + Direction[] dirs = Direction.eightDirections(); for (Direction dir : dirs) { Point p = new Point(i, j); p = dir.move(p, 1); diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day11.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day11.java index 869fda74..a5a55581 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day11.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day11.java @@ -28,7 +28,7 @@ public Object part1() { private long flash(NumGrid in, Point e) { in.increment(e); - return in.get(e) == 10 ? Arrays.stream(Direction.values()).map(d -> d.move(e)).filter(p -> in.get(p) != -1).mapToLong(p -> flash(in, p)).sum() + 1 : 0; + return in.get(e) == 10 ? Arrays.stream(Direction.eightDirections()).map(d -> d.move(e)).filter(p -> in.get(p) != -1).mapToLong(p -> flash(in, p)).sum() + 1 : 0; } @Override diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java index 64335b84..638ba05b 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java @@ -1,15 +1,15 @@ package com.sbaars.adventofcode.year21.days; +import static com.sbaars.adventofcode.common.Direction.CENTER; import static com.sbaars.adventofcode.common.Direction.EAST; -import static com.sbaars.adventofcode.common.Direction.EASTSOUTH; +import static com.sbaars.adventofcode.common.Direction.SOUTHEAST; import static com.sbaars.adventofcode.common.Direction.NORTH; import static com.sbaars.adventofcode.common.Direction.NORTHEAST; import static com.sbaars.adventofcode.common.Direction.SOUTH; import static com.sbaars.adventofcode.common.Direction.SOUTHWEST; import static com.sbaars.adventofcode.common.Direction.WEST; -import static com.sbaars.adventofcode.common.Direction.WESTNORTH; +import static com.sbaars.adventofcode.common.Direction.NORTHWEST; -import com.sbaars.adventofcode.common.Direction; import com.sbaars.adventofcode.common.IntLoc; import com.sbaars.adventofcode.common.grid.CharGrid; import com.sbaars.adventofcode.common.grid.Coordinates; @@ -18,14 +18,16 @@ import java.awt.*; import java.math.BigInteger; import java.util.stream.Collectors; +import java.util.stream.Stream; public class Day20 extends Day2021 { public Day20() { super(20); + this.example = 1; } public static void main(String[] args) { - new Day20().printParts(1); + System.out.println(new Day20().part1()); // new Day20().submitPart1(); // new Day20().submitPart2(); } @@ -39,7 +41,10 @@ private int doDay(int times) { var in = day().split("\n\n"); char[] replace = in[0].toCharArray(); CharGrid inputImage = new CharGrid(in[1]); - Coordinates inputCoords = new Coordinates(IntLoc.range(inputImage.grid.length, inputImage.grid[0].length).filter(e -> inputImage.grid[e.x][e.y]=='#').map(IntLoc::getPoint).collect(Collectors.toSet())); + Coordinates inputCoords = new Coordinates(IntLoc.range(inputImage.grid.length, inputImage.grid[0].length) + .filter(e -> inputImage.grid[e.y][e.x]=='#') + .map(IntLoc::getPoint) + .collect(Collectors.toSet())); Coordinates outputImage = new Coordinates(); System.out.println(inputCoords.toGrid()); for(int it = 0; it n.get(dir.move(thisPoint)) == -1 ? "0" : Long.toString(n.get(dir.move(thisPoint)))) + .collect(Collectors.joining()); + System.out.println(bin); + if(replace[binToDec(bin)] == '#'){ outputImage.add(thisPoint); } } From 34eaf3bfb61d7075948612404b75769befa057f8 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Mon, 20 Dec 2021 07:49:37 +0100 Subject: [PATCH 314/433] Refactoring --- .../sbaars/adventofcode/common/grid/NumGrid.java | 7 +++++++ .../com/sbaars/adventofcode/year21/days/Day20.java | 14 +++++--------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java b/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java index 6493f123..de874c1a 100644 --- a/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java +++ b/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java @@ -112,6 +112,13 @@ public long get(Point p) { return -1; } + public long at(Point p) { + if (p.x >= 0 && p.x < grid[0].length && p.y >= 0 && p.y < grid.length) { + return grid[p.y][p.x]; + } + return -1; + } + public int sizeX(){ return grid.length; } diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java index 638ba05b..92526421 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java @@ -23,11 +23,10 @@ public class Day20 extends Day2021 { public Day20() { super(20); - this.example = 1; } public static void main(String[] args) { - System.out.println(new Day20().part1()); + new Day20().printParts(); // new Day20().submitPart1(); // new Day20().submitPart2(); } @@ -46,16 +45,14 @@ private int doDay(int times) { .map(IntLoc::getPoint) .collect(Collectors.toSet())); Coordinates outputImage = new Coordinates(); - System.out.println(inputCoords.toGrid()); for(int it = 0; it n.get(dir.move(thisPoint)) == -1 ? "0" : Long.toString(n.get(dir.move(thisPoint)))) + .map(dir -> n.at(dir.move(thisPoint)) == -1 ? "0" : Long.toString(n.at(dir.move(thisPoint)))) .collect(Collectors.joining()); - System.out.println(bin); if(replace[binToDec(bin)] == '#'){ outputImage.add(thisPoint); } @@ -63,7 +60,6 @@ private int doDay(int times) { } inputCoords = outputImage; outputImage = new Coordinates(); - System.out.println(inputCoords.toGrid()); } return inputCoords.size(); } From c9b9da9abebefc76f2e2d9e29b387aaccf992f07 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Mon, 20 Dec 2021 07:54:00 +0100 Subject: [PATCH 315/433] Prepare day 21 --- src/main/java/com/sbaars/adventofcode/util/FetchInput.java | 2 +- src/main/java/com/sbaars/adventofcode/year21/days/Day20.java | 2 -- src/main/java/com/sbaars/adventofcode/year21/days/Day21.java | 2 ++ 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java index 0f307d31..ef87ce91 100644 --- a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java +++ b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java @@ -27,7 +27,7 @@ private FetchInput() { } public static void main(String[] args) { - new FetchInput().retrieveDay("20", "2021"); + new FetchInput().retrieveDay("21", "2021"); } private void retrieveDay(String day, String year) { diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java index 92526421..3436d795 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java @@ -27,8 +27,6 @@ public Day20() { public static void main(String[] args) { new Day20().printParts(); -// new Day20().submitPart1(); -// new Day20().submitPart2(); } @Override diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day21.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day21.java index b2dbfccb..5e87fa46 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day21.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day21.java @@ -9,6 +9,8 @@ public Day21() { public static void main(String[] args) { new Day21().printParts(); +// new Day21().submitPart1(); +// new Day21().submitPart2(); } @Override From 144ceda47ce13f083f101758c61969708e020ca4 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Mon, 20 Dec 2021 08:17:55 +0100 Subject: [PATCH 316/433] Create utility for default value --- .../com/sbaars/adventofcode/common/grid/NumGrid.java | 11 +++++++++++ .../com/sbaars/adventofcode/year21/days/Day20.java | 3 ++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java b/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java index de874c1a..41f4d47d 100644 --- a/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java +++ b/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java @@ -112,6 +112,10 @@ public long get(Point p) { return -1; } + /** + * The get method doesn't properly work with x and y positions, it assumes x=y and y=x. This one fixes that. + * Why not fix `get` you ask? Because I'm afraid it'll break earlier days. That's why. + */ public long at(Point p) { if (p.x >= 0 && p.x < grid[0].length && p.y >= 0 && p.y < grid.length) { return grid[p.y][p.x]; @@ -119,6 +123,13 @@ public long at(Point p) { return -1; } + public long at(Point p, int or) { + if (p.x >= 0 && p.x < grid[0].length && p.y >= 0 && p.y < grid.length) { + return grid[p.y][p.x]; + } + return or; + } + public int sizeX(){ return grid.length; } diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java index 3436d795..3142b966 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java @@ -44,12 +44,13 @@ private int doDay(int times) { .collect(Collectors.toSet())); Coordinates outputImage = new Coordinates(); for(int it = 0; it n.at(dir.move(thisPoint)) == -1 ? "0" : Long.toString(n.at(dir.move(thisPoint)))) + .map(dir -> Long.toString(n.at(dir.move(thisPoint), iteration%2==1 && replace[0] == '#' ? 1 : 0))) .collect(Collectors.joining()); if(replace[binToDec(bin)] == '#'){ outputImage.add(thisPoint); From a7e4838e537e055329e76f99d05840f6765f6011 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Mon, 20 Dec 2021 08:19:49 +0100 Subject: [PATCH 317/433] Expand grid to fit all --- src/main/java/com/sbaars/adventofcode/year21/days/Day20.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java index 3142b966..4ccaa73e 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java @@ -46,8 +46,8 @@ private int doDay(int times) { for(int it = 0; it Long.toString(n.at(dir.move(thisPoint), iteration%2==1 && replace[0] == '#' ? 1 : 0))) From 2d08fac52883c38d328c43d58d961279cd6249a4 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Tue, 21 Dec 2021 08:30:22 +0100 Subject: [PATCH 318/433] Day 21 --- .../sbaars/adventofcode/util/FetchInput.java | 2 +- .../adventofcode/year21/days/Day21.java | 79 ++++++++++++++++++- .../adventofcode/year21/days/Day22.java | 4 + src/main/resources/2021-examples/day21-1.txt | 2 + src/main/resources/2021/day21.txt | 2 + 5 files changed, 84 insertions(+), 5 deletions(-) create mode 100644 src/main/resources/2021-examples/day21-1.txt create mode 100644 src/main/resources/2021/day21.txt diff --git a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java index ef87ce91..1618fb75 100644 --- a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java +++ b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java @@ -27,7 +27,7 @@ private FetchInput() { } public static void main(String[] args) { - new FetchInput().retrieveDay("21", "2021"); + new FetchInput().retrieveDay("22", "2021"); } private void retrieveDay(String day, String year) { diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day21.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day21.java index 5e87fa46..3aff9b1e 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day21.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day21.java @@ -1,6 +1,11 @@ package com.sbaars.adventofcode.year21.days; +import com.google.common.base.Objects; import com.sbaars.adventofcode.year21.Day2021; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import org.apache.commons.math3.util.Pair; public class Day21 extends Day2021 { public Day21() { @@ -9,17 +14,83 @@ public Day21() { public static void main(String[] args) { new Day21().printParts(); -// new Day21().submitPart1(); -// new Day21().submitPart2(); } @Override public Object part1() { - return ""; + int player1 = 7; + int player2 = 2; + int score1= 0; + int score2 = 0; + int thr = 1; + boolean turn = true; + while(true){ + for(int j = 1; j<=3; j++) { + if(turn){ + player1 = player1 + thr; + while(player1>10) player1-=10; + } else { + player2 = player2 + thr; + while(player2>10) player2-=10; + } + thr++; + } + if(turn) { + score1+=player1; + } else { + score2+=player2; + } + if(score1 >= 1000 || score2 >= 1000){ + return Math.min(score1, score2) * (thr-1); + } + turn = !turn; + } } @Override public Object part2() { - return ""; + Pair universes = universes(new HashMap<>(), new State(7, 2, 0, 0, true)); + return Math.max(universes.getFirst(), universes.getSecond()); + } + + private Pair universes (Map> m, State s) { + Pair wins = new Pair<>(0L, 0L); + if(m.containsKey(s)) { + return m.get(s); + } else if(Math.max(s.score[0], s.score[1]) >= 21){ + return new Pair<>(s.move ? 0L : 1L, s.move ? 1L : 0L); + } + for(int i = 1; i<=3; i++){ + for(int j = 1; j<=3; j++){ + for(int k = 1; k<=3; k++){ + int newTurn = s.turn[s.move ? 0 : 1] + i + j + k; + while(newTurn>10) newTurn-=10; + int newScore = s.score[s.move ? 0 : 1] + newTurn; + Pair newWins = universes(m, new State(s.move ? newTurn : s.turn[0], s.move ? s.turn[1] : newTurn, s.move ? newScore : s.score[0], s.move ? s.score[1] : newScore, !s.move)); + wins = new Pair<>(wins.getFirst() + newWins.getFirst(), wins.getSecond() + newWins.getSecond()); + } + } + } + m.put(s, wins); + return wins; + } + + public record State(int[] turn, int[] score, boolean move) { + public State (int t1, int t2, int s1, int s2, boolean move){ + this(new int[]{t1,t2}, new int[]{s1, s2}, move); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + State state = (State) o; + return move == state.move && Arrays.equals(turn, state.turn) && Arrays.equals(score, state.score); + } + + @Override + public int hashCode() { + return Objects.hashCode(turn[0], turn[1], score[0], score[1], move); + } } } diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day22.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day22.java index b69a3302..87e3b2f7 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day22.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day22.java @@ -9,10 +9,14 @@ public Day22() { public static void main(String[] args) { new Day22().printParts(); +// new Day22().submitPart1(); +// new Day22().submitPart2(); } @Override public Object part1() { + var in = day(); + return ""; } diff --git a/src/main/resources/2021-examples/day21-1.txt b/src/main/resources/2021-examples/day21-1.txt new file mode 100644 index 00000000..3f691947 --- /dev/null +++ b/src/main/resources/2021-examples/day21-1.txt @@ -0,0 +1,2 @@ +Player 1 starting position: 4 +Player 2 starting position: 8 diff --git a/src/main/resources/2021/day21.txt b/src/main/resources/2021/day21.txt new file mode 100644 index 00000000..ed248f76 --- /dev/null +++ b/src/main/resources/2021/day21.txt @@ -0,0 +1,2 @@ +Player 1 starting position: 7 +Player 2 starting position: 2 From f64981a6a6f2d24f09f4800b0799eec8ebc5ded2 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Wed, 22 Dec 2021 21:38:49 +0100 Subject: [PATCH 319/433] Day 22 --- .../sbaars/adventofcode/util/FetchInput.java | 2 +- .../adventofcode/year21/days/Day22.java | 87 +++- .../adventofcode/year21/days/Day23.java | 4 + src/main/resources/2021-examples/day22-1.txt | 4 + src/main/resources/2021-examples/day22-2.txt | 22 + src/main/resources/2021-examples/day22-3.txt | 60 +++ src/main/resources/2021/day22.txt | 420 ++++++++++++++++++ 7 files changed, 592 insertions(+), 7 deletions(-) create mode 100644 src/main/resources/2021-examples/day22-1.txt create mode 100644 src/main/resources/2021-examples/day22-2.txt create mode 100644 src/main/resources/2021-examples/day22-3.txt create mode 100644 src/main/resources/2021/day22.txt diff --git a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java index 1618fb75..684e74ef 100644 --- a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java +++ b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java @@ -27,7 +27,7 @@ private FetchInput() { } public static void main(String[] args) { - new FetchInput().retrieveDay("22", "2021"); + new FetchInput().retrieveDay("23", "2021"); } private void retrieveDay(String day, String year) { diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day22.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day22.java index 87e3b2f7..5ac33099 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day22.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day22.java @@ -1,6 +1,17 @@ package com.sbaars.adventofcode.year21.days; +import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; +import static java.math.BigInteger.ZERO; + +import com.sbaars.adventofcode.common.Loc3D; import com.sbaars.adventofcode.year21.Day2021; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; public class Day22 extends Day2021 { public Day22() { @@ -9,19 +20,83 @@ public Day22() { public static void main(String[] args) { new Day22().printParts(); -// new Day22().submitPart1(); -// new Day22().submitPart2(); } @Override public Object part1() { - var in = day(); - - return ""; + var in = dayStream().map(e -> readString(e, "%s x=%n..%n,y=%n..%n,z=%n..%n", Cube.class)).toList(); + Set locs = new HashSet<>(); + for(Cube c : in){ + for(long i = Math.max(c.xStart, -50); i<=Math.min(c.xEnd, 50); i++){ + for(long j = Math.max(c.yStart, -50); j<=Math.min(c.yEnd, 50); j++){ + for(long k = Math.max(c.zStart, -50); k<=Math.min(c.zEnd, 50); k++){ + Loc3D l = new Loc3D(i, j, k); + if(c.status.equals("on")){ + locs.add(l); + } else { + locs.remove(l); + } + } + } + } + } + return locs.size(); } @Override public Object part2() { - return ""; + var in = dayStream().map(e -> readString(e, "%s x=%n..%n,y=%n..%n,z=%n..%n", Cube.class)).toList(); + List cubes = new ArrayList<>(); + for(Cube cur : in) { + Cube cu = new Cube(cur.status, cur.xStart, cur.xEnd+1, cur.yStart, cur.yEnd+1, cur.zStart, cur.zEnd+1); + cubes = cubes.stream().flatMap(c -> c.getSubCubes(cu)).collect(Collectors.toCollection(ArrayList::new)); + if (cu.status.equals("on")) { + cubes.add(cu); + } + } + return cubes.stream().map(this::cubeSize).reduce(BigInteger::add).orElse(ZERO); + } + + private BigInteger cubeSize(Cube c) { + return BigInteger.valueOf(c.xEnd - c.xStart).multiply(BigInteger.valueOf(c.yEnd - c.yStart)).multiply(BigInteger.valueOf(c.zEnd - c.zStart)); + } + + public record Cube (String status, long xStart, long xEnd, long yStart, long yEnd, long zStart, long zEnd) { + private Stream getSubCubes(Cube c2) { + if (c2.contains(this)) { + return Stream.of(); + } else if (!touches(c2)) { + return Stream.of(this); + } + + var xIntersect = Stream.of(c2.xStart, c2.xEnd).filter(x -> xStart < x && x < xEnd).collect(Collectors.toCollection(ArrayList::new)); + var yIntersect = Stream.of(c2.yStart, c2.yEnd).filter(y -> yStart < y && y < yEnd).collect(Collectors.toCollection(ArrayList::new)); + var zIntersect = Stream.of(c2.zStart, c2.zEnd).filter(z -> zStart < z && z < zEnd).collect(Collectors.toCollection(ArrayList::new)); + + xIntersect.add(0, xStart); + xIntersect.add(xEnd); + yIntersect.add(0, yStart); + yIntersect.add(yEnd); + zIntersect.add(0, zStart); + zIntersect.add(zEnd); + + var res = new ArrayList(); + for (int i = 0; i !c2.contains(c)); + } + + private boolean contains(Cube b) { + return xStart <= b.xStart && xEnd >= b.xEnd && yStart <= b.yStart && yEnd >= b.yEnd && zStart <= b.zStart && zEnd >= b.zEnd; + } + + private boolean touches(Cube b) { + return xStart <= b.xEnd && xEnd >= b.xStart && yStart <= b.yEnd && yEnd >= b.yStart && zStart <= b.zEnd && zEnd >= b.zStart; + } } } diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day23.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day23.java index 39f4f59f..b7eeae88 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day23.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day23.java @@ -9,10 +9,14 @@ public Day23() { public static void main(String[] args) { new Day23().printParts(); +// new Day23().submitPart1(); +// new Day23().submitPart2(); } @Override public Object part1() { + var in = day(); + return ""; } diff --git a/src/main/resources/2021-examples/day22-1.txt b/src/main/resources/2021-examples/day22-1.txt new file mode 100644 index 00000000..25975df7 --- /dev/null +++ b/src/main/resources/2021-examples/day22-1.txt @@ -0,0 +1,4 @@ +on x=10..12,y=10..12,z=10..12 +on x=11..13,y=11..13,z=11..13 +off x=9..11,y=9..11,z=9..11 +on x=10..10,y=10..10,z=10..10 diff --git a/src/main/resources/2021-examples/day22-2.txt b/src/main/resources/2021-examples/day22-2.txt new file mode 100644 index 00000000..e6652950 --- /dev/null +++ b/src/main/resources/2021-examples/day22-2.txt @@ -0,0 +1,22 @@ +on x=-20..26,y=-36..17,z=-47..7 +on x=-20..33,y=-21..23,z=-26..28 +on x=-22..28,y=-29..23,z=-38..16 +on x=-46..7,y=-6..46,z=-50..-1 +on x=-49..1,y=-3..46,z=-24..28 +on x=2..47,y=-22..22,z=-23..27 +on x=-27..23,y=-28..26,z=-21..29 +on x=-39..5,y=-6..47,z=-3..44 +on x=-30..21,y=-8..43,z=-13..34 +on x=-22..26,y=-27..20,z=-29..19 +off x=-48..-32,y=26..41,z=-47..-37 +on x=-12..35,y=6..50,z=-50..-2 +off x=-48..-32,y=-32..-16,z=-15..-5 +on x=-18..26,y=-33..15,z=-7..46 +off x=-40..-22,y=-38..-28,z=23..41 +on x=-16..35,y=-41..10,z=-47..6 +off x=-32..-23,y=11..30,z=-14..3 +on x=-49..-5,y=-3..45,z=-29..18 +off x=18..30,y=-20..-8,z=-3..13 +on x=-41..9,y=-7..43,z=-33..15 +on x=-54112..-39298,y=-85059..-49293,z=-27449..7877 +on x=967..23432,y=45373..81175,z=27513..53682 diff --git a/src/main/resources/2021-examples/day22-3.txt b/src/main/resources/2021-examples/day22-3.txt new file mode 100644 index 00000000..aba75859 --- /dev/null +++ b/src/main/resources/2021-examples/day22-3.txt @@ -0,0 +1,60 @@ +on x=-5..47,y=-31..22,z=-19..33 +on x=-44..5,y=-27..21,z=-14..35 +on x=-49..-1,y=-11..42,z=-10..38 +on x=-20..34,y=-40..6,z=-44..1 +off x=26..39,y=40..50,z=-2..11 +on x=-41..5,y=-41..6,z=-36..8 +off x=-43..-33,y=-45..-28,z=7..25 +on x=-33..15,y=-32..19,z=-34..11 +off x=35..47,y=-46..-34,z=-11..5 +on x=-14..36,y=-6..44,z=-16..29 +on x=-57795..-6158,y=29564..72030,z=20435..90618 +on x=36731..105352,y=-21140..28532,z=16094..90401 +on x=30999..107136,y=-53464..15513,z=8553..71215 +on x=13528..83982,y=-99403..-27377,z=-24141..23996 +on x=-72682..-12347,y=18159..111354,z=7391..80950 +on x=-1060..80757,y=-65301..-20884,z=-103788..-16709 +on x=-83015..-9461,y=-72160..-8347,z=-81239..-26856 +on x=-52752..22273,y=-49450..9096,z=54442..119054 +on x=-29982..40483,y=-108474..-28371,z=-24328..38471 +on x=-4958..62750,y=40422..118853,z=-7672..65583 +on x=55694..108686,y=-43367..46958,z=-26781..48729 +on x=-98497..-18186,y=-63569..3412,z=1232..88485 +on x=-726..56291,y=-62629..13224,z=18033..85226 +on x=-110886..-34664,y=-81338..-8658,z=8914..63723 +on x=-55829..24974,y=-16897..54165,z=-121762..-28058 +on x=-65152..-11147,y=22489..91432,z=-58782..1780 +on x=-120100..-32970,y=-46592..27473,z=-11695..61039 +on x=-18631..37533,y=-124565..-50804,z=-35667..28308 +on x=-57817..18248,y=49321..117703,z=5745..55881 +on x=14781..98692,y=-1341..70827,z=15753..70151 +on x=-34419..55919,y=-19626..40991,z=39015..114138 +on x=-60785..11593,y=-56135..2999,z=-95368..-26915 +on x=-32178..58085,y=17647..101866,z=-91405..-8878 +on x=-53655..12091,y=50097..105568,z=-75335..-4862 +on x=-111166..-40997,y=-71714..2688,z=5609..50954 +on x=-16602..70118,y=-98693..-44401,z=5197..76897 +on x=16383..101554,y=4615..83635,z=-44907..18747 +off x=-95822..-15171,y=-19987..48940,z=10804..104439 +on x=-89813..-14614,y=16069..88491,z=-3297..45228 +on x=41075..99376,y=-20427..49978,z=-52012..13762 +on x=-21330..50085,y=-17944..62733,z=-112280..-30197 +on x=-16478..35915,y=36008..118594,z=-7885..47086 +off x=-98156..-27851,y=-49952..43171,z=-99005..-8456 +off x=2032..69770,y=-71013..4824,z=7471..94418 +on x=43670..120875,y=-42068..12382,z=-24787..38892 +off x=37514..111226,y=-45862..25743,z=-16714..54663 +off x=25699..97951,y=-30668..59918,z=-15349..69697 +off x=-44271..17935,y=-9516..60759,z=49131..112598 +on x=-61695..-5813,y=40978..94975,z=8655..80240 +off x=-101086..-9439,y=-7088..67543,z=33935..83858 +off x=18020..114017,y=-48931..32606,z=21474..89843 +off x=-77139..10506,y=-89994..-18797,z=-80..59318 +off x=8476..79288,y=-75520..11602,z=-96624..-24783 +on x=-47488..-1262,y=24338..100707,z=16292..72967 +off x=-84341..13987,y=2429..92914,z=-90671..-1318 +off x=-37810..49457,y=-71013..-7894,z=-105357..-13188 +off x=-27365..46395,y=31009..98017,z=15428..76570 +off x=-70369..-16548,y=22648..78696,z=-1892..86821 +on x=-53470..21291,y=-120233..-33476,z=-44150..38147 +off x=-93533..-4276,y=-16170..68771,z=-104985..-24507 diff --git a/src/main/resources/2021/day22.txt b/src/main/resources/2021/day22.txt new file mode 100644 index 00000000..6ed28f65 --- /dev/null +++ b/src/main/resources/2021/day22.txt @@ -0,0 +1,420 @@ +on x=-22..28,y=-12..37,z=-34..11 +on x=-35..15,y=-10..40,z=-48..-2 +on x=-31..19,y=-4..43,z=-22..28 +on x=-48..-2,y=-36..13,z=-29..20 +on x=0..49,y=-14..30,z=-39..6 +on x=-8..41,y=-9..41,z=-42..7 +on x=-22..25,y=-16..28,z=-40..9 +on x=-11..33,y=-22..26,z=0..44 +on x=-13..39,y=-26..19,z=-31..15 +on x=-7..47,y=-1..44,z=-40..13 +off x=-47..-31,y=12..24,z=4..19 +on x=-23..30,y=-22..27,z=-9..35 +off x=-49..-33,y=36..46,z=28..42 +on x=0..48,y=-41..7,z=-18..31 +off x=-48..-34,y=-33..-18,z=-32..-23 +on x=-16..29,y=0..48,z=-12..37 +off x=-48..-32,y=-47..-31,z=-24..-8 +on x=-35..18,y=-11..42,z=-23..21 +off x=-5..5,y=-47..-31,z=-18..-4 +on x=-41..10,y=-39..8,z=-45..5 +on x=57743..70226,y=-61040..-49730,z=-9481..1779 +on x=34469..59935,y=-19657..-15459,z=52982..68107 +on x=2032..20175,y=43518..62126,z=58508..71090 +on x=31229..48351,y=22846..46374,z=58775..63336 +on x=50790..81085,y=-43836..-24658,z=16376..45716 +on x=28957..62666,y=-63812..-43726,z=-21518..-20032 +on x=-79145..-53125,y=-58835..-40328,z=-34032..-1191 +on x=-39963..-30908,y=61052..76815,z=-14209..4001 +on x=30995..46213,y=-188..23074,z=48848..73955 +on x=-30327..817,y=-92891..-71382,z=-556..15570 +on x=-66084..-49749,y=-70089..-44721,z=543..18051 +on x=-10435..875,y=1868..22100,z=-90712..-72390 +on x=-6457..23401,y=39789..59388,z=-64029..-59562 +on x=-48891..-19571,y=-60094..-41210,z=-63314..-59729 +on x=-84053..-64052,y=2084..16189,z=-31207..-1454 +on x=-52377..-25969,y=-90697..-66004,z=-17839..-5215 +on x=-7876..16576,y=25156..48291,z=-78019..-63073 +on x=-70710..-54783,y=28572..57892,z=2846..14577 +on x=69353..93836,y=-32370..-11069,z=-15941..8778 +on x=-92783..-71784,y=-17812..17198,z=2761..27075 +on x=45799..59502,y=-51290..-23552,z=35610..57193 +on x=-50227..-17040,y=46996..74417,z=28330..44175 +on x=8914..26079,y=-50911..-30028,z=-67490..-43942 +on x=-10960..6571,y=-75351..-66572,z=21851..44569 +on x=22699..44190,y=-83751..-52386,z=20341..36226 +on x=58542..77668,y=47268..63235,z=-3866..26621 +on x=73780..79320,y=-13674..519,z=-25349..-12369 +on x=61440..79923,y=7960..26241,z=-27706..-15327 +on x=38043..50418,y=44221..51183,z=-65245..-45723 +on x=22702..31491,y=-17144..312,z=-85339..-53805 +on x=21638..55787,y=44959..61008,z=-47808..-39438 +on x=-63113..-41252,y=-67744..-41914,z=-26758..-4882 +on x=63367..92148,y=30084..48195,z=-5852..-3181 +on x=11847..30590,y=66766..73165,z=19550..26333 +on x=-82252..-43217,y=16642..33032,z=31779..53160 +on x=376..8916,y=-85149..-77287,z=-3825..28320 +on x=-11778..4687,y=-65208..-43505,z=-56839..-41330 +on x=-59599..-26799,y=-43262..-22054,z=53184..68929 +on x=27880..45230,y=31092..48118,z=53472..65470 +on x=66503..87392,y=14887..44613,z=5640..29076 +on x=-18992..15785,y=70329..84705,z=-11543..3900 +on x=26450..55691,y=33724..51544,z=-67288..-47510 +on x=-55101..-20607,y=-54336..-50167,z=-63808..-39985 +on x=-58662..-44430,y=23514..35998,z=-57391..-35888 +on x=-30686..-14789,y=52951..78131,z=23020..30026 +on x=59723..89386,y=-1973..20344,z=-23466..16370 +on x=-28704..-19628,y=-26635..-10672,z=67912..92984 +on x=34109..52603,y=6207..33762,z=-78531..-54945 +on x=6969..35234,y=12510..46591,z=-88613..-51919 +on x=-16819..13310,y=-78286..-72895,z=-40672..-15821 +on x=12715..44649,y=59413..85803,z=12932..25405 +on x=39882..72763,y=-29701..-24955,z=30035..53183 +on x=61861..91147,y=-22736..-7422,z=4820..7751 +on x=25793..39413,y=46741..82626,z=5326..33146 +on x=-6107..19053,y=68420..92110,z=-36318..-16459 +on x=28551..40390,y=68467..76382,z=-16632..-2714 +on x=-45969..-23239,y=-62699..-36719,z=38811..56336 +on x=-76366..-72346,y=21237..38131,z=-10669..22165 +on x=44705..59494,y=6680..11337,z=49501..61061 +on x=2597..24468,y=14065..37612,z=61022..74073 +on x=35904..59720,y=-8301..13166,z=59515..64632 +on x=-19466..2821,y=54015..73358,z=37279..67387 +on x=22671..24877,y=-78893..-54761,z=30577..49365 +on x=-61910..-30004,y=-48658..-30216,z=-63277..-39443 +on x=31804..62778,y=-10031..4607,z=53321..66647 +on x=35353..59793,y=-64800..-45779,z=-45954..-25389 +on x=-54351..-23056,y=-85690..-64612,z=-11671..9856 +on x=46643..60469,y=-72975..-45242,z=-27257..-9772 +on x=-1587..22614,y=42774..64311,z=-75051..-55436 +on x=43500..63874,y=57617..69803,z=-9587..20014 +on x=-84644..-71132,y=20240..38502,z=20664..34375 +on x=40993..55870,y=-67190..-52687,z=-33480..-19778 +on x=-47052..-17260,y=-89061..-56609,z=-1611..29297 +on x=25170..40430,y=-74511..-62273,z=-42240..-11723 +on x=20724..48041,y=-49570..-30648,z=-65320..-52402 +on x=18971..41779,y=-74384..-55955,z=21290..42401 +on x=12372..25040,y=-19897..8311,z=-92628..-74366 +on x=-41481..-9209,y=-30115..-3165,z=61616..78046 +on x=-60608..-23394,y=-77847..-59531,z=23434..37967 +on x=-71858..-50069,y=-57588..-41250,z=-50072..-33315 +on x=37501..71584,y=31996..53811,z=27365..52251 +on x=-56165..-38552,y=44724..61002,z=23249..44903 +on x=33227..40766,y=61266..72042,z=-40028..-30190 +on x=-11144..9046,y=20660..52650,z=61730..86031 +on x=21865..39875,y=46084..72027,z=-41788..-32094 +on x=-30545..-4677,y=44278..74009,z=-59990..-47040 +on x=-48012..-35017,y=-70818..-58672,z=16398..44578 +on x=-60425..-50019,y=-59529..-42076,z=-36601..-4347 +on x=-5505..16222,y=77230..83177,z=-12302..11122 +on x=18568..47510,y=62799..88600,z=-6696..22060 +on x=34553..42144,y=67458..85473,z=-20865..3279 +on x=-70604..-50638,y=-37855..-14331,z=-37538..-26619 +on x=-18955..-3382,y=-15846..1586,z=65846..86641 +on x=-36618..-11388,y=-38199..-8026,z=-84356..-55275 +on x=14279..42431,y=39293..56427,z=50099..77725 +on x=28773..43843,y=51502..73850,z=4898..32973 +on x=-78414..-50811,y=-51353..-20494,z=170..25282 +on x=-2690..8500,y=42310..58100,z=45997..59275 +on x=-51673..-35241,y=-69072..-48834,z=23583..43079 +on x=-17870..16848,y=-3928..15129,z=-84692..-79036 +on x=-87341..-71032,y=-20078..212,z=1818..30236 +on x=71091..85417,y=-5563..16629,z=22831..30523 +on x=28443..44534,y=53772..78417,z=-11050..19315 +on x=-58440..-40362,y=-36161..-21536,z=51262..64247 +on x=-43628..-14975,y=21749..39527,z=-87409..-62207 +on x=-83544..-75074,y=-33970..-17359,z=-13538..9135 +on x=18355..46439,y=17596..51653,z=49322..73971 +on x=-10768..10856,y=-209..18736,z=-79866..-77867 +on x=-64915..-38455,y=-33420..-19423,z=-57336..-36896 +on x=-59594..-49691,y=39386..53637,z=-61118..-42358 +on x=22547..44540,y=41783..75825,z=-53800..-26170 +on x=52927..63056,y=-20945..13569,z=50274..69604 +on x=29639..47649,y=51463..74979,z=29464..61363 +on x=-62445..-46494,y=39646..59555,z=-47592..-26239 +on x=-30926..-7219,y=-76422..-53700,z=19664..37575 +on x=8068..25595,y=-15448..15190,z=-95311..-75741 +on x=-2315..14899,y=-94702..-78498,z=6767..13841 +on x=52658..77574,y=-1925..7965,z=37088..62731 +on x=-71749..-51034,y=-41036..-23998,z=-25383..-2310 +on x=-72935..-52021,y=4145..31708,z=28168..44264 +on x=-38524..-29058,y=54203..87398,z=-4270..8719 +on x=-18458..-547,y=-41938..-28075,z=55353..85466 +on x=63334..86680,y=-8977..5737,z=3089..23619 +on x=-76522..-51279,y=51711..63609,z=-1119..11074 +on x=43978..67672,y=-46119..-36350,z=-54348..-32116 +on x=-61977..-39979,y=48805..66908,z=-4087..15443 +on x=-38393..-15142,y=34482..45895,z=51707..73387 +on x=-15098..5245,y=64504..86193,z=11660..42572 +on x=20462..32546,y=67335..88945,z=-23808..-12174 +on x=-45710..-29866,y=-48713..-40225,z=36191..72881 +on x=-80647..-72347,y=6003..19378,z=6018..26968 +on x=-30135..-907,y=-40352..-17385,z=-74550..-69713 +on x=25651..40752,y=25704..44767,z=-69419..-53995 +on x=-65351..-49165,y=-665..33203,z=-58077..-53439 +on x=27847..41886,y=-57196..-51432,z=-60041..-31392 +on x=-74571..-65726,y=18936..34595,z=-14994..8307 +on x=3420..18201,y=59080..63744,z=-50796..-37402 +on x=-59725..-52919,y=25233..56324,z=36770..52550 +on x=25084..37742,y=-22473..13416,z=61111..89517 +on x=-31123..-9929,y=-38982..-28408,z=-76197..-54610 +on x=26239..39855,y=-67171..-50065,z=34490..46827 +on x=-31113..-2705,y=59178..87794,z=8623..21865 +on x=64246..81862,y=13839..27162,z=-37512..803 +on x=-38914..-20811,y=-35350..-18517,z=62773..89363 +on x=-79546..-58914,y=39361..40589,z=-23746..-1521 +on x=-92264..-60845,y=-16477..-4211,z=-34296..-15581 +on x=-81598..-55814,y=-8529..14390,z=-50600..-33531 +on x=50748..66514,y=56968..76774,z=-9752..13820 +on x=-80025..-55789,y=-41134..-19361,z=28348..54979 +on x=-28896..-19805,y=-68202..-37931,z=49748..61021 +on x=57234..73263,y=-37712..-1405,z=13150..46160 +on x=7376..29616,y=-8620..20535,z=-83248..-62090 +on x=44553..56109,y=32850..57714,z=25785..52790 +on x=-7717..25102,y=-7725..12431,z=59010..93276 +on x=-3663..20480,y=31992..48881,z=-80967..-61519 +on x=-54684..-38284,y=33082..51001,z=-47536..-31488 +on x=-24421..-10049,y=-73142..-50307,z=-47158..-25659 +on x=41005..51559,y=54743..68960,z=-32157..-19293 +on x=-8763..26625,y=66264..86593,z=-57863..-26158 +on x=39695..57854,y=-10327..960,z=-81724..-65077 +on x=41233..63655,y=-37542..-11744,z=-67651..-49824 +on x=-18469..-14312,y=36071..63118,z=56475..75090 +on x=-28731..-15639,y=-72916..-60994,z=17355..48092 +on x=-29016..-17872,y=1691..28301,z=-80313..-74087 +on x=-24861..-2063,y=-29881..-11428,z=-74927..-54438 +on x=-2908..8218,y=68593..71825,z=-42304..-36475 +on x=27546..51021,y=4696..22461,z=56219..85387 +on x=39005..55338,y=48826..72635,z=-24709..-1 +on x=47727..73855,y=-63059..-41116,z=-9038..23091 +on x=-19884..6774,y=-33156..-8931,z=72725..87601 +on x=-72461..-53556,y=-27699..-14981,z=19211..41822 +on x=63249..81403,y=-40188..-14765,z=6931..37685 +on x=63142..82981,y=-25106..-3270,z=20101..29453 +on x=31130..58947,y=3173..21337,z=-74916..-68397 +on x=-58714..-42813,y=11593..34345,z=34118..58810 +on x=-49518..-27875,y=-29607..-21358,z=-75178..-53370 +on x=69461..77175,y=15448..36416,z=-34182..-22402 +on x=35551..54657,y=-69428..-42048,z=-17045..6812 +on x=27635..38793,y=45411..69203,z=-50135..-43361 +on x=16688..38446,y=-61396..-37075,z=-64966..-31030 +on x=-35814..-19493,y=63372..81491,z=27500..54462 +on x=10356..30411,y=-74284..-55629,z=39846..45049 +on x=-38328..-4710,y=64415..79565,z=-43116..-22145 +on x=-29835..-5671,y=-90310..-76428,z=277..1869 +on x=48292..76832,y=37381..49402,z=34886..43306 +on x=19066..33779,y=-3597..8757,z=-76149..-71976 +on x=-26733..-12570,y=-35681..-26828,z=62655..71618 +on x=50628..68591,y=-51527..-24729,z=25316..59839 +on x=59379..62742,y=-57334..-46510,z=3134..10600 +on x=55393..77648,y=4221..37143,z=44784..65699 +on x=-15390..-5126,y=-3381..11074,z=73410..86424 +on x=-26889..-7086,y=-77791..-41328,z=-66410..-29235 +on x=-43347..-21552,y=57590..64785,z=28677..49316 +on x=-67247..-37242,y=-28533..-8487,z=-69945..-48320 +on x=-2207..27139,y=71426..90772,z=11875..24958 +on x=-7365..22762,y=-96133..-73290,z=-30621..-6784 +on x=44813..66334,y=-20573..-2018,z=-64230..-53722 +on x=51196..58944,y=-60144..-41259,z=18880..45821 +on x=-60386..-32399,y=-36568..-12315,z=40586..67416 +on x=-665..20331,y=-17403..-11184,z=-87940..-72839 +off x=32946..48821,y=-28974..-15614,z=64401..84617 +on x=-55785..-28569,y=65269..75512,z=-21176..-6442 +off x=32390..46916,y=-82938..-68118,z=-13863..21900 +off x=53888..71942,y=-46568..-32979,z=-34248..-19326 +off x=-81837..-78163,y=-5392..9087,z=-2450..18903 +off x=21995..44453,y=-40185..-33499,z=62135..76283 +on x=10308..40463,y=59540..77174,z=-61333..-36739 +off x=-94177..-61603,y=-22758..11823,z=-38788..-12954 +on x=53438..75655,y=25126..43060,z=-14518..7932 +on x=-19531..3177,y=4045..27930,z=-94265..-64178 +off x=-77480..-62456,y=41988..53394,z=-3296..5224 +on x=17779..35549,y=-83981..-44676,z=24943..61118 +on x=-71879..-58513,y=11898..41686,z=-30305..-14377 +on x=49017..68249,y=-15129..18976,z=48060..66574 +on x=-11838..7348,y=47553..63542,z=-67414..-47164 +on x=29088..44545,y=-50912..-15959,z=-70395..-57574 +off x=-43388..-23603,y=45905..62609,z=27676..53750 +off x=8215..38810,y=62437..78852,z=-38209..-33224 +on x=-64059..-27171,y=-60727..-35326,z=-61026..-43427 +off x=20457..53119,y=-60711..-47679,z=23184..55606 +on x=-70978..-46394,y=-65589..-44877,z=-10372..7338 +on x=-59744..-39936,y=48445..55988,z=-44347..-26762 +on x=-36717..-8107,y=26844..43311,z=-80832..-66912 +off x=72293..96031,y=3700..25701,z=-37561..-4131 +on x=-15500..16913,y=-79205..-68966,z=-39173..-4379 +off x=-756..21231,y=10628..37269,z=73578..82977 +on x=32058..55455,y=-6957..7461,z=45838..80279 +off x=-24364..-772,y=-85720..-66735,z=-48781..-36855 +on x=46435..56654,y=43815..66941,z=-25404..-13767 +off x=-88068..-77674,y=-10771..13874,z=-12402..-4509 +on x=-89131..-61902,y=-26569..-6043,z=-27916..-14242 +on x=32210..52737,y=-40074..-9230,z=42872..76038 +on x=56737..79302,y=24768..45359,z=-19322..4672 +on x=1759..24409,y=46620..57152,z=-71066..-48445 +on x=35478..60734,y=-39693..-22719,z=41724..51793 +on x=42961..64758,y=-12522..3554,z=52646..69182 +on x=-11351..-502,y=-40082..-24124,z=-75980..-63117 +off x=-40962..-6900,y=-5118..14251,z=-82423..-57286 +on x=-49095..-30797,y=1882..6948,z=-83530..-55361 +off x=-37135..-22299,y=-90205..-63314,z=-24970..4150 +on x=66749..74930,y=-44446..-9795,z=-16854..-4579 +on x=-63254..-52331,y=-68192..-44209,z=-35685..-8323 +on x=-78284..-55858,y=-43922..-30639,z=18437..29177 +off x=54114..79875,y=-17857..-2753,z=34356..52806 +on x=-4442..14186,y=29328..43813,z=-80985..-51107 +off x=-58292..-34166,y=35200..44230,z=-69669..-55147 +on x=18045..42192,y=-78983..-70509,z=1260..35570 +on x=37675..59839,y=-51270..-39433,z=-37248..-29925 +off x=-22757..-7114,y=-84027..-59378,z=-24973..-14829 +on x=24241..36320,y=52369..65837,z=31303..51099 +off x=5979..23857,y=9333..31171,z=-87793..-57399 +off x=49574..65617,y=-38214..-7290,z=-50479..-28030 +off x=-73979..-66980,y=-798..7274,z=-45325..-25314 +on x=-8945..-1295,y=-59463..-41375,z=52225..73615 +off x=18015..39217,y=32056..50406,z=-75587..-63271 +on x=-53213..-30694,y=-55350..-31907,z=49198..70681 +on x=-9682..8872,y=-52795..-28009,z=-82757..-59017 +off x=-83110..-67560,y=-37952..-10775,z=-19407..13655 +on x=-39964..-17588,y=52065..72360,z=4014..37773 +off x=56122..79842,y=-5178..21833,z=31724..59969 +on x=-20183..-4251,y=-12930..11778,z=77653..97600 +off x=31458..67825,y=9649..32029,z=41670..71827 +on x=-47523..-37181,y=-9554..-5366,z=-71284..-54135 +off x=-79907..-51809,y=-39505..-26324,z=-21886..8622 +on x=-49722..-26739,y=-4492..20265,z=-80362..-69563 +off x=30956..62691,y=22770..49749,z=57837..73923 +off x=63665..78972,y=-9429..11537,z=-61063..-23216 +off x=22797..28866,y=-83267..-52609,z=-50008..-23447 +off x=-9433..6781,y=-15625..9568,z=72480..99132 +on x=-39178..-2942,y=61606..79222,z=-12921..17911 +on x=-27409..-12810,y=-52323..-14724,z=70950..84284 +off x=25852..56927,y=-36323..-17730,z=-59374..-41271 +on x=-25411..1430,y=-71359..-48805,z=-54737..-38627 +off x=14921..35377,y=-63995..-41674,z=42383..70707 +on x=-81958..-63608,y=22908..36352,z=28840..42388 +off x=16786..42211,y=-73540..-54273,z=24103..37846 +on x=6690..26003,y=-68391..-40681,z=-57692..-53952 +off x=61396..83789,y=17549..42812,z=30784..43751 +on x=64100..88074,y=14435..30275,z=-26170..-9208 +off x=-21535..-16329,y=43013..49150,z=-80307..-58327 +off x=43392..60791,y=-67760..-57740,z=-3562..18983 +on x=53803..85117,y=-30851..-20415,z=11800..29393 +off x=-60548..-44088,y=-74749..-57558,z=-16897..-13294 +on x=-49335..-21672,y=-28001..3992,z=58205..86850 +on x=71619..75833,y=-41210..-28321,z=-3506..23850 +on x=-59162..-51706,y=-50779..-26256,z=-49407..-29710 +on x=-52052..-32903,y=16989..38661,z=-62750..-44298 +on x=27603..37228,y=-16325..-9791,z=51369..78290 +off x=-79181..-55186,y=26844..41675,z=-48211..-20069 +on x=-13372..-2778,y=-87434..-58366,z=13997..33615 +off x=-15866..1555,y=47047..63001,z=42221..60961 +on x=36372..49160,y=29641..52191,z=50265..54610 +off x=-50..22846,y=24999..49002,z=-90397..-70826 +off x=-53637..-33631,y=-70839..-47506,z=-40320..-30176 +on x=57782..80982,y=-13986..8709,z=-42185..-18601 +on x=-51683..-23658,y=-6359..15179,z=-75206..-63727 +off x=370..30490,y=44410..64293,z=49151..65936 +off x=46915..58565,y=-69733..-44180,z=-41213..-17210 +on x=28837..55823,y=-13583..10313,z=-85499..-50397 +on x=45884..74879,y=4208..23505,z=-57225..-37365 +on x=-16055..2075,y=-98025..-64232,z=404..15021 +off x=-6697..-284,y=-52120..-14644,z=61108..88330 +on x=-73126..-42133,y=-14478..-770,z=-67159..-42210 +on x=-78746..-55031,y=21688..48503,z=-43668..-17650 +off x=13011..19587,y=-76531..-58192,z=-21056..-6942 +on x=-3906..16882,y=38223..63854,z=-65796..-44021 +off x=75643..77858,y=-402..29624,z=-29755..-2860 +on x=18431..37928,y=-50506..-31706,z=65280..75113 +on x=-82626..-59287,y=-50984..-29586,z=-15689..-4450 +on x=35196..53027,y=26428..54765,z=57751..62588 +off x=23336..31485,y=-1303..18746,z=-94682..-64565 +on x=-3825..10918,y=-98053..-71932,z=865..16121 +off x=42549..65012,y=26302..54316,z=35324..58055 +off x=-30637..-826,y=69704..92482,z=8957..37872 +on x=9789..45193,y=-58252..-25098,z=55030..75560 +on x=-9204..9530,y=71096..78338,z=20937..35152 +off x=49102..65728,y=27717..54106,z=-51279..-22263 +off x=-73112..-53014,y=-17888..2555,z=34313..45513 +off x=19481..39159,y=-19753..16672,z=-84120..-70512 +off x=29245..51208,y=55393..75349,z=-26693..-9367 +off x=-32408..-12470,y=-86513..-71371,z=11659..34621 +on x=3836..19984,y=72474..77290,z=28159..42009 +off x=-65810..-45330,y=-40192..-17201,z=-36860..-23230 +on x=8693..27534,y=-32382..-13972,z=58478..81189 +on x=-43704..-20018,y=-33808..-23372,z=-78637..-61326 +off x=51547..78372,y=12517..15861,z=30172..52291 +on x=-33603..-11175,y=-36898..-7873,z=-90188..-68980 +off x=68965..88379,y=-35199..-18501,z=-16736..13433 +off x=-92562..-58792,y=-20585..-13928,z=7579..22007 +on x=-15258..-2610,y=69924..96628,z=-12430..15797 +off x=-30519..-8339,y=-12995..4240,z=63439..83735 +off x=-17707..10709,y=-26922..-18807,z=-96558..-63936 +off x=15322..27787,y=26350..47801,z=-67802..-46180 +off x=-84914..-54768,y=6968..34294,z=17631..34799 +on x=-7598..17160,y=37828..54405,z=-76895..-51602 +on x=11668..34456,y=40686..60885,z=-53707..-42575 +off x=-32256..-12704,y=-78957..-51139,z=-54900..-19346 +off x=19575..33292,y=-76785..-58856,z=-24794..-8650 +on x=-12555..10431,y=76180..91052,z=-7974..2379 +on x=-39693..-14106,y=7322..18221,z=-78159..-74632 +off x=-66375..-51676,y=-66860..-34841,z=-39129..-8655 +off x=-17258..-10828,y=12607..37266,z=61514..85164 +off x=-33610..-11456,y=-84257..-56108,z=-23442..-7294 +on x=14531..43763,y=53525..64606,z=-63336..-35807 +off x=-70597..-55320,y=-41967..-24265,z=25101..39095 +on x=-49603..-26677,y=-13219..1867,z=66460..87923 +off x=-60096..-23074,y=-70199..-42821,z=22480..37880 +off x=40348..69827,y=-51515..-33466,z=-52295..-34043 +off x=20389..44646,y=28477..41577,z=-72555..-44667 +on x=33741..54867,y=-36670..-7776,z=-72049..-55244 +on x=10950..46532,y=-54829..-45911,z=-73274..-40618 +on x=-67960..-44819,y=-45382..-24321,z=30618..47707 +on x=-58662..-48729,y=-65642..-29405,z=-56128..-29636 +on x=49272..79011,y=38939..52493,z=20586..30187 +off x=43410..60801,y=-61935..-34193,z=-32036..-22862 +on x=30969..60898,y=33040..50806,z=35073..57010 +off x=37114..59569,y=-71501..-44738,z=11340..32549 +off x=52829..76198,y=7688..34836,z=-67073..-40835 +off x=-92186..-63748,y=-11890..20416,z=-11446..1644 +on x=67652..84380,y=-40733..-18056,z=24324..41742 +on x=-62702..-39426,y=-43457..-16012,z=-69221..-51945 +on x=-73660..-53500,y=27383..37368,z=2421..23275 +on x=-77487..-46062,y=-50070..-24177,z=-47875..-27262 +on x=-945..14054,y=-49971..-42857,z=-76052..-46001 +on x=-43003..-22308,y=58137..82894,z=19469..47327 +off x=19774..38418,y=-33987..-16275,z=-69339..-64365 +on x=-21207..4193,y=-7234..-2286,z=-85723..-60361 +on x=72912..88857,y=2552..35986,z=20898..28896 +on x=54225..89222,y=15996..40989,z=-44532..-13768 +on x=-65712..-61563,y=-49387..-24770,z=-44808..-18999 +on x=-69404..-48271,y=-68838..-43356,z=-7999..13427 +on x=-14554..-6184,y=67577..76141,z=25618..45348 +off x=17080..39490,y=54822..76095,z=-33504..-20429 +off x=72126..88153,y=-25075..-2924,z=-35655..-21906 +off x=-9585..24318,y=-79462..-62167,z=36467..45387 +on x=50711..62365,y=8410..24520,z=44319..69714 +off x=26163..48176,y=49270..76862,z=25486..40214 +off x=-66006..-47007,y=26306..40268,z=-57257..-44008 +on x=-18103..978,y=-66402..-53423,z=-58187..-49950 +off x=-82231..-53929,y=-30302..-2792,z=-50350..-33862 +off x=-80773..-50142,y=26085..50767,z=-37036..-5317 +on x=-73412..-50645,y=-37254..-15738,z=27795..47197 +on x=53256..56693,y=-27500..-12752,z=39288..60009 +on x=9678..25000,y=9814..20035,z=-80762..-69083 +off x=75905..77562,y=-35226..-12588,z=-23403..2007 +on x=-74228..-51192,y=-60471..-47282,z=-18153..11152 +on x=-88144..-65383,y=27947..50190,z=-22007..7068 +on x=-57769..-30200,y=-74568..-46266,z=1997..7401 +on x=-53231..-25606,y=-1090..21355,z=57688..84914 +off x=3894..23908,y=-12364..22961,z=-89732..-71854 +on x=-29012..-9560,y=-78082..-62997,z=-29218..-8539 +off x=-35760..-28704,y=-69703..-59299,z=26665..59052 +on x=-9820..-311,y=-50467..-30267,z=45150..77323 +off x=-34746..-29058,y=53504..84718,z=15584..24656 +off x=-80685..-48403,y=-19777..4826,z=33281..66712 +on x=67395..77602,y=-46450..-19661,z=-31973..-18038 +on x=-70033..-64759,y=19552..51911,z=11121..35381 +off x=-73590..-42942,y=-46390..-22759,z=40874..56566 +off x=-36575..-18344,y=61042..86630,z=6307..26426 +off x=-46370..-27813,y=23975..41903,z=54255..72840 From 66111987288a63b4905100043bd9cd50835c7c86 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Thu, 23 Dec 2021 12:14:57 +0100 Subject: [PATCH 320/433] Day 23 --- .../adventofcode/year21/days/Day23.java | 223 +++++++++++++++++- src/main/resources/2021-examples/day23-1.txt | 5 + src/main/resources/2021-examples/day23-10.txt | 5 + src/main/resources/2021-examples/day23-2.txt | 5 + src/main/resources/2021-examples/day23-3.txt | 5 + src/main/resources/2021-examples/day23-4.txt | 5 + src/main/resources/2021-examples/day23-5.txt | 5 + src/main/resources/2021-examples/day23-6.txt | 5 + src/main/resources/2021-examples/day23-7.txt | 5 + src/main/resources/2021-examples/day23-8.txt | 5 + src/main/resources/2021-examples/day23-9.txt | 5 + src/main/resources/2021/day23.txt | 5 + 12 files changed, 276 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/2021-examples/day23-1.txt create mode 100644 src/main/resources/2021-examples/day23-10.txt create mode 100644 src/main/resources/2021-examples/day23-2.txt create mode 100644 src/main/resources/2021-examples/day23-3.txt create mode 100644 src/main/resources/2021-examples/day23-4.txt create mode 100644 src/main/resources/2021-examples/day23-5.txt create mode 100644 src/main/resources/2021-examples/day23-6.txt create mode 100644 src/main/resources/2021-examples/day23-7.txt create mode 100644 src/main/resources/2021-examples/day23-8.txt create mode 100644 src/main/resources/2021-examples/day23-9.txt create mode 100644 src/main/resources/2021/day23.txt diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day23.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day23.java index b7eeae88..f1d0ee87 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day23.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day23.java @@ -1,6 +1,16 @@ package com.sbaars.adventofcode.year21.days; +import static com.google.common.base.Preconditions.checkState; + +import com.google.common.base.MoreObjects; import com.sbaars.adventofcode.year21.Day2021; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.IntStream; public class Day23 extends Day2021 { public Day23() { @@ -8,16 +18,225 @@ public Day23() { } public static void main(String[] args) { + new Day23().verify(); new Day23().printParts(); // new Day23().submitPart1(); // new Day23().submitPart2(); } + + public void verify(){ + List l = new ArrayList<>(List.of(new State(new int[][]{{0,0},{1,1},{2,2},{3,3}}, new int[]{-1,-1,-1,-1,-1,-1,-1}, 0L))); + checkState(l.get(0).win()); + simulateMoves(l); + checkState(l.isEmpty()); + l = new ArrayList<>(List.of(new State(new int[][]{{0,0},{1,1},{2,2},{-1,3}}, new int[]{-1,-1,-1,-1,-1,-1,3}, 0L))); + simulateMoves(l); + checkState(l.size() == 1); + checkState(l.get(0).win()); + l = new ArrayList<>(List.of(new State(new int[][]{{0,0},{2,1},{1,2},{3,3}}, new int[]{-1,-1,-1,-1,-1,-1,-1}, 0L))); + Optional out = Optional.empty(); + while(!l.isEmpty()) out = simulateMoves(l); + checkState(out.isPresent()); + } @Override public Object part1() { - var in = day(); + var rooms = new int[][]{{2, 1}, {3, 0}, {0, 3}, {1, 2}}; + int[] waiting = new int[7]; + Arrays.fill(waiting, -1); + List states = new ArrayList<>(List.of(new State(rooms, waiting, 0))); + long cur = Long.MAX_VALUE; + while(!states.isEmpty()){ + Optional sim = simulateMoves(states); + if(sim.isPresent() && sim.get() simulateMoves(List states) { + State s = states.remove(0); + if(s.win()){ + return Optional.of(s.energySpent); + } + int[] occupied = s.occupiedRooms(); + for(int o : occupied){ + int[] freeWait = s.freeWaiting(o); + for(int w : freeWait){ + states.add(s.moveIntoWaiting(o, w)); + } + } + occupied = s.occupiedWaiting(); + for(int o : occupied){ + int freeRoom = s.freeRoom(o); + if(freeRoom!=-1){ + states.add(s.moveFromWaiting(o, freeRoom)); + } + } + return Optional.empty(); + } + + public record State(int[][] rooms, int[] waiting, long energySpent){ + public State copy(long newEnergy){ + int[][] room = Arrays.stream(rooms).map(int[]::clone).toArray(int[][]::new);; + int[] wait = Arrays.copyOf(waiting, waiting.length); + return new State(room, wait, energySpent + newEnergy); + } + + public State moveIntoWaiting(int r, int w){ + int toMove = rooms[r][0] == -1 ? 1 : 0; + State s = copy(energy(rooms[r][toMove]) * (energyMultiplier(r, w) + toMove)); + s.waiting[w] = s.rooms[r][toMove]; + s.rooms[r][toMove] = -1; + return s; + } + + public long energy(int x){ + return switch(x) { + case 0 -> 1L; + case 1 -> 10L; + case 2 -> 100L; + case 3 -> 1000L; + default -> throw new IllegalStateException("Invalid "+x); + }; + } + + public long energyMultiplier(int r, int w) { + if(r == 0 && w == 0) { + return 3; + } else if(r == 0 && w == 1) { + return 2; + } else if(r == 0 && w == 2) { + return 2; + } else if(r == 0 && w == 3) { + return 4; + } else if(r == 0 && w == 4) { + return 6; + } else if(r == 0 && w == 5) { + return 8; + } else if(r == 0 && w == 6) { + return 9; + } else if(r == 1 && w == 0) { + return 5; + } else if(r == 1 && w == 1) { + return 4; + } else if(r == 1 && w == 2) { + return 2; + } else if(r == 1 && w == 3) { + return 2; + } else if(r == 1 && w == 4) { + return 4; + } else if(r == 1 && w == 5) { + return 6; + } else if(r == 1 && w == 6) { + return 7; + } else if(r == 2 && w == 0) { + return 7; + } else if(r == 2 && w == 1) { + return 6; + } else if(r == 2 && w == 2) { + return 4; + } else if(r == 2 && w == 3) { + return 2; + } else if(r == 2 && w == 4) { + return 2; + } else if(r == 2 && w == 5) { + return 4; + } else if(r == 2 && w == 6) { + return 5; + } else if(r == 3 && w == 0) { + return 9; + } else if(r == 3 && w == 1) { + return 8; + } else if(r == 3 && w == 2) { + return 6; + } else if(r == 3 && w == 3) { + return 4; + } else if(r == 3 && w == 4) { + return 2; + } else if(r == 3 && w == 5) { + return 2; + } else if(r == 3 && w == 6) { + return 3; + } + throw new IllegalStateException("Invalid move "+r+", "+w); + } + + public State moveFromWaiting(int w, int r){ + int toMove = rooms[r][1] == -1 ? 1 : 0; + State s = copy(energy(waiting[w]) * (energyMultiplier(r, w) + toMove)); + s.rooms[r][toMove] = s.waiting[w]; + s.waiting[w] = -1; + return s; + } + + public int[] occupiedRooms(){ + return IntStream.range(0, rooms.length).filter(e -> IntStream.of(rooms[e]).anyMatch(f -> f!=-1) && !IntStream.of(rooms[e]).allMatch(f -> f==e) && !(rooms[e][0] == -1 && rooms[e][1] == e)).toArray(); + } + + public int[] occupiedWaiting(){ + return IntStream.range(0, waiting.length).filter(e -> waiting[e] != -1).toArray(); + } + + public int freeRoom(int forWaiting){ + int room = waiting[forWaiting]; + if(rooms[room][1] != -1 && rooms[room][1] != room) return -1; + int r = room + 1; + for(int i = forWaiting+1; i<=r; i++){ + if(waiting[i] != -1){ + return -1; + } + } + for(int i = forWaiting-1; i>r; i--){ + if(waiting[i] != -1){ + return -1; + } + } + return room; + } + + // Indexes of free waiting spots + public int[] freeWaiting(int forRoom){ + if(rooms[forRoom][0] == forRoom) return new int[0]; + var seeminglyFree = IntStream.range(0, waiting.length).filter(e -> waiting[e] == -1).boxed().collect(Collectors.toCollection(HashSet::new)); + if(seeminglyFree.contains(0) && !seeminglyFree.contains(1)){ + seeminglyFree.remove(0); + } + if(seeminglyFree.contains(6) && !seeminglyFree.contains(5)){ + seeminglyFree.remove(6); + } + int r = forRoom+1; + for(int i = r; i>=0; i--){ + if(!seeminglyFree.contains(r)){ + int i2 = i; + seeminglyFree.removeIf(x -> x x>i2); + break; + } + } + return seeminglyFree.stream().mapToInt(e -> e).toArray(); + } + + public boolean win(){ + return IntStream.range(0, rooms.length).allMatch(e -> IntStream.of(rooms[e]).allMatch(f -> f==e)); + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("rooms", rooms) + .add("waiting", waiting) + .add("energySpent", energySpent) + .toString(); + } } @Override diff --git a/src/main/resources/2021-examples/day23-1.txt b/src/main/resources/2021-examples/day23-1.txt new file mode 100644 index 00000000..6a7120d4 --- /dev/null +++ b/src/main/resources/2021-examples/day23-1.txt @@ -0,0 +1,5 @@ +############# +#...........# +###B#C#B#D### + #A#D#C#A# + ######### diff --git a/src/main/resources/2021-examples/day23-10.txt b/src/main/resources/2021-examples/day23-10.txt new file mode 100644 index 00000000..65857a08 --- /dev/null +++ b/src/main/resources/2021-examples/day23-10.txt @@ -0,0 +1,5 @@ +############# +#...........# +###A#B#C#D### + #A#B#C#D# + ######### diff --git a/src/main/resources/2021-examples/day23-2.txt b/src/main/resources/2021-examples/day23-2.txt new file mode 100644 index 00000000..65857a08 --- /dev/null +++ b/src/main/resources/2021-examples/day23-2.txt @@ -0,0 +1,5 @@ +############# +#...........# +###A#B#C#D### + #A#B#C#D# + ######### diff --git a/src/main/resources/2021-examples/day23-3.txt b/src/main/resources/2021-examples/day23-3.txt new file mode 100644 index 00000000..6a7120d4 --- /dev/null +++ b/src/main/resources/2021-examples/day23-3.txt @@ -0,0 +1,5 @@ +############# +#...........# +###B#C#B#D### + #A#D#C#A# + ######### diff --git a/src/main/resources/2021-examples/day23-4.txt b/src/main/resources/2021-examples/day23-4.txt new file mode 100644 index 00000000..ed7c0edd --- /dev/null +++ b/src/main/resources/2021-examples/day23-4.txt @@ -0,0 +1,5 @@ +############# +#...B.......# +###B#C#.#D### + #A#D#C#A# + ######### diff --git a/src/main/resources/2021-examples/day23-5.txt b/src/main/resources/2021-examples/day23-5.txt new file mode 100644 index 00000000..0c8079a3 --- /dev/null +++ b/src/main/resources/2021-examples/day23-5.txt @@ -0,0 +1,5 @@ +############# +#...B.......# +###B#.#C#D### + #A#D#C#A# + ######### diff --git a/src/main/resources/2021-examples/day23-6.txt b/src/main/resources/2021-examples/day23-6.txt new file mode 100644 index 00000000..0a8dfdac --- /dev/null +++ b/src/main/resources/2021-examples/day23-6.txt @@ -0,0 +1,5 @@ +############# +#.....D.....# +###B#.#C#D### + #A#B#C#A# + ######### diff --git a/src/main/resources/2021-examples/day23-7.txt b/src/main/resources/2021-examples/day23-7.txt new file mode 100644 index 00000000..9abde2e9 --- /dev/null +++ b/src/main/resources/2021-examples/day23-7.txt @@ -0,0 +1,5 @@ +############# +#.....D.....# +###.#B#C#D### + #A#B#C#A# + ######### diff --git a/src/main/resources/2021-examples/day23-8.txt b/src/main/resources/2021-examples/day23-8.txt new file mode 100644 index 00000000..647c8031 --- /dev/null +++ b/src/main/resources/2021-examples/day23-8.txt @@ -0,0 +1,5 @@ +############# +#.....D.D.A.# +###.#B#C#.### + #A#B#C#.# + ######### diff --git a/src/main/resources/2021-examples/day23-9.txt b/src/main/resources/2021-examples/day23-9.txt new file mode 100644 index 00000000..af622296 --- /dev/null +++ b/src/main/resources/2021-examples/day23-9.txt @@ -0,0 +1,5 @@ +############# +#.........A.# +###.#B#C#D### + #A#B#C#D# + ######### diff --git a/src/main/resources/2021/day23.txt b/src/main/resources/2021/day23.txt new file mode 100644 index 00000000..271a1000 --- /dev/null +++ b/src/main/resources/2021/day23.txt @@ -0,0 +1,5 @@ +############# +#...........# +###C#D#A#B### + #B#A#D#C# + ######### From b5683e254d0ac557d760bb9386d0c26eefe97e0e Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Thu, 23 Dec 2021 19:26:34 +0100 Subject: [PATCH 321/433] Add part 2 --- .../adventofcode/year21/days/Day23.java | 86 +++++++++++++------ 1 file changed, 60 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day23.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day23.java index f1d0ee87..a6896ea5 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day23.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day23.java @@ -4,11 +4,13 @@ import com.google.common.base.MoreObjects; import com.sbaars.adventofcode.year21.Day2021; -import java.util.ArrayList; import java.util.Arrays; +import java.util.Comparator; import java.util.HashSet; -import java.util.List; import java.util.Optional; +import java.util.PriorityQueue; +import java.util.Queue; +import java.util.Set; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -25,39 +27,54 @@ public static void main(String[] args) { } public void verify(){ - List l = new ArrayList<>(List.of(new State(new int[][]{{0,0},{1,1},{2,2},{3,3}}, new int[]{-1,-1,-1,-1,-1,-1,-1}, 0L))); - checkState(l.get(0).win()); - simulateMoves(l); + Queue l = getQueue(new State(new int[][]{{0,0},{1,1},{2,2},{3,3}}, new int[]{-1,-1,-1,-1,-1,-1,-1})); + checkState(l.poll().win()); + simulateMoves(l, new HashSet<>()); checkState(l.isEmpty()); - l = new ArrayList<>(List.of(new State(new int[][]{{0,0},{1,1},{2,2},{-1,3}}, new int[]{-1,-1,-1,-1,-1,-1,3}, 0L))); - simulateMoves(l); + l = getQueue(new State(new int[][]{{0,0},{1,1},{2,2},{-1,3}}, new int[]{-1,-1,-1,-1,-1,-1,3})); + simulateMoves(l, new HashSet<>()); checkState(l.size() == 1); - checkState(l.get(0).win()); - l = new ArrayList<>(List.of(new State(new int[][]{{0,0},{2,1},{1,2},{3,3}}, new int[]{-1,-1,-1,-1,-1,-1,-1}, 0L))); - Optional out = Optional.empty(); - while(!l.isEmpty()) out = simulateMoves(l); - checkState(out.isPresent()); + checkState(l.poll().win()); + l = getQueue(new State(new int[][]{{0,0},{2,1},{1,2},{3,3}}, new int[]{-1,-1,-1,-1,-1,-1,-1})); + checkState(getMinimum(l, new HashSet<>()) == (100L*4)+(10L*6)); + l = getQueue(new State(new int[][]{{0,0},{2,2},{1,1},{3,3}}, new int[]{-1,-1,-1,-1,-1,-1,-1})); + checkState(getMinimum(l, new HashSet<>()) == (100L*10)+(10L*14)); } @Override public Object part1() { - var rooms = new int[][]{{2, 1}, {3, 0}, {0, 3}, {1, 2}}; + return constructField(new int[][]{{2, 1}, {3, 0}, {0, 3}, {1, 2}}); + } + + private long constructField(int[][] rooms) { int[] waiting = new int[7]; Arrays.fill(waiting, -1); - List states = new ArrayList<>(List.of(new State(rooms, waiting, 0))); - long cur = Long.MAX_VALUE; - while(!states.isEmpty()){ - Optional sim = simulateMoves(states); - if(sim.isPresent() && sim.get() stateSet = new HashSet<>(); + Queue states = getQueue(new State(rooms, waiting, 0, 0)); + return getMinimum(states, stateSet); + } + + private PriorityQueue getQueue(State s) { + var queue = new PriorityQueue<>(1000, Comparator.comparing(State::energySpent)); + queue.add(s); + return queue; + } + + private long getMinimum(Queue states, Set stateSet) { + while(true){ + Optional sim = simulateMoves(states, stateSet); + if(sim.isPresent()) { + return sim.get(); } +// if(states.size() % 10000 == 5) System.out.println(states.size()+", "+ states.peek().moves); } - return cur; } - private Optional simulateMoves(List states) { - State s = states.remove(0); + private Optional simulateMoves(Queue states, Set stateSet) { + State s = states.poll(); + if(stateSet.contains(s)) return Optional.empty(); + stateSet.add(s); + if(s.energySpent > 15000) return Optional.empty(); if(s.win()){ return Optional.of(s.energySpent); } @@ -78,11 +95,15 @@ private Optional simulateMoves(List states) { return Optional.empty(); } - public record State(int[][] rooms, int[] waiting, long energySpent){ + public record State(int[][] rooms, int[] waiting, long energySpent, long moves){ + public State(int[][] rooms, int[] waiting){ + this(rooms, waiting, 0L, 0L); + } + public State copy(long newEnergy){ int[][] room = Arrays.stream(rooms).map(int[]::clone).toArray(int[][]::new);; int[] wait = Arrays.copyOf(waiting, waiting.length); - return new State(room, wait, energySpent + newEnergy); + return new State(room, wait, energySpent + newEnergy, moves + 1); } public State moveIntoWaiting(int r, int w){ @@ -237,10 +258,23 @@ public String toString() { .add("energySpent", energySpent) .toString(); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + State state = (State) o; + return Arrays.deepEquals(rooms, state.rooms) && Arrays.equals(waiting, state.waiting); + } + + @Override + public int hashCode() { + return Arrays.deepHashCode(rooms) + Arrays.hashCode(waiting); + } } @Override public Object part2() { - return ""; + return constructField(new int[][]{{2, 3, 3, 1}, {3, 2, 1, 0}, {0, 1, 0, 3}, {1, 0, 2, 2}}); } } From 907a4cf3c57b8ed4d9763276cd9a7e04756e437f Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Thu, 23 Dec 2021 20:54:19 +0100 Subject: [PATCH 322/433] Prepare day 24 --- .../com/sbaars/adventofcode/util/FetchInput.java | 2 +- .../sbaars/adventofcode/year21/days/Day23.java | 16 +++++++++------- .../sbaars/adventofcode/year21/days/Day24.java | 4 ++++ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java index 684e74ef..f4940002 100644 --- a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java +++ b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java @@ -27,7 +27,7 @@ private FetchInput() { } public static void main(String[] args) { - new FetchInput().retrieveDay("23", "2021"); + new FetchInput().retrieveDay("24", "2021"); } private void retrieveDay(String day, String year) { diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day23.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day23.java index a6896ea5..5cd4c5e9 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day23.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day23.java @@ -13,6 +13,7 @@ import java.util.Set; import java.util.stream.Collectors; import java.util.stream.IntStream; +import org.apache.commons.lang3.ArrayUtils; public class Day23 extends Day2021 { public Day23() { @@ -22,13 +23,11 @@ public Day23() { public static void main(String[] args) { new Day23().verify(); new Day23().printParts(); -// new Day23().submitPart1(); -// new Day23().submitPart2(); } public void verify(){ Queue l = getQueue(new State(new int[][]{{0,0},{1,1},{2,2},{3,3}}, new int[]{-1,-1,-1,-1,-1,-1,-1})); - checkState(l.poll().win()); + checkState(l.peek().win()); simulateMoves(l, new HashSet<>()); checkState(l.isEmpty()); l = getQueue(new State(new int[][]{{0,0},{1,1},{2,2},{-1,3}}, new int[]{-1,-1,-1,-1,-1,-1,3})); @@ -107,7 +106,7 @@ public State copy(long newEnergy){ } public State moveIntoWaiting(int r, int w){ - int toMove = rooms[r][0] == -1 ? 1 : 0; + int toMove = ArrayUtils.lastIndexOf(rooms[r], -1) + 1; State s = copy(energy(rooms[r][toMove]) * (energyMultiplier(r, w) + toMove)); s.waiting[w] = s.rooms[r][toMove]; s.rooms[r][toMove] = -1; @@ -186,7 +185,10 @@ public long energyMultiplier(int r, int w) { } public State moveFromWaiting(int w, int r){ - int toMove = rooms[r][1] == -1 ? 1 : 0; + int toMove = ArrayUtils.lastIndexOf(rooms[r], -1); + if(toMove == -1){ + toMove = 0; + } State s = copy(energy(waiting[w]) * (energyMultiplier(r, w) + toMove)); s.rooms[r][toMove] = s.waiting[w]; s.waiting[w] = -1; @@ -194,7 +196,7 @@ public State moveFromWaiting(int w, int r){ } public int[] occupiedRooms(){ - return IntStream.range(0, rooms.length).filter(e -> IntStream.of(rooms[e]).anyMatch(f -> f!=-1) && !IntStream.of(rooms[e]).allMatch(f -> f==e) && !(rooms[e][0] == -1 && rooms[e][1] == e)).toArray(); + return IntStream.range(0, rooms.length).filter(e -> IntStream.of(rooms[e]).anyMatch(f -> f!=-1) && !IntStream.of(rooms[e]).allMatch(f -> f==e) && rooms[e][rooms[e].length-1] != e).toArray(); } public int[] occupiedWaiting(){ @@ -203,7 +205,7 @@ public int[] occupiedWaiting(){ public int freeRoom(int forWaiting){ int room = waiting[forWaiting]; - if(rooms[room][1] != -1 && rooms[room][1] != room) return -1; + if(rooms[room][rooms[room].length-1] != -1 && rooms[room][rooms[room].length-1] != room) return -1; int r = room + 1; for(int i = forWaiting+1; i<=r; i++){ if(waiting[i] != -1){ diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day24.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day24.java index c242aaac..be9b4c34 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day24.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day24.java @@ -10,10 +10,14 @@ public Day24() { public static void main(String[] args) { new Day24().printParts(); +// new Day24().submitPart1(); +// new Day24().submitPart2(); } @Override public Object part1() { + var in = day(); + return ""; } From 8dee54e0ed11a943e22307c2209537fe2b898df9 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Sat, 25 Dec 2021 07:02:34 +0100 Subject: [PATCH 323/433] Day 24 --- .../adventofcode/year21/days/Day23.java | 30 ++++--- .../adventofcode/year21/days/Day24.java | 90 +++++++++++++++++-- src/main/resources/2021-examples/day24-1.txt | 2 + src/main/resources/2021-examples/day24-2.txt | 4 + src/main/resources/2021-examples/day24-3.txt | 11 +++ 5 files changed, 120 insertions(+), 17 deletions(-) create mode 100644 src/main/resources/2021-examples/day24-1.txt create mode 100644 src/main/resources/2021-examples/day24-2.txt create mode 100644 src/main/resources/2021-examples/day24-3.txt diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day23.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day23.java index 5cd4c5e9..dc005493 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day23.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day23.java @@ -22,7 +22,8 @@ public Day23() { public static void main(String[] args) { new Day23().verify(); - new Day23().printParts(); + new Day23().printParts(1); +// new Day23().part2(); } public void verify(){ @@ -38,10 +39,15 @@ public void verify(){ checkState(getMinimum(l, new HashSet<>()) == (100L*4)+(10L*6)); l = getQueue(new State(new int[][]{{0,0},{2,2},{1,1},{3,3}}, new int[]{-1,-1,-1,-1,-1,-1,-1})); checkState(getMinimum(l, new HashSet<>()) == (100L*10)+(10L*14)); + l = getQueue(new State(new int[][]{{0,0,0,0},{2,2,2,2},{1,1,1,1},{3,3,3,3}}, new int[]{-1,-1,-1,-1,-1,-1,-1})); + checkState(getMinimum(l, new HashSet<>()) == 3240L); } @Override public Object part1() { + if(example == 1) { + return constructField(new int[][]{{1, 0}, {2, 3}, {1, 2}, {3, 0}}); + } return constructField(new int[][]{{2, 1}, {3, 0}, {0, 3}, {1, 2}}); } @@ -65,7 +71,6 @@ private long getMinimum(Queue states, Set stateSet) { if(sim.isPresent()) { return sim.get(); } -// if(states.size() % 10000 == 5) System.out.println(states.size()+", "+ states.peek().moves); } } @@ -73,22 +78,21 @@ private Optional simulateMoves(Queue states, Set stateSet) { State s = states.poll(); if(stateSet.contains(s)) return Optional.empty(); stateSet.add(s); - if(s.energySpent > 15000) return Optional.empty(); if(s.win()){ return Optional.of(s.energySpent); } int[] occupied = s.occupiedRooms(); - for(int o : occupied){ - int[] freeWait = s.freeWaiting(o); + for(int r : occupied){ + int[] freeWait = s.freeWaiting(r); for(int w : freeWait){ - states.add(s.moveIntoWaiting(o, w)); + states.add(s.moveIntoWaiting(r, w)); } } occupied = s.occupiedWaiting(); - for(int o : occupied){ - int freeRoom = s.freeRoom(o); - if(freeRoom!=-1){ - states.add(s.moveFromWaiting(o, freeRoom)); + for(int w : occupied){ + int r = s.freeRoom(w); + if(r!=-1){ + states.add(s.moveFromWaiting(w, r)); } } return Optional.empty(); @@ -196,7 +200,7 @@ public State moveFromWaiting(int w, int r){ } public int[] occupiedRooms(){ - return IntStream.range(0, rooms.length).filter(e -> IntStream.of(rooms[e]).anyMatch(f -> f!=-1) && !IntStream.of(rooms[e]).allMatch(f -> f==e) && rooms[e][rooms[e].length-1] != e).toArray(); + return IntStream.range(0, rooms.length).filter(e -> !IntStream.of(rooms[e]).allMatch(r->r ==e || r == -1)).toArray(); } public int[] occupiedWaiting(){ @@ -222,7 +226,6 @@ public int freeRoom(int forWaiting){ // Indexes of free waiting spots public int[] freeWaiting(int forRoom){ - if(rooms[forRoom][0] == forRoom) return new int[0]; var seeminglyFree = IntStream.range(0, waiting.length).filter(e -> waiting[e] == -1).boxed().collect(Collectors.toCollection(HashSet::new)); if(seeminglyFree.contains(0) && !seeminglyFree.contains(1)){ seeminglyFree.remove(0); @@ -277,6 +280,9 @@ public int hashCode() { @Override public Object part2() { + if(example == 1) { + return constructField(new int[][]{{1, 3, 3, 0}, {2, 2, 1, 3}, {1, 1, 0, 2}, {3, 0, 2, 0}}); + } return constructField(new int[][]{{2, 3, 3, 1}, {3, 2, 1, 0}, {0, 1, 0, 3}, {1, 0, 2, 2}}); } } diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day24.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day24.java index be9b4c34..91042e72 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day24.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day24.java @@ -1,6 +1,12 @@ package com.sbaars.adventofcode.year21.days; +import static java.lang.Long.parseLong; + import com.sbaars.adventofcode.year21.Day2021; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; public class Day24 extends Day2021 { @@ -10,19 +16,93 @@ public Day24() { public static void main(String[] args) { new Day24().printParts(); -// new Day24().submitPart1(); -// new Day24().submitPart2(); } @Override public Object part1() { - var in = day(); + return calcSolution(9, false); + } - return ""; + private String calcSolution(int i, boolean part) { + var in = dayStream().map(e -> new Instruction(e.split(" "))).toList(); + Map vars = new HashMap<>(); + Map processed = new HashMap<>(8192, 0.5f); + return processNumbers(new State(vars, processed, in, i, part), 0).get(); } @Override public Object part2() { - return ""; + return calcSolution(3, true); + } + + public record Instruction (String op, String n1, String n2){ + public Instruction (String[] s){ + this(s[0], s[1], s.length>2 ? s[2] : ""); + } + + public int execute(Map vars) { + char c = n1.charAt(0); + switch (op) { + case "add" -> vars.put(c, getVar(vars, n1) + getVar(vars, n2)); + case "mul" -> vars.put(c, getVar(vars, n1) * getVar(vars, n2)); + case "div" -> vars.put(c, getVar(vars, n1) / getVar(vars, n2)); + case "mod" -> vars.put(c, getVar(vars, n1) % getVar(vars, n2)); + case "eql" -> vars.put(c, getVar(vars, n1) == getVar(vars, n2) ? 1L : 0L); + default -> throw new IllegalStateException("Don't care " + op); + } + return 0; + } + + public boolean isInput(){ + return op.equals("inp"); + } + + public long getVar(Map vars, String v) { + char c = v.charAt(0); + if(c >= '0' && c <= '9' || c=='-') return parseLong(v); + if(vars.containsKey(c)) { + return vars.get(c); + } + return 0; + } + } + + public record State(Map vars, Map processed, List in, int firstNum, boolean p) { + public State clone(Map vars) { + return new State(vars, processed, in, firstNum, p); + } + } + + public Optional findBestNumbers(State s, int curInstruction) { + String state= curInstruction + s.vars.toString(); + if (s.processed.containsKey(state)) { + return Optional.ofNullable(s.processed.get(state)); + } + Optional res = processNumbers(s, curInstruction); + s.processed.put(state, res.orElse(null)); + return res; + } + + public Optional processNumbers(State s, int curInstruction) { + if (curInstruction == s.in.size()) { + long z = s.vars.get('z'); + if (z==0) return Optional.of(""); + return Optional.empty(); + } + + Instruction line = s.in.get(curInstruction); + if (line.isInput()) { + for(long i=s.p ? 1 : 9; s.p ? i<=9 : i>0; i+=s.p?1:-1) { + long e = curInstruction<5 ? s.firstNum : i; + Map n = new HashMap<>(s.vars); + n.put(line.n1.charAt(0), e); + Optional sol = findBestNumbers(s.clone(n), curInstruction+1); + if (sol.isPresent()) return sol.map(s2 -> e+s2); + } + return Optional.empty(); + } else { + line.execute(s.vars); + return processNumbers(s, curInstruction+1); + } } } diff --git a/src/main/resources/2021-examples/day24-1.txt b/src/main/resources/2021-examples/day24-1.txt new file mode 100644 index 00000000..a41747d3 --- /dev/null +++ b/src/main/resources/2021-examples/day24-1.txt @@ -0,0 +1,2 @@ +inp x +mul x -1 diff --git a/src/main/resources/2021-examples/day24-2.txt b/src/main/resources/2021-examples/day24-2.txt new file mode 100644 index 00000000..ae8792a2 --- /dev/null +++ b/src/main/resources/2021-examples/day24-2.txt @@ -0,0 +1,4 @@ +inp z +inp x +mul z 3 +eql z x diff --git a/src/main/resources/2021-examples/day24-3.txt b/src/main/resources/2021-examples/day24-3.txt new file mode 100644 index 00000000..6b1b0e60 --- /dev/null +++ b/src/main/resources/2021-examples/day24-3.txt @@ -0,0 +1,11 @@ +inp w +add z w +mod z 2 +div w 2 +add y w +mod y 2 +div w 2 +add x w +mod x 2 +div w 2 +mod w 2 From 121a017c071018a8ad9cedde2d4421605f4690fc Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Sat, 25 Dec 2021 07:02:51 +0100 Subject: [PATCH 324/433] Day 25 --- .../adventofcode/common/grid/CharGrid.java | 24 ++ .../sbaars/adventofcode/util/FetchInput.java | 2 +- .../adventofcode/year21/days/Day25.java | 33 ++- src/main/resources/2021-examples/day25-1.txt | 9 + src/main/resources/2021-examples/day25-2.txt | 1 + src/main/resources/2021-examples/day25-3.txt | 1 + src/main/resources/2021-examples/day25-4.txt | 1 + src/main/resources/2021-examples/day25-5.txt | 4 + src/main/resources/2021-examples/day25-6.txt | 4 + src/main/resources/2021-examples/day25-7.txt | 44 +++ src/main/resources/2021-examples/day25-8.txt | 176 ++++++++++++ src/main/resources/2021/day24.txt | 252 ++++++++++++++++++ src/main/resources/2021/day25.txt | 137 ++++++++++ 13 files changed, 685 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/2021-examples/day25-1.txt create mode 100644 src/main/resources/2021-examples/day25-2.txt create mode 100644 src/main/resources/2021-examples/day25-3.txt create mode 100644 src/main/resources/2021-examples/day25-4.txt create mode 100644 src/main/resources/2021-examples/day25-5.txt create mode 100644 src/main/resources/2021-examples/day25-6.txt create mode 100644 src/main/resources/2021-examples/day25-7.txt create mode 100644 src/main/resources/2021-examples/day25-8.txt create mode 100644 src/main/resources/2021/day24.txt create mode 100644 src/main/resources/2021/day25.txt diff --git a/src/main/java/com/sbaars/adventofcode/common/grid/CharGrid.java b/src/main/java/com/sbaars/adventofcode/common/grid/CharGrid.java index 08bca5b5..7b4016e4 100644 --- a/src/main/java/com/sbaars/adventofcode/common/grid/CharGrid.java +++ b/src/main/java/com/sbaars/adventofcode/common/grid/CharGrid.java @@ -21,4 +21,28 @@ public int countChar(char... c) { public IntStream iterate() { return Arrays.stream(grid).map(String::new).flatMapToInt(String::chars); } + + public CharGrid copy() { + return new CharGrid(Arrays.stream(grid).map(char[]::clone).toArray(char[][]::new)); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + CharGrid charGrid = (CharGrid) o; + return Arrays.deepEquals(grid, charGrid.grid); + } + + @Override + public int hashCode() { + return Arrays.deepHashCode(grid); + } + + @Override + public String toString(){ + StringBuilder res = new StringBuilder(); + for(char[] nums : grid) res.append(new String(nums)).append("\n"); + return res.toString(); + } } diff --git a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java index f4940002..1addaa26 100644 --- a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java +++ b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java @@ -27,7 +27,7 @@ private FetchInput() { } public static void main(String[] args) { - new FetchInput().retrieveDay("24", "2021"); + new FetchInput().retrieveDay("25", "2021"); } private void retrieveDay(String day, String year) { diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day25.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day25.java index 2a20d3f1..79c0e14c 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day25.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day25.java @@ -1,5 +1,6 @@ package com.sbaars.adventofcode.year21.days; +import com.sbaars.adventofcode.common.grid.CharGrid; import com.sbaars.adventofcode.year21.Day2021; public class Day25 extends Day2021 { @@ -13,11 +14,39 @@ public static void main(String[] args) { @Override public Object part1() { - return ""; + var in = dayGrid(); + CharGrid g = new CharGrid(in); + for(int x = 1;;x++){ + var g2 = g.copy(); + for(int i = 0; i' && g.grid[j][(i+1)%g.grid[0].length] == '.') { + g2.grid[j][i] = '.'; + g2.grid[j][(i+1)%g.grid[0].length] = '>'; + } + } + } + var g3 = g2.copy(); + for(int i = 0; i500){ + return x; + } + } } @Override public Object part2() { - return ""; + return "Merry Christmas"; } } diff --git a/src/main/resources/2021-examples/day25-1.txt b/src/main/resources/2021-examples/day25-1.txt new file mode 100644 index 00000000..0f3c0cd3 --- /dev/null +++ b/src/main/resources/2021-examples/day25-1.txt @@ -0,0 +1,9 @@ +v...>>.vv> +.vv>>.vv.. +>>.>v>...v +>>v>>.>.v. +v>v.vv.v.. +>.>>..v... +.vv..>.>v. +v.v..>>v.v +....v..v.> diff --git a/src/main/resources/2021-examples/day25-2.txt b/src/main/resources/2021-examples/day25-2.txt new file mode 100644 index 00000000..3a71089a --- /dev/null +++ b/src/main/resources/2021-examples/day25-2.txt @@ -0,0 +1 @@ +...>>>>>... \ No newline at end of file diff --git a/src/main/resources/2021-examples/day25-3.txt b/src/main/resources/2021-examples/day25-3.txt new file mode 100644 index 00000000..38b1e385 --- /dev/null +++ b/src/main/resources/2021-examples/day25-3.txt @@ -0,0 +1 @@ +...>>>>.>.. \ No newline at end of file diff --git a/src/main/resources/2021-examples/day25-4.txt b/src/main/resources/2021-examples/day25-4.txt new file mode 100644 index 00000000..d23583e4 --- /dev/null +++ b/src/main/resources/2021-examples/day25-4.txt @@ -0,0 +1 @@ +...>>>.>.>. \ No newline at end of file diff --git a/src/main/resources/2021-examples/day25-5.txt b/src/main/resources/2021-examples/day25-5.txt new file mode 100644 index 00000000..5e9a19ec --- /dev/null +++ b/src/main/resources/2021-examples/day25-5.txt @@ -0,0 +1,4 @@ +.......... +.>v....v.. +.......>.. +.......... diff --git a/src/main/resources/2021-examples/day25-6.txt b/src/main/resources/2021-examples/day25-6.txt new file mode 100644 index 00000000..941bdc0f --- /dev/null +++ b/src/main/resources/2021-examples/day25-6.txt @@ -0,0 +1,4 @@ +.......... +.>........ +..v....v>. +.......... diff --git a/src/main/resources/2021-examples/day25-7.txt b/src/main/resources/2021-examples/day25-7.txt new file mode 100644 index 00000000..441e5ec0 --- /dev/null +++ b/src/main/resources/2021-examples/day25-7.txt @@ -0,0 +1,44 @@ +Initial state: +...>... +....... +......> +v.....> +......> +....... +..vvv.. + +After 1 step: +..vv>.. +....... +>...... +v.....> +>...... +....... +....v.. + +After 2 steps: +....v>. +..vv... +.>..... +......> +v>..... +....... +....... + +After 3 steps: +......> +..v.v.. +..>v... +>...... +..>.... +v...... +....... + +After 4 steps: +>...... +..v.... +..>.v.. +.>.v... +...>... +....... +v...... diff --git a/src/main/resources/2021-examples/day25-8.txt b/src/main/resources/2021-examples/day25-8.txt new file mode 100644 index 00000000..690edede --- /dev/null +++ b/src/main/resources/2021-examples/day25-8.txt @@ -0,0 +1,176 @@ +Initial state: +v...>>.vv> +.vv>>.vv.. +>>.>v>...v +>>v>>.>.v. +v>v.vv.v.. +>.>>..v... +.vv..>.>v. +v.v..>>v.v +....v..v.> + +After 1 step: +....>.>v.> +v.v>.>v.v. +>v>>..>v.. +>>v>v>.>.v +.>v.v...v. +v>>.>vvv.. +..v...>>.. +vv...>>vv. +>.v.v..v.v + +After 2 steps: +>.v.v>>..v +v.v.>>vv.. +>v>.>.>.v. +>>v>v.>v>. +.>..v....v +.>v>>.v.v. +v....v>v>. +.vv..>>v.. +v>.....vv. + +After 3 steps: +v>v.v>.>v. +v...>>.v.v +>vv>.>v>.. +>>v>v.>.v> +..>....v.. +.>.>v>v..v +..v..v>vv> +v.v..>>v.. +.v>....v.. + +After 4 steps: +v>..v.>>.. +v.v.>.>.v. +>vv.>>.v>v +>>.>..v>.> +..v>v...v. +..>>.>vv.. +>.v.vv>v.v +.....>>vv. +vvv>...v.. + +After 5 steps: +vv>...>v>. +v.v.v>.>v. +>.v.>.>.>v +>v>.>..v>> +..v>v.v... +..>.>>vvv. +.>...v>v.. +..v.v>>v.v +v.v.>...v. + +... + +After 10 steps: +..>..>>vv. +v.....>>.v +..v.v>>>v> +v>.>v.>>>. +..v>v.vv.v +.v.>>>.v.. +v.v..>v>.. +..v...>v.> +.vv..v>vv. + +... + +After 20 steps: +v>.....>>. +>vv>.....v +.>v>v.vv>> +v>>>v.>v.> +....vv>v.. +.v.>>>vvv. +..v..>>vv. +v.v...>>.v +..v.....v> + +... + +After 30 steps: +.vv.v..>>> +v>...v...> +>.v>.>vv.> +>v>.>.>v.> +.>..v.vv.. +..v>..>>v. +....v>..>v +v.v...>vv> +v.v...>vvv + +... + +After 40 steps: +>>v>v..v.. +..>>v..vv. +..>>>v.>.v +..>>>>vvv> +v.....>... +v.v...>v>> +>vv.....v> +.>v...v.>v +vvv.v..v.> + +... + +After 50 steps: +..>>v>vv.v +..v.>>vv.. +v.>>v>>v.. +..>>>>>vv. +vvv....>vv +..v....>>> +v>.......> +.vv>....v> +.>v.vv.v.. + +... + +After 55 steps: +..>>v>vv.. +..v.>>vv.. +..>>v>>vv. +..>>>>>vv. +v......>vv +v>v....>>v +vvv...>..> +>vv.....>. +.>v.vv.v.. + +After 56 steps: +..>>v>vv.. +..v.>>vv.. +..>>v>>vv. +..>>>>>vv. +v......>vv +v>v....>>v +vvv....>.> +>vv......> +.>v.vv.v.. + +After 57 steps: +..>>v>vv.. +..v.>>vv.. +..>>v>>vv. +..>>>>>vv. +v......>vv +v>v....>>v +vvv.....>> +>vv......> +.>v.vv.v.. + +After 58 steps: +..>>v>vv.. +..v.>>vv.. +..>>v>>vv. +..>>>>>vv. +v......>vv +v>v....>>v +vvv.....>> +>vv......> +.>v.vv.v.. diff --git a/src/main/resources/2021/day24.txt b/src/main/resources/2021/day24.txt new file mode 100644 index 00000000..58566bd8 --- /dev/null +++ b/src/main/resources/2021/day24.txt @@ -0,0 +1,252 @@ +inp w +mul x 0 +add x z +mod x 26 +div z 1 +add x 14 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 12 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 1 +add x 13 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 6 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 1 +add x 12 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 4 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 1 +add x 14 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 5 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 1 +add x 13 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 0 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 26 +add x -7 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 4 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 26 +add x -13 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 15 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 1 +add x 10 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 14 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 26 +add x -7 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 6 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 1 +add x 11 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 14 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 26 +add x -9 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 8 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 26 +add x -2 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 5 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 26 +add x -9 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 14 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 26 +add x -14 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 4 +mul y x +add z y diff --git a/src/main/resources/2021/day25.txt b/src/main/resources/2021/day25.txt new file mode 100644 index 00000000..d866af10 --- /dev/null +++ b/src/main/resources/2021/day25.txt @@ -0,0 +1,137 @@ +vvvv.>>...v....v>....>...v.v....v>>v>v..>...v>>>v>.>v.>.>>......>.>..>vv.vv.>>vv>..>.>v...>...>.>.v>..v>>v>>v>>.>.>..v..>v.>.v....v..v>>v>> +...>....>..v......>v>......v.v...>.v>..>.>>..v.v>...v.>v>.v.>.vv.>>>.>v...vvv>>.vv..v.>v>.>....>>.vvv....vv>.v.>.....vv.v...>>>vv..>v>..... +v...v>v.vvv..>.vv.v....v.>>vvvv>v.vvv....>.>v.vv...v...>>...v.>....>.>>.v.>......>v>.vv.>..>>v.vv>.v.>.vv>..v.v>>>>vvv..>v........>vv>..>v. +...>..v>v>v>v.>v..v.>v>>>.>>.>>vvv..v...vvv.>.v>.v..v.v...v...>>v>>....>>...>vv.>v.>>.>v>..v>vv>....v.>...>.v>..>.>>.>v...>.>v...>....v..>> +.>.....>...>>>>..v.v..>.>>v....>v..>....vv..>.>.>vv..>>v.>.>..v.vvv.>.......v.v>v>..>.v...>.v.v>v..vv..vv>..>.vv.>.vvvv>..>v.>>vv...>.v>v.v +.vv>.>.vv>>vv..vv>.v..>>>v..>.v>..>v.....>v.v.>..>v..>>v...v.>>.v.v...vv.....>..>>.....>>.vv>.....>>>.>v>...>v..vv.>..>>..v...v..v..>...>.. +>>....>...v..>>...>>>.....v...>>.>.v.>vv.>..>vv....v.v.....>.vv..>>.v>.v>v.>>......>>..>v...v...>...v.>v.>v>.v.>..>v.>....>>v.>>.>.....>... +.>>vvvv.v>>>>vv.v>...>v...vv.vv.>>v.....vv..v>.vv..>.v.>..>....v...v...v..v>.v.v.vv.>vvvv>..>..>.>.v.v.v.v>...>v..vv>.v>vvv..v.....>>.v>>v. +..>.vv>..>>.>.>>>...v.....v.....>>>..>..>>.v...>>>>..>>.>.>>..>.>......v.v>v...v>.v.v.>>v>.v......>v..v.vvv>>>v>....>v..>>.v>vv.vv.>.v..v.> +.v.v....>vv......>>v....>vv......>>.>....v..>vv>v..>>>.>.vv.....vv.....v...>v..v...v.>.>v..v.>.....v.>.>>.v...>>.>.>.v..vvv....>>>.>v>vvv.. +>>...v>>..>..>.vvv....vv..>vv..v.vv>.vvvv>>>..>>>..>.>..>....>v>.>v......>vv.>...>..>vvv..v>>.>v..>>>.v...>v.vv>..v.v..vvv....v.>>.v...v.>v +...>>>>vv.>..v....vv...>.v..vv>.>>...v>>.v>......>v.v>.vv.....v.>..>>>.>v...vv..>..v.>>...v>..vv.>...>v....>v...>..>..>.vv>>.>vv.v.v>.v..vv +.v....vvv>vv.v.>..v>..>.v.>>v..v>..v...v.vv>>....v.........>..vv..>>...>v..>.>v.v>>v.v>>>...v>.v>.v.v..v>....>.v..vv.vvv>>>.v.v>.>v.v>>>.>. +..>>v>>.v>vvv.>>......v>>.....>>v>.>..vv......>>.vv>...>.>.>....>.>.>>.v....vv>v...>..>.>>>.v.>...vv...>>.v>>..>.v>...vvv>v.>.>..>.v>....v. +.>>....>v.>>>>vv>..>..v...>..v>>.>v..v....>vvv>>>>vv...vv>v>v.>>vvv>>>v..>>>>.>.>.>.v.v.v.v>.v>.v...>..v..>.>>v>.>.vv...v..v>.v..vv...vvv.> +.v.>v..>..v.v.v...v....>.vv>>v.vvv.>vv>>.v..v..v>v..vv.>>vv>>.>>v...v.>.>..>>>.v.v.>..>>..vv...>.v.>>...>v.>vv...v...>vv.>..>v.v.vvv>.v..v> +>..v>.v..v.>v...vvv.vv...>>>.>..>vv>.v>..v>v.v..v.>....>>..>>.>>>..>>>>>vv...v.>>.>v..v...>.>vv..>.>..v>>..>..>>.v>....v>>v.v.....>>...v... +>.>.....>..>..vv..>v....vv....>v.>......v>.>vv>vv>..vv.v.....v.>>>>..>>v.>.>....>v.>.....>...v...v.v..>.v..v>>.vvvv.>..>v..>.>vv..vvv..v.v. +..vv..v...vv.>.>.v>v....v..>vv.>v...>>v...vvv>vvv....>v>v>.......>>>.v.v...v...>.>v..v>.v>>...v....v>.>..vvv>>>.vvv.v.v>vv>.vvv>..v>.....v. +..v.....>>..>>v>>..>.v.v.vv.v....vvv.vv.....>v>.>v.>.vv....>....>v>...v.v...>>.>....v...vv.>....v>..v.>>.v...vv.>..v.v..>vv..>..v>>v..v.vvv +vv>vvvv..vv..v.v.>>>>.>>>>>v>v..>>.vv.>>>..>....v.vvv>.v.v..>>.v>.>>v.v...>.v>>v.>>.vv..>>>>vv..v>>v>v.v...>.....v.v>.v>>.>.v...v..>...v... +...>..v>v..v>.....v.vvv.vv.>>>..>>>>.v..>..>v.v.>v..v.vv..v>.v.>.>v.....vv>.>>..>.vvv...>>...>.>v.>.v>.v.v.vv.>>.>v..>..vv.vv>>>..v.v>...>. +....v.v>.>v.v.>>>.>.v...>vv.....>.v>v.....>.>.>>>v.v>....vv>vvv...>..>..v..>vv>v.v>>v.>v.v.v>.vv.v..vvv..>.v.....v.>.>>.vv.vv..v>v.>.>..>.> +.v.>.>.v.v..v..v.>v..vvvvv.>.v.>>v......v...>.>.v.>v..>..vv.>.>v..>..>>v>v..vvv...v...vv>..v....v....>....v.>>.v>>>..>..v.>.v.>v.>....v.... +>v.vvv>>..v>>>>.v.v.v.v.v.v......>v..v.>>vv...>..>.v.....vv>.>v.....v.v.v>>>..v..v...>vv>..v.....>...vvv>...v>.>..>....vv>.v>.....v.v>..... +....>..v>.v...>..>..>..v.>..>..v.v......>.v>.v..v>.v>..v..v>.v>.>.v..>..>v..>.>>..v..>vvv>..vv.>>.>v.v.>.>vvv.>..>......>v>.v.v...v>>.>>>.> +.>vv>v>...v...>..>.v...>>...v.v>>..>.vv....vv...>.>....vv.>.>.v.>>.>v>...v.v..>..>>...>...v.v.>v..v>..v>..>.v...v>.>.>vv.v>..>v...v....v.v> +>v.v.>.v>>..>v.v..>>..>v.v.>v..v>v.vv>...v>>.>v>v.>v..>>..>....v.vv>vvv....v>vv.vv>vvv..>>........>>>.v....>>.v..>.v....>.v..>..v>v......>. +.>.v..>.>>..v.vv....vv..v..>.>.v..>...>v...>v.>.vvv>>v.vvv..v.>.v...>>>v.vv>>>v.>>v.v..>v.v..v..>>..v......v>v>v.v..v.>>>.>.>vv.vv.v>..v..> +v>...>>v..>....v>>>..v>>>.vvv.>.v..>..vv.>...v.v..v.vvv...v.vv.v>...v........v>v.>v.....>>...>v.v>.>...>>.>>.>>v.v>>v.v..vvv..vv.>..>.v>..v +.vv.v>...>>>..>.>v>.>.>..v.vv.>..v>...v>.v..v...>vv.>>v...>>.>.>.v.>.>.....>v.>.vv>.>.v...>...v>.>v.>.v.>>v.v>..v>.v>.>.v.v.>v.vv>>>.v.vv>> +v...>...vvv.>>>vv.>v.v...>>>>v>>>.vv.>..>.>vvv.v.>.....v..>>>v>..v>....>.>>.>..v...v>.>>..>..v.vv..v.v.>vv>..v..>>>.>>>v.>...>>..>>v.v.vv.. +>..>..vv.vv>...>>..>v....v>v..>.>....>>>...v.>>.v>...>..vv.....>>.>vv..>.vvv..>>>.v..v>>>.>v..v>..v..v>..v.v.vv.>>vvv..v>.>>..>v>vvv>v>>v.. +v.v>>v....>.....>v.>.v.>v..>.>.v.>v....vvv.>....>>>..>.>.>.>vv>.>v..vv..v..>.v>vv>vv..v.v...v..v......>>..v.>...>>vv.>v..>v.>.>>v.>vv.>.v.. +>..v>..>vv.....v.v...>.vv..>.>vv>v......>...>.vv.v..v..>.v.v>>..v.>..>vv.>.>>vvv..v>..vvvv..v.>v>vv.v..v>>>>v>vv>.>.>>.v>v.v.>..v>.>v.v.v.> +vv..vv>v..v..>vvv......vvv.vvvv>>.>.v.v...>v>...v>..vv..vv>>v>.v.>>v.>>.vvv.v...v>>..>>>v..>..>.....v>>.>>v....>.v>.v>.v..vv..v..>.....vv>v +v>..v>.>v.>.>>>v.v.vvvvv>v.v>..>.vv>...>>..v.>v.>v....v>..>v...v>.>>...>v..>>.v..>>v..v..>>.>.vv.v..>.>>v...>.>>......v>>.>vv...>.>.v..>... +..v.v....v.>v>.v>v.v...>vv>..vv..vv...v>>>v...vv>.>>..v...>v....v...v>.v>>>.v....v..>v.v....>.>..>.>>v.v.v>.>.....v.>vv.>.vvv.>v>>...v...v> +vv>..>..v>>>v>.v>v>...>.>>.v..>>>>..>>.v>v.vvvv..>.>>v.>v>>>..>>...>>.v.....>..>.>vv.vv.>>>.>>v>v..vv>vvv.>v.....v>.v>v.>>.vv>>.vv.v>...v.v +vvv..>..vv..vv>v.>vv.vv.>.>.>..v>.vv.vvv>v>.v.v>.>>v..vv.v...v.>..>.vvv>...>v..vv.>v..v...>.>..v>v.vv..>..vv.v>v.vv.v.>v.....>>>.......v..> +v......v.>>>>...vvv.>..v..>.>>v....vvv.>>.>...v..v.vv.>......>..>......vvvv.v..>.......v..>>..>>>v.>>>..>.v...>vv.v>>...v>>.....>>vvvv..v>. +.v.....>...>.>......>..vv>..>....v>v.>.v.v...v..v>.>..>.>.v>v.>.>v..v...>.>v.>.vv.v>v.....>v....v.>v>..>.v...v>.>.>...v.v..>v..v..v..>v...> +>v.>>>.>.v>.>v....>>..>....>.v.>>>...vvv.>.v...>v>.v..>..vv>..v>.v..v...v..>..v.>v>v.......v.>.....v>.>v>v>..v.v>.>>....>v>>.....>>.>v..vv. +.v..v..v.v>..v..>..v.vv.v>v>>..v>.v....>v......vv....vv.vv>>v.v....>..>..>>.>vvv.v.>.>.>v.v>>v.>>>.vv.>v.>.....>..v..v.>.>..>.v.>>.>v.>vvv> +...>...v.>........v....>v....>..>.>>..vv.....v>vv.....>>.vv.>..v.v..vvvv>vv>...vvv..v.>..v...v.>>>..>>.>v..v..vvvv>>.>.>v.vvv.vv.v....vv.v. +v..v>..>>.v.>>.v.v>.>.v>v..>>v.v>v......>>....>...>.>>.v>.....>>>>...>..>>.v.v>.v.v..>>v>.>.v.>...>....>v>v>vv...v.......vv>.v.>>.v>v.>>v.> +>.>v.vv>vv>>v>.....v>...>.....v>.v.v.v.>>>.v....>..vv.v.>>..>..v..vv.v..v.v>>....v>..>..vv>.vv>..v.v.v.>.v.>v.>........>>>>.v.>..v..v>.>.>> +...>..>.vv.>...v...v.v.v.>...v>.>...v.v..>.>vv.>..vv..>.v>.vv.vv>vv..>>v.>>v>.>.v>v....>.v.>vvv..v..vv....v...>.v>.>.v>vv.>>....>>.v>>.v.>. +vv..>....vvv.>..>.v.v..>...v>..vv.vvv>.v>.v.>..>vv.v>.>...>.v.>.>>>...v...v...v.v.v.>v>v>.>.>v.>v>.v>..v..>v..v>....v...>..>.....>v>..>>vv. +...v.>..>.....v.v..vv....v....v....>.>>..v...vvvvv.v.v...v..v>.>.v..>.>..v.....v...>.>v.>.....>..vv...>>.v.v.>>.>>.v>>>>>v.>>...v..v.v...v. +.....v..>.>..vvv..vv>vv>>....vv..vv>>v.v>...>v.v.v>>.....vv>...>v.>...>.v>v...v.v.v>>>>>.vv>v>v...v>..v...v..>.v>v>>>vvv..v.>.>>>...v....v. +v>>>.>v..v>.vvv.v..vv.>v.>..vvv.v...>.vv>.v.v>>...>v....v>.v....>...>v.v..>...v>>...>>>...v..>v>...>.v>.vvv>v...>..>>>vv>.v..vv>>>..v...v.> +>...v>>..>>....>.>v>.>>v...>.>>>vv...v.>.>.......v...>>.....>.vvv>...>>.v>vv>...>.>v.v.>.v.v>v..v>vv...>.>>...>.....>.v..>vv.>>.>>.>...>... +.v...>vv>...vv>v.>....>>.v....>....v.vvv>>..v>....>.>>....>v.....>v>.v..>v>vv..v.v>.>v..>vv>..>..v...v.>.>>...>>vv>v>v..>......>.v.v>....v> +v...v...v>>v...>vv...>vvv>>v..v....>.....>v>.>>v>..v.>.>>>>.>.>.>...>v>>.vv.....v>..>>>v....v....v.>......v...v>v>>..>...v.>>..v.....vvv>.> +v>>.v>v...v.>>v.v>>...>.v.....>vvv.>v...v>.v.v>.v..>v.....v.>v..>>v>v.......>v>v.v>.v>vv>v..v..>>......vv..v.>v.vv>.vv.v.>v..>.v>vv.v>.>.>. +v.vv>..v.v...>vv>>..>...>>>...v...v.>v>>>>v>vv.v..v.v..v>>v.vv.>>.v.>vv..vv...v..>vvv>>>.vv..v.v..>.v.......v.v.v..>.v>..>>v>.>v.>vv.v....> +v..v.>..>.......v>>v..v.>.....v.v....v..>.v.v>v...vv..>.v>.>vv>v..>v>>.>...>......v>...vv.v.v...>>....>v>...v...v..>>vv.>>.v>..v.>>.v.v.... +>v>..>>...>v>.>..>>..>vv..>..>v..v.v.>>..v.>v.v>>vv.>>..>.vv.v.v.vv...>>...>>v>.v.vvv....v..v.>.v>v>>>v>.>...>vv>...>..>>>v.v.vv....v>>v>v> +>..>>>>.....>v.>...vvv..>..>...>....v.vv.vv>v>vv...>...v>>..>>v...vv..vv>..>>.v..vvvv>..v....v....>vv.v>...v.v..>v>......>....v>.>..>v>...> +..vvv>.>..v...v..>.>v.>.......>.....>v>...v>.>>>>>..v.>...>vvv.v..>vvvvv.>.>v.>.v......>v.....v>v.>..vv.>.v>.......>.vvv.>>.v>.v..>.>v.v.v. +.....vv>.v>v.>>v..v...>..vv>.v.>v...>vv.>...>...>..>..>>.v.....v..v...vv...v>.>.....v...v>.vv>.v..>>v>....>.>>v.>vv>.v..>..>......vvvv..>.v +.v>..v>..>.....vv..v>..>....v..v.>v>....v.>vv>v.....v....vv..>.v>..v>.vv>>>.>>..>v..>>..>>....>.v>>>>v.>.v..>>........v.vvv>v.>..>v>>>v>v.. +.>vv.>.....v..v..v>.v...>v>v.vv..v>..vv..>.>v...>...v.vv..>...>..v>>.>v.>>.v...>>>>v.v..>>.v.v...vvvv>.v>v...v.v..>vvv>...>>..>.>v>>>.v>>.. +>..v>>v.v>...v>vv>...v>vv..>vv>>.v.vv.vvv.>.>v>>v...>.v.>v..v.>..v>..v.vv.....v.>>.v.>..>....>>....>..v.vvv>>>>..>....>.v>......>...>>>.... +>.>vv.>v>v.>.>.>>..v..>..>.>v......>..>...>v.vvv>>v...>..v........>.v>...>>...v>.....>v.v....>v.>..>.>vv....>....v.v..v.v>.vv>>..v.vv>.>.>. +v.>.v.>v..v>.>.......>.v.>>.v..>....v>.v.v>.>..v..v.>>v...v...v>....v.v.>>v.>.>.v.>.>v>v........v.vv>.v...>>...v.v...>v..v......vvv.v.>>.v> +v.v>v>.>.vv.>..>>.>v.v..>....>.>.>v.>v........>.vv....>>>>vv>..>.>v>.v.>>v>..>>.>>.>...v.....>.v>v>..>.v>.v>>>v.>>>vv.>.>....v>>v.>.>.>.>>v +..v..>..>......v....>....vv..>..>...>.v.....>>.vv...vvv..v>.>>v>>v..>.vv.>>.v.v>>v>>>>>v>.>>.v>.>v>...v..>...v..>.>>.>.>.>.v.>....>.>.v.... +..v...>..>v.v.vv....v.>.>vv.v.>.v.>>v.vvvv.v...>>v.........v>>.>vv>..vvv>vv.v>>.>vv>v.>.>.v.v..>v>.>v.vvv....vv..>.v..>v.>......v.v>..>..v. +..vv>v>..v>>v.v>.v.>vv.vv.vv>....>.>>>>.>......>...v.>.v>...>..>.....>.>...>.>..v>.>v..vv>>..>>..>>.>>.vv..>>v>>..v..v>.v..>...>v.v>>..>>>> +.v.v.>.>...>...v>..v>...>.vv..v..vv>>....v..v>>>.>...>v>.v..>vv.>.>>>....>v>....>>>v.v.>..>..>>..v>>.v.vv.v.v.>vv>v.....v.>..v..vv>...v.>>. +..vv.v.>v...>v.....v.>v..v....>v>>.>.vv.>.>.>....vv.....>>vvv.>.v>>>.v.>v.vv.v....>..v..>v>v.>>.>v..>.>.>.v.>vv.vv...>v>....>v..>.v>.>>.... +vvv....>vv>v.v>>>.v>vv..>v.v..>vvv>>.v.>>v>>.>vv>v.v>v.v.>..v.v..v>>v........v.vv.>.v>...>..>...v>>.>.v.....v...vv.vv>.v.vv>>.v>v>v>vv.>>>v +..vvv>...vvv>>.....>...v...v>.v..>>v>>vvv...>v..vvv..>>..>>.>>>>..vvv>>vv>vv>>...vv.>.>v>>>.>...>.>.>.v.v..>.>>...v.>>..>>>.>v>>.vv...v>>.. +.>>v.vv.v.>v.>....>.v.v>.vv...vvv..v>.v>>>v>>.>..v.v...v>.vv.>.v..v..vv.>.>.>.>....v..v>>v.vv.>.>v>.v....>v>v..>.v.>..>.v>v>>v>>v>v.>.v.v.. +>.v>.v..>...>v...>...>.>>>v.>.>v>.v.>vv..v..v.v..>.>.>>>v...v.........>..>>vv...v>vv..>v>>.v..>vv....>..>..v>.vv.>v..>v>>>.>>v.vvv.>..>>>v. +>vv..>.>...>.>.>>....v>vvvv>...v.v.>..v>vv>>...v..>>..>>>>v.>v>...>>....>v>v>..vv....>>....>>>.>..>.>.>.v....>v>..v.>.>>>....>vv.>.>v.>v..> +v>...>..>.>>>.v>>v.>>.>...vv.>..vv.....v........vvv>>..>>>.>.v>.>v>>v>v.v...>..v.v>..>...>>v>>.....v>.>>v>...v.>.v>....vv>.v.v.vv.v.......> +.v>.v.vv.v..>v..v...v..>.v>.v..v>v>......>>>.>..v>..v>vvv.v.vvv.v..>.......>..>>.v.....>...>>>..v.>>>>.>.>v>.>.>..>>vvv.....vv.>.v.v>.....> +>v..>.v......v.......v.>>>v.>vvv.......>v>v...>>vv.v.>.....>v.......v>v>>..v>....v..v..>.>...>v>..v.>.>v>v.>....>v...>...>vv...vv.vv>>v.>v. +>v>.v..v..>v.v....vv.v.>vv.>.>>.vv......vvv...>v>.>v..v>...vvv.....>..>.>v>.>.v>.v.v..v.>.v>.v...>v>v.vv..>.>>.>..>...>v.>>v>..>v..>>..>..> +..>>..>v>v>...vv>..v...vv..>.>v.>>>.>v..>..v>....>....v....>.v.v>>>v.v>.vv.>.>>v.vv...>vvvv.v>.>>v>>>...v>..>.>>..v..>>..>..>.v>v..v...>.v> +>v>v..vvv.v.v.>.vv..>.v>.v.>.v>..v..>.>>.>v.>v.......>..v.v.>..>.....v>.>..v>>....v......>v..v>>v..v>>...>>.>..v..>.>>...>.v.v..v>>.>>>>v.v +>.>>..v>v..vv.>vv.>..v..vv>>v...>...>....v.vv>v...v.>.>..>>>v..v......v>v.v..v>v>...>vv....>v>v.>>>.v.v>.v>....>v...v.>vv..v>.>v.v..>...>.> +v.v>.v..>.v...>>..v....>>.v>....vv....>>>..>..>>>v.>v>.....v.>.vv.>....v.vv.vvv.v.v>.vvv....>.......>.v>v>>..v>.vvv>.>vvv.v.>...v.>v>.v>vvv +v.>..v...vv>.v.>...>.vv>v.>..v>...v..>v....vvv..>.v.v.vv.>..>...v...>v..v.....v.>>v....v.v..>.>..>vvv.>..>..v.>..>..v.>..v.>....v..>..>>... +vvv.....v>v>v>>>.>...>..>>v......>..v>.>>vv..>>...>.>>>>v>..v.......>>.....v..>v.v.v>>>>...v.>..v.....>.>.v..v>v.v>>>>.>>>...>.v>.....>.>v. +.>..vv...>>.v>v......vv.>.v>>v...>...v..>.>>.v.v>...>vv.>..v..v...v>>>>>v>v.....>..vvv>>.v...>v.vv>..v..>>...>.>>.v..>>>..>.v>>....v>>>.... +....v>vv>>.v..v..>>..v..>.v..v.v.>......v>.v...vvv>v>>.>..v.>>>.v>v.vv.v.>.vv...v...v.>vv>>..>..v>v>>vv..>>>v>..>.vv..vvv.>...>>vv>.vv>.>.. +.>v>>.v>...>..>...vv..>>vv.vv.v.v.....v>v.......v>>.v.........v.>>..v>.vv..v.>.>.v.>>.v>.v>.>.vv...>>...>.>>..>.v...v..v.>v.>>>v>.>v......> +.vv>.>.>.....v.>>.....v..>vv.....v>v..>...v>..vvv>>vv.>v.>v.........>...>>>.v...>>v.>v.v>>......vvv.v..vv.>.v>.v>>vv>v>v.>vvv.>v..v......vv +..v..vv..>>>>vv>>>>v>.v.v>v..v.v>.v>v>>.v..v>v>>>.>...>.v>vv.v>.>>..vv>.>.vv.....v.vv..v>.>.v......v..>v>.>...>>>>..v.v>.vv>...>.vv.v>...>. +v.....v...>.....>v.v.....v.vv...vv>.v>.>>..vvvv>.....v.>.vv>...v>..v...v..v>.>.>>..v.v..>>>>.v..>..>.v>>>.v>v>....>.>>.>>>.....v>.>>v.vv... +>vv...vv.v...v..vv..v.>v>.>.vv.v...vv>>v.vvv.>>.v..v.>......vv>.>..v.>.>vv>.v.>>.>.>v..>>.>>v.>v..v>>...>>....>v....>..>>...v...>>..>....>v +v>>.....>...>v.v..>.....>.>>.v>>..>v.v...vvv>v.>....v...>.v..>.>v.v>...v.v.>.>>...v....>vv.>>>......>v.>v>v>>..v..>v>..v>vv.....v..>>v.v>v> +>.>..>v>v.>v..>v>..>.vv.v>>v.v....>..>.v.v>>v>.>v.>.v>v>.>>.>v.v.v.>.v>.>..>>>>>..>.>..>>.>.>...>>..>>>..>.v.>..>vv.>>.>.v.>vv.v.>>.v...>v. +...>vvvv.vv>.>.>vv.v>>..>.v>>..vv>>.>v.>>>>.vv>v.v.>v..>vv...>...>..v>.........>.........v>>.>....vvvv.v..>v...>>>....>>v..>v.vvv>.v....vv. +....v>.vv>..>>>v.v...>v.v.vvv.>.>...>..vvv>v..v....v>.>>...>>.>v...v..v>v.vv>..v.vv...vv>v..>.v>v.v.v.>v.>.>vv.v.>v..v.....>.>v>.>..>..>.vv +..>v>>.>v.v.>>v.v>.>>>>...v>>v.vvv.>>.>..v>v...>.v>..vv>>.v>.v.>....>v.>.....v..v.>vv>>>.>.v>>..>.v..>.vv>..>...v.v..>>.>.v>....>v>>v.v>..v +>..v.v...vvv>...>v.vv.v..>.>v...v>.>.vvv....v>.>.>.>v>>....>>...v.>>>..v>v..>.v.v..v.vv>...>..v>>.vv.v>..vv..v....vv>>..>v.v..v>>v.>..v.>.. +....v....v>v.>.....>vv....v.v...v>>>.>.v....>......>v...v....>v..v>v..v....>>>>v>>.>..v.v......v>.v....v>.>..>.>>v.>>>...v.vv.>vvv.v.vv..vv +..>>..>v.v.>v.v>v.>>.....v........vv.>v.>.vv.v...v.v.>.>...>v.>>v...v.>.......v..>.vv...v.>..>>v>.v...vv>v....vvvvvv>...v.v>...>..>..>>>v.v +...>v.....>v>..>v.>v.>.v>.v.vv.v>.v>..>v>>.>>v..>..v..>.>v....v.v.>>>.>v...>>>>..v..vvvv.v>vvvvv...>...v>v>>.vvv..>.v...v...>>..v..>.v...>. +.v...v...v..>.v>.>>..>...>>.vv>>v..>v..>v>..v.v.>v.v>.vv..v.v.>.>v..>..v..>...v>v>v.>>..>v.>>..v.....>..>.....v>..>>.vvvv.>.v>.>>>>v.v>.... +v.v.>v..>..>v.v>.v..>>....>>vv>v...>>..v....v........>v>v.>.>.v.>.v>v>...>>.v.v>vvvv.>..>>v>..>.v.v>.v>..>...v>.v>v>>v.........>>.vvv..v.v> +>>.>.v.>.....>v>.......>v.v.v>.>v..v....>v...>.v.vv...>.>.v...v>..v.v>..>.v.v.>v.>.>.>vv>.>>vv..>v>>..vv.v..>v..>..v....>v>vv>v>>>.>v..>.v> +v.....vvvv>...v>..vv.>vv..vv.>vv...v>>>...vvv....>>v...v....v>.>vv>.>>>vv>>>>....vv..v>>>>..v..>.v...>.v....v...>v>.>.>>>v>...>..v.v..>>v>v +...v>v.>v.>vvvv>..v>...vvv.>......vvv..vv>.>.....>>.vv.>.>.>>..>>>>>..v>v.vv.>.>>vv>v>>v>..>..vvv.v>...>.vv...>v.>..v>.v.>.>vv.v.>...>vv..> +....v.vv.>>...v.vv>.>>>.>..>..v>vvv.v>v.>>>...v>v.>.vvv.>>...>.vv>>..v.....v..v.>>.v>....>.v..>.>v.>.v....>.>.v..>v>>>v.>v.v.>v>vv.>.v>.vv. +v.v>.vvv..>>v.>..>.>..>..>..v>.v.>v..v..>>v>>v.v.v.>..>.vv....v>>.v.>....>.>>vvv>...>.v.v>..vv.>.v..>v....v....vv....v.>..>.v>....v.....v.v +.>..>>vv>>.v>>v..>.v>>..vv.v>>>.>>>v.v>..>...>..vvv..>vv.>v>>>.>>>v.......v....v>v.>v.vv>...>...>>...v>v>..v.>>..v..>>>>..v.......v>.....>> +.......v>.vv.v.>>v.v>v.....v.vv>v>>....v>v..v>>v.v...v>...v.>v..v..v>v......>.>.>...>>....>.v...v.v>v.v...vv>...>>...>.>.>>.>>.>.>..v.v...> +v.>.>v..v>>.>>.v>.v.>>v>v..>v..>..>.....v>....v>>v>.>...>v.v..>vv.>vv.>>...v.>..vv..>...v.>..v......v.>...vv>v>>>>vv.>vv>.>.>...>...>>vv.>> +.>.>v>>.>.v.>......v.v.>v>>v..v.v>....>.....v.>.v.>.>>>v.v>>vv...v..v>>>>.v...>>>.vvvvvv..>..>..>vv>.vv.>.>.>..>>vvv.v.>....v>vv..>vv>v.vv> +.>>v..v>...v......>.>..>v..>.....>.>v..vv.v>>vv>.vv...>...v.v>....v>...>.v>>...>.....vv>.>vv>..>.v.>.>v....>v..>..v>>>v.>...>.>v.>.>v.v>.v. +.>v.>>v.v....v.......>.v.v.v..>v....>v>.v>.>v>>..>v.v>>.>>.vv>>vvv.>v>v.....>>vv.v.v.v.....>.>.vvv>v>...>..v>.v.>>>>>..>v>.>v.>>v>>v....v.v +vv..>.>>.>.vv..>..>...v.....v....>.v>v....v.vv.v...>.vv..v>>.....v.>......>.....vvv..v>v>.v...v>.>v.v..>..>.>vv....>>.>>v>.>.v..v>vv.v>.v.. +v>.v...>v..v..vv>>v..>v.v>.vv>>..>>>.v.>.....>v..>v.>v....>vv...>.>>>.>>v.>.>v..>.>v.>>..>v...>>.>.>v..v.v.vvvv....v.v>.>..>>>..>vv>...vvv. +v>>.....>vv.>....v>.>>v..vv.>vv...>v>.vvv...v>...v.v>.>...v.>.>>v.v..v>.....vv.>..>>.vv.>..>.v.>v>..v.vv.v.v...v.v..v>.v.v......vv>...>..>v +.>...v.>.v..>vv...>.vvv..>>v..>..v.>.....>......>>>.v.vvv..>>...v>.>.vv.v>..v.vv>vv...v>.vv>..vv.>...v.v..v...v..v.>...vvvv.>..vv..v...vv.. +>..>>>.v>..v......v.>.....>v.>>>..>.>>..>>v.>>vv>.>....v>v.>.v..v>..>..v..>v..v....>>>>...vv..>...>.......>.>.v>....v.v>>.v.>.>v>.>>>v..>>> +..>.>vv......>.v>>.vvv>..v.v.>.v.>>>>.v>>v>......>>>>.>>.....>.>..>.vv..v.>..v>>vvv.v>...v..v.>.v..>.....v>vvvv.v.vvv>.>v..v>>.v>v...>..v.> +>..>..>..vvv.>.>.>..vv>....>v>.v.>v.>>>...>>.v.>.>.>.>...vv..v>..>vv...v>..v..v.>..>.>v>......v.....v.v.vv...>v...vv>vv.>>.v..v..v.v..v...v +.>...v..v...v.>..v..v>v.v....v>.vv.>.vvv.v.>>.v..vv...>>..v.>>.v>.>.>..>vv>vv.v...>.v>>........>.>v>...vv.vv>v..v>.>.v.>v.v..>..vv>.v..>... +.v.v>...>v....v....>>>vv..>>v..>....>vv.>.>...>>..v.....>v.>.>...v.>v.>v>..>.v.>.....v.>>>v>>>v..v.v>>>v.>>..v..v....vvv..v>>.>>>v......v>> +..>.v.>>>.v....>..>vv...vv>>.>v.>>..v.v>>>.v.>v>.v..>>>....>vv................>>>.>.>..v>...>...v.>>.v.>>>.v....>>>.......>v>vv.v....v...>. +vv.......>v.v.v.>..vvvv>.>>vv...>..>.>>v...v.>v.v>.>..v.....vv..v..>.>>....v..vv.v.vv>..vv>v>vv>v>...>.v.>>....>.>>...>vv>>.v..>v.>.>>v.... +v...v.vvv.v..v>...>.>...v..v.vv..>.........vv.>vv.....v>v.v....>.v.v>>v>.>..v>>v>..>..v>.>v.v.v.v..v>>v..v..>...v.v.........>>v.>...v.v.v.> +.>...v...v.vvv.>v.vv.>>>.v.v.vvv>.....v>v.v>....v.>>....>....v..v>.vvv..vvv..vv.v.v.v>.>.v>v..v>.v.>>..>.....v.>.>.v....>>>>.>vv>.v..vv>..v +>>.v..v..v>v>..vv...>.v..v.>..vv.v.vv.>>v..vvv>>vv..>..v.v.v.vv>>..>v.>>.>...>v.>.v.>......v>..vv..>v...>...>...>.>>>v.>>..v.>....v.vv.v>.> +....vv.......v.v.>.v>v.v...>...v>.v>.....v>.>v....>vv>>>>v.vv>>v...>..>>.>>...>>..vvvv..v>>>.>>v..>vv.>v>..v......>v...v>>.v..v.v.....>..>. +>.v>>v..>>>..vv>.>>>..vv>vv.vv...>...vvvv..v.v>v..v.>v>....>..>.vv.vvv.>...>v.vv..v.v>>...>v>>..>v.vvv.vv.>>v......>.>.v>>..>>..v....>...v. +vv.>>vv.....>.v...v.........>...>>>>>.>>....>vvv.>..v..>v>>....vvvv>v>>vv..>..>vv.>v..>>>.>.....v..v>>...>>v.>.>..>vv...v.v.>v..vv.>..v>>v. +...v...>.v...v>.>>...>v>vvv...v>v.vvv>>..>v.......>...>.vvv.>vv>.vv....>vv.>v>.>.>....>v...>>.>.v....v>>v>>.>v>v.>>>>.>vvv>..v..>>v.vvv...> +>.>>v.>.vv>.v>.>..>.>.v.v...v>..>>....v..>>v..>.v>v.......v.v.v>v..v>vvv.>>>.vv...>.>vvv>vv.....>>.vv..v>v.>>vv>.vv.v>.>>.vvv.>...vv.vv.v.. +..>v...v.v.....>v>>>>..>.>..>.v...>.>.>>..v.>v>.v>>v...>..>..v.v..>vvvv.>>.v>...>vvv...v...v....>..>.v>>>....v..>....vv.>v.>.v>v....v.vv.v. From 1c5cec5212a26ba221cf551f9bb8e5028ef567e6 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Sat, 25 Dec 2021 07:19:58 +0100 Subject: [PATCH 325/433] Optimize day 19 --- .../com/sbaars/adventofcode/year21/days/Day19.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java index 43d9bb29..b44f8887 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java @@ -45,18 +45,18 @@ protected Pair findScannerPositions() { orientation[0] = scanners[0][0]; position[0] = new Loc3D(0, 0, 0); - Queue frontier = new ArrayDeque<>(List.of(0)); + Queue queue = new ArrayDeque<>(List.of(0)); - while (!frontier.isEmpty()) { - var front = frontier.poll(); + while (!queue.isEmpty()) { + var num = queue.poll(); IntStream.range(0, scanners.length).filter(i -> position[i] != null).forEach(i -> { - var match = orientation[front].match(scanners[i]); + var match = orientation[num].match(scanners[i]); if (match.isPresent()) { orientation[i] = match.get().getLeft(); - Loc3D one = position[front]; + Loc3D one = position[num]; Loc3D two = match.get().getRight(); position[i] = new Loc3D(one.x + two.x, one.y + two.y, one.z + two.z); - frontier.add(i); + queue.add(i); } }); } @@ -86,7 +86,7 @@ public Scanner(Scanner other, int up, int rot) { private Optional findMatch(Scanner s) { return IntLoc.range(locs.size(), s.locs.size()) .map(l -> locs.get(l.x).distanceTo(s.locs.get(l.y))) - .filter(rel -> IntLoc.range(locs.size(), s.locs.size()).filter(l -> rel.sameDistance(locs.get(l.x), s.locs.get(l.y))).count() >= 12) + .filter(rel -> IntLoc.range(locs.size(), s.locs.size()).filter(l -> rel.sameDistance(locs.get(l.x), s.locs.get(l.y))).limit(12).count() == 12) .findFirst(); } From cb1b85e96c6b060a8e0b6e7331350a1f60bb7dc4 Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Sun, 26 Dec 2021 08:34:41 +0100 Subject: [PATCH 326/433] Fix Day 23 --- .../com/sbaars/adventofcode/year21/days/Day23.java | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day23.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day23.java index dc005493..8f6e3bac 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day23.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day23.java @@ -22,8 +22,7 @@ public Day23() { public static void main(String[] args) { new Day23().verify(); - new Day23().printParts(1); -// new Day23().part2(); + new Day23().printParts(); } public void verify(){ @@ -227,22 +226,16 @@ public int freeRoom(int forWaiting){ // Indexes of free waiting spots public int[] freeWaiting(int forRoom){ var seeminglyFree = IntStream.range(0, waiting.length).filter(e -> waiting[e] == -1).boxed().collect(Collectors.toCollection(HashSet::new)); - if(seeminglyFree.contains(0) && !seeminglyFree.contains(1)){ - seeminglyFree.remove(0); - } - if(seeminglyFree.contains(6) && !seeminglyFree.contains(5)){ - seeminglyFree.remove(6); - } int r = forRoom+1; for(int i = r; i>=0; i--){ - if(!seeminglyFree.contains(r)){ + if(!seeminglyFree.contains(i)){ int i2 = i; seeminglyFree.removeIf(x -> x x>i2); break; From ad09e3cf0b921bfcd4fd05d0b981b412401cb27f Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Mon, 27 Dec 2021 08:58:47 +0100 Subject: [PATCH 327/433] Optimize Day 19 --- .../adventofcode/year21/days/Day19.java | 48 +++++++++++++------ 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java index b44f8887..dbbe1651 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java @@ -9,7 +9,6 @@ import java.util.List; import java.util.Optional; import java.util.Queue; -import java.util.stream.IntStream; import org.apache.commons.lang3.tuple.Pair; public class Day19 extends Day2021 { @@ -49,16 +48,18 @@ protected Pair findScannerPositions() { while (!queue.isEmpty()) { var num = queue.poll(); - IntStream.range(0, scanners.length).filter(i -> position[i] != null).forEach(i -> { - var match = orientation[num].match(scanners[i]); - if (match.isPresent()) { - orientation[i] = match.get().getLeft(); - Loc3D one = position[num]; - Loc3D two = match.get().getRight(); - position[i] = new Loc3D(one.x + two.x, one.y + two.y, one.z + two.z); - queue.add(i); + for (int i = 0; i < scanners.length; i++) { + if (position[i] == null) { + var match = orientation[num].match(scanners[i]); + if (match.isPresent()) { + orientation[i] = match.get().getLeft(); + Loc3D one = position[num]; + Loc3D two = match.get().getRight(); + position[i] = new Loc3D(one.x + two.x, one.y + two.y, one.z + two.z); + queue.add(i); + } } - }); + } } var result = new Scanner(new ArrayList<>(orientation[0].locs)); @@ -84,10 +85,29 @@ public Scanner(Scanner other, int up, int rot) { } private Optional findMatch(Scanner s) { - return IntLoc.range(locs.size(), s.locs.size()) - .map(l -> locs.get(l.x).distanceTo(s.locs.get(l.y))) - .filter(rel -> IntLoc.range(locs.size(), s.locs.size()).filter(l -> rel.sameDistance(locs.get(l.x), s.locs.get(l.y))).limit(12).count() == 12) - .findFirst(); + for (int i = 0; i < locs.size(); i++) { + for (int j = 0; j < s.locs.size(); j++) { + var a = locs.get(i); + var b = s.locs.get(j); + var relx = b.x - a.x; + var rely = b.y - a.y; + var relz = b.z - a.z; + int count = 0; + for (int k = 0; k < locs.size(); k++) { + if ((count + locs.size() - k) < 12) break; + for (int l = 0; l < s.locs.size(); l++) { + var m = locs.get(k); + var n = s.locs.get(l); + if ((relx + m.x) == n.x && (rely + m.y) == n.y && (relz + m.z) == n.z) { + count++; + if (count >= 12) return Optional.of(new Loc3D(relx, rely, relz)); + break; + } + } + } + } + } + return Optional.empty(); } public Optional> match(Scanner[] other) { From 281bbe4ae1b701734899589bcf00f8e72234a0bd Mon Sep 17 00:00:00 2001 From: Simon Baars Date: Mon, 27 Dec 2021 09:00:54 +0100 Subject: [PATCH 328/433] Update README --- README.md | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/README.md b/README.md index c7ddd6c2..2618dd70 100644 --- a/README.md +++ b/README.md @@ -87,6 +87,55 @@ Part 2: 1 1 1 1 1 1 1 111 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1111 11 1 1 11 1 1 11 11 + + +Day 14: +Part 1: 3284 +Part 2: 4302675529689 + +Day 15: +Part 1: 741 +Part 2: 2976 + +Day 16: +Part 1: 871 +Part 2: 68703010504 + +Day 17: +Part 1: 8911 +Part 2: 4748 + +Day 18: +Part 1: 4207 +Part 2: 4635 + +Day 19: +Part 1: 326 +Part 2: 10630 + +Day 20: +Part 1: 5218 +Part 2: 15527 + +Day 21: +Part 1: 678468 +Part 2: 131180774190079 + +Day 22: +Part 1: 580810 +Part 2: 1265621119006734 + +Day 23: +Part 1: 13556 +Part 2: 54200 + +Day 24: +Part 1: 99799212949967 +Part 2: 34198111816311 + +Day 25: +Part 1: 441 +Part 2: Merry Christmas ``` ## 2020 From 881f50c1fed619b69a32714ac07b2711085877f7 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Wed, 30 Nov 2022 09:00:41 +0100 Subject: [PATCH 329/433] Add year 2022 from template --- .../sbaars/adventofcode/year22/Day2022.java | 9 +++++++ .../com/sbaars/adventofcode/year22/Main.java | 16 +++++++++++++ .../sbaars/adventofcode/year22/days/Day1.java | 24 +++++++++++++++++++ .../adventofcode/year22/days/Day10.java | 23 ++++++++++++++++++ .../adventofcode/year22/days/Day11.java | 23 ++++++++++++++++++ .../adventofcode/year22/days/Day12.java | 23 ++++++++++++++++++ .../adventofcode/year22/days/Day13.java | 23 ++++++++++++++++++ .../adventofcode/year22/days/Day14.java | 23 ++++++++++++++++++ .../adventofcode/year22/days/Day15.java | 23 ++++++++++++++++++ .../adventofcode/year22/days/Day16.java | 24 +++++++++++++++++++ .../adventofcode/year22/days/Day17.java | 23 ++++++++++++++++++ .../adventofcode/year22/days/Day18.java | 23 ++++++++++++++++++ .../adventofcode/year22/days/Day19.java | 24 +++++++++++++++++++ .../sbaars/adventofcode/year22/days/Day2.java | 23 ++++++++++++++++++ .../adventofcode/year22/days/Day20.java | 23 ++++++++++++++++++ .../adventofcode/year22/days/Day21.java | 23 ++++++++++++++++++ .../adventofcode/year22/days/Day22.java | 23 ++++++++++++++++++ .../adventofcode/year22/days/Day23.java | 23 ++++++++++++++++++ .../adventofcode/year22/days/Day24.java | 24 +++++++++++++++++++ .../adventofcode/year22/days/Day25.java | 23 ++++++++++++++++++ .../sbaars/adventofcode/year22/days/Day3.java | 23 ++++++++++++++++++ .../sbaars/adventofcode/year22/days/Day4.java | 24 +++++++++++++++++++ .../sbaars/adventofcode/year22/days/Day5.java | 24 +++++++++++++++++++ .../sbaars/adventofcode/year22/days/Day6.java | 24 +++++++++++++++++++ .../sbaars/adventofcode/year22/days/Day7.java | 24 +++++++++++++++++++ .../sbaars/adventofcode/year22/days/Day8.java | 24 +++++++++++++++++++ .../sbaars/adventofcode/year22/days/Day9.java | 23 ++++++++++++++++++ 27 files changed, 609 insertions(+) create mode 100644 src/main/java/com/sbaars/adventofcode/year22/Day2022.java create mode 100644 src/main/java/com/sbaars/adventofcode/year22/Main.java create mode 100644 src/main/java/com/sbaars/adventofcode/year22/days/Day1.java create mode 100644 src/main/java/com/sbaars/adventofcode/year22/days/Day10.java create mode 100644 src/main/java/com/sbaars/adventofcode/year22/days/Day11.java create mode 100644 src/main/java/com/sbaars/adventofcode/year22/days/Day12.java create mode 100644 src/main/java/com/sbaars/adventofcode/year22/days/Day13.java create mode 100644 src/main/java/com/sbaars/adventofcode/year22/days/Day14.java create mode 100644 src/main/java/com/sbaars/adventofcode/year22/days/Day15.java create mode 100644 src/main/java/com/sbaars/adventofcode/year22/days/Day16.java create mode 100644 src/main/java/com/sbaars/adventofcode/year22/days/Day17.java create mode 100644 src/main/java/com/sbaars/adventofcode/year22/days/Day18.java create mode 100644 src/main/java/com/sbaars/adventofcode/year22/days/Day19.java create mode 100644 src/main/java/com/sbaars/adventofcode/year22/days/Day2.java create mode 100644 src/main/java/com/sbaars/adventofcode/year22/days/Day20.java create mode 100644 src/main/java/com/sbaars/adventofcode/year22/days/Day21.java create mode 100644 src/main/java/com/sbaars/adventofcode/year22/days/Day22.java create mode 100644 src/main/java/com/sbaars/adventofcode/year22/days/Day23.java create mode 100644 src/main/java/com/sbaars/adventofcode/year22/days/Day24.java create mode 100644 src/main/java/com/sbaars/adventofcode/year22/days/Day25.java create mode 100644 src/main/java/com/sbaars/adventofcode/year22/days/Day3.java create mode 100644 src/main/java/com/sbaars/adventofcode/year22/days/Day4.java create mode 100644 src/main/java/com/sbaars/adventofcode/year22/days/Day5.java create mode 100644 src/main/java/com/sbaars/adventofcode/year22/days/Day6.java create mode 100644 src/main/java/com/sbaars/adventofcode/year22/days/Day7.java create mode 100644 src/main/java/com/sbaars/adventofcode/year22/days/Day8.java create mode 100644 src/main/java/com/sbaars/adventofcode/year22/days/Day9.java diff --git a/src/main/java/com/sbaars/adventofcode/year22/Day2022.java b/src/main/java/com/sbaars/adventofcode/year22/Day2022.java new file mode 100644 index 00000000..a50a8f11 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year22/Day2022.java @@ -0,0 +1,9 @@ +package com.sbaars.adventofcode.year22; + +import com.sbaars.adventofcode.common.Day; + +public abstract class Day2022 extends Day { + protected Day2022(int day) { + super(2022, day); + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year22/Main.java b/src/main/java/com/sbaars/adventofcode/year22/Main.java new file mode 100644 index 00000000..caf6be12 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year22/Main.java @@ -0,0 +1,16 @@ +package com.sbaars.adventofcode.year22; + +import com.sbaars.adventofcode.common.Day; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; + +public class Main { + public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException, InvocationTargetException, NoSuchMethodException { + for (int day = 1; day <= 25; day++) { + System.out.println("Day " + day + ":"); + Day instance = (Day) Class.forName("com.sbaars.adventofcode.year22.days.Day" + day).getDeclaredConstructor().newInstance(); + instance.printParts(); + System.out.println(); + } + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day1.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day1.java new file mode 100644 index 00000000..c2d680e3 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day1.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year22.days; + +import com.sbaars.adventofcode.year22.Day2022; + +public class Day1 extends Day2022 { + public Day1() { + super(1); + } + + public static void main(String[] args) { + new Day1().printParts(); + } + + @Override + public Object part1() { + String input = day(); + return input; + } + + @Override + public Object part2() { + return 0; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java new file mode 100644 index 00000000..b06f0579 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year22.days; + +import com.sbaars.adventofcode.year22.Day2022; + +public class Day10 extends Day2022 { + public Day10() { + super(10); + } + + public static void main(String[] args) { + new Day10().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day11.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day11.java new file mode 100644 index 00000000..3d383f7b --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day11.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year22.days; + +import com.sbaars.adventofcode.year22.Day2022; + +public class Day11 extends Day2022 { + public Day11() { + super(11); + } + + public static void main(String[] args) { + new Day11().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day12.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day12.java new file mode 100644 index 00000000..37f244f3 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day12.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year22.days; + +import com.sbaars.adventofcode.year22.Day2022; + +public class Day12 extends Day2022 { + public Day12() { + super(12); + } + + public static void main(String[] args) { + new Day12().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java new file mode 100644 index 00000000..25c1cf90 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year22.days; + +import com.sbaars.adventofcode.year22.Day2022; + +public class Day13 extends Day2022 { + public Day13() { + super(13); + } + + public static void main(String[] args) { + new Day13().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java new file mode 100644 index 00000000..c1b89b9c --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year22.days; + +import com.sbaars.adventofcode.year22.Day2022; + +public class Day14 extends Day2022 { + public Day14() { + super(14); + } + + public static void main(String[] args) { + new Day14().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java new file mode 100644 index 00000000..6a223f69 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year22.days; + +import com.sbaars.adventofcode.year22.Day2022; + +public class Day15 extends Day2022 { + public Day15() { + super(15); + } + + public static void main(String[] args) { + new Day15().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java new file mode 100644 index 00000000..40211dca --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year22.days; + +import com.sbaars.adventofcode.year22.Day2022; + +public class Day16 extends Day2022 { + + public Day16() { + super(16); + } + + public static void main(String[] args) { + new Day16().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day17.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day17.java new file mode 100644 index 00000000..070b33db --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day17.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year22.days; + +import com.sbaars.adventofcode.year22.Day2022; + +public class Day17 extends Day2022 { + public Day17() { + super(17); + } + + public static void main(String[] args) { + new Day17().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day18.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day18.java new file mode 100644 index 00000000..f192020d --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day18.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year22.days; + +import com.sbaars.adventofcode.year22.Day2022; + +public class Day18 extends Day2022 { + public Day18() { + super(18); + } + + public static void main(String[] args) { + new Day18().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day19.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day19.java new file mode 100644 index 00000000..2ee9868d --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day19.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year22.days; + +import com.sbaars.adventofcode.year22.Day2022; + +public class Day19 extends Day2022 { + + public Day19() { + super(19); + } + + public static void main(String[] args) { + new Day19().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day2.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day2.java new file mode 100644 index 00000000..43cb0aaa --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day2.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year22.days; + +import com.sbaars.adventofcode.year22.Day2022; + +public class Day2 extends Day2022 { + public Day2() { + super(2); + } + + public static void main(String[] args) { + new Day2().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day20.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day20.java new file mode 100644 index 00000000..435a7209 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day20.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year22.days; + +import com.sbaars.adventofcode.template.Day1999; + +public class Day20 extends Day1999 { + public Day20() { + super(20); + } + + public static void main(String[] args) { + new Day20().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day21.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day21.java new file mode 100644 index 00000000..a491a4e7 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day21.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year22.days; + +import com.sbaars.adventofcode.year22.Day2022; + +public class Day21 extends Day2022 { + public Day21() { + super(21); + } + + public static void main(String[] args) { + new Day21().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day22.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day22.java new file mode 100644 index 00000000..34342f2f --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day22.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year22.days; + +import com.sbaars.adventofcode.year22.Day2022; + +public class Day22 extends Day2022 { + public Day22() { + super(22); + } + + public static void main(String[] args) { + new Day22().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day23.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day23.java new file mode 100644 index 00000000..4e2345e3 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day23.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year22.days; + +import com.sbaars.adventofcode.year22.Day2022; + +public class Day23 extends Day2022 { + public Day23() { + super(23); + } + + public static void main(String[] args) { + new Day23().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day24.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day24.java new file mode 100644 index 00000000..46c40a18 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day24.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year22.days; + +import com.sbaars.adventofcode.year22.Day2022; + +public class Day24 extends Day2022 { + + public Day24() { + super(24); + } + + public static void main(String[] args) { + new Day24().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day25.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day25.java new file mode 100644 index 00000000..e992d504 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day25.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year22.days; + +import com.sbaars.adventofcode.year22.Day2022; + +public class Day25 extends Day2022 { + public Day25() { + super(25); + } + + public static void main(String[] args) { + new Day25().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day3.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day3.java new file mode 100644 index 00000000..c4cc9eb2 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day3.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year22.days; + +import com.sbaars.adventofcode.year22.Day2022; + +public class Day3 extends Day2022 { + public Day3() { + super(3); + } + + public static void main(String[] args) { + new Day3().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day4.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day4.java new file mode 100644 index 00000000..ceba51c2 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day4.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year22.days; + +import com.sbaars.adventofcode.year22.Day2022; + +public class Day4 extends Day2022 { + + public Day4() { + super(4); + } + + public static void main(String[] args) { + new Day4().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day5.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day5.java new file mode 100644 index 00000000..af6ea780 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day5.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year22.days; + +import com.sbaars.adventofcode.year22.Day2022; + +public class Day5 extends Day2022 { + + public Day5() { + super(5); + } + + public static void main(String[] args) { + new Day5().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day6.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day6.java new file mode 100644 index 00000000..f3e588bd --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day6.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year22.days; + +import com.sbaars.adventofcode.year22.Day2022; + +public class Day6 extends Day2022 { + + public Day6() { + super(6); + } + + public static void main(String[] args) { + new Day6().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day7.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day7.java new file mode 100644 index 00000000..3102ea3b --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day7.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year22.days; + +import com.sbaars.adventofcode.year22.Day2022; + +public class Day7 extends Day2022 { + + public Day7() { + super(7); + } + + public static void main(String[] args) { + new Day7().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day8.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day8.java new file mode 100644 index 00000000..e5304204 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day8.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year22.days; + +import com.sbaars.adventofcode.year22.Day2022; + +public class Day8 extends Day2022 { + + public Day8() { + super(8); + } + + public static void main(String[] args) { + new Day8().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day9.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day9.java new file mode 100644 index 00000000..35cdd142 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day9.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year22.days; + +import com.sbaars.adventofcode.year22.Day2022; + +public class Day9 extends Day2022 { + public Day9() { + super(9); + } + + public static void main(String[] args) { + new Day9().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} From 1db4c945fcfd89290dfdb10b56c81a8b3760929d Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Wed, 30 Nov 2022 09:00:56 +0100 Subject: [PATCH 330/433] Automated resource downloading --- .../com/sbaars/adventofcode/common/Day.java | 26 +++++++++++++---- .../sbaars/adventofcode/util/FetchInput.java | 28 +++++++++---------- .../adventofcode/year21/days/Day25.java | 5 +++- 3 files changed, 39 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/common/Day.java b/src/main/java/com/sbaars/adventofcode/common/Day.java index 70bfe486..67ac58b3 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Day.java +++ b/src/main/java/com/sbaars/adventofcode/common/Day.java @@ -1,8 +1,8 @@ package com.sbaars.adventofcode.common; -import static org.apache.commons.io.FileUtils.readFileToString; - +import com.sbaars.adventofcode.util.FetchInput; import com.sbaars.adventofcode.util.Submit; + import java.io.File; import java.io.IOException; import java.util.Arrays; @@ -10,6 +10,8 @@ import java.util.stream.LongStream; import java.util.stream.Stream; +import static org.apache.commons.io.FileUtils.readFileToString; + public abstract class Day { public static final String DEFAULT_DELIMITER = "\n"; protected final int year; @@ -23,12 +25,21 @@ public Day(int year, int day) { public static String getResourceAsString(String resource) { try { - return readFileToString(new File(Day.class.getClassLoader().getResource(resource).getFile())); + return readFileToString(getResource(resource)); } catch (IOException e) { throw new IllegalStateException(e); } } + public static File getResource(String path) { + return new File("src/main/resources/"+path); + } + + private String getDayPath() { + boolean b = example != 0; + return year + (b ? "-examples" : "") + "/day" + day + (b ? "-" + example : "") + ".txt"; + } + public abstract Object part1(); public abstract Object part2(); @@ -53,8 +64,7 @@ public void submitPart2() { } protected String day() { - boolean b = example != 0; - return getResourceAsString(year + (b ? "-examples" : "") + "/day" + day + (b ? "-" + example : "") + ".txt"); + return getResourceAsString(getDayPath()); } protected String[] dayStrings() { @@ -112,4 +122,10 @@ protected char[][] dayGrid() { protected char[][] dayGrid(String delimiter) { return dayStream(delimiter).map(String::toCharArray).toArray(char[][]::new); } + + public void downloadIfNotDownloaded() { + if(!getResource(getDayPath()).exists()) { + new FetchInput().retrieveInput(Integer.toString(day), Integer.toString(year)); + } + } } diff --git a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java index 1addaa26..c4ce557e 100644 --- a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java +++ b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java @@ -1,5 +1,16 @@ package com.sbaars.adventofcode.util; +import org.apache.commons.io.FileUtils; +import org.htmlcleaner.CleanerProperties; +import org.htmlcleaner.DomSerializer; +import org.htmlcleaner.HtmlCleaner; +import org.htmlcleaner.TagNode; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathFactory; import java.io.File; import java.io.IOException; import java.net.URI; @@ -8,21 +19,11 @@ import java.net.http.HttpResponse; import java.util.List; import java.util.stream.IntStream; -import javax.xml.xpath.XPath; -import javax.xml.xpath.XPathConstants; -import javax.xml.xpath.XPathFactory; -import org.apache.commons.io.FileUtils; -import org.htmlcleaner.CleanerProperties; -import org.htmlcleaner.DomSerializer; -import org.htmlcleaner.HtmlCleaner; -import org.htmlcleaner.TagNode; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; public class FetchInput { private final HttpClient client; - private FetchInput() { + public FetchInput() { this.client = WebClient.getClient(); } @@ -59,7 +60,7 @@ private void runForYear(String year) { } } - private void retrieveInput(String day, String year) { + public void retrieveInput(String day, String year) { File dayFile = getFile(day, year); dayFile.getParentFile().mkdirs(); if (!dayFile.exists()) { @@ -86,8 +87,7 @@ private File getResource(String path) { private List getMatchesByXpath(String html, String xpath) { try { TagNode tagNode = new HtmlCleaner().clean(html); - org.w3c.dom.Document doc = new DomSerializer( - new CleanerProperties()).createDOM(tagNode); + org.w3c.dom.Document doc = new DomSerializer(new CleanerProperties()).createDOM(tagNode); XPath xpathObj = XPathFactory.newInstance().newXPath(); NodeList matches = (NodeList) xpathObj.evaluate(xpath, doc, XPathConstants.NODESET); diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day25.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day25.java index 79c0e14c..2e05a2a4 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day25.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day25.java @@ -1,5 +1,6 @@ package com.sbaars.adventofcode.year21.days; +import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.common.grid.CharGrid; import com.sbaars.adventofcode.year21.Day2021; @@ -9,7 +10,9 @@ public Day25() { } public static void main(String[] args) { - new Day25().printParts(); + Day d = new Day25(); + d.downloadIfNotDownloaded(); + d.printParts(); } @Override From a40802640e99c37d9139816070bba066c9d90600 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Wed, 30 Nov 2022 09:01:47 +0100 Subject: [PATCH 331/433] Append README --- .gitignore | 1 + README.md | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/.gitignore b/.gitignore index b5de45b6..9e31d704 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.idea target/ pom.xml.tag pom.xml.releaseBackup diff --git a/README.md b/README.md index 2618dd70..f46a5a17 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,33 @@ # adventOfCode(Language.JAVA) +## 2022 +### Days +- [Day 1](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year22/days/Day1.java) +- [Day 2](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year22/days/Day2.java) +- [Day 3](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year22/days/Day3.java) +- [Day 4](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year22/days/Day4.java) +- [Day 5](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year22/days/Day5.java) +- [Day 6](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year22/days/Day6.java) +- [Day 7](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year22/days/Day7.java) +- [Day 8](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year22/days/Day8.java) +- [Day 9](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year22/days/Day9.java) +- [Day 10](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java) +- [Day 11](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year22/days/Day11.java) +- [Day 12](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year22/days/Day12.java) +- [Day 13](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java) +- [Day 14](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java) +- [Day 15](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java) +- [Day 16](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java) +- [Day 17](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year22/days/Day17.java) +- [Day 18](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year22/days/Day18.java) +- [Day 19](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year22/days/Day19.java) +- [Day 20](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year22/days/Day20.java) +- [Day 21](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year22/days/Day21.java) +- [Day 22](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year22/days/Day22.java) +- [Day 23](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year22/days/Day23.java) +- [Day 24](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year22/days/Day24.java) +- [Day 25](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year22/days/Day25.java) + ## 2021 ### Days - [Day 1](https://github.com/SimonBaars/AdventOfCode-Java/blob/master/src/main/java/com/sbaars/adventofcode/year21/days/Day1.java) From ad47375a1ef0f2c02336f3869018457f54906060 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Wed, 30 Nov 2022 18:15:33 +0100 Subject: [PATCH 332/433] Add older years --- .../sbaars/adventofcode/year15/Day2015.java | 9 +++++ .../com/sbaars/adventofcode/year15/Main.java | 17 ++++++++++ .../sbaars/adventofcode/year15/days/Day1.java | 24 +++++++++++++ .../adventofcode/year15/days/Day10.java | 23 +++++++++++++ .../adventofcode/year15/days/Day11.java | 23 +++++++++++++ .../adventofcode/year15/days/Day12.java | 23 +++++++++++++ .../adventofcode/year15/days/Day13.java | 23 +++++++++++++ .../adventofcode/year15/days/Day14.java | 23 +++++++++++++ .../adventofcode/year15/days/Day15.java | 23 +++++++++++++ .../adventofcode/year15/days/Day16.java | 24 +++++++++++++ .../adventofcode/year15/days/Day17.java | 23 +++++++++++++ .../adventofcode/year15/days/Day18.java | 23 +++++++++++++ .../adventofcode/year15/days/Day19.java | 24 +++++++++++++ .../sbaars/adventofcode/year15/days/Day2.java | 23 +++++++++++++ .../adventofcode/year15/days/Day20.java | 23 +++++++++++++ .../adventofcode/year15/days/Day21.java | 23 +++++++++++++ .../adventofcode/year15/days/Day22.java | 23 +++++++++++++ .../adventofcode/year15/days/Day23.java | 23 +++++++++++++ .../adventofcode/year15/days/Day24.java | 24 +++++++++++++ .../adventofcode/year15/days/Day25.java | 23 +++++++++++++ .../sbaars/adventofcode/year15/days/Day3.java | 23 +++++++++++++ .../sbaars/adventofcode/year15/days/Day4.java | 24 +++++++++++++ .../sbaars/adventofcode/year15/days/Day5.java | 24 +++++++++++++ .../sbaars/adventofcode/year15/days/Day6.java | 24 +++++++++++++ .../sbaars/adventofcode/year15/days/Day7.java | 24 +++++++++++++ .../sbaars/adventofcode/year15/days/Day8.java | 24 +++++++++++++ .../sbaars/adventofcode/year15/days/Day9.java | 23 +++++++++++++ .../sbaars/adventofcode/year16/Day2016.java | 9 +++++ .../com/sbaars/adventofcode/year16/Main.java | 17 ++++++++++ .../sbaars/adventofcode/year16/days/Day1.java | 24 +++++++++++++ .../adventofcode/year16/days/Day10.java | 23 +++++++++++++ .../adventofcode/year16/days/Day11.java | 23 +++++++++++++ .../adventofcode/year16/days/Day12.java | 23 +++++++++++++ .../adventofcode/year16/days/Day13.java | 23 +++++++++++++ .../adventofcode/year16/days/Day14.java | 23 +++++++++++++ .../adventofcode/year16/days/Day15.java | 23 +++++++++++++ .../adventofcode/year16/days/Day16.java | 24 +++++++++++++ .../adventofcode/year16/days/Day17.java | 23 +++++++++++++ .../adventofcode/year16/days/Day18.java | 23 +++++++++++++ .../adventofcode/year16/days/Day19.java | 24 +++++++++++++ .../sbaars/adventofcode/year16/days/Day2.java | 23 +++++++++++++ .../adventofcode/year16/days/Day20.java | 23 +++++++++++++ .../adventofcode/year16/days/Day21.java | 23 +++++++++++++ .../adventofcode/year16/days/Day22.java | 23 +++++++++++++ .../adventofcode/year16/days/Day23.java | 23 +++++++++++++ .../adventofcode/year16/days/Day24.java | 24 +++++++++++++ .../adventofcode/year16/days/Day25.java | 23 +++++++++++++ .../sbaars/adventofcode/year16/days/Day3.java | 23 +++++++++++++ .../sbaars/adventofcode/year16/days/Day4.java | 24 +++++++++++++ .../sbaars/adventofcode/year16/days/Day5.java | 24 +++++++++++++ .../sbaars/adventofcode/year16/days/Day6.java | 24 +++++++++++++ .../sbaars/adventofcode/year16/days/Day7.java | 24 +++++++++++++ .../sbaars/adventofcode/year16/days/Day8.java | 24 +++++++++++++ .../sbaars/adventofcode/year16/days/Day9.java | 23 +++++++++++++ .../sbaars/adventofcode/year17/Day2017.java | 9 +++++ .../com/sbaars/adventofcode/year17/Main.java | 17 ++++++++++ .../sbaars/adventofcode/year17/days/Day1.java | 34 +++++++++++++++++++ .../adventofcode/year17/days/Day10.java | 23 +++++++++++++ .../adventofcode/year17/days/Day11.java | 23 +++++++++++++ .../adventofcode/year17/days/Day12.java | 23 +++++++++++++ .../adventofcode/year17/days/Day13.java | 23 +++++++++++++ .../adventofcode/year17/days/Day14.java | 23 +++++++++++++ .../adventofcode/year17/days/Day15.java | 23 +++++++++++++ .../adventofcode/year17/days/Day16.java | 24 +++++++++++++ .../adventofcode/year17/days/Day17.java | 23 +++++++++++++ .../adventofcode/year17/days/Day18.java | 23 +++++++++++++ .../adventofcode/year17/days/Day19.java | 24 +++++++++++++ .../sbaars/adventofcode/year17/days/Day2.java | 23 +++++++++++++ .../adventofcode/year17/days/Day20.java | 23 +++++++++++++ .../adventofcode/year17/days/Day21.java | 23 +++++++++++++ .../adventofcode/year17/days/Day22.java | 23 +++++++++++++ .../adventofcode/year17/days/Day23.java | 23 +++++++++++++ .../adventofcode/year17/days/Day24.java | 24 +++++++++++++ .../adventofcode/year17/days/Day25.java | 23 +++++++++++++ .../sbaars/adventofcode/year17/days/Day3.java | 23 +++++++++++++ .../sbaars/adventofcode/year17/days/Day4.java | 24 +++++++++++++ .../sbaars/adventofcode/year17/days/Day5.java | 24 +++++++++++++ .../sbaars/adventofcode/year17/days/Day6.java | 24 +++++++++++++ .../sbaars/adventofcode/year17/days/Day7.java | 24 +++++++++++++ .../sbaars/adventofcode/year17/days/Day8.java | 24 +++++++++++++ .../sbaars/adventofcode/year17/days/Day9.java | 23 +++++++++++++ .../sbaars/adventofcode/year22/days/Day1.java | 16 +++++++-- 82 files changed, 1853 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode/year15/Day2015.java create mode 100644 src/main/java/com/sbaars/adventofcode/year15/Main.java create mode 100644 src/main/java/com/sbaars/adventofcode/year15/days/Day1.java create mode 100644 src/main/java/com/sbaars/adventofcode/year15/days/Day10.java create mode 100644 src/main/java/com/sbaars/adventofcode/year15/days/Day11.java create mode 100644 src/main/java/com/sbaars/adventofcode/year15/days/Day12.java create mode 100644 src/main/java/com/sbaars/adventofcode/year15/days/Day13.java create mode 100644 src/main/java/com/sbaars/adventofcode/year15/days/Day14.java create mode 100644 src/main/java/com/sbaars/adventofcode/year15/days/Day15.java create mode 100644 src/main/java/com/sbaars/adventofcode/year15/days/Day16.java create mode 100644 src/main/java/com/sbaars/adventofcode/year15/days/Day17.java create mode 100644 src/main/java/com/sbaars/adventofcode/year15/days/Day18.java create mode 100644 src/main/java/com/sbaars/adventofcode/year15/days/Day19.java create mode 100644 src/main/java/com/sbaars/adventofcode/year15/days/Day2.java create mode 100644 src/main/java/com/sbaars/adventofcode/year15/days/Day20.java create mode 100644 src/main/java/com/sbaars/adventofcode/year15/days/Day21.java create mode 100644 src/main/java/com/sbaars/adventofcode/year15/days/Day22.java create mode 100644 src/main/java/com/sbaars/adventofcode/year15/days/Day23.java create mode 100644 src/main/java/com/sbaars/adventofcode/year15/days/Day24.java create mode 100644 src/main/java/com/sbaars/adventofcode/year15/days/Day25.java create mode 100644 src/main/java/com/sbaars/adventofcode/year15/days/Day3.java create mode 100644 src/main/java/com/sbaars/adventofcode/year15/days/Day4.java create mode 100644 src/main/java/com/sbaars/adventofcode/year15/days/Day5.java create mode 100644 src/main/java/com/sbaars/adventofcode/year15/days/Day6.java create mode 100644 src/main/java/com/sbaars/adventofcode/year15/days/Day7.java create mode 100644 src/main/java/com/sbaars/adventofcode/year15/days/Day8.java create mode 100644 src/main/java/com/sbaars/adventofcode/year15/days/Day9.java create mode 100644 src/main/java/com/sbaars/adventofcode/year16/Day2016.java create mode 100644 src/main/java/com/sbaars/adventofcode/year16/Main.java create mode 100644 src/main/java/com/sbaars/adventofcode/year16/days/Day1.java create mode 100644 src/main/java/com/sbaars/adventofcode/year16/days/Day10.java create mode 100644 src/main/java/com/sbaars/adventofcode/year16/days/Day11.java create mode 100644 src/main/java/com/sbaars/adventofcode/year16/days/Day12.java create mode 100644 src/main/java/com/sbaars/adventofcode/year16/days/Day13.java create mode 100644 src/main/java/com/sbaars/adventofcode/year16/days/Day14.java create mode 100644 src/main/java/com/sbaars/adventofcode/year16/days/Day15.java create mode 100644 src/main/java/com/sbaars/adventofcode/year16/days/Day16.java create mode 100644 src/main/java/com/sbaars/adventofcode/year16/days/Day17.java create mode 100644 src/main/java/com/sbaars/adventofcode/year16/days/Day18.java create mode 100644 src/main/java/com/sbaars/adventofcode/year16/days/Day19.java create mode 100644 src/main/java/com/sbaars/adventofcode/year16/days/Day2.java create mode 100644 src/main/java/com/sbaars/adventofcode/year16/days/Day20.java create mode 100644 src/main/java/com/sbaars/adventofcode/year16/days/Day21.java create mode 100644 src/main/java/com/sbaars/adventofcode/year16/days/Day22.java create mode 100644 src/main/java/com/sbaars/adventofcode/year16/days/Day23.java create mode 100644 src/main/java/com/sbaars/adventofcode/year16/days/Day24.java create mode 100644 src/main/java/com/sbaars/adventofcode/year16/days/Day25.java create mode 100644 src/main/java/com/sbaars/adventofcode/year16/days/Day3.java create mode 100644 src/main/java/com/sbaars/adventofcode/year16/days/Day4.java create mode 100644 src/main/java/com/sbaars/adventofcode/year16/days/Day5.java create mode 100644 src/main/java/com/sbaars/adventofcode/year16/days/Day6.java create mode 100644 src/main/java/com/sbaars/adventofcode/year16/days/Day7.java create mode 100644 src/main/java/com/sbaars/adventofcode/year16/days/Day8.java create mode 100644 src/main/java/com/sbaars/adventofcode/year16/days/Day9.java create mode 100644 src/main/java/com/sbaars/adventofcode/year17/Day2017.java create mode 100644 src/main/java/com/sbaars/adventofcode/year17/Main.java create mode 100644 src/main/java/com/sbaars/adventofcode/year17/days/Day1.java create mode 100644 src/main/java/com/sbaars/adventofcode/year17/days/Day10.java create mode 100644 src/main/java/com/sbaars/adventofcode/year17/days/Day11.java create mode 100644 src/main/java/com/sbaars/adventofcode/year17/days/Day12.java create mode 100644 src/main/java/com/sbaars/adventofcode/year17/days/Day13.java create mode 100644 src/main/java/com/sbaars/adventofcode/year17/days/Day14.java create mode 100644 src/main/java/com/sbaars/adventofcode/year17/days/Day15.java create mode 100644 src/main/java/com/sbaars/adventofcode/year17/days/Day16.java create mode 100644 src/main/java/com/sbaars/adventofcode/year17/days/Day17.java create mode 100644 src/main/java/com/sbaars/adventofcode/year17/days/Day18.java create mode 100644 src/main/java/com/sbaars/adventofcode/year17/days/Day19.java create mode 100644 src/main/java/com/sbaars/adventofcode/year17/days/Day2.java create mode 100644 src/main/java/com/sbaars/adventofcode/year17/days/Day20.java create mode 100644 src/main/java/com/sbaars/adventofcode/year17/days/Day21.java create mode 100644 src/main/java/com/sbaars/adventofcode/year17/days/Day22.java create mode 100644 src/main/java/com/sbaars/adventofcode/year17/days/Day23.java create mode 100644 src/main/java/com/sbaars/adventofcode/year17/days/Day24.java create mode 100644 src/main/java/com/sbaars/adventofcode/year17/days/Day25.java create mode 100644 src/main/java/com/sbaars/adventofcode/year17/days/Day3.java create mode 100644 src/main/java/com/sbaars/adventofcode/year17/days/Day4.java create mode 100644 src/main/java/com/sbaars/adventofcode/year17/days/Day5.java create mode 100644 src/main/java/com/sbaars/adventofcode/year17/days/Day6.java create mode 100644 src/main/java/com/sbaars/adventofcode/year17/days/Day7.java create mode 100644 src/main/java/com/sbaars/adventofcode/year17/days/Day8.java create mode 100644 src/main/java/com/sbaars/adventofcode/year17/days/Day9.java diff --git a/src/main/java/com/sbaars/adventofcode/year15/Day2015.java b/src/main/java/com/sbaars/adventofcode/year15/Day2015.java new file mode 100644 index 00000000..86dd403a --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year15/Day2015.java @@ -0,0 +1,9 @@ +package com.sbaars.adventofcode.year15; + +import com.sbaars.adventofcode.common.Day; + +public abstract class Day2015 extends Day { + protected Day2015(int day) { + super(2015, day); + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year15/Main.java b/src/main/java/com/sbaars/adventofcode/year15/Main.java new file mode 100644 index 00000000..edb2a861 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year15/Main.java @@ -0,0 +1,17 @@ +package com.sbaars.adventofcode.year15; + +import com.sbaars.adventofcode.common.Day; + +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; + +public class Main { + public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException, InvocationTargetException, NoSuchMethodException { + for (int day = 1; day <= 25; day++) { + System.out.println("Day " + day + ":"); + Day instance = (Day) Class.forName("com.sbaars.adventofcode.year21.days.Day" + day).getDeclaredConstructor().newInstance(); + instance.printParts(); + System.out.println(); + } + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year15/days/Day1.java b/src/main/java/com/sbaars/adventofcode/year15/days/Day1.java new file mode 100644 index 00000000..f9563ecc --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year15/days/Day1.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year15.days; + +import com.sbaars.adventofcode.year15.Day2015; + +public class Day1 extends Day2015 { + public Day1() { + super(1); + } + + public static void main(String[] args) { + new Day1().printParts(); + } + + @Override + public Object part1() { + String input = day(); + return input; + } + + @Override + public Object part2() { + return 0; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year15/days/Day10.java b/src/main/java/com/sbaars/adventofcode/year15/days/Day10.java new file mode 100644 index 00000000..8f575ed9 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year15/days/Day10.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year15.days; + +import com.sbaars.adventofcode.year15.Day2015; + +public class Day10 extends Day2015 { + public Day10() { + super(10); + } + + public static void main(String[] args) { + new Day10().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year15/days/Day11.java b/src/main/java/com/sbaars/adventofcode/year15/days/Day11.java new file mode 100644 index 00000000..1a99c37f --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year15/days/Day11.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year15.days; + +import com.sbaars.adventofcode.year15.Day2015; + +public class Day11 extends Day2015 { + public Day11() { + super(11); + } + + public static void main(String[] args) { + new Day11().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year15/days/Day12.java b/src/main/java/com/sbaars/adventofcode/year15/days/Day12.java new file mode 100644 index 00000000..39ee1a63 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year15/days/Day12.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year15.days; + +import com.sbaars.adventofcode.year15.Day2015; + +public class Day12 extends Day2015 { + public Day12() { + super(12); + } + + public static void main(String[] args) { + new Day12().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year15/days/Day13.java b/src/main/java/com/sbaars/adventofcode/year15/days/Day13.java new file mode 100644 index 00000000..7feb42c8 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year15/days/Day13.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year15.days; + +import com.sbaars.adventofcode.year15.Day2015; + +public class Day13 extends Day2015 { + public Day13() { + super(13); + } + + public static void main(String[] args) { + new Day13().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year15/days/Day14.java b/src/main/java/com/sbaars/adventofcode/year15/days/Day14.java new file mode 100644 index 00000000..d3511576 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year15/days/Day14.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year15.days; + +import com.sbaars.adventofcode.year15.Day2015; + +public class Day14 extends Day2015 { + public Day14() { + super(14); + } + + public static void main(String[] args) { + new Day14().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year15/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year15/days/Day15.java new file mode 100644 index 00000000..f61da8dc --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year15/days/Day15.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year15.days; + +import com.sbaars.adventofcode.year15.Day2015; + +public class Day15 extends Day2015 { + public Day15() { + super(15); + } + + public static void main(String[] args) { + new Day15().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year15/days/Day16.java b/src/main/java/com/sbaars/adventofcode/year15/days/Day16.java new file mode 100644 index 00000000..f270e96d --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year15/days/Day16.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year15.days; + +import com.sbaars.adventofcode.year15.Day2015; + +public class Day16 extends Day2015 { + + public Day16() { + super(16); + } + + public static void main(String[] args) { + new Day16().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year15/days/Day17.java b/src/main/java/com/sbaars/adventofcode/year15/days/Day17.java new file mode 100644 index 00000000..2068921c --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year15/days/Day17.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year15.days; + +import com.sbaars.adventofcode.year15.Day2015; + +public class Day17 extends Day2015 { + public Day17() { + super(17); + } + + public static void main(String[] args) { + new Day17().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year15/days/Day18.java b/src/main/java/com/sbaars/adventofcode/year15/days/Day18.java new file mode 100644 index 00000000..9fd88e21 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year15/days/Day18.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year15.days; + +import com.sbaars.adventofcode.year15.Day2015; + +public class Day18 extends Day2015 { + public Day18() { + super(18); + } + + public static void main(String[] args) { + new Day18().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year15/days/Day19.java b/src/main/java/com/sbaars/adventofcode/year15/days/Day19.java new file mode 100644 index 00000000..3c426792 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year15/days/Day19.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year15.days; + +import com.sbaars.adventofcode.year15.Day2015; + +public class Day19 extends Day2015 { + + public Day19() { + super(19); + } + + public static void main(String[] args) { + new Day19().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year15/days/Day2.java b/src/main/java/com/sbaars/adventofcode/year15/days/Day2.java new file mode 100644 index 00000000..8b563e2f --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year15/days/Day2.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year15.days; + +import com.sbaars.adventofcode.year15.Day2015; + +public class Day2 extends Day2015 { + public Day2() { + super(2); + } + + public static void main(String[] args) { + new Day2().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year15/days/Day20.java b/src/main/java/com/sbaars/adventofcode/year15/days/Day20.java new file mode 100644 index 00000000..5552b813 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year15/days/Day20.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year15.days; + +import com.sbaars.adventofcode.year15.Day2015; + +public class Day20 extends Day2015 { + public Day20() { + super(20); + } + + public static void main(String[] args) { + new Day20().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year15/days/Day21.java b/src/main/java/com/sbaars/adventofcode/year15/days/Day21.java new file mode 100644 index 00000000..9982b887 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year15/days/Day21.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year15.days; + +import com.sbaars.adventofcode.year15.Day2015; + +public class Day21 extends Day2015 { + public Day21() { + super(21); + } + + public static void main(String[] args) { + new Day21().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year15/days/Day22.java b/src/main/java/com/sbaars/adventofcode/year15/days/Day22.java new file mode 100644 index 00000000..e2d1ed48 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year15/days/Day22.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year15.days; + +import com.sbaars.adventofcode.year15.Day2015; + +public class Day22 extends Day2015 { + public Day22() { + super(22); + } + + public static void main(String[] args) { + new Day22().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year15/days/Day23.java b/src/main/java/com/sbaars/adventofcode/year15/days/Day23.java new file mode 100644 index 00000000..3f70a59d --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year15/days/Day23.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year15.days; + +import com.sbaars.adventofcode.year15.Day2015; + +public class Day23 extends Day2015 { + public Day23() { + super(23); + } + + public static void main(String[] args) { + new Day23().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year15/days/Day24.java b/src/main/java/com/sbaars/adventofcode/year15/days/Day24.java new file mode 100644 index 00000000..a7cd1785 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year15/days/Day24.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year15.days; + +import com.sbaars.adventofcode.year15.Day2015; + +public class Day24 extends Day2015 { + + public Day24() { + super(24); + } + + public static void main(String[] args) { + new Day24().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year15/days/Day25.java b/src/main/java/com/sbaars/adventofcode/year15/days/Day25.java new file mode 100644 index 00000000..866cc03b --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year15/days/Day25.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year15.days; + +import com.sbaars.adventofcode.year15.Day2015; + +public class Day25 extends Day2015 { + public Day25() { + super(25); + } + + public static void main(String[] args) { + new Day25().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year15/days/Day3.java b/src/main/java/com/sbaars/adventofcode/year15/days/Day3.java new file mode 100644 index 00000000..a75097b0 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year15/days/Day3.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year15.days; + +import com.sbaars.adventofcode.year15.Day2015; + +public class Day3 extends Day2015 { + public Day3() { + super(3); + } + + public static void main(String[] args) { + new Day3().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year15/days/Day4.java b/src/main/java/com/sbaars/adventofcode/year15/days/Day4.java new file mode 100644 index 00000000..f68fbad7 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year15/days/Day4.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year15.days; + +import com.sbaars.adventofcode.year15.Day2015; + +public class Day4 extends Day2015 { + + public Day4() { + super(4); + } + + public static void main(String[] args) { + new Day4().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year15/days/Day5.java b/src/main/java/com/sbaars/adventofcode/year15/days/Day5.java new file mode 100644 index 00000000..1555f13d --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year15/days/Day5.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year15.days; + +import com.sbaars.adventofcode.year15.Day2015; + +public class Day5 extends Day2015 { + + public Day5() { + super(5); + } + + public static void main(String[] args) { + new Day5().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year15/days/Day6.java b/src/main/java/com/sbaars/adventofcode/year15/days/Day6.java new file mode 100644 index 00000000..7ca8d71a --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year15/days/Day6.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year15.days; + +import com.sbaars.adventofcode.year15.Day2015; + +public class Day6 extends Day2015 { + + public Day6() { + super(6); + } + + public static void main(String[] args) { + new Day6().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year15/days/Day7.java b/src/main/java/com/sbaars/adventofcode/year15/days/Day7.java new file mode 100644 index 00000000..17ff7f97 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year15/days/Day7.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year15.days; + +import com.sbaars.adventofcode.year15.Day2015; + +public class Day7 extends Day2015 { + + public Day7() { + super(7); + } + + public static void main(String[] args) { + new Day7().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year15/days/Day8.java b/src/main/java/com/sbaars/adventofcode/year15/days/Day8.java new file mode 100644 index 00000000..3cea4cf9 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year15/days/Day8.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year15.days; + +import com.sbaars.adventofcode.year15.Day2015; + +public class Day8 extends Day2015 { + + public Day8() { + super(8); + } + + public static void main(String[] args) { + new Day8().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year15/days/Day9.java b/src/main/java/com/sbaars/adventofcode/year15/days/Day9.java new file mode 100644 index 00000000..49abd46a --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year15/days/Day9.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year15.days; + +import com.sbaars.adventofcode.year15.Day2015; + +public class Day9 extends Day2015 { + public Day9() { + super(9); + } + + public static void main(String[] args) { + new Day9().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year16/Day2016.java b/src/main/java/com/sbaars/adventofcode/year16/Day2016.java new file mode 100644 index 00000000..47aa4d4e --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year16/Day2016.java @@ -0,0 +1,9 @@ +package com.sbaars.adventofcode.year16; + +import com.sbaars.adventofcode.common.Day; + +public abstract class Day2016 extends Day { + protected Day2016(int day) { + super(2016, day); + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year16/Main.java b/src/main/java/com/sbaars/adventofcode/year16/Main.java new file mode 100644 index 00000000..d9054aa7 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year16/Main.java @@ -0,0 +1,17 @@ +package com.sbaars.adventofcode.year16; + +import com.sbaars.adventofcode.common.Day; + +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; + +public class Main { + public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException, InvocationTargetException, NoSuchMethodException { + for (int day = 1; day <= 25; day++) { + System.out.println("Day " + day + ":"); + Day instance = (Day) Class.forName("com.sbaars.adventofcode.year21.days.Day" + day).getDeclaredConstructor().newInstance(); + instance.printParts(); + System.out.println(); + } + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year16/days/Day1.java b/src/main/java/com/sbaars/adventofcode/year16/days/Day1.java new file mode 100644 index 00000000..0e72a6a4 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year16/days/Day1.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year16.days; + +import com.sbaars.adventofcode.year16.Day2016; + +public class Day1 extends Day2016 { + public Day1() { + super(1); + } + + public static void main(String[] args) { + new Day1().printParts(); + } + + @Override + public Object part1() { + String input = day(); + return input; + } + + @Override + public Object part2() { + return 0; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year16/days/Day10.java b/src/main/java/com/sbaars/adventofcode/year16/days/Day10.java new file mode 100644 index 00000000..1731aea3 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year16/days/Day10.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year16.days; + +import com.sbaars.adventofcode.year16.Day2016; + +public class Day10 extends Day2016 { + public Day10() { + super(10); + } + + public static void main(String[] args) { + new Day10().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year16/days/Day11.java b/src/main/java/com/sbaars/adventofcode/year16/days/Day11.java new file mode 100644 index 00000000..60532571 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year16/days/Day11.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year16.days; + +import com.sbaars.adventofcode.year16.Day2016; + +public class Day11 extends Day2016 { + public Day11() { + super(11); + } + + public static void main(String[] args) { + new Day11().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year16/days/Day12.java b/src/main/java/com/sbaars/adventofcode/year16/days/Day12.java new file mode 100644 index 00000000..5674f233 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year16/days/Day12.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year16.days; + +import com.sbaars.adventofcode.year16.Day2016; + +public class Day12 extends Day2016 { + public Day12() { + super(12); + } + + public static void main(String[] args) { + new Day12().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year16/days/Day13.java b/src/main/java/com/sbaars/adventofcode/year16/days/Day13.java new file mode 100644 index 00000000..e5ea168d --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year16/days/Day13.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year16.days; + +import com.sbaars.adventofcode.year16.Day2016; + +public class Day13 extends Day2016 { + public Day13() { + super(13); + } + + public static void main(String[] args) { + new Day13().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year16/days/Day14.java b/src/main/java/com/sbaars/adventofcode/year16/days/Day14.java new file mode 100644 index 00000000..2fcc5098 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year16/days/Day14.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year16.days; + +import com.sbaars.adventofcode.year16.Day2016; + +public class Day14 extends Day2016 { + public Day14() { + super(14); + } + + public static void main(String[] args) { + new Day14().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year16/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year16/days/Day15.java new file mode 100644 index 00000000..bdf9e808 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year16/days/Day15.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year16.days; + +import com.sbaars.adventofcode.year16.Day2016; + +public class Day15 extends Day2016 { + public Day15() { + super(15); + } + + public static void main(String[] args) { + new Day15().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year16/days/Day16.java b/src/main/java/com/sbaars/adventofcode/year16/days/Day16.java new file mode 100644 index 00000000..41d88858 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year16/days/Day16.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year16.days; + +import com.sbaars.adventofcode.year16.Day2016; + +public class Day16 extends Day2016 { + + public Day16() { + super(16); + } + + public static void main(String[] args) { + new Day16().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year16/days/Day17.java b/src/main/java/com/sbaars/adventofcode/year16/days/Day17.java new file mode 100644 index 00000000..74cac66c --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year16/days/Day17.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year16.days; + +import com.sbaars.adventofcode.year16.Day2016; + +public class Day17 extends Day2016 { + public Day17() { + super(17); + } + + public static void main(String[] args) { + new Day17().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year16/days/Day18.java b/src/main/java/com/sbaars/adventofcode/year16/days/Day18.java new file mode 100644 index 00000000..02f2ef72 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year16/days/Day18.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year16.days; + +import com.sbaars.adventofcode.year16.Day2016; + +public class Day18 extends Day2016 { + public Day18() { + super(18); + } + + public static void main(String[] args) { + new Day18().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year16/days/Day19.java b/src/main/java/com/sbaars/adventofcode/year16/days/Day19.java new file mode 100644 index 00000000..f1dbfe9d --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year16/days/Day19.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year16.days; + +import com.sbaars.adventofcode.year16.Day2016; + +public class Day19 extends Day2016 { + + public Day19() { + super(19); + } + + public static void main(String[] args) { + new Day19().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year16/days/Day2.java b/src/main/java/com/sbaars/adventofcode/year16/days/Day2.java new file mode 100644 index 00000000..309ef82f --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year16/days/Day2.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year16.days; + +import com.sbaars.adventofcode.year16.Day2016; + +public class Day2 extends Day2016 { + public Day2() { + super(2); + } + + public static void main(String[] args) { + new Day2().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year16/days/Day20.java b/src/main/java/com/sbaars/adventofcode/year16/days/Day20.java new file mode 100644 index 00000000..12ed5e1a --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year16/days/Day20.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year16.days; + +import com.sbaars.adventofcode.year16.Day2016; + +public class Day20 extends Day2016 { + public Day20() { + super(20); + } + + public static void main(String[] args) { + new Day20().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year16/days/Day21.java b/src/main/java/com/sbaars/adventofcode/year16/days/Day21.java new file mode 100644 index 00000000..c50ba740 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year16/days/Day21.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year16.days; + +import com.sbaars.adventofcode.year16.Day2016; + +public class Day21 extends Day2016 { + public Day21() { + super(21); + } + + public static void main(String[] args) { + new Day21().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year16/days/Day22.java b/src/main/java/com/sbaars/adventofcode/year16/days/Day22.java new file mode 100644 index 00000000..44bf1c82 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year16/days/Day22.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year16.days; + +import com.sbaars.adventofcode.year16.Day2016; + +public class Day22 extends Day2016 { + public Day22() { + super(22); + } + + public static void main(String[] args) { + new Day22().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year16/days/Day23.java b/src/main/java/com/sbaars/adventofcode/year16/days/Day23.java new file mode 100644 index 00000000..3db99ba6 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year16/days/Day23.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year16.days; + +import com.sbaars.adventofcode.year16.Day2016; + +public class Day23 extends Day2016 { + public Day23() { + super(23); + } + + public static void main(String[] args) { + new Day23().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year16/days/Day24.java b/src/main/java/com/sbaars/adventofcode/year16/days/Day24.java new file mode 100644 index 00000000..42f45488 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year16/days/Day24.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year16.days; + +import com.sbaars.adventofcode.year16.Day2016; + +public class Day24 extends Day2016 { + + public Day24() { + super(24); + } + + public static void main(String[] args) { + new Day24().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year16/days/Day25.java b/src/main/java/com/sbaars/adventofcode/year16/days/Day25.java new file mode 100644 index 00000000..3ff2805a --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year16/days/Day25.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year16.days; + +import com.sbaars.adventofcode.year16.Day2016; + +public class Day25 extends Day2016 { + public Day25() { + super(25); + } + + public static void main(String[] args) { + new Day25().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year16/days/Day3.java b/src/main/java/com/sbaars/adventofcode/year16/days/Day3.java new file mode 100644 index 00000000..02b30a9a --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year16/days/Day3.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year16.days; + +import com.sbaars.adventofcode.year16.Day2016; + +public class Day3 extends Day2016 { + public Day3() { + super(3); + } + + public static void main(String[] args) { + new Day3().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year16/days/Day4.java b/src/main/java/com/sbaars/adventofcode/year16/days/Day4.java new file mode 100644 index 00000000..1ece155c --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year16/days/Day4.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year16.days; + +import com.sbaars.adventofcode.year16.Day2016; + +public class Day4 extends Day2016 { + + public Day4() { + super(4); + } + + public static void main(String[] args) { + new Day4().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year16/days/Day5.java b/src/main/java/com/sbaars/adventofcode/year16/days/Day5.java new file mode 100644 index 00000000..9bd089d2 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year16/days/Day5.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year16.days; + +import com.sbaars.adventofcode.year16.Day2016; + +public class Day5 extends Day2016 { + + public Day5() { + super(5); + } + + public static void main(String[] args) { + new Day5().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year16/days/Day6.java b/src/main/java/com/sbaars/adventofcode/year16/days/Day6.java new file mode 100644 index 00000000..2f570814 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year16/days/Day6.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year16.days; + +import com.sbaars.adventofcode.year16.Day2016; + +public class Day6 extends Day2016 { + + public Day6() { + super(6); + } + + public static void main(String[] args) { + new Day6().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year16/days/Day7.java b/src/main/java/com/sbaars/adventofcode/year16/days/Day7.java new file mode 100644 index 00000000..a7e95d4b --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year16/days/Day7.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year16.days; + +import com.sbaars.adventofcode.year16.Day2016; + +public class Day7 extends Day2016 { + + public Day7() { + super(7); + } + + public static void main(String[] args) { + new Day7().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year16/days/Day8.java b/src/main/java/com/sbaars/adventofcode/year16/days/Day8.java new file mode 100644 index 00000000..e48674d7 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year16/days/Day8.java @@ -0,0 +1,24 @@ +package com.sbaars.adventofcode.year16.days; + +import com.sbaars.adventofcode.year16.Day2016; + +public class Day8 extends Day2016 { + + public Day8() { + super(8); + } + + public static void main(String[] args) { + new Day8().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year16/days/Day9.java b/src/main/java/com/sbaars/adventofcode/year16/days/Day9.java new file mode 100644 index 00000000..6d2f526d --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year16/days/Day9.java @@ -0,0 +1,23 @@ +package com.sbaars.adventofcode.year16.days; + +import com.sbaars.adventofcode.year16.Day2016; + +public class Day9 extends Day2016 { + public Day9() { + super(9); + } + + public static void main(String[] args) { + new Day9().printParts(); + } + + @Override + public Object part1() { + return ""; + } + + @Override + public Object part2() { + return ""; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year17/Day2017.java b/src/main/java/com/sbaars/adventofcode/year17/Day2017.java new file mode 100644 index 00000000..183c4120 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year17/Day2017.java @@ -0,0 +1,9 @@ +package com.sbaars.adventofcode.year17; + +import com.sbaars.adventofcode.common.Day; + +public abstract class Day2017 extends Day { + protected Day2017(int day) { + super(2017, day); + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year17/Main.java b/src/main/java/com/sbaars/adventofcode/year17/Main.java new file mode 100644 index 00000000..21f993b5 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year17/Main.java @@ -0,0 +1,17 @@ +package com.sbaars.adventofcode.year17; + +import com.sbaars.adventofcode.common.Day; + +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; + +public class Main { + public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException, InvocationTargetException, NoSuchMethodException { + for (int day = 1; day <= 25; day++) { + System.out.println("Day " + day + ":"); + Day instance = (Day) Class.forName("com.sbaars.adventofcode.year21.days.Day" + day).getDeclaredConstructor().newInstance(); + instance.printParts(); + System.out.println(); + } + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year17/days/Day1.java b/src/main/java/com/sbaars/adventofcode/year17/days/Day1.java new file mode 100644 index 00000000..b19a5187 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/year17/days/Day1.java @@ -0,0 +1,34 @@ +package com.sbaars.adventofcode.year17.days; + +import com.sbaars.adventofcode.common.Day; +import com.sbaars.adventofcode.year17.Day2017; + +public class Day1 extends Day2017 { + public Day1() { + super(1); + } + + public static void main(String[] args) { + Day d = new Day1(); + d.downloadIfNotDownloaded(); + d.printParts(); + d.submitPart1(); +// new Day1().printParts(); + } + + @Override + public Object part1() { + long[] x = dayNumbers(); + long sum = 0; + if(x[0] == x[x.length-1]) sum+=x[0]; + for(int i = 1; i input[i]){ + res++; + } + } + return res; } @Override From ab4ef7f0462d0cb9ba689dd86a3c4cf5b4183ca8 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Wed, 30 Nov 2022 18:40:38 +0100 Subject: [PATCH 333/433] Do Day 1 of 2017 --- .../java/com/sbaars/adventofcode/common/Day.java | 4 ++++ .../sbaars/adventofcode/year17/days/Day1.java | 16 +++++++++------- .../sbaars/adventofcode/year22/days/Day1.java | 3 ++- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/common/Day.java b/src/main/java/com/sbaars/adventofcode/common/Day.java index 67ac58b3..065e6e19 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Day.java +++ b/src/main/java/com/sbaars/adventofcode/common/Day.java @@ -99,6 +99,10 @@ protected long[] dayNumbers(String delimiter) { return dayNumberStream(delimiter).toArray(); } + protected long[] dayDigits() { + return day().chars().filter(n -> n >= '0' && n <= '9').mapToLong(n -> n - '0').toArray(); + } + protected double[] dayDoubles() { return dayDoubles(DEFAULT_DELIMITER); } diff --git a/src/main/java/com/sbaars/adventofcode/year17/days/Day1.java b/src/main/java/com/sbaars/adventofcode/year17/days/Day1.java index b19a5187..064225d7 100644 --- a/src/main/java/com/sbaars/adventofcode/year17/days/Day1.java +++ b/src/main/java/com/sbaars/adventofcode/year17/days/Day1.java @@ -12,23 +12,25 @@ public static void main(String[] args) { Day d = new Day1(); d.downloadIfNotDownloaded(); d.printParts(); - d.submitPart1(); -// new Day1().printParts(); } @Override public Object part1() { - long[] x = dayNumbers(); + long[] x = dayDigits(); long sum = 0; - if(x[0] == x[x.length-1]) sum+=x[0]; - for(int i = 1; i input[i]){ res++; } From 2758852c09459cf48f6095d020ceb41d9c20793d Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Thu, 1 Dec 2022 06:13:01 +0100 Subject: [PATCH 334/433] Day 1 --- .../sbaars/adventofcode/common/Direction.java | 20 +- .../sbaars/adventofcode/year16/days/Day1.java | 45 +- .../sbaars/adventofcode/year22/days/Day1.java | 21 +- src/main/resources/2016-examples/day1-1.txt | 1 + src/main/resources/2016-examples/day1-2.txt | 1 + src/main/resources/2016-examples/day1-3.txt | 1 + src/main/resources/2016-examples/day1-4.txt | 1 + src/main/resources/2022/day1.txt | 2237 +++++++++++++++++ 8 files changed, 2311 insertions(+), 16 deletions(-) create mode 100644 src/main/resources/2016-examples/day1-1.txt create mode 100644 src/main/resources/2016-examples/day1-2.txt create mode 100644 src/main/resources/2016-examples/day1-3.txt create mode 100644 src/main/resources/2016-examples/day1-4.txt create mode 100644 src/main/resources/2022/day1.txt diff --git a/src/main/java/com/sbaars/adventofcode/common/Direction.java b/src/main/java/com/sbaars/adventofcode/common/Direction.java index 176c2205..a65ec10d 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Direction.java +++ b/src/main/java/com/sbaars/adventofcode/common/Direction.java @@ -1,10 +1,10 @@ package com.sbaars.adventofcode.common; -import static java.lang.Math.abs; - import java.awt.*; import java.util.Arrays; +import static java.lang.Math.abs; + public enum Direction { NORTH(1, 'U'), EAST(4, 'R'), SOUTH(2, 'D'), WEST(3, 'L'), CENTER(8, 'C'), NORTHEAST(4, 'E'), SOUTHEAST(5, 'E'), SOUTHWEST(6, 'E'), NORTHWEST(7, 'E'); @@ -61,7 +61,7 @@ public static Direction[] eightDirections() { public Direction turn(boolean right) { int cur = ordinal() + (right ? 1 : -1); if (cur == fourDirections().length) cur = 0; - else if (cur == -1) cur = 3; + else if (cur == -1) cur = fourDirections().length - 1; return fourDirections()[cur]; } @@ -79,6 +79,20 @@ public Point move(Point currentLocation, int amount) { }; } + public Point moveFix(Point currentLocation, int amount) { + return switch (this) { + case SOUTH -> new Point(currentLocation.x, currentLocation.y + amount); + case NORTH -> new Point(currentLocation.x, currentLocation.y - amount); + case EAST -> new Point(currentLocation.x - amount, currentLocation.y); + case WEST -> new Point(currentLocation.x + amount, currentLocation.y); + case SOUTHWEST -> new Point(currentLocation.x + amount, currentLocation.y + amount); + case NORTHEAST -> new Point(currentLocation.x - amount, currentLocation.y - amount); + case SOUTHEAST -> new Point(currentLocation.x - amount, currentLocation.y + amount); + case NORTHWEST -> new Point(currentLocation.x + amount, currentLocation.y - amount); + case CENTER -> new Point(currentLocation.x, currentLocation.y); + }; + } + public char getInGrid(char[][] grid, Point p, char none) { if (p.x >= 0 && p.x < grid.length && p.y >= 0 && p.y < grid[0].length) { return grid[p.x][p.y]; diff --git a/src/main/java/com/sbaars/adventofcode/year16/days/Day1.java b/src/main/java/com/sbaars/adventofcode/year16/days/Day1.java index 0e72a6a4..42d16f9e 100644 --- a/src/main/java/com/sbaars/adventofcode/year16/days/Day1.java +++ b/src/main/java/com/sbaars/adventofcode/year16/days/Day1.java @@ -1,24 +1,63 @@ package com.sbaars.adventofcode.year16.days; +import com.sbaars.adventofcode.common.Day; +import com.sbaars.adventofcode.common.Direction; import com.sbaars.adventofcode.year16.Day2016; +import java.awt.*; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + public class Day1 extends Day2016 { public Day1() { super(1); } public static void main(String[] args) { - new Day1().printParts(); + Day d = new Day1(); + d.downloadIfNotDownloaded(); + d.printParts(); +// d.submitPart1(); + d.submitPart2(); } + record Move (boolean right, int dist) {} + @Override public Object part1() { - String input = day(); - return input; + List moves = dayStream(", ") + .map(String::trim) + .map(s -> new Move(s.charAt(0) == 'R', Integer.parseInt(s.substring(1)))) + .toList(); + Point p = new Point(0, 0); + Direction dir = Direction.NORTH; + for(Move m : moves) { + dir = dir.turn(m.right); + p = dir.moveFix(p, m.dist); + } + return Math.abs(p.x) + Math.abs(p.y); } @Override public Object part2() { + List moves = dayStream(", ") + .map(String::trim) + .map(s -> new Move(s.charAt(0) == 'R', Integer.parseInt(s.substring(1)))) + .toList(); + Point p = new Point(0, 0); + Direction dir = Direction.NORTH; + Set visited = new HashSet<>(); + visited.add(p); + for(Move m : moves) { + dir = dir.turn(m.right); + for(int i = 0; i input[i]){ - res++; - } - } - return res; + return input().max().getAsLong(); } @Override public Object part2() { - return 0; + long[] nums = input().sorted().toArray(); + return nums[nums.length-1] + nums[nums.length-2] + nums[nums.length-3]; + } + + private LongStream input () { + return Arrays.stream(day().split("\n\n")).mapToLong(s -> Arrays.stream(s.split("\n")).map(String::trim).mapToLong(e -> Long.parseLong(e)).sum()); } } diff --git a/src/main/resources/2016-examples/day1-1.txt b/src/main/resources/2016-examples/day1-1.txt new file mode 100644 index 00000000..3c5090f2 --- /dev/null +++ b/src/main/resources/2016-examples/day1-1.txt @@ -0,0 +1 @@ +R2, L3 \ No newline at end of file diff --git a/src/main/resources/2016-examples/day1-2.txt b/src/main/resources/2016-examples/day1-2.txt new file mode 100644 index 00000000..a9ad4ed6 --- /dev/null +++ b/src/main/resources/2016-examples/day1-2.txt @@ -0,0 +1 @@ +R2, R2, R2 \ No newline at end of file diff --git a/src/main/resources/2016-examples/day1-3.txt b/src/main/resources/2016-examples/day1-3.txt new file mode 100644 index 00000000..b781c2d0 --- /dev/null +++ b/src/main/resources/2016-examples/day1-3.txt @@ -0,0 +1 @@ +R5, L5, R5, R3 \ No newline at end of file diff --git a/src/main/resources/2016-examples/day1-4.txt b/src/main/resources/2016-examples/day1-4.txt new file mode 100644 index 00000000..60f9cffe --- /dev/null +++ b/src/main/resources/2016-examples/day1-4.txt @@ -0,0 +1 @@ +R8, R4, R4, R8 \ No newline at end of file diff --git a/src/main/resources/2022/day1.txt b/src/main/resources/2022/day1.txt new file mode 100644 index 00000000..335bff59 --- /dev/null +++ b/src/main/resources/2022/day1.txt @@ -0,0 +1,2237 @@ +8462 +6981 +3714 +4409 +8186 +3614 +2218 +7558 +6702 + +2947 +4727 +6396 +5718 +2361 +1970 +1583 +2816 +2995 +6914 +4313 +1401 + +1643 +7815 +2162 +8841 +7671 + +5740 +5471 +4838 +2281 +2784 +4587 +1497 +2074 +1161 +4388 +2233 +4795 +2011 +5438 + +14064 +9646 +2537 + +2064 +2833 +1164 +14379 + +6008 +4327 +4709 +5412 +2745 +5680 +5322 +4375 +4064 +4822 +6523 +6824 +6822 + +12100 +24791 +18239 + +9704 +8218 +9949 +3078 +9407 +3732 +4281 +6727 + +9833 +2549 +5042 +7053 +6116 +9624 +5393 +8359 + +4195 +7869 +15434 +6997 +5776 + +2487 +7843 +2739 +5227 +4088 +6281 +7078 +4291 +5461 +4838 +7936 + +5449 +5754 +4685 +7642 +7244 +4912 + +4020 +18761 +17710 +8736 + +6204 +1295 +3812 +5078 +4627 +3818 +4351 +5202 +2542 +2728 +3036 +5026 +5146 +5771 + +8809 +5364 +22076 + +3846 +2867 +10260 +3321 +7715 +7670 +1326 +5480 + +2613 +1442 +3771 +1692 +6131 +3945 +4591 +5165 +1648 +6084 +4952 +4295 +4390 +3935 + +4403 +6299 +4307 +5329 +4235 +4779 +4498 +6871 +5739 +4102 +6815 +1975 +4056 + +3875 +2650 +5888 +1605 +3972 +4781 +5694 +4150 +5765 +3919 +4260 +6339 +5614 +4597 + +1829 +4292 +4756 +4348 +3051 +2662 +4018 +1498 +3391 +1776 +1919 +3141 +3938 + +17338 +10081 +22228 + +10554 +2454 +2879 +3605 +3717 +5477 +4826 +3133 + +2221 +1431 +3235 +3371 +1364 +2137 +1774 +2015 +5115 +3331 +3588 +3264 +2401 + +5770 +3408 +1153 +6106 +3261 +2801 +3380 +1377 +2126 +5516 +4087 +2353 +1039 +1909 +5374 + +15655 +12356 +7421 +12094 +1776 + +16080 +7634 +4329 + +9409 +10153 +10744 +2145 +5796 +1586 +3622 +3635 + +1314 +5713 +5566 +6397 +2033 +1083 +7096 +6595 +6652 +4872 +4444 + +9731 +12016 +10148 +7358 +10025 +7471 +1346 + +1189 +2777 +4153 +1415 +9311 +6324 +4108 +7104 +8467 + +9326 +3339 +5048 +8225 +1647 +3640 +2922 + +3110 +15978 +17916 + +4502 +4106 +5683 +8061 +6507 +3591 +4560 +4620 +7036 +5762 +1470 + +7613 +12487 +1257 +10687 +4374 + +14169 +1170 + +2310 +10184 +6759 +12955 +3895 +6388 + +19637 +11418 +4728 +10935 + +8856 +9067 +7661 +3795 +3895 +7974 +2340 +3395 +1442 + +4258 +3584 +1935 +2919 +3870 +1078 +4163 +5192 +3363 +2386 +5897 +2922 +1619 +4872 +1903 + +8638 +8492 +1883 +10979 +2715 +3274 +7286 + +10670 +13042 +13137 + +3729 +1312 +1981 +2754 +4417 +1466 +7675 +2290 +5074 +5666 + +13836 +1263 +24451 + +6390 +8913 +12614 +6468 +2541 +13763 + +4673 +7245 +9128 +4712 +3838 +4596 +6620 +5459 +6350 + +4454 +5111 +3862 +1374 +2091 +2522 +6196 +2052 +1399 +6151 +1987 +3678 + +7427 +6633 +1447 +1854 +6601 +3459 +4633 +1339 +2955 +3929 +1057 +1910 + +1896 +2326 +2173 +1062 +5249 +3730 +4479 +6377 +2833 +4106 +4126 +4492 +2132 +4484 + +3465 +5345 +2295 +5946 +2465 +5684 +5573 +4449 +5983 +4863 +3678 +6007 +1249 +1563 +5270 + +3334 +1612 +3210 +1215 +4474 +2893 +4987 +2355 +3912 +5019 +4544 +1446 +3076 +4833 +4889 + +8299 +3042 +5715 +8442 +10294 +3697 +2071 +1482 + +2461 +6281 +3382 +1175 +7048 +2050 +1470 +5249 +7622 +6950 +4962 + +8573 +6266 +12922 +11159 +1493 + +6320 +4365 +7883 + +17708 +18169 +11780 + +8023 +7870 +4647 +6059 +1094 +1888 +8696 +2077 +5882 +3320 + +3180 +5779 +2360 +6811 +7802 +1662 +3157 +7373 +4282 +5282 + +3162 +5081 +1917 +1149 +2325 +6862 +4536 +2776 +6418 +4161 +6919 +1766 +2387 + +11508 +6617 +1521 +6854 +4799 +1463 +11379 + +12419 +4634 +8522 +3323 + +43380 + +1529 +2302 +6234 +5285 +6071 +3741 +6783 +3271 +1451 +3379 +1032 +1218 + +53976 + +3746 +2269 +4878 +5085 +1873 +3582 +2155 +6638 +2804 +3910 +5384 +4865 + +4905 +2648 +2320 +1775 +3803 +1137 +2405 +1974 +1667 +5677 +3687 +2476 +5332 + +2511 +2805 +3088 +5437 +4000 +5283 +6220 +3387 +1962 +2868 +2084 +5740 +4899 +5846 + +20975 +15672 + +11633 +12928 +17372 + +10964 +6326 +3115 +18901 + +2151 +6218 +2619 +8294 +12292 +12179 + +5390 +4373 +3685 +2236 +7107 +11917 +3701 + +5696 +1751 +6613 +6606 +1288 +5362 +6157 +6236 +3649 +4023 + +5290 +7999 +10040 +3338 +7547 +7575 +6369 + +3358 +6414 +2066 +2012 +3849 +1421 +2962 +4607 +3548 +6637 +5759 +4800 +5974 + +3209 +11201 +10317 +7340 +1073 +11610 + +5148 +2081 +5577 +5340 +7634 +4998 +7107 +6923 +1673 + +4809 +6274 +4140 +2993 +3003 +2973 +9914 +1878 + +3190 +5792 +3561 +2917 +4408 +1443 +4373 +1241 +3288 +5703 +4155 +5764 +4857 +5828 +4089 + +7390 +5924 +7987 +2919 +4474 +7700 +5457 +7926 +7539 + +5344 +5739 +4883 +1156 +5896 +5991 +7625 +2118 +3292 +7562 +1820 + +6485 +7804 +6886 +7436 +6163 +2618 +3119 +7144 +6274 +2792 +7602 + +4912 +6024 +5984 +2408 +1685 +1702 +5851 +2756 +1341 +4558 +1073 +4394 +6014 +1395 + +6662 +6573 +6043 +7402 +5790 +6942 +4171 +4043 +3077 +5672 +4984 + +1292 +6545 +2265 +6121 +2385 +2229 +6870 +6579 +1549 +6030 +3423 +1830 +6027 + +6361 +5979 +6532 +7110 +1881 +4659 + +9825 +4176 +4534 +1732 +4816 +6604 +8182 +2391 + +2309 +5266 +5879 +2463 +3636 +4958 +6308 +2091 +2588 +1841 +6899 +5666 + +9351 + +3824 +5754 +2710 +3782 +2784 +4535 +6157 +1055 +3569 +6498 +2679 +2949 +3285 +2519 + +5661 + +4565 +8056 +1975 +6947 +7508 +5570 +3727 +3287 +1794 +4933 +6458 + +6171 +9991 +10533 +6503 +1450 + +18391 +9046 +17384 +18940 + +5583 +5102 +2869 +5328 +2041 +4327 +1656 +2874 +2811 +5765 +4568 +5280 +2770 +1147 +6082 + +1512 +5928 +8631 +3263 +5569 +3693 +5060 +1810 +8327 +2900 + +21146 +13775 +13189 + +2853 +1782 +1461 +2560 +2046 +2773 +2453 +1218 +3545 +6013 +5893 +1853 +1926 +1847 +5914 + +15312 +22899 + +2752 +1253 +1448 +2627 +1161 +3661 +3457 +2992 +4606 +3206 +3145 +3639 +2833 +3687 +2148 + +6668 +3671 +3484 +2000 +2149 +3748 +1256 +3168 +6889 +5046 +6594 + +7437 +5596 +6744 +6863 +7397 +5922 +1897 +4042 +3993 +2569 +2509 +6048 + +10456 +7724 +2668 +4749 + +11329 +5011 +4007 +10189 +6972 + +4514 +1702 +2925 +1828 +8000 +5724 +3567 +1190 + +2949 +7487 +6652 +1472 +5965 +3071 +6990 +3356 +5283 +6487 +1990 + +31016 + +3585 +6168 +6826 +6184 +4985 +6209 +7290 +5732 +4058 +7919 +2152 + +18469 + +5945 +4318 +3986 +3386 +7037 +7149 +5313 +6521 +8266 +6665 + +39430 + +2779 +2507 +4473 +1635 +6487 +6823 +5443 +7274 +4722 +6267 +6421 + +8443 +3747 +3863 +6109 +1369 +8602 +4231 +7029 +4102 +2876 + +1013 +2319 +1800 +5256 +9521 +12068 +2116 + +11032 +1733 +6220 +7666 +3891 +3761 +6096 + +3434 +4984 +3662 +3070 +3560 +4494 +1485 +3460 +3851 +1007 +2615 +5349 +4254 +5248 +2140 + +3469 +2318 +4553 +1058 +1122 +4413 +3672 +6019 +1616 +3557 +3211 +2938 +4390 +2685 +3250 + +1446 +5593 +4857 +2389 +6242 +2724 +1425 +7948 +7140 +7839 +6895 + +5659 +4475 +5467 +1742 +1243 +8125 +2044 +3449 +5796 + +3012 +12758 +2478 +11102 +2615 +7856 + +5170 +5356 +1141 +1513 +1650 +4280 +2441 +4572 +6556 +6821 +3519 +3330 + +4799 +6959 +1737 +1502 +3510 +2089 +6946 +1303 +3574 +6382 + +6579 +2997 +1700 +6006 +1855 +2135 +10659 +2237 + +55371 + +1551 +2828 +3490 +2030 +5126 +4109 +2305 +4994 +4733 +1693 +3338 +3996 +4181 +3896 +1092 + +1846 +4756 +9555 +7994 +8733 +1489 +4585 +5954 +6058 + +48724 + +3025 +6315 +1398 +2563 +2661 +6414 +1230 +1290 +1898 +1493 +1347 +3971 +4248 + +8315 +17843 +17103 + +4287 +2732 +2284 +3036 +6831 +2890 +7588 +7268 +1464 +2247 +1306 + +4480 +1267 +5209 +3558 +5311 +2958 +3054 +4265 +3836 +3300 +1867 +1892 +5756 +3293 + +7569 +9154 +4238 +1586 +7972 +9683 +5373 +3431 +4990 + +9579 +6370 +1128 +3575 +5785 +5055 +8228 +1914 +6012 + +5171 +3810 +3053 +1775 +2437 +1751 +5214 +6904 +3496 +5429 +2340 +5683 +3428 + +27584 +19252 + +23558 +8432 + +8727 +6023 +1708 +1839 +6467 +2494 +6788 +6905 +2160 +2380 + +1023 +2142 +10754 +7460 +5136 + +4181 +1605 +2243 +9554 +4041 +4423 + +38394 + +5137 +2560 +1230 +7342 +5300 +3089 +1281 +7567 +1529 +3628 + +4026 +8121 +4227 +14794 +7567 + +4344 +12998 +5424 +2987 +10128 +8362 + +9373 +5522 +2017 +10260 +5263 +3402 +7981 + +6772 +2092 +6024 +4548 +1229 +2486 +4733 +3112 +4908 +3598 +5839 +2922 +4936 + +7723 +2389 +2100 +4448 +7255 +3430 +2808 +4832 +5848 +7024 + +4664 +4953 +4403 +3171 +6125 +4154 +2921 +3502 +7290 +6371 +2314 +1391 + +4967 +5243 +6186 +3218 +2082 +4625 +5827 +2257 +2186 +5716 +1032 +1796 +2609 +5704 + +66296 + +6973 +4755 +6328 +6720 +8118 +2696 +4449 +3474 +5110 +5852 + +8320 +10410 +7618 +6504 +1892 +9355 +2792 +6286 + +47376 + +1448 +1176 +6150 +3289 +1759 +5919 +2579 +5630 +3798 +6203 +4909 +5294 +1471 +4537 + +7656 +12471 +14457 +11694 +8007 + +3990 +8373 +1412 +1462 +5601 +8555 +8500 +2545 +8920 + +1312 +6198 +2638 +1095 +5201 +4953 +3056 +2526 +3699 +5639 +4583 +4737 +2245 + +7833 +5242 +6384 +7309 +3805 +6525 +6070 +6074 +5899 +2583 + +65699 + +6154 +3691 +1858 +5141 +6915 +2134 +2131 +5295 +4071 +4552 +1753 +6950 +3909 + +2587 +1337 +3790 +3137 +6150 +1698 +3950 +4046 +2308 +3871 +1824 +1533 +1930 +3360 + +10305 +13340 +6892 + +4945 +6137 +10521 +2418 +9791 +7035 +4151 +5497 + +25807 +25417 + +5771 +6122 +4596 +4022 +9682 +4696 +8749 + +1028 +6870 +3606 +4626 +4557 +6908 +5503 +1803 +2561 +2487 +3368 +5319 + +2027 +4102 +5920 +3335 +5804 +3829 +5977 +1592 +2113 +3771 +3938 +3417 +2550 +1980 + +3321 +4002 +1229 +3591 +3851 +1384 +2618 +4049 +3336 +2035 +1231 +2126 +1901 +2834 +5604 + +45987 + +3667 +3442 +2721 +5515 +9294 +4897 +7333 +2518 +4009 + +5686 +2042 +1130 +5463 +2814 +2780 +1037 +5490 +3188 +2882 +3742 +4048 +3203 +1785 + +20148 +14705 + +6293 +1673 +6865 +2414 +6552 +3886 +5944 +6538 +2569 +3770 +7698 + +1588 +2025 +2071 +4336 +4768 +1826 +2939 +3016 +1529 +3092 +1326 +5698 +5864 +4837 +4188 + +9974 +3626 +6637 +6988 +7509 +9460 +7542 +7164 + +5343 +1913 +12824 +13105 +13538 +1114 + +4699 +4692 +4170 +6325 +1634 +4627 +2721 +5309 +3772 +2132 +1894 +5094 +6416 +2492 + +22223 +15163 +3520 + +9437 +25803 + +2519 +7012 +2571 +6251 +1380 +5344 +6362 +2465 +4457 +1071 +5560 +1992 + +5522 +3334 +2597 +2382 +4118 +1624 +6175 +4656 +6525 +6593 +4459 +1349 +1403 + +1443 +7693 +10526 +9927 +9729 +3172 +7632 + +3154 +6472 +3815 +3055 +1009 +8458 +3250 +1864 +6734 +8458 + +3155 +2476 +6384 +2045 +2773 +7447 +7646 +1186 +5360 +4499 +2502 + +9675 +8902 +12054 +9405 +8558 +8901 + +3605 +2465 +9906 +5145 +13502 +9839 + +9207 +7212 +4778 +9929 +6582 +9680 +3349 +1813 + +4483 +15153 +22152 + +24781 +33010 + +19696 + +6451 +5583 +3639 +3565 +7956 +4005 +5236 +3053 +2192 +5485 +3143 + +3990 +1296 +4262 +4493 +4072 +5136 +4507 +4191 +6636 +5514 +5759 +6471 +3567 + +2296 +5998 +6269 +3935 +1929 +3188 +5768 +2547 +1318 +3689 +1161 +3894 +1206 +1304 + +2942 +2195 +5594 +8418 +3600 +6710 +4414 +7753 +1672 +1878 + +6682 +9976 +18511 +17026 + +7606 +3587 +2427 +9258 +8752 +7387 +4096 +3911 +6200 + +4364 +8277 +5476 +1718 +3530 +6895 +4822 +3970 +3368 + +12691 +3502 +4641 +8562 +8062 +5216 + +7316 +7688 +5102 +7950 +4291 +9711 +3202 +7487 + +57056 + +4268 +1730 +3617 +5257 +5760 +3222 +3497 +4891 +1584 +2587 +5954 +3391 +1203 +2673 + +15671 +11805 +1242 + +5560 +1774 +2332 +2068 +6859 +3012 +6677 +6255 +1178 +3695 +5131 +2075 +1398 + +8310 +2657 +1795 +14376 + +4270 +1931 +6894 +5011 +3766 +1028 +1405 +3768 +5249 +3972 +5799 +4704 + +4331 +3682 +1748 +6674 +4191 +4711 +4971 +3329 +5968 +1971 +1533 +5559 + +4569 +5005 +4292 +3541 +4578 +5532 +4163 +2555 +1936 +5767 +1299 +5620 +4897 +5824 + +2350 +3735 +7113 +6094 +7952 +5611 +3634 +8849 +5171 + +7046 +11580 +1720 +1574 +12103 +5747 +5966 + +10027 +6090 +9627 +4738 +9248 +5177 +3622 +5265 + +4617 +8158 +2629 +4317 +8707 +1442 +1944 +3006 +7283 +4939 + +2744 +3616 +1211 +4479 +5857 +6062 +5475 +1369 +7243 +4930 +5514 +3919 + +5938 +2249 +18108 +6713 + +6017 +1815 +2551 +2246 +5082 +3795 +3673 +1083 +5008 +6903 +6492 +1272 +1494 + +5350 +4727 +5366 +1227 +6846 +1355 +5226 +7069 +3365 +4011 +2857 +1696 + +2732 +3684 +5801 +3059 +1099 +5909 +4528 +2645 +2363 +1622 +3335 +2903 +4690 +1443 + +2445 +4940 +4878 +5229 +6686 +5416 +8016 +5249 + +1875 +2976 +3545 +2571 +2691 +5763 +4373 +5126 +5078 +2895 +3976 +1934 +4212 + +1649 +2120 +2801 +1222 +4478 +7415 +7956 +2507 +3464 +1512 +3680 + +3087 +5058 +5726 +4050 +5667 +1709 +4970 +1805 +4369 +3211 +2953 +1847 +5848 +3365 +5717 + +18473 + +2897 +15970 +13899 + +2396 +2432 +4315 +1646 +2933 +3701 +3034 +6228 +4978 +1254 +5964 +4797 +3712 +4613 + +3583 +4652 +2589 +3126 +1356 +3268 +4372 +5851 +3159 +2936 +2568 +1631 +4557 +4254 +5537 + +1796 +1304 +1129 +3237 +7542 +4587 +3158 +3055 +5129 +5981 +3396 + +2326 +2916 +7617 +1438 +1205 +4903 +7842 +6171 +6042 +6076 +8009 + +60341 + +10527 +30521 + +1882 +7475 +4092 +10469 +11258 +2361 +6750 + +7307 +10450 +2273 +3998 +4324 +4453 +5606 + +14605 +8618 +19203 +6177 + +40070 + +13758 +9814 +16312 +14985 +8629 + +20716 + +2344 +9535 +6583 +10900 +12041 +3724 + +3075 +11273 +9002 +9802 +1148 +9197 +10064 + +25216 +11228 +15709 + +21181 +10820 +8812 + +3073 +5764 +8201 +4269 +3302 +1795 +5387 +2618 +7288 +8388 + +24566 + +7608 +1738 +3212 +7028 +6321 +1087 +3361 +1698 +5582 +4314 + +9189 +9689 +7007 +2845 +1086 +9086 +1795 +6550 +7610 + +1139 +4157 +4135 +9875 +7720 +8262 +2666 +7147 From c16030fb3b689399e21837a49b664b97924242d8 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Thu, 1 Dec 2022 07:22:42 +0100 Subject: [PATCH 335/433] 2015 day 2 --- .../sbaars/adventofcode/year15/days/Day2.java | 57 ++++++++++++++++++- .../sbaars/adventofcode/year22/days/Day2.java | 7 ++- src/main/resources/2015-examples/day2-1.txt | 1 + src/main/resources/2015-examples/day2-2.txt | 1 + 4 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/2015-examples/day2-1.txt create mode 100644 src/main/resources/2015-examples/day2-2.txt diff --git a/src/main/java/com/sbaars/adventofcode/year15/days/Day2.java b/src/main/java/com/sbaars/adventofcode/year15/days/Day2.java index 8b563e2f..e26a3e6d 100644 --- a/src/main/java/com/sbaars/adventofcode/year15/days/Day2.java +++ b/src/main/java/com/sbaars/adventofcode/year15/days/Day2.java @@ -1,23 +1,74 @@ package com.sbaars.adventofcode.year15.days; +import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year15.Day2015; +import java.util.function.ToLongFunction; + +import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; + public class Day2 extends Day2015 { public Day2() { super(2); } + public record Dimension (long l, long w, long h) { + private long[] smallestSides() { + if(l>=w && l>=h) return new long[]{w, h}; + if(w>=l && w>=h) return new long[]{l, h}; + return new long[]{l, w}; + } + + private long smallestArea() { + long[] s = smallestSides(); + return s[0] * s[1]; + } + + private long area() { + return 2*l*w + 2*w*h + 2*h*l; + } + + private long wrappingPaper() { + return smallestArea() + area(); + } + + private long sideDistance() { + long[] s = smallestSides(); + return s[0]*2 + s[1]*2; + } + + private long volume() { + return l*w*h; + } + + private long ribbon() { + return sideDistance() + volume(); + } + } + public static void main(String[] args) { - new Day2().printParts(); + Day d = new Day2(); + d.downloadIfNotDownloaded(); + d.printParts(); +// d.submitPart1(); +// d.submitPart2(); } @Override public Object part1() { - return ""; + return getResult(Dimension::wrappingPaper); } @Override public Object part2() { - return ""; + return getResult(Dimension::ribbon); + } + + private long getResult(ToLongFunction func) { + return dayStream() + .map(String::trim) + .map(s -> readString(s, "%nx%nx%n", Dimension.class)) + .mapToLong(func) + .sum(); } } diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day2.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day2.java index 43cb0aaa..3448ba10 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day2.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day2.java @@ -1,5 +1,6 @@ package com.sbaars.adventofcode.year22.days; +import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year22.Day2022; public class Day2 extends Day2022 { @@ -8,7 +9,11 @@ public Day2() { } public static void main(String[] args) { - new Day2().printParts(); + Day d = new Day2(); + d.downloadIfNotDownloaded(); + d.printParts(); +// d.submitPart1(); +// d.submitPart2(); } @Override diff --git a/src/main/resources/2015-examples/day2-1.txt b/src/main/resources/2015-examples/day2-1.txt new file mode 100644 index 00000000..9e58c3ad --- /dev/null +++ b/src/main/resources/2015-examples/day2-1.txt @@ -0,0 +1 @@ +2x3x4 \ No newline at end of file diff --git a/src/main/resources/2015-examples/day2-2.txt b/src/main/resources/2015-examples/day2-2.txt new file mode 100644 index 00000000..102fb048 --- /dev/null +++ b/src/main/resources/2015-examples/day2-2.txt @@ -0,0 +1 @@ +1x1x10 \ No newline at end of file From e8cc565ff1352da6fbe8634ebc1c3b82ea8b95b9 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Fri, 2 Dec 2022 06:26:08 +0100 Subject: [PATCH 336/433] Day 2 2022 --- .../sbaars/adventofcode/year22/days/Day2.java | 53 +- src/main/resources/2022-examples/day2-1.txt | 3 + src/main/resources/2022/day2.txt | 2500 +++++++++++++++++ 3 files changed, 2553 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/2022-examples/day2-1.txt create mode 100644 src/main/resources/2022/day2.txt diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day2.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day2.java index 3448ba10..31b8619d 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day2.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day2.java @@ -3,26 +3,73 @@ import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year22.Day2022; +import java.io.IOException; + +import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; + public class Day2 extends Day2022 { public Day2() { super(2); } - public static void main(String[] args) { + public static void main(String[] args) throws IOException { Day d = new Day2(); d.downloadIfNotDownloaded(); d.printParts(); +// System.in.read(); // d.submitPart1(); // d.submitPart2(); } + enum Shape {ROCK, PAPER, SCISSOR}; + enum Outcome {DRAW, WIN, LOOSE}; + + public record Game(String a, String b) { + private Shape getShape(String s){ + return switch (s) { + case "A", "X" -> Shape.ROCK; + case "B", "Y" -> Shape.PAPER; + case "C", "Z" -> Shape.SCISSOR; + default -> throw new RuntimeException(s); + }; + } + + private Shape choose(Shape s, Outcome desired) { + return Shape.values()[(s.ordinal() + desired.ordinal()) % Shape.values().length]; + } + + private long getScore() { + Shape sa = getShape(a); + Shape sb = getShape(b); + long baseScore = sb.ordinal()+1; +// ?System.out.println(baseScore +", "+sa+", "+sb+", draw="+(sa == sb)+", win="+(sa.ordinal() == ((sb.ordinal() + 1) % Shape.values().length))); + if(sa == sb) { //draw + return baseScore + 3; + } else if(sa.ordinal() == ((sb.ordinal() + 1) % Shape.values().length)) {//loss + return baseScore; + } else return baseScore + 6; //loss + } + + private long getScore2() { + Shape sa = getShape(a); + Shape sb = choose(sa, b.equals("X")?Outcome.LOOSE:b.equals("Y")?Outcome.DRAW:Outcome.WIN); + long baseScore = sb.ordinal()+1; +// System.out.println(baseScore +", "+sa+", "+sb+", draw="+(sa == sb)+", win="+(sa.ordinal() == ((sb.ordinal() + 1) % Shape.values().length))); + if(sa == sb) { //draw + return baseScore + 3; + } else if(sa.ordinal() == ((sb.ordinal() + 1) % Shape.values().length)) {//loss + return baseScore; + } else return baseScore + 6; //loss + } + } + @Override public Object part1() { - return ""; + return dayStream().map(String::trim).map(s -> readString(s, "%s %s", Game.class)).mapToLong(Game::getScore).sum(); } @Override public Object part2() { - return ""; + return dayStream().map(String::trim).map(s -> readString(s, "%s %s", Game.class)).mapToLong(Game::getScore2).sum(); } } diff --git a/src/main/resources/2022-examples/day2-1.txt b/src/main/resources/2022-examples/day2-1.txt new file mode 100644 index 00000000..db60e363 --- /dev/null +++ b/src/main/resources/2022-examples/day2-1.txt @@ -0,0 +1,3 @@ +A Y +B X +C Z diff --git a/src/main/resources/2022/day2.txt b/src/main/resources/2022/day2.txt new file mode 100644 index 00000000..d7d6a83d --- /dev/null +++ b/src/main/resources/2022/day2.txt @@ -0,0 +1,2500 @@ +B Z +B Z +C Z +C Z +B X +C Y +A Y +B Z +A Z +A Y +C Z +C X +C Z +C X +B X +B Z +B Z +A Z +C Z +C Z +C Y +C Z +B Z +B Z +A X +A Y +B Z +B Z +C Z +B Z +B Z +C X +C Z +A Y +A X +A X +C Z +C Z +B X +C X +B Z +A Z +B X +B Z +B Z +A Z +B Z +A Y +C Z +C Z +B X +C Z +A Z +C Z +C Z +C Z +C Z +A Z +B Z +C Z +A Z +C Z +C Z +C Y +A Y +C X +C Z +C Z +C Z +C Z +A Y +C X +A Y +A Y +C X +B Z +A Y +C Y +C Z +B Z +C Z +B Z +B Z +B Z +C Y +B Z +A Y +C Z +C Z +A X +C X +C Z +A X +C Z +C Z +C X +A Z +C Z +C Z +B Z +C Y +A Y +C Y +C Y +A Z +B Z +C Z +C Z +C Z +A Z +C Z +B X +C Z +A Y +C Z +C X +C Y +C Y +B Z +C Z +C Z +A X +C X +C Z +C Z +A Z +B Z +B Z +C X +C Z +B Z +C X +B Z +C Z +B Z +B Z +B Z +B Z +C Y +C Z +B Z +C Z +C Z +C Z +C Z +B Z +C Z +B Z +C Z +B Z +C Z +C Y +C Z +C Z +C X +C Z +C Z +C Y +C Z +C Y +C X +B Z +B Z +C Z +A Z +C Z +C Z +C Z +B Z +C Z +B Z +C Z +B Z +C Z +C Z +B X +B Z +C Z +C Z +A Z +A Z +B Z +C Z +C Z +A Z +B X +C X +A Z +C Z +C Z +B Y +B Z +B Z +A Y +B Z +C Z +C Z +A Y +B Z +C Y +A Z +C X +A Z +A Y +C X +C Y +C Z +B Z +C Z +A Y +B Z +B Z +C Z +C Z +C Z +C Z +C Z +B Z +C Z +A X +C Z +C Z +A Y +C Z +A Y +C Z +B Z +C Z +A Y +C Z +C Y +C Z +B Z +C X +A Y +C X +A Y +B X +C Y +B X +C Z +C Y +C Z +C Y +C Y +B Z +C Z +A Y +C X +C Z +C Z +B Z +A Z +C Z +C Z +C Y +C Z +C Y +B X +C Z +C Z +C Z +C X +A Y +B Z +C Z +C Z +C Z +B Z +A Y +A Z +A Y +B Z +A Z +A Y +B Z +C Z +A Y +A Z +B Z +B Z +B Z +C Z +C Z +C Z +C Z +C Z +C Z +B Z +C Z +C Z +C Z +A Z +A Y +C X +C Z +A Z +C Z +A Y +C Z +A Y +C Z +C Z +A X +C Y +C Z +A X +C X +A X +B Z +C Z +A X +C Z +B Z +A X +C Z +A Y +A Z +C Y +A Y +C Y +A Z +B Z +A Z +B Z +C X +C X +C Z +C Z +B Z +A Y +C Z +A Y +C Z +B Z +B X +B X +B X +A Z +B Z +C X +C Z +A Y +C Z +B X +A Y +C X +B Z +C Z +C Z +C Z +C Z +A Z +B Z +B Z +B X +A Y +C Z +C X +A Y +C Z +C Z +C Z +A Y +A X +B Z +C Z +A Z +C Y +A Z +B Z +A Y +C Z +C Z +B Z +A Y +B Z +A Z +A Y +C Z +A X +C Z +C Z +B Z +C Z +C X +A Y +A Y +B Z +C Z +B X +A Y +C Z +C Z +A X +A Z +C Z +C Z +A Y +C Z +C Y +A Y +A Y +B Z +C Z +C Z +C X +C Z +A Y +B Z +C Z +C Z +A Y +B Z +C Z +C Z +B Z +A Y +B Z +C Z +C Z +C Z +C X +C Z +C Z +C Z +C Y +C X +C Y +C Z +B Z +A Y +C X +B Z +C X +C X +C Z +A Z +C Z +B X +A Y +C Z +B Z +A X +B X +C X +C Z +C Z +B Z +B Z +C Z +C Z +A Y +B Z +A Z +B Z +A Z +A X +C Z +A Z +A Z +B X +A Z +B Z +B Z +A Y +C Y +B Z +B Z +B Z +B Z +C Z +B Z +C Z +B Z +C Y +C Z +C Z +C X +C Z +C Y +C Y +C X +A Y +C Y +B Z +C Z +A Y +A Z +B X +C Z +C Z +A Y +A Y +A Y +C Z +A Z +C Z +B Y +A X +A Y +C Z +A X +B Z +C Z +C Z +B Z +C Z +A Z +C X +C Z +B Z +B Z +C Z +B Z +A Z +C Z +C Z +A Y +B Z +A Y +B Z +C Z +B Z +C Z +B Z +B Z +A Y +C Y +B Z +C Z +A Z +B Z +C Z +C Z +A Z +B Z +C Z +A Y +A Z +C X +B Z +A Y +A Y +C Z +A Z +B Z +B Z +C Z +C Z +C Z +C Z +A Y +A X +C Z +B Z +C Z +C Z +C Y +C Z +A X +A Z +C Z +B X +A Z +B X +B X +A Y +A Y +A Y +C Z +C Z +C Z +A Z +C X +A Y +C Z +B Z +C Z +A X +B Z +A X +A Z +C Z +C Z +C Z +B X +B Z +C X +B Z +C Z +C Z +C Z +A Y +B Z +B Z +C Z +A X +B Z +A Y +C Z +A Y +A Y +C Z +C Z +A Y +C X +C Z +A Y +C Z +B Z +B Z +C Z +C Y +B Z +B Z +C Z +A Y +C Z +B Z +B X +A Y +A Z +C Z +B Z +C Z +C X +A Y +A Z +A Y +B Z +A Z +B Z +A Y +A Y +B Z +C Z +C Z +C Z +A Y +A X +B Z +A Y +C Z +B X +C Z +C Z +A Y +C Z +C Z +C Y +C Z +C Y +B Z +B Z +C Z +C Z +B Z +B Z +B Z +C Z +B Z +B Z +C Z +C Z +C X +C Z +C Z +B Z +B Z +C X +A Y +C Y +C X +B Z +C X +B Z +C Z +A Z +C Y +C Z +C X +B X +A Y +C Y +A X +C Z +C Z +C Z +C Z +A Y +C Y +C Z +A Y +C Z +C Z +B Z +B Z +B Z +C Z +C Z +C Z +C Z +C Z +C Z +B Z +C Z +B Z +C Z +B Z +C Z +C Z +B Z +C Z +C Z +C Z +A Y +C Z +C Z +A X +C Z +C Z +A X +B Z +C Z +A Y +C X +C Z +A Z +C Y +A Y +C Z +B Z +C Z +B Z +C X +C Y +B Z +C Z +C Z +A Y +C X +C Z +C Z +B X +C Z +C Z +C Z +C Z +A Z +A Y +C Z +B Z +C Z +B Z +A Y +B Z +C Z +B Z +B Y +C Z +B Z +A Y +C Z +C Y +C Z +A X +B Z +C Z +A Z +A Z +B Z +A X +B Z +B Z +C Y +C Z +C Z +B Y +B Z +C Z +A Y +B X +B Z +C Z +C Z +C Z +B X +A Y +A Y +B Z +B Z +C Z +B Z +C Z +C Y +B Z +B Z +B X +A Y +A Y +A Y +B X +C Z +C Z +B Z +C Z +C X +B Z +C Z +C Z +B Z +C Z +C Z +A Y +B Z +A Y +C Y +B Z +B Z +B Z +C X +C Z +C Z +C Z +C X +C Z +A X +B Z +C Z +C Z +A Y +B Z +C Z +A Y +C Z +B Z +C Z +C Z +B Z +B Z +C Z +C Z +C Y +C Z +C Y +C X +C Z +C Y +C Z +A Y +B Z +B Z +A Y +B Z +B X +B X +A Z +C Y +C Z +C Z +B Z +C Z +C Z +C Z +C Z +C Y +C Z +B Z +C Z +C Z +C Z +B Z +B Z +C Z +B X +C Y +A X +C Z +A Z +C Y +C Z +C Z +B Z +C Z +C Z +C Z +B Z +A Y +A Z +B X +C X +A Y +A Y +C Z +C Z +C Z +C Z +C Z +C Z +C Y +C Z +C Z +C Z +A Y +A Z +C Z +A Y +C Z +C Z +B Z +B Z +B X +A Y +B Z +C Y +C Z +B Z +A Z +A Y +A X +C Z +B Z +C Z +B Z +B Z +C Z +C Z +C Z +C Z +A Y +A Z +C Z +C Z +A Y +C Y +C Z +A X +B X +B X +C Z +C Z +B Z +A Y +A Y +A Y +A X +C Z +B Z +B Z +B Z +A Y +C Y +B Z +A Z +C Z +B X +C Z +C Z +C X +C X +C Z +A Y +B Z +C Z +A Y +C Z +A X +C Z +B Z +B Z +B Z +C Z +B Z +C Z +A Z +C Z +B Z +C Z +A Y +C Z +A Z +C Z +C Y +B Z +A Z +C Z +B Y +A Z +C Z +A X +C Z +B Z +A X +C Z +B Z +C Z +C X +A Y +C Z +B Z +A X +C Z +B Z +C Z +A Y +C Z +C Z +C Z +B Z +C Y +C Z +C X +A Z +C Z +C Z +B Z +C Z +C Z +C Z +A Z +C Z +A Y +A X +C Z +A Y +C X +C Z +B Z +C Z +B Z +B Z +A Y +B Z +A Y +A Y +C X +B Z +C Z +C Z +C Z +C Z +C Z +A Y +B Z +C Z +A Y +B Z +C Z +C Z +A Y +B Z +C Z +C Y +B Z +C Z +B Z +A Z +C X +B Z +C Y +C Z +C Z +C X +C X +A X +C Z +B Z +A Z +C Z +B Z +B X +C Z +C Z +C Z +C Z +B Z +B X +C Z +C Z +C Z +B Z +C Y +B Z +B X +C Y +C Z +C Z +B Z +A Z +C Y +C X +C Z +B Z +C Z +C Z +C Z +B Z +B X +C Z +C Z +A Y +C Z +C Y +A Y +A Z +B Y +C Z +A Y +C X +C X +C X +C Z +B Z +C Z +C Z +B Z +C Z +A Y +C Z +C Z +B Z +C X +C Z +B Z +C Z +A Y +C Z +C Z +C X +C Z +B Z +C Y +C Z +A Z +C Z +B Z +A Z +B Z +C Z +A Y +B Z +C Z +C Z +B Z +A Z +C Z +C X +C Z +C Z +A Y +A Y +A Z +C Z +A Y +A X +C Z +C Z +C Z +C X +A Z +C Z +A Y +C Z +C Z +C Y +C Z +C Z +B Z +C Z +C Z +B Z +B Z +C Z +C Z +C Z +B Z +C Z +C Z +C Y +B Z +C Y +B Z +B X +C Z +C Z +A Y +B Z +C Y +B Z +B Z +B Z +B Z +C Z +C Y +A X +C Z +C Z +C Z +C Z +C Z +B Z +C Z +A Y +C Z +C Z +A Y +A Y +C Z +C Z +B Z +B Z +C X +C Z +C Z +A X +C Z +C Y +C Z +B Z +C Z +A Y +C Z +C Z +C Z +C X +A Y +C Z +C X +B Z +C Z +C Z +C Y +C Z +A Y +B Z +B Z +A X +C Y +C Z +B X +A X +C Z +C Z +C Z +C Z +C Y +A X +B Z +C Z +C Z +A Y +B X +A Z +A Y +B Z +C Z +C X +A X +C X +C Y +C Z +B X +A X +C Z +C Z +B X +A Y +A Y +A Y +C Z +C Z +A Y +C Z +A Z +A Y +C Z +B X +C Z +C Z +C X +C Z +C Z +A Z +B Z +A Z +C Y +C Y +C Y +C Z +C X +C Z +A Y +B Z +C Z +B Z +C Z +A Y +C X +C Z +C Z +B Z +C Z +C Y +A Y +B Z +B Z +B X +B Z +C Z +A Y +C Z +B Z +A Y +C Z +C Z +B Z +A Y +C Z +C Z +C Z +C Z +A Z +A Y +C Z +C X +A Z +A Z +C Z +C Z +C Z +A Y +B Z +B Z +B Z +B Z +C Z +C X +C Z +C Z +B Z +B Z +C Z +C X +A Z +A Y +C Z +B Z +C X +C X +A Y +A Y +C Z +B X +C Z +C Y +C X +A Y +C Y +C Z +C Z +B Z +A Z +C Z +C Z +C Z +C X +C Z +B Z +A Y +C Z +B Z +C Z +A Y +A Y +B X +B X +B Z +C Z +C Z +C Z +C Z +C X +C Z +B Z +C X +C X +A Z +B Y +C Z +C Z +C X +B Z +C Z +C Z +A Z +C Z +C X +A Y +A Z +C Z +B Z +C Z +B X +A Y +C Z +C Z +B Z +C X +B Z +B Z +C Z +C Z +C Z +B Z +A Z +C Z +A X +C Z +C Z +C Z +C X +C X +B Z +C Y +C Z +C Y +A Z +A Y +A X +B Z +A Y +C Z +C Y +B Z +B Z +B Z +B Y +B Z +A X +C Z +A Y +B Z +A Y +C Z +C Z +C Z +A Y +C Z +B Z +C Z +A Z +C Y +C X +A Y +A Y +A Y +B Z +C Y +C Z +C Z +C X +B Z +A Y +C Z +C Z +B Z +A Z +C Z +B Z +C X +C Z +B Z +C Z +C Z +B Y +B Z +C Y +B Z +A X +C Y +B Z +C Z +A Y +C Z +A Z +C Z +B Z +A X +C Y +C Y +A Y +A Z +B Z +A Z +C Z +C Y +C X +C Z +A Y +C Z +A Y +C Z +C Z +C Z +C Y +C X +C X +B Z +A Y +C Z +A X +C Z +A Z +C X +A X +A Z +A Y +C Z +C Z +C Z +B Z +B Z +C Z +C Z +C Z +A Y +C Z +A Z +C Z +C Z +C X +C X +C Z +C Z +C Z +C Z +C Z +A Y +B Z +B Z +C Z +B X +C Y +C Z +C Z +C Z +A Y +B X +C Z +C X +B Z +A Z +B X +C Z +C Z +B Z +C X +B Z +C Z +A Y +C X +A Y +A Z +C Y +C Z +C Y +C Z +C X +C Z +C Z +C Z +C Z +C Z +C Z +B Z +C Z +B Z +C X +C Z +C X +B Z +A Z +A X +C Z +A Y +C Y +C Z +C Z +C Z +B Z +B Z +A X +C Z +B Z +C Z +C Z +A X +C Z +B Z +C X +C Z +C Z +C Z +C Z +B X +C X +B Z +C Z +B Z +A Y +C Z +A Y +B X +C Z +C Z +C Z +C Z +A Y +C Z +C Z +B Z +C Z +C Z +B Z +A Y +C X +C Z +C Z +A Y +C X +B Z +B Z +A Y +C Z +B Z +C Z +A Y +B Z +A Z +C Z +B Z +C Z +B Z +C X +B Z +C Z +C Z +C Z +A Y +A Y +C Z +B Z +A Y +B X +C Z +B Z +C X +C Z +B Z +B Z +C Y +C Y +A Z +C X +C Z +B Z +A Y +C Z +C Z +B Z +A Y +B Z +A Z +C Z +B Z +B Z +B Z +C Z +C X +B Z +C Z +B Z +C Z +C Z +A Y +A Y +C Z +C X +A Y +B Z +C Z +A Z +C Z +B Z +A Y +C Z +C X +C Z +C Z +C Z +C Z +A Y +C Z +C X +B Z +B X +C Z +A Y +C Y +C Z +C Z +C X +C Z +C X +C X +C Z +B Z +B X +A Z +A Z +C Z +C Y +A Y +C Z +A Y +C Z +C Z +C Z +B Z +B Z +C Z +B Z +C Z +C Z +C Y +B Z +B Z +C Z +C Z +B Z +C X +A Z +C Z +C Z +A Y +A Y +A Y +C Z +C Z +B Z +A Z +A X +A Y +C X +C Z +B Z +C X +C X +B Z +B Z +B X +C Z +C Y +B Y +C Z +C Z +C Z +B Y +A Y +A Y +C Z +C Z +C Z +C Z +C Z +C Z +C Z +C Z +B X +A Z +A X +C Z +A Y +A Z +C X +C Z +C Y +C Z +C Z +C Z +B Z +B Z +A Y +A Z +C X +B X +B X +C Z +C Y +C Z +C Z +C Y +C Z +C Z +A Z +B Z +C Z +A Y +C Z +C Z +C Z +A Y +C Z +B Y +B X +C Z +A Y +B X +C Y +A Y +C Z +C Z +C Y +A Z +B Z +C Z +C Z +B Z +C Y +C X +C Y +C Y +B Z +C Z +B Z +C Z +A Y +A Y +A Y +B Z +C Z +A Z +C Z +C Y +B Z +B Z +C Y +C Z +C Z +A Y +C Z +C Z +B Z +C Z +C X +A X +A Y +A Y +B Z +C Z +B X +A Y +B Z +C Z +C Z +B Z +A Y +C Z +C Z +B X +A Y +C Z +B X +A Y +C Z +C X +A Z +B Z +B Z +C Z +C X +A Y +C Z +C Z +A Y +B Z +C Z +A Y +C Z +A Y +C Z +B Z +C Z +A X +B Z +C Z +C Z +C X +B Y +A Y +A X +C X +B Z +C Z +C X +B Z +C Z +C Z +C Z +C Z +A Z +C Z +A Y +B X +C Z +C Z +B Z +B Z +C X +B Z +B X +C Z +C Z +C Z +A Y +C Z +C Z +C Z +C Z +A Y +A Z +B Z +C Y +A Z +C Z +C Z +C Z +B X +B Z +C Z +B Z +C Z +C X +C Z +A X +C Z +C Z +C Z +C Z +C Z +A Y +A Y +B Z +B Z +B Z +B Z +C Z +C Z +C Z +C Z +A Z +A Y +C Z +A Z +A Y +C Z +C Z +C Y +A Y +B Z +C X +B Z +A Y +C Z +A Y +C Z +B Z +B Z +B Z +C Z +C Z +A Z +A Y +C X +A Y +C Z +A Y +C Z +C Z +A Y +B Z +C Z +C Y +C Z +B Z +B Z +B Z +C Y +C Z +B Z +C X +B Z +A Y +B Z +C Z +A Y +C Z +C Y +C Z +C Z +C Z +C Z +B X +B Z +C Z +C Z +A Y +C Y +C Z +C Z +C Z +C Z +C Z +C X +B Z +C X +A Y +B X +A Y +C Z +B Z +A Y +B Z +C Z +A Y +C Z +C Z +C X +C X +C Z +B Z +C X +C Z +A X +A Z +C Z +C Y +A Y +A X +B Z +C Z +C Z +B Z +A Y +C Z +A X +B Z +B Z +A X +C Y +C Z +A Y +B Z +C Z +C Z +C Z +B Z +C Z +B Z +C Z +B X +B Z +C Z +A X +C Z +A X +C Z +A Y +C Z +A Z +C Z +C Z +C Z +B X +A Y +A Y +A X +B Z +B Z +C Y +C Z +B Z +A X +C Z +A Y +C Z +C Z +B Z +C Z +C X +B X +B Z +B X +C Z +C Z +B Z +A Z +C Z +C Y +C Y +C Z +C Z +C Z +C Z +C Z +C Z +A X +A Z +C Z +B Z +B Z +B Z +C X +A Z +C Z +C Z +B Z +B Z +C Z +B X +C Z +B Z +C Z +C Z +C Z +C Z +A X +A Z +A Y +C Z +A Z +A Y +C Z +A Z +C Z +A Y +C Z +B Z +C Z +A Y +C Y +A Y +B Z +A Y +B Z +C Z +B X +C X +C Z +B Z +A Z +C Z +B X +C Y +C Z +C Y +A X +C X +C X +B Z +A Y +C Z +A Z +B Z +C Z +C X +C Z +C Z +C Z +C Z +C Z +B Z +B Z +C Z +C Z +C Z +C Z +C X +A Z +C Z +A Y +A Y +C Z +C Z +C Y +C Z +A Y +C Z +B Z +B X +A Z +A Y +A Y +C Z +A Y +C Z +A X +A Y +B X +C Z +C Z +A Z +C Z +A Y +B Z +A Y +C Z +C Z +B Z +C X +C Z +C Z +C Z +C Y +C Z +B X +C Z +C Z +B X +A Z +C Z +C X +C X +B Z +C Z +C Z +B Z +C Z +C Z +B Z +B Z +B Z +B Z +B Z +A Z +C X +C Y +C Z +A Y +C Z +B Z +A Y +C Z +C Z +B Z +B Z +C Z +A Z +A X +A Y +C Z +A Z +C Z +C X +B Z +C Z +A X +B Z +B X +C Z +C Z +C Z +B X +C Z +B Z +B Z +A Y +A Y +A Z +C Z +C Z +C Z +B Z +C Z +B Z +C Z +A Z +C Z +C X +C Z +C Z +C Z +B Z +A Y +C Y +C Z +C Z +C Z +C Z +B Z +C Y +C Z +A Z +C Y +C Z +B X +A Y +A Y +A X +B Z +B Z +C Z +A Y +B X +A Y +C X +C Z +A Y +C X +C Z +C Z +A Z +C X +C Z +C X +C Z +A Y +C Z +C Z +B Z +C Z +C Y +A Z +C X +C Y +C Z +C Z +C Y +B Z +B Z +C X +C Z +C Z +C Z +C Z +B Z +C Z +C Z +C Z +B Y +C Y +C Z +B Z +C Z +C Z +C Y +B Z +A Y +A Z +C Y +C Y +C Z +C X +C Z +A Z +C Z +C Z +A Y +A Z +C Z +A Z +C Z +B Z +B X +B Z +B Z +A Z +C Z +A Y +C Z +C Y +C Z +A Z +B Z +B Z +B Z +C Z +B Z +A Z +A Y +C Z +C Z +C Z +C Z +C Z +A Z +C Z +A Z +A X +B Z +A Y +C X +A Z +B X +B Y +A Y +B Z +A Z +B Z +B Z +C Z +A Z +B Z +B Z +A Y +C Y +C Y +A X +C Z +C Z +C Z +C X +C Z +C Z +C Z +C Z +B Z +A Y +C Z +C Z +C Z +A Z +C X +C Z +B Z +C Y +B X +B Y +C Z +C Z +A X +C Y +C X +B Z +B Z +C Z +B Z +C Y +C Y +C Y +C X +C Z +C Z +C Z +C X +A Y +C Z +C Z +B Z +A Z +C Z +A Y +B X +C Z +C X +C Z +A Z +B Z +A Y +C Z +C Z +C Z +A Z +C Z +C Z +C X +C Z +C Z +B Z +C Z +B Z +C X +C Z +A Y +A Y +C Z +C Z +B Z +C Z +C Z +C X +C Z +A Y +C Z +C Z +C Z +B Z +C Z +A Y From aaf18c5c7fd2d1fe7b504f397e65235bf756a573 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Fri, 2 Dec 2022 06:39:49 +0100 Subject: [PATCH 337/433] Refactor solution --- .../sbaars/adventofcode/year22/days/Day2.java | 61 ++++++++++--------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day2.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day2.java index 31b8619d..2d6cdaad 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day2.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day2.java @@ -1,11 +1,13 @@ package com.sbaars.adventofcode.year22.days; -import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year22.Day2022; import java.io.IOException; +import java.util.stream.Stream; import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; +import static com.sbaars.adventofcode.year22.days.Day2.Outcome.*; +import static com.sbaars.adventofcode.year22.days.Day2.Shape.*; public class Day2 extends Day2022 { public Day2() { @@ -13,23 +15,18 @@ public Day2() { } public static void main(String[] args) throws IOException { - Day d = new Day2(); - d.downloadIfNotDownloaded(); - d.printParts(); -// System.in.read(); -// d.submitPart1(); -// d.submitPart2(); + new Day2().printParts(); } enum Shape {ROCK, PAPER, SCISSOR}; - enum Outcome {DRAW, WIN, LOOSE}; + enum Outcome {DRAW, WIN, LOSS}; public record Game(String a, String b) { private Shape getShape(String s){ return switch (s) { - case "A", "X" -> Shape.ROCK; - case "B", "Y" -> Shape.PAPER; - case "C", "Z" -> Shape.SCISSOR; + case "A", "X" -> ROCK; + case "B", "Y" -> PAPER; + case "C", "Z" -> SCISSOR; default -> throw new RuntimeException(s); }; } @@ -38,38 +35,44 @@ private Shape choose(Shape s, Outcome desired) { return Shape.values()[(s.ordinal() + desired.ordinal()) % Shape.values().length]; } - private long getScore() { + private long getScore1() { + return getScore(getShape(b)); + } + + private long getScore(Shape sb) { Shape sa = getShape(a); - Shape sb = getShape(b); long baseScore = sb.ordinal()+1; -// ?System.out.println(baseScore +", "+sa+", "+sb+", draw="+(sa == sb)+", win="+(sa.ordinal() == ((sb.ordinal() + 1) % Shape.values().length))); + return switch(calculateOutcome(sa, sb)) { + case LOSS -> baseScore; + case WIN -> baseScore + 6; + case DRAW -> baseScore + 3; + }; + } + + private Outcome calculateOutcome(Shape sa, Shape sb) { if(sa == sb) { //draw - return baseScore + 3; - } else if(sa.ordinal() == ((sb.ordinal() + 1) % Shape.values().length)) {//loss - return baseScore; - } else return baseScore + 6; //loss + return DRAW; + } else if(sa.ordinal() == ((sb.ordinal() + 1) % Shape.values().length)) { //loss + return LOSS; + } else return WIN; //win } private long getScore2() { - Shape sa = getShape(a); - Shape sb = choose(sa, b.equals("X")?Outcome.LOOSE:b.equals("Y")?Outcome.DRAW:Outcome.WIN); - long baseScore = sb.ordinal()+1; -// System.out.println(baseScore +", "+sa+", "+sb+", draw="+(sa == sb)+", win="+(sa.ordinal() == ((sb.ordinal() + 1) % Shape.values().length))); - if(sa == sb) { //draw - return baseScore + 3; - } else if(sa.ordinal() == ((sb.ordinal() + 1) % Shape.values().length)) {//loss - return baseScore; - } else return baseScore + 6; //loss + return getScore(choose(getShape(a), b.equals("X")? LOSS :b.equals("Y")?Outcome.DRAW: WIN)); } } @Override public Object part1() { - return dayStream().map(String::trim).map(s -> readString(s, "%s %s", Game.class)).mapToLong(Game::getScore).sum(); + return input().mapToLong(Game::getScore1).sum(); } @Override public Object part2() { - return dayStream().map(String::trim).map(s -> readString(s, "%s %s", Game.class)).mapToLong(Game::getScore2).sum(); + return input().mapToLong(Game::getScore2).sum(); + } + + private Stream input() { + return dayStream().map(String::trim).map(s -> readString(s, "%s %s", Game.class)); } } From 38c20e321da36056924bd12d1c69814e3150de3a Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Fri, 2 Dec 2022 06:40:09 +0100 Subject: [PATCH 338/433] Remove some comments --- src/main/java/com/sbaars/adventofcode/year22/days/Day2.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day2.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day2.java index 2d6cdaad..2e6225fc 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day2.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day2.java @@ -50,11 +50,11 @@ private long getScore(Shape sb) { } private Outcome calculateOutcome(Shape sa, Shape sb) { - if(sa == sb) { //draw + if(sa == sb) { return DRAW; - } else if(sa.ordinal() == ((sb.ordinal() + 1) % Shape.values().length)) { //loss + } else if(sa.ordinal() == ((sb.ordinal() + 1) % Shape.values().length)) { return LOSS; - } else return WIN; //win + } else return WIN; } private long getScore2() { From 80bb4d25490218d5ad79f14490777fc75553455a Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Sat, 3 Dec 2022 06:27:12 +0100 Subject: [PATCH 339/433] Day 3 2022 --- .../com/sbaars/adventofcode/common/Day.java | 4 + .../sbaars/adventofcode/util/FetchInput.java | 2 +- .../sbaars/adventofcode/year22/days/Day1.java | 1 + .../sbaars/adventofcode/year22/days/Day3.java | 37 ++- src/main/resources/2022-examples/day3-1.txt | 6 + src/main/resources/2022-examples/day3-2.txt | 3 + src/main/resources/2022-examples/day3-3.txt | 3 + src/main/resources/2022/day3.txt | 300 ++++++++++++++++++ 8 files changed, 351 insertions(+), 5 deletions(-) create mode 100644 src/main/resources/2022-examples/day3-1.txt create mode 100644 src/main/resources/2022-examples/day3-2.txt create mode 100644 src/main/resources/2022-examples/day3-3.txt create mode 100644 src/main/resources/2022/day3.txt diff --git a/src/main/java/com/sbaars/adventofcode/common/Day.java b/src/main/java/com/sbaars/adventofcode/common/Day.java index 065e6e19..0227f195 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Day.java +++ b/src/main/java/com/sbaars/adventofcode/common/Day.java @@ -132,4 +132,8 @@ public void downloadIfNotDownloaded() { new FetchInput().retrieveInput(Integer.toString(day), Integer.toString(year)); } } + + public void downloadExample() { + new FetchInput().retrieveExamples(Integer.toString(day), Integer.toString(year)); + } } diff --git a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java index c4ce557e..3f10ceff 100644 --- a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java +++ b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java @@ -36,7 +36,7 @@ private void retrieveDay(String day, String year) { retrieveExamples(day, year); } - private void retrieveExamples(String day, String year) { + public void retrieveExamples(String day, String year) { var matches = getMatchesByXpath(doRequest(year + "/day/" + day), "//pre/code"); for (int i = 0; i < matches.size(); i++) { File file = getFile(day + "-" + (i + 1), year + "-examples"); diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day1.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day1.java index 18a10ae3..c3ab7e9f 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day1.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day1.java @@ -15,6 +15,7 @@ public static void main(String[] args) { Day d = new Day1(); d.downloadIfNotDownloaded(); d.printParts(); +// System.in.read(); // d.submitPart1(); // d.submitPart2(); } diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day3.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day3.java index c4cc9eb2..5fce32f0 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day3.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day3.java @@ -1,23 +1,52 @@ package com.sbaars.adventofcode.year22.days; +import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year22.Day2022; +import java.io.IOException; +import java.util.List; + public class Day3 extends Day2022 { public Day3() { super(3); } - public static void main(String[] args) { - new Day3().printParts(); + public static void main(String[] args) throws IOException { + Day d = new Day3(); + d.downloadIfNotDownloaded(); + d.downloadExample(); + d.printParts(); + System.in.read(); +// d.submitPart1(); + d.submitPart2(); } @Override public Object part1() { - return ""; + return dayStream().map(String::trim).map(e -> new String[]{e.substring(0, e.length()/2), e.substring(e.length()/2)}) + .mapToLong(e -> { +// System.out.println(e[0]+", "+e[1]); + List chars1 = e[0].chars().mapToObj(i -> i >= 'a' && i <= 'z' ? i - 'a' + 1 : i - 'A' + 1 + 26).toList(); + int x = e[1].chars().map(i -> i >= 'a' && i <= 'z' ? i - 'a' + 1 : i - 'A' + 1 + 26).filter(i -> chars1.contains(i)).findFirst().getAsInt(); +// System.out.println(x); + return x; + }).sum() ; + } @Override public Object part2() { - return ""; + List s = dayStream().map(String::trim).toList(); + long sum = 0; + for(int x = 0;x chars1 = a.chars().mapToObj(i -> i >= 'a' && i <= 'z' ? i - 'a' + 1 : i - 'A' + 1 + 26).toList(); + List chars2 = b.chars().mapToObj(i -> i >= 'a' && i <= 'z' ? i - 'a' + 1 : i - 'A' + 1 + 26).toList(); + int y = c.chars().map(i -> i >= 'a' && i <= 'z' ? i - 'a' + 1 : i - 'A' + 1 + 26).filter(i -> chars1.contains(i) && chars2.contains(i)).findFirst().getAsInt(); + sum += y; + } + return sum; } } diff --git a/src/main/resources/2022-examples/day3-1.txt b/src/main/resources/2022-examples/day3-1.txt new file mode 100644 index 00000000..f17e7267 --- /dev/null +++ b/src/main/resources/2022-examples/day3-1.txt @@ -0,0 +1,6 @@ +vJrwpWtwJgWrhcsFMMfFFhFp +jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL +PmmdzqPrVvPwwTWBwg +wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn +ttgJtRGJQctTZtZT +CrZsJsPPZsGzwwsLwLmpwMDw diff --git a/src/main/resources/2022-examples/day3-2.txt b/src/main/resources/2022-examples/day3-2.txt new file mode 100644 index 00000000..c6fcad8f --- /dev/null +++ b/src/main/resources/2022-examples/day3-2.txt @@ -0,0 +1,3 @@ +vJrwpWtwJgWrhcsFMMfFFhFp +jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL +PmmdzqPrVvPwwTWBwg diff --git a/src/main/resources/2022-examples/day3-3.txt b/src/main/resources/2022-examples/day3-3.txt new file mode 100644 index 00000000..17a80616 --- /dev/null +++ b/src/main/resources/2022-examples/day3-3.txt @@ -0,0 +1,3 @@ +wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn +ttgJtRGJQctTZtZT +CrZsJsPPZsGzwwsLwLmpwMDw diff --git a/src/main/resources/2022/day3.txt b/src/main/resources/2022/day3.txt new file mode 100644 index 00000000..e12b761c --- /dev/null +++ b/src/main/resources/2022/day3.txt @@ -0,0 +1,300 @@ +NJvhJcQWTJWTNTFFMTqqGqfTmB +VwVzPldRZVLVRmfsvfjvqfmm +ZDPDHZHVcvDhbvnv +FHHwHBzzVCWWmmCzCPrVmgBwbLTtRFFbbbttRGRLjTcLpbbT +vhZZvdsNSdSMdNvjncppCLcLnGnj +CDZZsNZMZqdNSdlNZCqrzPHDzgrgzwVVWwmwwm +ndlndntsFJntFvccLjjLrjBShcBBfc +GpCGHzVwmmzqQWSSSfWHBhQL +mpCMGGCZVzVwGGVwmJsZnFtZnTSTJtdsvl +nCnPDGmDNmVCsVQDmGSWqvzchWSjjcWGqS +gTnBRLpfTRnrTdZgdLfRdrThvqcvWWhFFWvcFSSgjqqzjv +pfZfTMwrbLTTfsbmQtlVtHHnbs +wNdSdsbTvTZMTvTv +rrdRWdWQhFVdHWBGWQmmmnnMvCfmnhvmCmtZ +rJrVDRWpGddpbSlNSlspPP +chTNrthMMwWMTjfsmRzZszJpwm +BLnFFCngbcBnbbldDlpRjGpmsCzGsGsRGmmG +dqvnvlgbqtcPPMhH +QcLNqZbCzJDQBJJRpwzRpdnRldgnpf +GmmmvVGsHrWffrlwdCWd +CMsFVVFjCmFStGQbbLZNBbJBcTjc +LQVggbQvcLbQLHgvVLhWGGsChssrMWfzGccc +qDnRTTRqJttPfWMChJhGslWlzh +qRTRwPBTBtRZdnjnqqqnQVbjbNLFbbfLgVmgHLQm +cZbzwCwZPlJcMLrNSNfHWNBBNZ +vsQsDCqtsDhmtjVrBNWNjBHrhr +TtDTGnvTlgbbRCGg +BgBlplHlsgNNsJlVpBtPwJhMPRRQSSttRtSP +bvhTnmdFTzddStwStQRddt +ZnZDLvnvqZzbbhFzzmTbnFsVjVlNgsCCNVsVLpNWVgsB +TdptqrrcVGhhzFtw +DRnSfwJlDmmDDVGv +RCSQNSCQZndwbcMqQrBB +wvRlrlwVwwqzgbZRdCJBWfmdzCWfBdhf +cFcsQpNtLLsGTtNGpMdPmDdPBmmBvJPWvDtC +TpjssTFFvLLLcFFQpwbwwHngjHRrZRqZVH +mqqddrPPcPmqPDlrQnjTrbvMvbHzzsjjpTvz +gtBWgGgVhLGWHzMDztzstDHj +hfWRhBBNBGgLNQDPwdNPcPdw +LhQzdhhbTzpMhddhhhTzhnZcBFllHZFtrrHZHMHFjlHr +mwwssqDvjptrvplr +NCSgVDPDwmDgVJVpLfTznQJdhfLhnhQQ +GzjzDhjhhZzcrRgQCBjBPBBjQCgT +vHHHmntsbSgLwbsSmNHbwNbvpqPCBVppCpFTpTPTBtqWBCqV +NJbwNSwdndvmvwhGhgzcfMcDJfgJ +GncgDvvcMGnttjDvrgRRFSZZLZFWdJFJwGQwZBWZ +bPqpChPfsshfZZBdZdLTFZ +lNqqsClmbsNlPbHqPsmblmsrHdvdMngcVrjggvrvggRDcn +bDvtgVVVpMQvjQWmQL +rwTflmlfZJBBdQWQWjQqdM +HsJJmZZwscHrwTrcRbzpcbPgtCSbgz +CsCsRvshMjpbqCqf +ncblgDBgtDmmmTlBgwlgbHHqMFHLqPDMHPHHpqWfFM +TcBctSmTZTtSTzsZvsvJZRsGVb +znznvngttwltzlLwhtThHbqHPvNbNHSSHmmNWHjP +FBcLrRMFQpPqpPSpqHHW +fRQMJZJfrcMcMVrQJJftnwCzVCltgTnstTVnVL +MfLlRfCMrLzRlQgwNqQFcsGd +jtTjjBTvbdqcGjqFcj +vvShDSBDppzhCmzq +plWMptTvfrnncvcRfwqzqLGhzhzThNzNNJqD +jSdSHFPQQbdPCQCssjSbBmhJGNZZNGNqqJNBlJqqLh +VCCCVCQgjdddjCgljCjbbwgRRttgrpftfWrgvpwpnf +MWlbBcPjjvvjPWWMPqgRQZfJZDGGbRZJffQQwh +HrHrnncHpzrJQJfVDQVR +zzsSTtSTLzsspSdtTmHHmpmtFgqcgPlgFqWBqqqBMdWWvFlg +nSqBbJbqlnBBClVZcMgZVgcP +FQwrwHrRwWWFBRPNgNgcCGZZZC +rWFWFTwpwwWzHrnDbfJDLDbBBbbz +BMmNtLMMtFCNFNMvvLmcndpgcdgppPrgrGPPrgJD +WVWWhbTtVnGpjrrPhr +HWssSTHWfRHRsQQFLvfvFFCLCNMNlt +sTmDsQffVrrLCjTFltTFWL +BnwwQBJbJndMMRzMwCLlWlLWWCWLLtRlWF +cqqBMcMqwnznMGzcvDmQhrvssHmPDVssrP +pQGQGJDDrDVJbbfVzvvgPcCZwhZhncscZWWc +SqMMlBBljMmRlchhPTqThCZnPs +FMjMBmjRNFHQJJpHVhVDhG +tHNNdBdNtBBBMgsMpsZm +wVPzVvbwqzhrVqvjqzzsZpDsZDsZmsCPCgZgCM +bVbvLThvvbrWqHmmnJLdHdJQLn +PzTspPZpdLLDZTplPLpPDpvbfhnqNvqzfvNMzQQfNwnQ +GWRHmjmFWMMSnhbhHw +JWWcmtBrBtWBFWGJpsgTgldhLVLpJl +DwLMDzLMhvMcwvgdVqWWlCVgvlqF +TTSBBRpbStHZVgjWFldjRVlV +SnbTBdJBmnpQzMPDMcMznr +nNlMNBPPNtJQnbZhZsgSbh +czzCjcwTdvSbgQNcgNQq +VTdNdGDTzDTdlFFPtBrtLtDr +FMbbfMlzvFsmgVZmmg +SrNTHGmdSQDqLhtQhhgggs +dRDTSDPPcHRdHGDHlwJBbmwljmMcfjbW +sQgWLtqLtWhdqlpNZRpG +blTHTjlvTCJnJvRZdGGhHHGZhFGV +CCDlJclnCmbrmBMgcwcLWtcBsB +vqPWWvqwwCFvFZfZPRFRrcGQrQwsDrNcrwnbDNcQ +LVgJLSBBVtzTLzBMmTMJmLnnDNQcrsGbsQbNbrbDjs +zggVSmmhVdfqFhvHWG +WwdndGGmmmLwwwmRwWSncLRnZqZqhqZthBtqtBqZBgtdtvMH +FfHHzlQQDsFzzrNsVTfttZvTvttTqqtbqb +lQjFDNQFPjCsVCCDjGCwwSGGnccwcHppGp +mrjggcFsFMjdjZRpSZpn +NCqfLCFNbQPzPPlPzNfSRTRZdSdWWwndpqRSSd +vDvzzbPQFNCFtllLLNMBhMcDHGBGMggMmcBc +jhjlBvvnjbtDNPjtSjBDBbDNgHggrQrhghRQrqRrZcRwwqVg +pLdTMsWdLLmpMdqZZdPdVqZgHPwH +WLTCGmMLfPSlbGjlnnJD +gtbwhgHbHgqqbgQthgQLtZZCRjMcjjnRnrRNJmMRJrNhRc +bGWVTTvDvfpVFFBpvvVTdRDMJcrccCrJnMRnNnNCcc +FVWTBsdvdTzTBFWssVQtLgSQtHqqPzPbqHbw +dlzrPTSSjSrllzWhsvVmVtTRTWtf +bJMpLGcqGhNbJQttVQmmvRWWsp +qLbMwqqbGHFGzrlZrjhPHCrj +rNrrffVlqqrfLlPpltcBBTTGRzzZRPRsBTcJ +msbsmWSsMmQwjdMbWMhMhQmcRZRzGjTBGTBcBJBjCHJGcC +FwWbvdhbmrsFrfrgsN +rHjrQHdhdQrvSddcHWLssBSVVpBSWWWWWf +JNfTGtqDwVWBMBMpwM +qlltZgfJFvcRgcRjvc +CqfcwfDqwwmRnnqmRdNRBTRTRrdGdNpTvF +WVbzsZszBbrsvpdMpdQM +tJhbVZHWLLHDgnSwnSSgHB +TZCqqlTsqpZVVsZQJSBSLpLmppnJzmFz +brSgNtGjjRjRRjDddDtrRJcJJbJmmwcmBmnPcJFwFB +jgdRtMjNNjfqlMvShvSZSZ +dJTdqCwMNCgqTQllGBdlGBmmmZ +fcVfVcnbVfrwDLWVfncZBQPlBHRGljLZQjHGQl +brwnnfSFDvfzCTqFzgMJTh +njnsPBjjsrrnGLnbTTjGvcldQPCMllNzMvRQPCdd +ggZgfZtmZVpqZqZWDgFmgqfCcQRcRcWhQcccQddMcvRQdQ +tfqgggVgHpDwDtfwbGLJRjbLjsrLTj +JmrfrmTlDWTfgQCdHCdpqBvQdD +jsZtVzNsSNVQQHnBlVQR +PljljFjPljSsLPtFLTTgTcFrrfMJmrrmrr +hmGcmmndhmGnfmtGnDzFLwrFJQsQFzNFrNJG +ZSqPlSWcWlbgqWVTVWRVZPrjQqjzjFNJzLsNJsLJNqNL +RHcWTZbSMMMPgZcWgSWPPbVMDnBffmtdpDBddfnnvmCdfC +vSJvsbFfJfvqCsTHJswssJnLTZjjhzrrzLrzLMrzhdjM +pBNQDPcpmWDcBNgMMnZPVjdddnndhH +QWlDgmpmgDBlGRgDDgffSqwSwGCwHfvqwSFJ +jvlgvMJclPdGdtdcjMVmMHbFHFVHWHbZHZ +CwhLzLhzQpnqfpfqDVHCHbsbDFZDmHmj +LnBzfQjSzQrPvJvdSSrr +wpcvcsqclDCnVCVvWfnZ +BLRMRtbnbbBLNCjNCjVVZhbC +rFgMPSRnrRpmqpJwqFDs +LZQNQbMrZppLNLQplvlGLNvVmmmfjbwVCfjbwJwCmBCwfj +ShTPRFtTHZPCsnwswsFwCF +WtHRPdThSqZTRtDqtdRWTdpGDLLzrNczvzMGLlQLGDDM +hdcffBvldjhCMljqPwWwWNwWdwqHZr +LtQmbQRVsZQZMZPQSN +tmMRsJMpDhjJzJhv +wNQCMFCDQDBmrHmmRWrrHN +SShLnfqpcqpSZSfrzJvRVrvfrrJH +cRpqdGclpScltTQQtsFQMQsTCT +NCjggZmgfBgnBmgWbcwcTFctcWWfvb +HsDGthRGrtppSQpbFFJTVcJdFbTRvd +rPDGhDDrSzZLtzBLZMCB +RsBBMBsCBlFFCgRsBJzlMjMPNSdPhSrSrzLbmSDrDNmDSd +pZHZZJpGHHHpTTHvTncZqVLdqLbhLrDLdhrSLLbLDDdD +tGtwnJccvCtCffMBgt +wbddvVjfwPhbjjbDbbvbjvTNCNmfHZfpCZRJNzCmJmnJNC +BslcLtclZWsZJWNrRRNRpRmR +BSLBlScGtFMcssMBBFGLlQZTDZQjPddVwwbTdvvdhTZb +NSZHzmLZBnzHmLLzLSntDttDDtddhDtttDWW +QgfjsrrvNNJwtMddcvcvtq +jrfgfQpQrTTVLSNBClFV +GQWcWWPPQRcrJQNDdRcDmmLCFSnqNSmqhCNvFnql +zHfwjzpMjwZmCLqvvnlljC +ZgtVZBtHHZtgQGgPrbPRJdPv +TWdWpJTJTdgLWfWLlLFLrfrgBGsNqhGslBGHqSNqqBNshnws +ZpQmjzbZZCjZCCCPZtttRCCwsBnHNssBHbShsshHqsGBqN +RDRRPpPCzmZCtRpVVJFrfTfWFLLJggJrDv +pDDFlglsvFMgntlTMMqNffmTdfddRM +jhGJLVCHQpHGQCCzLjWdTTdZZdNdcRWNccWfNN +jQjSGjrjCQLhzVSLSCSHGDpngbrnDFtFBwBglBnBvg +wsLzstsgszcpcGLHGpcgcghlDBvQvjQvbFbQCbJBtCCJJv +mnSqRSSqSRThWRnmWWRSJDFTFCFCblbBCFQFCjFj +rZRRWqSSdZZfMVnZLspPsMgHpzMhHGPg +mwHrCLSWWwrsHCHDDsVrsmhfFZFnSSBlFlgZbbgBglbggj +GJdpcRtGJvNRdcPtdpJJdbQZfjfQBlnQBjnBtbfFnB +qcPpqqzFzJqvPVCCmWrVwhrWrz +jjMbvbhDvnRjNRGMmjbMZftSSwwwthJSffStctcwqd +lTQrVlpCVvCcfdcSJqLVcw +srHFWCHrFlrHlrsBsprljjRmDZZnmbDngNBgbNZv +MgTlQJlTQJZWpgLrRssrVqqqpRts +bBNbbzSSjMBPjzhMjsPtRVVRVPRqLttGGs +SjHBbfjNCDfjZgTlZdMJnDJW +lpThgTwtplhghgwhThqnnrdZctSZSjSZcRSRfbdrrc +RBVBGvmBmfdrcvrbbr +PmVGNGmmGRLLQwwLqTnglQ +nHwnBwBTnFHQwRsMhwghmzcm +GtprdCpdtqWdbqbrfdnPPszsWmRzRnShPszS +dGptbCfCrlnVDBJNLDLLVDLQ +CZtCjhTndCzqbCNq +dwpGvpsmwGslDszrNNrzqDMzWMgJ +vmcGccvpBVPTVTjTdTTTdZ +jWZhvZLjZfCZDwrDrSSzJGhVdJccscGsgV +blMBlRqqqgSJLBLcsJ +blmHLmFMMMnRqLmMMFqHmfPDfjQDnCDDQrZvfCjvDr +rnvnHrDLFZmMFLvrHQBMGQggBztzglplRl +sbWWhdNzsshsfhcsjJJPPbWdtQGVGllRTRjRRgBgQlpRlppB +PPCCwNWhPhNfWCzbqmFnDFFnCDLSrvZS +GChNjwWlWJWTJZBggvdgnQgdhdnd +HPsHfHHrpHDpFFrcSfsfpCMmQdntLBMgtmtBgDdLLC +SqpPscpPzpSWzjlCjjCGjl +nvgLvcLgvgvngbLprpJNTDCCRNVJrNPlDDTV +WZsMtsffGQtMzWFqFmWmWsVNJNlDwwCDVRTwJlCCDVLz +BQfGZGmmsMWFstWFmfMsfBccdncbpbSbvbbvHnLbpc +tsmDsvswNZmcZTccfh +zCTpGCbWBRWFWHGRFZJbMbJfnrhnhfMnnZ +TzFGFBRLdpHHNNQddDQDvwQN +fhBBpJgdHddjZQfmVmNzNNLmFN +qvMRrvlbwqlbTTMBMvLssFNmVzzwFDmLLzVD +TRSRWqRRMcBHhGHcdGgPGp +lSjHmtmnpHStblnpSlHSrtmMzLWzqzqCZDDTzTTWqMFqCqVV +sLRLLfPPRQfCTqqVVqFT +dNJgRPNQNsJJhBRvdJvQvNNsjSrrSmrcctpbpHtBrBjLjmSH +nwFwpppjfwSlpLTsqsTgNshhjM +ccBRGvtsmgGNPqNNGP +BCcJHvssdcWBCVmVHSSrZrwVzblpwbzZnf +rcfQRrBPPczjcRBctZDNlnVNHbgZGjVDjN +TvMsFJGSFMhJnNZlwVVnDNTZ +qhSqqmqLCLhFdJLqSvLhmQRQRWcRPczPtzrCrWGRBp +JVhdPhsFPFqLDBHVdHLPvhHDCMwcgJJwbwRgnnCMbwGwcmGC +fzjzpTZTQQQLwCbgGgbMmQcR +jzNpTzfSZtfNSWZlVVtdFFFDHHqLHVqv +TwSNnSnSGVTpNppGlPTlTcVqQrRhVBqdqBRqZqQZqQ +DcDCMfDbCMHJdrRBqbdjRBRZ +gvftMCJHcHfCDmDLgfMmMmmWlwWnWsTTwlGTlWTwppNlGL +pbGMbllDQPhhWWQDpPgVGlMCvRRrQLcCCcfBBQzLBcvQBv +wqnJjSmjrstdqwwFBLcRsBRRszzLFC +qwdddTJTdHtjndqJqHZHmwVWGpDbGTlbWWpWWrPGhhhM +WGllqLjjLCpSffmBmvfpHs +dnrQwZzRTdZwnCThdzzFTVmcBHBJBmsHfBPHcfvcSVHs +QgQrzCdrTRCZzrZLbjGLqNMWGgNNLt +sgPnhPPTTPTTwlJfwNHlqcfs +LMCpFbLLbRpMGbMcCFLVlNlNqrHqVfbHHwNDwr +GjBcCCtWMtMRZTSvgWQTngvg +BCMtJJMpRDlMMvBJBBnfjtcjPhPmZgnhgdcf +NrsrsqFNvrVLVGVrsHsqFgfmcPGdcmhfjdPgfjcnZd +zFTzsNqHqFssLVLQqNTFbsBDwCCwvWlDwRMRCTRBDMDS +zQtLgvggSRtgvVRtLvvnzdnjnGwGdmmrlpnlGz +JssBFpqsDqPNnlWWjrrjqrnj +DHDFBNDfPbJBsFHNMPvpvStQvMRVTtgVTVtv +FvzttFvBTJJzLbvwhCnnVnWwjCnBNC +mQdZgZPDPdPPSsMSQPdZgCwVGmnwnWpGnGhqNWjWCG +ggdDgfQSdcjtFHjlLJfF +ghcgScNNSsCvGSzmpVFlZbrzcFcV +MWWRLRqqqdQwTtLjjmqMlFpFlzVnbFVDwplFzlDr +LHMHqdHWjdQMdMtLHHLtWjJRsGCGSNghmSvPBJBNhsGfvfGP +CbVqqqDbcbMHnnDqcCbrRFCfBvvwGjzrBwQGzrwwBjGwBQ +sTPmpNWdWPTJssSSLPfNljjBvflGtjwwBzMG +mmWgmgSZLTLMZWpnhqZbhFFCnhqnnn +QQmjmZqnmQrfTZlbbcVbBcfbHfzf +vpdSNShNppFdSRtdGBqvJBDlDzqbPPHVBH +tRNSNRFhNpSRhFRMFtGhRGswLZZsZqWnmrmZwqwsTZmmmQ +gGWCllFCGWtGGWdlGlWNZdwpnnSbwpMvpphZpndn +RsshDDLcQVMSJQwJwnvw +HVPzrPcDNhPFGhPC +jtHQGHjGGtdTLjnqTQlmvRPRPBBwRBnFPPWP +hZbzNzVrczZzcbNssVspZZVvBwbmPmJPWmvbBRvPlmvRJF +fzNVDsZMhzpVhpVhlZcMNfcDDdQTLTjGDTCqGCjtSQHdHL +GrbFggGrTrzSrgfwJjdTmwmNJZJd +VMPQplPDptchwdsjmlml +MqMWtBDPPWDWHQtvqQtWPjbzCGLgSBgGbzgrzFgnnz +fcJccCcwcDfcpbRnCfWJnQJqtqtqPQdsGdgPsgTQqg +LSjVMhzSFFrljdNbltNGtgdqQq +MMhSHFFMLzBWDcHHcfcHwb +rwmWtJWMwSNRJMtwNmMrrSsmtTjjlgqnTqZZZPlHnTngTTgn +BGqGqqFBFggjjdGHlj +QDhhLbDQCDFMNcmhRhqJNW +BnRnRvMnLGLSCHvvSnlRfWbbTNQJsJsbNbJTBfQT +tzMmmMwjhcpFjDmMcptrcjzFQggfQPTsWsfgNbbgfhJbPhQT +FdzcrtDwDMtcwtFGRZdRLvdnHRSZZv +HVpsSpvjpNjsBmbGFBnMNnDM +WRRWhZtfrVtLJrBZMnDmDbnZBTGF +thhPLzWzhzwPtLRLWrQlpPvvClcVcCppSvpl +lZPbhnZLRPnnPZZPdlGMBWcBMgMQHBBcvvvzBL +jpFjmwwwCDDbsjvjjgcvQgcNBQ +rbFmppbwhqhGRGZr +ggrLwFgWCBwbMWBbFwLMgNBZdmZHclJPllnJlNRPmSNZRR +ppszzDfhDfhsqpnvDVTfGpSPlPmclHcdRcZmmmdPPGSP +pvtDDVDVpqDfzDfngBLCwQrgCtCwFwrg +pbGjFFGGDjpbsGsmNhNFNRBBBtRhhhHv +JnczJVCvwWJvhPgghgNtNtNJ +nwVSSzdzzqSpvQSZQG +mssLLttQrsMrMzLCRmMmrrSQpvWpDNlBTBDlvNTccDQl +HdHJwJqVPwHnqJwbjJbGjnSgSTWPpNgWWpgBBgcvDWWN +ZHVwVZGwwdndqJVJqfHbGwnwrRLtLMftMvMMRrhmLMthhLmz +RgHGLbTqlZlPRZPHfvvfZttJnvfvjnzr +sVcChDVDccwNhhvjTvVzWJjnzFff +mpNcCMTCGmLqBLGH +wVJwHJHVMtMpBmDDWPQVPWDGDD +zCrlZzCblBvnCDWNGLmvGDLPNG +dqZglgbzrzbbgZqzTFSBHHFJSSSfjjSMfwhj +NMWJSjLMCnHHNMNNHWCHMbVVGBPZTrPVPBVDrBSDGTTr +zvttlFpgdtldwwvftPDPTWQdBZrsrWrGBZ +hFlFmhRFvfCbmWJWHcnj From a5d8acfc46fbebea1e1ca707d8d7b782bd3df819 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Sat, 3 Dec 2022 06:40:22 +0100 Subject: [PATCH 340/433] Day 3 refactor --- .../sbaars/adventofcode/year22/days/Day3.java | 40 ++++++++----------- 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day3.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day3.java index 5fce32f0..216653b3 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day3.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day3.java @@ -4,7 +4,7 @@ import com.sbaars.adventofcode.year22.Day2022; import java.io.IOException; -import java.util.List; +import java.util.stream.IntStream; public class Day3 extends Day2022 { public Day3() { @@ -14,39 +14,31 @@ public Day3() { public static void main(String[] args) throws IOException { Day d = new Day3(); d.downloadIfNotDownloaded(); - d.downloadExample(); d.printParts(); - System.in.read(); +// System.in.read(); // d.submitPart1(); - d.submitPart2(); +// d.submitPart2(); } @Override public Object part1() { - return dayStream().map(String::trim).map(e -> new String[]{e.substring(0, e.length()/2), e.substring(e.length()/2)}) - .mapToLong(e -> { -// System.out.println(e[0]+", "+e[1]); - List chars1 = e[0].chars().mapToObj(i -> i >= 'a' && i <= 'z' ? i - 'a' + 1 : i - 'A' + 1 + 26).toList(); - int x = e[1].chars().map(i -> i >= 'a' && i <= 'z' ? i - 'a' + 1 : i - 'A' + 1 + 26).filter(i -> chars1.contains(i)).findFirst().getAsInt(); -// System.out.println(x); - return x; - }).sum() ; + return dayStream() + .map(String::trim) + .map(e -> new String[]{e.substring(0, e.length()/2), e.substring(e.length()/2)}) + .mapToInt(e -> getPriorities(e[0]).filter(i -> getPriorities(e[1]).anyMatch(j -> j == i)).findFirst().getAsInt()) + .sum(); + } + private IntStream getPriorities(String s) { + return s.chars().map(i -> i >= 'a' && i <= 'z' ? i - 'a' + 1 : i - 'A' + 1 + 26); } @Override public Object part2() { - List s = dayStream().map(String::trim).toList(); - long sum = 0; - for(int x = 0;x chars1 = a.chars().mapToObj(i -> i >= 'a' && i <= 'z' ? i - 'a' + 1 : i - 'A' + 1 + 26).toList(); - List chars2 = b.chars().mapToObj(i -> i >= 'a' && i <= 'z' ? i - 'a' + 1 : i - 'A' + 1 + 26).toList(); - int y = c.chars().map(i -> i >= 'a' && i <= 'z' ? i - 'a' + 1 : i - 'A' + 1 + 26).filter(i -> chars1.contains(i) && chars2.contains(i)).findFirst().getAsInt(); - sum += y; - } - return sum; + String[] s = dayStream().map(String::trim).toArray(String[]::new); + return IntStream.range(0, s.length/3) + .map(x -> x * 3) + .map(x -> getPriorities(s[x]).filter(i -> getPriorities(s[x+1]).anyMatch(j -> j == i) && getPriorities(s[x+2]).anyMatch(j -> j == i)).findFirst().getAsInt()) + .sum(); } } From 9e3d517970f69eed33bc9665e1fa2171e896e200 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Sat, 3 Dec 2022 20:31:51 +0100 Subject: [PATCH 341/433] 2022 Prepare for day 4 --- .../java/com/sbaars/adventofcode/year22/days/Day1.java | 1 + .../java/com/sbaars/adventofcode/year22/days/Day3.java | 8 +------- .../java/com/sbaars/adventofcode/year22/days/Day4.java | 10 +++++++++- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day1.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day1.java index c3ab7e9f..0b56922a 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day1.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day1.java @@ -14,6 +14,7 @@ public Day1() { public static void main(String[] args) { Day d = new Day1(); d.downloadIfNotDownloaded(); +// d.downloadExample(); d.printParts(); // System.in.read(); // d.submitPart1(); diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day3.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day3.java index 216653b3..820f77e3 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day3.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day3.java @@ -1,6 +1,5 @@ package com.sbaars.adventofcode.year22.days; -import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year22.Day2022; import java.io.IOException; @@ -12,12 +11,7 @@ public Day3() { } public static void main(String[] args) throws IOException { - Day d = new Day3(); - d.downloadIfNotDownloaded(); - d.printParts(); -// System.in.read(); -// d.submitPart1(); -// d.submitPart2(); + new Day3().printParts(); } @Override diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day4.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day4.java index ceba51c2..4e57a770 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day4.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day4.java @@ -1,5 +1,6 @@ package com.sbaars.adventofcode.year22.days; +import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year22.Day2022; public class Day4 extends Day2022 { @@ -9,11 +10,18 @@ public Day4() { } public static void main(String[] args) { - new Day4().printParts(); + Day d = new Day4(); + d.downloadIfNotDownloaded(); +// d.downloadExample(); + d.printParts(); +// System.in.read(); +// d.submitPart1(); +// d.submitPart2(); } @Override public Object part1() { + String s = day(); return ""; } From a1a30aedba65463f1e4daee9bbdf89c52e299800 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Sun, 4 Dec 2022 06:11:16 +0100 Subject: [PATCH 342/433] Day 4 2022 --- .../sbaars/adventofcode/year22/days/Day4.java | 25 +- src/main/resources/2022/day4.txt | 1000 +++++++++++++++++ 2 files changed, 1019 insertions(+), 6 deletions(-) create mode 100644 src/main/resources/2022/day4.txt diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day4.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day4.java index 4e57a770..44caa557 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day4.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day4.java @@ -3,30 +3,43 @@ import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year22.Day2022; +import java.io.IOException; + +import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; + public class Day4 extends Day2022 { public Day4() { super(4); } - public static void main(String[] args) { + public static void main(String[] args) throws IOException { Day d = new Day4(); d.downloadIfNotDownloaded(); // d.downloadExample(); d.printParts(); -// System.in.read(); + System.in.read(); // d.submitPart1(); -// d.submitPart2(); + d.submitPart2(); + } + + public record Assignment(long aStart, long aEnd, long bStart, long bEnd){ + public boolean contained(){ + return (aStart>=bStart && aEnd<=bEnd) || (bStart>=aStart && bEnd<=aEnd); + } + + public boolean overlap(){ + return aStart <= bEnd && aEnd >= bStart; + } } @Override public Object part1() { - String s = day(); - return ""; + return dayStream().map(String::trim).map(s -> readString(s, "%n-%n,%n-%n", Assignment.class)).filter(Assignment::contained).count(); } @Override public Object part2() { - return ""; + return dayStream().map(String::trim).map(s -> readString(s, "%n-%n,%n-%n", Assignment.class)).filter(Assignment::overlap).count(); } } diff --git a/src/main/resources/2022/day4.txt b/src/main/resources/2022/day4.txt new file mode 100644 index 00000000..4a830016 --- /dev/null +++ b/src/main/resources/2022/day4.txt @@ -0,0 +1,1000 @@ +71-87,70-88 +8-92,6-97 +7-68,8-69 +47-47,47-48 +74-94,51-93 +48-63,48-49 +26-57,57-58 +62-63,11-76 +16-66,15-47 +27-65,27-62 +19-81,19-81 +19-19,18-18 +4-5,5-15 +75-84,39-75 +96-96,20-83 +1-59,28-60 +13-14,14-88 +15-96,96-99 +4-64,1-4 +22-95,42-95 +52-53,52-78 +58-75,63-67 +25-75,63-76 +10-19,9-37 +46-81,65-65 +4-61,5-62 +66-66,67-67 +45-82,83-96 +74-96,95-96 +41-98,41-99 +22-92,21-92 +22-29,1-32 +85-86,36-84 +21-21,22-90 +13-83,15-82 +75-75,41-75 +78-78,1-78 +14-93,14-48 +58-87,58-58 +16-87,88-90 +23-64,24-58 +2-71,1-2 +31-52,53-70 +65-95,66-96 +5-42,4-41 +1-79,2-80 +4-71,36-72 +94-95,4-94 +23-89,24-79 +8-53,32-53 +51-59,30-59 +13-55,13-55 +13-72,46-71 +9-78,8-9 +57-74,56-69 +91-91,91-91 +8-31,4-31 +39-54,36-85 +7-35,6-65 +5-83,8-80 +5-93,5-95 +44-53,52-52 +11-94,10-93 +1-6,7-99 +42-61,33-61 +7-29,8-80 +4-5,5-31 +42-42,43-83 +43-81,63-82 +6-96,98-99 +22-83,7-86 +19-83,18-60 +39-40,40-41 +6-99,5-5 +16-94,16-94 +51-53,23-52 +4-84,4-83 +8-67,67-68 +3-85,2-3 +21-50,44-48 +42-85,43-86 +19-69,20-70 +15-15,15-86 +70-78,71-78 +12-46,45-88 +33-87,32-90 +21-90,20-94 +4-99,3-3 +50-87,4-91 +3-91,3-4 +9-41,9-42 +41-54,40-54 +46-46,10-45 +59-87,58-78 +72-97,71-71 +1-87,87-88 +32-33,31-80 +29-97,98-99 +73-75,74-76 +41-93,30-92 +1-82,15-49 +13-41,14-42 +19-39,39-40 +8-92,34-92 +10-49,11-94 +19-81,11-82 +95-98,25-95 +16-89,2-16 +51-85,52-68 +19-95,18-53 +1-14,1-15 +25-25,25-28 +14-35,14-15 +31-66,32-67 +20-93,19-69 +68-82,68-82 +17-69,68-71 +4-84,5-83 +1-76,4-77 +3-92,39-94 +95-97,30-88 +51-98,71-98 +29-74,75-99 +12-19,14-19 +27-99,26-99 +17-77,16-75 +1-2,3-38 +38-38,37-99 +13-45,14-46 +25-93,26-94 +88-90,88-91 +40-57,39-56 +23-23,24-67 +28-92,94-99 +1-71,1-71 +41-96,40-95 +4-97,3-98 +9-25,4-24 +70-71,70-70 +14-54,13-39 +10-40,10-40 +63-87,16-82 +41-94,40-57 +60-90,61-91 +14-92,14-15 +6-92,16-91 +21-77,21-77 +70-71,59-70 +19-69,61-69 +97-97,4-98 +12-79,12-80 +15-86,86-89 +49-67,19-66 +63-91,92-94 +6-98,5-98 +15-15,15-68 +9-17,17-97 +5-87,4-87 +3-96,14-84 +21-83,21-82 +1-92,92-92 +1-37,5-38 +17-93,11-98 +38-66,21-67 +1-65,2-66 +7-91,6-48 +2-29,3-30 +36-79,7-84 +78-79,75-79 +69-83,79-83 +34-67,39-68 +2-93,92-93 +7-53,5-7 +90-91,18-90 +73-93,55-74 +24-81,98-98 +2-76,18-71 +28-94,94-94 +13-14,9-13 +40-64,41-63 +89-98,1-87 +87-98,71-97 +31-53,32-67 +14-32,15-32 +11-96,37-61 +69-70,69-89 +22-32,15-46 +33-47,47-87 +4-6,7-73 +26-70,1-71 +5-91,1-90 +6-55,5-54 +5-71,4-5 +55-86,54-70 +13-33,34-34 +53-93,93-99 +31-96,31-99 +47-72,46-71 +54-73,53-98 +44-92,45-72 +1-10,11-17 +53-77,53-96 +52-74,53-75 +30-95,30-98 +3-58,58-58 +32-92,32-33 +2-3,3-33 +25-43,20-42 +10-80,65-81 +5-97,6-98 +37-41,36-53 +57-79,78-88 +24-89,23-89 +97-97,70-96 +40-69,40-70 +10-90,89-92 +42-86,43-87 +26-84,27-85 +15-15,16-99 +7-68,67-67 +3-97,1-96 +1-98,4-95 +2-99,2-99 +66-66,12-66 +57-89,90-93 +18-93,32-88 +37-77,37-76 +74-74,60-74 +4-83,7-73 +17-98,18-99 +1-82,5-60 +73-89,4-55 +15-81,3-15 +51-93,74-93 +16-18,17-37 +69-69,69-99 +30-97,30-31 +16-80,5-85 +2-13,3-14 +76-95,34-85 +35-83,82-83 +14-15,15-85 +5-93,7-66 +24-71,42-90 +23-36,9-35 +31-79,31-79 +15-71,53-72 +69-73,68-75 +3-89,3-89 +14-81,67-98 +82-87,86-93 +67-69,68-68 +7-78,7-7 +2-85,3-85 +16-72,16-71 +2-98,1-1 +28-31,27-43 +88-93,58-68 +13-88,3-12 +17-91,18-98 +91-99,65-99 +1-60,8-42 +16-84,16-88 +10-49,50-50 +20-21,20-71 +59-85,59-85 +53-62,61-76 +18-53,51-51 +65-94,15-66 +17-72,40-68 +53-76,21-75 +54-96,96-96 +2-17,17-17 +73-93,29-94 +1-5,4-59 +1-98,1-97 +12-77,12-81 +84-97,84-85 +1-77,43-78 +45-91,45-90 +69-94,36-44 +11-97,10-94 +6-70,6-65 +42-56,8-41 +48-54,45-55 +23-88,24-88 +28-92,69-95 +9-15,8-13 +46-81,74-82 +66-88,8-67 +24-32,33-33 +12-90,11-93 +28-56,27-55 +33-56,33-34 +40-85,44-86 +15-70,2-15 +71-90,68-80 +14-93,12-96 +4-96,3-95 +18-18,17-32 +78-79,46-78 +4-62,62-63 +59-84,5-59 +15-24,15-16 +24-84,14-91 +19-92,10-46 +3-4,4-72 +21-90,18-21 +95-98,58-83 +19-97,14-99 +5-97,4-98 +21-78,20-93 +14-15,14-98 +54-60,53-67 +8-40,40-89 +29-70,30-71 +9-9,8-8 +90-98,89-89 +69-98,98-99 +3-91,3-4 +10-94,11-95 +59-83,48-83 +1-5,5-95 +91-97,37-92 +14-96,14-88 +2-86,86-89 +8-40,39-40 +52-80,53-80 +57-81,33-85 +24-89,23-25 +36-65,18-65 +3-58,2-54 +74-90,31-74 +11-94,11-12 +21-70,22-71 +19-72,20-73 +33-34,34-94 +30-96,79-96 +5-92,4-5 +23-84,24-82 +32-33,34-76 +13-64,13-14 +38-41,42-70 +24-86,76-92 +61-70,11-70 +48-95,49-96 +77-83,83-95 +13-63,14-64 +7-52,51-53 +42-61,43-51 +67-93,66-93 +4-23,24-24 +13-14,13-13 +41-93,42-92 +14-79,13-78 +64-83,78-82 +2-89,5-89 +19-19,18-18 +58-76,47-76 +88-97,4-89 +65-74,65-66 +39-97,40-50 +74-98,75-97 +14-15,14-67 +13-95,12-94 +12-79,13-79 +11-68,12-69 +57-87,86-86 +7-21,6-82 +76-83,25-77 +7-10,5-12 +98-98,8-99 +2-93,3-94 +5-13,4-12 +78-81,78-80 +98-99,11-99 +52-67,53-66 +86-86,82-87 +4-65,4-65 +60-96,59-95 +7-87,8-94 +53-88,87-93 +4-10,3-69 +2-21,21-65 +10-35,2-9 +3-56,4-6 +65-99,64-99 +22-95,43-96 +37-75,36-86 +60-92,16-45 +33-81,99-99 +2-49,48-48 +44-99,44-99 +8-79,78-80 +81-90,1-82 +98-99,28-99 +44-98,43-88 +48-78,30-98 +45-91,46-99 +3-91,3-91 +90-90,23-91 +24-75,30-75 +10-75,11-59 +10-43,11-44 +21-31,20-21 +2-2,3-97 +51-51,51-51 +22-67,67-67 +94-97,95-99 +98-98,63-97 +92-93,92-93 +7-88,7-89 +67-93,67-68 +48-92,47-91 +13-83,83-85 +6-7,6-79 +34-92,35-92 +39-42,35-41 +44-95,57-96 +8-61,7-7 +39-39,34-39 +28-57,28-57 +33-39,32-32 +15-15,15-72 +29-92,28-91 +76-87,85-96 +15-37,8-14 +39-54,39-40 +7-48,6-48 +55-75,51-74 +16-78,16-79 +34-34,35-84 +7-61,8-62 +80-92,31-50 +37-41,40-56 +3-82,82-99 +14-74,15-30 +91-91,18-91 +10-97,98-99 +76-96,76-77 +17-97,98-98 +24-89,23-24 +14-90,15-91 +89-98,90-99 +55-64,54-70 +17-99,18-98 +4-4,3-84 +42-99,43-61 +99-99,4-89 +21-86,22-86 +79-96,37-79 +99-99,36-96 +67-79,69-80 +27-55,27-28 +27-77,54-64 +99-99,18-95 +17-96,18-96 +15-45,14-45 +28-30,27-47 +61-83,82-84 +39-47,41-44 +57-95,94-94 +22-42,21-46 +6-75,75-75 +6-97,1-97 +26-49,27-50 +54-96,54-96 +63-87,46-86 +21-70,69-71 +61-90,89-91 +81-87,60-81 +5-94,6-6 +6-85,10-84 +37-40,36-39 +74-76,75-77 +9-96,99-99 +20-20,21-49 +1-2,2-89 +17-59,58-99 +20-91,20-91 +79-91,79-87 +51-92,91-93 +90-96,9-91 +72-82,43-98 +55-99,54-55 +3-20,6-81 +26-98,26-97 +7-97,7-8 +26-71,19-70 +24-60,97-98 +90-91,33-91 +12-69,11-68 +16-34,4-15 +8-24,18-25 +92-97,3-87 +44-96,96-96 +10-51,9-58 +3-62,4-63 +10-68,2-69 +21-85,85-86 +26-26,14-25 +46-87,1-99 +47-85,48-66 +15-89,89-98 +86-86,85-85 +45-62,52-63 +10-93,87-90 +19-83,21-30 +22-87,88-94 +27-96,28-96 +77-80,19-77 +4-22,21-21 +19-97,20-84 +43-94,22-95 +69-69,10-69 +1-94,1-94 +72-90,79-91 +16-16,17-67 +11-12,11-51 +94-96,12-65 +33-91,32-97 +38-38,30-38 +47-49,48-51 +92-96,18-92 +6-89,6-7 +32-32,33-37 +11-98,98-99 +13-38,38-39 +66-67,61-66 +81-83,4-82 +15-95,5-95 +82-99,13-97 +98-98,70-98 +16-19,12-20 +3-96,2-96 +25-70,26-71 +66-73,1-72 +4-79,69-78 +14-88,13-87 +89-91,26-90 +12-80,3-11 +42-91,90-92 +19-20,20-82 +89-91,33-90 +45-85,2-92 +43-90,91-96 +43-77,43-90 +12-94,19-95 +89-90,38-89 +95-98,96-98 +11-18,17-69 +3-52,1-4 +7-53,52-81 +61-72,66-73 +4-69,37-69 +29-94,30-75 +32-94,56-95 +1-98,3-94 +94-94,74-94 +13-70,14-85 +4-52,25-53 +65-91,83-87 +7-10,11-11 +31-32,39-77 +35-58,36-48 +28-66,27-76 +56-56,57-67 +13-64,13-64 +34-75,33-44 +2-88,1-99 +14-51,51-69 +14-75,10-89 +31-92,40-44 +32-41,42-89 +87-98,16-95 +49-50,50-91 +66-74,38-95 +74-75,74-88 +18-80,19-85 +1-98,1-98 +83-87,8-84 +58-91,52-92 +1-70,1-99 +18-40,12-18 +9-25,9-24 +31-73,17-83 +43-46,42-45 +3-5,4-83 +14-70,29-55 +1-76,62-77 +4-18,5-18 +72-97,71-71 +69-69,5-69 +92-94,73-93 +63-94,64-93 +32-69,13-69 +25-81,26-82 +18-66,5-92 +32-34,8-33 +5-46,4-88 +41-83,12-41 +35-63,51-63 +15-87,15-90 +18-82,17-18 +19-41,18-20 +10-93,10-10 +30-71,50-70 +10-64,9-72 +76-77,5-77 +59-59,59-59 +3-54,2-72 +7-8,7-25 +74-79,74-92 +9-9,10-55 +6-94,58-94 +27-86,60-86 +17-99,14-98 +23-26,21-25 +5-85,4-6 +60-86,20-85 +52-91,92-94 +74-74,45-75 +2-4,3-95 +67-93,47-93 +95-98,95-98 +93-93,50-93 +82-83,18-82 +6-97,5-7 +7-98,8-99 +24-63,12-64 +16-57,15-56 +1-92,1-96 +51-81,84-91 +2-88,1-1 +34-34,35-70 +91-98,9-67 +51-94,2-79 +5-99,6-98 +32-92,32-92 +4-69,3-3 +65-83,64-84 +63-65,11-64 +58-58,50-60 +21-88,74-86 +40-76,40-55 +47-49,16-48 +76-76,35-76 +52-72,71-71 +7-59,6-58 +2-84,1-3 +32-99,22-96 +8-23,8-22 +11-11,11-47 +29-29,30-85 +89-92,87-91 +12-36,12-37 +2-91,50-97 +12-34,29-35 +75-88,20-75 +7-88,7-7 +25-35,6-36 +35-41,34-87 +68-72,28-78 +12-99,1-98 +16-76,2-75 +6-75,7-76 +6-97,5-99 +4-98,4-97 +1-2,1-99 +3-91,91-92 +41-87,6-88 +40-61,9-79 +7-93,7-92 +71-72,72-85 +24-94,23-23 +42-90,89-90 +3-76,33-77 +55-58,56-59 +40-87,88-98 +16-16,17-99 +40-98,92-99 +33-39,23-38 +21-60,15-59 +40-44,40-44 +81-84,85-85 +33-96,40-67 +15-93,91-94 +82-83,81-95 +20-90,90-91 +37-58,38-58 +47-47,46-59 +3-71,2-2 +37-73,72-73 +12-86,86-87 +15-26,4-27 +21-22,21-31 +78-92,30-93 +2-85,2-85 +92-92,6-93 +15-79,80-80 +56-56,55-60 +14-61,61-79 +4-51,51-52 +8-8,7-7 +47-52,22-53 +41-85,77-85 +56-81,19-78 +78-88,62-87 +40-96,44-95 +56-58,28-58 +7-70,6-69 +8-44,8-9 +36-84,13-35 +67-93,77-93 +6-87,5-5 +59-86,9-60 +35-48,35-53 +81-96,82-97 +11-49,1-10 +14-14,15-27 +28-68,90-92 +46-46,47-61 +66-66,66-98 +1-40,2-40 +68-85,50-88 +25-25,26-97 +30-56,36-57 +40-96,39-97 +23-99,23-24 +88-97,61-88 +24-26,23-67 +92-99,93-93 +15-66,14-16 +13-76,12-75 +25-44,19-25 +6-13,9-14 +24-24,12-24 +10-98,99-99 +26-98,26-72 +2-47,2-47 +27-87,27-51 +40-89,41-74 +1-92,91-92 +8-99,7-98 +68-85,13-68 +71-93,70-70 +63-84,8-89 +17-73,85-85 +48-80,48-48 +73-91,94-99 +54-72,2-42 +15-78,15-78 +27-62,28-40 +10-60,12-60 +11-92,11-99 +7-7,8-97 +5-54,4-5 +9-85,84-84 +36-83,52-82 +1-92,1-2 +55-70,56-71 +35-36,36-92 +27-60,60-79 +1-95,1-97 +11-89,10-10 +24-90,42-83 +2-96,2-2 +25-88,97-99 +3-96,4-97 +22-88,22-23 +4-4,5-77 +5-54,55-90 +40-44,19-43 +4-60,3-94 +22-93,22-93 +9-83,24-83 +14-91,15-84 +1-82,1-84 +70-70,70-90 +29-87,87-93 +26-46,27-46 +10-70,8-10 +5-96,9-94 +18-84,18-85 +45-81,13-45 +35-77,35-78 +8-62,63-67 +14-84,17-72 +75-93,75-76 +33-99,30-32 +32-37,31-43 +29-29,30-52 +96-96,27-64 +68-70,65-70 +74-87,3-73 +1-71,1-1 +1-38,38-58 +61-61,34-61 +11-97,12-64 +1-98,3-98 +5-58,6-59 +22-59,58-84 +44-68,43-63 +18-53,52-52 +23-38,24-39 +79-96,30-80 +4-97,3-99 +1-85,1-85 +19-19,20-55 +28-73,29-29 +5-69,3-89 +30-30,31-85 +27-81,28-92 +37-65,36-69 +4-93,93-93 +42-42,43-55 +11-97,22-98 +4-90,5-68 +41-65,10-65 +20-80,21-21 +9-85,10-53 +13-89,13-88 +99-99,85-96 +98-98,11-97 +29-30,10-29 +76-90,73-78 +14-76,77-93 +60-70,59-75 +20-53,19-52 +65-66,1-65 +45-52,52-53 +13-84,18-84 +11-42,11-24 +14-47,5-15 +37-37,19-38 +34-43,42-42 +75-87,74-86 +23-64,22-23 +29-92,36-93 +7-98,7-8 +1-2,1-2 +3-92,3-92 +10-63,15-62 +4-96,3-95 +30-85,42-86 +67-81,5-68 +7-94,8-94 +10-82,2-83 +15-69,1-49 +84-91,55-81 +84-95,55-84 +10-10,9-98 +11-30,12-30 +31-31,31-66 +3-66,86-99 +7-77,6-76 +35-60,5-93 +73-98,34-99 +29-32,29-32 +4-20,3-99 +12-35,18-36 +10-73,72-72 +5-89,89-90 +12-12,1-11 +14-40,7-14 +11-99,6-98 +63-63,62-93 +19-91,18-90 +80-88,15-80 +36-75,22-37 +73-75,13-74 +43-92,42-91 +20-91,19-93 +18-94,17-99 +72-91,72-92 +80-82,26-55 +28-88,88-88 +12-51,12-51 +3-5,5-99 +17-57,9-58 +89-94,16-88 +2-97,1-99 +98-99,92-98 +56-67,6-94 +32-81,55-81 +50-75,31-75 +41-42,32-41 +16-73,4-36 +8-98,7-7 +24-51,43-50 +64-87,61-65 +30-44,30-44 +21-26,20-82 +14-41,9-41 +2-72,3-92 +42-66,43-67 +2-99,98-98 +22-99,21-83 +40-72,22-71 +8-75,14-74 +22-92,23-95 +32-61,7-60 +7-19,19-54 +46-51,62-91 +4-98,3-4 +60-65,51-60 +4-79,79-87 +19-91,19-97 +26-55,62-93 +5-5,5-99 +61-67,62-67 +26-71,5-25 +50-61,8-60 +4-87,2-88 +7-7,8-70 +23-98,23-92 +24-25,22-24 +2-4,3-87 +4-58,3-5 +6-56,55-97 +2-15,14-60 +51-51,1-52 +65-68,1-48 +21-52,52-53 +14-95,13-14 +38-39,40-83 +31-48,17-30 +2-43,3-3 +66-85,73-84 +28-80,21-80 +31-98,32-98 +50-64,23-63 +9-80,9-80 +38-67,4-49 +2-94,2-94 +19-27,28-74 +98-98,41-89 +9-95,21-66 +30-53,27-54 +8-8,9-80 +8-9,8-97 +33-63,32-86 +8-9,8-77 +44-89,44-81 +48-74,47-73 +34-35,35-38 +64-85,31-64 +20-76,4-76 +5-5,4-93 +11-88,98-99 +47-48,9-48 +54-82,28-87 +34-59,35-52 +8-81,80-82 +8-95,8-93 +6-66,7-35 +6-82,12-76 +64-77,19-76 +34-63,18-33 +1-99,2-61 +74-86,73-73 +46-92,34-93 +73-73,72-73 +47-48,47-70 +44-94,43-43 +22-51,26-52 +1-2,1-66 +18-23,15-22 +24-24,10-24 +12-88,89-98 +12-64,65-65 +16-32,16-32 +23-77,76-90 +75-86,85-99 +26-67,27-98 +66-98,67-97 +9-19,19-19 +20-59,21-60 +71-97,43-71 +21-44,22-50 +74-77,76-77 +19-46,20-47 +54-95,95-95 +95-95,79-96 +94-95,32-95 +14-15,15-69 +48-48,47-90 +18-85,18-85 +56-78,77-79 +22-51,5-57 +5-45,6-46 +11-13,12-13 +69-90,21-69 +4-97,3-97 +77-77,59-77 +16-60,17-61 +13-69,14-70 +20-22,5-21 +32-91,79-92 +33-52,33-52 From 30ed1863b24387e47d5ad8e4025728750b4f818d Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Sun, 4 Dec 2022 06:20:01 +0100 Subject: [PATCH 343/433] Day 4 refactor --- .../sbaars/adventofcode/year22/days/Day4.java | 42 +++++++++---------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day4.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day4.java index 44caa557..873e68b3 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day4.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day4.java @@ -1,9 +1,9 @@ package com.sbaars.adventofcode.year22.days; -import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year22.Day2022; import java.io.IOException; +import java.util.stream.Stream; import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; @@ -14,32 +14,30 @@ public Day4() { } public static void main(String[] args) throws IOException { - Day d = new Day4(); - d.downloadIfNotDownloaded(); -// d.downloadExample(); - d.printParts(); - System.in.read(); -// d.submitPart1(); - d.submitPart2(); + new Day4().printParts(); } - public record Assignment(long aStart, long aEnd, long bStart, long bEnd){ - public boolean contained(){ - return (aStart>=bStart && aEnd<=bEnd) || (bStart>=aStart && bEnd<=aEnd); + public record Assignment(long aStart, long aEnd, long bStart, long bEnd){ + public boolean contained(){ + return (aStart>=bStart && aEnd<=bEnd) || (bStart>=aStart && bEnd<=aEnd); + } + + public boolean overlap(){ + return aStart <= bEnd && aEnd >= bStart; + } } - public boolean overlap(){ - return aStart <= bEnd && aEnd >= bStart; + @Override + public Object part1() { + return input().filter(Assignment::contained).count(); } - } - @Override - public Object part1() { - return dayStream().map(String::trim).map(s -> readString(s, "%n-%n,%n-%n", Assignment.class)).filter(Assignment::contained).count(); - } + private Stream input() { + return dayStream().map(String::trim).map(s -> readString(s, "%n-%n,%n-%n", Assignment.class)); + } - @Override - public Object part2() { - return dayStream().map(String::trim).map(s -> readString(s, "%n-%n,%n-%n", Assignment.class)).filter(Assignment::overlap).count(); - } + @Override + public Object part2() { + return input().filter(Assignment::overlap).count(); + } } From 97414de29ac9e15e4903b087b6da23b3441ac107 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Sun, 4 Dec 2022 06:21:15 +0100 Subject: [PATCH 344/433] Fix indentation --- .../sbaars/adventofcode/year22/days/Day4.java | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day4.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day4.java index 873e68b3..500bc148 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day4.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day4.java @@ -17,27 +17,27 @@ public static void main(String[] args) throws IOException { new Day4().printParts(); } - public record Assignment(long aStart, long aEnd, long bStart, long bEnd){ - public boolean contained(){ - return (aStart>=bStart && aEnd<=bEnd) || (bStart>=aStart && bEnd<=aEnd); - } - - public boolean overlap(){ - return aStart <= bEnd && aEnd >= bStart; - } + public record Assignment(long aStart, long aEnd, long bStart, long bEnd){ + public boolean contained(){ + return (aStart>=bStart && aEnd<=bEnd) || (bStart>=aStart && bEnd<=aEnd); } - @Override - public Object part1() { - return input().filter(Assignment::contained).count(); + public boolean overlap(){ + return aStart <= bEnd && aEnd >= bStart; } + } - private Stream input() { - return dayStream().map(String::trim).map(s -> readString(s, "%n-%n,%n-%n", Assignment.class)); - } + @Override + public Object part1() { + return input().filter(Assignment::contained).count(); + } - @Override - public Object part2() { - return input().filter(Assignment::overlap).count(); - } + private Stream input() { + return dayStream().map(String::trim).map(s -> readString(s, "%n-%n,%n-%n", Assignment.class)); + } + + @Override + public Object part2() { + return input().filter(Assignment::overlap).count(); + } } From 01ad9411074a0f68a9e55d2b1cb511b76e5b2206 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Sun, 4 Dec 2022 19:12:31 +0100 Subject: [PATCH 345/433] Prepare Day 5 2022 --- .../com/sbaars/adventofcode/year22/days/Day5.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day5.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day5.java index af6ea780..60390e7d 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day5.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day5.java @@ -1,20 +1,29 @@ package com.sbaars.adventofcode.year22.days; +import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year22.Day2022; +import java.io.IOException; + public class Day5 extends Day2022 { public Day5() { super(5); } - public static void main(String[] args) { - new Day5().printParts(); + public static void main(String[] args) throws IOException { + Day d = new Day5(); + d.downloadIfNotDownloaded(); +// d.downloadExample(); + d.printParts(); +// System.in.read(); +// d.submitPart1(); +// d.submitPart2(); } @Override public Object part1() { - return ""; + return dayStream(); } @Override From aa93ac06e38e47427ad408527bddce637fc4e4f3 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Mon, 5 Dec 2022 06:33:42 +0100 Subject: [PATCH 346/433] Day 5 2022 --- .../sbaars/adventofcode/year22/days/Day5.java | 75 ++- src/main/resources/2022/day5.txt | 503 ++++++++++++++++++ 2 files changed, 574 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/2022/day5.txt diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day5.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day5.java index 60390e7d..6c00ab46 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day5.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day5.java @@ -4,6 +4,11 @@ import com.sbaars.adventofcode.year22.Day2022; import java.io.IOException; +import java.util.*; +import java.util.stream.Collectors; + +import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; +import static java.lang.Math.toIntExact; public class Day5 extends Day2022 { @@ -16,18 +21,80 @@ public static void main(String[] args) throws IOException { d.downloadIfNotDownloaded(); // d.downloadExample(); d.printParts(); -// System.in.read(); + System.in.read(); // d.submitPart1(); -// d.submitPart2(); + d.submitPart2(); } + public record Move(long which, long from, long to) {} + @Override public Object part1() { - return dayStream(); + List> stacks = new ArrayList<>(); + for(int i = 1; i<=9; i++){ + Deque s = new ArrayDeque<>(); + switch(i){ + case 1: "NSDCVQT".chars().forEach(s::add); break; + case 2: "MFV".chars().forEach(s::add); break; + case 3: "FQWDPNHM".chars().forEach(s::add); break; + case 4: "DQRTF".chars().forEach(s::add); break; + case 5: "RFMNQHVB".chars().forEach(s::add); break; + case 6: "CFGNPWQ".chars().forEach(s::add); break; + case 7: "WFRLCT".chars().forEach(s::add); break; + case 8: "TZNS".chars().forEach(s::add); break; + case 9: "MSDJRQHN".chars().forEach(s::add); break; + } + stacks.add(s); + } + + List moves = dayStream().map(String::trim).map(s -> readString(s, "move %n from %n to %n", Move.class)).toList(); + for(Move m : moves) { + for(int i = 0; i Character.toString((char)(int)e)).collect(Collectors.joining()); } + private String toASCII(int value) { + int length = 4; + StringBuilder builder = new StringBuilder(length); + for (int i = length - 1; i >= 0; i--) { + builder.append((char) ((value >> (8 * i)) & 0xFF)); + } + return builder.toString(); + } + + @Override public Object part2() { - return ""; + List> stacks = new ArrayList<>(); + for(int i = 1; i<=9; i++){ + Deque s = new ArrayDeque<>(); + switch(i){ + case 1: "NSDCVQT".chars().forEach(s::add); break; + case 2: "MFV".chars().forEach(s::add); break; + case 3: "FQWDPNHM".chars().forEach(s::add); break; + case 4: "DQRTF".chars().forEach(s::add); break; + case 5: "RFMNQHVB".chars().forEach(s::add); break; + case 6: "CFGNPWQ".chars().forEach(s::add); break; + case 7: "WFRLCT".chars().forEach(s::add); break; + case 8: "TZNS".chars().forEach(s::add); break; + case 9: "MSDJRQHN".chars().forEach(s::add); break; + } + stacks.add(s); + } + + List moves = dayStream().map(String::trim).map(s -> readString(s, "move %n from %n to %n", Move.class)).toList(); + for(Move m : moves) { + List toBeMoved = new ArrayList<>(); + for(int i = 0; i stacks.get(toIntExact(m.to-1)).addLast(i)); + } + + return stacks.stream().map(Deque::peekLast).map(e -> Character.toString((char)(int)e)).collect(Collectors.joining()); } } diff --git a/src/main/resources/2022/day5.txt b/src/main/resources/2022/day5.txt new file mode 100644 index 00000000..9916e15d --- /dev/null +++ b/src/main/resources/2022/day5.txt @@ -0,0 +1,503 @@ +move 1 from 8 to 7 +move 1 from 2 to 7 +move 6 from 9 to 8 +move 1 from 9 to 1 +move 1 from 9 to 1 +move 3 from 3 to 6 +move 3 from 3 to 9 +move 1 from 9 to 2 +move 5 from 7 to 9 +move 9 from 1 to 6 +move 3 from 4 to 9 +move 2 from 9 to 2 +move 1 from 4 to 2 +move 1 from 3 to 9 +move 8 from 9 to 4 +move 14 from 6 to 7 +move 1 from 3 to 2 +move 5 from 4 to 2 +move 5 from 5 to 7 +move 4 from 2 to 1 +move 2 from 4 to 9 +move 1 from 4 to 3 +move 3 from 5 to 7 +move 1 from 8 to 6 +move 2 from 8 to 7 +move 2 from 1 to 2 +move 1 from 9 to 7 +move 2 from 1 to 3 +move 5 from 6 to 5 +move 4 from 5 to 7 +move 3 from 8 to 4 +move 20 from 7 to 1 +move 11 from 7 to 5 +move 1 from 6 to 9 +move 3 from 9 to 2 +move 12 from 1 to 9 +move 2 from 8 to 3 +move 4 from 2 to 8 +move 8 from 2 to 1 +move 4 from 8 to 9 +move 1 from 2 to 5 +move 12 from 9 to 7 +move 4 from 4 to 9 +move 4 from 9 to 5 +move 13 from 5 to 4 +move 4 from 4 to 7 +move 1 from 7 to 9 +move 2 from 9 to 5 +move 9 from 1 to 2 +move 1 from 8 to 3 +move 5 from 4 to 2 +move 1 from 3 to 6 +move 7 from 2 to 8 +move 6 from 1 to 6 +move 6 from 8 to 7 +move 6 from 2 to 1 +move 3 from 9 to 3 +move 7 from 3 to 7 +move 4 from 4 to 9 +move 1 from 8 to 9 +move 1 from 3 to 9 +move 1 from 2 to 4 +move 1 from 9 to 6 +move 5 from 1 to 9 +move 1 from 4 to 9 +move 2 from 9 to 1 +move 8 from 6 to 7 +move 4 from 9 to 7 +move 2 from 5 to 2 +move 2 from 1 to 9 +move 14 from 7 to 4 +move 22 from 7 to 2 +move 2 from 7 to 4 +move 3 from 7 to 5 +move 9 from 4 to 7 +move 6 from 2 to 4 +move 8 from 4 to 3 +move 14 from 2 to 9 +move 2 from 3 to 9 +move 3 from 2 to 9 +move 4 from 4 to 2 +move 1 from 4 to 5 +move 1 from 1 to 4 +move 5 from 7 to 8 +move 1 from 1 to 3 +move 4 from 5 to 2 +move 6 from 3 to 9 +move 1 from 3 to 4 +move 4 from 8 to 9 +move 2 from 4 to 6 +move 4 from 5 to 3 +move 1 from 7 to 6 +move 1 from 8 to 5 +move 3 from 3 to 1 +move 33 from 9 to 5 +move 5 from 2 to 1 +move 1 from 3 to 5 +move 1 from 7 to 6 +move 18 from 5 to 1 +move 1 from 2 to 8 +move 6 from 5 to 4 +move 1 from 8 to 7 +move 2 from 4 to 1 +move 4 from 1 to 2 +move 19 from 1 to 2 +move 4 from 6 to 8 +move 4 from 1 to 8 +move 14 from 2 to 9 +move 5 from 2 to 4 +move 1 from 8 to 2 +move 8 from 2 to 5 +move 5 from 8 to 4 +move 4 from 9 to 7 +move 1 from 8 to 1 +move 16 from 5 to 4 +move 15 from 4 to 5 +move 1 from 9 to 5 +move 5 from 7 to 6 +move 2 from 7 to 6 +move 1 from 1 to 9 +move 7 from 6 to 7 +move 1 from 8 to 5 +move 1 from 1 to 9 +move 12 from 5 to 7 +move 7 from 5 to 9 +move 12 from 7 to 2 +move 1 from 7 to 4 +move 7 from 4 to 7 +move 2 from 9 to 4 +move 5 from 4 to 9 +move 8 from 2 to 3 +move 4 from 2 to 4 +move 9 from 4 to 8 +move 6 from 3 to 5 +move 8 from 7 to 3 +move 1 from 4 to 3 +move 7 from 8 to 9 +move 4 from 5 to 4 +move 6 from 3 to 1 +move 4 from 3 to 4 +move 1 from 3 to 6 +move 6 from 4 to 9 +move 1 from 6 to 5 +move 17 from 9 to 4 +move 3 from 7 to 3 +move 1 from 7 to 9 +move 2 from 5 to 3 +move 2 from 1 to 3 +move 2 from 8 to 9 +move 1 from 5 to 1 +move 14 from 4 to 5 +move 2 from 3 to 2 +move 1 from 7 to 6 +move 10 from 9 to 4 +move 12 from 9 to 4 +move 9 from 4 to 5 +move 1 from 2 to 9 +move 13 from 5 to 9 +move 2 from 5 to 1 +move 1 from 2 to 9 +move 3 from 4 to 2 +move 12 from 4 to 7 +move 8 from 5 to 7 +move 1 from 1 to 9 +move 1 from 6 to 4 +move 1 from 5 to 4 +move 1 from 4 to 8 +move 5 from 3 to 4 +move 10 from 9 to 6 +move 3 from 6 to 2 +move 7 from 6 to 5 +move 6 from 5 to 4 +move 1 from 8 to 5 +move 1 from 1 to 4 +move 2 from 7 to 2 +move 5 from 4 to 9 +move 2 from 5 to 8 +move 1 from 1 to 3 +move 2 from 1 to 7 +move 6 from 7 to 9 +move 9 from 9 to 8 +move 1 from 1 to 3 +move 4 from 2 to 7 +move 11 from 7 to 3 +move 11 from 8 to 6 +move 7 from 3 to 1 +move 4 from 7 to 2 +move 3 from 2 to 9 +move 8 from 1 to 5 +move 2 from 7 to 5 +move 2 from 2 to 9 +move 2 from 3 to 9 +move 11 from 4 to 7 +move 7 from 9 to 5 +move 6 from 6 to 5 +move 2 from 2 to 9 +move 1 from 2 to 3 +move 6 from 9 to 4 +move 3 from 9 to 1 +move 4 from 3 to 5 +move 6 from 7 to 1 +move 2 from 6 to 3 +move 2 from 9 to 2 +move 3 from 3 to 2 +move 3 from 6 to 8 +move 2 from 7 to 5 +move 20 from 5 to 6 +move 8 from 5 to 1 +move 1 from 5 to 9 +move 2 from 8 to 4 +move 1 from 8 to 7 +move 16 from 1 to 8 +move 8 from 8 to 9 +move 4 from 2 to 4 +move 1 from 1 to 5 +move 1 from 5 to 4 +move 3 from 8 to 4 +move 14 from 4 to 6 +move 5 from 8 to 7 +move 6 from 7 to 8 +move 29 from 6 to 2 +move 3 from 9 to 8 +move 21 from 2 to 3 +move 1 from 8 to 3 +move 6 from 9 to 4 +move 8 from 3 to 5 +move 7 from 8 to 4 +move 7 from 3 to 9 +move 3 from 7 to 2 +move 12 from 4 to 8 +move 2 from 3 to 1 +move 2 from 9 to 1 +move 1 from 6 to 7 +move 1 from 7 to 6 +move 1 from 6 to 3 +move 3 from 1 to 8 +move 2 from 4 to 1 +move 4 from 6 to 1 +move 5 from 2 to 7 +move 1 from 1 to 2 +move 5 from 1 to 2 +move 2 from 8 to 1 +move 1 from 4 to 5 +move 9 from 8 to 4 +move 3 from 7 to 9 +move 7 from 5 to 7 +move 2 from 5 to 9 +move 4 from 9 to 2 +move 3 from 3 to 2 +move 5 from 2 to 7 +move 2 from 8 to 2 +move 2 from 7 to 3 +move 1 from 8 to 6 +move 2 from 1 to 2 +move 1 from 6 to 7 +move 1 from 8 to 1 +move 12 from 7 to 1 +move 5 from 2 to 7 +move 7 from 4 to 2 +move 2 from 4 to 1 +move 5 from 3 to 8 +move 7 from 1 to 9 +move 4 from 7 to 1 +move 7 from 1 to 5 +move 12 from 9 to 2 +move 27 from 2 to 4 +move 3 from 8 to 9 +move 6 from 2 to 5 +move 6 from 1 to 8 +move 1 from 7 to 6 +move 9 from 5 to 2 +move 3 from 9 to 2 +move 13 from 4 to 5 +move 10 from 2 to 7 +move 1 from 9 to 8 +move 11 from 5 to 7 +move 1 from 8 to 7 +move 1 from 2 to 6 +move 13 from 4 to 3 +move 23 from 7 to 4 +move 1 from 6 to 9 +move 1 from 2 to 4 +move 7 from 3 to 5 +move 1 from 9 to 8 +move 19 from 4 to 1 +move 2 from 4 to 1 +move 1 from 7 to 6 +move 1 from 4 to 5 +move 1 from 5 to 7 +move 11 from 5 to 1 +move 2 from 5 to 4 +move 2 from 6 to 9 +move 3 from 8 to 2 +move 2 from 8 to 1 +move 3 from 2 to 1 +move 1 from 9 to 5 +move 6 from 1 to 3 +move 1 from 9 to 7 +move 2 from 7 to 5 +move 2 from 8 to 6 +move 1 from 3 to 2 +move 2 from 8 to 5 +move 1 from 2 to 1 +move 3 from 4 to 1 +move 3 from 5 to 1 +move 2 from 5 to 1 +move 2 from 6 to 9 +move 1 from 9 to 6 +move 1 from 4 to 5 +move 1 from 9 to 8 +move 1 from 8 to 6 +move 8 from 1 to 6 +move 7 from 1 to 8 +move 9 from 1 to 6 +move 1 from 5 to 3 +move 3 from 8 to 4 +move 11 from 3 to 4 +move 1 from 3 to 6 +move 10 from 6 to 8 +move 13 from 1 to 6 +move 3 from 4 to 5 +move 7 from 8 to 6 +move 3 from 8 to 5 +move 6 from 5 to 3 +move 22 from 6 to 9 +move 4 from 3 to 6 +move 4 from 9 to 5 +move 1 from 1 to 5 +move 2 from 3 to 4 +move 2 from 1 to 5 +move 1 from 9 to 2 +move 5 from 8 to 3 +move 2 from 9 to 2 +move 11 from 6 to 9 +move 3 from 2 to 7 +move 1 from 6 to 7 +move 12 from 9 to 8 +move 4 from 7 to 1 +move 12 from 4 to 8 +move 2 from 4 to 7 +move 1 from 1 to 8 +move 1 from 5 to 1 +move 19 from 8 to 4 +move 4 from 5 to 1 +move 1 from 7 to 4 +move 1 from 7 to 1 +move 3 from 3 to 4 +move 2 from 8 to 4 +move 1 from 5 to 7 +move 1 from 7 to 9 +move 8 from 1 to 8 +move 1 from 1 to 4 +move 1 from 3 to 9 +move 1 from 3 to 5 +move 1 from 5 to 2 +move 7 from 8 to 7 +move 16 from 4 to 7 +move 1 from 7 to 4 +move 3 from 8 to 2 +move 14 from 7 to 4 +move 1 from 5 to 8 +move 5 from 7 to 5 +move 16 from 4 to 5 +move 3 from 5 to 4 +move 3 from 2 to 1 +move 1 from 7 to 9 +move 11 from 4 to 2 +move 3 from 8 to 6 +move 2 from 1 to 8 +move 1 from 4 to 9 +move 18 from 5 to 1 +move 1 from 8 to 7 +move 3 from 7 to 9 +move 18 from 9 to 3 +move 3 from 6 to 9 +move 7 from 1 to 6 +move 1 from 8 to 4 +move 1 from 4 to 9 +move 3 from 6 to 4 +move 5 from 9 to 2 +move 2 from 4 to 7 +move 7 from 2 to 8 +move 1 from 7 to 3 +move 2 from 6 to 8 +move 1 from 9 to 5 +move 1 from 6 to 8 +move 1 from 4 to 8 +move 1 from 5 to 3 +move 1 from 7 to 5 +move 8 from 8 to 7 +move 10 from 2 to 6 +move 1 from 9 to 3 +move 6 from 6 to 2 +move 5 from 6 to 2 +move 7 from 2 to 7 +move 12 from 1 to 6 +move 2 from 2 to 1 +move 1 from 2 to 5 +move 4 from 7 to 6 +move 12 from 3 to 1 +move 2 from 7 to 2 +move 9 from 3 to 8 +move 1 from 2 to 6 +move 1 from 5 to 4 +move 9 from 6 to 5 +move 1 from 7 to 6 +move 1 from 4 to 9 +move 9 from 6 to 7 +move 7 from 8 to 3 +move 6 from 3 to 1 +move 4 from 8 to 3 +move 5 from 3 to 1 +move 1 from 9 to 8 +move 2 from 8 to 9 +move 5 from 5 to 7 +move 14 from 7 to 8 +move 1 from 9 to 4 +move 2 from 2 to 1 +move 3 from 5 to 3 +move 2 from 3 to 1 +move 1 from 4 to 6 +move 6 from 8 to 6 +move 6 from 8 to 3 +move 3 from 6 to 1 +move 2 from 8 to 9 +move 19 from 1 to 6 +move 3 from 9 to 3 +move 6 from 3 to 4 +move 6 from 6 to 2 +move 4 from 3 to 9 +move 1 from 7 to 9 +move 2 from 5 to 7 +move 5 from 9 to 6 +move 6 from 7 to 2 +move 11 from 2 to 5 +move 2 from 7 to 4 +move 4 from 4 to 3 +move 2 from 4 to 8 +move 12 from 1 to 2 +move 1 from 8 to 2 +move 8 from 5 to 7 +move 2 from 4 to 9 +move 2 from 7 to 1 +move 4 from 2 to 3 +move 1 from 8 to 6 +move 1 from 1 to 5 +move 2 from 9 to 1 +move 2 from 7 to 3 +move 2 from 5 to 2 +move 1 from 5 to 7 +move 2 from 7 to 8 +move 1 from 5 to 7 +move 5 from 3 to 4 +move 3 from 1 to 7 +move 1 from 2 to 4 +move 15 from 6 to 1 +move 4 from 4 to 1 +move 4 from 2 to 3 +move 8 from 3 to 2 +move 5 from 2 to 4 +move 1 from 8 to 6 +move 1 from 8 to 9 +move 1 from 3 to 1 +move 3 from 7 to 3 +move 5 from 7 to 6 +move 4 from 2 to 9 +move 6 from 2 to 6 +move 4 from 9 to 6 +move 12 from 1 to 5 +move 6 from 4 to 1 +move 1 from 3 to 6 +move 4 from 5 to 8 +move 7 from 5 to 3 +move 3 from 8 to 2 +move 1 from 2 to 3 +move 1 from 9 to 5 +move 1 from 4 to 5 +move 1 from 8 to 5 +move 8 from 6 to 9 +move 10 from 1 to 4 +move 3 from 6 to 1 +move 9 from 3 to 6 +move 1 from 3 to 8 +move 1 from 2 to 4 +move 6 from 9 to 1 +move 1 from 1 to 4 +move 10 from 1 to 6 +move 1 from 8 to 6 +move 13 from 6 to 7 +move 1 from 2 to 1 +move 1 from 9 to 6 +move 9 from 7 to 5 +move 1 from 9 to 4 +move 3 from 7 to 1 +move 3 from 5 to 6 +move 10 from 4 to 7 +move 5 from 6 to 5 +move 3 from 4 to 5 +move 13 from 6 to 9 +move 7 from 5 to 3 +move 6 from 3 to 2 +move 5 from 6 to 4 +move 4 from 2 to 8 From ae4c4f4f536f7b75bd48de84946e02be52a5fde1 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Mon, 5 Dec 2022 06:34:58 +0100 Subject: [PATCH 347/433] Day 5 2022 tiny refactor --- .../sbaars/adventofcode/year22/days/Day5.java | 41 +++++++------------ 1 file changed, 14 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day5.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day5.java index 6c00ab46..6edbef8b 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day5.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day5.java @@ -30,29 +30,12 @@ public record Move(long which, long from, long to) {} @Override public Object part1() { - List> stacks = new ArrayList<>(); - for(int i = 1; i<=9; i++){ - Deque s = new ArrayDeque<>(); - switch(i){ - case 1: "NSDCVQT".chars().forEach(s::add); break; - case 2: "MFV".chars().forEach(s::add); break; - case 3: "FQWDPNHM".chars().forEach(s::add); break; - case 4: "DQRTF".chars().forEach(s::add); break; - case 5: "RFMNQHVB".chars().forEach(s::add); break; - case 6: "CFGNPWQ".chars().forEach(s::add); break; - case 7: "WFRLCT".chars().forEach(s::add); break; - case 8: "TZNS".chars().forEach(s::add); break; - case 9: "MSDJRQHN".chars().forEach(s::add); break; - } - stacks.add(s); - } - + List> stacks = input(); List moves = dayStream().map(String::trim).map(s -> readString(s, "move %n from %n to %n", Move.class)).toList(); for(Move m : moves) { for(int i = 0; i> stacks = input(); + List moves = dayStream().map(String::trim).map(s -> readString(s, "move %n from %n to %n", Move.class)).toList(); + for(Move m : moves) { + List toBeMoved = new ArrayList<>(); + for(int i = 0; i stacks.get(toIntExact(m.to-1)).addLast(i)); + } + + return stacks.stream().map(Deque::peekLast).map(e -> Character.toString((char)(int)e)).collect(Collectors.joining()); + } + + private static List> input() { List> stacks = new ArrayList<>(); for(int i = 1; i<=9; i++){ Deque s = new ArrayDeque<>(); @@ -87,14 +82,6 @@ public Object part2() { } stacks.add(s); } - - List moves = dayStream().map(String::trim).map(s -> readString(s, "move %n from %n to %n", Move.class)).toList(); - for(Move m : moves) { - List toBeMoved = new ArrayList<>(); - for(int i = 0; i stacks.get(toIntExact(m.to-1)).addLast(i)); - } - - return stacks.stream().map(Deque::peekLast).map(e -> Character.toString((char)(int)e)).collect(Collectors.joining()); + return stacks; } } From 6245ddf65e9712d8072813000968753aa513e879 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Mon, 5 Dec 2022 06:44:22 +0100 Subject: [PATCH 348/433] Day 5 2022 More refactoring --- .../sbaars/adventofcode/year22/days/Day5.java | 40 ++++++++----------- 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day5.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day5.java index 6edbef8b..b4abc4e3 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day5.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day5.java @@ -31,54 +31,46 @@ public record Move(long which, long from, long to) {} @Override public Object part1() { List> stacks = input(); - List moves = dayStream().map(String::trim).map(s -> readString(s, "move %n from %n to %n", Move.class)).toList(); + List moves = getMoves(); for(Move m : moves) { for(int i = 0; i Character.toString((char)(int)e)).collect(Collectors.joining()); } - private String toASCII(int value) { - int length = 4; - StringBuilder builder = new StringBuilder(length); - for (int i = length - 1; i >= 0; i--) { - builder.append((char) ((value >> (8 * i)) & 0xFF)); - } - return builder.toString(); - } - - @Override public Object part2() { List> stacks = input(); - List moves = dayStream().map(String::trim).map(s -> readString(s, "move %n from %n to %n", Move.class)).toList(); + List moves = getMoves(); for(Move m : moves) { List toBeMoved = new ArrayList<>(); for(int i = 0; i stacks.get(toIntExact(m.to-1)).addLast(i)); } - return stacks.stream().map(Deque::peekLast).map(e -> Character.toString((char)(int)e)).collect(Collectors.joining()); } + private List getMoves() { + return dayStream().map(String::trim).map(s -> readString(s, "move %n from %n to %n", Move.class)).toList(); + } + private static List> input() { List> stacks = new ArrayList<>(); for(int i = 1; i<=9; i++){ Deque s = new ArrayDeque<>(); - switch(i){ - case 1: "NSDCVQT".chars().forEach(s::add); break; - case 2: "MFV".chars().forEach(s::add); break; - case 3: "FQWDPNHM".chars().forEach(s::add); break; - case 4: "DQRTF".chars().forEach(s::add); break; - case 5: "RFMNQHVB".chars().forEach(s::add); break; - case 6: "CFGNPWQ".chars().forEach(s::add); break; - case 7: "WFRLCT".chars().forEach(s::add); break; - case 8: "TZNS".chars().forEach(s::add); break; - case 9: "MSDJRQHN".chars().forEach(s::add); break; + switch (i) { + case 1 -> "NSDCVQT".chars().forEach(s::add); + case 2 -> "MFV".chars().forEach(s::add); + case 3 -> "FQWDPNHM".chars().forEach(s::add); + case 4 -> "DQRTF".chars().forEach(s::add); + case 5 -> "RFMNQHVB".chars().forEach(s::add); + case 6 -> "CFGNPWQ".chars().forEach(s::add); + case 7 -> "WFRLCT".chars().forEach(s::add); + case 8 -> "TZNS".chars().forEach(s::add); + case 9 -> "MSDJRQHN".chars().forEach(s::add); } stacks.add(s); } From 6694ffd24008ed3b649482f705d4b35b2b854623 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Mon, 5 Dec 2022 09:31:32 +0100 Subject: [PATCH 349/433] Properly use stacks --- .../sbaars/adventofcode/year22/days/Day5.java | 44 +++++++++---------- 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day5.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day5.java index b4abc4e3..9d25367e 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day5.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day5.java @@ -1,10 +1,12 @@ package com.sbaars.adventofcode.year22.days; -import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year22.Day2022; import java.io.IOException; -import java.util.*; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Deque; +import java.util.List; import java.util.stream.Collectors; import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; @@ -17,13 +19,7 @@ public Day5() { } public static void main(String[] args) throws IOException { - Day d = new Day5(); - d.downloadIfNotDownloaded(); -// d.downloadExample(); - d.printParts(); - System.in.read(); -// d.submitPart1(); - d.submitPart2(); + new Day5().printParts(); } public record Move(long which, long from, long to) {} @@ -34,11 +30,11 @@ public Object part1() { List moves = getMoves(); for(Move m : moves) { for(int i = 0; i Character.toString((char)(int)e)).collect(Collectors.joining()); + return stacks.stream().map(Deque::peek).map(e -> Character.toString((char)(int)e)).collect(Collectors.joining()); } @Override @@ -47,10 +43,10 @@ public Object part2() { List moves = getMoves(); for(Move m : moves) { List toBeMoved = new ArrayList<>(); - for(int i = 0; i stacks.get(toIntExact(m.to-1)).addLast(i)); + for(int i = 0; i stacks.get(toIntExact(m.to-1)).push(i)); } - return stacks.stream().map(Deque::peekLast).map(e -> Character.toString((char)(int)e)).collect(Collectors.joining()); + return stacks.stream().map(Deque::peek).map(e -> Character.toString((char)(int)e)).collect(Collectors.joining()); } private List getMoves() { @@ -62,15 +58,15 @@ private static List> input() { for(int i = 1; i<=9; i++){ Deque s = new ArrayDeque<>(); switch (i) { - case 1 -> "NSDCVQT".chars().forEach(s::add); - case 2 -> "MFV".chars().forEach(s::add); - case 3 -> "FQWDPNHM".chars().forEach(s::add); - case 4 -> "DQRTF".chars().forEach(s::add); - case 5 -> "RFMNQHVB".chars().forEach(s::add); - case 6 -> "CFGNPWQ".chars().forEach(s::add); - case 7 -> "WFRLCT".chars().forEach(s::add); - case 8 -> "TZNS".chars().forEach(s::add); - case 9 -> "MSDJRQHN".chars().forEach(s::add); + case 1 -> "NSDCVQT".chars().forEach(s::push); + case 2 -> "MFV".chars().forEach(s::push); + case 3 -> "FQWDPNHM".chars().forEach(s::push); + case 4 -> "DQRTF".chars().forEach(s::push); + case 5 -> "RFMNQHVB".chars().forEach(s::push); + case 6 -> "CFGNPWQ".chars().forEach(s::push); + case 7 -> "WFRLCT".chars().forEach(s::push); + case 8 -> "TZNS".chars().forEach(s::push); + case 9 -> "MSDJRQHN".chars().forEach(s::push); } stacks.add(s); } From 49a00dd2ee23031e2d87619c7208111034d1090a Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Tue, 6 Dec 2022 06:07:43 +0100 Subject: [PATCH 350/433] Day 6 2022 --- .../sbaars/adventofcode/year22/days/Day6.java | 24 +++++++++++++++++-- src/main/resources/2022/day6.txt | 1 + 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/2022/day6.txt diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day6.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day6.java index f3e588bd..b992f7f9 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day6.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day6.java @@ -1,24 +1,44 @@ package com.sbaars.adventofcode.year22.days; +import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year22.Day2022; +import java.io.IOException; +import java.util.Set; + public class Day6 extends Day2022 { public Day6() { super(6); } - public static void main(String[] args) { - new Day6().printParts(); + public static void main(String[] args) throws IOException { + Day d = new Day6(); + d.downloadIfNotDownloaded(); +// d.downloadExample(); + d.printParts(); + System.in.read(); +// d.submitPart1(); + d.submitPart2(); } @Override public Object part1() { + String s = day(); + for(int i = 0; i chars = Set.copyOf(s.substring(i, i+4).chars().mapToObj(e -> e).toList()); + if(chars.size() == 4) return i+4; + } return ""; } @Override public Object part2() { + String s = day(); + for(int i = 0; i chars = Set.copyOf(s.substring(i, i+14).chars().mapToObj(e -> e).toList()); + if(chars.size() == 14) return i+14; + } return ""; } } diff --git a/src/main/resources/2022/day6.txt b/src/main/resources/2022/day6.txt new file mode 100644 index 00000000..d549e648 --- /dev/null +++ b/src/main/resources/2022/day6.txt @@ -0,0 +1 @@ +rqwqtwwrmrqqrcrtrpppjrjgrgjgqgttgbbhppftpfpdpmpsstffqvfqvvdjjpllltqltqtrrzlllbldbdsdqqgpqggzccgbgnnmjmljmljldjldjjlnnhndhdmmslmslmlhmmntnrtnrnbrbqrqhqfftwftfsfzfcfrrzllchcwwtwstwwjwrjjfwwgzwzqzpzhzqhqbhqhssltsszhsszdssrwssdppjcpjjrwjwnwjnnzjjhsjhsjsjvvtffffqfflglwglgbgpbgbgghfghfhdfhdfhfssqppvlvslltwwhwvwpwgggnpnnmqnntqnnlhhdbhdbbtvvcrrcgrrdrvrjvvlmlnmndnmnrncnznsnsqnsswrwzwmwzzbpbhphqhpqpbpqpjpjvpvwpvwppdvdhdccqbccfncctrcrjcjjdsdhdnhhwpwlwwbmbhmbhhpzhhccvffqqnsqqmnnspnnpfpzppspgsppgbbdwbbdcchfhgfhfllljtllnjlnlddvcdvdqvvqwqppprtpthtthqqfbqqpfpzfpfcfsscrsccbgbngbbgdbbpgpqqlmqlmmgffqqqsbqbtblbwbqqvbqvbqvvnzvzpvvqhvqqtltptllbflbflbflltddlblflvfvbffmsffhlhshmmgbbgjjdndqqmqllzjzvvhjhnhcnchhznnhhppwqpwpffwvwzzppwpfwftwtnnqbnqnrnrzznffzzblzlvzlzrrszscsqcssbggcgvvddsttgqqgwgcclzzszddlvddvbddrlrcllrblrrhlldzdtdccqllsblsszlszzdllhjljhhhzhffdwfdwfddwdtdrtdtntddldsllqffdvdhdpdhdrdprprrhggdqgghggmwgmghhchlhmllrnrdrcrqccbqqfbqbccjpjhhvppcwpwffmmzzfqflfjfdfbfqqtmthmttwftwwpmpzplzzpvvgppsbpbccbtcbcddzbzwwmsscrcctgtgjgtjthhjzzcqqmmmvccwjcwjwzzwnnwgwtgwwbsbvbccrscccnggfjfwfjfrfsfddncdncndnqqwzzmssbdsbswswdddpdqdbddcvcmmwwssrtrrlddndmdtmtdmttwwmsmffwqwvwbwhbbqfqqgcqcmctctntjntnbnrbrmbbqtqccqbcbvbnbqnnghgbbmfmwmdwmdmpmwppdwpdwwnzwnwrnwrnntqnttcmcqqbrqrttsjtstcscpcspsnswsggrhggjrjjbhhbnbmmdlmddtqdtdrdwwjvjgjjdhjdddbwwsfflppbwbcbpbjjzqznnrwnnvmvjvwvqqrlljgjmjjqhjhwjhwjjsvsnvvlwlqqjpjjbsjjcddtfthffrqfrqrfqfrfllfzzqllztltnltntpttqmmgwmwwwjjdrjrzrlrwlwzzzzphpphvphvphvpvdvfdflljgglrlrqlrrfpfqpqnpqpmmblbflbfbpfpwpjwpjpbjpjmjljblldbllnrnjjjljrlrcrrgzgbbzrznzzhnzhhtmhmqhmqqnzzvfzvzfftjftfvvpmvppwzzhnzhzvvwzwwqcwctwwgrrtgglgngsgvgwvwpvpbbrvrvwrvwvbwwpsprrrcbbpqppfjjjqnjndnmddvsvlslmmwwdwcchmmrjmjwwsrwrhwwpcgmpmvbdmlmqbnblbbgtmtgqslnvcnmwrflrnwhqzrsnwhncwdvbcpjrqsscwzrjvslhscpvmqjnltwhshjmbhgttbzllrvpnhgdmwtddbwmpgbhrndpgwzfvqdmpcvhlnjnqbwqmshgwhmfjgsbscsjtfbfvmlljqwwjtnltbzjpcqdfmdldvmsnmzqmghcvhlpjzzszcpvldrflbcppzwgppfpbslplrqwgbfwpwbtbnrmbrrrpqndzvhmlhvtlnjvhdrhhvmwzjntsgffjsdpdlhnlslnbmbsmdsvpmpbjpjcwhbpfnhbmttfglglnnhhcqvbpvnrwcszwjsdhqwctrpgsrcbfpzhbnrbllrlflqdlgzwpwgwwvmbsppbcjcdltbgwfndqjlvndhtclfmwnqrbfvvqdzspfcslplhtmsqqtrcdvbhfscvnmzplcglwnzbvgflclclqmdgfzjqqrrmpcqrzgqcnzbmncmvdzrmmvfqrrqzqbjmjgjwmfbnmmgvmzsgjjspjqbvfhrdvllgqsffjnfqdthjbjwhwqdqhsnctwgbszvrsbwbpptcjjvftnhdmwmhtjrjrlrdrqjznhqftgtldnpbrlprjmplmwdbzqpmwwvcqccjlhqbhcjprvrfmmfmljwmbrlhcglthgbmrfmbpsztfcglpzlfbpjhmvcmvrprmvmrvvgbbllzschwshhfbnmgwrbhlqvsdjdmmbtjzthwssghtqvhtqcswdhbwhphhsrwhwwtslwvrhpgqfmftnrtqpwfqqdgftdlqfndjlzhvlrthnqdqrzpprdgwwqlplrmqtdqgbdntmjcjhlbbmctvnnhtppfbjpsbmndbdplqlfqfhzqvtqcvmprwbhdtjrqrqvmcssqnfqwtchmjfjlpwsghplbthdnbhfbhhphdmlmtjcvmzjbnqbfldrvlmjfnnrlsnwrtnrpfqdhchltmbvjzhgjwzblqdthmffztqvzzfszmdqdzlfpbfgjfdjqscrhvjflbllnlghncczrlpcbwpnmzcnqhbfnlmnbqvmwvbchwhlfcssctsdcwmtfdgbhljwprfncdgwlgzzmvfqrdsmlwbrmbmtzqqdqdpzvtbstscglrwdpndnstrhgjchnpzsvcjngmzsddwsbllpvqqzzjlmsbncbndqmqphzqzcngjzpfnjmsvngtcvhhjsssrnhjrsmvbsrdjcrppvgsqbqjzbrhjqlgmqfclbrdhwwjdlsjnmjcjrmsstngswrhmdqthprcbrndfpdjgpqtfmmfvbztqdhzhzbzhjjpfgnvrmspdvmhfvbvztmlrhfqfdcfnzzndlfldpfhrbjrwlwnprdmqjwppbrdjhpbvnrvjlrbwdwttzhqqgcclbwghbgrhcvwjrrchqgzztrjgrltcpdscjdfcphndfzdqsbpsjrljdnflfvrzcrjflddfgpvnpmdqbhzwbfrpzsnpbcbgfchvvmqpnfpvvdvhfnpbfzwmbnlpqzgrpwtsjbpzdrsfmnfqwqvpgnrjhmvmphlfdpfhdjljlzftdzdvhjrvjdctwfrctglwmrtdlrvmhcqvfvpgmstghczmvclptzspdsrlvrgvjtvflhsmqswdpqjrrnhgrggzmcpqsctqbhpqrsbstwzgzghqgltcpbrhbcdqlhfjhlcrnhrpjdzlzqqprvzntbjztqgdqqttmbpbcfbjmdjqsflbczmfnsjdzcnnmjjllhvwbwlgrlpvbffwjvctwnrsfqdnwntscpsjnshhdmcqmcpscrmzltldwlmfnbhbtprsgtsbvzfrsfpvmqjzjqqhwdjjzvbhrvtbscrcpzrqsbgfbpwqfmbsrlhhtntjmtrtlwqsdbmgtdlrwfdnmwwzlltbrjgghbstbnffzmzzdlcdgvmrzsjnqjvczmhrgwbrblrqfmzbbcnfsbfpgjsmptzbclfdnwfgbzlpbgqrdhdmfjdnlzczdpvtbzdmrthslngbrldllfcjplhglmwsfpqjnrgpgqfmbbwchbrqqsncfwnmgdmtchdhlzzqjvtvtvgqbtwvwpsjqwdqhrlfmdgdzchvfbcmqjllpjtnphwqvfwpcjmzqhsbwlcmbsgththrsjtnzlsrcptgtrfcwptbstcsdzbwjljzjztzbqsjdvwglpbpgdjtthjjmsnljltglqcszbzqmblfpncntjzzhmjffldcrcvjjswvzlfffrmsgjtpzggtlpfwpwbmhmggpnmzwrgdjrhglnhfdcjdfjtdjvrnlgqtfqmpgjcvcmnwhhbczwwntfbmgssglngqlttfpcznswvmbprsrzljtlwlljnbbrnwdvvlsbdv From 2118ba778e29408e0f9292f25f14ccf0a50a1f8f Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Tue, 6 Dec 2022 06:13:09 +0100 Subject: [PATCH 351/433] Day 6 2022 Refactor --- .../sbaars/adventofcode/year22/days/Day6.java | 40 ++++++++----------- 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day6.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day6.java index b992f7f9..23cb538b 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day6.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day6.java @@ -1,6 +1,5 @@ package com.sbaars.adventofcode.year22.days; -import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year22.Day2022; import java.io.IOException; @@ -13,32 +12,25 @@ public Day6() { } public static void main(String[] args) throws IOException { - Day d = new Day6(); - d.downloadIfNotDownloaded(); -// d.downloadExample(); - d.printParts(); - System.in.read(); -// d.submitPart1(); - d.submitPart2(); + new Day6().printParts(); } - @Override - public Object part1() { - String s = day(); - for(int i = 0; i chars = Set.copyOf(s.substring(i, i+4).chars().mapToObj(e -> e).toList()); - if(chars.size() == 4) return i+4; + @Override + public Object part1() { + return calculateAnswer(4); } - return ""; - } - @Override - public Object part2() { - String s = day(); - for(int i = 0; i chars = Set.copyOf(s.substring(i, i+14).chars().mapToObj(e -> e).toList()); - if(chars.size() == 14) return i+14; + private int calculateAnswer(int size) { + String s = day(); + for(int i = 0; i chars = Set.copyOf(s.substring(i, i+size).chars().boxed().toList()); + if(chars.size() == size) return i+size; + } + return 0; + } + + @Override + public Object part2() { + return calculateAnswer(14); } - return ""; - } } From 399a7253dbd90738b19190098b4dc562e87a57e3 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Tue, 6 Dec 2022 06:14:17 +0100 Subject: [PATCH 352/433] Fix indentation --- .../sbaars/adventofcode/year22/days/Day6.java | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day6.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day6.java index 23cb538b..9a5e1a99 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day6.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day6.java @@ -15,22 +15,22 @@ public static void main(String[] args) throws IOException { new Day6().printParts(); } - @Override - public Object part1() { - return calculateAnswer(4); - } + @Override + public Object part1() { + return calculateAnswer(4); + } - private int calculateAnswer(int size) { - String s = day(); - for(int i = 0; i chars = Set.copyOf(s.substring(i, i+size).chars().boxed().toList()); - if(chars.size() == size) return i+size; - } - return 0; + private int calculateAnswer(int size) { + String s = day(); + for(int i = 0; i chars = Set.copyOf(s.substring(i, i+size).chars().boxed().toList()); + if(chars.size() == size) return i+size; } + return 0; + } - @Override - public Object part2() { - return calculateAnswer(14); - } + @Override + public Object part2() { + return calculateAnswer(14); + } } From 4f18ff697f604057f3c0d43e411fafe4921f6323 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Tue, 6 Dec 2022 06:51:17 +0100 Subject: [PATCH 353/433] Day 6 2022 Stream solution --- .../java/com/sbaars/adventofcode/year22/days/Day6.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day6.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day6.java index 9a5e1a99..feeefe52 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day6.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day6.java @@ -3,7 +3,7 @@ import com.sbaars.adventofcode.year22.Day2022; import java.io.IOException; -import java.util.Set; +import java.util.stream.IntStream; public class Day6 extends Day2022 { @@ -22,11 +22,7 @@ public Object part1() { private int calculateAnswer(int size) { String s = day(); - for(int i = 0; i chars = Set.copyOf(s.substring(i, i+size).chars().boxed().toList()); - if(chars.size() == size) return i+size; - } - return 0; + return IntStream.range(0, s.length()).filter(i -> s.substring(i, i+size).chars().distinct().count() == size).findFirst().getAsInt() + size; } @Override From c9e75d634856904f3bd72eb8f18ba62a95d2bb77 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Wed, 7 Dec 2022 06:57:20 +0100 Subject: [PATCH 354/433] Day 7 Part 1 --- .../sbaars/adventofcode/year22/days/Day1.java | 2 +- .../sbaars/adventofcode/year22/days/Day2.java | 3 +- .../sbaars/adventofcode/year22/days/Day7.java | 67 +- src/main/resources/2022-examples/day7-1.txt | 2 + src/main/resources/2022-examples/day7-2.txt | 23 + src/main/resources/2022-examples/day7-3.txt | 14 + src/main/resources/2022/day7.txt | 986 ++++++++++++++++++ 7 files changed, 1092 insertions(+), 5 deletions(-) create mode 100644 src/main/resources/2022-examples/day7-1.txt create mode 100644 src/main/resources/2022-examples/day7-2.txt create mode 100644 src/main/resources/2022-examples/day7-3.txt create mode 100644 src/main/resources/2022/day7.txt diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day1.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day1.java index 0b56922a..e73de27e 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day1.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day1.java @@ -33,6 +33,6 @@ public Object part2() { } private LongStream input () { - return Arrays.stream(day().split("\n\n")).mapToLong(s -> Arrays.stream(s.split("\n")).map(String::trim).mapToLong(e -> Long.parseLong(e)).sum()); + return Arrays.stream(day().split("\n\n")).mapToLong(s -> Arrays.stream(s.split("\n")).map(String::trim).mapToLong(Long::parseLong).sum()); } } diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day2.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day2.java index 2e6225fc..8a2e0973 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day2.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day2.java @@ -54,7 +54,8 @@ private Outcome calculateOutcome(Shape sa, Shape sb) { return DRAW; } else if(sa.ordinal() == ((sb.ordinal() + 1) % Shape.values().length)) { return LOSS; - } else return WIN; + } + return WIN; } private long getScore2() { diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day7.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day7.java index 3102ea3b..c194b757 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day7.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day7.java @@ -1,20 +1,81 @@ package com.sbaars.adventofcode.year22.days; +import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year22.Day2022; +import java.io.IOException; +import java.util.*; + +import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; + public class Day7 extends Day2022 { public Day7() { super(7); } - public static void main(String[] args) { - new Day7().printParts(); + public static void main(String[] args) throws IOException { + Day d = new Day7(); +// d.downloadIfNotDownloaded(); +// d.downloadExample(); + d.printParts(); +// System.in.read(); + d.submitPart1(); +// d.submitPart2(); } + public record Node(Map children, long size){} + public record File(long size, String name){} + @Override public Object part1() { - return ""; +// Node parent = new Node(null, new ArrayList<>(), 0); + List commands = Arrays.asList(dayStrings()).stream().toList(); +// new Node("/", null, new ArrayList<>(), 0) + Node root = findChildren(commands); +// for(int i = 1; i< commands.length; i++) { +// findChildren("") +// } + return sumSize(root); + } + + int i = 1; + public Node findChildren(List commands) { + Map children = new HashMap<>(); + for(; i(), 0)); + } else { + File f = readString(c, "%n %s", File.class); + children.put(f.name, new Node(new HashMap<>(), f.size)); + } + } + } + return new Node(children, children.values().stream().mapToLong(Node::size).sum()); + } + + public long sumSize(Node n) { + long total = 0; + for(Node node : n.children.values()) { + if(node.size<=100000 && !node.children.isEmpty()) { + total+=node.size; + } + total += sumSize(node); + } + return total; } @Override diff --git a/src/main/resources/2022-examples/day7-1.txt b/src/main/resources/2022-examples/day7-1.txt new file mode 100644 index 00000000..d424780a --- /dev/null +++ b/src/main/resources/2022-examples/day7-1.txt @@ -0,0 +1,2 @@ +$ system-update --please --pretty-please-with-sugar-on-top +Error: No space left on device diff --git a/src/main/resources/2022-examples/day7-2.txt b/src/main/resources/2022-examples/day7-2.txt new file mode 100644 index 00000000..09a921e5 --- /dev/null +++ b/src/main/resources/2022-examples/day7-2.txt @@ -0,0 +1,23 @@ +$ cd / +$ ls +dir a +14848514 b.txt +8504156 c.dat +dir d +$ cd a +$ ls +dir e +29116 f +2557 g +62596 h.lst +$ cd e +$ ls +584 i +$ cd .. +$ cd .. +$ cd d +$ ls +4060174 j +8033020 d.log +5626152 d.ext +7214296 k diff --git a/src/main/resources/2022-examples/day7-3.txt b/src/main/resources/2022-examples/day7-3.txt new file mode 100644 index 00000000..5916a41a --- /dev/null +++ b/src/main/resources/2022-examples/day7-3.txt @@ -0,0 +1,14 @@ +- / (dir) + - a (dir) + - e (dir) + - i (file, size=584) + - f (file, size=29116) + - g (file, size=2557) + - h.lst (file, size=62596) + - b.txt (file, size=14848514) + - c.dat (file, size=8504156) + - d (dir) + - j (file, size=4060174) + - d.log (file, size=8033020) + - d.ext (file, size=5626152) + - k (file, size=7214296) diff --git a/src/main/resources/2022/day7.txt b/src/main/resources/2022/day7.txt new file mode 100644 index 00000000..659f8b07 --- /dev/null +++ b/src/main/resources/2022/day7.txt @@ -0,0 +1,986 @@ +$ cd / +$ ls +dir bnl +dir dmpsnhdh +272080 dncdssn.hdr +dir fcnqg +6067 hjpmqrq +dir jvwtm +dir ldztz +dir lmmw +dir wthvqw +dir zpdnprb +$ cd bnl +$ ls +dir dhw +dir dmpsnhdh +dir lmw +dir vgbqbrst +$ cd dhw +$ ls +237421 vccwmhl +$ cd .. +$ cd dmpsnhdh +$ ls +dir chf +dir mjpbhjm +dir zwhpwp +$ cd chf +$ ls +4679 lmw.wmp +217367 wwnfv.qqr +dir zfgznbz +$ cd zfgznbz +$ ls +179409 cnj.gdn +171574 vglqg +$ cd .. +$ cd .. +$ cd mjpbhjm +$ ls +dir crf +dir hqnj +dir lmw +18783 lmw.rwr +302608 twpq +166891 vqczlg +$ cd crf +$ ls +32183 dltmqht +240428 frqqdsr.hbf +224910 sgtnrvrt +$ cd .. +$ cd hqnj +$ ls +261723 cgstb +77979 dmpsnhdh.cmd +$ cd .. +$ cd lmw +$ ls +50307 fcqrwd +$ cd .. +$ cd .. +$ cd zwhpwp +$ ls +141133 gdngm.mps +$ cd .. +$ cd .. +$ cd lmw +$ ls +dir dvv +267473 jmqgrh.dlz +295139 rrqjwpm +$ cd dvv +$ ls +114536 gmlmbrrw.wdm +102061 lmw +$ cd .. +$ cd .. +$ cd vgbqbrst +$ ls +105102 dmpsnhdh.bgl +269054 gmwgjf.fzz +dir jbdtpnw +245266 jzsjvgl +216220 lmw.gtb +dir rflp +dir twpq +$ cd jbdtpnw +$ ls +27543 cjvvmzp +$ cd .. +$ cd rflp +$ ls +137601 frqqdsr.hbf +83444 rrqjwpm +$ cd .. +$ cd twpq +$ ls +dir rlbsdj +36846 tnrqzjdd +$ cd rlbsdj +$ ls +56078 bvndq +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd dmpsnhdh +$ ls +dir fnpwwhtj +dir lmw +9090 mgjpsvl.jlh +186374 pbb.zln +$ cd fnpwwhtj +$ ls +dir cgp +$ cd cgp +$ ls +81938 hjpmqrq +281971 jvszf +151057 wmr.bnf +$ cd .. +$ cd .. +$ cd lmw +$ ls +dir bfbv +56929 pbb.zln +dir rrqjwpm +dir sngm +$ cd bfbv +$ ls +92667 qrrttb.jgp +$ cd .. +$ cd rrqjwpm +$ ls +25739 cqljn.zqw +91325 dncdssn.hdr +$ cd .. +$ cd sngm +$ ls +282163 jgrj +dir lmw +237524 lmw.dff +153497 lmw.ntg +dir lqd +dir szn +143535 tvpvc.qpr +98326 vbfgh +$ cd lmw +$ ls +32484 dncdssn.hdr +dir glwr +$ cd glwr +$ ls +144719 frqqdsr.hbf +$ cd .. +$ cd .. +$ cd lqd +$ ls +231401 dncdssn.hdr +dir jnjqmvg +dir lmw +199704 rrqjwpm +$ cd jnjqmvg +$ ls +104947 trpsrfjz.brg +$ cd .. +$ cd lmw +$ ls +230298 rrqjwpm.nnv +158947 wfv.qrb +$ cd .. +$ cd .. +$ cd szn +$ ls +197974 frqqdsr.hbf +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd fcnqg +$ ls +251609 dncdssn.hdr +289497 jdjmftqs +228459 qbmthcq +$ cd .. +$ cd jvwtm +$ ls +dir dmpsnhdh +47959 pbb.zln +dir tlr +dir twpq +dir wbgcsw +dir zjmldjdh +$ cd dmpsnhdh +$ ls +247567 bnl +102471 bnl.wdm +80054 fhqvp.hfm +dir llhp +dir mnsbh +dir mpplsfjp +20844 mtvl.lmp +$ cd llhp +$ ls +180255 dmpsnhdh +$ cd .. +$ cd mnsbh +$ ls +267627 dmpsnhdh +$ cd .. +$ cd mpplsfjp +$ ls +dir bnl +233742 tcnpvqc.tdr +$ cd bnl +$ ls +243223 fcqrwd +$ cd .. +$ cd .. +$ cd .. +$ cd tlr +$ ls +dir vcsngm +dir wndmt +$ cd vcsngm +$ ls +36434 czs.dnv +$ cd .. +$ cd wndmt +$ ls +dir fvmtfcqd +dir nvdb +dir nwqqgl +dir sbspgnpm +$ cd fvmtfcqd +$ ls +237025 nzttjt.rzh +$ cd .. +$ cd nvdb +$ ls +235328 dnrqwqtp.vfc +51984 rhblt.mfz +51332 rjhvhw +$ cd .. +$ cd nwqqgl +$ ls +203534 cjghw +dir cljbrh +$ cd cljbrh +$ ls +133820 lmw.dnd +$ cd .. +$ cd .. +$ cd sbspgnpm +$ ls +270010 hjpmqrq +$ cd .. +$ cd .. +$ cd .. +$ cd twpq +$ ls +dir dmpsnhdh +dir hbchdjjp +247649 hjpmqrq +29891 rrqjwpm +72407 twpq.crb +$ cd dmpsnhdh +$ ls +251490 dncdssn.hdr +222231 hjpmqrq +102058 pbb.zln +$ cd .. +$ cd hbchdjjp +$ ls +70058 dprrmd.qcd +230958 tsdbl.bnq +$ cd .. +$ cd .. +$ cd wbgcsw +$ ls +292028 bhtfcf +dir bnl +dir bqq +dir ctnlpgt +247888 hblhfvwj +dir hbqm +277949 pbb.zln +106225 rrqjwpm +125927 ssqpmlfb.gwm +dir zqmjwsgz +dir zwwphs +$ cd bnl +$ ls +dir fbbr +240500 frqqdsr.hbf +dir mzfrdl +25137 srqlww.mcj +dir tqgrdz +dir ztrnq +$ cd fbbr +$ ls +84414 mjbw.dhs +$ cd .. +$ cd mzfrdl +$ ls +135647 bccwgn +dir cjdptqgh +dir hwdnrqns +dir prq +$ cd cjdptqgh +$ ls +147946 mdgl.drz +11972 pbb.zln +$ cd .. +$ cd hwdnrqns +$ ls +dir dmpsnhdh +$ cd dmpsnhdh +$ ls +254432 phthmn +$ cd .. +$ cd .. +$ cd prq +$ ls +75827 dmpsnhdh.rtl +$ cd .. +$ cd .. +$ cd tqgrdz +$ ls +251475 bjwnll.rlw +$ cd .. +$ cd ztrnq +$ ls +208497 bnl.dtr +179376 gqnbswcj.hht +$ cd .. +$ cd .. +$ cd bqq +$ ls +202201 bnl.lbm +$ cd .. +$ cd ctnlpgt +$ ls +269484 vsfvzrpr +$ cd .. +$ cd hbqm +$ ls +74455 bvnfz +42748 pbb.zln +$ cd .. +$ cd zqmjwsgz +$ ls +146194 pbb.zln +$ cd .. +$ cd zwwphs +$ ls +209587 mtbzd.nwb +$ cd .. +$ cd .. +$ cd zjmldjdh +$ ls +dir cdq +dir mdclfbs +dir tfc +132043 wrm +$ cd cdq +$ ls +289173 twpq.mrn +$ cd .. +$ cd mdclfbs +$ ls +64639 bnl.jwf +dir hpdgt +72868 hznfj.nmj +159467 lmw.bfz +$ cd hpdgt +$ ls +52760 fcqrwd +54661 tzgt.hvh +$ cd .. +$ cd .. +$ cd tfc +$ ls +185481 bwntlh +18925 fcqrwd +$ cd .. +$ cd .. +$ cd .. +$ cd ldztz +$ ls +128430 bwz.fcz +dir dmpsnhdh +dir lbqgz +dir znrnj +$ cd dmpsnhdh +$ ls +238193 dncdssn.hdr +285939 hwfngq.dpw +$ cd .. +$ cd lbqgz +$ ls +171931 vgrp +$ cd .. +$ cd znrnj +$ ls +153738 vmwwbjqd +$ cd .. +$ cd .. +$ cd lmmw +$ ls +dir bqqnsfdj +163303 fcqrwd +43453 frqqdsr.hbf +33319 hjpmqrq +dir rlpcqtzg +$ cd bqqnsfdj +$ ls +dir bnl +2251 hjpmqrq +14707 rrqjwpm +dir tlnbvhdl +$ cd bnl +$ ls +33357 bnl.fqp +151237 bnl.vbs +40294 dmpsnhdh.hwz +76455 dncdssn.hdr +290341 hjpmqrq +dir lmw +dir nqw +$ cd lmw +$ ls +dir sfj +$ cd sfj +$ ls +156532 fcqrwd +$ cd .. +$ cd .. +$ cd nqw +$ ls +59928 dncdssn.hdr +$ cd .. +$ cd .. +$ cd tlnbvhdl +$ ls +183301 hjpmqrq +$ cd .. +$ cd .. +$ cd rlpcqtzg +$ ls +258638 dqt.mlc +$ cd .. +$ cd .. +$ cd wthvqw +$ ls +224501 pbb.zln +$ cd .. +$ cd zpdnprb +$ ls +dir bnl +dir ffg +dir jljlwpsv +212081 lrzc.lhj +dir rrqjwpm +dir twpq +dir vlgsrtm +$ cd bnl +$ ls +124009 hjgjf +74860 hjpmqrq +84996 lrdl.swf +dir pnzmp +$ cd pnzmp +$ ls +dir btbtlrs +128636 nfzf +$ cd btbtlrs +$ ls +107651 hhzbwd.wzj +$ cd .. +$ cd .. +$ cd .. +$ cd ffg +$ ls +57918 jwzbs.tnt +$ cd .. +$ cd jljlwpsv +$ ls +188175 dmpsnhdh.nnb +46693 fcqrwd +111557 pbb.zln +$ cd .. +$ cd rrqjwpm +$ ls +dir bftw +dir ccsfws +87225 mccw +290654 pbb.zln +147394 twzqc.pbz +52983 wsvgf +dir wwfgbzqh +$ cd bftw +$ ls +dir brl +167154 crs +dir lmw +dir rrqjwpm +dir twpq +174963 twpq.wjl +dir vnfhb +dir wcldzp +$ cd brl +$ ls +297937 wspcnp +$ cd .. +$ cd lmw +$ ls +166695 mcjql.jrv +$ cd .. +$ cd rrqjwpm +$ ls +198762 mwn +$ cd .. +$ cd twpq +$ ls +141835 jlwf.hcd +$ cd .. +$ cd vnfhb +$ ls +128626 tvmwhq.wfn +$ cd .. +$ cd wcldzp +$ ls +dir ncq +dir twpq +$ cd ncq +$ ls +dir wrtw +$ cd wrtw +$ ls +133331 fcqrwd +$ cd .. +$ cd .. +$ cd twpq +$ ls +151811 fcqrwd +$ cd .. +$ cd .. +$ cd .. +$ cd ccsfws +$ ls +100548 twpq.ppm +$ cd .. +$ cd wwfgbzqh +$ ls +dir lmw +dir mfms +dir pjbjgbcl +204154 qtflzwm +226500 vdmjj.htj +dir wzqbwr +$ cd lmw +$ ls +dir bgl +95150 dncdssn.hdr +119653 frqqdsr.hbf +97941 hjpmqrq +dir jqthwzj +$ cd bgl +$ ls +dir lmw +dir rrqjwpm +$ cd lmw +$ ls +233655 wmdldvbz +$ cd .. +$ cd rrqjwpm +$ ls +242918 frqqdsr.hbf +227581 hjpmqrq +dir hsvnmlp +dir nsch +25524 pbb.zln +dir qlgg +dir twpq +67453 twpq.fms +$ cd hsvnmlp +$ ls +264517 pbb.zln +$ cd .. +$ cd nsch +$ ls +7898 cmsdzh +233270 dmpsnhdh.bsq +101256 frl +133902 jzvh.vdv +dir lmw +dir sgjsg +130245 wcftvft +$ cd lmw +$ ls +69572 bnjnc.csp +$ cd .. +$ cd sgjsg +$ ls +38856 tnzpz.tbq +$ cd .. +$ cd .. +$ cd qlgg +$ ls +276013 frbstg.pzb +$ cd .. +$ cd twpq +$ ls +136454 fhwz.bqb +94099 rglp +114026 tsrt.cbd +26252 zhclpzm.rqf +$ cd .. +$ cd .. +$ cd .. +$ cd jqthwzj +$ ls +128200 lmw.btl +$ cd .. +$ cd .. +$ cd mfms +$ ls +274935 dmpsnhdh +76547 lchwq.dsd +215701 pbb.zln +dir rmwtvjt +$ cd rmwtvjt +$ ls +74490 hjpmqrq +$ cd .. +$ cd .. +$ cd pjbjgbcl +$ ls +231757 cjcpwwc.wbf +dir cswvftzs +dir jtvtg +dir lmw +dir tnctbjr +dir tqsrfhdr +$ cd cswvftzs +$ ls +dir dchqnbns +dir smf +$ cd dchqnbns +$ ls +94111 szl.hqs +$ cd .. +$ cd smf +$ ls +dir dlnsgvl +dir zglt +$ cd dlnsgvl +$ ls +dir dsz +$ cd dsz +$ ls +156473 hjpmqrq +$ cd .. +$ cd .. +$ cd zglt +$ ls +295383 frgg.sdp +$ cd .. +$ cd .. +$ cd .. +$ cd jtvtg +$ ls +202254 bftv.rqb +58419 lmw +$ cd .. +$ cd lmw +$ ls +8097 fcqrwd +$ cd .. +$ cd tnctbjr +$ ls +250830 frqqdsr.hbf +dir gzrcqr +$ cd gzrcqr +$ ls +dir fnzgsnv +$ cd fnzgsnv +$ ls +117215 hjpmqrq +$ cd .. +$ cd .. +$ cd .. +$ cd tqsrfhdr +$ ls +96381 lmw +$ cd .. +$ cd .. +$ cd wzqbwr +$ ls +149066 dmpsnhdh.vnd +dir dpbcgfdr +dir swp +14495 twpq.gsb +dir zhj +$ cd dpbcgfdr +$ ls +12909 dmpsnhdh +dir jvn +173491 mnhpr.lpr +222018 rfqfjmd.jqq +205077 wbbdrpr.hzj +dir wzpbbbhm +$ cd jvn +$ ls +117656 vqddrqlq.nfd +233109 vqqvh.swz +$ cd .. +$ cd wzpbbbhm +$ ls +143534 pbb.zln +$ cd .. +$ cd .. +$ cd swp +$ ls +131295 pbb.zln +$ cd .. +$ cd zhj +$ ls +166268 pbb.zln +33734 rrqjwpm.blg +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd twpq +$ ls +dir bppvlwqs +dir bvh +dir rmcdr +dir tdn +2230 whb.lfb +dir wwtwnvh +$ cd bppvlwqs +$ ls +195026 hvlhgsw +279259 rrqjwpm +$ cd .. +$ cd bvh +$ ls +dir lmw +$ cd lmw +$ ls +66958 pdqnd +$ cd .. +$ cd .. +$ cd rmcdr +$ ls +dir dmpsnhdh +182930 grj +dir pmrdhrth +119725 qpcqclqh +77890 sjgfjz +142855 twpq +dir zbmcrvbh +$ cd dmpsnhdh +$ ls +dir rrqjwpm +188474 zgjzpbl.vgv +$ cd rrqjwpm +$ ls +dir bnl +dir lmw +7598 vsntvs.pdv +$ cd bnl +$ ls +245600 lmw.mgf +$ cd .. +$ cd lmw +$ ls +73396 hjpmqrq +$ cd .. +$ cd .. +$ cd .. +$ cd pmrdhrth +$ ls +173155 rrqjwpm.pjw +178530 smgpzs.qtj +$ cd .. +$ cd zbmcrvbh +$ ls +124201 fcqrwd +135578 hjpmqrq +54356 hnztplsp.qlh +dir lmw +58350 pbb.zln +dir qfrvdm +dir rcg +15267 rwbzjpt.djn +$ cd lmw +$ ls +dir bbbll +28362 bfgfwlf.wvg +229637 dmpndms.fln +146121 dncdssn.hdr +131039 frqqdsr.hbf +152805 hjpmqrq +dir mlz +$ cd bbbll +$ ls +169940 dncdssn.hdr +216888 pbb.zln +248369 tjpmlr.vmf +$ cd .. +$ cd mlz +$ ls +115167 bhfv.fts +$ cd .. +$ cd .. +$ cd qfrvdm +$ ls +284564 pbb.zln +$ cd .. +$ cd rcg +$ ls +dir sqzjz +$ cd sqzjz +$ ls +116435 jrstpcpl.zsq +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd tdn +$ ls +143971 cmg +133317 fcqrwd +dir pstpclp +133161 tddv +$ cd pstpclp +$ ls +267351 hjpmqrq +86930 rrqjwpm.dvl +$ cd .. +$ cd .. +$ cd wwtwnvh +$ ls +256584 frqqdsr.hbf +114564 twpq.wrd +$ cd .. +$ cd .. +$ cd vlgsrtm +$ ls +148089 bnl.jzj +119796 cjfphsfw.hnd +197668 cpw +dir dmpsnhdh +dir fjsglr +dir lmw +dir lqgrft +9231 pltdltrs +dir rmdp +109777 rncfff.fll +dir vgjzqjpq +dir ztnqnfnq +$ cd dmpsnhdh +$ ls +dir lltnrdtv +dir scthsg +$ cd lltnrdtv +$ ls +179511 pcvmpz +90913 tbr +$ cd .. +$ cd scthsg +$ ls +dir rrqjwpm +$ cd rrqjwpm +$ ls +188629 fcqrwd +$ cd .. +$ cd .. +$ cd .. +$ cd fjsglr +$ ls +139754 fcqrwd +dir pnsjwfzc +$ cd pnsjwfzc +$ ls +113848 lmw +$ cd .. +$ cd .. +$ cd lmw +$ ls +54999 dmpsnhdh +dir ffhcf +251476 frqqdsr.hbf +dir jpgqspqw +198972 nhfclq.pbh +180380 nqmjnvc.fvr +dir pfsjwmbc +213768 rcvccgcd +$ cd ffhcf +$ ls +40478 svmwstq.sjj +$ cd .. +$ cd jpgqspqw +$ ls +22181 hjpmqrq +$ cd .. +$ cd pfsjwmbc +$ ls +dir bcvchw +$ cd bcvchw +$ ls +225892 bnl.nwc +$ cd .. +$ cd .. +$ cd .. +$ cd lqgrft +$ ls +dir rrqjwpm +dir twpq +$ cd rrqjwpm +$ ls +54786 fcqrwd +3053 tthhqjm.ntd +$ cd .. +$ cd twpq +$ ls +109355 bnl +dir lmw +dir mhgqt +301291 rrqjwpm.lrm +271233 twpq.srp +$ cd lmw +$ ls +dir lmw +dir lngbszqm +$ cd lmw +$ ls +139640 pbb.zln +$ cd .. +$ cd lngbszqm +$ ls +98279 mqvq.gsj +283599 rvjd.dvt +$ cd .. +$ cd .. +$ cd mhgqt +$ ls +208165 fcqrwd +$ cd .. +$ cd .. +$ cd .. +$ cd rmdp +$ ls +dir bqn +170956 fcqrwd +90954 snnttp.gld +$ cd bqn +$ ls +75628 hdrgbrpc +$ cd .. +$ cd .. +$ cd vgjzqjpq +$ ls +dir bnl +dir wpfw +$ cd bnl +$ ls +25911 pbb.zln +$ cd .. +$ cd wpfw +$ ls +247784 bzll.ltc +$ cd .. +$ cd .. +$ cd ztnqnfnq +$ ls +dir dtpzsrfc +214055 srgzhp.nlr +$ cd dtpzsrfc +$ ls +142652 bhgwj From 2a78c455e0d9fa919372d31eaf24b376b8bb1963 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Wed, 7 Dec 2022 07:07:13 +0100 Subject: [PATCH 355/433] Day 7 Part 2 --- .../sbaars/adventofcode/year22/days/Day7.java | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day7.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day7.java index c194b757..a8ef9c6c 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day7.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day7.java @@ -18,10 +18,10 @@ public static void main(String[] args) throws IOException { Day d = new Day7(); // d.downloadIfNotDownloaded(); // d.downloadExample(); - d.printParts(); +// d.printParts(); // System.in.read(); - d.submitPart1(); -// d.submitPart2(); +// d.submitPart1(); + d.submitPart2(); } public record Node(Map children, long size){} @@ -29,13 +29,8 @@ public record File(long size, String name){} @Override public Object part1() { -// Node parent = new Node(null, new ArrayList<>(), 0); List commands = Arrays.asList(dayStrings()).stream().toList(); -// new Node("/", null, new ArrayList<>(), 0) Node root = findChildren(commands); -// for(int i = 1; i< commands.length; i++) { -// findChildren("") -// } return sumSize(root); } @@ -48,8 +43,6 @@ public Node findChildren(List commands) { String command = c.substring(2); if (command.startsWith("cd")) { String folder = command.substring(3); -// System.out.println(folder); -// i++; if (folder.equals("..")) break; i++; children.put(folder, findChildren(commands)); @@ -78,8 +71,21 @@ public long sumSize(Node n) { return total; } + public List sumSize(Node n, long sizeRoot) { + List total = new ArrayList<>(); + for(Node node : n.children.values()) { + if(node.size>=sizeRoot-(70000000-30000000) && !node.children.isEmpty()) { + total.add(node.size); + } + total.addAll(sumSize(node, sizeRoot)); + } + return total; + } + @Override public Object part2() { - return ""; + List commands = Arrays.asList(dayStrings()).stream().toList(); + Node root = findChildren(commands); + return sumSize(root, root.size()).stream().mapToLong(e -> e).min().getAsLong(); } } From 4bcf498a6cc4d8d3c8d3d2c93d7a296f69221032 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Wed, 7 Dec 2022 08:25:52 +0100 Subject: [PATCH 356/433] Day 7 refactoring --- .../sbaars/adventofcode/year22/days/Day7.java | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day7.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day7.java index a8ef9c6c..8065d16a 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day7.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day7.java @@ -5,6 +5,7 @@ import java.io.IOException; import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; @@ -18,10 +19,10 @@ public static void main(String[] args) throws IOException { Day d = new Day7(); // d.downloadIfNotDownloaded(); // d.downloadExample(); -// d.printParts(); + d.printParts(); // System.in.read(); // d.submitPart1(); - d.submitPart2(); +// d.submitPart2(); } public record Node(Map children, long size){} @@ -29,23 +30,20 @@ public record File(long size, String name){} @Override public Object part1() { - List commands = Arrays.asList(dayStrings()).stream().toList(); - Node root = findChildren(commands); - return sumSize(root); + return sumSize(findChildren(dayStrings(), new AtomicInteger(0))); } - int i = 1; - public Node findChildren(List commands) { + public Node findChildren(String[] commands, AtomicInteger index) { Map children = new HashMap<>(); - for(; i sumSize(Node n, long sizeRoot) { @Override public Object part2() { - List commands = Arrays.asList(dayStrings()).stream().toList(); - Node root = findChildren(commands); - return sumSize(root, root.size()).stream().mapToLong(e -> e).min().getAsLong(); + Node root = findChildren(dayStrings(), new AtomicInteger(0)); + return sumSize(root, root.size).stream().mapToLong(e -> e).min().getAsLong(); } } From ad133f2871a001d69da473037900e07c6b61ed47 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Wed, 7 Dec 2022 22:38:43 +0100 Subject: [PATCH 357/433] Map recursive days --- .../com/sbaars/adventofcode/common/Day.java | 18 ++++++++- .../adventofcode/common/HasRecursion.java | 4 ++ .../com/sbaars/adventofcode/common/Tree.java | 35 ++++++++++++++++++ .../adventofcode/year19/days/Day14.java | 4 +- .../adventofcode/year19/days/Day17.java | 7 ++-- .../adventofcode/year19/days/Day18.java | 4 +- .../adventofcode/year19/days/Day23.java | 6 +-- .../adventofcode/year19/days/Day24.java | 2 +- .../adventofcode/year19/days/Day25.java | 2 +- .../adventofcode/year20/days/Day12.java | 37 ++++++------------- .../adventofcode/year20/days/Day17.java | 3 +- .../adventofcode/year20/days/Day18.java | 7 ++-- .../adventofcode/year20/days/Day20.java | 25 +++++-------- .../adventofcode/year20/days/Day21.java | 25 ++++--------- .../adventofcode/year20/days/Day24.java | 16 ++++---- .../sbaars/adventofcode/year20/days/Day8.java | 2 +- .../sbaars/adventofcode/year21/days/Day1.java | 18 ++------- .../adventofcode/year21/days/Day11.java | 3 +- .../adventofcode/year21/days/Day12.java | 8 ++-- .../adventofcode/year21/days/Day16.java | 3 +- .../adventofcode/year21/days/Day21.java | 8 ++-- .../adventofcode/year21/days/Day24.java | 8 ++-- .../sbaars/adventofcode/year21/days/Day3.java | 22 ++++++----- .../sbaars/adventofcode/year21/days/Day9.java | 14 ++++--- .../sbaars/adventofcode/year22/days/Day7.java | 3 +- 25 files changed, 154 insertions(+), 130 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode/common/HasRecursion.java create mode 100644 src/main/java/com/sbaars/adventofcode/common/Tree.java diff --git a/src/main/java/com/sbaars/adventofcode/common/Day.java b/src/main/java/com/sbaars/adventofcode/common/Day.java index 0227f195..88497884 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Day.java +++ b/src/main/java/com/sbaars/adventofcode/common/Day.java @@ -6,6 +6,7 @@ import java.io.File; import java.io.IOException; import java.util.Arrays; +import java.util.Optional; import java.util.stream.IntStream; import java.util.stream.LongStream; import java.util.stream.Stream; @@ -18,6 +19,9 @@ public abstract class Day { protected final int day; protected int example = 0; + private Object solutionPart1; + private Object solutionPart2; + public Day(int year, int day) { this.year = year; this.day = day; @@ -45,6 +49,10 @@ private String getDayPath() { public abstract Object part2(); public void printParts() { + solutionPart1 = part1(); + solutionPart2 = part2(); + if(solutionPart1 instanceof Optional) solutionPart1 = ((Optional)solutionPart1).get(); + if(solutionPart2 instanceof Optional) solutionPart1 = ((Optional)solutionPart1).get(); System.out.println("Part 1: " + part1()); System.out.println("Part 2: " + part2()); } @@ -56,11 +64,17 @@ public void printParts(int example) { } public void submitPart1() { - new Submit().submit(part1(), year, day, 1); + if(solutionPart1 == null) solutionPart1 = part1(); + if(example == 0 && solutionPart1 != null) { + new Submit().submit(solutionPart1, year, day, 1); + } } public void submitPart2() { - new Submit().submit(part2(), year, day, 2); + if(solutionPart2 == null) solutionPart2 = part1(); + if(example == 0 && solutionPart2 != null) { + new Submit().submit(solutionPart2, year, day, 2); + } } protected String day() { diff --git a/src/main/java/com/sbaars/adventofcode/common/HasRecursion.java b/src/main/java/com/sbaars/adventofcode/common/HasRecursion.java new file mode 100644 index 00000000..50f0e778 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/common/HasRecursion.java @@ -0,0 +1,4 @@ +package com.sbaars.adventofcode.common; + +public interface HasRecursion { +} diff --git a/src/main/java/com/sbaars/adventofcode/common/Tree.java b/src/main/java/com/sbaars/adventofcode/common/Tree.java new file mode 100644 index 00000000..cad3d4d1 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/common/Tree.java @@ -0,0 +1,35 @@ +package com.sbaars.adventofcode.common; + +import java.util.ArrayList; +import java.util.List; + + + +public class Tree { + public enum TreeReversal {CONTINUE, DOWN, UP} + private final Node rootNode; + + public Tree(T rootNodeData) { + this.rootNode = new Node(rootNodeData); + } + + private class Node { + final T data; + final List children; + final Node parent; + + public Node(T data, List children, Node parent) { + this.data = data; + this.children = children; + this.parent = parent; + } + + public Node(T data, List children) { + this(data, children, null); + } + + public Node(T data) { + this(data, new ArrayList<>()); + } + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day14.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day14.java index a1feaf91..9bcd4cc8 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day14.java @@ -1,10 +1,12 @@ package com.sbaars.adventofcode.year19.days; +import com.sbaars.adventofcode.common.HasRecursion; import com.sbaars.adventofcode.year19.Day2019; import com.sbaars.adventofcode.year19.util.LongCountMap; + import java.util.Arrays; -public class Day14 extends Day2019 { +public class Day14 extends Day2019 implements HasRecursion { private final Trade[] trades; diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day17.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day17.java index 53a826d6..2c7dfe45 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day17.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day17.java @@ -76,17 +76,16 @@ public Object part2() { private String findPatterns(List instructions) { List> patterns = new ArrayList<>(); - String patternString = ""; + StringBuilder patternString = new StringBuilder(); int start = 0; for (int i = 0; i < instructions.size() - 1; i++) { List pattern = existing(instructions, patterns, i); if (pattern != null && start == i) { start += pattern.size(); i += pattern.size() - 1; - patternString += "," + patterns.indexOf(pattern); - continue; + patternString.append(",").append(patterns.indexOf(pattern)); } else if (start != i && (pattern != null || occurrences(instructions, instructions.subList(start, i + 1)) < 3)) { - patternString += "," + patterns.size(); + patternString.append(",").append(patterns.size()); patterns.add(instructions.subList(start, i)); start = i; i--; diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day18.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day18.java index 6a6b874e..ec9f5092 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day18.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day18.java @@ -119,9 +119,7 @@ private List findPos(char tile, char tile2) { @Override public Object part2() { for (int y = 0; y < CHANGE_GRID.length; y++) { - for (int x = 0; x < CHANGE_GRID[y].length; x++) { - grid[middle.y - 1 + y][middle.x - 1 + x] = CHANGE_GRID[y][x]; - } + System.arraycopy(CHANGE_GRID[y], 0, grid[middle.y - 1 + y], middle.x - 1, CHANGE_GRID[y].length); } cachedResult.clear(); return findRoutes(findPos('@')); diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day23.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day23.java index aafe8a1b..d4037780 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day23.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day23.java @@ -34,10 +34,10 @@ private long getNetworkNumber(boolean returnNatY) { long input; while (true) { boolean idle = true; - for (int i = 0; i < ic.length; i++) { - if ((input = ic[i].run()) != IntcodeComputer.STOP_CODE) { + for (IntcodeComputer intcodeComputer : ic) { + if ((input = intcodeComputer.run()) != IntcodeComputer.STOP_CODE) { int pc = Math.toIntExact(input); - long x = ic[i].run(), y = ic[i].run(); + long x = intcodeComputer.run(), y = intcodeComputer.run(); if (pc == 255) { if (returnNatY) return y; nat[0] = x; diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day24.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day24.java index 4cc18a31..0c5b1e45 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day24.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day24.java @@ -97,7 +97,7 @@ public Stream streamGrid(char[][] grid) { } private long count(char[][] grid, char c) { - return streamGrid(grid).filter(p -> get(grid, p) == '#').count(); + return streamGrid(grid).filter(p -> get(grid, p) == c).count(); } private void simulate(int layer, char[][] newGrid, Point p) { diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day25.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day25.java index 86c03966..5f022f88 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day25.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day25.java @@ -23,7 +23,7 @@ private void play() { while ((res = ic.run()) != IntcodeComputer.STOP_CODE) System.out.print((char) res); try { ic.setInput(new BufferedReader(new InputStreamReader(System.in)).readLine() + "\n"); - } catch (Exception e) { + } catch (Exception ignored) { } } } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day12.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day12.java index 6a0c04fb..226c2678 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day12.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day12.java @@ -1,15 +1,16 @@ package com.sbaars.adventofcode.year20.days; -import static com.sbaars.adventofcode.common.Direction.EAST; -import static com.sbaars.adventofcode.common.Direction.turnDegrees; -import static java.lang.Math.abs; -import static java.util.stream.Collectors.toList; - import com.sbaars.adventofcode.common.Direction; import com.sbaars.adventofcode.year20.Day2020; + import java.awt.*; import java.util.List; +import static com.sbaars.adventofcode.common.Direction.EAST; +import static com.sbaars.adventofcode.common.Direction.turnDegrees; +import static java.lang.Math.abs; +import static java.util.stream.Collectors.toList; + public class Day12 extends Day2020 { public Day12() { super(12); @@ -26,16 +27,9 @@ public Object part1() { Point location = new Point(0, 0); for (Flight f : input) { switch (f.dir) { - case 'L': - case 'R': - face = face.turnDegrees(f.distance, f.dir == 'R'); - break; - case 'F': - location = face.move(location, f.distance); - break; - default: - location = Direction.getByDir(f.dir).move(location, f.distance); - break; + case 'L', 'R' -> face = face.turnDegrees(f.distance, f.dir == 'R'); + case 'F' -> location = face.move(location, f.distance); + default -> location = Direction.getByDir(f.dir).move(location, f.distance); } } return abs(location.x) + abs(location.y); @@ -52,16 +46,9 @@ public Object part2() { Point location = new Point(0, 0); for (Flight f : input) { switch (f.dir) { - case 'L': - case 'R': - waypoint = turnDegrees(waypoint, f.distance, f.dir == 'R'); - break; - case 'F': - location = new Point(location.x + (waypoint.x * f.distance), location.y + (waypoint.y * f.distance)); - break; - default: - waypoint = Direction.getByDir(f.dir).move(waypoint, f.distance); - break; + case 'L', 'R' -> waypoint = turnDegrees(waypoint, f.distance, f.dir == 'R'); + case 'F' -> location = new Point(location.x + (waypoint.x * f.distance), location.y + (waypoint.y * f.distance)); + default -> waypoint = Direction.getByDir(f.dir).move(waypoint, f.distance); } } return abs(location.x) + abs(location.y); diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day17.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day17.java index 33d0dbab..88440d65 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day17.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day17.java @@ -1,10 +1,11 @@ package com.sbaars.adventofcode.year20.days; +import com.sbaars.adventofcode.common.HasRecursion; import com.sbaars.adventofcode.year20.Day2020; import java.util.HashSet; import java.util.Set; -public class Day17 extends Day2020 { +public class Day17 extends Day2020 implements HasRecursion { public Day17() { super(17); } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day18.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day18.java index 6ee3c933..a6ec71b5 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day18.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day18.java @@ -1,11 +1,12 @@ package com.sbaars.adventofcode.year20.days; -import static java.util.Arrays.stream; - +import com.sbaars.adventofcode.common.HasRecursion; import com.sbaars.adventofcode.year20.Day2020; import org.apache.commons.lang3.tuple.Pair; -public class Day18 extends Day2020 { +import static java.util.Arrays.stream; + +public class Day18 extends Day2020 implements HasRecursion { public Day18() { super(18); } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day20.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day20.java index 40f91f5d..3ccff922 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day20.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day20.java @@ -1,26 +1,19 @@ package com.sbaars.adventofcode.year20.days; -import static com.sbaars.adventofcode.common.Direction.EAST; -import static com.sbaars.adventofcode.common.Direction.NORTH; -import static com.sbaars.adventofcode.common.Direction.SOUTH; -import static com.sbaars.adventofcode.common.Direction.WEST; -import static java.lang.Long.parseLong; -import static java.util.Arrays.stream; - import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; import com.google.common.collect.Streams; import com.sbaars.adventofcode.common.Direction; import com.sbaars.adventofcode.year20.Day2020; +import org.apache.commons.lang3.ArrayUtils; + import java.awt.*; -import java.util.ArrayList; -import java.util.Collection; -import java.util.EnumMap; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import org.apache.commons.lang3.ArrayUtils; +import java.util.*; + +import static com.sbaars.adventofcode.common.Direction.*; +import static java.lang.Long.parseLong; +import static java.util.Arrays.stream; public class Day20 extends Day2020 { public Day20() { @@ -39,7 +32,7 @@ public Object part1() { Map> map2 = map.asMap(); List answer = new ArrayList<>(); for (Grid g : input) { - List possibleSides = Streams.concat(g.findSides(false).values().stream(), g.findSides(true).values().stream()).collect(Collectors.toList()); + List possibleSides = Streams.concat(g.findSides(false).values().stream(), g.findSides(true).values().stream()).toList(); if (possibleSides.stream().filter(e -> map2.get(e).size() > 1).count() == 4L) { answer.add(g.id); } @@ -117,7 +110,7 @@ public long countWithoutSides() { } } - public static record Metadata(long id, Direction dir, boolean flipped) { + public record Metadata(long id, Direction dir, boolean flipped) { public boolean validMetadata(List l) { Map map = new EnumMap(Direction.class); for (Metadata m : l) { diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day21.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day21.java index 63845960..1f46f5f1 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day21.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day21.java @@ -1,17 +1,15 @@ package com.sbaars.adventofcode.year20.days; -import static java.util.Arrays.asList; - import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; import com.sbaars.adventofcode.year20.Day2020; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; + +import java.util.*; import java.util.stream.Collectors; +import static java.util.Arrays.asList; +import static java.util.Map.Entry.comparingByKey; + public class Day21 extends Day2020 { public Day21() { super(21); @@ -29,16 +27,7 @@ private static String[] getSplit(String s) { public Object part1() { Rule[] input = Arrays.stream(day().split("\n")).map(Rule::new).toArray(Rule[]::new); Multimap allergens = getAllergens(input); - - long total = 0; - for (Rule r : input) { - for (String ingredient : r.ingredients) { - if (!allergens.containsValue(ingredient)) { - total++; - } - } - } - return total; + return Arrays.stream(input).flatMap(r -> Arrays.stream(r.ingredients)).filter(i -> !allergens.containsValue(i)).count(); } private Multimap getAllergens(Rule[] input) { @@ -65,7 +54,7 @@ private Multimap getAllergens(Rule[] input) { public Object part2() { Rule[] input = Arrays.stream(day().split("\n")).map(Rule::new).toArray(Rule[]::new); Multimap allergens = getAllergens(input); - return allergens.asMap().entrySet().stream().sorted(Comparator.comparing(Map.Entry::getKey)).map(e -> e.getValue().stream().findAny().get()).collect(Collectors.joining(",")); + return allergens.asMap().entrySet().stream().sorted(comparingByKey()).map(e -> e.getValue().stream().findAny().get()).collect(Collectors.joining(",")); } public static record Rule(String[] ingredients, String[] allergens) { diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day24.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day24.java index c52780e6..eba4e133 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day24.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day24.java @@ -1,18 +1,16 @@ package com.sbaars.adventofcode.year20.days; -import static java.util.Arrays.stream; -import static java.util.stream.Collectors.toList; - +import com.sbaars.adventofcode.common.HasRecursion; import com.sbaars.adventofcode.common.HexDirection; import com.sbaars.adventofcode.year20.Day2020; + import java.awt.*; -import java.util.ArrayList; -import java.util.HashSet; import java.util.List; -import java.util.Optional; -import java.util.Set; +import java.util.*; + +import static java.util.Arrays.stream; -public class Day24 extends Day2020 { +public class Day24 extends Day2020 implements HasRecursion { Set visited = new HashSet<>(); public Day24() { @@ -25,7 +23,7 @@ public static void main(String[] args) { @Override public Object part1() { - var input = stream(dayStrings()).map(this::read).collect(toList()); + var input = stream(dayStrings()).map(this::read).toList(); for (List dirs : input) { Point pos = new Point(0, 0); for (HexDirection dir : dirs) { diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day8.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day8.java index 02e3abea..bfa05f16 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day8.java @@ -19,7 +19,7 @@ public static void main(String[] args) { public Object part1() { Gamepad gamepad = new Gamepad(dayStream()); Set visited = new HashSet<>(); - while (visited.add(gamepad.executeInstruction())) ; + while (visited.add(gamepad.executeInstruction())); return gamepad.getAccumulator(); } diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day1.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day1.java index 74c8e7e3..96a48cbc 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day1.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day1.java @@ -2,6 +2,8 @@ import com.sbaars.adventofcode.year21.Day2021; +import java.util.stream.IntStream; + public class Day1 extends Day2021 { public Day1() { super(1); @@ -14,24 +16,12 @@ public static void main(String[] args) { @Override public Object part1() { long[] input = dayNumbers(); - int res = 0; - for(int i = 1; i input[i-1] < input[i]).count(); } @Override public Object part2() { long[] input = dayNumbers(); - int res = 0; - for(int i = 3; i input[i-3] + input[i-2] + input[i-1] < input[i] + input[i-2] + input[i-1]).count(); } } diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day11.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day11.java index a5a55581..b9f6db79 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day11.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day11.java @@ -1,12 +1,13 @@ package com.sbaars.adventofcode.year21.days; import com.sbaars.adventofcode.common.Direction; +import com.sbaars.adventofcode.common.HasRecursion; import com.sbaars.adventofcode.common.grid.NumGrid; import com.sbaars.adventofcode.year21.Day2021; import java.awt.*; import java.util.Arrays; -public class Day11 extends Day2021 { +public class Day11 extends Day2021 implements HasRecursion { public Day11() { super(11); } diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day12.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day12.java index 9947589c..50545c92 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day12.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day12.java @@ -1,17 +1,19 @@ package com.sbaars.adventofcode.year21.days; -import static com.google.common.collect.ImmutableListMultimap.toImmutableListMultimap; - import com.google.common.collect.ImmutableListMultimap; +import com.sbaars.adventofcode.common.HasRecursion; import com.sbaars.adventofcode.year19.util.CountMap; import com.sbaars.adventofcode.year21.Day2021; + import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Stream; -public class Day12 extends Day2021 { +import static com.google.common.collect.ImmutableListMultimap.toImmutableListMultimap; + +public class Day12 extends Day2021 implements HasRecursion { public static final String START = "start"; diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day16.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day16.java index 58091b7d..55908643 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day16.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day16.java @@ -1,11 +1,12 @@ package com.sbaars.adventofcode.year21.days; +import com.sbaars.adventofcode.common.HasRecursion; import com.sbaars.adventofcode.year21.Day2021; import java.math.BigInteger; import java.util.ArrayList; import java.util.List; -public class Day16 extends Day2021 { +public class Day16 extends Day2021 implements HasRecursion { public Day16() { super(16); diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day21.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day21.java index 3aff9b1e..23c42dc3 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day21.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day21.java @@ -1,13 +1,15 @@ package com.sbaars.adventofcode.year21.days; import com.google.common.base.Objects; +import com.sbaars.adventofcode.common.HasRecursion; import com.sbaars.adventofcode.year21.Day2021; +import org.apache.commons.math3.util.Pair; + import java.util.Arrays; import java.util.HashMap; import java.util.Map; -import org.apache.commons.math3.util.Pair; -public class Day21 extends Day2021 { +public class Day21 extends Day2021 implements HasRecursion { public Day21() { super(21); } @@ -53,7 +55,7 @@ public Object part2() { return Math.max(universes.getFirst(), universes.getSecond()); } - private Pair universes (Map> m, State s) { + private Pair universes(Map> m, State s) { Pair wins = new Pair<>(0L, 0L); if(m.containsKey(s)) { return m.get(s); diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day24.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day24.java index 91042e72..2d14c7f6 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day24.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day24.java @@ -1,14 +1,16 @@ package com.sbaars.adventofcode.year21.days; -import static java.lang.Long.parseLong; - +import com.sbaars.adventofcode.common.HasRecursion; import com.sbaars.adventofcode.year21.Day2021; + import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; -public class Day24 extends Day2021 { +import static java.lang.Long.parseLong; + +public class Day24 extends Day2021 implements HasRecursion { public Day24() { super(24); diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day3.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day3.java index efdd7ac6..f34f9f64 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day3.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day3.java @@ -1,12 +1,14 @@ package com.sbaars.adventofcode.year21.days; -import static java.lang.Integer.parseInt; - +import com.sbaars.adventofcode.common.HasRecursion; import com.sbaars.adventofcode.year21.Day2021; + import java.util.ArrayList; import java.util.List; -public class Day3 extends Day2021 { +import static java.lang.Integer.parseInt; + +public class Day3 extends Day2021 implements HasRecursion { public Day3() { super(3); } @@ -18,19 +20,19 @@ public static void main(String[] args) { @Override public Object part1() { var in = dayStrings(); - String most = ""; - String least = ""; + StringBuilder most = new StringBuilder(); + StringBuilder least = new StringBuilder(); for(int i = 0; i Date: Wed, 7 Dec 2022 23:46:36 +0100 Subject: [PATCH 358/433] Prepare day 8 --- .../java/com/sbaars/adventofcode/common/Tree.java | 7 +++++-- .../com/sbaars/adventofcode/year22/days/Day7.java | 14 +++++--------- .../com/sbaars/adventofcode/year22/days/Day8.java | 13 +++++++++++-- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/common/Tree.java b/src/main/java/com/sbaars/adventofcode/common/Tree.java index cad3d4d1..d7e429ef 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Tree.java +++ b/src/main/java/com/sbaars/adventofcode/common/Tree.java @@ -4,15 +4,18 @@ import java.util.List; - public class Tree { - public enum TreeReversal {CONTINUE, DOWN, UP} + public enum TreeTraversal {CONTINUE, DOWN, UP} private final Node rootNode; public Tree(T rootNodeData) { this.rootNode = new Node(rootNodeData); } +// public Tree(Function> func, Stream things) { +// +// } + private class Node { final T data; final List children; diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day7.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day7.java index 94300d4b..321d9222 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day7.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day7.java @@ -1,11 +1,13 @@ package com.sbaars.adventofcode.year22.days; -import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.common.HasRecursion; import com.sbaars.adventofcode.year22.Day2022; import java.io.IOException; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; @@ -17,13 +19,7 @@ public Day7() { } public static void main(String[] args) throws IOException { - Day d = new Day7(); -// d.downloadIfNotDownloaded(); -// d.downloadExample(); - d.printParts(); -// System.in.read(); -// d.submitPart1(); -// d.submitPart2(); + new Day7().printParts(); } public record Node(Map children, long size){} diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day8.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day8.java index e5304204..f4770d41 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day8.java @@ -1,15 +1,24 @@ package com.sbaars.adventofcode.year22.days; +import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year22.Day2022; +import java.io.IOException; + public class Day8 extends Day2022 { public Day8() { super(8); } - public static void main(String[] args) { - new Day8().printParts(); + public static void main(String[] args) throws IOException { + Day d = new Day1(); + d.downloadIfNotDownloaded(); +// d.downloadExample(); + d.printParts(); + System.in.read(); + d.submitPart1(); +// d.submitPart2(); } @Override From 07a57efba8ecd2c68d742cddfea83926f04b1d1b Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Thu, 8 Dec 2022 06:24:48 +0100 Subject: [PATCH 359/433] 2022 Day 8 --- .../sbaars/adventofcode/year22/days/Day8.java | 52 ++++++++-- src/main/resources/2022-examples/day8-1.txt | 5 + src/main/resources/2022/day8.txt | 99 +++++++++++++++++++ 3 files changed, 150 insertions(+), 6 deletions(-) create mode 100644 src/main/resources/2022-examples/day8-1.txt create mode 100644 src/main/resources/2022/day8.txt diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day8.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day8.java index f4770d41..e948cc6a 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day8.java @@ -1,8 +1,11 @@ package com.sbaars.adventofcode.year22.days; import com.sbaars.adventofcode.common.Day; +import com.sbaars.adventofcode.common.Direction; +import com.sbaars.adventofcode.common.grid.NumGrid; import com.sbaars.adventofcode.year22.Day2022; +import java.awt.*; import java.io.IOException; public class Day8 extends Day2022 { @@ -12,22 +15,59 @@ public Day8() { } public static void main(String[] args) throws IOException { - Day d = new Day1(); - d.downloadIfNotDownloaded(); + Day d = new Day8(); +// d.downloadIfNotDownloaded(); // d.downloadExample(); d.printParts(); - System.in.read(); - d.submitPart1(); +// System.in.read(); +// d.submitPart1(); // d.submitPart2(); } @Override public Object part1() { - return ""; + NumGrid grid = new NumGrid(day(), "\n", ""); + return grid.stream().filter(p -> findEdge(grid, p)).count(); } + private boolean findEdge(NumGrid grid, Point p) { + Direction[] dirs = Direction.fourDirections(); + long num = grid.get(p); + for(Direction d : dirs) { + Point newLoc = p; + while (true) { + newLoc = d.move(newLoc); + long atLoc = grid.get(newLoc); + if(atLoc >= num) break; + else if(atLoc == -1) return true; + } + } + return false; + } + + private long scenicScore(NumGrid grid, Point p) { + Direction[] dirs = Direction.fourDirections(); + long num = grid.get(p); + long score = 1; + for(Direction d : dirs) { + Point newLoc = p; + long s = 0; + while (true) { + newLoc = d.move(newLoc); + long atLoc = grid.get(newLoc); + if(atLoc >= num) {s++; break;} + else if(atLoc == -1) break; + s++; + } + score*=s; + } + return score; + } + + @Override public Object part2() { - return ""; + NumGrid grid = new NumGrid(day(), "\n", ""); + return grid.stream().mapToLong(p -> scenicScore(grid, p)).max().getAsLong(); } } diff --git a/src/main/resources/2022-examples/day8-1.txt b/src/main/resources/2022-examples/day8-1.txt new file mode 100644 index 00000000..16d6fbd6 --- /dev/null +++ b/src/main/resources/2022-examples/day8-1.txt @@ -0,0 +1,5 @@ +30373 +25512 +65332 +33549 +35390 diff --git a/src/main/resources/2022/day8.txt b/src/main/resources/2022/day8.txt new file mode 100644 index 00000000..f4b72dda --- /dev/null +++ b/src/main/resources/2022/day8.txt @@ -0,0 +1,99 @@ +301201331333030024002151134115545441525510053410321024643223304253251423014345311431413433341211111 +210313031411030140245452501003514242514125366210551353634546632015232323540022212401412031113310333 +201223331222432221305443412445304401201165033624245311620346242360420521343514132520204104244200322 +210003034413133345421153101053132524226234460546142402452466345321440520524311212410303224012242000 +002232200024321241105051144044530503201446133504652500410463241436361361002024122340512441243222203 +102023303032432341105353554225663326563653250523350302104003635340436625240235531151145343032212033 +011432423042054254520503506222252050256315142254016650105015643542660231044302233035322122100032212 +034421243321311550201305666136554451350322354144633556333022003664006612152610511132354312443134400 +302214114340201552153246320504242003513464536535521715125521314654606653312124014223422135000032024 +022203301311105514431426025115566414166144753435463146324664616502342356626446124204455213422314241 +133202031100242023236362026113243573426315617627527543647213541517440126016042624554125530550304004 +412414223443004100621020255403316757326244275247134627215636656313472021156626214003511121524211201 +100020113553530111635403433310123371416566464531664371236763762654672716453255155611041431321301000 +040442015403322353635250250156757514552341246114755653427321572644373333764015356451022003122252214 +131335400000330152046666616363523347474566725475326875713565751313316433363251655012415235210153134 +212205354412516232346215667365363413636143322285687428338237666271455444277511521334662020135104441 +400134535100103465544240377332663352346366464426356585587388572154627365567576126334445412551245044 +313125111102350042411627156361342341273445272266422466584446423554731131743433165124231111435223052 +414211350002631116406722423146474385423846752263457355267246283862347153516722261451645234034250125 +142350115212334322146515331713325337468443588225285768685574226644533724475335124115505531225141432 +221420101060222256363211452511352288853828648746647256668823328327287747564123275261621500245133411 +453113024555202631573132336658242736347325874252333535256677587837657678625214457745232452150220123 +555034246226545644223655121622358344733858586769673974337826765554468355524344661464661052120504131 +101440210460332606657775163743688753344448398636494466664973768385765272752651367426304666101123130 +532232304344031236635141354227547676887398783998657559945898897482268637355733664642700640525354230 +254425530336536647234251648333783825963356648666958849583777336977537428866623134526176025236412301 +052420045556125743544677352453853565968669799673389736356646485675748435258353372737571166544644253 +144212521432144457427473545763356688633446594997933764479494846866798222377556235341461400160564305 +414546463341545336547365484645276357553584336774496855639397587938638557263543347554553131065014354 +213110564326373147676363536832594994448537796457645847754798668996863976763583886251625241215423451 +402441605154657151126587562648764444548399868584444984666447398399475652866688642677426256050111044 +030505222044142675156675655568358889949479978645448697784665774359755689243645735162215642560304321 +002364341155613641588426677659986477446964688986679878477959859546863555528383865312255533510006644 +315603002442216142126278638843367593346876468657757444768587498693659647788784456647117426311553113 +534026231247517653336254847934574378679647999777747989757856888763437583487626885465121722135401110 +152663134317453637627862365337774534996567697946779555455989744649937645994653657567156245462533302 +415120400426463528567443378965654344948544677795568678979865564545598768643876476547177613642314014 +212134106151643463482274255887744459499685657799867587677998674896776889393348337484463153571460162 +123265543627354585248835586978887467585449979975988897979955857994455783796697728544256417663200436 +253156122444754335226888665898754494695989955588988885866899669459797535776733282376417141555433640 +105125666421254638626347936375599547788669998799766755958796875664688687698846364536875113743306636 +543154323554211424234263689757375946445859555669888666959896575566688549986398632678217421361116016 +534446627674264324833537896437597864966965789556679958788689859997595593943745863828822163463613245 +456422412772232364425647578537895646785958867897868976696886585987468565967685553265682333333642602 +155305566576114247342276876599654498977865685987867897688785559595497686574858683675725765634063131 +350133405277354723553294549397478955987876557987698878889985757654986568886863447837277147741536410 +013062547146413742675348465764876557565879576696666889866579778749764578444847765768252647361443506 +312465621677151875655585995745694878655956799697796697686885558978975449756474748887586542411256255 +423204362353178745852254637935464664778869968879677697777878575777556878634856584473864213312622015 +534661567344614365768387877864878845767598869677978779767787858784584759476648665773358427645311651 +430011475352152575755679953749774454789788589769698678798856669687965675695986644657485514217351666 +542102111432167877663467859536777594767895986867898886766676976869846495867599543374583332731266033 +625000474732136887874855736749589476996659798967789898789776587976889996948384763734447643736220025 +315666062115612845335864885945654758789765698688877769667668867576798855583978955268844425122514014 +152600463716132562642488647595685976468985656996977998778955585795596495844759888838286175352560414 +006166514645376457676454676698858546456775687876679968965697579748769964686887987774361312361623112 +630201542341341448626638885984646765658869666987886976795798598788495887683399383777375346636211550 +036646423755734847267336476354564466955596575589776859595968578788654499546534758266652277357366530 +453243636357156364866489789657955759776966959655868798956766987954989947943863354645777345476202531 +530105612477445332537878834449565659485976667656597697775688857778754844458355277846316112626121162 +055455363734131537735589765579697845958456556556686566965687745949576967556763233558753142411453220 +106052304147675524263254984449336844955757978879668668576768676787755787574533445667862426312335351 +133545504422337378456858864594449878578885567885775668878958786485657683335482267532317234560541422 +200255566345515714753376495455776859698895897588685996587586745857468367437854554745116413532363200 +350510465672221255867873257334876685756745545667796896497688464848948768947422782828661471761064122 +525006435255273146277854349566333878494888868995668459955986944485699959837552728523754132365504644 +455465632474322677526353348496893746878784677485547847847759558643378358396575444475242721722332551 +341264465466426473255828826967974346556896576764466849697759555548879644597626468762475471232114332 +143015600661254143155723453874645479598897489897887869959899767545558694586565824554175726556330040 +133114601616545361237744836629659733553959758846995589848895753645437876746537567247223752042644353 +434245136445331567724385257642784846854365449776854954774496353883589792252488545733673623365531411 +242355400240614257475587442835547333788435758749676988545464355973893552465258322436517445530103424 +150522445522362651727687768785836854563533374767758439957544655684349342343244731321332645111541021 +552400436500115714126552863645543555378537389683366874478896898884353658447572421457611323114255212 +304202302265264467247666485428778363698453577569497785947535758344375242826567265416457044433163541 +233353455013125235351275368356247267348486886475363374634485474876565735683724532261524142510630102 +440535161152151631635373575637235623878689436669334497565478939626735535482665761716504623034023120 +530315220006363246522576534738725655632837547375957696853688457354338383534653311344113001640515414 +204313020634510554536253474458753547425233336944493739858844757374686252224513224773652513353305442 +303341052510105201513731753724282223364752725537642288866686622588863837445543126664241453441235310 +020424153032624323671363111463422353477742627478683844868633432636588536274451572264610340614104555 +234413051424523314161146731763467724436346548732688655832363463687352214147256367321403115315443500 +012242303516512442500774532142266284382765822428622346384737664242643615627661273552155526054233342 +414111403514124460666037555342627216676675426728525487642273658483463277637667635142640425425132342 +030230422403061322643446763675767367778368767234652457668385774272636771211474352411225452213412310 +032113014010425161346051473351752565267374786865733735338367253243133431751566100563025504520403342 +412304104125143243301236345151712624614211575411475821376435722564217622616521260005512052222004343 +220120030303233310444012046257231472762352112415164732622531735165124331120326541545011444410002400 +014433054545451316643032015010316146277161216552272145522146562717437536450604320052302441034404241 +343434423453055414653253445655564632771244123251647272745743671776331230215004615545255055050133340 +201000210435340452132116022411356245227731333555165752717373435156310453501204235431002250524221113 +132100434242305201202434465065260455543457427521464157317741755225245256645305422324552252031144120 +202441110432420500412256514006155406431013256445476676323751251451145064255351541053031130431201234 +020212022220112430245130010061216066220264013366625475240550163452521001005224125240541123033121143 +132244304123021525001211154544140012602120125510011436101445405650606625263223310430540142302200433 +103142142201203130045124150512613540504163320002045004044613203062515015344450101154534004044231012 +221234114210331020511522535110011636160005413424224560604634052506210501451443521502544433404042033 +001233231400214434040102054514026055053336624361305231213331535242260044242320014551114014133012203 +013221201313013142535111451534205341402225520043535003305340330410530234344250234251433044340323003 From a0c2a02be196ac4fd619559a3e8ccaf24eadb8fd Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Thu, 8 Dec 2022 06:29:05 +0100 Subject: [PATCH 360/433] Day 8 Restructuring --- .../sbaars/adventofcode/year22/days/Day8.java | 22 ++++++------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day8.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day8.java index e948cc6a..cfa17aa6 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day8.java @@ -1,6 +1,5 @@ package com.sbaars.adventofcode.year22.days; -import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.common.Direction; import com.sbaars.adventofcode.common.grid.NumGrid; import com.sbaars.adventofcode.year22.Day2022; @@ -15,13 +14,7 @@ public Day8() { } public static void main(String[] args) throws IOException { - Day d = new Day8(); -// d.downloadIfNotDownloaded(); -// d.downloadExample(); - d.printParts(); -// System.in.read(); -// d.submitPart1(); -// d.submitPart2(); + new Day8().printParts(); } @Override @@ -45,6 +38,12 @@ private boolean findEdge(NumGrid grid, Point p) { return false; } + @Override + public Object part2() { + NumGrid grid = new NumGrid(day(), "\n", ""); + return grid.stream().mapToLong(p -> scenicScore(grid, p)).max().getAsLong(); + } + private long scenicScore(NumGrid grid, Point p) { Direction[] dirs = Direction.fourDirections(); long num = grid.get(p); @@ -63,11 +62,4 @@ private long scenicScore(NumGrid grid, Point p) { } return score; } - - - @Override - public Object part2() { - NumGrid grid = new NumGrid(day(), "\n", ""); - return grid.stream().mapToLong(p -> scenicScore(grid, p)).max().getAsLong(); - } } From f70cbb7db8ab39727ed023cf0e8e8d5baa1be3b3 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Fri, 9 Dec 2022 06:51:38 +0100 Subject: [PATCH 361/433] 2022 Day 9 --- .../com/sbaars/adventofcode/common/Day.java | 2 +- .../sbaars/adventofcode/common/Direction.java | 4 + .../sbaars/adventofcode/year22/days/Day9.java | 97 +- src/main/resources/2022-examples/day9-1.txt | 12 + src/main/resources/2022-examples/day9-10.txt | 21 + src/main/resources/2022-examples/day9-2.txt | 9 + src/main/resources/2022-examples/day9-3.txt | 11 + src/main/resources/2022-examples/day9-4.txt | 8 + src/main/resources/2022-examples/day9-5.txt | 167 ++ src/main/resources/2022-examples/day9-6.txt | 5 + src/main/resources/2022-examples/day9-7.txt | 167 ++ src/main/resources/2022-examples/day9-8.txt | 8 + src/main/resources/2022-examples/day9-9.txt | 216 ++ src/main/resources/2022/day9.txt | 2000 +++++++++++++++++ 14 files changed, 2723 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/2022-examples/day9-1.txt create mode 100644 src/main/resources/2022-examples/day9-10.txt create mode 100644 src/main/resources/2022-examples/day9-2.txt create mode 100644 src/main/resources/2022-examples/day9-3.txt create mode 100644 src/main/resources/2022-examples/day9-4.txt create mode 100644 src/main/resources/2022-examples/day9-5.txt create mode 100644 src/main/resources/2022-examples/day9-6.txt create mode 100644 src/main/resources/2022-examples/day9-7.txt create mode 100644 src/main/resources/2022-examples/day9-8.txt create mode 100644 src/main/resources/2022-examples/day9-9.txt create mode 100644 src/main/resources/2022/day9.txt diff --git a/src/main/java/com/sbaars/adventofcode/common/Day.java b/src/main/java/com/sbaars/adventofcode/common/Day.java index 88497884..626708bf 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Day.java +++ b/src/main/java/com/sbaars/adventofcode/common/Day.java @@ -52,7 +52,7 @@ public void printParts() { solutionPart1 = part1(); solutionPart2 = part2(); if(solutionPart1 instanceof Optional) solutionPart1 = ((Optional)solutionPart1).get(); - if(solutionPart2 instanceof Optional) solutionPart1 = ((Optional)solutionPart1).get(); + if(solutionPart2 instanceof Optional) solutionPart2 = ((Optional)solutionPart2).get(); System.out.println("Part 1: " + part1()); System.out.println("Part 2: " + part2()); } diff --git a/src/main/java/com/sbaars/adventofcode/common/Direction.java b/src/main/java/com/sbaars/adventofcode/common/Direction.java index a65ec10d..72eb9e93 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Direction.java +++ b/src/main/java/com/sbaars/adventofcode/common/Direction.java @@ -116,6 +116,10 @@ public Point move(Point currentLocation) { return move(currentLocation, 1); } + public Point moveFix(Point currentLocation) { + return moveFix(currentLocation, 1); + } + public Direction opposite() { return switch (this) { case NORTH -> SOUTH; diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day9.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day9.java index 35cdd142..433e45d2 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day9.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day9.java @@ -1,23 +1,114 @@ package com.sbaars.adventofcode.year22.days; +import com.sbaars.adventofcode.common.Day; +import com.sbaars.adventofcode.common.Direction; import com.sbaars.adventofcode.year22.Day2022; +import java.awt.*; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.stream.IntStream; + +import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; + public class Day9 extends Day2022 { public Day9() { super(9); } public static void main(String[] args) { - new Day9().printParts(); + Day d = new Day9(); + d.downloadIfNotDownloaded(); + d.downloadExample(); + d.printParts(); +// System.in.read(); +// d.submitPart1(); +// d.submitPart2(); } + public record Move(String dir, long n){} + @Override public Object part1() { - return ""; + List moves = dayStream().map(s -> readString(s, "%s %n", Move.class)).toList(); + Point p1 = new Point(); + Point p2 = new Point(); + HashSet vis = new HashSet<>(); + vis.add(p2); + for(Move m : moves) { + Direction dir = Direction.getByDirCode(m.dir.charAt(0)); + for(int i = 0; i d.move(p22).equals(p12))) { + if(p1.x > p2.x && p1.y == p2.y) { + p2 = Direction.EAST.move(p2); + } else if(p1.x < p2.x && p1.y == p2.y){ + p2 = Direction.WEST.move(p2); + } else if(p1.x == p2.x && p1.y > p2.y) { + p2 = Direction.SOUTH.move(p2); + } else if(p1.x == p2.x && p1.y < p2.y){ + p2 = Direction.NORTH.move(p2); + } else if(p1.x > p2.x && p1.y > p2.y) { + p2 = Direction.SOUTHEAST.move(p2); + } else if(p1.x < p2.x && p1.y < p2.y){ + p2 = Direction.NORTHWEST.move(p2); + } else if(p1.x < p2.x && p1.y > p2.y) { + p2 = Direction.SOUTHWEST.move(p2); + } else if(p1.x > p2.x && p1.y < p2.y){ + p2 = Direction.NORTHEAST.move(p2); + } else throw new IllegalStateException(); + } + vis.add(p2); + } + } + return vis.size(); } @Override public Object part2() { - return ""; + List moves = dayStream().map(s -> readString(s, "%s %n", Move.class)).toList(); + Point p1 = new Point(); + List p2 = new java.util.ArrayList<>(IntStream.range(0, 9).mapToObj(i -> new Point()).toList()); + HashSet vis = new HashSet<>(); + vis.add(p1); + + for(Move m : moves) { + Direction dir = Direction.getByDirCode(m.dir.charAt(0)); + for(int i = 0; i d.move(p23).equals(p12))) { + if (p12.x > p22.x && p12.y == p22.y) { + p22 = Direction.EAST.move(p22); + } else if (p12.x < p22.x && p12.y == p22.y) { + p22 = Direction.WEST.move(p22); + } else if (p12.x == p22.x && p12.y > p22.y) { + p22 = Direction.SOUTH.move(p22); + } else if (p12.x == p22.x && p12.y < p22.y) { + p22 = Direction.NORTH.move(p22); + } else if (p12.x > p22.x && p12.y > p22.y) { + p22 = Direction.SOUTHEAST.move(p22); + } else if (p12.x < p22.x && p12.y < p22.y) { + p22 = Direction.NORTHWEST.move(p22); + } else if (p12.x < p22.x && p12.y > p22.y) { + p22 = Direction.SOUTHWEST.move(p22); + } else if (p12.x > p22.x && p12.y < p22.y) { + p22 = Direction.NORTHEAST.move(p22); + } else throw new IllegalStateException(); + } + p2.set(j, p22); + if(j == p2.size()-1) vis.add(p22); +// g.set(new Point(Math.abs(p22.x), Math.abs(p22.y)), j+1); + } +// System.out.println(g); + } + } + return vis.size(); } } diff --git a/src/main/resources/2022-examples/day9-1.txt b/src/main/resources/2022-examples/day9-1.txt new file mode 100644 index 00000000..67a6cf00 --- /dev/null +++ b/src/main/resources/2022-examples/day9-1.txt @@ -0,0 +1,12 @@ +.... +.TH. +.... + +.... +.H.. +..T. +.... + +... +.H. (H covers T) +... diff --git a/src/main/resources/2022-examples/day9-10.txt b/src/main/resources/2022-examples/day9-10.txt new file mode 100644 index 00000000..63f97c75 --- /dev/null +++ b/src/main/resources/2022-examples/day9-10.txt @@ -0,0 +1,21 @@ +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +#......................... +#.............###......... +#............#...#........ +.#..........#.....#....... +..#..........#.....#...... +...#........#.......#..... +....#......s.........#.... +.....#..............#..... +......#............#...... +.......#..........#....... +........#........#........ +.........########......... diff --git a/src/main/resources/2022-examples/day9-2.txt b/src/main/resources/2022-examples/day9-2.txt new file mode 100644 index 00000000..e99ce0b5 --- /dev/null +++ b/src/main/resources/2022-examples/day9-2.txt @@ -0,0 +1,9 @@ +..... ..... ..... +.TH.. -> .T.H. -> ..TH. +..... ..... ..... + +... ... ... +.T. .T. ... +.H. -> ... -> .T. +... .H. .H. +... ... ... diff --git a/src/main/resources/2022-examples/day9-3.txt b/src/main/resources/2022-examples/day9-3.txt new file mode 100644 index 00000000..8f58e320 --- /dev/null +++ b/src/main/resources/2022-examples/day9-3.txt @@ -0,0 +1,11 @@ +..... ..... ..... +..... ..H.. ..H.. +..H.. -> ..... -> ..T.. +.T... .T... ..... +..... ..... ..... + +..... ..... ..... +..... ..... ..... +..H.. -> ...H. -> ..TH. +.T... .T... ..... +..... ..... ..... diff --git a/src/main/resources/2022-examples/day9-4.txt b/src/main/resources/2022-examples/day9-4.txt new file mode 100644 index 00000000..9874df2d --- /dev/null +++ b/src/main/resources/2022-examples/day9-4.txt @@ -0,0 +1,8 @@ +R 4 +U 4 +L 3 +D 1 +R 4 +D 1 +L 5 +R 2 diff --git a/src/main/resources/2022-examples/day9-5.txt b/src/main/resources/2022-examples/day9-5.txt new file mode 100644 index 00000000..e0ed935a --- /dev/null +++ b/src/main/resources/2022-examples/day9-5.txt @@ -0,0 +1,167 @@ +== Initial State == + +...... +...... +...... +...... +H..... (H covers T, s) + +== R 4 == + +...... +...... +...... +...... +TH.... (T covers s) + +...... +...... +...... +...... +sTH... + +...... +...... +...... +...... +s.TH.. + +...... +...... +...... +...... +s..TH. + +== U 4 == + +...... +...... +...... +....H. +s..T.. + +...... +...... +....H. +....T. +s..... + +...... +....H. +....T. +...... +s..... + +....H. +....T. +...... +...... +s..... + +== L 3 == + +...H.. +....T. +...... +...... +s..... + +..HT.. +...... +...... +...... +s..... + +.HT... +...... +...... +...... +s..... + +== D 1 == + +..T... +.H.... +...... +...... +s..... + +== R 4 == + +..T... +..H... +...... +...... +s..... + +..T... +...H.. +...... +...... +s..... + +...... +...TH. +...... +...... +s..... + +...... +....TH +...... +...... +s..... + +== D 1 == + +...... +....T. +.....H +...... +s..... + +== L 5 == + +...... +....T. +....H. +...... +s..... + +...... +....T. +...H.. +...... +s..... + +...... +...... +..HT.. +...... +s..... + +...... +...... +.HT... +...... +s..... + +...... +...... +HT.... +...... +s..... + +== R 2 == + +...... +...... +.H.... (H covers T) +...... +s..... + +...... +...... +.TH... +...... +s..... diff --git a/src/main/resources/2022-examples/day9-6.txt b/src/main/resources/2022-examples/day9-6.txt new file mode 100644 index 00000000..e9234b4b --- /dev/null +++ b/src/main/resources/2022-examples/day9-6.txt @@ -0,0 +1,5 @@ +..##.. +...##. +.####. +....#. +s###.. diff --git a/src/main/resources/2022-examples/day9-7.txt b/src/main/resources/2022-examples/day9-7.txt new file mode 100644 index 00000000..aa6aae7e --- /dev/null +++ b/src/main/resources/2022-examples/day9-7.txt @@ -0,0 +1,167 @@ +== Initial State == + +...... +...... +...... +...... +H..... (H covers 1, 2, 3, 4, 5, 6, 7, 8, 9, s) + +== R 4 == + +...... +...... +...... +...... +1H.... (1 covers 2, 3, 4, 5, 6, 7, 8, 9, s) + +...... +...... +...... +...... +21H... (2 covers 3, 4, 5, 6, 7, 8, 9, s) + +...... +...... +...... +...... +321H.. (3 covers 4, 5, 6, 7, 8, 9, s) + +...... +...... +...... +...... +4321H. (4 covers 5, 6, 7, 8, 9, s) + +== U 4 == + +...... +...... +...... +....H. +4321.. (4 covers 5, 6, 7, 8, 9, s) + +...... +...... +....H. +.4321. +5..... (5 covers 6, 7, 8, 9, s) + +...... +....H. +....1. +.432.. +5..... (5 covers 6, 7, 8, 9, s) + +....H. +....1. +..432. +.5.... +6..... (6 covers 7, 8, 9, s) + +== L 3 == + +...H.. +....1. +..432. +.5.... +6..... (6 covers 7, 8, 9, s) + +..H1.. +...2.. +..43.. +.5.... +6..... (6 covers 7, 8, 9, s) + +.H1... +...2.. +..43.. +.5.... +6..... (6 covers 7, 8, 9, s) + +== D 1 == + +..1... +.H.2.. +..43.. +.5.... +6..... (6 covers 7, 8, 9, s) + +== R 4 == + +..1... +..H2.. +..43.. +.5.... +6..... (6 covers 7, 8, 9, s) + +..1... +...H.. (H covers 2) +..43.. +.5.... +6..... (6 covers 7, 8, 9, s) + +...... +...1H. (1 covers 2) +..43.. +.5.... +6..... (6 covers 7, 8, 9, s) + +...... +...21H +..43.. +.5.... +6..... (6 covers 7, 8, 9, s) + +== D 1 == + +...... +...21. +..43.H +.5.... +6..... (6 covers 7, 8, 9, s) + +== L 5 == + +...... +...21. +..43H. +.5.... +6..... (6 covers 7, 8, 9, s) + +...... +...21. +..4H.. (H covers 3) +.5.... +6..... (6 covers 7, 8, 9, s) + +...... +...2.. +..H1.. (H covers 4; 1 covers 3) +.5.... +6..... (6 covers 7, 8, 9, s) + +...... +...2.. +.H13.. (1 covers 4) +.5.... +6..... (6 covers 7, 8, 9, s) + +...... +...... +H123.. (2 covers 4) +.5.... +6..... (6 covers 7, 8, 9, s) + +== R 2 == + +...... +...... +.H23.. (H covers 1; 2 covers 4) +.5.... +6..... (6 covers 7, 8, 9, s) + +...... +...... +.1H3.. (H covers 2, 4) +.5.... +6..... (6 covers 7, 8, 9, s) diff --git a/src/main/resources/2022-examples/day9-8.txt b/src/main/resources/2022-examples/day9-8.txt new file mode 100644 index 00000000..60bd43b4 --- /dev/null +++ b/src/main/resources/2022-examples/day9-8.txt @@ -0,0 +1,8 @@ +R 5 +U 8 +L 8 +D 3 +R 17 +D 10 +L 25 +U 20 diff --git a/src/main/resources/2022-examples/day9-9.txt b/src/main/resources/2022-examples/day9-9.txt new file mode 100644 index 00000000..1390c680 --- /dev/null +++ b/src/main/resources/2022-examples/day9-9.txt @@ -0,0 +1,216 @@ +== Initial State == + +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +...........H.............. (H covers 1, 2, 3, 4, 5, 6, 7, 8, 9, s) +.......................... +.......................... +.......................... +.......................... +.......................... + +== R 5 == + +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +...........54321H......... (5 covers 6, 7, 8, 9, s) +.......................... +.......................... +.......................... +.......................... +.......................... + +== U 8 == + +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +................H......... +................1......... +................2......... +................3......... +...............54......... +..............6........... +.............7............ +............8............. +...........9.............. (9 covers s) +.......................... +.......................... +.......................... +.......................... +.......................... + +== L 8 == + +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +........H1234............. +............5............. +............6............. +............7............. +............8............. +............9............. +.......................... +.......................... +...........s.............. +.......................... +.......................... +.......................... +.......................... +.......................... + +== D 3 == + +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.........2345............. +........1...6............. +........H...7............. +............8............. +............9............. +.......................... +.......................... +...........s.............. +.......................... +.......................... +.......................... +.......................... +.......................... + +== R 17 == + +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +................987654321H +.......................... +.......................... +.......................... +.......................... +...........s.............. +.......................... +.......................... +.......................... +.......................... +.......................... + +== D 10 == + +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +...........s.........98765 +.........................4 +.........................3 +.........................2 +.........................1 +.........................H + +== L 25 == + +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +...........s.............. +.......................... +.......................... +.......................... +.......................... +H123456789................ + +== U 20 == + +H......................... +1......................... +2......................... +3......................... +4......................... +5......................... +6......................... +7......................... +8......................... +9......................... +.......................... +.......................... +.......................... +.......................... +.......................... +...........s.............. +.......................... +.......................... +.......................... +.......................... +.......................... + diff --git a/src/main/resources/2022/day9.txt b/src/main/resources/2022/day9.txt new file mode 100644 index 00000000..28ee1161 --- /dev/null +++ b/src/main/resources/2022/day9.txt @@ -0,0 +1,2000 @@ +R 2 +U 2 +L 2 +U 1 +L 1 +U 1 +R 1 +L 2 +U 2 +R 1 +D 2 +U 2 +R 1 +D 1 +L 1 +R 1 +L 2 +U 2 +L 2 +D 1 +R 1 +U 2 +L 2 +U 2 +R 1 +D 1 +L 2 +U 2 +R 2 +L 2 +U 2 +R 2 +L 1 +U 2 +R 2 +D 1 +L 1 +R 2 +U 1 +R 2 +D 2 +L 1 +R 1 +U 1 +R 2 +L 1 +U 1 +R 1 +L 2 +D 2 +R 2 +D 1 +L 2 +R 2 +L 1 +R 2 +D 1 +R 2 +D 2 +L 1 +R 1 +U 2 +L 2 +R 2 +D 1 +R 2 +U 2 +L 1 +D 2 +R 2 +L 2 +D 2 +U 1 +R 2 +U 2 +R 2 +D 2 +R 1 +U 2 +D 2 +R 1 +L 1 +R 1 +U 2 +D 2 +R 1 +U 1 +R 1 +L 1 +U 2 +L 2 +D 2 +U 2 +D 2 +R 2 +D 2 +L 1 +U 2 +L 1 +R 1 +D 2 +L 1 +U 1 +D 2 +U 2 +D 2 +R 2 +U 1 +R 1 +U 2 +D 1 +R 2 +D 2 +L 3 +U 1 +D 2 +U 3 +R 3 +L 1 +D 2 +R 1 +D 3 +L 3 +R 1 +D 3 +L 3 +D 1 +R 3 +D 1 +L 1 +D 2 +R 3 +D 1 +U 2 +R 2 +L 1 +D 1 +R 3 +U 2 +L 3 +U 2 +D 2 +R 2 +D 3 +U 1 +D 3 +L 3 +R 2 +L 2 +D 3 +L 2 +U 3 +R 2 +D 1 +R 2 +U 3 +R 3 +U 3 +L 1 +R 3 +D 2 +R 1 +L 3 +R 1 +D 3 +L 3 +D 1 +U 2 +R 3 +U 3 +D 1 +L 2 +R 3 +L 1 +D 2 +L 3 +D 1 +L 3 +D 1 +U 2 +D 3 +R 2 +U 1 +L 3 +R 3 +L 2 +R 1 +L 2 +D 2 +R 3 +U 3 +R 3 +D 2 +U 3 +D 2 +R 3 +D 3 +R 2 +U 1 +L 3 +U 2 +R 2 +L 2 +U 1 +L 3 +D 2 +U 2 +R 1 +L 2 +D 2 +U 3 +R 2 +D 2 +L 3 +U 1 +L 1 +U 2 +R 2 +U 1 +D 2 +U 2 +R 3 +L 1 +U 1 +D 3 +U 4 +L 3 +D 2 +L 3 +U 4 +D 2 +R 4 +L 4 +U 2 +D 3 +U 2 +D 3 +L 3 +U 2 +D 3 +L 1 +U 1 +R 1 +L 4 +R 3 +D 3 +L 2 +U 3 +R 2 +L 1 +U 4 +D 3 +U 1 +L 2 +D 4 +L 1 +R 3 +D 4 +R 1 +L 1 +U 3 +L 3 +D 3 +R 3 +U 1 +L 4 +U 3 +R 3 +L 3 +U 2 +R 3 +L 3 +R 1 +D 3 +R 3 +L 4 +R 3 +D 4 +L 3 +U 2 +R 4 +L 1 +U 1 +R 4 +D 3 +U 1 +R 1 +D 1 +U 3 +R 2 +L 1 +D 1 +L 3 +D 4 +R 4 +U 4 +D 1 +R 3 +D 3 +R 3 +L 4 +R 4 +L 2 +R 2 +D 3 +R 4 +D 2 +U 4 +L 3 +D 1 +R 2 +U 2 +R 3 +D 1 +R 3 +D 1 +L 1 +U 4 +L 2 +U 4 +L 4 +U 3 +R 4 +L 3 +R 3 +L 4 +U 4 +R 4 +D 2 +R 2 +D 3 +U 4 +D 1 +U 1 +D 5 +U 3 +D 5 +U 5 +D 3 +L 3 +U 3 +D 3 +R 1 +D 3 +R 4 +U 4 +D 1 +R 5 +D 5 +R 2 +U 5 +L 2 +U 2 +D 2 +U 4 +R 1 +D 1 +L 2 +R 2 +D 1 +L 5 +R 5 +D 4 +R 5 +L 1 +D 2 +L 3 +U 2 +D 3 +L 1 +R 5 +U 3 +R 1 +D 3 +R 1 +U 1 +R 3 +U 2 +D 5 +L 5 +R 1 +U 3 +L 4 +D 2 +R 1 +D 3 +U 4 +R 3 +L 4 +U 2 +D 3 +U 1 +R 5 +D 3 +L 2 +U 3 +L 5 +U 3 +L 3 +D 5 +L 5 +U 3 +R 2 +D 5 +U 4 +L 5 +U 1 +D 5 +R 3 +D 1 +L 5 +R 2 +D 2 +U 5 +R 1 +D 2 +L 3 +D 2 +L 5 +D 2 +U 5 +L 2 +R 3 +L 3 +D 3 +U 2 +R 5 +L 1 +U 5 +R 5 +L 2 +D 5 +R 3 +L 2 +U 2 +D 3 +R 4 +L 1 +R 3 +D 5 +R 3 +D 4 +R 2 +D 5 +R 3 +L 3 +R 2 +U 2 +L 1 +R 6 +U 6 +L 6 +U 2 +R 6 +D 4 +U 1 +L 1 +R 1 +D 1 +L 6 +D 6 +U 4 +L 6 +D 3 +R 1 +U 1 +D 3 +R 3 +D 5 +U 1 +L 2 +R 6 +U 5 +D 6 +L 6 +R 2 +U 1 +D 1 +L 4 +D 5 +L 6 +U 1 +L 6 +R 5 +U 5 +D 3 +L 5 +R 2 +U 3 +D 1 +L 2 +U 2 +D 1 +L 5 +D 1 +U 5 +R 4 +L 2 +R 5 +D 3 +U 3 +R 2 +U 3 +D 6 +L 5 +R 1 +U 5 +L 1 +R 6 +D 6 +R 6 +L 1 +D 2 +R 5 +L 4 +D 3 +L 5 +R 4 +L 6 +U 1 +L 2 +U 3 +R 4 +D 3 +R 3 +L 1 +D 4 +L 2 +R 5 +D 2 +R 2 +D 5 +U 2 +L 4 +R 4 +U 4 +R 1 +D 3 +L 6 +U 5 +L 5 +D 6 +U 3 +D 6 +R 6 +D 3 +U 6 +L 6 +D 3 +L 6 +R 3 +D 2 +L 4 +D 5 +L 5 +D 2 +L 6 +R 1 +D 1 +L 4 +U 6 +R 1 +L 5 +D 7 +U 2 +R 6 +D 7 +L 2 +R 3 +U 1 +L 3 +R 2 +U 7 +D 7 +U 7 +D 4 +R 2 +L 7 +R 7 +L 5 +R 4 +U 5 +L 5 +U 6 +R 2 +D 3 +L 2 +U 6 +D 5 +R 2 +D 2 +R 5 +U 7 +R 3 +D 1 +L 5 +R 1 +U 3 +D 6 +U 6 +L 7 +U 4 +L 6 +D 1 +L 7 +U 4 +D 7 +L 1 +D 6 +L 2 +R 5 +L 7 +U 3 +D 2 +R 7 +L 2 +U 6 +L 3 +U 6 +L 5 +R 2 +L 7 +D 3 +L 7 +R 1 +L 1 +R 5 +D 6 +L 2 +D 5 +L 4 +D 3 +U 5 +D 1 +R 4 +U 1 +L 2 +R 3 +U 7 +D 6 +U 2 +D 4 +U 5 +D 5 +U 7 +R 2 +D 1 +U 2 +L 2 +U 3 +D 1 +R 4 +D 1 +R 3 +U 1 +R 7 +D 4 +R 3 +D 2 +L 2 +U 4 +L 2 +U 6 +L 4 +D 6 +U 3 +L 1 +U 4 +R 7 +D 6 +L 2 +D 7 +R 4 +U 5 +R 4 +D 5 +R 6 +D 4 +R 4 +U 2 +R 3 +L 7 +R 8 +D 8 +R 5 +U 2 +D 6 +L 2 +R 4 +U 3 +L 1 +R 2 +D 5 +L 1 +D 5 +L 5 +U 1 +R 8 +D 1 +U 1 +L 1 +R 8 +L 3 +R 6 +L 1 +U 3 +R 6 +L 5 +U 2 +L 8 +R 4 +U 4 +R 6 +U 5 +R 1 +L 2 +R 5 +D 1 +U 4 +L 3 +U 3 +R 1 +U 3 +R 8 +L 1 +U 2 +L 7 +D 6 +L 6 +R 4 +D 2 +R 2 +L 8 +D 4 +R 4 +U 4 +L 6 +D 3 +R 7 +D 8 +U 4 +R 4 +U 2 +L 8 +D 5 +L 4 +U 7 +D 8 +U 6 +R 6 +L 5 +D 5 +L 2 +D 1 +R 1 +D 4 +R 5 +L 7 +D 8 +U 2 +D 3 +L 5 +R 4 +L 7 +R 3 +L 1 +D 8 +R 5 +L 8 +R 8 +D 1 +R 4 +D 1 +L 2 +D 5 +L 7 +U 1 +L 4 +R 5 +L 3 +R 9 +D 9 +L 4 +R 6 +L 6 +R 1 +L 3 +R 5 +D 8 +L 1 +U 2 +R 8 +U 7 +D 6 +L 8 +D 1 +L 9 +D 5 +L 1 +D 6 +L 8 +R 2 +L 6 +R 4 +U 1 +R 6 +L 5 +R 5 +L 6 +R 8 +D 5 +L 4 +R 2 +L 7 +R 2 +U 9 +L 6 +R 2 +U 7 +D 4 +U 2 +L 2 +U 8 +R 8 +U 3 +R 6 +D 6 +L 2 +D 4 +L 4 +R 2 +L 1 +U 8 +D 2 +R 2 +L 1 +R 7 +L 8 +D 8 +L 4 +U 4 +R 5 +U 1 +D 8 +L 8 +R 9 +D 6 +L 1 +D 5 +L 9 +U 6 +D 6 +U 3 +D 5 +R 5 +U 9 +L 2 +R 5 +U 9 +L 1 +D 4 +U 4 +L 5 +D 6 +R 3 +L 6 +U 3 +R 4 +U 5 +L 5 +D 8 +L 6 +U 4 +D 1 +U 7 +D 2 +L 3 +R 7 +U 1 +R 4 +U 4 +R 9 +U 3 +D 2 +L 6 +R 9 +U 3 +L 8 +R 10 +U 3 +R 8 +D 8 +L 1 +U 4 +R 5 +U 8 +D 10 +U 10 +L 7 +D 5 +L 2 +R 7 +L 1 +U 10 +R 1 +D 1 +L 5 +R 7 +U 6 +L 3 +R 7 +U 4 +R 3 +U 3 +R 4 +U 8 +L 8 +D 6 +L 5 +U 10 +L 9 +R 3 +U 10 +D 9 +U 5 +D 10 +U 7 +D 6 +U 9 +L 8 +U 3 +D 6 +R 9 +U 9 +D 4 +R 8 +U 7 +R 6 +U 5 +R 5 +U 3 +D 4 +R 9 +L 7 +D 7 +U 1 +L 3 +R 4 +D 8 +L 4 +D 6 +U 1 +R 7 +D 4 +L 9 +D 2 +R 4 +U 10 +D 5 +U 6 +D 6 +R 5 +U 6 +D 6 +L 7 +U 4 +D 1 +L 6 +R 8 +L 7 +U 8 +L 2 +R 6 +L 9 +D 2 +U 9 +D 5 +U 10 +D 1 +R 9 +L 6 +D 7 +U 1 +D 4 +L 3 +R 7 +U 1 +R 6 +D 4 +R 1 +D 4 +L 8 +R 1 +U 10 +D 1 +U 5 +R 6 +U 5 +D 2 +U 10 +R 8 +L 7 +U 6 +L 4 +R 6 +L 7 +U 3 +R 4 +D 1 +L 4 +R 7 +D 2 +L 4 +U 3 +D 6 +U 10 +D 5 +R 8 +U 5 +L 9 +D 4 +L 4 +D 8 +U 9 +R 2 +U 4 +R 4 +U 9 +D 1 +R 7 +U 5 +L 2 +U 10 +R 4 +D 1 +L 3 +R 11 +D 7 +U 7 +D 7 +L 11 +U 2 +D 1 +U 1 +R 1 +U 3 +L 6 +U 10 +L 4 +U 5 +L 10 +D 1 +U 8 +R 7 +L 4 +U 7 +L 9 +U 6 +L 11 +U 3 +R 8 +L 6 +D 9 +L 9 +D 1 +R 7 +L 11 +D 9 +R 7 +U 2 +D 11 +L 4 +D 4 +R 11 +D 7 +U 2 +D 7 +R 2 +D 1 +L 6 +D 11 +R 3 +U 7 +L 10 +U 7 +D 2 +R 2 +U 1 +L 9 +R 11 +L 3 +R 7 +L 2 +D 11 +R 1 +D 4 +R 3 +L 10 +U 5 +D 3 +R 10 +D 8 +U 1 +D 2 +R 10 +L 8 +R 1 +D 8 +U 6 +R 8 +D 8 +L 2 +D 7 +U 4 +L 5 +R 4 +D 4 +U 7 +D 11 +U 11 +R 4 +L 6 +U 3 +L 10 +U 1 +L 11 +U 3 +D 6 +L 11 +R 4 +L 3 +D 12 +L 7 +R 9 +L 9 +U 10 +L 1 +D 6 +L 10 +U 3 +R 6 +D 5 +L 6 +R 8 +D 4 +R 6 +L 6 +D 9 +L 1 +D 11 +U 6 +L 3 +R 10 +U 12 +R 11 +D 10 +U 5 +R 6 +D 12 +U 12 +R 8 +U 5 +D 1 +R 12 +D 1 +R 7 +U 8 +D 5 +U 7 +D 3 +R 7 +D 8 +U 11 +R 2 +U 4 +L 2 +R 1 +L 3 +U 9 +L 5 +D 11 +R 10 +L 3 +U 3 +D 3 +R 1 +L 8 +D 6 +R 7 +U 11 +L 6 +D 1 +R 12 +D 8 +U 7 +R 2 +U 5 +R 4 +U 10 +L 8 +D 5 +U 10 +D 3 +L 6 +R 4 +L 9 +D 6 +R 7 +D 4 +U 10 +D 1 +L 6 +R 1 +L 7 +U 5 +L 9 +U 12 +L 7 +U 6 +D 6 +U 9 +L 7 +U 4 +D 5 +L 1 +U 5 +D 1 +L 10 +D 2 +R 3 +D 13 +U 11 +L 1 +U 1 +D 1 +R 12 +U 13 +L 5 +D 11 +L 9 +U 11 +L 2 +R 6 +D 7 +L 2 +U 5 +R 2 +U 10 +L 9 +D 7 +R 12 +D 10 +L 12 +D 8 +L 8 +R 12 +D 11 +U 12 +L 1 +U 2 +D 6 +R 3 +D 2 +U 9 +L 10 +R 4 +U 2 +D 10 +U 7 +R 6 +U 9 +R 4 +L 3 +U 13 +R 9 +U 6 +D 8 +L 5 +R 11 +L 6 +R 12 +D 5 +U 7 +R 11 +D 1 +L 9 +R 12 +U 2 +R 5 +U 1 +R 9 +U 6 +D 4 +R 2 +U 2 +D 5 +L 9 +R 6 +U 4 +L 6 +R 9 +L 4 +U 3 +L 9 +R 6 +L 5 +D 6 +L 3 +R 6 +L 3 +D 9 +U 5 +D 1 +R 5 +L 3 +U 9 +R 7 +L 8 +R 6 +L 7 +U 4 +D 13 +U 2 +L 1 +U 11 +R 8 +L 13 +D 1 +U 4 +L 13 +D 1 +L 8 +D 13 +L 2 +R 2 +D 1 +L 14 +U 7 +R 11 +L 1 +R 4 +L 5 +R 11 +U 7 +D 8 +L 3 +U 1 +L 12 +U 13 +D 9 +R 1 +L 11 +U 12 +D 5 +U 10 +D 10 +R 9 +L 1 +D 5 +R 7 +L 1 +D 13 +R 10 +U 2 +R 3 +L 14 +D 7 +R 12 +U 13 +L 2 +U 13 +L 3 +U 5 +L 11 +R 8 +D 11 +R 6 +L 11 +R 5 +L 3 +U 1 +L 5 +R 13 +L 12 +D 10 +R 8 +D 6 +L 1 +R 10 +U 5 +R 3 +D 11 +L 8 +R 4 +D 2 +L 1 +R 7 +U 3 +L 14 +R 3 +L 4 +R 13 +L 10 +U 3 +D 1 +L 11 +U 1 +D 6 +R 10 +U 1 +R 2 +L 7 +U 3 +L 5 +U 4 +D 7 +R 8 +U 12 +R 6 +L 2 +D 5 +L 11 +R 4 +L 4 +R 6 +L 3 +R 10 +U 4 +D 9 +U 1 +D 4 +L 12 +D 13 +L 1 +D 6 +R 8 +L 1 +D 9 +L 8 +U 3 +D 3 +U 2 +R 11 +U 10 +L 5 +D 11 +U 12 +D 3 +R 15 +L 1 +R 5 +D 9 +U 15 +D 2 +L 9 +U 9 +D 15 +R 4 +L 9 +R 8 +L 12 +D 5 +R 12 +U 9 +L 9 +U 7 +L 12 +R 11 +U 9 +L 15 +D 9 +L 4 +R 4 +U 13 +D 7 +R 7 +D 8 +U 5 +D 5 +L 15 +D 2 +R 8 +D 10 +R 5 +U 13 +R 1 +L 8 +D 12 +R 2 +L 4 +D 9 +L 9 +D 7 +R 5 +U 15 +R 9 +L 2 +R 8 +U 11 +D 15 +U 13 +D 5 +U 5 +R 11 +U 7 +R 11 +D 12 +U 6 +D 6 +L 8 +D 8 +R 14 +U 13 +R 11 +D 1 +R 4 +U 14 +R 11 +L 8 +D 2 +U 13 +R 15 +L 10 +D 2 +L 3 +R 9 +U 2 +R 8 +U 15 +R 3 +D 4 +L 7 +D 7 +R 1 +D 13 +R 1 +L 13 +U 9 +L 13 +U 10 +L 15 +D 5 +R 11 +D 3 +U 3 +R 4 +L 7 +R 1 +U 13 +R 9 +U 7 +R 10 +D 5 +U 7 +R 6 +L 14 +U 2 +R 8 +D 2 +U 16 +D 12 +R 11 +D 4 +L 8 +U 8 +L 13 +D 5 +R 4 +U 8 +D 15 +R 8 +D 13 +R 16 +U 4 +D 3 +U 5 +D 8 +R 16 +L 13 +U 3 +D 6 +L 9 +R 10 +D 6 +R 16 +D 15 +R 11 +L 8 +D 8 +U 4 +R 16 +D 1 +U 11 +L 15 +R 7 +D 2 +R 1 +D 4 +L 1 +U 15 +D 16 +R 3 +U 10 +D 9 +U 6 +D 15 +R 11 +L 6 +R 2 +U 14 +R 4 +L 15 +R 15 +D 16 +U 9 +D 2 +L 8 +D 15 +R 5 +U 13 +L 15 +D 1 +R 4 +U 14 +D 15 +L 15 +U 13 +R 16 +L 7 +R 4 +D 13 +L 15 +D 3 +L 7 +D 4 +R 12 +D 10 +U 8 +D 6 +L 13 +R 15 +U 12 +L 4 +R 16 +D 1 +R 14 +L 9 +D 13 +U 2 +D 9 +U 16 +L 15 +R 12 +L 14 +R 6 +D 1 +R 2 +L 15 +U 7 +L 16 +U 15 +D 11 +R 11 +L 3 +R 11 +L 15 +U 17 +L 14 +R 4 +U 15 +D 6 +L 2 +R 7 +L 16 +U 4 +L 14 +U 9 +L 7 +D 16 +R 4 +D 2 +R 15 +L 6 +R 6 +D 1 +U 5 +D 14 +U 4 +D 11 +R 5 +U 16 +L 3 +D 7 +R 10 +L 3 +D 8 +L 10 +U 1 +D 16 +L 6 +R 6 +L 14 +R 6 +U 11 +L 17 +D 7 +R 2 +L 12 +D 15 +U 16 +R 2 +U 3 +R 16 +U 12 +L 3 +U 5 +D 1 +R 12 +U 17 +D 11 +L 16 +U 13 +L 5 +D 1 +R 2 +L 10 +U 12 +D 7 +U 6 +R 4 +U 5 +L 3 +R 16 +D 1 +U 14 +R 15 +D 6 +U 14 +R 4 +L 6 +D 11 +R 16 +L 15 +U 7 +L 10 +R 5 +L 15 +R 12 +L 17 +U 5 +D 14 +L 6 +R 2 +U 5 +R 10 +L 8 +D 2 +U 17 +L 13 +D 17 +L 5 +R 11 +L 3 +U 11 +R 1 +L 3 +D 1 +L 7 +D 14 +R 13 +U 9 +D 7 +L 15 +U 5 +D 4 +R 7 +L 10 +D 6 +R 18 +U 5 +R 18 +U 6 +D 17 +U 8 +R 16 +D 12 +R 12 +D 9 +R 9 +U 4 +R 16 +L 1 +D 12 +L 12 +R 11 +D 15 +U 13 +L 8 +R 4 +L 1 +R 1 +D 11 +R 15 +D 3 +L 17 +D 17 +R 11 +U 13 +D 11 +R 4 +D 17 +U 8 +L 1 +D 2 +L 16 +D 6 +L 15 +D 17 +L 8 +U 5 +D 15 +L 15 +U 11 +D 9 +L 18 +U 18 +R 14 +L 4 +U 17 +R 11 +D 18 +U 2 +R 9 +D 15 +R 5 +L 13 +R 2 +L 18 +D 5 +U 14 +L 17 +R 3 +U 4 +R 15 +U 1 +D 15 +U 12 +D 17 +U 11 +L 3 +R 10 +U 13 +R 12 +L 10 +R 1 +D 4 +U 2 +D 14 +R 14 +U 5 +R 16 +U 17 +R 16 +U 18 +R 6 +U 5 +R 18 +U 12 +D 7 +R 9 +L 1 +U 15 +D 10 +L 4 +U 9 +L 3 +U 1 +R 12 +D 14 +U 13 +L 10 +R 8 +U 5 +D 7 +U 1 +L 13 +U 14 +D 18 +L 13 +D 12 +R 2 +L 6 +D 17 +L 18 +R 6 +U 4 +L 7 +R 8 +U 5 +D 1 +L 3 +U 10 +R 5 +D 7 +U 16 +R 12 +U 8 +L 18 +R 1 +L 11 +D 14 +L 19 +R 15 +U 14 +L 8 +R 14 +U 13 +D 18 +U 14 +L 14 +U 11 +L 10 +D 11 +L 11 +R 15 +L 12 +R 10 +L 9 +R 9 +L 9 +D 3 +R 9 +L 6 +R 8 +D 7 +L 18 +D 12 +R 3 +U 7 +R 18 +U 9 +L 14 +D 12 +L 10 +U 15 +L 11 +R 17 +D 7 +R 5 +L 3 +U 13 +D 7 +U 13 +R 16 +D 2 +L 7 +R 15 +L 14 +U 19 +D 3 +L 19 +D 11 +R 8 +D 6 +U 12 +R 5 +U 6 +L 7 +R 4 +L 3 +D 6 +L 17 +U 16 +D 11 +U 12 +D 4 +R 6 +D 10 +L 3 +D 15 +R 5 +L 6 +D 11 +U 17 +L 14 +D 15 +L 1 +D 6 +R 16 +D 11 +U 2 +D 2 +U 7 +D 10 +L 11 +D 19 +L 12 +D 3 +L 18 +U 3 From 1c3e0142dbbf28aa7e49c6eb9eef1db1312abf95 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Fri, 9 Dec 2022 06:53:01 +0100 Subject: [PATCH 362/433] Extract code --- .../sbaars/adventofcode/year22/days/Day9.java | 40 +++---------------- 1 file changed, 6 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day9.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day9.java index 433e45d2..cad8a722 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day9.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day9.java @@ -31,46 +31,18 @@ public record Move(String dir, long n){} @Override public Object part1() { - List moves = dayStream().map(s -> readString(s, "%s %n", Move.class)).toList(); - Point p1 = new Point(); - Point p2 = new Point(); - HashSet vis = new HashSet<>(); - vis.add(p2); - for(Move m : moves) { - Direction dir = Direction.getByDirCode(m.dir.charAt(0)); - for(int i = 0; i d.move(p22).equals(p12))) { - if(p1.x > p2.x && p1.y == p2.y) { - p2 = Direction.EAST.move(p2); - } else if(p1.x < p2.x && p1.y == p2.y){ - p2 = Direction.WEST.move(p2); - } else if(p1.x == p2.x && p1.y > p2.y) { - p2 = Direction.SOUTH.move(p2); - } else if(p1.x == p2.x && p1.y < p2.y){ - p2 = Direction.NORTH.move(p2); - } else if(p1.x > p2.x && p1.y > p2.y) { - p2 = Direction.SOUTHEAST.move(p2); - } else if(p1.x < p2.x && p1.y < p2.y){ - p2 = Direction.NORTHWEST.move(p2); - } else if(p1.x < p2.x && p1.y > p2.y) { - p2 = Direction.SOUTHWEST.move(p2); - } else if(p1.x > p2.x && p1.y < p2.y){ - p2 = Direction.NORTHEAST.move(p2); - } else throw new IllegalStateException(); - } - vis.add(p2); - } - } - return vis.size(); + return simulateRope(1); } @Override public Object part2() { + return simulateRope(9); + } + + private int simulateRope(int size) { List moves = dayStream().map(s -> readString(s, "%s %n", Move.class)).toList(); Point p1 = new Point(); - List p2 = new java.util.ArrayList<>(IntStream.range(0, 9).mapToObj(i -> new Point()).toList()); + List p2 = new java.util.ArrayList<>(IntStream.range(0, size).mapToObj(i -> new Point()).toList()); HashSet vis = new HashSet<>(); vis.add(p1); From 0d8959b346b4db7d80b55800e26eae8aa4c1b960 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Fri, 9 Dec 2022 06:58:08 +0100 Subject: [PATCH 363/433] 2022 Day 9 Refactor --- .../sbaars/adventofcode/year22/days/Day9.java | 67 +++++++++---------- 1 file changed, 33 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day9.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day9.java index cad8a722..1130db11 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day9.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day9.java @@ -41,46 +41,45 @@ public Object part2() { private int simulateRope(int size) { List moves = dayStream().map(s -> readString(s, "%s %n", Move.class)).toList(); - Point p1 = new Point(); - List p2 = new java.util.ArrayList<>(IntStream.range(0, size).mapToObj(i -> new Point()).toList()); - HashSet vis = new HashSet<>(); - vis.add(p1); + Point head = new Point(); + List tail = new java.util.ArrayList<>(IntStream.range(0, size).mapToObj(i -> new Point()).toList()); + HashSet visited = new HashSet<>(); + visited.add(head); for(Move m : moves) { Direction dir = Direction.getByDirCode(m.dir.charAt(0)); for(int i = 0; i d.move(p23).equals(p12))) { - if (p12.x > p22.x && p12.y == p22.y) { - p22 = Direction.EAST.move(p22); - } else if (p12.x < p22.x && p12.y == p22.y) { - p22 = Direction.WEST.move(p22); - } else if (p12.x == p22.x && p12.y > p22.y) { - p22 = Direction.SOUTH.move(p22); - } else if (p12.x == p22.x && p12.y < p22.y) { - p22 = Direction.NORTH.move(p22); - } else if (p12.x > p22.x && p12.y > p22.y) { - p22 = Direction.SOUTHEAST.move(p22); - } else if (p12.x < p22.x && p12.y < p22.y) { - p22 = Direction.NORTHWEST.move(p22); - } else if (p12.x < p22.x && p12.y > p22.y) { - p22 = Direction.SOUTHWEST.move(p22); - } else if (p12.x > p22.x && p12.y < p22.y) { - p22 = Direction.NORTHEAST.move(p22); - } else throw new IllegalStateException(); - } - p2.set(j, p22); - if(j == p2.size()-1) vis.add(p22); -// g.set(new Point(Math.abs(p22.x), Math.abs(p22.y)), j+1); + head = dir.move(head); + for(int j = 0; j d.move(tail).equals(head))) { + if (head.x > tail.x && head.y == tail.y) { + return Direction.EAST.move(tail); + } else if (head.x < tail.x && head.y == tail.y) { + return Direction.WEST.move(tail); + } else if (head.x == tail.x && head.y > tail.y) { + return Direction.SOUTH.move(tail); + } else if (head.x == tail.x && head.y < tail.y) { + return Direction.NORTH.move(tail); + } else if (head.x > tail.x && head.y > tail.y) { + return Direction.SOUTHEAST.move(tail); + } else if (head.x < tail.x && head.y < tail.y) { + return Direction.NORTHWEST.move(tail); + } else if (head.x < tail.x && head.y > tail.y) { + return Direction.SOUTHWEST.move(tail); + } else if (head.x > tail.x && head.y < tail.y) { + return Direction.NORTHEAST.move(tail); + } else throw new IllegalStateException(); + } + return tail; } } From bbdf832ad8be2bff8815abae8a70cfab9b4881da Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Fri, 9 Dec 2022 07:03:39 +0100 Subject: [PATCH 364/433] Data map to char --- src/main/java/com/sbaars/adventofcode/year22/days/Day9.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day9.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day9.java index 1130db11..826540c5 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day9.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day9.java @@ -27,7 +27,7 @@ public static void main(String[] args) { // d.submitPart2(); } - public record Move(String dir, long n){} + public record Move(char dir, long n){} @Override public Object part1() { @@ -40,14 +40,14 @@ public Object part2() { } private int simulateRope(int size) { - List moves = dayStream().map(s -> readString(s, "%s %n", Move.class)).toList(); + List moves = dayStream().map(s -> readString(s, "%c %n", Move.class)).toList(); Point head = new Point(); List tail = new java.util.ArrayList<>(IntStream.range(0, size).mapToObj(i -> new Point()).toList()); HashSet visited = new HashSet<>(); visited.add(head); for(Move m : moves) { - Direction dir = Direction.getByDirCode(m.dir.charAt(0)); + Direction dir = Direction.getByDirCode(m.dir); for(int i = 0; i Date: Fri, 9 Dec 2022 07:04:12 +0100 Subject: [PATCH 365/433] Cleanup --- .../java/com/sbaars/adventofcode/year22/days/Day9.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day9.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day9.java index 826540c5..12f9a656 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day9.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day9.java @@ -1,6 +1,5 @@ package com.sbaars.adventofcode.year22.days; -import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.common.Direction; import com.sbaars.adventofcode.year22.Day2022; @@ -18,13 +17,7 @@ public Day9() { } public static void main(String[] args) { - Day d = new Day9(); - d.downloadIfNotDownloaded(); - d.downloadExample(); - d.printParts(); -// System.in.read(); -// d.submitPart1(); -// d.submitPart2(); + new Day9().printParts(); } public record Move(char dir, long n){} From 848bd15952bc7123492943a7ab948c55dbde9794 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Fri, 9 Dec 2022 21:01:32 +0100 Subject: [PATCH 366/433] Prepare Day 10 --- src/main/java/com/sbaars/adventofcode/common/Day.java | 6 ++++-- .../java/com/sbaars/adventofcode/year22/days/Day1.java | 2 +- .../java/com/sbaars/adventofcode/year22/days/Day10.java | 9 ++++++++- .../java/com/sbaars/adventofcode/year22/days/Day9.java | 3 ++- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/common/Day.java b/src/main/java/com/sbaars/adventofcode/common/Day.java index 626708bf..8633e029 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Day.java +++ b/src/main/java/com/sbaars/adventofcode/common/Day.java @@ -142,12 +142,14 @@ protected char[][] dayGrid(String delimiter) { } public void downloadIfNotDownloaded() { - if(!getResource(getDayPath()).exists()) { + if(example == 0 && !getResource(getDayPath()).exists()) { new FetchInput().retrieveInput(Integer.toString(day), Integer.toString(year)); } } public void downloadExample() { - new FetchInput().retrieveExamples(Integer.toString(day), Integer.toString(year)); + if(example > 0 && !getResource(getDayPath()).exists()) { + new FetchInput().retrieveExamples(Integer.toString(day), Integer.toString(year)); + } } } diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day1.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day1.java index e73de27e..04624059 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day1.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day1.java @@ -14,7 +14,7 @@ public Day1() { public static void main(String[] args) { Day d = new Day1(); d.downloadIfNotDownloaded(); -// d.downloadExample(); + d.downloadExample(); d.printParts(); // System.in.read(); // d.submitPart1(); diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java index b06f0579..e21a937c 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java @@ -1,5 +1,6 @@ package com.sbaars.adventofcode.year22.days; +import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year22.Day2022; public class Day10 extends Day2022 { @@ -8,7 +9,13 @@ public Day10() { } public static void main(String[] args) { - new Day10().printParts(); + Day d = new Day10(); + d.downloadIfNotDownloaded(); + d.downloadExample(); + d.printParts(); +// System.in.read(); +// d.submitPart1(); +// d.submitPart2(); } @Override diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day9.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day9.java index 12f9a656..c383059f 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day9.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day9.java @@ -4,6 +4,7 @@ import com.sbaars.adventofcode.year22.Day2022; import java.awt.*; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; @@ -35,7 +36,7 @@ public Object part2() { private int simulateRope(int size) { List moves = dayStream().map(s -> readString(s, "%c %n", Move.class)).toList(); Point head = new Point(); - List tail = new java.util.ArrayList<>(IntStream.range(0, size).mapToObj(i -> new Point()).toList()); + List tail = new ArrayList<>(IntStream.range(0, size).mapToObj(i -> new Point()).toList()); HashSet visited = new HashSet<>(); visited.add(head); From 90d255837291cacd7826afb637b8b1782d65b4c5 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Sat, 10 Dec 2022 06:30:11 +0100 Subject: [PATCH 367/433] Day 10 2022 --- .../adventofcode/year22/days/Day10.java | 53 ++++++- src/main/resources/2022-examples/day10-1.txt | 3 + src/main/resources/2022-examples/day10-2.txt | 146 ++++++++++++++++++ src/main/resources/2022/day10.txt | 146 ++++++++++++++++++ 4 files changed, 346 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/2022-examples/day10-1.txt create mode 100644 src/main/resources/2022-examples/day10-2.txt create mode 100644 src/main/resources/2022/day10.txt diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java index e21a937c..e93fd580 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java @@ -3,6 +3,9 @@ import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year22.Day2022; +import java.util.ArrayList; +import java.util.List; + public class Day10 extends Day2022 { public Day10() { super(10); @@ -20,11 +23,57 @@ public static void main(String[] args) { @Override public Object part1() { - return ""; + long cycle = 1; + long x = 1; + List output = new ArrayList<>(); + for(String op : dayStrings()) { + if(op.equals("noop")) { + cycle++; + } else if(op.startsWith("addx")) { + long add = Long.parseLong(op.substring(5)); + cycle++; + if((cycle+20) % 40 == 0) { + output.add(cycle*x); +// System.out.println(cycle+", "+x); + } + cycle++; + x+=add; + } + if((cycle+20) % 40 == 0) { + output.add(cycle*x); +// System.out.p rintln(cycle+", "+x); + } + if(cycle>220) break; + } +// System.out.println(cycle+", "+x+", "+ Arrays.toString(output.toArray())); + return output.stream().mapToLong(e -> e).sum(); } @Override public Object part2() { - return ""; + long cycle = 1; + long x = 1; +// List output = new ArrayList<>(); + String pixels = ""; + for(String op : dayStrings()) { + if((cycle-1) % 40 == 0) { + pixels+="\n"; + } + pixels += List.of(x-1, x, x+1).contains((cycle-1)%40) ? "#" : "."; + if(op.equals("noop")) { + cycle++; + } else if(op.startsWith("addx")) { + long add = Long.parseLong(op.substring(5)); + cycle++; + if((cycle-1) % 40 == 0) { + pixels+="\n"; + } + pixels += List.of(x-1, x, x+1).contains((cycle-1)%40) ? "#" : "."; + cycle++; + x+=add; + } + } +// System.out.println(cycle+", "+x+", "+ Arrays.toString(output.toArray())); + return pixels; } } diff --git a/src/main/resources/2022-examples/day10-1.txt b/src/main/resources/2022-examples/day10-1.txt new file mode 100644 index 00000000..f428b7b3 --- /dev/null +++ b/src/main/resources/2022-examples/day10-1.txt @@ -0,0 +1,3 @@ +noop +addx 3 +addx -5 diff --git a/src/main/resources/2022-examples/day10-2.txt b/src/main/resources/2022-examples/day10-2.txt new file mode 100644 index 00000000..37ee8ee1 --- /dev/null +++ b/src/main/resources/2022-examples/day10-2.txt @@ -0,0 +1,146 @@ +addx 15 +addx -11 +addx 6 +addx -3 +addx 5 +addx -1 +addx -8 +addx 13 +addx 4 +noop +addx -1 +addx 5 +addx -1 +addx 5 +addx -1 +addx 5 +addx -1 +addx 5 +addx -1 +addx -35 +addx 1 +addx 24 +addx -19 +addx 1 +addx 16 +addx -11 +noop +noop +addx 21 +addx -15 +noop +noop +addx -3 +addx 9 +addx 1 +addx -3 +addx 8 +addx 1 +addx 5 +noop +noop +noop +noop +noop +addx -36 +noop +addx 1 +addx 7 +noop +noop +noop +addx 2 +addx 6 +noop +noop +noop +noop +noop +addx 1 +noop +noop +addx 7 +addx 1 +noop +addx -13 +addx 13 +addx 7 +noop +addx 1 +addx -33 +noop +noop +noop +addx 2 +noop +noop +noop +addx 8 +noop +addx -1 +addx 2 +addx 1 +noop +addx 17 +addx -9 +addx 1 +addx 1 +addx -3 +addx 11 +noop +noop +addx 1 +noop +addx 1 +noop +noop +addx -13 +addx -19 +addx 1 +addx 3 +addx 26 +addx -30 +addx 12 +addx -1 +addx 3 +addx 1 +noop +noop +noop +addx -9 +addx 18 +addx 1 +addx 2 +noop +noop +addx 9 +noop +noop +noop +addx -1 +addx 2 +addx -37 +addx 1 +addx 3 +noop +addx 15 +addx -21 +addx 22 +addx -6 +addx 1 +noop +addx 2 +addx 1 +noop +addx -10 +noop +noop +addx 20 +addx 1 +addx 2 +addx 2 +addx -6 +addx -11 +noop +noop +noop diff --git a/src/main/resources/2022/day10.txt b/src/main/resources/2022/day10.txt new file mode 100644 index 00000000..b531dcaf --- /dev/null +++ b/src/main/resources/2022/day10.txt @@ -0,0 +1,146 @@ +noop +noop +addx 15 +addx -10 +noop +noop +addx 3 +noop +noop +addx 7 +addx 1 +addx 4 +addx -1 +addx 1 +addx 5 +addx 1 +noop +noop +addx 5 +addx -1 +noop +addx 3 +noop +addx 3 +addx -38 +noop +addx 3 +addx 2 +addx 5 +addx 2 +addx 26 +addx -21 +addx -2 +addx 5 +addx 2 +addx -14 +addx 15 +noop +addx 7 +noop +addx 2 +addx -22 +addx 23 +addx 2 +addx 5 +addx -40 +noop +noop +addx 3 +addx 2 +noop +addx 24 +addx -19 +noop +noop +noop +addx 5 +addx 5 +addx 2 +noop +noop +noop +noop +addx 7 +noop +addx 3 +noop +addx 3 +addx -2 +addx 2 +addx 5 +addx -38 +noop +noop +noop +addx 5 +addx 2 +addx -1 +addx 2 +addx 30 +addx -23 +noop +noop +noop +noop +addx 3 +addx 5 +addx -11 +addx 12 +noop +addx 6 +addx 1 +noop +addx 4 +addx 3 +noop +addx -40 +addx 4 +addx 28 +addx -27 +addx 5 +addx 2 +addx 5 +noop +noop +addx -2 +addx 2 +addx 5 +addx 3 +noop +addx 2 +addx -25 +addx 30 +noop +addx 3 +addx -2 +addx 2 +addx 5 +addx -39 +addx 29 +addx -27 +addx 5 +noop +noop +noop +addx 4 +noop +addx 1 +addx 2 +addx 5 +addx 2 +noop +noop +noop +noop +addx 5 +addx 1 +noop +addx 2 +addx 5 +addx -32 +addx 34 +noop +noop +noop +noop From 967d3f69efb0a6deee127f405b1c75ff542b1534 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Sat, 10 Dec 2022 06:46:01 +0100 Subject: [PATCH 368/433] Day 10 2022 refactor --- .../adventofcode/year22/days/Day10.java | 66 +++++++------------ 1 file changed, 22 insertions(+), 44 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java index e93fd580..1f010c12 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java @@ -1,10 +1,12 @@ package com.sbaars.adventofcode.year22.days; -import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year22.Day2022; import java.util.ArrayList; import java.util.List; +import java.util.function.BiFunction; +import java.util.stream.Collectors; +import java.util.stream.Stream; public class Day10 extends Day2022 { public Day10() { @@ -12,68 +14,44 @@ public Day10() { } public static void main(String[] args) { - Day d = new Day10(); - d.downloadIfNotDownloaded(); - d.downloadExample(); - d.printParts(); -// System.in.read(); -// d.submitPart1(); -// d.submitPart2(); + new Day10().printParts(); } @Override public Object part1() { - long cycle = 1; - long x = 1; - List output = new ArrayList<>(); - for(String op : dayStrings()) { - if(op.equals("noop")) { - cycle++; - } else if(op.startsWith("addx")) { - long add = Long.parseLong(op.substring(5)); - cycle++; - if((cycle+20) % 40 == 0) { - output.add(cycle*x); -// System.out.println(cycle+", "+x); - } - cycle++; - x+=add; - } - if((cycle+20) % 40 == 0) { - output.add(cycle*x); -// System.out.p rintln(cycle+", "+x); - } - if(cycle>220) break; - } -// System.out.println(cycle+", "+x+", "+ Arrays.toString(output.toArray())); - return output.stream().mapToLong(e -> e).sum(); + return performOp(this::signalStrength).mapToLong(e -> e).sum(); } @Override public Object part2() { + return performOp(this::getPixel).collect(Collectors.joining()); + } + + private long signalStrength(long cycle, long x) { + return (cycle+20) % 40 == 0 ? cycle*x : 0; + } + + private String getPixel(long cycle, long x) { + long i = (cycle -1) % 40; + return (i == 0 ? "\n" : "") + (List.of(x -1, x, x +1).contains(i) ? "#" : "."); + } + + private Stream performOp(BiFunction func) { long cycle = 1; long x = 1; -// List output = new ArrayList<>(); - String pixels = ""; + List res = new ArrayList<>(); for(String op : dayStrings()) { - if((cycle-1) % 40 == 0) { - pixels+="\n"; - } - pixels += List.of(x-1, x, x+1).contains((cycle-1)%40) ? "#" : "."; + res.add(func.apply(cycle, x)); if(op.equals("noop")) { cycle++; } else if(op.startsWith("addx")) { long add = Long.parseLong(op.substring(5)); cycle++; - if((cycle-1) % 40 == 0) { - pixels+="\n"; - } - pixels += List.of(x-1, x, x+1).contains((cycle-1)%40) ? "#" : "."; + res.add(func.apply(cycle, x)); cycle++; x+=add; } } -// System.out.println(cycle+", "+x+", "+ Arrays.toString(output.toArray())); - return pixels; + return res.stream(); } } From a77ada90aa73823c561ec1c448bb97d73119b4e4 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Sat, 10 Dec 2022 06:49:52 +0100 Subject: [PATCH 369/433] Day 10 2022 More refactoring --- .../java/com/sbaars/adventofcode/year22/days/Day10.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java index 1f010c12..bf53cc1f 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java @@ -42,15 +42,12 @@ private Stream performOp(BiFunction func) { List res = new ArrayList<>(); for(String op : dayStrings()) { res.add(func.apply(cycle, x)); - if(op.equals("noop")) { - cycle++; - } else if(op.startsWith("addx")) { - long add = Long.parseLong(op.substring(5)); + if(op.startsWith("addx")) { cycle++; res.add(func.apply(cycle, x)); - cycle++; - x+=add; + x+=Long.parseLong(op.substring(5)); } + cycle++; } return res.stream(); } From bfaded7743f4deb5d6e22b876adcf7309cd78222 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Sun, 11 Dec 2022 06:49:37 +0100 Subject: [PATCH 370/433] 2022 Day 11 --- .../com/sbaars/adventofcode/common/Day.java | 4 +- .../adventofcode/year22/days/Day10.java | 2 +- .../adventofcode/year22/days/Day11.java | 49 +++++++++++- src/main/resources/2022-examples/day11-1.txt | 27 +++++++ src/main/resources/2022-examples/day11-2.txt | 74 +++++++++++++++++++ src/main/resources/2022-examples/day11-3.txt | 4 + src/main/resources/2022-examples/day11-4.txt | 69 +++++++++++++++++ src/main/resources/2022-examples/day11-5.txt | 4 + src/main/resources/2022-examples/day11-6.txt | 71 ++++++++++++++++++ src/main/resources/2022/day11.txt | 55 ++++++++++++++ 10 files changed, 354 insertions(+), 5 deletions(-) create mode 100644 src/main/resources/2022-examples/day11-1.txt create mode 100644 src/main/resources/2022-examples/day11-2.txt create mode 100644 src/main/resources/2022-examples/day11-3.txt create mode 100644 src/main/resources/2022-examples/day11-4.txt create mode 100644 src/main/resources/2022-examples/day11-5.txt create mode 100644 src/main/resources/2022-examples/day11-6.txt create mode 100644 src/main/resources/2022/day11.txt diff --git a/src/main/java/com/sbaars/adventofcode/common/Day.java b/src/main/java/com/sbaars/adventofcode/common/Day.java index 8633e029..28e63a94 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Day.java +++ b/src/main/java/com/sbaars/adventofcode/common/Day.java @@ -148,8 +148,8 @@ public void downloadIfNotDownloaded() { } public void downloadExample() { - if(example > 0 && !getResource(getDayPath()).exists()) { +// if(example > 0 && !getResource(getDayPath()).exists()) { new FetchInput().retrieveExamples(Integer.toString(day), Integer.toString(year)); - } +// } } } diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java index bf53cc1f..b7084e09 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java @@ -33,7 +33,7 @@ private long signalStrength(long cycle, long x) { private String getPixel(long cycle, long x) { long i = (cycle -1) % 40; - return (i == 0 ? "\n" : "") + (List.of(x -1, x, x +1).contains(i) ? "#" : "."); + return (i == 0 ? "\n" : "") + (List.of(x -1, x, x +1).contains(i) ? "██" : "â–‘â–‘"); } private Stream performOp(BiFunction func) { diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day11.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day11.java index 3d383f7b..d06167de 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day11.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day11.java @@ -1,7 +1,16 @@ package com.sbaars.adventofcode.year22.days; +import com.sbaars.adventofcode.year19.util.LongCountMap; import com.sbaars.adventofcode.year22.Day2022; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; + public class Day11 extends Day2022 { public Day11() { super(11); @@ -11,13 +20,49 @@ public static void main(String[] args) { new Day11().printParts(); } + public record Monkey(long n, String items, char op, String add, long divisible, long ifTrue, long ifFalse) {} + @Override public Object part1() { - return ""; + return solution(20, true); + } + + private long solution(int cycles, boolean decreasingWorry) { + List monkeys = Arrays.stream(day().split("\n\n")).map(String::trim).map(s -> readString(s, "Monkey %n:\n" + + " Starting items: %s\n" + + " Operation: new = old %c %s\n" + + " Test: divisible by %n\n" + + " If true: throw to monkey %n\n" + + " If false: throw to monkey %n", Monkey.class)).toList(); + Map> items = monkeys.stream().collect(Collectors.toMap(m -> m.n, m -> Arrays.stream(m.items.split(", ")).map(Long::parseLong).collect(Collectors.toCollection(ArrayList::new)))); + LongCountMap times = new LongCountMap<>(); + long gcd = monkeys.stream().mapToLong(e -> e.divisible).reduce((a,b) -> a*b).getAsLong(); + for(int i = 0; i e).sorted().toArray(); + return sorted[sorted.length-1] * sorted[sorted.length-2]; + } + + private long applyOperator(long item, char op, String add) { + long itemValue = add.equals("old") ? item : Long.parseLong(add); + return switch (op) { + case '*' -> item * itemValue; + case '+' -> item + itemValue; + default -> throw new IllegalStateException(); + }; } @Override public Object part2() { - return ""; + return solution(10000, false); } } diff --git a/src/main/resources/2022-examples/day11-1.txt b/src/main/resources/2022-examples/day11-1.txt new file mode 100644 index 00000000..30e09e50 --- /dev/null +++ b/src/main/resources/2022-examples/day11-1.txt @@ -0,0 +1,27 @@ +Monkey 0: + Starting items: 79, 98 + Operation: new = old * 19 + Test: divisible by 23 + If true: throw to monkey 2 + If false: throw to monkey 3 + +Monkey 1: + Starting items: 54, 65, 75, 74 + Operation: new = old + 6 + Test: divisible by 19 + If true: throw to monkey 2 + If false: throw to monkey 0 + +Monkey 2: + Starting items: 79, 60, 97 + Operation: new = old * old + Test: divisible by 13 + If true: throw to monkey 1 + If false: throw to monkey 3 + +Monkey 3: + Starting items: 74 + Operation: new = old + 3 + Test: divisible by 17 + If true: throw to monkey 0 + If false: throw to monkey 1 diff --git a/src/main/resources/2022-examples/day11-2.txt b/src/main/resources/2022-examples/day11-2.txt new file mode 100644 index 00000000..c08542de --- /dev/null +++ b/src/main/resources/2022-examples/day11-2.txt @@ -0,0 +1,74 @@ +Monkey 0: + Monkey inspects an item with a worry level of 79. + Worry level is multiplied by 19 to 1501. + Monkey gets bored with item. Worry level is divided by 3 to 500. + Current worry level is not divisible by 23. + Item with worry level 500 is thrown to monkey 3. + Monkey inspects an item with a worry level of 98. + Worry level is multiplied by 19 to 1862. + Monkey gets bored with item. Worry level is divided by 3 to 620. + Current worry level is not divisible by 23. + Item with worry level 620 is thrown to monkey 3. +Monkey 1: + Monkey inspects an item with a worry level of 54. + Worry level increases by 6 to 60. + Monkey gets bored with item. Worry level is divided by 3 to 20. + Current worry level is not divisible by 19. + Item with worry level 20 is thrown to monkey 0. + Monkey inspects an item with a worry level of 65. + Worry level increases by 6 to 71. + Monkey gets bored with item. Worry level is divided by 3 to 23. + Current worry level is not divisible by 19. + Item with worry level 23 is thrown to monkey 0. + Monkey inspects an item with a worry level of 75. + Worry level increases by 6 to 81. + Monkey gets bored with item. Worry level is divided by 3 to 27. + Current worry level is not divisible by 19. + Item with worry level 27 is thrown to monkey 0. + Monkey inspects an item with a worry level of 74. + Worry level increases by 6 to 80. + Monkey gets bored with item. Worry level is divided by 3 to 26. + Current worry level is not divisible by 19. + Item with worry level 26 is thrown to monkey 0. +Monkey 2: + Monkey inspects an item with a worry level of 79. + Worry level is multiplied by itself to 6241. + Monkey gets bored with item. Worry level is divided by 3 to 2080. + Current worry level is divisible by 13. + Item with worry level 2080 is thrown to monkey 1. + Monkey inspects an item with a worry level of 60. + Worry level is multiplied by itself to 3600. + Monkey gets bored with item. Worry level is divided by 3 to 1200. + Current worry level is not divisible by 13. + Item with worry level 1200 is thrown to monkey 3. + Monkey inspects an item with a worry level of 97. + Worry level is multiplied by itself to 9409. + Monkey gets bored with item. Worry level is divided by 3 to 3136. + Current worry level is not divisible by 13. + Item with worry level 3136 is thrown to monkey 3. +Monkey 3: + Monkey inspects an item with a worry level of 74. + Worry level increases by 3 to 77. + Monkey gets bored with item. Worry level is divided by 3 to 25. + Current worry level is not divisible by 17. + Item with worry level 25 is thrown to monkey 1. + Monkey inspects an item with a worry level of 500. + Worry level increases by 3 to 503. + Monkey gets bored with item. Worry level is divided by 3 to 167. + Current worry level is not divisible by 17. + Item with worry level 167 is thrown to monkey 1. + Monkey inspects an item with a worry level of 620. + Worry level increases by 3 to 623. + Monkey gets bored with item. Worry level is divided by 3 to 207. + Current worry level is not divisible by 17. + Item with worry level 207 is thrown to monkey 1. + Monkey inspects an item with a worry level of 1200. + Worry level increases by 3 to 1203. + Monkey gets bored with item. Worry level is divided by 3 to 401. + Current worry level is not divisible by 17. + Item with worry level 401 is thrown to monkey 1. + Monkey inspects an item with a worry level of 3136. + Worry level increases by 3 to 3139. + Monkey gets bored with item. Worry level is divided by 3 to 1046. + Current worry level is not divisible by 17. + Item with worry level 1046 is thrown to monkey 1. diff --git a/src/main/resources/2022-examples/day11-3.txt b/src/main/resources/2022-examples/day11-3.txt new file mode 100644 index 00000000..78fd058f --- /dev/null +++ b/src/main/resources/2022-examples/day11-3.txt @@ -0,0 +1,4 @@ +Monkey 0: 20, 23, 27, 26 +Monkey 1: 2080, 25, 167, 207, 401, 1046 +Monkey 2: +Monkey 3: diff --git a/src/main/resources/2022-examples/day11-4.txt b/src/main/resources/2022-examples/day11-4.txt new file mode 100644 index 00000000..ce28a32f --- /dev/null +++ b/src/main/resources/2022-examples/day11-4.txt @@ -0,0 +1,69 @@ +After round 2, the monkeys are holding items with these worry levels: +Monkey 0: 695, 10, 71, 135, 350 +Monkey 1: 43, 49, 58, 55, 362 +Monkey 2: +Monkey 3: + +After round 3, the monkeys are holding items with these worry levels: +Monkey 0: 16, 18, 21, 20, 122 +Monkey 1: 1468, 22, 150, 286, 739 +Monkey 2: +Monkey 3: + +After round 4, the monkeys are holding items with these worry levels: +Monkey 0: 491, 9, 52, 97, 248, 34 +Monkey 1: 39, 45, 43, 258 +Monkey 2: +Monkey 3: + +After round 5, the monkeys are holding items with these worry levels: +Monkey 0: 15, 17, 16, 88, 1037 +Monkey 1: 20, 110, 205, 524, 72 +Monkey 2: +Monkey 3: + +After round 6, the monkeys are holding items with these worry levels: +Monkey 0: 8, 70, 176, 26, 34 +Monkey 1: 481, 32, 36, 186, 2190 +Monkey 2: +Monkey 3: + +After round 7, the monkeys are holding items with these worry levels: +Monkey 0: 162, 12, 14, 64, 732, 17 +Monkey 1: 148, 372, 55, 72 +Monkey 2: +Monkey 3: + +After round 8, the monkeys are holding items with these worry levels: +Monkey 0: 51, 126, 20, 26, 136 +Monkey 1: 343, 26, 30, 1546, 36 +Monkey 2: +Monkey 3: + +After round 9, the monkeys are holding items with these worry levels: +Monkey 0: 116, 10, 12, 517, 14 +Monkey 1: 108, 267, 43, 55, 288 +Monkey 2: +Monkey 3: + +After round 10, the monkeys are holding items with these worry levels: +Monkey 0: 91, 16, 20, 98 +Monkey 1: 481, 245, 22, 26, 1092, 30 +Monkey 2: +Monkey 3: + +... + +After round 15, the monkeys are holding items with these worry levels: +Monkey 0: 83, 44, 8, 184, 9, 20, 26, 102 +Monkey 1: 110, 36 +Monkey 2: +Monkey 3: + +... + +After round 20, the monkeys are holding items with these worry levels: +Monkey 0: 10, 12, 14, 26, 34 +Monkey 1: 245, 93, 53, 199, 115 +Monkey 2: +Monkey 3: diff --git a/src/main/resources/2022-examples/day11-5.txt b/src/main/resources/2022-examples/day11-5.txt new file mode 100644 index 00000000..24a64895 --- /dev/null +++ b/src/main/resources/2022-examples/day11-5.txt @@ -0,0 +1,4 @@ +Monkey 0 inspected items 101 times. +Monkey 1 inspected items 95 times. +Monkey 2 inspected items 7 times. +Monkey 3 inspected items 105 times. diff --git a/src/main/resources/2022-examples/day11-6.txt b/src/main/resources/2022-examples/day11-6.txt new file mode 100644 index 00000000..24379809 --- /dev/null +++ b/src/main/resources/2022-examples/day11-6.txt @@ -0,0 +1,71 @@ +== After round 1 == +Monkey 0 inspected items 2 times. +Monkey 1 inspected items 4 times. +Monkey 2 inspected items 3 times. +Monkey 3 inspected items 6 times. + +== After round 20 == +Monkey 0 inspected items 99 times. +Monkey 1 inspected items 97 times. +Monkey 2 inspected items 8 times. +Monkey 3 inspected items 103 times. + +== After round 1000 == +Monkey 0 inspected items 5204 times. +Monkey 1 inspected items 4792 times. +Monkey 2 inspected items 199 times. +Monkey 3 inspected items 5192 times. + +== After round 2000 == +Monkey 0 inspected items 10419 times. +Monkey 1 inspected items 9577 times. +Monkey 2 inspected items 392 times. +Monkey 3 inspected items 10391 times. + +== After round 3000 == +Monkey 0 inspected items 15638 times. +Monkey 1 inspected items 14358 times. +Monkey 2 inspected items 587 times. +Monkey 3 inspected items 15593 times. + +== After round 4000 == +Monkey 0 inspected items 20858 times. +Monkey 1 inspected items 19138 times. +Monkey 2 inspected items 780 times. +Monkey 3 inspected items 20797 times. + +== After round 5000 == +Monkey 0 inspected items 26075 times. +Monkey 1 inspected items 23921 times. +Monkey 2 inspected items 974 times. +Monkey 3 inspected items 26000 times. + +== After round 6000 == +Monkey 0 inspected items 31294 times. +Monkey 1 inspected items 28702 times. +Monkey 2 inspected items 1165 times. +Monkey 3 inspected items 31204 times. + +== After round 7000 == +Monkey 0 inspected items 36508 times. +Monkey 1 inspected items 33488 times. +Monkey 2 inspected items 1360 times. +Monkey 3 inspected items 36400 times. + +== After round 8000 == +Monkey 0 inspected items 41728 times. +Monkey 1 inspected items 38268 times. +Monkey 2 inspected items 1553 times. +Monkey 3 inspected items 41606 times. + +== After round 9000 == +Monkey 0 inspected items 46945 times. +Monkey 1 inspected items 43051 times. +Monkey 2 inspected items 1746 times. +Monkey 3 inspected items 46807 times. + +== After round 10000 == +Monkey 0 inspected items 52166 times. +Monkey 1 inspected items 47830 times. +Monkey 2 inspected items 1938 times. +Monkey 3 inspected items 52013 times. diff --git a/src/main/resources/2022/day11.txt b/src/main/resources/2022/day11.txt new file mode 100644 index 00000000..f505c2ec --- /dev/null +++ b/src/main/resources/2022/day11.txt @@ -0,0 +1,55 @@ +Monkey 0: + Starting items: 83, 97, 95, 67 + Operation: new = old * 19 + Test: divisible by 17 + If true: throw to monkey 2 + If false: throw to monkey 7 + +Monkey 1: + Starting items: 71, 70, 79, 88, 56, 70 + Operation: new = old + 2 + Test: divisible by 19 + If true: throw to monkey 7 + If false: throw to monkey 0 + +Monkey 2: + Starting items: 98, 51, 51, 63, 80, 85, 84, 95 + Operation: new = old + 7 + Test: divisible by 7 + If true: throw to monkey 4 + If false: throw to monkey 3 + +Monkey 3: + Starting items: 77, 90, 82, 80, 79 + Operation: new = old + 1 + Test: divisible by 11 + If true: throw to monkey 6 + If false: throw to monkey 4 + +Monkey 4: + Starting items: 68 + Operation: new = old * 5 + Test: divisible by 13 + If true: throw to monkey 6 + If false: throw to monkey 5 + +Monkey 5: + Starting items: 60, 94 + Operation: new = old + 5 + Test: divisible by 3 + If true: throw to monkey 1 + If false: throw to monkey 0 + +Monkey 6: + Starting items: 81, 51, 85 + Operation: new = old * old + Test: divisible by 5 + If true: throw to monkey 5 + If false: throw to monkey 1 + +Monkey 7: + Starting items: 98, 81, 63, 65, 84, 71, 84 + Operation: new = old + 3 + Test: divisible by 2 + If true: throw to monkey 2 + If false: throw to monkey 3 From 4db235c96f74ac53155bb2773ddd1adb3f1dfb5f Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Sun, 11 Dec 2022 11:15:37 +0100 Subject: [PATCH 371/433] Gen image ascii --- .../adventofcode/year22/days/Day10.java | 37 +++++++++++++++++-- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java index b7084e09..7f00590c 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java @@ -2,6 +2,8 @@ import com.sbaars.adventofcode.year22.Day2022; +import java.awt.*; +import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; import java.util.function.BiFunction; @@ -15,16 +17,17 @@ public Day10() { public static void main(String[] args) { new Day10().printParts(); + new Day10().part3(); } @Override public Object part1() { - return performOp(this::signalStrength).mapToLong(e -> e).sum(); + return performOp(dayStrings(), this::signalStrength).mapToLong(e -> e).sum(); } @Override public Object part2() { - return performOp(this::getPixel).collect(Collectors.joining()); + return performOp(dayStrings(), this::getPixel).collect(Collectors.joining()); } private long signalStrength(long cycle, long x) { @@ -36,11 +39,11 @@ private String getPixel(long cycle, long x) { return (i == 0 ? "\n" : "") + (List.of(x -1, x, x +1).contains(i) ? "██" : "â–‘â–‘"); } - private Stream performOp(BiFunction func) { + private Stream performOp(String[] input, BiFunction func) { long cycle = 1; long x = 1; List res = new ArrayList<>(); - for(String op : dayStrings()) { + for(String op : input) { res.add(func.apply(cycle, x)); if(op.startsWith("addx")) { cycle++; @@ -51,4 +54,30 @@ private Stream performOp(BiFunction func) { } return res.stream(); } + + // Write any arbitrary String to an ascii art program + public Object part3() { + String[] input = genInput("SIMON"); + return performOp(input, this::getPixel).collect(Collectors.joining()); + } + + public String[] genInput(String message) { + int width = 40; + int height = 12; + boolean[][] desiredPixels = new boolean[height][width]; + BufferedImage bufferedImage = new BufferedImage( + width, height, + BufferedImage.TYPE_INT_RGB); + Graphics graphics = bufferedImage.getGraphics(); + Graphics2D graphics2D = (Graphics2D) graphics; + graphics2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, + RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + graphics2D.drawString(message, 0, 10); + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + desiredPixels[y][x] = bufferedImage.getRGB(x, y) > -7777216; + } + } + return "".split("\n"); + } } From c0989479f5bf32056effcf021f43829feb7c3f1b Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Sun, 11 Dec 2022 12:11:14 +0100 Subject: [PATCH 372/433] 2022 day 10 part 3 --- .../sbaars/adventofcode/util/FetchInput.java | 2 +- .../adventofcode/year21/days/Day11.java | 1 + .../adventofcode/year22/days/Day10.java | 50 ++++- src/main/resources/2022-day10-part3/SIMON.txt | 181 ++++++++++++++++++ 4 files changed, 224 insertions(+), 10 deletions(-) create mode 100644 src/main/resources/2022-day10-part3/SIMON.txt diff --git a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java index 3f10ceff..8646de28 100644 --- a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java +++ b/src/main/java/com/sbaars/adventofcode/util/FetchInput.java @@ -72,7 +72,7 @@ private File getFile(String day, String year) { return getResource(year + "/day" + day + ".txt"); } - private void writeFile(File file, String content) { + public static void writeFile(File file, String content) { try { FileUtils.writeStringToFile(file, content); } catch (IOException e) { diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day11.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day11.java index b9f6db79..5862abad 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day11.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day11.java @@ -4,6 +4,7 @@ import com.sbaars.adventofcode.common.HasRecursion; import com.sbaars.adventofcode.common.grid.NumGrid; import com.sbaars.adventofcode.year21.Day2021; + import java.awt.*; import java.util.Arrays; diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java index 7f00590c..e39ef4f5 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java @@ -1,9 +1,11 @@ package com.sbaars.adventofcode.year22.days; +import com.sbaars.adventofcode.util.FetchInput; import com.sbaars.adventofcode.year22.Day2022; import java.awt.*; import java.awt.image.BufferedImage; +import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.function.BiFunction; @@ -17,7 +19,7 @@ public Day10() { public static void main(String[] args) { new Day10().printParts(); - new Day10().part3(); + System.out.println(new Day10().part3()); } @Override @@ -41,7 +43,7 @@ private String getPixel(long cycle, long x) { private Stream performOp(String[] input, BiFunction func) { long cycle = 1; - long x = 1; + long x = 1; List res = new ArrayList<>(); for(String op : input) { res.add(func.apply(cycle, x)); @@ -57,14 +59,44 @@ private Stream performOp(String[] input, BiFunction func) { // Write any arbitrary String to an ascii art program public Object part3() { - String[] input = genInput("SIMON"); - return performOp(input, this::getPixel).collect(Collectors.joining()); + String message = "SIMON"; + String[] input = genInput(message); + FetchInput.writeFile(new File("src/main/resources/2022-day10-part3/"+message+".txt"), String.join("\n", input)); + return "Part 3: "+performOp(input, this::getPixel).collect(Collectors.joining()); } public String[] genInput(String message) { int width = 40; - int height = 12; - boolean[][] desiredPixels = new boolean[height][width]; + int height = 9; + boolean[] desiredPixels = convertStringToAscii(message, width, height); + return generateInstructions(width, height, desiredPixels).toArray(String[]::new); + } + + private static List generateInstructions(int width, int height, boolean[] desiredPixels) { + List output = new ArrayList<>(); + int x = 0; + for(int cycle = 0; cycle<(width * height)-2; cycle+=2) { + int desiredX; + if(desiredPixels[cycle+2] && desiredPixels[cycle+3]){ + desiredX = cycle+1; + } else if(!desiredPixels[cycle+2] && desiredPixels[cycle+3]) { + desiredX = cycle+3; + } else if(desiredPixels[cycle+2] && !desiredPixels[cycle+3]) { + desiredX = cycle; + } else { + desiredX = cycle+4; + } + desiredX = desiredX - (((cycle+2) / width)* width); + output.add("addx "+(desiredX-x)); + x = desiredX; + } + output.add("noop"); + output.add("noop"); + return output; + } + + private static boolean[] convertStringToAscii(String message, int width, int height) { + boolean[] desiredPixels = new boolean[height * width]; BufferedImage bufferedImage = new BufferedImage( width, height, BufferedImage.TYPE_INT_RGB); @@ -72,12 +104,12 @@ public String[] genInput(String message) { Graphics2D graphics2D = (Graphics2D) graphics; graphics2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); - graphics2D.drawString(message, 0, 10); + graphics2D.drawString(message, 0, height); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { - desiredPixels[y][x] = bufferedImage.getRGB(x, y) > -7777216; + desiredPixels[(y* width)+x] = bufferedImage.getRGB(x, y) > -7777216; } } - return "".split("\n"); + return desiredPixels; } } diff --git a/src/main/resources/2022-day10-part3/SIMON.txt b/src/main/resources/2022-day10-part3/SIMON.txt new file mode 100644 index 00000000..bfabd9aa --- /dev/null +++ b/src/main/resources/2022-day10-part3/SIMON.txt @@ -0,0 +1,181 @@ +addx 1 +addx 1 +addx 5 +addx 3 +addx -1 +addx 5 +addx 2 +addx -1 +addx 5 +addx 1 +addx 0 +addx 2 +addx 5 +addx 1 +addx -1 +addx 6 +addx 1 +addx 3 +addx 2 +addx -39 +addx 3 +addx 2 +addx 1 +addx 3 +addx -1 +addx 5 +addx 2 +addx -1 +addx 5 +addx -1 +addx 5 +addx 1 +addx -1 +addx 5 +addx -1 +addx 6 +addx 1 +addx 3 +addx 2 +addx -39 +addx 3 +addx 2 +addx 1 +addx 3 +addx -1 +addx 1 +addx 6 +addx -1 +addx 5 +addx -2 +addx 6 +addx 2 +addx -2 +addx 5 +addx 0 +addx 5 +addx 1 +addx 3 +addx 2 +addx -39 +addx -1 +addx 6 +addx 1 +addx 3 +addx -2 +addx 2 +addx 5 +addx 2 +addx 3 +addx -2 +addx 6 +addx 2 +addx -1 +addx 4 +addx 2 +addx -1 +addx 5 +addx 3 +addx 2 +addx -38 +addx -1 +addx 1 +addx 5 +addx 3 +addx -2 +addx 2 +addx 5 +addx 2 +addx 3 +addx -2 +addx 6 +addx 2 +addx -1 +addx 4 +addx 3 +addx -2 +addx 5 +addx 3 +addx 2 +addx -38 +addx 2 +addx -1 +addx 4 +addx 3 +addx -2 +addx 3 +addx 4 +addx 2 +addx 3 +addx -2 +addx 6 +addx 2 +addx -1 +addx 4 +addx 3 +addx -1 +addx 4 +addx 3 +addx 2 +addx -38 +addx 2 +addx -1 +addx 4 +addx 3 +addx -2 +addx 5 +addx -1 +addx 5 +addx 3 +addx -1 +addx 5 +addx 2 +addx -2 +addx 5 +addx 3 +addx 1 +addx 0 +addx 5 +addx 2 +addx -38 +addx 2 +addx -1 +addx 4 +addx 3 +addx -2 +addx 5 +addx -1 +addx 5 +addx 3 +addx -1 +addx 5 +addx 1 +addx -1 +addx 5 +addx 3 +addx 2 +addx -1 +addx 5 +addx 2 +addx -39 +addx 0 +addx 1 +addx 5 +addx 3 +addx -2 +addx 6 +addx 2 +addx 1 +addx 3 +addx 1 +addx 0 +addx 2 +addx 5 +addx 1 +addx 3 +addx 2 +addx -1 +addx 5 +addx 2 +noop +noop \ No newline at end of file From d131930d5738903c1f21d3a5d447160fa81b6598 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Sun, 11 Dec 2022 12:18:21 +0100 Subject: [PATCH 373/433] Show example output --- .../adventofcode/year22/days/Day10.java | 2 +- src/main/resources/2022-day10-part3/DYLAN.txt | 181 ++++++++++++++++++ src/main/resources/2022-day10-part3/I WIN.txt | 181 ++++++++++++++++++ src/main/resources/2022-day10-part3/Maxim.txt | 181 ++++++++++++++++++ .../\342\230\206\342\230\272\342\230\206.txt" | 181 ++++++++++++++++++ 5 files changed, 725 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/2022-day10-part3/DYLAN.txt create mode 100644 src/main/resources/2022-day10-part3/I WIN.txt create mode 100644 src/main/resources/2022-day10-part3/Maxim.txt create mode 100644 "src/main/resources/2022-day10-part3/\342\230\206\342\230\272\342\230\206.txt" diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java index e39ef4f5..34257f2c 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java @@ -59,7 +59,7 @@ private Stream performOp(String[] input, BiFunction func) { // Write any arbitrary String to an ascii art program public Object part3() { - String message = "SIMON"; + String message = " ☆☺☆ "; String[] input = genInput(message); FetchInput.writeFile(new File("src/main/resources/2022-day10-part3/"+message+".txt"), String.join("\n", input)); return "Part 3: "+performOp(input, this::getPixel).collect(Collectors.joining()); diff --git a/src/main/resources/2022-day10-part3/DYLAN.txt b/src/main/resources/2022-day10-part3/DYLAN.txt new file mode 100644 index 00000000..da2ac4b1 --- /dev/null +++ b/src/main/resources/2022-day10-part3/DYLAN.txt @@ -0,0 +1,181 @@ +addx 1 +addx 2 +addx 5 +addx 1 +addx -1 +addx 6 +addx 1 +addx 2 +addx 3 +addx 2 +addx 2 +addx 1 +addx -1 +addx 6 +addx 1 +addx -1 +addx 6 +addx 1 +addx 3 +addx -39 +addx 3 +addx 2 +addx -1 +addx 5 +addx -2 +addx 6 +addx -1 +addx 4 +addx 3 +addx 2 +addx 2 +addx 1 +addx -1 +addx 6 +addx 1 +addx -1 +addx 6 +addx 1 +addx 3 +addx -39 +addx 3 +addx 2 +addx 1 +addx 3 +addx -1 +addx 5 +addx -2 +addx 5 +addx 3 +addx 2 +addx 2 +addx 1 +addx 0 +addx 5 +addx 1 +addx 0 +addx 5 +addx 1 +addx 3 +addx -39 +addx 3 +addx 2 +addx 1 +addx 3 +addx 1 +addx 0 +addx 5 +addx 1 +addx 3 +addx 2 +addx 2 +addx -2 +addx 5 +addx 3 +addx 1 +addx 2 +addx -1 +addx 5 +addx 3 +addx -39 +addx 3 +addx 2 +addx 1 +addx 3 +addx 2 +addx -1 +addx 5 +addx 1 +addx 3 +addx 2 +addx 2 +addx -2 +addx 5 +addx -1 +addx 5 +addx 3 +addx -2 +addx 5 +addx 3 +addx -39 +addx 3 +addx 2 +addx 1 +addx 3 +addx 2 +addx -2 +addx 6 +addx 1 +addx 3 +addx 2 +addx 1 +addx 0 +addx 2 +addx 1 +addx 5 +addx 3 +addx -1 +addx 4 +addx 3 +addx -39 +addx 3 +addx 2 +addx -1 +addx 5 +addx 2 +addx -2 +addx 6 +addx 1 +addx 3 +addx 2 +addx 1 +addx -1 +addx 5 +addx -1 +addx 5 +addx 3 +addx 1 +addx 0 +addx 5 +addx -39 +addx 3 +addx 2 +addx -2 +addx 6 +addx 2 +addx -2 +addx 6 +addx 1 +addx 3 +addx 2 +addx 1 +addx 3 +addx 2 +addx -1 +addx 4 +addx 3 +addx 2 +addx -1 +addx 5 +addx -39 +addx 0 +addx 2 +addx 5 +addx 2 +addx 2 +addx -2 +addx 6 +addx 1 +addx 0 +addx 2 +addx 1 +addx 6 +addx 2 +addx 1 +addx 2 +addx 3 +addx 2 +addx -1 +addx 5 +noop +noop \ No newline at end of file diff --git a/src/main/resources/2022-day10-part3/I WIN.txt b/src/main/resources/2022-day10-part3/I WIN.txt new file mode 100644 index 00000000..f3e0324d --- /dev/null +++ b/src/main/resources/2022-day10-part3/I WIN.txt @@ -0,0 +1,181 @@ +addx 4 +addx 1 +addx 3 +addx 2 +addx 1 +addx 3 +addx 1 +addx -1 +addx 6 +addx -2 +addx 2 +addx 5 +addx -1 +addx 6 +addx 1 +addx 3 +addx 2 +addx 2 +addx 2 +addx -38 +addx 2 +addx 1 +addx 3 +addx 2 +addx 1 +addx -1 +addx 5 +addx -1 +addx 6 +addx -2 +addx 2 +addx 5 +addx -1 +addx 6 +addx 1 +addx 3 +addx 2 +addx 2 +addx 2 +addx -38 +addx 2 +addx 1 +addx 3 +addx 2 +addx 2 +addx -2 +addx 5 +addx -1 +addx 6 +addx -2 +addx 2 +addx 5 +addx 0 +addx 5 +addx 1 +addx 3 +addx 2 +addx 2 +addx 2 +addx -38 +addx 2 +addx 1 +addx 3 +addx 2 +addx 2 +addx -2 +addx 5 +addx 0 +addx 4 +addx 3 +addx -2 +addx 5 +addx 2 +addx -1 +addx 5 +addx 3 +addx 2 +addx 2 +addx 2 +addx -38 +addx 2 +addx 1 +addx 3 +addx 2 +addx 2 +addx -2 +addx 5 +addx 2 +addx 2 +addx 3 +addx -2 +addx 5 +addx 3 +addx -2 +addx 5 +addx 3 +addx 2 +addx 2 +addx 2 +addx -38 +addx 2 +addx 1 +addx 3 +addx 2 +addx 2 +addx -1 +addx 1 +addx 5 +addx 2 +addx 3 +addx -2 +addx 5 +addx 3 +addx -1 +addx 4 +addx 3 +addx 2 +addx 2 +addx 2 +addx -38 +addx 2 +addx 1 +addx 3 +addx 2 +addx 2 +addx 1 +addx -1 +addx 5 +addx 0 +addx 5 +addx -2 +addx 5 +addx 3 +addx 1 +addx 0 +addx 5 +addx 2 +addx 2 +addx 2 +addx -38 +addx 2 +addx 1 +addx 3 +addx 2 +addx 2 +addx 1 +addx -1 +addx 5 +addx -1 +addx 6 +addx -2 +addx 5 +addx 3 +addx 2 +addx -1 +addx 5 +addx 2 +addx 2 +addx 2 +addx -38 +addx 2 +addx 1 +addx 3 +addx 2 +addx 2 +addx 1 +addx -1 +addx 5 +addx -1 +addx 6 +addx -2 +addx 5 +addx 3 +addx 2 +addx -1 +addx 5 +addx 2 +addx 2 +addx 2 +noop +noop \ No newline at end of file diff --git a/src/main/resources/2022-day10-part3/Maxim.txt b/src/main/resources/2022-day10-part3/Maxim.txt new file mode 100644 index 00000000..fc766b48 --- /dev/null +++ b/src/main/resources/2022-day10-part3/Maxim.txt @@ -0,0 +1,181 @@ +addx 0 +addx 6 +addx 1 +addx -1 +addx 6 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 1 +addx 3 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx -39 +addx -1 +addx 6 +addx 1 +addx -1 +addx 6 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx -39 +addx 0 +addx 5 +addx 1 +addx -1 +addx 5 +addx 0 +addx 1 +addx 6 +addx -2 +addx 6 +addx -2 +addx 5 +addx 3 +addx -2 +addx 3 +addx 1 +addx 3 +addx 5 +addx 2 +addx -39 +addx 2 +addx 3 +addx -2 +addx 2 +addx 6 +addx 2 +addx -2 +addx 6 +addx -1 +addx 5 +addx -2 +addx 5 +addx 3 +addx -1 +addx 5 +addx -1 +addx 5 +addx -2 +addx 6 +addx -39 +addx 2 +addx 3 +addx -2 +addx 2 +addx 6 +addx 2 +addx -2 +addx 6 +addx 1 +addx 0 +addx 5 +addx 1 +addx 3 +addx -2 +addx 6 +addx -2 +addx 6 +addx -2 +addx 6 +addx -39 +addx 2 +addx -1 +addx 2 +addx 2 +addx 6 +addx -1 +addx 1 +addx 6 +addx 2 +addx -1 +addx 5 +addx 1 +addx 3 +addx -2 +addx 6 +addx -2 +addx 6 +addx -2 +addx 6 +addx -39 +addx 3 +addx -1 +addx 5 +addx -2 +addx 5 +addx 3 +addx -2 +addx 6 +addx 1 +addx 0 +addx 5 +addx 1 +addx 3 +addx -2 +addx 6 +addx -2 +addx 6 +addx -2 +addx 6 +addx -39 +addx 3 +addx -1 +addx 5 +addx -2 +addx 5 +addx 3 +addx -1 +addx 5 +addx -1 +addx 4 +addx -1 +addx 5 +addx 3 +addx -2 +addx 6 +addx -2 +addx 6 +addx -2 +addx 6 +addx -39 +addx 3 +addx 2 +addx 2 +addx -2 +addx 5 +addx 0 +addx 2 +addx 5 +addx -2 +addx 6 +addx -1 +addx 4 +addx 3 +addx -2 +addx 6 +addx -2 +addx 6 +addx -2 +addx 6 +noop +noop \ No newline at end of file diff --git "a/src/main/resources/2022-day10-part3/\342\230\206\342\230\272\342\230\206.txt" "b/src/main/resources/2022-day10-part3/\342\230\206\342\230\272\342\230\206.txt" new file mode 100644 index 00000000..9207dee6 --- /dev/null +++ "b/src/main/resources/2022-day10-part3/\342\230\206\342\230\272\342\230\206.txt" @@ -0,0 +1,181 @@ +addx 4 +addx 2 +addx 2 +addx 1 +addx -1 +addx 6 +addx 2 +addx 2 +addx -1 +addx 2 +addx 5 +addx 2 +addx 2 +addx 2 +addx -1 +addx 5 +addx 2 +addx 2 +addx 2 +addx -38 +addx 2 +addx 2 +addx 2 +addx 1 +addx -1 +addx 6 +addx 2 +addx 1 +addx 3 +addx 2 +addx 1 +addx 3 +addx 2 +addx 2 +addx -1 +addx 5 +addx 2 +addx 2 +addx 2 +addx -38 +addx 2 +addx 2 +addx 2 +addx -2 +addx 5 +addx 3 +addx 2 +addx -2 +addx 5 +addx 2 +addx 3 +addx 2 +addx 2 +addx 1 +addx 3 +addx -2 +addx 6 +addx 2 +addx 2 +addx -38 +addx 2 +addx 1 +addx -1 +addx 6 +addx 2 +addx 1 +addx -1 +addx 2 +addx 5 +addx 2 +addx 3 +addx -2 +addx 3 +addx 5 +addx 2 +addx 2 +addx -1 +addx 5 +addx 2 +addx -38 +addx 2 +addx 2 +addx -2 +addx 6 +addx 2 +addx 1 +addx 3 +addx -2 +addx 2 +addx 6 +addx -2 +addx 2 +addx 5 +addx 3 +addx 2 +addx 2 +addx -2 +addx 6 +addx 2 +addx -38 +addx 2 +addx 2 +addx 1 +addx 3 +addx 2 +addx -2 +addx 6 +addx -2 +addx 3 +addx 4 +addx 3 +addx -2 +addx 6 +addx -2 +addx 6 +addx 1 +addx 3 +addx 2 +addx 2 +addx -38 +addx 2 +addx 2 +addx 1 +addx 3 +addx 2 +addx -2 +addx 6 +addx 2 +addx 2 +addx -2 +addx 5 +addx 3 +addx 2 +addx -2 +addx 6 +addx 1 +addx 3 +addx 2 +addx 2 +addx -38 +addx 2 +addx 2 +addx 1 +addx 2 +addx -1 +addx 2 +addx 6 +addx 1 +addx 3 +addx 2 +addx -1 +addx 5 +addx 2 +addx -2 +addx 3 +addx 4 +addx 3 +addx 2 +addx 2 +addx -38 +addx 2 +addx 2 +addx 1 +addx -1 +addx 5 +addx -1 +addx 6 +addx 2 +addx 1 +addx 0 +addx 5 +addx 2 +addx 2 +addx -1 +addx 5 +addx -1 +addx 5 +addx 2 +addx 2 +noop +noop \ No newline at end of file From 6df3592975ba9d7eac35d3c6089e3f9865670aa0 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Mon, 12 Dec 2022 07:01:31 +0100 Subject: [PATCH 374/433] Day 12 2022 --- .../com/sbaars/adventofcode/common/Day.java | 16 +- .../adventofcode/common/grid/NumGrid.java | 14 ++ .../adventofcode/year22/days/Day10.java | 13 +- .../adventofcode/year22/days/Day12.java | 50 +++- src/main/resources/2022-day10-part3/Joost.txt | 221 ++++++++++++++++++ src/main/resources/2022-examples/day12-1.txt | 5 + src/main/resources/2022-examples/day12-2.txt | 5 + src/main/resources/2022/day12.txt | 41 ++++ 8 files changed, 349 insertions(+), 16 deletions(-) create mode 100644 src/main/resources/2022-day10-part3/Joost.txt create mode 100644 src/main/resources/2022-examples/day12-1.txt create mode 100644 src/main/resources/2022-examples/day12-2.txt create mode 100644 src/main/resources/2022/day12.txt diff --git a/src/main/java/com/sbaars/adventofcode/common/Day.java b/src/main/java/com/sbaars/adventofcode/common/Day.java index 28e63a94..d62dac8d 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Day.java +++ b/src/main/java/com/sbaars/adventofcode/common/Day.java @@ -53,8 +53,8 @@ public void printParts() { solutionPart2 = part2(); if(solutionPart1 instanceof Optional) solutionPart1 = ((Optional)solutionPart1).get(); if(solutionPart2 instanceof Optional) solutionPart2 = ((Optional)solutionPart2).get(); - System.out.println("Part 1: " + part1()); - System.out.println("Part 2: " + part2()); + System.out.println("Part 1: " + solutionPart1); + System.out.println("Part 2: " + solutionPart2); } public void printParts(int example) { @@ -142,14 +142,20 @@ protected char[][] dayGrid(String delimiter) { } public void downloadIfNotDownloaded() { - if(example == 0 && !getResource(getDayPath()).exists()) { + int oldExample = example; + example = 0; + if(!getResource(getDayPath()).exists()) { new FetchInput().retrieveInput(Integer.toString(day), Integer.toString(year)); } + example = oldExample; } public void downloadExample() { -// if(example > 0 && !getResource(getDayPath()).exists()) { + int oldExample = example; + example = 1; + if(!getResource(getDayPath()).exists()) { new FetchInput().retrieveExamples(Integer.toString(day), Integer.toString(year)); -// } + } + example = oldExample; } } diff --git a/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java b/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java index 41f4d47d..67de7cb4 100644 --- a/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java +++ b/src/main/java/com/sbaars/adventofcode/common/grid/NumGrid.java @@ -1,5 +1,7 @@ package com.sbaars.adventofcode.common.grid; +import com.sbaars.adventofcode.common.Direction; + import java.awt.*; import java.util.Arrays; import java.util.stream.Collectors; @@ -150,4 +152,16 @@ public void increment(Point p) { public void increment(Point p, int n) { set(p, get(p)+n); } + + public Stream streamDirs(Point p) { + return Arrays.stream(Direction.fourDirections()).map(d -> d.move(p)); + } + + public Point find(long l) { + return stream().filter(p -> get(p) == l).findFirst().get(); + } + + public Stream findAll(long l) { + return stream().filter(p -> get(p) == l); + } } diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java index 34257f2c..48eb4a6f 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java @@ -59,7 +59,7 @@ private Stream performOp(String[] input, BiFunction func) { // Write any arbitrary String to an ascii art program public Object part3() { - String message = " ☆☺☆ "; + String message = " Joost"; String[] input = genInput(message); FetchInput.writeFile(new File("src/main/resources/2022-day10-part3/"+message+".txt"), String.join("\n", input)); return "Part 3: "+performOp(input, this::getPixel).collect(Collectors.joining()); @@ -67,7 +67,7 @@ public Object part3() { public String[] genInput(String message) { int width = 40; - int height = 9; + int height = 11; boolean[] desiredPixels = convertStringToAscii(message, width, height); return generateInstructions(width, height, desiredPixels).toArray(String[]::new); } @@ -97,14 +97,11 @@ private static List generateInstructions(int width, int height, boolean[ private static boolean[] convertStringToAscii(String message, int width, int height) { boolean[] desiredPixels = new boolean[height * width]; - BufferedImage bufferedImage = new BufferedImage( - width, height, - BufferedImage.TYPE_INT_RGB); + BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics graphics = bufferedImage.getGraphics(); Graphics2D graphics2D = (Graphics2D) graphics; - graphics2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, - RenderingHints.VALUE_TEXT_ANTIALIAS_ON); - graphics2D.drawString(message, 0, height); + graphics2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + graphics2D.drawString(message, 0, height-2); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { desiredPixels[(y* width)+x] = bufferedImage.getRGB(x, y) > -7777216; diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day12.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day12.java index 37f244f3..cdb2ced5 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day12.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day12.java @@ -1,23 +1,67 @@ package com.sbaars.adventofcode.year22.days; +import com.sbaars.adventofcode.common.Day; +import com.sbaars.adventofcode.common.grid.NumGrid; import com.sbaars.adventofcode.year22.Day2022; +import java.awt.*; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + public class Day12 extends Day2022 { public Day12() { super(12); } public static void main(String[] args) { - new Day12().printParts(); + Day d = new Day12(); + d.downloadIfNotDownloaded(); + d.downloadExample(); + d.printParts(); +// System.in.read(); +// d.submitPart1(); +// d.submitPart2(); } @Override public Object part1() { - return ""; + NumGrid g = input(); + return findExit(g.find('S'), g); + } + + public NumGrid input() { + return new NumGrid(Arrays.stream(dayGrid()).map(e -> new String(e).chars().mapToLong(f -> f).toArray()).toArray(long[][]::new)); + } + + private long findExit(Point p9, NumGrid g) { + Set visited = new HashSet<>(); + Set currentLevel = new HashSet<>(); + currentLevel.add(p9); + visited.add(p9); + + long steps = 0; + while(!currentLevel.isEmpty()){ + Set level = new HashSet<>(currentLevel); + currentLevel.clear(); + for(Point p : level) { + long current = g.get(p); + if(current == 'S') current = 'a'; + for(Point p2 : g.streamDirs(p).toList()) { + if((current == 'y' || current == 'z') && g.get(p2) == 'E') return steps+1; + if(g.get(p2) <= current+1 && visited.add(p2)) { + currentLevel.add(p2); + } + } + } + steps++; + } + return Long.MAX_VALUE; } @Override public Object part2() { - return ""; + NumGrid g = input(); + return g.findAll('a').filter(p -> p.y == 0).mapToLong(p -> findExit(p, g)).min().getAsLong(); } } diff --git a/src/main/resources/2022-day10-part3/Joost.txt b/src/main/resources/2022-day10-part3/Joost.txt new file mode 100644 index 00000000..7810db4a --- /dev/null +++ b/src/main/resources/2022-day10-part3/Joost.txt @@ -0,0 +1,221 @@ +addx 4 +addx 1 +addx -1 +addx 6 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx -38 +addx 2 +addx 1 +addx -1 +addx 6 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 1 +addx 3 +addx 2 +addx 2 +addx 2 +addx 2 +addx -38 +addx 2 +addx 1 +addx -1 +addx 6 +addx -1 +addx 1 +addx 6 +addx 1 +addx 0 +addx 5 +addx 2 +addx -1 +addx 1 +addx 3 +addx 2 +addx 5 +addx 2 +addx 2 +addx 2 +addx -38 +addx 2 +addx 1 +addx -1 +addx 5 +addx -1 +addx 5 +addx 3 +addx -1 +addx 5 +addx -2 +addx 5 +addx 3 +addx 2 +addx 1 +addx -1 +addx 6 +addx 2 +addx 2 +addx 2 +addx -38 +addx 2 +addx 1 +addx -1 +addx 5 +addx 3 +addx 1 +addx -1 +addx 2 +addx 6 +addx -1 +addx 4 +addx -1 +addx 6 +addx 1 +addx 3 +addx 2 +addx 2 +addx 2 +addx 2 +addx -38 +addx 2 +addx 1 +addx -1 +addx 5 +addx 3 +addx 1 +addx -1 +addx 2 +addx 6 +addx -1 +addx 5 +addx -1 +addx 5 +addx 1 +addx 3 +addx 2 +addx 2 +addx 2 +addx 2 +addx -38 +addx 2 +addx 1 +addx -1 +addx 5 +addx 3 +addx 1 +addx -1 +addx 2 +addx 6 +addx -1 +addx 5 +addx 1 +addx -1 +addx 5 +addx 3 +addx 2 +addx 2 +addx 2 +addx 2 +addx -38 +addx 2 +addx 1 +addx -1 +addx 5 +addx -1 +addx 5 +addx 3 +addx -1 +addx 5 +addx -2 +addx 6 +addx 2 +addx -2 +addx 5 +addx -1 +addx 6 +addx 2 +addx 2 +addx 2 +addx -38 +addx 2 +addx 1 +addx 3 +addx 2 +addx -1 +addx 2 +addx 5 +addx 1 +addx 0 +addx 1 +addx 5 +addx 0 +addx 5 +addx 2 +addx -1 +addx 5 +addx 2 +addx 2 +addx 2 +addx -38 +addx 2 +addx -1 +addx 5 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx -38 +addx 1 +addx -1 +addx 6 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +addx 2 +noop +noop \ No newline at end of file diff --git a/src/main/resources/2022-examples/day12-1.txt b/src/main/resources/2022-examples/day12-1.txt new file mode 100644 index 00000000..86e9cac3 --- /dev/null +++ b/src/main/resources/2022-examples/day12-1.txt @@ -0,0 +1,5 @@ +Sabqponm +abcryxxl +accszExk +acctuvwj +abdefghi diff --git a/src/main/resources/2022-examples/day12-2.txt b/src/main/resources/2022-examples/day12-2.txt new file mode 100644 index 00000000..c8abdb5e --- /dev/null +++ b/src/main/resources/2022-examples/day12-2.txt @@ -0,0 +1,5 @@ +v..v<<<< +>v.vv<<^ +.>vv>E^^ +..v>>>^^ +..>>>>>^ diff --git a/src/main/resources/2022/day12.txt b/src/main/resources/2022/day12.txt new file mode 100644 index 00000000..4994f180 --- /dev/null +++ b/src/main/resources/2022/day12.txt @@ -0,0 +1,41 @@ +abccccccccccccccccaaccccccccccccccccccccaaaaaaaaaaaaacccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaaa +abcccccccccccccaaaaaccccccccccccccccccccaaaaaaaaaaaaaccccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaa +abccccccccccccccaaaaaccccccccccccccaaaaacccaaaaaacccccaaccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaa +abccccccccccccccaaaaacccccccccaacccaaaaacccaaaaaaaccccaaaacaacaaccccccccccccccccccccccccaaaccccaaaccccccccccccaaaa +abcccccccccccccaaaaacccccccaaaaaccaaaaaacccaaaaaaaacaaaaaacaaaaaccccccccccccccccccccccccaaacccaaaaccccccccccccaaac +abccccccaacaaaccccaaccccccccaaaaacaaaaaaccaaaacaaaacaaaaaccaaaaaaccccccccccccccccccccccccaaaaaaaacccccccccccccaacc +abccccccaaaaaaccccccccccccccaaaaacaaaaaaccaaaaccaaaacaaaaacaaaaaacccccccccccccccccccccccaaaaaaaaaccccccccccccccccc +abccccccaaaaaacccccccccccccaaaaaccccaaccccaacccccaaccaacaacaaaaaccccccccccccccccccccccccccaaakkkkllllcccaaaccccccc +abccccccaaaaaaacccccccccccccccaaccccaacccccccccccccccccccccccaaaccccccaaaacccccccccjjjjkkkkkkkkkkllllccccaacaccccc +abcccccaaaaaaaacccccaaccccccccccccccaaaaaaccccccccccccccccccaaccccccccaaaaccccccccjjjjjkkkkkkkkkppllllcccaaaaacccc +abcccccaaaaaaaaccaaaacccccccccccccccaaaaaccccccccccccccccaacaaccccccccaaaacccccccjjjjjjjkkkkkppppppplllccaaaaacccc +abccccccccaaaccccaaaaaacccccccccccaaaaaaaccccccccccccccccaaaaacccccccccaacccccccjjjjoooooooppppppppplllcccaaaccccc +abccccccccaaccccccaaaaaccccaacccccaaaaaaaaccccaaacccccccccaaaaaaacccccccccccccccjjjooooooooppppuuppppllcccaaaccccc +abccccccaacccccccaaaaacccccaaaccaaaaaaaaaaccaaaaaaccccccaaaaaaaaaacaaaccccccccccjjjoooouuuoopuuuuupppllcccaaaccccc +abacccccaaccccccccccaacccccaaaaaaaccaaaaaaccaaaaaaccccccaaaaaccaaaaaaaccccaaccccjjoootuuuuuuuuuuuuvpqlllcccccccccc +abaccaaaaaaaacccccccccccccccaaaaaaccaacccccccaaaaacccccccacaaaccaaaaaaccaaaacaccjjooottuuuuuuuxyuvvqqljjccddcccccc +abcccaaaaaaaaccccccccccccaaaaaaaaacaacaaccccaaaaaccccccccccaaaaaaaaaacccaaaaaacciijootttxxxuuxyyyvvqqjjjjdddcccccc +abcccccaaaaccccaaacccccccaaaaaaaaacaaaaaccccaaaaaccccccccccccaaaaaaaaacccaaaaccciiinntttxxxxxxyyvvqqqqjjjddddccccc +abccccaaaaaccccaaaaacccccaaaaaaaaaaaaaaaaccccccccccccccccccccaaaaaaaaaaccaaaaccciiinntttxxxxxxyyvvvqqqqjjjdddccccc +abccccaaaaaaccaaaaaccccccccaaaaaaaaaaaaaacccccccccccccccccccccccaaacaaacaacaaccciiinnnttxxxxxyyyvvvvqqqqjjjdddcccc +SbccccaaccaaccaaaaacccccccccaaaaaaaaaaaaacccccccccccccccccccccccaaacccccccccccciiinnntttxxxEzzyyyyvvvqqqjjjdddcccc +abcccccccccccccaaaaacccccccaaaaaaaaacaaaccccccccccccccccccccccccaaccccccccccccciiinnnttxxxxyyyyyyyyvvvqqqjjjdddccc +abcccccccccccccaaccccccccccaaaaaaaaccccccccccccccccccccccccccccccccccccccccccciiinnntttxxyyyyyyyyyvvvvqqqjjjdddccc +abccccccccccccccccccccccccaaaaaaaacccccccccccccccccccccccccccccccccccccccccccciiinntttxxxwwwyyywwvvvvrqqjjjjdddccc +abcccccccccccccccccccccccccccaaaaaaccccccccccccccccccccccccccccccccccccccccccciinnntttxwwwwwyyywwvvvrrrqkkkeddcccc +abcccccccccccccccccccccccccccaaaaaaccccccccccccccccccccccccccccccccccccccccccchhnnntttsswwswwyywwrrrrrrkkkkeeecccc +abcccccccccccccccccccccccccccaaaaaacccccccccccccccccccaccccccccccccaaacccccccchhhnmmssssssswwwwwwrrrkkkkkeeeeecccc +abcccccccccccccccccccccccccccccaaacccccccccccccccccccaaccccccccccaaaaaacccccaahhhmmmmmsssssswwwwrrrkkkkkeeeeeccccc +abaacccccccccccccaccccccccccccccccccccccccccccccccaaaaacaacccccccaaaaaacaaaaaahhhhmmmmmmmmssswwwrrkkkkeeeeeacccccc +abacccccccccccccaaaaaaaaccccccccaaacccccccaaccccccaaaaaaaacccccccaaaaaacaaaaaaahhhhmmmmmmmmsssrrrrkkkeeeeeaacccccc +abaaaccccaaccccccaaaaaacccccccccaaacccaacaaaccccccccaaaacccccccccaaaaacccaaaaaaahhhhhhhmmmmlsssrrllkfeeeeaaaaacccc +abaaaccaaaaccccccaaaaaacccccccccaaaaaaaaaaaaaacccccaaaaacccccccccaaaaacccaaaaaaachhhhhgggmllsssrrllkffeaaaaaaacccc +abaacccaaaaaacccaaaaaaaacccccaaaaaaaaaaaaaaaaacccccaacaaacccccccccccccccaaaaaacccccchggggglllllllllfffaaaaaaaacccc +abaaccccaaaacccaaaaaaaaaaccccaaaaaaaaacaaaaaaaccaccaccaaacccccccccccccccaaaaaacccccccccgggglllllllffffaaaaaacccccc +abcccccaaaaacccaaaaaaaaaacccccaaaaaaaccaaaaacccaaaccccccccccccccccccccccccccaacccccccccagggglllllffffccccaaacccccc +abcccccaacaaccccccaaaaacaccaacccaaaaaaaaaaaaaccaaacccccccccccccccccccccccccccccccccccccaagggggffffffcccccccccccccc +abcccccccccccaaaaaaaaacccccaaccaaaaaaaccaaaaacaaaaccccccccccccccccccccccccccccccccccccaaaacgggfffffccccccccccccccc +abcccccccccccaaaaacaacccaaaaaaaaaaccaacccaaaaaaaacccaaccccccccccccccccccccccccccccccccccccccggfffccccccccccccaaaca +abccccccccccaaaaaaccccccaaaaaaaaacccccccccaaaaaaaaaaaacccccccccccccaaaccccccccccccccccccccccaaaccccccccccccccaaaaa +abccccccccccaaaaaaccccccccaaaacccccccccccccaaaaaaaaaaaaccccccccccccaaaaccccccccccccccccccccccaaaccccccccccccccaaaa +abcccccccccccaaaaacccccccaaaaaaccccccccccaaaaaaaaaaaaaaccccccccccccaaaaccccccccccccccccccccccccccccccccccccccaaaaa From 50f1d9892dfe0cf416675d05ba3e77c7882222ed Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Mon, 12 Dec 2022 19:21:27 +0100 Subject: [PATCH 375/433] Prepare 2022 day 13 --- .../com/sbaars/adventofcode/year22/days/Day12.java | 14 +++----------- .../com/sbaars/adventofcode/year22/days/Day13.java | 9 ++++++++- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day12.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day12.java index cdb2ced5..ba0788bc 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day12.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day12.java @@ -1,6 +1,5 @@ package com.sbaars.adventofcode.year22.days; -import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.common.grid.NumGrid; import com.sbaars.adventofcode.year22.Day2022; @@ -15,13 +14,7 @@ public Day12() { } public static void main(String[] args) { - Day d = new Day12(); - d.downloadIfNotDownloaded(); - d.downloadExample(); - d.printParts(); -// System.in.read(); -// d.submitPart1(); -// d.submitPart2(); + new Day12().printParts(); } @Override @@ -40,7 +33,7 @@ private long findExit(Point p9, NumGrid g) { currentLevel.add(p9); visited.add(p9); - long steps = 0; + long steps = 1; while(!currentLevel.isEmpty()){ Set level = new HashSet<>(currentLevel); currentLevel.clear(); @@ -48,13 +41,12 @@ private long findExit(Point p9, NumGrid g) { long current = g.get(p); if(current == 'S') current = 'a'; for(Point p2 : g.streamDirs(p).toList()) { - if((current == 'y' || current == 'z') && g.get(p2) == 'E') return steps+1; + if((current == 'y' || current == 'z') && g.get(p2) == 'E') return steps; if(g.get(p2) <= current+1 && visited.add(p2)) { currentLevel.add(p2); } } } - steps++; } return Long.MAX_VALUE; } diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java index 25c1cf90..5760c737 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java @@ -1,5 +1,6 @@ package com.sbaars.adventofcode.year22.days; +import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year22.Day2022; public class Day13 extends Day2022 { @@ -8,7 +9,13 @@ public Day13() { } public static void main(String[] args) { - new Day13().printParts(); + Day d = new Day13(); + d.downloadIfNotDownloaded(); + d.downloadExample(); + d.printParts(); +// System.in.read(); +// d.submitPart1(); +// d.submitPart2(); } @Override From 8f93464272030a0cb4f0157accfa69c6fadced40 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Tue, 13 Dec 2022 07:21:03 +0100 Subject: [PATCH 376/433] Day 13 2022 --- .../sbaars/adventofcode/common/Either.java | 51 ++ .../adventofcode/year22/days/Day13.java | 81 +++- src/main/resources/2022-examples/day13-1.txt | 23 + src/main/resources/2022-examples/day13-2.txt | 64 +++ src/main/resources/2022/day13.txt | 449 ++++++++++++++++++ 5 files changed, 666 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode/common/Either.java create mode 100644 src/main/resources/2022-examples/day13-1.txt create mode 100644 src/main/resources/2022-examples/day13-2.txt create mode 100644 src/main/resources/2022/day13.txt diff --git a/src/main/java/com/sbaars/adventofcode/common/Either.java b/src/main/java/com/sbaars/adventofcode/common/Either.java new file mode 100644 index 00000000..66cd6ad6 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/common/Either.java @@ -0,0 +1,51 @@ +package com.sbaars.adventofcode.common; + +import java.util.Objects; +import java.util.Optional; + +import static com.google.common.base.Preconditions.checkState; + +public class Either { + private final Optional a; + private final Optional b; + + public Either(A a, B b){ + checkState(a == null || b == null); + this.a = Optional.ofNullable(a); + this.b = Optional.ofNullable(b); + } + + public A getA() { + return a.get(); + } + + public B getB() { + return b.get(); + } + + public boolean isA(){ + return a.isPresent(); + } + + public boolean isB(){ + return b.isPresent(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Either either = (Either) o; + + if (!Objects.equals(a, either.a)) return false; + return Objects.equals(b, either.b); + } + + @Override + public int hashCode() { + int result = a != null ? a.hashCode() : 0; + result = 31 * result + (b != null ? b.hashCode() : 0); + return result; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java index 5760c737..810cafa2 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java @@ -1,8 +1,14 @@ package com.sbaars.adventofcode.year22.days; import com.sbaars.adventofcode.common.Day; +import com.sbaars.adventofcode.common.Either; import com.sbaars.adventofcode.year22.Day2022; +import java.util.*; + +import static java.util.Optional.of; +import static java.util.Optional.empty; + public class Day13 extends Day2022 { public Day13() { super(13); @@ -18,13 +24,84 @@ public static void main(String[] args) { // d.submitPart2(); } + public record Node (Either, Integer> value) {} + @Override public Object part1() { - return ""; + var in = day().split("\n\n"); + List indices = new ArrayList<>(); + for(int i = 0; i e).sum(); + } + + public int[] findLevels(String str) { + Map m = Map.of(']', '['); + int[] levels = new int[str.length()]; + Stack s = new Stack<>(); + for(int i = 0; i= '0' && s.charAt(0) <= '9') return new Node(new Either<>(null, Integer.parseInt(s))); + if(s.equals("[]")) return new Node(new Either<>(new ArrayList<>(), null)); + int currentLevel = levels[0]; + List commas = new ArrayList<>(); + commas.add(0); + for(int i = 0; i subNodes = new ArrayList<>(); + for(int i = 1; i(subNodes, null)); + } + + public Optional compare(Node a, Node b) { + if(a.value.isB() && b.value.isB()) { + int na = a.value.getB(); + int nb = b.value.getB(); + if(na < nb) return of(true); + else if(na > nb) return of(false); + else return empty(); + } else if(a.value.isA() && b.value.isA()) { + List na = a.value.getA(); + List nb = b.value.getA(); + if(na.isEmpty() && !nb.isEmpty()) return of(true); + else if(!na.isEmpty() && nb.isEmpty()) return of(false); + else if(na.isEmpty() && nb.isEmpty()) return empty(); + else return compare(na.get(0), nb.get(0)).or(() -> compare(new Node(new Either<>(na.subList(1, na.size()), null)), new Node(new Either<>(nb.subList(1, nb.size()), null)))); + } else if(a.value.isA()) return compare(a, new Node(new Either<>(List.of(b), null))); + else return compare(new Node(new Either<>(List.of(a), null)), b); } @Override public Object part2() { - return ""; + var in = Arrays.stream((day()+"\n[[2]]\n[[6]]").replace("\n\n", "\n").split("\n")) + .map(s -> node(s, findLevels(s))) + .sorted((a, b) -> compare(a, b).map(c -> c ? -1 : 1).orElse(0)) + .toList(); + return (in.indexOf(new Node(new Either<>(List.of(new Node(new Either<>(List.of(new Node(new Either<>(null, 2))), null))), null))) + 1) * (in.indexOf(new Node(new Either<>(List.of(new Node(new Either<>(List.of(new Node(new Either<>(null, 6))), null))), null))) + 1); } } diff --git a/src/main/resources/2022-examples/day13-1.txt b/src/main/resources/2022-examples/day13-1.txt new file mode 100644 index 00000000..af73fbbb --- /dev/null +++ b/src/main/resources/2022-examples/day13-1.txt @@ -0,0 +1,23 @@ +[1,1,3,1,1] +[1,1,5,1,1] + +[[1],[2,3,4]] +[[1],4] + +[9] +[[8,7,6]] + +[[4,4],4,4] +[[4,4],4,4,4] + +[7,7,7,7] +[7,7,7] + +[] +[3] + +[[[]]] +[[]] + +[1,[2,[3,[4,[5,6,7]]]],8,9] +[1,[2,[3,[4,[5,6,0]]]],8,9] diff --git a/src/main/resources/2022-examples/day13-2.txt b/src/main/resources/2022-examples/day13-2.txt new file mode 100644 index 00000000..273a7e2e --- /dev/null +++ b/src/main/resources/2022-examples/day13-2.txt @@ -0,0 +1,64 @@ +== Pair 1 == +- Compare [1,1,3,1,1] vs [1,1,5,1,1] + - Compare 1 vs 1 + - Compare 1 vs 1 + - Compare 3 vs 5 + - Left side is smaller, so inputs are in the right order + +== Pair 2 == +- Compare [[1],[2,3,4]] vs [[1],4] + - Compare [1] vs [1] + - Compare 1 vs 1 + - Compare [2,3,4] vs 4 + - Mixed types; convert right to [4] and retry comparison + - Compare [2,3,4] vs [4] + - Compare 2 vs 4 + - Left side is smaller, so inputs are in the right order + +== Pair 3 == +- Compare [9] vs [[8,7,6]] + - Compare 9 vs [8,7,6] + - Mixed types; convert left to [9] and retry comparison + - Compare [9] vs [8,7,6] + - Compare 9 vs 8 + - Right side is smaller, so inputs are not in the right order + +== Pair 4 == +- Compare [[4,4],4,4] vs [[4,4],4,4,4] + - Compare [4,4] vs [4,4] + - Compare 4 vs 4 + - Compare 4 vs 4 + - Compare 4 vs 4 + - Compare 4 vs 4 + - Left side ran out of items, so inputs are in the right order + +== Pair 5 == +- Compare [7,7,7,7] vs [7,7,7] + - Compare 7 vs 7 + - Compare 7 vs 7 + - Compare 7 vs 7 + - Right side ran out of items, so inputs are not in the right order + +== Pair 6 == +- Compare [] vs [3] + - Left side ran out of items, so inputs are in the right order + +== Pair 7 == +- Compare [[[]]] vs [[]] + - Compare [[]] vs [] + - Right side ran out of items, so inputs are not in the right order + +== Pair 8 == +- Compare [1,[2,[3,[4,[5,6,7]]]],8,9] vs [1,[2,[3,[4,[5,6,0]]]],8,9] + - Compare 1 vs 1 + - Compare [2,[3,[4,[5,6,7]]]] vs [2,[3,[4,[5,6,0]]]] + - Compare 2 vs 2 + - Compare [3,[4,[5,6,7]]] vs [3,[4,[5,6,0]]] + - Compare 3 vs 3 + - Compare [4,[5,6,7]] vs [4,[5,6,0]] + - Compare 4 vs 4 + - Compare [5,6,7] vs [5,6,0] + - Compare 5 vs 5 + - Compare 6 vs 6 + - Compare 7 vs 0 + - Right side is smaller, so inputs are not in the right order diff --git a/src/main/resources/2022/day13.txt b/src/main/resources/2022/day13.txt new file mode 100644 index 00000000..cca24670 --- /dev/null +++ b/src/main/resources/2022/day13.txt @@ -0,0 +1,449 @@ +[[[],10,[[6],[]],3,1]] +[[6,8,[9,2],7,2],[[10,[4],[6,2,9,2],[8,8,9]],8,[4],[[0,2]]]] + +[[10,[[2,3,9,10],[8,4,3,8]],2,2,[8,8,2,[2,0,9]]],[[[2,0,7,4,2]],9,[[3,8,7,3]],3,9]] +[[1],[[]],[1,[]]] + +[[[[10,4,9,5],[9,10,0,2],8,[],1],3,[4],1],[6]] +[[[[10,5,2,0]],10],[[[8,6],8,[3],[4],0]],[2,10,[9,[]],9,2],[1,3,[1,[4,9,9],[7,2,1,0],[5,2,6,1]]],[[[4,9,1,7,2]]]] + +[[2],[],[],[3,10,6,0,[0,[7,2,8],4]]] +[[],[0,[0,7],5,[7,[9],9],1],[[[],4,[],[7,1],[4,9]],[],[1,10],0,[]],[]] + +[[],[2],[[[10,8,5,6,1],7,3,[5]],[[2,9,7,7],1],[[0,1,0],[0],1,10,[8,10,4]],0],[[],7,[[10,9,5,6,3],3],[[1,1,6,9],6,3]],[6,[[5,4]],[]]] +[[4,3],[[2,8,[8,5]],[3],[1,[10],7,[10,2,5,6]]],[6]] + +[[],[[],[3],[0,6,5,10],[]],[],[[]]] +[[2,[],8,[3,2,8,3]]] + +[[3,7,10,6,[[6,2,3,10],[],[6],[2,10,9]]],[[[4,8,9],[10,0,1],0,0,[7,1,10,2,5]],4,9,9],[10],[[]]] +[[[8,9,[3,8,3,2],2,7],4,[[4,3,2,0],1,[8,6],[]]],[]] + +[[],[[[],6,5],[[8,5],1,[6,2],8,6]],[[2,[],7,6,[7]],[6,10,[],10,[9,4,9,6]],[1,1,4,[5,8],0],7],[0,10,1],[7,[[3,3,9],8,[],[2]]]] +[[3,9],[],[6,10,[[4,3,2,8],2],[1,[],[5,9,10],9,[7,6]],[2,[4,10],5]],[5]] + +[[10,6]] +[[[[],[],3,[0,6],9]]] + +[[7,4],[[[]],8,[[],3,7,[0,10],[8,7]]],[[8,10,8],6,[],4,[7,8,[2]]],[[[10,9],2,7,[],4]],[]] +[[[[7],4,5,5,[2,0,8]],0,[[10,5,8],[5,8,3,7],[5,10,6,3],2],7]] + +[[[],[[10,1,3,0,2],[]],2,[[2]]]] +[[4,6,7,5],[[[10,10,8],10,[],10],1,10,[[],4,[],[7,6,8,4]],7],[5,9],[5,[[9,6],[10],2,[2,7,6,6,9]],2,8,[[8],7,2,8]],[]] + +[[8,[[10],[9],[8,10,10],[6,0,6,10,1]]],[[10,[10],[8,3,6,7,2]],[],[],0,10]] +[[],[3,8],[[[2,4,1,10,0],0,2,[10,8]]],[[[8,10],10],[]]] + +[[[1,[7,3,10],8,10,[10]],[6,1]],[0],[[[9],2,[]],10,[],6,[[],2]]] +[[[10,9,7]],[7,4,[[5,5,10,6,10]],[[10,3],4,[7]],8],[[2,[1,4,5]],2,[[],0,1]],[],[0,[[10,2,6,1,4],[6,4],6,3,6],[[8],2]]] + +[[],[[[8,8,6,6,10],[9,4,3,7],[5,2],[2,0,7,8]],[5,0,[5,4],3,2],2,9,[]],[6]] +[[[4,9,1],[4,0,[1]],[[4,1,6,6],[6,8,10,5],8,10,3],[]],[3,4,7],[5,3,[6,[0,1,8,1],8,[6,10]],[],5],[],[1,[[3,7]],4,[[3]]]] + +[[],[10],[[7,[7],1],[[6,8],3]],[3,6,1,4,[1,[],10,3,0]],[[[9,2],[],[8,5,3],9],4,10,10,6]] +[] + +[[[[],[10,2,0]],[3]],[[1,10,4,6],1,[]],[2,[8,[3,4,0,9],5],[4,2],[4,5,[8]],4],[[[0],0,9],9,3],[8,10,[[5,8,2,9],[6,9,3,5,2],[9,4]],9]] +[[9,6,4,8,5],[[3,[7],8,1],5],[9,[[3,0,4,1,8],[2,5],[7,0,1],9]],[10,[[7,3,5,7,6]]]] + +[[8],[2,[],[4,4],7]] +[[[[6,0,4,3],0,[],[2],5],[[8],[4,8]]],[8,[[2,9,10,9,2],0],[],[[2,6],4,[8,0,0,1]]],[[4,1,10,1,3],[[5,2,7,10],[0,3,2,0,8],[2],[4,8,6,2],2],[10,5,6,[],[10,6,1,3,4]],9],[2],[[[2,2,2,6,9],8],[[],[0]]]] + +[[5]] +[[[[8],10,[4,8],[7,3,6]],6,3,8],[9,[]],[[[]],[],[[7,5,10,1]]],[0,[[0],[],4],[],[[6,10,5,1,10],[2,7],[2,5,3],7,[]]],[6,[3,2,[],[6,7]],[[]]]] + +[[],[9,9,[[5,7,9],[8,9,10],8,[3,8,2],[9,7,10,8]],1],[],[],[9,[[2,5,2,1,6]]]] +[[0,4,[9]]] + +[[],[],[7,9,0,[],[2,3]],[10,4],[[],[4],[0,[1,0,7,4,8]]]] +[[[[0,8,3,7,3],[2]],[[1,5]],5,8]] + +[[9,[[]],[2,[5,10]]],[[],6,[3],[[0,5],8,4,1,[2,10,10]]],[3,1],[1,2,[],[5,[0,10],[4,10,3,2,8]],10]] +[[0,10,[[6,1,4,10],2,3,[6,1,1],[]],[[10,5,3]],3],[],[]] + +[[0,7,[1,[],4,2]],[5],[9],[[[6,1,0,6,10],[10,3,7,8,5],2]]] +[[],[[],2]] + +[[[5,10,6,4,4],0,[6,10,[7]],[[3,9,3,10,5]]],[0],[[[3,7,2,2],[7,4,10,4,8]],[10,10,5,7,3],[[2,10],[5,3,0,2,0],[6,3,6],[9,0,4,6,6],5],3,[]],[[[5]],4,[1,9]]] +[[],[[2,[1,1,5,4,9],[7],[3,9,3],6],[10,2,[],3]],[[],[],5]] + +[[[3,[1,1,1,0],[8,3,3]],[8,[0,5]],8]] +[[[7,5,8,[9,0,10,10,0],[1,4,0,1]],2,3],[[5],[]],[4,[5,[]],[9,1,[5,6],[9,0,2,3,7],6],2,[[4,9,9,2,5],7]],[0,[5,8],[],0,[0,5]],[[[5],10],7,[8]]] + +[[[]],[[[5,10,3],7,7,9,[8,9,3,7,2]],4]] +[[4,8,[5,[7,7,3,8]],[10,1,[8,7]],6],[[6,7,[1]],[[]],10],[[],6,[]],[[[10,1,10],[7,5,0,6,3],[5]],1,[[0,6,4,3],[10]],[3,3,6,[2,7,1,9]]]] + +[[5,7,[]],[4,[[1,4,1,5,8]]]] +[[6,6],[3,4,8,8,[5,[6],10,9]],[[],4,[5,4,[7,6,9,10],9],9,[[4,3,1,6,2],[10,3],[]]],[[[7,1],8,[10,8],[9]],[[1],[1],[0,8,6,4]],[9,[8],8,1],[],[[4,2],[8,4,3,6],[0],10,[3,8,6]]],[7,[3,5],[1,[0],6],[7,8,[],1],[[9,10,6,4],[10,1],3,7,3]]] + +[[],[3,[8],[6],[]]] +[[5,8,[9,[8,10,5,8],6,[3,6,1]],[2,2]],[],[9,[],[[],[8,4],[8,4,5,7,6],7,7]],[],[1,[10,6,[10],[1,7,5,10],[3]]]] + +[[2],[[5],4,[[],[0,6],4]]] +[[[],10,[9],[[8]],[4,[0,6,10,6,6],1,3]],[[],[2,[5,9]],[[9]],8,[1,4,5,[],[]]],[[5,[2],7,[],9],[]],[],[10,[1,[],4,2,[]],[7,[],7,[6,6]],1]] + +[[],[0,[[6,7,7,8],7],[[7,9],0,3,10]],[],[],[10,[0],[]]] +[[[1]],[],[[[0,1,6,3,9],[],3,6,[]],[7,7,0,[10,10,2]],[7,8,[6,3],10],[]],[[[],[],5,7,[2,0,2,2]]]] + +[[[[5,3,8,8]],8],[10,5,[]],[6,[],3,[[5,8,8],[1,10],[0]],5],[[[9,8,3]],[5,[9,7,9],4,[10,9,0,0,3]],5,[3],7],[[7,0,0],4]] +[[],[[6,0],10],[],[],[[3,5,7,[0,10,7,9,10],6],[[1,3,3,10],[1,2],[]],1,6,9]] + +[[5,2],[3,8],[9,[1,[10],[10,7]],10,[4,[],10,1,3]],[[[6,9,6,10,7],0,[],[6,1,2]],[[9],8,3]],[[5,[8,10,4,9],3,[9,8,9,5],6],[7,10],[4],1]] +[[10],[3]] + +[[7],[[],[[8,4,4],1],8,9],[],[0],[[3],[[2,7,0,5,6],[8,3,7],[9]],[[1,0,2,3]],7,3]] +[[4,[6],[[2],9,8],[1,[5,9,1,10,10],9,[7,4,1],2],[8,[1],[10,7],0]],[[[],10]],[],[6,7,[10,10]],[10,5,4,5]] + +[[],[[6,9,[8,0],[10,8,0,8,4]],1]] +[[[6],[[],[],[1,9],[]],8],[[6],6,5,[[8,7,1]]],[[4,[4,5],[3],[10,8,9,8,6]],1,8,[1],[9,9,[10,3,3],[8,0,7,2]]],[8,[7,9,[6,2,5,2,9],5],8,[[]],3],[5,[10,[1,0,3,2],8,[0]],2]] + +[[[3,[0,7,4,6,7],[],8,[8,5,6,10]],[],2,[7],[[]]],[],[[[3,9,2,2],[8,1,1,7,4],[10,1,0]],[8],5,8],[5,3],[5,2,[[],[3,2,1,4]]]] +[[[1,[9,9,4],8,7,[3,3,9,2]],1,2]] + +[[[[10,0,0],[0,4,0,1],8,[3,4,1],[7,4,0,7]],[7,[3,5,6,3,10],7,[],9]],[],[2,[[9,8,1,0,4],1],[1]]] +[[[],4,0],[],[[9,4,[9,3,6,1,5]],[3],[]]] + +[[7,[[9,3],2,[9,10,6]]],[7,0,10],[[5,[]],7],[5],[10,[2,2,[],5,4],5]] +[[[9,3,10,4]],[],[],[[[5,4],[9,5]],[9,[]],8,10,5]] + +[[[7],3],[[[3,5,10,8,4],3,0,8],0,0],[9,[[6],[9,7,1],[9,6,2],[9,0]]],[]] +[[0,[[5,9,4],7],9,[2,[3,1],9]],[],[[[6],2,[2],[6,5]],4,8,6],[[],[]],[4,[[],10,8,4]]] + +[[[3,[10,9,5,6],7]],[[1,7,[1,5,7,9]],[4,4]]] +[[],[[],[1,[10]],[4,6,[8,8],[5,4,0,9]],0,[8,3]],[[[8,5,5,7,6],2,[4,10,5,9]],[[6,5,10,9,9],9,6],[]]] + +[[[[5,10,0,7]],5,3]] +[[[[5,7,2],5,7],[[9,7,3]]],[[1,[8,3,3,4,10],[0,10,4]],1,0],[7,1,[[8,4,5],[5,4],5,[10,3,10,9],[3]],1,[7]]] + +[[[7,6,[],3,[0]],[[10],0,[],2],[],[5,3,4,[9]],[[],3]],[[[2,6,10],4],[[],[4,1,2],[10,3,6,8,9]],7,7],[]] +[[1,0,[[7,7,6,2],10],[],[2,[],1,4]]] + +[[2,[8,[8,7,5],0,4],[7,2]],[[[10,2,2,0,8]],10,[[6],[7,9,3,0,10],9,[9,3]],[4,[2,5],[4,1,0,7],5]],[]] +[[],[7,4,[[6,5],[5,5,7,6,3],[0,2,7,6,3],4]],[[[6,4,2,4,4],10,3]]] + +[[[1,2,6,[9,1,8,10],1],[],3,[],1],[9],[[[9],[],6],0,[]],[],[]] +[[7,10],[5,[]],[[[7],5],[[3,9,9,5],[],8,[0,1]],[],[[0,5,6,4]]],[3,0,[9,[9,6,6],[0,5,3,5]],[[],4,2]],[10,1]] + +[[[[0],[5,5,0,3,6],10,4,7]],[0]] +[[[[6,6,7,10,8],[4,8,3,5],[1,4]],[[9],7,10,8,[4]],6,[],[0]],[10,[]],[4,[4,[],[]],0,[9,[0,7],[9,4,2,5,2],[9]]],[[[9,7,4,6,0]],[1,2,[3],[8,4,1,10,0],2],2,[10,0],1]] + +[[[[6]],[[9,0,2,4,5]],3,[[6,5,3],9,2,[10,7,0],0]],[0],[3],[]] +[[],[1,[]],[],[[],[[]],8,9,3],[10,[1,[],[5,6,10],[6,4]],[9]]] + +[[5],[2,2,[[5,6,3,10],[4,2,8,9,5],[10,6,9],[2,8],6],1,[[],[7,3,5,3],0]],[[[7,3],[4,0,5,8,2],5,2,[6,1,5,10,4]],[],1,4],[2]] +[[8,[[0,6,8,4,0]],0,[0,3,[8,3,9,4,0],2],7],[1,7,4,5],[[[7,6,9,1,2],10],[[9],2,9,[7,1],10],7,[6,8]]] + +[[1,4,9,9],[[[10],[],4,3,3],2,8],[9,[],8],[[9,7,[1,5],[10,8,1,0]],[]]] +[[5,2,2,[9,10,5,10,[2,6,10,10]],[2,2,0,[],8]],[[8,[4],6,9,[2]],6,[2],3],[10,[[8,0,0,5,9],[5,1,1,0,7],[9,10,0],6,[5]],3,2],[4,[8,[1],[4,0,3]],4,7,[[9,6,6,7],0]]] + +[[[[]],6,1,[[6,9,2,10],[]]],[6,[[4,6],9,[4],[0],[2,2,6,7,8]],[2,1]],[[[10,9,2],5,[6],5,10],[7,6,6,[],5],9,[]]] +[[[1,6,[5,0,2,3],[2]],[]],[10,0,[[0,0,1]],[[6,1,8,6],6,[10,9]]],[4],[5,0]] + +[[],[[[2,2],[9],0,5],[[8,3,9],8,[],0]],[8,9,[[4,0,7],6,[],8],[3,[],0,[4,4]],4],[[9],1,[]]] +[[[[7,0,4,3,4],[],0,[10,6,5]]],[[[9,4,8,7,9],[8,10],5,[7,0,4],[9,5,0,7,6]]],[],[[9,6,[8,0,7,2],[]],3,1],[[[3,0,10,1,0],[5,2,1,5,2]],[[7,3,2],[7,5,10,2],5,3]]] + +[[[[],[],[],4,10],[5,[],[7,2],[10,5,2]]]] +[[7,[[7,6,3],7],[9,3,[2]]],[[[3,5],[9,5],8],10,3,10,[1,2,5]],[4]] + +[[[8,[],0,[2,4,9,0,10],[7,5,2,10]],[[],[],8,10,[5]],1],[],[5,[4,[],[4,10,10,7,6],7,1],[[3,9,2]]]] +[[[[4,4,8,10,4],10,[9,9,6,2,10]],[7]],[10,[[0,2,2,1],[9,6,0]]],[[[0],[0,5]],1]] + +[[7,1],[],[[],[],[[5,0],[6,3,1,6],2],[[0,4,10,9]],[[],0]],[[[2],[4,7,3,0,5]],[[3,9,3,1],[1,8,10,7],[],3,[4,0,10,1,10]],[6,[4]],8,3],[6,[],[],10]] +[[[]],[1,10],[[[6,7,8,10],[6,0,4],[4,9],0,[3,0,1,7]]],[1,0,[9,[8,2,9]]]] + +[[1,2],[6,5,[0,6,[],1],4]] +[[],[[[10,3,8,1],[1,9,10,3,7],[9,7,1,7]],9,4,9,1]] + +[[],[[4,[10,10,7,9],[1]]],[[3,[],[10,5,3,1]],6],[[[],4,9,9],2,[2,[3],9]]] +[[],[],[[[3,10,4,7,0]],3,[7]],[[3,10,[6,5,2]],2,4],[3,[],[[10,3,8,7]]]] + +[[],[[[3,10,9,8,10],5,[5,4,10],5],3,7]] +[[[4],8,[9,[10,2,1],5],[5]],[5,9],[7,6,4],[]] + +[[8,9,2]] +[[[0,3],9,2,10,[[9,0,3,4],0,7,[2,4,5],[8]]],[[[],[10,0,1],[4,4,7]],7,10],[],[[[0,3,5,3,10],0,[7,2,7]],[[8,9,7,9],7,[]],[1,[3,6,4,2,5],[3],[6],[8,0,3,1]]],[[7,6,[5,6],8,[5,10,5]],[[],7,10,10]]] + +[[7],[[1,10],[2,5],6,[[3]],9],[]] +[[6],[[],6,4,[],[7,2,[8],[]]],[[6,3],8,8]] + +[[],[],[4,[[7,1,5,5,8],[0,10,3,6],[10,9,0]],[10]],[[[],[3,5,0,8],[9,1,6,9,4],[9,4]],8,2],[6,[7,3],2,[],0]] +[[[[2,0,4,6,9],[10,1,3,7,10]],0,[],10],[]] + +[[[[3,0],7,[10,2]]],[],[0,[],6,[],[[8,3,7],8,[2],5]],[[0,3,[]],7,8,3,[6]]] +[[[3],9,[[6],[],8,10,[]],1],[[]],[1,[8,0,[7,7,1,8],8],3],[0,[],[],[[],0,[2]]],[[9,[10,6],5],[[],7],[[9]]]] + +[[2,[8,3],[4,8,[6]]],[[[],3],[0,[9,6,2],5,10,0]],[[]]] +[[[7,6,3],[[5,3,2,3,10],[10,10,1],[4,1],[7,8,1,1,4]]]] + +[[[]],[[0,[7,8,6,6,7],6,[1,10]]]] +[[7,5,7],[8],[10,[0,5,7],3]] + +[[[[0,4],[3,1,0,0],[10,8,10]],[[]],[0,[7,8,2],[5,9,6]],7,[[1,8],[3,4,2],[10,8,7],7]]] +[[[1],7,0]] + +[[5,4,[[],5],[5,1,[7,8,1,7,9],[0,4,5,3],3],[[9,8],[1,3,0,0],6]],[8],[],[[0,[0,5,10],[3,8,8]],7,2,[10,[],7]],[6,[],[3,10,[0,2,0],[2,2,4],[0,7,0]]]] +[[[],8,7],[3,7],[]] + +[[[1,8,[4,6],7,9],[[4,0,10,6,3]],[[1,10,9,0,3],[1,3,0,0]],[1,0,8],4],[[[0],[8,6,6,2],3,4],[8,[2],9],[[2,10],[4,0,4],[8,1,2]]],[[[3,6,5,4,2],10,0,[9,9,0,1,8],[3,7,4]],9,[[6,9],[7,4,8,4],3],0],[0,[[3,6,7,9,7],[0],[],[2,7,10,1]],[[6,7,4,6,4],5,[6,10,0],[0,9,8,3,4]]],[[5,10]]] +[[[[1,3,5],0,[4,2,9]],[0],9,[[],[3,10],[],[3],[7,4]]]] + +[[0,[2,[8,5],9],4],[[],2,[6]],[4],[]] +[[1,[10,4,[],[2,6,3,10,6]],7,[[8,2,2]]],[[10,[],[8,4,6,10]],2],[1,[8,3,7,[2,0,1,3,10],5],[]]] + +[[[[2,8,4,8],9],5,[[],1,3,[2]],[8,4,[],5,[0]],0],[10,[],2,[1]],[[[10],1,[],[6,4,6,10]],[5,8,[4,4,5,7,8],[],[5,3,4]],5]] +[[8,5,0,[[2,8,6],0,[7,5],[8],[5,3,7]]],[],[],[[1,[4,0,10,5],[3,1,6,7]],3,[]],[[[9]],10,5]] + +[[5,[[9],6],[1,[10,6,0],[],9,[4,4,8,8]],6,5],[[],10,1],[[],[0,2,8,3,5],0,[[],5,[6,8,7,3,0],[5,3,9,9,6]],7]] +[[],[8,2,[2,[9,5]],[3,[],5,10]]] + +[[[[1,10,6],2,8,[1,9],3]],[[4,0,7,[2,6,4,10,8],[5,2,6,4,2]],4,[4,9],[2,[9,4],[],6],9],[],[]] +[[[6],5],[],[0,[7],[[10,0]]]] + +[[[3],6,7,[[],[9,3,8],[10,1,0,0,8],[7],[]]],[]] +[[0,4,10,[3,[7,6,5,0],[],4,[4,1,1]]],[[[4,8,6],[2],10,[9,3,4,8,5],6],[[7,5],6,3],3]] + +[[[[]],[[],5,[8],[6,8,4,6,3],[4,2,8,1]],[0,[3,4,9,5,3],1],[],7],[1,[9],[[0,1,5,5,9],[6,3,9,3],[7,4,10],9,3],7,5],[8,[[10,1,4],1,0],1,1,0],[]] +[[[[7,7,6,6],1,[2,5,0,1]],[10,[0,5,7],[9,1,1,10,0]],10,1]] + +[[[0,7],[2],[[4,10,0,3],[3],[6,0,6],3]],[[9,6],4,5,[1,7,[10,2,8,10],[],2],6],[[],[3,1],[8,10,[3,2],3,1],8,9],[],[4,[[],[7,3,7,7,3],2,3,[7,9,6]]]] +[[5,3],[[[],9,[7,2,0,6,4],7,2],[8],[[2,1,3,8],[],[4,0,8],1,[]],1],[],[3,7,[],[[],[1,10],9]],[[9,8],[6],[7,1,9,[],[]]]] + +[[2,7]] +[[[6,1,9,[]],[[7],[],3],[1],4],[[3,0,6],1,6,[[5,5],1,[9,4,3],[],[3]],[6,[8,10,9,9],6]],[[[9,5,6,9,2]],[7,[10,7],[9,10],1,[1,7,7]],[8,[4,2,5],[0],[7,0,3],[0]],6,[[0],[4,1],[1],[7],5]]] + +[[],[],[7,[2,8,8,[]],3,7],[[4,8],[],[7,[10,6,9,5,6],2],[[3,5,9,10,6],0,[0,0],[9],[2,7,6,9,5]],[0,6]],[[6,3,[0],10],[],10,[[6,8],3,[2,3,2,1],[],[10,1]],[]]] +[[[[5,8,2],5],[[10,9,9,4],[2],[],8,6],2],[[[4,4,8,4],[1,0,1,7,2],[3,7,3]]],[7],[0,1,[[10],[6],9,[4],5],4,[[5,10],[8,1,7,5,9],7,6]]] + +[6,10,0,0,5] +[6,10,0,0] + +[[1,[]],[5,6,5]] +[[2,10]] + +[[[1],[6,[2,4,5,2],[1],[7],[10,10,0]],[3,0,[3,1,3,0],[7,10,0,7,8],[9,1,7]],[5,[8,4,6,3,6],0,[4,4,5,10],10],[[6,8,3,2,5],7,3,[10,10,3,7,3],1]],[[[8,1],[4,9,3,0,0],4,10],[],2]] +[[],[],[5]] + +[[6,[7,[3,6,9,0,6],[6],[6,5,8,9,0]],5,9],[8,5,7,5],[10,4,0,5,[[]]],[]] +[[[8,2,8],6,[[1,6,1,6]]],[[8,7,[1,3,10],[6,5,5],[4,9,0,9]],[1,6,0,5]],[[5],2,8],[[5,4],[3,[7,2,8,10],9],[[3,7,8,2,1],3,2],[[3,3],5],3],[[[7,7],[9]],[[9,3,9,2,1]]]] + +[[8,[[7],[6,2,4,1,8],8,[0,1,0,7,5]],[[8,5],[4,9,2,6],[2]]],[],[0,[[8],[4,6,2,10],[4,10,8]],[[3,2,1]]],[2,10]] +[[[[],[5,10,1,9]],[[5,1,10,7],[10,9]],[9,[],7,[]],0],[3,0,[[10,9,7,3],[],[0,3],10,1],10,[[2,4,10,4],[4]]],[[]]] + +[[[[7],[6,4],[5],[1,0]],[[2,3,1,3],[],5,6]]] +[[[6,[],[8]],[0,[5,4,2,5],9,6],[[2,8,4,2],9]],[1,[1,[0,5,5,4,10],[9,4,7],8]]] + +[[[[8,2],2],9,5],[3,0,[],2,[2,7]],[],[[],0,[[]],[[4,0,9,2],9,[8,5],7,2]]] +[[[[1],5],[[6,7],2,2,1,[3,8]],[1,10]],[]] + +[[4,[]],[6,[3,[4,4,7,6]]],[10,8,1],[[[3,1,1,0,7],[1,9,10,6,2],[10,6]],[2,[9,9],0,9,[]],[4,8,3,[]],[[5,4,8],2]]] +[[[0],[8,9,0],5]] + +[[[0,8,[0,8,10,6,7]],[6],1,7,[8,6]],[0,[],[[6,6,3],[5],[2,8,10,6],[]],2,[[7,8,7],7,6,[],[0,4,1]]],[5,10],[]] +[[2,[[9,8,4],9,4],[1,8],0]] + +[[1,5],[1,0,[4,3],2],[[[7],[6,5,2,2],8,[7,9]]]] +[[],[1,[0,10],[[8],0,3,3],[[3],2,[],[8,4,6]]],[[[0],9,5]],[1],[7,1,[8,3,[1,2,7],[1,8]],2,[1,0]]] + +[[],[]] +[[[[8,7,4,2,9]]],[7,5],[1,[[2],6,[7,4,10],[9]],[9,8,[1,8,6,8,7],1,1]],[[[10,4,4]],[[5,8,10],[1,7,4],1,7],10,2,[2,[5,0,8,1]]]] + +[[9]] +[[7]] + +[[],[1,[[7,3,9,8,10],[7,8,4,2,7],9,[2,7,8],[10,7,2,9]],3,9]] +[[[],[5,10,4],5],[[10,[8,10,2,10],[8,8,10,0],5,9],[[10,7,5,10,5],[10],7,[10,3,10,4],[5,0,0,4,7]]],[],[0,[[5],6,2,10,9],[[2],[1],[10,1,5,1],[8],5],[3,9,1]]] + +[[2,[2,[8],[7,1,9,1,8],4]],[[5,[2,8,3],9],4,3,[[3,2,0,10],3],3],[[8,4,2,[5],6],8,[],[[10,7,7,7],6,[7,4],[9,3,2,6],[10,4,10,5,8]],[9,1,6,5,[]]],[[[10,9,8,2],3],[1,10,[0,2,8],6]]] +[[[[4,7,8],7,[],9,[0,6]],[],8]] + +[[[2],[[]],[[],[4,0,10,5],5,3,8],[8]],[[4,1],[2,[],4],[[1,9,10],0,[3]]]] +[[[4,[7,6]],[5,1,[],[2,6,10]],[10,0,[],[9,3,10,8,5],[9,0]]],[10,9,3,[[9,8,2],4]],[[[6],10,9,3,2],[[10,9,2,10],7,4]],[[2,3,[9]],[[0],0,[5,8]],2,[]]] + +[[[[2,6,10],[4,8,1,10,6],1,[4,0,10,4,5]],[[5,8,10,1,0],[10,4,2,4],[5,8,0],5,1],[10,7,10],[[2,7,5,1],[9,0,5],[8,5,4,9]],[6,[2,8],[7]]],[[3,8],[[3,9,6],[5,4,2]],[]]] +[[[],[],7],[]] + +[[2,9,10,6]] +[[],[],[[7,1,8,[8],6],[9,[2,10,7,10],[],7,[6,8,4]]],[[7,6,8],[3,[3,0,4],[8,7,2],[4,0,0]],10,7],[]] + +[[],[4,[]],[[[0,2,4],9],[[0,10],9,9],6],[1],[7,2,2,9]] +[[[],[[3,5]],2,[[7,1,5,7,8]]],[[0,[],[2,4,9],2],[7,4],[],3]] + +[[3,[],9,5,[7,[4,4],[4,5,4,4],9]],[[1],[]]] +[[[4,9,[5,2,1,8,3],[],[8,5,7,5]]],[[[5]],[[]],4,4],[0,[1,[4,7,9]],7,[[0,3,8,5]]]] + +[[],[9,9,[3,10,8,[],[5,9]]]] +[[[[6,7,1,8]]],[[[2,8],[2,9,5,1,4]],[[7],[1,10,3,4,2],9]],[[[8]],7]] + +[[1,[9,[],[10,4,4,4]]],[[2,[8,3,4]]],[[[5,5,1,3,10],8,8,10,7],[9,[2,10],[3,3,3,5,3]],[[4,0,8],10]],[9,[[9,8,3,7,8],9,[9,6,9,8],[6,7,6],[]],[]],[4,[[7,4,1,4]],[0]]] +[[[[2,10,2,8,0],8,8,0,4]],[[],[[1,7]],[9,[8,6,0,2,9],[],2]],[],[[7,0],7]] + +[[9,9,7,10,[[6]]],[2,[[6,9,3,9],2,[7,3,2,2,3]],4,7,9],[[4,7],9,[2,[1,1,8,5,1]]]] +[[[6,7,9,[]],[]],[],[5,6,5],[]] + +[[[[5,5,1],0,8,6,4]],[],[[[]]],[0,6]] +[[[6,[],[2,2,10,0,8]],6,[1,2],[9,9,0,[2,8],[6,9,9,3]]],[8]] + +[2,7,5,7] +[2,7,5,7,7] + +[[10,[[6,4],[],[1,4,0]],[]],[7,3,[1,6],5,[10,10,[],[5,5]]]] +[[[[1],10,[7,10],[]],1,0,[[2,10,7,6],[1,9],3,9],5],[7,[[9,2,0,4,1],2,0,2,9]],[[7,[6,10,9,6,3],[],2,1]],[6,6,[8],4,4]] + +[[],[[7,1,[7,7,9,1],5,[5,2,3,10]],2,5,2,[[7,7],3,[]]],[],[[[10,5,3,9,5],2,2,5]],[[9,[7,6,3,7]],[[6],[9,1,10],[4,5],[10,4]],[2,[]],[]]] +[[],[[7,1],[6,[]]]] + +[[0]] +[[10,[],[[5,4,1]]],[],[0,[[3,0,8,9],8,[],[9,4],9],[5,[6],10,[2,8,8,2,10],[0,0,4,7]],6]] + +[[10,[4,3,[4],[9,2,1],[4,9,1,10]],3],[10,[7,[3,0,2,3],8,1],[8,7,[]],4],[4,2,5]] +[[3,10,7,[[]],[[6],6,9,[10,4,9],6]],[[[6],[3]],[[8,2,6,5,4],[1,8,4],9]],[7,9,[3,10,[8,9,8],[10,8,1,4],6],[[3,6,3]]]] + +[[],[[[2,5]],5,1,[5,4,[9,8,4,6],4]],[]] +[[[[6,10,5],[8,1,4,10],[2,5,9,9,4],[],[3]],4,[[1,1,1],[4,8,5,1,0]],3],[1]] + +[[7,9],[3,[8],6,7],[[7],6,[[8,4,10,2],[]],2]] +[[[6,2],[],[],[],[1,[1,7,6,6,0],[3,9]]],[]] + +[[],[[[3,0,0],9,[6,3]],6,5,[7,3],6],[]] +[[[9],[[],[6,3,1,1,3],[]],[[2,10,9,4],[1,4,9],5,[4]]],[7,6,[],8]] + +[[10,[3,10]],[5,[[2,5,5,1],[3],[6],[9,1],2],[2,[1,10,9],9,[9,5,2],2],5,[5,[10,2,4],[6],[10]]],[[9,[],[4],[8,6]],4,[3,4,[1,5,8,9],1,[7,2,8,3]],3]] +[[9,4,6,6],[8,8,9],[]] + +[[6,[4,[6,10,1]]],[9],[5,[[2,9,4,3,0],[],[4,9,3],[8,8,6],[]],3]] +[[6,6,[7,6,10,1,3],[[7,10,1]]],[[[9,1,5,0,5]],6,[[],[],[5,2],8,[10,1,1,8]],[5,[],3],1]] + +[[[[4,6,1],10,[],4]],[[0,9,[0,2,7],4],[10,[],[6,4,0]]]] +[[6,4,[[0],[9,1,9],[8,8,4],[5,2]],6,7],[[[4],[2,0,6,0,2]],[[],[10,9]],[]]] + +[[],[[],3],[[4],10,[[8,5,1],[],4],[[2,9,10,0],2,[9,2],10]],[[3],[[2,2,9],3,[7],[2],3],[[],[7,9,4],[1,6,2,2,6],[7],[]]],[]] +[[6,[9,[]],3]] + +[[[[9,3,6,4],0],3,1],[],[0,[[3,1],[5,6,2],[2,10],5,9],6],[[2,[2,8,10,2,8],3],2],[7,0,3]] +[[[],[[10,1],2],5,5,7],[[[3],0,3,5,2],[[8,5,8,3],1],5],[4,[]]] + +[[],[[0,5,1,[8,3,4,0,4]],[[9,9,3,3,0],[7,7,3,6,0],[1,2,4,3],[7,8,8]],[4,[9,2,5],5],4]] +[[[[7]],1,[8,1,[],1,[2,4]]]] + +[[[],3,4,2,4],[],[[[6,1,10,4],6,[3,9,8,9,5],[8,5]],2,[[6,9,9,1],9,1,9],10],[4,[6,[4,7,10,5]],[0,9],4,[]]] +[[9,5,[[],[1,3],[7],4],[[],[0,2],8],10]] + +[[10,[[],[9,8],[5,10,2,3,8],[],[0]],8,8,[6,10,[5],4,1]],[4],[0,[]],[1],[[2],[10,0,1]]] +[[0,[6,7,5],7,10,[[2,8,1,4,3]]],[[[6,0,4],2,[1,0,5,5,8]],7],[[[2,4,7]]],[]] + +[[6,[],[5,7],[[10,5,8,2,1],[5,10,2],10]],[[],[[6,4,4],[1,1,7,9,1],[9,9],[]],[],[0,2,4]],[[10,9],[2]]] +[[1,[[9,3,1,2,7]],1,[],[[8],7,[6,4,6,2,7]]],[8,1,[6,[4,2,10,4],9]]] + +[[4,[10,10,[9,5],[0,8,1,8],[]],9]] +[[[9,[0,4,5,2],1,6]],[0,10,[7,[],4,9,4]],[[5,9],8,5,4,1]] + +[[1,4],[[],[[],[7,1],2],8,5],[[[7,10,9,8],[],6,[10],1]],[[7,7,[]],[]]] +[[10,7,[[9,9,3,2,7],[]],7,[]],[8,8],[[[9,0]],0,7,[]],[[9,9],[[9,1,8,7],[7]],[[4,5,0]]]] + +[[],[7],[1,1,6],[],[8,0,[],[[9,9],7,[],[10,9,2,8,6],3],[1,3,[5,3]]]] +[[[],[6,[],10,7,0],3,9,[[2,3,6,1]]],[[[],7,0],8,[8],[[],6,2,2,3]]] + +[[],[4,10]] +[[[[8,0,3,9]],5,[9,8,0],[[2,8],[9]],[]]] + +[[],[[2,4,0,2]]] +[[[[6,2,8],[6,8]]],[1,9,10,8]] + +[[],[5,3,[[]],4],[0,10,[[10,4,4,3,8]]]] +[[[6,[3,9,3],[8,0,8]],1,[[1,8,4],[4]],9,7],[[],[[10,6,9,7,0],[10,6,2],[4,2,3],6,[0,6,9]],[],3,8],[[1,0,[7,6,7,2,6],9],[],1,8],[[[3,7,7,10,3]]]] + +[[[4,[9],0,[10],5],[[6],[7],10],[[3,6,6,6,0],6,[7],2],8],[6,5,[8,2,3],[2,3,10,[4,3,3,0,10]]],[]] +[[[]],[6,[[],10],[[3,0,8,2,2],[],[6,6,1],0,[9,10,5,9]]]] + +[[[9],[1,[2],1],1],[[[2,4,8,6,3],[2,6],[9,0,4],4],2],[10]] +[[0],[],[[[1,3,0,2],[]],[[5,4,7,5],10,6,10]]] + +[[[3],10,3,[8,[7]],[10]],[[1,10],[[],[1,4,2],2,[6,8,0,1,4],[3,4,8,1]],[2,[7],4,2,10],[7,[],[3,6,6,9,3],[7,3]]],[5,[],[],10,6]] +[[0,1,[8,2,3],4,[]],[[4,[7]]],[[10,2,[6,8,8,5],9,[]],[[],[],[7,0,0]],4,7,[9,[8,9,5,9,0],8,[4]]],[10,[[9,6,7,9,2]],[[2,8,3],6,9,10,[]]]] + +[[[9,7,0,[8,7]],2,5,10],[2,[6,10,9,1],[7,10],8],[8,6,7,[[0,5,4,4],[2,4],5,1,3]],[],[]] +[[6,7,1],[[]],[7,[2,4,[]]],[[[],6,[3,6,0,3,9],5,[8,8]],[[7,4,6,5],[4]],10,0,4]] + +[[],[[[1,3,4],4,[0,2,4,1],1,1],3,[[],10,7,7,7]],[]] +[[8,[1,[1,7]]],[[[5,7],7,[2,6,9,0],10,[4]],[[10,3,1,6],10,[7,4,2,10,9],2]],[0,[[8,3,6,8],2],[4,9,[1,9,2],6,[10]],9,4]] + +[[[[],[1,2],5,4],4,[8,9]],[5,2],[1,9,[6,[7,1,5,3],7,[0,1,2,5,0]]],[6,[2,10,4,[10,6,2,6]],[],[[]],1],[[[1,6,1],[9],7,[10,7,9]],[5,7,5,8,[4,6,3,7,4]],1,10,[]]] +[[],[[[5],[6,0,2],2]],[9,[[9,3],1,2],[6,[1],0,[]],[[0,7]],[[5,1,6,9,10],10,[],1,7]],[[[],[8,8,1,3,2],2,8],10],[10,[4,5,[2,2,1,5,3],5],1,[[],9,7,9],[6,[],9,[],7]]] + +[[7],[[[4,6,1,5],1,[4,1,1,7,8]],[4,4]],[9,0,7,[3,10,[10,6,9],3,[2]]],[[8],[[],[8,4,9,1]],[6,[5,7,7,8],10],3],[[],8,8,0,10]] +[[0,7]] + +[[[5,[2],[0,0,9,10]],7],[4,[[2,2,4,0]],[10,[10,5,6,0,1],8],4,3],[[[1,1,10,7,3],[1,3,0,1,8],[]],[],[[],[2],6,9],[[7,10],4,[0,3,6,7,6],[1,10,6,4,6],9],3],[6]] +[[[7],[],[[]],[3]],[4,3,10,[]],[9],[],[[6,6,5],0,4,3]] + +[[8,[[1],5,[6,1,5,2],10,[0,1,7,4,9]],10,[[8,2,3,4]]],[[[],0,4,6,0],5,3],[],[],[]] +[[4,[[1],[10,0,8,8,7],6,9],10,0],[[[8,3],7,[10,6,2,9,7],8],[[7,2,10,1],[7,0],[3,7,5],10]],[0,7]] + +[[[1]],[7,[[8,4],8,3],4,[6,6],1],[3,[1]],[]] +[[1,[9]],[]] + +[[],[[]]] +[[0],[[3,4,[9,7,0,10,3],8,1]]] + +[[[7,[6,7,10]],[0,3,4]]] +[[3,10,4,[[6,5,4]]]] + +[[[[1]],[[2,3],9,[3,9,8]],9,3],[[10,[1,5,8,1]],3,[9,10,[5,1,9,1,7],0]],[4],[7,[4,10,[]]]] +[[8]] + +[[1,2],[],[6,[9,[4,8,0,1]],[[9,7],8,7],[[6,5,1,5],[8,0,5]]]] +[[[],[],3,0,[[1,1],0,[2,3,5],0]],[3,10,9,4,9],[],[[0,[7],[4],9],0,2,6]] + +[[],[],[[[0,2,2,1],10,[5,8]],[0,6,[3,0,3,7]],[4,[1,6,5,7]]],[[],[[]]]] +[[9,9,8,3]] + +[[]] +[[0,[[]],[[10,1,10]],[[0,10,1,10,9],8],3],[[[9,5,5],9,8,[3,4],[0,10,3,10,10]],[3,10]]] + +[[],[[[7,6],2]]] +[[[5,8,2,8,9],[[4,9,2,6,5]],9],[[4,9,[6,4]],[[],3,[],[],[7,7]],[],1],[],[],[[[]]]] + +[[],[[6,[0,1,10,4],[7,8,5,7,4],[10],[7,3,5,10]],0],[[],[1],[[1,5,6],1,10,7],[[0,5,6,4,10],[3,10,10,4]]],[6],[]] +[[[4,7,[0],[8,1,1],7],9,[[0,10],1,10,4,[]]],[3,[7],0]] + +[[8,[7,0,[6,6,0,4,2],[0,4,6,9],9]]] +[[2,9,[[8,0,4],10,[9,0,9,7,3]]]] + +[[[[],[],[3]],9],[[8,0],9,[8]],[[3,10,5,[4,3,10,0],0],[[0],0,[4,1,9,0,6],9],9,[],[[]]],[]] +[[0],[1,[1,5,[6]],[[5,4],1,2,[8,2,8,4],[7,6,5,3]],2],[6]] + +[[[[5,10,5,9,10],0],[[9],7,2,1,[]]],[[6,[8]],[[8,3,4],[8],[7,8,7,8]],6,9]] +[[6,[[5,10,8]]],[[9,[],6],9,2,[[3,1,10],[4,5,0],[0],[2,1,8,6]]],[4],[[[10,10,5,0,0],5,8]],[4]] + +[[8,[]]] +[[7,5],[6,[[]]],[5,7],[]] + +[[],[[9,[],1],[],10,6,[[1],6,[10,7,6],7]],[[7,10,8,7],0],[[[],3,[6,8,7]],[[7,5,6,1,2],[1,7,10,5,8]],10,0,[[9,1,1,7]]]] +[[2,7,6,[[2,7,9],5,9]]] + +[[0,6,0,[],6],[]] +[[[9],[8,10]]] + +[[3,9,[1,7,3],7],[]] +[[1,[1,2,[2,2,5,3,4],[4,7,10]],[[3,0]],[2]]] + +[[[[9,2,4,1],2,[4]]],[[8,[3,3,6,10],[4,1,10,5,3],2],6,7,[8,[0,8,4,0]],8],[[5,7,[7,3,1,5,2]],[2,4,0,0]],[[10,[],[1,2,6],5],6]] +[[7],[6]] + +[[4],[8,[[9,7],5,[2,7,4,1],10],[[6,6,9],5],[]],[4,[]],[[[6,6,2],[],[7,10,2,2,7]],[0],4]] +[[[[6,5,2]],[[1,7,10,8],[],8,[4,2,6,5,5]],4,[[5,10,2,9,7],[5,8,2],0,[1,3]]]] + +[[],[[4,[1,4,4]],[6,9,8,9,2],6],[]] +[[[5],[0,[9,4,5],[1,3,10,1]],3,2],[[[6,9],[1,4,0,10,10]],7,4,9],[],[[],4]] + +[[[[6,7,1,1],8,9,[0,8,3,1,3],1],[],5],[[[2,3],[0,3,9,7],[1,7],1,[8]],6,3,[8],6],[[[7,6,5,0,6],6,3,5],[[10,9,1,3],[7,3,9],8,8],[3],8,[[5,7,2,5,10]]],[2,2,[[2],[3],[1,0,2,5,3],[10,0],[3,7]],8],[8]] +[[7,[9,7]],[2],[[],6],[[7,7],9,9,[[0,4,5,10,2],3]]] + +[[[7,[3,8,10]],[[9,8,0,8,1],4,7],10],[]] +[[5,[[4,9,2,0,10],10,9,2,0],[[6,1]]],[8,[],[5],9]] + +[[[],0],[],[0],[4]] +[[],[],[]] + +[[10,8],[1,[5,[9,9,5]],1,[[4,8,10],10,8]]] +[[[2,3,9,3,[2,8]],6],[2,10],[[[2,10],9,1,5],[6,[],[1,0,2,10,8],5],10],[4]] From 926660498d48591e6abba5faeff1c4a7510836dc Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Tue, 13 Dec 2022 07:35:54 +0100 Subject: [PATCH 377/433] Refactoring --- .../adventofcode/common/StringUtils.java | 7 +++ .../adventofcode/year22/days/Day13.java | 45 +++++++++---------- 2 files changed, 29 insertions(+), 23 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode/common/StringUtils.java diff --git a/src/main/java/com/sbaars/adventofcode/common/StringUtils.java b/src/main/java/com/sbaars/adventofcode/common/StringUtils.java new file mode 100644 index 00000000..a8975ef4 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/common/StringUtils.java @@ -0,0 +1,7 @@ +package com.sbaars.adventofcode.common; + +public class StringUtils { + public static String[] lines(String s) { + return s.split("\n"); + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java index 810cafa2..c53307a5 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java @@ -2,12 +2,17 @@ import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.common.Either; +import com.sbaars.adventofcode.common.StringUtils; import com.sbaars.adventofcode.year22.Day2022; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; -import static java.util.Optional.of; import static java.util.Optional.empty; +import static java.util.Optional.of; +import static java.util.stream.IntStream.range; public class Day13 extends Day2022 { public Day13() { @@ -28,36 +33,30 @@ public record Node (Either, Integer> value) {} @Override public Object part1() { - var in = day().split("\n\n"); - List indices = new ArrayList<>(); - for(int i = 0; i e).sum(); + var in = Arrays.stream(day().split("\n\n")).map(StringUtils::lines).toArray(String[][]::new); + return range(0, in.length).filter(i -> compare(node(in[i][0]), node(in[i][1])).orElse(false)).map(i -> i+1).sum(); + } + + private Node node(String s) { + return parseNode(s, findLevels(s)); } public int[] findLevels(String str) { - Map m = Map.of(']', '['); + int level = 0; int[] levels = new int[str.length()]; - Stack s = new Stack<>(); for(int i = 0; i= '0' && s.charAt(0) <= '9') return new Node(new Either<>(null, Integer.parseInt(s))); if(s.equals("[]")) return new Node(new Either<>(new ArrayList<>(), null)); @@ -73,7 +72,7 @@ public Node node(String s, int[] levels) { commas.add(levels.length-1); List subNodes = new ArrayList<>(); for(int i = 1; i(subNodes, null)); } @@ -99,7 +98,7 @@ public Optional compare(Node a, Node b) { @Override public Object part2() { var in = Arrays.stream((day()+"\n[[2]]\n[[6]]").replace("\n\n", "\n").split("\n")) - .map(s -> node(s, findLevels(s))) + .map(s -> parseNode(s, findLevels(s))) .sorted((a, b) -> compare(a, b).map(c -> c ? -1 : 1).orElse(0)) .toList(); return (in.indexOf(new Node(new Either<>(List.of(new Node(new Either<>(List.of(new Node(new Either<>(null, 2))), null))), null))) + 1) * (in.indexOf(new Node(new Either<>(List.of(new Node(new Either<>(List.of(new Node(new Either<>(null, 6))), null))), null))) + 1); From 4c92a7d09a3bb94c0ad461616aaed255b806b452 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Tue, 13 Dec 2022 07:44:58 +0100 Subject: [PATCH 378/433] More refactoring --- .../adventofcode/year22/days/Day13.java | 37 ++++--------------- 1 file changed, 8 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java index c53307a5..df0660b5 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java @@ -9,6 +9,7 @@ import java.util.Arrays; import java.util.List; import java.util.Optional; +import java.util.concurrent.atomic.AtomicInteger; import static java.util.Optional.empty; import static java.util.Optional.of; @@ -41,43 +42,21 @@ private Node node(String s) { return parseNode(s, findLevels(s)); } - public int[] findLevels(String str) { - int level = 0; - int[] levels = new int[str.length()]; - for(int i = 0; i l.addAndGet(c == '[' ? 1 : c == ']' ? -1 : 0)).toArray(); } - public Node parseNode(String s, int[] levels) { -// System.out.println(s); + private Node parseNode(String s, int[] levels) { if(s.charAt(0) >= '0' && s.charAt(0) <= '9') return new Node(new Either<>(null, Integer.parseInt(s))); if(s.equals("[]")) return new Node(new Either<>(new ArrayList<>(), null)); int currentLevel = levels[0]; - List commas = new ArrayList<>(); - commas.add(0); - for(int i = 0; i subNodes = new ArrayList<>(); - for(int i = 1; i i == 0 || i == levels.length - 1 || levels[i] == currentLevel && s.charAt(i) == ',').toArray(); + List subNodes = range(1, commas.length).mapToObj(i -> parseNode(s.substring(commas[i-1]+1, commas[i]), Arrays.copyOfRange(levels, commas[i-1]+1, commas[i]))).toList(); return new Node(new Either<>(subNodes, null)); } - public Optional compare(Node a, Node b) { + private Optional compare(Node a, Node b) { if(a.value.isB() && b.value.isB()) { int na = a.value.getB(); int nb = b.value.getB(); From e8a046932bfe0f8a6ad33a2b57a21b9aeb5e24b2 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Tue, 13 Dec 2022 07:59:20 +0100 Subject: [PATCH 379/433] Day 13 2022 refactoring --- .../adventofcode/year22/days/Day13.java | 58 ++++++++++--------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java index df0660b5..20af8ce1 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java @@ -1,16 +1,15 @@ package com.sbaars.adventofcode.year22.days; -import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.common.Either; import com.sbaars.adventofcode.common.StringUtils; import com.sbaars.adventofcode.year22.Day2022; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.concurrent.atomic.AtomicInteger; +import static java.lang.Integer.parseInt; import static java.util.Optional.empty; import static java.util.Optional.of; import static java.util.stream.IntStream.range; @@ -21,13 +20,7 @@ public Day13() { } public static void main(String[] args) { - Day d = new Day13(); - d.downloadIfNotDownloaded(); - d.downloadExample(); - d.printParts(); -// System.in.read(); -// d.submitPart1(); -// d.submitPart2(); + new Day13().printParts(); } public record Node (Either, Integer> value) {} @@ -38,8 +31,17 @@ public Object part1() { return range(0, in.length).filter(i -> compare(node(in[i][0]), node(in[i][1])).orElse(false)).map(i -> i+1).sum(); } + @Override + public Object part2() { + var in = Arrays.stream((day()+"\n[[2]]\n[[6]]").replace("\n\n", "\n").split("\n")) + .map(this::node) + .sorted((a, b) -> compare(a, b).map(c -> c ? -1 : 1).orElse(0)) + .toList(); + return (in.indexOf(node(node(node(2)))) + 1) * (in.indexOf(node(node(node(6)))) + 1); + } + private Node node(String s) { - return parseNode(s, findLevels(s)); + return node(s, findLevels(s)); } private int[] findLevels(String str) { @@ -47,13 +49,11 @@ private int[] findLevels(String str) { return str.chars().map(c -> l.addAndGet(c == '[' ? 1 : c == ']' ? -1 : 0)).toArray(); } - private Node parseNode(String s, int[] levels) { - if(s.charAt(0) >= '0' && s.charAt(0) <= '9') return new Node(new Either<>(null, Integer.parseInt(s))); - if(s.equals("[]")) return new Node(new Either<>(new ArrayList<>(), null)); - int currentLevel = levels[0]; - int[] commas = range(0, levels.length).filter(i -> i == 0 || i == levels.length - 1 || levels[i] == currentLevel && s.charAt(i) == ',').toArray(); - List subNodes = range(1, commas.length).mapToObj(i -> parseNode(s.substring(commas[i-1]+1, commas[i]), Arrays.copyOfRange(levels, commas[i-1]+1, commas[i]))).toList(); - return new Node(new Either<>(subNodes, null)); + private Node node(String s, int[] levels) { + if(s.charAt(0) >= '0' && s.charAt(0) <= '9') return node(parseInt(s)); + if(s.equals("[]")) return node(List.of()); + int[] commas = range(0, levels.length).filter(i -> i == 0 || i == levels.length - 1 || levels[i] == levels[0] && s.charAt(i) == ',').toArray(); + return node(range(1, commas.length).mapToObj(i -> node(s.substring(commas[i-1]+1, commas[i]))).toList()); } private Optional compare(Node a, Node b) { @@ -69,17 +69,21 @@ private Optional compare(Node a, Node b) { if(na.isEmpty() && !nb.isEmpty()) return of(true); else if(!na.isEmpty() && nb.isEmpty()) return of(false); else if(na.isEmpty() && nb.isEmpty()) return empty(); - else return compare(na.get(0), nb.get(0)).or(() -> compare(new Node(new Either<>(na.subList(1, na.size()), null)), new Node(new Either<>(nb.subList(1, nb.size()), null)))); - } else if(a.value.isA()) return compare(a, new Node(new Either<>(List.of(b), null))); - else return compare(new Node(new Either<>(List.of(a), null)), b); + else return compare(na.get(0), nb.get(0)).or(() -> compare(node(na.subList(1, na.size())), node(nb.subList(1, nb.size())))); + } + else if(a.value.isA()) return compare(a, node(b)); + else return compare(node(a), b); } - @Override - public Object part2() { - var in = Arrays.stream((day()+"\n[[2]]\n[[6]]").replace("\n\n", "\n").split("\n")) - .map(s -> parseNode(s, findLevels(s))) - .sorted((a, b) -> compare(a, b).map(c -> c ? -1 : 1).orElse(0)) - .toList(); - return (in.indexOf(new Node(new Either<>(List.of(new Node(new Either<>(List.of(new Node(new Either<>(null, 2))), null))), null))) + 1) * (in.indexOf(new Node(new Either<>(List.of(new Node(new Either<>(List.of(new Node(new Either<>(null, 6))), null))), null))) + 1); + private Node node(List nodes) { + return new Node(new Either<>(nodes, null)); + } + + private Node node(int n) { + return new Node(new Either<>(null, n)); + } + + private Node node(Node n) { + return node(List.of(n)); } } From 22046e0a0bc7d4868752d70ca9185de6265abcea Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Tue, 13 Dec 2022 09:34:47 +0100 Subject: [PATCH 380/433] Refactor some unnecessary library usage --- .../com/sbaars/adventofcode/common/Day.java | 4 ++-- .../sbaars/adventofcode/common/Either.java | 4 +--- .../sbaars/adventofcode/common/IntLoc.java | 12 +++++++---- .../com/sbaars/adventofcode/common/Loc.java | 14 ++++++++----- .../com/sbaars/adventofcode/common/Loc3D.java | 14 +++++++++---- .../adventofcode/common/StringTools.java | 15 ------------- .../adventofcode/common/StringUtils.java | 7 ------- .../{util => network}/FetchInput.java | 2 +- .../{util => network}/Submit.java | 2 +- .../{util => network}/WebClient.java | 2 +- .../sbaars/adventofcode/util/StringUtils.java | 21 +++++++++++++++++++ .../adventofcode/year19/days/Day10.java | 8 ++++--- .../adventofcode/year20/days/Day23.java | 15 +++++++------ .../sbaars/adventofcode/year20/days/Day4.java | 7 ++++--- .../sbaars/adventofcode/year20/days/Day6.java | 11 +++++----- .../sbaars/adventofcode/year21/days/Day8.java | 13 ++++++------ .../adventofcode/year22/days/Day10.java | 2 +- .../adventofcode/year22/days/Day13.java | 2 +- 18 files changed, 85 insertions(+), 70 deletions(-) delete mode 100644 src/main/java/com/sbaars/adventofcode/common/StringTools.java delete mode 100644 src/main/java/com/sbaars/adventofcode/common/StringUtils.java rename src/main/java/com/sbaars/adventofcode/{util => network}/FetchInput.java (98%) rename src/main/java/com/sbaars/adventofcode/{util => network}/Submit.java (96%) rename src/main/java/com/sbaars/adventofcode/{util => network}/WebClient.java (95%) create mode 100644 src/main/java/com/sbaars/adventofcode/util/StringUtils.java diff --git a/src/main/java/com/sbaars/adventofcode/common/Day.java b/src/main/java/com/sbaars/adventofcode/common/Day.java index d62dac8d..742be1ca 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Day.java +++ b/src/main/java/com/sbaars/adventofcode/common/Day.java @@ -1,7 +1,7 @@ package com.sbaars.adventofcode.common; -import com.sbaars.adventofcode.util.FetchInput; -import com.sbaars.adventofcode.util.Submit; +import com.sbaars.adventofcode.network.FetchInput; +import com.sbaars.adventofcode.network.Submit; import java.io.File; import java.io.IOException; diff --git a/src/main/java/com/sbaars/adventofcode/common/Either.java b/src/main/java/com/sbaars/adventofcode/common/Either.java index 66cd6ad6..7f59ca59 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Either.java +++ b/src/main/java/com/sbaars/adventofcode/common/Either.java @@ -3,14 +3,12 @@ import java.util.Objects; import java.util.Optional; -import static com.google.common.base.Preconditions.checkState; - public class Either { private final Optional a; private final Optional b; public Either(A a, B b){ - checkState(a == null || b == null); + if(!(a == null || b == null)) throw new IllegalStateException(); this.a = Optional.ofNullable(a); this.b = Optional.ofNullable(b); } diff --git a/src/main/java/com/sbaars/adventofcode/common/IntLoc.java b/src/main/java/com/sbaars/adventofcode/common/IntLoc.java index 5893c2bd..97d047db 100644 --- a/src/main/java/com/sbaars/adventofcode/common/IntLoc.java +++ b/src/main/java/com/sbaars/adventofcode/common/IntLoc.java @@ -25,7 +25,6 @@ package com.sbaars.adventofcode.common; -import com.google.common.base.Objects; import java.awt.*; import java.util.stream.IntStream; import java.util.stream.Stream; @@ -80,13 +79,18 @@ public static Stream range(int i, int j){ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - IntLoc loc = (IntLoc) o; - return x == loc.x && y == loc.y; + + IntLoc intLoc = (IntLoc) o; + + if (x != intLoc.x) return false; + return y == intLoc.y; } @Override public int hashCode() { - return Objects.hashCode(x, y); + int result = x; + result = 31 * result + y; + return result; } @Override diff --git a/src/main/java/com/sbaars/adventofcode/common/Loc.java b/src/main/java/com/sbaars/adventofcode/common/Loc.java index f04fe6e1..84a10773 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Loc.java +++ b/src/main/java/com/sbaars/adventofcode/common/Loc.java @@ -25,13 +25,12 @@ package com.sbaars.adventofcode.common; -import static java.lang.Math.toIntExact; - -import com.google.common.base.Objects; import java.awt.*; import java.util.stream.IntStream; import java.util.stream.Stream; +import static java.lang.Math.toIntExact; + public class Loc { public final long x; public final long y; @@ -87,13 +86,18 @@ public static Stream range(int i, int j){ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; + Loc loc = (Loc) o; - return x == loc.x && y == loc.y; + + if (x != loc.x) return false; + return y == loc.y; } @Override public int hashCode() { - return Objects.hashCode(x, y); + int result = (int) (x ^ (x >>> 32)); + result = 31 * result + (int) (y ^ (y >>> 32)); + return result; } @Override diff --git a/src/main/java/com/sbaars/adventofcode/common/Loc3D.java b/src/main/java/com/sbaars/adventofcode/common/Loc3D.java index b67c356a..b156c552 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Loc3D.java +++ b/src/main/java/com/sbaars/adventofcode/common/Loc3D.java @@ -25,7 +25,6 @@ package com.sbaars.adventofcode.common; -import com.google.common.base.Objects; import java.util.List; public class Loc3D { @@ -113,13 +112,20 @@ public Loc3D rotate(int rot) { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - Loc3D loc = (Loc3D) o; - return x == loc.x && y == loc.y && z == loc.z; + + Loc3D loc3D = (Loc3D) o; + + if (x != loc3D.x) return false; + if (y != loc3D.y) return false; + return z == loc3D.z; } @Override public int hashCode() { - return Objects.hashCode(x, y, z); + int result = (int) (x ^ (x >>> 32)); + result = 31 * result + (int) (y ^ (y >>> 32)); + result = 31 * result + (int) (z ^ (z >>> 32)); + return result; } @Override diff --git a/src/main/java/com/sbaars/adventofcode/common/StringTools.java b/src/main/java/com/sbaars/adventofcode/common/StringTools.java deleted file mode 100644 index a2cf1783..00000000 --- a/src/main/java/com/sbaars/adventofcode/common/StringTools.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.sbaars.adventofcode.common; - -import java.util.stream.Collectors; - -public class StringTools { - public static String removeAll(String str, String remove) { - var arr = new IntArray(str.chars()); - remove.chars().forEach(arr::removeElement); - return arr.stream().mapToObj(Character::toString).collect(Collectors.joining()); - } - - public static boolean charSubset(String a, String b){ - return a.chars().allMatch(c -> b.chars().anyMatch(d -> d == c)); - } -} diff --git a/src/main/java/com/sbaars/adventofcode/common/StringUtils.java b/src/main/java/com/sbaars/adventofcode/common/StringUtils.java deleted file mode 100644 index a8975ef4..00000000 --- a/src/main/java/com/sbaars/adventofcode/common/StringUtils.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.sbaars.adventofcode.common; - -public class StringUtils { - public static String[] lines(String s) { - return s.split("\n"); - } -} diff --git a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java b/src/main/java/com/sbaars/adventofcode/network/FetchInput.java similarity index 98% rename from src/main/java/com/sbaars/adventofcode/util/FetchInput.java rename to src/main/java/com/sbaars/adventofcode/network/FetchInput.java index 8646de28..870e2250 100644 --- a/src/main/java/com/sbaars/adventofcode/util/FetchInput.java +++ b/src/main/java/com/sbaars/adventofcode/network/FetchInput.java @@ -1,4 +1,4 @@ -package com.sbaars.adventofcode.util; +package com.sbaars.adventofcode.network; import org.apache.commons.io.FileUtils; import org.htmlcleaner.CleanerProperties; diff --git a/src/main/java/com/sbaars/adventofcode/util/Submit.java b/src/main/java/com/sbaars/adventofcode/network/Submit.java similarity index 96% rename from src/main/java/com/sbaars/adventofcode/util/Submit.java rename to src/main/java/com/sbaars/adventofcode/network/Submit.java index 8bf7a917..9e9d69d5 100644 --- a/src/main/java/com/sbaars/adventofcode/util/Submit.java +++ b/src/main/java/com/sbaars/adventofcode/network/Submit.java @@ -1,4 +1,4 @@ -package com.sbaars.adventofcode.util; +package com.sbaars.adventofcode.network; import java.net.URI; import java.net.http.HttpClient; diff --git a/src/main/java/com/sbaars/adventofcode/util/WebClient.java b/src/main/java/com/sbaars/adventofcode/network/WebClient.java similarity index 95% rename from src/main/java/com/sbaars/adventofcode/util/WebClient.java rename to src/main/java/com/sbaars/adventofcode/network/WebClient.java index 6526e916..35bb8f82 100644 --- a/src/main/java/com/sbaars/adventofcode/util/WebClient.java +++ b/src/main/java/com/sbaars/adventofcode/network/WebClient.java @@ -1,4 +1,4 @@ -package com.sbaars.adventofcode.util; +package com.sbaars.adventofcode.network; import static com.sbaars.adventofcode.common.Day.getResourceAsString; diff --git a/src/main/java/com/sbaars/adventofcode/util/StringUtils.java b/src/main/java/com/sbaars/adventofcode/util/StringUtils.java new file mode 100644 index 00000000..77e67dbf --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/util/StringUtils.java @@ -0,0 +1,21 @@ +package com.sbaars.adventofcode.util; + +import com.sbaars.adventofcode.common.IntArray; + +import java.util.stream.Collectors; + +public class StringUtils { + public static String[] lines(String s) { + return s.split("\n"); + } + + public static String removeAll(String str, String remove) { + var arr = new IntArray(str.chars()); + remove.chars().forEach(arr::removeElement); + return arr.stream().mapToObj(Character::toString).collect(Collectors.joining()); + } + + public static boolean charSubset(String a, String b){ + return a.chars().allMatch(c -> b.chars().anyMatch(d -> d == c)); + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day10.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day10.java index 94d1cf42..09edb9c4 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day10.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day10.java @@ -1,7 +1,7 @@ package com.sbaars.adventofcode.year19.days; -import com.google.common.base.Objects; import com.sbaars.adventofcode.year19.Day2019; + import java.awt.*; import java.util.Arrays; import java.util.List; @@ -77,13 +77,15 @@ private double calcRotationAngleInDegrees(Point centerPt, Point targetPt) { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; + Asteroid asteroid = (Asteroid) o; - return Objects.equal(position, asteroid.position); + + return position.equals(asteroid.position); } @Override public int hashCode() { - return Objects.hashCode(position); + return position.hashCode(); } } } diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java index 61354f5f..3d25cf6b 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day23.java @@ -1,14 +1,15 @@ package com.sbaars.adventofcode.year20.days; -import static java.lang.Long.parseLong; -import static java.util.Arrays.stream; - -import com.google.common.collect.Streams; import com.sbaars.adventofcode.common.CircularLinkedList; import com.sbaars.adventofcode.common.CircularLinkedList.Node; import com.sbaars.adventofcode.year20.Day2020; + import java.util.stream.Collectors; import java.util.stream.IntStream; +import java.util.stream.Stream; + +import static java.lang.Long.parseLong; +import static java.util.Arrays.stream; public class Day23 extends Day2020 { public Day23() { @@ -30,10 +31,8 @@ public Object part2() { } private long getSolution(boolean part1) { - int[] input = day().chars().map(Character::getNumericValue).toArray(); - CircularLinkedList cups = new CircularLinkedList( - Streams.concat(stream(input), part1 ? IntStream.empty() : IntStream.rangeClosed(10, 1000000) - ).toArray()); + IntStream input = day().chars().map(Character::getNumericValue); + CircularLinkedList cups = new CircularLinkedList(Stream.concat(input.boxed(), part1 ? Stream.empty() : IntStream.rangeClosed(10, 1000000).boxed()).mapToInt(e -> e).toArray()); for (int i = 0; i < (part1 ? 100 : 10000000); i++) { int current = cups.current(); int j; diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day4.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day4.java index 5cc7f2c2..8a6191a6 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day4.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day4.java @@ -1,13 +1,14 @@ package com.sbaars.adventofcode.year20.days; -import static com.google.common.collect.ImmutableSet.toImmutableSet; - import com.sbaars.adventofcode.year20.Day2020; + import java.util.Arrays; import java.util.Map; import java.util.function.Predicate; import java.util.regex.Pattern; +import static java.util.stream.Collectors.toSet; + public class Day4 extends Day2020 { private static final Map expected = Map.of("byr", "^(200[0-2]|19[2-9][0-9])$", "iyr", "^(2020|201[0-9])$", @@ -41,7 +42,7 @@ public long verifyPassports(Predicate verifyFunction) { } public boolean valid1(String[] passport) { - return Arrays.stream(passport).map(s -> s.substring(0, 3)).collect(toImmutableSet()).containsAll(expected.keySet()); + return Arrays.stream(passport).map(s -> s.substring(0, 3)).collect(toSet()).containsAll(expected.keySet()); } public boolean valid2(String[] passport) { diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day6.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day6.java index 3e611be1..356c8052 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day6.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day6.java @@ -1,13 +1,14 @@ package com.sbaars.adventofcode.year20.days; -import static com.google.common.primitives.Ints.asList; -import static java.util.stream.IntStream.range; - import com.sbaars.adventofcode.year20.Day2020; + import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import static java.util.stream.Collectors.toCollection; +import static java.util.stream.IntStream.range; + public class Day6 extends Day2020 { public Day6() { @@ -29,8 +30,8 @@ public Object part1() { public Object part2() { return Arrays.stream(day().split("\n\n")).mapToInt(group -> { String[] people = group.split("\n"); - List c = new ArrayList<>(asList(people[0].chars().toArray())); - range(1, people.length).forEach(i -> c.retainAll(asList(people[i].chars().toArray()))); + List c = people[0].chars().boxed().collect(toCollection(ArrayList::new)); + range(1, people.length).forEach(i -> c.retainAll(people[i].chars().boxed().toList())); return c.size(); }).sum(); } diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java index 59d195cb..6d674fb3 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day8.java @@ -1,17 +1,18 @@ package com.sbaars.adventofcode.year21.days; -import static com.sbaars.adventofcode.common.StringTools.charSubset; -import static java.util.Arrays.asList; -import static java.util.Arrays.stream; - import com.sbaars.adventofcode.common.IntArray; -import com.sbaars.adventofcode.common.StringTools; +import com.sbaars.adventofcode.util.StringUtils; import com.sbaars.adventofcode.year21.Day2021; + import java.util.List; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; +import static com.sbaars.adventofcode.util.StringUtils.charSubset; +import static java.util.Arrays.asList; +import static java.util.Arrays.stream; + public class Day8 extends Day2021 { public Day8() { @@ -87,7 +88,7 @@ public Set getPotentialUniques(String[] line){ } private String difference(String a) { - return StringTools.removeAll("abcdefg", a); + return StringUtils.removeAll("abcdefg", a); } private boolean getMiddle(String[] line, String a){ diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java index 48eb4a6f..93b72f68 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day10.java @@ -1,6 +1,6 @@ package com.sbaars.adventofcode.year22.days; -import com.sbaars.adventofcode.util.FetchInput; +import com.sbaars.adventofcode.network.FetchInput; import com.sbaars.adventofcode.year22.Day2022; import java.awt.*; diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java index 20af8ce1..0aa1ae32 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java @@ -1,7 +1,7 @@ package com.sbaars.adventofcode.year22.days; import com.sbaars.adventofcode.common.Either; -import com.sbaars.adventofcode.common.StringUtils; +import com.sbaars.adventofcode.util.StringUtils; import com.sbaars.adventofcode.year22.Day2022; import java.util.Arrays; From a7aa0df564fb324c914323f8c6d11de85c8172a7 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Tue, 13 Dec 2022 09:37:59 +0100 Subject: [PATCH 381/433] Replace unnecessary libraries --- pom.xml | 15 --------------- .../java/com/sbaars/adventofcode/common/Day.java | 5 ++--- .../sbaars/adventofcode/network/FetchInput.java | 5 +++-- 3 files changed, 5 insertions(+), 20 deletions(-) diff --git a/pom.xml b/pom.xml index 87972c3e..195be2e8 100644 --- a/pom.xml +++ b/pom.xml @@ -56,21 +56,6 @@ commons-text 1.9 - - org.apache.commons - commons-io - 1.3.2 - - - org.apache.commons - commons-csv - 1.8 - - - org.apache.commons - commons-configuration2 - 2.7 - net.sourceforge.htmlcleaner htmlcleaner diff --git a/src/main/java/com/sbaars/adventofcode/common/Day.java b/src/main/java/com/sbaars/adventofcode/common/Day.java index 742be1ca..d1828235 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Day.java +++ b/src/main/java/com/sbaars/adventofcode/common/Day.java @@ -5,14 +5,13 @@ import java.io.File; import java.io.IOException; +import java.nio.file.Files; import java.util.Arrays; import java.util.Optional; import java.util.stream.IntStream; import java.util.stream.LongStream; import java.util.stream.Stream; -import static org.apache.commons.io.FileUtils.readFileToString; - public abstract class Day { public static final String DEFAULT_DELIMITER = "\n"; protected final int year; @@ -29,7 +28,7 @@ public Day(int year, int day) { public static String getResourceAsString(String resource) { try { - return readFileToString(getResource(resource)); + return Files.readString(getResource(resource).toPath()); } catch (IOException e) { throw new IllegalStateException(e); } diff --git a/src/main/java/com/sbaars/adventofcode/network/FetchInput.java b/src/main/java/com/sbaars/adventofcode/network/FetchInput.java index 870e2250..b6b88c7f 100644 --- a/src/main/java/com/sbaars/adventofcode/network/FetchInput.java +++ b/src/main/java/com/sbaars/adventofcode/network/FetchInput.java @@ -1,6 +1,5 @@ package com.sbaars.adventofcode.network; -import org.apache.commons.io.FileUtils; import org.htmlcleaner.CleanerProperties; import org.htmlcleaner.DomSerializer; import org.htmlcleaner.HtmlCleaner; @@ -17,6 +16,8 @@ import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.util.List; import java.util.stream.IntStream; @@ -74,7 +75,7 @@ private File getFile(String day, String year) { public static void writeFile(File file, String content) { try { - FileUtils.writeStringToFile(file, content); + Files.write(file.toPath(), content.getBytes(StandardCharsets.UTF_8)); } catch (IOException e) { throw new IllegalStateException(e); } From 5456531a47fc0dd655b94d6c0174643f76efa5ab Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Tue, 13 Dec 2022 10:21:27 +0100 Subject: [PATCH 382/433] Reduce library bloat --- adventofcode2019.iml | 7 ------ pom.xml | 15 ------------- .../adventofcode/year20/days/Day14.java | 22 +++++++------------ .../adventofcode/year21/days/Day21.java | 10 ++++----- 4 files changed, 13 insertions(+), 41 deletions(-) diff --git a/adventofcode2019.iml b/adventofcode2019.iml index 1fd9ad3b..1d06c234 100644 --- a/adventofcode2019.iml +++ b/adventofcode2019.iml @@ -25,13 +25,6 @@ - - - - - - - diff --git a/pom.xml b/pom.xml index 195be2e8..386cbbdb 100644 --- a/pom.xml +++ b/pom.xml @@ -41,21 +41,6 @@ commons-lang3 3.12.0 - - org.apache.commons - commons-collections4 - 4.4 - - - org.apache.commons - commons-math3 - 3.6.1 - - - org.apache.commons - commons-text - 1.9 - net.sourceforge.htmlcleaner htmlcleaner diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day14.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day14.java index 9d617876..6ce955dc 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day14.java @@ -1,19 +1,15 @@ package com.sbaars.adventofcode.year20.days; +import com.sbaars.adventofcode.year20.Day2020; + +import java.util.*; + import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; import static java.lang.Long.parseLong; import static java.lang.Long.toBinaryString; import static java.util.Optional.empty; import static java.util.Optional.of; -import com.sbaars.adventofcode.year20.Day2020; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import org.apache.commons.text.TextStringBuilder; - public class Day14 extends Day2020 { public Day14() { super(14); @@ -27,10 +23,9 @@ public static void main(String[] args) { public Object part1() { Instruction[] input = getInput(); Map memory = new HashMap<>(); - final TextStringBuilder currentMask = new TextStringBuilder(); + StringBuilder currentMask = new StringBuilder(); for (Instruction i : input) { - i.getMem().ifPresentOrElse(m -> memory.put(m.index, m.value | parseLong(currentMask.toString(), 2)), - () -> currentMask.set(i.value).replaceAll("X", "0")); + i.getMem().ifPresentOrElse(m -> memory.put(m.index, m.value | parseLong(currentMask.toString(), 2)), () -> currentMask.replace(0, currentMask.length(), i.value.replaceAll("X", "0"))); } return memory.values().stream().mapToLong(e -> e).sum(); } @@ -85,13 +80,12 @@ private StringBuilder binWithLength(long val, int s) { return bin; } - public static record Instruction(String mem, String value) { - + public record Instruction(String mem, String value) { public Optional getMem() { return mem.startsWith("mem") ? of(readString(mem + value, "mem[%n]%n", Mem.class)) : empty(); } } - public static record Mem(long index, long value) { + public record Mem(long index, long value) { } } diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day21.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day21.java index 23c42dc3..cbe663b5 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day21.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day21.java @@ -3,7 +3,7 @@ import com.google.common.base.Objects; import com.sbaars.adventofcode.common.HasRecursion; import com.sbaars.adventofcode.year21.Day2021; -import org.apache.commons.math3.util.Pair; +import org.apache.commons.lang3.tuple.Pair; import java.util.Arrays; import java.util.HashMap; @@ -52,15 +52,15 @@ public Object part1() { @Override public Object part2() { Pair universes = universes(new HashMap<>(), new State(7, 2, 0, 0, true)); - return Math.max(universes.getFirst(), universes.getSecond()); + return Math.max(universes.getLeft(), universes.getRight()); } private Pair universes(Map> m, State s) { - Pair wins = new Pair<>(0L, 0L); + Pair wins = Pair.of(0L, 0L); if(m.containsKey(s)) { return m.get(s); } else if(Math.max(s.score[0], s.score[1]) >= 21){ - return new Pair<>(s.move ? 0L : 1L, s.move ? 1L : 0L); + return Pair.of(s.move ? 0L : 1L, s.move ? 1L : 0L); } for(int i = 1; i<=3; i++){ for(int j = 1; j<=3; j++){ @@ -69,7 +69,7 @@ private Pair universes(Map> m, State s) { while(newTurn>10) newTurn-=10; int newScore = s.score[s.move ? 0 : 1] + newTurn; Pair newWins = universes(m, new State(s.move ? newTurn : s.turn[0], s.move ? s.turn[1] : newTurn, s.move ? newScore : s.score[0], s.move ? s.score[1] : newScore, !s.move)); - wins = new Pair<>(wins.getFirst() + newWins.getFirst(), wins.getSecond() + newWins.getSecond()); + wins = Pair.of(wins.getLeft() + newWins.getLeft(), wins.getRight() + newWins.getRight()); } } } From 4eaf5a770bb3867934effc8539d4ce1a74da42c4 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Tue, 13 Dec 2022 10:25:06 +0100 Subject: [PATCH 383/433] Upgrade outdated dependencies --- adventofcode2019.iml | 8 ++++---- pom.xml | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/adventofcode2019.iml b/adventofcode2019.iml index 1d06c234..e0d96a8f 100644 --- a/adventofcode2019.iml +++ b/adventofcode2019.iml @@ -17,15 +17,15 @@ - + - + - - + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 386cbbdb..d15b4d37 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ com.google.guava guava - 31.0.1-jre + 31.1-jre org.apache.commons @@ -44,7 +44,7 @@ net.sourceforge.htmlcleaner htmlcleaner - 2.25 + 2.26 From 9c637a8b8dc1bba378f4c160fff074480eac5045 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Tue, 13 Dec 2022 10:27:56 +0100 Subject: [PATCH 384/433] Remove IDE settings --- .gitignore | 2 + .idea/.gitignore | 0 .idea/.name | 1 - .idea/aws.xml | 11 ------ .idea/checkstyle-idea.xml | 16 -------- .idea/codeStyles/Project.xml | 43 ---------------------- .idea/codeStyles/codeStyleConfig.xml | 5 --- .idea/compiler.xml | 17 --------- .idea/encodings.xml | 7 ---- .idea/google-java-format.xml | 6 --- .idea/jarRepositories.xml | 25 ------------- .idea/misc.xml | 11 ------ .idea/modules.xml | 8 ---- .idea/sonarlint/issuestore/index.pb | 0 .idea/vcs.xml | 6 --- .settings/org.eclipse.core.resources.prefs | 5 --- .settings/org.eclipse.jdt.core.prefs | 16 -------- .settings/org.eclipse.m2e.core.prefs | 4 -- 18 files changed, 2 insertions(+), 181 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/.name delete mode 100644 .idea/aws.xml delete mode 100644 .idea/checkstyle-idea.xml delete mode 100644 .idea/codeStyles/Project.xml delete mode 100644 .idea/codeStyles/codeStyleConfig.xml delete mode 100644 .idea/compiler.xml delete mode 100644 .idea/encodings.xml delete mode 100644 .idea/google-java-format.xml delete mode 100644 .idea/jarRepositories.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/sonarlint/issuestore/index.pb delete mode 100644 .idea/vcs.xml delete mode 100644 .settings/org.eclipse.core.resources.prefs delete mode 100644 .settings/org.eclipse.jdt.core.prefs delete mode 100644 .settings/org.eclipse.m2e.core.prefs diff --git a/.gitignore b/.gitignore index 9e31d704..3a04cca8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ +.DS_Store .idea +.settings target/ pom.xml.tag pom.xml.releaseBackup diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index e69de29b..00000000 diff --git a/.idea/.name b/.idea/.name deleted file mode 100644 index ccf03486..00000000 --- a/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -adventofcode2019 \ No newline at end of file diff --git a/.idea/aws.xml b/.idea/aws.xml deleted file mode 100644 index b63b642c..00000000 --- a/.idea/aws.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/checkstyle-idea.xml b/.idea/checkstyle-idea.xml deleted file mode 100644 index 9f040005..00000000 --- a/.idea/checkstyle-idea.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml deleted file mode 100644 index 8b4afbf5..00000000 --- a/.idea/codeStyles/Project.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml deleted file mode 100644 index a55e7a17..00000000 --- a/.idea/codeStyles/codeStyleConfig.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index 2f3e6e57..00000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml deleted file mode 100644 index aa00ffab..00000000 --- a/.idea/encodings.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/.idea/google-java-format.xml b/.idea/google-java-format.xml deleted file mode 100644 index 2aa056da..00000000 --- a/.idea/google-java-format.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml deleted file mode 100644 index b15554c4..00000000 --- a/.idea/jarRepositories.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 482738ca..00000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 1f102bb9..00000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/sonarlint/issuestore/index.pb b/.idea/sonarlint/issuestore/index.pb deleted file mode 100644 index e69de29b..00000000 diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1ddf..00000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 839d647e..00000000 --- a/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,5 +0,0 @@ -eclipse.preferences.version=1 -encoding//src/main/java=UTF-8 -encoding//src/main/resources=UTF-8 -encoding//src/test/java=UTF-8 -encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 60af120b..00000000 --- a/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,16 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate -org.eclipse.jdt.core.compiler.codegen.targetPlatform=13 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=13 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=enabled -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning -org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=13 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs deleted file mode 100644 index f897a7f1..00000000 --- a/.settings/org.eclipse.m2e.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -activeProfiles= -eclipse.preferences.version=1 -resolveWorkspaceProjects=true -version=1 From 1348cd1ed1198056880c16828019570912e2a811 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Tue, 13 Dec 2022 10:36:35 +0100 Subject: [PATCH 385/433] fancyfy code --- .../sbaars/adventofcode/year19/days/Day3.java | 16 ++++------------ .../sbaars/adventofcode/year19/days/Day6.java | 4 ++-- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day3.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day3.java index a17906e4..bcb2995a 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day3.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day3.java @@ -41,18 +41,10 @@ private Set calculateDistance(Walk[] walks1, Set walkedLocations, bo for (Walk walk : walks1) { for (; walk.distance > 0; walk.distance--) { switch (walk.dir) { - case NORTH: - y++; - break; - case SOUTH: - y--; - break; - case WEST: - x--; - break; - case EAST: - x++; - break; + case NORTH -> y++; + case SOUTH -> y--; + case WEST -> x--; + case EAST -> x++; } performStep(walkedLocations, collect, intersectingLocations, x, y, steps); steps++; diff --git a/src/main/java/com/sbaars/adventofcode/year19/days/Day6.java b/src/main/java/com/sbaars/adventofcode/year19/days/Day6.java index b0e25ea2..188d510f 100644 --- a/src/main/java/com/sbaars/adventofcode/year19/days/Day6.java +++ b/src/main/java/com/sbaars/adventofcode/year19/days/Day6.java @@ -2,12 +2,12 @@ import com.google.common.collect.ArrayListMultimap; import com.sbaars.adventofcode.year19.Day2019; + import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map.Entry; import java.util.concurrent.atomic.AtomicInteger; -import java.util.stream.Collectors; public class Day6 extends Day2019 { ArrayListMultimap orbits = ArrayListMultimap.create(); @@ -72,6 +72,6 @@ private List collectAll(String s1) { } public List findOrbit(String orbitValue) { - return orbits.asMap().entrySet().stream().filter(e -> e.getValue().contains(orbitValue)).map(e -> e.getKey()).collect(Collectors.toList()); + return orbits.asMap().entrySet().stream().filter(e -> e.getValue().contains(orbitValue)).map(Entry::getKey).toList(); } } From 68484d01b3d438ac36ffe351c20409ac5518cd43 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Tue, 13 Dec 2022 11:09:05 +0100 Subject: [PATCH 386/433] Simplify stream --- src/main/java/com/sbaars/adventofcode/util/StringUtils.java | 6 ++++++ .../java/com/sbaars/adventofcode/year22/days/Day13.java | 4 +++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/sbaars/adventofcode/util/StringUtils.java b/src/main/java/com/sbaars/adventofcode/util/StringUtils.java index 77e67dbf..0b1e01c3 100644 --- a/src/main/java/com/sbaars/adventofcode/util/StringUtils.java +++ b/src/main/java/com/sbaars/adventofcode/util/StringUtils.java @@ -2,13 +2,19 @@ import com.sbaars.adventofcode.common.IntArray; +import java.util.Arrays; import java.util.stream.Collectors; +import java.util.stream.Stream; public class StringUtils { public static String[] lines(String s) { return s.split("\n"); } + public static Stream streamLines(String s) { + return Arrays.stream(lines(s)); + } + public static String removeAll(String str, String remove) { var arr = new IntArray(str.chars()); remove.chars().forEach(arr::removeElement); diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java index 0aa1ae32..0db29df0 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java @@ -9,6 +9,7 @@ import java.util.Optional; import java.util.concurrent.atomic.AtomicInteger; +import static com.sbaars.adventofcode.util.StringUtils.streamLines; import static java.lang.Integer.parseInt; import static java.util.Optional.empty; import static java.util.Optional.of; @@ -33,7 +34,8 @@ public Object part1() { @Override public Object part2() { - var in = Arrays.stream((day()+"\n[[2]]\n[[6]]").replace("\n\n", "\n").split("\n")) + var in = streamLines(day()+"\n[[2]]\n[[6]]") + .filter(s -> !s.isEmpty()) .map(this::node) .sorted((a, b) -> compare(a, b).map(c -> c ? -1 : 1).orElse(0)) .toList(); From 9ed105eeb620b22dfcacbbba2d3c4630337ade02 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Tue, 13 Dec 2022 18:52:43 +0100 Subject: [PATCH 387/433] Replace checkState --- .../sbaars/adventofcode/common/Either.java | 4 ++- .../common/ReadsFormattedString.java | 23 ++++++---------- .../sbaars/adventofcode/util/AOCUtils.java | 13 +++++++++ .../adventofcode/year21/days/Day23.java | 27 ++++++++++--------- .../adventofcode/year22/days/Day14.java | 10 ++++++- 5 files changed, 47 insertions(+), 30 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode/util/AOCUtils.java diff --git a/src/main/java/com/sbaars/adventofcode/common/Either.java b/src/main/java/com/sbaars/adventofcode/common/Either.java index 7f59ca59..89eb1551 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Either.java +++ b/src/main/java/com/sbaars/adventofcode/common/Either.java @@ -3,12 +3,14 @@ import java.util.Objects; import java.util.Optional; +import static com.sbaars.adventofcode.util.AOCUtils.verify; + public class Either { private final Optional a; private final Optional b; public Either(A a, B b){ - if(!(a == null || b == null)) throw new IllegalStateException(); + verify(a == null || b == null); this.a = Optional.ofNullable(a); this.b = Optional.ofNullable(b); } diff --git a/src/main/java/com/sbaars/adventofcode/common/ReadsFormattedString.java b/src/main/java/com/sbaars/adventofcode/common/ReadsFormattedString.java index 324828f6..c6762043 100644 --- a/src/main/java/com/sbaars/adventofcode/common/ReadsFormattedString.java +++ b/src/main/java/com/sbaars/adventofcode/common/ReadsFormattedString.java @@ -1,29 +1,22 @@ package com.sbaars.adventofcode.common; -import static com.google.common.base.Preconditions.checkState; - import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import static com.sbaars.adventofcode.util.AOCUtils.verify; + public interface ReadsFormattedString { static T readString(String s, String pattern, Class target) { List mappedObjs = new ArrayList<>(); while (s.length() > 0) { if (pattern.length() > 1 && pattern.charAt(0) == '%') { int size = mappedObjs.size(); - switch (pattern.charAt(1)) { - case 'n': - mappedObjs.add(crunchNumber(s, pattern)); - break; - case 'c': - mappedObjs.add(s.charAt(0)); - break; - case 's': - mappedObjs.add(crunchString(s, pattern)); - break; - default: - break; + switch ( pattern.charAt( 1 ) ) + { + case 'n' -> mappedObjs.add(crunchNumber(s, pattern)); + case 'c' -> mappedObjs.add(s.charAt(0)); + case 's' -> mappedObjs.add(crunchString(s, pattern)); } if (mappedObjs.size() != size) { s = s.substring(mappedObjs.get(size).toString().length()); @@ -39,7 +32,7 @@ static T readString(String s, String pattern, Class target) { } } try { - checkState(target.getConstructors().length > 0, "Class "+target+" has no constructor!"); + verify(target.getConstructors().length > 0, "Class "+target+" has no constructor!"); return (T) Arrays.stream(target.getConstructors()).filter(c -> c.getParameterCount() == mappedObjs.size()).findAny().get()//.getConstructor(mappedObjs.stream().map(Object::getClass).toArray(Class[]::new)) .newInstance(mappedObjs.toArray()); } catch (Exception e) { diff --git a/src/main/java/com/sbaars/adventofcode/util/AOCUtils.java b/src/main/java/com/sbaars/adventofcode/util/AOCUtils.java new file mode 100644 index 00000000..ea4f383d --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/util/AOCUtils.java @@ -0,0 +1,13 @@ +package com.sbaars.adventofcode.util; + +public class AOCUtils { + public static void verify(boolean b) { + verify(b, "Something went wrong"); + } + + public static void verify(boolean b, String message) { + if(!b) { + throw new IllegalStateException(message); + } + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day23.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day23.java index 8f6e3bac..c229ccf5 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day23.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day23.java @@ -1,9 +1,5 @@ package com.sbaars.adventofcode.year21.days; -import static com.google.common.base.Preconditions.checkState; - -import com.google.common.base.MoreObjects; -import com.sbaars.adventofcode.year21.Day2021; import java.util.Arrays; import java.util.Comparator; import java.util.HashSet; @@ -13,33 +9,38 @@ import java.util.Set; import java.util.stream.Collectors; import java.util.stream.IntStream; + +import com.google.common.base.MoreObjects; +import com.sbaars.adventofcode.year21.Day2021; import org.apache.commons.lang3.ArrayUtils; +import static com.sbaars.adventofcode.util.AOCUtils.verify; + public class Day23 extends Day2021 { public Day23() { super(23); } public static void main(String[] args) { - new Day23().verify(); + new Day23().doChecks(); new Day23().printParts(); } - public void verify(){ + public void doChecks(){ Queue l = getQueue(new State(new int[][]{{0,0},{1,1},{2,2},{3,3}}, new int[]{-1,-1,-1,-1,-1,-1,-1})); - checkState(l.peek().win()); + verify(l.peek().win()); simulateMoves(l, new HashSet<>()); - checkState(l.isEmpty()); + verify(l.isEmpty()); l = getQueue(new State(new int[][]{{0,0},{1,1},{2,2},{-1,3}}, new int[]{-1,-1,-1,-1,-1,-1,3})); simulateMoves(l, new HashSet<>()); - checkState(l.size() == 1); - checkState(l.poll().win()); + verify(l.size() == 1); + verify(l.poll().win()); l = getQueue(new State(new int[][]{{0,0},{2,1},{1,2},{3,3}}, new int[]{-1,-1,-1,-1,-1,-1,-1})); - checkState(getMinimum(l, new HashSet<>()) == (100L*4)+(10L*6)); + verify(getMinimum(l, new HashSet<>()) == (100L*4)+(10L*6)); l = getQueue(new State(new int[][]{{0,0},{2,2},{1,1},{3,3}}, new int[]{-1,-1,-1,-1,-1,-1,-1})); - checkState(getMinimum(l, new HashSet<>()) == (100L*10)+(10L*14)); + verify(getMinimum(l, new HashSet<>()) == (100L*10)+(10L*14)); l = getQueue(new State(new int[][]{{0,0,0,0},{2,2,2,2},{1,1,1,1},{3,3,3,3}}, new int[]{-1,-1,-1,-1,-1,-1,-1})); - checkState(getMinimum(l, new HashSet<>()) == 3240L); + verify(getMinimum(l, new HashSet<>()) == 3240L); } @Override diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java index c1b89b9c..bf85abdd 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java @@ -1,5 +1,6 @@ package com.sbaars.adventofcode.year22.days; +import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year22.Day2022; public class Day14 extends Day2022 { @@ -8,11 +9,18 @@ public Day14() { } public static void main(String[] args) { - new Day14().printParts(); + Day d = new Day14(); +// d.downloadIfNotDownloaded(); +// d.downloadExample(); + d.printParts(); + // System.in.read(); + // d.submitPart1(); + // d.submitPart2(); } @Override public Object part1() { + return ""; } From ae8ed366f24bd97697b0a740b8a288ea1f0b7c3b Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Tue, 13 Dec 2022 20:00:37 +0100 Subject: [PATCH 388/433] Make tests for each problem --- .../adventofcode/network/DownloadTests.java | 104 ++++++++++++++++++ .../adventofcode/year19/days/Day10Test.java | 20 ++++ .../adventofcode/year19/days/Day11Test.java | 20 ++++ .../adventofcode/year19/days/Day12Test.java | 20 ++++ .../adventofcode/year19/days/Day13Test.java | 20 ++++ .../adventofcode/year19/days/Day14Test.java | 20 ++++ .../adventofcode/year19/days/Day15Test.java | 20 ++++ .../adventofcode/year19/days/Day16Test.java | 20 ++++ .../adventofcode/year19/days/Day17Test.java | 20 ++++ .../adventofcode/year19/days/Day18Test.java | 20 ++++ .../adventofcode/year19/days/Day19Test.java | 20 ++++ .../adventofcode/year19/days/Day1Test.java | 20 ++++ .../adventofcode/year19/days/Day20Test.java | 20 ++++ .../adventofcode/year19/days/Day21Test.java | 20 ++++ .../adventofcode/year19/days/Day22Test.java | 20 ++++ .../adventofcode/year19/days/Day23Test.java | 20 ++++ .../adventofcode/year19/days/Day24Test.java | 20 ++++ .../adventofcode/year19/days/Day25Test.java | 20 ++++ .../adventofcode/year19/days/Day2Test.java | 20 ++++ .../adventofcode/year19/days/Day3Test.java | 20 ++++ .../adventofcode/year19/days/Day4Test.java | 20 ++++ .../adventofcode/year19/days/Day5Test.java | 20 ++++ .../adventofcode/year19/days/Day6Test.java | 20 ++++ .../adventofcode/year19/days/Day7Test.java | 20 ++++ .../adventofcode/year19/days/Day8Test.java | 20 ++++ .../adventofcode/year19/days/Day9Test.java | 20 ++++ .../adventofcode/year20/days/Day10Test.java | 20 ++++ .../adventofcode/year20/days/Day11Test.java | 20 ++++ .../adventofcode/year20/days/Day12Test.java | 20 ++++ .../adventofcode/year20/days/Day13Test.java | 20 ++++ .../adventofcode/year20/days/Day14Test.java | 20 ++++ .../adventofcode/year20/days/Day15Test.java | 20 ++++ .../adventofcode/year20/days/Day16Test.java | 20 ++++ .../adventofcode/year20/days/Day17Test.java | 20 ++++ .../adventofcode/year20/days/Day18Test.java | 20 ++++ .../adventofcode/year20/days/Day19Test.java | 20 ++++ .../adventofcode/year20/days/Day1Test.java | 20 ++++ .../adventofcode/year20/days/Day20Test.java | 20 ++++ .../adventofcode/year20/days/Day21Test.java | 20 ++++ .../adventofcode/year20/days/Day22Test.java | 20 ++++ .../adventofcode/year20/days/Day23Test.java | 20 ++++ .../adventofcode/year20/days/Day24Test.java | 20 ++++ .../adventofcode/year20/days/Day25Test.java | 20 ++++ .../adventofcode/year20/days/Day2Test.java | 20 ++++ .../adventofcode/year20/days/Day3Test.java | 20 ++++ .../adventofcode/year20/days/Day4Test.java | 20 ++++ .../adventofcode/year20/days/Day5Test.java | 20 ++++ .../adventofcode/year20/days/Day6Test.java | 20 ++++ .../adventofcode/year20/days/Day7Test.java | 20 ++++ .../adventofcode/year20/days/Day8Test.java | 20 ++++ .../adventofcode/year20/days/Day9Test.java | 20 ++++ .../adventofcode/year21/days/Day10Test.java | 20 ++++ .../adventofcode/year21/days/Day11Test.java | 20 ++++ .../adventofcode/year21/days/Day12Test.java | 20 ++++ .../adventofcode/year21/days/Day13Test.java | 20 ++++ .../adventofcode/year21/days/Day14Test.java | 20 ++++ .../adventofcode/year21/days/Day15Test.java | 20 ++++ .../adventofcode/year21/days/Day16Test.java | 20 ++++ .../adventofcode/year21/days/Day17Test.java | 20 ++++ .../adventofcode/year21/days/Day18Test.java | 20 ++++ .../adventofcode/year21/days/Day19Test.java | 20 ++++ .../adventofcode/year21/days/Day1Test.java | 20 ++++ .../adventofcode/year21/days/Day20Test.java | 20 ++++ .../adventofcode/year21/days/Day21Test.java | 20 ++++ .../adventofcode/year21/days/Day22Test.java | 20 ++++ .../adventofcode/year21/days/Day23Test.java | 20 ++++ .../adventofcode/year21/days/Day24Test.java | 20 ++++ .../adventofcode/year21/days/Day25Test.java | 20 ++++ .../adventofcode/year21/days/Day2Test.java | 20 ++++ .../adventofcode/year21/days/Day3Test.java | 20 ++++ .../adventofcode/year21/days/Day4Test.java | 20 ++++ .../adventofcode/year21/days/Day5Test.java | 20 ++++ .../adventofcode/year21/days/Day6Test.java | 20 ++++ .../adventofcode/year21/days/Day7Test.java | 20 ++++ .../adventofcode/year21/days/Day8Test.java | 20 ++++ .../adventofcode/year21/days/Day9Test.java | 20 ++++ .../adventofcode/year22/days/Day10Test.java | 26 +++++ .../adventofcode/year22/days/Day11Test.java | 20 ++++ .../adventofcode/year22/days/Day12Test.java | 20 ++++ .../adventofcode/year22/days/Day13Test.java | 20 ++++ .../adventofcode/year22/days/Day1Test.java | 20 ++++ .../adventofcode/year22/days/Day2Test.java | 20 ++++ .../adventofcode/year22/days/Day3Test.java | 20 ++++ .../adventofcode/year22/days/Day4Test.java | 20 ++++ .../adventofcode/year22/days/Day5Test.java | 20 ++++ .../adventofcode/year22/days/Day6Test.java | 20 ++++ .../adventofcode/year22/days/Day7Test.java | 20 ++++ .../adventofcode/year22/days/Day8Test.java | 20 ++++ .../adventofcode/year22/days/Day9Test.java | 20 ++++ 89 files changed, 1870 insertions(+) create mode 100644 src/main/java/com/sbaars/adventofcode/network/DownloadTests.java create mode 100644 src/test/java/com/sbaars/adventofcode/year19/days/Day10Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year19/days/Day11Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year19/days/Day12Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year19/days/Day13Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year19/days/Day14Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year19/days/Day15Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year19/days/Day16Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year19/days/Day17Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year19/days/Day18Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year19/days/Day19Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year19/days/Day1Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year19/days/Day20Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year19/days/Day21Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year19/days/Day22Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year19/days/Day23Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year19/days/Day24Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year19/days/Day25Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year19/days/Day2Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year19/days/Day3Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year19/days/Day4Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year19/days/Day5Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year19/days/Day6Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year19/days/Day7Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year19/days/Day8Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year19/days/Day9Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year20/days/Day10Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year20/days/Day11Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year20/days/Day12Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year20/days/Day13Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year20/days/Day14Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year20/days/Day15Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year20/days/Day16Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year20/days/Day17Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year20/days/Day18Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year20/days/Day19Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year20/days/Day1Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year20/days/Day20Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year20/days/Day21Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year20/days/Day22Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year20/days/Day23Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year20/days/Day24Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year20/days/Day25Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year20/days/Day2Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year20/days/Day3Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year20/days/Day4Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year20/days/Day5Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year20/days/Day6Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year20/days/Day7Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year20/days/Day8Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year20/days/Day9Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year21/days/Day10Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year21/days/Day11Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year21/days/Day12Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year21/days/Day13Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year21/days/Day14Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year21/days/Day15Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year21/days/Day16Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year21/days/Day17Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year21/days/Day18Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year21/days/Day19Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year21/days/Day1Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year21/days/Day20Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year21/days/Day21Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year21/days/Day22Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year21/days/Day23Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year21/days/Day24Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year21/days/Day25Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year21/days/Day2Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year21/days/Day3Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year21/days/Day4Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year21/days/Day5Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year21/days/Day6Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year21/days/Day7Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year21/days/Day8Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year21/days/Day9Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year22/days/Day10Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year22/days/Day11Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year22/days/Day12Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year22/days/Day13Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year22/days/Day1Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year22/days/Day2Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year22/days/Day3Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year22/days/Day4Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year22/days/Day5Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year22/days/Day6Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year22/days/Day7Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year22/days/Day8Test.java create mode 100644 src/test/java/com/sbaars/adventofcode/year22/days/Day9Test.java diff --git a/src/main/java/com/sbaars/adventofcode/network/DownloadTests.java b/src/main/java/com/sbaars/adventofcode/network/DownloadTests.java new file mode 100644 index 00000000..88c82cb4 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/network/DownloadTests.java @@ -0,0 +1,104 @@ +package com.sbaars.adventofcode.network; + +import org.htmlcleaner.CleanerProperties; +import org.htmlcleaner.DomSerializer; +import org.htmlcleaner.HtmlCleaner; +import org.htmlcleaner.TagNode; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathFactory; +import java.io.File; +import java.io.IOException; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.List; +import java.util.stream.IntStream; + +public class DownloadTests { + private final HttpClient client; + + public DownloadTests() { + this.client = WebClient.getClient(); + } + + public static void main(String[] args) { + new DownloadTests().runForYear("2022"); + } + + public void retrieveTests(String day, String year) { + var matches = getMatchesByXpath(doRequest(year + "/day/" + day), "/html/body/main/p/code"); + String y = year.substring(2); + getFile(day, y).getParentFile().mkdirs(); + writeFile(getFile(day, y), """ + package com.sbaars.adventofcode.year%s.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year%s.days.Day%s; + + class Day%sTest { + Day%s day = new Day%s(); + + @Test + void testPart1() { + assertEquals("%s", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("%s", day.part2().toString()); + } + } + """.formatted(y, y, day, day, day, day, !matches.isEmpty() ? matches.get(0) : "true", matches.size() > 1 ? matches.get(1) : "true")); + } + + private void runForYear(String year) { + for (int day = 1; day <= 25; day++) { + retrieveTests(Integer.toString(day), year); + } + } + + private File getFile(String day, String year) { + return new File("src/test/java/com/sbaars/adventofcode/year"+year + "/days/Day" + day + "Test.java"); + } + + public static void writeFile(File file, String content) { + try { + Files.write(file.toPath(), content.getBytes(StandardCharsets.UTF_8)); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private List getMatchesByXpath(String html, String xpath) { + try { + TagNode tagNode = new HtmlCleaner().clean(html); + org.w3c.dom.Document doc = new DomSerializer(new CleanerProperties()).createDOM(tagNode); + + XPath xpathObj = XPathFactory.newInstance().newXPath(); + NodeList matches = (NodeList) xpathObj.evaluate(xpath, doc, XPathConstants.NODESET); + return IntStream.range(0, matches.getLength()).mapToObj(matches::item).map(Node::getTextContent).toList(); + } catch (Exception e) { + throw new IllegalStateException(e); + } + } + + private String doRequest(String path) { + try { + HttpRequest req = HttpRequest.newBuilder() + .uri(URI.create("https://adventofcode.com/" + path)) + .GET().build(); + return client.send(req, HttpResponse.BodyHandlers.ofString()).body(); + } catch (Exception e) { + throw new IllegalStateException(e); + } + } +} diff --git a/src/test/java/com/sbaars/adventofcode/year19/days/Day10Test.java b/src/test/java/com/sbaars/adventofcode/year19/days/Day10Test.java new file mode 100644 index 00000000..097c0676 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year19/days/Day10Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year19.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year19.days.Day10; + + class Day10Test { + Day10 day = new Day10(); + + @Test + void testPart1() { + assertEquals("299", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("1419", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year19/days/Day11Test.java b/src/test/java/com/sbaars/adventofcode/year19/days/Day11Test.java new file mode 100644 index 00000000..777030d2 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year19/days/Day11Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year19.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year19.days.Day11; + + class Day11Test { + Day11 day = new Day11(); + + @Test + void testPart1() { + assertEquals("2172", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("JELEFGHP", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year19/days/Day12Test.java b/src/test/java/com/sbaars/adventofcode/year19/days/Day12Test.java new file mode 100644 index 00000000..2e396ff4 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year19/days/Day12Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year19.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year19.days.Day12; + + class Day12Test { + Day12 day = new Day12(); + + @Test + void testPart1() { + assertEquals("13399", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("312992287193064", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year19/days/Day13Test.java b/src/test/java/com/sbaars/adventofcode/year19/days/Day13Test.java new file mode 100644 index 00000000..f6b0c826 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year19/days/Day13Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year19.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year19.days.Day13; + + class Day13Test { + Day13 day = new Day13(); + + @Test + void testPart1() { + assertEquals("320", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("15156", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year19/days/Day14Test.java b/src/test/java/com/sbaars/adventofcode/year19/days/Day14Test.java new file mode 100644 index 00000000..56fda59e --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year19/days/Day14Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year19.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year19.days.Day14; + + class Day14Test { + Day14 day = new Day14(); + + @Test + void testPart1() { + assertEquals("485720", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("3848998", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year19/days/Day15Test.java b/src/test/java/com/sbaars/adventofcode/year19/days/Day15Test.java new file mode 100644 index 00000000..cf4edefa --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year19/days/Day15Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year19.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year19.days.Day15; + + class Day15Test { + Day15 day = new Day15(); + + @Test + void testPart1() { + assertEquals("380", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("410", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year19/days/Day16Test.java b/src/test/java/com/sbaars/adventofcode/year19/days/Day16Test.java new file mode 100644 index 00000000..45745be9 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year19/days/Day16Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year19.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year19.days.Day16; + + class Day16Test { + Day16 day = new Day16(); + + @Test + void testPart1() { + assertEquals("12541048", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("62858988", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year19/days/Day17Test.java b/src/test/java/com/sbaars/adventofcode/year19/days/Day17Test.java new file mode 100644 index 00000000..9ccafa09 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year19/days/Day17Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year19.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year19.days.Day17; + + class Day17Test { + Day17 day = new Day17(); + + @Test + void testPart1() { + assertEquals("7404", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("929045", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year19/days/Day18Test.java b/src/test/java/com/sbaars/adventofcode/year19/days/Day18Test.java new file mode 100644 index 00000000..640505e9 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year19/days/Day18Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year19.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year19.days.Day18; + + class Day18Test { + Day18 day = new Day18(); + + @Test + void testPart1() { + assertEquals("5402", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("2138", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year19/days/Day19Test.java b/src/test/java/com/sbaars/adventofcode/year19/days/Day19Test.java new file mode 100644 index 00000000..8706dcf6 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year19/days/Day19Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year19.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year19.days.Day19; + + class Day19Test { + Day19 day = new Day19(); + + @Test + void testPart1() { + assertEquals("179", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("9760485", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year19/days/Day1Test.java b/src/test/java/com/sbaars/adventofcode/year19/days/Day1Test.java new file mode 100644 index 00000000..769697a9 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year19/days/Day1Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year19.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year19.days.Day1; + + class Day1Test { + Day1 day = new Day1(); + + @Test + void testPart1() { + assertEquals("3514064", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("5268207", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year19/days/Day20Test.java b/src/test/java/com/sbaars/adventofcode/year19/days/Day20Test.java new file mode 100644 index 00000000..9d1a3bff --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year19/days/Day20Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year19.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year19.days.Day20; + + class Day20Test { + Day20 day = new Day20(); + + @Test + void testPart1() { + assertEquals("498", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("5564", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year19/days/Day21Test.java b/src/test/java/com/sbaars/adventofcode/year19/days/Day21Test.java new file mode 100644 index 00000000..0b14da45 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year19/days/Day21Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year19.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year19.days.Day21; + + class Day21Test { + Day21 day = new Day21(); + + @Test + void testPart1() { + assertEquals("19352864", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("1142488337", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year19/days/Day22Test.java b/src/test/java/com/sbaars/adventofcode/year19/days/Day22Test.java new file mode 100644 index 00000000..cf2607f4 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year19/days/Day22Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year19.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year19.days.Day22; + + class Day22Test { + Day22 day = new Day22(); + + @Test + void testPart1() { + assertEquals("7860", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("61256063148970", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year19/days/Day23Test.java b/src/test/java/com/sbaars/adventofcode/year19/days/Day23Test.java new file mode 100644 index 00000000..dcf3aae7 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year19/days/Day23Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year19.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year19.days.Day23; + + class Day23Test { + Day23 day = new Day23(); + + @Test + void testPart1() { + assertEquals("17286", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("11249", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year19/days/Day24Test.java b/src/test/java/com/sbaars/adventofcode/year19/days/Day24Test.java new file mode 100644 index 00000000..e615b55e --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year19/days/Day24Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year19.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year19.days.Day24; + + class Day24Test { + Day24 day = new Day24(); + + @Test + void testPart1() { + assertEquals("32506911", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("2025", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year19/days/Day25Test.java b/src/test/java/com/sbaars/adventofcode/year19/days/Day25Test.java new file mode 100644 index 00000000..25f3321b --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year19/days/Day25Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year19.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year19.days.Day25; + + class Day25Test { + Day25 day = new Day25(); + + @Test + void testPart1() { + assertEquals("34095120", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("true", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year19/days/Day2Test.java b/src/test/java/com/sbaars/adventofcode/year19/days/Day2Test.java new file mode 100644 index 00000000..1047c4d4 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year19/days/Day2Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year19.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year19.days.Day2; + + class Day2Test { + Day2 day = new Day2(); + + @Test + void testPart1() { + assertEquals("8017076", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("3146", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year19/days/Day3Test.java b/src/test/java/com/sbaars/adventofcode/year19/days/Day3Test.java new file mode 100644 index 00000000..b455e931 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year19/days/Day3Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year19.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year19.days.Day3; + + class Day3Test { + Day3 day = new Day3(); + + @Test + void testPart1() { + assertEquals("303", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("11222", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year19/days/Day4Test.java b/src/test/java/com/sbaars/adventofcode/year19/days/Day4Test.java new file mode 100644 index 00000000..ede76607 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year19/days/Day4Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year19.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year19.days.Day4; + + class Day4Test { + Day4 day = new Day4(); + + @Test + void testPart1() { + assertEquals("481", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("299", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year19/days/Day5Test.java b/src/test/java/com/sbaars/adventofcode/year19/days/Day5Test.java new file mode 100644 index 00000000..07b18ab1 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year19/days/Day5Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year19.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year19.days.Day5; + + class Day5Test { + Day5 day = new Day5(); + + @Test + void testPart1() { + assertEquals("11049715", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("2140710", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year19/days/Day6Test.java b/src/test/java/com/sbaars/adventofcode/year19/days/Day6Test.java new file mode 100644 index 00000000..37a6739c --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year19/days/Day6Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year19.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year19.days.Day6; + + class Day6Test { + Day6 day = new Day6(); + + @Test + void testPart1() { + assertEquals("186597", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("412", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year19/days/Day7Test.java b/src/test/java/com/sbaars/adventofcode/year19/days/Day7Test.java new file mode 100644 index 00000000..48a417f3 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year19/days/Day7Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year19.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year19.days.Day7; + + class Day7Test { + Day7 day = new Day7(); + + @Test + void testPart1() { + assertEquals("116680", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("89603079", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year19/days/Day8Test.java b/src/test/java/com/sbaars/adventofcode/year19/days/Day8Test.java new file mode 100644 index 00000000..f2530621 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year19/days/Day8Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year19.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year19.days.Day8; + + class Day8Test { + Day8 day = new Day8(); + + @Test + void testPart1() { + assertEquals("1360", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("FPUAR", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year19/days/Day9Test.java b/src/test/java/com/sbaars/adventofcode/year19/days/Day9Test.java new file mode 100644 index 00000000..00aa5ab1 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year19/days/Day9Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year19.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year19.days.Day9; + + class Day9Test { + Day9 day = new Day9(); + + @Test + void testPart1() { + assertEquals("2518058886", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("44292", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year20/days/Day10Test.java b/src/test/java/com/sbaars/adventofcode/year20/days/Day10Test.java new file mode 100644 index 00000000..28d2ed0a --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year20/days/Day10Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year20.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year20.days.Day10; + + class Day10Test { + Day10 day = new Day10(); + + @Test + void testPart1() { + assertEquals("2812", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("386869246296064", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year20/days/Day11Test.java b/src/test/java/com/sbaars/adventofcode/year20/days/Day11Test.java new file mode 100644 index 00000000..e33d74d8 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year20/days/Day11Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year20.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year20.days.Day11; + + class Day11Test { + Day11 day = new Day11(); + + @Test + void testPart1() { + assertEquals("2243", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("2027", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year20/days/Day12Test.java b/src/test/java/com/sbaars/adventofcode/year20/days/Day12Test.java new file mode 100644 index 00000000..6efddcce --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year20/days/Day12Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year20.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year20.days.Day12; + + class Day12Test { + Day12 day = new Day12(); + + @Test + void testPart1() { + assertEquals("820", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("66614", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year20/days/Day13Test.java b/src/test/java/com/sbaars/adventofcode/year20/days/Day13Test.java new file mode 100644 index 00000000..f46dfdda --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year20/days/Day13Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year20.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year20.days.Day13; + + class Day13Test { + Day13 day = new Day13(); + + @Test + void testPart1() { + assertEquals("2935", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("836024966345345", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year20/days/Day14Test.java b/src/test/java/com/sbaars/adventofcode/year20/days/Day14Test.java new file mode 100644 index 00000000..4bcd7741 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year20/days/Day14Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year20.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year20.days.Day14; + + class Day14Test { + Day14 day = new Day14(); + + @Test + void testPart1() { + assertEquals("14722016054794", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("3618217244644", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year20/days/Day15Test.java b/src/test/java/com/sbaars/adventofcode/year20/days/Day15Test.java new file mode 100644 index 00000000..8faa0725 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year20/days/Day15Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year20.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year20.days.Day15; + + class Day15Test { + Day15 day = new Day15(); + + @Test + void testPart1() { + assertEquals("1294", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("573522", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year20/days/Day16Test.java b/src/test/java/com/sbaars/adventofcode/year20/days/Day16Test.java new file mode 100644 index 00000000..47cb72f9 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year20/days/Day16Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year20.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year20.days.Day16; + + class Day16Test { + Day16 day = new Day16(); + + @Test + void testPart1() { + assertEquals("26988", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("426362917709", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year20/days/Day17Test.java b/src/test/java/com/sbaars/adventofcode/year20/days/Day17Test.java new file mode 100644 index 00000000..b968cab7 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year20/days/Day17Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year20.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year20.days.Day17; + + class Day17Test { + Day17 day = new Day17(); + + @Test + void testPart1() { + assertEquals("295", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("1972", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year20/days/Day18Test.java b/src/test/java/com/sbaars/adventofcode/year20/days/Day18Test.java new file mode 100644 index 00000000..41e165e0 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year20/days/Day18Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year20.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year20.days.Day18; + + class Day18Test { + Day18 day = new Day18(); + + @Test + void testPart1() { + assertEquals("9535936849815", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("472171581333710", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year20/days/Day19Test.java b/src/test/java/com/sbaars/adventofcode/year20/days/Day19Test.java new file mode 100644 index 00000000..5a902dfe --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year20/days/Day19Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year20.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year20.days.Day19; + + class Day19Test { + Day19 day = new Day19(); + + @Test + void testPart1() { + assertEquals("104", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("314", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year20/days/Day1Test.java b/src/test/java/com/sbaars/adventofcode/year20/days/Day1Test.java new file mode 100644 index 00000000..0c55e35e --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year20/days/Day1Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year20.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year20.days.Day1; + + class Day1Test { + Day1 day = new Day1(); + + @Test + void testPart1() { + assertEquals("270144", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("261342720", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year20/days/Day20Test.java b/src/test/java/com/sbaars/adventofcode/year20/days/Day20Test.java new file mode 100644 index 00000000..ccbfe159 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year20/days/Day20Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year20.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year20.days.Day20; + + class Day20Test { + Day20 day = new Day20(); + + @Test + void testPart1() { + assertEquals("111936085519519", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("1792", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year20/days/Day21Test.java b/src/test/java/com/sbaars/adventofcode/year20/days/Day21Test.java new file mode 100644 index 00000000..925b12bc --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year20/days/Day21Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year20.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year20.days.Day21; + + class Day21Test { + Day21 day = new Day21(); + + @Test + void testPart1() { + assertEquals("2786", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("prxmdlz,ncjv,knprxg,lxjtns,vzzz,clg,cxfz,qdfpq", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year20/days/Day22Test.java b/src/test/java/com/sbaars/adventofcode/year20/days/Day22Test.java new file mode 100644 index 00000000..20be2064 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year20/days/Day22Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year20.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year20.days.Day22; + + class Day22Test { + Day22 day = new Day22(); + + @Test + void testPart1() { + assertEquals("33925", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("33441", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year20/days/Day23Test.java b/src/test/java/com/sbaars/adventofcode/year20/days/Day23Test.java new file mode 100644 index 00000000..12f7a759 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year20/days/Day23Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year20.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year20.days.Day23; + + class Day23Test { + Day23 day = new Day23(); + + @Test + void testPart1() { + assertEquals("69425837", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("218882971435", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year20/days/Day24Test.java b/src/test/java/com/sbaars/adventofcode/year20/days/Day24Test.java new file mode 100644 index 00000000..8e3abbd9 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year20/days/Day24Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year20.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year20.days.Day24; + + class Day24Test { + Day24 day = new Day24(); + + @Test + void testPart1() { + assertEquals("479", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("4135", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year20/days/Day25Test.java b/src/test/java/com/sbaars/adventofcode/year20/days/Day25Test.java new file mode 100644 index 00000000..1817332e --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year20/days/Day25Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year20.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year20.days.Day25; + + class Day25Test { + Day25 day = new Day25(); + + @Test + void testPart1() { + assertEquals("16881444", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("true", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year20/days/Day2Test.java b/src/test/java/com/sbaars/adventofcode/year20/days/Day2Test.java new file mode 100644 index 00000000..9c843a7e --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year20/days/Day2Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year20.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year20.days.Day2; + + class Day2Test { + Day2 day = new Day2(); + + @Test + void testPart1() { + assertEquals("422", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("451", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year20/days/Day3Test.java b/src/test/java/com/sbaars/adventofcode/year20/days/Day3Test.java new file mode 100644 index 00000000..a9deab81 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year20/days/Day3Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year20.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year20.days.Day3; + + class Day3Test { + Day3 day = new Day3(); + + @Test + void testPart1() { + assertEquals("254", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("1666768320", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year20/days/Day4Test.java b/src/test/java/com/sbaars/adventofcode/year20/days/Day4Test.java new file mode 100644 index 00000000..b6510085 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year20/days/Day4Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year20.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year20.days.Day4; + + class Day4Test { + Day4 day = new Day4(); + + @Test + void testPart1() { + assertEquals("222", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("140", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year20/days/Day5Test.java b/src/test/java/com/sbaars/adventofcode/year20/days/Day5Test.java new file mode 100644 index 00000000..47f2dc39 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year20/days/Day5Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year20.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year20.days.Day5; + + class Day5Test { + Day5 day = new Day5(); + + @Test + void testPart1() { + assertEquals("855", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("552", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year20/days/Day6Test.java b/src/test/java/com/sbaars/adventofcode/year20/days/Day6Test.java new file mode 100644 index 00000000..d7e6621c --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year20/days/Day6Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year20.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year20.days.Day6; + + class Day6Test { + Day6 day = new Day6(); + + @Test + void testPart1() { + assertEquals("7283", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("3520", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year20/days/Day7Test.java b/src/test/java/com/sbaars/adventofcode/year20/days/Day7Test.java new file mode 100644 index 00000000..54c456af --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year20/days/Day7Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year20.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year20.days.Day7; + + class Day7Test { + Day7 day = new Day7(); + + @Test + void testPart1() { + assertEquals("238", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("82930", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year20/days/Day8Test.java b/src/test/java/com/sbaars/adventofcode/year20/days/Day8Test.java new file mode 100644 index 00000000..41e7c67e --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year20/days/Day8Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year20.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year20.days.Day8; + + class Day8Test { + Day8 day = new Day8(); + + @Test + void testPart1() { + assertEquals("1420", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("1245", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year20/days/Day9Test.java b/src/test/java/com/sbaars/adventofcode/year20/days/Day9Test.java new file mode 100644 index 00000000..e4646e09 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year20/days/Day9Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year20.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year20.days.Day9; + + class Day9Test { + Day9 day = new Day9(); + + @Test + void testPart1() { + assertEquals("373803594", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("51152360", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year21/days/Day10Test.java b/src/test/java/com/sbaars/adventofcode/year21/days/Day10Test.java new file mode 100644 index 00000000..5309f362 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year21/days/Day10Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year21.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year21.days.Day10; + + class Day10Test { + Day10 day = new Day10(); + + @Test + void testPart1() { + assertEquals("392421", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("2769449099", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year21/days/Day11Test.java b/src/test/java/com/sbaars/adventofcode/year21/days/Day11Test.java new file mode 100644 index 00000000..95b96c27 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year21/days/Day11Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year21.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year21.days.Day11; + + class Day11Test { + Day11 day = new Day11(); + + @Test + void testPart1() { + assertEquals("1594", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("437", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year21/days/Day12Test.java b/src/test/java/com/sbaars/adventofcode/year21/days/Day12Test.java new file mode 100644 index 00000000..cc6a39a8 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year21/days/Day12Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year21.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year21.days.Day12; + + class Day12Test { + Day12 day = new Day12(); + + @Test + void testPart1() { + assertEquals("3779", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("96988", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year21/days/Day13Test.java b/src/test/java/com/sbaars/adventofcode/year21/days/Day13Test.java new file mode 100644 index 00000000..f3862af6 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year21/days/Day13Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year21.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year21.days.Day13; + + class Day13Test { + Day13 day = new Day13(); + + @Test + void testPart1() { + assertEquals("647", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("HEJHJRCJ", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year21/days/Day14Test.java b/src/test/java/com/sbaars/adventofcode/year21/days/Day14Test.java new file mode 100644 index 00000000..dc554132 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year21/days/Day14Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year21.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year21.days.Day14; + + class Day14Test { + Day14 day = new Day14(); + + @Test + void testPart1() { + assertEquals("3284", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("4302675529689", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year21/days/Day15Test.java b/src/test/java/com/sbaars/adventofcode/year21/days/Day15Test.java new file mode 100644 index 00000000..eda32bce --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year21/days/Day15Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year21.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year21.days.Day15; + + class Day15Test { + Day15 day = new Day15(); + + @Test + void testPart1() { + assertEquals("741", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("2976", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year21/days/Day16Test.java b/src/test/java/com/sbaars/adventofcode/year21/days/Day16Test.java new file mode 100644 index 00000000..3e5389d8 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year21/days/Day16Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year21.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year21.days.Day16; + + class Day16Test { + Day16 day = new Day16(); + + @Test + void testPart1() { + assertEquals("871", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("68703010504", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year21/days/Day17Test.java b/src/test/java/com/sbaars/adventofcode/year21/days/Day17Test.java new file mode 100644 index 00000000..bfd35ca2 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year21/days/Day17Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year21.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year21.days.Day17; + + class Day17Test { + Day17 day = new Day17(); + + @Test + void testPart1() { + assertEquals("8911", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("4748", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year21/days/Day18Test.java b/src/test/java/com/sbaars/adventofcode/year21/days/Day18Test.java new file mode 100644 index 00000000..1f8eb973 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year21/days/Day18Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year21.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year21.days.Day18; + + class Day18Test { + Day18 day = new Day18(); + + @Test + void testPart1() { + assertEquals("4207", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("4635", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year21/days/Day19Test.java b/src/test/java/com/sbaars/adventofcode/year21/days/Day19Test.java new file mode 100644 index 00000000..09b90893 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year21/days/Day19Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year21.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year21.days.Day19; + + class Day19Test { + Day19 day = new Day19(); + + @Test + void testPart1() { + assertEquals("326", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("10630", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year21/days/Day1Test.java b/src/test/java/com/sbaars/adventofcode/year21/days/Day1Test.java new file mode 100644 index 00000000..cbbece82 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year21/days/Day1Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year21.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year21.days.Day1; + + class Day1Test { + Day1 day = new Day1(); + + @Test + void testPart1() { + assertEquals("1184", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("1158", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year21/days/Day20Test.java b/src/test/java/com/sbaars/adventofcode/year21/days/Day20Test.java new file mode 100644 index 00000000..9567d388 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year21/days/Day20Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year21.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year21.days.Day20; + + class Day20Test { + Day20 day = new Day20(); + + @Test + void testPart1() { + assertEquals("5218", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("15527", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year21/days/Day21Test.java b/src/test/java/com/sbaars/adventofcode/year21/days/Day21Test.java new file mode 100644 index 00000000..f16e6e03 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year21/days/Day21Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year21.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year21.days.Day21; + + class Day21Test { + Day21 day = new Day21(); + + @Test + void testPart1() { + assertEquals("678468", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("131180774190079", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year21/days/Day22Test.java b/src/test/java/com/sbaars/adventofcode/year21/days/Day22Test.java new file mode 100644 index 00000000..12430da6 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year21/days/Day22Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year21.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year21.days.Day22; + + class Day22Test { + Day22 day = new Day22(); + + @Test + void testPart1() { + assertEquals("580810", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("1265621119006734", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year21/days/Day23Test.java b/src/test/java/com/sbaars/adventofcode/year21/days/Day23Test.java new file mode 100644 index 00000000..e031fa44 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year21/days/Day23Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year21.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year21.days.Day23; + + class Day23Test { + Day23 day = new Day23(); + + @Test + void testPart1() { + assertEquals("13556", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("54200", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year21/days/Day24Test.java b/src/test/java/com/sbaars/adventofcode/year21/days/Day24Test.java new file mode 100644 index 00000000..7d18b25b --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year21/days/Day24Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year21.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year21.days.Day24; + + class Day24Test { + Day24 day = new Day24(); + + @Test + void testPart1() { + assertEquals("99799212949967", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("34198111816311", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year21/days/Day25Test.java b/src/test/java/com/sbaars/adventofcode/year21/days/Day25Test.java new file mode 100644 index 00000000..15efb010 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year21/days/Day25Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year21.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year21.days.Day25; + + class Day25Test { + Day25 day = new Day25(); + + @Test + void testPart1() { + assertEquals("441", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("true", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year21/days/Day2Test.java b/src/test/java/com/sbaars/adventofcode/year21/days/Day2Test.java new file mode 100644 index 00000000..c06b4e3d --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year21/days/Day2Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year21.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year21.days.Day2; + + class Day2Test { + Day2 day = new Day2(); + + @Test + void testPart1() { + assertEquals("1507611", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("1880593125", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year21/days/Day3Test.java b/src/test/java/com/sbaars/adventofcode/year21/days/Day3Test.java new file mode 100644 index 00000000..b42d412b --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year21/days/Day3Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year21.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year21.days.Day3; + + class Day3Test { + Day3 day = new Day3(); + + @Test + void testPart1() { + assertEquals("3901196", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("4412188", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year21/days/Day4Test.java b/src/test/java/com/sbaars/adventofcode/year21/days/Day4Test.java new file mode 100644 index 00000000..531919e9 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year21/days/Day4Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year21.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year21.days.Day4; + + class Day4Test { + Day4 day = new Day4(); + + @Test + void testPart1() { + assertEquals("45031", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("2568", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year21/days/Day5Test.java b/src/test/java/com/sbaars/adventofcode/year21/days/Day5Test.java new file mode 100644 index 00000000..a28187fe --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year21/days/Day5Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year21.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year21.days.Day5; + + class Day5Test { + Day5 day = new Day5(); + + @Test + void testPart1() { + assertEquals("6283", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("18864", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year21/days/Day6Test.java b/src/test/java/com/sbaars/adventofcode/year21/days/Day6Test.java new file mode 100644 index 00000000..ae877f4e --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year21/days/Day6Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year21.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year21.days.Day6; + + class Day6Test { + Day6 day = new Day6(); + + @Test + void testPart1() { + assertEquals("352151", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("1601616884019", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year21/days/Day7Test.java b/src/test/java/com/sbaars/adventofcode/year21/days/Day7Test.java new file mode 100644 index 00000000..20bcf1d9 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year21/days/Day7Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year21.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year21.days.Day7; + + class Day7Test { + Day7 day = new Day7(); + + @Test + void testPart1() { + assertEquals("356992", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("101268110", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year21/days/Day8Test.java b/src/test/java/com/sbaars/adventofcode/year21/days/Day8Test.java new file mode 100644 index 00000000..fad16f58 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year21/days/Day8Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year21.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year21.days.Day8; + + class Day8Test { + Day8 day = new Day8(); + + @Test + void testPart1() { + assertEquals("383", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("998900", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year21/days/Day9Test.java b/src/test/java/com/sbaars/adventofcode/year21/days/Day9Test.java new file mode 100644 index 00000000..86b6e102 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year21/days/Day9Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year21.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year21.days.Day9; + + class Day9Test { + Day9 day = new Day9(); + + @Test + void testPart1() { + assertEquals("468", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("1280496", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year22/days/Day10Test.java b/src/test/java/com/sbaars/adventofcode/year22/days/Day10Test.java new file mode 100644 index 00000000..6ffe69f8 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year22/days/Day10Test.java @@ -0,0 +1,26 @@ + package com.sbaars.adventofcode.year22.days; + + import org.junit.jupiter.api.Test; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + class Day10Test { + Day10 day = new Day10(); + + @Test + void testPart1() { + assertEquals("14420", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals(""" + ██████░░░░░░████░░░░██░░░░░░░░██████░░░░██████░░░░████████░░░░████░░░░██░░░░██░░ + ██░░░░██░░██░░░░██░░██░░░░░░░░██░░░░██░░██░░░░██░░░░░░░░██░░██░░░░██░░██░░░░██░░ + ██░░░░██░░██░░░░░░░░██░░░░░░░░██░░░░██░░██████░░░░░░░░██░░░░██░░░░██░░██░░░░██░░ + ██████░░░░██░░████░░██░░░░░░░░██████░░░░██░░░░██░░░░██░░░░░░████████░░██░░░░██░░ + ██░░██░░░░██░░░░██░░██░░░░░░░░██░░██░░░░██░░░░██░░██░░░░░░░░██░░░░██░░██░░░░██░░ + ██░░░░██░░░░██████░░████████░░██░░░░██░░██████░░░░████████░░██░░░░██░░░░████░░░░ + """.trim(), day.part2().toString().trim()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year22/days/Day11Test.java b/src/test/java/com/sbaars/adventofcode/year22/days/Day11Test.java new file mode 100644 index 00000000..fdd3ff3c --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year22/days/Day11Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year22.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year22.days.Day11; + + class Day11Test { + Day11 day = new Day11(); + + @Test + void testPart1() { + assertEquals("108240", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("25712998901", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year22/days/Day12Test.java b/src/test/java/com/sbaars/adventofcode/year22/days/Day12Test.java new file mode 100644 index 00000000..b5f1b634 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year22/days/Day12Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year22.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year22.days.Day12; + + class Day12Test { + Day12 day = new Day12(); + + @Test + void testPart1() { + assertEquals("425", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("418", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year22/days/Day13Test.java b/src/test/java/com/sbaars/adventofcode/year22/days/Day13Test.java new file mode 100644 index 00000000..9da5e7ad --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year22/days/Day13Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year22.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year22.days.Day13; + + class Day13Test { + Day13 day = new Day13(); + + @Test + void testPart1() { + assertEquals("6369", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("25800", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year22/days/Day1Test.java b/src/test/java/com/sbaars/adventofcode/year22/days/Day1Test.java new file mode 100644 index 00000000..15e78229 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year22/days/Day1Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year22.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year22.days.Day1; + + class Day1Test { + Day1 day = new Day1(); + + @Test + void testPart1() { + assertEquals("67633", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("199628", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year22/days/Day2Test.java b/src/test/java/com/sbaars/adventofcode/year22/days/Day2Test.java new file mode 100644 index 00000000..6207da05 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year22/days/Day2Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year22.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year22.days.Day2; + + class Day2Test { + Day2 day = new Day2(); + + @Test + void testPart1() { + assertEquals("15523", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("15702", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year22/days/Day3Test.java b/src/test/java/com/sbaars/adventofcode/year22/days/Day3Test.java new file mode 100644 index 00000000..f4e9c381 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year22/days/Day3Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year22.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year22.days.Day3; + + class Day3Test { + Day3 day = new Day3(); + + @Test + void testPart1() { + assertEquals("7742", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("2276", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year22/days/Day4Test.java b/src/test/java/com/sbaars/adventofcode/year22/days/Day4Test.java new file mode 100644 index 00000000..0f32be0f --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year22/days/Day4Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year22.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year22.days.Day4; + + class Day4Test { + Day4 day = new Day4(); + + @Test + void testPart1() { + assertEquals("485", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("857", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year22/days/Day5Test.java b/src/test/java/com/sbaars/adventofcode/year22/days/Day5Test.java new file mode 100644 index 00000000..1238f61d --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year22/days/Day5Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year22.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year22.days.Day5; + + class Day5Test { + Day5 day = new Day5(); + + @Test + void testPart1() { + assertEquals("FRDSQRRCD", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("HRFTQVWNN", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year22/days/Day6Test.java b/src/test/java/com/sbaars/adventofcode/year22/days/Day6Test.java new file mode 100644 index 00000000..23e05f25 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year22/days/Day6Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year22.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year22.days.Day6; + + class Day6Test { + Day6 day = new Day6(); + + @Test + void testPart1() { + assertEquals("1707", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("3697", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year22/days/Day7Test.java b/src/test/java/com/sbaars/adventofcode/year22/days/Day7Test.java new file mode 100644 index 00000000..2bedd455 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year22/days/Day7Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year22.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year22.days.Day7; + + class Day7Test { + Day7 day = new Day7(); + + @Test + void testPart1() { + assertEquals("1444896", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("404395", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year22/days/Day8Test.java b/src/test/java/com/sbaars/adventofcode/year22/days/Day8Test.java new file mode 100644 index 00000000..20301f24 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year22/days/Day8Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year22.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year22.days.Day8; + + class Day8Test { + Day8 day = new Day8(); + + @Test + void testPart1() { + assertEquals("1713", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("268464", day.part2().toString()); + } + } diff --git a/src/test/java/com/sbaars/adventofcode/year22/days/Day9Test.java b/src/test/java/com/sbaars/adventofcode/year22/days/Day9Test.java new file mode 100644 index 00000000..b7d0ee34 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year22/days/Day9Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year22.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year22.days.Day9; + + class Day9Test { + Day9 day = new Day9(); + + @Test + void testPart1() { + assertEquals("5735", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("2478", day.part2().toString()); + } + } From b0e282144122c228765b5a7881d681dc365291ff Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Tue, 13 Dec 2022 20:00:48 +0100 Subject: [PATCH 389/433] Use JUnit 5 --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index d15b4d37..d32bada9 100644 --- a/pom.xml +++ b/pom.xml @@ -26,9 +26,9 @@ - junit - junit - 4.13.2 + org.junit.jupiter + junit-jupiter-engine + 5.4.0 test From ba0db2ae816b0e48a71f10d068f8811e3545e3e6 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Wed, 14 Dec 2022 06:47:15 +0100 Subject: [PATCH 390/433] Day 14 2022 --- .../adventofcode/common/grid/CharGrid.java | 22 +++ .../adventofcode/year22/days/Day14.java | 125 ++++++++++++++- src/main/resources/2022-examples/day14-1.txt | 2 + src/main/resources/2022-examples/day14-2.txt | 14 ++ src/main/resources/2022-examples/day14-3.txt | 10 ++ src/main/resources/2022-examples/day14-4.txt | 10 ++ src/main/resources/2022-examples/day14-5.txt | 10 ++ src/main/resources/2022-examples/day14-6.txt | 10 ++ src/main/resources/2022-examples/day14-7.txt | 10 ++ src/main/resources/2022-examples/day14-8.txt | 13 ++ src/main/resources/2022/day14.txt | 151 ++++++++++++++++++ 11 files changed, 370 insertions(+), 7 deletions(-) create mode 100644 src/main/resources/2022-examples/day14-1.txt create mode 100644 src/main/resources/2022-examples/day14-2.txt create mode 100644 src/main/resources/2022-examples/day14-3.txt create mode 100644 src/main/resources/2022-examples/day14-4.txt create mode 100644 src/main/resources/2022-examples/day14-5.txt create mode 100644 src/main/resources/2022-examples/day14-6.txt create mode 100644 src/main/resources/2022-examples/day14-7.txt create mode 100644 src/main/resources/2022-examples/day14-8.txt create mode 100644 src/main/resources/2022/day14.txt diff --git a/src/main/java/com/sbaars/adventofcode/common/grid/CharGrid.java b/src/main/java/com/sbaars/adventofcode/common/grid/CharGrid.java index 7b4016e4..0381462c 100644 --- a/src/main/java/com/sbaars/adventofcode/common/grid/CharGrid.java +++ b/src/main/java/com/sbaars/adventofcode/common/grid/CharGrid.java @@ -1,5 +1,6 @@ package com.sbaars.adventofcode.common.grid; +import java.awt.*; import java.util.Arrays; import java.util.stream.IntStream; @@ -14,6 +15,15 @@ public CharGrid(String s) { grid = Arrays.stream(s.split("\n")).map(String::toCharArray).toArray(char[][]::new); } + public CharGrid(char c, int sizex, int sizey) { + this.grid = new char[sizey][sizex]; + for(int y = 0; y new String(c).chars().anyMatch(i -> i == e)).count()); } @@ -45,4 +55,16 @@ public String toString(){ for(char[] nums : grid) res.append(new String(nums)).append("\n"); return res.toString(); } + + public char get(Point p) { + if (p.x >= 0 && p.x < grid.length && p.y >= 0 && p.y < grid[0].length) { + return grid[p.x][p.y]; + } + return ' '; + } + + public void set(Point p, char i) { + if(get(p) == ' ') throw new IllegalStateException("Trying to write to coordinate outside of grid: "+p+", "+i); + grid[p.x][p.y] = i; + } } diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java index bf85abdd..bc9b3b9d 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java @@ -1,8 +1,18 @@ package com.sbaars.adventofcode.year22.days; import com.sbaars.adventofcode.common.Day; +import com.sbaars.adventofcode.common.Direction; +import com.sbaars.adventofcode.common.grid.CharGrid; import com.sbaars.adventofcode.year22.Day2022; +import java.awt.*; +import java.util.Arrays; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; + public class Day14 extends Day2022 { public Day14() { super(14); @@ -10,22 +20,123 @@ public Day14() { public static void main(String[] args) { Day d = new Day14(); -// d.downloadIfNotDownloaded(); -// d.downloadExample(); + d.downloadIfNotDownloaded(); + d.downloadExample(); d.printParts(); // System.in.read(); - // d.submitPart1(); - // d.submitPart2(); +// d.submitPart1(); + d.submitPart2(); } + public record Pos(long x, long y){} + @Override public Object part1() { - - return ""; + List> in = dayStream().map(s -> Arrays.asList(s.split(" -> ")).stream().map(s2 -> readString(s2, "%n,%n", Pos.class)).map(p -> new Point(Math.toIntExact(p.x), Math.toIntExact(p.y))).toList()).toList(); + CharGrid g = new CharGrid('.', 1000, 1000); + for(List rock : in) { + for(int i = 1; i> in = dayStream().map(s -> Arrays.asList(s.split(" -> ")).stream().map(s2 -> readString(s2, "%n,%n", Pos.class)).map(p -> new Point(Math.toIntExact(p.x), Math.toIntExact(p.y))).toList()).collect(Collectors.toCollection(ArrayList::new)); + CharGrid g = new CharGrid('.', 1000, 1000); + int maxY = in.stream().flatMapToInt(e -> e.stream().mapToInt(f -> f.y)).max().getAsInt() + 2; + in.add(List.of(new Point(0, maxY), new Point(999, maxY))); + for(List rock : in) { + for(int i = 1; i 498,6 -> 496,6 +503,4 -> 502,4 -> 502,9 -> 494,9 diff --git a/src/main/resources/2022-examples/day14-2.txt b/src/main/resources/2022-examples/day14-2.txt new file mode 100644 index 00000000..4fb20f19 --- /dev/null +++ b/src/main/resources/2022-examples/day14-2.txt @@ -0,0 +1,14 @@ + + 4 5 5 + 9 0 0 + 4 0 3 +0 ......+... +1 .......... +2 .......... +3 .......... +4 ....#...## +5 ....#...#. +6 ..###...#. +7 ........#. +8 ........#. +9 #########. diff --git a/src/main/resources/2022-examples/day14-3.txt b/src/main/resources/2022-examples/day14-3.txt new file mode 100644 index 00000000..f6822ce1 --- /dev/null +++ b/src/main/resources/2022-examples/day14-3.txt @@ -0,0 +1,10 @@ +......+... +.......... +.......... +.......... +....#...## +....#...#. +..###...#. +........#. +......o.#. +#########. diff --git a/src/main/resources/2022-examples/day14-4.txt b/src/main/resources/2022-examples/day14-4.txt new file mode 100644 index 00000000..c3caa1cf --- /dev/null +++ b/src/main/resources/2022-examples/day14-4.txt @@ -0,0 +1,10 @@ +......+... +.......... +.......... +.......... +....#...## +....#...#. +..###...#. +........#. +.....oo.#. +#########. diff --git a/src/main/resources/2022-examples/day14-5.txt b/src/main/resources/2022-examples/day14-5.txt new file mode 100644 index 00000000..23bea74a --- /dev/null +++ b/src/main/resources/2022-examples/day14-5.txt @@ -0,0 +1,10 @@ +......+... +.......... +.......... +.......... +....#...## +....#...#. +..###...#. +......o.#. +....oooo#. +#########. diff --git a/src/main/resources/2022-examples/day14-6.txt b/src/main/resources/2022-examples/day14-6.txt new file mode 100644 index 00000000..9a47e931 --- /dev/null +++ b/src/main/resources/2022-examples/day14-6.txt @@ -0,0 +1,10 @@ +......+... +.......... +......o... +.....ooo.. +....#ooo## +....#ooo#. +..###ooo#. +....oooo#. +...ooooo#. +#########. diff --git a/src/main/resources/2022-examples/day14-7.txt b/src/main/resources/2022-examples/day14-7.txt new file mode 100644 index 00000000..1487a947 --- /dev/null +++ b/src/main/resources/2022-examples/day14-7.txt @@ -0,0 +1,10 @@ +......+... +.......... +......o... +.....ooo.. +....#ooo## +...o#ooo#. +..###ooo#. +....oooo#. +.o.ooooo#. +#########. diff --git a/src/main/resources/2022-examples/day14-8.txt b/src/main/resources/2022-examples/day14-8.txt new file mode 100644 index 00000000..e9596adf --- /dev/null +++ b/src/main/resources/2022-examples/day14-8.txt @@ -0,0 +1,13 @@ +.......+... +.......~... +......~o... +.....~ooo.. +....~#ooo## +...~o#ooo#. +..~###ooo#. +..~..oooo#. +.~o.ooooo#. +~#########. +~.......... +~.......... +~.......... diff --git a/src/main/resources/2022/day14.txt b/src/main/resources/2022/day14.txt new file mode 100644 index 00000000..d10b058f --- /dev/null +++ b/src/main/resources/2022/day14.txt @@ -0,0 +1,151 @@ +494,23 -> 494,17 -> 494,23 -> 496,23 -> 496,20 -> 496,23 -> 498,23 -> 498,16 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,19 -> 502,23 -> 504,23 -> 504,18 -> 504,23 +496,36 -> 496,34 -> 496,36 -> 498,36 -> 498,30 -> 498,36 -> 500,36 -> 500,31 -> 500,36 -> 502,36 -> 502,27 -> 502,36 -> 504,36 -> 504,29 -> 504,36 -> 506,36 -> 506,34 -> 506,36 -> 508,36 -> 508,34 -> 508,36 -> 510,36 -> 510,30 -> 510,36 -> 512,36 -> 512,30 -> 512,36 +511,79 -> 511,77 -> 511,79 -> 513,79 -> 513,70 -> 513,79 -> 515,79 -> 515,73 -> 515,79 -> 517,79 -> 517,77 -> 517,79 -> 519,79 -> 519,77 -> 519,79 -> 521,79 -> 521,76 -> 521,79 +511,79 -> 511,77 -> 511,79 -> 513,79 -> 513,70 -> 513,79 -> 515,79 -> 515,73 -> 515,79 -> 517,79 -> 517,77 -> 517,79 -> 519,79 -> 519,77 -> 519,79 -> 521,79 -> 521,76 -> 521,79 +520,82 -> 524,82 +496,164 -> 500,164 +505,162 -> 509,162 +511,79 -> 511,77 -> 511,79 -> 513,79 -> 513,70 -> 513,79 -> 515,79 -> 515,73 -> 515,79 -> 517,79 -> 517,77 -> 517,79 -> 519,79 -> 519,77 -> 519,79 -> 521,79 -> 521,76 -> 521,79 +526,94 -> 530,94 +513,116 -> 517,116 +493,162 -> 497,162 +505,123 -> 505,125 -> 501,125 -> 501,130 -> 511,130 -> 511,125 -> 508,125 -> 508,123 +496,36 -> 496,34 -> 496,36 -> 498,36 -> 498,30 -> 498,36 -> 500,36 -> 500,31 -> 500,36 -> 502,36 -> 502,27 -> 502,36 -> 504,36 -> 504,29 -> 504,36 -> 506,36 -> 506,34 -> 506,36 -> 508,36 -> 508,34 -> 508,36 -> 510,36 -> 510,30 -> 510,36 -> 512,36 -> 512,30 -> 512,36 +507,149 -> 507,151 -> 502,151 -> 502,155 -> 516,155 -> 516,151 -> 511,151 -> 511,149 +539,66 -> 544,66 +511,79 -> 511,77 -> 511,79 -> 513,79 -> 513,70 -> 513,79 -> 515,79 -> 515,73 -> 515,79 -> 517,79 -> 517,77 -> 517,79 -> 519,79 -> 519,77 -> 519,79 -> 521,79 -> 521,76 -> 521,79 +494,23 -> 494,17 -> 494,23 -> 496,23 -> 496,20 -> 496,23 -> 498,23 -> 498,16 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,19 -> 502,23 -> 504,23 -> 504,18 -> 504,23 +517,85 -> 521,85 +523,85 -> 527,85 +494,23 -> 494,17 -> 494,23 -> 496,23 -> 496,20 -> 496,23 -> 498,23 -> 498,16 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,19 -> 502,23 -> 504,23 -> 504,18 -> 504,23 +499,158 -> 503,158 +502,160 -> 506,160 +508,164 -> 512,164 +526,88 -> 530,88 +505,123 -> 505,125 -> 501,125 -> 501,130 -> 511,130 -> 511,125 -> 508,125 -> 508,123 +511,79 -> 511,77 -> 511,79 -> 513,79 -> 513,70 -> 513,79 -> 515,79 -> 515,73 -> 515,79 -> 517,79 -> 517,77 -> 517,79 -> 519,79 -> 519,77 -> 519,79 -> 521,79 -> 521,76 -> 521,79 +507,149 -> 507,151 -> 502,151 -> 502,155 -> 516,155 -> 516,151 -> 511,151 -> 511,149 +494,23 -> 494,17 -> 494,23 -> 496,23 -> 496,20 -> 496,23 -> 498,23 -> 498,16 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,19 -> 502,23 -> 504,23 -> 504,18 -> 504,23 +496,36 -> 496,34 -> 496,36 -> 498,36 -> 498,30 -> 498,36 -> 500,36 -> 500,31 -> 500,36 -> 502,36 -> 502,27 -> 502,36 -> 504,36 -> 504,29 -> 504,36 -> 506,36 -> 506,34 -> 506,36 -> 508,36 -> 508,34 -> 508,36 -> 510,36 -> 510,30 -> 510,36 -> 512,36 -> 512,30 -> 512,36 +514,42 -> 514,46 -> 508,46 -> 508,51 -> 525,51 -> 525,46 -> 517,46 -> 517,42 +496,36 -> 496,34 -> 496,36 -> 498,36 -> 498,30 -> 498,36 -> 500,36 -> 500,31 -> 500,36 -> 502,36 -> 502,27 -> 502,36 -> 504,36 -> 504,29 -> 504,36 -> 506,36 -> 506,34 -> 506,36 -> 508,36 -> 508,34 -> 508,36 -> 510,36 -> 510,30 -> 510,36 -> 512,36 -> 512,30 -> 512,36 +494,23 -> 494,17 -> 494,23 -> 496,23 -> 496,20 -> 496,23 -> 498,23 -> 498,16 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,19 -> 502,23 -> 504,23 -> 504,18 -> 504,23 +511,79 -> 511,77 -> 511,79 -> 513,79 -> 513,70 -> 513,79 -> 515,79 -> 515,73 -> 515,79 -> 517,79 -> 517,77 -> 517,79 -> 519,79 -> 519,77 -> 519,79 -> 521,79 -> 521,76 -> 521,79 +504,107 -> 504,99 -> 504,107 -> 506,107 -> 506,97 -> 506,107 -> 508,107 -> 508,103 -> 508,107 +494,23 -> 494,17 -> 494,23 -> 496,23 -> 496,20 -> 496,23 -> 498,23 -> 498,16 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,19 -> 502,23 -> 504,23 -> 504,18 -> 504,23 +494,23 -> 494,17 -> 494,23 -> 496,23 -> 496,20 -> 496,23 -> 498,23 -> 498,16 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,19 -> 502,23 -> 504,23 -> 504,18 -> 504,23 +518,66 -> 523,66 +511,79 -> 511,77 -> 511,79 -> 513,79 -> 513,70 -> 513,79 -> 515,79 -> 515,73 -> 515,79 -> 517,79 -> 517,77 -> 517,79 -> 519,79 -> 519,77 -> 519,79 -> 521,79 -> 521,76 -> 521,79 +494,23 -> 494,17 -> 494,23 -> 496,23 -> 496,20 -> 496,23 -> 498,23 -> 498,16 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,19 -> 502,23 -> 504,23 -> 504,18 -> 504,23 +504,107 -> 504,99 -> 504,107 -> 506,107 -> 506,97 -> 506,107 -> 508,107 -> 508,103 -> 508,107 +511,79 -> 511,77 -> 511,79 -> 513,79 -> 513,70 -> 513,79 -> 515,79 -> 515,73 -> 515,79 -> 517,79 -> 517,77 -> 517,79 -> 519,79 -> 519,77 -> 519,79 -> 521,79 -> 521,76 -> 521,79 +502,164 -> 506,164 +511,79 -> 511,77 -> 511,79 -> 513,79 -> 513,70 -> 513,79 -> 515,79 -> 515,73 -> 515,79 -> 517,79 -> 517,77 -> 517,79 -> 519,79 -> 519,77 -> 519,79 -> 521,79 -> 521,76 -> 521,79 +494,23 -> 494,17 -> 494,23 -> 496,23 -> 496,20 -> 496,23 -> 498,23 -> 498,16 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,19 -> 502,23 -> 504,23 -> 504,18 -> 504,23 +496,36 -> 496,34 -> 496,36 -> 498,36 -> 498,30 -> 498,36 -> 500,36 -> 500,31 -> 500,36 -> 502,36 -> 502,27 -> 502,36 -> 504,36 -> 504,29 -> 504,36 -> 506,36 -> 506,34 -> 506,36 -> 508,36 -> 508,34 -> 508,36 -> 510,36 -> 510,30 -> 510,36 -> 512,36 -> 512,30 -> 512,36 +524,60 -> 529,60 +507,149 -> 507,151 -> 502,151 -> 502,155 -> 516,155 -> 516,151 -> 511,151 -> 511,149 +510,113 -> 514,113 +511,79 -> 511,77 -> 511,79 -> 513,79 -> 513,70 -> 513,79 -> 515,79 -> 515,73 -> 515,79 -> 517,79 -> 517,77 -> 517,79 -> 519,79 -> 519,77 -> 519,79 -> 521,79 -> 521,76 -> 521,79 +514,94 -> 518,94 +511,91 -> 515,91 +504,107 -> 504,99 -> 504,107 -> 506,107 -> 506,97 -> 506,107 -> 508,107 -> 508,103 -> 508,107 +490,164 -> 494,164 +514,42 -> 514,46 -> 508,46 -> 508,51 -> 525,51 -> 525,46 -> 517,46 -> 517,42 +523,91 -> 527,91 +496,36 -> 496,34 -> 496,36 -> 498,36 -> 498,30 -> 498,36 -> 500,36 -> 500,31 -> 500,36 -> 502,36 -> 502,27 -> 502,36 -> 504,36 -> 504,29 -> 504,36 -> 506,36 -> 506,34 -> 506,36 -> 508,36 -> 508,34 -> 508,36 -> 510,36 -> 510,30 -> 510,36 -> 512,36 -> 512,30 -> 512,36 +520,57 -> 525,57 +496,36 -> 496,34 -> 496,36 -> 498,36 -> 498,30 -> 498,36 -> 500,36 -> 500,31 -> 500,36 -> 502,36 -> 502,27 -> 502,36 -> 504,36 -> 504,29 -> 504,36 -> 506,36 -> 506,34 -> 506,36 -> 508,36 -> 508,34 -> 508,36 -> 510,36 -> 510,30 -> 510,36 -> 512,36 -> 512,30 -> 512,36 +511,145 -> 511,146 -> 517,146 -> 517,145 +521,63 -> 526,63 +511,79 -> 511,77 -> 511,79 -> 513,79 -> 513,70 -> 513,79 -> 515,79 -> 515,73 -> 515,79 -> 517,79 -> 517,77 -> 517,79 -> 519,79 -> 519,77 -> 519,79 -> 521,79 -> 521,76 -> 521,79 +503,39 -> 514,39 +494,23 -> 494,17 -> 494,23 -> 496,23 -> 496,20 -> 496,23 -> 498,23 -> 498,16 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,19 -> 502,23 -> 504,23 -> 504,18 -> 504,23 +511,79 -> 511,77 -> 511,79 -> 513,79 -> 513,70 -> 513,79 -> 515,79 -> 515,73 -> 515,79 -> 517,79 -> 517,77 -> 517,79 -> 519,79 -> 519,77 -> 519,79 -> 521,79 -> 521,76 -> 521,79 +494,23 -> 494,17 -> 494,23 -> 496,23 -> 496,20 -> 496,23 -> 498,23 -> 498,16 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,19 -> 502,23 -> 504,23 -> 504,18 -> 504,23 +517,60 -> 522,60 +511,79 -> 511,77 -> 511,79 -> 513,79 -> 513,70 -> 513,79 -> 515,79 -> 515,73 -> 515,79 -> 517,79 -> 517,77 -> 517,79 -> 519,79 -> 519,77 -> 519,79 -> 521,79 -> 521,76 -> 521,79 +494,23 -> 494,17 -> 494,23 -> 496,23 -> 496,20 -> 496,23 -> 498,23 -> 498,16 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,19 -> 502,23 -> 504,23 -> 504,18 -> 504,23 +504,107 -> 504,99 -> 504,107 -> 506,107 -> 506,97 -> 506,107 -> 508,107 -> 508,103 -> 508,107 +511,79 -> 511,77 -> 511,79 -> 513,79 -> 513,70 -> 513,79 -> 515,79 -> 515,73 -> 515,79 -> 517,79 -> 517,77 -> 517,79 -> 519,79 -> 519,77 -> 519,79 -> 521,79 -> 521,76 -> 521,79 +505,123 -> 505,125 -> 501,125 -> 501,130 -> 511,130 -> 511,125 -> 508,125 -> 508,123 +528,63 -> 533,63 +507,149 -> 507,151 -> 502,151 -> 502,155 -> 516,155 -> 516,151 -> 511,151 -> 511,149 +494,23 -> 494,17 -> 494,23 -> 496,23 -> 496,20 -> 496,23 -> 498,23 -> 498,16 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,19 -> 502,23 -> 504,23 -> 504,18 -> 504,23 +511,79 -> 511,77 -> 511,79 -> 513,79 -> 513,70 -> 513,79 -> 515,79 -> 515,73 -> 515,79 -> 517,79 -> 517,77 -> 517,79 -> 519,79 -> 519,77 -> 519,79 -> 521,79 -> 521,76 -> 521,79 +507,149 -> 507,151 -> 502,151 -> 502,155 -> 516,155 -> 516,151 -> 511,151 -> 511,149 +496,36 -> 496,34 -> 496,36 -> 498,36 -> 498,30 -> 498,36 -> 500,36 -> 500,31 -> 500,36 -> 502,36 -> 502,27 -> 502,36 -> 504,36 -> 504,29 -> 504,36 -> 506,36 -> 506,34 -> 506,36 -> 508,36 -> 508,34 -> 508,36 -> 510,36 -> 510,30 -> 510,36 -> 512,36 -> 512,30 -> 512,36 +511,79 -> 511,77 -> 511,79 -> 513,79 -> 513,70 -> 513,79 -> 515,79 -> 515,73 -> 515,79 -> 517,79 -> 517,77 -> 517,79 -> 519,79 -> 519,77 -> 519,79 -> 521,79 -> 521,76 -> 521,79 +514,42 -> 514,46 -> 508,46 -> 508,51 -> 525,51 -> 525,46 -> 517,46 -> 517,42 +507,149 -> 507,151 -> 502,151 -> 502,155 -> 516,155 -> 516,151 -> 511,151 -> 511,149 +491,136 -> 491,138 -> 483,138 -> 483,141 -> 499,141 -> 499,138 -> 496,138 -> 496,136 +496,36 -> 496,34 -> 496,36 -> 498,36 -> 498,30 -> 498,36 -> 500,36 -> 500,31 -> 500,36 -> 502,36 -> 502,27 -> 502,36 -> 504,36 -> 504,29 -> 504,36 -> 506,36 -> 506,34 -> 506,36 -> 508,36 -> 508,34 -> 508,36 -> 510,36 -> 510,30 -> 510,36 -> 512,36 -> 512,30 -> 512,36 +496,36 -> 496,34 -> 496,36 -> 498,36 -> 498,30 -> 498,36 -> 500,36 -> 500,31 -> 500,36 -> 502,36 -> 502,27 -> 502,36 -> 504,36 -> 504,29 -> 504,36 -> 506,36 -> 506,34 -> 506,36 -> 508,36 -> 508,34 -> 508,36 -> 510,36 -> 510,30 -> 510,36 -> 512,36 -> 512,30 -> 512,36 +494,133 -> 503,133 -> 503,132 +531,60 -> 536,60 +505,123 -> 505,125 -> 501,125 -> 501,130 -> 511,130 -> 511,125 -> 508,125 -> 508,123 +523,54 -> 528,54 +496,36 -> 496,34 -> 496,36 -> 498,36 -> 498,30 -> 498,36 -> 500,36 -> 500,31 -> 500,36 -> 502,36 -> 502,27 -> 502,36 -> 504,36 -> 504,29 -> 504,36 -> 506,36 -> 506,34 -> 506,36 -> 508,36 -> 508,34 -> 508,36 -> 510,36 -> 510,30 -> 510,36 -> 512,36 -> 512,30 -> 512,36 +517,91 -> 521,91 +494,23 -> 494,17 -> 494,23 -> 496,23 -> 496,20 -> 496,23 -> 498,23 -> 498,16 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,19 -> 502,23 -> 504,23 -> 504,18 -> 504,23 +504,107 -> 504,99 -> 504,107 -> 506,107 -> 506,97 -> 506,107 -> 508,107 -> 508,103 -> 508,107 +514,63 -> 519,63 +496,36 -> 496,34 -> 496,36 -> 498,36 -> 498,30 -> 498,36 -> 500,36 -> 500,31 -> 500,36 -> 502,36 -> 502,27 -> 502,36 -> 504,36 -> 504,29 -> 504,36 -> 506,36 -> 506,34 -> 506,36 -> 508,36 -> 508,34 -> 508,36 -> 510,36 -> 510,30 -> 510,36 -> 512,36 -> 512,30 -> 512,36 +514,42 -> 514,46 -> 508,46 -> 508,51 -> 525,51 -> 525,46 -> 517,46 -> 517,42 +496,36 -> 496,34 -> 496,36 -> 498,36 -> 498,30 -> 498,36 -> 500,36 -> 500,31 -> 500,36 -> 502,36 -> 502,27 -> 502,36 -> 504,36 -> 504,29 -> 504,36 -> 506,36 -> 506,34 -> 506,36 -> 508,36 -> 508,34 -> 508,36 -> 510,36 -> 510,30 -> 510,36 -> 512,36 -> 512,30 -> 512,36 +511,79 -> 511,77 -> 511,79 -> 513,79 -> 513,70 -> 513,79 -> 515,79 -> 515,73 -> 515,79 -> 517,79 -> 517,77 -> 517,79 -> 519,79 -> 519,77 -> 519,79 -> 521,79 -> 521,76 -> 521,79 +504,113 -> 508,113 +496,36 -> 496,34 -> 496,36 -> 498,36 -> 498,30 -> 498,36 -> 500,36 -> 500,31 -> 500,36 -> 502,36 -> 502,27 -> 502,36 -> 504,36 -> 504,29 -> 504,36 -> 506,36 -> 506,34 -> 506,36 -> 508,36 -> 508,34 -> 508,36 -> 510,36 -> 510,30 -> 510,36 -> 512,36 -> 512,30 -> 512,36 +496,36 -> 496,34 -> 496,36 -> 498,36 -> 498,30 -> 498,36 -> 500,36 -> 500,31 -> 500,36 -> 502,36 -> 502,27 -> 502,36 -> 504,36 -> 504,29 -> 504,36 -> 506,36 -> 506,34 -> 506,36 -> 508,36 -> 508,34 -> 508,36 -> 510,36 -> 510,30 -> 510,36 -> 512,36 -> 512,30 -> 512,36 +491,136 -> 491,138 -> 483,138 -> 483,141 -> 499,141 -> 499,138 -> 496,138 -> 496,136 +496,36 -> 496,34 -> 496,36 -> 498,36 -> 498,30 -> 498,36 -> 500,36 -> 500,31 -> 500,36 -> 502,36 -> 502,27 -> 502,36 -> 504,36 -> 504,29 -> 504,36 -> 506,36 -> 506,34 -> 506,36 -> 508,36 -> 508,34 -> 508,36 -> 510,36 -> 510,30 -> 510,36 -> 512,36 -> 512,30 -> 512,36 +501,116 -> 505,116 +511,145 -> 511,146 -> 517,146 -> 517,145 +496,36 -> 496,34 -> 496,36 -> 498,36 -> 498,30 -> 498,36 -> 500,36 -> 500,31 -> 500,36 -> 502,36 -> 502,27 -> 502,36 -> 504,36 -> 504,29 -> 504,36 -> 506,36 -> 506,34 -> 506,36 -> 508,36 -> 508,34 -> 508,36 -> 510,36 -> 510,30 -> 510,36 -> 512,36 -> 512,30 -> 512,36 +532,94 -> 536,94 +491,136 -> 491,138 -> 483,138 -> 483,141 -> 499,141 -> 499,138 -> 496,138 -> 496,136 +499,162 -> 503,162 +496,36 -> 496,34 -> 496,36 -> 498,36 -> 498,30 -> 498,36 -> 500,36 -> 500,31 -> 500,36 -> 502,36 -> 502,27 -> 502,36 -> 504,36 -> 504,29 -> 504,36 -> 506,36 -> 506,34 -> 506,36 -> 508,36 -> 508,34 -> 508,36 -> 510,36 -> 510,30 -> 510,36 -> 512,36 -> 512,30 -> 512,36 +520,94 -> 524,94 +491,119 -> 491,120 -> 503,120 -> 503,119 +494,23 -> 494,17 -> 494,23 -> 496,23 -> 496,20 -> 496,23 -> 498,23 -> 498,16 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,19 -> 502,23 -> 504,23 -> 504,18 -> 504,23 +491,119 -> 491,120 -> 503,120 -> 503,119 +504,107 -> 504,99 -> 504,107 -> 506,107 -> 506,97 -> 506,107 -> 508,107 -> 508,103 -> 508,107 +529,91 -> 533,91 +507,110 -> 511,110 +494,133 -> 503,133 -> 503,132 +491,136 -> 491,138 -> 483,138 -> 483,141 -> 499,141 -> 499,138 -> 496,138 -> 496,136 +496,36 -> 496,34 -> 496,36 -> 498,36 -> 498,30 -> 498,36 -> 500,36 -> 500,31 -> 500,36 -> 502,36 -> 502,27 -> 502,36 -> 504,36 -> 504,29 -> 504,36 -> 506,36 -> 506,34 -> 506,36 -> 508,36 -> 508,34 -> 508,36 -> 510,36 -> 510,30 -> 510,36 -> 512,36 -> 512,30 -> 512,36 +511,145 -> 511,146 -> 517,146 -> 517,145 +494,23 -> 494,17 -> 494,23 -> 496,23 -> 496,20 -> 496,23 -> 498,23 -> 498,16 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,19 -> 502,23 -> 504,23 -> 504,18 -> 504,23 +514,42 -> 514,46 -> 508,46 -> 508,51 -> 525,51 -> 525,46 -> 517,46 -> 517,42 +491,119 -> 491,120 -> 503,120 -> 503,119 +496,36 -> 496,34 -> 496,36 -> 498,36 -> 498,30 -> 498,36 -> 500,36 -> 500,31 -> 500,36 -> 502,36 -> 502,27 -> 502,36 -> 504,36 -> 504,29 -> 504,36 -> 506,36 -> 506,34 -> 506,36 -> 508,36 -> 508,34 -> 508,36 -> 510,36 -> 510,30 -> 510,36 -> 512,36 -> 512,30 -> 512,36 +491,136 -> 491,138 -> 483,138 -> 483,141 -> 499,141 -> 499,138 -> 496,138 -> 496,136 +496,160 -> 500,160 +505,123 -> 505,125 -> 501,125 -> 501,130 -> 511,130 -> 511,125 -> 508,125 -> 508,123 +527,57 -> 532,57 +496,36 -> 496,34 -> 496,36 -> 498,36 -> 498,30 -> 498,36 -> 500,36 -> 500,31 -> 500,36 -> 502,36 -> 502,27 -> 502,36 -> 504,36 -> 504,29 -> 504,36 -> 506,36 -> 506,34 -> 506,36 -> 508,36 -> 508,34 -> 508,36 -> 510,36 -> 510,30 -> 510,36 -> 512,36 -> 512,30 -> 512,36 +496,36 -> 496,34 -> 496,36 -> 498,36 -> 498,30 -> 498,36 -> 500,36 -> 500,31 -> 500,36 -> 502,36 -> 502,27 -> 502,36 -> 504,36 -> 504,29 -> 504,36 -> 506,36 -> 506,34 -> 506,36 -> 508,36 -> 508,34 -> 508,36 -> 510,36 -> 510,30 -> 510,36 -> 512,36 -> 512,30 -> 512,36 +508,94 -> 512,94 +532,66 -> 537,66 +496,36 -> 496,34 -> 496,36 -> 498,36 -> 498,30 -> 498,36 -> 500,36 -> 500,31 -> 500,36 -> 502,36 -> 502,27 -> 502,36 -> 504,36 -> 504,29 -> 504,36 -> 506,36 -> 506,34 -> 506,36 -> 508,36 -> 508,34 -> 508,36 -> 510,36 -> 510,30 -> 510,36 -> 512,36 -> 512,30 -> 512,36 +494,23 -> 494,17 -> 494,23 -> 496,23 -> 496,20 -> 496,23 -> 498,23 -> 498,16 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,19 -> 502,23 -> 504,23 -> 504,18 -> 504,23 +520,88 -> 524,88 +504,107 -> 504,99 -> 504,107 -> 506,107 -> 506,97 -> 506,107 -> 508,107 -> 508,103 -> 508,107 +514,88 -> 518,88 +514,42 -> 514,46 -> 508,46 -> 508,51 -> 525,51 -> 525,46 -> 517,46 -> 517,42 +504,107 -> 504,99 -> 504,107 -> 506,107 -> 506,97 -> 506,107 -> 508,107 -> 508,103 -> 508,107 +525,66 -> 530,66 +496,36 -> 496,34 -> 496,36 -> 498,36 -> 498,30 -> 498,36 -> 500,36 -> 500,31 -> 500,36 -> 502,36 -> 502,27 -> 502,36 -> 504,36 -> 504,29 -> 504,36 -> 506,36 -> 506,34 -> 506,36 -> 508,36 -> 508,34 -> 508,36 -> 510,36 -> 510,30 -> 510,36 -> 512,36 -> 512,30 -> 512,36 +491,136 -> 491,138 -> 483,138 -> 483,141 -> 499,141 -> 499,138 -> 496,138 -> 496,136 +535,63 -> 540,63 +496,36 -> 496,34 -> 496,36 -> 498,36 -> 498,30 -> 498,36 -> 500,36 -> 500,31 -> 500,36 -> 502,36 -> 502,27 -> 502,36 -> 504,36 -> 504,29 -> 504,36 -> 506,36 -> 506,34 -> 506,36 -> 508,36 -> 508,34 -> 508,36 -> 510,36 -> 510,30 -> 510,36 -> 512,36 -> 512,30 -> 512,36 +505,123 -> 505,125 -> 501,125 -> 501,130 -> 511,130 -> 511,125 -> 508,125 -> 508,123 +511,66 -> 516,66 +491,136 -> 491,138 -> 483,138 -> 483,141 -> 499,141 -> 499,138 -> 496,138 -> 496,136 +505,123 -> 505,125 -> 501,125 -> 501,130 -> 511,130 -> 511,125 -> 508,125 -> 508,123 +514,42 -> 514,46 -> 508,46 -> 508,51 -> 525,51 -> 525,46 -> 517,46 -> 517,42 +507,116 -> 511,116 +496,36 -> 496,34 -> 496,36 -> 498,36 -> 498,30 -> 498,36 -> 500,36 -> 500,31 -> 500,36 -> 502,36 -> 502,27 -> 502,36 -> 504,36 -> 504,29 -> 504,36 -> 506,36 -> 506,34 -> 506,36 -> 508,36 -> 508,34 -> 508,36 -> 510,36 -> 510,30 -> 510,36 -> 512,36 -> 512,30 -> 512,36 +507,149 -> 507,151 -> 502,151 -> 502,155 -> 516,155 -> 516,151 -> 511,151 -> 511,149 From 750f437003cfc7a87baad55069b0fcb82e2f24bd Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Wed, 14 Dec 2022 07:25:25 +0100 Subject: [PATCH 391/433] Use an infinite grid --- .../adventofcode/common/grid/CharGrid.java | 10 +++--- .../common/grid/InfiniteGrid.java | 28 +++++++++++++-- .../adventofcode/year22/days/Day14.java | 35 +++++++------------ 3 files changed, 43 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/common/grid/CharGrid.java b/src/main/java/com/sbaars/adventofcode/common/grid/CharGrid.java index 0381462c..02a26679 100644 --- a/src/main/java/com/sbaars/adventofcode/common/grid/CharGrid.java +++ b/src/main/java/com/sbaars/adventofcode/common/grid/CharGrid.java @@ -57,14 +57,14 @@ public String toString(){ } public char get(Point p) { - if (p.x >= 0 && p.x < grid.length && p.y >= 0 && p.y < grid[0].length) { - return grid[p.x][p.y]; + if (p.x >= 0 && p.x < grid[0].length && p.y >= 0 && p.y < grid.length) { + return grid[p.y][p.x]; } - return ' '; + return 0; } public void set(Point p, char i) { - if(get(p) == ' ') throw new IllegalStateException("Trying to write to coordinate outside of grid: "+p+", "+i); - grid[p.x][p.y] = i; + if(get(p) == 0) throw new IllegalStateException("Trying to write to coordinate outside of grid: "+p+", "+i); + grid[p.y][p.x] = i; } } diff --git a/src/main/java/com/sbaars/adventofcode/common/grid/InfiniteGrid.java b/src/main/java/com/sbaars/adventofcode/common/grid/InfiniteGrid.java index b2eb3613..3bfb28a8 100644 --- a/src/main/java/com/sbaars/adventofcode/common/grid/InfiniteGrid.java +++ b/src/main/java/com/sbaars/adventofcode/common/grid/InfiniteGrid.java @@ -3,11 +3,14 @@ import java.awt.*; import java.util.HashMap; import java.util.Map; +import java.util.Optional; import java.util.stream.IntStream; +import static java.util.Optional.empty; +import static java.util.Optional.of; + public class InfiniteGrid implements Grid { final Map grid = new HashMap<>(); - Point currentPos = new Point(0, 0); public InfiniteGrid(char[][] g) { for (int i = 0; i < g.length; i++) { @@ -17,7 +20,28 @@ public InfiniteGrid(char[][] g) { } } + public InfiniteGrid() {} + public IntStream iterate() { - return grid.values().stream().mapToInt(Character::getNumericValue); + return grid.values().stream().mapToInt(e -> e); + } + + public Optional get(Point p) { + return grid.containsKey(p) ? of(grid.get(p)) : empty(); + } + + public void set(Point p, char c) { + grid.put(p, c); + } + + public String toString() { + int minX = grid.keySet().stream().mapToInt(e -> e.x).min().getAsInt(); + int minY = grid.keySet().stream().mapToInt(e -> e.y).min().getAsInt(); + int maxX = grid.keySet().stream().mapToInt(e -> e.x).max().getAsInt(); + int maxY = grid.keySet().stream().mapToInt(e -> e.y).max().getAsInt(); + CharGrid g = new CharGrid(' ', maxX+1-minX, maxY+1-minY); + System.out.println(g.grid.length+", "+g.grid[0].length); + grid.forEach((p, i) -> g.set(new Point(p.x-minX, p.y-minY), i)); + return g.toString(); } } diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java index bc9b3b9d..5a58fff9 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java @@ -1,17 +1,18 @@ package com.sbaars.adventofcode.year22.days; -import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.common.Direction; import com.sbaars.adventofcode.common.grid.CharGrid; +import com.sbaars.adventofcode.common.grid.InfiniteGrid; import com.sbaars.adventofcode.year22.Day2022; import java.awt.*; -import java.util.Arrays; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; +import static java.util.stream.IntStream.rangeClosed; public class Day14 extends Day2022 { public Day14() { @@ -19,13 +20,7 @@ public Day14() { } public static void main(String[] args) { - Day d = new Day14(); - d.downloadIfNotDownloaded(); - d.downloadExample(); - d.printParts(); - // System.in.read(); -// d.submitPart1(); - d.submitPart2(); + new Day14().printParts(); } public record Pos(long x, long y){} @@ -33,7 +28,7 @@ public record Pos(long x, long y){} @Override public Object part1() { List> in = dayStream().map(s -> Arrays.asList(s.split(" -> ")).stream().map(s2 -> readString(s2, "%n,%n", Pos.class)).map(p -> new Point(Math.toIntExact(p.x), Math.toIntExact(p.y))).toList()).toList(); - CharGrid g = new CharGrid('.', 1000, 1000); + InfiniteGrid g = new InfiniteGrid(); for(List rock : in) { for(int i = 1; i g.set(new Point(j, p1.y), '#')); } else if(p1.y != p2.y) { int from = Math.min(p1.y, p2.y); int to = Math.max(p1.y, p2.y); - for(int j = from; j<=to; j++){ - g.set(new Point(p1.x, j), '#'); - } + rangeClosed(from, to).forEach(j -> g.set(new Point(p1.x, j), '#')); } } } Point sandOrigin = new Point(500, 0); - g.set(sandOrigin, '+'); Point fallingSand = sandOrigin; -// g.set(fallingSand, 'o'); while(fallingSand.y<950) { Point moveTo = Direction.SOUTH.move(fallingSand); - char destination = g.get(moveTo); - if(destination == '.') { + var destination = g.get(moveTo); + if(destination.isEmpty()) { fallingSand = moveTo; continue; } moveTo = Direction.SOUTHWEST.move(fallingSand); destination = g.get(moveTo); - if(destination == '.') { + if(destination.isEmpty()) { fallingSand = moveTo; continue; } moveTo = Direction.SOUTHEAST.move(fallingSand); destination = g.get(moveTo); - if(destination == '.') { + if(destination.isEmpty()) { fallingSand = moveTo; continue; } g.set(fallingSand, 'o'); fallingSand = sandOrigin; -// System.out.println(g.toString()); + System.out.println(g.toString()); } // System.out.println(g.countChar('#')); return g.countChar('o'); From 580cb207690fbecd15437343320fa8458c0b0a9b Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Wed, 14 Dec 2022 07:34:08 +0100 Subject: [PATCH 392/433] Day 14 extract function --- .../com/sbaars/adventofcode/common/Day.java | 4 +- .../common/grid/InfiniteGrid.java | 1 - .../adventofcode/year22/days/Day14.java | 68 +++---------------- 3 files changed, 13 insertions(+), 60 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/common/Day.java b/src/main/java/com/sbaars/adventofcode/common/Day.java index d1828235..9e7c32ae 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Day.java +++ b/src/main/java/com/sbaars/adventofcode/common/Day.java @@ -49,10 +49,10 @@ private String getDayPath() { public void printParts() { solutionPart1 = part1(); - solutionPart2 = part2(); if(solutionPart1 instanceof Optional) solutionPart1 = ((Optional)solutionPart1).get(); - if(solutionPart2 instanceof Optional) solutionPart2 = ((Optional)solutionPart2).get(); System.out.println("Part 1: " + solutionPart1); + solutionPart2 = part2(); + if(solutionPart2 instanceof Optional) solutionPart2 = ((Optional)solutionPart2).get(); System.out.println("Part 2: " + solutionPart2); } diff --git a/src/main/java/com/sbaars/adventofcode/common/grid/InfiniteGrid.java b/src/main/java/com/sbaars/adventofcode/common/grid/InfiniteGrid.java index 3bfb28a8..1eddec89 100644 --- a/src/main/java/com/sbaars/adventofcode/common/grid/InfiniteGrid.java +++ b/src/main/java/com/sbaars/adventofcode/common/grid/InfiniteGrid.java @@ -40,7 +40,6 @@ public String toString() { int maxX = grid.keySet().stream().mapToInt(e -> e.x).max().getAsInt(); int maxY = grid.keySet().stream().mapToInt(e -> e.y).max().getAsInt(); CharGrid g = new CharGrid(' ', maxX+1-minX, maxY+1-minY); - System.out.println(g.grid.length+", "+g.grid[0].length); grid.forEach((p, i) -> g.set(new Point(p.x-minX, p.y-minY), i)); return g.toString(); } diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java index 5a58fff9..4d71dcde 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java @@ -1,7 +1,6 @@ package com.sbaars.adventofcode.year22.days; import com.sbaars.adventofcode.common.Direction; -import com.sbaars.adventofcode.common.grid.CharGrid; import com.sbaars.adventofcode.common.grid.InfiniteGrid; import com.sbaars.adventofcode.year22.Day2022; @@ -27,7 +26,15 @@ public record Pos(long x, long y){} @Override public Object part1() { - List> in = dayStream().map(s -> Arrays.asList(s.split(" -> ")).stream().map(s2 -> readString(s2, "%n,%n", Pos.class)).map(p -> new Point(Math.toIntExact(p.x), Math.toIntExact(p.y))).toList()).toList(); + return amountOfSand(true); + } + + public int amountOfSand (boolean part1) { + List> in = dayStream().map(s -> Arrays.asList(s.split(" -> ")).stream().map(s2 -> readString(s2, "%n,%n", Pos.class)).map(p -> new Point(Math.toIntExact(p.x), Math.toIntExact(p.y))).toList()).collect(Collectors.toCollection(ArrayList::new)); + if(!part1) { + int maxY = in.stream().flatMapToInt(e -> e.stream().mapToInt(f -> f.y)).max().getAsInt() + 2; + in.add(List.of(new Point(0, maxY), new Point(999, maxY))); + } InfiniteGrid g = new InfiniteGrid(); for(List rock : in) { for(int i = 1; i> in = dayStream().map(s -> Arrays.asList(s.split(" -> ")).stream().map(s2 -> readString(s2, "%n,%n", Pos.class)).map(p -> new Point(Math.toIntExact(p.x), Math.toIntExact(p.y))).toList()).collect(Collectors.toCollection(ArrayList::new)); - CharGrid g = new CharGrid('.', 1000, 1000); - int maxY = in.stream().flatMapToInt(e -> e.stream().mapToInt(f -> f.y)).max().getAsInt() + 2; - in.add(List.of(new Point(0, maxY), new Point(999, maxY))); - for(List rock : in) { - for(int i = 1; i Date: Wed, 14 Dec 2022 07:54:33 +0100 Subject: [PATCH 393/433] Refactor solution --- .../adventofcode/year22/days/Day14.java | 39 +++++++------------ 1 file changed, 14 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java index 4d71dcde..daa6e9c6 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java @@ -1,6 +1,5 @@ package com.sbaars.adventofcode.year22.days; -import com.sbaars.adventofcode.common.Direction; import com.sbaars.adventofcode.common.grid.InfiniteGrid; import com.sbaars.adventofcode.year22.Day2022; @@ -9,7 +8,9 @@ import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; +import java.util.stream.Stream; +import static com.sbaars.adventofcode.common.Direction.*; import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; import static java.util.stream.IntStream.rangeClosed; @@ -29,7 +30,12 @@ public Object part1() { return amountOfSand(true); } - public int amountOfSand (boolean part1) { + @Override + public Object part2() { + return amountOfSand(false); + } + + public int amountOfSand(boolean part1) { List> in = dayStream().map(s -> Arrays.asList(s.split(" -> ")).stream().map(s2 -> readString(s2, "%n,%n", Pos.class)).map(p -> new Point(Math.toIntExact(p.x), Math.toIntExact(p.y))).toList()).collect(Collectors.toCollection(ArrayList::new)); if(!part1) { int maxY = in.stream().flatMapToInt(e -> e.stream().mapToInt(f -> f.y)).max().getAsInt() + 2; @@ -54,32 +60,15 @@ public int amountOfSand (boolean part1) { Point sandOrigin = new Point(500, 0); Point fallingSand = sandOrigin; while(part1 ? fallingSand.y<950 : g.get(sandOrigin).isEmpty()) { - Point moveTo = Direction.SOUTH.move(fallingSand); - var destination = g.get(moveTo); - if(destination.isEmpty()) { - fallingSand = moveTo; - continue; - } - moveTo = Direction.SOUTHWEST.move(fallingSand); - destination = g.get(moveTo); - if(destination.isEmpty()) { + Point finalFallingSand = fallingSand; + Point moveTo = Stream.of(SOUTH, SOUTHWEST, SOUTHEAST, CENTER).map(d -> d.move(finalFallingSand)).filter(p -> g.get(p).isEmpty()).findFirst().get(); + if(moveTo.equals(fallingSand)) { + g.set(fallingSand, 'o'); + fallingSand = sandOrigin; + } else { fallingSand = moveTo; - continue; } - moveTo = Direction.SOUTHEAST.move(fallingSand); - destination = g.get(moveTo); - if(destination.isEmpty()) { - fallingSand = moveTo; - continue; - } - g.set(fallingSand, 'o'); - fallingSand = sandOrigin; } return g.countChar('o'); } - - @Override - public Object part2() { - return amountOfSand(false); - } } From 6a925627a00c5787c729b0fbe6782a784cb532da Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Wed, 14 Dec 2022 07:55:12 +0100 Subject: [PATCH 394/433] IntelliJ pls --- src/main/java/com/sbaars/adventofcode/year22/days/Day14.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java index daa6e9c6..e85502eb 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java @@ -3,7 +3,7 @@ import com.sbaars.adventofcode.common.grid.InfiniteGrid; import com.sbaars.adventofcode.year22.Day2022; -import java.awt.*; +import java.awt.Point; import java.util.ArrayList; import java.util.Arrays; import java.util.List; From d2b395eeb323d5a046931089fb97c141b392ea05 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Wed, 14 Dec 2022 09:00:00 +0100 Subject: [PATCH 395/433] Extract some functions --- .../com/sbaars/adventofcode/common/Loc.java | 5 ----- .../adventofcode/network/DownloadTests.java | 2 +- .../adventofcode/year22/days/Day14.java | 14 +++++++++++-- .../adventofcode/year22/days/Day14Test.java | 20 +++++++++++++++++++ 4 files changed, 33 insertions(+), 8 deletions(-) create mode 100644 src/test/java/com/sbaars/adventofcode/year22/days/Day14Test.java diff --git a/src/main/java/com/sbaars/adventofcode/common/Loc.java b/src/main/java/com/sbaars/adventofcode/common/Loc.java index 84a10773..5c1f55da 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Loc.java +++ b/src/main/java/com/sbaars/adventofcode/common/Loc.java @@ -48,11 +48,6 @@ public Loc(long x, long y) { this.y = y; } - public Loc(int x, int y) { - this.x = x; - this.y = y; - } - public Loc(Point p) { this.x = p.x; this.y = p.y; diff --git a/src/main/java/com/sbaars/adventofcode/network/DownloadTests.java b/src/main/java/com/sbaars/adventofcode/network/DownloadTests.java index 88c82cb4..5424985a 100644 --- a/src/main/java/com/sbaars/adventofcode/network/DownloadTests.java +++ b/src/main/java/com/sbaars/adventofcode/network/DownloadTests.java @@ -29,7 +29,7 @@ public DownloadTests() { } public static void main(String[] args) { - new DownloadTests().runForYear("2022"); + new DownloadTests().retrieveTests("14", "2022"); } public void retrieveTests(String day, String year) { diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java index e85502eb..c2358f9d 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java @@ -1,9 +1,10 @@ package com.sbaars.adventofcode.year22.days; +import com.sbaars.adventofcode.common.Loc; import com.sbaars.adventofcode.common.grid.InfiniteGrid; import com.sbaars.adventofcode.year22.Day2022; -import java.awt.Point; +import java.awt.*; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -36,11 +37,16 @@ public Object part2() { } public int amountOfSand(boolean part1) { - List> in = dayStream().map(s -> Arrays.asList(s.split(" -> ")).stream().map(s2 -> readString(s2, "%n,%n", Pos.class)).map(p -> new Point(Math.toIntExact(p.x), Math.toIntExact(p.y))).toList()).collect(Collectors.toCollection(ArrayList::new)); + List> in = dayStream().map(s -> Arrays.asList(s.split(" -> ")).stream().map(s2 -> readString(s2, "%n,%n", Loc.class).getPoint()).toList()).collect(Collectors.toCollection(ArrayList::new)); if(!part1) { int maxY = in.stream().flatMapToInt(e -> e.stream().mapToInt(f -> f.y)).max().getAsInt() + 2; in.add(List.of(new Point(0, maxY), new Point(999, maxY))); } + InfiniteGrid g = constructWalls(in); + return simulateSand(part1, g); + } + + private static InfiniteGrid constructWalls(List> in) { InfiniteGrid g = new InfiniteGrid(); for(List rock : in) { for(int i = 1; i Date: Wed, 14 Dec 2022 09:00:22 +0100 Subject: [PATCH 396/433] Update iml file --- adventofcode.iml | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 adventofcode.iml diff --git a/adventofcode.iml b/adventofcode.iml new file mode 100644 index 00000000..d6f46685 --- /dev/null +++ b/adventofcode.iml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 41a8148250b8a0647c8ebdc84cbb725138781728 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Wed, 14 Dec 2022 09:17:33 +0100 Subject: [PATCH 397/433] Move locations to location folder --- .../com/sbaars/adventofcode/common/{ => location}/IntLoc.java | 2 +- .../com/sbaars/adventofcode/common/{ => location}/Loc.java | 2 +- .../com/sbaars/adventofcode/common/{ => location}/Loc3D.java | 2 +- src/main/java/com/sbaars/adventofcode/year18/days/Day3.java | 2 +- src/main/java/com/sbaars/adventofcode/year21/days/Day19.java | 4 ++-- src/main/java/com/sbaars/adventofcode/year21/days/Day2.java | 2 +- src/main/java/com/sbaars/adventofcode/year21/days/Day20.java | 2 +- src/main/java/com/sbaars/adventofcode/year21/days/Day22.java | 2 +- src/main/java/com/sbaars/adventofcode/year22/days/Day14.java | 4 +--- 9 files changed, 10 insertions(+), 12 deletions(-) rename src/main/java/com/sbaars/adventofcode/common/{ => location}/IntLoc.java (98%) rename src/main/java/com/sbaars/adventofcode/common/{ => location}/Loc.java (98%) rename src/main/java/com/sbaars/adventofcode/common/{ => location}/Loc3D.java (98%) diff --git a/src/main/java/com/sbaars/adventofcode/common/IntLoc.java b/src/main/java/com/sbaars/adventofcode/common/location/IntLoc.java similarity index 98% rename from src/main/java/com/sbaars/adventofcode/common/IntLoc.java rename to src/main/java/com/sbaars/adventofcode/common/location/IntLoc.java index 97d047db..4c064294 100644 --- a/src/main/java/com/sbaars/adventofcode/common/IntLoc.java +++ b/src/main/java/com/sbaars/adventofcode/common/location/IntLoc.java @@ -23,7 +23,7 @@ * questions. */ -package com.sbaars.adventofcode.common; +package com.sbaars.adventofcode.common.location; import java.awt.*; import java.util.stream.IntStream; diff --git a/src/main/java/com/sbaars/adventofcode/common/Loc.java b/src/main/java/com/sbaars/adventofcode/common/location/Loc.java similarity index 98% rename from src/main/java/com/sbaars/adventofcode/common/Loc.java rename to src/main/java/com/sbaars/adventofcode/common/location/Loc.java index 5c1f55da..dd7144c8 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Loc.java +++ b/src/main/java/com/sbaars/adventofcode/common/location/Loc.java @@ -23,7 +23,7 @@ * questions. */ -package com.sbaars.adventofcode.common; +package com.sbaars.adventofcode.common.location; import java.awt.*; import java.util.stream.IntStream; diff --git a/src/main/java/com/sbaars/adventofcode/common/Loc3D.java b/src/main/java/com/sbaars/adventofcode/common/location/Loc3D.java similarity index 98% rename from src/main/java/com/sbaars/adventofcode/common/Loc3D.java rename to src/main/java/com/sbaars/adventofcode/common/location/Loc3D.java index b156c552..3c2cc2f5 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Loc3D.java +++ b/src/main/java/com/sbaars/adventofcode/common/location/Loc3D.java @@ -23,7 +23,7 @@ * questions. */ -package com.sbaars.adventofcode.common; +package com.sbaars.adventofcode.common.location; import java.util.List; diff --git a/src/main/java/com/sbaars/adventofcode/year18/days/Day3.java b/src/main/java/com/sbaars/adventofcode/year18/days/Day3.java index c6f616ed..3e513b6a 100644 --- a/src/main/java/com/sbaars/adventofcode/year18/days/Day3.java +++ b/src/main/java/com/sbaars/adventofcode/year18/days/Day3.java @@ -2,7 +2,7 @@ import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; -import com.sbaars.adventofcode.common.Loc; +import com.sbaars.adventofcode.common.location.Loc; import com.sbaars.adventofcode.year18.Day2018; import java.util.HashSet; import java.util.List; diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java index dbbe1651..33e28967 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java @@ -1,7 +1,7 @@ package com.sbaars.adventofcode.year21.days; -import com.sbaars.adventofcode.common.IntLoc; -import com.sbaars.adventofcode.common.Loc3D; +import com.sbaars.adventofcode.common.location.IntLoc; +import com.sbaars.adventofcode.common.location.Loc3D; import com.sbaars.adventofcode.year21.Day2021; import java.util.ArrayDeque; import java.util.ArrayList; diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day2.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day2.java index 6e01b4e3..8d3ee11f 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day2.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day2.java @@ -3,7 +3,7 @@ import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; import com.sbaars.adventofcode.common.Direction; -import com.sbaars.adventofcode.common.Loc; +import com.sbaars.adventofcode.common.location.Loc; import com.sbaars.adventofcode.year21.Day2021; import java.awt.*; import java.util.List; diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java index 4ccaa73e..e2ffb098 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day20.java @@ -10,7 +10,7 @@ import static com.sbaars.adventofcode.common.Direction.WEST; import static com.sbaars.adventofcode.common.Direction.NORTHWEST; -import com.sbaars.adventofcode.common.IntLoc; +import com.sbaars.adventofcode.common.location.IntLoc; import com.sbaars.adventofcode.common.grid.CharGrid; import com.sbaars.adventofcode.common.grid.Coordinates; import com.sbaars.adventofcode.common.grid.NumGrid; diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day22.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day22.java index 5ac33099..2ed080c2 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day22.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day22.java @@ -3,7 +3,7 @@ import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; import static java.math.BigInteger.ZERO; -import com.sbaars.adventofcode.common.Loc3D; +import com.sbaars.adventofcode.common.location.Loc3D; import com.sbaars.adventofcode.year21.Day2021; import java.math.BigInteger; import java.util.ArrayList; diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java index c2358f9d..78e6bff3 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java @@ -1,6 +1,6 @@ package com.sbaars.adventofcode.year22.days; -import com.sbaars.adventofcode.common.Loc; +import com.sbaars.adventofcode.common.location.Loc; import com.sbaars.adventofcode.common.grid.InfiniteGrid; import com.sbaars.adventofcode.year22.Day2022; @@ -24,8 +24,6 @@ public static void main(String[] args) { new Day14().printParts(); } - public record Pos(long x, long y){} - @Override public Object part1() { return amountOfSand(true); From 07b9c1249bf1a0214a1963724924b6d770460d69 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Wed, 14 Dec 2022 10:22:56 +0100 Subject: [PATCH 398/433] Change point usage to Loc --- .../sbaars/adventofcode/common/Direction.java | 20 ++++++++++ .../adventofcode/common/grid/CharGrid.java | 19 +++++----- .../common/grid/InfiniteGrid.java | 23 +++++------ .../adventofcode/common/location/Loc.java | 16 ++++++-- .../adventofcode/common/location/Range.java | 18 +++++++++ .../adventofcode/year22/days/Day14.java | 38 +++++++------------ 6 files changed, 86 insertions(+), 48 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode/common/location/Range.java diff --git a/src/main/java/com/sbaars/adventofcode/common/Direction.java b/src/main/java/com/sbaars/adventofcode/common/Direction.java index 72eb9e93..9c7f9f3f 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Direction.java +++ b/src/main/java/com/sbaars/adventofcode/common/Direction.java @@ -1,5 +1,7 @@ package com.sbaars.adventofcode.common; +import com.sbaars.adventofcode.common.location.Loc; + import java.awt.*; import java.util.Arrays; @@ -79,6 +81,20 @@ public Point move(Point currentLocation, int amount) { }; } + public Loc move(Loc currentLocation, int amount) { + return switch (this) { + case SOUTH -> new Loc(currentLocation.x, currentLocation.y + amount); + case NORTH -> new Loc(currentLocation.x, currentLocation.y - amount); + case EAST -> new Loc(currentLocation.x + amount, currentLocation.y); + case WEST -> new Loc(currentLocation.x - amount, currentLocation.y); + case SOUTHWEST -> new Loc(currentLocation.x - amount, currentLocation.y + amount); + case NORTHEAST -> new Loc(currentLocation.x + amount, currentLocation.y - amount); + case SOUTHEAST -> new Loc(currentLocation.x + amount, currentLocation.y + amount); + case NORTHWEST -> new Loc(currentLocation.x - amount, currentLocation.y - amount); + case CENTER -> new Loc(currentLocation.x, currentLocation.y); + }; + } + public Point moveFix(Point currentLocation, int amount) { return switch (this) { case SOUTH -> new Point(currentLocation.x, currentLocation.y + amount); @@ -116,6 +132,10 @@ public Point move(Point currentLocation) { return move(currentLocation, 1); } + public Loc move(Loc currentLocation) { + return move(currentLocation, 1); + } + public Point moveFix(Point currentLocation) { return moveFix(currentLocation, 1); } diff --git a/src/main/java/com/sbaars/adventofcode/common/grid/CharGrid.java b/src/main/java/com/sbaars/adventofcode/common/grid/CharGrid.java index 02a26679..37ef10c6 100644 --- a/src/main/java/com/sbaars/adventofcode/common/grid/CharGrid.java +++ b/src/main/java/com/sbaars/adventofcode/common/grid/CharGrid.java @@ -1,6 +1,7 @@ package com.sbaars.adventofcode.common.grid; -import java.awt.*; +import com.sbaars.adventofcode.common.location.Loc; + import java.util.Arrays; import java.util.stream.IntStream; @@ -15,10 +16,10 @@ public CharGrid(String s) { grid = Arrays.stream(s.split("\n")).map(String::toCharArray).toArray(char[][]::new); } - public CharGrid(char c, int sizex, int sizey) { - this.grid = new char[sizey][sizex]; - for(int y = 0; y= 0 && p.x < grid[0].length && p.y >= 0 && p.y < grid.length) { - return grid[p.y][p.x]; + return grid[p.intY()][p.intX()]; } return 0; } - public void set(Point p, char i) { + public void set(Loc p, char i) { if(get(p) == 0) throw new IllegalStateException("Trying to write to coordinate outside of grid: "+p+", "+i); - grid[p.y][p.x] = i; + grid[p.intY()][p.intX()] = i; } } diff --git a/src/main/java/com/sbaars/adventofcode/common/grid/InfiniteGrid.java b/src/main/java/com/sbaars/adventofcode/common/grid/InfiniteGrid.java index 1eddec89..973a960b 100644 --- a/src/main/java/com/sbaars/adventofcode/common/grid/InfiniteGrid.java +++ b/src/main/java/com/sbaars/adventofcode/common/grid/InfiniteGrid.java @@ -1,6 +1,7 @@ package com.sbaars.adventofcode.common.grid; -import java.awt.*; +import com.sbaars.adventofcode.common.location.Loc; + import java.util.HashMap; import java.util.Map; import java.util.Optional; @@ -10,12 +11,12 @@ import static java.util.Optional.of; public class InfiniteGrid implements Grid { - final Map grid = new HashMap<>(); + final Map grid = new HashMap<>(); public InfiniteGrid(char[][] g) { for (int i = 0; i < g.length; i++) { for (int j = 0; j < g[0].length; j++) { - grid.put(new Point(j, i), g[i][j]); + grid.put(new Loc(j, i), g[i][j]); } } } @@ -26,21 +27,21 @@ public IntStream iterate() { return grid.values().stream().mapToInt(e -> e); } - public Optional get(Point p) { + public Optional get(Loc p) { return grid.containsKey(p) ? of(grid.get(p)) : empty(); } - public void set(Point p, char c) { + public void set(Loc p, char c) { grid.put(p, c); } public String toString() { - int minX = grid.keySet().stream().mapToInt(e -> e.x).min().getAsInt(); - int minY = grid.keySet().stream().mapToInt(e -> e.y).min().getAsInt(); - int maxX = grid.keySet().stream().mapToInt(e -> e.x).max().getAsInt(); - int maxY = grid.keySet().stream().mapToInt(e -> e.y).max().getAsInt(); - CharGrid g = new CharGrid(' ', maxX+1-minX, maxY+1-minY); - grid.forEach((p, i) -> g.set(new Point(p.x-minX, p.y-minY), i)); + long minX = grid.keySet().stream().mapToLong(e -> e.x).min().getAsLong(); + long minY = grid.keySet().stream().mapToLong(e -> e.y).min().getAsLong(); + long maxX = grid.keySet().stream().mapToLong(e -> e.x).max().getAsLong(); + long maxY = grid.keySet().stream().mapToLong(e -> e.y).max().getAsLong(); + CharGrid g = new CharGrid(' ', new Loc(maxX+1-minX, maxY+1-minY)); + grid.forEach((p, i) -> g.set(new Loc(p.x-minX, p.y-minY), i)); return g.toString(); } } diff --git a/src/main/java/com/sbaars/adventofcode/common/location/Loc.java b/src/main/java/com/sbaars/adventofcode/common/location/Loc.java index dd7144c8..7586d4e5 100644 --- a/src/main/java/com/sbaars/adventofcode/common/location/Loc.java +++ b/src/main/java/com/sbaars/adventofcode/common/location/Loc.java @@ -32,8 +32,8 @@ import static java.lang.Math.toIntExact; public class Loc { - public final long x; - public final long y; + public long x; + public long y; public Loc() { this(0, 0); @@ -65,12 +65,22 @@ public Loc move(int dx, int dy) { return new Loc(x + dx, y + dy); } + public Loc set(long x, long y) { + this.x = x; + this.y = y; + return this; + } + + public Loc set(Loc l) { + return set(l.x, l.y); + } + public Loc move(Loc l) { return new Loc(x + l.x, y + l.y); } public Point getPoint() { - return new Point(toIntExact(x), toIntExact(y)); + return new Point(intX(), intY()); } public static Stream range(int i, int j){ diff --git a/src/main/java/com/sbaars/adventofcode/common/location/Range.java b/src/main/java/com/sbaars/adventofcode/common/location/Range.java new file mode 100644 index 00000000..98fea68e --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/common/location/Range.java @@ -0,0 +1,18 @@ +package com.sbaars.adventofcode.common.location; + +import java.util.stream.IntStream; +import java.util.stream.Stream; + +public class Range { + private final Loc start; + private final Loc end; + + public Range(Loc start, Loc end) { + this.start = start; + this.end = end; + } + + public Stream stream(){ + return IntStream.range(Math.min(start.intX(), end.intX()), Math.max(start.intX(), end.intX())).boxed().flatMap(x -> IntStream.range(Math.min(start.intY(), end.intY()), Math.max(start.intY(), end.intY())).mapToObj(y -> new Loc(x, y))); + } +} diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java index 78e6bff3..3c43e2ec 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java @@ -1,10 +1,10 @@ package com.sbaars.adventofcode.year22.days; -import com.sbaars.adventofcode.common.location.Loc; import com.sbaars.adventofcode.common.grid.InfiniteGrid; +import com.sbaars.adventofcode.common.location.Loc; +import com.sbaars.adventofcode.common.location.Range; import com.sbaars.adventofcode.year22.Day2022; -import java.awt.*; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -13,7 +13,6 @@ import static com.sbaars.adventofcode.common.Direction.*; import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; -import static java.util.stream.IntStream.rangeClosed; public class Day14 extends Day2022 { public Day14() { @@ -35,46 +34,35 @@ public Object part2() { } public int amountOfSand(boolean part1) { - List> in = dayStream().map(s -> Arrays.asList(s.split(" -> ")).stream().map(s2 -> readString(s2, "%n,%n", Loc.class).getPoint()).toList()).collect(Collectors.toCollection(ArrayList::new)); + List> in = dayStream().map(s -> Arrays.asList(s.split(" -> ")).stream().map(s2 -> readString(s2, "%n,%n", Loc.class)).toList()).collect(Collectors.toCollection(ArrayList::new)); if(!part1) { - int maxY = in.stream().flatMapToInt(e -> e.stream().mapToInt(f -> f.y)).max().getAsInt() + 2; - in.add(List.of(new Point(0, maxY), new Point(999, maxY))); + long maxY = in.stream().flatMapToLong(e -> e.stream().mapToLong(f -> f.y)).max().getAsLong() + 2; + in.add(List.of(new Loc(0, maxY), new Loc(999, maxY))); } InfiniteGrid g = constructWalls(in); return simulateSand(part1, g); } - private static InfiniteGrid constructWalls(List> in) { + private static InfiniteGrid constructWalls(List> in) { InfiniteGrid g = new InfiniteGrid(); - for(List rock : in) { + for(List rock : in) { for(int i = 1; i g.set(new Point(j, p1.y), '#')); - } else if(p1.y != p2.y) { - int from = Math.min(p1.y, p2.y); - int to = Math.max(p1.y, p2.y); - rangeClosed(from, to).forEach(j -> g.set(new Point(p1.x, j), '#')); - } + new Range(rock.get(i-1), rock.get(i)).stream().forEach(l -> g.set(l, '#')); } } return g; } private static int simulateSand(boolean part1, InfiniteGrid g) { - Point sandOrigin = new Point(500, 0); - Point fallingSand = sandOrigin; + Loc sandOrigin = new Loc(500, 0); + Loc fallingSand = sandOrigin; while(part1 ? fallingSand.y<950 : g.get(sandOrigin).isEmpty()) { - Point finalFallingSand = fallingSand; - Point moveTo = Stream.of(SOUTH, SOUTHWEST, SOUTHEAST, CENTER).map(d -> d.move(finalFallingSand)).filter(p -> g.get(p).isEmpty()).findFirst().get(); + Loc moveTo = Stream.of(SOUTH, SOUTHWEST, SOUTHEAST, CENTER).map(d -> d.move(fallingSand)).filter(p -> g.get(p).isEmpty()).findFirst().get(); if(moveTo.equals(fallingSand)) { g.set(fallingSand, 'o'); - fallingSand = sandOrigin; + fallingSand.set(sandOrigin); } else { - fallingSand = moveTo; + fallingSand.set(moveTo); } } return g.countChar('o'); From afcdf8982118f5e02ab9b0ee7b7096aa97e754e2 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Wed, 14 Dec 2022 10:53:09 +0100 Subject: [PATCH 399/433] Make some more utility classes --- .../common/grid/InfiniteGrid.java | 8 ++-- .../adventofcode/common/location/Loc.java | 19 ++------ .../common/location/MutableLoc.java | 43 +++++++++++++++++++ .../adventofcode/common/location/Range.java | 7 ++- .../adventofcode/year22/days/Day14.java | 11 ++--- 5 files changed, 61 insertions(+), 27 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode/common/location/MutableLoc.java diff --git a/src/main/java/com/sbaars/adventofcode/common/grid/InfiniteGrid.java b/src/main/java/com/sbaars/adventofcode/common/grid/InfiniteGrid.java index 973a960b..f4c0a364 100644 --- a/src/main/java/com/sbaars/adventofcode/common/grid/InfiniteGrid.java +++ b/src/main/java/com/sbaars/adventofcode/common/grid/InfiniteGrid.java @@ -36,10 +36,10 @@ public void set(Loc p, char c) { } public String toString() { - long minX = grid.keySet().stream().mapToLong(e -> e.x).min().getAsLong(); - long minY = grid.keySet().stream().mapToLong(e -> e.y).min().getAsLong(); - long maxX = grid.keySet().stream().mapToLong(e -> e.x).max().getAsLong(); - long maxY = grid.keySet().stream().mapToLong(e -> e.y).max().getAsLong(); + long minX = grid.keySet().stream().mapToLong(e -> e.x).min().orElse(0); + long minY = grid.keySet().stream().mapToLong(e -> e.y).min().orElse(0); + long maxX = grid.keySet().stream().mapToLong(e -> e.x).max().orElse(0); + long maxY = grid.keySet().stream().mapToLong(e -> e.y).max().orElse(0); CharGrid g = new CharGrid(' ', new Loc(maxX+1-minX, maxY+1-minY)); grid.forEach((p, i) -> g.set(new Loc(p.x-minX, p.y-minY), i)); return g.toString(); diff --git a/src/main/java/com/sbaars/adventofcode/common/location/Loc.java b/src/main/java/com/sbaars/adventofcode/common/location/Loc.java index 7586d4e5..a427176c 100644 --- a/src/main/java/com/sbaars/adventofcode/common/location/Loc.java +++ b/src/main/java/com/sbaars/adventofcode/common/location/Loc.java @@ -32,8 +32,8 @@ import static java.lang.Math.toIntExact; public class Loc { - public long x; - public long y; + public final long x; + public final long y; public Loc() { this(0, 0); @@ -49,8 +49,7 @@ public Loc(long x, long y) { } public Loc(Point p) { - this.x = p.x; - this.y = p.y; + this(p.x, p.y); } public long getX() { @@ -65,16 +64,6 @@ public Loc move(int dx, int dy) { return new Loc(x + dx, y + dy); } - public Loc set(long x, long y) { - this.x = x; - this.y = y; - return this; - } - - public Loc set(Loc l) { - return set(l.x, l.y); - } - public Loc move(Loc l) { return new Loc(x + l.x, y + l.y); } @@ -91,9 +80,7 @@ public static Stream range(int i, int j){ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - Loc loc = (Loc) o; - if (x != loc.x) return false; return y == loc.y; } diff --git a/src/main/java/com/sbaars/adventofcode/common/location/MutableLoc.java b/src/main/java/com/sbaars/adventofcode/common/location/MutableLoc.java new file mode 100644 index 00000000..ff52777c --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/common/location/MutableLoc.java @@ -0,0 +1,43 @@ +package com.sbaars.adventofcode.common.location; + +import java.awt.*; + +public class MutableLoc { + private Loc loc; + + public MutableLoc() { + this(0, 0); + } + + public MutableLoc(Loc p) { + this(p.x, p.y); + } + + public MutableLoc(long x, long y) { + this.loc = new Loc(x, y); + } + + public MutableLoc(Point p) { + this(p.x, p.y); + } + public Loc move(int dx, int dy) { + return set(loc.x + dx, loc.y + dy); + } + + public Loc set(long x, long y) { + this.loc = new Loc(x, y); + return this.loc; + } + + public Loc set(Loc l) { + return set(l.x, l.y); + } + + public Loc move(Loc l) { + return set(loc.x + l.x, loc.y + l.y); + } + + public Loc get() { + return loc; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/common/location/Range.java b/src/main/java/com/sbaars/adventofcode/common/location/Range.java index 98fea68e..e25d7059 100644 --- a/src/main/java/com/sbaars/adventofcode/common/location/Range.java +++ b/src/main/java/com/sbaars/adventofcode/common/location/Range.java @@ -1,8 +1,9 @@ package com.sbaars.adventofcode.common.location; -import java.util.stream.IntStream; import java.util.stream.Stream; +import static java.util.stream.IntStream.rangeClosed; + public class Range { private final Loc start; private final Loc end; @@ -13,6 +14,8 @@ public Range(Loc start, Loc end) { } public Stream stream(){ - return IntStream.range(Math.min(start.intX(), end.intX()), Math.max(start.intX(), end.intX())).boxed().flatMap(x -> IntStream.range(Math.min(start.intY(), end.intY()), Math.max(start.intY(), end.intY())).mapToObj(y -> new Loc(x, y))); + return rangeClosed(Math.min(start.intX(), end.intX()), Math.max(start.intX(), end.intX())) + .boxed() + .flatMap(x -> rangeClosed(Math.min(start.intY(), end.intY()), Math.max(start.intY(), end.intY())).mapToObj(y -> new Loc(x, y))); } } diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java index 3c43e2ec..618277d4 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java @@ -2,6 +2,7 @@ import com.sbaars.adventofcode.common.grid.InfiniteGrid; import com.sbaars.adventofcode.common.location.Loc; +import com.sbaars.adventofcode.common.location.MutableLoc; import com.sbaars.adventofcode.common.location.Range; import com.sbaars.adventofcode.year22.Day2022; @@ -55,11 +56,11 @@ private static InfiniteGrid constructWalls(List> in) { private static int simulateSand(boolean part1, InfiniteGrid g) { Loc sandOrigin = new Loc(500, 0); - Loc fallingSand = sandOrigin; - while(part1 ? fallingSand.y<950 : g.get(sandOrigin).isEmpty()) { - Loc moveTo = Stream.of(SOUTH, SOUTHWEST, SOUTHEAST, CENTER).map(d -> d.move(fallingSand)).filter(p -> g.get(p).isEmpty()).findFirst().get(); - if(moveTo.equals(fallingSand)) { - g.set(fallingSand, 'o'); + MutableLoc fallingSand = new MutableLoc(sandOrigin); + while(part1 ? fallingSand.get().y<950 : g.get(sandOrigin).isEmpty()) { + Loc moveTo = Stream.of(SOUTH, SOUTHWEST, SOUTHEAST, CENTER).map(d -> d.move(fallingSand.get())).filter(p -> g.get(p).isEmpty()).findFirst().get(); + if(moveTo.equals(fallingSand.get())) { + g.set(fallingSand.get(), 'o'); fallingSand.set(sandOrigin); } else { fallingSand.set(moveTo); From 4dd88e21e8c954f8830df7d293fd56412873e881 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Wed, 14 Dec 2022 11:38:06 +0100 Subject: [PATCH 400/433] Make some more utils --- .../com/sbaars/adventofcode/common/Pair.java | 43 +++++++++++++++++++ .../common/grid/InfiniteGrid.java | 28 +++++++++--- .../sbaars/adventofcode/util/AOCUtils.java | 14 ++++++ .../adventofcode/year22/days/Day14.java | 10 ++--- 4 files changed, 83 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode/common/Pair.java diff --git a/src/main/java/com/sbaars/adventofcode/common/Pair.java b/src/main/java/com/sbaars/adventofcode/common/Pair.java new file mode 100644 index 00000000..6c0f1586 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/common/Pair.java @@ -0,0 +1,43 @@ +package com.sbaars.adventofcode.common; + +import java.util.Objects; + +public class Pair { + private final A a; + private final B b; + + public Pair(A a, B b){ + this.a = a; + this.b = b; + } + + public static Pair of(A a, B b) { + return new Pair(a, b); + } + + public A getA() { + return a; + } + + public B getB() { + return b; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Pair either = (Pair) o; + + if (!Objects.equals(a, either.a)) return false; + return Objects.equals(b, either.b); + } + + @Override + public int hashCode() { + int result = a != null ? a.hashCode() : 0; + result = 31 * result + (b != null ? b.hashCode() : 0); + return result; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/common/grid/InfiniteGrid.java b/src/main/java/com/sbaars/adventofcode/common/grid/InfiniteGrid.java index f4c0a364..fb694f3f 100644 --- a/src/main/java/com/sbaars/adventofcode/common/grid/InfiniteGrid.java +++ b/src/main/java/com/sbaars/adventofcode/common/grid/InfiniteGrid.java @@ -2,18 +2,22 @@ import com.sbaars.adventofcode.common.location.Loc; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; +import java.util.*; +import java.util.function.BiConsumer; +import java.util.function.BinaryOperator; +import java.util.function.Function; +import java.util.function.Supplier; +import java.util.stream.Collector; import java.util.stream.IntStream; import static java.util.Optional.empty; import static java.util.Optional.of; public class InfiniteGrid implements Grid { - final Map grid = new HashMap<>(); + final Map grid; public InfiniteGrid(char[][] g) { + this(); for (int i = 0; i < g.length; i++) { for (int j = 0; j < g[0].length; j++) { grid.put(new Loc(j, i), g[i][j]); @@ -21,7 +25,13 @@ public InfiniteGrid(char[][] g) { } } - public InfiniteGrid() {} + public InfiniteGrid(Map grid) { + this.grid = grid; + } + + public InfiniteGrid() { + this.grid = new HashMap<>(); + } public IntStream iterate() { return grid.values().stream().mapToInt(e -> e); @@ -44,4 +54,12 @@ public String toString() { grid.forEach((p, i) -> g.set(new Loc(p.x-minX, p.y-minY), i)); return g.toString(); } + + public static Collector, InfiniteGrid> toInfiniteGrid(char c) { + final Supplier> supplier = HashMap::new; + final BiConsumer, Loc> accumulator = (a, b) -> a.put(b, c); + final BinaryOperator> combiner = (a, b) -> {a.putAll(b); return a;}; + final Function, InfiniteGrid> finisher = a -> new InfiniteGrid(a); + return Collector.of(supplier, accumulator, combiner, finisher); + } } diff --git a/src/main/java/com/sbaars/adventofcode/util/AOCUtils.java b/src/main/java/com/sbaars/adventofcode/util/AOCUtils.java index ea4f383d..989b6430 100644 --- a/src/main/java/com/sbaars/adventofcode/util/AOCUtils.java +++ b/src/main/java/com/sbaars/adventofcode/util/AOCUtils.java @@ -1,5 +1,11 @@ package com.sbaars.adventofcode.util; +import com.sbaars.adventofcode.common.Pair; + +import java.util.List; +import java.util.stream.IntStream; +import java.util.stream.Stream; + public class AOCUtils { public static void verify(boolean b) { verify(b, "Something went wrong"); @@ -10,4 +16,12 @@ public static void verify(boolean b, String message) { throw new IllegalStateException(message); } } + + public static Stream> connectedPairs(List l) { + return IntStream.range(1, l.size()).mapToObj(i -> Pair.of(l.get(i-1), l.get(i))); + } + + public static Stream> pairs(List l) { + return IntStream.range(1, l.size()/2).map(i -> i + ((i-1)*2)).mapToObj(i -> Pair.of(l.get(i-1), l.get(i))); + } } diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java index 618277d4..ddbbaed8 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java @@ -4,6 +4,7 @@ import com.sbaars.adventofcode.common.location.Loc; import com.sbaars.adventofcode.common.location.MutableLoc; import com.sbaars.adventofcode.common.location.Range; +import com.sbaars.adventofcode.util.AOCUtils; import com.sbaars.adventofcode.year22.Day2022; import java.util.ArrayList; @@ -14,6 +15,7 @@ import static com.sbaars.adventofcode.common.Direction.*; import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; +import static com.sbaars.adventofcode.common.grid.InfiniteGrid.toInfiniteGrid; public class Day14 extends Day2022 { public Day14() { @@ -45,13 +47,7 @@ public int amountOfSand(boolean part1) { } private static InfiniteGrid constructWalls(List> in) { - InfiniteGrid g = new InfiniteGrid(); - for(List rock : in) { - for(int i = 1; i g.set(l, '#')); - } - } - return g; + return in.stream().flatMap(AOCUtils::connectedPairs).flatMap(p -> new Range(p.getA(), p.getB()).stream()).collect(toInfiniteGrid('#')); } private static int simulateSand(boolean part1, InfiniteGrid g) { From 802efd2ee824dd8968ee4ad712953d466f46b022 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Wed, 14 Dec 2022 19:47:17 +0100 Subject: [PATCH 401/433] Replace apache pair usage by custom pair --- .../com/sbaars/adventofcode/common/Pair.java | 30 +++++-------------- .../adventofcode/common/location/Range.java | 7 +++++ .../adventofcode/year20/days/Day18.java | 4 +-- .../adventofcode/year21/days/Day19.java | 10 ++----- .../adventofcode/year21/days/Day21.java | 2 +- .../adventofcode/year22/days/Day14.java | 2 +- .../adventofcode/year22/days/Day15.java | 10 ++++++- 7 files changed, 31 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/common/Pair.java b/src/main/java/com/sbaars/adventofcode/common/Pair.java index 6c0f1586..48a9be4d 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Pair.java +++ b/src/main/java/com/sbaars/adventofcode/common/Pair.java @@ -2,27 +2,12 @@ import java.util.Objects; -public class Pair { - private final A a; - private final B b; +public record Pair(A a, B b) { - public Pair(A a, B b){ - this.a = a; - this.b = b; - } - - public static Pair of(A a, B b) { + public static Pair of(A a, B b) { return new Pair(a, b); } - public A getA() { - return a; - } - - public B getB() { - return b; - } - @Override public boolean equals(Object o) { if (this == o) return true; @@ -34,10 +19,11 @@ public boolean equals(Object o) { return Objects.equals(b, either.b); } - @Override - public int hashCode() { - int result = a != null ? a.hashCode() : 0; - result = 31 * result + (b != null ? b.hashCode() : 0); - return result; + public A getLeft() { + return a; + } + + public B getRight() { + return b; } } diff --git a/src/main/java/com/sbaars/adventofcode/common/location/Range.java b/src/main/java/com/sbaars/adventofcode/common/location/Range.java index e25d7059..5fc3ec60 100644 --- a/src/main/java/com/sbaars/adventofcode/common/location/Range.java +++ b/src/main/java/com/sbaars/adventofcode/common/location/Range.java @@ -1,5 +1,7 @@ package com.sbaars.adventofcode.common.location; +import com.sbaars.adventofcode.common.Pair; + import java.util.stream.Stream; import static java.util.stream.IntStream.rangeClosed; @@ -13,6 +15,11 @@ public Range(Loc start, Loc end) { this.end = end; } + public Range(Pair pair) { + this.start = pair.a(); + this.end = pair.b(); + } + public Stream stream(){ return rangeClosed(Math.min(start.intX(), end.intX()), Math.max(start.intX(), end.intX())) .boxed() diff --git a/src/main/java/com/sbaars/adventofcode/year20/days/Day18.java b/src/main/java/com/sbaars/adventofcode/year20/days/Day18.java index a6ec71b5..d5e4bfdd 100644 --- a/src/main/java/com/sbaars/adventofcode/year20/days/Day18.java +++ b/src/main/java/com/sbaars/adventofcode/year20/days/Day18.java @@ -1,8 +1,8 @@ package com.sbaars.adventofcode.year20.days; import com.sbaars.adventofcode.common.HasRecursion; +import com.sbaars.adventofcode.common.Pair; import com.sbaars.adventofcode.year20.Day2020; -import org.apache.commons.lang3.tuple.Pair; import static java.util.Arrays.stream; @@ -62,7 +62,7 @@ private long getSolution(int i, StringBuilder s, long leftHand, boolean part1) { return resolveExpression(new StringBuilder(s.substring(0, i - 3)), true) + leftHand; } else { var sol = solve(leftSide, false); - return getSolution(sol.getRight(), leftSide, sol.getKey() + leftHand, false); + return getSolution(sol.getRight(), leftSide, sol.getLeft() + leftHand, false); } } } else if (i == 0) { diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java index 33e28967..1ff9f841 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day19.java @@ -1,15 +1,11 @@ package com.sbaars.adventofcode.year21.days; +import com.sbaars.adventofcode.common.Pair; import com.sbaars.adventofcode.common.location.IntLoc; import com.sbaars.adventofcode.common.location.Loc3D; import com.sbaars.adventofcode.year21.Day2021; -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Optional; -import java.util.Queue; -import org.apache.commons.lang3.tuple.Pair; + +import java.util.*; public class Day19 extends Day2021 { diff --git a/src/main/java/com/sbaars/adventofcode/year21/days/Day21.java b/src/main/java/com/sbaars/adventofcode/year21/days/Day21.java index cbe663b5..795d4bbb 100644 --- a/src/main/java/com/sbaars/adventofcode/year21/days/Day21.java +++ b/src/main/java/com/sbaars/adventofcode/year21/days/Day21.java @@ -2,8 +2,8 @@ import com.google.common.base.Objects; import com.sbaars.adventofcode.common.HasRecursion; +import com.sbaars.adventofcode.common.Pair; import com.sbaars.adventofcode.year21.Day2021; -import org.apache.commons.lang3.tuple.Pair; import java.util.Arrays; import java.util.HashMap; diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java index ddbbaed8..c9d8b480 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java @@ -47,7 +47,7 @@ public int amountOfSand(boolean part1) { } private static InfiniteGrid constructWalls(List> in) { - return in.stream().flatMap(AOCUtils::connectedPairs).flatMap(p -> new Range(p.getA(), p.getB()).stream()).collect(toInfiniteGrid('#')); + return in.stream().flatMap(AOCUtils::connectedPairs).map(Range::new).flatMap(Range::stream).collect(toInfiniteGrid('#')); } private static int simulateSand(boolean part1, InfiniteGrid g) { diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java index 6a223f69..bebac854 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java @@ -1,5 +1,6 @@ package com.sbaars.adventofcode.year22.days; +import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year22.Day2022; public class Day15 extends Day2022 { @@ -8,11 +9,18 @@ public Day15() { } public static void main(String[] args) { - new Day15().printParts(); + Day d = new Day15(); +// d.downloadIfNotDownloaded(); +// d.downloadExample(); + d.printParts(); +// System.in.read(); +// d.submitPart1(); +// d.submitPart2(); } @Override public Object part1() { + return ""; } From 864ae3fc80cfca1099f818b4d74072d5f9efbec3 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Thu, 15 Dec 2022 06:47:50 +0100 Subject: [PATCH 402/433] optimize aaaa --- .../com/sbaars/adventofcode/common/Day.java | 6 +- .../adventofcode/common/location/Loc.java | 4 ++ .../adventofcode/year22/days/Day15.java | 59 +++++++++++++++++-- src/main/resources/2022-examples/day15-1.txt | 14 +++++ src/main/resources/2022-examples/day15-2.txt | 25 ++++++++ src/main/resources/2022-examples/day15-3.txt | 27 +++++++++ src/main/resources/2022-examples/day15-4.txt | 5 ++ src/main/resources/2022/day15.txt | 34 +++++++++++ 8 files changed, 166 insertions(+), 8 deletions(-) create mode 100644 src/main/resources/2022-examples/day15-1.txt create mode 100644 src/main/resources/2022-examples/day15-2.txt create mode 100644 src/main/resources/2022-examples/day15-3.txt create mode 100644 src/main/resources/2022-examples/day15-4.txt create mode 100644 src/main/resources/2022/day15.txt diff --git a/src/main/java/com/sbaars/adventofcode/common/Day.java b/src/main/java/com/sbaars/adventofcode/common/Day.java index 9e7c32ae..fb5668ce 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Day.java +++ b/src/main/java/com/sbaars/adventofcode/common/Day.java @@ -48,9 +48,9 @@ private String getDayPath() { public abstract Object part2(); public void printParts() { - solutionPart1 = part1(); - if(solutionPart1 instanceof Optional) solutionPart1 = ((Optional)solutionPart1).get(); - System.out.println("Part 1: " + solutionPart1); +// solutionPart1 = part1(); +// if(solutionPart1 instanceof Optional) solutionPart1 = ((Optional)solutionPart1).get(); +// System.out.println("Part 1: " + solutionPart1); solutionPart2 = part2(); if(solutionPart2 instanceof Optional) solutionPart2 = ((Optional)solutionPart2).get(); System.out.println("Part 2: " + solutionPart2); diff --git a/src/main/java/com/sbaars/adventofcode/common/location/Loc.java b/src/main/java/com/sbaars/adventofcode/common/location/Loc.java index a427176c..8a07b877 100644 --- a/src/main/java/com/sbaars/adventofcode/common/location/Loc.java +++ b/src/main/java/com/sbaars/adventofcode/common/location/Loc.java @@ -104,4 +104,8 @@ public int intX() { public int intY() { return toIntExact(y); } + + public long distance(Loc pt) { + return Math.abs(pt.x-x) + Math.abs(pt.y-y); + } } diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java index bebac854..627379b3 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java @@ -1,8 +1,15 @@ package com.sbaars.adventofcode.year22.days; import com.sbaars.adventofcode.common.Day; +import com.sbaars.adventofcode.common.grid.InfiniteGrid; +import com.sbaars.adventofcode.common.location.Loc; import com.sbaars.adventofcode.year22.Day2022; +import java.util.List; + +import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; +import static com.sbaars.adventofcode.common.grid.InfiniteGrid.toInfiniteGrid; + public class Day15 extends Day2022 { public Day15() { super(15); @@ -10,22 +17,64 @@ public Day15() { public static void main(String[] args) { Day d = new Day15(); -// d.downloadIfNotDownloaded(); -// d.downloadExample(); + d.downloadIfNotDownloaded(); + d.downloadExample(); d.printParts(); // System.in.read(); // d.submitPart1(); // d.submitPart2(); } + public record Input(long sensorX, long sensorY, long beaconX, long beaconY) {} + record Pos(Loc sensor, Loc beacon) {} + @Override public Object part1() { - - return ""; + List posList = dayStream().map(s -> readString(s, "Sensor at x=%n, y=%n: closest beacon is at x=%n, y=%n", Input.class)).map(i -> new Pos(new Loc(i.sensorX, i.sensorY), new Loc(i.beaconX, i.beaconY))).toList(); + InfiniteGrid g = posList.stream().map(Pos::sensor).collect(toInfiniteGrid('S')); + posList.forEach(p -> g.set(p.beacon, 'B')); + long covered = 0; + outer: for(int i = -4000000; i<20000000; i++) { + for(Pos p : posList) { + Loc l =new Loc(i, 2000000); + long distance = p.sensor.distance(p.beacon); + long distance2 = l.distance(p.sensor); + if(distance2 <= distance && g.get(l).isEmpty()){ +// System.out.println(l); + covered++; + continue outer; + } + } + } + return covered; } @Override public Object part2() { - return ""; + List posList = dayStream().map(s -> readString(s, "Sensor at x=%n, y=%n: closest beacon is at x=%n, y=%n", Input.class)).map(i -> new Pos(new Loc(i.sensorX, i.sensorY), new Loc(i.beaconX, i.beaconY))).toList(); + InfiniteGrid g = posList.stream().map(Pos::sensor).collect(toInfiniteGrid('S')); + posList.forEach(p -> g.set(p.beacon, 'B')); + long covered = 0; + for(int i = 0; i<=4000000; i++) { + if(i % 10000 == 0) System.out.println(i); + outer: for(int j = 0; j<=4000000; j++) { + long num = 0; + for (Pos p : posList) { + Loc l = new Loc(i, j); + long distance = p.sensor.distance(p.beacon); + long distance2 = l.distance(p.sensor); + if (distance2 > distance && g.get(l).isEmpty()) { + num++; + // continue outer; + } else { + continue outer; + } + } + if(num == posList.size()) { + System.out.println(((i*4000000)+j)); + } + } + } + return covered; } } diff --git a/src/main/resources/2022-examples/day15-1.txt b/src/main/resources/2022-examples/day15-1.txt new file mode 100644 index 00000000..a6124240 --- /dev/null +++ b/src/main/resources/2022-examples/day15-1.txt @@ -0,0 +1,14 @@ +Sensor at x=2, y=18: closest beacon is at x=-2, y=15 +Sensor at x=9, y=16: closest beacon is at x=10, y=16 +Sensor at x=13, y=2: closest beacon is at x=15, y=3 +Sensor at x=12, y=14: closest beacon is at x=10, y=16 +Sensor at x=10, y=20: closest beacon is at x=10, y=16 +Sensor at x=14, y=17: closest beacon is at x=10, y=16 +Sensor at x=8, y=7: closest beacon is at x=2, y=10 +Sensor at x=2, y=0: closest beacon is at x=2, y=10 +Sensor at x=0, y=11: closest beacon is at x=2, y=10 +Sensor at x=20, y=14: closest beacon is at x=25, y=17 +Sensor at x=17, y=20: closest beacon is at x=21, y=22 +Sensor at x=16, y=7: closest beacon is at x=15, y=3 +Sensor at x=14, y=3: closest beacon is at x=15, y=3 +Sensor at x=20, y=1: closest beacon is at x=15, y=3 diff --git a/src/main/resources/2022-examples/day15-2.txt b/src/main/resources/2022-examples/day15-2.txt new file mode 100644 index 00000000..2dab66de --- /dev/null +++ b/src/main/resources/2022-examples/day15-2.txt @@ -0,0 +1,25 @@ + 1 1 2 2 + 0 5 0 5 0 5 + 0 ....S....................... + 1 ......................S..... + 2 ...............S............ + 3 ................SB.......... + 4 ............................ + 5 ............................ + 6 ............................ + 7 ..........S.......S......... + 8 ............................ + 9 ............................ +10 ....B....................... +11 ..S......................... +12 ............................ +13 ............................ +14 ..............S.......S..... +15 B........................... +16 ...........SB............... +17 ................S..........B +18 ....S....................... +19 ............................ +20 ............S......S........ +21 ............................ +22 .......................B.... diff --git a/src/main/resources/2022-examples/day15-3.txt b/src/main/resources/2022-examples/day15-3.txt new file mode 100644 index 00000000..24e6079c --- /dev/null +++ b/src/main/resources/2022-examples/day15-3.txt @@ -0,0 +1,27 @@ + 1 1 2 2 + 0 5 0 5 0 5 +-2 ..........#................. +-1 .........###................ + 0 ....S...#####............... + 1 .......#######........S..... + 2 ......#########S............ + 3 .....###########SB.......... + 4 ....#############........... + 5 ...###############.......... + 6 ..#################......... + 7 .#########S#######S#........ + 8 ..#################......... + 9 ...###############.......... +10 ....B############........... +11 ..S..###########............ +12 ......#########............. +13 .......#######.............. +14 ........#####.S.......S..... +15 B........###................ +16 ..........#SB............... +17 ................S..........B +18 ....S....................... +19 ............................ +20 ............S......S........ +21 ............................ +22 .......................B.... diff --git a/src/main/resources/2022-examples/day15-4.txt b/src/main/resources/2022-examples/day15-4.txt new file mode 100644 index 00000000..83bf7b30 --- /dev/null +++ b/src/main/resources/2022-examples/day15-4.txt @@ -0,0 +1,5 @@ + 1 1 2 2 + 0 5 0 5 0 5 + 9 ...#########################... +10 ..####B######################.. +11 .###S#############.###########. diff --git a/src/main/resources/2022/day15.txt b/src/main/resources/2022/day15.txt new file mode 100644 index 00000000..34677628 --- /dev/null +++ b/src/main/resources/2022/day15.txt @@ -0,0 +1,34 @@ +Sensor at x=391282, y=2038170: closest beacon is at x=-532461, y=2166525 +Sensor at x=3042382, y=3783761: closest beacon is at x=3113582, y=3814857 +Sensor at x=3444090, y=757238: closest beacon is at x=2930045, y=2000000 +Sensor at x=971638, y=288172: closest beacon is at x=935006, y=638195 +Sensor at x=2175844, y=1879176: closest beacon is at x=2930045, y=2000000 +Sensor at x=3063103, y=3820576: closest beacon is at x=3113582, y=3814857 +Sensor at x=2591294, y=3667337: closest beacon is at x=2768198, y=3762135 +Sensor at x=2579773, y=3989626: closest beacon is at x=2768198, y=3762135 +Sensor at x=2887876, y=2106773: closest beacon is at x=2930045, y=2000000 +Sensor at x=2808659, y=3280271: closest beacon is at x=2768198, y=3762135 +Sensor at x=2874212, y=3897058: closest beacon is at x=2768198, y=3762135 +Sensor at x=720384, y=134640: closest beacon is at x=935006, y=638195 +Sensor at x=489, y=1241813: closest beacon is at x=-532461, y=2166525 +Sensor at x=120643, y=2878973: closest beacon is at x=227814, y=3107489 +Sensor at x=3990734, y=2991891: closest beacon is at x=3924443, y=3039680 +Sensor at x=1494086, y=3030634: closest beacon is at x=2537630, y=2793941 +Sensor at x=1864417, y=360451: closest beacon is at x=935006, y=638195 +Sensor at x=2974807, y=3732804: closest beacon is at x=3113582, y=3814857 +Sensor at x=3273340, y=3998032: closest beacon is at x=3113582, y=3814857 +Sensor at x=1468886, y=1597081: closest beacon is at x=935006, y=638195 +Sensor at x=2083016, y=3743849: closest beacon is at x=2768198, y=3762135 +Sensor at x=3387080, y=3393862: closest beacon is at x=3113582, y=3814857 +Sensor at x=2959440, y=2052862: closest beacon is at x=2930045, y=2000000 +Sensor at x=1180804, y=1112043: closest beacon is at x=935006, y=638195 +Sensor at x=2829808, y=2206448: closest beacon is at x=2930045, y=2000000 +Sensor at x=3999024, y=3114260: closest beacon is at x=3924443, y=3039680 +Sensor at x=540955, y=3893312: closest beacon is at x=227814, y=3107489 +Sensor at x=3669058, y=2350731: closest beacon is at x=3924443, y=3039680 +Sensor at x=2915068, y=2754266: closest beacon is at x=2537630, y=2793941 +Sensor at x=3507419, y=2838686: closest beacon is at x=3924443, y=3039680 +Sensor at x=165939, y=498589: closest beacon is at x=935006, y=638195 +Sensor at x=3917917, y=3792648: closest beacon is at x=3924443, y=3039680 +Sensor at x=40698, y=3202257: closest beacon is at x=227814, y=3107489 +Sensor at x=2619948, y=2439745: closest beacon is at x=2537630, y=2793941 From eb520ec9f2462a15cd2fc597d82cc4c041244ba0 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Thu, 15 Dec 2022 08:33:39 +0100 Subject: [PATCH 403/433] Very slow solution --- .../common/location/DoubleLoc.java | 51 ++++++ .../adventofcode/common/location/Loc.java | 11 ++ .../adventofcode/common/location/Range.java | 4 + .../sbaars/adventofcode/util/AOCUtils.java | 11 +- .../adventofcode/year22/days/Day15.java | 147 +++++++++++++++--- 5 files changed, 199 insertions(+), 25 deletions(-) create mode 100644 src/main/java/com/sbaars/adventofcode/common/location/DoubleLoc.java diff --git a/src/main/java/com/sbaars/adventofcode/common/location/DoubleLoc.java b/src/main/java/com/sbaars/adventofcode/common/location/DoubleLoc.java new file mode 100644 index 00000000..3ebbf628 --- /dev/null +++ b/src/main/java/com/sbaars/adventofcode/common/location/DoubleLoc.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 1995, 2021, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sbaars.adventofcode.common.location; + +public class DoubleLoc { + public final double x; + public final double y; + + public DoubleLoc() { + this(0, 0); + } + + public DoubleLoc(DoubleLoc p) { + this(p.x, p.y); + } + + public DoubleLoc(double x, double y) { + this.x = x; + this.y = y; + } + public double getX() { + return x; + } + + public double getY() { + return y; + } +} diff --git a/src/main/java/com/sbaars/adventofcode/common/location/Loc.java b/src/main/java/com/sbaars/adventofcode/common/location/Loc.java index 8a07b877..3b849442 100644 --- a/src/main/java/com/sbaars/adventofcode/common/location/Loc.java +++ b/src/main/java/com/sbaars/adventofcode/common/location/Loc.java @@ -25,7 +25,10 @@ package com.sbaars.adventofcode.common.location; +import com.sbaars.adventofcode.common.Direction; + import java.awt.*; +import java.util.Arrays; import java.util.stream.IntStream; import java.util.stream.Stream; @@ -108,4 +111,12 @@ public int intY() { public long distance(Loc pt) { return Math.abs(pt.x-x) + Math.abs(pt.y-y); } + + public Stream eightDirs() { + return Arrays.stream(Direction.eightDirections()).map(d -> d.move(this)); + } + + public Stream expand(long howMuch) { + return new Range(new Loc(x-(howMuch/2), y-(howMuch/2)), new Loc(x+(howMuch/2), y+(howMuch/2))).stream(); + } } diff --git a/src/main/java/com/sbaars/adventofcode/common/location/Range.java b/src/main/java/com/sbaars/adventofcode/common/location/Range.java index 5fc3ec60..09f73fbf 100644 --- a/src/main/java/com/sbaars/adventofcode/common/location/Range.java +++ b/src/main/java/com/sbaars/adventofcode/common/location/Range.java @@ -25,4 +25,8 @@ public Stream stream(){ .boxed() .flatMap(x -> rangeClosed(Math.min(start.intY(), end.intY()), Math.max(start.intY(), end.intY())).mapToObj(y -> new Loc(x, y))); } + + public boolean inRange(Loc l) { + return l.x >= start.x && l.y >=start.y && l.x <= end.x && l.y <= end.y; + } } diff --git a/src/main/java/com/sbaars/adventofcode/util/AOCUtils.java b/src/main/java/com/sbaars/adventofcode/util/AOCUtils.java index 989b6430..d258ea6d 100644 --- a/src/main/java/com/sbaars/adventofcode/util/AOCUtils.java +++ b/src/main/java/com/sbaars/adventofcode/util/AOCUtils.java @@ -3,9 +3,10 @@ import com.sbaars.adventofcode.common.Pair; import java.util.List; -import java.util.stream.IntStream; import java.util.stream.Stream; +import static java.util.stream.IntStream.range; + public class AOCUtils { public static void verify(boolean b) { verify(b, "Something went wrong"); @@ -18,10 +19,14 @@ public static void verify(boolean b, String message) { } public static Stream> connectedPairs(List l) { - return IntStream.range(1, l.size()).mapToObj(i -> Pair.of(l.get(i-1), l.get(i))); + return range(1, l.size()).mapToObj(i -> Pair.of(l.get(i-1), l.get(i))); } public static Stream> pairs(List l) { - return IntStream.range(1, l.size()/2).map(i -> i + ((i-1)*2)).mapToObj(i -> Pair.of(l.get(i-1), l.get(i))); + return range(1, l.size()/2).map(i -> i + ((i-1)*2)).mapToObj(i -> Pair.of(l.get(i-1), l.get(i))); + } + + public static Stream> allPairs(List l) { + return range(0, l.size()).boxed().flatMap(i -> range(i+1, l.size()).mapToObj(j -> new Pair(l.get(i), l.get(j)))); } } diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java index 627379b3..8470f342 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java @@ -2,13 +2,17 @@ import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.common.grid.InfiniteGrid; +import com.sbaars.adventofcode.common.location.DoubleLoc; import com.sbaars.adventofcode.common.location.Loc; +import com.sbaars.adventofcode.common.location.Range; +import com.sbaars.adventofcode.util.AOCUtils; import com.sbaars.adventofcode.year22.Day2022; import java.util.List; import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; import static com.sbaars.adventofcode.common.grid.InfiniteGrid.toInfiniteGrid; +import static java.lang.Math.*; public class Day15 extends Day2022 { public Day15() { @@ -26,7 +30,11 @@ public static void main(String[] args) { } public record Input(long sensorX, long sensorY, long beaconX, long beaconY) {} - record Pos(Loc sensor, Loc beacon) {} + record Pos(Loc sensor, Loc beacon) { + private long distance() { + return sensor.distance(beacon); + } + } @Override public Object part1() { @@ -54,27 +62,122 @@ public Object part2() { List posList = dayStream().map(s -> readString(s, "Sensor at x=%n, y=%n: closest beacon is at x=%n, y=%n", Input.class)).map(i -> new Pos(new Loc(i.sensorX, i.sensorY), new Loc(i.beaconX, i.beaconY))).toList(); InfiniteGrid g = posList.stream().map(Pos::sensor).collect(toInfiniteGrid('S')); posList.forEach(p -> g.set(p.beacon, 'B')); - long covered = 0; - for(int i = 0; i<=4000000; i++) { - if(i % 10000 == 0) System.out.println(i); - outer: for(int j = 0; j<=4000000; j++) { - long num = 0; - for (Pos p : posList) { - Loc l = new Loc(i, j); - long distance = p.sensor.distance(p.beacon); - long distance2 = l.distance(p.sensor); - if (distance2 > distance && g.get(l).isEmpty()) { - num++; - // continue outer; - } else { - continue outer; - } - } - if(num == posList.size()) { - System.out.println(((i*4000000)+j)); - } - } + Range target = new Range(new Loc(0, 0), new Loc(4000000, 4000000)); + Loc cor = new Loc(3068581, 3017867); + System.out.println(posList.stream().allMatch(p -> cor.distance(p.sensor) > p.distance())); + + return AOCUtils.allPairs(posList).flatMap(p -> { + Pos p1 = p.a(); + Pos p2 = p.b(); + List inter = circleCircleIntersectionPoints(p1.sensor, p2.sensor, p1.distance(), p2.distance()); + int x0 = p1.sensor.intX(); + int x1 = p2.sensor.intX(); + int y0 = p1.sensor.intY(); + int y1 = p2.sensor.intY(); + long r0 = p1.sensor.distance(p1.beacon); + long r1 = p2.sensor.distance(p2.beacon); + double d= sqrt((x1-x0)^2 + (y1-y0)^2); + double a=(pow(r0,2)-pow(r1,2)+pow(d, 2))/(2*d); + double h=sqrt(pow(r0,2)-pow(a,2)); + double x2=x0+a*(x1-x0)/d; + double y2=y0+a*(y1-y0)/d; + double x3=x2+h*(y1-y0)/d; + double y3=y2-h*(x1-x0)/d; +// return Stream.concat(new Loc((long)x2, (long)y2).eightDirs(), new Loc((long)x3, (long)y3).eightDirs()); + return inter.stream().filter(l -> target.inRange(l)); + }).peek(System.out::println).filter(l -> target.inRange(l)).filter(l -> posList.stream().allMatch(p -> l.distance(p.sensor) > p.distance())).findAny().get(); +// for(int i = 0; i<4000000; i++) { +// List safeRange = new ArrayList<>(); +// for (Pos p : posList) { +// long distance = p.sensor.distance(p.beacon); +// +// } +// } +// long covered = 0; +// for(int i = 0; i<=4000000; i++) { +// if(i % 10000 == 0) System.out.println(i); +// outer: for(int j = 0; j<=4000000; j++) { +// long num = 0; +// for (Pos p : posList) { +// Loc l = new Loc(i, j); +// long distance = p.sensor.distance(p.beacon); +// long distance2 = l.distance(p.sensor); +// if (distance2 > distance && g.get(l).isEmpty()) { +// num++; +// // continue outer; +// } else { +// continue outer; +// } +// } +// if(num == posList.size()) { +// System.out.println(((i*4000000)+j)); +// } +// } +// } +// return covered; + } + + private List circleCircleIntersectionPoints(Loc c1, Loc c2, long r1, long r2) { + double EPS = 0.0000001; + + double r, R, d, dx, dy, cx, cy, Cx, Cy; + + if (r1 < r2) { + r = r1; R = r2; + cx = c1.x; cy = c1.y; + Cx = c2.x; Cy = c2.y; + } else { + r = r2; R = r1; + Cx = c1.x; Cy = c1.y; + cx = c2.x; cy = c2.y; } - return covered; + + // Compute the vector + dx = cx - Cx; + dy = cy - Cy; + + // Find the distance between two points. + d = Math.sqrt( dx*dx + dy*dy ); + + // There are an infinite number of solutions + // Seems appropriate to also return null + if (d < EPS && Math.abs(R-r) < EPS) return List.of(); + + // No intersection (circles centered at the + // same place with different size) + else if (d < EPS) return List.of(); + + var x = (dx / d) * R + Cx; + var y = (dy / d) * R + Cy; + var P = new DoubleLoc(x, y); + + // Single intersection (kissing circles) + if (Math.abs((R+r)-d) < EPS || Math.abs(R-(r+d)) < EPS) return List.of(new Loc(round(x), round(y))); + + // No intersection. Either the small circle contained within + // big circle or circles are simply disjoint. + if ( (d+r) < R || (R+r < d) ) return List.of(); + + var C = new DoubleLoc(Cx, Cy); + var angle = acossafe((r*r-d*d-R*R)/(-2.0*d*R)); + var pt1 = rotatePoint(C, P, +angle); + var pt2 = rotatePoint(C, P, -angle); + return List.of(pt1, pt2); + + } + + double acossafe(double x) { + if (x >= +1.0) return 0; + if (x <= -1.0) return Math.PI; + return Math.acos(x); } + + Loc rotatePoint(DoubleLoc fp, DoubleLoc pt, double a) { + var x = pt.x - fp.x; + var y = pt.y - fp.y; + var xRot = x * Math.cos(a) + y * Math.sin(a); + var yRot = y * Math.cos(a) - x * Math.sin(a); + return new Loc(round(fp.x+xRot),round(fp.y+yRot)); + } + } From 6e47969d9812d6921423983afcb5b804e646e120 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Thu, 15 Dec 2022 08:33:45 +0100 Subject: [PATCH 404/433] expand --- src/main/java/com/sbaars/adventofcode/year22/days/Day15.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java index 8470f342..b984d993 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java @@ -84,7 +84,7 @@ public Object part2() { double x3=x2+h*(y1-y0)/d; double y3=y2-h*(x1-x0)/d; // return Stream.concat(new Loc((long)x2, (long)y2).eightDirs(), new Loc((long)x3, (long)y3).eightDirs()); - return inter.stream().filter(l -> target.inRange(l)); + return inter.stream().filter(l -> target.inRange(l)).map(l -> l.expand(1000000)); }).peek(System.out::println).filter(l -> target.inRange(l)).filter(l -> posList.stream().allMatch(p -> l.distance(p.sensor) > p.distance())).findAny().get(); // for(int i = 0; i<4000000; i++) { // List safeRange = new ArrayList<>(); From 610bfe853792d1f830636398c12f98da97647a2a Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Thu, 15 Dec 2022 08:34:06 +0100 Subject: [PATCH 405/433] flatmap --- src/main/java/com/sbaars/adventofcode/year22/days/Day15.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java index b984d993..6e4f8d37 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java @@ -84,7 +84,7 @@ public Object part2() { double x3=x2+h*(y1-y0)/d; double y3=y2-h*(x1-x0)/d; // return Stream.concat(new Loc((long)x2, (long)y2).eightDirs(), new Loc((long)x3, (long)y3).eightDirs()); - return inter.stream().filter(l -> target.inRange(l)).map(l -> l.expand(1000000)); + return inter.stream().filter(l -> target.inRange(l)).flatMap(l -> l.expand(1000000)); }).peek(System.out::println).filter(l -> target.inRange(l)).filter(l -> posList.stream().allMatch(p -> l.distance(p.sensor) > p.distance())).findAny().get(); // for(int i = 0; i<4000000; i++) { // List safeRange = new ArrayList<>(); From 412c9eeeedd024dabd478320aa7780dcd5b470c1 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Thu, 15 Dec 2022 08:49:59 +0100 Subject: [PATCH 406/433] aaa --- .../adventofcode/year22/days/Day15.java | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java index 6e4f8d37..b12c60fd 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java @@ -70,22 +70,19 @@ public Object part2() { Pos p1 = p.a(); Pos p2 = p.b(); List inter = circleCircleIntersectionPoints(p1.sensor, p2.sensor, p1.distance(), p2.distance()); - int x0 = p1.sensor.intX(); - int x1 = p2.sensor.intX(); - int y0 = p1.sensor.intY(); - int y1 = p2.sensor.intY(); long r0 = p1.sensor.distance(p1.beacon); long r1 = p2.sensor.distance(p2.beacon); - double d= sqrt((x1-x0)^2 + (y1-y0)^2); - double a=(pow(r0,2)-pow(r1,2)+pow(d, 2))/(2*d); - double h=sqrt(pow(r0,2)-pow(a,2)); - double x2=x0+a*(x1-x0)/d; - double y2=y0+a*(y1-y0)/d; - double x3=x2+h*(y1-y0)/d; - double y3=y2-h*(x1-x0)/d; + long r2 = p1.sensor.distance(p2.sensor); + if(r0 == r1 + r2){ + long xDiff = abs(p1.sensor.x-p2.sensor.x); + long yDiff = abs(p1.sensor.y-p2.sensor.y); + System.out.println(new Loc(p2.sensor.x+xDiff, p1.sensor.y+yDiff)); + } +// long xDiff = abs(p1.sensor.x-p2.sensor.x); +// long yDiff = abs(p1.sensor.y-p2.sensor.y); // return Stream.concat(new Loc((long)x2, (long)y2).eightDirs(), new Loc((long)x3, (long)y3).eightDirs()); - return inter.stream().filter(l -> target.inRange(l)).flatMap(l -> l.expand(1000000)); - }).peek(System.out::println).filter(l -> target.inRange(l)).filter(l -> posList.stream().allMatch(p -> l.distance(p.sensor) > p.distance())).findAny().get(); + return inter.stream().filter(l -> target.inRange(l)).flatMap(l -> l.expand(1)); + }).filter(l -> target.inRange(l)).filter(l -> posList.stream().allMatch(p -> l.distance(p.sensor) > p.distance())).findAny().get(); // for(int i = 0; i<4000000; i++) { // List safeRange = new ArrayList<>(); // for (Pos p : posList) { From 973d08e721a12d58e36fe9651978ede4bd816031 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Thu, 15 Dec 2022 08:59:23 +0100 Subject: [PATCH 407/433] another dead end --- .../adventofcode/year22/days/Day15.java | 44 ++++++++++--------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java index b12c60fd..38aaa02d 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java @@ -5,14 +5,13 @@ import com.sbaars.adventofcode.common.location.DoubleLoc; import com.sbaars.adventofcode.common.location.Loc; import com.sbaars.adventofcode.common.location.Range; -import com.sbaars.adventofcode.util.AOCUtils; import com.sbaars.adventofcode.year22.Day2022; import java.util.List; import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; import static com.sbaars.adventofcode.common.grid.InfiniteGrid.toInfiniteGrid; -import static java.lang.Math.*; +import static java.lang.Math.round; public class Day15 extends Day2022 { public Day15() { @@ -64,25 +63,28 @@ public Object part2() { posList.forEach(p -> g.set(p.beacon, 'B')); Range target = new Range(new Loc(0, 0), new Loc(4000000, 4000000)); Loc cor = new Loc(3068581, 3017867); - System.out.println(posList.stream().allMatch(p -> cor.distance(p.sensor) > p.distance())); - - return AOCUtils.allPairs(posList).flatMap(p -> { - Pos p1 = p.a(); - Pos p2 = p.b(); - List inter = circleCircleIntersectionPoints(p1.sensor, p2.sensor, p1.distance(), p2.distance()); - long r0 = p1.sensor.distance(p1.beacon); - long r1 = p2.sensor.distance(p2.beacon); - long r2 = p1.sensor.distance(p2.sensor); - if(r0 == r1 + r2){ - long xDiff = abs(p1.sensor.x-p2.sensor.x); - long yDiff = abs(p1.sensor.y-p2.sensor.y); - System.out.println(new Loc(p2.sensor.x+xDiff, p1.sensor.y+yDiff)); - } -// long xDiff = abs(p1.sensor.x-p2.sensor.x); -// long yDiff = abs(p1.sensor.y-p2.sensor.y); -// return Stream.concat(new Loc((long)x2, (long)y2).eightDirs(), new Loc((long)x3, (long)y3).eightDirs()); - return inter.stream().filter(l -> target.inRange(l)).flatMap(l -> l.expand(1)); - }).filter(l -> target.inRange(l)).filter(l -> posList.stream().allMatch(p -> l.distance(p.sensor) > p.distance())).findAny().get(); + System.out.println(target.inRange(cor) && posList.stream().allMatch(p -> cor.distance(p.sensor) > p.distance())); + +// return AOCUtils.allPairs(posList).flatMap(p -> { +// Pos p1 = p.a(); +// Pos p2 = p.b(); +// List inter = circleCircleIntersectionPoints(p1.sensor, p2.sensor, p1.distance(), p2.distance()); +// long r0 = p1.sensor.distance(p1.beacon); +// long r1 = p2.sensor.distance(p2.beacon); +// long r2 = p1.sensor.distance(p2.sensor); +// if(r0 == r1 + r2){ +// long xDiff = abs(p1.sensor.x-p2.sensor.x); +// long yDiff = abs(p1.sensor.y-p2.sensor.y); +// System.out.println(new Loc(p2.sensor.x+xDiff, p1.sensor.y+yDiff)); +// } +//// long xDiff = abs(p1.sensor.x-p2.sensor.x); +//// long yDiff = abs(p1.sensor.y-p2.sensor.y); +//// return Stream.concat(new Loc((long)x2, (long)y2).eightDirs(), new Loc((long)x3, (long)y3).eightDirs()); +// return inter.stream().filter(l -> target.inRange(l)).flatMap(l -> l.expand(1)); +// }).filter(l -> target.inRange(l)).filter(l -> posList.stream().allMatch(p -> l.distance(p.sensor) > p.distance())).findAny().get(); + return posList.stream().flatMap(p -> { + return List.of(new Loc(p.sensor.x, p.sensor.y+p.distance()), new Loc(p.sensor.x, p.sensor.y-p.distance()), new Loc(p.sensor.x+p.distance(), p.sensor.y), new Loc(p.sensor.x-p.distance(), p.sensor.y)).stream().flatMap(l -> l.expand(10000)).filter(l -> l.distance(p.sensor) == p.distance()+1); + }).filter(target::inRange).filter(l -> posList.stream().allMatch(p -> l.distance(p.sensor) > p.distance())).findAny().get(); // for(int i = 0; i<4000000; i++) { // List safeRange = new ArrayList<>(); // for (Pos p : posList) { From 7d3c26aa06bbcb0929bf54088edaaa3e344471fe Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Thu, 15 Dec 2022 09:25:27 +0100 Subject: [PATCH 408/433] Fast solution --- .../com/sbaars/adventofcode/common/Direction.java | 15 +++++++++++++++ .../sbaars/adventofcode/common/location/Loc.java | 4 ++++ .../sbaars/adventofcode/year22/days/Day15.java | 12 +++++++++--- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/common/Direction.java b/src/main/java/com/sbaars/adventofcode/common/Direction.java index 9c7f9f3f..a71366f8 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Direction.java +++ b/src/main/java/com/sbaars/adventofcode/common/Direction.java @@ -4,6 +4,7 @@ import java.awt.*; import java.util.Arrays; +import java.util.stream.IntStream; import static java.lang.Math.abs; @@ -60,6 +61,20 @@ public static Direction[] eightDirections() { return new Direction[]{NORTH, EAST, SOUTH, WEST, NORTHEAST, SOUTHEAST, SOUTHWEST, NORTHWEST}; } + public static Direction[] round() { + return new Direction[]{NORTH, NORTHEAST, EAST, SOUTHEAST, SOUTH, SOUTHWEST, WEST, NORTHWEST}; + } + + public Direction turnSteps(int steps) { + Direction[] d = round(); + int index = IntStream.range(0, d.length).filter(i -> d[i] == this).findFirst().getAsInt(); + return d[(index + steps) % d.length]; + } + + public static Direction[] diagonals() { + return new Direction[]{NORTHEAST, SOUTHEAST, SOUTHWEST, NORTHWEST}; + } + public Direction turn(boolean right) { int cur = ordinal() + (right ? 1 : -1); if (cur == fourDirections().length) cur = 0; diff --git a/src/main/java/com/sbaars/adventofcode/common/location/Loc.java b/src/main/java/com/sbaars/adventofcode/common/location/Loc.java index 3b849442..f8465cae 100644 --- a/src/main/java/com/sbaars/adventofcode/common/location/Loc.java +++ b/src/main/java/com/sbaars/adventofcode/common/location/Loc.java @@ -119,4 +119,8 @@ public Stream eightDirs() { public Stream expand(long howMuch) { return new Range(new Loc(x-(howMuch/2), y-(howMuch/2)), new Loc(x+(howMuch/2), y+(howMuch/2))).stream(); } + + public Stream walk(Direction dir, int howFar) { + return IntStream.range(0, howFar).mapToObj(i -> dir.move(this, i)); + } } diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java index 38aaa02d..4b093553 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java @@ -1,17 +1,20 @@ package com.sbaars.adventofcode.year22.days; import com.sbaars.adventofcode.common.Day; +import com.sbaars.adventofcode.common.Direction; import com.sbaars.adventofcode.common.grid.InfiniteGrid; import com.sbaars.adventofcode.common.location.DoubleLoc; import com.sbaars.adventofcode.common.location.Loc; import com.sbaars.adventofcode.common.location.Range; import com.sbaars.adventofcode.year22.Day2022; +import java.util.Arrays; import java.util.List; import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; import static com.sbaars.adventofcode.common.grid.InfiniteGrid.toInfiniteGrid; import static java.lang.Math.round; +import static java.lang.Math.toIntExact; public class Day15 extends Day2022 { public Day15() { @@ -82,9 +85,12 @@ public Object part2() { //// return Stream.concat(new Loc((long)x2, (long)y2).eightDirs(), new Loc((long)x3, (long)y3).eightDirs()); // return inter.stream().filter(l -> target.inRange(l)).flatMap(l -> l.expand(1)); // }).filter(l -> target.inRange(l)).filter(l -> posList.stream().allMatch(p -> l.distance(p.sensor) > p.distance())).findAny().get(); - return posList.stream().flatMap(p -> { - return List.of(new Loc(p.sensor.x, p.sensor.y+p.distance()), new Loc(p.sensor.x, p.sensor.y-p.distance()), new Loc(p.sensor.x+p.distance(), p.sensor.y), new Loc(p.sensor.x-p.distance(), p.sensor.y)).stream().flatMap(l -> l.expand(10000)).filter(l -> l.distance(p.sensor) == p.distance()+1); - }).filter(target::inRange).filter(l -> posList.stream().allMatch(p -> l.distance(p.sensor) > p.distance())).findAny().get(); +// return posList.stream().flatMap(p -> { +// return List.of(new Loc(p.sensor.x, p.sensor.y+p.distance()), new Loc(p.sensor.x, p.sensor.y-p.distance()), new Loc(p.sensor.x+p.distance(), p.sensor.y), new Loc(p.sensor.x-p.distance(), p.sensor.y)).stream().flatMap(l -> l.expand(10000)).filter(l -> l.distance(p.sensor) == p.distance()+1); +// }).filter(target::inRange).filter(l -> posList.stream().allMatch(p -> l.distance(p.sensor) > p.distance())).findAny().get(); + return posList.stream().flatMap(p -> + Arrays.stream(Direction.fourDirections()).flatMap(d -> d.move(p.sensor, toIntExact(p.distance()) + 1).walk(d.turnSteps(3), toIntExact(p.distance() + 2))) + ).filter(target::inRange).filter(l -> posList.stream().allMatch(p -> l.distance(p.sensor) > p.distance())).findAny().get(); // for(int i = 0; i<4000000; i++) { // List safeRange = new ArrayList<>(); // for (Pos p : posList) { From 09016d32b922c71d00a7b8966e9596c5091871f0 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Thu, 15 Dec 2022 09:27:18 +0100 Subject: [PATCH 409/433] Remove commented code --- .../adventofcode/year22/days/Day15.java | 130 +----------------- 1 file changed, 1 insertion(+), 129 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java index 4b093553..b77fc880 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java @@ -1,9 +1,7 @@ package com.sbaars.adventofcode.year22.days; -import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.common.Direction; import com.sbaars.adventofcode.common.grid.InfiniteGrid; -import com.sbaars.adventofcode.common.location.DoubleLoc; import com.sbaars.adventofcode.common.location.Loc; import com.sbaars.adventofcode.common.location.Range; import com.sbaars.adventofcode.year22.Day2022; @@ -13,7 +11,6 @@ import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; import static com.sbaars.adventofcode.common.grid.InfiniteGrid.toInfiniteGrid; -import static java.lang.Math.round; import static java.lang.Math.toIntExact; public class Day15 extends Day2022 { @@ -22,13 +19,7 @@ public Day15() { } public static void main(String[] args) { - Day d = new Day15(); - d.downloadIfNotDownloaded(); - d.downloadExample(); - d.printParts(); -// System.in.read(); -// d.submitPart1(); -// d.submitPart2(); + new Day15().printParts(); } public record Input(long sensorX, long sensorY, long beaconX, long beaconY) {} @@ -50,7 +41,6 @@ public Object part1() { long distance = p.sensor.distance(p.beacon); long distance2 = l.distance(p.sensor); if(distance2 <= distance && g.get(l).isEmpty()){ -// System.out.println(l); covered++; continue outer; } @@ -62,127 +52,9 @@ public Object part1() { @Override public Object part2() { List posList = dayStream().map(s -> readString(s, "Sensor at x=%n, y=%n: closest beacon is at x=%n, y=%n", Input.class)).map(i -> new Pos(new Loc(i.sensorX, i.sensorY), new Loc(i.beaconX, i.beaconY))).toList(); - InfiniteGrid g = posList.stream().map(Pos::sensor).collect(toInfiniteGrid('S')); - posList.forEach(p -> g.set(p.beacon, 'B')); Range target = new Range(new Loc(0, 0), new Loc(4000000, 4000000)); - Loc cor = new Loc(3068581, 3017867); - System.out.println(target.inRange(cor) && posList.stream().allMatch(p -> cor.distance(p.sensor) > p.distance())); - -// return AOCUtils.allPairs(posList).flatMap(p -> { -// Pos p1 = p.a(); -// Pos p2 = p.b(); -// List inter = circleCircleIntersectionPoints(p1.sensor, p2.sensor, p1.distance(), p2.distance()); -// long r0 = p1.sensor.distance(p1.beacon); -// long r1 = p2.sensor.distance(p2.beacon); -// long r2 = p1.sensor.distance(p2.sensor); -// if(r0 == r1 + r2){ -// long xDiff = abs(p1.sensor.x-p2.sensor.x); -// long yDiff = abs(p1.sensor.y-p2.sensor.y); -// System.out.println(new Loc(p2.sensor.x+xDiff, p1.sensor.y+yDiff)); -// } -//// long xDiff = abs(p1.sensor.x-p2.sensor.x); -//// long yDiff = abs(p1.sensor.y-p2.sensor.y); -//// return Stream.concat(new Loc((long)x2, (long)y2).eightDirs(), new Loc((long)x3, (long)y3).eightDirs()); -// return inter.stream().filter(l -> target.inRange(l)).flatMap(l -> l.expand(1)); -// }).filter(l -> target.inRange(l)).filter(l -> posList.stream().allMatch(p -> l.distance(p.sensor) > p.distance())).findAny().get(); -// return posList.stream().flatMap(p -> { -// return List.of(new Loc(p.sensor.x, p.sensor.y+p.distance()), new Loc(p.sensor.x, p.sensor.y-p.distance()), new Loc(p.sensor.x+p.distance(), p.sensor.y), new Loc(p.sensor.x-p.distance(), p.sensor.y)).stream().flatMap(l -> l.expand(10000)).filter(l -> l.distance(p.sensor) == p.distance()+1); -// }).filter(target::inRange).filter(l -> posList.stream().allMatch(p -> l.distance(p.sensor) > p.distance())).findAny().get(); return posList.stream().flatMap(p -> Arrays.stream(Direction.fourDirections()).flatMap(d -> d.move(p.sensor, toIntExact(p.distance()) + 1).walk(d.turnSteps(3), toIntExact(p.distance() + 2))) ).filter(target::inRange).filter(l -> posList.stream().allMatch(p -> l.distance(p.sensor) > p.distance())).findAny().get(); -// for(int i = 0; i<4000000; i++) { -// List safeRange = new ArrayList<>(); -// for (Pos p : posList) { -// long distance = p.sensor.distance(p.beacon); -// -// } -// } -// long covered = 0; -// for(int i = 0; i<=4000000; i++) { -// if(i % 10000 == 0) System.out.println(i); -// outer: for(int j = 0; j<=4000000; j++) { -// long num = 0; -// for (Pos p : posList) { -// Loc l = new Loc(i, j); -// long distance = p.sensor.distance(p.beacon); -// long distance2 = l.distance(p.sensor); -// if (distance2 > distance && g.get(l).isEmpty()) { -// num++; -// // continue outer; -// } else { -// continue outer; -// } -// } -// if(num == posList.size()) { -// System.out.println(((i*4000000)+j)); -// } -// } -// } -// return covered; - } - - private List circleCircleIntersectionPoints(Loc c1, Loc c2, long r1, long r2) { - double EPS = 0.0000001; - - double r, R, d, dx, dy, cx, cy, Cx, Cy; - - if (r1 < r2) { - r = r1; R = r2; - cx = c1.x; cy = c1.y; - Cx = c2.x; Cy = c2.y; - } else { - r = r2; R = r1; - Cx = c1.x; Cy = c1.y; - cx = c2.x; cy = c2.y; - } - - // Compute the vector - dx = cx - Cx; - dy = cy - Cy; - - // Find the distance between two points. - d = Math.sqrt( dx*dx + dy*dy ); - - // There are an infinite number of solutions - // Seems appropriate to also return null - if (d < EPS && Math.abs(R-r) < EPS) return List.of(); - - // No intersection (circles centered at the - // same place with different size) - else if (d < EPS) return List.of(); - - var x = (dx / d) * R + Cx; - var y = (dy / d) * R + Cy; - var P = new DoubleLoc(x, y); - - // Single intersection (kissing circles) - if (Math.abs((R+r)-d) < EPS || Math.abs(R-(r+d)) < EPS) return List.of(new Loc(round(x), round(y))); - - // No intersection. Either the small circle contained within - // big circle or circles are simply disjoint. - if ( (d+r) < R || (R+r < d) ) return List.of(); - - var C = new DoubleLoc(Cx, Cy); - var angle = acossafe((r*r-d*d-R*R)/(-2.0*d*R)); - var pt1 = rotatePoint(C, P, +angle); - var pt2 = rotatePoint(C, P, -angle); - return List.of(pt1, pt2); - } - - double acossafe(double x) { - if (x >= +1.0) return 0; - if (x <= -1.0) return Math.PI; - return Math.acos(x); - } - - Loc rotatePoint(DoubleLoc fp, DoubleLoc pt, double a) { - var x = pt.x - fp.x; - var y = pt.y - fp.y; - var xRot = x * Math.cos(a) + y * Math.sin(a); - var yRot = y * Math.cos(a) - x * Math.sin(a); - return new Loc(round(fp.x+xRot),round(fp.y+yRot)); - } - } From de60d3b1bcabfcabe1aac79f1679b7bb5792ea91 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Thu, 15 Dec 2022 10:21:08 +0100 Subject: [PATCH 410/433] Possible optimization --- .../com/sbaars/adventofcode/common/Day.java | 6 +-- .../sbaars/adventofcode/common/Direction.java | 2 +- .../adventofcode/common/location/Loc.java | 4 +- .../adventofcode/common/location/Range.java | 27 ++++++++++-- .../adventofcode/network/DownloadTests.java | 2 +- .../adventofcode/year22/days/Day15.java | 44 ++++++------------- .../adventofcode/year22/days/Day15Test.java | 20 +++++++++ 7 files changed, 64 insertions(+), 41 deletions(-) create mode 100644 src/test/java/com/sbaars/adventofcode/year22/days/Day15Test.java diff --git a/src/main/java/com/sbaars/adventofcode/common/Day.java b/src/main/java/com/sbaars/adventofcode/common/Day.java index fb5668ce..9e7c32ae 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Day.java +++ b/src/main/java/com/sbaars/adventofcode/common/Day.java @@ -48,9 +48,9 @@ private String getDayPath() { public abstract Object part2(); public void printParts() { -// solutionPart1 = part1(); -// if(solutionPart1 instanceof Optional) solutionPart1 = ((Optional)solutionPart1).get(); -// System.out.println("Part 1: " + solutionPart1); + solutionPart1 = part1(); + if(solutionPart1 instanceof Optional) solutionPart1 = ((Optional)solutionPart1).get(); + System.out.println("Part 1: " + solutionPart1); solutionPart2 = part2(); if(solutionPart2 instanceof Optional) solutionPart2 = ((Optional)solutionPart2).get(); System.out.println("Part 2: " + solutionPart2); diff --git a/src/main/java/com/sbaars/adventofcode/common/Direction.java b/src/main/java/com/sbaars/adventofcode/common/Direction.java index a71366f8..aa2ca7f4 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Direction.java +++ b/src/main/java/com/sbaars/adventofcode/common/Direction.java @@ -96,7 +96,7 @@ public Point move(Point currentLocation, int amount) { }; } - public Loc move(Loc currentLocation, int amount) { + public Loc move(Loc currentLocation, long amount) { return switch (this) { case SOUTH -> new Loc(currentLocation.x, currentLocation.y + amount); case NORTH -> new Loc(currentLocation.x, currentLocation.y - amount); diff --git a/src/main/java/com/sbaars/adventofcode/common/location/Loc.java b/src/main/java/com/sbaars/adventofcode/common/location/Loc.java index f8465cae..7fbf2436 100644 --- a/src/main/java/com/sbaars/adventofcode/common/location/Loc.java +++ b/src/main/java/com/sbaars/adventofcode/common/location/Loc.java @@ -120,7 +120,7 @@ public Stream expand(long howMuch) { return new Range(new Loc(x-(howMuch/2), y-(howMuch/2)), new Loc(x+(howMuch/2), y+(howMuch/2))).stream(); } - public Stream walk(Direction dir, int howFar) { - return IntStream.range(0, howFar).mapToObj(i -> dir.move(this, i)); + public Stream walk(Direction dir, long howFar) { + return IntStream.range(0, toIntExact(howFar)).mapToObj(i -> dir.move(this, i)); } } diff --git a/src/main/java/com/sbaars/adventofcode/common/location/Range.java b/src/main/java/com/sbaars/adventofcode/common/location/Range.java index 09f73fbf..3e0a8217 100644 --- a/src/main/java/com/sbaars/adventofcode/common/location/Range.java +++ b/src/main/java/com/sbaars/adventofcode/common/location/Range.java @@ -7,17 +7,20 @@ import static java.util.stream.IntStream.rangeClosed; public class Range { - private final Loc start; - private final Loc end; + public final Loc start; + public final Loc end; public Range(Loc start, Loc end) { this.start = start; this.end = end; } + public Range(long x1, long y1, long x2, long y2) { + this(new Loc(x1, y1), new Loc(x2, y2)); + } + public Range(Pair pair) { - this.start = pair.a(); - this.end = pair.b(); + this(pair.a(), pair.b()); } public Stream stream(){ @@ -29,4 +32,20 @@ public Stream stream(){ public boolean inRange(Loc l) { return l.x >= start.x && l.y >=start.y && l.x <= end.x && l.y <= end.y; } + + public long distance() { + return start.distance(end); + } + + public Stream flatten() { + return Stream.of(start, end); + } + + public Loc getStart() { + return start; + } + + public Loc getEnd() { + return end; + } } diff --git a/src/main/java/com/sbaars/adventofcode/network/DownloadTests.java b/src/main/java/com/sbaars/adventofcode/network/DownloadTests.java index 5424985a..f2af69af 100644 --- a/src/main/java/com/sbaars/adventofcode/network/DownloadTests.java +++ b/src/main/java/com/sbaars/adventofcode/network/DownloadTests.java @@ -29,7 +29,7 @@ public DownloadTests() { } public static void main(String[] args) { - new DownloadTests().retrieveTests("14", "2022"); + new DownloadTests().retrieveTests("15", "2022"); } public void retrieveTests(String day, String year) { diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java index b77fc880..28f9fdc2 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java @@ -1,17 +1,17 @@ package com.sbaars.adventofcode.year22.days; -import com.sbaars.adventofcode.common.Direction; import com.sbaars.adventofcode.common.grid.InfiniteGrid; import com.sbaars.adventofcode.common.location.Loc; import com.sbaars.adventofcode.common.location.Range; import com.sbaars.adventofcode.year22.Day2022; -import java.util.Arrays; import java.util.List; +import java.util.stream.IntStream; +import static com.sbaars.adventofcode.common.Direction.fourDirections; import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; import static com.sbaars.adventofcode.common.grid.InfiniteGrid.toInfiniteGrid; -import static java.lang.Math.toIntExact; +import static java.util.Arrays.stream; public class Day15 extends Day2022 { public Day15() { @@ -22,39 +22,23 @@ public static void main(String[] args) { new Day15().printParts(); } - public record Input(long sensorX, long sensorY, long beaconX, long beaconY) {} - record Pos(Loc sensor, Loc beacon) { - private long distance() { - return sensor.distance(beacon); - } - } - @Override public Object part1() { - List posList = dayStream().map(s -> readString(s, "Sensor at x=%n, y=%n: closest beacon is at x=%n, y=%n", Input.class)).map(i -> new Pos(new Loc(i.sensorX, i.sensorY), new Loc(i.beaconX, i.beaconY))).toList(); - InfiniteGrid g = posList.stream().map(Pos::sensor).collect(toInfiniteGrid('S')); - posList.forEach(p -> g.set(p.beacon, 'B')); - long covered = 0; - outer: for(int i = -4000000; i<20000000; i++) { - for(Pos p : posList) { - Loc l =new Loc(i, 2000000); - long distance = p.sensor.distance(p.beacon); - long distance2 = l.distance(p.sensor); - if(distance2 <= distance && g.get(l).isEmpty()){ - covered++; - continue outer; - } - } - } - return covered; + List posList = input(); + InfiniteGrid g = posList.stream().flatMap(Range::flatten).collect(toInfiniteGrid('X')); + return IntStream.range(-1000000, 5000000).mapToObj(i -> new Loc(i, 2000000)).filter(l -> posList.stream().anyMatch(p -> l.distance(p.start) <= p.distance() && g.get(l).isEmpty())).count(); } @Override public Object part2() { - List posList = dayStream().map(s -> readString(s, "Sensor at x=%n, y=%n: closest beacon is at x=%n, y=%n", Input.class)).map(i -> new Pos(new Loc(i.sensorX, i.sensorY), new Loc(i.beaconX, i.beaconY))).toList(); + List posList = input(); Range target = new Range(new Loc(0, 0), new Loc(4000000, 4000000)); - return posList.stream().flatMap(p -> - Arrays.stream(Direction.fourDirections()).flatMap(d -> d.move(p.sensor, toIntExact(p.distance()) + 1).walk(d.turnSteps(3), toIntExact(p.distance() + 2))) - ).filter(target::inRange).filter(l -> posList.stream().allMatch(p -> l.distance(p.sensor) > p.distance())).findAny().get(); + return input().stream().filter(p -> p.flatten().allMatch(target::inRange)).flatMap(p -> + stream(fourDirections()).flatMap(d -> d.move(p.start, p.distance() + 1).walk(d.turnSteps(3), p.distance() + 1)) + ).filter(target::inRange).filter(l -> posList.stream().allMatch(p -> l.distance(p.start) > p.distance())).mapToLong(l -> l.x * 4000000 + l.y).findAny().getAsLong(); + } + + private List input() { + return dayStream().map(s -> readString(s, "Sensor at x=%n, y=%n: closest beacon is at x=%n, y=%n", Range.class)).toList(); } } diff --git a/src/test/java/com/sbaars/adventofcode/year22/days/Day15Test.java b/src/test/java/com/sbaars/adventofcode/year22/days/Day15Test.java new file mode 100644 index 00000000..1026ccf9 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year22/days/Day15Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year22.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year22.days.Day15; + + class Day15Test { + Day15 day = new Day15(); + + @Test + void testPart1() { + assertEquals("4961647", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("12274327017867", day.part2().toString()); + } + } From 379fa56ba91442a2c41284cad140692acfef74cb Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Thu, 15 Dec 2022 10:21:33 +0100 Subject: [PATCH 411/433] Remove optimization that may (but does not) affect correctness --- src/main/java/com/sbaars/adventofcode/year22/days/Day15.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java index 28f9fdc2..553b12ab 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java @@ -33,7 +33,7 @@ public Object part1() { public Object part2() { List posList = input(); Range target = new Range(new Loc(0, 0), new Loc(4000000, 4000000)); - return input().stream().filter(p -> p.flatten().allMatch(target::inRange)).flatMap(p -> + return input().stream().flatMap(p -> stream(fourDirections()).flatMap(d -> d.move(p.start, p.distance() + 1).walk(d.turnSteps(3), p.distance() + 1)) ).filter(target::inRange).filter(l -> posList.stream().allMatch(p -> l.distance(p.start) > p.distance())).mapToLong(l -> l.x * 4000000 + l.y).findAny().getAsLong(); } From a6e16f0a759e8989d81195a8009c54d2b747b3cc Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Thu, 15 Dec 2022 10:23:13 +0100 Subject: [PATCH 412/433] cleanup --- .../sbaars/adventofcode/year22/days/Day15.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java index 553b12ab..9a784fdb 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java @@ -26,16 +26,23 @@ public static void main(String[] args) { public Object part1() { List posList = input(); InfiniteGrid g = posList.stream().flatMap(Range::flatten).collect(toInfiniteGrid('X')); - return IntStream.range(-1000000, 5000000).mapToObj(i -> new Loc(i, 2000000)).filter(l -> posList.stream().anyMatch(p -> l.distance(p.start) <= p.distance() && g.get(l).isEmpty())).count(); + return IntStream.range(-1000000, 5000000) + .mapToObj(i -> new Loc(i, 2000000)) + .filter(l -> posList.stream().anyMatch(p -> l.distance(p.start) <= p.distance() && g.get(l).isEmpty())) + .count(); } @Override public Object part2() { List posList = input(); Range target = new Range(new Loc(0, 0), new Loc(4000000, 4000000)); - return input().stream().flatMap(p -> - stream(fourDirections()).flatMap(d -> d.move(p.start, p.distance() + 1).walk(d.turnSteps(3), p.distance() + 1)) - ).filter(target::inRange).filter(l -> posList.stream().allMatch(p -> l.distance(p.start) > p.distance())).mapToLong(l -> l.x * 4000000 + l.y).findAny().getAsLong(); + return input().stream() + .flatMap(p -> stream(fourDirections()).flatMap(d -> d.move(p.start, p.distance() + 1).walk(d.turnSteps(3), p.distance() + 1))) + .filter(target::inRange) + .filter(l -> posList.stream().allMatch(p -> l.distance(p.start) > p.distance())) + .mapToLong(l -> l.x * 4000000 + l.y) + .findAny() + .getAsLong(); } private List input() { From df29efcfbb902298db4a7b5cfba040d192e0e39e Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Thu, 15 Dec 2022 10:23:53 +0100 Subject: [PATCH 413/433] add little comment --- src/main/java/com/sbaars/adventofcode/year22/days/Day15.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java index 9a784fdb..d3eff0bf 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java @@ -26,7 +26,7 @@ public static void main(String[] args) { public Object part1() { List posList = input(); InfiniteGrid g = posList.stream().flatMap(Range::flatten).collect(toInfiniteGrid('X')); - return IntStream.range(-1000000, 5000000) + return IntStream.range(-1000000, 5000000) // These values were found by trial-and-error .mapToObj(i -> new Loc(i, 2000000)) .filter(l -> posList.stream().anyMatch(p -> l.distance(p.start) <= p.distance() && g.get(l).isEmpty())) .count(); From f8a684be82b71a7c876885bf427c406e1271c57c Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Thu, 15 Dec 2022 19:13:55 +0100 Subject: [PATCH 414/433] All these god damn intersect functions --- .../sbaars/adventofcode/common/Direction.java | 4 + .../adventofcode/common/location/Loc.java | 4 + .../adventofcode/common/location/Range.java | 76 +++++++++++++++++++ .../adventofcode/year22/days/Day15.java | 23 +++++- .../common/location/RangeTest.java | 43 +++++++++++ .../adventofcode/year22/days/Day15Test.java | 10 ++- 6 files changed, 155 insertions(+), 5 deletions(-) create mode 100644 src/test/java/com/sbaars/adventofcode/common/location/RangeTest.java diff --git a/src/main/java/com/sbaars/adventofcode/common/Direction.java b/src/main/java/com/sbaars/adventofcode/common/Direction.java index aa2ca7f4..c366863a 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Direction.java +++ b/src/main/java/com/sbaars/adventofcode/common/Direction.java @@ -75,6 +75,10 @@ public static Direction[] diagonals() { return new Direction[]{NORTHEAST, SOUTHEAST, SOUTHWEST, NORTHWEST}; } + public Direction turn() { + return turn(true); + } + public Direction turn(boolean right) { int cur = ordinal() + (right ? 1 : -1); if (cur == fourDirections().length) cur = 0; diff --git a/src/main/java/com/sbaars/adventofcode/common/location/Loc.java b/src/main/java/com/sbaars/adventofcode/common/location/Loc.java index 7fbf2436..aa06ad9d 100644 --- a/src/main/java/com/sbaars/adventofcode/common/location/Loc.java +++ b/src/main/java/com/sbaars/adventofcode/common/location/Loc.java @@ -123,4 +123,8 @@ public Stream expand(long howMuch) { public Stream walk(Direction dir, long howFar) { return IntStream.range(0, toIntExact(howFar)).mapToObj(i -> dir.move(this, i)); } + + public Stream fourDirs() { + return Arrays.stream(Direction.fourDirections()).map(d -> d.move(this)); + } } diff --git a/src/main/java/com/sbaars/adventofcode/common/location/Range.java b/src/main/java/com/sbaars/adventofcode/common/location/Range.java index 3e0a8217..2bff7164 100644 --- a/src/main/java/com/sbaars/adventofcode/common/location/Range.java +++ b/src/main/java/com/sbaars/adventofcode/common/location/Range.java @@ -2,8 +2,11 @@ import com.sbaars.adventofcode.common.Pair; +import java.util.Optional; import java.util.stream.Stream; +import static java.util.Optional.empty; +import static java.util.Optional.of; import static java.util.stream.IntStream.rangeClosed; public class Range { @@ -48,4 +51,77 @@ public Loc getStart() { public Loc getEnd() { return end; } + + public boolean inDiamond(Loc l) { + return l.distance(start) <= distance(); + } + + public Optional intersectsWith(Range r) { + long x1 = start.x; + long y1 = start.y; + long x2 = end.x; + long y2 = end.y; + long x3 = r.start.x; + long y3 = r.start.y; + long x4 = r.end.x; + long y4 = r.end.y; + long denominator = (x1-x2)*(y3-y4)-(y1-y2)*(y3-x4); + if(denominator == 0) return empty(); + double px = ((x1*y2-y1*x2)*(x3-x4)-(x1-x2)*(x3*y4-y3*x4))/denominator; + double py = ((x1*y2-y1*x2)*(y3-y4)-(y1-y2)*(x3*y4-y3*x4))/denominator; + return of(new Loc((long)px, (long)py)); + } + + public Optional intersectsWith2(Range r) { + long x1 = start.x; + long y1 = start.y; + long x2 = end.x; + long y2 = end.y; + long x3 = r.start.x; + long y3 = r.start.y; + long x4 = r.end.x; + long y4 = r.end.y; + double denominator = (x1-x2)*(y3-y4)-(y1-y2)*(y3-x4); + if(denominator == 0) return empty(); + double t = ((x1-x3)*(y3-y4)-(y1-y3)*(x3-x4))/denominator; + return of(new Loc((long)t*(x2-x1), (long)t*(y2-y1))); + } + + public Optional intersectsWith3(Range r) + { + double p0_x = start.x; + double p0_y = start.y; + double p1_x = end.x; + double p1_y = end.y; + double p2_x = r.start.x; + double p2_y = r.start.y; + double p3_x = r.end.x; + double p3_y = r.end.y; + double s1_x, s1_y, s2_x, s2_y; + s1_x = p1_x - p0_x; s1_y = p1_y - p0_y; + s2_x = p3_x - p2_x; s2_y = p3_y - p2_y; + + double s, t; + s = (-s1_y * (p0_x - p2_x) + s1_x * (p0_y - p2_y)) / (-s2_x * s1_y + s1_x * s2_y); + t = ( s2_x * (p0_y - p2_y) - s2_y * (p0_x - p2_x)) / (-s2_x * s1_y + s1_x * s2_y); + + if (s >= 0 && s <= 1 && t >= 0 && t <= 1) + { + return of(new Loc((long)(p0_x + (t * s1_x)), (long)(p0_y + (t * s1_y)))); + } + + return empty(); // No collision + } + + +// public Optional intersectsWith2(Range r) { +// long x1 = start.x; +// long y1 = start.y; +// long x2 = end.x; +// long y2 = end.y; +// long x3 = r.start.x; +// long y3 = r.start.y; +// long x4 = r.end.x; +// long y4 = r.end.y; +// } } diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java index d3eff0bf..5f87870f 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java @@ -11,6 +11,7 @@ import static com.sbaars.adventofcode.common.Direction.fourDirections; import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; import static com.sbaars.adventofcode.common.grid.InfiniteGrid.toInfiniteGrid; +import static com.sbaars.adventofcode.util.AOCUtils.allPairs; import static java.util.Arrays.stream; public class Day15 extends Day2022 { @@ -20,6 +21,7 @@ public Day15() { public static void main(String[] args) { new Day15().printParts(); + System.out.println(new Day15().part3()); } @Override @@ -28,7 +30,7 @@ public Object part1() { InfiniteGrid g = posList.stream().flatMap(Range::flatten).collect(toInfiniteGrid('X')); return IntStream.range(-1000000, 5000000) // These values were found by trial-and-error .mapToObj(i -> new Loc(i, 2000000)) - .filter(l -> posList.stream().anyMatch(p -> l.distance(p.start) <= p.distance() && g.get(l).isEmpty())) + .filter(l -> posList.stream().anyMatch(p -> p.inDiamond(l) && g.get(l).isEmpty())) .count(); } @@ -39,7 +41,24 @@ public Object part2() { return input().stream() .flatMap(p -> stream(fourDirections()).flatMap(d -> d.move(p.start, p.distance() + 1).walk(d.turnSteps(3), p.distance() + 1))) .filter(target::inRange) - .filter(l -> posList.stream().allMatch(p -> l.distance(p.start) > p.distance())) + .filter(l -> posList.stream().noneMatch(p -> p.inDiamond(l))) + .peek(System.out::println) + .mapToLong(l -> l.x * 4000000 + l.y) + .findAny() + .getAsLong(); + } + + public Object part3() { + List posList = input(); + Range target = new Range(new Loc(0, 0), new Loc(4000000, 4000000)); + List lines = posList.stream() + .flatMap(p -> stream(fourDirections()).map(d -> new Range(d.move(p.start, p.distance()), d.turn().move(p.start, p.distance())))) + .toList(); + return allPairs(lines).flatMap(p -> p.a().intersectsWith(p.b()).stream()) + .filter(target::inRange) + .flatMap(Loc::fourDirs) + .peek(System.out::println) + .filter(l -> posList.stream().noneMatch(p -> p.inDiamond(l))) .mapToLong(l -> l.x * 4000000 + l.y) .findAny() .getAsLong(); diff --git a/src/test/java/com/sbaars/adventofcode/common/location/RangeTest.java b/src/test/java/com/sbaars/adventofcode/common/location/RangeTest.java new file mode 100644 index 00000000..6e869410 --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/common/location/RangeTest.java @@ -0,0 +1,43 @@ +package com.sbaars.adventofcode.common.location; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class RangeTest { + @Test + public void intersectsWith1(){ + Range range3 = new Range(0, 0, 4, 4); + Range range4 = new Range(0, 4, 4, 0); +// assertTrue(range1.intersectsWith(range2).isEmpty()); +// assertTrue(range2.intersectsWith(range1).isEmpty()); + assertEquals(new Loc(2, 2), range3.intersectsWith3(range4).get()); + } + + @Test + public void intersectsWith2(){ + Range range5 = new Range(1, 0, 1, 4); + Range range6 = new Range(0, 1, 4, 1); + Range range7 = new Range(0, 2, 4, 1); + Range range8 = new Range(0, 3, 4, 1); + assertEquals(new Loc(1, 1), range5.intersectsWith3(range6).get()); + } + + @Test + public void intersectsWith3(){ + Range range5 = new Range(1, 0, 1, 4); + Range range6 = new Range(0, 1, 4, 1); + Range range7 = new Range(0, 2, 4, 1); + Range range8 = new Range(0, 3, 4, 1); + assertEquals(new Loc(1, 2), range5.intersectsWith3(range7).get()); + } + + @Test + public void intersectsWith4(){ + Range range5 = new Range(1, 0, 1, 4); + Range range6 = new Range(0, 1, 4, 1); + Range range7 = new Range(0, 2, 4, 1); + Range range8 = new Range(0, 3, 4, 1); + assertEquals(new Loc(1, 3), range5.intersectsWith2(range8).get()); + } +} diff --git a/src/test/java/com/sbaars/adventofcode/year22/days/Day15Test.java b/src/test/java/com/sbaars/adventofcode/year22/days/Day15Test.java index 1026ccf9..0614a4ea 100644 --- a/src/test/java/com/sbaars/adventofcode/year22/days/Day15Test.java +++ b/src/test/java/com/sbaars/adventofcode/year22/days/Day15Test.java @@ -1,9 +1,8 @@ package com.sbaars.adventofcode.year22.days; - import static org.junit.jupiter.api.Assertions.assertEquals; - import org.junit.jupiter.api.Test; - import com.sbaars.adventofcode.year22.days.Day15; + + import static org.junit.jupiter.api.Assertions.assertEquals; class Day15Test { Day15 day = new Day15(); @@ -17,4 +16,9 @@ void testPart1() { void testPart2() { assertEquals("12274327017867", day.part2().toString()); } + + @Test + void testPart3() { + assertEquals("12274327017867", day.part3().toString()); + } } From e55e5aa767828ac94cbc3cbd1cf81bf753d88a61 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Thu, 15 Dec 2022 19:17:27 +0100 Subject: [PATCH 415/433] Towards working part 3 --- .../adventofcode/common/location/Range.java | 15 ++----------- .../common/location/RangeTest.java | 22 +++++++++++++------ 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/common/location/Range.java b/src/main/java/com/sbaars/adventofcode/common/location/Range.java index 2bff7164..3f715b04 100644 --- a/src/main/java/com/sbaars/adventofcode/common/location/Range.java +++ b/src/main/java/com/sbaars/adventofcode/common/location/Range.java @@ -5,6 +5,7 @@ import java.util.Optional; import java.util.stream.Stream; +import static java.lang.Math.round; import static java.util.Optional.empty; import static java.util.Optional.of; import static java.util.stream.IntStream.rangeClosed; @@ -107,21 +108,9 @@ public Optional intersectsWith3(Range r) if (s >= 0 && s <= 1 && t >= 0 && t <= 1) { - return of(new Loc((long)(p0_x + (t * s1_x)), (long)(p0_y + (t * s1_y)))); + return of(new Loc(round(p0_x + (t * s1_x)), round(p0_y + (t * s1_y)))); } return empty(); // No collision } - - -// public Optional intersectsWith2(Range r) { -// long x1 = start.x; -// long y1 = start.y; -// long x2 = end.x; -// long y2 = end.y; -// long x3 = r.start.x; -// long y3 = r.start.y; -// long x4 = r.end.x; -// long y4 = r.end.y; -// } } diff --git a/src/test/java/com/sbaars/adventofcode/common/location/RangeTest.java b/src/test/java/com/sbaars/adventofcode/common/location/RangeTest.java index 6e869410..8e734982 100644 --- a/src/test/java/com/sbaars/adventofcode/common/location/RangeTest.java +++ b/src/test/java/com/sbaars/adventofcode/common/location/RangeTest.java @@ -3,33 +3,40 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; public class RangeTest { + + @Test + public void intersectsWithEmpty(){ + Range range1 = new Range(0, 0, 0, 4); + Range range2 = new Range(4, 0, 4, 4); + assertTrue(range1.intersectsWith(range2).isEmpty()); + assertTrue(range2.intersectsWith(range1).isEmpty()); + } + @Test public void intersectsWith1(){ Range range3 = new Range(0, 0, 4, 4); Range range4 = new Range(0, 4, 4, 0); -// assertTrue(range1.intersectsWith(range2).isEmpty()); -// assertTrue(range2.intersectsWith(range1).isEmpty()); assertEquals(new Loc(2, 2), range3.intersectsWith3(range4).get()); + assertEquals(new Loc(2, 2), range4.intersectsWith3(range3).get()); } @Test public void intersectsWith2(){ Range range5 = new Range(1, 0, 1, 4); Range range6 = new Range(0, 1, 4, 1); - Range range7 = new Range(0, 2, 4, 1); - Range range8 = new Range(0, 3, 4, 1); assertEquals(new Loc(1, 1), range5.intersectsWith3(range6).get()); + assertEquals(new Loc(1, 1), range6.intersectsWith3(range5).get()); } @Test public void intersectsWith3(){ Range range5 = new Range(1, 0, 1, 4); - Range range6 = new Range(0, 1, 4, 1); Range range7 = new Range(0, 2, 4, 1); - Range range8 = new Range(0, 3, 4, 1); assertEquals(new Loc(1, 2), range5.intersectsWith3(range7).get()); + assertEquals(new Loc(1, 2), range7.intersectsWith3(range5).get()); } @Test @@ -38,6 +45,7 @@ public void intersectsWith4(){ Range range6 = new Range(0, 1, 4, 1); Range range7 = new Range(0, 2, 4, 1); Range range8 = new Range(0, 3, 4, 1); - assertEquals(new Loc(1, 3), range5.intersectsWith2(range8).get()); + assertEquals(new Loc(1, 3), range5.intersectsWith3(range8).get()); + assertEquals(new Loc(1, 3), range8.intersectsWith3(range5).get()); } } From 3618c08195f10c644f1cbf692e3dc6b807fc0c08 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Thu, 15 Dec 2022 19:25:24 +0100 Subject: [PATCH 416/433] Part 3 finished --- .../adventofcode/common/location/Range.java | 65 ++++--------------- .../common/location/RangeTest.java | 18 +++-- 2 files changed, 22 insertions(+), 61 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/common/location/Range.java b/src/main/java/com/sbaars/adventofcode/common/location/Range.java index 3f715b04..99241847 100644 --- a/src/main/java/com/sbaars/adventofcode/common/location/Range.java +++ b/src/main/java/com/sbaars/adventofcode/common/location/Range.java @@ -58,59 +58,22 @@ public boolean inDiamond(Loc l) { } public Optional intersectsWith(Range r) { - long x1 = start.x; - long y1 = start.y; - long x2 = end.x; - long y2 = end.y; - long x3 = r.start.x; - long y3 = r.start.y; - long x4 = r.end.x; - long y4 = r.end.y; - long denominator = (x1-x2)*(y3-y4)-(y1-y2)*(y3-x4); - if(denominator == 0) return empty(); - double px = ((x1*y2-y1*x2)*(x3-x4)-(x1-x2)*(x3*y4-y3*x4))/denominator; - double py = ((x1*y2-y1*x2)*(y3-y4)-(y1-y2)*(x3*y4-y3*x4))/denominator; - return of(new Loc((long)px, (long)py)); - } - - public Optional intersectsWith2(Range r) { - long x1 = start.x; - long y1 = start.y; - long x2 = end.x; - long y2 = end.y; - long x3 = r.start.x; - long y3 = r.start.y; - long x4 = r.end.x; - long y4 = r.end.y; - double denominator = (x1-x2)*(y3-y4)-(y1-y2)*(y3-x4); - if(denominator == 0) return empty(); - double t = ((x1-x3)*(y3-y4)-(y1-y3)*(x3-x4))/denominator; - return of(new Loc((long)t*(x2-x1), (long)t*(y2-y1))); - } - - public Optional intersectsWith3(Range r) - { - double p0_x = start.x; - double p0_y = start.y; - double p1_x = end.x; - double p1_y = end.y; - double p2_x = r.start.x; - double p2_y = r.start.y; - double p3_x = r.end.x; - double p3_y = r.end.y; + double x0 = start.x; + double y0 = start.y; + double x1 = end.x; + double y1 = end.y; + double x2 = r.start.x; + double y2 = r.start.y; + double x3 = r.end.x; + double y3 = r.end.y; double s1_x, s1_y, s2_x, s2_y; - s1_x = p1_x - p0_x; s1_y = p1_y - p0_y; - s2_x = p3_x - p2_x; s2_y = p3_y - p2_y; + s1_x = x1 - x0; s1_y = y1 - y0; + s2_x = x3 - x2; s2_y = y3 - y2; double s, t; - s = (-s1_y * (p0_x - p2_x) + s1_x * (p0_y - p2_y)) / (-s2_x * s1_y + s1_x * s2_y); - t = ( s2_x * (p0_y - p2_y) - s2_y * (p0_x - p2_x)) / (-s2_x * s1_y + s1_x * s2_y); - - if (s >= 0 && s <= 1 && t >= 0 && t <= 1) - { - return of(new Loc(round(p0_x + (t * s1_x)), round(p0_y + (t * s1_y)))); - } - - return empty(); // No collision + double denom = -s2_x * s1_y + s1_x * s2_y; + s = (-s1_y * (x0 - x2) + s1_x * (y0 - y2)) / denom; + t = ( s2_x * (y0 - y2) - s2_y * (x0 - x2)) / denom; + return s >= 0 && s <= 1 && t >= 0 && t <= 1 ? of(new Loc(round(x0 + (t * s1_x)), round(y0 + (t * s1_y)))) : empty(); } } diff --git a/src/test/java/com/sbaars/adventofcode/common/location/RangeTest.java b/src/test/java/com/sbaars/adventofcode/common/location/RangeTest.java index 8e734982..988fccf5 100644 --- a/src/test/java/com/sbaars/adventofcode/common/location/RangeTest.java +++ b/src/test/java/com/sbaars/adventofcode/common/location/RangeTest.java @@ -19,33 +19,31 @@ public void intersectsWithEmpty(){ public void intersectsWith1(){ Range range3 = new Range(0, 0, 4, 4); Range range4 = new Range(0, 4, 4, 0); - assertEquals(new Loc(2, 2), range3.intersectsWith3(range4).get()); - assertEquals(new Loc(2, 2), range4.intersectsWith3(range3).get()); + assertEquals(new Loc(2, 2), range3.intersectsWith(range4).get()); + assertEquals(new Loc(2, 2), range4.intersectsWith(range3).get()); } @Test public void intersectsWith2(){ Range range5 = new Range(1, 0, 1, 4); Range range6 = new Range(0, 1, 4, 1); - assertEquals(new Loc(1, 1), range5.intersectsWith3(range6).get()); - assertEquals(new Loc(1, 1), range6.intersectsWith3(range5).get()); + assertEquals(new Loc(1, 1), range5.intersectsWith(range6).get()); + assertEquals(new Loc(1, 1), range6.intersectsWith(range5).get()); } @Test public void intersectsWith3(){ Range range5 = new Range(1, 0, 1, 4); Range range7 = new Range(0, 2, 4, 1); - assertEquals(new Loc(1, 2), range5.intersectsWith3(range7).get()); - assertEquals(new Loc(1, 2), range7.intersectsWith3(range5).get()); + assertEquals(new Loc(1, 2), range5.intersectsWith(range7).get()); + assertEquals(new Loc(1, 2), range7.intersectsWith(range5).get()); } @Test public void intersectsWith4(){ Range range5 = new Range(1, 0, 1, 4); - Range range6 = new Range(0, 1, 4, 1); - Range range7 = new Range(0, 2, 4, 1); Range range8 = new Range(0, 3, 4, 1); - assertEquals(new Loc(1, 3), range5.intersectsWith3(range8).get()); - assertEquals(new Loc(1, 3), range8.intersectsWith3(range5).get()); + assertEquals(new Loc(1, 3), range5.intersectsWith(range8).get()); + assertEquals(new Loc(1, 3), range8.intersectsWith(range5).get()); } } From b3492c645c9826e9a2530ac9c28e492990d6cf44 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Thu, 15 Dec 2022 20:10:16 +0100 Subject: [PATCH 417/433] Swap out part 2 and 3 --- .../sbaars/adventofcode/year22/days/Day15.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java index 5f87870f..4af0641b 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java @@ -38,11 +38,14 @@ public Object part1() { public Object part2() { List posList = input(); Range target = new Range(new Loc(0, 0), new Loc(4000000, 4000000)); - return input().stream() - .flatMap(p -> stream(fourDirections()).flatMap(d -> d.move(p.start, p.distance() + 1).walk(d.turnSteps(3), p.distance() + 1))) + List lines = posList.stream() + .flatMap(p -> stream(fourDirections()).map(d -> new Range(d.move(p.start, p.distance()), d.turn().move(p.start, p.distance())))) + .toList(); + return allPairs(lines).flatMap(p -> p.a().intersectsWith(p.b()).stream()) .filter(target::inRange) - .filter(l -> posList.stream().noneMatch(p -> p.inDiamond(l))) + .flatMap(Loc::fourDirs) .peek(System.out::println) + .filter(l -> posList.stream().noneMatch(p -> p.inDiamond(l))) .mapToLong(l -> l.x * 4000000 + l.y) .findAny() .getAsLong(); @@ -51,14 +54,11 @@ public Object part2() { public Object part3() { List posList = input(); Range target = new Range(new Loc(0, 0), new Loc(4000000, 4000000)); - List lines = posList.stream() - .flatMap(p -> stream(fourDirections()).map(d -> new Range(d.move(p.start, p.distance()), d.turn().move(p.start, p.distance())))) - .toList(); - return allPairs(lines).flatMap(p -> p.a().intersectsWith(p.b()).stream()) + return input().stream() + .flatMap(p -> stream(fourDirections()).flatMap(d -> d.move(p.start, p.distance() + 1).walk(d.turnSteps(3), p.distance() + 1))) .filter(target::inRange) - .flatMap(Loc::fourDirs) - .peek(System.out::println) .filter(l -> posList.stream().noneMatch(p -> p.inDiamond(l))) + .peek(System.out::println) .mapToLong(l -> l.x * 4000000 + l.y) .findAny() .getAsLong(); From 173424f238e39d2f56db0590b76038de87b79bd4 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Thu, 15 Dec 2022 20:14:28 +0100 Subject: [PATCH 418/433] Remove printlines --- src/main/java/com/sbaars/adventofcode/year22/days/Day15.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java index 4af0641b..e607a7f1 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day15.java @@ -44,7 +44,6 @@ public Object part2() { return allPairs(lines).flatMap(p -> p.a().intersectsWith(p.b()).stream()) .filter(target::inRange) .flatMap(Loc::fourDirs) - .peek(System.out::println) .filter(l -> posList.stream().noneMatch(p -> p.inDiamond(l))) .mapToLong(l -> l.x * 4000000 + l.y) .findAny() @@ -58,7 +57,6 @@ public Object part3() { .flatMap(p -> stream(fourDirections()).flatMap(d -> d.move(p.start, p.distance() + 1).walk(d.turnSteps(3), p.distance() + 1))) .filter(target::inRange) .filter(l -> posList.stream().noneMatch(p -> p.inDiamond(l))) - .peek(System.out::println) .mapToLong(l -> l.x * 4000000 + l.y) .findAny() .getAsLong(); From 0845834df670a10085815651defdd4a24a14570e Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Thu, 15 Dec 2022 20:16:21 +0100 Subject: [PATCH 419/433] clean some code --- .../adventofcode/year22/days/Day13.java | 7 +++++-- .../adventofcode/year22/days/Day14.java | 19 ++++++++++++++++--- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java index 0db29df0..9c8d70fc 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day13.java @@ -54,8 +54,11 @@ private int[] findLevels(String str) { private Node node(String s, int[] levels) { if(s.charAt(0) >= '0' && s.charAt(0) <= '9') return node(parseInt(s)); if(s.equals("[]")) return node(List.of()); - int[] commas = range(0, levels.length).filter(i -> i == 0 || i == levels.length - 1 || levels[i] == levels[0] && s.charAt(i) == ',').toArray(); - return node(range(1, commas.length).mapToObj(i -> node(s.substring(commas[i-1]+1, commas[i]))).toList()); + int[] commas = range(0, levels.length) + .filter(i -> i == 0 || i == levels.length - 1 || levels[i] == levels[0] && s.charAt(i) == ',') + .toArray(); + return node(range(1, commas.length) + .mapToObj(i -> node(s.substring(commas[i-1]+1, commas[i]))).toList()); } private Optional compare(Node a, Node b) { diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java index c9d8b480..b39455e2 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day14.java @@ -37,7 +37,12 @@ public Object part2() { } public int amountOfSand(boolean part1) { - List> in = dayStream().map(s -> Arrays.asList(s.split(" -> ")).stream().map(s2 -> readString(s2, "%n,%n", Loc.class)).toList()).collect(Collectors.toCollection(ArrayList::new)); + List> in = dayStream() + .map(s -> Arrays.asList(s.split(" -> ")) + .stream() + .map(s2 -> readString(s2, "%n,%n", Loc.class)) + .toList()) + .collect(Collectors.toCollection(ArrayList::new)); if(!part1) { long maxY = in.stream().flatMapToLong(e -> e.stream().mapToLong(f -> f.y)).max().getAsLong() + 2; in.add(List.of(new Loc(0, maxY), new Loc(999, maxY))); @@ -47,14 +52,22 @@ public int amountOfSand(boolean part1) { } private static InfiniteGrid constructWalls(List> in) { - return in.stream().flatMap(AOCUtils::connectedPairs).map(Range::new).flatMap(Range::stream).collect(toInfiniteGrid('#')); + return in.stream() + .flatMap(AOCUtils::connectedPairs) + .map(Range::new) + .flatMap(Range::stream) + .collect(toInfiniteGrid('#')); } private static int simulateSand(boolean part1, InfiniteGrid g) { Loc sandOrigin = new Loc(500, 0); MutableLoc fallingSand = new MutableLoc(sandOrigin); while(part1 ? fallingSand.get().y<950 : g.get(sandOrigin).isEmpty()) { - Loc moveTo = Stream.of(SOUTH, SOUTHWEST, SOUTHEAST, CENTER).map(d -> d.move(fallingSand.get())).filter(p -> g.get(p).isEmpty()).findFirst().get(); + Loc moveTo = Stream.of(SOUTH, SOUTHWEST, SOUTHEAST, CENTER) + .map(d -> d.move(fallingSand.get())) + .filter(p -> g.get(p).isEmpty()) + .findFirst() + .get(); if(moveTo.equals(fallingSand.get())) { g.set(fallingSand.get(), 'o'); fallingSand.set(sandOrigin); From c08ad685d6c075c183c5b73ce654398f89a63846 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Thu, 15 Dec 2022 20:21:16 +0100 Subject: [PATCH 420/433] Fix day 12 which I broke for no reason --- .../java/com/sbaars/adventofcode/year22/days/Day12.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day12.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day12.java index ba0788bc..d37df995 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day12.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day12.java @@ -27,11 +27,11 @@ public NumGrid input() { return new NumGrid(Arrays.stream(dayGrid()).map(e -> new String(e).chars().mapToLong(f -> f).toArray()).toArray(long[][]::new)); } - private long findExit(Point p9, NumGrid g) { + private long findExit(Point start, NumGrid g) { Set visited = new HashSet<>(); Set currentLevel = new HashSet<>(); - currentLevel.add(p9); - visited.add(p9); + currentLevel.add(start); + visited.add(start); long steps = 1; while(!currentLevel.isEmpty()){ @@ -47,6 +47,7 @@ private long findExit(Point p9, NumGrid g) { } } } + steps++; } return Long.MAX_VALUE; } From 36fe7e2ea9c8362732c99360ed57e4b8c1534a90 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Thu, 15 Dec 2022 20:41:55 +0100 Subject: [PATCH 421/433] Prepare Day 16 --- .../com/sbaars/adventofcode/year22/days/Day16.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java index 40211dca..efbed731 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java @@ -1,5 +1,6 @@ package com.sbaars.adventofcode.year22.days; +import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year22.Day2022; public class Day16 extends Day2022 { @@ -9,11 +10,18 @@ public Day16() { } public static void main(String[] args) { - new Day16().printParts(); + Day d = new Day16(); + d.downloadIfNotDownloaded(); + d.downloadExample(); + d.printParts(); +// System.in.read(); +// d.submitPart1(); +// d.submitPart2(); } @Override public Object part1() { + return ""; } From e3a795113cf8a3981d05ebd468fd32bb895dc701 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Fri, 16 Dec 2022 06:42:31 +0100 Subject: [PATCH 422/433] aaa --- .../adventofcode/year22/days/Day16.java | 38 +++++- src/main/resources/2022-examples/day16-1.txt | 10 ++ src/main/resources/2022-examples/day16-2.txt | 113 ++++++++++++++++++ src/main/resources/2022/day16.txt | 50 ++++++++ 4 files changed, 209 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/2022-examples/day16-1.txt create mode 100644 src/main/resources/2022-examples/day16-2.txt create mode 100644 src/main/resources/2022/day16.txt diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java index efbed731..32bd7667 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java @@ -3,6 +3,13 @@ import com.sbaars.adventofcode.common.Day; import com.sbaars.adventofcode.year22.Day2022; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.LongStream; + +import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; + public class Day16 extends Day2022 { public Day16() { @@ -13,16 +20,43 @@ public static void main(String[] args) { Day d = new Day16(); d.downloadIfNotDownloaded(); d.downloadExample(); - d.printParts(); + d.printParts(1); // System.in.read(); // d.submitPart1(); // d.submitPart2(); } + public record Valve(String name, long flow, String others) {} + public record State(Map open, List path, int mins, int index) {} + @Override public Object part1() { + List in = dayStream().map(s -> { + try { + return readString(s, "Valve %s has flow rate=%n; tunnels lead to valves %s", Valve.class); + } catch (IllegalStateException e) { + return readString(s, "Valve %s has flow rate=%n; tunnel leads to valve %s", Valve.class); + } + }).toList(); + Map indices = IntStream.range(0, in.size()).boxed().collect(Collectors.toMap(i -> this.in.get(i).name, i -> i)); + List states = + return walk(0, 0, new HashMap<>(), new HashSet<>()); + } - return ""; + private long walk(int mins, int index, Map open, Set visited) { + long flow = open.values().stream().mapToLong(e -> e).sum(); + if(mins == 30){ +// System.out.println(Arrays.toString(open.keySet().toArray())); + return flow; + } + Valve v = in.get(index); +// if(!visited.add(v.name)) return 0; + List options = new ArrayList<>(); + if(v.flow > 0 && !open.containsKey(v.name)) { + open.put(v.name, v.flow); + options.add(walk(mins + 1, index, new HashMap<>(open), new HashSet<>(visited))); + } + return flow + LongStream.concat(options.stream().mapToLong(e -> e), Arrays.stream(v.others.split(", ")).mapToLong(s -> walk(mins + 1, indices.get(s), new HashMap<>(open), new HashSet<>(visited)))).max().orElse(0); } @Override diff --git a/src/main/resources/2022-examples/day16-1.txt b/src/main/resources/2022-examples/day16-1.txt new file mode 100644 index 00000000..9f30acc1 --- /dev/null +++ b/src/main/resources/2022-examples/day16-1.txt @@ -0,0 +1,10 @@ +Valve AA has flow rate=0; tunnels lead to valves DD, II, BB +Valve BB has flow rate=13; tunnels lead to valves CC, AA +Valve CC has flow rate=2; tunnels lead to valves DD, BB +Valve DD has flow rate=20; tunnels lead to valves CC, AA, EE +Valve EE has flow rate=3; tunnels lead to valves FF, DD +Valve FF has flow rate=0; tunnels lead to valves EE, GG +Valve GG has flow rate=0; tunnels lead to valves FF, HH +Valve HH has flow rate=22; tunnel leads to valve GG +Valve II has flow rate=0; tunnels lead to valves AA, JJ +Valve JJ has flow rate=21; tunnel leads to valve II diff --git a/src/main/resources/2022-examples/day16-2.txt b/src/main/resources/2022-examples/day16-2.txt new file mode 100644 index 00000000..eb502d01 --- /dev/null +++ b/src/main/resources/2022-examples/day16-2.txt @@ -0,0 +1,113 @@ +== Minute 1 == +No valves are open. +You move to valve DD. + +== Minute 2 == +No valves are open. +You open valve DD. + +== Minute 3 == +Valve DD is open, releasing 20 pressure. +You move to valve CC. + +== Minute 4 == +Valve DD is open, releasing 20 pressure. +You move to valve BB. + +== Minute 5 == +Valve DD is open, releasing 20 pressure. +You open valve BB. + +== Minute 6 == +Valves BB and DD are open, releasing 33 pressure. +You move to valve AA. + +== Minute 7 == +Valves BB and DD are open, releasing 33 pressure. +You move to valve II. + +== Minute 8 == +Valves BB and DD are open, releasing 33 pressure. +You move to valve JJ. + +== Minute 9 == +Valves BB and DD are open, releasing 33 pressure. +You open valve JJ. + +== Minute 10 == +Valves BB, DD, and JJ are open, releasing 54 pressure. +You move to valve II. + +== Minute 11 == +Valves BB, DD, and JJ are open, releasing 54 pressure. +You move to valve AA. + +== Minute 12 == +Valves BB, DD, and JJ are open, releasing 54 pressure. +You move to valve DD. + +== Minute 13 == +Valves BB, DD, and JJ are open, releasing 54 pressure. +You move to valve EE. + +== Minute 14 == +Valves BB, DD, and JJ are open, releasing 54 pressure. +You move to valve FF. + +== Minute 15 == +Valves BB, DD, and JJ are open, releasing 54 pressure. +You move to valve GG. + +== Minute 16 == +Valves BB, DD, and JJ are open, releasing 54 pressure. +You move to valve HH. + +== Minute 17 == +Valves BB, DD, and JJ are open, releasing 54 pressure. +You open valve HH. + +== Minute 18 == +Valves BB, DD, HH, and JJ are open, releasing 76 pressure. +You move to valve GG. + +== Minute 19 == +Valves BB, DD, HH, and JJ are open, releasing 76 pressure. +You move to valve FF. + +== Minute 20 == +Valves BB, DD, HH, and JJ are open, releasing 76 pressure. +You move to valve EE. + +== Minute 21 == +Valves BB, DD, HH, and JJ are open, releasing 76 pressure. +You open valve EE. + +== Minute 22 == +Valves BB, DD, EE, HH, and JJ are open, releasing 79 pressure. +You move to valve DD. + +== Minute 23 == +Valves BB, DD, EE, HH, and JJ are open, releasing 79 pressure. +You move to valve CC. + +== Minute 24 == +Valves BB, DD, EE, HH, and JJ are open, releasing 79 pressure. +You open valve CC. + +== Minute 25 == +Valves BB, CC, DD, EE, HH, and JJ are open, releasing 81 pressure. + +== Minute 26 == +Valves BB, CC, DD, EE, HH, and JJ are open, releasing 81 pressure. + +== Minute 27 == +Valves BB, CC, DD, EE, HH, and JJ are open, releasing 81 pressure. + +== Minute 28 == +Valves BB, CC, DD, EE, HH, and JJ are open, releasing 81 pressure. + +== Minute 29 == +Valves BB, CC, DD, EE, HH, and JJ are open, releasing 81 pressure. + +== Minute 30 == +Valves BB, CC, DD, EE, HH, and JJ are open, releasing 81 pressure. diff --git a/src/main/resources/2022/day16.txt b/src/main/resources/2022/day16.txt new file mode 100644 index 00000000..f4a9984c --- /dev/null +++ b/src/main/resources/2022/day16.txt @@ -0,0 +1,50 @@ +Valve DJ has flow rate=0; tunnels lead to valves ZH, AA +Valve LP has flow rate=0; tunnels lead to valves AA, EE +Valve GT has flow rate=0; tunnels lead to valves FJ, AW +Valve RO has flow rate=5; tunnels lead to valves NO, FD, QV, BV +Valve PS has flow rate=0; tunnels lead to valves FY, UV +Valve QV has flow rate=0; tunnels lead to valves EB, RO +Valve MV has flow rate=0; tunnels lead to valves FL, EB +Valve RN has flow rate=0; tunnels lead to valves AW, LQ +Valve HF has flow rate=0; tunnels lead to valves QN, HW +Valve PY has flow rate=19; tunnel leads to valve SN +Valve AT has flow rate=0; tunnels lead to valves YQ, UY +Valve UY has flow rate=3; tunnels lead to valves KV, ID, AT, PB, PG +Valve YI has flow rate=0; tunnels lead to valves FL, FD +Valve EB has flow rate=8; tunnels lead to valves MV, GQ, QV +Valve ID has flow rate=0; tunnels lead to valves NO, UY +Valve FY has flow rate=15; tunnels lead to valves LQ, PS +Valve GQ has flow rate=0; tunnels lead to valves EB, KM +Valve HW has flow rate=0; tunnels lead to valves FJ, HF +Valve CQ has flow rate=17; tunnels lead to valves KM, GO +Valve AW has flow rate=20; tunnels lead to valves RN, GT, WH, MX +Valve BV has flow rate=0; tunnels lead to valves RO, ZH +Valve PB has flow rate=0; tunnels lead to valves UY, AA +Valve MX has flow rate=0; tunnels lead to valves AW, YG +Valve DE has flow rate=4; tunnels lead to valves MM, PZ, PG, DS, EP +Valve AA has flow rate=0; tunnels lead to valves EP, PB, LP, JT, DJ +Valve QN has flow rate=23; tunnels lead to valves SN, HF +Valve GO has flow rate=0; tunnels lead to valves CQ, MK +Valve PZ has flow rate=0; tunnels lead to valves IJ, DE +Valve PG has flow rate=0; tunnels lead to valves UY, DE +Valve FL has flow rate=18; tunnels lead to valves MV, YI +Valve DS has flow rate=0; tunnels lead to valves DE, ZH +Valve ZH has flow rate=11; tunnels lead to valves YQ, BV, DJ, DS, SB +Valve KV has flow rate=0; tunnels lead to valves UY, IJ +Valve UV has flow rate=9; tunnels lead to valves MM, PS, YG +Valve WH has flow rate=0; tunnels lead to valves JT, AW +Valve FD has flow rate=0; tunnels lead to valves YI, RO +Valve FJ has flow rate=24; tunnels lead to valves HW, GT +Valve JT has flow rate=0; tunnels lead to valves AA, WH +Valve SN has flow rate=0; tunnels lead to valves PY, QN +Valve KM has flow rate=0; tunnels lead to valves GQ, CQ +Valve LQ has flow rate=0; tunnels lead to valves RN, FY +Valve NO has flow rate=0; tunnels lead to valves ID, RO +Valve SB has flow rate=0; tunnels lead to valves ZH, IJ +Valve MK has flow rate=25; tunnel leads to valve GO +Valve YG has flow rate=0; tunnels lead to valves MX, UV +Valve IJ has flow rate=16; tunnels lead to valves EE, KV, PZ, SB +Valve EP has flow rate=0; tunnels lead to valves AA, DE +Valve MM has flow rate=0; tunnels lead to valves UV, DE +Valve YQ has flow rate=0; tunnels lead to valves AT, ZH +Valve EE has flow rate=0; tunnels lead to valves LP, IJ From 0e7c1f6316743a0fc6dc18c7d49d8afb1ad5e101 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Fri, 16 Dec 2022 06:44:06 +0100 Subject: [PATCH 423/433] aaa2 --- src/main/java/com/sbaars/adventofcode/year22/days/Day16.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java index 32bd7667..da037e10 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java @@ -27,7 +27,7 @@ public static void main(String[] args) { } public record Valve(String name, long flow, String others) {} - public record State(Map open, List path, int mins, int index) {} + public record State(Map open, List path, int index) {} @Override public Object part1() { @@ -39,7 +39,7 @@ public Object part1() { } }).toList(); Map indices = IntStream.range(0, in.size()).boxed().collect(Collectors.toMap(i -> this.in.get(i).name, i -> i)); - List states = + List states = new ArrayList<>(); return walk(0, 0, new HashMap<>(), new HashSet<>()); } From 370224e73bf117411a38593e445413e20a09f3cf Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Fri, 16 Dec 2022 06:49:00 +0100 Subject: [PATCH 424/433] brute force dead end --- .../adventofcode/year22/days/Day16.java | 39 ++++++++++++------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java index da037e10..3846f8de 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java @@ -14,6 +14,15 @@ public class Day16 extends Day2022 { public Day16() { super(16); + this.example = 1; + this.in = dayStream().map(s -> { + try { + return readString(s, "Valve %s has flow rate=%n; tunnels lead to valves %s", Valve.class); + } catch (IllegalStateException e) { + return readString(s, "Valve %s has flow rate=%n; tunnel leads to valve %s", Valve.class); + } + }).toList(); + this.indices = IntStream.range(0, in.size()).boxed().collect(Collectors.toMap(i -> this.in.get(i).name, i -> i)); } public static void main(String[] args) { @@ -26,24 +35,24 @@ public static void main(String[] args) { // d.submitPart2(); } + private final List in; + private final Map indices; + public record Valve(String name, long flow, String others) {} - public record State(Map open, List path, int index) {} + public record State(Map open, int mins, int index) {} @Override public Object part1() { - List in = dayStream().map(s -> { - try { - return readString(s, "Valve %s has flow rate=%n; tunnels lead to valves %s", Valve.class); - } catch (IllegalStateException e) { - return readString(s, "Valve %s has flow rate=%n; tunnel leads to valve %s", Valve.class); - } - }).toList(); - Map indices = IntStream.range(0, in.size()).boxed().collect(Collectors.toMap(i -> this.in.get(i).name, i -> i)); - List states = new ArrayList<>(); - return walk(0, 0, new HashMap<>(), new HashSet<>()); + return walk(0, 0, new HashMap<>(), new HashMap<>()); } - private long walk(int mins, int index, Map open, Set visited) { + Map visited = new HashMap<>(); + + private long walk(int mins, int index, Map open, Map visited) { + State st = new State(open, mins, index); + if(visited.containsKey(st)){ + return visited.get(st); + } long flow = open.values().stream().mapToLong(e -> e).sum(); if(mins == 30){ // System.out.println(Arrays.toString(open.keySet().toArray())); @@ -54,9 +63,11 @@ private long walk(int mins, int index, Map open, Set visit List options = new ArrayList<>(); if(v.flow > 0 && !open.containsKey(v.name)) { open.put(v.name, v.flow); - options.add(walk(mins + 1, index, new HashMap<>(open), new HashSet<>(visited))); + options.add(walk(mins + 1, index, new HashMap<>(open), new HashMap<>(visited))); } - return flow + LongStream.concat(options.stream().mapToLong(e -> e), Arrays.stream(v.others.split(", ")).mapToLong(s -> walk(mins + 1, indices.get(s), new HashMap<>(open), new HashSet<>(visited)))).max().orElse(0); + long res = flow + LongStream.concat(options.stream().mapToLong(e -> e), Arrays.stream(v.others.split(", ")).mapToLong(s -> walk(mins + 1, indices.get(s), new HashMap<>(open), new HashMap<>(visited)))).max().orElse(0); + visited.put(st, res); + return res; } @Override From 4e5342f08ac8f2f20d410bd4e5439a9ea819d1cd Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Fri, 16 Dec 2022 06:49:31 +0100 Subject: [PATCH 425/433] Revert "brute force dead end" This reverts commit 370224e73bf117411a38593e445413e20a09f3cf. --- .../adventofcode/year22/days/Day16.java | 39 +++++++------------ 1 file changed, 14 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java index 3846f8de..da037e10 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java @@ -14,15 +14,6 @@ public class Day16 extends Day2022 { public Day16() { super(16); - this.example = 1; - this.in = dayStream().map(s -> { - try { - return readString(s, "Valve %s has flow rate=%n; tunnels lead to valves %s", Valve.class); - } catch (IllegalStateException e) { - return readString(s, "Valve %s has flow rate=%n; tunnel leads to valve %s", Valve.class); - } - }).toList(); - this.indices = IntStream.range(0, in.size()).boxed().collect(Collectors.toMap(i -> this.in.get(i).name, i -> i)); } public static void main(String[] args) { @@ -35,24 +26,24 @@ public static void main(String[] args) { // d.submitPart2(); } - private final List in; - private final Map indices; - public record Valve(String name, long flow, String others) {} - public record State(Map open, int mins, int index) {} + public record State(Map open, List path, int index) {} @Override public Object part1() { - return walk(0, 0, new HashMap<>(), new HashMap<>()); + List in = dayStream().map(s -> { + try { + return readString(s, "Valve %s has flow rate=%n; tunnels lead to valves %s", Valve.class); + } catch (IllegalStateException e) { + return readString(s, "Valve %s has flow rate=%n; tunnel leads to valve %s", Valve.class); + } + }).toList(); + Map indices = IntStream.range(0, in.size()).boxed().collect(Collectors.toMap(i -> this.in.get(i).name, i -> i)); + List states = new ArrayList<>(); + return walk(0, 0, new HashMap<>(), new HashSet<>()); } - Map visited = new HashMap<>(); - - private long walk(int mins, int index, Map open, Map visited) { - State st = new State(open, mins, index); - if(visited.containsKey(st)){ - return visited.get(st); - } + private long walk(int mins, int index, Map open, Set visited) { long flow = open.values().stream().mapToLong(e -> e).sum(); if(mins == 30){ // System.out.println(Arrays.toString(open.keySet().toArray())); @@ -63,11 +54,9 @@ private long walk(int mins, int index, Map open, Map List options = new ArrayList<>(); if(v.flow > 0 && !open.containsKey(v.name)) { open.put(v.name, v.flow); - options.add(walk(mins + 1, index, new HashMap<>(open), new HashMap<>(visited))); + options.add(walk(mins + 1, index, new HashMap<>(open), new HashSet<>(visited))); } - long res = flow + LongStream.concat(options.stream().mapToLong(e -> e), Arrays.stream(v.others.split(", ")).mapToLong(s -> walk(mins + 1, indices.get(s), new HashMap<>(open), new HashMap<>(visited)))).max().orElse(0); - visited.put(st, res); - return res; + return flow + LongStream.concat(options.stream().mapToLong(e -> e), Arrays.stream(v.others.split(", ")).mapToLong(s -> walk(mins + 1, indices.get(s), new HashMap<>(open), new HashSet<>(visited)))).max().orElse(0); } @Override From 0d50f3ebb008ace75c7436b85dcf7cc82eaa2907 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Fri, 16 Dec 2022 07:07:05 +0100 Subject: [PATCH 426/433] Working solution part 1 --- .../adventofcode/year22/days/Day16.java | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java index da037e10..dc477034 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java @@ -6,7 +6,6 @@ import java.util.*; import java.util.stream.Collectors; import java.util.stream.IntStream; -import java.util.stream.LongStream; import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; @@ -20,14 +19,14 @@ public static void main(String[] args) { Day d = new Day16(); d.downloadIfNotDownloaded(); d.downloadExample(); - d.printParts(1); + d.printParts(); // System.in.read(); -// d.submitPart1(); + d.submitPart1(); // d.submitPart2(); } public record Valve(String name, long flow, String others) {} - public record State(Map open, List path, int index) {} + public record State(Map open, int index, long totalFlow) {} @Override public Object part1() { @@ -38,25 +37,26 @@ public Object part1() { return readString(s, "Valve %s has flow rate=%n; tunnel leads to valve %s", Valve.class); } }).toList(); - Map indices = IntStream.range(0, in.size()).boxed().collect(Collectors.toMap(i -> this.in.get(i).name, i -> i)); - List states = new ArrayList<>(); - return walk(0, 0, new HashMap<>(), new HashSet<>()); - } - - private long walk(int mins, int index, Map open, Set visited) { - long flow = open.values().stream().mapToLong(e -> e).sum(); - if(mins == 30){ -// System.out.println(Arrays.toString(open.keySet().toArray())); - return flow; - } - Valve v = in.get(index); -// if(!visited.add(v.name)) return 0; - List options = new ArrayList<>(); - if(v.flow > 0 && !open.containsKey(v.name)) { - open.put(v.name, v.flow); - options.add(walk(mins + 1, index, new HashMap<>(open), new HashSet<>(visited))); + Map indices = IntStream.range(0, in.size()).boxed().collect(Collectors.toMap(i -> in.get(i).name, i -> i)); + Set states = new HashSet<>(); + states.add(new State(new HashMap<>(), 0, 0)); + for(int minutes = 0; minutes<30; minutes++) { + Set newStates = new HashSet<>(); + for(State s : states) { + Valve v = in.get(s.index); + long flow = s.open.values().stream().mapToLong(e -> e).sum() + s.totalFlow; +// List newPath = new ArrayList<>(s.path); +// newPath.add(v.name); + if(v.flow > 0 && !s.open.containsKey(v.name)) { + Map newOpen = new HashMap<>(s.open); + newOpen.put(v.name, v.flow); + newStates.add(new State(newOpen, s.index, flow)); + } + Arrays.stream(v.others.split(", ")).forEach(name -> newStates.add(new State(s.open, indices.get(name), flow))); + } + states = newStates; } - return flow + LongStream.concat(options.stream().mapToLong(e -> e), Arrays.stream(v.others.split(", ")).mapToLong(s -> walk(mins + 1, indices.get(s), new HashMap<>(open), new HashSet<>(visited)))).max().orElse(0); + return states.stream().mapToLong(State::totalFlow).max().getAsLong(); } @Override From 7c2e639ebfe0250134170510607abfe243b52f1f Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Fri, 16 Dec 2022 07:31:12 +0100 Subject: [PATCH 427/433] Expanded path --- .../adventofcode/year22/days/Day16.java | 72 ++++++++++++++++--- 1 file changed, 63 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java index dc477034..060b7ffe 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java @@ -19,14 +19,62 @@ public static void main(String[] args) { Day d = new Day16(); d.downloadIfNotDownloaded(); d.downloadExample(); - d.printParts(); + d.printParts(0); // System.in.read(); - d.submitPart1(); +// d.submitPart1(); // d.submitPart2(); } public record Valve(String name, long flow, String others) {} - public record State(Map open, int index, long totalFlow) {} + + public static final class State { + private final Map open; + private final int index; + private final long totalFlow; + private final List path; + + public State(Map open, int index, long totalFlow, List path) { + this.open = open; + this.index = index; + this.totalFlow = totalFlow; + this.path = path; + } + + public Map open() { + return open; + } + + public int index() { + return index; + } + + public long totalFlow() { + return totalFlow; + } + + @Override + public boolean equals(Object obj) { + if (obj == this) return true; + if (obj == null || obj.getClass() != this.getClass()) return false; + var that = (State) obj; + return Objects.equals(this.open, that.open) && + this.index == that.index && + this.totalFlow == that.totalFlow; + } + + @Override + public int hashCode() { + return Objects.hash(open, index, totalFlow); + } + + @Override + public String toString() { + return "State[" + + "open=" + open + ", " + + "index=" + index + ", " + + "totalFlow=" + totalFlow + ']'; + } + } @Override public Object part1() { @@ -39,23 +87,29 @@ public Object part1() { }).toList(); Map indices = IntStream.range(0, in.size()).boxed().collect(Collectors.toMap(i -> in.get(i).name, i -> i)); Set states = new HashSet<>(); - states.add(new State(new HashMap<>(), 0, 0)); - for(int minutes = 0; minutes<30; minutes++) { + states.add(new State(new HashMap<>(), 0, 0, new ArrayList<>())); + for(int minutes = 0; minutes<31; minutes++) { Set newStates = new HashSet<>(); for(State s : states) { Valve v = in.get(s.index); long flow = s.open.values().stream().mapToLong(e -> e).sum() + s.totalFlow; -// List newPath = new ArrayList<>(s.path); -// newPath.add(v.name); + List newPath = new ArrayList<>(s.path); + newPath.add(v.name); if(v.flow > 0 && !s.open.containsKey(v.name)) { Map newOpen = new HashMap<>(s.open); newOpen.put(v.name, v.flow); - newStates.add(new State(newOpen, s.index, flow)); + newStates.add(new State(newOpen, s.index, flow, newPath)); } - Arrays.stream(v.others.split(", ")).forEach(name -> newStates.add(new State(s.open, indices.get(name), flow))); + Arrays.stream(v.others.split(", ")).forEach(name -> newStates.add(new State(s.open, indices.get(name), flow, newPath))); } states = newStates; } + for(State s : states){ + if(s.totalFlow == 1906) { + System.out.println(s); + System.out.println(Arrays.toString(s.path.toArray())); + } + } return states.stream().mapToLong(State::totalFlow).max().getAsLong(); } From 117d5be3890298d3d125f2cea5ced7e919e9023f Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Fri, 16 Dec 2022 07:32:02 +0100 Subject: [PATCH 428/433] minimal solution --- .../adventofcode/year22/days/Day16.java | 70 ++----------------- 1 file changed, 7 insertions(+), 63 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java index 060b7ffe..daf006a5 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java @@ -19,62 +19,14 @@ public static void main(String[] args) { Day d = new Day16(); d.downloadIfNotDownloaded(); d.downloadExample(); - d.printParts(0); + d.printParts(); // System.in.read(); -// d.submitPart1(); + d.submitPart1(); // d.submitPart2(); } public record Valve(String name, long flow, String others) {} - - public static final class State { - private final Map open; - private final int index; - private final long totalFlow; - private final List path; - - public State(Map open, int index, long totalFlow, List path) { - this.open = open; - this.index = index; - this.totalFlow = totalFlow; - this.path = path; - } - - public Map open() { - return open; - } - - public int index() { - return index; - } - - public long totalFlow() { - return totalFlow; - } - - @Override - public boolean equals(Object obj) { - if (obj == this) return true; - if (obj == null || obj.getClass() != this.getClass()) return false; - var that = (State) obj; - return Objects.equals(this.open, that.open) && - this.index == that.index && - this.totalFlow == that.totalFlow; - } - - @Override - public int hashCode() { - return Objects.hash(open, index, totalFlow); - } - - @Override - public String toString() { - return "State[" + - "open=" + open + ", " + - "index=" + index + ", " + - "totalFlow=" + totalFlow + ']'; - } - } + public record State(Map open, int index, long totalFlow) {} @Override public Object part1() { @@ -87,29 +39,21 @@ public Object part1() { }).toList(); Map indices = IntStream.range(0, in.size()).boxed().collect(Collectors.toMap(i -> in.get(i).name, i -> i)); Set states = new HashSet<>(); - states.add(new State(new HashMap<>(), 0, 0, new ArrayList<>())); - for(int minutes = 0; minutes<31; minutes++) { + states.add(new State(new HashMap<>(), 0, 0)); + for(int minutes = 0; minutes<30; minutes++) { Set newStates = new HashSet<>(); for(State s : states) { Valve v = in.get(s.index); long flow = s.open.values().stream().mapToLong(e -> e).sum() + s.totalFlow; - List newPath = new ArrayList<>(s.path); - newPath.add(v.name); if(v.flow > 0 && !s.open.containsKey(v.name)) { Map newOpen = new HashMap<>(s.open); newOpen.put(v.name, v.flow); - newStates.add(new State(newOpen, s.index, flow, newPath)); + newStates.add(new State(newOpen, s.index, flow)); } - Arrays.stream(v.others.split(", ")).forEach(name -> newStates.add(new State(s.open, indices.get(name), flow, newPath))); + Arrays.stream(v.others.split(", ")).forEach(name -> newStates.add(new State(s.open, indices.get(name), flow))); } states = newStates; } - for(State s : states){ - if(s.totalFlow == 1906) { - System.out.println(s); - System.out.println(Arrays.toString(s.path.toArray())); - } - } return states.stream().mapToLong(State::totalFlow).max().getAsLong(); } From f806c83d84a1a34e219692fba5820e5a5874147d Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Fri, 16 Dec 2022 07:56:58 +0100 Subject: [PATCH 429/433] Day 16 2022 part 2 first draft --- .../com/sbaars/adventofcode/common/Day.java | 8 +-- .../sbaars/adventofcode/util/AOCUtils.java | 6 ++- .../adventofcode/year22/days/Day16.java | 49 ++++++++++++++++++- 3 files changed, 57 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/common/Day.java b/src/main/java/com/sbaars/adventofcode/common/Day.java index 9e7c32ae..2ef48991 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Day.java +++ b/src/main/java/com/sbaars/adventofcode/common/Day.java @@ -48,9 +48,9 @@ private String getDayPath() { public abstract Object part2(); public void printParts() { - solutionPart1 = part1(); - if(solutionPart1 instanceof Optional) solutionPart1 = ((Optional)solutionPart1).get(); - System.out.println("Part 1: " + solutionPart1); +// solutionPart1 = part1(); +// if(solutionPart1 instanceof Optional) solutionPart1 = ((Optional)solutionPart1).get(); +// System.out.println("Part 1: " + solutionPart1); solutionPart2 = part2(); if(solutionPart2 instanceof Optional) solutionPart2 = ((Optional)solutionPart2).get(); System.out.println("Part 2: " + solutionPart2); @@ -58,7 +58,7 @@ public void printParts() { public void printParts(int example) { this.example = example; - System.out.println("Part 1: " + part1()); +// System.out.println("Part 1: " + part1()); System.out.println("Part 2: " + part2()); } diff --git a/src/main/java/com/sbaars/adventofcode/util/AOCUtils.java b/src/main/java/com/sbaars/adventofcode/util/AOCUtils.java index d258ea6d..a75bffd3 100644 --- a/src/main/java/com/sbaars/adventofcode/util/AOCUtils.java +++ b/src/main/java/com/sbaars/adventofcode/util/AOCUtils.java @@ -27,6 +27,10 @@ public static Stream> pairs(List l) { } public static Stream> allPairs(List l) { - return range(0, l.size()).boxed().flatMap(i -> range(i+1, l.size()).mapToObj(j -> new Pair(l.get(i), l.get(j)))); + return range(0, l.size()).boxed().flatMap(i -> range(i+1, l.size()).mapToObj(j -> new Pair<>(l.get(i), l.get(j)))); + } + + public static Stream> allPairs(List l1, List l2) { + return range(0, l1.size()).boxed().flatMap(i -> l2.stream().map(b -> new Pair<>(l1.get(i), b))); } } diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java index daf006a5..ad178ea5 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java @@ -8,6 +8,7 @@ import java.util.stream.IntStream; import static com.sbaars.adventofcode.common.ReadsFormattedString.readString; +import static com.sbaars.adventofcode.util.AOCUtils.allPairs; public class Day16 extends Day2022 { @@ -27,6 +28,7 @@ public static void main(String[] args) { public record Valve(String name, long flow, String others) {} public record State(Map open, int index, long totalFlow) {} + public record State2(Map open, int myIndex, int elephantIndex, long totalFlow) {} @Override public Object part1() { @@ -59,6 +61,51 @@ public Object part1() { @Override public Object part2() { - return ""; + List in = dayStream().map(s -> { + try { + return readString(s, "Valve %s has flow rate=%n; tunnels lead to valves %s", Valve.class); + } catch (IllegalStateException e) { + return readString(s, "Valve %s has flow rate=%n; tunnel leads to valve %s", Valve.class); + } + }).toList(); + Set openable = in.stream().filter(s -> s.flow > 0).map(Valve::name).collect(Collectors.toSet()); + Map indices = IntStream.range(0, in.size()).boxed().collect(Collectors.toMap(i -> in.get(i).name, i -> i)); + Set states = new HashSet<>(); + states.add(new State2(new HashMap<>(), 0, 0, 0)); + for(int minutes = 0; minutes<30; minutes++) { + Set newStates = new HashSet<>(); + for(State2 s : states) { + + Valve myValve = in.get(s.myIndex); + Valve eleValve = in.get(s.elephantIndex); + long flow = s.open.values().stream().mapToLong(e -> e).sum() + s.totalFlow; + if(s.open.keySet().equals(openable)) { // All valves are open, time to chill + newStates.add(new State2(s.open, s.myIndex, s.elephantIndex, flow)); + } + boolean couldOpen = false; + if(myValve.flow > 0 && !s.open.containsKey(myValve.name)) { + Map newOpen = new HashMap<>(s.open); + newOpen.put(myValve.name, myValve.flow); + Arrays.stream(eleValve.others.split(", ")).forEach(name -> newStates.add(new State2(newOpen, s.myIndex, indices.get(name), flow))); + couldOpen = true; + } + if(eleValve.flow > 0 && !s.open.containsKey(eleValve.name)) { + Map newOpen = new HashMap<>(s.open); + newOpen.put(eleValve.name, eleValve.flow); + Arrays.stream(myValve.others.split(", ")).forEach(name -> newStates.add(new State2(newOpen, indices.get(name), s.elephantIndex, flow))); + couldOpen = true; + } + if(myValve.flow > 0 && !s.open.containsKey(myValve.name) && eleValve.flow > 0 && !s.open.containsKey(eleValve.name)) { + Map newOpen = new HashMap<>(s.open); + newOpen.put(myValve.name, myValve.flow); + newOpen.put(eleValve.name, eleValve.flow); + newStates.add(new State2(newOpen, s.myIndex, s.elephantIndex, flow)); + couldOpen = true; + } + if(!couldOpen) allPairs(List.of(myValve.others.split(", ")), List.of(eleValve.others.split(", "))).forEach(p -> newStates.add(new State2(s.open, indices.get(p.a()), indices.get(p.b()), flow))); + } + states = newStates; + } + return states.stream().mapToLong(State2::totalFlow).max().getAsLong(); } } From d5ad1c2056e0ec4868ef7399ebc1f27358072629 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Fri, 16 Dec 2022 08:06:28 +0100 Subject: [PATCH 430/433] Introduce KPIs --- .../java/com/sbaars/adventofcode/year22/days/Day16.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java index ad178ea5..6b0d2580 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java @@ -72,7 +72,8 @@ public Object part2() { Map indices = IntStream.range(0, in.size()).boxed().collect(Collectors.toMap(i -> in.get(i).name, i -> i)); Set states = new HashSet<>(); states.add(new State2(new HashMap<>(), 0, 0, 0)); - for(int minutes = 0; minutes<30; minutes++) { + Map kpis = Map.of(5, 25L, 10, 50L, 15, 100L, 20, 125L, 25, 150L); + for(int minutes = 0; minutes<26; minutes++) { Set newStates = new HashSet<>(); for(State2 s : states) { @@ -105,6 +106,11 @@ public Object part2() { if(!couldOpen) allPairs(List.of(myValve.others.split(", ")), List.of(eleValve.others.split(", "))).forEach(p -> newStates.add(new State2(s.open, indices.get(p.a()), indices.get(p.b()), flow))); } states = newStates; + if(kpis.containsKey(minutes)){ + long kpi = kpis.get(minutes); + states = states.stream().filter(e -> e.totalFlow>=kpi).collect(Collectors.toSet()); + } + System.out.println(minutes+", "+states.size()); } return states.stream().mapToLong(State2::totalFlow).max().getAsLong(); } From e17361ad4b45cefe830c17299e04ec5c0ba74484 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Fri, 16 Dec 2022 08:23:16 +0100 Subject: [PATCH 431/433] fix little kpi bug --- .../adventofcode/year22/days/Day16.java | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java index 6b0d2580..50088639 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java @@ -20,9 +20,9 @@ public static void main(String[] args) { Day d = new Day16(); d.downloadIfNotDownloaded(); d.downloadExample(); - d.printParts(); + d.printParts(1); // System.in.read(); - d.submitPart1(); +// d.submitPart1(); // d.submitPart2(); } @@ -72,7 +72,8 @@ public Object part2() { Map indices = IntStream.range(0, in.size()).boxed().collect(Collectors.toMap(i -> in.get(i).name, i -> i)); Set states = new HashSet<>(); states.add(new State2(new HashMap<>(), 0, 0, 0)); - Map kpis = Map.of(5, 25L, 10, 50L, 15, 100L, 20, 125L, 25, 150L); + Map kpis = Map.of(5, 41L, 10, 78L, 15, 81L, 20, 81L, 25, 81L); // Example KPIs +// Map kpis = Map.of(5, 25L, 10, 50L, 15, 100L, 20, 140L, 25, 160L); for(int minutes = 0; minutes<26; minutes++) { Set newStates = new HashSet<>(); for(State2 s : states) { @@ -80,8 +81,8 @@ public Object part2() { Valve myValve = in.get(s.myIndex); Valve eleValve = in.get(s.elephantIndex); long flow = s.open.values().stream().mapToLong(e -> e).sum() + s.totalFlow; - if(s.open.keySet().equals(openable)) { // All valves are open, time to chill - newStates.add(new State2(s.open, s.myIndex, s.elephantIndex, flow)); + if(s.open.size() == openable.size()) { // All valves are open, time to chill + newStates.add(new State2(s.open, 0, 0, flow)); } boolean couldOpen = false; if(myValve.flow > 0 && !s.open.containsKey(myValve.name)) { @@ -108,10 +109,16 @@ public Object part2() { states = newStates; if(kpis.containsKey(minutes)){ long kpi = kpis.get(minutes); - states = states.stream().filter(e -> e.totalFlow>=kpi).collect(Collectors.toSet()); + states = states.stream().filter(e -> e.open.values().stream().mapToLong(f -> f).sum()>=kpi).collect(Collectors.toSet()); + System.out.println("Apply KPI"); } System.out.println(minutes+", "+states.size()); } + for(State2 s : states) { + if(s.totalFlow == 1706) { + System.out.println(s); + } + } return states.stream().mapToLong(State2::totalFlow).max().getAsLong(); } } From d4168ba6cecb4191ba4b4efd1ff0107b7e6f4b14 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Fri, 16 Dec 2022 11:16:26 +0100 Subject: [PATCH 432/433] fix bug --- .../com/sbaars/adventofcode/common/Day.java | 10 +- .../adventofcode/network/DownloadTests.java | 2 +- .../adventofcode/year22/days/Day16.java | 151 +++++++++++++++--- 3 files changed, 136 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/sbaars/adventofcode/common/Day.java b/src/main/java/com/sbaars/adventofcode/common/Day.java index 2ef48991..d9d9065a 100644 --- a/src/main/java/com/sbaars/adventofcode/common/Day.java +++ b/src/main/java/com/sbaars/adventofcode/common/Day.java @@ -16,7 +16,7 @@ public abstract class Day { public static final String DEFAULT_DELIMITER = "\n"; protected final int year; protected final int day; - protected int example = 0; + public int example = 0; private Object solutionPart1; private Object solutionPart2; @@ -48,9 +48,9 @@ private String getDayPath() { public abstract Object part2(); public void printParts() { -// solutionPart1 = part1(); -// if(solutionPart1 instanceof Optional) solutionPart1 = ((Optional)solutionPart1).get(); -// System.out.println("Part 1: " + solutionPart1); + solutionPart1 = part1(); + if(solutionPart1 instanceof Optional) solutionPart1 = ((Optional)solutionPart1).get(); + System.out.println("Part 1: " + solutionPart1); solutionPart2 = part2(); if(solutionPart2 instanceof Optional) solutionPart2 = ((Optional)solutionPart2).get(); System.out.println("Part 2: " + solutionPart2); @@ -58,7 +58,7 @@ public void printParts() { public void printParts(int example) { this.example = example; -// System.out.println("Part 1: " + part1()); + System.out.println("Part 1: " + part1()); System.out.println("Part 2: " + part2()); } diff --git a/src/main/java/com/sbaars/adventofcode/network/DownloadTests.java b/src/main/java/com/sbaars/adventofcode/network/DownloadTests.java index f2af69af..a455f326 100644 --- a/src/main/java/com/sbaars/adventofcode/network/DownloadTests.java +++ b/src/main/java/com/sbaars/adventofcode/network/DownloadTests.java @@ -29,7 +29,7 @@ public DownloadTests() { } public static void main(String[] args) { - new DownloadTests().retrieveTests("15", "2022"); + new DownloadTests().retrieveTests("16", "2022"); } public void retrieveTests(String day, String year) { diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java index 50088639..a278df92 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java @@ -18,17 +18,117 @@ public Day16() { public static void main(String[] args) { Day d = new Day16(); - d.downloadIfNotDownloaded(); - d.downloadExample(); - d.printParts(1); -// System.in.read(); -// d.submitPart1(); -// d.submitPart2(); +// d.example = 1; + System.out.println(d.part1()); } public record Valve(String name, long flow, String others) {} - public record State(Map open, int index, long totalFlow) {} - public record State2(Map open, int myIndex, int elephantIndex, long totalFlow) {} + + public static final class State { + private final Map open; + private final int index; + private final long totalFlow; + public final List flow; + + public State(Map open, int index, long totalFlow, List flow) { + this.open = open; + this.index = index; + this.totalFlow = totalFlow; + this.flow = flow; + } + + public Map open() { + return open; + } + + public int index() { + return index; + } + + public long totalFlow() { + return totalFlow; + } + + @Override + public boolean equals(Object obj) { + if (obj == this) return true; + if (obj == null || obj.getClass() != this.getClass()) return false; + var that = (State) obj; + return Objects.equals(this.open, that.open) && + this.index == that.index && + this.totalFlow == that.totalFlow; + } + + @Override + public int hashCode() { + return Objects.hash(open, index, totalFlow); + } + + @Override + public String toString() { + return "State[" + + "open=" + open + ", " + + "index=" + index + ", " + + "totalFlow=" + totalFlow + ']'; + } + } + + public static final class State2 { + private final Map open; + private final int myIndex; + private final int elephantIndex; + private final long totalFlow; + public final List flow; + + public State2(Map open, int myIndex, int elephantIndex, long totalFlow, List flow) { + this.open = open; + this.myIndex = myIndex; + this.elephantIndex = elephantIndex; + this.totalFlow = totalFlow; + this.flow = flow; + } + + public Map open() { + return open; + } + + public int myIndex() { + return myIndex; + } + + public int elephantIndex() { + return elephantIndex; + } + + public long totalFlow() { + return totalFlow; + } + + @Override + public boolean equals(Object obj) { + if (obj == this) return true; + if (obj == null || obj.getClass() != this.getClass()) return false; + var that = (State2) obj; + return Objects.equals(this.open, that.open) && + this.myIndex == that.myIndex && + this.elephantIndex == that.elephantIndex && + this.totalFlow == that.totalFlow; + } + + @Override + public int hashCode() { + return Objects.hash(open, myIndex, elephantIndex, totalFlow); + } + + @Override + public String toString() { + return "State2[" + + "open=" + open + ", " + + "myIndex=" + myIndex + ", " + + "elephantIndex=" + elephantIndex + ", " + + "totalFlow=" + totalFlow + ']'; + } + } @Override public Object part1() { @@ -39,24 +139,30 @@ public Object part1() { return readString(s, "Valve %s has flow rate=%n; tunnel leads to valve %s", Valve.class); } }).toList(); + Set openable = in.stream().filter(s -> s.flow > 0).map(Valve::name).collect(Collectors.toSet()); Map indices = IntStream.range(0, in.size()).boxed().collect(Collectors.toMap(i -> in.get(i).name, i -> i)); Set states = new HashSet<>(); - states.add(new State(new HashMap<>(), 0, 0)); - for(int minutes = 0; minutes<30; minutes++) { + states.add(new State(new HashMap<>(), 0, 0, new ArrayList<>())); + for(int minutes = 1; minutes<=30; minutes++) { Set newStates = new HashSet<>(); for(State s : states) { Valve v = in.get(s.index); long flow = s.open.values().stream().mapToLong(e -> e).sum() + s.totalFlow; + List newFlow = new ArrayList<>(s.flow); + newFlow.add(s.open.values().stream().mapToLong(e -> e).sum()); + if(s.open.size() == openable.size()) { // All valves are open, time to chill + newStates.add(new State(s.open, 0, flow, newFlow)); + } if(v.flow > 0 && !s.open.containsKey(v.name)) { Map newOpen = new HashMap<>(s.open); newOpen.put(v.name, v.flow); - newStates.add(new State(newOpen, s.index, flow)); + newStates.add(new State(newOpen, s.index, flow, newFlow)); } - Arrays.stream(v.others.split(", ")).forEach(name -> newStates.add(new State(s.open, indices.get(name), flow))); + Arrays.stream(v.others.split(", ")).forEach(name -> newStates.add(new State(s.open, indices.get(name), flow, newFlow))); } states = newStates; } - return states.stream().mapToLong(State::totalFlow).max().getAsLong(); + return states.stream().mapToLong(s -> s.totalFlow() + s.open.values().stream().mapToLong(e -> e).sum()).max().getAsLong(); } @Override @@ -71,40 +177,42 @@ public Object part2() { Set openable = in.stream().filter(s -> s.flow > 0).map(Valve::name).collect(Collectors.toSet()); Map indices = IntStream.range(0, in.size()).boxed().collect(Collectors.toMap(i -> in.get(i).name, i -> i)); Set states = new HashSet<>(); - states.add(new State2(new HashMap<>(), 0, 0, 0)); + states.add(new State2(new HashMap<>(), 0, 0, 0, new ArrayList<>())); Map kpis = Map.of(5, 41L, 10, 78L, 15, 81L, 20, 81L, 25, 81L); // Example KPIs // Map kpis = Map.of(5, 25L, 10, 50L, 15, 100L, 20, 140L, 25, 160L); - for(int minutes = 0; minutes<26; minutes++) { + for(int minutes = 1; minutes<=26; minutes++) { Set newStates = new HashSet<>(); for(State2 s : states) { Valve myValve = in.get(s.myIndex); Valve eleValve = in.get(s.elephantIndex); + List newFlow = new ArrayList<>(s.flow); + newFlow.add(s.open.values().stream().mapToLong(e -> e).sum()); long flow = s.open.values().stream().mapToLong(e -> e).sum() + s.totalFlow; if(s.open.size() == openable.size()) { // All valves are open, time to chill - newStates.add(new State2(s.open, 0, 0, flow)); + newStates.add(new State2(s.open, 0, 0, flow, newFlow)); } boolean couldOpen = false; if(myValve.flow > 0 && !s.open.containsKey(myValve.name)) { Map newOpen = new HashMap<>(s.open); newOpen.put(myValve.name, myValve.flow); - Arrays.stream(eleValve.others.split(", ")).forEach(name -> newStates.add(new State2(newOpen, s.myIndex, indices.get(name), flow))); + Arrays.stream(eleValve.others.split(", ")).forEach(name -> newStates.add(new State2(newOpen, s.myIndex, indices.get(name), flow, newFlow))); couldOpen = true; } if(eleValve.flow > 0 && !s.open.containsKey(eleValve.name)) { Map newOpen = new HashMap<>(s.open); newOpen.put(eleValve.name, eleValve.flow); - Arrays.stream(myValve.others.split(", ")).forEach(name -> newStates.add(new State2(newOpen, indices.get(name), s.elephantIndex, flow))); + Arrays.stream(myValve.others.split(", ")).forEach(name -> newStates.add(new State2(newOpen, indices.get(name), s.elephantIndex, flow, newFlow))); couldOpen = true; } if(myValve.flow > 0 && !s.open.containsKey(myValve.name) && eleValve.flow > 0 && !s.open.containsKey(eleValve.name)) { Map newOpen = new HashMap<>(s.open); newOpen.put(myValve.name, myValve.flow); newOpen.put(eleValve.name, eleValve.flow); - newStates.add(new State2(newOpen, s.myIndex, s.elephantIndex, flow)); + newStates.add(new State2(newOpen, s.myIndex, s.elephantIndex, flow, newFlow)); couldOpen = true; } - if(!couldOpen) allPairs(List.of(myValve.others.split(", ")), List.of(eleValve.others.split(", "))).forEach(p -> newStates.add(new State2(s.open, indices.get(p.a()), indices.get(p.b()), flow))); + if(!couldOpen) allPairs(List.of(myValve.others.split(", ")), List.of(eleValve.others.split(", "))).forEach(p -> newStates.add(new State2(s.open, indices.get(p.a()), indices.get(p.b()), flow, newFlow))); } states = newStates; if(kpis.containsKey(minutes)){ @@ -117,8 +225,9 @@ public Object part2() { for(State2 s : states) { if(s.totalFlow == 1706) { System.out.println(s); + System.out.println(Arrays.toString(s.flow.toArray())); } } - return states.stream().mapToLong(State2::totalFlow).max().getAsLong(); + return states.stream().mapToLong(s -> s.totalFlow() + s.open.values().stream().mapToLong(e -> e).sum()).max().getAsLong(); } } From a45395b2d7d166478329b36177d4988ea47fb911 Mon Sep 17 00:00:00 2001 From: SimonBaars Date: Fri, 16 Dec 2022 15:12:04 +0100 Subject: [PATCH 433/433] more debug mode --- .../adventofcode/year22/days/Day16.java | 30 +++++++++++++++---- .../adventofcode/year22/days/Day16Test.java | 20 +++++++++++++ 2 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 src/test/java/com/sbaars/adventofcode/year22/days/Day16Test.java diff --git a/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java b/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java index a278df92..f01d948e 100644 --- a/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java +++ b/src/main/java/com/sbaars/adventofcode/year22/days/Day16.java @@ -29,12 +29,14 @@ public static final class State { private final int index; private final long totalFlow; public final List flow; + public final List path; - public State(Map open, int index, long totalFlow, List flow) { + public State(Map open, int index, long totalFlow, List flow, List path) { this.open = open; this.index = index; this.totalFlow = totalFlow; this.flow = flow; + this.path = path; } public Map open() { @@ -142,7 +144,7 @@ public Object part1() { Set openable = in.stream().filter(s -> s.flow > 0).map(Valve::name).collect(Collectors.toSet()); Map indices = IntStream.range(0, in.size()).boxed().collect(Collectors.toMap(i -> in.get(i).name, i -> i)); Set states = new HashSet<>(); - states.add(new State(new HashMap<>(), 0, 0, new ArrayList<>())); + states.add(new State(new HashMap<>(), 0, 0, new ArrayList<>(), new ArrayList<>())); for(int minutes = 1; minutes<=30; minutes++) { Set newStates = new HashSet<>(); for(State s : states) { @@ -150,19 +152,35 @@ public Object part1() { long flow = s.open.values().stream().mapToLong(e -> e).sum() + s.totalFlow; List newFlow = new ArrayList<>(s.flow); newFlow.add(s.open.values().stream().mapToLong(e -> e).sum()); + List newPath = new ArrayList<>(s.path); + newPath.add(v.name); if(s.open.size() == openable.size()) { // All valves are open, time to chill - newStates.add(new State(s.open, 0, flow, newFlow)); + newStates.add(new State(s.open, 0, flow, newFlow, newPath)); } if(v.flow > 0 && !s.open.containsKey(v.name)) { Map newOpen = new HashMap<>(s.open); newOpen.put(v.name, v.flow); - newStates.add(new State(newOpen, s.index, flow, newFlow)); + newStates.add(new State(newOpen, s.index, flow, newFlow, newPath)); } - Arrays.stream(v.others.split(", ")).forEach(name -> newStates.add(new State(s.open, indices.get(name), flow, newFlow))); + Arrays.stream(v.others.split(", ")).forEach(name -> newStates.add(new State(s.open, indices.get(name), flow, newFlow, newPath))); } states = newStates; } - return states.stream().mapToLong(s -> s.totalFlow() + s.open.values().stream().mapToLong(e -> e).sum()).max().getAsLong(); + for(State s : states) { + if(List.of(0L, 0L, 0L, 0L, 0L, 20L, 20L, 20L, 44L, 44L, 44L, 44L, 67L, 67L, 67L, 86L, 86L, 86L, 86L, 86L, 86L, 86L, 86L, 86L, 86L, 86L, 101L, 101L, 101L, 110L).equals(s.flow)){ + System.out.println(s); + } + } + return states.stream().mapToLong(s -> Math.max(s.flow.stream().mapToLong(e -> e).sum(), s.totalFlow())).max().getAsLong(); + } + + public static boolean startsWith(List string, List prefix) { + final int stringSize = string.size(); + final int prefixSize = prefix.size(); + if (prefixSize > stringSize) { + return false; + } + return prefix.equals(string.subList(0, prefixSize)); } @Override diff --git a/src/test/java/com/sbaars/adventofcode/year22/days/Day16Test.java b/src/test/java/com/sbaars/adventofcode/year22/days/Day16Test.java new file mode 100644 index 00000000..d1541adc --- /dev/null +++ b/src/test/java/com/sbaars/adventofcode/year22/days/Day16Test.java @@ -0,0 +1,20 @@ + package com.sbaars.adventofcode.year22.days; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + import org.junit.jupiter.api.Test; + import com.sbaars.adventofcode.year22.days.Day16; + + class Day16Test { + Day16 day = new Day16(); + + @Test + void testPart1() { + assertEquals("1906", day.part1().toString()); + } + + @Test + void testPart2() { + assertEquals("2548", day.part2().toString()); + } + }