# ======================================================================================================================

# Author: BERKYT

# ======================================================================================================================

import random

from abc import ABC, abstractmethod


class TaskException(Exception):
    pass


class Task(ABC):
    @abstractmethod
    def get_info():
        pass
    
    @abstractmethod
    def get_task():
        pass    
    
    @abstractmethod
    def input_respounse(task, respounse):
        pass


class Example:
    class TaskExample(Task):
        def get_info():
            return 'Напишите сложение чисел 1 + 1'

        def get_task():
            return (1, 1)

        def input_respounse(*, task, respounse):
            if sum(task) != respounse: 
                raise TaskException('Задание решено неверно!')
            else:
               print(f'Ваш ответ: {respounse=}\nВы справились с заданием! Переходите дальше.')


class LessonTwo:
    class Task_1(Task):
        def get_info():
            return 'Проверить, является ли последовательность цифрами?'

        def get_task():
            alphabet = 'abcdefghijklmnopqrstuvwxyz' 
            length = random.randint(5, 25)
            return ''.join([str(random.randint(0, 9)) for _ in range(length)]) if random.randint(0, 1) else ''.join([random.choice(alphabet) for _ in range(length)])

        def input_respounse(*, task, respounse):
            if task.isdigit() is not respounse: 
                raise TaskException('Задание решено неверно!')
            else:
                print(f'Ваш ответ: {respounse=}\nВы справились с заданием! Переходите дальше.')

    class Task_2(Task):
        def get_info():
            return 'Найти последний элемент в списке'

        def get_task():
            length = random.randint(5, 25)
            return [random.randint(-10, 10) for _ in range(length)]

        def input_respounse(*, task, respounse):
            if task[-1] != respounse: 
                raise TaskException('Задание решено неверно!')
            else:
                print(f'Ваш ответ: {respounse=}\nВы справились с заданием! Переходите дальше.')

    class Task_3(Task):
        def get_info():
            return 'Разбить строку на список по запятым'

        def get_task():
            return '255.255.255.0,255.255.255.128,255.255.255.192,255.255.255.224,255.255.255.240'

        def input_respounse(*, task, respounse):
            if task.split(',') != respounse: 
                raise TaskException('Задание решено неверно!')
            else:
                print(f'Ваш ответ: {respounse=}\nВы справились с заданием! Переходите дальше.')

    class Task_4(Task):
        def get_info():
            return 'Заменить в строке слова "ЗАМЕНИ" на "***"'

        def get_task():
            return 'Язык характеризуется логичным синтаксисом, ЗАМЕНИ вследствие чего исходный код программ, написанных «на питоне», ЗАМЕНИ легко читается и воспринимается.'

        def input_respounse(*, task, respounse):
            if task.replace('ЗАМЕНИ', '***') != respounse: 
                raise TaskException('Задание решено неверно!')
            else:
                print(f'Ваш ответ: {respounse=}\nВы справились с заданием! Переходите дальше.')

    class Task_5(Task):
        def get_info():
            return 'Узнать длину списка'

        def get_task():
            length = random.randint(5, 25)
            return [random.randint(-10, 10) for _ in range(length)]

        def input_respounse(*, task, respounse):
            if len(task) != respounse: 
                raise TaskException('Задание решено неверно!')
            else:
                print(f'Ваш ответ: {respounse=}\nВы справились с заданием! Переходите дальше.')

    class Task_6(Task):
        def get_info():
            return 'Найти где находится слово "НАЙДИ"'

        def get_task():
            return 'Язык характеризуется логичным синтаксисом, вследствие чего НАЙДИ исходный код программ, написанных «на питоне», легко читается и воспринимается.'

        def input_respounse(*, task, respounse):
            if task.find('НАЙДИ') != respounse: 
                raise TaskException('Задание решено неверно!')
            else:
                print(f'Ваш ответ: {respounse=}\nВы справились с заданием! Переходите дальше.')


class LessonThree:
    class Task_1(Task):
        def get_info():
            return 'С помощью встроенных функций создать список'
        
        def get_task():
            return list

        def input_respounse(*, task, respounse):
            if isinstance(respounse, task): 
                print(f'Ваш ответ: {respounse=}\nВы справились с заданием! Переходите дальше.')
            else:
                raise TaskException('Задание решено неверно!')

    class Task_2(Task):
        def get_info():
            return 'Проверить, все ли числа в списке больше 0'
        
        def get_task():
            res = []

            for _ in range(10):
                res.append(1 if random.randint(0,10) else 0)

            return res

        def input_respounse(*, task, respounse):
            if all(task) is respounse: 
                print(f'Ваш ответ: {respounse=}\nВы справились с заданием! Переходите дальше.')
            else:
                raise TaskException('Задание решено неверно!')

    class Task_3(Task):
        def get_info():
            return 'Проверить, есть ли в списке хоть одно число больше 0'

        def get_task():
            res = []

            for _ in range(10):
                res.append(1 if not random.randint(0,10) else 0)

            return res

        def input_respounse(*, task, respounse):
            if any(task) is respounse: 
                print(f'Ваш ответ: {respounse=}\nВы справились с заданием! Переходите дальше.')
            else:
                raise TaskException('Задание решено неверно!')

    class Task_4(Task):
        def get_info():
            return 'Найти минимальное значение в списке'
        
        def get_task():
            res = []

            for _ in range(10):
                res.append(random.randint(-100,100))

            return res

        def input_respounse(*, task, respounse):
            if min(task) == respounse: 
                print(f'Ваш ответ: {respounse=}\nВы справились с заданием! Переходите дальше.')
            else:
                raise TaskException('Задание решено неверно!')

    class Task_5(Task):
        def get_info():
            return 'Найти сумму элементов в списке'

        def get_task():
            return [x for x in range(random.randint(5, 40))]
        
        def input_respounse(*, task, respounse):
            if sum(task) == respounse: 
                print(f'Ваш ответ: {respounse=}\nВы справились с заданием! Переходите дальше.')
            else:
                raise TaskException('Задание решено неверно!')

    class Task_6(Task):
        def get_info():
            return 'Выполнить сортировку списка'

        def get_task():
            alphabet = 'abcdefghijklmnopqrstuvwxyz' 
            return [random.randint(-10, 10) for _ in range(10)] if random.randint(0, 1) else [random.choice(alphabet) for _ in range(10)]
    
        def input_respounse(*, task, respounse):
            if sorted(task) == respounse: 
                print(f'Ваш ответ: {respounse=}\nВы справились с заданием! Переходите дальше.')
            else:
                raise TaskException('Задание решено неверно!')

    class Task_7(Task):
        def get_info():
            return 'Найти максимальное значение в списке'
        
        def get_task():
            res = []

            for _ in range(10):
                res.append(random.randint(-100,100))

            return res

        def input_respounse(*, task, respounse):
            if max(task) == respounse: 
                print(f'Ваш ответ: {respounse=}\nВы справились с заданием! Переходите дальше.')
            else:
                raise TaskException('Задание решено неверно!')
