Втора задача

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

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

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

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

    По-сложна e от първа задача, тъй че не губете време!

    Срокът за предаване е до понеделник (19.10.2015), 17:30 ч.

  2. "Позицията не трябва да бъде върху змията, друга храна или извън полето."

    Това е необходимо условие. Достатъчно ли е?

    Ако не ми е достатъчно ясен въпросът:

    Задължително ли е позицията на храната да бъде генерирана по произволен начин (т.е. чрез някой генератор на произволни числа) или е достатъчно храната да отговаря на горното условие, независимо по какъв начин е избрана?

  3. Достатъчно е.

    Ако не ми е достатъчно ясен отговорът:

    Генерирайте новата храна както пожелаете. За нас не е от значение.

    Ще проверяваме само дали върнатата позиция не е върху змията, друга храна или извън полето.

  4. Внимание, внимание, всички мишки на събрание!

    skeptic прави малко проблеми тия дни и ви кара да пишете код подобен на:

    ! n.odd? # Тук не трябва да има интервал след "!"
    0.. - 5  # Тук не трябва да има интервали около "-"
    

    Горното трябва да бъде:

    !n.odd?
    0..-5
    

    Обновили сме skeptic правилата, за да не ви прави проблеми и да не ви кара да предавате неправилно форматиран код:

    skeptic --lines-per-method 8 --line-length 80 --max-nesting-depth 1 --methods-per-class 10 --no-semicolons --no-trailing-whitespace --check-syntax --no-global-variables --english-words-for-names='xs ys' --naming-conventions solution.rb
    

    Моля, поправете грешките, които сме ви накарали да направите!

    ПП: Извинете ни за неудобството! При първа възможносто ще fix-нем skeptic и ще ви уведомим.

  5. Имам въпрос : Ако имаме масив а = [1, 2, 3] и масив b = [-1, -2, -3] как се извършва почленно събиране - както се сумират вектори? Тоест действие, което ще ми даде нов масив c = [0, 0, 0]. Би трябвало да има лесен начин, елегантен, но не мога да намеря такъв в документацията..

  6. Е... Вие пък... map го има в документацията на Array -> Array#map.

    Все още не сме говорили за map на лекции и съответно решението може да мине и без map, но е напълно ОК да ползвате map и всичко, което не изисква require.

    Иначе, елегантни начини има, но ги очакваме от вас в решенията, за да ви дадем бонус точки => въпросът ти е подранил.

    Ако искаш отговор на подобни въпроси, остави коментар с въпрос, след като предадеш решение.

  7. Надявам се прекаленото задаване на въпроси да не е проблем :Д. Въпроса ми е трябва ли да има начален direction на змията, за да може да се генерират изключения, когато например змията първоначално се движи нагоре ,а и се зададе move(snake, direction(down))?

  8. @Николай, не трябва да хвърляте изключения/проверявате входните данни. Дори и да трябваше, direction-ът от последния ход може да се извлече без допълнителен параметър (освен ако змията не е дълга само едно поле).

    EDIT: Това змията да тръгне надолу, като преди това се е движела нагоре, не променя правилата, просто ще се захапе.

    Задаването на много въпроси не е проблем.

  9. Възможно е да имаш if в цикъла.

    Също така, ако искаш post-loop проверка, ползвай Kernel#loop с break вътре, а не while. Дори самият автор на езика препоръчва това. Това е дори по-удобно в тази задача конкретно, защото можеш да break-неш с определена стойност и тази стойност ще бъде стойността на целия цикъл, съответно ще бъде върната от функцията.

  10. Здравейте! На мен все още не ми е ясно от new_food какво точно се изисква: "Генерирайте новата храна както пожелаете. За нас не е от значение.", но в същото време имам коментар на задачата, че не е ok да ползвам rand генератор, защото лесно може да се стигне до time limit. Извинявам се, че отново връщам въпроса, но...

  11. @Десислава Предполагам са имали предвид да оптимизираш решението си по такъв начин, че да не се изискват твърде много опити за генериране на храна - за да елиминираш шанса програмата ти да премине указания time limit.

  12. @Десислава, произволността в случая е малко двусмислена.

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

    От друга страна има произволност на изпълението. Не е като да няма практически случаи, в които произволността е статистически незначима и алгоритъмът като цяло става по-ефективен от детерминистичната си алтернатива. Но в общия случай би следвало да се избягва.


    Ако не се разбира какво имам предвид, да предположим, че имаме задачата да намерим нечетно число в константен масив - [1, 2, 3].

    • Детерминистичен по резултат и изпъление: NUMBERS.first
    • Недетерминистичен по резултат, детерминистичен по изпълнение: [NUMBERS.first, NUMBERS.last].sample
    • Детерминистичен по резултат, недетерминистичен по изпълнение: number = NUMBERS.first(2).sample while number.even?
    • Недетерминистичен по резултат и изпълнение: number = NUMBERS.sample while number.even?

    Искаме 2, ok сме с 1, правим дребна забележка за 3 и 4. tl без наша намеса за малка дъска е космически не-вероятен, въпросът е принципен.

  13. @Георги, в пътя случайно да има space-ове? Ако да - трябва да ги escape-неш (с обратна наклонена \).

    @Петър, решенията в момента са проверени до определено място. Твоето го бяхме пропуснали инцидентно. Оставих ти коментар.

  14. Здравейте,

    Според вас коректно ли е змията да прехапе сама себе си, ако се разминава с опашката си?
    Визирам 'returns true if snake body ahead'. На всички вариации, които съм играл, змията винаги се е разминавала с опашката си.

    :confused:

  15. Дефинирай "разминава с опашката си". Приемаме, че змията се движи нагоре. В следващия ход краят на опашката (t) ще се премести и ще има свободно поле, за да се премести главата (H) нагоре.

    [ ][ ][ ][ ][ ][ ][ ]
    [ ][ ][t][x][x][ ][ ]
    [ ][ ][H][ ][x][ ][ ]
    [ ][ ][x][ ][x][ ][ ]
    [ ][ ][x][x][x][ ][ ]
    

    Иначе, това е тест за obstacle_ahead?. Пред змията е тялото ѝ => има obstacle ahead => връща се истина.

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