O sprawdzarce

Sprawdzarka Tichy jest narzędziem służącym do automatycznego sprawdzania rozwiązań zadań programistycznych.

Wybór zadania

Po zalogowaniu należy wybrać jeden z kursów dostępnych na stronie. W kursie znaleźć można listę dostępnych zadań. Po wybraniu zadania, należy dokładnie przeczytać jego treść, w tym wymagania dotyczące wejścia, wyjścia oraz ograniczenia czasowe i pamięciowe.

Przygotowanie rozwiązania

Rozwiązanie zadania programistycznego należy przygotować lokalnie na własnym komputerze, w jednym z języków programowania akceptowanych przez sprawdzarkę (najczęściej C++). Ważne jest, aby rozwiązanie spełniało wszystkie wymagania określone w treści zadania, w tym format danych wejściowych i wyjściowych. Jeżeli używane są strumienie cin i cout zalecamy na początku funkcji głównej main dodać "magiczne linijki":

std::ios_base::sync_with_stdio(false);
std::cout.tie(nullptr);
std::cin.tie(nullptr);

Nie trzeba ich dodawać, jeżeli korzysta się z funkcji printf czy scanf. Jeżeli linijki są dodane to w szczególności nie należy mieszać metod wejścia/wyjścia. Instrukcję endl polecamy zastępować znakiem końca linii '\n'. Ponadto sprawdzarka nie rozróżnia znaków białych, więc jeśli to możliwe, lepiej jest użyć znaku ' ' zamiast znaku końca linii.

Wysyłanie rozwiązania

Po przygotowaniu rozwiązania, należy w zadaniu wybrać opcję "Wyślij rozwiązanie" i wkleić swój kod w formularzu. Po wysłaniu rozwiązania, sprawdzarka automatycznie przystępuje do jego oceny, wykonując serię testów sprawdzających poprawność rozwiązania. Program jest kompilowany, wykonywany dla wskazanych testów, a wynik działania jest porównywany z oczekiwanym. Należy się spodziewać, że pierwszy test jest testem przykładowym z treści zadania.

Kompilacja: g++ -lm -Wall -static -O2
gcc: 12.2.0
Standard: c++17

Oczekiwanie na wyniki

Po przesłaniu rozwiązania, może być konieczne odczekanie czasu na wyniki testów. Czas ten zależy od obciążenia systemu oraz złożoności zadania. Wyniki testów zazwyczaj zawierają informacje o poprawności rozwiązania. Możliwe odpowiedzi w testach są następujące:

  • Zaliczone
  • Zła odpowiedź
  • Przekroczony czas
  • Przekroczona pamięć
  • Błąd wykonania
  • Błąd kompilacji
  • Naruszenie ochrony pamięci
  • Niedozwolona instrukcja

Punkty w zależności od charakteru kursu przydzielane są binarnie (zadanie jest punktowane, jeśli wszystkie testy mają status Zaliczone) lub cząstkowo (liczba punktów uzależniona jest od akceptacji pojedynczych testów lub grup testów). Statusy najczęściej dobrze diagnozują problem w przypadku niezaliczonego testu, ale z powodu kolejności ustawiania wyniku mogą zmylić. Może się zdarzyć, że status "Zła odpowiedź" pojawi się w teście, dla którego został przekroczony czas lub doszło do naruszenia ochrony pamięci.

Często zadawane pytania

Q: Mój program działa prawidłowo, a mimo to dostaję status "Zła odpowiedź" dla każdego testu, nawet pierwszego przykładowego.
A: Sprawdź, czy format danych wyjściowych jest zgodny ze specyfikacją. Najczęstszym powodem jest pominięcie spacji lub znaku końca linii pomiędzy poszczególnymi odpowiedziami wyświetlanymi na wyjściu programu.

Q: Moje rozwiązanie nie przechodzi kilku testów z powodu limitu czasu. Co mogę zrobić, by je przyspieszyć?
A: Jeżeli masz przekonanie, że korzystasz z odpowiedniego do danego zadania algorytmu, to sprawdź, czy dodane są "magiczne linijki".

Q: Mam problem z wczytaniem łańcuchów znakowych/pojedynczych znaków.
A: Jest to częsta sytuacja, gdy na przemian wczytuje się liczby i znaki. Jeżeli po liczbie występują znaki białe (spacje, koniec linii), to pozostają one w buforze wejściowym. Rozwiązaniem może być użycie instrukcji cin.ignore(/opcjonalne parametry/) lub powtórzenie instrukcji wczytania danych.

Q: Dlaczego program kompiluje się i zachowuje prawidłowo lokalnie, a sprawdzarka dla wszystkich testów zwraca "Błąd kompilacji"?
A: Najczęściej wynika to z różnicy w wersji i rodzaju kompilatora. Częstym powodem jest pominięcie którejś z używanych bibliotek, co ignoruje kompilator MinGW, a zauważa kompilator gcc.

Q: Dlaczego wrzucając to samo rozwiązanie raz zadanie zostaje zaliczone, a innym razem wyświetla się "Przekroczony czas"?
A: Czas wykonania tego samego rozwiązania może się różnić o setne sekundy, więc jeżeli limit czasowy testu jest bliski czasowi wykonania rozwiązania, to może się zdarzyć, że niektóre submity zostaną zaliczone. Należy to poczytywać w kategorii farta, bo limity czasowe są ustalane w oparciu o rozwiązania wzorcowe z pewną nadwyżką.

Q: Dlaczego przy użyciu instrukcji endl wyświetla się "Przekroczony czas", a po zmianie na '\n' wszystko działa prawidłowo?
A: W języku C++ instrukcja endl wymusza dodatkowo opróżnienie bufora strumienia, stąd może być to wolniejsze, jeśli do strumienia wyjściowego zapisywana jest duża liczba linii tekstu.