Loading...
Filkolev avatar Filkolev 4482 Точки

[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 точки заради това.

2
Java Advanced 11/09/2014 15:00:00
VenelinGrozev avatar VenelinGrozev 130 Точки

Извинявай но не видях авторското решение да ползва regex а изолира само числата при четенето от скенера и всичко друго бива игнорирано:

Scanner str = new Scanner(System.in);
        String input = str.nextLine();
        
        //split the input into string array
        String[] stringArray = input.split("[( )]+");

Не съм решавал още тази задача и все още не мога да коментирам тестовете но как разбра какви входни данни има в 7ми и 8ми тест? При мене като гръмне само казва Incorrect Result и толкова.

Условието на 3та задача от 26 Май е аналогично и там го реших пак без regex по малко дърварски начин но работи. Ползването е Scanner обаче е доста по-елегантно и спестява писане.

BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        int largestArea = 0;
        String input = bf.readLine();
        input = input.replace('[', ' ');
        input = input.replace(']', 'x');
        input.trim();
        input = input.substring(0, input.length() - 1);

        String[] s = input.split("x");

0
Filkolev avatar Filkolev 4482 Точки

Ето тук е регекса:  String[] stringArray = input.split("[( )]+");

split взима като аргумент регулярен израз, а именно "[( )]+".

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

Тестовете ги отворих и ги погледнах. А грешката, която ми дава Judge - runtime error, което е различно от грешен отговор. Runtime ще рече, че дава exception, т.е. баш си гърми програмата, а не че има бъг и дава грешен отговор.

0
10/09/2014 07:46:10
VenelinGrozev avatar VenelinGrozev 130 Точки

Да, прав си. След като пусна тази задача се зачетох в 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);
            }
    }

Това намира всички целочислени числа (положителни и отрицателни) и не се налага да търсиш скоби. И благодаря, че повдигна въпроса понеже нямаше да тръгна да търся подобно решение.

 

 

0
a.angelov avatar a.angelov 1316 Точки

В последната лекция от курса - тази за Масиви, Листове, Стрингове, Сетове и Мапове са включени и регулярните изрази. Със сигурност не много задълбочено, но са включени.

А предполагам вече знаете два много подходящи сайта за тестване в реално време на регулярни изрази:

http://www.regexr.com и http://regex101.com/

3
Filkolev avatar Filkolev 4482 Точки

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

0
Filkolev avatar Filkolev 4482 Точки

Ето между другото и страница от вече един от любимите ми сайтове Vogella. Разписано, обяснено, с примери. 

2
Stani avatar Stani 32 Точки

Здравей,

И на мен решението ми не минава 7-ми и 8-ми тест. 

Тъй като не мога да намеря тестовете, би ли споделил какви са за 7-ми и 8-ми тест?

 

Решението ми стана доста странно, но пък работи. :)  (Ползвам регулярен израз, но след това доста неща, за да стигна до крайния резултат - каквото ми идваше наум в дадения момент - Lists, set, object, array ...)

Ако ви е интересно, може да го видите: тук

 

1
10/09/2014 16:35:32
Filkolev avatar Filkolev 4482 Точки

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

Отклонението за рекекса е... отклонение.

0
Stani avatar Stani 32 Точки

Всъщност грешката идва оттам, че условието за входните данни не е коректно. (също и за скобите - да)

  • The input numbers will be integers in the range [-100…100] - т.е. входните числа ще са от -100 до 100 ( нас ни интересуват тези от 2 до 97 => следователно макс. сбор от прости числа в този диапазон, които не се повтарят е 97+89+83=269. А в случая на тези 2 теста, входните числа са след това ограничение и оттам изходът става по-голям от 269.

Или греша?

0
Filkolev avatar Filkolev 4482 Точки

Да, права си, това не го бях забелязал. Но фактът, че подават по-големи числа не е особено фатален, тъй като повечето хора си правят методи, които проверяват дали дадено число е просто по познати алгоритми още от C# Basics курса. Т.е. програмата ми, както и на повечето други хора подозирам, нямат проблем с това, че има числа около 1000, достатъчно е да се коригират ограниченията и да се каже range[-1000...1000].

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

Затова - има колеги с 80 точки на изпита на тази задача. Ако причината да не вземат 100 е невалидният вход, трябва това да бъде отразено.

 

0
a.angelov avatar a.angelov 1316 Точки

Открих още едно несъответствие между условие и тестове, този път на задача Straight Flush от изпита Java Basics - 22 June 2014

В условието е казано: 

The input comes from the console as a single line, holding the hand of cardsseparated by comma and space between each two cards. The input cards are unique (there are no duplicates). The input data will always be valid and in the format described. There is no need to check it explicitly.

Сплитвам си инпута съответно по ", " и се чудя, защо ми гърмят два теста - 2 и 5-ти.

Оказва се, че във втори тест между две от картите има два интервала, а в пети тест между две от картите има само интервал, без запетая smile

Ще трябва да имаме по едно наум на изпита за евентуални такива неща и като се усъмним, че може да има такова нещо да ползваме по-широк регекс за сплитване.

0
11/09/2014 19:12:05
Filkolev avatar Filkolev 4482 Точки

Писах по този въпрос в тази тема.

Поспорихме малко в СофтУни каква е дефиницията на space, което според мен и Уикипедия е символът space (само един). На единия тест липсва пък запетаята, което няма как да се обясни вече със семантика.

Отворих въпроса там, защото и аз именно така подходих - сплитнах по ", " и според мен това е напълно приемлив (макар и малко дървен) начин да се подходи.

 

0
11/09/2014 19:21:11
a.angelov avatar a.angelov 1316 Точки

Мда, и на изпита нямаш тестовете и има да се чуууудиш какъв може да е проблема и да търсиш под вола телето smile

Както и да е - ще имаме едно на ум - а и така честно казано ни подготвят за това, че трябва да очакваме от потребителите неочакван вход smile

0
11/09/2014 20:03:30
Filkolev avatar Filkolev 4482 Точки

Да де, ама ако е такъв случаят, нека махнат изречението "The input data will always be valid...". Поне да сме подготвени и да мислим какви баници може да сме получили на входа и да ги обработваме по по-интелигентен начин. 

0
Roumen avatar Roumen 127 Точки

Входа от 7-ми и 8-ми тест според мен въобще не отговаря на условието на задачата, това хич не е коректно. Или тестовете трябва да бъдат сменени или условието на задачата.

5
d3vildog avatar d3vildog 58 Точки

Здравейте, 

за да не отврарям нова тема направо да попитам тук, решавам една от задачите на изпита "Stuck numbers" но ми дава 90 от 100 точки, като на този тест който не ми дава има лимит за време.. ЦЪК по този начин го решавам с 4 if-a и ми дава лимит за време, но гледам авторското решение има 2 if-а ЦЪК, по моя начин аз проверявам преди всеки цикъл дали не са еднакви и по този начин не трябва ли да е по бързо тъй като не влиза в циклите и спестява време, но въпреки това е по-бавно. Проверките изглежда забавят програмата доста. undecided И въпроса ми е, трябва ли да се старая да пиша всичките проверки на едно място от колкото да ги разделям на няколко if-a? 
Благодаря предварително smile

0
Filkolev avatar Filkolev 4482 Точки

Хм, абе и на мен събмитите ми са на границата на лимита време - Time: 0.462 s. Събмитвай по няколко пъти, може сървъра да е по-натоварен. И аз точно така правя - 4 цикъла, като правя проверки преди да вляза в 3 от тях, което си мисля, че трябва да е по-добре отколкото да цикля всичко и чак на края да проверявам дали съм получил каквото ми трябва.

Точно по тази причина събмитнах и авторското решение, да видя то как се представя като време - 0.387 s, което пак не е малко. Някой ако може да обясни защо този подход работи по-бързо ще съм благодарен. Надявам се на нашия изпит да няма такива задачи, които на случаен принцип да прехвърлят лимита време без да има очевидна (за нас) причина за това.

Имаше една задача, на която ми даваше лимит време на 1 тест, събмитнах след няколко секунди същия код и ми даде 100 т. Та ако ти дава верен резултат, пробвай така. Лошото е че на изпит сървъра няма как да не е натоварен и е възможно това да го видим доста често...

1
d3vildog avatar d3vildog 58 Точки

Да прав си surprised до сега не ми се е случвало, но като събмитнах пак ми даде точките, и сега на една друга задача пак така се получи. Като гледам няма много събмити не би трябвало да е претоварен сървара, но както и да е поне вече ще го имам в предвид мерси! smile

0
15/09/2014 14:09:32
dim4o avatar dim4o 288 Точки

А какво ще кажете за задачата от 27-ми Май - Longest Odd-Even Sequence ? Мисля, че или условието нещо не е коректно зададено или има проблем с авторското решение. Например ако подадем (0)(2), то връща 1. Обаче очевидно трябва да е 2. Това е така, защото в имплементациятя нулата в началото винаги се приема за четно, което не е правилно. Разгледах и тестовете. Имаше един само с нули - което е ОК. Но в повечето други случаи, когато почваме с нула връща грешен резултат. Според мен задачата е доста по-сложна отколкото изглежда, защото трябва да се проиграят и двата варианта за всяка нула. Освен всичко не става ясно една и съша нула дали веднъж може да я броим веднъж за четно и веднъж за нечетно(така както е решена задачата май не може, но не става ясно от условието). Ще се радвам да споделите впечатленията си за тази задача.

ПП: Между другото в тестовето също има интервали където се сетиш, така че изглежда ще трябва да се застраховаме за всякакви ситуации

 

1
15/09/2014 14:07:28
Filkolev avatar Filkolev 4482 Точки

Прегледах условието. Прав си според мен. 0-та след като може да е и четно, и нечетно число, (0)(2) е серия нечетно-четно, т.е. дъжината е 2.

Ако има (0)(0) пак не става ясно какво се случва, би трябвало отговорът пак да е 2, защото смятаме едната 0 за четно, другата за нечетно число. Ако имаме (0)(0)(2), трябва да е 3 - четно-нечетно-четно, ако целта е да подберем така 0-та, че да максимизираме резултата.

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

0
dim4o avatar dim4o 288 Точки

Да, (0)(0)(2) е 3 според авторското решение, защото брои: четно, нечетно четно. Според същото решение обаче (0)(0)(1) връща 2, a не 3 (брои: четно, нечетно, нечетно), което според мен е грешно, защото трябва да се брои: нечетно, четно нечетно. Нали все пак търсим най-дългата такава редица. Затова според мен това решение просто не е на тази задача. Проблема е доста по-сложен.

0
Filkolev avatar Filkolev 4482 Точки

Може би в главата на автора задачата е била по-проста и не е съобразил тези случаи. Трябва условието да се доизпипа, да се добавят още някакви ограничения за 0-те, за да е ясно какво поведение имат. 

0
stefoto avatar stefoto 51 Точки

Здравейте, колеги,

В judge имам 90/100 точки на тази задача и се чудя къде може да ми е грешката. Възможно ли е да погледнете и вие: _03_BiggestThreePrimeNumbers

Благодаря предварително! :)

0
dim4o avatar dim4o 288 Точки

Метода ти isPrime() връща "true" за 0,1, както и за всички отрицателни числа. Това не е правилно и оттам може би ти гърми някой тест. Осен това в условието е казано, че простите числа са натурални и има линк да се погледне каква е точната дефиниция на натурално число.

0
16/09/2014 16:50:50
VenelinGrozev avatar VenelinGrozev 130 Точки

На 10ти тест ти гърми понеже каза колегата над мене метода isPrime отчита 0, 1 и всички отрицателни числа.

Отговора на теста е No а решението ти връща резултат 14.

0
stefoto avatar stefoto 51 Точки

Отново не се получава. Добавих в метод isPrime() проверка числото, ако е по-малко от 2 да връща false и пак 90/100.

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.