Loading...
v1ppers0nn avatar v1ppers0nn 234 Точки

[Exam Problems] PHP Basics 21 декември "Sum of All Values"

Здравейте,

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

ModEdit: Колега, когато се поства по-дълъг код го сложи в pastebin или github, както е написано в правилата на форума, все пак отдавна си във форума и би трябвало да знаеш правилата.

 

Тагове:
0
PHP Web Development Basics 24/12/2014 09:55:22
RoYaL avatar RoYaL Trainer 6849 Точки

Дай и условието де

1
v1ppers0nn avatar v1ppers0nn 234 Точки

You are given a keys string and a text string. Write a PHP script that finds the start key and the end key from the keys string and then applies them to the text string.

The start key will always stay in the beginning of the keys string. It can contain only letters and underscore and ends just before the first found digit.

The end key will always stay in the end of the keys string. It can contain only letters and underscore and starts just after the last found digit.

Print at the console the sum of all values in the text string, between a start key and an end key. If the value is 0 then print “The total value is: nothing”. If no start key or no end key is found then print “A key is missing”.

0
RoYaL avatar RoYaL Trainer 6849 Точки

Може ли и някакви примери, аз до колкото разбирам, имаш стринг от ключове, който изглежда нещо такова:

rrt_r556hjhfgk3_4f_d

Това означава, че rrt_r е старта и f_d е краят. Регексът ти го хваща правилно.

Само, че как изглежда текстът? Нещо такова?

myt34rrt_rxtf48tef_dxt

Ако е така, кодът ти не го хваща този xtf48te текст по средата и съответно не смята 4+8=12

От условието не ми стана ясно също така, колко пъти се средат стартовия и завършващия ключ в текста? Т.е. може да ги има повече от веднъж?

Иначе по-горния пример го реших доста пимитивно:

$sum = 0;
for ($i = strpos($textString, $start) + strlen($start); $i < strpos($textString, $end); $i++) {
$sum+= intval($textString[$i]);
}

Ако могат да се срещат повече от веднъж, това означава, че тази операция освен че трябва да смята сумата, ще трябва да махне текущите ключове и текста между тях от стринга и да се аплайне пак, докато strpos() не започмне да връща false

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

 

0
VenelinGrozev avatar VenelinGrozev 130 Точки

startKey-a лесно се хваща но според мен в end Key-a е проблема понеже ако го имаш няколко пъти в стринга ще го хване няколко пъти.

После като извикаш $end = $keyMatches[2][0]; би трябвало да ти върне първото срещнато съвпадение а не последното.

Ако искаш погледни моето решение - дава 100 точки.

-1
a.angelov avatar a.angelov 1316 Точки

Ето и едно мое решение на задачата, така като съм го събмитнал в judge: http://pastebin.com/GBjdZT2Y

Между другото видях, че задачите са отворени за практикуване вече :)

1
nikola.m.nikolov avatar nikola.m.nikolov 830 Точки

Хм разгледах regex-a ти и има някои странности в него. Защо си сложил \S в началото? Като намираш първия ключ в него липсва първия символ. Съответно ако startKey-a ти а  "а" кода ти ще върне, че няма key. Явно в тестовете няма startkey с по-малко от 2 символа :) Другото е, че regex-a ти очаква да има поне 2 цифри. Ако има 1 според условието пак трябва да ти го хване като валиден ключ, а твоят regex май няма да го хване. В смисъл твоят regex няма да ти хване startKEY1endKey

Някой знае ли дали в judge ако има Notice връща грешен резултат или не? Питам, защото в репението ти $numericFound го декларираш без стойност и съответно ако не го промениш на true връща Undefined. 

2
23/12/2014 23:30:57
a.angelov avatar a.angelov 1316 Точки

Коментарът ти е много точен smile

Това ^\S /а да не говорим, че това \S си е направо излишно, достатъчно е само ^/ трябваше да е в скобите на първата група, но явно по-грешка съм го написал пред тях от бързане /за щастие и така е проработило, въпреки че не хваща първия символ от startKey - добре, че не е имало ключове с 1 символ в тестовете наистина/ :) За цифрите също си прав /така съм разтълкувал условието, че търся две цифри/, но в тестовете явно отново няма такъв случай само с 1 цифра :) Регекса ми има пропуски - факт, но се радвам, че е проработил спрямо заложените тестове :)

1
24/12/2014 13:36:55
nikola.m.nikolov avatar nikola.m.nikolov 830 Точки

То и друг проблем открих заради този \S :)

key -   baa22aa

text:    aa22aa

ще ти върне 22 

 

btw мен много ме е яд, че заради strtotime си прецаках втора задача и взех 62 точки :) Само 2 реда от кода като смених и го направих с DateTime класа и стана.

 

0
24/12/2014 00:09:21
infreezer avatar infreezer 15 Точки
Проблема е в regex-ите,
$keyPattern = "/(^[A-Za-z_]+)\d+.*\d([A-Z-a-z_]+$)/";
$textPattern = "/$start(.*?)$end/";
и си готов. 100/100.
0
24/12/2014 02:45:23
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.