-
Notifications
You must be signed in to change notification settings - Fork 81
[PL] 3. Paczka ze wzorcówką
Często zdarza się, że ciężko wygenerować pliki wyjściowe bez użycia rozwiązania wzorcowego. Jeśli jednak posiadamy wzorcówkę, SIO2 potrafi ułatwić nam pracę i wygenerować pliki wyjściowe automatycznie, używając wzorcówki i dostarczonych przez nas plików wejściowych. Pozwala to też na łatwiejszą kontrolę zawartości paczki w sytuacji, gdy na bieżąco tworzymy różne wersje testów lub zmieniamy jakieś założenia. Nie musimy wtedy upewniać się, czy pliki wyjściowe są aktualne.
Tym razem przygotujemy paczkę do zadania Tree, którego naturalnym skrótem będzie tre. Użytkownik na wejściu otrzyma jedną liczbę naturalną, oznaczającą rozmiar choinki. Jego program będzie musiał wypisać na wyjście drzewko odpowiedniej wielkości. Pełną treść można znaleźć tre1/doc/trezad.pdf. Istotnym szczegółem w zadaniu jest fakt, że gdy na wejściu pojawi się liczba 0, użytkownik ma wypisać Too small to exist.
Gotową paczkę, omawianą poniżej, można znaleźć tu.
System w ciekawy sposób traktuje białe znaki. Domyślnie, spacje i tabulatory zostaną pominięte w obrębie jednej linii. W takim razie dwa pliki:
1 1
1 1
zostaną uznane za takie same. Jednak plik
11
zostanie uznany za różny, bo zamiast dwóch liczb system zobaczy jedną. System pominie też spacje i tabulacje na końcu linii, oraz pozwoli na dowolną liczbę białych znaków na końcu pliku.
Dlatego, żeby wymusić na użytkowniku dokładne dostosowanie się do formatu wyjścia, zamiast wypisywać znaki na "białym" tle (np. choinka – gwiazdki, tło – spacje), wymusimy wypisanie choinki na niepustym tle. W naszym przypadku będzie to połączenie znaków # oraz . (choinka – hash, tło – kropka). Oczywiście da się osiągnąć ten sam efekt również z białymi znakami, ale nie można zrobić tego porównując pliki wyjściowe. Trzeba wtedy użyć programu sprawdzającego wyjście (zwanego też checkerką).
Do wygenerowania testów potrzebne nam będzie rozwiązanie wzorcowe. Może ono zostać napisane w dowolnym z dopuszczonych języków. Rozwiązanie wzorcowe powinno dbać o białe znaki (brak spacji na końcu linii, plik zakończony pustą linią). Spokojnie, uczestników to nie dotyczy, więc nie muszą się o to martwić. Na potrzeby tego tutoriala zostały zaimplementowane rozwiązania w C++ i Pythonie. Rozwiązanie wzorcowe, które posłuży do wygenerowania testów, powinno zostać umieszczone w folderze prog i mieć taką samą nazwę jak skrót zadania. Inne wzorcówki (rozwiązujące zadanie w alternatywny sposób, lub napisane w innym języku) powinny po skrócie zadania posiadać kolejne liczby (zwyczajowo zaczynając od 2). Tutaj rozwiązanie wzorcowe w C++ tre/prog/tre.cpp, tutaj w Pythonie tre/prog/tre2.py.
W tym zadaniu chcielibyśmy, żeby za nierozpatrzenie przypadku w którym na wejściu dostaniemy liczbę zero uczestnik stracił co najmniej 40 punktów, ale żeby rozwiązanie, które zawsze wypisuje Too small to exist, nie dostało dodatniej liczby punktów. Nie potrafimy rozwiązać tego problemu, korzystając tylko z informacji zawartych w poprzedniej części poradnika.
System SIO2 udostępnia ciekawą funkcjonalność pozwalającą na przyznawanie punktów za zaliczenie grupy testów. Mówiąc precyzyjniej, jeśli stworzymy testy tre1a.in i tre1b.in, to program uczestnika dostanie punkty wtedy, gdy zwróci poprawną odpowiedź w obu przypadkach. W ten sposób, jeśli test tre1a zawiera liczbę 0, a tre1b liczbę 10, to zarówno program który poprawnie rozwiązuje zadanie lecz nie rozpatruje przypadku zerowego, jak i program który zawsze wypisuje Too small to exist nie otrzymają punktów za tę grupę. Dopiero program, który poprawnie odpowie na oba testy, otrzyma dodatnią liczbę punktów. Ten mechanizm nazwiemy grupowaniem testów. Testy należące do tej samej grupy będą miały tą samą liczbę po skrócie zadania, a porządkować je będą małe litery alfabetu. Przykładowo, jeśli chcemy by trzy testy należały do grupy drugiej, nazwiemy je tre2a, tre2b i tre2c. Jeśli testów w grupie będzie powyżej liczby liter w alfabecie łacińskim, to zwyczajowo powinniśmy nazywać je tre3aa, tre3ab itd.
Testy należące do grupy 0 nazywać będziemy testami przykładowymi. Są to testy, dla których wyniki będą pokazane uczestnikowi, nawet jeśli pełne wyniki za zadanie są zasłonięte. Często kilka z tych testów podanych jest w treści jako przykłady.
Innym rodzajem testów, które nie są punktowane, są testy ocen. Zasada ich działania jest podobna jak testów z grupy 0. Test będzie uznany za test ocen jeśli będzie postaci: skrót zadania, numer, ocen.in. Jeśli więc stworzymy test tre1ocen.in to program użytkownika zostanie na nim sprawdzony, wynik działania pokazany, lecz nie zostaną przyznane punkty niezależnie od wyniku. Warto zaznaczyć, że testy ocen są osobnym bytem od grup testów. Ich numery są po prostu porządkowe, nie wchodzą w skład żadnych grup jak i nie tworzą swojej (w przeciwieństwie do grupy 0).
W paczce przygotowaliśmy test tre1ocen.in i dwie grupy testów (w drugiej występuje test z 0).
System, po wgraniu paczki, będzie umiał pokazać nam tabelkę z wynikami każdego rozwiązania które wyślemy w paczce. W ten sposób będziemy mogli automatycznie wiedzieć, czy na pewno każde rozwiązanie otrzyma tyle punktów ile powinno. Rozwiązania błędne zwykło oznaczać się końcówką b1.cpp b2.py itd. Rozwiązania wolne natomiast oznaczamy końcówką s1.py s2.cpp itd. Oczywiście w obu przypadkach nazwy powinny zaczynać się od skrótu zadania.
W przypadku naszego zadania, przygotowaliśmy rozwiązania treb1.py, które zawsze wypisuje Too small to exist, oraz treb2.py, które rozwiązuje poprawnie problem rysowania choinki, ale zapomina o zerowym przypadku.