From 7b7da52da108c400c17eba236b450e97fb6f72d7 Mon Sep 17 00:00:00 2001 From: EvgenKi Date: Sun, 12 Dec 2021 14:53:49 +0200 Subject: [PATCH 1/5] Tray(3) --- dk92_kiba/Lab_Rab_0.py | 149 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 dk92_kiba/Lab_Rab_0.py diff --git a/dk92_kiba/Lab_Rab_0.py b/dk92_kiba/Lab_Rab_0.py new file mode 100644 index 0000000..0826704 --- /dev/null +++ b/dk92_kiba/Lab_Rab_0.py @@ -0,0 +1,149 @@ +def Index(index_cod, list_cod, rotor_dict): + """Данная функция ищет индексы по елементам в словаре. + + Она нужна для более легкого поиска и оброботки значений. + + """ + index_cod = [ + key + for el in list_cod + for key, value in rotor_dict.items() + if el == value + ] + + return index_cod + + +def Rotor_norm(index_cod, sum): + """ Функция выступает 3-тим фиксированым ротором.""" + + result = [sum - x for x in index_cod] + + return result + + +def Rotor_in(index_key,index_cod): + """Начало входа в первую часть роторов(начало шифровки).""" + result_list = [ + value + for _ in range(len(index_cod)) + for value in index_key + ] + + result = [ + x - y + for x, y in zip(index_cod, result_list) + ] + + return result + + +def Rotor_out(index_key, index_cod, count): + """Выход и обработки значени(конец шифроки).""" + result_list = [ + symbol + for _ in range(len(index_cod)) + for symbol in index_key + ] + + result=[x + y for x, y in zip(index_cod, result_list)] + + return result + + +def Sum_chek(index_cod): + """Отдельная функция для проверки диапазона кодируемых индексов.""" + for key in range(len(index_cod)): + + if index_cod[key] < 0: + index_cod[key] = index_cod[key] + 38 + + elif index_cod[key] > 38: + index_cod[key] = index_cod[key] - 38 + + return index_cod + + +def Coder(index_key, index_cod, count, sum): + """Функция реализована для упращения работы. + + Может виступать как для шифровки так и для дешифровки. + + """ + + for x in index_key: + index_cod = Rotor_in(index_key, index_cod) + index_cod = Sum_chek(index_cod) + + index_cod = Rotor_norm(index_cod, sum) + + for x in index_key: + index_cod = Rotor_out(index_key, index_cod, count) + index_cod = Sum_chek(index_cod) + + return index_cod + + +def Unindex(index_cod, list_cod, rotor_dict): + """Ищет по индексу буквы в словаре и перености их в лист.""" + + list_cod = [ + value + for el in index_cod + for key, value in rotor_dict.items() + if el == key + ] + + return list_cod + + +rotor_dict = { + 0:'0',6:'F',12:'L',18:'S',24:'Y',30:'4',36:'_', + 1:'A',7:'G',13:'M',19:'T',25:'Z',31:'5',37:'.', + 2:'B',8:'H',14:'O',20:'U',26:'N',32:'6',38:',', + 3:'C',9:'Q',15:'P',21:'V',27:'1',33:'7', + 4:'D',10:'J',16:'I',22:'W',28:'2',34:'8', + 5:'E',11:'K',17:'R',23:'X',29:'3',35:'9' + } +# Инициализация словаря для индексации. + +string_cod = input("Введите кодируемое слово: ").upper() +string_key = input("Введите слово шифровки: ").upper() +# Ввод кодируемого слова и его ключа. + +space = string_cod.split() +string_cod = '_'.join(space) +space = string_key.split() +string_key = '_'.join(space) +# Замена пробелов для возможности их кодировки. + +count = len (string_key) + +list_key = list(string_key) +list_cod = list(string_cod) +# Разделение строки посимвольно для дальнешей индексации. + +index_cod = [] +index_key = [] + +index_cod = Index(index_cod, list_cod, rotor_dict) +index_key = Index(index_key, list_key, rotor_dict) +# Инициализация поиска индесов. + + + +sum = sum(index_key) +# Сумма ключа нужна для фиксированого ротора. + +index_cod = Coder(index_key, index_cod, count,sum) +list_cod = Unindex(index_cod, list_cod, rotor_dict) +string_cod = "".join(list_cod) +print("Результат шифроки: ", string_cod) +# Блок кода отвечает за пoлный процесс шифровки кодруемого слова. + +index_cod = Coder(index_key, index_cod, count,sum) +list_cod = Unindex(index_cod, list_cod, rotor_dict) +string_cod = "".join(list_cod) +print("Результат дешифровки: ", string_cod) +# Аналогичный блок когда, но отвечающий за дешифровку. + From 50d1c908119679438f4d48c71c336ccb2d109c9f Mon Sep 17 00:00:00 2001 From: EvgenKi Date: Sun, 12 Dec 2021 15:38:19 +0200 Subject: [PATCH 2/5] Tray(5) --- dk92_kiba/Readme_0.rst | 4 ++++ dk92_kiba/Readme_1.rst | 7 +++++++ 2 files changed, 11 insertions(+) create mode 100644 dk92_kiba/Readme_0.rst create mode 100644 dk92_kiba/Readme_1.rst diff --git a/dk92_kiba/Readme_0.rst b/dk92_kiba/Readme_0.rst new file mode 100644 index 0000000..471cd10 --- /dev/null +++ b/dk92_kiba/Readme_0.rst @@ -0,0 +1,4 @@ +#Робоча директорія Student: Киба Евгений**/**EvgenKi +Группа:ДК-92 + +Telegram:@Evg_172Ce9 \ No newline at end of file diff --git a/dk92_kiba/Readme_1.rst b/dk92_kiba/Readme_1.rst new file mode 100644 index 0000000..74eeb7a --- /dev/null +++ b/dk92_kiba/Readme_1.rst @@ -0,0 +1,7 @@ +При виконанні роботи було створенно программу, голоною функцією якої було шифруання слів за методикою єнігми. +Модифікацією було створення керування числа роторів за допомогою довжини слова. + +Заміри часу циклів: + +При замірах часу виявилось, що цикл for виконується за 0.85 часу while.(while= 22,5699, for=19,002479) +Однак , якщо для ітерації використовуюьться методів range та zip цикл for відпрацьовував довше ніж while From 1c0444b00c893b5a7b375972f200b3a598f1a43d Mon Sep 17 00:00:00 2001 From: EvgenKi Date: Sun, 12 Dec 2021 16:34:45 +0200 Subject: [PATCH 3/5] try(8) --- dk92_kiba/Readme_0.rst | 4 ---- dk92_kiba/{Readme_1.rst => lab0/README.rst} | 8 ++++++++ dk92_kiba/{Lab_Rab_0.py => lab0/lab0.py} | 0 3 files changed, 8 insertions(+), 4 deletions(-) delete mode 100644 dk92_kiba/Readme_0.rst rename dk92_kiba/{Readme_1.rst => lab0/README.rst} (82%) rename dk92_kiba/{Lab_Rab_0.py => lab0/lab0.py} (100%) diff --git a/dk92_kiba/Readme_0.rst b/dk92_kiba/Readme_0.rst deleted file mode 100644 index 471cd10..0000000 --- a/dk92_kiba/Readme_0.rst +++ /dev/null @@ -1,4 +0,0 @@ -#Робоча директорія Student: Киба Евгений**/**EvgenKi -Группа:ДК-92 - -Telegram:@Evg_172Ce9 \ No newline at end of file diff --git a/dk92_kiba/Readme_1.rst b/dk92_kiba/lab0/README.rst similarity index 82% rename from dk92_kiba/Readme_1.rst rename to dk92_kiba/lab0/README.rst index 74eeb7a..3a1de0f 100644 --- a/dk92_kiba/Readme_1.rst +++ b/dk92_kiba/lab0/README.rst @@ -1,3 +1,11 @@ +Lab_rab_0: +#Робоча директорія Student: Киба Евгений**/**EvgenKi +Группа:ДК-92 + +Telegram:@Evg_172Ce9 + + +Lab_rab_1: При виконанні роботи було створенно программу, голоною функцією якої було шифруання слів за методикою єнігми. Модифікацією було створення керування числа роторів за допомогою довжини слова. diff --git a/dk92_kiba/Lab_Rab_0.py b/dk92_kiba/lab0/lab0.py similarity index 100% rename from dk92_kiba/Lab_Rab_0.py rename to dk92_kiba/lab0/lab0.py From 1acb4803670e1abf0f5a4c130d7bf93952ec0789 Mon Sep 17 00:00:00 2001 From: EvgenKi Date: Sun, 12 Dec 2021 17:59:26 +0200 Subject: [PATCH 4/5] lab1 --- dk92_kiba/lab0/README.rst | 9 --- dk92_kiba/lab1/README.rst | 10 +++ dk92_kiba/lab1/lab1.py | 157 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 167 insertions(+), 9 deletions(-) create mode 100644 dk92_kiba/lab1/README.rst create mode 100644 dk92_kiba/lab1/lab1.py diff --git a/dk92_kiba/lab0/README.rst b/dk92_kiba/lab0/README.rst index 3a1de0f..d3be2eb 100644 --- a/dk92_kiba/lab0/README.rst +++ b/dk92_kiba/lab0/README.rst @@ -4,12 +4,3 @@ Lab_rab_0: Telegram:@Evg_172Ce9 - -Lab_rab_1: -При виконанні роботи було створенно программу, голоною функцією якої було шифруання слів за методикою єнігми. -Модифікацією було створення керування числа роторів за допомогою довжини слова. - -Заміри часу циклів: - -При замірах часу виявилось, що цикл for виконується за 0.85 часу while.(while= 22,5699, for=19,002479) -Однак , якщо для ітерації використовуюьться методів range та zip цикл for відпрацьовував довше ніж while diff --git a/dk92_kiba/lab1/README.rst b/dk92_kiba/lab1/README.rst new file mode 100644 index 0000000..41d8071 --- /dev/null +++ b/dk92_kiba/lab1/README.rst @@ -0,0 +1,10 @@ + +Lab_rab_1: +При виконанні роботи було створенно программу, голоною функцією якої було шифруання слів за методикою єнігми. +Модифікацією,від зввичайної Енігми, було створення керування числа роторів за допомогою довжини слова. +також були проведені заміри часу виконання программи. + +Заміри часу циклів: + +При замірах часу виявилось, що цикл for виконується за 0.85 часу while.(while= 22,5699, for=19,002479) +Однак , якщо для ітерації використовуюьться методів range та zip цикл for відпрацьовував довше ніж while diff --git a/dk92_kiba/lab1/lab1.py b/dk92_kiba/lab1/lab1.py new file mode 100644 index 0000000..20b3938 --- /dev/null +++ b/dk92_kiba/lab1/lab1.py @@ -0,0 +1,157 @@ +import timeit + +def Index(index_cod, list_cod, rotor_dict): + """Данная функция ищет индексы по елементам в словаре. + + Она нужна для более легкого поиска и оброботки значений. + + """ + index_cod = [ + key + for el in list_cod + for key, value in rotor_dict.items() + if el == value + ] + + return index_cod + + +def Rotor_norm(index_cod, sum): + """ Функция выступает 3-тим фиксированым ротором.""" + + result = [sum - x for x in index_cod] + + return result + + +def Rotor_in(index_key,index_cod): + """Начало входа в первую часть роторов(начало шифровки).""" + result_list = [ + value + for _ in range(len(index_cod)) + for value in index_key + ] + + result = [ + x - y + for x, y in zip(index_cod, result_list) + ] + + return result + + +def Rotor_out(index_key, index_cod, count): + """Выход и обработки значени(конец шифроки).""" + result_list = [ + symbol + for _ in range(len(index_cod)) + for symbol in index_key + ] + + result=[x + y for x, y in zip(index_cod, result_list)] + + return result + + +def Sum_chek(index_cod): + """Отдельная функция для проверки диапазона кодируемых индексов.""" + for key in range(len(index_cod)): + + if index_cod[key] < 0: + index_cod[key] = index_cod[key] + 38 + + elif index_cod[key] > 38: + index_cod[key] = index_cod[key] - 38 + + return index_cod + + +def Coder(index_key, index_cod, count, sum): + """Функция реализована для упращения работы. + + Может виступать как для шифровки так и для дешифровки. + + """ + + for x in index_key: + index_cod = Rotor_in(index_key, index_cod) + index_cod = Sum_chek(index_cod) + + index_cod = Rotor_norm(index_cod, sum) + + for x in index_key: + index_cod = Rotor_out(index_key, index_cod, count) + index_cod = Sum_chek(index_cod) + + return index_cod + + +def Unindex(index_cod, list_cod, rotor_dict): + """Ищет по индексу буквы в словаре и перености их в лист.""" + + list_cod = [ + value + for el in index_cod + for key, value in rotor_dict.items() + if el == key + ] + + return list_cod + + +rotor_dict = { + 0:'0',6:'F',12:'L',18:'S',24:'Y',30:'4',36:'_', + 1:'A',7:'G',13:'M',19:'T',25:'Z',31:'5',37:'.', + 2:'B',8:'H',14:'O',20:'U',26:'N',32:'6',38:',', + 3:'C',9:'Q',15:'P',21:'V',27:'1',33:'7', + 4:'D',10:'J',16:'I',22:'W',28:'2',34:'8', + 5:'E',11:'K',17:'R',23:'X',29:'3',35:'9' + } +# Инициализация словаря для индексации. + +string_cod = input("Введите кодируемое слово: ").upper() +string_key = input("Введите слово шифровки: ").upper() +# Ввод кодируемого слова и его ключа. + +space = string_cod.split() +string_cod = '_'.join(space) +space = string_key.split() +string_key = '_'.join(space) +# Замена пробелов для возможности их кодировки. + +count = len (string_key) + +list_key = list(string_key) +list_cod = list(string_cod) +# Разделение строки посимвольно для дальнешей индексации. + +index_cod = [] +index_key = [] + +index_cod = Index(index_cod, list_cod, rotor_dict) +index_key = Index(index_key, list_key, rotor_dict) +# Инициализация поиска индесов. + + + +sum = sum(index_key) +# Сумма ключа нужна для фиксированого ротора. +index_cod = Coder(index_key, index_cod, count,sum) +list_cod = Unindex(index_cod, list_cod, rotor_dict) +string_cod = "".join(list_cod) +print("Результат шифроки: ", string_cod) +# Блок кода отвечает за пoлный процесс шифровки кодруемого слова. + +print("Время выполнения блока шифровки: ",timeit.timeit() ) +# Підрахування часу виконування блока шифроки + +index_cod = Coder(index_key, index_cod, count,sum) +list_cod = Unindex(index_cod, list_cod, rotor_dict) +string_cod = "".join(list_cod) +print("Результат дешифровки: ", string_cod) + +# Аналогичный блок когда, но отвечающий за дешифровку. + +print("Время выполнения блока дешифровки: ", timeit.timeit()) +# Підрахування часу виконування блока дешифроки + From 79e1180236b0b83af35105ed422331399c1b25bb Mon Sep 17 00:00:00 2001 From: EvgenKi Date: Thu, 23 Dec 2021 02:56:23 +0200 Subject: [PATCH 5/5] Lab_rab_2_3 --- dk92_kiba/lab2/README.rst | 6 +++ dk92_kiba/lab2/lab2.py | 96 ++++++++++++++++++++++++++++++++++++++ dk92_kiba/lab3/README.txt | 9 ++++ dk92_kiba/lab3/rand_gen.py | 80 +++++++++++++++++++++++++++++++ 4 files changed, 191 insertions(+) create mode 100644 dk92_kiba/lab2/README.rst create mode 100644 dk92_kiba/lab2/lab2.py create mode 100644 dk92_kiba/lab3/README.txt create mode 100644 dk92_kiba/lab3/rand_gen.py diff --git a/dk92_kiba/lab2/README.rst b/dk92_kiba/lab2/README.rst new file mode 100644 index 0000000..79b528e --- /dev/null +++ b/dk92_kiba/lab2/README.rst @@ -0,0 +1,6 @@ +lab2: +Було створено декілько класів, що наслідуються одне від одного та присвоєні їм свої змінні. +Кожна змінна реалізовані через иниціалізатор класу __init__. +Використовувася метод super() для визову батьківського конструктору та методів виводу на консоль данних. +Підтвердженя працездатності коду є у функції work_check(). +Також використовувались методи __eq__, __lt__ та __le__, що визначають значення роботи операторів. diff --git a/dk92_kiba/lab2/lab2.py b/dk92_kiba/lab2/lab2.py new file mode 100644 index 0000000..ff16c2e --- /dev/null +++ b/dk92_kiba/lab2/lab2.py @@ -0,0 +1,96 @@ + + +class ComputorGame: + + def __init__(self, station_name, release_name, developent_name): + self.paltform_name = station_name + self.release_game_name = release_name + self.studio_development = developent_name + + def get_game_info(self): + return ( + f"Имя платормы: {self.paltform_name}" + f"\nИмя игры: {self.release_game_name}" + f"\nИмя разработчика: {self.studio_development}" + ) + #Створення обьекта батька від якого буде наслідування + + +class Strategy(ComputorGame): + + def __init__(self, station_name, release_name, developent_name, number_of_players): + super().__init__(station_name, release_name, developent_name) + self.number_of_playerse = number_of_players + + + def __eq__(self, other): + return self.number_of_playerse == other.number_of_playerse + + def __lt__(self, other): + return self.number_of_playerse < other.number_of_playerse + + def __le__(self, other): + return self.number_of_playerse <= other.number_of_playerse + + def _repr_(self): + return f"Игра была создана на {self.number_of_playerse} игроко" + + def get_game_info(self): + return f"{super().get_game_info()} \nМаксимум игроков {self.number_of_playerse}\n" + + + +class RPG(ComputorGame): + + def __init__(self,station_name, release_name, + developent_name, number_of_skills): + super().__init__(station_name, release_name, developent_name) + self.number_of_skills = number_of_skills + + def __str__(self): + return f"В игре есть{self.number_of_skills} навыков" + + def get_game_info(self): + return f"{super().get_game_info()} \nКоличство навыков {self.number_of_skills}\n" + +class RTS(Strategy): + + def __init__(self,station_name, release_name, + developent_name, number_of_players,map_size): + super().__init__(station_name, release_name, developent_name, number_of_players) + self.map_size = map_size + + def get_game_info(self): + return f"{super().get_game_info()}Размер карт: {self.map_size}\n" + + +def work_check(): + print("Проверка работы!") + + civilization = Strategy("PC", "Civilization", "Sid Mair", 16) + print(civilization.get_game_info()) + + divinity = RPG("PC", "Divinity", "Biowar", 24) + print(divinity.get_game_info()) + + cac = RTS("PC","CaC","GSC",8,2) + print(cac.get_game_info()) + + civilization_2 = Strategy("PC","Civilization 2","Sid Mair",32) + + if(civilization_2 == civilization): + print(civilization_2.release_game_name,"==", + civilization.release_game_name) + + elif(civilization <= civilization_2): + print(civilization.release_game_name,"<=", + civilization_2.release_game_name) + + if(civilization < civilization_2): + print(civilization.release_game_name,"<", + civilization_2.release_game_name) + + +if __name__ == "__main__": + + work_check() \ No newline at end of file diff --git a/dk92_kiba/lab3/README.txt b/dk92_kiba/lab3/README.txt new file mode 100644 index 0000000..a27ad85 --- /dev/null +++ b/dk92_kiba/lab3/README.txt @@ -0,0 +1,9 @@ +lab 3: +Перелік змін +- Було використано python black formatter для формування скрипту по PEP8 +- Назви змінних були переіменовані на більш локанічні для розуміння коду. +- Зміна, що відповідала за перевод імен була винесена у окрему функцію. +- Дільник питань став глобальною змінною. +- Були видаленні закомічені строки коди, що не виконували функію. +- Функція, що спочатку видаляла шарп а потім знов його всталяла для питань була видалена. +- Була видалена функція сортировки питань, оскільки далі ввсе одно все змішувалось. \ No newline at end of file diff --git a/dk92_kiba/lab3/rand_gen.py b/dk92_kiba/lab3/rand_gen.py new file mode 100644 index 0000000..f9709a3 --- /dev/null +++ b/dk92_kiba/lab3/rand_gen.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python3 +import itertools +import random +from pathlib import Path + +from transliterate import translit +from yaml import safe_load + +QUESTIONS_SET_SEPARATOR = "=" * 30 + "\n" + + +def translate_to_en(value): + return translit(value, language_code="uk", reversed=True) + + +def parse_students(filename): + with open(filename) as yaml_file: + student_names_by_group: dict = safe_load(yaml_file) + return { + translate_to_en(group_name): [ + (translate_to_en(student_name).replace(" ", "_"), student_name) + for student_name in student_names + ] + for group_name, student_names in student_names_by_group.items() + } + + +def read_questions(questions_dir): + questions_dir_path = Path(questions_dir) + questions_by_filename = {} + for file in questions_dir_path.glob("*.*"): + with open(file) as f: + questions = f.read().split("\n") + questions_by_filename[file.name] = questions + + return questions_by_filename + + +def generate_questions_sets(students, questions, numeach=2): + files = { + f"{group_name}_{translate_name}.rst": f"{QUESTIONS_SET_SEPARATOR}{origin_name}\n{QUESTIONS_SET_SEPARATOR}\n" + for group_name, student_names in students.items() + for translate_name, origin_name in student_names + } + + for category_name, category in questions.items(): + print(f"{category_name:<40}", end="\t") + personal = list(itertools.combinations(category, numeach)) + print(f"{len(personal)} combinations") + assert ( + len(personal) >= len(files), + "Please add more categories and questions to prevent questions set redunate!", + ) + random.shuffle(personal) + for filename in files: + files[filename] += "\n" + "\n\n".join(personal.pop(0)) + "\n" + + return files + + +def write_questions_sets(outdir, question_sets): + odir = Path(outdir) + odir.mkdir(exist_ok=True) + for filename, contents in question_sets.items(): + file = odir.joinpath(filename) + with open(file, "x") as f: + f.write(contents) + + +if __name__ == "__main__": + from sys import argv + + if len(argv) != 4: + print(f"Usage\n{argv[0]} student_list questions_dir out_dir") + exit(-1) + student_list, questions_dir, out_dir = argv[1:] + st = parse_students("student_list.yaml") + q = read_questions("questions_dir") + cont = generate_questions_sets(st, q, numeach=2) + write_questions_sets(out_dir, cont)