Loading...

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

ArmenPotourlyan+deleted! avatar ArmenPotourlyan+deleted! 488 Точки

[Exam Problems] Advanced C# - Problem{20} - O, My Girl!

Здравейте, колеги,

 

Зациклих на задачката O, My Girl! от раздела Exam Problems Practice. Общо взето в нея трябва да се извлече информация, която е скрита в текст между двойки ключове (за по-детайлно обяснение - условието). Смятам, че или условието не е дадено коректно, или един от тестовете не е правилен. Изкарвам 80/100 и не мога да мина тест №3.

 

Тест №3 in:

FZaa
FFaBulFZia15FaagarFa165jj15FTTaiaFssa15895
END

Тест №3 out:  

Bulgaria

От първия ред (FZaa) се извежда ключа. Според условието и първия ред ключовете започват с F, съдържат от 0 до безкрайност големи букви, след това от 0 до безкрайност малки букви и накрая завършват с а. Като Regex израз:

F[A-Z]*?[a-z]*?a

Този израз обаче хваща следната информация:

FFaBulFZia15FaagarFa165jj15FTTaiaFssa15895 или Bulagaria (понеже Fa си е съвсем валиден ключ според условието!)

 

Да предположим, че не е обяснено като хората в условието. Бихте ли ми казали как да направя pattern-a така, че да хваща FaagarFa вместо FaagarFa. Ето и малко код по задачата.

Тагове:
0
C# Advanced
enevlogiev avatar enevlogiev 1168 Точки
Best Answer

В условието пише The address was parted in pieces of two to six symbols. Това е важна подробност - означава, че може да разкараш lazy символите и да знаеш, че greedy-то ще спре на правилното място, за да хване поне 2 символа като ключ.

Ето и разликата:

  • F[A-Z]*[a-z]*a(.{2,6})F[A-Z]*[a-z]*a  => FaagarFa
  • F[A-Z]*[a-z]*a(.+)F[A-Z]*[a-z]*a => FaagarFa

В първия случай се стреми да хване колкото се може повече символи - т.е. да намери последното а. Във втория случай се мъчи да хване колкото се може повече символи, но в capturing групата да останат поне 2.

Ако използваш *? спира на първото а, което противоречи на условието indefinite length or no length.

Като заключение, задачите с регекси винаги са голям отврат и са по-скоро гадаене, отколкото знания.

3
ArmenPotourlyan+deleted! avatar ArmenPotourlyan+deleted! 488 Точки

Ако използваш *? спира на първото а, което противоречи на условието indefinite length or no length.

Специално за това не съм съгласен. Fa е напълно валиден ключ. "agar" е между 2 и 6 символа. Така де, разбирам какво имаш предвид - a се намира измежду a-z символите и затова трябва да се смята вътре в ключа, ако имаме ключове Faaaa и от сорта. Малко е двусмислено, макар че може и аз да съм невменяем де laugh

 

Гарантирано на изпита няма да се сетя, че Faa е правилният ключ (освен ако съм се сблъсквал с подобно нещо преди това). Ако тръгна да мисля задачата като теб с {2, 6} quantifier, ще ми се размине. В случая аз обаче взимах всичко (.*?) и проверявах дали е между 2 и 6 символа (доста извратено laugh). Бъг в мисленето какво да правиш. Мерси за решението :)

2
29/05/2016 15:18:42
enevlogiev avatar enevlogiev 1168 Точки

И за мен Fa е валиден ключ. Просто авторът на задачата е искал да се използва *, но вместо 'zero or more times', е перифразирал описанието на 'indefinite length or no length'.

След това е написал няколко теста, пуснал ги е през авторското решение и е копирал аутпута в out.txt файовете. Най-вероятно не му е минало през акъла, че някой ще иска да използва *?. Има много такива задачи в софтуни, най-вече от първия випуск. Специално тази задача преди 1 година беше от примерен изпит по php.

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