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/. 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. Komitet Główny Olimpiady skontaktuje się ze szkołami, których uczniowie zarejestrują się i ustali szczegóły przeprowadzenia testu.

Zawody

Zawody OIJ są trójstopniowe.

  • Zawody I stopnia składają się z dwóch części:

    • Zadania programistyczne – tę część rozwiązujesz w systemie (SIO2). Zadań będzie 6, 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ń. Do każdego zadania możesz zgłosić 25 zgłoszeń poprzez SIO2. Niektóre zadania są otwarte – masz do dyspozycji 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. Inne zadania są ukryte – nie masz do dyspozycji odsłonięć, dlatego zalecamy dokładne testowanie Twojego rozwiązania. Możesz wymieniać się testami ze swoimi koleżankami i kolegami. Pamiętaj jednak, że nie możesz dyskutować na temat metod rozwiązywania zadań i efektywności rozwiązań. Wynikiem za zadanie jest najlepsze spośród wszystkich Twoich zgłoszeń (odsłoniętych i nieodsłoniętych) dla tego zadania.
    • Test odbędzie się 26 października 2023 w zarejestrowanych szkołach. Przeprowadzi go nauczyciel wyznaczony przez szkołę, i będzie zawierał nietrudne zadania z tematyki programowania i algorytmiki. Test będzie trwać 100 minut, pytania testowe są dwojakiego typu: pytania otwarte (w których odpowiedzią jest liczba lub pojedyncze słowo) oraz pytania zamknięte (wielokrotnego wyboru, czyli wybierasz poprawne odpowiedzi wśród podanych możliwości). Pytanie uznawane jest za rozwiązane poprawnie, kiedy odpowiedź jest poprawna (w przypadku pytań otwartych), bądź kiedy zaznaczysz dokładnie wszystkie poprawne odpowiedzi zostaną zaznaczone i żadnej błędnej (w przypadku pytań zamkniętych). Wynikiem podejścia jest suma punktów otrzymanych za pytania. Wybór języka w części testowej nie wiąże Cię w żaden sposób – w zadaniach programistycznych i dalszych etapach możesz używać zarówno C++ albo Pythona. Dostępne są przykładowe pytania testowe.

    Twoim wynikiem za całe zawody I stopnia będzie suma wyników za zadania i za test. Zwróć uwagę, że nie jest konieczne rozwiązanie wszystkich zadań. Każdy, kto spróbuje rozwiązać test 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.

  • Zawody II stopnia będą rozgrywane 2 marca 2024 (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 pomiędzy 60 a 110 uczestników (około).

  • Zawody III stopnia odbędą się 27 i 28 kwietnia 2024 (sobota-niedziela). Zawody formatem będą przypominały zawody II stopnia, z tą różnicą, że będą dwa dni właściwych zawodów, i wynikiem będzie suma punktów z tych dni. Tak jak w zawodach II stopnia, przed zawodami odbędzie się sesja próbna. Olimpiada ponownie pokryje koszty transportu na zawody i będziesz zwolniona/y z zajęć w szkole.

Po zawodach Komitet Główny ogłosi listę rankingową: wszyscy uczestnicy zostaną finalistami Olimpiady. Jeśli to Ci się uda, gratulujemy – gwarantuje Ci to szóstkę z informatyki oraz wolny wstęp do wybranej przez Ciebie szkoły średniej.

Dodatkowo, 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! Komitet, oprócz medali może przyznać też wyróżnienia. 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 2024. Jeśli znajdziesz się w ścisłej czołówce laureatów OIJ, Komitet zaproponuje Ci miejsce w reprezentacji Polski na Europejską Olimpiadę Informatyczną Juniorów, czyli międzynarodowe zawody programistyczne.

Rozwiązywanie zadań

Zadania programistyczne z zawodów I, 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łów, które mają stanowić wprowadzenie do rozwiązywania zadań. Gorąco zachęcamy do zapoznania się z Samouczkiem, który pokazuje jak działa system 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!