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

За изпита по структури от данни

Колеги, давам малко пояснения за изпита по структури от данни, който предстои в неделя (13 септември):

  • Ще има две задачи - една с unit tests и една с judge-базирана проверка
  • И на двете задачи въвеждаме следния принцип на оценяване:
    • Ако минават всички тестове, взимате пълния брой точки за задачата.
    • Ако не минават всички тестове, взимате до 50% от точките, пропорционално на броя преминати тестове.
    • Пример: задачата има 20 теста с еднаква тежест. Ако всичките тестове минават, взимате 100 точки (максимума). Ако минават 19 от 20 теста, взимате 100*(19/20)/2 = 47.50 точки.
  • На задачата с unit tests ще имате C# и Java вариант
    • Проект-скелет (на VS или Eclipse) + интерфейс за имплементация + тестове (функционалност и performance)
  • На задачата с judge-базираната проверка ще изпращате решение в judge системата и тя ще ви оценява. Ако не минават всички тестове, ще ви се признават до 50% от точките за задачата. Ако минават всички тестове, ще ви се присъждат всички точки.

Защо едната задача се оценява с unit tests, а другата автоматизирано?

  • Задачата с unit tests е по-лесна, защото ви се дават всички тестове и ако нещо не работи, можете да дебъгвате конкретния тест, който не минава.
  • Задачата с judge-базирано оценяване е по-трудна, защото не виждате тестовете и ако нещо гърми само може да предполагате какво сте сбъркали.

Я кажете сега: някой ще пише ли на C++? Да се пънем ли да превеждаме C# кода на C++? За Java обещавам, че ще има читав превод.

Наков

nakov avatar nakov SoftUni Team Trainer 5417 Точки

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

Бавното решение, базирано на обикновен списък, се пише за 10 минути и хваща 80%-90% от тестовете. Искаме да поощрим участниците, които пишат бързи и верни решения, като внимателно подбират структурите си от данни. 

-1
Filkolev avatar Filkolev 4428 Точки

А какво правим ако са използвани правилни структури, но 1 или няколко теста не минават поради бъг от друго естество (грешен отговор, а не лимит време)? Малко е кофти да ти падне резултата наполовина, защото не си съобразил някакъв граничен случай или нещо подобно, а не защото не умееш да преценяваш за дадена операция как да пазиш и извличаш данните.

8
RoYaL avatar RoYaL SoftUni Team Trainer 6795 Точки

Е какво решение трябва да си намазал, че да не ти мине един тест заради OUTPUT?! На мен това оценяване ми се вижда справедливо.

0
veselinsavov avatar veselinsavov 219 Точки

Съгласен съм Filkolev. Наков, не е ли по- удачно просто тестовете да се направят така, че с List да минават примерно 10-20% от тестовете ? Ако се направят такива тестове judge-а ли няма да издържи ? 

Royal, примерно, ако не си направил търсенето по 2 ключа и не ти минат Х теста, които са по 2 ключа е тъпо точките да ти се орежат на половина.

6
11/09/2015 12:56:53
borislavml avatar borislavml 368 Точки

Може ли някой да ме светне, на първа задача за person-collection-a , поддточката в която търсим person-и в range от години този метод .Range(startAge, true, endAge, true), който ни връща subview от дървото от къде се взе?Няма го ни в Wintelect ни в C5, нещо къстъм писано ли е, и ако да може ли някой да сподели код.Иначе какъв е другия вариянт да си вземем итертор за този range, който ни интересува.С LINQ е ясно, че не е efficient, някакъв binarySearch или....?

0
Filkolev avatar Filkolev 4428 Точки

Това е метод за Ordered колекциите от PowerCollections, т.е. тези, които са имплементирани с дърво. Примерно за OrderedDictionary.

1
borislavml avatar borislavml 368 Точки

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

0
11/09/2015 21:15:51
HPetrov avatar HPetrov 822 Точки

Превеждане към C++ може би е малко късно за изпита сега но не е лоша идея да се направи за следващите издания на курса както и курсовете по алгоритми. Програмисти различни, предпочитанията също. В частност C++ не е по-малко важен от C#/Java от гледна точка на структурите от данни и алгоритмите. Нека е има и тази опция за мазохисти :)

0
12/09/2015 00:29:37
Filkolev avatar Filkolev 4428 Точки

За алгоритмите няма да е проблем, там няма да има юнит тестове, защото задачите ще са... алгоритмични. Ще има Judge, а C++ отдавна се поддържа там.

0
nikola.m.nikolov avatar nikola.m.nikolov 832 Точки

Хм и според мен има нещо сбъркано в оценяването. Значи ако решим и двете задачи на 100%, всичко е ок и ще имаме макс точки. Ако на едната задача не ни мине само 1 тест ще имаме макс около 74% от точките. Ако и на двете задачи не ни мине дори само по 1 тест ще имаме 47,5% от точките. Заради 2 теста от общо 40 такава секира ми се струва нелогично...

Накрая излиза, че освен точки от автоматизираната система, най-удачно е да има и ръчна проверка както при ООП-то в съотношение 1:2 (автоматизирано оценяване: ръчно оценяване)

Другото според мен е, че не е толкова трудно да се напишат такива тестове, че реално ако използваме само list да минават 20-30% от тестовете. Пример:

Ако има 5 теста, които минават с list, слагате 15 комплексни теста, които правят много неща, т.е. минават през всички методи на имплементираната структура. В никакъв случай няма начин тези комплексни тестове да минат, ако не са използвани правилните структури.

7
12/09/2015 01:58:09
Kamigawa avatar Kamigawa 750 Точки

Съгласен съм - за 1 тест 50% са много. Можеше да се измисли по-гъвкаво решение на проблема - 19/20 теста - 90т, 18/20 теста - 80т, 17/20 - 70т и надолу някакво скалиране примерно - 16/20 = 100 * (16/20) / 1.3 = 61, 15/20 => 57 или нещо подобно. Мисълта ми е до 2-3 теста да има някакъв толеранс, при 17/20 се предполага, че задачата нещо малко и куца, да не говорим за 19/20.

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

2
nikola.m.nikolov avatar nikola.m.nikolov 832 Точки

Не съм сигурен, че ще има проблем с времето за изпълнение. Пример:

днес като решавах първата задача от примерния изпит не обърнах внимание, че в скелета на solution-а в тестовете за performance и двата реда инициализират бавната структура. Добавянето с List отнемаше 33 секунди, а с речник 50ms... разликата е прекалено голяма, така че лесно може да се направят комплексни тестове, които при правилна структура от данни да минават за милисекунди.

0
RoYaL avatar RoYaL SoftUni Team Trainer 6795 Точки

Не, няма такъв вариант, Ники.

Няма ПРАВИЛНАТА структура от данни. има много възможности, които биха били практически верни и даващи разлика една от друга, както има и много възможности, които биха могли да бъдат грешни.

Ако се направи всеки един тест да е на границата на ПРАВИЛНАТА структура от данни, значи има само едно валидно решение и това е авторското.

Нека само да ви спомена, че темата е за да ни информира какъв ще е регламентът на изпита, а не за да ни попита дали сме съгласни.

В крайна сметка, ако някой се бори за сертификат според мен е логично да може да го вземе само и единствено с макс точки на изпита. За останалите, които ще вземам/вземем по-малко точки, остават кредитите от курса и това, че явно не са/сме научили до толкова, че да се сертифицираме в структури от данни.

Знаеш ли какво ми е направило впечатление до сега от изпитите? Че например изкарав 380/400 точки им и се губят 2 теста от една задача. Остават ми 2 часа до края на изпита и останалите 20 точки ги взимам в последните секунди. Демек съм блъскал 2 часа за 20 точки. Накрая някой с 350 точки да речем е на равно с мен или над мен в оценяването. Т.е. де факто 2-3 часа труд т.е. половината от времето на изпита не са имали значение.

1