from collections import Counter from sys import stdin from typing import TypeAlias Hand: TypeAlias = tuple[int, int, int, int, int] inp = [(l[0], int(l[1])) for l in (l.rstrip().split() for l in stdin)] def parse_hand(card_worth: dict[str, int], hand: str) -> Hand: ret = tuple(card_worth[c] for c in hand) if len(ret) != 5: raise ValueError return ret def hand_type(c: list[tuple[int, int]]) -> int: if c[0][1] == 5: return 6 if c[0][1] == 4: return 5 if c[0][1] == 3 and c[1][1] == 2: return 4 if c[0][1] == 3: return 3 if c[0][1] == 2 and c[1][1] == 2: return 2 if c[0][1] == 2: return 1 return 0 def p1(inp: list[tuple[str, int]]): cards = "AKQJT98765432" card_worth = {c: i for i, c in enumerate(reversed(cards))} def _hand_type(hand: Hand) -> int: return hand_type(Counter(hand).most_common()) return sum( (i + 1) * h[1] for i, h in enumerate( sorted( ((parse_hand(card_worth, i[0]), i[1]) for i in inp), key=lambda i: (_hand_type(i[0]), *i[0]), ) ) ) def p2(inp: list[tuple[str, int]]): cards = "AKQT98765432J" card_worth = {c: i for i, c in enumerate(reversed(cards))} def _hand_type(hand: Hand) -> int: c = Counter(hand) mc = c.most_common() if 0 in c and len(mc) != 1: target = next(e[0] for e in mc if e[0] != 0) c[target] += c[0] c[0] = 0 mc = c.most_common() return hand_type(mc) return sum( (i + 1) * h[1] for i, h in enumerate( sorted( ((parse_hand(card_worth, i[0]), i[1]) for i in inp), key=lambda i: (_hand_type(i[0]), *i[0]), ), ) ) print(p1(inp)) print(p2(inp))