Advent of Code en de Grote Infi Puzzel

Advent of Code 2017 is helaas alweer voorbij... Als grote fans sponsoren wij dit event al elk jaar, maar dit jaar gingen we er ook vol in met een zelfbedachte puzzel. In deze blog lees je wat Advent of Code is en hoe slimme puzzelaars onze puzzel ontrafeld hebben!

In de vijfentwintig dagen voor de kerst van 2017 zaten veel Infi'ers 's ochtends om 6 uur, of soms zelfs om 5 uur, klaar met een bak koffie om de Advent of Code puzzel voor die dag op te lossen. Van het berekenen van de som van alle opvolgende, gelijke getallen in een circulaire reeks tot volledige Turing Machines bouwen - de puzzels van Advent of Code 2017 waren leerzaam en uitdagend.

Moderne adventskalender

Spelend leren is dan ook precies het doel geweest van Eric Wastl, a.k.a. topaz2078, toen hij in 2015 Advent of Code oprichtte. Tijdens de vijfentwintig dagen voor kerst wordt elke dag een nieuwe programmeerpuzzel weergegeven op https://adventofcode.com. De puzzels zijn geschikt voor alle skill-levels. Experts passen hun kennis toe vanuit een nieuw perspectief terwijl beginners juist nieuwe syntax leren kennen. Daarnaast kan je ook elke programmeertaal gebruiken die je wilt. Een buitenkans om te experimenteren dus!

Robots en cadeau's

Als sponsor van Advent of Code hebben wij dit jaar naast een sponsorbericht ook een eigen puzzel bedacht en die live gezet op https://aoc.infi.nl. Onze puzzel gaat over het optimaliseren van fictieve kerstcadeau-bezorgrobots bij ons op kantoor. Aan de hand van een lijst met bewegingsinstructies voor de robots moet de puzzelaar bepalen hoe vaak de robots elkaar kruisen. Als extra uitdaging wordt de puzzelaar gevraagd wat voor patroon de kruisingen van de robots vormen. Zo kunnen we zien waar de knelpunten zitten en de robots optimaliseren.

We wisten van tevoren niet hoeveel mensen mee zouden doen, maar het viel in ieder geval niet tegen! Aan het einde van Advent of Code hebben wij uit om en nabij vijftig inzendingen vijf winnaars gekozen die onze puzzel in diverse programmeertalen hebben opgelost. Deze vijf genieën hebben van ons een uniek "Keiharde Nerd"-shirt gekregen (normaal alleen voor Infi'ers). Enkele van de winnaars hebben hun code op verzoek van ons toegelicht voor deze blog!

De winnende oplossingen

Chris Blom
Hij heeft onze puzzel in Clojurescript opgelost door slim gebruik te maken van een ingebouwde Clojurescript functie die het format waarin onze input genoteerd is uit kan lezen:

"Ik parse de input met read-string, die functie kan EDN (extensible data notations, de clojure variant van json) inlezen, toevallig is de input valide EDN, en zijn de start posities makkelijk te onderscheiden van de updates. Met paths reken ik de posities voor iedere stap uit, en met count-clashes hoe vaak posities overlappen. Voor deel 2 heb ik een functie die in een 2d array de posities waar overlap is in een block zet, en die print."

Christiaan Biesterbosch
Hij deed het met Python.

"Voor de eerste vraag hield ik voor elke robot zijn positie bij, en vergeleek ik elke stap de positie. Elke keer dat dat ze elkaar kruisten, verhoogde ik de counter. Voor de tweede puzzel, tekende ik eerst het pad van elke robot in matplotlib maar dat was het niet. Dus na wat proberen met wat instellingen bedacht ik eindelijk alleen de stippen te tekenen als de robots elkaar kruisten. Het was wel op de kop, dus moest ik het nog spiegelen."

Thomas van der Burgt
Hij greep zijn kans en spijkerde zijn Rust kennis bij met behulp van onze puzzel.

"Een onmogelijke puzzel hè, alleen echte nerds, ja ja, die uitdaging wou ik weleens bekijken. Aangezien ik toch met Rust bezig was heb ik dit ook gebruikt voor de puzzel. Het eerste gedeelte was redelijk voor de handliggend, ik simuleer gewoon wat de robots doen en tel de positiecollisies. Wel was dit een leuke opdracht om te bekijken wat van parse-mogelijkheden voor tekst er allemaal in Rust zijn (conclusie RegEx makkelijk, relatief traag, nom is even uitvogelen maar lekker snel).

Het tweede gedeelte van de opdracht (vind het geheime bericht) was minder voor de hand liggend. Ergens in de bewegingen moet een patroon zitten. Mijn eerste idee was om de bewegingen te visualiseren, met een SVG library bleek dit makkelijk te doen. Maar het plotten van de bewegingen als lijnen bleek niet de oplossing, het was een gigantisch spinnen web, maar er leek wel een regelmaat in te zitten. Het volgende idee, het plotten van de positiecollisies, gaf een soort matrixprinterafdruk, met naast een mooi Infi logo de oplossing."

Een stapje verder

Infi wil alle deelnemers hartelijk bedanken voor hun inzet, onze robots zijn nog nooit zo efficiënt geweest! Als deze blog je eerste kennismaking met Advent of Code is dagen wij je graag uit om dit jaar ook mee te doen. Wij zijn in ieder geval van de partij met een nieuwe, nog moeilijkere puzzel! Wordt vervolgd...

Wil je iets waarmaken met Infi?

Wil jij een eigen webapplicatie of mobiele app waarmee jij het bij anderen maakt?

Waargemaakt door de nerds van Infi.
Nerds met liefde voor softwareontwikkeling en die kunnen communiceren. En heel belangrijk: wat we doen, doen we met veel lol!

Wij willen het fixen. Laat jij van je horen?

Voor wie heb je een vraag?