summaryrefslogtreecommitdiff
path: root/day05/day05.java
diff options
context:
space:
mode:
Diffstat (limited to 'day05/day05.java')
-rw-r--r--day05/day05.java158
1 files changed, 158 insertions, 0 deletions
diff --git a/day05/day05.java b/day05/day05.java
new file mode 100644
index 0000000..d7d7992
--- /dev/null
+++ b/day05/day05.java
@@ -0,0 +1,158 @@
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.regex.Pattern;
+
+public class day05 {
+ public static void main(String args[]) throws IOException {
+ RandomAccessFile input = new RandomAccessFile("input", "r");
+ System.out.println("Day 05 Part 1: " + part1(input));
+ input.seek(0);
+ System.out.println("Day 05 Part 2: " + part2(input));
+ input.close();
+ }
+
+ public static String part1(RandomAccessFile input) throws IOException {
+ Garden garden = parseGarden(input);
+
+ long min_loc = Long.MAX_VALUE;
+ for (long seed: garden.seeds) {
+ long loc = garden.location(seed);
+ if (loc < min_loc) {
+ min_loc = loc;
+ }
+ }
+
+ return Long.toString(min_loc);
+ }
+
+ public static String part2(RandomAccessFile input) throws IOException {
+ return "WIP";
+ }
+
+ private static Garden parseGarden(RandomAccessFile input) throws IOException {
+ Garden garden = new Garden();
+
+ String line;
+ int state = -1;
+ while ((line = input.readLine()) != null) {
+ if (Pattern.matches("\\Aseeds:.*", line)) {
+ String[] seeds = line.split(": ")[1].split(" ");
+ for (String seed: seeds) {
+ garden.seeds.add(Long.parseLong(seed));
+ }
+ } else if (Pattern.matches(".* map:\\z", line)) {
+ state += 1;
+ } else if (Pattern.matches("\\d+ \\d+ \\d+", line)) {
+ String[] linea = line.split(" ");
+ long dst = Long.parseLong(linea[0]);
+ long src = Long.parseLong(linea[1]);
+ long len = Long.parseLong(linea[2]);
+ switch (state) {
+ case 0:
+ garden.almanac.s2s.add(dst, src, len);
+ break;
+ case 1:
+ garden.almanac.s2f.add(dst, src, len);
+ break;
+ case 2:
+ garden.almanac.f2w.add(dst, src, len);
+ break;
+ case 3:
+ garden.almanac.w2l.add(dst, src, len);
+ break;
+ case 4:
+ garden.almanac.l2t.add(dst, src, len);
+ break;
+ case 5:
+ garden.almanac.t2h.add(dst, src, len);
+ break;
+ case 6:
+ garden.almanac.h2l.add(dst, src, len);
+ break;
+ }
+ }
+ }
+
+ return garden;
+ }
+}
+
+class Garden {
+ ArrayList<Long> seeds;
+ Almanac almanac;
+
+ public Garden() {
+ this.seeds = new ArrayList<>();
+ this.almanac = new Almanac();
+ }
+
+ public long location(long seed) {
+ long at = seed;
+ for (Map map: this.almanac.maps) {
+ for (MapEntry ent: map.mapEntries) {
+ if (ent.contains(at)) {
+ at = ent.map(at);
+ break;
+ }
+ }
+ }
+ return at;
+ }
+}
+
+class Almanac {
+ Map s2s, s2f, f2w, w2l, l2t, t2h, h2l;
+ ArrayList<Map> maps;
+
+ public Almanac() {
+ this.s2s = new Map();
+ this.s2f = new Map();
+ this.f2w = new Map();
+ this.w2l = new Map();
+ this.l2t = new Map();
+ this.t2h = new Map();
+ this.h2l = new Map();
+
+ ArrayList<Map> maps = new ArrayList<>();
+ maps.add(this.s2s);
+ maps.add(this.s2f);
+ maps.add(this.f2w);
+ maps.add(this.w2l);
+ maps.add(this.l2t);
+ maps.add(this.t2h);
+ maps.add(this.h2l);
+ this.maps = maps;
+ }
+}
+
+class Map {
+ ArrayList<MapEntry> mapEntries;
+
+ public Map() {
+ mapEntries = new ArrayList<>();
+ }
+
+ public void add(long dst, long src, long len) {
+ mapEntries.add(new MapEntry(dst, src, len));
+ }
+}
+
+class MapEntry {
+ long dst, src, len;
+
+ public MapEntry(long dst, long src, long len) {
+ this.dst = dst;
+ this.src = src;
+ this.len = len;
+ }
+
+ public boolean contains(long src) {
+ return src >= this.src && src < (this.src + this.len);
+ }
+
+ public long map(long src) {
+ return this.dst + (src - this.src);
+ }
+}