Skip to content

Commit 83b1322

Browse files
committed
Advent of Code 2021 - Day 3
1 parent b72390d commit 83b1322

File tree

8 files changed

+1195
-4
lines changed

8 files changed

+1195
-4
lines changed

README.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,4 @@ Last year I ran a [cruise log for my 25 days competing in the Advent of Code](ht
2020

2121
- [The Advent of Code 2021 Day 1 log, starting slow](https://www.codingnagger.com/2021/12/01/the-advent-of-code-2021-day-1-log-starting-slow/)
2222
- [The Advent of Code 2021 Day 2 log, sneaky release](https://www.codingnagger.com/2021/12/02/the-advent-of-code-2021-day-2-log-sneaky-release/)
23-
24-
23+
- [The Advent of Code 2021 Day 3 log, sleepy brain](https://www.codingnagger.com/2021/12/03/the-advent-of-code-2021-day-3-log-sleepy-brain/)

src/main/java/com/codingnagger/App.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.codingnagger.days.Day;
44
import com.codingnagger.days.Day1;
55
import com.codingnagger.days.Day2;
6+
import com.codingnagger.days.Day3;
67
import com.codingnagger.utils.InputLoader;
78

89
import java.io.IOException;
@@ -15,9 +16,9 @@ public class App {
1516
public static void main(String[] args) throws IOException {
1617
System.out.println("Advent of Code 2021");
1718

18-
List<String> input = InputLoader.Load("day2.txt");
19+
List<String> input = InputLoader.Load("day3.txt");
1920

20-
Day day = new Day2();
21+
Day day = new Day3();
2122

2223
System.out.println("Part 1:");
2324
System.out.println(day.partOne(input));
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package com.codingnagger.days;
2+
3+
4+
import java.util.ArrayList;
5+
import java.util.List;
6+
import java.util.stream.Collectors;
7+
8+
public class Day3 implements Day {
9+
10+
@Override
11+
public String partOne(List<String> input) {
12+
BitInfo bitInfo = new BitInfo();
13+
bitInfo.compute(input);
14+
return "" + bitInfo.gamma * bitInfo.epsilon;
15+
}
16+
17+
@Override
18+
public String partTwo(List<String> input) {
19+
List<String> filteredGammaInput = new ArrayList<>(input);
20+
List<String> filteredEpsilonInput = new ArrayList<>(input);
21+
BitInfo bitInfo = new BitInfo();
22+
23+
int cursor = 0;
24+
25+
while (cursor <= input.get(0).length()) {
26+
final int lambdaCursor = cursor;
27+
28+
if (filteredGammaInput.size() > 1) {
29+
bitInfo.compute(filteredGammaInput);
30+
filteredGammaInput = filteredGammaInput.stream().filter(line -> line.charAt(lambdaCursor) == bitInfo.gammaBits.charAt(lambdaCursor)).collect(Collectors.toList());
31+
}
32+
33+
if (filteredEpsilonInput.size() > 1) {
34+
bitInfo.compute(filteredEpsilonInput);
35+
filteredEpsilonInput = filteredEpsilonInput.stream().filter(line -> line.charAt(lambdaCursor) == bitInfo.epsilonBits.charAt(lambdaCursor)).collect(Collectors.toList());
36+
}
37+
38+
cursor++;
39+
}
40+
41+
return "" + toDecimal(filteredGammaInput.get(0)) * toDecimal(filteredEpsilonInput.get(0));
42+
43+
44+
}
45+
46+
int toDecimal(String bits) {
47+
int result = 0;
48+
for (int i = 0; i < bits.length(); i++) {
49+
double a = toDigit(bits.charAt(i));
50+
int n = bits.length()-i-1;
51+
result += n == 0 ? a : Math.pow(2 * a, n);
52+
}
53+
return result;
54+
}
55+
56+
class BitInfo {
57+
int gamma;
58+
String gammaBits;
59+
int epsilon;
60+
String epsilonBits;
61+
62+
void compute(List<String> input) {
63+
64+
if (input.isEmpty()) {
65+
gammaBits = "";
66+
epsilonBits = "";
67+
gamma = 0;
68+
epsilon = 0;
69+
return;
70+
}
71+
72+
int positionSize = input.get(0).length();
73+
int[][] data = new int[positionSize][2];
74+
75+
for (int i = 0; i < positionSize; i++) {
76+
data[i] = new int[]{0, 0};
77+
}
78+
79+
input.forEach(line -> {
80+
for (int i = 0; i < positionSize; i++) {
81+
data[i][toDigit(line.charAt(i))]++;
82+
}
83+
});
84+
85+
StringBuilder gammaBitsSb = new StringBuilder();
86+
StringBuilder epsilonBitsSb = new StringBuilder();
87+
88+
for (int i = 0; i < positionSize; i++) {
89+
gammaBitsSb.append(data[i][1] >= data[i][0] ? 1 : 0);
90+
epsilonBitsSb.append(data[i][1] >= data[i][0] ? 0 : 1);
91+
}
92+
93+
gammaBits = gammaBitsSb.toString();
94+
gamma = toDecimal(gammaBits);
95+
epsilonBits = epsilonBitsSb.toString();
96+
epsilon = toDecimal(epsilonBits);
97+
}
98+
}
99+
100+
private int toDigit(char c) {
101+
return c == '1' ? 1 : 0;
102+
}
103+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.codingnagger.days;
2+
3+
import java.util.List;
4+
5+
public class Day4 implements Day {
6+
@Override
7+
public String partOne(List<String> input) {
8+
return null;
9+
}
10+
11+
@Override
12+
public String partTwo(List<String> input) {
13+
return null;
14+
}
15+
}

0 commit comments

Comments
 (0)