diff --git a/2023/day07/src/part2.py b/2023/day07/src/part2.py new file mode 100644 index 0000000..ee899dc --- /dev/null +++ b/2023/day07/src/part2.py @@ -0,0 +1,96 @@ +text: str = open("input.txt", "r").read() + +_value: int = 0 + +lines = text.splitlines() + +CARDS = "AKQT98765432J" + +def get_best_replace(string: str): + if ("J" not in string): + return string + if (string == "JJJJJ"): + return "AAAAA" + tmp = string + tmp = tmp.replace("J", "") + bozo: list = list(set(tmp)) + bozo2: list = [(tmp.count(x), x) for x in tmp] + max_occurence = [bozo2[0]] + for occurence, char in bozo2[1:]: + if (max_occurence[0] == occurence): + max_occurence.append((occurence, char)) + elif (max_occurence[0][0] < occurence): + max_occurence = [(occurence, char)] + _max = max_occurence[0][1] + for occurence, char in max_occurence[1:]: + if (CARDS.index(_max) > CARDS.index(char)): + _max = char + + string = string.replace("J", _max) + return string + +def parse_line(line: str): + bozo = line.split() + raw_card = bozo[0] + bid = int(bozo[1]) + card = get_best_replace(raw_card) + same = {"card": card, "raw_card": raw_card, "bid": bid} + bozo = set(card) + if (len(bozo) == 5): + _type = 0 + elif (len(bozo) == 4): + _type = 1 + elif (len(bozo) == 3 and (card.count(list(bozo)[0]) == 2 or card.count(list(bozo)[1]) == 2)): + _type = 2 + elif (len(bozo) == 3): + _type = 3 + elif (len(bozo) == 2 and (card.count(list(bozo)[0]) == 2 or card.count(list(bozo)[1]) == 2)): + _type = 4 + elif (len(bozo) == 2): + _type = 5 + elif (len(bozo) == 1): + _type = 6 + + same.update({"type": int(_type)}) + return same + +def parse(lines): + hands = [] + for line in lines: + hands.append(parse_line(line)) + return hands + +def hand_cmp(hand1: dict, hand2: dict): + #print(hand1, hand2) + for card1, card2 in zip(hand1.get("raw_card"), hand2.get("raw_card")): + if card1 == card2: + continue + return (CARDS.index(card1) - CARDS.index(card2)) + return 0 + +def get_insert_index(lst: [dict], hand: dict): + index: int = None + for i, hand2 in enumerate(lst): + if (hand.get("type") == hand2.get("type")): + if (hand_cmp(hand, hand2) < 0): + return i + elif (hand.get("type") > hand2.get("type")): + return i + return len(lst) + +def sort_hands(hands: [dict]): + sort = [hands[0]] + for hand in hands[1:]: + index = get_insert_index(sort, hand) + sort.insert(index, hand) + return sort + +hands = parse(lines) +hands = sort_hands(hands) + +for i, hand in enumerate(hands): + _value += (len(hands) - i) * hand.get("bid") + #print(f'{hand.get("card")} {hand.get("raw_card")} {hand.get("bid")}') + #print(f'{len(hands) - i} {hand.get("card")} {hand.get("bid")} type={hand.get("type")}') + +print(_value) \ No newline at end of file