System Szkopuł – Jak zrobić paczkę zadaniową?

Jeśli chcesz zrobić zadanie algorytmiczne czy programistyczne, które będzie umieszczone w systemie Szkopuł
https://szkopul.edu.pl/problemset/
to

  1. Stwórz paczkę jak opisano poniżej
  2. Umieść paczkę na współdzielonym zasobie (np. Google Drive)
  3. Wyślij informacje o paczce na adres wspolpraca@oki.org.pl


Dlaczego warto wymyślać zadania?
https://youtu.be/kTFfZY-Pn44?t=457
a. Dużo bardziej się rozwijamy
b. Pomagamy innym
c. Robimy pracę naukową – sami stawiamy problem i zastanawiamy się kiedy ma rozwiązania


Zwróć uwagę by:
1. Fabuła zadania była ciekawa
2. Treść zadania zrozumiała
3. Testy sprawdzały sytuacje krańcowe, małą i duża ilość danych wejściowych



Instrukcja stworzenia paczki
Oto przykładowa paczka zadania Wypracowanie: wyp.zip
Załączona paczka nazywa się wyp.zip
Słowo wyp (nazwa paczki) jest tu ważne i jest przedrostkiem wielu plików.


Cała paczka jest w jednym katalogu wyp (takim samym jak nazwa) i zawiera następujące podkatalogo oraz pliki:
config.yml – to najważniejszy plik opisujący całe zadanie
doc – podkatalog z treścią zadania
in – podkatalog z danymi wejściowymi
out – podkatalog z danymi wyjściowymi
prog – wzorcowy kod z rozwiązaniem zadania

Poniżej opisy wszystkich powyższych elementów

katalog doc
Tu znajduje się tylko jeden plik – treść zadania jako pdf
Nazwa pliku musi być nazwapaczkizad.pdf
czyli w naszym przypadku: wypzad.pdf



katalog in
Pliki wejściowe które otrzymuje program który będzie sprawdzany.
Każdy plik wejściowy musi mieć następująca nazwę:
nazwapaczkinumer.in
Czyli w naszym przypadku:
wyp0a.in
wyp1b.in

wyp1h.in
wyp2a.in

wyp2f.in
wyp3a.in



katalog out
Pliki wyjściowe które sprawdzany program musi wygenerować. Jak sprawdzany program wygeneruje taki sam plik wyjściowy to otrzyma punkty.
Każdy plik wyjściowy musi mieć następująca nazwę:
 nazwapaczkinumer.out
Czyli w naszym przypadku:
wyp0a.out
wyp1b.out

wyp1h.out
wyp2a.put

wyp2f.out
wyp3a.out

Pliki wyjściowe odpowiadają analogicznym plikom wejściowym.
Na przykład
plik wyp0a.in odpowiada plikowi wyp0a.out
plik wyp1a.in odpowiada plikowi wyp1a.out
i tak dalej

Co oznaczają numerki i literki w nazwie testu?
Powyższe testy zostały podzielone na 4 kategorie:
0 – (test 0a) – to sa testy wstępne za które szkopuł nie przyznaje punktów
1a do 1h
2a do 2f
3a
Oprócz testów wstępnych mamy 3 kategorie testów o numerach od 1 do 3. W poliku config.yml określimy ile punktów przydzielamy za poszczególne kategorie.
By dostać punkty za poszczególną kategorię, rozwiązujący zadanie musi mieć poprawne odpowiedzi mieszczące się w limicie czasu dla każdego z testów w kategorii.
Na przykład by dostać punkty za testy kategorii 1, program użytkownika musi poprawnie odpowiedzieć na wszystkie testy od 1a do 1h oraz mieścić się dla każdego testu w limicie czasu.

Ogólnie ocenianych kategorii może być dowolna liczba – od 1 do ilu chcemy.

Zwykle przyjmuje się, że testy 1 są dla małych wartości a testy górne – w naszym przypadku 3, dla maksymalnych limitów.
Ewentualnie poszczególne kategorie testów – począwszy do 1 – odpowiadają poszczególnym podzadaniom zdefiniowanym w treści.

Ja zwykle robię 5 kategorii testów
0 – test z zadania – nie oceniany
1 – moje testy graniczne (brak danych, graniczne dane, tylko jedna wartość)
2 – losowe testy dla małej ilości danych
3 – losowe testy dla średniej ilości danych
4 – losowe testy da maksymalnej ilości danych


katalog prog
Znajduje się tam wzorcowy program C++ który służył do wygenerowania wejścia (katalog in) i wyjścia (katalog out).
Plik z kodem C++ musi mieć nazwę: nazwapaczki.cpp
Czyli w naszym przypadku: wyp.cpp


config.yml – plik konfiguracyjny
Składa się z 3 części:
1. tytul: tytuł zadania jaki będzie widoczny na szkopule
2. numery testów i wielkość pamięć jaką program może zużyć
3. numery testów i czas w ms jaki program otrzymuje by rozwiązać problem
Uwaga: Numery testów (0a, … piszemy bez przedrostka wyp)

Przykład pliku config.yml i komentarz od znaku # który ewentualnie trzeba usunąć
title: Wypracowanie                #nazwa pliku jaka będzie widoczna w szkopule
memory_limit: 262144          #ile pamięci dostanie program użytkownika
time_limit: 1000                     #ile czasu ma program użytkownika: 1000 oznacza 1 sekundę

scores:                                        #ile punktów otrzyma użytkownik gdy poprawnie odpowie na wszystkie testy w ramach danej grupy. Dobrze by suma punktów ze wszystkich grup była równa 100
1: 30                                          #za poprawne wszystkie testy grupy 1 otrzymuje 30 punktów
2: 30                                          #za poprawne wszystkie testy grupy 2 otrzymuje 30 punktów
3: 40                                          #za poprawne wszystkie testy grupy 1 otrzymuje 30 punktów

 

Co gdy chcę by było kilka poprawnych odpowiedzi?
Własna checkerka

Czasem chcemy ułożyć zadanie w którym jest kilka poprawnych odpowiedzi. Na przykład podaj układ wież na szachownicy 2×2 które się wzajemnie nie biją. Mamy 2 poprawne odpowiedzi.
Co wówczas.

Paczki szkopuł dopuszczają dodanie własnej checkerki. Checkerka to program w C++ który musi nazywać się nazwa_paczkichk.cpp. W naszym przypadku wypchk.cpp gdyż nasza paczka nazywa się wyp.

Checkerka będzie uruchomiona przez szkopuł i otrzyma trzy parametry w linii komend (argv), odpowiednio: ścieżka pliku wejściowego testu, pliku z odpowiedzią użytkownika oraz pliku wyjściowego testu.

Na przykład otrzymamy na wejściu
a. plik in z informacją, że szachownica jest 2×2 (pierwszy plik argv)
b. wyjście użytkownika z jego układem wież (drugi plik argv)
c. wyjście (out) wzorcówki – być może będziemy chcieli użyć jakiś informacji  z przykładowego poprawnego rozwiązania  (trzeci plik argv)

Pierwsza linijka, którą wypisze checkerka ma być: OK lub WRONG (odpowiednio: odpowiedź udzielona przez użytkownika jest poprawna/niepoprawna)

Drugi wiersz to komentarz (np. Wypisany graf nie jest drzewem. albo Pomyliles sie o 0.5). Jeżeli nie chcemy wypisywać komentarza, to musimy wypisać pustą linijkę.

Trzeci wiersz to procent punktów (wartość jest brana pod uwagę tylko, jeżeli 1. linijka to OK, inaczej przydzielane jest 0% niezależnie od tej linijki). Powinna to być liczba całkowita z zakresu [0, 100]. Można ten wiersz pozostawić pusty – wypisać pusta linie – wtedy przyznane zostanie 100 punktów przewidzianych za dany test. Czyli jeśli chcemy by każdy test był tak samo i niezależnie traktowany przez checkerkę to trzeci wiersz wypisywany przez checkerkę powinien być 100 lub pusty.

Checkerka musi się znaleźć razem ze wzorcówką – w katalogu prog/


Pytania i odpowiedzi

> Czy jest instrukcja zrobienia paczki napisana przez właściciela szkopuł?
Tak:
https://github.com/sio2project/oioioi/wiki

> Czy limit pamięci podawany jest w KB?
Dokładnie

> Czy ten plik cpp w folderze prog będzie jakoś uruchamiany podczas sprawdzania?
Ten plik cpp nie będzie w ogóle używany.
Program zawodnika zostanie skompilowany i odpowiednie in i out porównane na podstawie jego programu
cpp jest jako archiwum użytej wzorcówki.
Ale musi być.

> Z którego c++ mam korzystać (w sensie 17, 14, 11)
Możesz używać dowolnej wersji c++

> Czy mam dostęp do bits/stdc++.h?
Oczywiście!

> Czy w folderze prog mogą być jeszcze inne programy? (np. Mój pythonowy generator testów, żeby nie pisać miliona wartości ręcznie – zapisuje efekt do pliku)?
W folderze prog musi być wzorcówka która się poprawnie kompiluje.
w formacie skrot_nazwy_zadania.cpp (u nas wyp.zip)
Ale mogą być tez inne dowolne rzeczy.

Dziękuję za każde zadanie!
Prześlij je na wspolpraca znak małpy oki.mhcode
Daniel Olkowski

Liczba komentarzy: 1

  • Adam

    W razie wątpliwości co do e-maila, na który wysyłać pliki z paczkami z zadaniami to na ten: kontakt oki org pl

Dodaj komentarz