Loading...
lyubamarinova avatar lyubamarinova 14 Точки

Задача Nether Realms oт изпита Programming Fundamentals /23.10.2016г.

Здравейте,

Тъй като днес много се измъчих с тази задача , дали някой може да ми каже като разгледа кода къде всъщност греша и дали изобщо съм била на прав път , защото 2 от нулевите тестове ми даваха верен резултат , а там където имам 2 inputa - грешен , в Judge не получих никакви точки. Моето решение е : http://pastebin.com/2wGvZfDJ

Благодаря.

0
Fundamentals Module
koksibg avatar koksibg 892 Точки

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

https://softuni.bg/forum/12552/programming-fundamentals-exam-part-1-and-2-23-october-2016

0
lyubamarinova avatar lyubamarinova 14 Точки

 Мерси за отговора , но ме интересува конкретно с моето решение , дали изобщо съм била на прав път. :)

0
petlv avatar petlv 5 Точки

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

При сплитването на инпута трябва да добавиш и RemoveEmptySpaces, а в регекса на numberPattern да запишеш плюс или минус [-|+]?, тъй като двата знака не могат да съществуват едновременно пред дадено число.

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

0
lyubamarinova avatar lyubamarinova 14 Точки

Аз реших в началото да разделя задачата на два случая - когато имам само 1 елемент в масива и вече в else , сложих for цикъл да обхожда масива , когато дължината на масива е по-голяма от 1 , но явно не е бил на правилното място , както казваш. :)

0
petlv avatar petlv 5 Точки

А да, реално ти го имаш този for-цикъл, но защо трябва да се усложнява с този if-else и да се повтаря кода два пъти. Спомням си как лекторите ни обясниха да избягваме повторението на код, защото вероятността от грешки е много голяма - на едно място може да поправиш, а на друго да забравиш и така се оплесква цялата задача.

Използваният вложен цикъл (с 'к' и 'j') нещо не разбрах каква му е целта. Ако се прави за някаква проверка, то по-добре още горе в регекса да се извърши тя. Идеята е после да вземеш стойността от match-a, да я парснеш и да я добавиш към общата сума на съответния показател. Дано съм бил от помощ.

0
lyubamarinova avatar lyubamarinova 14 Точки

Вложените цикли с 'к' и 'j ги направих , за да си преброя колко пъти имам символа ' * ' и ' \ '  и да знам колко пъти трябва да умножавам или разделям на 2.Аз в началото не исках да правя if-else конструкция и да повтарям кода , но след като не успях да взема никакви точки , реших да пробвам да мина някои от тестовете , където има само един input , защото в тези случаи нулевите тестове ми минаваха.

0
petlv avatar petlv 5 Точки

Аз казуса с ' * ' и ' \ ' го реших по следния начин - събираш ги в един MatchCollection, след което обхождаш с един foreach всеки match и вкарваш в цикъла един if-else (ако е '*' да умножава по 2, а ако е '/' да дели на две).

Могат да се създадат отделни регекс шаблони, както в твоя случай, за буквите, цифрите и умножението-делението. Но можеш да оптимизираш с един единствен regex pattern, който да разделиш на групи - група 1 за числата, група 2 за буквите и др. символи нечисла, и група 3 за ' * ' и ' \ '.

0
lyubamarinova avatar lyubamarinova 14 Точки

Ами да , в моя код също е така  , буквите, цифрите и знаците са в отделни Math Collections :

  1. MatchCollection digitCollection = digitRgx.Matches(input[0]);

  2.                 foreach (Match match in digitCollection)

  3.                 {

  4.  

  5.                     string newDigits = match.ToString();

  6.                     string cleanDigits = newDigits.Trim('-', ' ', '.');

  7.                     char[] last = cleanDigits.ToCharArray();

  8.  

  9.                     for (int k = 0; k < last.Length; k++)

  10.                     {

  11.  

  12.                         for (int j = 0; j < last.Length; j++)

  13.                         {

  14.  

  15.                             if (last[k] == last[j])

  16.                                 count = count + 1;

  17.  

  18.                         }

  19.                         if (last[0] == '*')

  20.                         {

  21.                             damage = newSum * count * 2;

  22.                         }

  23.  

  24.                         else

  25.                         {

  26.                             damage = (newSum) / (count * 2);

  27.                         }

  28.  

  29.                     } 

Извинявай , че така копирам кода , но исках конкретно това да покажа от написаното в решението ми.Просто аз допълнително слагам брояч , за да преброя колко пъти се среща даден знам в Input-a.

0
Stanislav.Petrov avatar Stanislav.Petrov 12 Точки

Здравейте,

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

Това е моето решение:https://pastebin.com/mVYcfWi7

В Judge ми даша 90/100 и ми гърми на 5 тест. Някой знае ли какъв е input-a?

Знам, че повечето/ако не всички са реяавали задачата с reget , но ние още не сме го взели, а очевидно, че може да се реши без него.

0
YavorGrancharov avatar YavorGrancharov 0 Точки

Имам същия проблем като lyubamarinova при вход M3ph1st0** изхода е M3ph1st0** - 524 health, 16.00 damage, както и при вход Azazel изхода е Azazel - 615 health, 0.00 damage , но когато входа е M3ph1st0**, Azazel получавам - Azazel - 1139 health, 16.00 damage, M3ph1st0** - 1139 health, 16.00 damage, сумират се health и damage на първия и втория демон и не мога да разбера откъде идва проблема!?

Код:

https://pastebin.com/aRfb8yFV

0
Elena123456 avatar Elena123456 235 Точки

Реших да пиша, защото задачата е актуална и до този момент, а не намирам друга тема на C#. Няколко часа решавах задачата и ще споделя решението си за насърчение на колегите, които в момента карат Фундаментал модула: https://pastebin.com/ZPqmrnaX . Междодругото тази задача много ми напомни на една епична битка от "The lord of the rings", когато джуджетата защитавали Мория и записали в своята книга и последната си битка, точно преди да загинат. Също така и ние в момента имаме задачата да запишем последната битка на демоните, след която само един ще оцелее. :)

 

1) изгубих доста време при четенето на инпута, докато осъзная, че сепараторите може да са няколко: Split(new char[] { ' ', ','},StringSplitOptions.RemoveEmptyEntries) и това вече се признава от Judge;

2) за разлика от другите задачи със стрингообработка и regex, тук  може би  се изисква четенето на масив, защото могат да се подадат, като входни данни няколко имена на демони, и като се foreаch() през масива вече се получава отделното име на демона;

3)вече, когато имаме името на демона използвам три регекса- за health, за damage и един общ за намирането на всички '*' и '/':

  •   Regex regexForHealth=new Regex(@"[^\d\+\-*\/\."" ""]");// ASCI стойностите на всички символи без тези в скобите;

            Regex regexForDamage = new Regex(@"(?:\+|-)?[0-9]+(?:\.[0-9]+)?");//сумата на всички числа, като могат да имат + или - отпред или десетична точка с числа след нея.

            Regex regexForMultiplyOrDivideSymbols = new Regex(@"[*\/]");// и вече след като сме изчислили damage чрез този регекс търсим само "*" и "/", като съответно *2 или /2.

damage = damage * 2; или damage = damage / 2; Ако по невнимание сложим "+" пред "=" вече се отдалечаваме от условието на задачата.

4) може да има и по- удачен вариант, но аз избрах да използвам два речника: един с името на демона и неговия health , и втори с името на демона и неговия damage.

5) и накрая чрез foreach и OrderBy(x=>x.Key) ще принтирам по азбучен ред имената на всички демони с техния health и damage;

Поздрави и успех на изпита!

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