Публикували сме второто предизвикателство. Тестовете са на обичайното място, в хранилището с домашните.
Срокът е до събота на обяд (12:00). Може да коментирате тук.
Публикували сме второто предизвикателство. Тестовете са на обичайното място, в хранилището с домашните.
Срокът е до събота на обяд (12:00). Може да коментирате тук.
Имаме ли пак ограничението за 5 реда на метод ?
@Любомир, няма skeptic ограничения. Когато има са изрично упоменати. Очакваме самоинициативно да си наложите ограничение за спазване на конвенции и добри практики.
А ако имам малко повече символи на реда, за да е супер як one liner, може ли?
@Веселин, сегашното ти решение е леко хакерско... иначе challenge accepted!
@Никола, Супер! Благодаря :)
Това с публичните решения се оказва супер полезно! Научавам толкова много неща там, където въображението или проучването на документацията не са ми били достатъчни. Не зная на кого да благодаря, може би на всички! (:
След като вече решенията са явни, имам два въпроса, на които не можах да намеря отговор вчера:
За следното:
some_string.insert(0, '|').insert(-1, '|')
Този код слага '|'
в началото и в края на some_string
. Тъй като двата insert-а вкарават един същи символ, но на различни места, дали е възможно по някакъв да се избегне повторението на insert с нещо такова:
some_string.insert([0, -1], '|')
Или другото, което не го намерих в докоментацията е метод, който просто добавя символ в началото и в края на низ.
Този въпрос е по-скоро конвенционален. Ако имаме следния пример
[1, 2, 3, 4].map { |n| n**2 }.join('|')
Тук след block-а .join
-а изглежда добре и е разбираемо. Въпроса е какво става ако block-а е многоредов и използваме do..end? Това което аз си мисля, че е правилно е това:
[1, 2, 3, 4].map do |n|
n**2
end.join('|')
Или другия пример, ако вместо join след end-а трябва да напишем метод, който има собствен блок:
[1, 2, 3, 4].map do |n|
n**2
end
.each_slice(2) do |slice|
slice.drop(1)
end
Моля някой да обясни как се процедира в такива ситуации.
Мерси :)
@Явор, интересни въпроси.
Аз поне не се сещам за метод в Ruby core, който да слага един и същи префикс и суфикс. Ако изрично не искаш да повтаряш самия insert
и това, което insert-ваш, можеш да итерираш по позициите:
[0, -1].each { |index| some_string.insert(index, '|') }
Ако те притеснява само повтарянето на insert
, можеш да използваш методите, които правят точно това, което искаш да изкажеш семантично:
some_string.prepend('|').concat('|')
Ако следваш препоръката да не мутираш ненужно обекти, решението е доста лесно и разбираемо (но пак повтаря '|'):
"|#{some_string}|"
Относно втория въпрос: старай се да не правиш многоредови chain-ове. Сложно е за четене. Присвои някаква част на смислена променлива или изнеси в метод. Случва се хората да продължават с още 1-2 метода, тогава се прави както си го написал (примера с join
накрая). Съвсем друго е да имаш многоредов блок, после да го chan-ваш пак с многоредов блок... прекалено става. Но ако е адски наложително - прави като с предния пример (end.дъра_бъра
и нататъка, а не на нов ред).
Само искам да попитам според вас правилно ли е да пускате задачи от ден за ден? Какви са тези срокове до 12 на обяд, за да можете да си го проверите вие в събота следобяд. И аз съм бил учител, но такива глупости не съм правил. Човек поема някаква отговорност и понякога се налага да си вземе малко повече от личното време. Имам предвид някакъв нормален срок от 12 вечерта примерно? И на следващият ден да се проверят нещата. От ден за ден не се правят нещата, несериозно отношение е.
@Евгений, първо ако мога да съм полезен с нещо, то то би било http://fmi.ruby.bg/announcements.rss
@Мая ^_^
@Александър Иванов: Respect за решението, което си измислил, може да се научи доста от него!
@Ясен, +1!
Хах, пък вие. Да спомена само за Kernel#sprintf, най-долу на документацията има едно примерче:
'%{foo} : %{bar}' % {foo: 1, bar: 2} # "1 : 2"
'%2{foo}' % {foo: 1} # " 1"
'%{foo}f' % {foo: 1} # "1f" т.е. не е като '%f' % 1
Но последното може да се направи така:
'%<foo>f' % {foo: 1} # "1.000000"
Което нямах представа, че го има, а е доста хитро.
@Евгений, мисля, че Сашо ти отговори много добре.
В началото на курса обяснихме всички тези неща, които Сашо ти написа – какво са предизвикателствата и че ще имат срок от около 24 часа. Това предизвикателство имаше срок от 35 часа. Освен стандартните известия, които пуснахме, на лекцията последния понеделник предупредих, че ще дадем предизвикателство четвъртък вечер.
Ако от всички тези неща не си разбрал, че ще има предизвикателство (особено ако това е защото не си бил редовен на лекции), бих искал да те помоля да си преразгледаш твърдението за несериозното отношение и да се извиниш на екипа.
Ако ли пък си знаел, че ще има предизвикателство няколко дни по-рано, но не си успял да си планираш времето така, че да го направиш и ако си се запознал с нещата, които казахме на уводните лекции за сериозното отношение и за предизвикателствата, отново не мисля, че екипът те е ощетил по някакъв начин и отново бих желал да си преразгледаш въпросното твърдение за отношението.
Ако нещо не съм разбрал, моля те да поясниш.
Трябва да сте влезли в системата, за да може да отговаряте на теми.