From 90134b769ad58d0f51623b4dbe0018c3bf83a02d Mon Sep 17 00:00:00 2001 From: Vasiliy Krasnobay Date: Tue, 15 Jan 2019 23:02:42 +0400 Subject: [PATCH 01/12] implemented Exercise::Arrays.replace --- test/exercise/arrays/solution.rb | 4 ++++ test/exercise/arrays/test.rb | 1 - 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/test/exercise/arrays/solution.rb b/test/exercise/arrays/solution.rb index a7d518fc..29bdbc14 100644 --- a/test/exercise/arrays/solution.rb +++ b/test/exercise/arrays/solution.rb @@ -2,6 +2,10 @@ module Exercise module Arrays class << self def replace(array) + max = array.max + for i in 0..array.length - 1 + array[i] = max if array[i] > 0 + end array end diff --git a/test/exercise/arrays/test.rb b/test/exercise/arrays/test.rb index 7af337a2..a34cdf1c 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) From 71a513dd4a5f915c507fba9f044239b3479743b6 Mon Sep 17 00:00:00 2001 From: Vasiliy Krasnobay Date: Wed, 16 Jan 2019 00:20:36 +0400 Subject: [PATCH 02/12] implemented Exercise::Arrays.search --- test/exercise/arrays/solution.rb | 16 ++++++++++++++-- test/exercise/arrays/test.rb | 1 - 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/test/exercise/arrays/solution.rb b/test/exercise/arrays/solution.rb index 29bdbc14..a33c4aef 100644 --- a/test/exercise/arrays/solution.rb +++ b/test/exercise/arrays/solution.rb @@ -9,8 +9,20 @@ def replace(array) array end - def search(_array, _query) - 0 + def search(array, query) + bin_search array, query, 0, array.length - 1 + 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 a34cdf1c..1495fbc1 100644 --- a/test/exercise/arrays/test.rb +++ b/test/exercise/arrays/test.rb @@ -13,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 From a4620e888b7d76ed02011cb7c194c2549d82496b Mon Sep 17 00:00:00 2001 From: Vasiliy Krasnobay Date: Fri, 18 Jan 2019 19:20:44 +0400 Subject: [PATCH 03/12] implemented Exercise::Fp.rating --- test/exercise/fp/solution.rb | 10 ++++++++-- test/exercise/fp/test.rb | 1 - 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/test/exercise/fp/solution.rb b/test/exercise/fp/solution.rb index 91c40040..57d49a86 100644 --- a/test/exercise/fp/solution.rb +++ b/test/exercise/fp/solution.rb @@ -4,8 +4,14 @@ 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'].nil? && + film['rating_kinopoisk'].to_f > 0 + end + filtered.map { |e| e['rating_kinopoisk'].to_f }.reduce(:+) / filtered.length end def chars_count(_films, _threshold) diff --git a/test/exercise/fp/test.rb b/test/exercise/fp/test.rb index cec0f97d..6d05f4c1 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) From e4345961447d3c23cc9c8e091e315571c2fc0a0a Mon Sep 17 00:00:00 2001 From: Vasiliy Krasnobay Date: Sun, 20 Jan 2019 20:40:19 +0400 Subject: [PATCH 04/12] implemented Exercise::Fp.chars_count --- test/exercise/fp/solution.rb | 4 ++-- test/exercise/fp/test.rb | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/test/exercise/fp/solution.rb b/test/exercise/fp/solution.rb index 57d49a86..8939003c 100644 --- a/test/exercise/fp/solution.rb +++ b/test/exercise/fp/solution.rb @@ -14,8 +14,8 @@ def rating(array) 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 6d05f4c1..1d98db57 100644 --- a/test/exercise/fp/test.rb +++ b/test/exercise/fp/test.rb @@ -15,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 9a84db10e456c17419909b626b68d635fb5a21c9 Mon Sep 17 00:00:00 2001 From: Vasiliy Krasnobay Date: Sun, 20 Jan 2019 21:21:08 +0400 Subject: [PATCH 05/12] implemented MyArray.my_each --- test/exercise/fp2/solution.rb | 3 +++ test/exercise/fp2/test.rb | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/test/exercise/fp2/solution.rb b/test/exercise/fp2/solution.rb index ead5e5e5..0666024b 100644 --- a/test/exercise/fp2/solution.rb +++ b/test/exercise/fp2/solution.rb @@ -6,6 +6,9 @@ class MyArray < Array # Написать свою функцию my_each def my_each + for e in self + yield e + end end # Написать свою функцию my_map diff --git a/test/exercise/fp2/test.rb b/test/exercise/fp2/test.rb index 1af56b35..fa837a91 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 = [] From 242be08d65f1844a9870dec01c4fc6d686c9c083 Mon Sep 17 00:00:00 2001 From: Vasiliy Krasnobay Date: Sun, 20 Jan 2019 21:32:07 +0400 Subject: [PATCH 06/12] implemented MyArray.my_map --- test/exercise/fp2/solution.rb | 4 ++++ test/exercise/fp2/test.rb | 1 - 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/test/exercise/fp2/solution.rb b/test/exercise/fp2/solution.rb index 0666024b..4f8f7cc8 100644 --- a/test/exercise/fp2/solution.rb +++ b/test/exercise/fp2/solution.rb @@ -13,6 +13,10 @@ def my_each # Написать свою функцию my_map def my_map + res = MyArray.new + for e in self + res.push yield(e) + end end # Написать свою функцию my_compact diff --git a/test/exercise/fp2/test.rb b/test/exercise/fp2/test.rb index fa837a91..d9873e3e 100644 --- a/test/exercise/fp2/test.rb +++ b/test/exercise/fp2/test.rb @@ -22,7 +22,6 @@ 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) From 038e8939e667f8db5047b397f128cd5483d81f95 Mon Sep 17 00:00:00 2001 From: Vasiliy Krasnobay Date: Sun, 20 Jan 2019 21:49:37 +0400 Subject: [PATCH 07/12] implemented MyArray.my_compact --- test/exercise/fp2/solution.rb | 6 ++++++ test/exercise/fp2/test.rb | 1 - 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/test/exercise/fp2/solution.rb b/test/exercise/fp2/solution.rb index 4f8f7cc8..440626db 100644 --- a/test/exercise/fp2/solution.rb +++ b/test/exercise/fp2/solution.rb @@ -17,10 +17,16 @@ def my_map for e in self res.push yield(e) end + res end # Написать свою функцию my_compact def my_compact + res = MyArray.new + for e in self + res.push(e) unless e.nil? + end + res end # Написать свою функцию my_reduce diff --git a/test/exercise/fp2/test.rb b/test/exercise/fp2/test.rb index d9873e3e..29cccb31 100644 --- a/test/exercise/fp2/test.rb +++ b/test/exercise/fp2/test.rb @@ -28,7 +28,6 @@ def test_my_map end def test_my_compact - skip func = -> (element) { element if element.even? } func_another = -> (element) { element * @int } func_yet_another = -> (element) { element.even? } From b117f03625e8027f2f10e420f2049ac5c59a10c9 Mon Sep 17 00:00:00 2001 From: Vasiliy Krasnobay Date: Sun, 20 Jan 2019 22:29:23 +0400 Subject: [PATCH 08/12] implemented MyArray.my_reduce --- test/exercise/fp2/solution.rb | 6 +++++- test/exercise/fp2/test.rb | 1 - 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/test/exercise/fp2/solution.rb b/test/exercise/fp2/solution.rb index 440626db..95d2e7c3 100644 --- a/test/exercise/fp2/solution.rb +++ b/test/exercise/fp2/solution.rb @@ -30,7 +30,11 @@ def my_compact end # Написать свою функцию my_reduce - def my_reduce + def my_reduce(acc = nil) + for e in self + acc = acc ? yield(acc, e) : e + end + acc end end end diff --git a/test/exercise/fp2/test.rb b/test/exercise/fp2/test.rb index 29cccb31..645de57d 100644 --- a/test/exercise/fp2/test.rb +++ b/test/exercise/fp2/test.rb @@ -37,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) From 46b72425755883ddc12f2dca579657f357562bdb Mon Sep 17 00:00:00 2001 From: Vasiliy Krasnobay Date: Sun, 20 Jan 2019 23:34:48 +0400 Subject: [PATCH 09/12] implemented exercise/rackup --- test/exercise/rackup/inatra.rb | 14 +++++++++++++- test/exercise/rackup/test.rb | 10 ++++------ 2 files changed, 17 insertions(+), 7 deletions(-) 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 From a2dde809dd4a93694225b75c30df07771119d014 Mon Sep 17 00:00:00 2001 From: Vasiliy Krasnobay Date: Sun, 20 Jan 2019 23:45:00 +0400 Subject: [PATCH 10/12] refactoring --- test/exercise/arrays/solution.rb | 5 +---- test/exercise/fp/solution.rb | 1 - 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/test/exercise/arrays/solution.rb b/test/exercise/arrays/solution.rb index a33c4aef..ffb5f42a 100644 --- a/test/exercise/arrays/solution.rb +++ b/test/exercise/arrays/solution.rb @@ -3,10 +3,7 @@ module Arrays class << self def replace(array) max = array.max - for i in 0..array.length - 1 - array[i] = max if array[i] > 0 - end - array + array.map { |e| e > 0 ? max : e } end def search(array, query) diff --git a/test/exercise/fp/solution.rb b/test/exercise/fp/solution.rb index 8939003c..29a8005e 100644 --- a/test/exercise/fp/solution.rb +++ b/test/exercise/fp/solution.rb @@ -8,7 +8,6 @@ def rating(array) filtered = array.select do |film| !film['country'].nil? && film['country'].split(',').length >= 2 && - !film['rating_kinopoisk'].nil? && film['rating_kinopoisk'].to_f > 0 end filtered.map { |e| e['rating_kinopoisk'].to_f }.reduce(:+) / filtered.length From d2533743749dfe9d63e6d6c543864050d249a371 Mon Sep 17 00:00:00 2001 From: Vasiliy Krasnobay Date: Tue, 22 Jan 2019 21:01:05 +0400 Subject: [PATCH 11/12] implemented method search max --- test/exercise/arrays/solution.rb | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/test/exercise/arrays/solution.rb b/test/exercise/arrays/solution.rb index ffb5f42a..a0aebbe8 100644 --- a/test/exercise/arrays/solution.rb +++ b/test/exercise/arrays/solution.rb @@ -2,14 +2,20 @@ module Exercise module Arrays class << self def replace(array) - max = array.max - array.map { |e| e > 0 ? max : e } + m = max array + array.map { |e| e > 0 ? m : e } end 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 From cfda954855b5da278fdabd1c281035b23e85903e Mon Sep 17 00:00:00 2001 From: Vasiliy Krasnobay Date: Tue, 22 Jan 2019 22:48:24 +0400 Subject: [PATCH 12/12] refactoring exercise/fp2 --- test/exercise/fp2/solution.rb | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/test/exercise/fp2/solution.rb b/test/exercise/fp2/solution.rb index 95d2e7c3..9a34e027 100644 --- a/test/exercise/fp2/solution.rb +++ b/test/exercise/fp2/solution.rb @@ -14,26 +14,20 @@ def my_each # Написать свою функцию my_map def my_map res = MyArray.new - for e in self - res.push yield(e) - end + self.my_each { |e| res.push yield(e) } res end # Написать свою функцию my_compact def my_compact res = MyArray.new - for e in self - res.push(e) unless e.nil? - end + self.my_each { |e| res.push e unless e.nil? } res end # Написать свою функцию my_reduce def my_reduce(acc = nil) - for e in self - acc = acc ? yield(acc, e) : e - end + self.my_each { |e| acc = acc ? yield(acc, e) : e } acc end end