Skip to content

Commit f8d185b

Browse files
committed
feat: solve day 11
1 parent 78b7324 commit f8d185b

File tree

5 files changed

+137
-11
lines changed

5 files changed

+137
-11
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
- [Day 8 - Resonant Collinearity](https://github.com/Flashky/advent-of-code-2024/tree/master/src/main/java/com/adventofcode/flashk/day08)
1414
- [Day 9 - Disk Fragmenter](https://github.com/Flashky/advent-of-code-2024/tree/master/src/main/java/com/adventofcode/flashk/day09)
1515
- [Day 10 - Hoof It](https://github.com/Flashky/advent-of-code-2024/tree/master/src/main/java/com/adventofcode/flashk/day10)
16-
- [Day 11](https://github.com/Flashky/advent-of-code-2024/tree/master/src/main/java/com/adventofcode/flashk/day11)
16+
- [Day 11 - Plutonian Pebbles](https://github.com/Flashky/advent-of-code-2024/tree/master/src/main/java/com/adventofcode/flashk/day11)
1717
- [Day 12](https://github.com/Flashky/advent-of-code-2024/tree/master/src/main/java/com/adventofcode/flashk/day12)
1818
- [Day 13](https://github.com/Flashky/advent-of-code-2024/tree/master/src/main/java/com/adventofcode/flashk/day13)
1919
- [Day 14](https://github.com/Flashky/advent-of-code-2024/tree/master/src/main/java/com/adventofcode/flashk/day14)
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package com.adventofcode.flashk.day11;
2+
3+
import org.apache.commons.lang3.StringUtils;
4+
5+
import java.util.ArrayDeque;
6+
import java.util.Arrays;
7+
import java.util.Deque;
8+
import java.util.HashMap;
9+
import java.util.List;
10+
import java.util.Map;
11+
import java.util.function.Function;
12+
import java.util.stream.Collectors;
13+
14+
public class PlutonianPebbles {
15+
16+
private Deque<Long> rocks;
17+
18+
private Map<Long, Long> rocksPerNumber;
19+
20+
public PlutonianPebbles(List<String> inputs) {
21+
rocks = Arrays.stream(inputs.get(0).split(StringUtils.SPACE)).map(Long::valueOf).collect(Collectors.toCollection(ArrayDeque::new));
22+
23+
rocksPerNumber = rocks.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
24+
}
25+
26+
public long solveA(int blinks) {
27+
for(int i = 0; i < blinks; i++) {
28+
blink();
29+
}
30+
31+
return rocks.size();
32+
}
33+
34+
public long solveB(int blinks) {
35+
for(int i = 0; i < blinks; i++) {
36+
blinkB();
37+
}
38+
return countRocksInMap();
39+
}
40+
41+
private void blinkB() {
42+
43+
Map<Long,Long> processedRocks = new HashMap<>();
44+
45+
for(Long number : rocksPerNumber.keySet()) {
46+
long digits = String.valueOf(number).length();
47+
long rockCount = rocksPerNumber.get(number);
48+
long newNumber;
49+
if(number == 0) {
50+
newNumber = 1L;
51+
rockCount += processedRocks.getOrDefault(newNumber, 0L);
52+
processedRocks.put(1L, rockCount);
53+
} else if(digits % 2 == 0) {
54+
String strNumber = String.valueOf(number);
55+
56+
String strNumberLeft = strNumber.substring(0, strNumber.length() / 2);
57+
newNumber = Long.parseLong(strNumberLeft);
58+
long rockCountLeft = rockCount + processedRocks.getOrDefault(newNumber, 0L);
59+
processedRocks.put(newNumber, rockCountLeft);
60+
61+
String strNumberRight = strNumber.substring(strNumber.length() / 2);
62+
newNumber = Long.parseLong(strNumberRight);
63+
long rockCountRight = rockCount + processedRocks.getOrDefault(newNumber, 0L);
64+
processedRocks.put(newNumber, rockCountRight);
65+
66+
} else {
67+
newNumber = number*2024L;
68+
rockCount += processedRocks.getOrDefault(newNumber, 0L);
69+
processedRocks.put(newNumber, rockCount);
70+
}
71+
}
72+
73+
rocksPerNumber = processedRocks;
74+
}
75+
76+
private long countRocksInMap() {
77+
long result = 0;
78+
for(Long number : rocksPerNumber.keySet()) {
79+
result += rocksPerNumber.get(number);
80+
}
81+
return result;
82+
}
83+
84+
private void blink() {
85+
86+
Deque<Long> processedRocks = new ArrayDeque<>();
87+
88+
// Para cada roca:
89+
// Si roca == 0 -> roca = 1
90+
// y si roca tiene un número par de dígitos -> Partir en 2 -> tendré que convertir a string y partir.
91+
// resto de casos: roca *= 2024
92+
93+
while(!rocks.isEmpty()) {
94+
long number = rocks.pollFirst();
95+
long digits = String.valueOf(number).length();
96+
if(number == 0) {
97+
processedRocks.add(1L);
98+
} else if(digits % 2 == 0) {
99+
String strNumber = String.valueOf(number);
100+
String numberLeft = strNumber.substring(0, strNumber.length() / 2);
101+
String numberRight = strNumber.substring(strNumber.length() / 2);
102+
processedRocks.add(Long.valueOf(numberLeft));
103+
processedRocks.add(Long.valueOf(numberRight));
104+
} else {
105+
processedRocks.add(number*2024);
106+
}
107+
}
108+
109+
110+
rocks = processedRocks;
111+
}
112+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
# Day 11:
1+
# Day 11: Plutonian Pebbles
22

33
[https://adventofcode.com/2024/day/11](https://adventofcode.com/2024/day/11)

src/test/java/com/adventofcode/flashk/day11/Day11Test.java

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,13 @@ public void testSolvePart1Sample() {
3636
// Read input file
3737
List<String> inputs = Input.readStringLines(INPUT_FOLDER, TestFilename.INPUT_FILE_SAMPLE);
3838

39-
assertEquals(0L,0L);
39+
PlutonianPebbles plutonianPebbles = new PlutonianPebbles(inputs);
40+
41+
assertEquals(22L ,plutonianPebbles.solveA(6));
42+
43+
plutonianPebbles = new PlutonianPebbles(inputs);
44+
assertEquals(55312L ,plutonianPebbles.solveA(25));
45+
4046
}
4147

4248
@Test
@@ -48,23 +54,30 @@ public void testSolvePart1Input() {
4854

4955
// Read input file
5056
List<String> inputs = Input.readStringLines(INPUT_FOLDER, TestFilename.INPUT_FILE);
57+
PlutonianPebbles plutonianPebbles = new PlutonianPebbles(inputs);
5158

52-
System.out.println("Solution: ");
53-
assertEquals(0L,0L);
59+
System.out.println("Solution: "+plutonianPebbles.solveA(75));
60+
//assertEquals(189547L,0L);
5461

5562
}
5663

5764
@Test
58-
@Order(3)
59-
@Tag(TestTag.PART_2)
65+
@Order(1)
66+
@Tag(TestTag.PART_1)
6067
@Tag(TestTag.SAMPLE)
6168
@DisplayName(TestDisplayName.PART_2_SAMPLE)
6269
public void testSolvePart2Sample() {
6370

6471
// Read input file
6572
List<String> inputs = Input.readStringLines(INPUT_FOLDER, TestFilename.INPUT_FILE_SAMPLE);
6673

67-
assertEquals(0L,0L);
74+
PlutonianPebbles plutonianPebbles = new PlutonianPebbles(inputs);
75+
76+
assertEquals(22L ,plutonianPebbles.solveB(6));
77+
78+
plutonianPebbles = new PlutonianPebbles(inputs);
79+
assertEquals(55312L ,plutonianPebbles.solveB(25));
80+
6881
}
6982

7083
@Test
@@ -77,8 +90,9 @@ public void testSolvePart2Input() {
7790
// Read input file
7891
List<String> inputs = Input.readStringLines(INPUT_FOLDER, TestFilename.INPUT_FILE);
7992

80-
System.out.println("Solution: ");
81-
assertEquals(0L,0L);
93+
PlutonianPebbles plutonianPebbles = new PlutonianPebbles(inputs);
94+
95+
assertEquals(224577979481346L, plutonianPebbles.solveB(75));
8296

8397
}
8498

src/test/resources/inputs

0 commit comments

Comments
 (0)