오일러 프로젝트 22 번

오일러 프로젝트 22 번

여기 5천개 이상의 영문 이름들이 들어있는 46KB짜리 텍스트 파일 names.txt 이 있습니다 (우클릭해서 다운로드 받으세요).
이제 각 이름에 대해서 아래와 같은 방법으로 점수를 매기고자 합니다.

먼저 모든 이름을 알파벳 순으로 정렬합니다.
각 이름에 대해서, 그 이름을 이루는 알파벳에 해당하는 숫자(A=1, B=2, ..., Z=26)를 모두 더합니다.
여기에 이 이름의 순번을 곱합니다.
예를 들어 "COLIN"의 경우, 알파벳에 해당하는 숫자는 3, 15, 12, 9, 14이므로 합이 53, 그리고 정렬했을 때 938번째에 오므로 최종 점수는 938 × 53 = 49714가 됩니다.

names.txt에 들어있는 모든 이름의 점수를 계산해서 더하면 얼마입니까?

http://euler.synap.co.kr/prob_detail.php?id=21

텍스트 파일의 주소는 http://euler.synap.co.kr/files/names.txt 이다. ‘A’의 아스키코드는 65인데(ord('A')) 이 글자의 값이 1 이므로 특정한 글자의 값은 ord(c) - 64가 된다.

from urllib.request import urlopen

def process(s:str) -> int:
    return sum(ord(c) - 64 for c in s)

def main():
    names = [x.strip('"') 
             for x in urlopen('http://euler.synap.co.kr/files/names.txt')
                         .read().decode().split(',')]

    print(sum((i + 1) * process(n) for i, n in enumerate(sorted(names))))

%time main()
#871198282
#Wall time: 77 ms