2016-03-10 3 views
1

Мне нужна программа, которая выбирает четыре карты из колоды и вычисляет их сумму.
Обратите внимание, что ace = 1, jack = 11, queen = 12 и king = 13. После вычисления их суммы проверьте, равна ли эта сумма 24. Если это так, запишите это. В конце концов, программа должна отображать количество комбинаций, которые дают в сумме 24.Выберите четыре карты и проверьте, соответствуют ли они 24 - Python

Вот что у меня есть:

def selfour(): 
    total = 0 

    cards = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 
      1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 
      1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 
      1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] 

    for a in range(52): 
     for b in range(1, 52): 
      for c in range(2, 52): 
       for d in range(3, 52): 
        print(cards[a], cards[b], cards[c], cards[d]) 
        if (cards[a] + cards[b] + cards[c] + cards[d]) == 24: 
         total += 1 

    return total 


def main(): 
    print(selfour()) 

main() 

Я не слишком уверен, что если эта программа дать правильный ответ, но неэффективен. Если кто-нибудь может помочь сделать этот код более эффективным, это будет здорово. Я вполне уверен, что это не дает правильного ответа, поэтому помощь в этом тоже будет отличной.

Thanks

+0

правильный ответ 1291? – Goodies

+0

, вы можете посмотреть https://docs.python.org/2/library/itertools.html#itertools.combinations, чтобы заменить ваши вложенные циклы. –

+0

Одна проблема с кодом заключается в том, что пока вы (правильно) не имеете a, b, c, d всех равных (индекс карты) 0, все они могут быть равны (индекс карты) 3, 4, 5, 6 и т. Д. –

ответ

8

Itertools - ваш друг. Вы можете сделать это в один лайнер:

import itertools 

cards = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 
     1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 
     1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 
     1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] 

def selfour(): 
    return sum(sum(i) == 24 for i in itertools.combinations(cards, 4)) 
+1

'sum (sum (i) == 24 для i в itertools.combinations (cards, 4))' –

+1

@PadraicCunningham ответил слишком быстро. У вас чище. Редактирование. – Eli

1

Вы думаете о карты не равны друг другу, но вы не совсем получить его.

for a in range(52): 
    for b in range(1, 52): 

должно быть что-то вроде:

for a in range(52): 
    for b in range(52): 
     if b == a: 
      continue 

Там есть модуль называется itertools, который имеет combinations, что делает то, что вы хотите. С ним ваши вложенные для петель могут стать:

from itertools import combinations 
for a in combinations(cards, 4): 
    if sum(a) == 24: 
     total += 1 
0

Я не 100% уверен, что это правильно, но я был в состоянии сделать:

from itertools import combinations 
def sel(it, cnt=4, val=24): 
    return sum(sum(_) == val for _ in combinations(it, cnt)) 

cards = # ... 
print(sel(cards, 4, 24)) # => 12517 

Edit: К сожалению, я уверен, новые ответы были опубликованы. Я писал это, как только он появился, но отвлекся, прежде чем я разместил его.

0

Это то, что я в конечном итоге, используя для кода:

import itertools 

cards = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 
      1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 
      1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 
      1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] 
def selfour(): 
    total = 0 
    for z in itertools.combinations(cards, 4): 
     if sum(z) == 24: 
      total += 1 

    return total 


def main(): 
    print(selfour()) 

main() 

Благодаря помощи пользователей, этот код является гораздо более эффективным и чистым.

Кроме того, другие новички могут легко следовать этому в случае необходимости -

-Спасибо