Професионална програма
Loading...
+ Нов въпрос
GalyaGeorgieva avatar GalyaGeorgieva 88 Точки

[Подготовка за изпита в Judge] - Problem 12 – Phone Numbers

Не успях да намеря отворена тема за тази задача.
Кодът ми стигна само до 50 точки.
Ако някой има идея какво да се пипне нека ми удари едно рамо wink

Кодът в GitHub

 

п.с. 3 дена по-късно, кодът най-накрая е "напаснат" по изискванията на джъдж за 100 т. :)
 

Тагове:
0
C# Advanced 29/05/2015 12:54:08
Filkolev avatar Filkolev 4482 Точки

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

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

-1
dmaslev avatar dmaslev 25 Точки

Аз също забих на тази задача. Докарах я до 87/100. Само 4-ти тест не ми минава. След няколко неуспешни опита да намеря какъв е проблема, не издържах и свалих тестовете от php изпита.(https://judge.softuni.bg/Contests/58/PHP-Basics-Exam-12-January-2015) . 4-тият тест няма нищо общо с условието. 

Въпроса ми е еднакви ли са тестове на двата изпита и има ли шанс да е омазан  4-ти тест или проблема е в мен.

 

1
Filkolev avatar Filkolev 4482 Точки

Трябва да търсиш номерата в целия стринг, т.е. мвжду името и телефона може да има нов ред включително. Извадки от условието:

You are given a string, holding ASCII characters.The input will be read from the console. It will consist of several lines holding the input string. Between a name and the phone number there might be any number of symbols, other than letters and “+”.

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

1
boyanst avatar boyanst 29 Точки

И аз я зациклих на тая задача. Гледах решението ти, но нещо не виждам грешка. Аз правя един регекс да хваща и името и номера ама пак греши на 1,4 6 7 тест. дава само 50 точки. Ето решението ако може да ти помогне с нещо:

http://pastebin.com/8YLtvY1g

 

0
Filkolev avatar Filkolev 4482 Точки

Между името и телефона може и да няма символи, а ти търсиш задължително да има. Може и да греша за това, но не ми се проверява; виж условието дали иска задължително да има някакви символи между двете.

Ползваш look-behind,  в който остават плюсовете и евентуално някакви цифри. Това, което е в look-ahead/behind, не е част от мача и ти го губиш, защото не го хващаш. Втората половина на регекса я промени, доста по-лесен е патърна, усложнил си го повече, отколкото трябва. Може да има или да няма плюс, след това трябва да има цифра, след това може да има последователност от цифри и някой от посочените символи и накрая пак трябва да има цифра.

1
boyanst avatar boyanst 29 Точки

Благодаря много. Смених + с * в часта на регекса, който търси символи между името и номера и даде 100 точки. Трябва да чета по-внимателно условията на задачките написана е че може и да няма. Усложняването на патърна се получи от това, че се чудех къде е грешката и пробвах какво ли не. Отново благодаря за съвета.

0
GalyaGeorgieva avatar GalyaGeorgieva 88 Точки

Ще споделиш ли оправения код?

0
pataroka avatar pataroka 319 Точки

Аз пак ще се заям с условието на задачата... И тоя път не приемам никакви оправдания, щот сте си вкарали автогол като сте дали и тестовете.

По кой точно начин това:

Aa!@#$+-12
END

Не отговаря на това:

The name should be at least one letter long, can contain only letters and should always start with an uppercase letter.

The phone number should be at least two digits long, should start and end with a digit (might also start with “+”) and might contain the following symbols in it: “(“, “)”, “/”, “.”, “-”, “ “ (left and right bracket, slash, dot, dash and whitespace).

И ако ми кажете, че това не е редовен отговор, защото не можеш да направиш ordered list от един елемент в HTML, ще се изсмея гръмогласно...

А ако някой е изкарал 100 точки с този тест - ще му кажа, че регекса му не струва...

И ако ми отговорите с това:

Between a name and the phone number there might be any number of symbols, other than letters and “+”.

Ще кажа, че телефонния номер тук започва с '+', има поне две цифри, завършва на цифра и има '-' вътре:

                                                           +12

Ако имаше примерно $ на мястото на тирето - щях да го приема, ама тогава и регекса ми нямаше да го хване. cheeky

0
28/05/2015 23:44:18
Filkolev avatar Filkolev 4482 Точки

should start and end with a digit (might also start with “+”)

Аа е валидно име. +-12 не е телефон, защото трябва да започва с цифра и да завършва с цифра, евентуално да има плюс най-отпред, тук минусът прецаква нещата. 12 не е валиден телефон, защото между името и телефона може да има всякакви символи освен букви и плюс, а в случая има плюс.

0
pataroka avatar pataroka 319 Точки

Както вече казах минусът трябва да прецаква нещата, ако не беше това условие

might contain the following symbols in it: “(“, “)”, “/”, “.”, “-”, “ “

По тая логика, всеки един от тези символи сложен веднага след плюса ще дава невалиден номер. Ако това е била логиката на задачата, условието трябва да гласи:

The phone number should be at least two digits long, should start and end with a digit (might also have a “+” in front) .

Когато се пише подобно условие е редно да се дефинира дали плюсът е част от телефонния номер или е възможна добавка към него. В условието е посочен като възможна стартова позиция на номер. Това означава, че всичко, което е след него, е част от този номер ако отговаря на изискването за съдържащи се в номера символи. Във варианта, който съм описал по-горе, означава, че не е стартова позиция на номер, но ако стои непосредствено пред номер е част от него. Усещаш ли тънката разлика?

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

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

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

1
29/05/2015 14:53:08
Filkolev avatar Filkolev 4482 Точки

Да, усетих накъде биеш и точно това реших да направя промяна. Сега условието гласи: "The phone number should be at least two digits long, should start and end with a digit (optionally, there might be a “+” in front) and might contain the following symbols in it: “(“, “)”, “/”, “.”, “-”, “ “ (left and right bracket, slash, dot, dash and whitespace)."

Виж обаче оригиналното условие и познай лесно ли ми беше да хвана тоя 8-ми тест :D Опитах да го изчистя, ама явно все още е имало недоизпипани неща. Надявам се сега е ОК.

1
29/05/2015 18:19:42
dakata666 avatar dakata666 3 Точки

Можеш ли да обясниш регекса малко по-подробно ? :) 

0