06. Cake , While-Loop - Exercise
6. Торта
Поканени сте на 30-ти рожден ден, на който рожденикът черпи с огромна торта. Той обаче не знае колко
парчета могат да си вземат гостите от нея. Вашата задача е да напишете програма, която изчислява броя на
парчетата, които гостите са взели, преди тя да свърши. Ще получите размерите на тортата в сантиметри
(широчина и дължина – цели числа в интервала [1...1000]) и след това на всеки ред, до получаване на
командата "STOP" или докато не свърши тортата, броят на парчетата, които гостите вземат от нея. Парчетата
са квадратни с размер 1 см .
Да се отпечата на конзолата един от следните редове:
• "{брой парчета} pieces are left." - ако стигнете до STOP и има останали парчета торта.
• "No more cake left! You need {брой недостигащи парчета} pieces more."
https://pastebin.com/nubF982E 92/100%
Защо така се получава?
Махни равното от първата проверка, където брейкваш цикъла.Защото си противоречиш със долната проверка , така реално 0 я ползваш и когато са повече и когато са по малко . Когато вземат парчета колкото е тортата просто стават 0 парчета. Реално тортата си е стигнала за всички и не е останало нищо. Тествах го дава 100/100! 🙂
А да и колежката горе е права това с error no cake го махаш няма смисъл от него поне на тоя етап от обучението
Здравей,
Да, определено има доста валидни решения из форума и благодаря че добави още едно, но предпочитам сам да си решавам задачите, а не просто да ми изпише 100 точки за копиране на чужд код.
Като знам какви проверки и тестове за грешки прави judge ( с всякакви реални и нереални числа като входове) реших да подсигуря входовете на тортата ми (както ясно се вижда) да са положителни числа. Защо ли? Ами за да не направят някоя беля децата на рождения ден (ако има такива) и въведат в програмата ми две отрицателни числа и получат непредвидена торта извън бюджета за рождения ден (която може да не е и малко, (-10 * -15) и ето имаш още 150 парчета торта като магия). Аз лично не бих позволил това да се случи.
Знам знам, изглежда различна защото всички са я решили по друг начин - различен while и break от моя, но този начин ми допадна още от началото и като гледам логиката е абсолютно същата. Предната задача беше подобна и работеше на 100% и по двата начина, независимо дали повтаряш while със условие команда и чупиш break със преминаване на граница бройки или обратното, нямаше никакво значение.
Единственото обяснение което мога да си дам е че съществува "стандарт на кодиране" за задачата и може да е напълно вярна само по един начин което доста би ограничило нетипичните, но не по-малко оптимизирани решения.
Здравей и на теб,
Ето така изглежда по-добре: https://pastebin.com/nubF982E , оставих само една проверка за да не си противоречи с друга.
Но за равното в първата проверката не виждам логика да го махам... Защо бих го махнал? Така ще се предлага още торта като вече няма никаква! Безумно е някой да знае че има 0 парчета останали и да казва че тортата не е свършила. Условието си пише "до получаване на командата "STOP" или докато не свърши тортата" и не се изисква алгоритмично мислене за да прецениш че като вземат последните парчета торта, не остава никаква и е факт че тя е свършила...
Напълно съм съгласен с това което казваш "Когато вземат парчета колкото е тортата просто стават 0 парчета. Реално тортата си е стигнала за всички и не е останало нищо." Също така от условието "ако стигнете до STOP и има останали парчета торта. - "{брой парчета} pieces are left." се подразбира че примера с 0 останали парчета е другия изход. За да стане така както и самият ти казваш равното е нужно задължително , иначе тортата ще свърши а цикълът ще продължи. След като обърнах изходите, даже преместих (да със 0 се застъпваха малко, добра забележка) като вземат точно всичките парчета си изписва че няма повече торта и също така че не са нужни още парчета.
Колко по-правилно от това? Judge ме разочарова този път...
Приятен ден!
Относно Judge - Доколкото знам, сравнява това, което извежда като резултат твоята програма с това, което му е заложено като аутпут за даден тест. Демек, сравнение на стрингове. Или казано с други думи, извършва се някаква проверка от рода:
if(входът е такъв && изходът е такъв) {
points = X;
} else {
points = 0;
}
, където Х ти е някаква средно-претеглена или по друг начин изчислена стойност на дадения тест.
Всичко добро :)
Колега не се напрягай излишно. Решения на задачите много и всяко е вярно стига резултата да е един и същ.Пак ти казвам на този етап от обучението няма да ти дават нереален вход и за момента е напълно излишно, но не е проблем защото задачата ще си работи и така. В условието в скобите са написали range-a на числата от 1 ... 1000 , което значи че ще е между тия числа и няма да има отрицателни, но това е без значение. Просто отбелязахме, че е ненужно, а не че е невярно ! Аз когато я решавах също мислех подобен на твоя начин, но след това се сетих за друг. Проблема при теб е , че покриваш 0 два пъти, а това няма логика. Да реално тортата свършва , но тя си си стига за хората който са там. Ето това е логиката.Можеш ли да кажеш , че имаш 0 недостигащи парчета. Няма как нали нелогично е, но 0 оставащи е по логично.Не абсолютно грешно е да мислиш , че има стандарт при коденето , но има по оптимални решения от нашите и трябва да се учим от тях . Не е ли по добре да напишеш задачата с 5 реда вместо с 10(не визирам конкретно задачата).Задачата у логиката ти са много добре просто по този начин си изолирал 0 и с две думи по твоята логика в задачата няма как да има 0 като изход, защото ако стане 0 едновремено ще има 0 парчета оставащи и 0 недостигащи 😀😀😀. Махаш на първата проверка равното и задачата е готова и логиката е супер.
Да и аз така мисля, но judge твърди че ако вземат всички парчета и останат 0 парчета - тортата не е свършила което противоречи на простата логика и дори на условието на задачата. Не съществува междинен случай между "няма торта" и "има торта". Или ще е едното или другото. Не можеш да си вземеш парчета торта от 0 останали.
Благодаря!
Виж сега логиката си е точна.Реално на теб не ти минава един единствен тест, защото тортата е била 30 парчета и хората са взели 30 парчета. Така остават 0 парчета няма торта, но реално при настоящата итерация на цикъла парчетата са си стигнали за всички хора.При последваща итерация вече хората искат да вземат 20 парчета, торта няма получаваме отрицателен резултат и цикъла брейква.Точно за това ползването на друга логика е по удачна ,за да не се бъркаш в конкретната задача, но това незначи, че твоята е грешна! Просто не го осмисляш за момента, защо е така и се надявам по горе да съм обяснил защо.Ако ползваш логиката при който за да влезне в цикъла му кажеш takenPieces <= allCake ще ти се поизясни защо логиката на задачата си е точна!
Колега, коментара ти e наполовина невалиден защото се отнася за началния код а не за обновената версия която ти пратих още в първото изречение на коментара. Бях премахнал проверката за размерите на тортата и направих още няколко малки промени.
Никъде не се покриваше 0 два пъти с двата изхода защото те бяха вътре във if-else конструкция която има само един изход на конзолата и не позволява да се стигне до втория, ако първото условие е вярно. Това което промених е че смених изхода на 0 защото от условието е ясно че трябва да е в случая когато тортата е свършила и не са нужни още парчета.
"Можеш ли да кажеш , че имаш 0 недостигащи парчета."
Ами не можеш да кажеш че остават 0 парчета, но можеш да кажеш че нямаш нужда от повече парчета когато гостите са взели точно толкова парчето колкото е имала тортата. Тогава тортата е свършила и по условие трябва да спре да показва колко парчета са взели (да изкара изход на задачата).
"Няма как нали нелогично е, но 0 оставащи е по логично"
Както написах в предния коментар изходът "{брой парчета} pieces are left." е само в случай че има позитивен брой останали парчета, така че ако са 0 принадлежат на другия изход.
"твоята логика в задачата няма как да има 0 като изход, защото ако стане 0 едновремено ще има 0 парчета оставащи и 0 недостигащи"
Точно обратното, ако махна равното няма да има 0 като изход защото никога няма да излиза при 0. А сега със = си излизаше първия вход на if защото зададеното условие =0 излиза вярно. Обновеният код няма изходни проверки ако останат 0 парчета. Последните ти 2 изречения изглежда не са съгласни едно с друго.
"Стандарти за кодиране" по принцип са набор от стандарти и насоки, които се / трябва да се използват при писане на програмен кодна програма. Стандартите са правила, които се очаква да бъдат последвани от предприемача. Въпреки това тези правила, като "компилираният файл трябва да има разширение .h", често са очевидни и винаги следвани. Насоките обаче не са толкова добре следвани. Те са стилистични мерки, които нямат пряк ефект върху компилацията на кода и съществуват само за да направят програмния код по-четлив за човека. Те са по желание, но са силно препоръчани. ИЗТОЧНИК
Привет,
100 / 100 с твоя код, махнах равното при "if (piecesTaken > piecesAll) {" : https://pastebin.com/rqkUkqx7
Реално има граничен случай, когато тортата е напълно изядена, но не е взето нито ендо парче повече - при този вариант, локигата е, че парчетата са стигнали и няма недостигащи парчета.
Поздрави,
Зара
Аз точно това се опитвам да обясня , че има такъв случай и си е съвсем логично.Можело е да усложнят задачата малко и да го изолират този случай в отделна проверка, отделен изход и край. За момента обаче по условие е по логично да остават 0 от колкото да не достигат 0, защото самата дума "недостигащи" не се връзва с 0. По скоро нулата означава не са останали парчета , но са стигнали. При положение че всеки има торта няма как да кажем че не са "достигнали", защото са стигнали , но реално няма повече
Здравейте момчета и момичета:)
Страхотно е, че задълбавате в разсъжденията... Обаче, мога да се опитам да дам съвет, а който иска, нека да се възползва.
Та, работата е там, че трябва да правим разлика между "това, което се иска от нас" и "това, което ни се иска на нас". Ако правилно ме разбирате, първият кейс е - "какво иска Judge от мен", за да ми върне 100-чака. Вторият кейс е - разсъждаването по лични съображения.
Дотук - всичко е ОК. Двата кейс не си пречат, често не са взаимозаменяеми и т.н.
Какъв е извода?
1. Винаги дешифрирайте правилно какво се иска от вас в задачите и правете само и толкова.
2. Запомняйте уловките, на които сте попадали вече, така ще ги разпознаване по-лесно в бъдеще.
3. Помнете, че винаги нещо може да се усложни или опрости - имате избор.
И нещо последно... но не по важност - относно това, че можели да доусложнят задачата или да вкарат повече яснота около граничните случаи.... В началото програмистите се учат на концепции, синтаксис и алгоритмично мислене... После се вкарва друга сложност и т.н. Така е с всяка наука. Винаги се съпоставяйте в контекста на мястото, времето и стейджа, в които се намирате. Всичко с времето си :)
На всички желая много успехи!