Kuurupiilo

Versio 2019-12-25

Sivut:


Jotta voit testata omaa tekoälyäsi, tallenna tämä sivu ja avaa se omalta koneeltasi. Oman tekoälyn testaamista varten lataa KilpailuProxy, lue sen ohjeet mukana tulevasta HTML-tiedostosta ja käynnistä tekoälysi sen avulla.

Jos et halua lisätä omaa tekoälyä, siirry pelaamaan.

KilpailuProxy

Syötä KilpailuProxyn hallintaosoite alla olevaan tekstikenttään. Jos yhteys toimii, asetuksiin määritellyt ohjelmat tulevat seuraavan sivun pelaajavalikkoon.

Status: -

Muut WebSocket-ohjelmat

Tässä voit lisätä muita WebSocket-ohjelmia, esimerkiksi muiden kilpailijoiden antamia osoitteita.

@

JavaScript-ohjelmat

Tässä voit lisätä valikkoon JavaScript-ohjelmia, esimerkiksi muiden kilpailijoiden antamia harjoitusvastuksia. Ohjelman pitää olla yksi asynkroninen JavaScript-funktio. Sille annetaan parametreina asynkroninen lukufunktio ja tulostusfunktio. JavaScriptissa funktion sisällä voi olla muita funktioita ja näitä varten ”globaaleja” muuttujia. Laatikossa on tästä yksinkertainen esimerkki.

Ohjelman runko Node.js:lle, SpiderMonkeylle ja selaimeen (kaikki samassa)
(function() {
	// Ohjelma async-funktiona, kuten yllä esimerkissä.
	async function jstesti(input, output) {
		// ...
	}

	// Ohjelman suoritus.
	const ohjelma = jstesti;
	if (typeof window == "undefined") (async function run() {
		let finished = false, lines = [], promises = [];
		const exit = s => {
			try { process.exit(s) } catch (ex) {}
			try { quit(s) } catch (ex) {}
		};
		const output = s => {
			try { process.stdout.write(s + "\n") } catch (ex) {}
			try { print(s) } catch (ex) {}
		};
		const addInput = s => {
			if (promises.length) {
				promises.shift()(s);
			} else {
				lines.push(s);
			}
		};
		const input = () => {
			if (finished) return;
			try { addInput(readline()); } catch (ex) {}
			if (lines.length) return lines.shift();
			return new Promise(r => promises.push(r));
		};
		try {
			require("readline").createInterface({input: process.stdin}).on("line", addInput).on("close", () => finished = true);
		} catch (ex) {
		}
		try {
			await ohjelma(input, output);
			exit(0);
		} catch (ex) {
			output("ERROR: " + ex);
			console.error(ex);
			exit(1);
		}
	})();
	return ohjelma;
}())

Pelin asetukset

Pelin nopeus: kierrosta sekunnissa

Pelilaudan siemenluku: (0 = satunnainen)

Pelaajat

Pelin säännöt

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.

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ä.

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. Huomio! Useissa kielissä pitää tulostuksen jälkeen kutsua flush-funktiota tai vastaavaa.

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

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.)

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.

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.

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ä.

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.

Huomioita testaussivusta

Ohjelma tehdään kilpailuun komentoriviohjelmana varsinaisten kilpailuohjeiden mukaisilla kielillä. Ohjelma yhdistetään tähän sivuun KilpailuProxylla, kuten Asetukset-sivulla neuvotaan.

Pelin koordinaatisto on oikeakätinen, eli ruudulla y-koordinaatti kasvaa alhaalta ylös ja x-koordinaatti vasemmalta oikealle. Testaussivulla näkyvän pelin mittakaava on 1:4, eli yksi pikseli on 4 pelin mittayksikköä.

Reitti voi näyttää ruudulla mutkittelevalta, koska kokonaislukulaskujen takia lyhin reitti ei kulje aina suoraan. Toisaalta usean peräkkäisen esteen kiertäminen ei välttämättä suju automaattisesti tehokkainta tai toivottua reittiä, joten omaa ohjelmaa tehdessä voi olla hyvä kiinnittää huomiota myös reitinvalintaan.

Testaussivun antamat tiedot ajan- ja muistinkäytöstä riippuvat koneesta eivätkä siis suoraan vastaa kisakoneella saatavia tuloksia.

Jos ihmispelaajia on monta, näppäimistöllä valitaan ohjattava pelaaja. Ruudulta klikataan kulkusuunta. Peli alkaa, kun kaikki piiloutujat ovat alkaneet liikkua. Jos ihmisiä ei ole pelissä, voit klikkaamalla valita tekoälyn, jonka näkökulmasta peli näytetään.

Pelin nopeus: kierrosta sekunnissa

Pelin yhteenveto tulee lopuksi peliruudun alapuolelle.


Turnauksen kulku koodataan JavaScriptilla seuraavan esimerkin mukaisesti. Ottelutiedot tallennetaan KilpailuProxyn kautta, joten tarkista sen asetukset!

Turnausskripti: Tiedosto:

Tässä voit ladata aiemman pelin katsottavaksi. Tähän tarvitaan JSON-data, joka näkyy pelisivun alareunassa ottelun päättyessä tai jonka KilpailuProxy tallentaa.

Pelin nopeus: kierrosta sekunnissa

Tiedosto:

Data: