Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2022, 19:58   #1
Vital_runner
Новичок
Джуниор
 
Регистрация: 22.12.2022
Сообщений: 1
По умолчанию Сколько раз выйдет 21 в игре 21 очко?

Алмаз играет в 21. Стоимость карт в очках: туз — 11 очков (также туз может засчитываться за 1), король — 4 очка, дама — 3 очка, валет — 2 очка, остальные — по номиналу. Используется колода из 36 карт.
Сколько существует вариантов у Алмаза за 3 карты собрать 21 очко? Порядок карт в варианте не учитывать.

Постоянно жалуется на int, я уже не могу.

Код:
from itertools import product
s=0   #подсчитать сумму, то что 21
cnt=0 # подсчитать к-во 21, чтоб потом ответ дать
for i in product("67890ВДКТ",repeat=3): #чтобы по 3 карты выдавало, в-валет д-дама к-король т-туз
   a="".join(i)    #чтобы не парится с ," а не то product их выдаёт
   for c in range(0,2):  #идея была в том, что будет именные карты в очки переводить
      if a[c]=="В":
         s=s+2
      elif a[c]=="К":
         s=s+4
      elif a[c]=="Д":
         s=s+3
      elif a[c]=="Т":
         s=s+11
      else:
         s=s+a[c]
                                                     
   if s==21:
      cnt+=1
   else:
      s=0
print(cnt)

Последний раз редактировалось BDA; 22.12.2022 в 22:37.
Vital_runner вне форума Ответить с цитированием
Старый 22.12.2022, 22:54   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от Vital_runner Посмотреть сообщение
Постоянно жалуется на int, я уже не могу.
Код:
s=s+int(a[c])
Но тут есть и другие ошибки: сумму s нужно сбрасывать для каждой тройки, product тут не подходит (каждая карта в колоде уникальна, а product этого не учитывает).
Можно проще (если не учитывать того, что туз может быть или 1, или 11):
Код:
from itertools import combinations
print(sum(sum(i) == 21 for i in combinations([2, 3, 4, 6, 7, 8, 9, 10, 11] * 4, 3)))
А если учитывать, что туз может быть 1 или 11:
Код:
from itertools import combinations

def is_21(i):
    s = [0]
    for c in i:
        if c == 11:
            s = [x + 1 for x in s] + [x + 11 for x in s]
        else:
            s = [x + c for x in s]
    return 21 in s

print(sum(is_21(i) for i in combinations([2, 3, 4, 6, 7, 8, 9, 10, 11] * 4, 3)))
Хотя, наверное, можно как-то более изящно это учесть.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 22.12.2022 в 23:36.
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
21 очко fearie C++ Builder 0 18.05.2012 22:26
новинки Intel (когда выйдет новый процессор)? Dimarik Компьютерное железо 2 12.03.2012 22:38
Игра в 21 очко ! Александр I Win Api 0 27.12.2011 02:51
Сколько денег можно заработать на онлайн-игре? mr.allty Gamedev - cоздание игр: Unity, OpenGL, DirectX 13 28.04.2011 17:11
Delphi 2009 скоро выйдет Ozerich Софт 27 31.08.2008 15:45