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?

  • reboot6675@sopuli.xyz
    link
    fedilink
    arrow-up
    20
    ·
    7 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
    link
    fedilink
    arrow-up
    13
    ·
    7 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.xyzOP
      link
      fedilink
      English
      arrow-up
      3
      ·
      edit-2
      7 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
    link
    fedilink
    arrow-up
    8
    ·
    7 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.xyzOP
    link
    fedilink
    arrow-up
    1
    ·
    edit-2
    7 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)