Järjestäjä: Metabolix
Morabaraba on Etelä-Afrikassa suosittu lautapeli, joka muistuttaa meikäläistä myllyä. Pelissä pyritään muodostamaan pelinappuloista laudalle kolmen suoria, ja kun muodostaa suoran, saa ottaa vastustajalta yhden nappulan pois. Pelin häviää, jos jäljellä on enää kaksi nappulaa. Tässä kilpailussa on tehtävänä ohjelmoida tekoäly morabarabaan.
Kilpailu alkaa perjantaina 10.1.2014 kello 18.00 ja päättyy sunnuntaina 9.2.2014 kello 18.00.
Pelilauta koostuu kolmesta sisäkkäisestä neliöstä. Lisäksi neliöiden vastaavat nurkat sekä vastaavat sivujen keskikohdat on yhdistetty viivoilla. Pelinappuloita kutsutaan lehmiksi, ja ne voivat olla laudalla viivojen risteyskohdissa. Samalla suoralla viivalla olevaa kolmen lehmän riviä kutsutaan myllyksi. Oheisessa kuvassa ruskeat ruudut ovat vapaita ja valkoiset ja mustat ovat pelaajien käytössä ja punaisilla soikioilla on merkitty kaikki myllyt.
Pelin alussa kummallakin pelaajalla on 12 lehmää. Ensimmäisillä 12 kierroksella eli 24 vuorolla asetellaan lehmiä laudalle. Myöhemmillä kierroksilla siirretään aina yksi lehmä viivaa pitkin johonkin viereisistä vapaista kohdista. Pelaaja, jolla on jäljellä vain kolme lehmää, voi siirtää lehmän mihin tahansa vapaaseen kohtaan laudalla.
Kun pelaaja muodostaa laudalle myllyn, hän saa ampua eli poistaa laudalta yhden vastustajan lehmän. Ensisijaisesti täytyy ampua lehmä, joka ei ole myllyssä, mutta jos kaikki vastustajan lehmät ovat myllyssä, saa ampua minkä tahansa. Vaikka samalla vuorolla muodostuisi useampi mylly, saa ampua vain yhden lehmän.
Jos siirto hajottaa oman myllyn ja muodostaa toisen, heti seuraavalla vuorolla ei saa muodostaa uudestaan juuri hajotettua myllyä.
Pelin häviää se, jolla on ensiksi jäljellä enää kaksi lehmää. Pelin häviää myös, jos joutuu tilanteeseen, jossa ei ole laillista siirtoa, tai jos tekee laittoman siirron. Jos jommallakummalla pelaajalla on vain kolme lehmää ja kumpikaan ei saa myllyä 10 vuoron eli viiden kierrosen aikana, peli päättyy tasan. Lisäksi peli päättyy tasan, jos kumpikaan ei saa myllyä 200 vuoron aikana.
Kaikki tekoälyt pelaavat vastakkain, ja kumpikin saa vuorollaan aloittaa. Jokainen tekoäly pelaa myös itseään vastaan. Tasapelistä ei saa pisteitä. Muulloin voittaja saa f(V) pistettä ja häviäjä menettää 1-f(H) pistettä, missä H on häviäjän ja V voittajan käyttämä aika sekunteina ja f(x) on 2/(1+exp(x*x/100)). Toisin sanoen voittajaa palkitaan nopeudesta ja häviäjää sakotetaan hitaudesta. Jos voittaja käyttää 2 sekuntia, pisteitä tulee 0,98, ja jos aikaa kuluu 30 sekuntia, pisteitä ei heru enää käytännössä lainkaan.
Jos tuloksiin jää vielä tasatilanteita, vertaillaan tasoissa olevien tuloksia toisiaan vastaan.
Tekoäly on käynnissä yhden pelin alusta loppuun. Se on komentoriviohjelma, joka lukee kilpailuohjelman syötettä (vastustajan siirtoja) kuten yleensä käyttäjän syötettä (näppäimistöä) ja tulostaa joka kierroksella vastauksensa kuten ruudullekin. Ohjelman toiminnasta on esimerkkejä joillakin yleisillä kielillä. Huomio! Useissa kielissä pitää tulostuksen jälkeen kutsua flush-funktiota, kuten esimerkkiohjelmissa tarvittaessa tehdään.
Kun ohjelma käynnistetään, sille syötetään vuoronumero, joka on 1 tai 2. Ohjelman täytyy vastata rivillä, jolla on sen oma nimi. Tämän jälkeen pelaaja 1 aloittaa pelin.
Tekoälyn täytyy omalla vuorollaan tulostaa siirtonsa ja vastustajan vuorolla lukea vastustajan siirto. Siirto muodostuu yhdeksästä välilyönnein erotellusta luvusta, jotka kuvaavat kolmea eri kohtaa pelilaudalla: ensimmäiset kolme lukua kertovat, mistä lehmä siirretään; toiset kolme kertovat, mihin lehmä siirretään; viimeiset kolme kertovat, mistä vastustajan lehmä ammutaan. Pelin alussa, kun lehmiä vasta asetellaan, ensimmäisten kolmen luvun täytyy olla nollia. Jos myllyä ei muodostu eli vastustajan lehmää ei ammuta, viimeisten kolmen luvun täytyy olla nollia.
Pelilaudan eri kohdat merkitään seuraavasti: Ensimmäinen luku kertoo sijainnin vaakasuunnassa: 1 on neliön vasen reuna, 2 on neliön keskiosa ja 3 on neliön oikea reuna. Toinen luku kertoo sijainnin pystysuunnassa: 1 on neliön alareuna, 2 on neliön keskiosa ja 3 on neliön yläreuna. Kolmas luku kertoo, mikä neliö on kyseessä: 1 on uloin, 2 on keskimmäinen ja 3 on sisin. Oheisessa mallikuvassa ovat kaikkien ruutujen koordinaatit.
Jos ohjelma asettaa lehmän uloimman neliön yläreunan keskelle, rivi näyttää tältä:
0 0 0 2 3 1 0 0 0
Jos ohjelma siirtää lehmän laudan vasemmasta yläkulmasta alareunaan keskelle ja ampuu lehmän sisimmän neliön oikean reunan keskeltä, rivi näyttää tältä:
1 3 1 2 1 1 3 2 3
Kun peli päättyy, ohjelmalle syötetään rivi, jolla on yhdeksän nollaa. Tällöin ohjelman pitää sulkeutua.
0 0 0 0 0 0 0 0 0
Jos ohjelma kaatuu, ylittää aikarajan tai tekee virheen, se sammutetaan ja se häviää ottelun.
Ohjelma saa käyttää kokonaisuudessaan enintään 512 megatavua muistia ja enintään 120 sekuntia laskenta-aikaa kussakin ottelussa. Ohjelman ajankäyttö pitää mitoittaa sen mukaan, että testikoneen x86-64-prosessorin kellotaajuus on 2,0 GHz. Kilpailussa mitataan aikaa, jonka ohjelma itse käyttää, eli jos ohjelma joutuu odottamaan vastustajan siirtoa, kello ei käy. Ajankäytössä on syytä huomioida myös pistelasku.
Ohjelman pitää toimia joka ajokerralla samalla tavalla. Satunnaislukuja ei saa käyttää. Kellonaika ja tietokoneen nopeus eivät saa vaikuttaa tekoälyn toimintaan.
Ohjelman pitää keskittyä pelaamaan pelejä kunnolla. Kaikenlainen vilppi johtaa hylkäykseen.
Oman tekoälyn toimintaa voi testata testausohjelmalla, jossa kaksi pelaajaa (ihmistä tai tekoälyä) voi pelata vastakkain. Testaaminen vaatii Java-tuen. Testausohjelma ei sisällä ajanottoa, muistirajaa eikä muitakaan erityisiä tarkistuksia.
Jokaisella ohjelmalla on oltava nimi, jonka pituus on 3–9 merkkiä ja joka muodostuu pelkästään kirjaimista a–z ja A–Z ja numeroista 0–9.
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.
Ilmoittautumiseen tarvitaan seuraavat tiedot:
Tiedot voi antaa netissä tai lähettää sähköpostitse osoitteeseen kilpailu@ohjelmointiputka.net. Ilmoittautumisen on oltava perillä kilpailuajan puitteissa. Tiedot julkaistaan kilpailun tulossivulla; jos ehdottomasti ei halua nimeään tai nimimerkkiään julki, asiasta voi mainita viestissä.
Osallistumisesta lähetetään sähköpostitse vahvistus muutaman päivän kuluessa. Tekoäly myös testataan lyhyesti, ja ilmenneistä virheistä kerrotaan vahvistusviestissä. Uusia versioita saa lähettää kilpailuajan loppuun asti; viimeinen toimiva versio katsotaan lopulliseksi.
Kilpailuun saa halutessaan osallistua myös usealla eri ohjelmalla, kunhan niiden toimintaperiaatteet ovat selvästi erilaiset.
Kysymyksiä ja palautetta kilpailusta voi lähettää sähköpostitse tai keskusteluun.