Как определить стрит (последовательность) в покерной руке в Python - PullRequest
0 голосов
/ 24 мая 2018

В питоне у меня есть счетчик очков покерной руки.

Возможные ранги карт:

A23456789TJQK

Стриты из 3 или более карт дают по 1 на карту.Пример прямой из 4 карт дает вам 4 очка.

Итак, у меня есть оценка:

score = 0

A отсортировано список строк (такМне не нужно беспокоиться о картах в конце списка, имеющих прямую с началом), представляющих ряды карт моей конкретной руки:

L4
['6', '8', '8', '9', 'T']
# Note: 8, 9, T is a straight. So I want to add 3 to score

Но как я могу определить, есть ли у меня стрит??

Что я пробовал до сих пор:

Я пытался преобразовать строки в целые числа, но что мне делать с T, J, K, Q и A?Они не числа.

При использовании строк я получаю сообщение об ошибке:

for i in range(len(L4) - 1):
   if(L4[i] is L4[i + 1] + 1):
      sC = sC + 1
if(sC >= 3):
   score += sC


L4
['6', '8', '8', '9', 'T']
Traceback (most recent call last):
  File "myFile.py", line 66, in <module>
    if(L4[i] is L4[i + 1] + 1):
TypeError: must be str, not int

Должен ли я преобразовать их в целые или использовать другой способ?Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 24 мая 2018

Вы можете найти все подстроки текущей руки и отфильтровать результаты, чтобы найти те, которые отсортированы с шагом 1:

def stringify_result(f):
  def wrapper(_d):
    cards = {10:'T', 11:'J', 12:'Q', 13:'K'}
    return list(map(lambda x:cards.get(x, str(x)), f(_d)))
  return wrapper

@stringify_result
def has_straight(d):
  cards = {'J': 11, 'K': 13, 'T': 10, 'Q': 12}
  subs = list(filter(None, [d[b:i] for i in range(len(d)+1) for b in range(len(d)+1)]))
  possibilities = list(filter(lambda x:all(x[i+1] - x[i] == 1 for i in range(len(x)-1)), [[int(cards.get(b, b)) for b in i] for i in subs]))
  return [] if not possibilities else max(possibilities, key=len)

straight = has_straight(['6', '8', '8', '9', 'T'])
score = len(straight)

Вывод:

['8', '9', 'T']
3

Изменить: для учета нескольких прогонов, вы можете использовать itertools.groupby:

import itertools
def has_straight(d):
   cards = {'J': 11, 'K': 13, 'T': 10, 'Q': 12}
   mutated_cards = list(map(lambda x:int(cards.get(x, x)), d))
   _grouped = [list(b) for _, b in itertools.groupby(mutated_cards)]
   subs = list(filter(None, [_grouped[b:i] for i in range(len(_grouped)+1) for b in range(len(_grouped)+1)]))
   final_filtered = list(filter(lambda x:all(x[i+1][0] - x[i][0] == 1 for i in range(len(x)-1)), subs))
   new_subs = [] if not final_filtered else max(final_filtered, key=lambda x:sum(len(i) for i in x))
   return sum(len(i) for i in new_subs if len(i) > 1), list(map(lambda x:x[0], new_subs))

print(has_straight(['6', '8', '8', '9', 'T']))
print(has_straight(['4', '4', '5', '5', '6']))

Выход:

(2, [8, 9, 10])
(4, [4, 5, 6])
...