Skip to content

Commit

Permalink
Day 07 - WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
kocmana committed Dec 21, 2023
1 parent 2863cf7 commit 3b729cc
Show file tree
Hide file tree
Showing 8 changed files with 1,275 additions and 0 deletions.
45 changes: 45 additions & 0 deletions src/main/java/at/kocmana/aoc23/dec07/CamelCards.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package at.kocmana.aoc23.dec07;

import at.kocmana.aoc23.common.ResourceToString;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.IntStream;

public class CamelCards {

public static void main(String[] args) {
var puzzleInput = ResourceToString.from("dec07", "CamelCards.txt");
var result = play(puzzleInput);
System.out.printf("Result: %d%n", result);
}

static long play(String input) {
var sortedHands = sortLists(parseGame(input));
return IntStream.range(0, sortedHands.size())
.map(i -> (i + 1) * sortedHands.get(i).bid())
.sum();
}

static List<Hand> parseGame(String input) {
return input.lines()
.map(CamelCards::parseHand)
.toList();
}

static Hand parseHand(String input) {
var cardsAndBid = input.split("( )+");
var cards = Arrays.stream(cardsAndBid[0].split(""))
.map(Card::fromString)
.toList();
var bid = Integer.parseInt(cardsAndBid[1]);

return new Hand(cards, bid);
}

static List<Hand> sortLists(List<Hand> unsortedHands) {
return unsortedHands.stream()
.sorted(Comparator.comparing(Hand::power).reversed())
.toList();
}
}
33 changes: 33 additions & 0 deletions src/main/java/at/kocmana/aoc23/dec07/Card.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package at.kocmana.aoc23.dec07;

import java.util.Arrays;

enum Card {
ACE("A"),
KING("K"),
QUEEN("Q"),
JACK("J"),
TEN("T"),
NINE("9"),
EIGHT("8"),
SEVEN("7"),
SIX("6"),
FIVE("5"),
FOUR("4"),
THREE("3"),
TWO("2");

private final String textualRepresentation;

private Card(String textualRepresentation) {
this.textualRepresentation = textualRepresentation;
}

public static Card fromString(String textualRepresentation) {
return Arrays.stream(Card.values())
.filter(value -> value.textualRepresentation.equalsIgnoreCase(textualRepresentation))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("Unknown Card Type %s".formatted(textualRepresentation)));
}

}
13 changes: 13 additions & 0 deletions src/main/java/at/kocmana/aoc23/dec07/Hand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package at.kocmana.aoc23.dec07;

import java.util.List;

record Hand(
List<Card> cards,
int bid,
Power power
) {
Hand(List<Card> cards, int bid) {
this(cards, bid, PowerFactory.fromCards(cards));
}
}
21 changes: 21 additions & 0 deletions src/main/java/at/kocmana/aoc23/dec07/Power.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package at.kocmana.aoc23.dec07;

import java.util.List;
import java.util.stream.IntStream;

record Power(
Type type,
List<Card> relevantCards
) implements Comparable<Power> {
@Override
public int compareTo(Power other) {
if (this.type.compareTo(other.type) != 0) {
return this.type.compareTo(other.type);
}
return IntStream.range(0, relevantCards.size())
.map(i -> this.relevantCards.get(i).compareTo(other.relevantCards.get(i)))
.filter(comparison -> comparison != 0)
.findFirst()
.orElse(0);
}
}
71 changes: 71 additions & 0 deletions src/main/java/at/kocmana/aoc23/dec07/PowerFactory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package at.kocmana.aoc23.dec07;

import static java.util.Collections.singletonList;
import static java.util.stream.Collectors.counting;
import static java.util.stream.Collectors.groupingBy;

import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.function.Function;

class PowerFactory {

private PowerFactory() {
}

static Power fromCards(List<Card> cardList) {
var amountOfCardsByLabel = cardList.stream()
.collect(groupingBy(Function.identity(), counting()));


Comparator<Map.Entry<Card, Long>> frequencyThenCardLabel =
Map.Entry.<Card, Long>comparingByValue().reversed()
.thenComparing(Map.Entry.<Card, Long>comparingByKey());

var sortedAmounts = amountOfCardsByLabel.entrySet().stream()
.sorted(frequencyThenCardLabel)
.toList();

var firstEntry = sortedAmounts.get(0);
if (firstEntry.getValue() == 5) {
return new Power(
Type.FIVE_OF_A_KIND,
singletonList(firstEntry.getKey())
);
}
var secondEntry = sortedAmounts.get(1);
if (firstEntry.getValue() == 4) {
return new Power(
Type.FOUR_OF_A_KIND,
singletonList(firstEntry.getKey())
);
} else if (firstEntry.getValue() == 3 && secondEntry.getValue() == 2) {
return new Power(
Type.FULL_HOUSE,
List.of(firstEntry.getKey(), secondEntry.getKey())
);
} else if (firstEntry.getValue() == 3) {
return new Power(
Type.THREE_OF_A_KIND,
singletonList(firstEntry.getKey())
);
} else if (firstEntry.getValue() == 2 && secondEntry.getValue() == 2) {
return new Power(
Type.TWO_PAIR,
List.of(firstEntry.getKey(), secondEntry.getKey())
);
} else if (firstEntry.getValue() == 2) {
return new Power(
Type.ONE_PAIR,
singletonList(firstEntry.getKey())
);
} else {
return new Power(
Type.HIGH_CARD,
cardList
);
}
}
}

11 changes: 11 additions & 0 deletions src/main/java/at/kocmana/aoc23/dec07/Type.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package at.kocmana.aoc23.dec07;

enum Type {
FIVE_OF_A_KIND,
FOUR_OF_A_KIND,
FULL_HOUSE,
THREE_OF_A_KIND,
TWO_PAIR,
ONE_PAIR,
HIGH_CARD
}
Loading

0 comments on commit 3b729cc

Please sign in to comment.