From e021e578b951beafe95a8c0e48869f9ded59872b Mon Sep 17 00:00:00 2001 From: AndreyChim Date: Mon, 12 Feb 2024 15:47:11 +0800 Subject: [PATCH 01/19] Add def to max & find --- test/exercise/arrays/solution.rb | 23 ++++++++++++++++++++--- test/exercise/arrays/test.rb | 4 ++-- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/test/exercise/arrays/solution.rb b/test/exercise/arrays/solution.rb index a7d518fc..fa3dd09d 100644 --- a/test/exercise/arrays/solution.rb +++ b/test/exercise/arrays/solution.rb @@ -2,11 +2,28 @@ module Exercise module Arrays class << self def replace(array) - array + max = array[0] + array.each do |i| + max = i if i >= max + end + array.map! { |x| x.positive? ? max : x } end - def search(_array, _query) - 0 + def search(array, query) + right = array.length - 1 + left = 0 + + while left <= right + mid = (left + right) / 2 + if array[mid] == query + return mid + elsif array[mid] > query + right = mid - 1 + else + left = mid + 1 + end + end + -1 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 From 1bf4f5858a0f39aad846f148c9a029010e68aaad Mon Sep 17 00:00:00 2001 From: AndreyChim Date: Fri, 16 Feb 2024 09:50:38 +0800 Subject: [PATCH 02/19] Add def find_max & Fix def search --- test/exercise/arrays/solution.rb | 35 ++++++++++++++++---------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/test/exercise/arrays/solution.rb b/test/exercise/arrays/solution.rb index fa3dd09d..2b7b0d74 100644 --- a/test/exercise/arrays/solution.rb +++ b/test/exercise/arrays/solution.rb @@ -1,29 +1,30 @@ module Exercise module Arrays class << self - def replace(array) - max = array[0] + def find_max(array) + @max = array[0] array.each do |i| - max = i if i >= max + @max = i if i >= @max end - array.map! { |x| x.positive? ? max : x } end - def search(array, query) - right = array.length - 1 - left = 0 + def replace(array) + find_max(array) + array.map! { |x| x.positive? ? @max : x } + end + + def search(array, query, left = 0, right = array.length - 1) + mid = (left + right) / 2 - while left <= right - mid = (left + right) / 2 - if array[mid] == query - return mid - elsif array[mid] > query - right = mid - 1 - else - left = mid + 1 - end + if left > right + -1 + elsif array[mid] > query + search(array, query, left, right - 1) + elsif array[mid] < query + search(array, query, left + 1, right) + elsif array[mid] == query + mid end - -1 end end end From ff8cd37127c2c154c26df91a082d294f20f043bd Mon Sep 17 00:00:00 2001 From: AndreyChim Date: Mon, 19 Feb 2024 20:04:27 +0800 Subject: [PATCH 03/19] Fix def find_max --- test/exercise/arrays/solution.rb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/test/exercise/arrays/solution.rb b/test/exercise/arrays/solution.rb index 2b7b0d74..9a463498 100644 --- a/test/exercise/arrays/solution.rb +++ b/test/exercise/arrays/solution.rb @@ -2,10 +2,11 @@ module Exercise module Arrays class << self def find_max(array) - @max = array[0] - array.each do |i| - @max = i if i >= @max + max = array[0] + array.each do |i| + i > max ? max = i : i end + max end def replace(array) From 9e4ffce93e413c0770e115c726fc0471f9deeb74 Mon Sep 17 00:00:00 2001 From: AndreyChim Date: Mon, 19 Feb 2024 20:05:42 +0800 Subject: [PATCH 04/19] Fix def replace --- test/exercise/arrays/solution.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/exercise/arrays/solution.rb b/test/exercise/arrays/solution.rb index 9a463498..eeafe506 100644 --- a/test/exercise/arrays/solution.rb +++ b/test/exercise/arrays/solution.rb @@ -10,8 +10,7 @@ def find_max(array) end def replace(array) - find_max(array) - array.map! { |x| x.positive? ? @max : x } + array.map! { |x| x.positive? ? Exercise::Arrays.find_max(array) : x } end def search(array, query, left = 0, right = array.length - 1) From 46f1667cc62a6cc47b3db55508c67d0aac3d04e7 Mon Sep 17 00:00:00 2001 From: AndreyChim Date: Mon, 19 Feb 2024 20:06:27 +0800 Subject: [PATCH 05/19] Fix def search --- test/exercise/arrays/solution.rb | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/test/exercise/arrays/solution.rb b/test/exercise/arrays/solution.rb index eeafe506..36e8c561 100644 --- a/test/exercise/arrays/solution.rb +++ b/test/exercise/arrays/solution.rb @@ -14,17 +14,13 @@ def replace(array) end def search(array, query, left = 0, right = array.length - 1) - mid = (left + right) / 2 + return -1 if left > right + return -1 unless array.include? query - if left > right - -1 - elsif array[mid] > query - search(array, query, left, right - 1) - elsif array[mid] < query - search(array, query, left + 1, right) - elsif array[mid] == query - mid - end + 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 From 700f4b83c6dbdaa91a8d6e789edf9efcf465b959 Mon Sep 17 00:00:00 2001 From: AndreyChim Date: Wed, 21 Feb 2024 20:14:08 +0800 Subject: [PATCH 06/19] Fix replace && search --- test/exercise/arrays/solution.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/test/exercise/arrays/solution.rb b/test/exercise/arrays/solution.rb index 36e8c561..e24505a3 100644 --- a/test/exercise/arrays/solution.rb +++ b/test/exercise/arrays/solution.rb @@ -10,12 +10,11 @@ def find_max(array) end def replace(array) - array.map! { |x| x.positive? ? Exercise::Arrays.find_max(array) : x } + array.map! { |x| x.positive? ? find_max(array) : x } end def search(array, query, left = 0, right = array.length - 1) - return -1 if left > right - return -1 unless array.include? query + return -1 if left > right || query < array.first || query > array.last mid = (left + right) / 2 return mid if array[mid] == query From 2127ed5f5206d2cf6901feb9eb605fff8833359a Mon Sep 17 00:00:00 2001 From: AndreyChim Date: Fri, 1 Mar 2024 21:32:27 +0800 Subject: [PATCH 07/19] Add def rating & chars_count --- test/exercise/fp/solution.rb | 18 +++++++++++++++--- test/exercise/fp/test.rb | 4 ++-- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/test/exercise/fp/solution.rb b/test/exercise/fp/solution.rb index 91c40040..91a8fb00 100644 --- a/test/exercise/fp/solution.rb +++ b/test/exercise/fp/solution.rb @@ -5,11 +5,23 @@ class << self # film["name"], film["rating_kinopoisk"], film["rating_imdb"], # film["genres"], film["year"], film["access_level"], film["country"] def rating(_array) - 0 + array = CSV.readlines('./test/fixtures/films.csv', headers: true).to_a + rating_kinopoisk = [] + array.map do |row| + rating_kinopoisk.push row[1].to_f if row[6].to_s.split(',').count > 1 && row[1].to_i.positive? + end + rating_kinopoisk.reduce(:+) / rating_kinopoisk.size end - def chars_count(_films, _threshold) - 0 + def chars_count(_films, threshold) + films = CSV.readlines('./test/fixtures/films.csv', headers: true).to_a + name = [] + films.map do |row| + name.push row[0] if row[1].to_f >= threshold && row[0].count('и').positive? + end + + sum = name.map { |film| film.count('и') } + sum.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) From 879066264b59edb1381137547382af0a95f53eee Mon Sep 17 00:00:00 2001 From: AndreyChim Date: Tue, 5 Mar 2024 13:33:59 +0800 Subject: [PATCH 08/19] Fix rating && chars_count --- test/exercise/fp/solution.rb | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/test/exercise/fp/solution.rb b/test/exercise/fp/solution.rb index 91a8fb00..6b96071f 100644 --- a/test/exercise/fp/solution.rb +++ b/test/exercise/fp/solution.rb @@ -5,23 +5,20 @@ class << self # film["name"], film["rating_kinopoisk"], film["rating_imdb"], # film["genres"], film["year"], film["access_level"], film["country"] def rating(_array) - array = CSV.readlines('./test/fixtures/films.csv', headers: true).to_a - rating_kinopoisk = [] - array.map do |row| - rating_kinopoisk.push row[1].to_f if row[6].to_s.split(',').count > 1 && row[1].to_i.positive? - end + array = CSV.readlines('./test/fixtures/films.csv', headers: true) + + 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) - films = CSV.readlines('./test/fixtures/films.csv', headers: true).to_a - name = [] - films.map do |row| - name.push row[0] if row[1].to_f >= threshold && row[0].count('и').positive? - end - - sum = name.map { |film| film.count('и') } - sum.reduce(:+) + films = CSV.readlines('./test/fixtures/films.csv', headers: true) + search_letters = films.map do |film| + film['name'] if film['name'].count('и').positive? && film['rating_kinopoisk'].to_f >= threshold + end.compact + search_letters.map { |film| film.count('и') }.reduce(:+) end end end From 52afe4f7c3fe6521c04b4fde6177704724327e8f Mon Sep 17 00:00:00 2001 From: AndreyChim Date: Tue, 5 Mar 2024 22:31:16 +0800 Subject: [PATCH 09/19] Fix chars_count --- test/exercise/fp/solution.rb | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/test/exercise/fp/solution.rb b/test/exercise/fp/solution.rb index 6b96071f..366d7647 100644 --- a/test/exercise/fp/solution.rb +++ b/test/exercise/fp/solution.rb @@ -4,21 +4,17 @@ class << self # Обратиться к параметрам фильма можно так: # film["name"], film["rating_kinopoisk"], film["rating_imdb"], # film["genres"], film["year"], film["access_level"], film["country"] - def rating(_array) - array = CSV.readlines('./test/fixtures/films.csv', headers: true) - + 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) - films = CSV.readlines('./test/fixtures/films.csv', headers: true) - search_letters = films.map do |film| - film['name'] if film['name'].count('и').positive? && film['rating_kinopoisk'].to_f >= threshold - end.compact - search_letters.map { |film| film.count('и') }.reduce(:+) + 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 From 7e04c23fd53573e6e61fc1505abcc5a91b6ff7b7 Mon Sep 17 00:00:00 2001 From: AndreyChim Date: Fri, 15 Mar 2024 20:07:59 +0800 Subject: [PATCH 10/19] Add functions --- test/exercise/fp2/solution.rb | 47 ++++++++++++++++++++++++++++++++--- test/exercise/fp2/test.rb | 8 +++--- 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/test/exercise/fp2/solution.rb b/test/exercise/fp2/solution.rb index 8104f35c..b17279bb 100644 --- a/test/exercise/fp2/solution.rb +++ b/test/exercise/fp2/solution.rb @@ -5,16 +5,55 @@ class MyArray < Array # Использовать свои написанные функции для реализации следующих - можно. # Написать свою функцию my_each - def my_each; end + def my_each(&block) + i = 0 + + while i < size + block.call(self[i]) + i += 1 + end + self + end # Написать свою функцию my_map - def my_map; end + def my_map(&block) + my_result = MyArray.new + i = 0 + + while i < size + my_result << block.call(self[i]) + i += 1 + end + my_result + end # Написать свою функцию my_compact - def my_compact; end + def my_compact(*) + my_result = MyArray.new + i = 0 + + while i < size + my_result << self[i] unless self[i].nil? + i += 1 + end + my_result + end # Написать свою функцию my_reduce - def my_reduce; end + def my_reduce(acc = nil, &block) + i = 0 + + if acc.nil? + acc = self[0] + i = 1 + end + + while i < size + acc = (block.call acc, self[i]) + i += 1 + end + acc + 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) From e8bc627fd49e0f44a50afc998a3653799c235613 Mon Sep 17 00:00:00 2001 From: AndreyChim Date: Tue, 19 Mar 2024 19:51:06 +0800 Subject: [PATCH 11/19] Add recursion to my_each --- test/exercise/fp2/solution.rb | 15 ++++++++------- test/exercise/fp2/test.rb | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/test/exercise/fp2/solution.rb b/test/exercise/fp2/solution.rb index b17279bb..afcd4dd2 100644 --- a/test/exercise/fp2/solution.rb +++ b/test/exercise/fp2/solution.rb @@ -5,12 +5,11 @@ class MyArray < Array # Использовать свои написанные функции для реализации следующих - можно. # Написать свою функцию my_each - def my_each(&block) - i = 0 - + def my_each(i = 0, &block) + while i < size block.call(self[i]) - i += 1 + return my_each(i + 1, &block) end self end @@ -40,17 +39,19 @@ def my_compact(*) end # Написать свою функцию my_reduce - def my_reduce(acc = nil, &block) - i = 0 + def my_reduce(i = 0, acc = nil, &block) + # i = 0 if acc.nil? acc = self[0] + # return my_reduce(i + 1, acc, &block) i = 1 end while i < size acc = (block.call acc, self[i]) - i += 1 + return my_reduce(i + 1, acc + i, &block) + # i += 1 end acc end diff --git a/test/exercise/fp2/test.rb b/test/exercise/fp2/test.rb index 40fece33..b8b49856 100644 --- a/test/exercise/fp2/test.rb +++ b/test/exercise/fp2/test.rb @@ -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) From ad90d3ed51d409ea2d5c4605ba0580ab738e4edc Mon Sep 17 00:00:00 2001 From: AndreyChim Date: Sun, 24 Mar 2024 11:15:39 +0800 Subject: [PATCH 12/19] Fix my_each with recursion --- test/exercise/fp2/solution.rb | 19 +++++++++---------- test/exercise/fp2/test.rb | 4 ++-- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/test/exercise/fp2/solution.rb b/test/exercise/fp2/solution.rb index afcd4dd2..d23a6c67 100644 --- a/test/exercise/fp2/solution.rb +++ b/test/exercise/fp2/solution.rb @@ -5,13 +5,11 @@ class MyArray < Array # Использовать свои написанные функции для реализации следующих - можно. # Написать свою функцию my_each - def my_each(i = 0, &block) - - while i < size - block.call(self[i]) - return my_each(i + 1, &block) - end - self + def my_each(item = 0, &block) + return self if item >= size + + block.call self[item] + my_each(item + 1, &block) if item < size end # Написать свою функцию my_map @@ -44,13 +42,14 @@ def my_reduce(i = 0, acc = nil, &block) if acc.nil? acc = self[0] - # return my_reduce(i + 1, acc, &block) - i = 1 + # return my_reduce(i + 1, acc, &block) + # i = 1 end while i < size + # i = 1 acc = (block.call acc, self[i]) - return my_reduce(i + 1, acc + i, &block) + return my_reduce(i + 1, acc + i, &block) # i += 1 end acc diff --git a/test/exercise/fp2/test.rb b/test/exercise/fp2/test.rb index b8b49856..1790dfce 100644 --- a/test/exercise/fp2/test.rb +++ b/test/exercise/fp2/test.rb @@ -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? } From 7822006a4e6780f08f5e474005f330abf2b31438 Mon Sep 17 00:00:00 2001 From: AndreyChim Date: Sun, 24 Mar 2024 20:43:13 +0800 Subject: [PATCH 13/19] Fix my_reduce with recursion --- test/exercise/fp2/solution.rb | 19 ++++--------------- test/exercise/fp2/test.rb | 2 +- 2 files changed, 5 insertions(+), 16 deletions(-) diff --git a/test/exercise/fp2/solution.rb b/test/exercise/fp2/solution.rb index d23a6c67..d44032df 100644 --- a/test/exercise/fp2/solution.rb +++ b/test/exercise/fp2/solution.rb @@ -37,22 +37,11 @@ def my_compact(*) end # Написать свою функцию my_reduce - def my_reduce(i = 0, acc = nil, &block) - # i = 0 + def my_reduce(acc = self[0], item = 1, &block) + return acc if item >= size - if acc.nil? - acc = self[0] - # return my_reduce(i + 1, acc, &block) - # i = 1 - end - - while i < size - # i = 1 - acc = (block.call acc, self[i]) - return my_reduce(i + 1, acc + i, &block) - # i += 1 - end - acc + acc = block.call acc, self[item] + my_reduce(acc, item + 1, &block) if item < size end end end diff --git a/test/exercise/fp2/test.rb b/test/exercise/fp2/test.rb index 1790dfce..f22743b1 100644 --- a/test/exercise/fp2/test.rb +++ b/test/exercise/fp2/test.rb @@ -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) From 03506f4379652dfd18e0e63abd9f832e288e510f Mon Sep 17 00:00:00 2001 From: AndreyChim Date: Tue, 2 Apr 2024 18:14:49 +0800 Subject: [PATCH 14/19] Fix my_reduce by delete the reduntant variable --- test/exercise/fp2/solution.rb | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/test/exercise/fp2/solution.rb b/test/exercise/fp2/solution.rb index d44032df..1ed17758 100644 --- a/test/exercise/fp2/solution.rb +++ b/test/exercise/fp2/solution.rb @@ -37,11 +37,12 @@ def my_compact(*) end # Написать свою функцию my_reduce - def my_reduce(acc = self[0], item = 1, &block) - return acc if item >= size + def my_reduce(acc = nil, &block) + acc = acc.nil? ? first : block.call(acc, first) + rest = self - self[0..0] + return acc if rest.empty? - acc = block.call acc, self[item] - my_reduce(acc, item + 1, &block) if item < size + MyArray.new(rest).my_reduce(acc, &block) end end end From d5c8ec54f41e4e9fb740bb0adafd39d4159303bc Mon Sep 17 00:00:00 2001 From: AndreyChim Date: Tue, 2 Apr 2024 18:28:58 +0800 Subject: [PATCH 15/19] Fix my_map by my_reduce --- test/exercise/fp2/solution.rb | 9 +-------- test/exercise/fp2/test.rb | 2 +- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/test/exercise/fp2/solution.rb b/test/exercise/fp2/solution.rb index 1ed17758..730704b7 100644 --- a/test/exercise/fp2/solution.rb +++ b/test/exercise/fp2/solution.rb @@ -14,14 +14,7 @@ def my_each(item = 0, &block) # Написать свою функцию my_map def my_map(&block) - my_result = MyArray.new - i = 0 - - while i < size - my_result << block.call(self[i]) - i += 1 - end - my_result + my_reduce(MyArray.new) { |acc, first| acc << block.call(first) } end # Написать свою функцию my_compact diff --git a/test/exercise/fp2/test.rb b/test/exercise/fp2/test.rb index f22743b1..b6c60977 100644 --- a/test/exercise/fp2/test.rb +++ b/test/exercise/fp2/test.rb @@ -23,7 +23,7 @@ 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) From 4a986c1523cb9b6042a5618f451b406ae5693848 Mon Sep 17 00:00:00 2001 From: AndreyChim Date: Wed, 3 Apr 2024 10:51:09 +0800 Subject: [PATCH 16/19] Fix my_reduce by changing variable --- test/exercise/fp2/solution.rb | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/test/exercise/fp2/solution.rb b/test/exercise/fp2/solution.rb index 730704b7..b37eed3d 100644 --- a/test/exercise/fp2/solution.rb +++ b/test/exercise/fp2/solution.rb @@ -31,11 +31,10 @@ def my_compact(*) # Написать свою функцию my_reduce def my_reduce(acc = nil, &block) - acc = acc.nil? ? first : block.call(acc, first) - rest = self - self[0..0] - return acc if rest.empty? + return acc if size.zero? - MyArray.new(rest).my_reduce(acc, &block) + acc = acc.nil? ? first : block.call(acc, first) + MyArray.new(self[1...size]).my_reduce(acc, &block) end end end From 8ae1cbb4be2fa40cf96f10385e0d65aebb298b4a Mon Sep 17 00:00:00 2001 From: AndreyChim Date: Wed, 3 Apr 2024 10:55:34 +0800 Subject: [PATCH 17/19] Fix my_compact by my_reduce --- test/exercise/fp2/solution.rb | 11 ++--------- test/exercise/fp2/test.rb | 2 +- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/test/exercise/fp2/solution.rb b/test/exercise/fp2/solution.rb index b37eed3d..29e1f2df 100644 --- a/test/exercise/fp2/solution.rb +++ b/test/exercise/fp2/solution.rb @@ -18,15 +18,8 @@ def my_map(&block) end # Написать свою функцию my_compact - def my_compact(*) - my_result = MyArray.new - i = 0 - - while i < size - my_result << self[i] unless self[i].nil? - i += 1 - end - my_result + def my_compact + my_reduce(MyArray.new) { |acc, first| first.nil? ? acc : acc << first } end # Написать свою функцию my_reduce diff --git a/test/exercise/fp2/test.rb b/test/exercise/fp2/test.rb index b6c60977..40fece33 100644 --- a/test/exercise/fp2/test.rb +++ b/test/exercise/fp2/test.rb @@ -30,7 +30,7 @@ def test_my_map end def test_my_compact - skip + # skip func = ->(element) { element if element.even? } func_another = ->(element) { element * @int } func_yet_another = ->(element) { element.even? } From c3b178bb8c240f546a37f31931f3fbd10e0cb34c Mon Sep 17 00:00:00 2001 From: AndreyChim Date: Wed, 3 Apr 2024 22:27:25 +0800 Subject: [PATCH 18/19] Fix my_each by variable size --- test/exercise/fp2/solution.rb | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/test/exercise/fp2/solution.rb b/test/exercise/fp2/solution.rb index 29e1f2df..01cc4f16 100644 --- a/test/exercise/fp2/solution.rb +++ b/test/exercise/fp2/solution.rb @@ -5,11 +5,12 @@ class MyArray < Array # Использовать свои написанные функции для реализации следующих - можно. # Написать свою функцию my_each - def my_each(item = 0, &block) - return self if item >= size + def my_each(&block) + return self if size.zero? - block.call self[item] - my_each(item + 1, &block) if item < size + block.call self[0] + MyArray.new(self[1...size]).my_each(&block) + self end # Написать свою функцию my_map From 055f19a109836ac3789871572cd2097db47a32c6 Mon Sep 17 00:00:00 2001 From: AndreyChim Date: Wed, 3 Apr 2024 22:51:57 +0800 Subject: [PATCH 19/19] Fix my_map by rename variable --- test/exercise/fp2/solution.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/exercise/fp2/solution.rb b/test/exercise/fp2/solution.rb index 01cc4f16..48a67818 100644 --- a/test/exercise/fp2/solution.rb +++ b/test/exercise/fp2/solution.rb @@ -15,7 +15,7 @@ def my_each(&block) # Написать свою функцию my_map def my_map(&block) - my_reduce(MyArray.new) { |acc, first| acc << block.call(first) } + my_reduce(MyArray.new) { |acc, element| acc << block.call(element) } end # Написать свою функцию my_compact