[Exam] PHP Basics - 21 декември, 22 декември 2014 - решения, впечатления, резултати
Здравейте колеги. Явно заради празниците все още няма създадена такава тема. Какви са ви впечатленията от изпита? Доволни ли сте от резултата?
Аз се явих на изпита на 22-ри.
Както винаги започнах от 1-ва задача. Оказа се много лесна без никакви подводни камъни и сложни сметки. Дори формулата ни беше дадена. Май досега на изпит не бях решавал задача за 10мин.
Следващата задача беше втора. Бързо успях да направя regex и да пробвам решението и взех 50 точки. От този момент чак до края на изпита започнаха родилните мъки с тази задача, като така и не успях накрая да родя 100 точки.
След 1 час и 40 мин. мъки реших най-накрая да започна 3-та задача. Успях да си изградя логиката на задачата още в самото начало. Първият submit с реален код (винаги пускам още в самото начало var_dump na $_GET) не ми даде никакви точки. След 5 минути мина само 1 тест и след още 5 взех 100.
Започнах 4-та. В началото като видях толкова много input полета и checkbox-ове не останах доволен. След внмателно прочитане на задачата успях да разбера какво точно се иска. Доста неприятно беше, защото се получи доста дълбок асоциативен масив и си беше объркващо. Бавно и внимателно сглобих кода и след 1 час взех с първия submit 87 точки. Най-гадното нещо в една задача е да е мине 1 тест. Ядосан се и си помислих, че и тук ще падне голямо копаене... Да ама веднага се сетих, че аз изобщо не съм използвам по никакъв начин полетата за min и max килограми и не съм сравнявал с получената сума. Останах доста изненадан, че с такава генерална грешка само 1 тест не ми мина :) След корекцията в логиката на програмата ми взех 100 точки и малко си отдъхнах.
Върнах се пак на 2-ра задача. След като ни казаха да проверяваме и от двете страни дали числото има символ взех още 12 точки и вече станаха 62. Това бяха последните точки, които успях да взема до края на изпита. Какво ли не правих, как ли не променях решението си ама не... През цялото време си мислех, че за да не минат 3 последователни теста значи не намирам правилно числата от стринга. Дори написах нова логика за намиране на числата, този път без regex и пак 62 точки. По едно време реших все пак да подам дата, по-малка от 1970-та и пробвах с 1940-та година и пак си работеше. Трябвало е обаче да пробвам с < 1900..... За три реда код (вместо strtotime е трябвало да използвам DateTime класа) се лутах 4 часа общо на тази задача и така и не взех 100 точки.
Ето решенията на 4-те задачи, но не във вида, в който ги предадох, а малко поизчистени:
Понеже бях нощна смяна и за да ми мине по-бързо времето реших задачите и от другия изпит:
Пожелавам на всички колеги весели празници и посрещане на новата година с настроение и усмивка. Не на последно място и успех в новото ниво в SoftUni.
Message Decoder - know the feeling...
И аз забелязах като решавах вашия изпит, че някои проверки може да ги махна и да съкратя кода, защото просто не пускат такива тестове. Имам предвид за втора задача от нашия изпит. В твоето решение не проверяваш дали въведената дата е валидна и примерно при подадено 2014-35-01 я обработваш като реална дата. И аз на една от вашите задачи изтрих проверките и ще ми гръмне, ако се добавят някои допълнителни тестове, но не помня коя задача беше.
Що се отнася до сортирането - след JavaBasics изпита имам обеца на ухото и сортирането вече на сън го правя :)
Повярвай ми, проверявах по едно време за валидност на датата, но като видях, че не е там проблемът затрих, че да мога по-лесно да се ориентирам в осталата част от манджата :D
Фил, моят коментар е насочен към Анатоли :)
А ти успя ли да видиш защо ти гърми решението на 3-та задача с while цикъла? Аз погледнах за 5 минути ама не можах да разбера и ще задълбая като имам малко повече време. На Анатоли май му гърмят сищите тестове като и на теб.
Гърмяха ми 4 и 6-ти тест, после с промените гърмят 3-ти и 6-ти. Никаква идея. Правих и днес някакви отчаяни промени. Докато не видя входните данни да дебъгна с тях според мен няма да разбера откъде идва проблемът.
Аз не смея да си покажа сега кода на Message Decoder щото такова мазане падна в търсене на проблема... На мен ми гърмят ми 3 и 5 тест![laughing](https://tinymce.cachefly.net/4.0/plugins/emoticons/img/smiley-laughing.gif)
ПС. Мда, прав си Никола, че нямам проверка за валидна дата... и ако е подадена невалидна създаването на DateTime обект ще ми гръмне..., честно казано не се и сетих да сложа проверка за това :)
За сортирането в PHP много се кефя на array_multisort, за сортиране на масиви по няколко критерия. В общи линии много неща се правят значително по-лесно отколкото примерно в Java...
Анатоли, а твоята логика подобна на логиката на Фил ли е?
Ох, айде, ето последното мазало: http://pastebin.com/upZwkaPU, а това е първото /по-малко/ мазало, което даде 66/100: http://pastebin.com/pPmiJ9ti
Ама моля ви, не се смейте много
Ахъм, с while е, сигурно там нещо гърми. Никола, ти проверяваш предварително с някаква логика колко реда трябва да изпечаташ, явно там някъде е разковничето.
Май разбрах грешката.... я пробвайте ако последния подаден елемент е * и ако е така го изрежете с substr.
Хм явно не подават такъв тест, който да завършва с *.
Мисля, че не е това...
Този код, мисля покрива случая:
Не е от звездите накрая, пробвах да тримвам празни места и звезди в краищата.
Освен да почнем да тормозим празнично авторите на задачите да ни пратят тестовете :D Аз ги знам кои са.
Оп, хванах още един тест като заместих всички празни места в стринга с едно празно място, остава още един:
Фил, дам сега само 5-ти гърми. Нали каза, че първо са ти гърмяли 4-ти и 6-ти и след промени 3-ти и 5-ти. Дай първия код, при който 5-ти тест ти е минавал.
Браво - и на мен това ми оправи един от тестовете - остана да гърми 5-ти :)
Извинявам се, ама както го пише в условието никога нямаше да се сетя да търся повече от едно празно място:
The second row of the matrix holds an array of strings which hold the pinging information. There won’t be more than one space. The input data will always be valid and in the format described. There is no need to check it explicitly.
Никола, объркал съм се, 5-ти никога не съм го хващал. Гърмяха ми 3 и 5, а с някакви корекции ми гърмяха 2 и 5. Ама 5 си стои непоклатим.
Анатоли, това за единичния спейс мисля се отнася само до входните данни, т.е. за формата, в който ни подават данните, а не за спейсовете в самите думи, които трябва да пълним в таблицата.
Ок, така да е - но в такъв случай никъде не виждам да пише, че ако има повече от един whitespace да печатаме само една празна клетка, а не по клетка за всеки whitespace... Тук си трябва гадателство :)
Аз на изпита доста време отделих за random промени, днес продължих с други такива. Наистина и аз не виждам къде в условието е казано да правим такова нещо, тъй че по-скоро някаква случайност. Опитах да затрия и всички спейсове, но дава обратен ефект.
Не съм сигурен, че проблемът е в празните символи. Сега си тествах моето решение, което дава 100т. Никъде не замествам празните space-ове с нищо. Просто използвам preg-split като разделям само по '*' и си запазвам space-овете както са си и си ги принтирам накрая.
Промених стринга ръчно на
$string = 'Nik 0la * Marinov * ' .
Повадам му 4 колони да принтира.
Първата дума 'Nik 0la ' ми я принтира на 2 реда с една празна клетка между 'k' и '0' и три празни клетки след 'a'.
Втората дума ' Marinov ' ми я принтира на 3 реда. Преди 'M' 3 празни клетки и след 'v' също 3 празни клетки.
За последната дума ' ' принтира 1 ред с 4 празни клетки само.
Edit: сега тествах кода на Фил със същия стринг и неговия код принтира 1 ред в повече за първата дума.
Значи, открих къде е проблемът - оказва се, че звездата не се счита за част от думата, което никъде в условието не е казано, а според мен трябва. Т.е. ако се случи звездата да е в началото на реда, този ред не следва да се запълва с празни клетки. Махнах последната промяна, с която зачиствам спейсове и се оказа ненужна, явно просто помага за единия тест по случайност (което предполагах, че е така).
Не мисля, че това е грешка в логиката ми или тази на Анатоли, по-скоро е пропуск в условието, защото няма как да отгатнем, че звездата е символ, който се счита за един вид контролен и не е част от думата.
Ето кодът за 100/100 - ЦЪК.
П.П. Специални благодарности на Никола, който намери всъщност къде се получава този бъг. Все пак я преборихме задачата без тестовете.
Евала и на двамата - това е проблема наистина :) Никола със сплитването по звезда избягва изобщо такъв случай, а аз като въртя по масив от чарове... :) Добавих окончателното си решение в линковете от гитхъб по-горе. Не е картинка много много, но върши работа :)