Day 7
This commit is contained in:
1 parent
0b66c3c2af
commit
6b6484ffe8
4 files changed
+1179
No files matched your search
Executable
+90
@@ -0,0 +1,90 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
from functools import cmp_to_key
|
||||
|
||||
|
||||
def classify_hand(hand):
|
||||
shand = sorted(list(hand))
|
||||
sets = set(shand)
|
||||
if len(sets) == 1: return 'five'
|
||||
elif shand.count(shand[0]) == 4 or shand.count(shand[1]) == 4: return 'four'
|
||||
elif (shand[0] == shand[1] and shand[2] == shand[3] == shand[4]) or (shand[3] == shand[4] and shand[0] == shand[1] == shand[2]): return 'full'
|
||||
elif shand.count(shand[0]) == 3 or shand.count(shand[1]) == 3 or shand.count(shand[2]) == 3: return 'three'
|
||||
elif len(sets) == 3: return 'twop'
|
||||
elif len(sets) == 4: return 'onep'
|
||||
elif len(sets) == 5: return 'high'
|
||||
|
||||
|
||||
def classify_hand2(hand):
|
||||
joker = hand.count('J')
|
||||
shand = sorted(list(hand))
|
||||
sets = set(shand)
|
||||
sets = sets.difference(set(['J']))
|
||||
if joker > 3 or len(sets) == 1: return 'five'
|
||||
elif joker == 3: return 'four'
|
||||
elif joker == 2:
|
||||
if len(sets) == 2: return 'four'
|
||||
else: return 'three'
|
||||
elif joker == 1:
|
||||
if len(sets) == 2:
|
||||
if shand.count(shand[0]) == 3 or shand.count(shand[1]) == 3 or shand.count(shand[2]) == 3:
|
||||
return 'four'
|
||||
else: return 'full'
|
||||
elif len(sets) == 3: return 'three'
|
||||
else: return 'onep'
|
||||
|
||||
|
||||
def compare_hands(hand1, hand2):
|
||||
hand_order = ['five', 'four', 'full', 'three', 'twop', 'onep', 'high']
|
||||
ORDER = ['A', 'K', 'Q', 'J', 'T', '9', '8', '7', '6', '5', '4', '3', '2']
|
||||
r1 = hand_order.index(classify_hand(hand1))
|
||||
r2 = hand_order.index(classify_hand(hand2))
|
||||
if r1 < r2: return 1
|
||||
elif r2 < r1: return -1
|
||||
else:
|
||||
for i in range(5):
|
||||
if ORDER.index(hand1[i]) < ORDER.index(hand2[i]): return 1
|
||||
if ORDER.index(hand2[i]) < ORDER.index(hand1[i]): return -1
|
||||
return 1
|
||||
|
||||
|
||||
def compare_hands2(hand1, hand2):
|
||||
hand_order = ['five', 'four', 'full', 'three', 'twop', 'onep', 'high']
|
||||
ORDER = ['A', 'K', 'Q', 'T', '9', '8', '7', '6', '5', '4', '3', '2', 'J']
|
||||
if 'J' in hand1: r1 = hand_order.index(classify_hand2(hand1))
|
||||
else: r1 = hand_order.index(classify_hand(hand1))
|
||||
if 'J' in hand2: r2 = hand_order.index(classify_hand2(hand2))
|
||||
else: r2 = hand_order.index(classify_hand(hand2))
|
||||
if r1 < r2: return 1
|
||||
elif r2 < r1: return -1
|
||||
else:
|
||||
for i in range(5):
|
||||
if ORDER.index(hand1[i]) < ORDER.index(hand2[i]): return 1
|
||||
if ORDER.index(hand2[i]) < ORDER.index(hand1[i]): return -1
|
||||
return 1
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
lines = [line.strip('\n') for line in open(sys.argv[1])]
|
||||
bids = {}
|
||||
for line in lines:
|
||||
hand, bid = line.split(' ')
|
||||
bids[hand] = int(bid)
|
||||
|
||||
# challenge 1
|
||||
res1 = 0
|
||||
for i, hand in enumerate(sorted(bids.keys(),key=cmp_to_key(compare_hands))):
|
||||
res1 += (i+1) * bids[hand]
|
||||
|
||||
res1 = str(res1)
|
||||
print(f"challenge 1:\n{res1}\n")
|
||||
|
||||
# challenge 2
|
||||
res2 = 0
|
||||
for i, hand in enumerate(sorted(bids.keys(),key=cmp_to_key(compare_hands2))):
|
||||
res2 += (i+1) * bids[hand]
|
||||
|
||||
res2 = str(res2)
|
||||
print(f"challenge 2:\n{res2}\n")
|
||||
|
||||
Reference in new issue
Block a user