From e237297da78b899d05442352336cc3025da4b54e Mon Sep 17 00:00:00 2001 From: uliyanov Date: Mon, 4 Feb 2019 09:31:38 +0400 Subject: [PATCH 1/3] =?UTF-8?q?#=D0=92=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Gemfile.lock | 5 +++- test/newil86/arrays/solution.rb | 27 ++++++++++++++++++++ test/newil86/arrays/test.rb | 25 ++++++++++++++++++ test/newil86/fp/solution.rb | 28 ++++++++++++++++++++ test/newil86/fp/test.rb | 25 ++++++++++++++++++ test/newil86/fp2/solution.rb | 38 ++++++++++++++++++++++++++++ test/newil86/fp2/test.rb | 45 +++++++++++++++++++++++++++++++++ 7 files changed, 192 insertions(+), 1 deletion(-) create mode 100644 test/newil86/arrays/solution.rb create mode 100644 test/newil86/arrays/test.rb create mode 100644 test/newil86/fp/solution.rb create mode 100644 test/newil86/fp/test.rb create mode 100644 test/newil86/fp2/solution.rb create mode 100644 test/newil86/fp2/test.rb diff --git a/Gemfile.lock b/Gemfile.lock index 35e3b39..46a0074 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -65,5 +65,8 @@ DEPENDENCIES rubocop test-unit +RUBY VERSION + ruby 2.3.0p0 + BUNDLED WITH - 1.11.2 + 1.16.6 diff --git a/test/newil86/arrays/solution.rb b/test/newil86/arrays/solution.rb new file mode 100644 index 0000000..9c3b5ff --- /dev/null +++ b/test/newil86/arrays/solution.rb @@ -0,0 +1,27 @@ +module Newil86 + module Arrays + include Enumerable + class << self + def replace(array) + max_val = array.max + array.map { |elem| elem > 0 ? max_val : elem } + end + + def search(array, find) + first = 0 + last = array.length - 1 + while first <= last + middle_elem = (last - first) / 2 + first + if find < array[middle_elem] + last = middle_elem - 1 + elsif find > array[middle_elem] + first = middle_elem + 1 + else + return middle_elem + end + end + -1 + end + end + end +end diff --git a/test/newil86/arrays/test.rb b/test/newil86/arrays/test.rb new file mode 100644 index 0000000..be8b094 --- /dev/null +++ b/test/newil86/arrays/test.rb @@ -0,0 +1,25 @@ +require './test/test_helper.rb' +require_relative './solution.rb' + +class Newil86::ArraysTest < Minitest::Test + # Заменить все положительные элементы целочисленного массива на максимальное значение элементов массива. + def test_replace + array = [3, 2, -8, 4, 100, -6, 7, 8, -99] + new_array = Newil86::Arrays.replace(array) + assert new_array == [100, 100, -8, 100, 100, -6, 100, 100, -99] + end + + # Реализовать бинарный поиск + # Функция должна возвращать индекс элемента + def test_bin_search + assert Newil86::Arrays.search([1], 900) == -1 + assert Newil86::Arrays.search([1], 1) == 0 + assert Newil86::Arrays.search([], 900) == -1 + assert Newil86::Arrays.search([1, 4, 5, 7, 8, 9], 9) == 5 + assert Newil86::Arrays.search([1, 4, 5, 7, 8, 9], 1) == 0 + assert Newil86::Arrays.search([1, 4, 5, 7, 8, 9], 6) == -1 + + array = (1..10000).to_a + assert Newil86::Arrays.search(array, array[1000]) == 1000 + end +end diff --git a/test/newil86/fp/solution.rb b/test/newil86/fp/solution.rb new file mode 100644 index 0000000..0b58f13 --- /dev/null +++ b/test/newil86/fp/solution.rb @@ -0,0 +1,28 @@ +module Newil86 + module Fp + class << self + # Обратиться к параметрам фильма можно так: + # film["name"], film["rating_kinopoisk"], film["rating_imdb"], + # film["genres"], film["year"], film["access_level"], film["country"] + def rating(array) + filtered_films = array.select do |film| + !film['country'].nil? && film['country'].split(',').length >= 2 && !film['rating_kinopoisk'].to_f.zero? + end + + rating_sum = filtered_films.map { |film| film['rating_kinopoisk'].to_f } + .reduce(:+) + rating_sum / filtered_films.length + end + + def chars_count(films, threshold) + letter = 'и' + + selected = films.select do |item| + item['rating_kinopoisk'] && + item['rating_kinopoisk'].to_f >= threshold + end + selected.map { |item| item['name'].count(letter) }.reduce(:+) + end + end + end +end diff --git a/test/newil86/fp/test.rb b/test/newil86/fp/test.rb new file mode 100644 index 0000000..ab0510b --- /dev/null +++ b/test/newil86/fp/test.rb @@ -0,0 +1,25 @@ +require 'csv' +require './test/test_helper.rb' +require_relative './solution.rb' + +class Newil86::FpTest < Minitest::Test + # Посчитать средний рейтинг фильмов по версии кинопоиска у которых две или больше стран + # Фильмы у которых рейтиг не задан или равен 0 не учитывать в расчете среднего. + def test_rating + array = CSV.readlines('./test/fixtures/films.csv', headers: true) + + result = Newil86::Fp.rating(array) + assert result == 6.809410385259628 + end + + # Посчитать количество фильмов в которые входит буква 'и' в названиях всех фильмов с рейтингом кинопоиска больше или равным заданному значению + def test_chars_count + array = CSV.readlines('./test/fixtures/films.csv', headers: true) + + result = Newil86::Fp.chars_count(array, 5) + assert result == 3850 + + result = Newil86::Fp.chars_count(array, 8.5) + assert result == 40 + end +end diff --git a/test/newil86/fp2/solution.rb b/test/newil86/fp2/solution.rb new file mode 100644 index 0000000..ba4eb3b --- /dev/null +++ b/test/newil86/fp2/solution.rb @@ -0,0 +1,38 @@ +module Newil86 + module Fp2 + class MyArray < Array + # Использовать стандартные функции массива для решения задач нельзя. + # Использовать свои написанные функции для реализации следующих - можно. + + # Написать свою функцию my_each + def my_each + for index in 0..(length - 1) + yield(self[index]) + end + self + end + + # Написать свою функцию my_map + def my_map + arr = MyArray.new + my_each { |elem| arr << yield(elem) } + arr + end + + # Написать свою функцию my_compact + def my_compact + ary = MyArray.new + my_each { |elem| ary << elem unless elem.nil? } + ary + end + + # Написать свою функцию my_reduce + def my_reduce(sum = nil) + arr_copy = MyArray.new(self) + sum = sum.nil? ? arr_copy.shift : sum + arr_copy.my_each { |i| sum = yield(i, sum) } + sum + end + end + end +end diff --git a/test/newil86/fp2/test.rb b/test/newil86/fp2/test.rb new file mode 100644 index 0000000..3b2b9c3 --- /dev/null +++ b/test/newil86/fp2/test.rb @@ -0,0 +1,45 @@ +require 'csv' +require './test/test_helper.rb' +require_relative './solution.rb' + +class Newil86::Fp2Test < Minitest::Test + def setup + @array = generate :array + @my_array = Newil86::Fp2::MyArray.new(@array) + @int = generate :int + end + + def test_my_each + result = [] + my_result = [] + + func = -> (element) { result << element if element.odd? } + my_func = -> (element) { my_result << element if element.odd? } + + assert @array.each(&func) == @my_array.my_each(&my_func) + assert result == my_result + end + + def test_my_map + func = -> (element) { element * @int } + assert @array.map(&func) == @my_array.my_map(&func) + assert @array.map(&func).map(&func) == @my_array.my_map(&func).my_map(&func) + end + + def test_my_compact + func = -> (element) { element if element.even? } + func_another = -> (element) { element * @int } + func_yet_another = -> (element) { element.even? } + assert @array.map(&func).compact == @my_array.my_map(&func).my_compact + assert @array.map(&func).compact.map(&func_another) == @my_array.my_map(&func).my_compact.my_map(&func_another) + assert @array.map(&func_yet_another).compact == @my_array.my_map(&func_yet_another).my_compact + end + + def test_my_reduce + func = -> (acc, element) { acc * element } + + assert @array.reduce(&func) == @my_array.my_reduce(&func) + assert @array.reduce(2, &func) == @my_array.my_reduce(2, &func) + assert @array.reduce(&:+) == @my_array.my_reduce(&:+) + end +end From 0743b0153f3dab5b38d1197ffd7688e8d48e83c2 Mon Sep 17 00:00:00 2001 From: uliyanov Date: Mon, 4 Feb 2019 09:36:27 +0400 Subject: [PATCH 2/3] =?UTF-8?q?#=D0=9E=D1=82=D0=BA=D0=B0=D1=82=D0=B8=D0=BB?= =?UTF-8?q?=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20Gem?= =?UTF-8?q?file.lock?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Gemfile.lock | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 46a0074..35e3b39 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -65,8 +65,5 @@ DEPENDENCIES rubocop test-unit -RUBY VERSION - ruby 2.3.0p0 - BUNDLED WITH - 1.16.6 + 1.11.2 From 6e31f829d5fdd5058dedbc31205806a9fb5f9996 Mon Sep 17 00:00:00 2001 From: uliyanov Date: Mon, 4 Feb 2019 12:14:21 +0400 Subject: [PATCH 3/3] =?UTF-8?q?#=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BC=D0=B5=D1=81=D1=82=D0=B0=20=D0=B3=D0=B4=D0=B5=20?= =?UTF-8?q?=D1=80=D1=83=D0=B3=D0=B0=D0=BB=D1=81=D1=8F=20rubocop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/newil86/fp/solution.rb | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/test/newil86/fp/solution.rb b/test/newil86/fp/solution.rb index 0b58f13..30a6ff3 100644 --- a/test/newil86/fp/solution.rb +++ b/test/newil86/fp/solution.rb @@ -9,8 +9,7 @@ def rating(array) !film['country'].nil? && film['country'].split(',').length >= 2 && !film['rating_kinopoisk'].to_f.zero? end - rating_sum = filtered_films.map { |film| film['rating_kinopoisk'].to_f } - .reduce(:+) + rating_sum = filtered_films.map { |film| film['rating_kinopoisk'].to_f }.reduce(:+) rating_sum / filtered_films.length end @@ -18,8 +17,7 @@ def chars_count(films, threshold) letter = 'и' selected = films.select do |item| - item['rating_kinopoisk'] && - item['rating_kinopoisk'].to_f >= threshold + item['rating_kinopoisk'] && item['rating_kinopoisk'].to_f >= threshold end selected.map { |item| item['name'].count(letter) }.reduce(:+) end