mirror of
https://github.com/iritmaximus/aoc.git
synced 2026-10-12 19:13:38 +03:00
day 7 both parts
This commit is contained in:
@@ -0,0 +1,148 @@
|
||||
from enum import IntEnum
|
||||
|
||||
class PictureCard(IntEnum):
|
||||
A = 14
|
||||
K = 13
|
||||
Q = 12
|
||||
J = 1
|
||||
T = 10
|
||||
|
||||
class HandType(IntEnum):
|
||||
FIVE = 7
|
||||
FOUR = 6
|
||||
FULLHOUSE = 5
|
||||
THREE = 4
|
||||
TWO = 3
|
||||
ONE = 2
|
||||
HIGH = 1
|
||||
|
||||
def main():
|
||||
lines = read_input()
|
||||
|
||||
print("PART 1:")
|
||||
res_1 = solve(lines, False)
|
||||
print("PART 2:")
|
||||
res_2 = solve(lines, True)
|
||||
|
||||
return (res_1, res_2)
|
||||
|
||||
|
||||
def solve(lines, second_part: bool):
|
||||
hands = []
|
||||
for line in lines:
|
||||
hand, bid = line.split(" ")
|
||||
hands.append({"hand": hand, "bid": int(bid), "card_count": get_card_count(hand, second_part)})
|
||||
|
||||
sorted_hands = sorted(hands, key=lambda hand: hand_value(hand), reverse=False)
|
||||
result = 0
|
||||
for i, hand in enumerate(sorted_hands):
|
||||
result += hand.get("bid") * (i + 1)
|
||||
print(hand, i+1, "=", hand.get("bid") * (i + 1))
|
||||
|
||||
return result
|
||||
|
||||
|
||||
|
||||
def hand_type(card_count):
|
||||
# len(card_count)
|
||||
# 1: five-of-a-kind
|
||||
# 2: four-of-a-kind, full house
|
||||
# 3: Three-of-a-kind, two two-of-a-kind
|
||||
# 4: two-of-a-kind
|
||||
# 5: high card
|
||||
|
||||
match len(card_count):
|
||||
case 1:
|
||||
return HandType.FIVE
|
||||
case 2:
|
||||
card_count_values = card_count.values()
|
||||
# is it four-of-a-kind or fullhouse
|
||||
if 4 in card_count_values:
|
||||
return HandType.FOUR
|
||||
return HandType.FULLHOUSE
|
||||
|
||||
case 3:
|
||||
card_count_values = card_count.values()
|
||||
if 3 in card_count_values:
|
||||
return HandType.THREE
|
||||
return HandType.TWO
|
||||
|
||||
case 4:
|
||||
return HandType.ONE
|
||||
|
||||
case 5:
|
||||
return HandType.HIGH
|
||||
|
||||
case _:
|
||||
raise ValueError("Hand type not matched")
|
||||
|
||||
|
||||
|
||||
|
||||
def get_card_count(hand, second_part):
|
||||
card_count = {}
|
||||
for card in hand:
|
||||
if card_count.get(card):
|
||||
card_count[card] += 1
|
||||
else:
|
||||
card_count[card] = 1
|
||||
|
||||
if second_part:
|
||||
jokers = card_count.get("J")
|
||||
if jokers:
|
||||
card_count["J"] = 0
|
||||
max_value = max(card_count.values())
|
||||
for card_count_key in card_count:
|
||||
if card_count[card_count_key] == max_value and card_count_key != "J":
|
||||
card_count[card_count_key] += jokers
|
||||
del card_count["J"]
|
||||
if len(card_count) == 0:
|
||||
card_count["A"] = 5
|
||||
|
||||
return card_count
|
||||
|
||||
|
||||
def hand_value(hand):
|
||||
card_count = hand.get("card_count")
|
||||
hand = hand.get("hand")
|
||||
hand_type_value = hand_type(card_count)
|
||||
|
||||
hand_card_value = []
|
||||
for card in hand:
|
||||
if card.isnumeric():
|
||||
hand_card_value.append(int(card))
|
||||
else:
|
||||
#A = 14
|
||||
#K = 13
|
||||
#Q = 12
|
||||
#J = 11
|
||||
#T = 10
|
||||
match card:
|
||||
case "A":
|
||||
hand_card_value.append(PictureCard.A)
|
||||
case "K":
|
||||
hand_card_value.append(PictureCard.K)
|
||||
case "Q":
|
||||
hand_card_value.append(PictureCard.Q)
|
||||
case "J":
|
||||
hand_card_value.append(PictureCard.J)
|
||||
case "T":
|
||||
hand_card_value.append(PictureCard.T)
|
||||
case _:
|
||||
raise ValueError("No picture card matched")
|
||||
|
||||
return [hand_type_value, hand_card_value]
|
||||
|
||||
|
||||
def read_input(filename: str="input.txt"):
|
||||
input = []
|
||||
with open(filename) as file:
|
||||
lines = file.readlines()
|
||||
|
||||
for line in lines:
|
||||
input.append(line.strip())
|
||||
|
||||
return input
|
||||
|
||||
if __name__ == "__main__":
|
||||
print(main())
|
||||
@@ -0,0 +1,5 @@
|
||||
32T3K 765
|
||||
T55J5 684
|
||||
KK677 28
|
||||
KTJJT 220
|
||||
QQQJA 483
|
||||
+1000
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user