add: part2
This commit is contained in:
parent
a8ff3fc882
commit
0d50624697
96
2023/day07/src/part2.py
Normal file
96
2023/day07/src/part2.py
Normal file
@ -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)
|
Loading…
Reference in New Issue
Block a user