From 7ab01bca76a1ee8b4f7592a79d4fdd9cd0fcebfe Mon Sep 17 00:00:00 2001 From: didier amyot Date: Wed, 11 Dec 2024 14:10:33 -0500 Subject: [PATCH] Question 10 and 11 --- java/.gitignore | 38 +++++ java/pom.xml | 17 ++ .../java/com/alldressedprogramming/Main.java | 8 + .../question10/Inputs.java | 67 ++++++++ .../question10/Main.java | 123 +++++++++++++++ .../question11/Inputs.java | 8 + .../question11/Main.java | 145 ++++++++++++++++++ 7 files changed, 406 insertions(+) create mode 100644 java/.gitignore create mode 100644 java/pom.xml create mode 100644 java/src/main/java/com/alldressedprogramming/Main.java create mode 100644 java/src/main/java/com/alldressedprogramming/question10/Inputs.java create mode 100644 java/src/main/java/com/alldressedprogramming/question10/Main.java create mode 100644 java/src/main/java/com/alldressedprogramming/question11/Inputs.java create mode 100644 java/src/main/java/com/alldressedprogramming/question11/Main.java diff --git a/java/.gitignore b/java/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/java/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/java/pom.xml b/java/pom.xml new file mode 100644 index 0000000..0f59dab --- /dev/null +++ b/java/pom.xml @@ -0,0 +1,17 @@ + + + 4.0.0 + + com.all-dressed-programming + advent-of-code-2024 + 1.0-SNAPSHOT + + + 23 + 23 + UTF-8 + + + \ No newline at end of file diff --git a/java/src/main/java/com/alldressedprogramming/Main.java b/java/src/main/java/com/alldressedprogramming/Main.java new file mode 100644 index 0000000..6ca81be --- /dev/null +++ b/java/src/main/java/com/alldressedprogramming/Main.java @@ -0,0 +1,8 @@ +package com.alldressedprogramming; + +public class Main { + + public static void main(String[] args) { + System.out.println("Hello, World!"); + } +} \ No newline at end of file diff --git a/java/src/main/java/com/alldressedprogramming/question10/Inputs.java b/java/src/main/java/com/alldressedprogramming/question10/Inputs.java new file mode 100644 index 0000000..b970933 --- /dev/null +++ b/java/src/main/java/com/alldressedprogramming/question10/Inputs.java @@ -0,0 +1,67 @@ +package com.alldressedprogramming.question10; + +public class Inputs { + public static final String MOCK_INPUT ="89010123\n" + + "78121874\n" + + "87430965\n" + + "96549874\n" + + "45678903\n" + + "32019012\n" + + "01329801\n" + + "10456732"; + + + public static final String REAL_INPUT ="78760345801298896321001230110976301870134341034545687\n" + + "69671236989367765410678345221885432963233452127632796\n" + + "10589987670456001323569896336797010154324569498101845\n" + + "23478678561032132124428987445788923245013478545613932\n" + + "12034569432983045034310176596657654356932103456754301\n" + + "06123765301874126965223456780345543267843212769861212\n" + + "67610854322965437876104320691275676189732301890770023\n" + + "98545921013456946766782111234987089078721450321981167\n" + + "23434530145697854325693003435672128569670965492843298\n" + + "10127647654787765014234512345965432154589876782194587\n" + + "01018758943439890143109671236878941003432106543087656\n" + + "10129667872108743232198780987567650012343267890989943\n" + + "78734531231065654651015697898232109871054154901077830\n" + + "69632340345676544543234506701145696780567063212566321\n" + + "12541256543989035672103215012098785991278343103455410\n" + + "01230167612108120780043454123210034876369752101769511\n" + + "43456898909817431891012763204987121765459861019878700\n" + + "32197899768746532982367874215672100894312772923467011\n" + + "44089432897655673675498985365523456783203689876554322\n" + + "43476521784554984566780189474310327894104501298458943\n" + + "32562340603443295432110276589210016765067898347457654\n" + + "41001456512782106798023345341232108778754106756346655\n" + + "58989867425691065897654301250343419689603245891258743\n" + + "67670198304781478654761298765430589576512231230969512\n" + + "50501078213210569763890181056521677433443100945872402\n" + + "41432189362387659812083212347893478922109811876721321\n" + + "32343276651096543202144307438982560013078320125630430\n" + + "21054565789823430143435698729861011224565410432145561\n" + + "78769834658712894354998705610154398348901565589006776\n" + + "69876765541006765267888214567863287657652651671217889\n" + + "56945454532214890122379823098978101098343780980368923\n" + + "47834503654323012001456702112109780123210891276456914\n" + + "32322112567410163100014511003498898194541201345567805\n" + + "01012012398789654011723621014586767087687632436679876\n" + + "01201034498218765327898734765675432101598543567987015\n" + + "32789125567309014456783349898987013216967845678872126\n" + + "45694876323418123242124456787016524567856934569543034\n" + + "34543945410567032103023456689145434787643021078676545\n" + + "67432876509878749854510965670236543694532122189089496\n" + + "78761789034569858987627874321987231243231821672102387\n" + + "89450321123988567546596765345698100340100910565201256\n" + + "44321450210676875654587034276765657654327823434389855\n" + + "32340565012363966703456123189894398789016434325670765\n" + + "01051876765454567812890012007654289430145045410581678\n" + + "98762998898323234906721063218723176521032156921892569\n" + + "45101237012210105415430874349812067898149867865433454\n" + + "36788946543101076010987965456701098778928766456521043\n" + + "29897654218760187623875478309898105667810610347876542\n" + + "10898743009451296874566329214321234354320521298985031\n" + + "01734542112321345987017812105670985012131494567874120\n" + + "45629610321030996506323901078987876543012383456923454\n" + + "30018723478945887215489765212985432692105672321012765\n" + + "21167634569876774345677894303876501783234561030109876"; +} diff --git a/java/src/main/java/com/alldressedprogramming/question10/Main.java b/java/src/main/java/com/alldressedprogramming/question10/Main.java new file mode 100644 index 0000000..ade048f --- /dev/null +++ b/java/src/main/java/com/alldressedprogramming/question10/Main.java @@ -0,0 +1,123 @@ +package com.alldressedprogramming.question10; + + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class Main { + + public record Point(int height, + int x, + int y) { + + } + + public static class ParkMap { + + final Map> data; + + public ParkMap(Map> data) { + this.data = data; + } + + public static ParkMap create(String input) { + var rows = input.split("\n"); + var data = new HashMap>(); + var y = 0; + for (var row : rows) { + var x = 0; + for (var col : row.split("")) { + var point = new Point(".".equals(col) ? -1 : Integer.parseInt(col), x, y); + var m = data.computeIfAbsent(x, (key) -> new HashMap()); + m.put(y, point); + x++; + } + y++; + } + return new ParkMap(data); + } + + public Optional get(int x, int y ){ + if(!data.containsKey(x)){ + return Optional.empty(); + } + return Optional.ofNullable(data.get(x).get(y)); + } + + public List getDirectNeighbours(int x, int y){ + var ret = new ArrayList(4); + get(x + 1, y ).ifPresent(ret::add); + get(x - 1, y ).ifPresent(ret::add); + get(x , y + 1).ifPresent(ret::add); + get(x, y -1).ifPresent(ret::add); + return ret; + } + public List getDirectNeighbours(Point p){ + return getDirectNeighbours(p.x(), p.y()); + } + + private List addPointToTrail(List trail, Point point){ + var ret = new ArrayList<>(trail); + ret.addLast(point); + return ret; + } + + private Stream> continueTrail(List trail){ + var lastPoint = trail.getLast(); + return getDirectNeighbours(lastPoint).stream() + .filter(p -> p.height() == lastPoint.height() + 1) + .map(newLastPoint -> addPointToTrail(trail, newLastPoint)); + } + + private List> continueTrails(List> trails){ + return trails.stream().flatMap(this::continueTrail).toList(); + } + + public List> findAllTrails(Point p){ + if(p.height() != 0){ + return List.of(); + } + List> ret = List.of(List.of(p)); + while(!ret.isEmpty() && ret.getFirst().size() != 10){ + ret = continueTrails(ret); + } + return ret; + } + + public List> findAllTrails(int x, int y){ + return get(x, y).map(this::findAllTrails).orElse(List.of()); + } + + public Stream getAllPoints(){ + return data.values().stream().flatMap(x -> x.values().stream()); + } + } + + private static long score(List> trails){ + return trails.stream().map(List::getLast).distinct().count(); + } + + public static long question10A(String input){ + var parkMap = ParkMap.create(input); + return parkMap.getAllPoints().map(parkMap::findAllTrails).mapToLong(Main::score).sum(); + } + + public static long question10B(String input){ + var parkMap = ParkMap.create(input); + return parkMap.getAllPoints().map(parkMap::findAllTrails).mapToLong(List::size).sum(); + } + + + public static void main(String... args) { + System.out.println("Answer to question 10 A is " + question10A(Inputs.REAL_INPUT)); + System.out.println("Answer to question 10 B is " + question10B(Inputs.REAL_INPUT)); + + } + +} \ No newline at end of file diff --git a/java/src/main/java/com/alldressedprogramming/question11/Inputs.java b/java/src/main/java/com/alldressedprogramming/question11/Inputs.java new file mode 100644 index 0000000..41e0a6d --- /dev/null +++ b/java/src/main/java/com/alldressedprogramming/question11/Inputs.java @@ -0,0 +1,8 @@ +package com.alldressedprogramming.question11; + +public class Inputs { + + public static final String MOCK_INPUT = "125 17"; + public static final String REAL_INPUT = "872027 227 18 9760 0 4 67716 9245696"; + +} diff --git a/java/src/main/java/com/alldressedprogramming/question11/Main.java b/java/src/main/java/com/alldressedprogramming/question11/Main.java new file mode 100644 index 0000000..b99e603 --- /dev/null +++ b/java/src/main/java/com/alldressedprogramming/question11/Main.java @@ -0,0 +1,145 @@ +package com.alldressedprogramming.question11; + +import static java.util.stream.Collectors.groupingBy; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class Main { + + + public static class Rock{ + + private final long value; + + public Rock(long value) { + this.value = value; + } + + @Override + public String toString() { + return "(" + value + ")"; + } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) { + return false; + } + + Rock rock = (Rock) o; + return value == rock.value; + } + + @Override + public int hashCode() { + return Long.hashCode(value); + } + + public List transmutate() { + if(value == 0){ + return List.of(Rock.of(1)); + } + if( numberOfDigits(value) % 2 == 0){ + return List.of(Rock.of(smallHalfOf(value)), Rock.of(largeHalfOf(value))); + + } + return List.of(Rock.of(value * 2024)); + } + + private static Rock of(long i) { + // could leverage a nice cache + return new Rock(i); + } + + private long numberOfDigits(long n){ + var ret = 1; + while(n >= 10){ + n = n / 10; + ret ++; + } + return ret; + } + + private long smallHalfOf(long originalValue) { + var mod = 1; + var n = numberOfDigits(originalValue); + for(var i = 0; i < n /2 ; i++){ + mod *= 10; + } + + return originalValue % mod; + } + + private long largeHalfOf(long originalValue) { + var mod = 1; + var n = numberOfDigits(originalValue); + for(var i = 0; i < n /2 ; i++){ + mod *= 10; + } + + return originalValue / mod; + } + + } + + public static class RockRow { + + private final Map rocks; + + public RockRow(Map rocks) { + this.rocks = rocks; + } + + public static RockRow of(List rocks) { + return new RockRow(rocks.stream().collect(groupingBy(Function.identity(), Collectors.counting()))); + } + + public RockRow transmutate() { + Map ret = new HashMap<>(); + for (var itm : rocks.entrySet()) { + var newRocks = itm.getKey().transmutate(); + for (var newRock : newRocks) { + ret.put(newRock, ret.getOrDefault(newRock, 0L) + itm.getValue()); + } + } + return new RockRow(ret); + } + + public long size() { + return rocks.values().stream().mapToLong(x -> x).sum(); + } + } + + public static RockRow parseInput(String input) { + var ret = Stream.of(input.split(" ")).map(Long::parseLong).map(Rock::new).toList(); + return RockRow.of(ret); + } + + + public static RockRow question11A(String input) { + var rocks=parseInput(input); + for(var i = 0; i < 25; i++){ + rocks = rocks.transmutate(); + } + return rocks; + } + + public static RockRow question11B(String input) { + var rocks=parseInput(input); + for (var i = 0; i < 75; i++) { + rocks = rocks.transmutate(); + } + return rocks; + } + + public static void main(String[] args) { + System.out.println("The answer to question 11A is: " + question11A(Inputs.REAL_INPUT).size()); // 199946 + System.out.println("The answer to question 11B is: " + question11B(Inputs.REAL_INPUT).size()); + } + +}