Четвърта задача

  1. След дълго и продължително чакане (от ваша страна) - четвърта задача вече е публикувана!

    Срокът за предаване е до сряда 17:30, за да имате време да дойдете на лекцията от 19:00 :)

    Разгледайте хубаво условието и помислете за структурата на кода преди да започнете да пишете.

    Ако нещо не е достатъчно ясно в условието - питайте тук!

    Успех :)

    • sort зависи ли от типа на колодата или винаги е :ace, :king ... до 2?

    • На белот при наличие на 5 поредни ( quint? ), това прави ли quarte? и терцата също истина задължително или ако едни карти могат да влезнат в пет поредни не можем да ги броим за терца?

    • Последователни рангове в контекста на tierce?, quarte? и quint? смятаме за последователни така както са наредини на война, не в белота? т.е. :king 10 :ace или :queen :king :ace очакваме да е tierce? ?

    • sort зависи от типа. За всеки тип са изброени в условието ранговете в нарастващ ред. Боите са еднакви за всички.
    • Щом не сме указали конкретно, че quarte? трябва да е false ако quint? е true, значи не се изисква. Ако имате 5 поредни, знач също имате 4 поредни и 3 поредни. В момента не гледаме коя ще се обяви при истинска игра на белот. :)
    • Добър въпрос. Тук ще се разграничим от истинския белот и ще кажем, че :king 10 :ace са поредни, а :queen :king :ace не са. Където се иска последователност на рангове, използваме описаната в условието на вида тесте.
  2. @Георги, по третата точка е супер нелогично да е така и мисля, че пречи на задачата - да се моделира проблем от живия живот като код.

    Освен това има доволно много хора, които най-вероятно няма да видят поста ти. Според мен трябва или да се приемат и двете за верни или да се спазят правилата на истинската игра. Ако все пак толкова държите да е така поне го добавете в условието на задачата. : )

    Офтопик: Линковете за Маркдаун и Емоджи документацията под превю-то на отговора е добре да се отварят в нови табове.

  3. @Владимир, признавам, че за това не се бяхме сетили преди въпроса. Все пак, както е написано условието, според мен е по-лесно да се разчете по този начин, отколкото както е в реалната игра, защото се казва Рангове в нарастващ ред - 7 8 9 Jack Queen King 10 Ace и после пише дали ръката съдържа поредица от <n> карти с *последователни рангове* от една и съща боя. Това считам за по-малка промяна на условието, отколкото добавка на уточнение ама последователни в друг ред.

    Все пак, съгласен съм с доводите ти и тестовете на задачата ще приемат и двата варианта :)

  4. Аз имам въпрос относно deal: трябва ли да раздава от текущото тесте, например deck = WarDeck.new([two_of_clubs, jack_of_clubs]) и deal раздава една карта, или DEAL винаги раздава от стандартното тесте?

  5. @Десислава, с коя версия на skeptic тестваш? Само локално ли ти дава тази грешка, или и на сайта? Ако ти я дава и на сайта и си с версия 0.0.14, прати ни на имейл кода, с който ти дава грешката.

    Може да провериш версията на skeptic като изпълниш в command prompt:

    gem list skeptic
    
  6. Ще бъдат ли подавани невалидни данни за колоди/ръце? Например, ръка с 2 еднакви ранга от 1 боя (2 валета спатии). Питам, защото това ще промени логиката при някои методи (например при проверка за каре).

  7. @Станимира, няма да ви даваме невалидни данни. Не трябва и да се грижите да поддържате или да хвърляте грешки в такива случаи. Можеш при проверка за каре да разчиташ, че няма да тестваме с дублиращи се карти в тестето. :)

  8. @Добромир мерси за тестовете. Обаче има някои неща, които не знам как точно ще се тестват накрая - примерно: "Ако не бъде подаден този аргумент - считаме, че колодата трябва да съдържа всички възможни за играта карти." Аз например връщам сортирано тесте, а пък видях, че в твоя тест очакваш декартовото произведение, което получаваш от боите и ранковете, но при теб боите са подредени по големина, а не както в условието: :spades, :hearts, :diamonds и :clubs. Може би е по-коректно да се сравнят множествата от картите, а не array-овете от тях. ^_^

  9. @Ивайло, не разбрах защо "последно" - кога е имало съмнение, че deal може да работи по друг начин? :) Аз не виждам друго смислено поведение на deal.

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

  10. Има ли грешки в тестовете?

    Да!

    Здравейте! В официалните тестове открих четири грешки.

    Грешка №1(ред 291): подава се карта с ранг Jack и боя King "Card.new(:jack, :king)"
    Грешка №2(ред 434): подава се карта "Card.new(7, :clubs)", а по условие в клас SixtySixDeck няма ранг 7.
    Грешка №3(ред 447): аналогично на №2
    Грешка №4(ред 460): аналогично на №2

    #tierce?
    returns true for cards with numbers (FAILED - 1)

    #twenty?
    returns true for king and queen not of the trump suit (FAILED - 2)
    returns false for king and queen of the trump suit (FAILED - 3)
    returns false for hands without a king and queen of the same suit (FAILED - 4)

    https://github.com/fmi/ruby-homework/blob/master/tasks/04/spec.rb

  11. Има синтакс ерор в дефиницията на шернатите екзампъли... Има излишни 2 точки, което ми говори, че тестовете с които е проверявана задачата са други. : )

    Също в шернатия екзампъл се oпитвате да правите продъкт на Hash:

    Failure/Error: all_available_cards = suits.product(ranks).map { |suit, rank| Card.new(rank, suit) }
         NoMethodError:
           undefined method `product' for #<Hash:0x007f8599366b60>
    
  12. @Георги, благодаря за сигнала. Въпросните тестови данни са оправени и са пуснати пак върху качените задачи. :) Можеше да submit-неш Pull Request с поправките :)

    @Владимир, За кои излишни точки говориш? Къде е синтактичната грешка? Проверих ги локално и тестовете на сайта са едно към едно с тези от github (copy/paste-нати са от там). Навсякъде работят. Имам следната теория:

    • Поради някаква причина си изпълнил тестовете със стара версия на Ruby, която не поддържа keyword аргументи.
    • Дало ти е синтактична грешка и си решил, че двете точки след имената на аргументите на shared_examples_for са излишни.
    • Махнал си ги. Така в тези аргументи Ruby е сложил хеш с "именуваните" аргументи при извикването.
    • Така suits при теб е станало хеш.

    Моля те, провери коя е версията ти на Ruby. Имай предвид, че ако ползваш нещо като rvm или rbenv е възможно в някои терминали да не е заредил rvm или rbenv и да използва системно инсталирано Руби, което обикновено е старо.

    Искам да отбележа, че тестовете са 469 реда дори с използването на shared_examples, така че ако откриете нещо друго - казвайте :)

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