Jeśli chcesz zrobić zadanie algorytmiczne czy programistyczne, które będzie umieszczone w systemie Szkopuł
https://szkopul.edu.pl/problemset/
to
- Stwórz paczkę jak opisano poniżej
- Umieść paczkę na współdzielonym zasobie (np. Google Drive)
- Wyślij informacje o paczce na adres kontakt@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 video stworzenia paczki Szkopuł
Materiał video opisujący krok po kroku jak zrobić paczkę szkopuł
https://youtu.be/oRKbYDUL1cA?t=1175
–
Instrukcja stworzenie paczki Szkopuł
Poniżej znajduje się instrukcja krok po kroku jak zrobić paczkę szkopuł
Oto przykładowa paczka zadania Balonowe urodziny brata (bub): bub.zip
Zadanie na szkopule: https://szkopul.edu.pl/problemset/problem/zBIENYWkKFivH6KPGkSDrAyE/site/
Załączona paczka nazywa się bub.zip
Słowo bub (nazwa paczki) jest tu ważne i jest przedrostkiem wielu plików.
–
Cała paczka jest w jednym katalogu bub (takim samym jak nazwa) i zawiera następujące podkatalogi 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: bubzad.pdf
W katalogu doc masz również plik edytowalny (Microsoft Word).
Przerób ten plik tak aby był Twoim zadaniem. Zmień nazwę, treść, limity i podaj siebie jako autora.
Jak zmienić ten plik Word z Twoim zadaniem na pdf?
Po prostu zacznij drukować i wybierz druk do pdf.
Zostaw w katalogu zarówno wersję edytowalną jak również 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:
bub0a.in bub0b.in
bub1a.in
bub2a.in bub2b.in bub2c.in
bub3a.in bub3b.in
bub4a.in bub4b.in bub4c.in
bub5a.in bub5b.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:
bub0a.out bub0b.out
bub1a.out
bub2a.out bub2b.out bub2c.out
bub3a.out bub3b.out
bub4a.out bub4b.out bub4c.out
bub5a.out bub5b.out
Pliki wyjściowe muszą odpowiadać analogicznym plikom wejściowym.
Na przykład
plik bub0a.in odpowiada plikowi bub0a.out
plik bub1a.in odpowiada plikowi bub1a.out
i tak dalej
Dlaczego?
Gdy ktoś wrzuci zadanie w C++ / Python, szkopuł uruchomi program na przykład z plikiem bub4b.in i sprawdzi czy program daje takie samo wyjście jak w pliku bub4b.out
Co oznaczają numerki i literki w nazwie testu?
Powyższe testy zostały podzielone na 6 kategorii:
0 – (test 0a) – to są testy wstępne za które szkopuł nie przyznaje punktów – powinny być takie same jak dajemy w treści zadania
1a – testy grupy 1
2a do 2c – testy grupy 2
3a do 3b – testy grupy 3
4a do 4c – testy grupy 4
5a do 5b – testy grupy 5
Czyli najpierw mamy testy wstępne za które nie ma punktów.
Dalej mamy 5 grup testów o numerach od 1 do 5. W poliku config.yml określimy ile punktów przydzielamy za poszczególne kategorie.
By dostać punkty za poszczególną kategorię, program musi mieć poprawne odpowiedzi dla wszystkich z testów grupy. Dodatkowo czas działania musi być w maksymalnie połowie ustawionego limitu czasu.
Na przykład by dostać punkty za testy kategorii 4, program użytkownika musi poprawnie odpowiedzieć na wszystkie testy od 4a do 4c oraz mieścić się dla każdego testu w maksymalnie połowie limitu 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 5, dla maksymalnych limitów.
Ewentualnie poszczególne kategorie testów – począwszy do 1 – odpowiadają poszczególnym podzadaniom zdefiniowanym w treści.
–
Pamiętaj by w testach umieszczać
a. trudne przypadki, graniczne przypadki: brak danych, graniczne dane, tylko jedna wartość
b. losowe wartości
c. mała i duża liczba danych
–
katalog prog
Znajduje się tam wzorcowy program C++/Python 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: bub.cpp
Jeśli Twoje rozwiązanie wzorcowe jest w Python – plik z kodem Python musi mieć nazwę: nazwapaczki.py
Czyli w naszym przypadku: bub.py
Wystarczy rozwiązanie wzorcowe w jednym języku. Mogą też być rozwiązania wzorcowe w dwóch językach
–
config.yml – plik konfiguracyjny
Składa się z 3 części:
a. tytul: tytuł zadania jaki będzie widoczny na szkopule
b. Wielkość pamięć jaką program może zużyć
c. Czas w ms jaki program otrzymuje by rozwiązać problem (1s = 1000ms)
d. Listy grup testów i punktacji jaką przyznajemy za wszystkie poprawne odpowiedzi w grupie mieszczące się w połowie limitu czasu.
Uwaga: Numery testów (0a, …) piszemy bez przedrostka zadania np: bub
Przykład pliku config.yml i komentarz od znaku # który ewentualnie trzeba usunąć
title: Balonowe urodziny brata #nazwa zadania jaka będzie widoczna w szkopule
memory_limit: 131072 #limit pamięci dla programu osoby wrzucającej swoje rozwiązanie
time_limit: 300 #limit czasu dla programu osoby wrzucającej swoje rozwiązanie
scores: #ile punktów otrzyma użytkownik gdy program poprawnie odpowie na wszystkie testy w ramach danej grupy i będzie poniżej połowy limity czasu. Dobrze by suma punktów ze wszystkich grup była równa 100
1: 10 #za wszystkie poprawne odpowiedzi grupy 1 (w max połowie limitu czasu) otrzymuje 10 punktów
2: 10 #za wszystkie poprawne odpowiedzi grupy 2 (w max połowie limitu czasu) otrzymuje 10 punktów
3: 10 #za wszystkie poprawne odpowiedzi grupy 3 (w max połowie limitu czasu) otrzymuje 10 punktów
4: 30 #za wszystkie poprawne odpowiedzi grupy 4 (w max połowie limitu czasu) otrzymuje 30 punktów
5: 40 #za wszystkie poprawne odpowiedzi grupy 5 (w max połowie limitu czasu) otrzymuje 40 punktów
override_limits: #sekcja która pozwala ustawić wyższy czas w ms (1s = 1000ms) gdy sprawdzany jest program w Python – w dalszym ciągu max punktów za wykonanie w max połowy podanego czasu dla Python
py:
time_limit: 600 #sprawdzany program w Python otrzyma max punktów gdy wykona się w max połowie podanego (300ms). Czas podajemy w ms (1s = 1000ms)
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 bubchk.cpp gdyż nasza paczka nazywa się bub.
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
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