Skip to content

Instantly share code, notes, and snippets.

@macobo
Last active December 25, 2015 10:29
Show Gist options
  • Select an option

  • Save macobo/6962470 to your computer and use it in GitHub Desktop.

Select an option

Save macobo/6962470 to your computer and use it in GitHub Desktop.
Different solutions to poker hand ranking, without using lists.
#juhendaja lahendus
def mitu_tugevusega(alg, a, b = -1, c = -1):
tul = 1
if a == alg: tul += 1
if b == alg: tul += 1
if c == alg: tul += 1
return tul
def paar(k1, k2, k3, k4, k5):
return mitu_tugevusega(k1, k2) == 2 or \
mitu_tugevusega(k2, k3) == 2 or \
mitu_tugevusega(k3, k4) == 2 or \
mitu_tugevusega(k4, k5) == 2
def kolmik(k1, k2, k3, k4, k5):
return mitu_tugevusega(k1, k2, k3) == 3 or \
mitu_tugevusega(k2, k3, k4) == 3 or \
mitu_tugevusega(k3, k4, k5) == 3
def nelik(k1, k2, k3, k4, k5):
return mitu_tugevusega(k1, k2, k3, k4) == 4 or \
mitu_tugevusega(k2, k3, k4, k5) == 4
def kakspaari(k1, k2, k3, k4, k5):
if paar(k1, k2, -1, -2, -3) and paar(k3, k4, -1, -2, -3):
return True
if paar(k1, k2, -1, -2, -3) and paar(k4, k5, -1, -2, -3):
return True
if paar(k2, k3, -1, -2, -3) and paar(k4, k5, -1, -2, -3):
return True
return False
def rida(k1, k2, k3, k4, k5):
return k1+1 == k2 and k2+1 == k3 and k3+1 == k4 and k4+1 == k5
def yhestmastist(m1, m2, m3, m4, m5):
return m1 == m2 and m2 == m3 and m3 == m4 and m4 == m5
def mast(kaart):
return kaart[1]
def maja(k1, k2, k3, k4, k5):
a = mitu_tugevusega(k1, k2, k3)
b = mitu_tugevusega(k3, k4, k5)
return a + b == 5
def tugevus(kaart):
taht = kaart[0]
if taht == 'K': return 12
if taht == 'Q': return 11
if taht == 'J': return 10
return int(taht)
def k2si(kaart1, kaart2, kaart3, kaart4, kaart5):
# Lihtsustused: kaartide seas pole ässa
# kaardid on järjestatud tugevuse järjekorras
mast1 = mast(kaart1)
tugevus1 = tugevus(kaart1)
mast2 = mast(kaart2)
tugevus2 = tugevus(kaart2)
mast3 = mast(kaart3)
tugevus3 = tugevus(kaart3)
mast4 = mast(kaart4)
tugevus4 = tugevus(kaart4)
mast5 = mast(kaart5)
tugevus5 = tugevus(kaart5)
if yhestmastist(mast1, mast2, mast3, mast4, mast5) and rida(tugevus1, tugevus2, tugevus3, tugevus4, tugevus5):
return 'mastirida'
if nelik(tugevus1, tugevus2, tugevus3, tugevus4, tugevus5):
return 'nelik'
if maja(tugevus1, tugevus2, tugevus3, tugevus4, tugevus5):
return 'maja'
if yhestmastist(mast1, mast2, mast3, mast4, mast5):
return 'mast'
if rida(tugevus1, tugevus2, tugevus3, tugevus4, tugevus5):
return 'rida'
if kolmik(tugevus1, tugevus2, tugevus3, tugevus4, tugevus5):
return 'kolmik'
if kakspaari(tugevus1, tugevus2, tugevus3, tugevus4, tugevus5):
return 'kaks paari'
if paar(tugevus1, tugevus2, tugevus3, tugevus4, tugevus5):
return 'üks paar'
return 'kõrge kaart'
# Käte genereerimine
# MASTID = '♥♦♣♠'
# KAARDID = '23456789JQK'
# from random import *
# from collections import defaultdict
# gen_kaart = lambda: choice(KAARDID) + choice(MASTID)
# gen_kasi = lambda: tuple(sorted([gen_kaart() for _ in range(5)], key=tugevus))
# def gen_kasi():
# l = set()
# while len(l) < 5:
# l.add(gen_kaart())
# return tuple(sorted(l, key=tugevus))
# r = set()
# naited = defaultdict(set)
# for _ in range(100000):
# kasi = gen_kasi()
# tyyp = k2si(*kasi)
# if len(naited[tyyp]) < 10:
# naited[tyyp].add(kasi)
# print(kasi, tyyp)
# Siit edasi testid, mitte näppida!
def type_miss(type, hand_function, test_data, echo=True):
misses = 0
for hand in test_data[type]:
answer_given = hand_function(*hand)
if answer_given != type:
if echo: print(hand, 'on', repr(type), 'mitte', repr(answer_given))
misses += 1
if echo: print("")
return misses
def testi(hand_function, test_data):
test_count_total = 0
hit_perc = {}
for type in test_data.keys():
test_count = len(test_data[type])
test_count_total += test_count
hit_perc[type] = 1 - type_miss(type, hand_function, test_data) / test_count
print("\n\n----- Testide tulemused -----\n")
total_hit_perc = 0
for type in test_data.keys():
print("%11s: %5.1f%%" % (type, hit_perc[type] * 100))
total_hit_perc += hit_perc[type] * len(test_data[type]) / test_count_total
print("\nKokku: %.1f%%" % (total_hit_perc*100))
test_andmed = {'kaks paari': [('5♦', '5♣', 'J♠', 'J♣', 'Q♠'),
('4♥', '4♣', 'Q♠', 'Q♣', 'K♦'),
('6♠', '6♣', 'Q♣', 'Q♥', 'K♥'),
('2♦', '2♠', '3♠', '3♦', 'K♠'),
('2♦', '2♣', '4♦', 'J♦', 'J♠'),
('3♠', 'J♠', 'J♣', 'K♦', 'K♥'),
('5♠', '7♥', '7♠', 'Q♣', 'Q♥'),
('2♠', '4♥', '4♣', '9♠', '9♣'),
('7♣', '7♠', '8♦', 'Q♦', 'Q♥'),
('4♣', '4♠', '5♥', '5♦', 'K♦')],
'kolmik': [('4♠', '5♠', '7♥', '7♣', '7♠'),
('6♣', 'J♦', 'K♣', 'K♠', 'K♦'),
('6♥', 'J♥', 'J♠', 'J♣', 'K♠'),
('3♠', '3♦', '3♥', '6♥', 'J♣'),
('2♣', '6♣', '6♥', '6♦', '7♠'),
('2♠', 'J♠', 'J♦', 'J♣', 'Q♠'),
('2♥', '5♦', '7♥', '7♣', '7♦'),
('8♦', '8♠', '8♣', '9♣', 'J♥'),
('2♥', '2♠', '2♣', '5♦', '7♥'),
('3♦', '7♣', '9♠', '9♣', '9♦')],
'kõrge kaart': [('5♦', '6♥', '7♠', '9♦', 'J♣'),
('2♦', '3♣', '8♥', '9♣', 'K♠'),
('2♠', '5♣', '8♠', 'J♥', 'Q♣'),
('2♦', '4♥', '7♣', 'J♠', 'Q♦'),
('4♠', '5♦', '6♣', '9♣', 'J♥'),
('3♣', '5♥', '6♥', '8♥', '9♥'),
('3♣', '4♣', '7♦', '8♠', 'Q♠'),
('2♣', '5♥', '7♥', '9♣', 'J♣'),
('2♠', '4♠', '8♠', 'J♦', 'K♥'),
('4♦', '7♠', '8♣', 'Q♣', 'K♠')],
'maja': [('7♦', '7♣', 'Q♠', 'Q♥', 'Q♦'),
('7♠', '7♣', 'J♠', 'J♦', 'J♣'),
('7♥', '7♠', '9♠', '9♣', '9♥'),
('4♦', '4♣', 'Q♠', 'Q♣', 'Q♥'),
('3♠', '3♥', '8♣', '8♠', '8♥'),
('4♥', '4♣', '8♠', '8♦', '8♥'),
('2♥', '2♠', 'J♠', 'J♦', 'J♣'),
('5♦', '5♣', '7♦', '7♣', '7♠'),
('7♦', '7♠', '8♠', '8♦', '8♥'),
('5♥', '5♦', '7♥', '7♣', '7♠')],
'mast': [('4♦', '6♦', '8♦', 'J♦', 'Q♦'),
('3♣', '4♣', '7♣', '8♣', '9♣'),
('4♣', '7♣', '8♣', '9♣', 'K♣'),
('5♠', '6♠', '8♠', '9♠', 'K♠'),
('3♣', '5♣', '7♣', 'J♣', 'Q♣'),
('2♥', '4♥', '9♥', 'J♥', 'Q♥'),
('4♥', '7♥', '8♥', 'J♥', 'K♥'),
('4♣', '8♣', '9♣', 'J♣', 'Q♣'),
('5♦', '6♦', '7♦', '9♦', 'Q♦'),
('2♣', '3♣', '7♣', '8♣', 'J♣')],
'mastirida': [('7♠', '8♠', '9♠', 'J♠', 'Q♠'),
('6♦', '7♦', '8♦', '9♦', 'J♦'),
('7♣', '8♣', '9♣', 'J♣', 'Q♣')],
'nelik': [('2♦', '6♠', '6♣', '6♥', '6♦'),
('J♦', 'K♣', 'K♠', 'K♦', 'K♥'),
('8♣', '8♠', '8♦', '8♥', '9♣'),
('3♥', 'Q♠', 'Q♣', 'Q♥', 'Q♦'),
('5♥', '5♦', '5♠', '5♣', 'Q♥'),
('4♦', '6♠', '6♣', '6♥', '6♦'),
('2♥', '2♦', '2♠', '2♣', 'J♠'),
('3♣', '3♠', '3♦', '3♥', '5♥'),
('2♥', '2♦', '2♠', '2♣', '5♥'),
('8♣', '8♠', '8♦', '8♥', '9♦')],
'rida': [('3♠', '4♦', '5♠', '6♦', '7♥'),
('4♠', '5♥', '6♠', '7♣', '8♠'),
('8♥', '9♣', 'J♦', 'Q♣', 'K♦'),
('3♥', '4♥', '5♣', '6♥', '7♠'),
('2♣', '3♠', '4♦', '5♣', '6♠'),
('7♦', '8♣', '9♣', 'J♥', 'Q♦'),
('6♣', '7♥', '8♠', '9♠', 'J♥'),
('6♦', '7♥', '8♦', '9♦', 'J♣'),
('5♣', '6♦', '7♦', '8♦', '9♣'),
('4♠', '5♥', '6♦', '7♦', '8♣')],
'üks paar': [('3♣', '3♦', '7♦', 'J♠', 'K♣'),
('3♥', '5♠', '9♣', 'J♠', 'J♣'),
('2♠', '6♦', '7♣', '7♠', '9♦'),
('3♦', '4♦', '9♦', 'Q♣', 'Q♥'),
('3♣', '3♠', '4♦', '9♥', 'J♥'),
('6♠', '7♦', '9♥', '9♦', 'K♦'),
('4♠', '5♣', 'Q♠', 'K♣', 'K♦'),
('2♦', '8♠', '8♥', 'Q♥', 'K♣'),
('4♠', 'J♥', 'J♦', 'Q♣', 'K♦'),
('2♥', '6♣', '6♥', '9♠', 'J♦')]}
if __name__ == "__main__":
#from kaardid import k2si
testi(k2si, test_andmed)
# Tiimi liikmed: Marko, Anna-Maria, Rndo, Andrey
def paar(t1, t2, t3, t4, t5):
if (t1 == t2) or (t2 == t3) or (t3 == t4) or (t4 == t5):
return True
return False
def mast(t1,t2,t3,t4,t5):
if(t1 == t2) and (t2==t3) and (t3==t4) and (t4 == t5):
return True
return False
def maja(t1,t2,t3,t4,t5):
if (t1 == t2) and (t3 == t4 and t3 == t5):
return True
return False
def rida(t1,t2,t3,t4,t5):
t1=tugevus(t1)
t2=tugevus(t2)
t3=tugevus(t3)
t4=tugevus(t4)
t5=tugevus(t5)
if t2 - t1 == 1 and t3-t2 == 1 and t4 - t3 == 1 and t5 - t4 == 1:
return True
else:
return False
def tugevus(kaart):
taht = kaart[0]
if taht == "J":
return 10
elif taht == "Q":
return 11
elif taht == "K":
return 12
else:
return int(taht)
def mastirida(t1, t2, t3, t4, t5):
if(rida(t1[0],t2[0],t3[0],t4[0],t5[0]) and mast(t1[1],t2[1],t3[1],t4[1],t5[1])):
return True
else:
return False
def kaks_paari(t1, t2, t3, t4, t5):
if (t1 == t2) and (t3 == t4):
return True
if (t1==t2) and (t4==t5):
return True
if (t2==t3) and (t4==t5):
return True
else:
return False
def kolmik(t1, t2, t3, t4, t5):
if (t1==t2) and (t2==t3):
return True
if (t2==t3) and (t3==t4):
return True
if (t3==t4) and (t4==t5):
return True
else:
return False
def nelik(t1, t2, t3, t4, t5):
if (t1==t2) and (t2==t3) and (t3==t4):
return True
if (t2==t3) and (t3==t4) and (t4==t5):
return True
else:
return False
def k2si(kaart1, kaart2, kaart3, kaart4, kaart5):
if mastirida(kaart1, kaart2, kaart3, kaart4, kaart5):
return 'mastirida'
elif nelik(kaart1[0], kaart2[0], kaart3[0], kaart4[0], kaart5[0]):
return 'nelik'
elif maja(kaart1[0], kaart2[0], kaart3[0], kaart4[0], kaart5[0]):
return 'maja'
elif mast(kaart1[1], kaart2[1], kaart3[1], kaart4[1], kaart5[1]):
return 'mast'
elif rida(kaart1[0],kaart2[0],kaart3[0],kaart4[0],kaart5[0]):
return 'rida'
elif kolmik(kaart1[0], kaart2[0], kaart3[0], kaart4[0], kaart5[0]):
return 'kolmik'
elif kaks_paari(kaart1[0], kaart2[0], kaart3[0], kaart4[0], kaart5[0]):
return 'kaks paari'
elif paar(kaart1[0], kaart2[0], kaart3[0], kaart4[0], kaart5[0]):
return 'üks paar'
else:
return 'kõrge kaart'
# Siit edasi testid, mitte näppida!
def type_miss(type, hand_function, test_data, echo=True):
misses = 0
for hand in test_data[type]:
answer_given = hand_function(*hand)
if answer_given != type:
if echo: print(hand, 'on', repr(type), 'mitte', repr(answer_given))
misses += 1
if echo: print("")
return misses
def testi(hand_function, test_data):
test_count_total = 0
hit_perc = {}
for type in test_data.keys():
test_count = len(test_data[type])
test_count_total += test_count
hit_perc[type] = 1 - type_miss(type, hand_function, test_data) / test_count
print("\n\n----- Testide tulemused -----\n")
total_hit_perc = 0
for type in test_data.keys():
print("%11s: %5.1f%%" % (type, hit_perc[type] * 100))
total_hit_perc += hit_perc[type] * len(test_data[type]) / test_count_total
print("\nKokku: %.1f%%" % (total_hit_perc*100))
test_andmed = {'kaks paari': [('5♦', '5♣', 'J♠', 'J♣', 'Q♠'),
('4♥', '4♣', 'Q♠', 'Q♣', 'K♦'),
('6♠', '6♣', 'Q♣', 'Q♥', 'K♥'),
('2♦', '2♠', '3♠', '3♦', 'K♠'),
('2♦', '2♣', '4♦', 'J♦', 'J♠'),
('3♠', 'J♠', 'J♣', 'K♦', 'K♥'),
('5♠', '7♥', '7♠', 'Q♣', 'Q♥'),
('2♠', '4♥', '4♣', '9♠', '9♣'),
('7♣', '7♠', '8♦', 'Q♦', 'Q♥'),
('4♣', '4♠', '5♥', '5♦', 'K♦')],
'kolmik': [('4♠', '5♠', '7♥', '7♣', '7♠'),
('6♣', 'J♦', 'K♣', 'K♠', 'K♦'),
('6♥', 'J♥', 'J♠', 'J♣', 'K♠'),
('3♠', '3♦', '3♥', '6♥', 'J♣'),
('2♣', '6♣', '6♥', '6♦', '7♠'),
('2♠', 'J♠', 'J♦', 'J♣', 'Q♠'),
('2♥', '5♦', '7♥', '7♣', '7♦'),
('8♦', '8♠', '8♣', '9♣', 'J♥'),
('2♥', '2♠', '2♣', '5♦', '7♥'),
('3♦', '7♣', '9♠', '9♣', '9♦')],
'kõrge kaart': [('5♦', '6♥', '7♠', '9♦', 'J♣'),
('2♦', '3♣', '8♥', '9♣', 'K♠'),
('2♠', '5♣', '8♠', 'J♥', 'Q♣'),
('2♦', '4♥', '7♣', 'J♠', 'Q♦'),
('4♠', '5♦', '6♣', '9♣', 'J♥'),
('3♣', '5♥', '6♥', '8♥', '9♥'),
('3♣', '4♣', '7♦', '8♠', 'Q♠'),
('2♣', '5♥', '7♥', '9♣', 'J♣'),
('2♠', '4♠', '8♠', 'J♦', 'K♥'),
('4♦', '7♠', '8♣', 'Q♣', 'K♠')],
'maja': [('7♦', '7♣', 'Q♠', 'Q♥', 'Q♦'),
('7♠', '7♣', 'J♠', 'J♦', 'J♣'),
('7♥', '7♠', '9♠', '9♣', '9♥'),
('4♦', '4♣', 'Q♠', 'Q♣', 'Q♥'),
('3♠', '3♥', '8♣', '8♠', '8♥'),
('4♥', '4♣', '8♠', '8♦', '8♥'),
('2♥', '2♠', 'J♠', 'J♦', 'J♣'),
('5♦', '5♣', '7♦', '7♣', '7♠'),
('7♦', '7♠', '8♠', '8♦', '8♥'),
('5♥', '5♦', '7♥', '7♣', '7♠')],
'mast': [('4♦', '6♦', '8♦', 'J♦', 'Q♦'),
('3♣', '4♣', '7♣', '8♣', '9♣'),
('4♣', '7♣', '8♣', '9♣', 'K♣'),
('5♠', '6♠', '8♠', '9♠', 'K♠'),
('3♣', '5♣', '7♣', 'J♣', 'Q♣'),
('2♥', '4♥', '9♥', 'J♥', 'Q♥'),
('4♥', '7♥', '8♥', 'J♥', 'K♥'),
('4♣', '8♣', '9♣', 'J♣', 'Q♣'),
('5♦', '6♦', '7♦', '9♦', 'Q♦'),
('2♣', '3♣', '7♣', '8♣', 'J♣')],
'mastirida': [('7♠', '8♠', '9♠', 'J♠', 'Q♠'),
('6♦', '7♦', '8♦', '9♦', 'J♦'),
('7♣', '8♣', '9♣', 'J♣', 'Q♣')],
'nelik': [('2♦', '6♠', '6♣', '6♥', '6♦'),
('J♦', 'K♣', 'K♠', 'K♦', 'K♥'),
('8♣', '8♠', '8♦', '8♥', '9♣'),
('3♥', 'Q♠', 'Q♣', 'Q♥', 'Q♦'),
('5♥', '5♦', '5♠', '5♣', 'Q♥'),
('4♦', '6♠', '6♣', '6♥', '6♦'),
('2♥', '2♦', '2♠', '2♣', 'J♠'),
('3♣', '3♠', '3♦', '3♥', '5♥'),
('2♥', '2♦', '2♠', '2♣', '5♥'),
('8♣', '8♠', '8♦', '8♥', '9♦')],
'rida': [('3♠', '4♦', '5♠', '6♦', '7♥'),
('4♠', '5♥', '6♠', '7♣', '8♠'),
('8♥', '9♣', 'J♦', 'Q♣', 'K♦'),
('3♥', '4♥', '5♣', '6♥', '7♠'),
('2♣', '3♠', '4♦', '5♣', '6♠'),
('7♦', '8♣', '9♣', 'J♥', 'Q♦'),
('6♣', '7♥', '8♠', '9♠', 'J♥'),
('6♦', '7♥', '8♦', '9♦', 'J♣'),
('5♣', '6♦', '7♦', '8♦', '9♣'),
('4♠', '5♥', '6♦', '7♦', '8♣')],
'üks paar': [('3♣', '3♦', '7♦', 'J♠', 'K♣'),
('3♥', '5♠', '9♣', 'J♠', 'J♣'),
('2♠', '6♦', '7♣', '7♠', '9♦'),
('3♦', '4♦', '9♦', 'Q♣', 'Q♥'),
('3♣', '3♠', '4♦', '9♥', 'J♥'),
('6♠', '7♦', '9♥', '9♦', 'K♦'),
('4♠', '5♣', 'Q♠', 'K♣', 'K♦'),
('2♦', '8♠', '8♥', 'Q♥', 'K♣'),
('4♠', 'J♥', 'J♦', 'Q♣', 'K♦'),
('2♥', '6♣', '6♥', '9♠', 'J♦')]}
if __name__ == "__main__":
testi(k2si, test_andmed)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment