Programming Contest Nieuwe Stijl: Contest 3
Inhoudsopgave
- 1: Inhoudsopgave
- 2: Eerdere contests
- 3: Inleiding
- 4: De opdracht
- 5: Details
- 6: De spelregels
- 7: De regels en andere afspraken
- 8: Wat kan ik eigenlijk winnen?
- 9: Om je op weg te helpen
- 10: Tot slot...
Eerdere contests
Inleiding
Na het grote succes van de eerste en tweede door ons geleide contests kon een nieuwe contest natuurlijk niet uitblijven. 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 wat gesprekken over de MoaM, een meeting voor de crew van Tweakers.net die een weekend lang duurt. Tijdens die meeting werd er overnacht in bungalows, die van tevoren natuurlijk ingedeeld moesten worden. Om te zorgen dat er geen oorlog uitbreekt tussen de ruim 100 aanwezigen, is een goede indeling natuurlijk cruciaal. En guess what? Jullie gaan software schrijven om die indeling te automatiseren.
Allereerst, om je uit de droom te helpen dat we van jullie profiteren voor volgende meetings: de indelingen daarvoor zullen nog steeds met de hand gemaakt worden, aangezien programma's natuurlijk geen rekening kunnen houden met persoonlijke beweegredenen. We gaan dat echter voor deze contest wel een beetje proberen.
Je krijgt straks twee files aangeleverd. Eén file, meeting.ini, bevat alle informatie over de meeting zelf. Je kunt in die file informatie vinden over het aantal beschikbare huisjes, het aantal personen per huisje en het aantal huisjes geschikt voor invaliden. Daarnaast is er een andere file, deelnemers.ini, waarin alle deelnemers met hun voorkeuren beschreven staan. Beide bestanden zijn opgemaakt als ini-files, zodat ze makkelijk uitleesbaar zijn.
Voorbeeld voor meeting.ini:
[meeting]
aantalhuisjes=12
aantalinvalidenhuisjes=2
personenperhuis=8
Voorbeeldstukje uit deelnemers.ini:
[Jan]
voorkeur=zuiphuis
roomies=geen
partner=Marij
nietroomies=Klaas
eten=vegetarisch
Niet alle velden uit dit laatste voorbeeld zullen je meteen duidelijk zijn, dus ik zal proberen alles uit te leggen. Tussen de haakjes bovenaan staat, zoals je ziet, de naam van de deelnemer. Hierna zie je de key "voorkeur". Dit staat voor de verschillende typen huisjes die er bestaan. De types die er zijn, zijn: "geen", "zuiphuis" (voor de feestbeesten), "rustig" (voor de saaierds), "rookvrij", "organisatie" en "invalide". Deze voorkeuren zijn met uitzondering van de laatste twee typen niet verplicht om op te volgen, maar het levert je bonuspunten op als je de voorkeuren van alle mensen in een huisje matcht. Krijg je een huis gevuld met enkel mensen uit dezelfde voorkeursgroep en eventueel aangevuld met mensen zonder voorkeur, dan krijg je 1 bonuspunt per persoon met die voorkeur. Wanneer je een huis voor 6 personen vult met 4 zuipers en 2 mensen zonder voorkeur, dan krijg je dus 4 punten. Wanneer je echt alleen mensen met dezelfde voorkeur in een huisje stopt (dus 6 zuipers in dit geval), krijg je nog eens 2 extra punten.
In het volgende veld, "roomies", staat opgegegen met welke andere deelnemers de persoon in kwestie graag op één kamer zou willen slapen. Er kunnen maximaal 3 deelnemers opgegeven worden, gescheiden door komma's. Als een deelnemer gematcht wordt met zijn eerste-keus-roomie krijg je 5 bonuspunten, en voor de tweede en derde keus respectievelijk 3 en 2 punten. Wanneer je een deelnemer niet in één kamer kunt stoppen bij een van zijn voorkeuren maar diegenen wel in hetzelfde huis kunt zetten, dan levert je dat maximaal 1 bonuspunt op.
Het volgende veld, "partner", maakt het vorige veld feitelijk overbodig. Wanneer er een partner in het spel is, wil deze natuurlijk op dezelfde kamer als zijn of haar wederhelft verblijven. Net als bij eerste keus-roomies levert dat 5 bonuspunten op die je dus feitelijk gratis krijgt. Er kunnen wel roomies opgegeven worden, maar je kunt alleen bonuspunten verdienen door één van die roomies in hetzelfde huis te plaatsen.
Dan is er het veld "nietroomies". Dit veld bevat, wederom kommagescheiden, maximaal 3 namen van mensen waarmee de persoon in kwestie niet in een huisje terecht wil komen. Voor elke persoon waarbij hij of zij toch in het huisje komt, levert dit 2 strafpunten op. Deel je ze zelfs in dezelfde kamer in, dan kost dit je maar liefst 5 punten.
Het laatste veldje wordt gebruikt om aan te geven of iemand vegetarisch is of alles mag eten. Het veld "eten" kan de waarden "vegetarisch" of "alles" bevatten. Wanneer je een vegetariër in zijn eentje tussen alleseters indeelt, levert dat je 2 strafpunten op. Als je hem in hetzelfde huisje indeelt met één of meer andere vegetariërs, dan krijg je per vegetariër in dat huisje 1 extra bonuspunt.
De score zal bijgehouden worden door een parser die we zelf schrijven, maar je kan natuurlijk zelf ook de score bijhouden in je eigen programma. Let wel; de score die jouw programma aangeeft zal door ons niet bekeken en/of vertrouwd worden.
Details
Om alles even zo duidelijk mogelijk te maken zal ik even wat constraints opsommen:
- Huisjes hebben altijd een even aantal bedden, die elk verdeeld staan over tweepersoonskamers.
Een huisje voor acht personen heeft vier kamers, een huis voor zes personen drie.
- Leden van de organisatie mogen alleen bij andere leden van de organisatie ingedeeld worden.
Onder geen beding mogen er mensen met een andere voorkeur in hetzelfde huis met een organisator ingedeeld worden. Wèl mogen er meerdere "organisatiehuisjes" zijn, als niet alle organisatoren in één huisje passen.
- Als je een invalide in een huisje plaatst, dan is dat automatisch een invalidenhuisje.
Wanneer je een invalide in een huisje wil plaatsen waar nog geen invaliden in zitten, dan wordt het aantal beschikbare invalidenhuisjes verminderd met één. Is het aantal invalidenhuisje op, dan zul je invaliden, ongeacht hun andere voorkeuren, bij elkaar moeten plaatsen.
- Je score kan uiteindelijk zowel positief als negatief zijn. Strafpunten zijn dus niet "gratis" als je 0 punten hebt.
- Kamers mogen leeg blijven. Lege kamers hoef je niet op te nemen in je uitvoer.
- Kamers hoeven ook niet per se vol te zijn. Eén persoon op een kamer is ook goed, mits verder alle deelnemers maar een kamer hebben.
- Als je een deelnemer niet kunt plaatsen, kost dat je 10 punten.
- Volgorde is noch in de invoer, noch in de uitvoer belangrijk. Groepen (aangeduid met rechte haken) staan in willekeurige volgorde in de invoerbestanden en mogen in willekeurige volgorde in de uitvoer staan. Binnen deze groepen geldt hetzelfde voor de key/value-paren.
- Tussen twee groepen bevat deelnemers.ini een witregel. In je uitvoer mag dit ook, maar het moet niet.
Uitvoer komt terecht in een bestand genaamd output.ini. Dit bestand ziet er als volgt uit:
[huisje1]
kamer1=Jan,Marij
kamer2=foo,bar
[..]
[invaliden1]
kamer1=Piet,Mark
kamer2=Rick
Zoals je ziet zijn de namen wederom kommagescheiden wanneer dit er meerdere zijn. Lege kamers hoeven niet genoemd te worden, maar het mag wel. Als een lege kamer graag wil noemen, gebruik dan "kamer3=" als tekst, dus wel een key, maar geen value.
De spelregels
Omdat de spelregels niet helemaal duidelijk waren, hierbij een overzicht om alles ietwat te verduidelijken.
(Bonus)punten per huis:
Punten Voorwaarde
+2 Als alle mensen in een vol huis die zelfde voorkeur
hebben. Dit geldt _niet_ voor een huis gevuld met
mensen zonder voorkeur.
+1 Voor alle mensen in een huis die allemaal dezelfde
voorkeur hebben, maar alleen als er geen mensen in
zitten met een andere voorkeur. Er mogen wél mensen
zonder voorkeur in het huis ingedeeld zijn, maar
die leveren dan geen extra punten op.
(Bonus)punten per persoon:
Punten Voorwaarde
+5 Als roomie 1 in dezelfde kamer wordt ingedeeld.
+3 Als roomie 2 in dezelfde kamer wordt ingedeeld.
+2 Als roomie 3 in dezelfde kamer wordt ingedeeld.
+1 Als geen van de roomies in dezelfde kamer is
ingedeeld, maar wel een of meerdere in het zelfde
huis. Deze regel gaat ook op wanneer iemand's
partner een roomie heeft opgegeven.
+5 Als de partner in dezelfde kamer ingedeeld wordt.
-5 Als een niet-roomie in dezelfde kamer wordt
ingedeeld.
-2 Per nietroomie als deze in hetzelfde huis wordt
ingedeeld, maar niet in de zelfde kamer.
-2 Als er maar 1 vegetariër in een huisje wordt
ingedeeld terwijl er ook niet-vegetariërs in het
huisje zitten.
+1 Voor elke vegetariër in een huisje, maar alléén
als er minimaal 2 vegetariërs in het huisje
zitten.
-10 Per deelnemer die niet wordt ingedeeld.
De regels en andere afspraken
Uiteraard zijn er aan deze contest wat regeltjes verbonden. Om alles eerlijk te laten verlopen hebben we de volgende spelregels in gedachten:
- Inzendingen voor de contest stuur je naar prgmods@tweakers.net; neem daarbij in de subjectregel de tekst "Inzending PRG Contest 3 - <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.
- De sluitingsdatum van de contest is maandag 16 juli 2007. Elke inzending die binnenkomt ná 15 juli 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 liever de file uploadt en ernaar linkt vanuit je email, dan mag dat ook.
Als je executable afhankelijk is van minder gangbare DLL's of als deze andere afhankelijkheden heeft, stuur dan 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!
- 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 als onze parser niet met je uitvoer overweg kan krijg je na dat punt geen punten meer. Grote fouten kunnen zelfs leiden tot diskwalificatie en foltering door zeef.
- Alle genoemde in- en uitvoerbestanden bevinden zich in dezelfde directory als het uitvoerbare bestand van je programma.
- Als je programma langer dan een half uur nodig heeft om te runnen op de pc die je score berekent, dan heb je pech. Na een half uur 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 consumentenpc, 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 meetinggegevens. 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. Als wij je code niet begrijpen kan hij nog zo goed zijn, je score wordt er niet hoger op.
Behalve de winnaar in de categorie "hoogste score" en "snelste code" zullen er nog winnaars zijn in diverse andere categoriën, waaronder o.a. de categorie 'beste defensive code' (code die goed tegen een stootje kan zoals bijvoorbeeld een 'beschadigd' deelnemers.ini bestand of een deelnemers.ini bestand dat niet voldoet aan de specificaties). Hierbij is het mogelijk dat één persoon in meerdere categoriën de winnaar is.
Wat kan ik eigenlijk winnen?
Nou, dat is vrij simpel: niks. Het enige dat je mogelijk aan deze contest overhoudt is eeuwige roem en de eer om de derde contest in dit nieuwe format gewonnen te hebben.
We weten dat we de vorige keer ook zeiden dat er niets te winnen viel en dat dit uiteindelijk toch wél het geval was. We verzekeren je echter dat de prijzen bij de vorige contest éénmalig waren en er in elk geval voorlopig geen prijs meer uitgereikt wordt aan de winnaar van een PRG-contest.
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 deelnemerlijsten en meeting.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.
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 crew, 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.
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!
Als jullie nog vragen hebben, stel ze dan maar gewoon in dit topic.
[ Voor 110% gewijzigd door NMe op 26-05-2007 12:47 ]
'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.