Python Itertools: сложный продукт

1+3+9 = 13 = 1+3 = 4.
6+1+1+5 = 13 = 1+3 = 4.
9+9+4 = 22 = 2+2 = 4.
etc

Учитывая предыдущие примеры, можно было бы сказать, что возможности приведения к числу 4 доходят до бесконечности. Тем не менее, МОЖНО контролировать количество цифр, которые входят в исходную игру сумм.

def reduct(length):
    ...
    ...
    return reduction

Ребята, у вас есть идея, как я мог бы закодировать такую ​​​​функцию? Я хочу ввести «длину» и, предположив, что это, например, 7, и предположив, что конечное сокращение равно 5, я хочу, чтобы он сделал это:

x+x+x+x+x+x+x = 5.

Где это дает мне ВСЕ ВОЗМОЖНОСТИ для чисел x.

Я потратил слишком много времени, пытаясь решить проблему, и я не мог понять, как это сделать. Кстати, это очень хорошее упражнение по программированию (хороший вызов); Я всем очень благодарна за помощь.


person Ericson Willians    schedule 17.04.2013    source источник
comment
какой предел длины? Вы хотите все решение или только количество?   -  person marcadian    schedule 17.04.2013
comment
Длина будет указана в параметре raw_input. Это может быть любое число. Итак, я хотел бы знать, как будет работать функция с любой длиной, просто чтобы посмотреть, как она будет работать :).   -  person Ericson Willians    schedule 17.04.2013
comment
Вы говорите, что нет ограничений по длине?   -  person marcadian    schedule 17.04.2013


Ответы (1)


Мне удалось придумать решение (при условии, что itertools уже импортировано):

def reduct(length, n=5):
    return [i for i in \
            itertools.combinations_with_replacement(range(1, 10), length) \
            if ((sum(i) - 1) % 9 + 1) == n]

Это возвращает все уникальные комбинации, которые «сокращаются» до n, что по умолчанию равно 5.


Объяснение:

  • itertools.combinations_with_replacement(range(1, 10), length) дает все уникальные комбинации length однозначных чисел (кроме 0). См. документацию.
  • ((sum(i) - 1) % 9 + 1) дает "сокращение" каждой комбинации. Он использует формулу цифрового корня ((n - 1) % 9 + 1, где n представляет собой сумму чисел в комбинации.
  • Остальное понятно (надеюсь).

Некоторые тестовые прогоны:

>>> reduct(2)
[(1, 4), (2, 3), (5, 9), (6, 8), (7, 7)]
>>> reduct(3)
[(1, 1, 3), (1, 2, 2), (1, 4, 9), (1, 5, 8), (1, 6, 7), (2, 3, 9),
 (2, 4, 8), (2, 5, 7), (2, 6, 6), (3, 3, 8), (3, 4, 7), (3, 5, 6),
 (4, 4, 6), (4, 5, 5), (5, 9, 9), (6, 8, 9), (7, 7, 9), (7, 8, 8)]
>>> len(reduct(7))
715

Указание пользовательского n:

>>> reduct(2, 8)
[(1, 7), (2, 6), (3, 5), (4, 4), (8, 9)]
>>> reduct(3, 8)
[(1, 1, 6), (1, 2, 5), (1, 3, 4), (1, 7, 9), (1, 8, 8), (2, 2, 4),
 (2, 3, 3), (2, 6, 9), (2, 7, 8), (3, 5, 9), (3, 6, 8), (3, 7, 7),
 (4, 4, 9), (4, 5, 8), (4, 6, 7), (5, 5, 7), (5, 6, 6), (8, 9, 9)]
>>> len(reduct(7, 8))
715
person Volatility    schedule 17.04.2013
comment
@EricsonWillians не беспокойтесь. Это был интересный вызов! - person Volatility; 17.04.2013
comment
@Вим, да. На самом деле я не знал об этом, пока не прочитал его в другом сообщении SO (к сожалению, сейчас не могу его найти). Это довольно изящно. - person Volatility; 17.04.2013