[Exam Problems] Java Basics - 03 September 2014 - {03} Biggest 3 Prime Numbers
Имам забележка към тази задача. В Judge има два некоректни теста - 7-ми и 8-ми.
В условието е казано: You are given n numbers in format (a1) (a2) … (an).
Малко по-надолу, в секцията Input пише: All numbers are in brackets.
Във въпросните два теста има числа, които не са оградени от скоби, като в 8-ми нито едно число не е в скоби. От двете изречения по-горе става ясно, че скобите не са опционални, т.е. казва се, че задължително ще има такива => тестовете са некоректни.
Авторското решение ползва регекс и този проблем се заобикаля. Аз обаче, като човек, който не е много уверен с регекс, ползвах малко по-тъпашки начини да си сплитна входа до числа. Методът ми разчиташе на факта, че между всеки две числа имам скоби, съответно на двата теста имам runtime error.
Според мен редно е ако има хора, (а виждам, че има няколко човека поне с по 80 точки) на които тези два теста им гърмят по точно тази причина, да бъдат компенсирани.
Друго, което се е обсъждало вече и без това - ако на изпита се очаква да знаем регекс, то трябва да се направи и лекция за него. В противен случай трябва доста по-внимателно да се обмислят задачите, които се дават, за да не бъдат твърде зависими от знанията на даден студент по регекс и да може да се решат и с малко идиотски начини, които обаче да са по-разбираеми (например предварително чистене на празни места, сплитване по конкретни символи и т.н.). Не е много приятно да знаеш отлично как да си решиш задачата, но да не може да го направиш, защото не може да си обработиш входа и никой не те е научил как да го правиш. А с търсене в гугъл нещата са 50-50, понякога веднага намираш точния регекс, който ти трябва, понякога намираш само глупости. Т.е. нека се избегнат случаите, в които ако не знаеш много-много регулярните изрази да не може да си вземеш 100 точки заради това.
Ето тук е регекса: String[] stringArray = input.split("[( )]+");
split взима като аргумент регулярен израз, а именно "[( )]+".
Не е особено голям, като го чета схващам какво прави, но като човек не е наясно с нещата трудно сам ще си го изгенерира.
Тестовете ги отворих и ги погледнах. А грешката, която ми дава Judge - runtime error, което е различно от грешен отговор. Runtime ще рече, че дава exception, т.е. баш си гърми програмата, а не че има бъг и дава грешен отговор.
Да, прав си. След като пусна тази задача се зачетох в API-то на split метода. И тъй като последните дни с троша главата основно с regex изолирах числата от задачата с този израз:
Pattern pattern = Pattern.compile("-?[0-9]+");
Matcher m = pattern.matcher(s);
Set<Integer> t = new TreeSet<>();
while (m.find()) {
int testValue = Integer.parseInt(m.group());
if (isPrime(testValue)) {
t.add(testValue);
}
}
Това намира всички целочислени числа (положителни и отрицателни) и не се налага да търсиш скоби. И благодаря, че повдигна въпроса понеже нямаше да тръгна да търся подобно решение.