Project Euler 4 Python со словарем, который добавляет цифры к ответам - PullRequest
0 голосов
/ 17 сентября 2018

Мне удается решить четвертую задачу Project Euler, и я хочу сделать еще один шаг, не только найдя ответ, но и присвоив ему соответствующие 3-значные умножающие цифры. Я в основном хочу назначить соответствующие кратные значения для палиндрома, т.е. {палиндром: цифра1 цифра2}. это цифра 1 * цифра 2 = палиндром.

Для тех из вас, кто не прошел Project Euler, вот вопрос:

Палиндромное число читается одинаково в обоих направлениях. Самый большой палиндром, созданный из произведения двух двузначных чисел, равен 9009 = 91 × 99. Найдите самый большой палиндром, созданный из произведения двух трехзначных чисел.

ns = str(n)
ns_list = []
ns_list_to_int = []
#outside for loop with first 3-digit 'num' and inside loop with second 3-digit 'i'
for num in range (100,1000):
    for i in range(100,1000):
        n = i*num

#need to convert to string & check if reverse of string == string, if so append to list
        ns = str(n)
        if ns[::-1] == ns:
            ns_list.append({ns:str(i) + ' 'str(num) })

#recreate new list with integers to sort
for i in ns_list:
    ns_list_to_int.append(int(i))

#sort in descending order and call the first number 
ns_list_to_int = sorted(stuffs, key=int, reverse=True)
ns_list_to_int[0]

пытался получить его с помощью ns_list.append ({ns: str (i) + '' str (num)}), но, похоже, это не работает. Кроме того, не уверен, как тогда я смог бы отсортировать его, если это словарь.

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Вместо добавления только продукта (вашей переменной ns), вы можете добавить кортеж / список / объект, который содержит не только палиндромное число, но также и два кратных.

Затем все, что вам нужно изменить дальшевниз - функция сортировки.

Быстрый и грязный пример:

ns_list = []
ns_list_to_int = []
#outside for loop with first 3-digit 'num' and inside loop with second 3-digit 'i'
for num in range (100,1000):
    for i in range(100,1000):
        n = i*num

#need to convert to string & check if reverse of string == string, if so append to list
        ns = str(n)
        if ns[::-1] == ns:
            pint = int(ns) # convert palindrome to int
            t = (i,num,pint) # all the info you need for later
            ns_list.append(t)


#sort in descending order and call the first number
ns_list_to_int = sorted(ns_list, key=lambda x:x[2], reverse=True) # sorting by the palindrome
ns_list_to_int[0]
0 голосов
/ 17 сентября 2018

Простой подход состоит в том, чтобы заменить ns_list на dict, а затем заменить ns_list.append(ns) на ns_dict[num, i] = ns.

В качестве альтернативы, чтобы сохранить палиндромы как итеративный компонент верхнего уровня, вы можете сохранить всепары, которые произвели определенный палиндром в list, используя collections.defaultdict(list) для упрощения кода:

from collections import defaultdict

ns_dict = defaultdict(list)

#outside for loop with first 3-digit 'num' and inside loop with second 3-digit 'i'
for num in range(100,1000):
    for i in range(100,1000):
        n = i*num
        ns = str(n)
        if ns[::-1] == ns:
            ns_dict[ns].append((num, i))

Теперь, когда вы выполняете итерацию ns_dict, вы можете увидеть все пары, которые вы проверили, которые произвели, чтопалиндром:

ns_list_with_factors = sorted(ns_dict.items(), key=lambda x: int(x[0]), reverse=True)
print(ns_list_with_factors[0])  # Displays both number and the pairs that produced it

for ns, pairs in ns_dict.items():
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...