diff --git a/test/exercise/arrays/solution.rb b/test/exercise/arrays/solution.rb index a7d518fc..a0aebbe8 100644 --- a/test/exercise/arrays/solution.rb +++ b/test/exercise/arrays/solution.rb @@ -2,11 +2,30 @@ module Exercise module Arrays class << self def replace(array) - array + m = max array + array.map { |e| e > 0 ? m : e } end - def search(_array, _query) - 0 + def search(array, query) + bin_search array, query, 0, array.length - 1 + end + + def max array + buf = array[0] + array.each { |e| buf = e if e > buf } + buf + end + + def bin_search(array, query, left, right) + return -1 unless left <= right + i = (left + right) / 2 + if array[i] == query + i + elsif array[i] < query + bin_search array, query, i + 1, right + elsif array[i] > query + bin_search array, query, left, i - 1 + end end end end diff --git a/test/exercise/arrays/test.rb b/test/exercise/arrays/test.rb index 7af337a2..1495fbc1 100644 --- a/test/exercise/arrays/test.rb +++ b/test/exercise/arrays/test.rb @@ -4,7 +4,6 @@ class Exercise::ArraysTest < Minitest::Test # Заменить все положительные элементы целочисленного массива на максимальное значение элементов массива. def test_replace - skip array = [3, 2, -8, 4, 100, -6, 7, 8, -99] new_array = Exercise::Arrays.replace(array) @@ -14,7 +13,6 @@ def test_replace # Реализовать бинарный поиск # Функция должна возвращать индекс элемента def test_bin_search - skip assert Exercise::Arrays.search([1], 900) == -1 assert Exercise::Arrays.search([1], 1) == 0 assert Exercise::Arrays.search([], 900) == -1 diff --git a/test/exercise/fp/solution.rb b/test/exercise/fp/solution.rb index 91c40040..29a8005e 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) + filtered = array.select do |film| + !film['country'].nil? && + film['country'].split(',').length >= 2 && + film['rating_kinopoisk'].to_f > 0 + end + filtered.map { |e| e['rating_kinopoisk'].to_f }.reduce(:+) / filtered.length end - def chars_count(_films, _threshold) - 0 + def chars_count(films, threshold) + films.map { |e| e['rating_kinopoisk'].to_f >= threshold ? e['name'].count('и') : 0 }.reduce :+ 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) diff --git a/test/exercise/fp2/solution.rb b/test/exercise/fp2/solution.rb index ead5e5e5..9a34e027 100644 --- a/test/exercise/fp2/solution.rb +++ b/test/exercise/fp2/solution.rb @@ -6,18 +6,29 @@ class MyArray < Array # Написать свою функцию my_each def my_each + for e in self + yield e + end end # Написать свою функцию my_map def my_map + res = MyArray.new + self.my_each { |e| res.push yield(e) } + res end # Написать свою функцию my_compact def my_compact + res = MyArray.new + self.my_each { |e| res.push e unless e.nil? } + res end # Написать свою функцию my_reduce - def my_reduce + def my_reduce(acc = nil) + self.my_each { |e| acc = acc ? yield(acc, e) : e } + acc end end end diff --git a/test/exercise/fp2/test.rb b/test/exercise/fp2/test.rb index 1af56b35..645de57d 100644 --- a/test/exercise/fp2/test.rb +++ b/test/exercise/fp2/test.rb @@ -11,7 +11,6 @@ def setup end def test_my_each - skip result = [] my_result = [] @@ -23,14 +22,12 @@ def test_my_each end def test_my_map - 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 func = -> (element) { element if element.even? } func_another = -> (element) { element * @int } func_yet_another = -> (element) { element.even? } @@ -40,7 +37,6 @@ def test_my_compact end def test_my_reduce - skip func = -> (acc, element) { acc * element } assert @array.reduce(&func) == @my_array.my_reduce(&func) diff --git a/test/exercise/rackup/inatra.rb b/test/exercise/rackup/inatra.rb index a04045d9..8c1bd1f4 100644 --- a/test/exercise/rackup/inatra.rb +++ b/test/exercise/rackup/inatra.rb @@ -1,9 +1,21 @@ module Inatra class << self - def routes + def method_missing(method_name, *args, &block) + path = args.first.to_s + method = method_name.upcase.to_s + @routes[path] ||= {} + @routes[path][method] = block + end + + def routes(&block) + @routes ||= {} + instance_eval(&block) end def call(env) + path = env['PATH_INFO'] + method = env['REQUEST_METHOD'].upcase.to_s + @routes[path][method].call(env) end end end diff --git a/test/exercise/rackup/test.rb b/test/exercise/rackup/test.rb index abc99cb4..b36f9b22 100644 --- a/test/exercise/rackup/test.rb +++ b/test/exercise/rackup/test.rb @@ -6,11 +6,9 @@ class RackTest < Test::Unit::TestCase def test_it_says_hello_world - omit do - browser = Rack::Test::Session.new(Rack::MockSession.new(Inatra)) - browser.get '/hello' - assert browser.last_response.ok? - assert_equal 'Hello World', browser.last_response.body - end + browser = Rack::Test::Session.new(Rack::MockSession.new(Inatra)) + browser.get '/hello' + assert browser.last_response.ok? + assert_equal 'Hello World', browser.last_response.body end end