Üldist
Mis on informaatika?
Informaatika on definitsiooni järgi teadus infosüsteemidest, hõlmates osi nii arvutiteadusest, infotehnoloogiast kui statistikast.
Mis on informaatikaolümpiaad ja mida seal tehakse?
Laiemalt peaks tegelikult rääkima programmeerimisvõistlustest. Selliseid võistlusi on palju, enamik neist toimuvad tänapäeval online võistlusserverites. Eesti informaatikaolümpiaad on põhiline Eestis korraldatav programmeerimisvõistlus, kuid lisaks saab osaleda ka mitmetel teistel võistlustel. Selliste võistluste põhiteemaks on algoritmilise iseloomuga programmeerimisülesannete lahendamine. Tüüpiline programmeerimisvõistluse ülesanne on näiteks selline:
"Malelaual peab ratsu liikuma N käiguga ühelt etteantud väljalt teisele. Mitu erinevat teekonna võimalust tal selleks on? Kirjutada programm, mis saab ette algus- ja lõppväljade tähised ning arvu N ja väljastab erinevate teekondade arvu."
Võistlusel tuleb etteantud aja (tavaliselt 2-5 tundi) jooksul lahendada hulk (tavaliselt 3-5) sellist laadi ülesannet, täpsemalt kirjutada programmid, mis etteantud sisendite põhjal vastused leiavad.
Kui programm on valmis, esitab võistleja selle testimiseks. Testimine toimub tänapäeval automaatselt, programmile antakse hulk sisendeid, programm leiab vastused, mille õigsust testimisraamistik kontrollib. See, millised testid on, ei ole võistlejale reeglina ette teada.
Täpsemalt kontrollitakse kaht asja: kas vastus on õige ja kas see leiti piisavalt kiiresti. Punkte saab ainult juhul, kui mõlemad tingimused on täidetud. Keerulisemate üleannete puhul on tavaline, et suhteliselt lihtne on kirjutada programmi, mis vastuse küll leiab, aga töötab väga kaua - peamine väljakutse on panna programm tööle võimalikult kiiresti. Rohkem teste läbinud programm saab ka rohkem punkte ning punktide koguarv määrabki võistluse võitja.
Lisaks "puhastele" programmeerimisülesannetele võib võistlusel olla ka teisi nuputamist vajavaid ning programmeerimisega seotud ülesandeid. Peamiseks näiteks on avatud testidega ülesanded, mis on traditsiooniliseks lahtise võistluse osaks. Avatud testidega ülesannete puhul on testid ette antud ja programmi esitama ei pea. Teoreetiliselt on võimalik selliseid ülesandeid lahendada ka "näppude peal" ehk üldse ilma programmeerimiseta. Reeglina on siiski kasulik kirjutada mõni abistav programm (või ka mitu), mis andmeid töödelda ja variante läbi vaadata aitab. Selliste ülesannete puhul on ka üsna tavaline, et tuleb mõelda "kastist väljas", et ülesande ivale pihta saada, täiendavaid materjale otsida vms.
Mis vahe on olümpiaadi- ja tavalisel programmeerimisel?
Tarkvara koosneb tänapäeval tohutust hulgast loogilistest kihtidest, mis üksteisega andmeid vahetavad. Tavalise programmeerija töö koosneb suuresti kahest osast:
- Andmete kopeerimine ühest kihist teise, sooritades nendega vahepea mingi transformatsiooni.
- Uurimine, miks mõni üleval- või allpool asuv kiht ei tööta oodatud viisil. Kihtide hulka arvestades on tegelikult imekspandav, et vahel üldse mõni asi töötab :)
Olümpiaadil on enamik sellest kihilisusest elimineeritud ning keskendutakse konkreetsele ülesandele: kuidas leida lähteandmete põhjal konkreetne vastus.
Võime tuua ka sellise võrdluse: olümpiaad on nagu rallisõit ja tavaprogrammeerimine on nagu liinibussi juhtimine. Sarnased, kuid siiski erinevad.
Mis on programmeerimisvõistluste eesmärk?
Siin võib tõmmata paralleeli spordiga ning eristada inimeste individuaalseid eesmärke ja ühiskondlikku kasu.
Individuaalselt on osalejate eesmärk sarnane võistlussportlaste omaga - arendada oma võimed maksimaalseks ning olla parem kui teised.
Institutsioonidele (nt ülikoolidele) on sageli oluline prestiiž, näiteks ICPC võistluse võit on märk sellest, et meie ülikoolis on kõvad tegijad.
Kõige laiem kasu on aga ühiskondlik: võistlustel osalemine arendab järgmisi oskusi:
- keerulise või segase formuleeringu põhjal konkreetse eesmärgi seadmine,
- kiiresti täpsete ja efektiivsete programmide kirjutamine,
- tarkvara kiirust mõjutavate tegurite põhjalik tundmine,
- suurtel andmemahtudel töötavate algoritmide ja testimismetoodikate tundmine.
Need oskused aitavad kaasa kogu tarkvaratööstuse kvaliteedi arengule. Me kõik oleme kogenud seda, et tarkvara on puudulikult testitud või töötab aeglaselt. Kui igale programmile lähenetaks nii, nagu seda tehakse võistlusel, oleks suur hulk selliseid probleeme olemata.
Mis on olümpiaadi ajalugu?
Esimene rahvusvaheline informaatikaolümpiaad (IOI) toimus 1989. aastal Bulgaarias. Sellest ajast saadik on olümpiaadi raskus järk-järgult tõusnud, kooskõlas sellega, et suuremad riigid muudavad oma ettvalmistusprogramme põhjalikumaks.
Läbi aegade parimad üksikvõistlejad IOI-l on olnud:
- Gennady Korotkevich – Valgevene
- Filip Wolski – Poola
- Rares-Darius Buhai – Rumeenia
- Rumen Hristov – Bulgaaria
- Martin Pettai - Eesti
- Andrzej Gąsienica-Samek - Poola
Parimad riigid on olnud Hiina, Venemaa, USA, Poola, Korea, Rumeenia, Iraan
Kes on tuntumad olümpiaadil osalenud inimesed?
Eestis on informaatikaolümpiaadil osalenud mitmed hiljem tööstuse ja teaduse alal edu saavutanud inimesed. Mõned neist on:
- Ahti Heinla (Skype'i ja Starshipi asutajaist)
- Jaan Tallinn (Skype'i asutajaist)
- Jevgeni Kabanov ja Toomas Römer (ZeroTurnaroundi asutajad)
- Andrei Korobeinik (rate.ee asutaja)
- Anton Keks (Codeborne'i asutajaist)
- Peeter Laud ja Meelis Kull (TÜ õppejõud)
- Tanel Ainla (Teadusmosaiigi asutaja)
- Arne Ansper (X-tee arhitekt)
- Palju, palju teisi tarkvaraarhitekte, tehnoloogiajuhte ja peaspetsialiste, kes meie mitmesuguste igapäevaselt kasutatavate tarkvarasüsteemide taga seisavad.
Korraldus
Kes olümpiaadi korraldab?
Ei ole ühtki inimest, kelle ametinimetus oleks "informaatikaolümpiaadi korraldaja". Korraldustoimkond on grupp vabatahtlikke, keda organisatsiooniliselt toetab Teaduskool. Toimkonna koordinaatoriks on olnud Rein Prank (1992-1997), Ahto Truu (1998-2014), Targo Tennisberg (2015-2019) ja Sandra Schumann (alates 2020).
Kuidas võistlused toimuvad?
Eestis koostab ülesandeid ja teste informaatikaolümpiaadi toimkond. Rahvusvahelistel võistlustel korraldatakse tavaliselt ülesannete esitamise konkursse, kuhu ülesandeid saata saab ning kust vastav žürii parimad ülesanded välja valib. Online võistlustel on vahel ka palgalised ülesandekoostajad.
Kui ülesanded ja testid on koostatud, siis võistluse läbiviimine ise on tänapäeval üpris automaatne. Lahendusi saab tehniliselt kirjutada ükskõik millises Internetiga ühendatud arvutis. Žüriil on testimisserver, kuhu osalejad oma lahendused esitavad. Testimisserver kompileerib programmi ja käivitab selle erinevate testidega, vastavalt millele saab võistleja punkte. Olenevalt võistluse formaadist saab lahenduse esitaja tulemuse teada kas kohe või hiljem.
Millised võistlused aset leiavad?
Programmeerimisvõistlusi on üsna palju, osad neist on avatud kõigile soovijatele, osad on piiratud (nt ainult üldhariduskoolide õpilased).
Eestis toimuvad hooaja jooksul toimuvad traditsiooniliselt järgmised võistlused:
- Lahtine võistlus
- Kõigile avatud
- Oktoobris, kestab nädal aega, testimisserver on kogu selle aja avatud
- Lahendada võib igal pool
- Olümpiaadi eelvoor
- Avatud kõigile kooliõpilastele
- Detsembri alguses, 4 tundi lahendamisaega
- Toimub erinevates Eesti koolides
- Olümpiaadi lõppvoor
- Eelvooru põhjal kutsututele, tavaliselt 30-40 osalejat
- Veebruaris, 5 tundi lahendamisaega
- Toimub Tartu Ülikooli arvutiklassides
- Eesti koondise valikvõistlused
- Lõppvooru põhjal kutsututele, tavaliselt umbes 15 osalejat
- Märtsis-aprillis, kahel eraldi päeval, 5 tundi korraga
- Toimub Tartu Ülikooli arvutiklassides
Regionaalsed võistlused, kus Eesti osaleb:
- Balti olümpiaad (BOI)
- Tavaliselt mais
- 2 võistluspäeva
- Toimumiskoht roteerub Läänemere äärsete riikide vahel
- Eestist 6-liikmeline võistkond
- ICPC eelvoor
- Võistkondlik võistlus üliõpilastele, 3-liikmelised võistkonnad, kes esindavad oma ülikooli
- Eesti jaoks Põhjamaade eelvoor tavaliselt novembris
Ülemaailmsed võistlused:
- Rahvusvaheline Informaatikaolümpiaad (IOI)
- Üldhariduskoolide õpilastele, Eestist 4-liikmeline võistkond
- Tavaliselt augustis, 2 võistluspäeva
- Järgmised rahvusvahelised olümpiaadid toimuvad:
- 2023 Ungari
- 2024 Egiptus
- ICPC finaal
- Võistkondlik võistlus üliõpilastele, 3-liikmelised võistkonnad, kes esindavad oma ülikooli
- Eesti ülikoolide võistkonnad osalevad, kui eelvoorus edasi pääsevad
- Toimumiskoht roteerub üle maailma, tavaliselt üle aasta Põhja-Ameerikas ja mujal
Online võistlused. Internetis on mitmed serverid, kus toimuvad regulaarsed võistlused, sealhulgas:
Kuidas ma osaleda saan?
- Jälgi infot olümpiaadi kodulehel ning olympiaadid-meililistis.
- Lahtisele võistlusele saab end veebis ise registreerida ja siis ülesandeid lahendada.
- Eelvoorul osalemiseks leia endale lähim kool, mis eelvooru korraldab ning registreeri ennast seal.
- Ülejäänud võistlustele saadetakse vajadusel juba spetsiaalne kutse.
Lahendamine
Milliseid programmeerimiskeeli saab kasutada?
- IOI-l on praegu lubatud ainult C++.
- BOI-l on praegu lubatud C++ ja Python.
- EIO-l on ametlikud keeled C++ ja Python. Lisaks on viimastel aastatel kasutusel olnud C#, Java, Rust.
- Kokkuleppel on võimalik kasutada ka teisi keeli, kui žürii selleks võimaluse leiab. Varasemad näited on olnud Perl, Haskell, PHP.
- Lahenduste hindamisel kasutatav testimiskeskkond
Milline on hea olümpiaadiülesande lahendus?
Olümpiaadiülesande lahendamisel on kaks peamist aspekti:
- Korrektsus ja täielikkus. See tähendab, et programm peab hakkama saama igasuguse lubatud sisendite kombinatsiooniga.
- Efektiivsus tähendab, et programm peab hakkama saama võimalikult suure sisendi käsitlemisega minimaalse aja jooksul.
Efektiivsuse peamine mõõdik on algoritmi ajaline keerukus. Näiteks kui me suurendame sisendit 10 korda ja programmi tööaeg pikeneb samuti 10 korda, on meil tegemist lineaarse keerukusega algoritmiga. Kui tööaeg pikeneb sisendi 10-kordsel suurendamisel aga 100 korda, on tegu ruutkeerukusega algoritmiga. Mida kiiremini pikeneb tööaeg sisendi suurendamisel, seda suurem on ajaline keerukus (niisiis näiteks ruutkeerukus on suurem kui lineaarne keerukus). Enamasti on olümpiaadiülesannetel mitu erinevat võimalikku lahendust ning väiksema keerukusega lahendus saab rohkem punkte kui suurema keerukusega lahendus, sest suurema keerukusega algoritmid ei suuda suurematel sisenditel jääda etteantud ajalimiidi piiresse.
Kuidas valmistuda?
Informaatikaolümpiaad on teiste olümpiaadidega võrreldes hea selle poolest, et veebis on massiliselt erinevaid ressursse, mida kasutada, toimub palju online-võistlusi jne.
Vt näidetena:
- Võistlusprogrammeerimise õpik
- Teaduskooli kursus eelmise põhjal
- USA kaugõppekursus (tõsiselt soovitatav kõigile; selle kursuse läbinu on kindlalt IOI medalisti tasemel)
- USA lahtised võistlused (võistlused pronksi-, hõbeda-, ja kullarühmas; edukas osalemine viib järgmisesse rühma; soovitatav igale tasemele)
- Horvaatia lahtised võistlused (tavaliselt 6 ülesannet kasvava raskusega; soovitatav igale tasemele)
- Codeforces (võistlusprogrameerimise platvorm ja blogi; regulaarsed võistlused, lisaks saab arutada võistlusprogrammeerimist rahvusvaheliste konkurentidega; hea võimalus hinnata oma taset rahvusvahelisel areenil)
- AtCoder (sarnane Codeforces'ile)
- CSES (peamiselt standardülesannete kogu, kogenud osaleja võiks osata paljud ülesanded siit "une pealt" ära lahendada)
- Sphere online judge (alternatiivne informaatikaülesannete sait)
- UVA online judge (alternatiivne informaatikaülesannete sait)
Miks ülesanded nii lihtsad/rasked/erineva tasemega on?
Osad ülesanded (nt lahtise võistluse esimesed ülesanded) on meelega tehtud võimalikult lihtsad, et ka programmeerimist äsja alustanud õpilased neid teha oskaks. Oskad mõne ülesande 2 minutiga ära teha? Suurepärane, võta järgmine ülesanne!
Osad ülesanded on sihitud neile, kelle eesmärgiks on rahvusvaheliselt olümpiaadilt medalit võita, arvestusega, et see oleks piisavalt suur väljakutse. Kui sa ei oska mõnd sellist ülesannet üldse teha, siis ära heida meelt, harjutamine teeb meistriks.
Kuna Eestis pole programmeerimist oskavate õpilaste arv just hiiglaslik, ei saa igale tasemele eraldi võistlust korraldada ja nii võib mõnel võistlusel (eriti lahtisel) olla väga erineva raskusega ülesandeid. Selline lähenemine võimaldab leida pingerea nii tugevamate kui ka algajamate võistlejate vahel. Ideaalne pingerida on selline, kus vahed on võimalikult ühtlased, mitte ei ole kusagil mikroskoopiliste, statistiliselt mitteoluliste vahedega troppi. Seetõttu katsutakse ülesannete komplektid disainida selliselt, et tulemuste jaotus on võimalikult lähedane lineaarsele: ideaalis on meil üks võitja, kes suudab saavutada 100% punktidest, pooled võistlejad saavad vähemalt pooled punktid jne.