diff --git a/lesson01/home_work/hw01_easy.py b/lesson01/home_work/hw01_easy.py index d662da7a1..ca10bbb8a 100644 --- a/lesson01/home_work/hw01_easy.py +++ b/lesson01/home_work/hw01_easy.py @@ -1,10 +1,59 @@ + +#coding utf-8 + +menu = input("Выберите подпрограмму. [1] - Задача 1, [2] - задача 2, [3] - задача 3") + + # Задача-1: Дано произвольное целое число, вывести поочередно цифры исходного числа -# код пишем тут... +if menu == "1": #вход в задачу 1 + num = 7650987 + num = str(num) + i = 0 + + while i < len(num): + print(num[i]) + i = i + 1 + +#конец задачи 1 # Задача-2: Исходные значения двух переменных запросить у пользователя. # Поменять значения переменных местами. Вывести новые значения на экран. # Не нужно решать задачу так: print("a = ", b, "b = ", a) - это неправильное решение! +elif menu == "2": #Вход в задачу 2 + x = input("Введите значение Х --- ") + y = input("Введите значение Y --- ") + + temp = x + x = y + y = temp + + print("X= ", x, "Y= ", y) + + + +#Конец задачи 2 + # Задача-3: Запросите у пользователя год рождения. Если ему есть 18 лет, выведите: "Доступ разрешени", # иначе "Извините, пользование данным ресурсом только с 18 лет" + +elif menu == "3": #Вход в задачу 3 + userAge = input("Сколько вам лет? (вводите значение цифрами)") + + if userAge.isdecimal() == True: + + if int(userAge) >= 18: + print("Доступ разрешен. Добро пожаловать!") + + else: + print("В доступе отказано, вам необходимо подрасти") + + else: + print("Введено недопустимое значение") + +#Конец задачи 3 + + +else: #Если введено не то что ожидалось + print("Введено недопустимое значение") diff --git a/lesson01/home_work/hw01_hard.py b/lesson01/home_work/hw01_hard.py index cc8eb525b..128cb9d28 100644 --- a/lesson01/home_work/hw01_hard.py +++ b/lesson01/home_work/hw01_hard.py @@ -1,3 +1,5 @@ +#coding utf-8 + # Задание-1: # Ваня набрал несколько операций в интерпретаторе и получал результаты: # Код: a == a**2 @@ -7,3 +9,9 @@ # Код: a > 999999 # Результат: True # Вопрос: Чему была равна переменная a, если точно известно что её значение не изменялось? + +a = float('inf') + +print(a == a**2) +print(a == a*2) +print(a > 9999999999) diff --git a/lesson01/home_work/hw01_normal.py b/lesson01/home_work/hw01_normal.py index b46c55e58..b0e2e1700 100644 --- a/lesson01/home_work/hw01_normal.py +++ b/lesson01/home_work/hw01_normal.py @@ -1,11 +1,88 @@ -# Задача-1: Дано произвольное целое число, вывести самую большую цифру этого числа +#coding utf-8 +import math +menu = input("Выберите подпрограмму. [1] - Задача 1, [2] - задача 2, [3] - задача 3") + + +#Задача-1: Дано произвольное целое число, вывести самую большую цифру этого числа + +if menu == "1": #вход в задачу 1 + num = 7650987 + num = str(num) + maxNum = 0; + i = 0 + + while i < len(num): + print(num[i]) + if maxNum < int(num[i]): + maxNum = int(num[i]) + i = i + 1 + print("MAX число: ", maxNum) +#конец задачи 1 # Задача-2: Исходные значения двух переменных запросить у пользователя. # Поменять значения переменных местами. Вывести новые значения на экран. # Решите задачу используя только две переменные +elif menu == "2": #Вход в задачу 2 + x = input("Введите значение Х --- ") + y = input("Введите значение Y --- ") + +#с строками это не прокатит + #y = x + y + #x = y - x + #y = y - x + +#можно так + + y = x + y + x = y[len(x):len(y)] + y = y[:-len(x)] + + +#А можно и так + #x,y = y,x + + print("X= ", x, "Y= ", y) + + +# в CS50 был алгоритм через побитовый ^, но я не додумался как его применить к строкам + + +#Конец задачи 2 + # Задача-3: Напишите программу, вычисляющую корни квадратного уравнения вида ax2 + bx + c = 0. # Для вычисления квадратного корня воспользуйтесь функицй sqrt() молудя math # import math # math.sqrt(4) - вычисляет корень числа 4 + +elif menu == "3": #Вход в задачу 3 + #Уже больше 10 лет не видел квадратное уравнение + a = float(input("Введите число а -- ")) + b = float(input("Введите чило b -- ")) + c = float(input("Введите число c -- ")) + + D = b**2 - 4*a*c + + if D > 0: + + x1 = (-b + math.sqrt(b**2 - 4*a*c)) / (2*a) + x2 = (-b - math.sqrt(b**2 - 4*a*c)) / (2*a) + + print("X1 = ", x1, " X2 = ", x2) + + elif D == 0: + + x1 = -(b/(2*a)) + print("X1 = X2= ", x1) + + + else: + print("Нет корней") + +#Вроде правильная формула, есть конечно еще формулы на проверку четного B, думаю в программе это не нужно +#Конец задачи 3 + + +else: #Если введено не то что ожидалось + print("Введено недопустимое значение") diff --git a/lesson02/home_work/hw02_easy.py b/lesson02/home_work/hw02_easy.py index eec707139..b2a8857c6 100644 --- a/lesson02/home_work/hw02_easy.py +++ b/lesson02/home_work/hw02_easy.py @@ -1,3 +1,7 @@ + + +menu = input("Выберите подпрограмму. [1] - Задача 1, [2] - задача 2, [3] - задача 3") + # Задача-1: # Дан список фруктов. Напишите программу, выводящую фрукты в виде нумерованного списка выровненного по правой сторне # Пример: @@ -10,9 +14,81 @@ # Подсказка: использует метод .format() +if menu == "1": + + spisok = ["Яблоко", "Банан", "Киви", "Арбуз", "Груша", "Дыня"] + + max_string = 0; + + for item in spisok: + + if len(item) >= max_string: + max_string = len(item) + + + for item_spisok in spisok: + + num = spisok.index(item_spisok) + 1 + formating = "{0:>" + str(max_string) + "}" #а почему не рекомендуется склеивать строки через +? + + print(str(num) + ".", formating .format(item_spisok)) + +#Что-то внутри меня говорит о том что могло быть все проще +#конец задачи 1 + + # Задача-2: # Даны два произвольные списка. Удалите из первого списка элементы присутствующие во втором списке + +elif menu == "2": + + spisok1 = ["set1", "set2", "set3", "set4", "set3", "set6"] + spisok2 = ["set6", "item1", "set3", "item2", "set3"] + + print("список 1: ", spisok1) + print("список 2: ", spisok2) + + for item in spisok2: + for item2 in spisok1: + if item == item2: + spisok1.remove(item) + print("удалено: ", item) + +# видимо эту задачу надо было решать через множества, но так как у нас произвольные списки и нам нельзя из них делать +# множества ввиду того что в списке может быть повторяющийся эллемент, я решил делать так. + + + + + + +#Конец задачи 2, а мне начинают нравится циклы For в Python :) + # Задача-3: # Дан произвольный список из целых чисел. Получите НОВЫЙ список из элементов исходного выполнив следующие условия: # если элемент кратный двум, то разделить его на 4, если не кратен, то умножить на два. + +elif menu == "3": + + spisok1 = [2, 4, 11, 15, 22, 17, 84, 142] + spisok2 = [] + + for item in spisok1: + if item % 2 == 0: + spisok2.append(item/4) + else: + spisok2.append(item*2) + print(spisok2) + + +else: + print("Введено неверное значение") + + + + + + + + diff --git a/lesson02/home_work/hw02_hard.py b/lesson02/home_work/hw02_hard.py index 090c09e6d..e8a50800d 100644 --- a/lesson02/home_work/hw02_hard.py +++ b/lesson02/home_work/hw02_hard.py @@ -1,9 +1,53 @@ +#coding: utf-8 + + +menu = input("Выберите подпрограмму. [1] - Задача 1, [2] - задача 2, [3] - задача 3") + # Задание-1: уравнение прямой вида y = kx - b задано ввиде строки. # Определить координату y, точки с заданной координатой x -equation = 'y = -12x + 11111140.2121' -x = 2.5 -# вычислите и выведите y +if menu =="1": + + equation = 'y = -12x + 11111140.2121' + x = 2.5 + + + # вычислите и выведите y + # проверяем является-ли строка числом, честно загугленная функция, + # но я делал похожее только сложнее + # + + def isfloat(value): + try: + float(value) + return True + except ValueError: + return False + + + # Разбираем строку на элементы + equList = equation.split(' ') + + # проходим по строке и определяем кто у нас кто + for item in equList: + + # Если в эллементе у нас есть Х значит это КХ из уравнения и нам надо его разобрать и присвоить переменной k значение + if item.find("x") != -1: + + if isfloat(item[:item.find('x')]): # надо наверное было использовать isinstance + k = float(item[:item.find('x')]) + continue + # В уравнении может быть смена знака и нам надо это понимать + if item == '+': + oper = -1 + continue + # Ну и проверяем последний эллемент он вообще число? если да присваиваем его переменной b + if isfloat(item): + b = float(item) + + y = (k * x) - (oper * b) + print(y) + # Задание-2: Дата задана в виде строки формата 'dd.mm.yyyy', проверить корректно ли введена дата # Условия коррекности: @@ -13,12 +57,74 @@ # 4. Длина исходной строки для частей должна быть в соответствии с форматом (т.е. 2 - для дня, 2- месяц, 4 -год) # Пример корректной даты -date = '01.11.1985' +#date = '01.11.1985' # Примеры некорректных дат -date = '01.22.1001' -date = '1.12.1001' -date = '-2.10.3001' +#date = '01.22.1001' +#date = '1.12.1001' +#date = '-2.10.3001' + +elif menu == "2": + + def test_date(testdate): + + datelist = testdate.split('.') + + # а у нас вообще получилос 3 эллемента в предоставленной строке? + if len(datelist) != 3: + return False + + + # проверяем на грубые ошибки, строка слишком длинная, + # недостаток или избыток символов в эллементах ( тут грубая проверка) вообще ввели не число поставили 00 в дне или году + for item in datelist: + if item.isdigit(): + if int(item) <= 0: + return False + elif len(item) > 4 or len(item) < 2: + return False + + + else: + return False + # ну если мы прошли первую проверку теперь проверяем более подробно + # Назначаем переменные (можно без них, и я так и начал делать пока окончательно код не перестал читаться) + day = datelist[0] + month = datelist[1] + year = datelist[2] + + # проверим день у нас вообще меньше 31 дня + if int(day) > 31 or len(day) != 2: + return False + + # проверяем месяц у нас вообще такой может быть? + if int(month) > 12 or len(month) != 2: + return False + # Ну и проверяем количество чисел в году + if len(year) != 4: + return False + + # список в котором храним номер месяца в котором будет 30 дней, февраль сюда же запихнул + motnth30day = [2, 4, 6, 9, 11] + + # Осталось проверить может ли в этом месяце быть столько дней + + for i in motnth30day: + if i == int(month) and int(day) > 30: + return False + else: + continue + + # Ура добрался можно возвращать true + return True + + + date = '31.08.1985' + + print(test_date(date)) + + + # Задание-3: "Перевернутая башня" (Задача олимпиадного уровня) # @@ -45,4 +151,122 @@ # Выход: 6 2 # # Вход: 11 -# Выход: 5 3 \ No newline at end of file +# Выход: 5 3 + +elif menu == "3": + #ПЕРВЫЙ ВАРИАНТ КОДА, НЕМНОГО РАЗОБРАВШИСЬ И ПООБЩАВШИСЬ С НАСТАВНИКОМ БЫЛ СДЕЛАН БОЛЕЕ БЫСТРЫЙ И УНИВЕРСАЛЬНЫЙ ВАРИАНТ + # Кажется тут слишком много переменных, можно было бы уменьшить + + # числа минимум и максимум области поиска + # minNum = 1 + # maxNum = 1 + # + # blok = 1 # номер блока в котором ищем число + # + # ryad = 1 # ряд в котором ищем число + # + # # Диапозон рядов в блоке + # minRyad = 1 + # maxRyad = 1 + # + # stolb = 1 # Позиция числа слева от края + # + # num = 1 # переменная для хранения чисел + # + # x = int(input("введите номер искомой комнаты: --- ")) # искомое число + # + # i = 0 # Счетчик цикла + # + # # Не могу избавиться от привычки обьявлять переменные в начале программы + # + # # считаем в каком блоке искомое число + # + # while num <= x: + # + # while i < blok: + # minNum = num + # maxNum = (minNum + blok ** 2) - 1 + # ryad = ryad + (blok - 1) + # minRyad = ryad + # maxRyad = minRyad + (blok - 1) + # i += 1 + # num = minNum + blok ** 2 + # + # blok += 1 + # + # blok -= 1 # так как вычисление блока в котором заперта искомая комната останавливается на следующем блоке, + # # надо вычесть единицу чтоб знать свой номер блока + # + # + # # ищем ряд в котором находится число + # # начинаем искать ряд в котором находится наше число + # # каждый проход мы делаем по диапозону максимального и минимального номера нашей комнаты + # + # while ryad < maxRyad and (minNum + blok) <= x: + # + # if minNum + blok <= x: + # ryad += 1 + # minNum = minNum + blok + # + # # определяем позицию от края + # # Тут все просто + # + # stolb = x - minNum + 1 + # + # # выводим результат + # print("{0} {1} ".format(ryad, stolb)) + +#ВТОРОЙ ВАРИАНТ ПОСЛЕ ОПТИМИЗАЦИИ И НЕКОТОРОГО ПЕРЕСМОТРА АЛГОРИТМА ДЕЙСТВИЙ + + def seach_block(numberRoom): + + block = 1 # блок на котором мы находимся + startRoom = 1 # номер комнаты с которой начинается блок + + floor = 1 # Номер этажа на старте блока + # нет смысла указывать сколько комнат на этаже и сколько комнат в блоке, + # так как на этаже у нас номер блока, а в блоке бок**2, + # зачем это хранить если можно вычислять на лету + + # начинаем искать нужный блок в котором наше число + # вычисляем ((startRoom + block**2) - 1) что дает нам номер конечной комнаты + + while numberRoom >= ((startRoom + block ** 2)): + startRoom = startRoom + block ** 2 + floor = floor + block + block += 1 + + # мы нашли нужный блок + + # Начинаем искать этаж и номер стартовой комнаты на этаже + + # Благодаря Python тут можно воспользоваться особенностью кортежей и сразу вычислить номер этажа и номер стартовой комнаты этого этажа + # floor + ((numberRoom - startRoom) // block) - вычисляет сумму номера стартового этажа и целой части коэфициента удаленности комнаты от начальной комнаты в блоке + # Да можно было сделать все это разбив на несколько переменных, но мне почему-то так кажется эллегантнее, хоть сама строка кажется монструозной + + startRoom, floor = \ + ((floor + ((numberRoom - startRoom) // block)) - floor) * block + startRoom, \ + floor + ((numberRoom - startRoom) // block) + + numberPosition = (numberRoom - startRoom) + 1 + + return floor, numberPosition + + + print(seach_block(123456789111)) + #Кстати этот код спокойно вычисляет позицию комнаты гораздо больше чем 2 000 000 000 и делает это сравнительно быстро + #Так же я написал код с генераторами массивов, но код с генераторами медленный слоупок, + # процентов на 300 медленее этого кода на больших значениях номера комнаты. потому его тут не будет. + +else: + print("Введено неверное значение") + + + + + + + + + + diff --git a/lesson02/home_work/hw02_normal.py b/lesson02/home_work/hw02_normal.py index 9b22d6ae5..ddd4272fc 100644 --- a/lesson02/home_work/hw02_normal.py +++ b/lesson02/home_work/hw02_normal.py @@ -1,16 +1,105 @@ +#coding: utf-8 + +import math +import random + +menu = input("Выберите подпрограмму. [1] - Задача 1, [2] - задача 2, [3] - задача 3, [4] - задача 4, --- ") + # Задача-1: # Дан список заполненный произвольными целыми числами, получите новый список элементами которого будут # квадратные корни элементов исходного списка, но только если результаты извлечения корня не имеют десятичной части и # если такой корень вообще можно извлечь # Пример: Дано: [2, -5, 8, 9, -25, 25, 4] Результат: [3, 5, 2] +if menu =="1": + list1 = [2, -5, 8, 9, -25, 25, 4] #[2, 9, -22, 123, 4, 8, 9, 33, 15, 129, 25, 743, 18, 4, 9, 36, 42] + list2 = [] + + for item in list1: + if item > 0: + if (math.sqrt(item)) % 1 == 0: + item = math.sqrt(item) + list2.append(int(item)) + + print(list2) + + +#конец задачи 1 + + # Задача-2: Дана дата в формате dd.mm.yyyy, например: 02.11.2013. # Ваша задача вывести дату в текстовом виде, например: второе ноября 2013 года. # Склонением пренебречь (2000 года, 2010 года) +elif menu == "2": + + # для этого должна быть библиотека, такое делать задротно, но да кто-то должен это сделать в самом начале + # Буду думать что я делаю правильно + + # Делаем библиотеки соответсвующие дням и месяцам + #делал без проверок на корректность ввода + + dayWord = {1:'первое', 2:'второе', 3:'третье', 4:'четвертое', 5:'пятое', 6:'шестое', 7:'седьмое', 8:'восьмое', 9:'девятое', 10:'десятое', 11:'одинадцатое', 12:'двенадцатое', 13:'тринадцатое', 14:'четырнадцатое', 15:'пятнадцатое', 16:'шестнадцатое', 17:'семнадцатое', 18:'восемнадцатое', 19:'девятнадцатое', 20:'двадцатое', 21:'двадцать первое', 22:'двадцать второе', 23:'двадцать третье', 24:'двадцать четвертое', 25:'двадцать пятое', 26:'двадцать шестое', 27:'двадцать седьмое', 28:'двадцать восьмое', 29:'двадцать девятое', 30:'тридцатое', 31:'тридцать первое'} + monthWord = {1:'января', 2:'февраля', 3:'марта', 4:'апреля', 5:'мая', 6:'июня', 7:'июля', 8:'августа', 9:'сентября', 10:'октября', 11:'ноября', 12:'декабря'} + + date = '02.11.2013' + + dateList = date.split('.') + + day = dayWord[int(dateList[0])] + month = monthWord[int(dateList[1])] + year = int(dateList[2]) + + print('{0} {1} {2} года' .format(day, month, year)) + # Задача-3: Напишите алгоритм заполняющий список произвольными целыми числами в диапазоне от -100 до 100 # В списке должно быть n - элементов # Подсказка: для получения случайного числа изпользуйте функцию randint() модуля random +elif menu == "3": + n = 15; + spisok = [] + + while len(spisok) < n: + item = random.randint(-100, 100) + spisok.append(item) + + + print(spisok) + +#конец задачи 3 + # Задача-4: Дан список заполненный произвольными целыми числами # Получите новый список, элементами которого будут только уникальные элементы исходного + +elif menu == "4": + + spisok = [-73, -54, -5, 39, 46, -96, -55, 40, -20, 33, 39, 46, -96, -55, 35, 63, 78, -24, -83, 46, -96, -55, 40] + + spisok2A = list(set(spisok)) + spisok2B = [] + + for item in spisok: + if spisok2B.count(item) < 1: + spisok2B.append(item) + + print('spisok2A = ', spisok2A) + print('spisok2B = ', spisok2B) + + + + + + + #вариант решения до того как я понял что set можно использовать + # for item in spisok: + # if spisok.count(item) == 1: + # spisok2.append(item) + # + # print(spisok2) + + + + +else: + print("Введено неверное значение") diff --git a/lesson03/home_work/hw03_easy.py b/lesson03/home_work/hw03_easy.py index bf9beee40..75bcd7bc7 100644 --- a/lesson03/home_work/hw03_easy.py +++ b/lesson03/home_work/hw03_easy.py @@ -2,13 +2,30 @@ # Напишите функцию округлящую полученное произвольное десятичное число, # до кол-ва знаков (кол-во знаков передается вторым аргументом) # Округление должно происходить по математическим правилам (0.6 --> 1, 0.4 --> 0). -# Для решения задачи не используйте встроенные и функции и функции из модуля math +# Для решения задачи не используйте встроенные функции и функции из модуля math +#Это было слишком просто, можно конечно было с помощью строк разложить число. +# Но мне так показалось проще и оптимальнее def my_round(number, ndigits): - pass -my_round(2.1234567, 5) + fraction = number%1 * (10**ndigits) #получаем число до нужного знака, + rem = fraction%1 # смотрим какие еще есть у нас числа там + + if rem * 2 >= 1: + rem = 1 + else: + rem = 0 + #собирем все назад + fraction = fraction//1 + rem + + number = str(int(number//1)) +('.' + str((fraction / (10**ndigits)))[2:]) + + + return float(number) + + +print(my_round(3.64546548784545, 7)) # Задание-2: # Дан шестизначный номер билета, определить является ли билет счасливым @@ -18,5 +35,23 @@ def my_round(number, ndigits): def lucky_ticket(ticket_number): - pass + leftnumber = 0 + rightnumber = 0 + + for itemleft in str(ticket_number //1000): + leftnumber += int(itemleft) + + for itemright in str(ticket_number %1000): + + rightnumber += int(itemright) + + + if leftnumber != rightnumber: + return False + else: + return True + + + +print(lucky_ticket(234182)) \ No newline at end of file diff --git a/lesson03/home_work/hw03_hard.py b/lesson03/home_work/hw03_hard.py index 71df44dc0..e0caf8d1d 100644 --- a/lesson03/home_work/hw03_hard.py +++ b/lesson03/home_work/hw03_hard.py @@ -1,3 +1,6 @@ +import re + + # Задание-1: # Написать программу выполняющую операции(сложение и вычитание) с простыми дробями. # Дроби вводятся и выводятся в формате: n x/y ,где n - целая часть, x - числитель, у - знаменатель. @@ -8,6 +11,175 @@ # Ввод: -2/3 - -2 # Вывод: 1 2/3 + +#И только после того как я решил эту задачу, я загуглил и прочитал о модуле fractions +#Но через него сделать это все было бы слишком просто. +def simpleFraction(input_string): + + #Функция определяет что бы делаем, + #скалдываем или вычитаем и разделяет выражение на элементы + #возвращает список элементов и знак операции + + def transformString(input_str): + + if input_str.find(' + ') > 0: + return [input_str.split(' + '), "+"] + + elif input_str.find(' - ') > 0: + return [input_str.split(' - '), "-"] + + + #У нас есть нужные числа операции и знак этой операции + #Теперь преобразуем числа операции к простым дробям + #Я так и не понял как мне передавать и обрабатывать эллементы списка по одному используя *args + + def toFraction (nums): + + #Функция проверки можно-ли преобразовать строку в целое число + def isInt(string): + try: + int(string) + return True + except ValueError: + return False + #Для начала надо проверить в каком виде у нас число, + #имеется ли целая часть, есть ли знак - + + #Сплитим число и получаем список с которым и предстоит работать + #В конечном итоге на выходе должен получится список из 2х чисел + # и знака множителя (в виде положительной и отрицательной единицы) + #Формат вывода: ["множитель", числитель, знаменатель] + + nums = str(nums).split(' ') #сплитим + out_list = list() #определяем лист вывода + temp = 0 #временная переменная для хранения чисел isinstance + for item in nums: + + #Тут мы проверим целую часть, и если есть запишем ее знак в качестве множителя + # и присвоим переменной temp значение целой части + + if isInt(item): + if int(item) < 0: + out_list.append(-1) + temp = int(item) + else: + out_list.append(1) + temp = int(item) + #Тут нам надо разобрать числитель и знаменатель, + + else: + numDen = item.split("/") + if temp != 0: + numDen[0] = int(numDen[0]) + (abs(temp) * int(numDen[1])) + for item_numden in numDen: + out_list.append(int(item_numden)) + + if len(out_list) < 3: + out_list.insert(0, 1) + return out_list + + + + #Эта функция будет складывать наши дроби. + #На вход у нас приходит список из 3х эллементов, (операция в виде знака), Список дороби 1, и список дроби 2 + + def operationToFraction(input_list): + + #Функция Алгоритм Евклида, ищет НОД + def evklidNOD(num, dem): + + while num !=0 and dem !=0: + if num > dem: + num = num % dem + else: + dem = dem % num + return num + dem + + + #Надо все привести к общему знаменателю + if input_list[1][-1] != input_list[2][-1]: + #Числители + + numerat1 = (input_list[1][1] * input_list[2][-1]) * input_list[1][0] + numerat2 = (input_list[2][1] * input_list[1][-1]) * input_list[2][0] + + #Общий знаменатель + demoninator = input_list[1][-1] * input_list[2][-1] + else: + numerat1 = input_list[1][1] * input_list[1][0] + numerat2 = input_list[2][1] * input_list[2][0] + demoninator = input_list[1][-1] + + #У нас есть числители и общий знаменатель, есть знак операции над этими числами + #наверное тут можно было упростить, но так получится чуть универсальнее + #Проводим операцию и получаем нужный числитель + # numerator = (numerat1) + (numerat2) + + + if input_list[0] == "-": + + numerator = (numerat1 ) - (numerat2) + + else: + + numerator = (numerat1 ) + (numerat2) + + + + + + + #теперь у нас есть дробь numerator/demoninator, надо извлеч целую часть если она там есть конечно + if abs(numerator) >= demoninator: + numberInteger = abs(numerator) // demoninator + if numerator < 0: + numberInteger *= -1 + + #далее надо убрать целую часть из дроби + #Нам больше не нужено знать отрицательное-ли у нас число, знак убежал в целую часть + numerator = abs(numerator) - (abs(numberInteger) * demoninator) + else: + numberInteger = '' + + #Если у нас получилось целое цисло, значит numerator = 0 + #Значит дальнейшие вычисления не нужны и надо просто вернуть цисло + if numerator == 0: + result = '{}' .format(numberInteger) + return result + + #Надо бы сократить дробь + #Нагуглил алгоритм Евклида, он нам и подходит + #Не забываем о том что в числителе мог быть сохранен знак + nod = evklidNOD(abs(numerator), demoninator) + numerator = numerator / nod + demoninator = demoninator / nod + + #Осталось собрать строку и пульнуть ее в return + result = '{0} {1}/{2}' .format(numberInteger, int(numerator), int(demoninator)) + + return result + + + + fractions_list = list() + + # готовим список для финальной операции + fractions_list.append(transformString(input_string)[1])#добавляем оператор + + #Цикл добавляет сформированные дроби + for item in transformString(input_string)[0]: + fractions_list.append(toFraction(item)) + + #Финальная операция с дробями + result = operationToFraction(fractions_list) + return result + +print(simpleFraction("-1 2/7 + 17 5/6")) + + + + + # Задание-2: # Дана ведомость расчета заработной платы (файл "data/workers"). # Рассчитайте зарплату всех работников, зная что они получат полный оклад, @@ -16,6 +188,62 @@ # они получают удвоенную ЗП пропорциональную норме. # Кол-во часов, которые были отработаны указаны в файле "data/hours_of" + + +worker_list = list() #тут будем хранить списки после обработки строк файла + +#Открываем файл, и разбираем его +workers_file = open('data/workers.txt', 'r') +for line_wf in workers_file: + temp_line = line_wf.rstrip('\n') #Убираем символ перевода строки + + # Я добрался до регулярных выражений, + # долго мозг ломал как без этого удалить лишние пробелы + temp_line = re.split(r'\W+', temp_line) #Удаляем все пробелы + # (записать можно было и так: worker_list.append(re.split(r'\W+', temp_line)) + # и не вводить доп переменную, но это не точно + + worker_list.append(temp_line) # Добавляем полученый список в наш список +workers_file.close() #Закрываем файл, нам он больше не нужен + +#Тут повторяем все тоже самое только с другим файлом +hours_list = list() +hours_file = open('data/hours_of.txt') +for line_hf in hours_file: + temp_line = line_hf.rstrip('\n') + temp_line = re.split(r'\W+', temp_line) + hours_list.append(temp_line) +hours_file.close() +print(hours_list) + +#Итак у нас 2 набора списков. +# нам надо сделать довольно простое вычисление по циклу. +# Выводить будем текстовую таблицу в файл result_pay +#ВНИМАНИЕ ВЕЛОСИПЕД ИЗ КОСТЫЛЕЙ +result_file_url = 'data/result_pay.txt' +result_file = open(result_file_url, 'a') +result_string = '{0} {1} {2}' .format('Имя', 'Фамилия', 'Выплата \n') +result_file.write(result_string) +result_file.close() + +idn = 1 +while idn < len(worker_list): + # Так как последовательность имен в ведомостях может не совпадать, будем перебирать + for item_HL in hours_list: + if worker_list[idn][0] == item_HL[0] and worker_list[idn][1] == item_HL[1]: + worker_pay = (int(worker_list[idn][2]) / int(worker_list[idn][-1])) * int(item_HL[-1]) + result_file = open(result_file_url, 'a') + result_string = '{0} {1} {2}\n' .format(worker_list[idn][0], worker_list[idn][1], round(worker_pay, 2)) + result_file.write(result_string) + result_file.close() + idn += 1 + + + + + + + # Задание-3: # Дан файл ("data/fruits") со списком фруктов # Записать в новые файлы все фрукты начинающиеся с определенной буквы. @@ -29,3 +257,28 @@ # Чтобы получить список больших букв русского алфавита: # print(list(map(chr, range(ord('А'), ord('Я')+1)))) + +#Файл с исходным текстом +file = 'data/fruits.txt' #Пишем именно путь к нему, так проще + +#Идем по циклу и считываем каждую строку +for line in open(file): + strip_line = line.lstrip() #Удаляем пробелы вначале, если они есть + + #Проверяем не пустая ли у нас строка, если пустая, переходим к следующей + if line.isspace(): + continue + #Берем первый символ строки, (ну по идее у нас строка всегда начинается с имени фрукта) + first_char = strip_line[0] + + #На всякий случай проверяю не начинается-ли строка с пробела, на самом деле должно и без этого работать + if first_char != ' ': + #Формируем имя нового файла, тут вроде все понятно + name_file = "data/fruit_{}.txt" .format(first_char.upper()) + #Открываем нужный файл, если файл не существует, то создается автоматически + write_file = open(name_file, 'a') + #Пишем в файл нашу строку + write_file.write(strip_line) + #Не забываем закрыть файл, ибо если этого не сделать файлы бьются. + write_file.close() + diff --git a/lesson03/home_work/hw03_normal.py b/lesson03/home_work/hw03_normal.py index 85f5ee4c3..353b05c0c 100644 --- a/lesson03/home_work/hw03_normal.py +++ b/lesson03/home_work/hw03_normal.py @@ -1,10 +1,27 @@ +import random + # Задание-1: # Напишите функцию возвращающую ряд Фибоначчи с n-элемента до m-элемент # Первыми элементами ряда считать цифры 1 1 - +# +# решение не самое наверное Питоновское def fibonacci(n, m): - pass + + fib_row = [1, 1] + tic = 0 + #Тут наверное надо было сделать for с генератором списков + while len(fib_row) < m: + fib_row.append(fib_row[tic] + fib_row[tic + 1]) + tic +=1 + return fib_row[n-1:m] + + +print(fibonacci(450, 500)) + + + + # Задача-2: # Напишите функцию сортирующую принимаемый список по возрастанию. @@ -13,16 +30,84 @@ def fibonacci(n, m): def sort_to_max(origin_list): - pass -sort_to_max([2, 10, -12, 2.5, 20, -11, 4, 4, 0]) + #функция пузырьковой сортировки + def bubble_sort(bubble_list): + if len(bubble_list) <= 1: + return bubble_list + else: + + tic = 1 + while tic < len(bubble_list): + for item in range(len(bubble_list)-tic): #range(len(list)-tic) позволит сократить количество проходов по циклу + if bubble_list[item] > bubble_list[item + 1]: + bubble_list[item], bubble_list[item + 1] = bubble_list[item + 1], bubble_list[item] + + tic +=1 + + return bubble_list + #проверим длину нашего списка, если он пустой или состоит из 1 эллемента, то вернем его знаяение обратно + if len(origin_list)<=1: + return origin_list + else: + + #Объявляем нужные переменные, и делим список на 3 списка + + stay = random.choice(origin_list) #выбираем опорное значение + undStay = [] #Формуируем список Больше или равный опорному значению + equStay = [] #Список в котором эллементы равны опорному значению + moreStay = [] #формируем список меньше опопрного значения + + + # (так будет чуть шустрее работать чем простой пузырек) + + for item in origin_list: + if item > stay: + moreStay.append(item) + elif item == stay: + equStay.append(item) + else: + undStay.append(item) + + #Собираем список обратно + origin_list = bubble_sort(undStay) + equStay + bubble_sort(moreStay) + return origin_list + + +print(sort_to_max([2, 10, -12, 2.5, 20, -11, 4, 4, 0])) # Задача-3: # Напишите собственную реализацию функции filter # Разумеется, внутри нельзя использовать саму функцию filter +def mySort(user_function, arg_list): + result = list() + for item in arg_list: + if user_function(item): + result.append(item) + return result + + + +number_list = range(-5, 5) +less_than_zero = list(mySort(lambda x: x < 0, number_list)) +print(less_than_zero) + # Задача-4: # Даны четыре точки А1(х1, у1), А2(x2 ,у2), А3(x3 , у3), А4(х4, у4). # Определить, будут ли они вершинами параллелограмма +def isParralels(A1, A2, A3, A4): + + if A1[1] == A4[1] or A2[1] == A3[1] and (abs(A1[0] - A2[0]) == abs(A3[0] - A4[0])): + return True + return False + +dotA1 = (1, 1) +dotA2 = (1, 9) +dotA3 = (10, 6) +dotA4 = (10, 1) + + +print(isParralels(dotA1, dotA2, dotA3, dotA4)) diff --git a/lesson04/home_work/hw04_easy.py b/lesson04/home_work/hw04_easy.py index 029699897..3c06a35d7 100644 --- a/lesson04/home_work/hw04_easy.py +++ b/lesson04/home_work/hw04_easy.py @@ -4,12 +4,32 @@ # Дан список, заполненный произвольными целыми цифрами, получить новый список, элементы которого будут # квадратами элементов исходного списка # [1, 2, 4, 0] --> [1, 4, 16, 0] +list_A = [1, 2, 4, 0] +list_B = list(map(lambda a: a**2, list_A)) + +print(list_B) + +list_C = [num*num for num in list_A] +print(list_C) # Задание-2: # Даны два списка фруктов. Получить список фруктов, присутствующих в обоих исходных списках. +fruits1 = ['Апельсин', 'Мандарин', 'Банан', 'Фейхоа'] +fruits2 = ['Апельсин', 'Памела', 'Яблоко', 'Фейхоа'] + +fruits3 = [item for item in fruits1 if item in fruits2] + +print(fruits3) + + # Задание-3: # Дан список, заполненный произвольными числами. Получить список из элементов исходного, удовлетворяющих след. условиям: # + Элемент кратен 3 # + Элемент положительный # + Элемент не кратен 4 + +number_list = [1, 5, 3, 11, -3, 12, 15, 142, 14, -65, 87, 635, -17, 18, 22, 16] +result_number_list = [num for num in number_list if not (num % 3) and (num > 0) and (num % 4)] +print(result_number_list) + diff --git a/lesson04/home_work/hw04_hard.py b/lesson04/home_work/hw04_hard.py index d6903a528..1caabfc5d 100644 --- a/lesson04/home_work/hw04_hard.py +++ b/lesson04/home_work/hw04_hard.py @@ -1,3 +1,9 @@ +from functools import reduce + +import re + + + # Задание-1: # Матрицы в питоне реализуются в виде вложенных списков: # Пример Дано: @@ -11,12 +17,19 @@ # [8, 1, 2]] # Суть сложности hard: Решите задачу в одну строку +#так транспонирование +print(list(zip(*matrix))) + +#так поворот +print(list(zip(*matrix[::-1]))) + # Задание-2: # Найдите наибольшее произведение пяти последовательных цифр в # 1000-значном числе. # Выведите произведение и индекс смещения первого числа последовательных 5-ти цифр # Пример 1000-значного числа: + number = """ 73167176531330624919225119674426574742355349194934 96983520312774506326239578318016984801869478851843 @@ -39,8 +52,89 @@ 05886116467109405077541002256983155200055935729725 716362695618826704282524836008""" + + + +def numberSeach(number): + number = re.findall(r'\d', number) + result = 0 + bias = 0 + max_step = 5 + + while max_step <= len(number): + if reduce((lambda x, y: int(x) * int(y)), number[max_step-5:max_step]) > result: + result = reduce((lambda x, y: int(x) * int(y)), number[max_step-5:max_step]) + bias = max_step - 5 + max_step += 1 + return [result, bias] + + +print(numberSeach(number)) + + + + + + # Задание-3( Ферзи): # Известно, что на доске 8×8 можно расставить 8 ферзей так, чтобы они не били друг друга. # Вам дана расстановка 8 ферзей на доске, определите, есть ли среди них пара бьющих друг друга. # Программа получает на вход восемь пар чисел, каждое число от 1 до 8 — координаты 8 ферзей. # Если ферзи не бьют друг друга, выведите слово NO, иначе выведите YES. +# Формат передачи координат [(1, 2), (2, 7), (3, 1), (7, 3)] где idx0 значение это ряд, idx1 значение столбец + + +#Функция проверяет не пересекаются-ли ферзи по столбцам или рядам +def tableRow(item_list): + for item in item_list: + #проверка рядов и столбов + + for itm in item_list: + if item != itm: + if item[0] == itm[0] or item[1] == itm[1]: + return True + return False +#Функция проверяет, диагонали каждого из ферзей +def diagonal(item_list): + + for item in item_list: + + if item[0] >= item[1]: + + list_y = [y for y in range((item[0] - item[1]) + 1, 9)] + list_x = [x for x in range(1, (9-((item[0])-(item[1]))))] + list_xy1 = list(zip(list_y, list_x)) + + # Часть первая, диагонали ферзя при y 9: + list_x2 = [x2 for x2 in range(item[0] + item[1] - 9, 8)] + list_xy2 = list(zip(list_x2[::-1], list_x2)) + + + #Диагонали у нас есть, теперь надо понять есть ли наши ферзи в этих диагоналях: + if len(set(item_list) & (set(list_xy1)|set(list_xy2))) > 1: + return True + return False + + + +ferzi = [(1, 2), (2, 7), (3, 1), (7, 3)] + +if tableRow(ferzi) or diagonal(ferzi): + print('YES') +else: + print('NO') + + + diff --git a/lesson04/home_work/hw04_normal.py b/lesson04/home_work/hw04_normal.py index 4191a3ce1..fa3c6ee7a 100644 --- a/lesson04/home_work/hw04_normal.py +++ b/lesson04/home_work/hw04_normal.py @@ -1,3 +1,7 @@ +import random +import re + + # Задание-1: # Вывести символы в нижнем регистре, которые окружают 1 или более символа в верхнем регистре. # Решить задачу двумя способами: с помощью re и без. @@ -14,6 +18,39 @@ 'GPvbnhWHuXBqHFjvihuNGEEFsfnMXTfptvIOlhKhyYwxLnqOsBdGvnuyEZIheApQGOXWeXoLWiDQNJFaXi' \ 'UWgsKQrDOeZoNlZNRvHnLgCmysUeKnVJXPFIzvdDyleXylnKBfLCjLHntltignbQoiQzTYwZAiRwycdlHfyHNGmkNqSwXUrxGc' +def searchLowerNoRe(word_string): + + step = 0 + max_step = 0 + result = list() + while max_step < len(word_string): + if word_string[step].isupper() and word_string[step+1].islower(): + step = step + 1 + max_step = step + 1 + while max_step < len(word_string) and word_string[max_step].islower(): + max_step += 1 + if word_string[step:max_step].islower() and max_step != len(word_string): + result.append(word_string[step:max_step]) + step += 1 + return result + + + +def searchLowerRe(word_string): + pattern = r"(?<=[A-Z])[a-z]+(?=[A-Z])" #Шаблон + # Ищем по паттерну и сохраняем в список + result = [num.group() for num in re.finditer(pattern, word_string)] + return result + +print("\n#######IS NO RE######## \n") +print(searchLowerNoRe(line)) +print("\n#######IS RE######## \n") +print(searchLowerRe(line)) + + + + +# !НЕВЕРНО Сделано, не правильно прочитал условия задачи # Задание-2: # Вывести символы в верхнем регистре, которые окружают ровно два символа в нижнем регистре слева # и два символа в верхнем регистре справа. Решить задачу двумя способами: с помощью re и без. @@ -30,7 +67,107 @@ 'GPvbnhWHuXBqHFjvihuNGEEFsfnMXTfptvIOlhKhyYwxLnqOsBdGvnuyEZIheApQGOXWeXoLWiDQNJFaXi' \ 'UWgsKQrDOeZoNlZNRvHnLgCmysUeKnVJXPFIzvdDyleXylnKBfLCjLHntltignbQoiQzTYwZAiRwycdlHfyHNGmkNqSwXUrxGC' +def seachUpperNoRe(word_string): + tic = 0 + end = 1 + low_list = list() + + result = list() + + while tic < len(word_string): + while word_string[tic:end].islower(): + end +=1 + + if word_string[tic:end-1].islower(): + + low_list.append([tic, end-1]) + tic = end + end +=1 + + tic = 0 + + while tic + 1 < len(low_list): + if low_list[tic][1] - low_list[tic][0] == 2 and low_list[tic+1][1] - low_list[tic+1][0] == 2: + result.append(word_string[low_list[tic][1]: low_list[tic+1][0]]) + tic += 1 + + + + + return result + + + + +def searchUpperRe(word_string): + pattern = r"(?<=[A-Z][a-z][a-z])([A-Z]+)(?=[a-z][a-z][A-Z])" # Шаблон + # Ищем по паттерну и сохраняем в список + result = [num.group(1) for num in re.finditer(pattern, word_string)] + return result + + + +print("\n#######IS NO RE######## \n") +print(seachUpperNoRe(line_2)) +print("\n#######IS RE######## \n") +print(searchUpperRe(line_2)) + + + # Задача-3: # Напишите скрипт заполняющий указанный файл (самомстоятельно задайте имя файла) произвольными целыми # цифрами, в результате в файле должно быть 2500-значное произвольное число # Найдите и выведите самую длинную последовательность одинаковых цифр в вышезаполненном файле + +#Функция генерирует файл +def numberFile(): + tic = 0 #Счетчик + while tic < 2500: #Тут ставится ограничение насколько длинное у нас получится число + num = str(random.randint(0, 9)) #Генерируем случайное число от 0 до 9 + file = open('result.txt', 'a') #Открываем файл на дозапись, автоматом создается если файла нет по указанному пути + file.write(num) #Записываем наше случайное число в файл + file.close() #Не забываем закрыть файл + tic += 1 + +#Функция которая ищет в строке самую длинную последовательность повторяющихся цифр, возвращает координаты этой последовательность +def patternSearch(input_string): + + max_len = 1 #Переменная которая хранит наибольшую найденую длину + coordinate = list() #Сюда попадут координаты + for n in range(0, 9): #Так как цифр у нас не так много, генерим список от 0 до 9, сначала ищем самый длинный 0, и тд. + pattern = r'%d{%d,%d}' % (n, max_len, 9) #Формируем шаблон поиска + search_list = re.finditer(pattern, input_string) #Ищем в строке + for item in search_list: #Проходим по полученным результатам и сравниваем длины + if len(item.group()) > max_len: + max_len = len(item.group()) + coordinate = [item.start(), item.end()] + # Технически можно сформировать новый шаблон поиска любых повторяющихся + # цифр с длиной не менее той которая у нас в результате в max_len + return coordinate + +numberFile() + +file = open('result.txt', 'r') +string_search = file.read() +file.close() +coord = patternSearch(string_search) +print('\n#########ЗАДАЧА №3###########\n') +print(string_search[coord[0]:coord[1]]) + + + + + + + + + + + + + + + + + + diff --git a/lesson04/home_work/test.py b/lesson04/home_work/test.py new file mode 100644 index 000000000..f8d0773fd --- /dev/null +++ b/lesson04/home_work/test.py @@ -0,0 +1,65 @@ +# +# import re +# def searchUpperRe(word_string): +# pattern = r"(?<=[A-Z][a-z][a-z])([A-Z]+)(?=[a-z][a-z][A-Z])" # Шаблон +# # Ищем по паттерну и сохраняем в список +# result = [num.group(1) for num in re.finditer(pattern, word_string)] +# return result +# +# line_2 = 'mtMmEZUOmcqWiryMQhhTxqKdSTKCYEJlEZCsGAMkgAYEOmHBSQsSUHKvSfbmxULaysmNOGIPHpEMujalp' \ +# 'PLNzRWXfwHQqwksrFeipEUlTLeclMwAoktKlfUBJHPsnawvjPhfgewVzKTUfSYtBydXaVIpxWjNKgXANv' \ +# 'IoumesCSSvjEGRJosUfuhRRDUuTQwLlJJJDdkVjfSAHqnLxooisBDWuxIhyjJaXDYwdoVPnsllMngNlmkp' \ +# 'YOlqXEFIxPqqqgAWdJsOvqppOfyIVjXapzGOrfinzzsNMtBIOclwbfRzytmDgEFUzxvZGkdOaQYLVBfsGSA' \ +# 'fJMchgBWAsGnBnWetekUTVuPluKRMQsdelzBgLzuwiimqkFKpyQRzOUyHkXRkdyIEBvTjdByCfkVIAQaAb' \ +# 'fCvzQWrMMsYpLtdqRltXPqcSMXJIvlBzKoQnSwPFkapxGqnZCVFfKRLUIGBLOwhchWCdJbRuXbJrwTRNyA' \ +# 'xDctszKjSnndaFkcBZmJZWjUeYMdevHhBJMBSShDqbjAuDGTTrSXZywYkmjCCEUZShGofaFpuespaZWLFN' \ +# 'IsOqsIRLexWqTXsOaScgnsUKsJxiihwsCdBViEQBHQaOnLfBtQQShTYHFqrvpVFiiEFMcIFTrTkIBpGUf' \ +# 'lwTvAzMUtmSQQZGHlmQKJndiAXbIzVkGSeuTSkyjIGsiWLALHUCsnQtiOtrbQOQunurZgHFiZjWtZCEXZC' \ +# 'nZjLeMiFlxnPkqfJFbCfKCuUJmGYJZPpRBFNLkqigxFkrRAppYRXeSCBxbGvqHmlsSZMWSVQyzenWoGxy' \ +# 'GPvbnhWHuXBqHFjvihuNGEEFsfnMXTfptvIOlhKhyYwxLnqOsBdGvnuyEZIheApQGOXWeXoLWiDQNJFaXi' \ +# 'UWgsKQrDOeZoNlZNRvHnLgCmysUeKnVJXPFIzvdDyleXylnKBfLCjLHntltignbQoiQzTYwZAiRwycdlHfyHNGmkNqSwXUrxGC' +# +# print(searchUpperRe(line_2)) +# +# print('#' *50) +# def seachUpperNoRe(word_string): +# tic = 0 +# end = 1 +# low_list = list() +# +# result = list() +# +# while tic < len(word_string): +# while word_string[tic:end].islower(): +# end +=1 +# +# if word_string[tic:end-1].islower(): +# +# low_list.append([tic, end-1]) +# tic = end +# end +=1 +# +# tic = 0 +# +# while tic + 1 < len(low_list): +# if low_list[tic][1] - low_list[tic][0] == 2 and low_list[tic+1][1] - low_list[tic+1][0] == 2: +# result.append(word_string[low_list[tic][1]: low_list[tic+1][0]]) +# tic += 1 +# +# +# +# +# return result +# +# +# +# print(seachUpperNoRe(line_2)) +import random +random_number = '' +n = 0 +m = 2500 +# g = str() +while n < m: + g = str(random.randint(0, 9)) + random_number = random_number + g + n += 1 diff --git a/lesson05/home_work/hw05_easy.py b/lesson05/home_work/hw05_easy.py index b990086b0..9262fe33a 100644 --- a/lesson05/home_work/hw05_easy.py +++ b/lesson05/home_work/hw05_easy.py @@ -1,9 +1,91 @@ +import os +import sys +import shutil + # Задача-1: # Напишите скрипт создающий директории dir_1 - dir_9 в папке из которой запущен данный скрипт. # И второй скрипт, удаляющий эти папки. +#Добавил от себя возможность передать функции диапозон папок которые надо создать +def addDirectoryRange(a=1,b=9): + for idx in range(a,b+1): + dir_name = 'dir_%d' % (idx) + try: + os.mkdir(os.path.join(os.getcwd(), dir_name)) + except FileExistsError: + print("Директория %s уже существует и не была создана \n" % (dir_name)) + continue + + +def removeDir(path): + try: + shutil.rmtree(path) + print('папка %s успешно удалена \n' % (path)) + except NameError: + print('Неверно указана имя папки или папка не существует \n') + +#Более универстальный скрипт создания папок +def addDir(dir_name = 'newDir'): + folder_suf = 1 #переменная которая будет хранить суффикс создаваемой папки на случай если такая папка уже существует + while True: #идем в цикле пока не получится создать папку, если ошибка приклеиваем суффикс к имени и пробуем + try: + os.mkdir(os.path.join(os.getcwd(), dir_name)) + print('Папка %s успешно создана' % (dir_name)) + break + except FileExistsError: + dir_name = dir_name + folder_suf + folder_suf += 1 + # Задача-2: # Напишите скрипт отображающий папки текущей директории +#Отображает только папки +def dirList(): + this_dir = os.listdir(path=os.getcwd()) #Формируем полный путь(можно и без него, но так лучше) + folder_list = list() #Переменная которая будет хранить список папок + + for name in this_dir: + path = os.getcwd() + '/' + name + if os.path.isdir(path): #Проверяем это папка или нет? + folder_list.append(name) + + return folder_list + +#отображает только файлы +def fileList(): + this_dir = os.listdir(path=os.getcwd()) + file_list = list() + + for name in this_dir: + path = os.getcwd() + '/' + name + if os.path.isfile(path): + file_list.append(name) + + return file_list + + # Задача-3: # Напишите скрипт создающий копию файла, из которого запущен данный скрипт +def copyMe(): + path = sys.argv[0] + shutil.copy(path, path + '.copy') #Добавляем суффикс к имени копируемого файла + +def toFolder(): + path = input('введите путь \n') + try: + os.chdir(path) + except FileNotFoundError: + print('неверно указан путь или имя папки') + + return os.getcwd() + + +if __name__ == '__main__': + # addDirectoryRange() #Можно передать начало и конец диапозона в качестве аргументов + # print(dirList()) + # copyMe() + + #Точно так можно и создать новые файлы. + #Нолучается есть 2 варианта создания и удаления + for suff in range(1, 10): + removeDir('dir_'+ str(suff)) \ No newline at end of file diff --git a/lesson05/home_work/hw05_hard.py b/lesson05/home_work/hw05_hard.py index b7c56900e..f256ac54d 100644 --- a/lesson05/home_work/hw05_hard.py +++ b/lesson05/home_work/hw05_hard.py @@ -12,3 +12,106 @@ # в которой был запущен скрипт. # P.S. По возможности, сделайте кросс-платформеную реализацию. + +import os +import sys +import shutil + +print('sys.argv = ', sys.argv) + + +def print_help(): + print("help - получение справки") + print("mkdir - создание директории") + print("ping - тестовый ключ") + print("cp file_name - Создает копию указанного файла") + print("rm file_name - удаляет указанный файл") + print("cd - меняет текущую директорию на указанную") + print("ls - отображение полного пути текущей директории") + + + +def make_dir(): + if not dir_name: + print("Необходимо указать имя директории вторым параметром") + return + dir_path = os.path.join(os.getcwd(), dir_name) + try: + os.mkdir(dir_path) + print('директория {} создана'.format(dir_name)) + except FileExistsError: + print('директория {} уже существует'.format(dir_name)) + + +def ping(): + print("pong") + +def cp(): + path = os.path.join(os.getcwd(), dir_name) + if not dir_name: + print("Необходимо указать имя файла вторым параметром") + try: + shutil.copy(path, path + '.copy') + except FileNotFoundError: + print('неверно указан путь или имя файла') + +def thisPath(): + print(os.getcwd()) + +def removeFile(): + path = os.path.join(os.getcwd(), dir_name) + try: + if os.path.isfile(path): + user_confirm = input('введите yes для подтверждения удаления фала %s\n' % (dir_name)) + if user_confirm.lower() == 'yes': + os.remove(path) + else: + print('отмена операции') + else: + print('Неверно указан путь или имя файла') + except FileNotFoundError: + print('неверно указан путь или имя файла') + + +def goFolder(): + + if not dir_name: + print("Необходимо указать путь вторым параметром") + return + + try: + os.chdir(dir_name) + print('Переход выполнен\n', os.getcwd()) + except FileNotFoundError: + print('неверно указан путь') + + + + +do = { + "help": print_help, + "mkdir": make_dir, + "ping": ping, + 'cd': goFolder, + 'cp': cp, + 'rm': removeFile, + 'ls': thisPath +} + +try: + dir_name = sys.argv[2] +except IndexError: + dir_name = None + +try: + key = sys.argv[1] +except IndexError: + key = None + + +if key: + if do.get(key): + do[key]() + else: + print("Задан неверный ключ") + print("Укажите ключ help для получения справки") diff --git a/lesson05/home_work/hw05_normal.py b/lesson05/home_work/hw05_normal.py index 6831c129a..fca8289df 100644 --- a/lesson05/home_work/hw05_normal.py +++ b/lesson05/home_work/hw05_normal.py @@ -10,3 +10,53 @@ # Для решения данной задачи используйте алоритмы из задания easy, # оформленныйе в виде соответствующих функций, и импортированные в данный файл из easy.py +import os +import shutil +import hw05_easy as easy + + +def removeDir(): + path = input('введите имя папки') + try: + shutil.rmtree(path) + except NameError: + print('Неверно указана имя папки или папка не существует') + +user_menu = ['1 - Перейти в папку', + '2 - Посмотреть содержимое текущей папки', + '3 - Удалить папку', + '4 - создать новую папку', + 'exit - выход из программы' + ] + + +print(os.getcwd()) +while True: + + user_command = input('\nвведите команду:\n %s\n' % (user_menu)) + + if user_command == '1': + print('Переход выполнен\n', easy.toFolder()) + elif user_command == '2': + if len(os.listdir(path=os.getcwd())) != 0: + print(os.listdir(path=os.getcwd())) + else: + print('Папка пуста') + + + elif user_command == '3': + folder_name = input('введите имя папки\n') + easy.removeDir(folder_name) + + elif user_command == '4': + folder_name = input('введите имя папки\n') + if folder_name !='': + easy.addDir(folder_name) + else: + easy.addDir() + + elif user_command == 'exit': + print('Спасибо что воспользовались услугами нашей утилиты, до свидания') + break + else: + print('Неверно введена команда\n') \ No newline at end of file diff --git a/lesson05/home_work/test b/lesson05/home_work/test new file mode 100644 index 000000000..ba23f69d1 --- /dev/null +++ b/lesson05/home_work/test @@ -0,0 +1,2 @@ +import sys +print(sys.argv) \ No newline at end of file diff --git a/lesson06/home_work/hw06_easy.py b/lesson06/home_work/hw06_easy.py index 04295a4fe..f99f42ce5 100644 --- a/lesson06/home_work/hw06_easy.py +++ b/lesson06/home_work/hw06_easy.py @@ -1,7 +1,105 @@ # Задача-1: Написать класс для фигуры-треугольника, заданного координатами трех точек. # Определть методы позволяющие вычислить: Площадь, высоту и периметр фигуры +import math +class Triangle: + + def __init__(self, A, B, C): + #Функция вычисляет длину стороны согласно координатам точек + def sideLen(dot1, dot2): + return math.sqrt((dot1[0] - dot2[0]) ** 2 + + (dot1[1] - dot2[1]) ** 2) + + self.A = A + self.B = B + self.C = C + #На основании соседних координат вычисляем длину стороны AB + self.AB = sideLen(self.A, self.B) + self.BC = sideLen(self.B, self.C) + self.CA = sideLen(self.C, self.A) + + + + #Вычисление площади треугольника по формуле Герона + def areaTriangle(self): + semi_perimeter = self.perimeterTriangle() / 2 + + return math.sqrt(semi_perimeter + * (semi_perimeter - self.AB) + * (semi_perimeter - self.BC) + * (semi_perimeter - self.CA)) + + #вычисляем периметр треугольника + def perimeterTriangle(self): + return self.AB + self.BC + self.CA + + #Вычисляем высоту треугольника + def heightTriangle(self): + return self.areaTriangle() / (self.AB/2) + + +treugolnik1 = Triangle((3, 2), (6, 7), (0, 12)) + +print(treugolnik1.areaTriangle()) +print(treugolnik1.heightTriangle()) +print(treugolnik1.perimeterTriangle()) + + + # Задача-2: Написать Класс Равнобочная трапеция, заданной координатами 4-х точек. # Предусмотреть в классе методы: проверка, является ли фигура равнобочной трапецией; # вычисления: длины сторон, периметр, площадь. +class Trapeze: + + def __init__(self, A, B, C, D): + + #Функция вычисляет длину стороны согласно координатам точек + def sideLen(dot1, dot2): + return math.sqrt((dot1[0] - dot2[0]) ** 2 + + (dot1[1] - dot2[1]) ** 2) + + + + def areaTriangle(len1, len2, len3): + semi_perimeter = (len1 + len2 + len3) / 2 + + return math.sqrt(semi_perimeter + * (semi_perimeter - len1) + * (semi_perimeter - len2) + * (semi_perimeter - len3)) + + + + self.A = A + self.B = B + self.C = C + self.D = D + + self.AB = sideLen(self.A, self.B) + self.BC = sideLen(self.B, self.C) + self.CD = sideLen(self.C, self.D) + self.DA = sideLen(self.D, self.A) + self.diagonal_AC = sideLen(self.C, self.A) + self.diagonal_BD = sideLen(self.B, self.D) + self.perimeter = self.AB + self.BC + self.CD + self.DA + + # представим трапецию как 2 треугольника и сложим 2 площади этих треугольников + # Для этого у нас есть все необходимые длины сторон + self.area = areaTriangle(self.AB, self.diagonal_BD, self.DA) \ + + areaTriangle(self.diagonal_BD, self.BC, self.CD) + + + + def isTrapezeEqu(self): + + + if self.diagonal_AC == self.diagonal_BD: + return True + return False + + + + + + \ No newline at end of file diff --git a/lesson06/home_work/hw06_hard.py b/lesson06/home_work/hw06_hard.py index 551623241..3a7e46d2a 100644 --- a/lesson06/home_work/hw06_hard.py +++ b/lesson06/home_work/hw06_hard.py @@ -8,3 +8,57 @@ # С использованием классов. # Рализуйте классы сотрудников так, чтобы на вход функции-конструктора каждый работник получал строку из файла + +import re + +class Worker: + def __init__(self, file_str): + self.file_str = file_str + self.name = re.split(r'\W+', temp_line)[0] + self.surname = re.split(r'\W+', temp_line)[1] + self.salary = int(re.split(r'\W+', temp_line)[2]) + self.position = re.split(r'\W+', temp_line)[3] + self.hours_norm = int(re.split(r'\W+', temp_line)[4]) + self.worked_hour = None + + @property + def fullName(self): + return '{0} {1}' .format(self.name, self.surname) + + def addWorkHour(self, worked_hours): + self.worked_hour = worked_hours + + @property + def actualSalary(self): + return round((self.salary / self.hours_norm) * self.worked_hour, 2) + + +workers_list = {} # Тут будем хранить всех работников в виде ключа(номер работника) и экземпляра класса +#Открываем файл, и разбираем его +workers_file = open('data/workers', 'r') +for idx, line_wf in enumerate(workers_file): + temp_line = line_wf.rstrip('\n') #Убираем символ перевода строки + if idx != 0: + workers_list[idx] = Worker(temp_line) + +workers_file.close() #Закрываем файл, нам он больше не нужен + +#Делаем двойной цикл так как порядок имен у нас разный, и передаем отработаное время в класс +hours_file = open('data/hours_of') +for idx, line_hf in enumerate(hours_file): + temp_line = line_hf.rstrip('\n') + temp_line = re.split(r'\W+', temp_line) + if idx != 0: + temp_full_name = str(temp_line[0] + ' ' + temp_line[1]) + for item in workers_list: + if workers_list[item].fullName == temp_full_name: + workers_list[item].addWorkHour(int(temp_line[2])) + +hours_file.close() + + +print(workers_list[3].fullName, workers_list[3].actualSalary) + + + + diff --git a/lesson06/home_work/hw06_normal.py b/lesson06/home_work/hw06_normal.py index e5a1581e1..0252b096f 100644 --- a/lesson06/home_work/hw06_normal.py +++ b/lesson06/home_work/hw06_normal.py @@ -11,3 +11,50 @@ # 3. Получить список всех предметов указанного ученика (Ученик --> Класс --> Учителя --> Предметы) # 4. Узнать ФИО родителей указанного ученика # 5. Получить список всех Учителей, преподающих в указанном классе + +class People: + def __init__(self, name, surname, patronymic): + self.name = name + self.surname = surname + self.patronymic = patronymic + + @property + def fullName(self): + return '{0} {1} {2} '.format(self.surname, self.name, self.patronymic) + + + +class Student(People): + def __init__(self, name, surname, patronymic, class_id, mother, father): + People.__init__(self, name, surname, patronymic) + self.class_id = class_id + self.mother = mother.fullName + self.father = father.fullName + + + +class Teacher(People): + def __init__(self, name, surname, patronymic, subject): + People.__init__(self, name, surname, patronymic) + self.subject = subject + + + +class Parents(People): + def __init__(self, name, surname, patronumic): + People.__init__(self, name, surname, patronumic) + + + + +class School_class: + def __init__(self, class_id): + self.class_id = class_id + + + +mother1 = Parents('Лидия', 'Васильева', 'Антоновна') +father1 = Parents('Александр', 'Васильев', 'Владимирович') +student1 = Student('Максим', 'Васильев', 'Александрович', '7Б', mother1, father1) + +print(student1.mother) \ No newline at end of file diff --git a/lesson07/home_work/HW7.py b/lesson07/home_work/HW7.py new file mode 100644 index 000000000..e69de29bb diff --git a/lesson07/home_work/hw7/main.py b/lesson07/home_work/hw7/main.py new file mode 100644 index 000000000..4f6ab67e1 --- /dev/null +++ b/lesson07/home_work/hw7/main.py @@ -0,0 +1,134 @@ +import random + +# Инициализируем игру, создаем игроков и их карточки +# (так кстати можно будет расширить игру более чем на 1 игрока) +class GameStart(): + def __init__(self): + self.compUser = Gamer() + self.user = Gamer() + self.Loto = GameLoto() + + +class GameLoto(): + # Тут создаем мешок и список выпавших номерков + def __init__(self): + self.bag = list(range(1, 91)) + self.relised_keg = list() + + # Каждый шаг надо вызывать этот метод, дабы получить один из боченков в мешке. + # Метод возвращает выпавший номерок, и вынимает его из мешка и перекладывает в список выпавших номерков + @property + def step(self): + keg = random.choice(self.bag) + self.bag.remove(keg) + self.relised_keg.append(keg) + return keg + + # метод проверяет есть ли в карточке выпавший номерок, + # вернет None если номерка нет, или вернет позицию номерка в массиве + def game_cours(self, keg, card): + result = None + #тут проходим по массиву и проверяем есть ли у нас в карточке совпадение + for idx, item in enumerate(card): + if item.count(keg): + result = [idx, item.index(keg)] + + return result + + + + +class Gamer(): + + def __init__(self): + self.user_card = self.visualCard + self.match_keg = list() + + @property + def cardGen(self): + card = set(random.sample(range(1, 91), 15)) + card = list(card) + card = [card[0:5], card[5:10], card[10:15]] + return card + + @property + def visualCard(self): + card = list() + + for item in self.cardGen: + item.sort() + card.append(item) + + return card + + + def kegStrike(self, key): + + if key: + self.match_keg.append(self.user_card[key[0]][key[1]]) + self.user_card[key[0]][key[1]] = '+' + return True + else: + False + + + +game1 = GameStart() + +def ansverCheck(keg): + + if game1.user.kegStrike(game1.Loto.game_cours(keg, game1.user.user_card)): + return True + return False + +def compCheck(keg): + game1.compUser.kegStrike(game1.Loto.game_cours(keg, game1.compUser.user_card)) + +#наверное этот цикл надо было вынести в метод и функции которые выше, но я уже хочу спать +while True: + + keg = game1.Loto.step + print('Новый бочонок: {0} (осталось: {1})' .format(keg, len(game1.Loto.bag))) + print('{0:^30}\n {1:^30}\n {2:^30}\n {3:^30}'.format('ваша карточка', ' '.join(map(str, game1.user.user_card[0])), + ' '.join(map(str, game1.user.user_card[1])), + ' '.join(map(str, game1.user.user_card[2])))) + + print('{0:^30}\n {1:^30}\n {2:^30}\n {3:^30}'.format('карточка компьютера', + ' '.join(map(str, game1.compUser.user_card[0])), + ' '.join(map(str, game1.compUser.user_card[1])), + ' '.join(map(str, game1.compUser.user_card[2])))) + + # print('{}'.format(game1.Loto.game_cours(keg, game1.user.user_card))) + + if len(game1.user.match_keg) == 15: + print('БИНГО!!!\n Вы победили') + break + + elif len(game1.compUser.match_keg) == 15: + print('Игра окончена победил Компьютер') + break + + user_ansver = input('Зачеркнуть цифру? (Y/N) \n') + + + compCheck(keg) + if user_ansver.upper() == 'Y': + if ansverCheck(keg): + continue + else: + print('Игра окончена вы проиграли') + break + + elif game1.Loto.game_cours(keg, game1.user.user_card): + print('Игра окончена вы проиграли') + break + + + + + + + + + +