You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kubsu-sm5-ruby/lab3_task1_funcation_block_arg/main.rb

115 lines
3.8 KiB

def indices_sorted_by_descending_values(array)
array.each_with_index.to_a
.sort_by { |(element, index)| -element }
.map { |(element, index)| index }
end
def elements_between_first_and_second_max(array)
max_value = array.max
max_indices = array.each_with_index.select { |element, index| element == max_value }.map { |_, index| index }
if max_indices.size >= 2
first_max_index = max_indices[0]
second_max_index = max_indices[1]
else
second_max_value = array.select { |element| element != max_value }.max
return [] if second_max_value.nil?
first_max_index = array.index(max_value)
second_max_index = array.index(second_max_value)
end
first_max_index, second_max_index = [first_max_index, second_max_index].sort
array[(first_max_index + 1)...second_max_index]
end
def elements_between_first_and_last_max(array)
max_value = array.max
first_max_index = array.index(max_value)
last_max_index = array.rindex(max_value)
return [] if first_max_index == last_max_index
first_max_index, last_max_index = [first_max_index, last_max_index].sort
array[(first_max_index + 1)...last_max_index]
end
def minimal_even_element(array)
even_elements = array.select(&:even?)
even_elements.min
end
def prime_divisors(number)
require 'prime'
(2..number).select { |x| number % x == 0 && Prime.prime?(x) }
end
# IO
def get_array_input(input_method)
if input_method == 1
puts "Введите элементы массива через пробел:"
gets.chomp.split.map(&:to_i)
elsif input_method == 2
puts "Введите имя файла:"
file_name = gets.chomp
File.read(file_name).split.map(&:to_i)
else
raise "Неверный метод ввода."
end
end
def get_number_input(input_method)
if input_method == 1
puts "Введите число:"
gets.chomp.to_i
elsif input_method == 2
puts "Введите имя файла:"
file_name = gets.chomp
File.read(file_name).to_i
else
raise "Неверный метод ввода."
end
end
puts "Выберите задачу для выполнения:"
puts "1. Вывести индексы массива в порядке убывания элементов."
puts "2. Найти элементы между первым и вторым максимальным."
puts "3. Найти элементы между первым и последним максимальным."
puts "4. Найти минимальный четный элемент."
puts "5. Найти все простые делители числа."
task_number = gets.chomp.to_i
puts "Выберите метод ввода данных (1: С клавиатуры, 2: Из файла):"
input_method = gets.chomp.to_i
case task_number
when 1
array = get_array_input(input_method)
puts "Индексы в порядке убывания элементов:"
puts indices_sorted_by_descending_values(array).join(", ")
when 2
array = get_array_input(input_method)
puts "Элементы между первым и вторым максимальным:"
puts elements_between_first_and_second_max(array).join(", ")
when 3
array = get_array_input(input_method)
puts "Элементы между первым и последним максимальным:"
puts elements_between_first_and_last_max(array).join(", ")
when 4
array = get_array_input(input_method)
puts "Минимальный четный элемент:"
puts minimal_even_element(array)
when 5
number = get_number_input(input_method)
puts "Простые делители числа:"
puts prime_divisors(number).join(", ")
else
puts "Неверный номер задачи."
end