Публикувана е втора задача. Може да задавате въпроси тук. Условието на задачата и примерния тест са и в GitHub.
Погледнете ръководството за предаване на задачи и ръководството по стил.
Cheers
Публикувана е втора задача. Може да задавате въпроси тук. Условието на задачата и примерния тест са и в GitHub.
Погледнете ръководството за предаване на задачи и ръководството по стил.
Cheers
Малко по-обширни тестове.
Как да филтрираме комплексни числа със SignFilter? С други думи - как определяме дали комплексно число е положително, отрицателно и т.н. (тъй като принципно това е невъзможно)?
@Екатерина, правилно си забелязала :)
Добавих в условието, че няма да тестваме с такава комбинация. Не е нужно да се грижите за този случай. SignFilter
трябва да работи коректно за останалите типове числа.
Ок, но Rational(23, 2).to_i също връща резултат 11. Счита ли се Rational(23, 2) за същото като 11? Или трябва да извършвам проверката с други методи?
Rational(23, 2)
и 11
не са едно и също число. Гледаме математически на числата. Rational(22, 7)
и 3.14
също не са едно и също число.
Не се считат за едно и също число. Виж някой друг метод, различен от този който ползваш.
Здравейте, ако имамe
numbers = NumberSet.new
numbers << 42
numbers << 42
numbers << Rational( 84/2 )
numbers << 10
numbers[Filter.new { |number| number.even? }].to_a
Какво се очаква да има вътре ? След като even? не е дефиниран за тип Rational очаква ли се да го филтрира? Повторенията махат ли се ?
@Снежана
При така зададения код на мен ми се струва, че първоначално в numbers би трябвало да влязат само 42 и 10 и въобще да нямаш проблема с филтрирането по-нататък. А иначе се надявам, че няма да се тества подобен филтър върху множества, съдържащи числа, за които не е дефиниран?
Правилно @Мая.
След като 42
влезе в NumberSet
добавянето на второто 42
и Rational(84, 2)
се игнорират, тъй като число с такава стойност вече присъства в множеството. Добавя се 10
и числата в numbers
са 42
и 10
.
Няма да тестваме с филтри, невалидни за определен тип числа. :)
Мерси, явно аз не съм разбрала условието правилно. :)
Относно операторите & и | - дали сте примера:
numbers[SignFilter.new(:non_negative) & Filter.new { |number| number.even? }].to_a #=> [0, 2, 4]
Само по един или два филтъра ли ще бъдат подавани? Т.е. дали ще мешате 3-4 и т.н.? И дали трябва да се третира случая при подаване на 0 аргументи?
П.П.: Пише се 'конструктОр'.
@Герасим, според условието NumberSet#[]
приема само един филтър винаги и имплементацията на |
и &
на различните филтри трябва да връща един филтър.
@Герасим, ако си видял някъде typo в условието на задачата, пусни PR на хранилището.
@Никола, ясно ми е, че филтъра, който се генерира, е един. Но имплементацията при един оператор или няколко е различна (поне при мен).
@Димитър, забравих да попитам дали условията на задачите са качени в хранилището. : )
Условията на задачите, примерните тестове и skeptic ограниченията винаги се появяват в хранилището щом пуснем задачата, освен ако не сме сбъркали нещо. (:
Приеми, че може да има произволен краен брой филтри, с &
и |
между тях.
Какво е очакваното поведение на следния код, тъй като операторът > (и не само.. even? примерно) не е дефиниран за Complex?
numbers = NumberSet.new
numbers << 1 << 2 << 1.1 << 3.0 << 10 << Rational(22, 2) << 11 << Complex(3, 2)
numbers[Filter.new { |number| number > 3 }]
Обектите NumberSet трябва да предоставят и методи size и empty?, които трябва да работят както очаквате...
Бих очаквал empty?
да е предикат, който връща false, ако има нещо в NumberSet
-а или true иначе. Вместо това:
... empty? е number set без нито един елемент.
@Деян, по-горе съм писал, че няма да тестваме числа с филтри, които не са валидни за тях. Приеми, че ако тестваме с филтър, който включва >
, то всички числа в NumberSet
обекта ще отговарят на >
.
@Ясен, NumberSet#empty?
трябва да е предикат, който връща false
, ако има обекти в NumberSet
-а и true
иначе. Втория ред от условието не е коректен.
del
Един кратък въпрос: Можем ли (или пък трябва ли) да инклуднем Enumerable в нашия клас или трябва да напишем всичко от scratch?
@Евгений, относно Enumerable - пише го в условието:
NumberSet трябва да имплементира Enumerable, позволявайки ни да итерираме по числата, които са част от множеството и ни дава възможност да използваме всички удобни методи, предоставени от модула.
Това означава, че вашият клас трябва да има в началото си include Enumerable и да дефинира метод each, който реализира обхождане.
Мдам, и аз го видях накрая.
Edit: Оттеглям си въпроса
--
Skeptic има нова версия, която сме обновили на сайта. Решава проблема с интервалите около оператора &
в случая &foo.bar
. Добре е да си я обновите и конзолно, с gem install skeptic
.
При сечението или обединението на два филтъра, третият филтър от какъв тип трябва да бъде? Примерно ако имаме сечение на TypeFilter и SignFilter новополученият филтър като какъв трябва да се върне?
@Иване, няма никакво значение. Достатъчно е NumberSet#[]
да може да работи с него както с другите филтри. Duck typing.
"Aко подаденият аргумент има стойност :real, филтърът оставя всички числа от тип Float или Rational." това не трябва ли да включва и Fixnum?
@Деяне, не трябва. За Fixnum е филтъра :integer. Целите числа са реални числа, но в случая са изключени от това множество.
Би ми било интересно да видя решенията на другите след крайния срок, за всяко второ нещо ми се получава някаква спънка и съответно не работи както трябва(ако изобщо работи) или не мога да го измисля...
Трябва да сте влезли в системата, за да може да отговаряте на теми.