Last active
September 25, 2023 06:25
-
-
Save maestroviktorin/0e45a0db83b5db32cb9abbd01fc25f41 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| from random import randint | |
| def print_info(): | |
| information = \ | |
| """ | |
| Лабораторная работа № 2 | |
| Вариант № 20. Выполнил студент группы 6104-020302D Стародубцев Виктор | |
| 1. В списке целочисленных элементов найти максимальный нечётный элемент | |
| 2. С использованием цикла `while` найти в списке индекс последнего | |
| отрицательного чётного элемента | |
| 3. Отсортировать список по убыванию младших цифр элементов списка методом быстрой сортировки | |
| """ | |
| print(information) | |
| def get_ints_list(nums: str) -> list[int]: | |
| nums = [int(x) for x in nums.split()] | |
| return nums | |
| def get_ints_list_random(elements_amount: int, lower_bound: int, upper_bound: int) -> list[int]: | |
| nums = [randint(lower_bound, upper_bound) for j in range(elements_amount)] | |
| return nums | |
| def first_task(nums: list[int]) -> int: | |
| result = -(2 ** 64) | |
| for i in range(len(nums)): | |
| if (nums[i] > result) and (abs(nums[i]) % 2 != 0): | |
| result = nums[i] | |
| return result | |
| def second_task(nums: list[int]) -> int: | |
| i = len(nums) - 1 | |
| while (i >= 0) and not ((nums[i] < 0) and (abs(nums[i]) % 2 == 0)): | |
| i -= 1 | |
| return i | |
| # TODO: Reimplement iteratively. | |
| # Deprecated. | |
| def third_task(nums: list[int]) -> list[int]: | |
| if len(nums) < 2: | |
| return nums | |
| pivot = nums[len(nums) // 2] | |
| pivot_last_digit = abs(pivot) % 10 | |
| less, equal, greater = list(), list(), list() | |
| for num in nums: | |
| num_last_digit = abs(num) % 10 | |
| if num_last_digit < pivot_last_digit: | |
| to_append = less | |
| elif num_last_digit == pivot_last_digit: | |
| to_append = equal | |
| else: | |
| to_append = greater | |
| to_append.append(num) | |
| return third_task(greater) + equal + third_task(less) | |
| def third_task(nums: list[int]) -> list[int]: | |
| stack = [(0, len(nums) - 1)] | |
| while stack: | |
| left, right = stack.pop() | |
| pivot = nums[right] | |
| i = left - 1 | |
| for j in range(left, right): | |
| jth_last_digit, pivot_last_digit = abs( | |
| nums[j]) % 10, abs(pivot) % 10 | |
| if jth_last_digit >= pivot_last_digit: | |
| i += 1 | |
| nums[i], nums[j] = nums[j], nums[i] | |
| nums[i + 1], nums[right] = nums[right], nums[i + 1] | |
| pivot_index = i + 1 | |
| if pivot_index - 1 > left: | |
| stack.append((left, pivot_index - 1)) | |
| if pivot_index + 1 < right: | |
| stack.append((pivot_index + 1, right)) | |
| return nums | |
| def main(): | |
| print_info() | |
| # Определение пользователем способа заполнения списка. | |
| print("Введите способ заполнения списка:", | |
| "1 - ввод элементов списка в одну строку через пробел;", | |
| "Любое другое число - автоматическое формирование списка из `n` элементов.", | |
| sep='\n') | |
| match input(): | |
| case '1': | |
| nums = input("Введите в строку через пробел элементы списка:\n") | |
| nums = get_ints_list(nums) | |
| case _: | |
| elements_amount = int( | |
| input("Введите количество случайных элементов в требуемом списке:\n")) | |
| print("Введите диапазон (минимальное и максимальное числа через пробел), " | |
| + "в котором будут находиться случайные элементы:") | |
| lower_bound, upper_bound = [int(x) for x in input().split()] | |
| nums = get_ints_list_random( | |
| elements_amount, lower_bound, upper_bound) | |
| # Первое задание. Обработка результата. | |
| first_result = first_task(nums) | |
| if first_result == -(2 ** 64): | |
| print("В заданном списке нет отрицательных чётных чисел") | |
| else: | |
| print(f"Максимальный нечётный элемент в списке = {first_result}\n") | |
| # Второе задание. Обработка результата. | |
| second_result = second_task(nums) | |
| if second_result < 0: | |
| print("В заданном списке нет отрицательных чётных чисел") | |
| else: | |
| print( | |
| f"Индекс последнего отрицательного чётного элемента = {second_result}") | |
| # Третье задание. | |
| print(f"Исходный список:", nums, sep='\n') | |
| print(f"Список после быстрой сортировки по убыванию младших цифр:", | |
| third_task(nums), sep='\n') | |
| if __name__ == "__main__": | |
| main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment