The instructions for part 2 are missing info about how to handle the Four Of A Kind and a joker case. Wasted quite some time because I assumed that the remaining joker would remain unused, but turns out it turns your deck into Five Of A Kind.
Did everybody else just expect this?
Why would the joker remain unused? The problem clearly says joker acts as the card that makes the hand strongest, so in this case, 5 of a kind.
There are no suits in this game, so no limit of how many cards of a same kind can be in a hand. Five of a kind is explicitly mentioned in the rules of the game.
For part 2, the only thing that I missed at first was the JJJJJ edge case. My approach was:
- count the amount of jokers
- remove them from the hand
- count the rest
- add the amount of jokers to the biggest set in the hand
Last step fails if there are no other cards left after you remove the jokers…
Here’s a (hopefully correct) solution (in Python) where a Five Of A Kind hand is not allowed:
Code
i = open('day7_in.txt')
from collections import Counter
card_values = {
'A': 14,
'K': 13,
'Q': 12,
'J': 0,
'T': 10
}
deques = []
for line in i:
if not line.strip():
continue
cards, bid = line.split()
cards_repr = [int(card_values.get(card, card)) for card in cards]
counts = Counter(card for card in cards if card != 'J')
deque_type = [times for card, times in counts.most_common(5)]
jokers_left = cards.count('J')
for i in range(jokers_left):
for j, n in enumerate(deque_type):
if n < 4:
deque_type[j] += 1
jokers_left -= 1
break
if jokers_left:
if jokers_left <= 4:
deque_type.append(jokers_left)
else:
deque_type += [4, 1]
deques.append((deque_type, cards_repr, int(bid), cards))
deques.sort()
ans = 0
for n, d in enumerate(deques, 1):
ans += n*d[2]
print(ans)