Toon posts:

[Programming Contest 5] Tuintopia Vorige deelOverzicht

Pagina: 1
Acties:

Onderwerpen


  • liquid_ice
  • Registratie: Februari 2001
  • Laatst online: 16-05 13:35
Mede-auteur:

Anoniem: 510923

Programming Contest Contest 5 : Tuintopia

Inhoudsopgave
Eerdere contests
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:
  1. 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.

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

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

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

  5. 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!

  6. Als OS wordt er gebruik gemaakt van Windows 7 of Linux mint 14 (beide 64 bit).

  7. Je mag elke programmeertaal gebruiken die je wilt, met uitzondering van Brainfuck.

  8. Samenwerken mag, maar meld het wel even als je dit doet. Neem in je
    inzendingsmailtje de nicknames van alle programmeurs op.

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

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

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

  12. Alle genoemde in- en uitvoerbestanden bevinden zich in dezelfde directory als het
    uitvoerbare bestand van je programma.

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

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

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

Pagina: 1


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee