Второ предизвикателство

  1. Това с публичните решения се оказва супер полезно! Научавам толкова много неща там, където въображението или проучването на документацията не са ми били достатъчни. Не зная на кого да благодаря, може би на всички! (:

  2. След като вече решенията са явни, имам два въпроса, на които не можах да намеря отговор вчера:

    Въпрос 1:

    За следното:

    some_string.insert(0, '|').insert(-1, '|')

    Този код слага '|' в началото и в края на some_string. Тъй като двата insert-а вкарават един същи символ, но на различни места, дали е възможно по някакъв да се избегне повторението на insert с нещо такова:

    some_string.insert([0, -1], '|')

    Или другото, което не го намерих в докоментацията е метод, който просто добавя символ в началото и в края на низ.

    Въпрос 2:

    Този въпрос е по-скоро конвенционален. Ако имаме следния пример

    [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
    

    Моля някой да обясни как се процедира в такива ситуации.

    Мерси :)

  3. @Явор, интересни въпроси.

    Аз поне не се сещам за метод в 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.дъра_бъра и нататъка, а не на нов ред).

  4. Само искам да попитам според вас правилно ли е да пускате задачи от ден за ден? Какви са тези срокове до 12 на обяд, за да можете да си го проверите вие в събота следобяд. И аз съм бил учител, но такива глупости не съм правил. Човек поема някаква отговорност и понякога се налага да си вземе малко повече от личното време. Имам предвид някакъв нормален срок от 12 вечерта примерно? И на следващият ден да се проверят нещата. От ден за ден не се правят нещата, несериозно отношение е.

  5. @Евгений, първо ако мога да съм полезен с нещо, то то би било http://fmi.ruby.bg/announcements.rss

    • Каква е целта на предизвикателствата? - Бонус задача. Не са задължителни. Кратки са, 5-6 реда код, показват нещо мъничко (пр. "С това предизвикателство ще трябва да упражните обхождане и манипулация на списъци и операции с низове.").
    • Колко време отнема да се направи едно? - Лично на мен, като ги правя/ех, ми отнема 10-15 минути да напиша кода и 1-2 часа след това да експериментирам с неща, които съм открил в документацията.
    • Защо до 12:00 в събота? - Трябваше да е за 1 ден, не повече, но петък вечер..
    • Как ги проверяваме? - Автоматично, коментираме ги на лекции, обмисляме да добавим опция да махаме бонус точката, като оставяме нужния коментар защо (пр. индентация с tab).
    • Как обявяваме за тях? - На сайта, на лекции, в групите на курса по социалните мрежи (то май е само една) и обмисляме да добавим пращане на имейл известия при нова задача/предизвикателство.

    @Мая ^_^

  6. Хах, пък вие. Да спомена само за 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"
    

    Което нямах представа, че го има, а е доста хитро.

  7. @Евгений, мисля, че Сашо ти отговори много добре.

    В началото на курса обяснихме всички тези неща, които Сашо ти написа – какво са предизвикателствата и че ще имат срок от около 24 часа. Това предизвикателство имаше срок от 35 часа. Освен стандартните известия, които пуснахме, на лекцията последния понеделник предупредих, че ще дадем предизвикателство четвъртък вечер.

    Ако от всички тези неща не си разбрал, че ще има предизвикателство (особено ако това е защото не си бил редовен на лекции), бих искал да те помоля да си преразгледаш твърдението за несериозното отношение и да се извиниш на екипа.

    Ако ли пък си знаел, че ще има предизвикателство няколко дни по-рано, но не си успял да си планираш времето така, че да го направиш и ако си се запознал с нещата, които казахме на уводните лекции за сериозното отношение и за предизвикателствата, отново не мисля, че екипът те е ощетил по някакъв начин и отново бих желал да си преразгледаш въпросното твърдение за отношението.

    Ако нещо не съм разбрал, моля те да поясниш.

Трябва да сте влезли в системата, за да може да отговаряте на теми.