From 9c3d233ec4bc1d0433cb6296c29d3334e30c6c0f Mon Sep 17 00:00:00 2001 From: the38th Date: Mon, 7 Dec 2020 05:08:19 -0800 Subject: [PATCH 1/2] fb exercise solved --- test/exercise/fp/solution.rb | 37 ++++++++++++++++++++++++++++++++---- test/exercise/fp/test.rb | 2 -- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/test/exercise/fp/solution.rb b/test/exercise/fp/solution.rb index 91c40040..eee3fa03 100644 --- a/test/exercise/fp/solution.rb +++ b/test/exercise/fp/solution.rb @@ -4,12 +4,41 @@ class << self # Обратиться к параметрам фильма можно так: # film["name"], film["rating_kinopoisk"], film["rating_imdb"], # film["genres"], film["year"], film["access_level"], film["country"] - def rating(_array) - 0 + + def film_rated?(film) + return false if film['rating_kinopoisk'].nil? + + film['rating_kinopoisk'].to_f.positive? + end + + def film_multicountry?(film) + return false if film['country'].nil? + + film['country'].include?(',') + end + + def rating(array) + multicountry_rated_films = [] + array.map { |film| multicountry_rated_films << film if film_rated?(film) && film_multicountry?(film) } + multicountry_rated_films.reduce(0) { |sum, film| sum + film['rating_kinopoisk'].to_f } / multicountry_rated_films.size + end + + def raiting_of_film(film) + return 0 if film['rating_kinopoisk'].nil? + + film['rating_kinopoisk'].to_f + end + + def count_of_i_letter(film_name) + sum = 0 + film_name.each_char { |char| sum += 1 if char == 'и' } + sum end - def chars_count(_films, _threshold) - 0 + def chars_count(films, threshold) + top_rated_films = [] + films.map { |film| top_rated_films << film if raiting_of_film(film) > threshold } + top_rated_films.reduce(0) { |sum, film| sum + count_of_i_letter(film['name']) } end end end diff --git a/test/exercise/fp/test.rb b/test/exercise/fp/test.rb index cec0f97d..1d98db57 100644 --- a/test/exercise/fp/test.rb +++ b/test/exercise/fp/test.rb @@ -7,7 +7,6 @@ class Exercise::FpTest < Minitest::Test # Посчитать средний рейтинг фильмов по версии кинопоиска у которых две или больше стран # Фильмы у которых рейтиг не задан или равен 0 не учитывать в расчете среднего. def test_rating - skip array = CSV.readlines('./test/fixtures/films.csv', headers: true) result = Exercise::Fp.rating(array) @@ -16,7 +15,6 @@ def test_rating # Посчитать количесвто букв 'и' в названиях всех фильмов с рейтингом кинопоиска больше или равным заданному значению def test_chars_count - skip array = CSV.readlines('./test/fixtures/films.csv', headers: true) result = Exercise::Fp.chars_count(array, 5) From bbe973fd2d47cb0c510c2ae841752b153c7e955c Mon Sep 17 00:00:00 2001 From: the38th Date: Wed, 14 Apr 2021 07:16:05 -0700 Subject: [PATCH 2/2] fb exercise solution changed (map to select) --- test/exercise/fp/solution.rb | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/test/exercise/fp/solution.rb b/test/exercise/fp/solution.rb index eee3fa03..9a399c70 100644 --- a/test/exercise/fp/solution.rb +++ b/test/exercise/fp/solution.rb @@ -14,19 +14,18 @@ def film_rated?(film) def film_multicountry?(film) return false if film['country'].nil? - film['country'].include?(',') + film['country'].split(',').size >= 2 end def rating(array) - multicountry_rated_films = [] - array.map { |film| multicountry_rated_films << film if film_rated?(film) && film_multicountry?(film) } + multicountry_rated_films = array.select { |film| film_rated?(film) && film_multicountry?(film) } multicountry_rated_films.reduce(0) { |sum, film| sum + film['rating_kinopoisk'].to_f } / multicountry_rated_films.size end - def raiting_of_film(film) - return 0 if film['rating_kinopoisk'].nil? + def film_rated_enough?(film, threshold) + return false if film['rating_kinopoisk'].nil? - film['rating_kinopoisk'].to_f + film['rating_kinopoisk'].to_f > threshold end def count_of_i_letter(film_name) @@ -36,8 +35,7 @@ def count_of_i_letter(film_name) end def chars_count(films, threshold) - top_rated_films = [] - films.map { |film| top_rated_films << film if raiting_of_film(film) > threshold } + top_rated_films = films.select { |film| film_rated_enough?(film, threshold) } top_rated_films.reduce(0) { |sum, film| sum + count_of_i_letter(film['name']) } end end