Kirjautuminen

Haku

Tehtävät

Kilpailu

Ohjelmoi tekoäly!
Aikaa on 6.1. saakka.

Kilpailut: Kuurupiilo

Järjestäjä: Metabolix

Vuodenvaihteen 2019–2020 tekoälykilpailussa leikitään kuurupiiloa. Pisteitä saa sen mukaan, kuinka kauan onnistuu pysymään piilossa ja kuinka nopeasti löytää muita.

Kilpailuaika

Kilpailu alkaa sunnuntaina 1.12.2019 ja päättyy maanantaina 6.1.2020 klo 20.00.

Vaaditut taidot

Kisaan voi osallistua, jos osaa tehdä komentoriviohjelman, joka tulostaa kaksi kokonaislukua. Sallitut ohjelmointikielet on lueteltu jäljempänä. Kaikkia yksityiskohtia säännöistä ja matematiikasta ei tarvitse ymmärtää.

Pelin kulku

Pelaajat aloittavat pelialueen keskeltä. Kolme ensimmäistä pelaajaa ovat etsijöitä, ja muut piiloutuvat. Pelialueella on tätä varten pyöreitä esteitä. Piiloutujilla on 200 kierrosta etumatkaa, ennen kuin etsijöiden peli alkaa. Tämän jälkeen pelaajan on parasta vältellä etsijöitä: pelaaja putoaa pelistä, jos pysyy etsijöiden näköpiirissä yhtämittaisesti 50 kierroksen ajan.

Pelimaailmassa koordinaatit ovat -1100 ≤ x, y ≤ 1100. Pelaajat aloittavat koordinaateista (0, 0). Pelaajaa kuvaa ympyrä, jonka säde on 32. Pelaaja liikkuu pelissä ilmoittamalla koordinaatit, joihin haluaa päästä. Kohdesijainnin on oltava pelialueella. Pelaajaa liikutetaan automaattisesti kohteeseen päin, kunnes pelaaja on päämäärässään tai valitsee uuden kohteen. Jos pelaajan valitsema kohde on esteen sisällä, pelaajaa kuljetetaan lähimpään kohtaan esteen reunalle, ja kun pelaaja saavuttaa kohdettaan lähimmän pisteen, pelaaja pysähtyy siihen. Pelaaja liikkuu enintään 8 yksikköä per kierros, ja pelaaja siirtyy aina kokonaislukukoordinaatteihin. Alkupisteestä voi siis päästä esimerkiksi kohtaan (8, 0) tai (7, 3) tai (4, -6). Pelaajien ei tarvitse väistää toisiaan.

Esteet ovat ympyröitä, esteen säde on enintään 180, ja esteitä on enintään 40. Pelaaja väistää automaattisesti esteet niin, että ympyrät eivät osu toisiinsa. Toisin sanoen pelaajan sijainnin ja esteen sijainnin välinen etäisyys on aina suurempi kuin pelaajan säteen ja esteen säteen summa. Etäisyyden voi tarkastaa koordinaateista Pythagoraan lauseella.

Esimerkki Pythagoraan lauseen käytöstä sallitun etäisyyden tutkimiseen:
(p.x - este.x) ** 2 + (p.y - este.y) ** 2 > (p.säde + este.säde) ** 2,
missä ** on potenssilasku eli luku ** 2 tarkoittaa luku * luku.

Pelaaja näkee toisen, jos pelaajien koordinaattien välinen jana ei kulje minkään esteen kautta eikä edes sivua estettä. Joka kierroksen alussa pelaaja saa tiedon kaikista niistä pelaajista, jotka itse näkee. Etsijä saa tiedon kaikista, jotka edes joku etsijöistä näkee, eli etsijät voivat tehdä helpommin yhteistyötä. Pelaajasta kerrottavat tiedot ovat pelaajan numero, pelaajan nykyiset koordinaatit (x, y), pelaajan kulkukohteen koordinaatit (kohde_x, kohde_y) ja kierrosmäärä, kuinka kauan pelaaja on parhaillaan ollut etsijöiden näkyvillä. Jos pelaaja on etsijöiltä piilossa, kierrosmääränä on 0. Etsijän kohdalla kierrosmääränä on aina -1. Pelaaja jatkaa kesken olevan liikkumisensa loppuun silloinkin, kun on jo muuten pudonnut pelistä. Jos pelaajan kohde olisi esteen sisällä ja pelaaja on jo mahdollisimman lähellä kohdetta, pelaajan kohteeksi merkitään pelaajan saavuttama sijainti.

Aina 4800 kierroksen jälkeen esteet pienenevät: esteen säteeksi tulee 3/4 aiemmasta säteestä (pyöristettynä pienempään kokonaislukuun), ja jos säde on tämän myötä 8 tai alle, este poistetaan kokonaan. Esteiden pienentäminen varmistaa sen, että kaikki piiloutujat joutuvat näkyville lopulta – viimeistään, kun viimeinenkin este katoaa. Huomio! Etsijöiden peli alkaa 200 kierrosta myöhemmin, eli etsijän näkökulmasta esteet pienenevät ensimmäisen kerran jo 4600 kierroksen jälkeen!

Pisteitä jaetaan siitä alkaen, kun etsijät pääsevät liikkeelle. Piiloutuja saa joka kierroksella 3 pistettä, kunnes putoaa pelistä. Etsijä saa joka kierroksella miinuspisteitä sen verran, kuin piiloutujia on vielä mukana. Peli päättyy, kun kaikki piiloutujat ovat pudonneet pelistä.

Kilpailun kulku

Kilpailussa pelataan satunnaisilla pelialueilla. Kaikki kolmen etsijän yhdistelmät käydään läpi. Piiloutujina ovat kaikki loput osallistujat, jos resurssit riittävät kaikkien ohjelmien ajamiseen yhtä aikaa. Muuten valitaan jokin vaihtoehtoinen tasapuolinen turnaustapa.

Jos kisan aikana osoittautuu, että piiloutuminen kolmelta etsijältä on liian vaikeaa, voidaan pelata sen sijaan kahden varsinaisen etsijän yhdistelmät niin, että kolmas etsijä pysyy aina paikallaan. Mikäli tällainen muutos alkaa näyttää todennäköiseltä, asiasta ilmoitetaan keskustelussa ja näissä säännöissä.

Pelattavien pelien määrä riippuu osallistujien määrästä ja nopeudesta.

Jos tekoälyn peli keskeytyy virheen tai kaatumisen tai muun syyn vuoksi, pelaajaa ei voi enää ohjata mutta pisteet kertyvät pelin loppuun saakka normaalien sääntöjen mukaan. Jos tekoäly ylittää aikarajan, se saa sakkopisteen jokaisesta aikarajan ylittävästä millisekunnista.

Lopputuloksissa piiloutujan pisteet ja etsijän miinuspisteet lasketaan yhteen ja niistä vähennetään vielä mahdolliset sakkopisteet.

Ohjelman toiminta

Tekoäly on käynnissä aina yhden pelin ajan. Se on komentoriviohjelma, joka lukee kilpailuohjelman syötettä (muiden siirtoja) kuten yleensä käyttäjän syötettä (näppäimistöä) ja tulostaa joka kierroksella oman siirtonsa kuten ruudullekin. Ohjelman toiminnasta on esimerkkejä joillakin yleisillä kielillä. Huomio! Useissa kielissä pitää tulostuksen jälkeen kutsua flush-funktiota, kuten esimerkkiohjelmissa tarvittaessa tehdään.

Ohjelman suoritus alkaa tervehdyksestä. Ohjelman pitää ensin tulostaa rivi, jolla on ohjelman nimi ja versio vapaassa muodossa.

esim v1

Ohjelmalle syötetään rivi 2019-kuurupiilo merkiksi, että kyseessä on tämän sivun mukainen peli. (Jos ohjelmalle syötetään sen sijaan tervehdysrivi ping, ohjelman tulee vain sammua heti. Testaussivu hakee tällä tavalla ohjelman versionumeron turnausta varten.)

2019-kuurupiilo

Tämän jälkeen ohjelmalle syötetään yhdellä rivillä välilyönneillä eroteltuina seuraavat kokonaisluvut: pelaajien määrä, pelaajan oma numero, esteiden määrä ja järjestyksessä jokaisen esteen tiedot (x-koordinaatti, y-koordinaatti, säde). Pelaajien numerointi alkaa ykkösestä. Ensimmäiset pelaajat (1, 2, 3) ovat etsijöitä. Ohjelma voi olettaa, että pelissä on enintään 100 pelaajaa. Esteitä on enintään 40.

Seuraavalla rivillä kerrotaan, että pelissä on 5 pelaajaa, tämä pelaaja on numero 4 (eli piiloutuja) ja esteitä on 3. Esteiden tiedot (x, y, säde) ovat (400, 520, 80), (-500, -600, 100) ja (-900, 13, 67).

5 4 3 400 520 80 -500 -600 100 -900 13 67

Joka kierroksella ohjelmalle syötetään yksi rivi. Jos rivi on 0, peli päättyy ja ohjelman täytyy sulkeutua. Muuten rivin ensimmäinen luku kertoo, monenko pelaajan tiedot rivillä on. Tätä seuraavat järjestyksessä kustakin pelaajasta kuusi lukua: pelaajan numero, x-koordinaatti, y-koordinaatti, kulkukohteen x-koordinaatti ja y-koordinaatti sekä tieto, monellako peräkkäisellä kierroksella pelaaja on ollut etsijöiden näkyvillä. Etsijän kohdalla kierrosmääränä on -1. Myös pelistä pudonneet pelaajat näkyvät, kierrosmääränä on silloin 50. Pelaaja näkee aina vähintään itsensä, ja etsijät näkevät aina toisensa sijainnista riippumatta.

Seuraavalla rivillä kerrotaan, että näkyvillä on 2 pelaajaa. Pelaaja numero 1 on kohdassa (20, 20) ja on menossa kohtaan (40, 50) ja on etsijä. Pelaaja numero 4 on kohdassa (30, 50) ja on menossa kohtaan (-200, -500) ja on ollut etsijän näkyvillä nyt 17 kierrosta.

2 1 20 20 40 50 -1 4 30 50 -200 -500 17

Joka kierroksella ohjelman täytyy tulostaa välilyönnillä erotettuina x-koordinaatti ja y-koordinaatti, joita kohti pelaaja kulkee, tai pelkkä =-merkki, jos pelaaja jatkaa edelleen aiempaan kohteeseensa. Koordinaatit ilmoitetaan kokonaislukuina, ja niiden täytyy olla pelialueen sisällä.

Tämä pelaaja kulkisi koordinaatteihin (1100, -1100) eli aivan pelialueen kulmaan.

1100 -1100

Tämä pelaaja jatkaisi aiempaan kohteeseen (tai pysyisi paikallaan, jos on jo perillä).

=

Ohjelman rajoitukset

Ohjelma saa käyttää yhdessä ottelussa kokonaisuudessaan muistia enintään 128 megatavua ja laskenta-aikaa 2 millisekuntia per kierros + 5 sekuntia. Ohjelma ei saa mitata aikaa, vaan ajankäyttö pitää valmiiksi suunnitella. Testikoneessa on 2,3 GHz:n x86-64-prosessori (Intel i3-2350M). Kilpailussa mitataan aikaa, jonka ohjelma itse käyttää, eli jos ohjelma joutuu odottamaan vastustajan siirtoa, kello ei käy. Vähäiset resurssien ylitykset arvioidaan tapauskohtaisesti.

Aikarajassa pysyminen vaatii joko erittäin nopeaa päätöksentekoa tai ratkaisun, jossa ohjelma laskee uuden suunnan vain tarvittaessa ja muuten jatkaa entisellä reitillään.

Tässä kilpailussa on sallittua käyttää satunnaisuutta, mutta on osallistujan vastuulla huomioida, että satunnaisluvut voivat kilpailussa osua tekoälylle epäedullisesti tai eri tavalla kuin omalla koneella.

Ohjelman peli keskeytyy, jos se kaatuu, ylittää selvästi aikarajan tai tekee muun merkittävän virheen. Muistirajan ylitys voi kaataa ohjelman. Ohjelma voidaan hylätä, jos vika toistuu monessa ottelussa. Ohjelma voidaan hylätä myös, jos se katsotaan hyvän tavan tai kilpailun hengen vastaiseksi.

Testaussivu

Peliä ja oman tekoälyn toimintaa voi testata testaussivulla. Testaussivun antamat tiedot ajan- ja muistinkäytöstä riippuvat koneesta eivätkä siis suoraan vastaa kisakoneella saatavia tuloksia.

Ohjelman nimi

Ohjelmalla täytyy olla nimi. Ohjelman nimen pituus on 3–12 merkkiä. Nimi alkaa kirjaimella ja muodostuu pelkästään kirjaimista a–z ja A–Z ja numeroista 0–9.

Ohjelmointikieli

Kilpailukoneella on kääntäjiä ja tulkkeja monille ohjelmointikielille. Mikäli kuitenkin sopiva kieli puuttuu listalta, lähetä sähköpostia tai osallistu keskusteluun, niin selvitetään, voiko asialle tehdä jotain.

Tuetut ohjelmointikielet versioineen:

Tekoälyjen tulee pitäytyä kielten perusominaisuuksissa; kääntäjästä, kirjastoista, käyttöjärjestelmästä tai prosessorin tyypistä riippuvaisia ominaisuuksia ei pidä käyttää. Ohjelman on toimittava yllä mainituilla välineillä 64-bittisessä GNU/Linux-käyttöjärjestelmässä.

Käännöksissä käytetään kohtuullisia optimointiasetuksia, esimerkiksi GCC:llä ja FPC:llä valitsinta -O2.

Osallistuminen

Ilmoittautumiseen tarvitaan seuraavat tiedot:

Tiedot julkaistaan kilpailun tulosten yhteydessä. Tiedot voi antaa netissä tai lähettää sähköpostitse osoitteeseen kilpailu@ohjelmointiputka.net. Samaa reittiä voi myös lähettää tekoälystä uusia versioita tai ilmoittaa muista muutoksista tietoihin. Ilmoittautumisen ja muutosten on oltava perillä kilpailuajan puitteissa. Osallistumisesta lähetetään sähköpostitse vahvistus muutaman päivän kuluessa, ja samalla kerrotaan, onko tekoälyssä jo heti ilmennyt jokin merkittävä vika.

Kilpailuun saa halutessaan osallistua myös usealla eri ohjelmalla, kunhan niiden toimintaperiaatteet ovat selvästi erilaiset eikä herää epäilystä, että ne erityisesti edistäisivät toistensa voittoa. Aivan samanlaisia ohjelmia ei hyväksytä kilpailuun muutenkaan.

Tarkennuksia

Kysymyksiä ja palautetta kilpailusta voi lähettää sähköpostitse tai keskusteluun.

Tietoa sivustosta