H. А роза упала на лапу Азора 7.0

Напишите функцию is_palindrome, которая принимает натуральное число, строку, кортеж или список, а возвращает логическое значение: True — если передан палиндром, а в противном случае — False.

Примечание

Ваше решение должно содержать только функции.
В решении не должно быть вызовов требуемых функций.

Для определения типа параметра можно воспользоваться функцией type или более продвинутой isinstance.

Пример

Ввод

result = is_palindrome(123)

Вывод

result = False

Ввод

result = is_palindrome([1, 2, 1, 2, 1])

Вывод

result = True

Решение

Довольно интересная задачка – подготовка к следующей теме. Уже знакомые нам алгоритмы определения палиндромов, под новым соусом – нам на вход могут дать число, строку или список. C каждым из этих типов мы уже умеем работать и определять является ли объект палиндромом. Таким образом, вся задача сводится к определению типа данных, которые мы получили в качестве входных данных и приведению их к универсальному виду, чтобы реализовывать меньше вариантов определения “палиндромности” объекта.

Давайте подумаем, каким образом мы можем определить является ли число палиндромом. С одной стороны, если число целое можно использовать алгоритм из задачи P. А роза упала на лапу Азора 2.0. С другой стороны, этот алгоритм не сработает с числом с плавающей запятой и придется его заметно модифицировать. Но, если, к примеру преобразовать число в строку, то можно использовать подход из E. А роза упала на лапу Азора 4.0.
Нам с вами еще не доводилось решать эту задачу с точки зрения списков, но так как и списки и строки объекты итерируемые, а принципы работы с итерируемыми объектами в python схожи, мы можем просто развернуть наш список срезом и проверить его на равенство самому себе до разворота. Фактически мы описали алгоритм решения из E. А роза упала на лапу Азора 4.0.

Таким образом, наша задача сводится к приведению любых числовых типов данных к строке с последующим сравнением результата с его развернутой копией.

Посмотреть код

Решение

Python
def is_palindrome(test):
    if isinstance(test, int) or isinstance(test, float):
        test = str(abs(test))
    return test == test[::-1]
Подписаться
Уведомить о
guest
2 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
nmalkam
19.12.2023 11:54

Обрадовался пошёл переписывать для плавающей запятой.

в условиях задачи только натуральные числа)))

def is_palindrome(arg: str | int | tuple | list | float) -> bool:
“””А роза упала на лапу Азора 7.0″””
if isinstance(arg, tuple):
arg = str(arg[0])
if isinstance(arg, int | float):
arg = str(arg)
if arg == arg[::-1]:
return True
return False

не могу пройти 10 тест.

по условиям функция может принимать кортеж
ваш код не проходит данный тест

assert is_palindrome(tuple([-13231])) == False

Пока писал разобрался в своей ошибке.

Так и не научился создавать кортежи))

assert is_palindrome(-13231, ) == False
Правильный вариант.
Понял свою ошибку благодаря вашему коду.
Изначально приводил все типы к спискам.

def is_palindrome(arg: str | int | tuple | list) -> bool:
if isinstance(arg, int):
arg = str(arg)
return arg == arg[::-1]