diff --git a/test/exercise/arrays/solution.rb b/test/exercise/arrays/solution.rb index a7d518fc..e24505a3 100644 --- a/test/exercise/arrays/solution.rb +++ b/test/exercise/arrays/solution.rb @@ -1,12 +1,25 @@ module Exercise module Arrays class << self + def find_max(array) + max = array[0] + array.each do |i| + i > max ? max = i : i + end + max + end + def replace(array) - array + array.map! { |x| x.positive? ? find_max(array) : x } end - def search(_array, _query) - 0 + def search(array, query, left = 0, right = array.length - 1) + return -1 if left > right || query < array.first || query > array.last + + mid = (left + right) / 2 + return mid if array[mid] == query + return search(array, query, left, right - 1) if array[mid] > query + return search(array, query, left + 1, right) if array[mid] < query end end end diff --git a/test/exercise/arrays/test.rb b/test/exercise/arrays/test.rb index 6876461e..3d8153bc 100644 --- a/test/exercise/arrays/test.rb +++ b/test/exercise/arrays/test.rb @@ -4,7 +4,7 @@ class Exercise::ArraysTest < Minitest::Test # Заменить все положительные элементы целочисленного массива на максимальное значение элементов массива. def test_replace - skip + # skip array = [3, 2, -8, 4, 100, -6, 7, 8, -99] new_array = Exercise::Arrays.replace(array) @@ -14,7 +14,7 @@ def test_replace # Реализовать двоичный поиск # Функция должна возвращать индекс элемента def test_bin_search - skip + # skip assert Exercise::Arrays.search([1], 900) == -1 assert Exercise::Arrays.search([1], 1).zero? assert Exercise::Arrays.search([], 900) == -1 diff --git a/test/exercise/fp/solution.rb b/test/exercise/fp/solution.rb index 91c40040..366d7647 100644 --- a/test/exercise/fp/solution.rb +++ b/test/exercise/fp/solution.rb @@ -4,12 +4,17 @@ class << self # Обратиться к параметрам фильма можно так: # film["name"], film["rating_kinopoisk"], film["rating_imdb"], # film["genres"], film["year"], film["access_level"], film["country"] - def rating(_array) - 0 + def rating(array) + rating_kinopoisk = (array.map do |film| + film['rating_kinopoisk'].to_f if film['country'].to_s.split(',').count > 1 && film['rating_kinopoisk'].to_i.positive? + end).compact + rating_kinopoisk.reduce(:+) / rating_kinopoisk.size end - def chars_count(_films, _threshold) - 0 + def chars_count(array, threshold) + (array.map do |film| + film['name'].count('и') if film['name'].count('и').positive? && film['rating_kinopoisk'].to_f >= threshold + end.compact).reduce(:+) end end end diff --git a/test/exercise/fp/test.rb b/test/exercise/fp/test.rb index c1554768..d4a06231 100644 --- a/test/exercise/fp/test.rb +++ b/test/exercise/fp/test.rb @@ -7,7 +7,7 @@ class Exercise::FpTest < Minitest::Test # Посчитать средний рейтинг фильмов по версии кинопоиска у которых две или больше стран # Фильмы у которых рейтиг не задан или равен 0 не учитывать в расчете среднего. def test_rating - skip + # skip array = CSV.readlines('./test/fixtures/films.csv', headers: true) result = Exercise::Fp.rating(array) @@ -18,7 +18,7 @@ def test_rating # Посчитать количесвто букв 'и' в названиях всех фильмов с рейтингом кинопоиска больше или равным заданному значению def test_chars_count - skip + # skip array = CSV.readlines('./test/fixtures/films.csv', headers: true) result = Exercise::Fp.chars_count(array, 5) diff --git a/test/exercise/fp2/solution.rb b/test/exercise/fp2/solution.rb index 8104f35c..48a67818 100644 --- a/test/exercise/fp2/solution.rb +++ b/test/exercise/fp2/solution.rb @@ -5,16 +5,31 @@ class MyArray < Array # Использовать свои написанные функции для реализации следующих - можно. # Написать свою функцию my_each - def my_each; end + def my_each(&block) + return self if size.zero? + + block.call self[0] + MyArray.new(self[1...size]).my_each(&block) + self + end # Написать свою функцию my_map - def my_map; end + def my_map(&block) + my_reduce(MyArray.new) { |acc, element| acc << block.call(element) } + end # Написать свою функцию my_compact - def my_compact; end + def my_compact + my_reduce(MyArray.new) { |acc, first| first.nil? ? acc : acc << first } + end # Написать свою функцию my_reduce - def my_reduce; end + def my_reduce(acc = nil, &block) + return acc if size.zero? + + acc = acc.nil? ? first : block.call(acc, first) + MyArray.new(self[1...size]).my_reduce(acc, &block) + end end end end diff --git a/test/exercise/fp2/test.rb b/test/exercise/fp2/test.rb index accb11fc..40fece33 100644 --- a/test/exercise/fp2/test.rb +++ b/test/exercise/fp2/test.rb @@ -11,7 +11,7 @@ def setup end def test_my_each - skip + # skip result = [] my_result = [] @@ -23,14 +23,14 @@ def test_my_each end def test_my_map - skip + # skip 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 - skip + # skip func = ->(element) { element if element.even? } func_another = ->(element) { element * @int } func_yet_another = ->(element) { element.even? } @@ -40,7 +40,7 @@ def test_my_compact end def test_my_reduce - skip + # skip func = ->(acc, element) { acc * element } assert @array.reduce(&func) == @my_array.my_reduce(&func)