Loading...
NonaG avatar NonaG 111 Точки

Задача Rage Quit от Programming Fundamentals Sample Exam I - October 2016

Понеже тази задача явно трябва да се реши с Regex, а аз чакам лекцията с Ивайло Кенов, защото изгледах и майския, и септемврийския курс за регекси, но определено имам нужда от много повече информация по темата, направо е необятно - нито lookbehind/..., нито positive/negative, мътна и кървава...Особено като съм online, много е трудно да събереш пъзела сам, само с четене от интернет,...

Това е решението  ми без регекс: http://pastebin.com/40nLkK1N

Обаче дава само 10т. Има тестове, които гърмят за време /тестовете са поместени в C# Advanced Exam - 19 юли, но са нечетими за мен/, други не изчисляват правилно... Това char.IsDigit не работи, както очаквам...

Задачата е тази: https://judge.softuni.bg/Contests/Practice/Index/331#2

Моля някой да отдели време да обясни къде бъркам.

 

Тагове:
0
Programming Fundamentals
ambiorix avatar ambiorix 640 Точки
Best Answer

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

Не разбрах дали искаш да анализираме твоето решение или да разясним регекс, но аз ти предлагам моя вариант с регекс в който сега сложих коментари за всяко действие което прави кодът и според мен ще се ориентираш веднага: https://dotnetfiddle.net/KZexHb

 

Оригинал: https://github.com/gaydov/Softuni-Programming-Fundamentals/blob/master/Exams/Sample-Exam-I-October-2016/RageQuit/RageQuit.cs

 

Според мен като начало копирай pattern-ите в https://regex101.com/ и виж там какво ти хващат като сложиш тестовете от задачата + твои каквито си измислиш.

След това копирай кода във VS и го мини с дебъгера отначало докрай пак с колкото тестове искаш. Така ще видиш какво взимаш при всяка стъпка.

 

П.С. Използвам StringBuilder, защото конкатенацията на стрингове е бавна операция и ако са сложили тест с много добавяния няма да му стигне времето.

0
20/02/2017 00:51:34
NonaG avatar NonaG 111 Точки

Много благодаря! Обясненият регекс е лесен за схващане, но не мога сама да стигна до него, особено за времето на изпита. От понеделник го почвам, или го разнищвам, или никаква София. Като под "разнищвам" разбирам да ми е забавно, като трябва да го използвам, а не да отхвърлям цели задачи, защото не мога да си отсея input-а. :)

 

0
ambiorix avatar ambiorix 640 Точки

Специално за изпита мисля, че задачите могат да се решат и само с обработка със стрингове. Тази мисля, че също може - започваш цикъл отначалото на входното изречение като проверяваш дали текущия символ може да се парсне към число(try catch). Ако не може продължаваш напред като добавяш символите дотук в един StringBuilder. Ако се парсва проверяваш дали следващият също не се парсва, защото числата може да са от 0 до 20 по условие. Ако се парсва, повтаряш натрупаните символи дотук толкова пъти колкото числото и ги добавяш в StringBuilder за резултат. Ако имаш интерес, кажи и ще опитам да я напиша така този следобед.

Относно ученето на изразите, то при повечето хора е така. Това което на мен ми помогна най-много е поредицата на този човек като това е първото видео от нея(общо са 5-6 мисля за основните неща): https://www.youtube.com/watch?v=7DG3kCDx53c

Ако си добре с английския го погледни.

1
12/02/2017 07:51:29
NonaG avatar NonaG 111 Точки

Може ли да погледнеш решението ми. Това, което казваш, се опитах да направя, но с метода char.IsDigit и с речници, не със StringBuilder , само че тестовете гърмят. Въпросът е защо? Защо try Parse хваща парсване към int, а IsDigit - не? Значи, почвам да я решавам вчера,  избирам какъв ще е алгоритъма - StringBuilder към момента ми е по-лесен от речниците, затова решавам - речници. И винаги съм готова да ги сменя, ако някой тест гръмне за памет. Но те гърмят за време, значи няма да ги оправя, ако сменя речника и листа със StringBuilder.Знам, че е най-добре с регекс, но засега ще е без него, знам, че нещо не правя както трябва с IsDigit, почвам да търся, попадам на  възможно решение с try Parse и зациклям. Защото за char.IsDigit във варианта IsDigit Method(Char) - както е в моя случай https://msdn.microsoft.com/en-us/library/7f0ddtxh(v=vs.110).aspx 

Return Value

Type: System.Boolean

true if c is a decimal digit; otherwise, false.

Така че, какво изпускам? Така или иначе после парсвам към int? Защо try Parse да парсва по-коректно?

Тръгвам да търся авторските тестове, които винаги са ми били краен УСПЕШЕН вариант. Не и този път. :) /Ти отварял ли си ги?/

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

 

 

0
ambiorix avatar ambiorix 640 Точки

Признавам, че не разбрах на 100% всичко което имаш предвид, но ще се опитаме да го разнищим :)

Аз нямах предвид да ползваш tryParse а чист try {} catch {}. Тоест например за всеки символ от масива да пробваш да го парснеш и ако не става значи той трябва да се повтаря и не е цифра. Но нека изключим този вариант за момента.

Не съм търсил тестове и не го правя принципно, защото не знам къде ги има. Умувам какво може да са се сетили да сложат като вход. Повечето пъти уцелвам всички, друг път 70 - 80 точки.

 

Първо, малко да изясним фундаменталните неща:

- digit е цифра от 0 до 9. Напр. 5 е цифра, но 18 не е цифра, а е число съставено от две цифри.

- в int влиза всичко от -2,147,483,648 до 2,147,483,647.

- StringBuilder и речниците са коренно различни неща, както знаеш. В случая не виждам защо да ползваш речник като никой никъде не иска зависимост между ключ и стойност, а точно това което е силата на StringBuilder - да добавя многократно към някакъв стринг. Входът ти е някакъв стринг и изходът също. Не разбирам защо мислиш, че е нужен речник. Може да обясниш ако нещо изпускам в случая.
 

- със StringBuilder не пестиш толкова памет, а печелиш ужасно много скорост, бързодействие. Веднага давам пример(мисля, че е даван като пример и тук из лекциите): следния код добавя 100 000 пъти думата "text" първо към стринг, а после към StringBuilder и накрая изкарва времето което му е отнело за всяко една операция в секунди. Първия път са около 10 секунди(на моя компютър), а вторият ще видиш :)

 

Ето и решението което подготвих без РегЕкс както обещах сутринта: https://dotnetfiddle.net/3PKGDN

Разгледах твоето и то е много подобно, но пак казвам, че не ти трябват речници, защото никъде не се иска тяхната функционалност, а само те бавят. Тук проверявам всеки символ от входния масив следователно мога да ползвам isDigit, няма нужда да е tryParse.

Ако е станало малко по-ясно, опитай с тези насоки да напишеш твое решение или ако виждаш нещо което може да се подобри или да е различно. Оставам на линия при въпроси.

 

0
12/02/2017 19:28:21
varbanov88 avatar varbanov88 38 Точки

Някой вас би ли погледнал това решение: 

http://pastebin.com/zfbY1ssu 

дава ми 90/100 и гърми само в 1 тест, в който броят на уникалните символи е грешен, а принтираният резултат верен.

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

Не мога да разбера защо е така

0
NonaG avatar NonaG 111 Точки

Ако промениш result да ти е StringBuilder, нпр., и след това му вземеш дължината с неповтарящите му се символи, /защото като лист не знам как да го преработя за достигане на същата идея/, :

var count = result.ToString().Distinct().Count();
Console.WriteLine($"Unique symbols used: {count}");

тогава ще получиш 100/100. Не мога да ти кажа защо, авторските тестове са прекалено дълги, за да разбера кой йероглиф се чете един път в result и два пъти в uniqueSymbols. :)

Всъщност, ако разбереш, моля пиши.

0
22/02/2017 20:29:32
krasio12356 avatar krasio12356 19 Точки

Да не би авторския да е грешен.

Щото и със сортед сет гърми на един тест и на един нулев, на същите, дето и със хаш сет гърми.

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

По вероятно е метода Дистинкт да е бъгав, защото, няма как сетовете грешно да преброят символ в повече. Това значи да изтърват два еднакви. Не може, защото или се хешират на едно място, или се сортират на едно място.

Затуй му се вика сет, защото по природа държи само уникални елементи.

Със Дистинкт.Каунт върху същия стринг билдър дава 100 точки, ама е грешно. Явно метода е бъгав.

0
03/06/2018 09:57:26
rumen80 avatar rumen80 13 Точки

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

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