Ответ 1
- Сначала сделайте все буквы:
- 'aez' станет 1,5,26
- Сделать эти переменные чисел называемыми... X3, X2, X1
- 26 будет X1, 5 будет X2, 1 будет X3 (обратите внимание, справа налево)
Теперь для магической формулы:
Закодировано примерами и демонстрирует скорость даже в худшем случае:
def comb(n,k): #returns combinations
p = 1 #product
for i in range(k):
p *= (n-i)/(i+1)
return p
def solve(string):
x = []
for letter in string:
x.append(ord(letter)-96) #convert string to list of integers
x = list(reversed(x)) #reverse the order of string
#Next, the magic formula
return x[0]+sum(comb(26,i)-comb(26-x[i-1]+1,i)*(1-i/(26-x[i-1]+1)) for i in range(2,len(x)+1))
solve('bhp')
764.0
>>> solve('afkp')
3996.0
>>> solve('abcdefghijklmnopqrstuvwxyz')
67108863.0
>>> solve('hpz')
2090.0
>>> solve('aez')
441.0
>>> if 1:
s = ''
for a in range(97,97+26):
s += chr(a)
t = time.time()
for v in range(1000):
temp = solve(s)
print (time.time()-t)
0.1650087833404541
Чтобы понять мое объяснение этой формуле, мне нужно перейти к математическому вхождению в треугольник паскаля и теорему бинома:
Вот треугольник паскаля:
Переходя сверху справа налево, сначала есть последовательность из 1s. Затем последовательность счетных чисел. Следующая последовательность - это сумма чисел подсчета. Они известны как треугольные числа. Следующая последовательность представляет собой сумму треугольных чисел, называемых тетраэдрическими числами, и эта картина продолжается и продолжается.
Теперь для биномиальной теоремы:
Объединив биномиальную теорему и треугольник парабол, можно видеть, что n-е треугольное число:
и n-е тетраэдрическое число:
сумма первых n тетраэдрических чисел:
и далее...
Теперь для объяснения. Для этого объяснения я буду использовать только 6 букв, а-f и заменяю их цифрами 1-6. Процедура такая же, как и с другими буквами
Если длина равна 1, то возможные последовательности:
1
2
3
4
5
6
В этом ответе просто значение
Теперь для длины 2:
12 13 14 15 16
23 24 25 26
34 35 36
45 46
56
Чтобы решить эту проблему, мы разделим ее на 3 части:
- Найти общее количество элементов в строках выше
- В этом случае в первой строке есть 5 элементов, 4 - во втором, 3 в третьем и так далее. Нам нужно найти способ суммирования первых n элементов последовательности (5,4,3,2,1). Для этого мы вычитаем треугольные числа. (1 + 2 + 3 + 4 + 5) - (1 + 2 + 3) = (4 + 5). Аналогично (1 + 2 + 3 + 4 + 5) - (1 + 2) = 3 + 4 + 5. Поэтому это значение равно:
-
- В этом случае в первой строке есть 5 элементов, 4 - во втором, 3 в третьем и так далее. Нам нужно найти способ суммирования первых n элементов последовательности (5,4,3,2,1). Для этого мы вычитаем треугольные числа. (1 + 2 + 3 + 4 + 5) - (1 + 2 + 3) = (4 + 5). Аналогично (1 + 2 + 3 + 4 + 5) - (1 + 2) = 3 + 4 + 5. Поэтому это значение равно:
- Теперь мы учли значения выше нашей цели и интересуемся только столбцом, в котором он находится. Чтобы найти это, добавим x1-x2
- Наконец, нам нужно добавить количество длин 1 последовательности. Это равно 6. Поэтому наша формула:
-
Далее мы повторим для последовательностей длины 3:
123 124 125 126
134 135 136
145 146
156
234 235 236
245 246
256
345 346
356
456
Мы снова разделим эту проблему на шаги:
- Найдите количество элементов над каждым массивом. Значения массивов - это треугольники с обратным треугольником (10, 6, 3, 1). На этот раз вместо вычитания треугольных чисел вычитаем тетраэдральные числа:
-
- Обратите внимание, как каждый отдельный массив имеет форму последовательности длиной 2. Вычитая x3 из x1 и x2, мы уменьшаем последовательность до степени 2. Например, мы вычитаем 2 из второго массива
Это
234 235 236
245 246
256
становится
12 13 14
23 24
34
- Теперь мы можем использовать формулу длины 2 с 6-x3 вместо 6, поскольку наши последовательности теперь имеют другое максимальное значение
-
- Наконец, мы добавим общее число последовательностей длины 1 и длины 2. Оказывается, существует образец того, сколько последовательностей определенной длины есть. Ответ - это комбинации. Существуют последовательности
длины 1,
длины 2 и т.д.
Объединяя их, наша общая формула для длины 3 становится:
Мы можем следовать этой схеме редукции для более длинных последовательностей
Теперь мы выберем наши формулы для поиска шаблонов:
Длина 1: y1
Длина 2:
Длина 3:
Примечание. Я также использовал длину 4, чтобы убедиться, что удержанные шаблоны
С небольшим количеством математики, группировки терминов и изменением от 6 до 26 наша формула становится:
Чтобы упростить это, нужно сделать больше математики.
Это тождество справедливо для всех a и b. Для быстрого осуществления упражнений докажите это (не очень сложно):
Это тождество позволяет в дальнейшем группировать и отрицать термины для достижения нашей значительно упрощенной формулы: