Упътване

Тук е описано как работи системата и какво да очаквате, когато направите някое действие.
Версия на системата: v.230625.f9abbaf

Съобщаване за проблеми

Вляво на всяка страница има бутон "Мрън!", чрез който регистрираните потребители могат да се свържат с администратор и да съобщят за проблем (било то със системата или с някоя от задачите). Не се притеснявайте да го ползвате дори за малки проблеми като правописни грешки.

Предаване на решение

За да предадете решение, трябва да сте се регистрирали и влезли в системата. След като отворите някоя задача ще видите син бутон "Предай Решение". Цъкайки на него ще се отвори форма, в която да копирате кода си. За разлика от други системи, езикът ще бъде разпознат автоматично, така че остава единствено да натиснете "Изпрати" и решението ви ще бъде изпратено за тестване.

Статус кодове

След като сте изпратили решение е възможно системата да върне няколко различни статуса.
  • Waiting: Решението чака други предадени преди него решения да се изтестват.
  • Running: Решението се тества в момента.
  • Compilation Error: Решението не се е компилирало успешно.
  • Memory Limit: Решението е използвало повече памет, от допустимата за задачата.
  • Time Limit: Решението е вървяло повече време, от допустимото за задачата.
  • Runtime Error: Решението е крашнало по време на изпълнение (например в следствие на индексиране извън масив или делене на нула).
  • Wrong Answer: Решението е завършило изпълнението си успешно, но полученият от него отговор не е верен.
  • Internal Error: Нещо се е случило със системата по време на тестване. В този случай е препоръчително да известите админ чрез бутона "Мрън!" вляво.
  • Accepted: Разбира се, в най-добрия случай предаденото решение е вярно и не е нарушило нито едно от ограниченията на задачата.
Заедно със статус кода ще получите и допълнителна информация - например на кой тест е получена грешка или колко точки сте получили на всеки от тестовете. Информацията за всяко от Вашите изпратени решения се пази на системата и може да бъде достъпена (само от вас) по всяко време през линка "Предадени решения" под условието на всяка задача.

Сравнение на числа с плаваща запетая

Системата имплементира сравнение на числа с плаваща запетая, базирано на абсолютна или релативна разлика. Този тип сравнение работи както за много малки, така и за много големи числа.

Често възникват проблеми, когато за сравнение се ползва само абсолютната разлика на числата. Например 1234567890.123456717 и 1234567890.123456955 имат разлика от 0.000000238 - малко над 10-7. При изисквана точност от 10-9 това би било грешен отговор. Ако пък ползваме точност от 10-6, например, то числа като 0.0000001 и 0.0000009 биха били счетени за еднакви, като всъщност разликата им е 9 пъти!
За да се справи с това, системата прави две проверки:
  1. Ако числата имат абсолютна разлика, по-малка от 10-9, отговорът се счита за верен (абсолютна разлика).
  2. Ако отношението на числата е много близо до 1 (попада в интервала [1-10-9, 1+10-9]), отговорът се счита за верен (релативна разлика).
Ако нито една от двете проверки не покаже, че отговорът е верен, решението се счита за грешно.

Компилатори и командни флагове

Изпратените решения се компилират ползвайки следните командни флагове:
  • C++ (GCC 10.3.0):
    g++ -O2 -std=c++20 -Werror=return-type -s -o <executable> <source>.cpp
  • Java (OpenJDK 17.0.7):
    javac -nowarn <source>.java
  • Python (Python 3.10.12):
    pypy -m pyflakes <source>.py
Максималното време за компилация е 10 секунди.
Максималният размер на стека е 64 мегабайта.

Тестова машина

Тестовата машина има следната хардуерна конфигурация:
  • Процесор: Intel Xeon 16 Core :: 2.1GHz
  • Рам: DDR3 32GB :: 2666MHz ECC
  • Харддиск: Corsair Force SSD :: 520MB/s
Ползваната операционна система на тестовата машина е Ubuntu 20.04.

Статус

Чрез бутона "Статус" в главното меню можете да видите текущите решения, които системата все още не е обработила (както и последните няколко, които е обработила). Когато системата е по-натоварена (например по време на състезание) там е мястото да проверите кога вашето решение ще бъде тествано.

Подготовка

Цялата система беше създадена като средство за подготовка за различни състезания или курсове. Чрез бутона "Подготовка" в главното меню можете да стигнете до тематично разделени задачи в нарастваща сложност, застъпващи някои от най-разпространените теми в състезателната информатика. Минавайки през цялата подготовка ще Ви научи на мнозинството от основните алгоритми и структури данни, а също така ще Ви помогне да потренирате писането на по-сложен код, от това, което обикновено се застъпва в училище и университета.

Първите няколко секции от подготовката застъпват по-основните алгоритми и са подходящи както за ученици, готвещи се за състезания от по-долните класове (група D и нагоре), така и за студенти от университета или просто хора, които искат да се научат да пишат код.
Към края подготовката засяга значително по-сложни теми и включва съвсем нетривиални задачи (със сложност еквивалентна на задачи от републикански и международни състезания). Тя е по-скоро насочена към хората, подготвящи се за IOI или ACM ICPC.

Постижения

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

Pop-up box-ът "ACHIEVEMENT UNLOCKED" се появява при първото зареждане на страница след постигане на дадено постижение. Той се затваря автоматично след 10 секунди, но можете да затворите и като кликнете с мишката извън него или натиснете escape. Всички ваши постижения можете да видите в профила си (като кликнете на username-a си, горе вдясно на която и да е страница).

Класиране и точки

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

Видове задачи

Системата поддържа няколко вида задачи:
  • IOI-стил: Тестовете са разделени на групи, като за всяка група има определен брой точки. В най-честия случай всеки тест е отделна група. За да се вземат точки за групата, решението трябва да се е справило с всички тестове в групата.
  • ACM-стил: За да се вземат точки за задачата, решението трябва да се е справило с всички тестове.
  • Игра: Всеки тест е "игра" между двама (или всички) участници, предали решение на задачата.
  • Интерактивна: Програмата ви комуникира с авторска програма, която ѝ дава частична информация (примерно отговаря на въпроси).
  • Релативна: За всеки тест се получават точки, пропорционално спрямо най-добрия резултат от всички участници за съответния тест.
Системата е направена да показва колко точки бихте получили в IOI-стил състезание, но класирането е все едно задачите са ACM-стил - една задача не се счита за решена, докато не минете всички тестове на нея!

Задачи с много валидни изходи

Някои от задачите нямат еднозначен отговор, като за тях е предвидено да се оценяват посредством checker. Това е друга програма (написана от автора на задачата), която чете изхода от програмата ви и решава дали е валиден или не (или колко точки да получи, за задачи с релативно оценяване).

В случай, че сте автор на задача и трябва да напишете чекер за нея, ето тук можете да намерите примерен чекер и инструкции какво се очаква той да прави: как да прочете входа на теста, изхода на участника, и изхода от авторското решение, както и как да изпечата резултата или пък да сигнализира за грешка.
Мрън!