Dit is de gearchiveerde website van de CodeCup NIO 2016.
Klik hier om naar de huidige website te gaan.
CodeCup NIO 2016 - Een online programmeerwedstrijd.  

CodeCup NIO 2016 - Een online programmeerwedstrijd.

2187

Het spel 2187 is een variant op het welbekende spel 2048. Dit spel wordt met één speler gespeeld, terwijl 2187 met twee spelers gespeeld wordt. De twee spelers noemen we A en B en ze spelen om de beurt, waarbij A mag beginnen. Ze leggen volgens een vast protocol (zie hieronder) soms een steen op het bord en schuiven soms de stenen op het bord naar een zijkant, zoals ook gebeurt in het spel 2048. Er worden geen willekeurige stenen met een 2 of met een 4 geplaatst: de spelers plaatsen zélf stenen met waarde 1 op het bord.

Het doel van het spel is om samen zoveel mogelijk punten op het bord te krijgen. De score is gelijk aan de som van de waarde van de stenen. Het maximum aantal punten dat jullie samen op het bord kunnen krijgen, wordt jullie gezamenlijke score. Het maakt niet uit of deze maximum score onderweg op het bord komt, of dat deze tegen het einde wordt bereikt.

Het gebruikte bord is 4 bij 4 hokjes en is bij het begin van het spel leeg.

Zettenvolgorde – Het protocol

In 2187 bestaan niet alleen stenen met verschillende getallen erop, maar hebben de stenen ook twee verschillende kleuren: blauw en rood. In andere spellen zijn alle zetten qua type hetzelfde, maar omdat dit hier niet het geval is, is het nodig dat duidelijk is vastgesteld in welke volgorde welke zetten gedaan worden. Zie hiervoor de volgende tabel:

SpelerActie
1APlaats een blauwe steen
2BPlaats een rode steen
3APlaats een rode steen
4BPlaats een blauwe steen
5ASchuif het bord
6BSchuif het bord

Deze zes acties herhalen zich tot het spel afgelopen is. Het spel is afgelopen als er op een gegeven moment geen geldige zet meer gedaan kan worden, of wanneer er in totaal 1000 zetten zijn gedaan.

Spelmechaniek

Een speler kan een steen plaatsen op een willekeurig leeg vakje. Als dit niet meer kan omdat het bord vol is, is het spel afgelopen. Als een speler een steen moet plaatsen, moet die de coördinaten van het doelvakje als twee cijfers uitvoeren, zonder spatie ertussen, met eerst de rij, de horizontale coördinaat en dan de kolom, de verticale. In het volgende plaatje liggen er stenen op de posities 11, 14, 33 en 42.

Als een speler het bord moet schuiven, heeft die vier opties. Er kan vier kanten op geschoven worden: naar boven (U), naar rechts (R), naar links (L) en naar beneden (D). Schuifzetten worden aangeduid met één hoofdletter.

Stel, als voorbeeld, dat de speler naar boven schuift in het volgende bord. Aan de hand van dit voorbeeld wordt uitgelegd hoe de schuiflogica werkt.

Voor het schuivenNa het schuiven (naar boven)

In de linkerkolom staan drie stenen: twee rode stenen met een 3 en daaronder een blauwe 3. Bij het naar boven schuiven gaan die twee rode stenen samen tot een 9 (de volgende macht van 3) omdat ze hetzelfde getal en dezelfde kleur hebben. De blauwe 3 blijft dan over en schuift er onder tegenaan. Resultaat is een rode 9 met daaronder een blauwe 3.

In de tweede kolom staan een rode 1, een blauwe 1, nog een blauwe 1 en een rode 1. Van bovenaf bekeken (we schuiven immers naar boven) zien we eerst twee stenen met hetzelfde getal maar met verschillende kleuren. Om deze reden gaan de stenen niet samen, maar verdwijnen ze juist allebei. Hetzelfde geldt voor de blauwe 1 en de rode 1 die eronder staan: gelijke getallen zorgen ervoor dat ze met elkaar reageren, maar verschillende kleuren zorgen dat ze niet samen gaan tot de volgende macht van 3, maar elkaar vernietigen. In de eerste kolom was te zien dat als de kleuren juist hetzelfde zijn, de stenen wel samengaan tot de volgende macht van 3.

In de derde kolom staan twee blauwe stenen met een 9. Bij het naar boven schuiven gaan deze tegen elkaar aan en omdat het getal en de kleur gelijk zijn, gaan ze samen tot de volgende macht van 3.

30 31 32 33 34 35 36 37
1 3 9 27 81 243 729 2187

In de laatste kolom zien we van bovenaf eerst een rode 9 en een blauwe 3. Deze reageren niet met elkaar. Als volgende mogelijkheid zien we een blauwe 3 en een blauwe 1. Deze reageren ook niet met elkaar. Als volgende mogelijkheid zien we een blauwe 1 en nog een blauwe 1. Deze getallen zijn wel gelijk, en omdat de kleuren ook gelijk zijn, gaan deze samen tot een blauwe 3. Door dit samengaan komen er twee blauwe stenen met een 3 boven elkaar, maar deze reageren niet meer met elkaar in deze schuifactie. Deze zouden pas reageren als hierna nog een keer naar boven geschoven zou worden.

In het kort is de mechaniek van het schuiven dus als volgt. Je kijkt vanaf de kant waar je naartoe schuift in volgorde naar de stenen die je tegenkomt. Als twee opeenvolgende stenen een gelijk getal hebben, reageren ze met elkaar. Als ze dan ook nog dezelfde kleur hebben, gaan ze samen tot de volgende macht van 3, anders vernietigen ze elkaar. Als de stenen niet dezelfde getallen hebben, reageren ze niet. Daarna kijk je naar de stenen die dan volgen. Aan het eind schuif je alle resterende stenen naar desbetreffende kant.

Als er als gevolg van een schuifactie geen enkele verandering optreedt, is die schuifactie ongeldig. Als er een schuifzet aan de beurt is en er is geen geldige schuifactie (als het bord óf leeg óf vol is zonder naastgelegen gelijke getallen), ook dan is het spel afgelopen.

Opgave:

Jij moet een programma schrijven dat een zet van je medespeler ontvangt via de jurysoftware en dat vervolgens een zet teruggeeft aan de jurysoftware. Het is aan jou de taak om aan de hand van de laatste informatie een zo goed mogelijke zet te bepalen!

De zetten van de jurysoftware moet je lezen vanaf stdin (standaard input) en je eigen zetten moet je afdrukken naar stdout (standaard uitvoer).

Als eerste actie moet je programma er achter komen of je als A of als B speelt. De eerste regel die je programma inleest bestaat uit een ‘A’ of een ‘B’. Als je programma ‘A’ inleest dan speel je als A en dan wordt jouw eerste zet als reactie verwacht. In het andere geval speel je dus als B en is de volgende string die je gekregen hebt de eerste zet van speler A. Je mag er vanuit gaan dat die zet altijd correct is. Dan wordt van jou de eerste tegenzet verwacht. Zo gaat dat door tot het spel is afgelopen.

Als je programma een ongeldige zet doet, of als je programma crasht of er te lang over doet, dan wordt je programma afgesloten. In dat geval neemt de jurysoftware jouw taak over zodat het andere programma het spelletje kan uitspelen. De jurysoftware zal sportief meespelen om je tegenstander de gelegenheid te geven om een goede score te kunnen halen. Als je programma "Quit" inleest in plaats van een gewone zet, dan betekent het dat het spel is afgelopen en dat je jouw programma op de normale manier moet beëindigen.

Als je een zet doorgeeft aan de jurysoftware moet je de string verplicht afsluiten met een newline. Ook ben je verplicht om je uitvoer daarna te flushen zodat de jurysoftware niet gaat zitten wachten totdat de computer de zet heeft doorgegeven aan de jurysoftware (Zie de uitleg bij de technische regels)

Met alle ingezonden programma's die in staat zijn samen te werken met onze jurysoftware wordt een toernooi georganiseerd.

Beide programma’s krijgen na afloop van een spel de hoogste score die op het bord gelegen heeft tijdens het spel. Als jouw programma tijdens een spelletje wordt gediskwalificeerd, krijg je echter 0 punten. De andere speler krijgt het aantal punten zoals dat in de regels hierboven is uitgelegd.

Communicatie voorbeeld:

SpelerInvoerUitvoer
AA
BB
A11
B1123
A2344
B4421
A21U
BUR
.........

Als het spel is afgelopen krijgen beide spelers een "Quit" toegestuurd, en hebben ze de gelegenheid hun programma netjes af te sluiten.

Je programma heeft 60 seconden de tijd om een spel te spelen. De tijd die de tegenstander heeft wordt niet meegeteld.