Programming Contest Contest 5 : Tuintopia
Inhoudsopgave
- Eerdere contests
- Inleiding
- De opdracht
- Het huis
- Uitvoer
- Spelregels
- De regels en andere afspraken
- Hoe worden de inzendingen beoordeeld?
- Wat kan ik eigenlijk winnen?
- Om je op weg te helpen
- Tot slot...
Eerdere contests
- Programming Contest Nieuwe Stijl: Contest 1 *uitslagen!*
- Programming Contest Nieuwe Stijl: Contest 2 *WINNAARS LEZEN*
- Programming Contest Nieuwe Stijl: Contest 3 *uitslagen!*
- Programming Contest Nieuwe Stijl: Contest 4 *Score-update*
Inleiding
Na het grote succes van de eerste t/m vierde door tweakers geleide contests
komt er nu een nieuwe contest. Ook dit keer hebben we weer een leuke opdracht die elke
programmeur, beginner of ervaren diehard, een uitdaging moet kunnen bieden.
De opdracht
Het idee voor deze contest komt voort uit het spel Tuintopia. In het spel ben je eigenaar van
een stuk grond met een huis erop. Het doel is om een tuin te maken met zoveel mogelijk
verbindingen in de tuin. Zo levert een waterpomp water aan de groentetuin en levert een
zonnepaneel stroom aan het huis.
De basis van het spel is als volgt, je begint het spel met het huis (2 kaarten groot), dit zijn de
startkaarten. Elke beurt leg je een kaart aansluitend aan de al bestaande kaarten aan. Op
iedere kaart staat wat de kaart nodig heeft en wat de kaart levert. Het water dat de
waterpomp levert heeft de groentetuin nodig. Als je deze 2 kaarten naast elkaar neerlegt
krijg je 1 punt:


Verbindingen kunnen worden gemaakt met kaarten die recht naast elkaar, recht boven elkaar
en diagonaal van elkaar liggen. Als je een kaart slim neerlegt kan je soms wel meer dan
8 punten in 1 beurt halen.
De 2 kaarten van het huis tellen als 1 kaart. Hierdoor krijg je GEEN dubbele punten als je
een nieuwe kaart direct onder of boven het huis legt.
Zodra de tuin vol is wint de speler met de meeste punten.
Om het spel spannender en nog leerzamer te maken, kun je het spel ook op een hoger niveau spelen. Op het tweede niveau kun je door rekening te houden met de invloed van de zon en de wind nog meer punten scoren.
De uitdaging wordt: Maak een programma die in maximaal 5 minuten tijd een zo hoog
mogelijke score behaalt (op basis van geldige kaart-combinaties op het speelveld). Als
output geeft de applicatie de highscore en de kaart combinatie die deze highscore oplevert.
Om te voorkomen dat jullie een clustertje huren en de uitkomst hardcoded implementeren
houden we een aantal variabelen open:
- De aantallen van de kaarten
- De eigenschappen van de kaarten (welke inputs en outputs)
- De grootte van het speelveld
- Waar het huis staat.
Om de codes te beoordelen worden deze allemaal getest op dezelfde machine
Voorbeeld voor speelveld.ini:
[speelveld] aantalveldenxas=6 aantalveldenyas=3 eerstehuisdeel=3,3
Uitleg: Bovenstaand speelveld is gelijk aan het voorbeeld op: http://www.tuintopia.nl/speldemo
"eerstehuisdeel" is de locatie van het linker huis deel, rechts van dit huisdeel staat altijd het
andere huisdeel. Deze 2 delen vormen samen 1 kaart.
Het onderstaande plaatje geeft een overzicht van het voorbeeld speelveld en de coördinaten.
De donkere velden stellen de plaats van het huis voor.

Voorbeeldstukje uit kaarten.ini:
[schuur] aantal=2 input=water,stroom output=afvalwater,afdak zon= schaduw=levert wind= windbeschutting=levert [vijver] aantal=2 input= output=voedsel,water,plaagbestrijders zon=nodig,levert schaduw= wind= windbeschutting=
Uitleg: Bovenstaand stukje uit kaarten.ini is 1 type speelkaart, genaamd schuur. De naam is
het begin van een kaart en staat tussen haakjes.
Hierna komt de key "aantal" die geeft aan hoe vaak deze kaart mag voorkomen op het
speelveld. Aantal kan ook 0 ( nul ) zijn.
De volgende key is "input", hierachter staan de inputs voor deze kaart. Hierna
komt de key "output". Er zijn maximaal 4 inputs en 4 outputs per kaart en
in totaal zijn er 11 mogelijke input/output types. Deze types zijn:
"voedsel", "water", "mest", "plantenresten, "nectar", "bevruchting", "stro", "afvalwater", "plaagb
estrijders", "stroom" en "afdak".
De schuur heeft stroom nodig, als er langs de schuur een kaart ligt die stroom als output
heeft, levert dat 1 punt op. Als er aangrenzend aan de schuur 2 stroom leverende kaarten
liggen, dan levert dat 2 punten op. Op deze manier kan 1 input van 1 kaart maximaal 8
punten opleveren (een van elke aangrenzende kaart).
De keys "zon", "schaduw", "wind" en "windbeschutting" zijn voor het hogere niveau. Als er
achter "zon", "schaduw", "wind" of "windbeschutting" het woord "levert" staat heeft deze key
een betekenis voor een buur kaart, namelijk dat de kaart dit aspect levert aan de buur. Als er
"nodig" staat bij een key betekent dat, dat de kaart dat aspect nodig heeft. Een kaart kan ook
zowel zon nodig hebben als zon leveren, zie hierboven bij de vijver.
De zon schijnt vanuit het zuiden en de wind waait vanuit het westen. Dat betekent concreet
het volgende:
De 3 kaarten onderaan een bepaalde kaart (linksonder, recht eronder en rechtsonder)
kunnen de kaart zon of schaduw leveren. Een kaart kan zelf zon of schaduw leveren aan de
3 kaarten erboven.
Voor iedere match krijgt de speler 1 punt. Een match ontstaat als volgt:
Een kaart levert zon aan een kaart die zon nodig heeft (onderste kaart: zon=levert; bovenste
kaart: zon=nodig).
Een kaart levert schaduw aan een kaart die schaduw nodig heeft (onderste kaart:
schaduw=levert; bovenste kaart: schaduw=nodig).
Voor iedere mismatch krijgt de speler 1 minpunt. Een mismatch ontstaat als volgt:
Een kaart levert zon aan een kaart die schaduw nodig heeft (onderste kaart: zon=levert;
bovenste kaart: schaduw=nodig).
Een kaart levert schaduw aan een kaart die zon nodig heeft (onderste kaart: schaduw=levert;
bovenste kaart: zon=nodig).

De 3 kaarten links van een bepaalde kaart kunnen de kaart wind of beschutting leveren. Een
kaart kan zelf wind of beschutting leveren aan de 3 kaarten rechts ervan.
Hierbij geldt ook: voor iedere match krijgt de speler weer 1 punt en voor iedere mismatch 1
minpunt.
Een key die geen waarde heeft, zal wel aanwezig zijn.
De eindscore is een optel som van de punten per kaart. Min punten zijn NIET gratis als de
score 0 is, in dat geval ga je gewoon de min in.
Het Huis
Zoals hierboven beschreven tellen de 2 kaarten van het huis als 1 kaart.
Dit heeft op een aantal aspecten van het spel een invloed. Deze invloeden zullen we hieronder extra verduidelijken.
kaarten.ini
Omdat het huis 1 kaart is van dubbel formaat hebben we besloten om in de kaarten.ini deze ook als aantal=1 op te geven. Het gaat namelijk om 1 huis.
verbindingen en key's
Doordat het huis het formaat heeft van 2 kaarten kan deze verbindingen aangaan met alle 10 zijn buren. Denk eraan dat er geen dubbele punten worden geteld als je kaart recht onder of boven het huis ligt.
wind
Doordat het huis het formaat heeft van 2 kaarten heeft deze ook een invloed op meer buur kaarten als het om de wind gaat.
Zie:

Denk er ook hierbij aan dat er geen dubbele punten geteld gaan worden.
Het maakt qua punten geen verschil of een buurkaart van het huis wind of beschutting levert aan een deel van het huis, of aan het gehele huis. In beide gevallen gaat het om 1 punt.
zon
Doordat het huis het formaat heeft van 2 kaarten heeft deze ook meer een grotere invloed als het om zon en schaduw gaat.
Zie:

Denk er ook hierbij aan dat er geen dubbele punten geteld gaan worden.
Het maakt qua punten geen verschil of een buurkaart van het huis zon of schaduw levert aan een deel van het huis, of aan het gehele huis. In beide gevallen gaat het om 1 punt.
Uitvoer
Uitvoer komt terecht in een bestand genaamd output.ini. Dit bestand ziet er als volgt uit:
Score:<< de door jou berekende score >> [groentetuin][graanveld][huis][huis][schuur][mesthoop] [paddestoelenstam][regenton][notenboom][vlinderstruik][bijenkorf][waterzuivering] [insectenhotel][boomgaard][heg][insectenhotel][compostvat][waterpomp]
Op regel 1 staat de eindscore volgens jouw programma.
Op elke volgende regel staat 1 regel van de eind uitkomst die de score maakt.
De bovenste van deze regels is de meest noordelijke, de onderste de zuidelijkste regel.
Links staan de meest westelijke kaarten, rechts de meest oostelijke.
Mocht je een leeg veld innemen in je uitkomst, dan gebruik je de blokhaken zonder tekst erin, dus zo: "[]"
In de uitvoer en de score gaan we uit van het hogere spel niveau, dus met de keys "zon",
"schaduw", "wind" en "windbeschutting" erbij.
De regels en andere afspraken
Uiteraard zijn er aan deze contest wat regeltjes verbonden. Om alles eerlijk te laten verlopen
gelden de volgende spelregels:
- Inzendingen voor de contest stuur je naar creepy@tweakers.net; neem daarbij in
de subjectregel de tekst "Inzending PRG Contest 5 - <nickname>" op. Zet de
bestanden niet ergens publiek neer voordat de sluitingsdatum is bereikt, om het zo
voor iedereen leuk te houden. Stuur bovendien geen code op waar je niet 100%
achter staat. Je eerste inzending is de enige inzending die telt, een tweede inzending
zullen we niet in ogenschouw nemen. - Voeg bij je inzending een omschrijving van de gebruikte algoritmen en manieren
waarom je code werkt, deze willen we na afloop publiceren samen met je score en
broncode. Zo kunnen we allemaal wat leren van elkaar. - De sluitingsdatum van de contest is 2 maanden na de plaatsing van dit topic 16 april
2013. Elke inzending die binnenkomt ná 16 juni om 23:59:59 is helaas uitgesloten
van deelneming, zonder uitzondering.
We hebben bewust een datum gekozen die nog redelijk ver in de toekomst ligt, zodat
niemand echt tijdsdruk zal ondervinden en zoveel mogelijk mensen mee kunnen
doen, dus ik denk niet dat een strakke deadline een probleem zal zijn. - Neem in je mailtje een zip- of rar-file op met daarin een uitvoerbare versie van je
programma én je programmacode. In het geval van scripttalen zoals PHP is één
bestand uiteraard voldoende.
Als je executable afhankelijk is van minder gangbare DLL's of als deze andere
afhankelijkheden heeft, stuur dan duidelijke instructies mee voor het runnen van je
applicatie. - Je applicatie wordt gerund in een map met daarin alleen je executable(s) en de
invoerbestanden. Maak je programma dus ook niet afhankelijk van de aanwezigheid
van de uitvoerbestanden of andere files! - Als OS wordt er gebruik gemaakt van Windows 7 of Linux mint 14 (beide 64 bit).
- Je mag elke programmeertaal gebruiken die je wilt, met uitzondering van Brainfuck.
- Samenwerken mag, maar meld het wel even als je dit doet. Neem in je
inzendingsmailtje de nicknames van alle programmeurs op. - De ingestuurde zipfiles worden na de contest publiek gemaakt, inclusief je
sourcecode. Als je hiertegen bezwaar hebt, dan kun je beter niet meedoen.
Uiteraard staat het je vrij om elke willekeurige opensource licentie aan je code te
verbinden en de credits liggen uiteraard gewoon bij jou. - Het geven van foute uitvoer betekent niet meteen dat je "af" bent, maar elke foute
kaart wordt als lege kaartlocatie beschouwd. Grote fouten kunnen zelfs leiden tot
diskwalificatie en foltering. - Het berekenen van een foutieve eindscore kost je de punten die het huis zou hebben
opgeleverd, als het huis een negatieve score heeft krijg je er GEEN punten bij.
Wij herberekenen de eindscore altijd nog eens en gaan ook uit van ONZE berekening. - Alle genoemde in- en uitvoerbestanden bevinden zich in dezelfde directory als het
uitvoerbare bestand van je programma. - Als je programma langer dan een 5 minuten nodig heeft om te runnen op de pc die
je score berekent, dan heb je pech. Na een 5 minuten wordt je applicatie gestopt en
alleen de uitvoer die op dat moment in je output.ini bestand zit wordt gebruikt voor
het berekenen van je score. Je kan ervan uit gaan dat de pc waarop je programma
gerund wordt sneller is dan de gemiddelde consumenten pc, maar probeer je
programma zo snel mogelijk te houden. - Het heeft geen zin om bij moderators te gaan vragen naar de lijst met deelnemers
en inputgegevens. Deze files worden namelijk pas ná de sluitingsdatum überhaupt
gemaakt, dus we kúnnen je die files niet geven, zelfs al zouden we het willen.
Natuurlijk geven we uiteindelijk wel de precieze files vrij, samen met de uitslag van de
contest, en niet eerder dan dat om zo een beetje de spanning erin te houden. - Neem voldoende en zinnig commentaar op in je code.
Hoe worden de inzendingen beoordeeld?
Elke inzending wordt minimaal 3 keer aan de tand gevoeld, elke keer met een andere testset (bord en speelkaarten).Diegene met de hoogste score krijgt 1 punt, de volgende 2 en zo verder. Indien er meerdere entries zijn met dezelfde score dan wordt de plaats bepaald aan de hand van de looptijd van het programma. Het programma dat als eerste uit zichzelf is gestopt krijgt dan 1 punt, de volgende 2, enz.
Wie de minste punten verzameld over de 3 test sets wint, mochten er nu nog steeds meerdere winnaars zijn zal een 4de beslissende set worden gedraaid met de winnaars
Wat kan ik eigenlijk winnen?
Nou, dat is vrij simpel: Tuintopia als werkelijk analoog spel wordt uitgedeeld aan de 3 beste
inzendingen. De hoofdprijs is een Raspberry Pi (B). Deze prijs wordt gesponsord door Farnell.com.
En het belangrijkste wat je overhoudt is natuurlijk de eeuwige roem en de eer om de vijfde contest in dit nieuwe format gewonnen te hebben!
Om je op weg te helpen
Om te zorgen dat jullie alvast van start kunnen gaan bieden we jullie graag een testset aan
van invoerbestanden. Bedenk wel dat de uiteindelijke bestanden anders zullen zijn!
Je kunt natuurlijk ook voor testdoeleinden (aanbevolen zelfs!) je eigen speelveld en
kaarten.ini bestanden maken. Helemaal leuk wordt het als jullie onderling testsets gaan
delen en kijken wie het best scoort totdat de deadline gekomen is. Zo zijn je tests niet al te
eentonig met altijd dezelfde data.
Testset:
speelveld.ini
kaarten.ini
Daarnaast ben je, net als in vorige contest, vrij om zelf een 'validator' te schrijven (en online
te zetten) om te controleren of je uitvoer voldoet aan de eisen. Wij, de organisatie, zullen
onze eigen validator inzetten om de uiteindelijke uitvoer van jullie inzendingen te controleren.
Laatstgenoemde blijft, in ieder geval tot na de deadline, intern en is dus niet voor jullie
beschikbaar.
Ook kan je gebruik maken van de demo applicatie in tuintopia.nl. qua kaarten en speelveld
moet deze gelijk zijn aan de testset. In deze demo worden echter de zon en wind aspecten
niet meegenomen.
Tot slot...
...willen we jullie natuurlijk weer heel veel succes wensen. We hopen dat je er plezier in gaat
hebben om aan deze contest mee te doen, en natuurlijk hopen we dat je niet de enige bent.
Hoe meer competitie, hoe beter!
Voor wat extra achtergrond informatie kan je kijken in het topic: [algoritme] bordspel doorrekenen
Als jullie nog vragen hebben, stel ze dan maar gewoon in dit topic.
[ Voor 219% gewijzigd door RobIII op 02-05-2013 01:54 ]
Klus page: http://klusthuis.blogspot.com