1. Технология за състезателно програмиране и оценка на алгоритми

План:
Студентски състезания по програмиране
Стандарти на С++, компилатори, вход и изход
Вход и изход за много тестови примери
Пренасочване на входа и изхода от операционната система
Проверка на програмата в Хакерранк и от прeподавателя
Оценка на алгоритми (преговор)

Студентски състезания по програмиране


Стандарти на С++, компилатори

 Dev-C++, Code::Blocks за Windows, gcc за Linux, BSD и др. UNIX-ови ОС
Конзолни приложения, вход и изход

Стандартен вход и изход в С++

cin >> <име на променлива>;

int k;
cin >> k;

cout << <име на променлива>;

int ik = -10;
unsigned int uk = 10;
long lk = -1000000;
unsigned long ulk = 1000000; // 16 битов цял тип данни
double dk = 2.52;
cout << ik << " " <<uk << " " << lk << " "
     << ulk<< " " << dk << "\n";


Вход и изход за много тестови примери

- Четене на зададен брой числа или думи (низове без интервали)
int n;
cin >> n;
for (int i = 0; i < n; i++) { cin >> ... }


- Четене до края на файла за числа или думи
while (cin >> x) { ...}


- Четене до края на файла на редове (редица от числа; низ, съдържащ интервали)
string st;
while(getline(cin, st)) { ... }

- Четене всички числа от един ред, прочетен като низ
string st;
getline(cin, st);
int a[100], n = 0;
istringstream is(s);
while(is >> a[n]) n++;


Примери за различни входове.

Пренасочване на входа и изхода от операционната система

Изпълним файл (executable) с програма на C++ със стандартни вход (cin) и изход (cout):
- prog.exe (Windows)
- a.out (MacOS)

Текстов файл с входните данни за програмата: test1.inp

Изпълнение (стартиране) на програмата:
>prog < test1.inp > test1.sol (Windows)
$./a.out < test1.inp > test1.sol (MacOS)

Текстов файл, произведен от програмата при това изпълнение: test1.sol


Проверка на програма в Хакерранк и от прeподавателя

Решенията се проверяват с много примери, неизвестни за студента, включително гранични случаи.

В Хакерранк:
https://www.hackerrank.com/cscb325-2022 (Задачи)

Съобщения от изпълнение на програмата:
https://www.hackerrank.com/faq/after-submit

We run your code against hidden test cases. Depending on the output your code produced, you can get the following verdicts:

Accepted. Congratulations, your code passed all the test cases! It's time to solve a new challenge!

Wrong Answer. The output your code produced didn't match the output expected by the test case. Rethink your approach and think about whether you misunderstood the problem or missed a corner case.

Terminated due to timeout. Your code doesn't solve the problem efficiently enough! If you write a O(2n) solution when n = 100, it will surely time out and you're going to need to optimize your algorithm. The time limits are different for each language (some languages are slower than others), and you can see the limits for all the languages we support at our Environment page.

Runtime error/Segmentation Fault. Your code terminated unexpectedly. Did you overrun your array? Is your code trying to divide by zero?

Abort Called. Are you using too many resources? Maybe an array you created is too large and exceeds the memory limit, or an assert statement in your code is failing.

After you submit your code, hover your mouse cursor over the icon for each test case to view the verdicts and runtime for each test case your code was tested against.

Съобщения за грешки в други тестващи системи:
Проверка от преподавателя:
Проверка на програма f12345_1.cpp: с входни данни (много тестове примери) във файла 1.inp.

Пример за MacOS:
mini:CSCB325 nkirov$ ./ad.sh 1 12345

Скриптове  за проверка (файл ad.sh):

g++ f$2_$1.cpp
./a.out < $1.inp
rm a.out

clang++ -std=c++11 -stdlib=libc++ f$2_$1.cpp
time ./a.out < $1.inp
./a.out < $1.inp > $1s.sol
rm a.out
diff $1s.sol $1.sol


Тестване на програмата

- стандартни тестови примери;
- гранични и специалн тестови примери;
- тестови примери с минимални и максимални размерности на входа;
- НЕ се разглеждат примери, които са извън зададените ограничения;
- НЕ се прави проверка за коректност на входа.

Практически съвети:
- оценка на границите на данните (четене на тестовите примери)
- необходими ли са масиви?
- размерности на масивите;
- избор на тип данни (int, unsigned, long, long long, double, long double);
- загуба на точност (артметични функции - sqrt);
- избор на алгоритъм - оценка с O-голямо. Дали е най-бързият?
- предварителни пресмятания (преди или след прочитане на входа, на част от входа);
- избор на примери за тестване на програмата;
- прецизиране на кода.

Оценка на алгоритми (преговор)

O(f) определя множеството от всички функции  g, които нарастват не по-бързо от f, т.е. съществува константа c > 0 такава, че g (n) <= cf(n), за всички достатъчно големи стойности на n.