Loading...
Ifandieva avatar Ifandieva 71 Точки

[Exam Problems] C# Basics - 20.12.2014 - Piggy Bank — къде греша?

Здравейте,

Първата задача, давана на изпит, която успях да реша без никаква помощ е Piggy Bank. Измъкнах я от C# Basics изпита на 20 декември, 2014 г. 

Програмата ми работи с всички проверки, без една — тази, в която input за цена на танка е 200, а парти дните са 8. В примера отговорът е 4 години и 2 месеца. Но както и да го смятам (дори на хартия), отговорът при мен излиза 'never'.

Дори judge системата ми дава само 30/100, заради тази проверка. Въпросът ми е дали е установена грешка в отговора на тази проверка. Ако не, ще се наложи да публикувам решението си, за да ми кажете къде греша.

 

 

Тагове:
1
Programming Basics 30/03/2015 11:39:17
dmstoyanov avatar dmstoyanov 32 Точки

Здравей,
всичко си е наред с тестовете. Предполагам, че грешиш някъде в закръглянето. Покажи все пак решението ти да го видим.

1
dmstoyanov avatar dmstoyanov 32 Точки

По-долу колегата kotow го е обяснил много добре, а ето и едно решение.

1
06/02/2015 17:39:17
Ifandieva avatar Ifandieva 71 Точки

Видях решението ти.... Аз съм твърде назад в знанията си, за да я реша по този начин...

Нищо де, продължаваме напред, както каза един в много по-кофти положение от мен :)

Да кажа на Kotow — разбира се, че не си виновен, просто аз наистина имам много да уча. Един ден съм супер обнадеждена, на следващия имам чувството, че никога няма да ми се получи в тази професия... Предполагам, че не съм единствената дето минава през такива състояния.

Благодаря и на двама ви, че отделихте време.

3
22/01/2015 21:54:02
Ifandieva avatar Ifandieva 71 Точки

Отново се боря с тази задача. Докарах нещата дотам, че сега получавам верни отговори на всички проверки, без tankPrice = 15999 и partyDays = 3. Вече ми е ясно, че без този Math.Ceiling работата няма да я бъде. Опитвам се да го ползвам, но нещо не съм в час. dmstoyanov сетих се, че твоето решение беше като за по-напреднали, но то и така се напредва. Обаче кодът ти вече го няма в линка от отговора ти. Шанс да го качиш пак?

 

0
kotow avatar kotow 34 Точки

Здравей,

според условието и в твоя случай спестяваш 30 - 8 = 22 дена по 2лв. -> 44лв.

имаш 8 парти дни по 5лв = 40лв.

==> ти остават по 4лв на месец

200 / 4 = 50 месеца --> 4 години и 2 месеца.

Дано съм бил полезен.

1
Ifandieva avatar Ifandieva 71 Точки

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

 

Благодаря!

0
kotow avatar kotow 34 Точки

int actuallySavedMonthly = savedOnNormalDays - spentOnParties; --> това са ти спестените пари месечно тях трябва да провериш дали са > 0

if (spentOnParties - actuallySavedMonthly > 0) --> if (actuallySavedMonthly > 0) 

0
Ifandieva avatar Ifandieva 71 Точки

Не мога да коментирам отговора ти по-долу, затова тук — ами, като направя if (actuallySavedMonthly > 0), става тотална идиотия, започва да ми дава 'never' на input 200000 и 5, отрицателни години на 200 и 8 и пр.

 

Всъщност вече не мога да чатна защо дава 'never' на примера, от който започнах да питам, при положение, че изхрачени 40 минус спестени 44 е -4, тоест, не е > 0.... 

 

Явно имам още мнооого да мисля.

 

0
a_tifonoff avatar a_tifonoff 26 Точки

Коригирай условието за "never" в If-a по следния начин:

if(actuallySavedMonthly < 0);

и всичко е ОК

Иначе браво за решението.smile

1
23/01/2015 00:48:28
Ifandieva avatar Ifandieva 71 Точки

Опитах с if (actuallySavedMonthly < 0) — така при същия тест (200, 8) ги смята 4 години и 8 месеца :)))))) Иначе, с другите проверки работи идеално. Шантава работа. Може да е нещо от dotnetfiddle, където бачкам засега, защото

if (spentOnParties - actuallySavedMonthly > 0) ми го смята true при същата запецнала проверка, а би трябвало да е (40 - 44 = - 4). Все едно, взимам следваща задача, два дни на тази са достатъчно засега.

 

Благодаря за 'бравото', вдига духа, снощи мислех да зарязвам :)

0
a_tifonoff avatar a_tifonoff 26 Точки

Не ми се отказваше.

Всъщност If-a няма нищо общо с резултатите за partydays>8 защото, там винаги е "never". В останалите случаи явно всичко е от типа променливи, респективно от закръглянето. Ето един вариант който работи при 200/8 и дава един месец разлика спрямо системата при 15999/3

int monthsToSave =tankPrice / actuallySavedMonthly;
int yearsToSave = monthsToSave / 12;
int months =monthsToSave- yearsToSave*12;

Изобщо не можах да измисля нещо , което не използва Math.Ceiling за да не плагиатствам "авторското решение". А пък и да не изглежда , че съм го знаел този  Math.Ceiling.

Спирам с това.

0
GogoK avatar GogoK 80 Точки

Не знам какъв ти е кода, но пробвай:

"the price of the tank" / "collected money for month" = ???

сметни го с калкулатора на уиндоус и виж резултата. Пробвай после с Math.Ceiling(след като вече "не го знаеш") да го приложиш към резултата, и си пробвай алгоритъма. Не е плагиатство да погледнеш верен код след като си положил много усилия по твоя. Плагиатсво е като го копираш, а още по лошо без да си го разбрал ;)

0
Ifandieva avatar Ifandieva 71 Точки

Еми не и не. Пробвах с твоите променливи. Сега действително дава месец по-малко за 15999 на 3, но продължава да е never при 200 на 8. Каталясах.

Не мога да видя авторското решение, то е във формат .cs а аз съм с OS X. Виждам, че тези готови методи, класове като този Math.Ceiling улесняват много живота, но наистина най-напред трябва да схвана какво изобщо се случва, как се правят нещата без тези помощи, после с тях ще е песен.

Това е много сложна професия, в шок съм. Знаех, че е сложна, но чак-чак-Чак толкова... Колкото повече научавам, толкова по-сложно ми се струва. Ако за два месеца съм до тук... Не знам, сигурно на 70 ще съм напълно в час.

Между другото, Judge системата много ме кефи — в проверката ти пише, че отговорът е "5 години, 3 дни" и ако напишеш "Анастас трябва да събира пари за танк в продължение на ... години и ... месеца"  дъра-бъра, тоест, ако се правиш на много отворен, изяждаш жесток шамар. Сега показваме единствено, че въобще можем да мислим. За себе си постоянно не съм сигурна.

До чуване по тази задача, аз вече половин ден не мога да се справя със следващата от същия изпит хахаха

 

 

0
GogoK avatar GogoK 80 Точки

Ifandieva а имаш ли промени по кода който е в началото?

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

 


пп.
       //int savedPerYear = actuallySavedMonthly * 12;                           // 1g = 48 lv
        //int yearsToSave = tankPrice / savedPerYear;
        //int months = tankPrice % 12;                       // тези 3 комента са от твоя код
                                                                         // оставих ги да видеш разликата

//1*        //int resultMonths = (int)Math.Ceiling((double)tankPrice / actuallySavedMonthly);
        int resultMonths = tankPrice / actuallySavedMonthly;
        int yearsToSave = resultMonths / 12;
        int months = resultMonths % 12;

        if (months > 0 || yearsToSave > 0)
        {
            Console.WriteLine(yearsToSave + " years, " + months + " months");
        }
        else
        {
            Console.WriteLine("never");
        }

пп. //1* Math.Ceiling е само за последното условие, затова го уставих в коментар. Цената на танка е по различна.  @kotow по горе е написал "200 / 4 = 50 месеца" (цената на танка/месечната печалба) незнам дали си го разбрала.

После само си разделяш 50-то на години; и месеци за остатъка. Но последния пример няма как да се получи без Ceiling. Защото се получава ~410,2..

     //int resultMonths = (int)Math.Ceiling((double)tankPrice / actuallySavedMonthly);
        int resultMonths = tankPrice / actuallySavedMonthly;

И ще ти кажа аз как направих по лесен уж алгуритъма..
                                                                                                    //200;8


 int normalDays = 30 - partyDaysInMonth;                                          //22
        int spentOnParties = partyDaysInMonth * 5;                                //40
        int savedOnNormalDays = normalDays * 2;                                 //44
        int actuallySavedMonthly = savedOnNormalDays - spentOnParties;          // 1m = 4 lv

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

Браво за задачата, на този етап си в завидна форма, Успех!

0
30/03/2015 11:43:13
metodi.krustev avatar metodi.krustev 1 Точки

Здравей!

Може ли условието на задачата?

0
SimeonStoykov avatar SimeonStoykov 114 Точки

Здравей. Условието на задачата е достъпно в Judge системата на СофтУни. За да го свалиш от там обаче ти трябва регистрация. Друг вариант е да го свалиш и видиш от тук.

1
Ifandieva avatar Ifandieva 71 Точки

Здравейте пак от тази тема,

 

Нямах намерение да я връщам, но започнах да "боря" изпитни задачи и тази пак се изпречи на пътя ми. Започнах да я решавам все едно никога не съм го правила, пак получих грешка на единия от тестовете (последния, input 15999 & 3) и понеже съм в Унито и имам VS пред себе си, си казах, че е време да прегледам авторското решение. Какво беше удивлението ми да видя грешни отговори не на 1, а на 2 теста! Отделно от разликите в самите резултати, веднъж отговорите са изписани като "... years, ... months", веднъж без запетайка между годините и месеците. Доколкото познавам judge системата (не много, ама достатъчно), знам, че тя реже лошо дори за такива наглед дребни различия, а камо ли за различни резултати в изчисленията. 

Странности забелязах и в други задачи - да речем, в условието на Traveller Bob се казва, че в дадени периоди той пътува 2/5 пъти по-малко, отколкото в други, а после в примера сметката се изчислява с 3/5 и тестовете връщат отговори, които са верни при 3/5...

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

dmstoyanov, сега и твоето решение дава грешни отговори и то на същите 2 теста като решението на автора (освен, ако авторът не си ти :).

 

0
Filkolev avatar Filkolev 4482 Точки

В PiggyBank имаше лисваща запетая само в единия пример от условието. Решението дава 100 точки, сега го пробвах. За кои тестове става дума и защо смяташ, че отговорите са грешни?

За Traveller Bob 2/5 по-малко означава, че пътува 3/5 пъти колкото обикновено. Т.е. аз ако пътувам 5 пъти седмично нормално, а в специални седмици пътувам 2/5 пъти по-малко, това означава, че всъщност пътувам 3/5 * 5 = 3 пъти седмично в специалните седмици.

Не сме намирали грешни тестове в тези две задачи.

1
Ifandieva avatar Ifandieva 71 Точки

Фил, преди да напиша горното, пробвах авторското решение някол копъти с всички тестове, после реших да проверя решението, което ми прати dmstoyanov. И при двамата даваше грешки на първия и на последния тест (667 години и 8 месеца; 34 години и 2 месеца). Сега всичко е наред. Нямам идея как се случва така.

 

А за Traveller Bob - да, не съм доразбрала добре. 

0
25/02/2015 17:00:25
a1mbiser avatar a1mbiser 63 Точки

Здравей, ето моето решение  Piggy bank разгледай го дано ти е полезно.

Относно .cs файловете те могат да бъдат отваряни с всеки текстов редактор(не ти е нужно Visual Studio)  ето един  за MAC който ще ти свърши работа Sublime Text

Винаги когато зациклиш ползвай google например ако искам да закръгля резултата,но не знам как правя ето така

Наистина във examples има изпусната запетайка (666 years 8 months) ако говориш за това но малко по-нагоре във файла с условието е зададено точно и ясно какъв трябва да бъде output-a (“X years, Y months”)

 За задачата traverler bob нямам какво да кажа (не съм я решавал)

Относно изпитите (а и задачите като цяло) бих препоръчал  ти да изгледаш това:

https://softuni.bg/Trainings/Resources/Video/1072/Video-31-mart-2014-Nakov-Programming-Basics-Mar-2014

както и тези:

https://softuni.bg/forum/1127/Homework-CSharp-Basics-Video-resheniya-na-domashnite-ot-CSharp-Basics-may-mart-2014

На мен ми бяха много полезни.

Edit: Filkolev e отговорил на въпросите преди мен извинявам се за дублиращите се отговори.

 

 

1
25/02/2015 17:50:27
a1mbiser avatar a1mbiser 63 Точки

Така е съгласен съм идеята ми беше по-скоро ако забиеш по време на изпита да намериш коя част на програмата ти се дъни и да потърсиш отговора в интернет (в твоя случай проблемът е че ти се губи някаква част (т.е. някъде в кода закръгля надолу) в примера който дадох math.ceiling() излиза в първите 3 линка на google suggestions) все пак предложението ми за видеата остава изгледай ги ако имаш време няма да е грешка. Лично аз посещавам тези курсове от месец и малко т.е. не съм по-напреднал :)

1
26/02/2015 20:08:51
iliya87 avatar iliya87 2 Точки

Да не отварям нова тема, вижте ми решението  и ако межете ми кажете къде бъркам в Judge системата ми изкарва една грешка http://pastebin.com/GcHGtZvD .

0
DHristoskov avatar DHristoskov 211 Точки

Според мен след като сметнеш резултата:

double count = (double)priceOfTank / (double)normalMonth;

направи така:

Math.Ceiling(count) за да го закръглиш към по - голямата стойност.

и тогава дели month и  year като ги кастенеш към integer за да ти ги закръгли,без да ползваш Math.Floor(years),Math.Ceiling(monts)

Успех.

1
24/03/2015 19:45:47
Filkolev avatar Filkolev 4482 Точки

Закръглянето на месеците трябва да стане преди пресмятането на годините, защото например 11.2 месеца ще станат 12 месеца, което 1 година и 0 месеца. Ако закръглиш накрая получаваш 0 години и 12 месеца, което очевидно е грешно. Това беше най-масовата грешка на тази задача по време на изпита и затова камара хора имаха 90 точки.

1
Ifandieva avatar Ifandieva 71 Точки

Радвам се, че не съм единствената!

0
g.pipkov avatar g.pipkov 2 Точки

Здравейте,

Някой би ли бил така добър да ме насочи къде греша, тъй като judge системата ми дава 90/100. Вече час се мъча, а никъде не намирам тестовете.

Ето кода: http://pastebin.com/NG5ntHUE. Благодаря предварително!

0
Willbe.S avatar Willbe.S 5 Точки

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

0
g.pipkov avatar g.pipkov 2 Точки

Така минава всички тестове. Благодаря!

0
StoykoMandzhukov avatar StoykoMandzhukov 11 Точки

Ето и моето решение: http://pastebin.com/bfCi30KV

Дава ми 80 точки. Пробвах с Math. Ceiling преди да разделя на годините, но тогава дава тотално различни резултати от примерните в условието. Нямам никаква идея каква може да е причината да не мине два теста и не знам в каква посока да мисля...

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.