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 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
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