Найдите самый большой палиндром, состоящий из произведения двух чисел 3-di git, используя numpy - PullRequest
0 голосов
/ 03 августа 2020

Я застрял на этом вопросе, когда пытался решить его с помощью пакета numpy. Моя идея заключалась в том, что я умножу и сохраню список всех вычислений, которые я сделал для 3-х ди git чисел в диапазоне от 100 до 999, а затем просмотрел бы список, чтобы увидеть, какие из них являются палиндромом, и сохранить их. Наконец, заказал бы список и получил бы самый большой палиндром. Код ниже показывает, что я пытался сделать.

import numpy as np

def void():
    list1 = np.array(range(100,999))
    list2 = np.array(range(100,999))
    k = []
    
    for i,j in zip(list1,list2):
        k.append(np.multiply(list1,list2))
        
    b = []
    
    for x in range(0,len(k)):
        if(reverseNum(k[x])==k[x]):
            b.append(k[x])
            
    print(b)
    print(b[-1])
    
def reverseNum(num):
    rev = 0
    
    while(num>0):
        rem = num % 10
        rev = (rev*10) +rem
        num = num // 10
        
    return rev  
    
void()

Однако, когда я пытаюсь проверить, являются ли числа в списке палиндромом, я получаю следующую ошибку:

Traceback (most recent call last):                                                                                    
  File "main.py", line 40, in <module>                                                                                
    void()                                                                                                            
  File "main.py", line 22, in void                                                                                    
    if(reverseNum(k[x]),k[x]):                                                                                        
  File "main.py", line 31, in reverseNum                                                                              
    while(num>0):                                                                                                     
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()  

Означает ли это, что нельзя использовать numpy как метод решения этой проблемы? Если это так, то в чем я ошибаюсь?

РЕДАКТИРОВАТЬ: То, что я пробовал до сих пор (с тех пор, как его спросили): на основе сообщений об ошибках я попытался вместо этого использовать np.equal, а также np.greater проверки if(reverseNum(k[x])==k[x]) и num>0, но дает ту же ошибку.

Ответы [ 4 ]

1 голос
/ 04 августа 2020

A NumPy способ, предполагающий, что результат состоит из шести цифр (больше не может быть, так как 999 2 равно 998001):

import numpy as np

v = np.arange(100, 1000)                     # the range of three-digit numbers
a = np.outer(v, v)                           # all the products
print(a[(a // 100000 == a % 10) &            # first digit == sixth digit
        (a // 10000 % 10 == a // 10 % 10) &
        (a // 1000 % 10 == a // 100 % 10)].max())

Выводит 906609.

Двойная проверка с чистым Python:

>>> max(x*y
        for x in range(100, 1000)
        for y in range(100, 1000)
        if str(x*y) == str(x*y)[::-1])
906609
1 голос
/ 04 августа 2020

Ваша проблема связана с вашей строкой, содержащей zip. Мой код ниже некрасивый, но он пытается вольно следовать вашему подходу.

import numpy as np

def void():
    list1 = np.array(range(100,1000))  # you want to include '999'
    list2 = np.array(range(100,1000))
    k = []
    
    for i,j in zip(list1,list2):
        k.append(np.multiply(list1,j))
        
    b = []
    
    for r, row in enumerate(k):
        for c, cell in enumerate(row):
            if reverseNum(cell)==cell:
                b.append(cell)
            
    print(b)
    print(max(b))

    
def reverseNum(num):
    rev = 0
    
    while(num>0):
        rem = num % 10
        rev = (rev*10) +rem
        num = num // 10
        
    return rev
    
void()
0 голосов
/ 04 августа 2020

Другой реальный NumPy решение, используя свой путь, чтобы полностью изменить номера (фиксируя его в основном с помощью .any() как предложено в сообщении об ошибке, которое вы упорно не попробовать).

v = np.arange(100, 1000)
a = np.outer(v, v)

num = a.copy()
rev = num * 0
while (m := num > 0).any():
    rev[m] = rev[m] * 10 + num[m] % 10
    num[m] //= 10

print(a[rev == a].max())

Без маски m вы получите тот же результат (906609), но с ней безопаснее. В противном случае продукты с пятью цифрами не перевернуты правильно, например, 101 * 102 = 10302 становится 203010 вместо 20301.

0 голосов
/ 03 августа 2020

Почему он должен использовать numpy?

# test if palindrome based on str
def is_palindrome(number: int):
    converted_to_string = str(number)
    return converted_to_string == converted_to_string[::-1]


# product of two three-digit numbers
you_right = []
values = []
for x in range(999, 99, -1):
    for y in range(999, 99, -1):
        product = x*y
        if is_palindrome(product):
            values.append((x, y))
            you_right.append(product)
winner = you_right.index(max(you_right))
print(values[winner])
# output
(993, 913)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...