Първа задача

  1. Първа задача е публикувана. Може да задавате въпроси в тази тема. Условието на задачата и примерния тест са и в GitHub.

    Вижте и ръководството за предаване на задачи.

    Отново напомняме:

    • работете самостоятелно;
    • предайте решение максимално рано, за да получите обратна връзка;
    • пуснете си примерните тестове, преди да предадете решение;
    • сайтът няма да приеме решението ви, ако то не минава ограниченията;
    • сайтът обаче ще приеме решения, дори и да не работят правилно; ще пуснем пълните тестове чак след като изтече срокът за предаване на задачата;
    • преди да е изтекъл крайният срок за предаване, можете да обновявате решението си неограничен брой пъти;
    • когато крайният срок настъпи, формулярът за предаване на решение автоматично затваря.

    Първа задача е сравнително проста и може да я напишете бързо. Използвайте я, за да си настроите средата за разработка, да разучите как се пускат тестовете, как се ползва skeptic, да свикнете с конвенциите в езика, описани в ръководството по стил.

  2. @Любомир, освен ако изрично не сме казали, не се тревожете за времева или пространствена сложност. Ако е нужна някаква оптимизация, тя ще е спомената в условието. Освен ако решението не е прекомерно бавно (нелогичен код, който е довел и до абсурдно изчисление) тестовете би следвало да минат, ако няма други проблеми.

  3. Пробва ли съвета на @Никола? Ако пишеш case и той е във вида:

    
    what_to_drink = 'Beer'
    
    case
      when what_to_drink == 'Coffee'
        puts 'Drink Coffee'
      when what_to_drink == 'Beer' 
        puts 'Drink Beer on Wednesday'
      else
        puts 'Dont drink anything!!!'
    end
    

    то пробвай да го напишеш така:

    
    what_to_drink = 'Beer'
    
    case what_to_drink
      when 'Coffee'
        puts 'Drink Coffee'
      when 'Beer' 
        puts 'Drink Beer on Wednesday'
      else
        puts 'Dont drink anything!!!'
    end
    

    Доколкото знам, по този начин ruby сравнява с '==='.

    Ако не стане и така давай с if. GL

    EDIT: Поправих си примерите спрямо нашата конвенция за switch от fmi/ruby-style-guide. В конвенцията от bbatsov/ruby-style-guide when е на същото ниво нa case, а в нашата case е с едно ниво навътре ;).

  4. Четейки решенията на първата задача, попаднах на следното:

    def calculate_sequence(accumulator, addend, index)
      (index - 1).times { accumulator, addend = addend, accumulator + addend }
      accumulator
    end
    

    За жалост не можах да намеря информация за този начин на итериране, и как се нарича. Дали някой ще може да ми помогне с малко инфо? :)

  5. @Атанасe, ами първо се използва метода Integer#times

    5.times { puts 'Hello' } # познай какво прави :)
    

    Иначе вътре в блока има присвояване на няколко променливи (гоогле каза, че е "паралелно присвояване", според старите лекции на курса)

    a, b = 1, 2
    puts a # 1
    puts b # 2
    
    a, b = b, a
    puts a # 2
    puts b # 1
    
    a, b = [1, 2] # пробвай ти
    
  6. @Наско,

    Ще преименувам аргументите:

    • accumulator => first
    • addend => second
    • index => n

    Ще разделя паралелното присвояване: first, second = second, first + second:

    first = second
    second = first + second
    

    И ще използвам do/end вместо {/}. Така получаваме:

    def calculate_sequence(first, second, n)
      (n - 1).times do 
        first = second
        second = first + second
      end
      first
    end
    

    което е идентично на твоето решение :)

  7. @Атанас, можеш да погледнеш документацията на Integer#times за повече детайли. Практически x.times е еквивалентно на 0.upto(x.pred). Първото се предпочита, ако не се интересуваш от самите числа, а искаш нещо да се случи точно x пъти. Има и малка разлика във връщаната стойност, но не се сещам за ситуация, в която тя да има значение, ако ги използваш по предназначение.

    Edit: @Станислав,

    first, second = second, first + second
    

    не е еквивалентно на

    first  = second
    second = first + second
    

    Множественото присвояване работи образно казано по-следния начин:

    1. Прави масив със стойностите, изброени вдясно.
    2. Unpack-ва масива и присвоява отляво надясно.

    С други думи:

    first  = 1
    second = 2
    first, second = second, first + second
    first  # => 2
    second # => 3
    

    Докато:

    first  = 1
    second = 2
    first  = second         # => 2
    second = first + second # => 2 + 2 = 4
    

    Създаването на масиви е и причината да не е препоръчително да се ползва в големи цикли.

  8. Даже ми стана неловко, че зададох толкова тъп въпрос :D Попринцип бях виждал паралелно присвояване и преди, но така написано джава програмиста в мен го асоциира с for, и си мислих че запетайките разделят три израза който се изпълняват n пъти... И се вкарах във филма как точно работи

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