Skip to content

Commit 49646ac

Browse files
committed
Add day 25 solution
1 parent 5c5ea57 commit 49646ac

File tree

7 files changed

+328
-0
lines changed

7 files changed

+328
-0
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package eu.happycoders.adventofcode2022.day25;
2+
3+
/**
4+
* Advent of Code 2022 – Object-Oriented Solutions in Java.
5+
*
6+
* <p>Puzzle solver for day 25.
7+
*
8+
* @author <a href="mailto:sven@happycoders.eu">Sven Woltmann</a>
9+
*/
10+
class Day25Solver {
11+
12+
static String solveTask1(String input) {
13+
long sum = input.lines().mapToLong(Snafu::parseSnafuString).sum();
14+
System.out.println("sum = " + sum);
15+
return Snafu.toSnafuString(sum);
16+
}
17+
}
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
package eu.happycoders.adventofcode2022.day25;
2+
3+
/**
4+
* Advent of Code 2022 – Object-Oriented Solutions in Java.
5+
*
6+
* <p>Main application for day 25.
7+
*
8+
* @author <a href="mailto:sven@happycoders.eu">Sven Woltmann</a>
9+
*/
10+
class Main25 {
11+
12+
private static final String INPUT =
13+
"""
14+
22-=0-1-=
15+
1-==1200200=22-1==2=
16+
2-01=--01==01
17+
20-=
18+
21=210=002
19+
12=-0002
20+
1=100-==0
21+
1101
22+
2==-=0=0110-
23+
2=100122==--1-
24+
2=1-2==2--1
25+
1==0=2=0==1100
26+
2=0==-2
27+
1=1222202101--=
28+
1101=2111-11=
29+
1=11=2022-11-0=
30+
1=2=1102-
31+
1--21=1--=
32+
11-
33+
1001-10-
34+
201222-1-2
35+
122--2
36+
2-
37+
11--2-=20=11-2=0
38+
1-000=1221==2-
39+
1=-==-=2-0
40+
121-
41+
1--2-=---0=01
42+
1=00=010-1-20
43+
1=110=2
44+
1110-=01--0-12--0
45+
200022-
46+
2=-=0=-1==2-=2222
47+
20201
48+
11-0
49+
1==
50+
1-=---2==20=01
51+
2=2=-1
52+
1==01-100
53+
1-=----=--=
54+
1-011--20=1-==2121
55+
101---1=-1--0=21--2
56+
221=0100--020=11
57+
1=-121=2=-1-=
58+
11210-
59+
1=0=2=22-==-==-
60+
2=2220210221-202
61+
1--1=---00-11
62+
2=0--
63+
1=-2=-1==2=0
64+
1=0=0=
65+
122012210-=010=1
66+
21-1-220=21-=-00
67+
2-=2==0
68+
1220
69+
20
70+
1=0=22=-21101
71+
2-===0==1-210
72+
1=-220=121=----2
73+
21=0=-=0---0===1=--
74+
202-22112---0-2=
75+
10=0
76+
11
77+
102120--=0-021-121
78+
100--221=
79+
2--011=-=202
80+
1=-
81+
110=0-0-021-
82+
121
83+
1-0210-0
84+
2-10=2
85+
2=-0-1=00--22
86+
121-=2
87+
12-212110-022-2211
88+
1=222==11=-=-01=10
89+
200-0120=
90+
1-00===12=-1=-0--
91+
100-1
92+
102-2201
93+
10-=0-==2=2==2=0
94+
12=01
95+
1012-2
96+
1=0-02=21=1==1
97+
2=021-
98+
1-001-
99+
10202-00=12===11-1
100+
1=
101+
20=11=0112=
102+
2--1=1-1121
103+
2-2=---222
104+
1=-001==-0-
105+
1-=112-=
106+
11011
107+
1=2==1
108+
1-=2=2201
109+
2==222-==
110+
101-0-=2
111+
1-10-0212-0==0-10
112+
1-2-1-=01100
113+
121=0-12-2
114+
20=0=0-0
115+
22000-==0-1-2=0=0=
116+
10=
117+
2101102
118+
1120===10=2-2=02-
119+
1-=10--211
120+
2===-01==1=--===-
121+
1=21-201-==200=
122+
1=-=2=10
123+
220-120=-0-1010
124+
12011
125+
1-0=2
126+
1---01
127+
1=-=1=021=0=0=011
128+
1=10-212-0
129+
2=
130+
10-0=-1=
131+
1-21=22=1101000-1-
132+
11=00222-=100--""";
133+
134+
public static void main(String[] args) {
135+
System.out.println(Day25Solver.solveTask1(INPUT));
136+
}
137+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package eu.happycoders.adventofcode2022.day25;
2+
3+
import java.util.List;
4+
5+
/**
6+
* Advent of Code 2022 – Object-Oriented Solutions in Java.
7+
*
8+
* <p>Parses the input text into a string list.
9+
*
10+
* @author <a href="mailto:sven@happycoders.eu">Sven Woltmann</a>
11+
*/
12+
class PuzzleInputParser {
13+
14+
static List<String> parse(String input) {
15+
return input.lines().toList();
16+
}
17+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package eu.happycoders.adventofcode2022.day25;
2+
3+
/**
4+
* Advent of Code 2022 – Object-Oriented Solutions in Java.
5+
*
6+
* <p>Converter from and to SNAFU strings.
7+
*
8+
* @author <a href="mailto:sven@happycoders.eu">Sven Woltmann</a>
9+
*/
10+
class Snafu {
11+
12+
static String toSnafuString(long decimal) {
13+
StringBuilder result = new StringBuilder();
14+
15+
do {
16+
long fives = (decimal + 2) / 5;
17+
int digit = (int) (decimal - 5 * fives);
18+
result.insert(0, convertDecimalToSnafuDigit(digit));
19+
decimal = fives;
20+
} while (decimal != 0);
21+
22+
return result.toString();
23+
}
24+
25+
private static char convertDecimalToSnafuDigit(int decimalDigit) {
26+
return switch (decimalDigit) {
27+
case 2 -> '2';
28+
case 1 -> '1';
29+
case 0 -> '0';
30+
case -1 -> '-';
31+
case -2 -> '=';
32+
default -> throw new IllegalArgumentException();
33+
};
34+
}
35+
36+
static long parseSnafuString(String snafuString) {
37+
long decimal = 0;
38+
for (int i = 0; i < snafuString.length(); i++) {
39+
char snafuDigit = snafuString.charAt(i);
40+
decimal = decimal * 5 + convertSnafuToDecimalDigit(snafuDigit);
41+
}
42+
return decimal;
43+
}
44+
45+
private static int convertSnafuToDecimalDigit(char snafuDigit) {
46+
return switch (snafuDigit) {
47+
case '2' -> 2;
48+
case '1' -> 1;
49+
case '0' -> 0;
50+
case '-' -> -1;
51+
case '=' -> -2;
52+
default -> throw new IllegalArgumentException();
53+
};
54+
}
55+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package eu.happycoders.adventofcode2022.day25;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import org.junit.jupiter.api.Test;
6+
7+
class Day25SolverTest {
8+
9+
@Test
10+
void givenTheTestInput_solveTask1_returnsSumInSnafu() {
11+
String input = TestInputs.TEST_INPUT;
12+
13+
String sumInSnafu = Day25Solver.solveTask1(input);
14+
15+
assertThat(sumInSnafu).isEqualTo("2=-1=0");
16+
}
17+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package eu.happycoders.adventofcode2022.day25;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import java.util.stream.Stream;
6+
import org.junit.jupiter.params.ParameterizedTest;
7+
import org.junit.jupiter.params.provider.Arguments;
8+
import org.junit.jupiter.params.provider.MethodSource;
9+
10+
class SnafuTest {
11+
12+
private static Stream<Arguments> snafuArguments() {
13+
return Stream.of(
14+
Arguments.of(1, "1"),
15+
Arguments.of(2, "2"),
16+
Arguments.of(3, "1="),
17+
Arguments.of(4, "1-"),
18+
Arguments.of(5, "10"),
19+
Arguments.of(6, "11"),
20+
Arguments.of(7, "12"),
21+
Arguments.of(8, "2="),
22+
Arguments.of(9, "2-"),
23+
Arguments.of(10, "20"),
24+
Arguments.of(11, "21"),
25+
Arguments.of(15, "1=0"),
26+
Arguments.of(20, "1-0"),
27+
Arguments.of(31, "111"),
28+
Arguments.of(32, "112"),
29+
Arguments.of(37, "122"),
30+
Arguments.of(107, "1-12"),
31+
Arguments.of(198, "2=0="),
32+
Arguments.of(201, "2=01"),
33+
Arguments.of(353, "1=-1="),
34+
Arguments.of(906, "12111"),
35+
Arguments.of(1257, "20012"),
36+
Arguments.of(1747, "1=-0-2"),
37+
Arguments.of(2022, "1=11-2"),
38+
Arguments.of(12345, "1-0---0"),
39+
Arguments.of(314159265, "1121-1110-1=0"),
40+
Arguments.of(33448434171005L, "2---1010-0=1220-=010"));
41+
}
42+
43+
@ParameterizedTest
44+
@MethodSource("snafuArguments")
45+
void givenADecimal_toSnafuString_returnsSnafuString(long decimal, String expectedSnafuString) {
46+
String snafuString = Snafu.toSnafuString(decimal);
47+
48+
assertThat(snafuString).isEqualTo(expectedSnafuString);
49+
}
50+
51+
@ParameterizedTest
52+
@MethodSource("snafuArguments")
53+
void givenASnafuString_parseSnafuString_returnsDecimal(long expectedDecimal, String snafuString) {
54+
long decimal = Snafu.parseSnafuString(snafuString);
55+
56+
assertThat(decimal).isEqualTo(expectedDecimal);
57+
}
58+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package eu.happycoders.adventofcode2022.day25;
2+
3+
import java.util.List;
4+
5+
class TestInputs {
6+
7+
static final String TEST_INPUT =
8+
"""
9+
1=-0-2
10+
12111
11+
2=0=
12+
21
13+
2=01
14+
111
15+
20012
16+
112
17+
1=-1=
18+
1-12
19+
12
20+
1=
21+
122""";
22+
23+
static final List<String> TEST_SNAFU_NUMBERS =
24+
List.of(
25+
"1=-0-2", "12111", "2=0=", "21", "2=01", "111", "20012", "112", "1=-1=", "1-12", "12",
26+
"1=", "122");
27+
}

0 commit comments

Comments
 (0)