Про задачу четвертого дня сказать особенно нечего. По условию — проще третей. По парсингу ввода — проще второй. Решается быстро.
Сразу прикинул, что с использованием примитивов или оборачиванием в типы из стандартной библиотеки — будет портяночно. Поэтому — отдельный класс с логикой:
public class Card {
private static final Predicate<String> EMPTY = s -> " ".equals(s) || "".equals(s);
Integer cardN, winCnt;
Set<Integer> win, have;
List<Card> nextCards = new ArrayList<>(); // added for part 2
public Card(String cardN, String[] win, String[] have) {
this.cardN = Integer.parseInt(cardN.replaceAll("^Card\\s+", ""));
this.win = parseNums(win);
this.have = parseNums(have);
this.winCnt = (int) this.have.stream().filter(h -> this.win.contains(h)).count();
}
void addNext(List<Card> nextCards) { // added for part 2
this.nextCards.addAll(nextCards);
}
Stream<Card> flat() { // added for part 2
return Stream.concat(Stream.of(this),
this.nextCards.stream().flatMap(Card::flat));
}
private static Set<Integer> parseNums(String[] nums) {
return Arrays.stream(nums).filter(not(EMPTY)).map(Integer::parseInt)
.collect(Collectors.toSet());
}
};
Читать далее Advent of Code 2023: Day 4: Scratchcards