-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
8 changed files
with
1,275 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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))); | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
); | ||
} | ||
} | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} |
Oops, something went wrong.