diff --git a/lab1/README.md b/lab1/README.md new file mode 100644 index 0000000..21c405d --- /dev/null +++ b/lab1/README.md @@ -0,0 +1,67 @@ +# Lab 1 + +--- + +## 01. Hello world + +Task: + +Установить компилятор и текстовый редактор. Реализовать и +вызвать Hello World c комментарием. (ну как всегда) + +```bash +ruby 01_hello_world.rb +``` + +Returns: + +``` +Hello, world! +``` + +## 02. User interface + +Task: + +Принять имя пользователя как аргумент программы. +Поздороваться с пользователем с использованием форматирования +строки. Спросить какой язык у пользователя любимый, в случае, если это +ruby, ответить что пользователь подлиза, иначе обязательно ответить, что +скоро будет ruby и поставить различные комментарии для нескольких +языков. + +```bash +ruby 02_user_interface.rb darius +``` + +## 03. User interface with ruby and os commands execution + +Task: + +3.Продолжение предыдущего задания. Попросить пользователя +ввести команду языка ruby. И команду OC. Выполнить команду руби и +команду операционной системы. + +```bash +ruby 03_fork_02_with_exec_pasted_command.rb darius +``` + +## 04. Number funcations + +Task: + +«Работа с числами». Составить 3 метода для работы с цифрами или делителей числа на основании варианта. Каждый метод отдельный коммит. + +- Метод 1. Найти количество четных чисел, не взаимно простых с данным +- Метод 2. Найти максимальную цифры числа, не делящуюся на 3. +- Метод 3. Найти произведение максимального числа, не взаимно простого с данным, не делящегося на наименьший делитель исходно числа, и суммы цифр числа, меньших 5. + +```bash +ruby 04_number_funcs.rb +``` + +--- + +Author: Artem-Darius Weber + +Licence: MIT \ No newline at end of file diff --git a/lab1/spec/spec_02.rb b/lab1/spec/spec_02.rb new file mode 100644 index 0000000..44080ff --- /dev/null +++ b/lab1/spec/spec_02.rb @@ -0,0 +1,16 @@ +require_relative '../src/02_user_interface.rb' + +RSpec.describe "Main" do + before do + allow(STDIN).to receive(:gets).and_return("ruby\n") + end + + it "greets the user and checks Ruby as language" do + expect { main() }.to output("Hello my catgirl test_user! \nWhat is your love language?\nruby\nc++\npy\nПодлиза \n").to_stdout + end + + it "handles unknown language input" do + allow(STDIN).to receive(:gets).and_return("java\n") + expect { main() }.to output(/Неизвестный язык: java/).to_stdout + end +end \ No newline at end of file diff --git a/lab1/spec/spec_03.rb b/lab1/spec/spec_03.rb new file mode 100644 index 0000000..434b534 --- /dev/null +++ b/lab1/spec/spec_03.rb @@ -0,0 +1,34 @@ +require_relative '../src/03_fork_02_with_exec_pasted_command.rb' + +RSpec.describe "Main" do + before do + allow(STDIN).to receive(:gets).and_return("ruby\n", "puts 'Hello from Ruby!'\n", "echo 'Hello from shell!'\n") + allow(ARGV).to receive(:[]).with(0).and_return("test_user") + end + + it "greets the user and processes ruby input" do + expect { main() }.to output(/Hello my catgirl test_user! \nWhat is your love language?\nruby\nc++\npy\nПодлиза \n/).to_stdout + end + + it "executes valid ruby command" do + allow(STDIN).to receive(:gets).and_return("ruby\n", "puts 'Hello from Ruby!'\n") + + expect { main() }.to output(/Hello from Ruby!/).to_stdout + end + + it "handles ruby command execution error" do + allow(STDIN).to receive(:gets).and_return("ruby\n", "invalid_ruby_code\n") + + expect { main() }.to output(/Ошибка выполнения команды Ruby: undefined local variable or method `invalid_ruby_code'/).to_stdout + end + + it "executes shell command" do + allow(STDIN).to receive(:gets).and_return("ruby\n", "puts 'Hello from Ruby!'\n", "echo 'Hello from shell!'\n") + expect(main()).to include("Hello from shell!") + end + + it "returns correct output for unknown programming language" do + allow(STDIN).to receive(:gets).and_return("java\n") + expect { main() }.to output(/Неизвестный язык: java/).to_stdout + end +end diff --git a/lab1/src/01_hello_world.rb b/lab1/src/01_hello_world.rb new file mode 100644 index 0000000..717d507 --- /dev/null +++ b/lab1/src/01_hello_world.rb @@ -0,0 +1,2 @@ +puts "Hello, world!" + diff --git a/lab1/src/02_user_interface.rb b/lab1/src/02_user_interface.rb new file mode 100644 index 0000000..f68737b --- /dev/null +++ b/lab1/src/02_user_interface.rb @@ -0,0 +1,30 @@ +#!/usr/bin/env ruby + +LANGUAGES = [ + "ruby", + "c++", + "py" +] + +def main() + user_name = ARGV[0] + puts "Hello my catgirl #{user_name}! \nWhat is your love language?" + LANGUAGES.each { |language| puts "#{language}", " " } + + user_lang = STDIN.gets.chomp + + case user_lang + when "ruby" + puts "Подлиза \n" + when "c++" + puts "MATLAB скушал? \n" + when "TS/JS" + puts "Фронтендер, Фууу! \n" + when "py" + puts "Девопсер, иди ДАГИ писать \n" + else + puts "Неизвестный язык: #{user_lang}" + end +end + +main() diff --git a/lab1/src/03_fork_02_with_exec_pasted_command.rb b/lab1/src/03_fork_02_with_exec_pasted_command.rb new file mode 100644 index 0000000..3d05635 --- /dev/null +++ b/lab1/src/03_fork_02_with_exec_pasted_command.rb @@ -0,0 +1,39 @@ +#!/usr/bin/env ruby + +LANGUAGES = [ + "ruby", + "c++", + "py" +] + +def main() + user_name = ARGV[0] + puts "Hello my catgirl #{user_name}! \nWhat is your love language?" + LANGUAGES.each { |language| puts "#{language}", " " } + + user_lang = STDIN.gets.chomp + case user_lang + when "ruby" + puts "Подлиза \n" + when "c++" + puts "MATLAB скушал? \n" + when "TS/JS" + puts "Фронтендер, Фууу! \n" + when "py" + puts "Девопсер, иди ДАГИ писать \n" + end + + puts "Введите команду на языке Ruby для выполнения:" + ruby_command = STDIN.gets.chomp + begin + eval(ruby_command) + rescue Exception => e + puts "Ошибка выполнения команды Ruby: #{e.message}" + end + + puts "Введите команду операционной системы для выполнения:" + os_command = STDIN.gets.chomp + system(os_command) +end + +main() diff --git a/lab1/src/04_number_funcs.rb b/lab1/src/04_number_funcs.rb new file mode 100644 index 0000000..588e2ec --- /dev/null +++ b/lab1/src/04_number_funcs.rb @@ -0,0 +1,67 @@ +require 'prime' + + + + +# @param n [Integer] Число, для которого нужно найти количество четных, не взаимно простых чисел. +# @return [Integer] Количество четных чисел, не взаимно простых с данным числом. +# @example +# count_even_non_coprimes(30) # => 14 +def count_even_non_coprimes(n) + (1...n).count do |num| + num.even? && n.gcd(num) != 1 + end +end + + +# @param n [Integer] Число, цифры которого нужно проверить. +# @return [Integer, nil] Максимальная цифра числа, не делящаяся на 3, или nil, если таких цифр нет. +# @example +# max_digit_not_divisible_by_three(483726) # => 8 +def max_digit_not_divisible_by_three(n) + n.digits.select { |digit| digit % 3 != 0 }.max +end + + +# @param n [Integer] Число, для которого нужно найти наименьший делитель. +# @return [Integer] Наименьший делитель числа. +# @example +# smallest_divisor(30) # => 2 +def smallest_divisor(n) + (2..n).find { |i| n % i == 0 } +end + + +# @param n [Integer] Число, для которого нужно найти подходящее максимальное число. +# @return [Integer, nil] Максимальное число, не взаимно простое с данным, не делящееся на наименьший делитель, или nil, если таких чисел нет. +# @example +# max_non_coprime_not_divisible_by_smallest_divisor(30) # => 28 +def max_non_coprime_not_divisible_by_smallest_divisor(n) + divisor = smallest_divisor(n) + (1...n).select { |num| n.gcd(num) != 1 && num % divisor != 0 }.max +end + + +# @param n [Integer] Число, цифры которого нужно просуммировать. +# @return [Integer] Сумма цифр числа, меньших 5. +# @example +# sum_of_digits_less_than_five(483726) # => 9 +def sum_of_digits_less_than_five(n) + n.digits.select { |digit| digit < 5 }.sum +end + + +# @param n [Integer] Число, для которого проводится вычисление. +# @return [Integer] Произведение максимального числа и суммы цифр числа. +# @example +# product_of_max_and_sum(30) # => 252 +def product_of_max_and_sum(n) + max_number = max_non_coprime_not_divisible_by_smallest_divisor(n) + sum_digits = sum_of_digits_less_than_five(n) + max_number * sum_digits +end + + +puts count_even_non_coprimes(30) # => 14 +puts max_digit_not_divisible_by_three(483726) # => 8 +puts product_of_max_and_sum(30) # => 252