Skip to content

Instantly share code, notes, and snippets.

@maestroviktorin
Last active September 25, 2023 06:25
Show Gist options
  • Select an option

  • Save maestroviktorin/0e45a0db83b5db32cb9abbd01fc25f41 to your computer and use it in GitHub Desktop.

Select an option

Save maestroviktorin/0e45a0db83b5db32cb9abbd01fc25f41 to your computer and use it in GitHub Desktop.
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