Java Advanced Exam - 22 Oct 2017 - коментари, решения...
Как ви се стори изпитът, колеги? :)
На мен задачите ми харесаха, защото изискваха повече мисъл и нямаше скрити условия и "подводни камъни" в Judge.
Последната задача доста ме измъчи - 4 часа употребих за нея и пак не ми стигнаха за повече от 60/100
Първа задача ми хареса най-много, защото си искаше малко алгоритми за 100/100.
Втора и трета - нищо особено.
Ето решенията ми на първите 3 задачи за тези, които са имали проблеми с някоя от тях: линк
И трите входа дават един и същ изход: E\Q\%2Q\>.+*?)}]|!$=-^\{[(<E\%1Q\E\
Ето и решението, простичко е
Благодаря!
Оказа се, че проблемът в моето решение е в "сглабянето на стринга" (70/100):
Решението минава със 100/100, ако заменя горния код с:
Ето го и цялото ми решение: линк
Използвам малко по-различен подход за оформяне на регекса (без индивидуално искейпване на специалните символи и апендване символ по символ). Предполагам заради това моята версия е с около 30% по-бърза от твоята, но това в случая няма особено значение.
EDIT:
Този код също не успява да мине в Judge (60/100), но показва още един начин за подмяна на матчнати части от стринг:
EDIT 2:
В документацията на appendReplacement метода пише, че той третира $ като специален символ. Това обяснява защо горното решение гърми на един от тестовете. За заобикаляне на проблема с краша, $ трябва да се искейпне:
EDIT 3:
Още един метод, който работи аналогично на горния, но ползва Matcher.quoteReplacement, който се грижи за искейпването на $: