0

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?

top 5 comments
sorted by: hot top controversial new old
[-] reboot6675@sopuli.xyz 20 points 11 months ago

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.

[-] Tushta@programming.dev 13 points 11 months ago

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.

[-] zerodivision@mander.xyz 3 points 11 months ago* (last edited 11 months ago)

Oh oh, you're correct :( How did I not notice that; guess too much thinking about standard card games, plus no hand in the example input is a Five Of A Kind.

[-] TostiHawaii@feddit.nl 8 points 11 months ago

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...

[-] zerodivision@mander.xyz 1 points 11 months ago* (last edited 11 months ago)

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)

this post was submitted on 07 Dec 2023
0 points (50.0% liked)

Advent Of Code

736 readers
1 users here now

An unofficial home for the advent of code community on programming.dev!

Advent of Code is an annual Advent calendar of small programming puzzles for a variety of skill sets and skill levels that can be solved in any programming language you like.

AoC 2023

Solution Threads

M T W T F S S
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25

Rules/Guidelines

Relevant Communities

Relevant Links

Credits

Icon base by Lorc under CC BY 3.0 with modifications to add a gradient

console.log('Hello World')

founded 1 year ago
MODERATORS