Skip to content

Commit 67f7de6

Browse files
committed
Day 3
1 parent d2f3c99 commit 67f7de6

File tree

2 files changed

+123
-0
lines changed

2 files changed

+123
-0
lines changed

src/test/java/com/macasaet/Day03.java

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
package com.macasaet;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import java.util.ArrayList;
6+
import java.util.Collections;
7+
import java.util.HashSet;
8+
import java.util.List;
9+
import java.util.Set;
10+
import java.util.stream.Stream;
11+
import java.util.stream.StreamSupport;
12+
13+
/**
14+
* --- Day 3: Rucksack Reörganisation ---
15+
* https://adventofcode.com/2022/day/3
16+
*/
17+
public class Day03 {
18+
19+
protected static int priority(final char c) {
20+
if (c >= 'a' && c <= 'z') {
21+
return c - 'a' + 1;
22+
}
23+
return c - 'A' + 27;
24+
}
25+
26+
protected Stream<Rucksack> getInput() {
27+
return StreamSupport
28+
.stream(new LineSpliterator("day-03.txt"),
29+
false)
30+
.map(Rucksack::parse);
31+
}
32+
33+
@Test
34+
public final void part1() {
35+
final var result = getInput().mapToInt(Rucksack::priority).sum();
36+
37+
System.out.println("Part 1: " + result);
38+
}
39+
40+
@Test
41+
public final void part2() {
42+
final var groups = new ArrayList<List<Rucksack>>();
43+
var currentGroup = new ArrayList<Rucksack>(3);
44+
45+
for (final var i = getInput().iterator(); i.hasNext(); ) {
46+
final var rucksack = i.next();
47+
if (currentGroup.size() == 3) {
48+
groups.add(Collections.unmodifiableList(currentGroup));
49+
currentGroup = new ArrayList<>(3);
50+
}
51+
currentGroup.add(rucksack);
52+
}
53+
if (currentGroup.size() == 3) {
54+
groups.add(Collections.unmodifiableList(currentGroup));
55+
}
56+
final var result = groups.stream().map(this::getBadge).mapToInt(Day03::priority).sum();
57+
58+
System.out.println("Part 2: " + result);
59+
}
60+
61+
protected char getBadge(final List<? extends Rucksack> group) {
62+
final var first = group.get(0);
63+
for (final var item : first.allItems()) {
64+
if (group.get(1).allItems().contains(item) && group.get(2).allItems().contains(item)) {
65+
return item;
66+
}
67+
}
68+
throw new IllegalStateException();
69+
}
70+
71+
/**
72+
* An Elf's container of supplies for a jungle journey. "Each rucksack has two large compartments. All items of a
73+
* given type are meant to go into exactly one of the two compartments."
74+
*
75+
* @param firstCompartment All the items in one compartment
76+
* @param secondCompartment All the items in one compartment
77+
* @param allItems All the items
78+
*/
79+
public record Rucksack(Set<Character> firstCompartment, Set<Character> secondCompartment, Set<Character> allItems) {
80+
81+
public static Rucksack parse(final String line) {
82+
final var chars = line.toCharArray();
83+
if (chars.length % 2 != 0) {
84+
throw new IllegalArgumentException();
85+
}
86+
final var firstCompartment = new HashSet<Character>(chars.length / 2);
87+
final var secondCompartment = new HashSet<Character>(chars.length / 2);
88+
for (int i = 0; i < chars.length / 2; i++) {
89+
firstCompartment.add(chars[i]);
90+
}
91+
for (int i = chars.length / 2; i < chars.length; i++) {
92+
secondCompartment.add(chars[i]);
93+
}
94+
final var union = new HashSet<Character>(chars.length);
95+
union.addAll(firstCompartment);
96+
union.addAll(secondCompartment);
97+
return new Rucksack(Collections.unmodifiableSet(firstCompartment),
98+
Collections.unmodifiableSet(secondCompartment),
99+
Collections.unmodifiableSet(union));
100+
}
101+
102+
public int priority() {
103+
final var intersection = new HashSet<Character>();
104+
for (final char c : firstCompartment) {
105+
if (secondCompartment.contains(c)) {
106+
intersection.add(c);
107+
}
108+
}
109+
if (intersection.size() != 1) {
110+
throw new IllegalStateException("There should only be one common item between compartments");
111+
}
112+
return Day03.priority(intersection.iterator().next());
113+
}
114+
115+
116+
}
117+
}

src/test/resources/sample/day-03.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
vJrwpWtwJgWrhcsFMMfFFhFp
2+
jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL
3+
PmmdzqPrVvPwwTWBwg
4+
wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn
5+
ttgJtRGJQctTZtZT
6+
CrZsJsPPZsGzwwsLwLmpwMDw

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy