Софтуерно Инженерство
Loading...
+ Нов въпрос
Bi0GaMe avatar Bi0GaMe Trainer 389 Точки

[Exam Problems] Java Basics - Решения на задачите от изпита от 22.06

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

Реших да споделя с вас моите решения на задачите от поправителния изпит Java Basics 22.06. Намерих си грешката на 3та задача, така че всички кодове са коректни.

Решения на задачите

Поздрави,

Богомил

11
Java Advanced
Filkolev avatar Filkolev 4428 Точки

Аз искам да попитам за 4-та задача. Понеже при сплитването на входния низ ползвах просто да ми сплитне по ", " и се оказа, че има входове, където има повече празни места примерно и ми гърми.

Това не са ли некоректни тестове? В условието пише: "The input comes from the console as a single line, holding the hand of cards, separated by comma and space between each two cards." Аз това го разбирам като точно една запетая и точно един спейс след нея, в това отношение условието е недвусмислено.

В крайна сметка сложих регекс да сплитне по всичко що не е дума, но би следвало и първоначалният ми вариант да даде 100 т. По-конкретно, става дума за 2-ри и 5-ти тест в системата. Това просто печатна грешка на човека, който е въвел данните в .тхт файловете ли е или е умишлено направено, за да се ползва именно този регекс (\\W+)?

Сетих се също, че с 2-ра задача имахме проблеми днес с колегите. Общо взето опитвахме да налучкаме каква трябва да е аджеба размерността на втората страна на правоъгълниците. За едната е ясно, то си е показано - 2 * радиуса. Но за другата не е показано и го разбрахме на проба-грешка, че е радиуса всъщност. Имаше теория, че е 2 единици, т.е. че кръстът е реално плюс; имаше теория, че е 2 единици по-малко от 2 * радиуса, демек, че от един квадрат са махнати ъгловите квадратчета само. И накрая стигнахме до истината. Проблемът се решава просто като се сложи на картинката, още един указател за размерите на фигурата.

Тази задача мисля да я преправя като разуча rectangle. Но все пак да постна трите задачи, които съм решил до момента - Решения (1, 2, 4).

0
08/09/2014 01:49:49
Bi0GaMe avatar Bi0GaMe Trainer 389 Точки

Втори тест: 10S, 3D, JD, 4C, 10D, 8S,  5D, 5H, AS, JH, 2H, 2D, 4D, 6D

Пети тест: 2C, 3C, 4C, 5C, 6C 7C, 8C, 9C, 10C, JC, QC, KC, AC

 

Не знам какъв е проблема със сплит-а, но ти препоръчвам винаги да ползваш Pattern-Matcher, защото никога не връща грешка. Ако пък държиш да сплитваш по запетая и празно място(whitespace, което означава въобще празно място - табулация, няколко спейса, празен ред), за да се подсигуриш, че няма да имаш "ghosts"(празни клетки в масива), можеш да си декларираш и използваш този метод, който ти връща масива без празни клетки:


public static String[] clean(final String[] v) {
List<String> list = new ArrayList<String>(Arrays.asList(v));
list.removeAll(Collections.singleton(null));
return list.toArray(new String[list.size()]);


По въпросната втора задача нямаше достатъчно обяснение в условието. По време на изпита ни обясниха, че размерът е радиуса. Когато нещо не ви е ясно по условието по време на изпита, винаги питайте. :)
1
09/09/2014 12:18:54
Filkolev avatar Filkolev 4428 Точки

По 2-ра хубаво, обяснили са ви. Ама да го бяха оправили и в документа, 4 човека половин час загубихме, а решението е просто - една размерност повече на картинката и няма ядове.

По 4-та то е ясно че има начини няколко, но като е казано едно нещо не е редно да е друго. На 5-ти тест виждаш, че няма запетйка (6С - 7С), на 2-ри са два спейса (8С - 5D). В условието е казано "space", което е едно празно място, не е табулация/нов ред или нещо друго; ако беше казано whitespace тогава щеше да е различно, защото трябва да покриеш и други случаи освен едно празно място. Ако знаеш, че входът ти е в точно определен формат, и са ти казали, че няма нужда да го мислиш, защо да се занимаваш излишно да правиш допълнителна обработка? Сплитваш по каквото очакваш, че ще ти е разделителя. 

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

 

Edit: тук ясно е обяснена разликата между space и whitespace. Space е символ, който е един от т.нар. whitespace characters. Символ ще рече, че е един символ и не повече. Space в смисъла на пространство, което може да е с различен размер (както се използва по принцип извън програмирането) е различно от space-а като символ. 

Както е зададено в условието: "The input comes from the console as a single line, holding the hand of cards, separated by comma and space between each two cards." Това означава именно ", ". Comma and space ще рече, че и двете са задължителни, т.е. автоматично тестът, в който запетаята липсва е некоректен. Space (независимо, че не е уточнено изрично, че е само един), се подразбира като един, понеже се ползва думата space вместо whitespace, и понеже е използвана в единствено число.

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

0
11/09/2014 02:49:21