Проект Эйлера, задача 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 шт):

Автор решения: Интик

Если ты решил и ответ подошёл, то можно посмотреть чужие решения там на форуме.решения на питоне присутствуют.

https://projecteuler.net/thread=42

→ Ссылка
Автор решения: YanaC

Треугольное число вычисляется по формуле:

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)
→ Ссылка