Привет всем. Для тех кто не знает проект Эйлера, это сборник задач по программированию, задачи с которого можно решать на любом языке программирования. Обычно задачи решают, люди, которые хотят прокачать свои скиллы в программировании, или просто любители решать такие, задачки, это своего рода решать кроссворды. Ссылка на проект в оригинале (на английском): https://projecteuler.net/problem=22
Ссылка проект (русский язык): https://euler.jakumo.org/problems/view/22.html
Итак приведу, условия задачи в статье:
Используйте names.txt (щелкнуть правой кнопкой мыши и выбрать 'Save Link/Target As...'), текстовый файл размером 46 КБ, содержащий более пяти тысяч имен. Начните с сортировки в алфавитном порядке. Затем подсчитайте алфавитные значения каждого имени и умножьте это значение на порядковый номер имени в отсортированном списке для получения количества очков имени.
Например, если список отсортирован по алфавиту, имя COLIN (алфавитное значение которого 3 + 15 + 12 + 9 + 14 = 53) является 938-ым в списке. Поэтому, имя COLIN получает 938 × 53 = 49714 очков.
Какова сумма очков имен в файле?
Шаг 1: Подгтовка данных, для нормальной работы.
После скачивания файла names.txt нужно переименовать файл в names.py, далее откроем этот файл в любом текстовом редакторе. Весь массив данных в этом файле мы должны заключить в стандартный список python. В самом начале файла напишем massiv = [ тут следуют наши имена]. Не забудьте поставить закрывающую скобку в самом конце файла. Теперь все именна, это лишь стандартный список, и мы можем получить доступ к любому имени по индексу. Например massiv[100] и т.д
Шаг 2: Сортировка массива в алфовитном порядке.
Создаем новый файл main.py в той же папке, что и файл names.py.
Первой строчкой импортируем наш массив из файла names.py для этого в пропишем код:
from names import massiv
Теперь мы можем спокойно работать с именами и они нам не мешают, т.к находятся в другом файле.
Сортируем массив:
sort_massiv = sorted(massiv)
Мы использовали стандартную функцию sorted()
Шаг 3: # генерируем словарь типа {A:1 ... Z:26}
Нам нужен словарь, где каждой букве алфовита будет соответстовать цифра, указывающая порядок этой буквы в алфивите. Например A:1, B:2 и т.д
Код:
import string
alfovit = {y: x + 1 for(x, y) in enumerate(string.ascii_lowercase.upper())}
Библиотека string нужна для string.ascii_lowercase. Выполните инструкцию print(string.ascii_lowercase) и на экран выведится abcdefghijklmnopqrstuvwxyz т.е весь английский алфовит. Это удобно, мы используем этот трюк, чтобы вручную не печатать алфовит и экономить место. Заметьте, все имена в файле names.py написаны прописными буквами, поэтому мы применяем функцию upper(), которая переводит любую строку в верхний регистр. Функция emumerate() генерирует кортежи, состоящие из двух элементов - индекса элемента и самого элемента. Мы в генираторе списка проходим по латинскому алфовиту, x в данном случаи это индекс элемента, мы прибавляем еденицу, чтобы отсчет шел не с нуля, а с еденицы. 'y ' у нас это сам элемент.
Шаг 4: функция подсчета алфовитного значения имени
Для подсчета алфовитного значения имени, мы должны перемножить значение, каждой буквы этого слова. Какому числу соостветствует каждая буква, мы знаем, т.к на предыдущем шаге получили словарь, где каждой букве соответствует цифра. Напишем функцию, которая будет получать в качестве аргумента слово, а возвращать будет его афловитное значение.
def alfavit_value(word):
return sum([alfovit[x] for x in word if x in alfovit])
С помощью генератора списка мы проверяем есть ли буква в alfovit, разумеется она там будет, далее мы помещаем в список число соответствующее этой букве. С помощью функции sum мы получаем сумму всех элементов списка.
Шаг 5: генерируем список алфовитных значений каждого слова
Настало время применить функцию alfavit_value() к каждому элементу отсортированного массива:
gen = [alfavit_value(x) for x in sort_massiv]
Шаг 6: умножаем каждый элемент списка на номер его позиции в списке
gen1 = [y*(x+1) for (x, y) in enumerate(gen)]
Шаг 7: подсчитываем итоговую сумму всех очков имен и выводим результат
result = sum(gen1)
print(result)
Итак полный код:
from test import massiv
from functools import reduce
import string
# сортируем массив входных данных
sort_massiv = sorted(massiv)
# генерируем словарь типа {A:1 ... Z:26}
alfovit = {y: x + 1 for(x, y) in enumerate(string.ascii_lowercase.upper())}
# функция подсчета алфовитного значения имени
def alfavit_value(word):
return sum([alfovit[x] for x in word if x in alfovit])
# генерируем список алфовитных значений каждого слова
gen = [alfavit_value(x) for x in sort_massiv]
# умножаем каждый элемент списка на номер его позиции в списке
gen1 = [y*(x+1) for (x, y) in enumerate(gen)]
# подсчитываем итоговую сумму всех очков имен
result = sum(gen1)
print(result)