From a3308b1f796d29d2aaaa07a0509a172eabf0f8e6 Mon Sep 17 00:00:00 2001 From: KalenikAI Date: Sun, 20 Dec 2020 17:42:54 +0300 Subject: [PATCH] It's addition files for Lesson 1 --- task_1.py | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ task_2.py | 23 ++++++++++++++++ task_3.py | 26 ++++++++++++++++++ task_4.py | 38 ++++++++++++++++++++++++++ task_5.py | 69 ++++++++++++++++++++++++++++++++++++++++++++++++ task_6.py | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++ task_7.py | 9 +++++++ 7 files changed, 321 insertions(+) create mode 100644 task_1.py create mode 100644 task_2.py create mode 100644 task_3.py create mode 100644 task_4.py create mode 100644 task_5.py create mode 100644 task_6.py create mode 100644 task_7.py diff --git a/task_1.py b/task_1.py new file mode 100644 index 00000000..835c283b --- /dev/null +++ b/task_1.py @@ -0,0 +1,79 @@ +""" +Задание 1. + +Для каждой из трех задач выполнить следующее: + +1) для каждой инструкции рядом в комментарии определите сложность этой инструкции +2) определите сложность алгоритма в целом + +укажите сложность непосредственно в этом файле +точки, где нужно поработать вам, отмечены знаком '!!!' + +Примечание: +Если у вас возникают сложности, постарайтесь подумать как можно решить задачу, +а не писать "мы это не проходили)". +Алгоритмизатор должен развивать мышление, а это прежде всего практика. +А без столкновения со сложностями его не развить. +""" + +import random + + +############################################################################################# +def check_1(lst_obj): + """Функция должна создать множество из списка. + + Алгоритм 3: + Создать множество из списка + + Сложность: !!!. + """ + lst_to_set = set(lst_obj) # !!! + return lst_to_set + + +############################################################################################# +def check_2(lst_obj): + """Функция должная вернуть True, если все элементы списка различаются. + + Алгоритм 1: + Проходимся по списку и для каждого элемента проверяем, + что такой элемент отстутствует + в оставшихся справа элементах + + Сложность: !!!. + """ + for j in range(len(lst_obj)): # !!! + if lst_obj[j] in lst_obj[j+1:]: # !!! + return False # !!! + return True # !!! + + +############################################################################################# +def check_3(lst_obj): + """Функция должная вернуть True, если все элементы списка различаются. + + Алгоритм 2: + Вначале выполним для списка сортировку, далее, сравниваем элементы попарно + Если присутствуют дубли, они будут находиться рядом. + + Сложность: !!! + """ + lst_copy = list(lst_obj) # !!! + lst_copy.sort() # !!! + for i in range(len(lst_obj) - 1): # !!! + if lst_copy[i] == lst_copy[i+1]: # !!! + return False # !!! + return True # !!! + +############################################################################################# + + +for j in (50, 500, 1000, 5000, 1000): + # Из 100000 чисел возьмем 'j' случайно выбранных + # Всего 10 тыс. чисел + lst = random.sample(range(-100000, 100000), j) + +print(check_1(lst)) +print(check_2(lst)) +print(check_3(lst)) diff --git a/task_2.py b/task_2.py new file mode 100644 index 00000000..08db1492 --- /dev/null +++ b/task_2.py @@ -0,0 +1,23 @@ +# Задание 2. +# Реализуйте два алгоритма. +# Первый, в виде функции, должен обеспечивать поиск минимального значения для списка. +# В основе алгоритма должно быть сравнение каждого числа со всеми другими элементами списка. +# Сложность такого алгоритма: O(n^2) - квадратичная. +# Второй, в виде функции, должен обеспечивать поиск минимального значения для списка. +# Сложность такого алгоритма: O(n) - линейная. + +# 1 +import random as rnd +int_list = [rnd.randint(0, 1000) for p in range(0, 20)] +print(int_list) +result = int_list[0] +for el in int_list: + if result > el: + result = el +print(result) + +# 2 +import random as rnd +int_list = [rnd.randint(0, 1000) for p in range(0, 20)] +print(int_list) +print(sorted(int_list)[0]) diff --git a/task_3.py b/task_3.py new file mode 100644 index 00000000..372f085c --- /dev/null +++ b/task_3.py @@ -0,0 +1,26 @@ +""" +Сама задача: +Имеется хранилище с информацией о компаниях: название и годовая прибыль. +Для реализации хранилища можно применить любой подход, +который вы придумаете, например, реализовать словарь. +Реализуйте поиск трех компаний с наибольшей годовой прибылью. +Выведите результат. +""" + +# 1 +dict_profit = {} +dict_company = {'Yarl' : 3460, 'Quark' : 4000, 'Cityland' : 2690, 'Ion': 1000, 'Drink': 8000, 'Drank' : 34000, 'Cross' : 4500} +values = sorted(dict_company.values())[-4 : -1] +for el in dict_company.items(): + for val in values: + if el[1] == val: + dict_profit.update({el}) +print(dict_profit) + + +# 2 +dict_profit = {} +dict_company = {'Yarl' : 3460, 'Quark' : 4000, 'Cityland' : 2690, 'Ion': 1000, 'Drink': 8000, 'Drank' : 34000, 'Cross' : 4500} +values = sorted(dict_company.values())[-4 : -1] +[dict_profit.update({el}) for el in dict_company.items() for val in values if el[1] == val] +print(dict_profit) diff --git a/task_4.py b/task_4.py new file mode 100644 index 00000000..1dc64c29 --- /dev/null +++ b/task_4.py @@ -0,0 +1,38 @@ +""" +Задание 4. +Сама задача: +Пользователи веб-ресурса проходят аутентификацию. +В системе хранятся логин, пароль и отметка об активации учетной записи. +Нужно реализовать проверку, может ли пользователь быть допущен к ресурсу. +При этом его учетка должна быть активирована. +А если нет, то польз-лю нужно предложить ее пройти. +Приложение должно давать ответы на эти вопросы и быть реализовано в виде функции. +Для реализации хранилища можно применить любой подход, +который вы придумаете, например, реализовать словарь. +""" + +# 1 способ +dict_logins = {'alex' : ['Password1', False], 'bob' : ['Password2', False], 'john' : ['Password3', True], 'helen' : ['Password4', True]} +login = input('Please provide login: ').lstrip().rstrip().lower() +password = input('Please provide password: ').lstrip().rstrip() + +def authentificate (login, password): + login_info = dict_logins.get(login) + if login_info[0] != password: + print(f'You pvided wrong password. Bye') + return + if dict_logins.get(login)[1] == False: + answer_activate = input(f'You should acvate you login. Do it? Yes/No: ').lower() + if answer_activate == 'yes': + login_info[1] = True # activate login + dict_logins.update({login:login_info}) # put info dict + else: + print(f'You login {login} is activated. Welcome.') + return + +authentificate (login, password) +print(dict_logins) + +# 2 способ +# не придумал + diff --git a/task_5.py b/task_5.py new file mode 100644 index 00000000..cdb74727 --- /dev/null +++ b/task_5.py @@ -0,0 +1,69 @@ +""" +Задание 6. +Задание на закрепление навыков работы со стеком + +Примечание: в этом задании вспомните ваши знания по работе с ООП +и опирайтесь на пример урока + +Реализуйте структуру "стопка тарелок". + +Мы можем складывать тарелки в стопку и при превышении некоторого значения +нужно начать складывать тарелки в новую стопку. + +Структура должна предусматривать наличие нескольких стеков. +Создание нового стека происходит при достижении предыдущим стеком порогового значения. +Реализуйте по аналогии с примером, рассмотренным на уроке, необходимые методы, +для реализации это структуры, добавьте новые методы (не рассмотренные в примере с урока) +для реализации этой задачи. + +После реализации структуры, проверьте ее работу на различных сценариях +""" + +class StackClass: + def __init__(self, size): + self.size = size + self.curr_size = 0 + self.elems = [] + + def push(self, el): + if self.curr_size == self.size: + return False + self.elems.append(el) + self.curr_size += 1 + return True + + def pop(self): + self.curr_size -= 1 + return self.elems.pop() + + def get(self, indx): + if indx >= self.get_size(): + return None + else: + return self.elems[indx] + + def get_size(self): + return len(self.elems) + + def __str__(self): + return str([elem for elem in self.elems]) + +if __name__ == '__main__': +# Fill stacks + import random as rnd + SC_OBJ = [] # Stack array + SC_OBJ.append(StackClass(2)) + indx = 0 + for num in range(0, 30): + if SC_OBJ[indx].push(rnd.randint(1, 100)) == False: + SC_OBJ.append(StackClass(2)) + indx += 1 + else: + SC_OBJ[indx].push(rnd.randint(1, 100)) +# Read stacks and every component + for el in SC_OBJ: + print(el) + for indx in range(0, el.get_size()): + print(el.get(indx)) + + diff --git a/task_6.py b/task_6.py new file mode 100644 index 00000000..c8d1b260 --- /dev/null +++ b/task_6.py @@ -0,0 +1,77 @@ +""" +Задание 7. +Задание на закрепление навыков работы с очередью +Реализуйте структуру "доска задач". +Структура должна предусматривать наличие несольких очередей задач, например +1) базовой, откуда задачи берутся, решаются и отправляются в список решенных +2) очередь на доработку, когда нерешенные задачи из первой очереди отправляются +на корректировку решения +После реализации структуры, проверьте ее работу на различных сценариях +""" +class QueueClass: + def __init__(self): + self.elems = [] + + def is_empty(self): + return self.elems == [] + + def append(self, item): + self.elems.append(item) + + def extract(self, indx): + return self.elems.pop(indx) + + def size(self): + return len(self.elems) + + def __str__(self): + return str([elem for elem in self.elems]) + +if __name__ == '__main__': + queue_main = QueueClass() # Главная + queue_done = QueueClass() # Выполненные задачи + queue_change = QueueClass() # Требуется корректировка + + # Loading tasks into queue_main + import random as rnd + for i in range(0, 21): + queue_main.append(rnd.randint(1, 100)) + + # Moving tasks from queue_main to queue_done if task has been done + for i in range(0, 20, 2): + if queue_main.size() <= i: + break + elif queue_main.is_empty() != True: + queue_done.append(queue_main.extract(i)) + else: + print(f'Main queue is empty') + + # Moving tasks from queue_main to queue_change if task required review + for i in range(0, 20, 2): + if queue_main.size() <= i: + break + elif queue_main.is_empty() != True: + queue_change.append(queue_main.extract(i)) + else: + print(f'Main queue is empty') + + # Check if everuthing was done + if queue_main.is_empty() == True: + print(f'Your main queue is empty') + if queue_change.is_empty() == True: + print(f'Congratulation you have solved all your tasks') + else: + print(f'You have tasks for review {queue_change}') + else: + print(f'Your have not solved {queue_main.size()} tasks') + print(f'Thare are all {queue_main}') + print(f'Your have solved {queue_done} tasks') + print(f'Thare are task for review {queue_change}') + + + + + + + + diff --git a/task_7.py b/task_7.py new file mode 100644 index 00000000..34d96703 --- /dev/null +++ b/task_7.py @@ -0,0 +1,9 @@ +""" +Задание 5. +Задание на закрепление навыков работы с деком +В рассмотренном на уроке листинге есть один недостаток +Приведенный код способен "обработать" только строку без пробелов, например, 'топот' +Но могут быть и такие палиндромы, как 'молоко делили ледоколом' +Вам нужно доработать программу так, чтобы она могла выполнить проверку на палиндром +и в таких строках (включающих пробелы) +"""