Przewodnik po OIJ

Niniejszy dokument stanowi streszczenie Zasad organizacji zawodów. Zawodników zainteresowanych dalszym zgłębieniem zasad odsyłamy do tego dokumentu.

Udział w OIJ

W Olimpiadzie Informatycznej Juniorów mogą uczestniczyć wszyscy uczniowie szkół podstawowych. Konkurs jest indywidualny, tj. każdy sam startuje w zawodach. Rejestracja na zawody odbywa się poprzez System Informatyczny Olimpiady, zwany dalej SIO2, dostępny pod adresem https://oij.edu.pl/sio/. Rejestracja ruszy 16 września 2019r. wraz z zawodami pierwszego stopnia. Pamiętaj, że każdy może mieć tylko jedno konto w systemie oraz musisz podać tam prawdziwe dane. W przeciwnym wypadku możesz zostać zdyskwalifikowana/y.

Zawody

Zawody OIJ są trójstopniowe.

  • Zawody I stopnia są przeprowadzane przez internet (konkretnie SIO2). Zawody te są podzielone na trzy tury:
    • turę testową (rozpoczynającą się 16 września 2019 i kończącą się 13 stycznia 2020), która polega na rozwiązaniu testu sprawdzającego podstawową wiedzę w wybranym języku programowania (C++ albo Python) oraz znajomość podstawowych zagadnień algorytmicznych. W ramach testu przygotowana jest pula ok. 450 zadań z algorytmiki, C++ oraz Pythona. Możesz wybrać język przy rozwiązywaniu testu (tj. gdy wybierzesz wersję z C++, pytania będą dotyczyły jedynie algorytmiki i C++, a nie będzie pytań z Pythona). Dodatkowo wybór języka nie wiążę Cię w żaden sposób - w kolejnych turach i etapach możesz używać zarówno C++ albo Pythona. Test składa się z pytań algorytmicznych i pytań z języka programowania wybieranych losowo. Podczas całego trwania tej tury możesz próbnie rozwiązywać test. Te próbne podejścia są identyczne jak normalne, ale nie są w żaden sposób liczone do punktacji. Możesz w ten sposób zaznajomić się z pulą zadań i poćwiczyć przed przystąpieniem do ocenianego testu. W szczególności możesz próbnie rozwiązywać test ile razy chcesz.
      Kiedy poćwiczysz i jesteś pewna/pewien swojej wiedzy, możesz rozwiązać normalny test. Możesz podejść do tego testu dwukrotnie. Test nie ma limitu czasu. Każde pytanie w teście jest warte 10 punktów. Pytania są dwojakiego typu: pytania otwarte, w których odpowiedzią jest liczba lub pojedyncze słowo oraz pytania zamknięte wielokrotnego wyboru, w których otrzymujesz możliwe odpowiedzi, ale poprawnych odpowiedzi może być wiele. Pytanie uznawane jest za rozwiązane poprawnie, kiedy odpowiedź jest poprawna (w przypadku pytań otwartych), bądź dokładnie wszystkie poprawne odpowiedzi zostaną zaznaczone i żadna niepoprawna nie będzie zaznaczona (w przypadku pytań zamkniętych). Wynikiem podejścia jest suma punktów otrzymanych za pytania, a wynikiem za cały test jest maksimum z wyników z dwóch podejść. Nie musisz wypełniać testu dwukrotnie, jeżeli jesteś zadowolony ze swojego wyniku w pierwszym podejściu, ale gorąco do tego zachęcamy.
    • turę otwartą (rozpoczynającą się 30 września 2019 i kończącą się 16 grudnia 2019), która polega na rozwiązaniu od 4-6 zadań programistycznych. Za każde zadanie możesz zdobyć 100 punktów. Szczegóły na temat rozwiązywania zadań dostępne są niżej, w sekcji Rozwiązywanie zadań. Podczas tej tury, do każdego zadania możesz zgłosić 25 zgłoszeń poprzez SIO2. Dodatkowo, masz do dyspozycji także 10 odsłonięć, które pozwolą Ci sprawdzić swój wynik (liczbę punktów otrzymaną za dane zgłoszenie). Funkcja ta jest dostępna poprzez przycisk “Ujawnij wynik” w widoku zgłoszenia w SIO2. Wynikiem za zadanie jest maksimum pośród wszystkich Twoich zgłoszeń (odsłoniętych i nieodsłoniętych) dla tego zadania.
    • turę ukrytą (rozpoczynającą się 14 października i kończącą się 13 stycznia 2020). Ta tura jest bardzo podobna do tury otwartej. W turze ukrytej masz do rozwiązania 4-6 zadań algorytmicznych, każde warte ponownie 100 punktów. W tej turze nie masz do dyspozycji odsłonięć, dlatego zalecamy dokładne testowanie Twojego rozwiązania. Możesz do tego użyć testów, które Twoi koledzy i koleżanki będą publikować na Forum w SIO2. Pamiętaj jednak, że na forum nie możesz dyskutować na temat metod rozwiązywania zadań i efektywności rozwiązań. Wynikiem za zadanie dalej jest maksimum wśród wszystkich Twoich zgłoszeń do danego zadania.

Twoim wynikiem za całe zawody I stopnia będzie suma wyników we wszystkich trzech turach. Zwróc uwagę, że nie jest konieczne rozwiązanie wszystkich zadań. Każdy, kto spróbuje rozwiązać test właściwy lub nadeśle rozwiązanie do choćby jednego zadania programistycznego, staje się uczestnikiem Olimpiady i potencjalnie ma szanse awansować dalej. Do zawodów II stopnia zostanie zakwalifikowanych co najmniej 25% uczestników zawodów I stopnia, którzy uzyskają największą liczbę punktów w zawodach I stopnia, przy czym liczba zakwalifikowanych uczestników wyniesie co najmniej 150. Dodatkowo, z każdego województwa zostanie zakwalifikowanych przynajmniej trzech uczestników, którzy otrzymali przynajmniej 30% łącznej maksymalnej liczby punktów do zdobycia za wszystkie tury zawodów I stopnia.

  • Zawody II stopnia będą rozgrywane 14 marca 2020 (w sobotę) w wybranych ośrodkach lokalnych. Przed zawodami dowiesz się, gdzie zawody będą odbywały się dla Ciebie. Olimpiada pokrywa koszty transportu na miejsce zawodów. Przed zawodami odbędzie się sesja próbna, podczas której będziesz mogła/mógł sprawdzić przygotowany sprzęt oraz oprogramowanie, a także rozwiązać próbne zadanie, które nie będzie liczyło się do klasyfikacji. Sesja próbna ma na celu sprawdzenie, czy wszystko działa poprawnie. Po tej sesji odbędą się właściwe zawody, które będą się składać z jednej sesji trwającej 4 godziny. Podczas tej sesji zmierzysz się z dwoma, trzema, lub czterema zadaniami, których format będzie identyczny do zadań z tury ukrytej zawodów I stopnia. W czasie zawodów możesz korzystać jedynie ze sprzętu dostarczonego przez organizatorów, to oznacza m.in. żadnych książek, pendrive’ów, ani telefonów. Do zawodów III stopnia zakwalifikowanych zostanie około 80 uczestników. Komitet ma prawo zwiększyć, bądź zmniejszyć liczbę zakwalifikowanych osób o co najwyżej 30%.

  • Zawody III stopnia odbędą się 15 i 16 maja 2020 w Warszawie. Jeżeli tutaj dotarłaś/eś, gratulujemy! Jesteś finalistką lub finalistą Olimpiady Informatycznej Juniorów. W szczególności masz już szóstkę z informatyki oraz wolny wstęp do wybranej przez Ciebie szkoły średniej. Olimpiada ponownie pokryje koszty transportu na zawody i będziesz zwolniona/y z zajęć w szkole. Zawody formatem będą przypominały zawody II stopnia - najpierw odbędzie sesja próbna, a później czterogodzinna sesja właściwa zawodów. Po zawodach Komitet Główny ogłosi listę rankingową, gdzie wyróżniający się finaliści otrzymają tytuł laureata Olimpiady Informatycznej Juniorów. Istnieją trzy stopnie laureatów: I stopnia (którzy zwyczajowo otrzymują złote medale), II stopnia (srebrne medale) oraz III stopnia (brązowe medale). Inaczej niż w sporcie, w olimpiadach naukowych nie tylko trzy pierwsze osoby są nagradzane medalami. Komitet może wyróżnić medalami nawet połowę wszystkich finalistów! Dodatkowo Komitet może wyróżnić niektóre finalistki i finalistów, którzy otrzymają tytuł finalistki/y z wyróżnieniem. Komitet może także przyznać uczestnikom i uczestniczkom finału stosowne nagrody i stypendia oraz zaprosić do udziału w Obozie Naukowo-Treningowym, który odbędzie się w wakacje 2020. Komitet na podstawie wyników zawodów III stopnia, obozu oraz regulaminu zawodów międzynarodowych wyznacza także delegacje na te zawody (m.in. Europejską Olimpiadę Informatyczną Juniorów).

Rozwiązywanie zadań

Zadania podczas dwóch tur zawodów I stopnia oraz zawodów II i III stopnia polegają na napisaniu programu rozwiązującego dany problem. Rozwiązania należy napisać w języku C++ albo Python. Przygotowaliśmy bardzo dużo materiałow, które mają stanowić wprowadzenie do rozwiązywania zadań. Gorąco zachęcamy do zapoznania się z Samouczkiem, który pokazuje jak działa SIO2 oraz demonstruje przykładowe rozwiązanie zadania w C++ oraz Pythonie. Możesz także sam(a) rozwiązać to i inne zadania w dziale Przykładowe zadania. W razie czego, są tam też dostępne rozwiązania w obu językach programowania. Sprawdź także, jak wysyłać zadania w SIO2.

Za każde zadanie możesz otrzymać od 0 do 100 punktów. Rozwiązania oceniane są automatycznie, to jest sprawdzane przez komputer.

  • Po pierwsze Twój program musi być poprawny składniowo - inaczej SIO2 wyświetli błąd kompilacji.
  • Jeśli program nie będzie miał błędów składniowych (Python) i skompiluje się prawidłowo (C++), to zostanie uruchomiony dla różnych (często złośliwych) danych - za każdym razem z ustalonym limitem czasu i pamięci (podanych w zadaniu) podczas wykonania programu - możesz założyć, że dane będą zawsze zgodne ze specyfikacją w zadaniu (sekcja Wejście).
  • Dla każdego testu jeśli program nie przekroczy żadnego limitu i zakończy się bez błędu wykonania, sprawdzona zostanie poprawność wypisanej na wyjście odpowiedzi, jeśli odpowiedź dla testu jest zgodna ze specyfikacją w zadaniu (sekcja Wyjście) to test jest zaliczany.
  • Każdy test jest przypisany do pewnej grupy testów, a rozwiązania otrzymują punkty jedynie za grupy, w których zaliczone zostały wszystkie testy.
  • W niektórych zadaniach mogą się pojawić dodatkowe warunki, kiedy Twój program może otrzymać jedynie część punktacji za dany test, ale wtedy wszystko będzie dokładnie opisane w treści tego zadania. Wtedy wynikiem grupy jest minimum pośród wyników dla wszystkich testów w tej grupie.

Aby za zadanie uzyskać maksymalną punktację, konieczny jest program, który zawsze zwraca poprawną odpowiedź, nie przekraczając limitu czasu (zwykle sekunda lub kilka sekund), ani pamięci (zwykle kilkadziesiąt lub kilkaset megabajtów). Niektóre zadania stanowią ćwiczenie programistyczne i główną trudnością jest zaimplementowanie prostego pomysłu, jednak w przypadku niektórych zadań nie zawsze najprostsze rozwiązanie będzie dostatecznie szybkie, żeby poradzić sobie w przypadku dużych danych. Zazwyczaj programy poprawne, szybkie dla małych danych lecz za wolne dla dużych, otrzymują punkty, ale mniej niż 100 - informacje o gwarantowanych punktach za rozwiązania tego typu często podane są w zadaniach w sekcji Ocenianie. Bardzo ważne jest, żeby program wypisywał odpowiedź we właściwym formacie (zgodnie z sekcją Wyjście), bez żadnych dodatkowych komunikatów, przestrzegając wielkości liter na wyjściu, kolejności wypisywanych odpowiedzi i odstępów pomiędzy nimi. W przeciwnym przypadku, automatyczne ocenianie za każdym razem będzie bardzo “brutalne”, a program będzie oceniony bardzo nisko (zazwyczaj 0 punktów). Zwykle też, jeśli zastosowany algorytm tylko czasami prowadzi do uzyskania prawidłowej odpowiedzi, ale generalnie nie rozwiązuje zadania, rozwiązanie również może być ocenione bardzo nisko, nawet jeśli jest szybkie i zużywa mało pamięci. Podsumowując: bardzo ważne jest przestrzeganie formatu wypisywanej odpowiedzi, bardzo ważna jest poprawność algorytmu oraz implementacji, dość ważne jest to, czy zastosowany algorytm sprawnie radzi sobie również dla dużych danych. Sprawdzanie nie bierze pod uwagę aspektów subiektywnych: jak na przykład czy kod wygląda schludnie, albo czy jest najkrótszy możliwy. Tak długo, jak program zwraca prawidłową odpowiedź i mieści się w limitach - będzie oceniony wysoko.

Grupowanie testów, choć wygląda na bardzo restrykcyjne, jest konieczne: np. w zadaniu, w którym trzeba wypisać tylko TAK lub NIE, nie ma co liczyć na wysoki wynik za program który zawsze wypisuje tylko TAK, albo zawsze wypisuje tylko NIE, albo losuje odpowiedź. Program taki zaliczy w każdej grupie jedynie niektóre testy, ale rzadko zaliczy je wszystkie. Dlatego za każdą lub prawie każdą grupę otrzyma 0 punktów i taki będzie też łączny wynik rozwiązania. Dla odmiany: rozwiązanie wolne, które chociaż dla małych danych jest dostatecznie szybkie, ale zawsze jest poprawne, zaliczy niektóre grupy testów, w których wszystkie testy są małe, a nie zaliczy tych grup testów, w których będą jakieś duże testy. Skoro niektóre grupy są zaliczone - program otrzyma punkty - a ile dokładnie, zależy od tego jak bardzo jest wolny.

Wszelkie szczegóły techniczne dot. rozwiązywania zadań (wersje kompilatorów, interpreterów, limity na długość kodu, itd.) znajdują się w dokumencie Ustalenia techniczne.

Dla Twojej wygody, na stronie Środowisko testowe zostało przygotowane środowisko testowe, które umożliwia Ci wygodne testowanie poprawności i efektywności działania programów w warunkach, w których będą oceniane.

Posłowie

Życzymy powodzenia w Twojej przygodzie z Olimpiadą Informatyczną Juniorów! Pamiętaj, że nie trzeba rozwiązać wszystkich zadań ani pytań, ale wciąż warto próbować uzyskać jak najlepszy wynik.

Jeżeli wciąż masz jakieś pytania, nie wahaj się z nami skontaktować. Podczas zawodów możesz zadać pytanie przez SIO2, a zawsze możesz wysłać maila na adres olimpiada@oij.edu.pl. Z chęcią odpowiemy na wszelkie pytania!