Проект Эйлера, задача 42
Решил порешать задачи с проекта Эйлера, наткнулся на интересную задачу (https://euler.jakumo.org/problems/view/42.html). Написал вот такой вот код, но понимаю что он далеко не оптимален, поэтому хочу попросить вас по возможности оптимизировать его или сократить. Если хотите, прикрепите свое решение, спасибо.
def triangle_number(index):
return int(0.5 * index * (index + 1))
triangle_words = []
alpha = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
with open(r'C:\Users\user\Desktop\p042_words.txt') as file:
my_obj = [i for i in file.readline().split('"') if i != '' and i != ',']
my_obj.sort()
for i in my_obj:
score = 0
for j in i:
score += alpha.index(j) + 1
temp = []
for g in range(1, score):
temp.append(triangle_number(g))
if score in temp:
triangle_words.append(i)
break
print(triangle_words)
Ответы (2 шт):
Если ты решил и ответ подошёл, то можно посмотреть чужие решения там на форуме.решения на питоне присутствуют.
Треугольное число вычисляется по формуле:
T = n(n+1)*(1/2)
Если раскрыть скобки, то получится обычное квадратное уравнение:
n^2 + n - 2T = 0
Для того, чтобы корень этого уравнения был целым числом, нужно, чтобы корень из дискриминанта был целым, то есть (1+8Т) должен быть идеальным квадратом и при извлечении корня давать остаток, равный 0.
Мой вариант решения.
counter = 0
with open('p042_words.txt', 'r') as f:
data = [x.strip(' "') for x in f.read().split(',')]
for word in data:
x = (sum(ord(i) - 64 for i in word))
if (8 * x + 1) ** 0.5 % 1 == 0:
counter += 1
print(counter)