add 2023/day07.1
This commit is contained in:
parent
9d0149588c
commit
3cb912f1a7
1 changed files with 111 additions and 0 deletions
111
2023/07/main.py
Normal file
111
2023/07/main.py
Normal file
|
@ -0,0 +1,111 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- encoding: utf-8; py-indent-offset: 4 -*-
|
||||||
|
|
||||||
|
# Author: Sebastian Mark
|
||||||
|
# CC-BY-SA (https://creativecommons.org/licenses/by-sa/4.0/deed.de)
|
||||||
|
|
||||||
|
# pylint: disable=missing-module-docstring,missing-function-docstring,consider-using-f-string
|
||||||
|
|
||||||
|
# Strength:
|
||||||
|
# Five of a kind: 6
|
||||||
|
# Four of a kind: 5
|
||||||
|
# Full house: 4
|
||||||
|
# Three of a kind: 3
|
||||||
|
# Two pair: 2
|
||||||
|
# One Pair: 1
|
||||||
|
# High Card: 0
|
||||||
|
|
||||||
|
|
||||||
|
import copy
|
||||||
|
from collections import Counter
|
||||||
|
|
||||||
|
|
||||||
|
def readinput():
|
||||||
|
with open("input", "r", encoding="utf-8") as file:
|
||||||
|
games = []
|
||||||
|
for line in file:
|
||||||
|
hand, bid = line.strip().split()
|
||||||
|
games.append({"hand": hand, "bid": int(bid), "strength": 0})
|
||||||
|
|
||||||
|
return games
|
||||||
|
|
||||||
|
|
||||||
|
# pylint: disable=inconsistent-return-statements,too-many-return-statements
|
||||||
|
def calc_strength(hand: str) -> int:
|
||||||
|
counter = Counter(hand)
|
||||||
|
highes_count = max(Counter(hand).values())
|
||||||
|
|
||||||
|
if highes_count == 5:
|
||||||
|
return 6 # Five of a kind
|
||||||
|
if highes_count == 4:
|
||||||
|
return 5 # Four of a kind
|
||||||
|
if highes_count == 3:
|
||||||
|
if len(counter) == 3:
|
||||||
|
return 3 # Three of a kind
|
||||||
|
return 4 # Full House
|
||||||
|
if highes_count == 2:
|
||||||
|
if len(set(hand)) == 3:
|
||||||
|
return 2 # Two Pair
|
||||||
|
return 1 # One Pair
|
||||||
|
if highes_count == 1:
|
||||||
|
return 0 # High Card
|
||||||
|
|
||||||
|
|
||||||
|
def bubblesort_reverse(games: dict) -> dict:
|
||||||
|
sorted_games = copy.deepcopy(games)
|
||||||
|
cards = "23456789TJQKA"
|
||||||
|
|
||||||
|
for n in range(len(sorted_games) - 1, 0, -1):
|
||||||
|
swapped = False
|
||||||
|
|
||||||
|
for i in range(n):
|
||||||
|
this_game = sorted_games[i]
|
||||||
|
next_game = sorted_games[i + 1]
|
||||||
|
|
||||||
|
# first sort key: strength (descending)
|
||||||
|
if this_game["strength"] > next_game["strength"]:
|
||||||
|
swapped = True
|
||||||
|
sorted_games[i], sorted_games[i + 1] = (
|
||||||
|
sorted_games[i + 1],
|
||||||
|
sorted_games[i],
|
||||||
|
)
|
||||||
|
|
||||||
|
if this_game["strength"] == next_game["strength"]:
|
||||||
|
# second sort key: cards (descending)
|
||||||
|
# compare each card,
|
||||||
|
# if first card is lower, take this order,
|
||||||
|
# otherwise swap games
|
||||||
|
for card_a, card_b in zip(this_game["hand"], next_game["hand"]):
|
||||||
|
if cards.index(card_a) < cards.index(card_b):
|
||||||
|
break
|
||||||
|
if cards.index(card_a) > cards.index(card_b):
|
||||||
|
swapped = True
|
||||||
|
sorted_games[i], sorted_games[i + 1] = (
|
||||||
|
sorted_games[i + 1],
|
||||||
|
sorted_games[i],
|
||||||
|
)
|
||||||
|
break
|
||||||
|
|
||||||
|
if not swapped:
|
||||||
|
break
|
||||||
|
|
||||||
|
return sorted_games
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
games = readinput()
|
||||||
|
|
||||||
|
# part 1
|
||||||
|
for game in games:
|
||||||
|
game["strength"] = calc_strength(game["hand"])
|
||||||
|
|
||||||
|
ranked_games = bubblesort_reverse(games)
|
||||||
|
|
||||||
|
winnings = 0
|
||||||
|
for i, game in enumerate(ranked_games):
|
||||||
|
winnings += game["bid"] * (i + 1)
|
||||||
|
print("Total winnings: %d" % winnings)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
Loading…
Reference in a new issue