De cellen van een rechthoekig $$m \times n$$ rooster met $$m$$ rijen en $$n$$ kolommen bevatten elk een getal van 0 tot en met 9. Op die manier ontstaan groepen van aangrenzende cellen die allemaal hetzelfde getal bevatten, waarbij cellen aan elkaar grenzen als ze een gemeenschappelijke zijde hebben (horizontaal of verticaal). Onderstaand $$4 \times 4$$ rooster heeft bijvoorbeeld vijf groepen die elk met eigen kleur aangeduid worden.
In één zet worden de getallen in alle cellen van een groep met 1 verhoogd of verlaagd, waardoor de groep kan samensmelten met andere groepen. Hierbij mag de waarde in de cellen nooit kleiner worden dan 0 of groter dan 9. De uitdaging bestaat erin om met een minimum aan zetten alle cellen van het rooster tot één enkele groep te laten samensmelten. Voor het rooster hierboven volstaan twee zetten:
verlaag alle cellen van de blauwe groep in het midden van het rooster, waardoor die samensmelt met de rode en de gele groep
verlaag alle cellen van de nieuwe grotere groep, waardoor die samensmelt met de paarse en de groene groep
Definieer een klasse Rooster waarmee rechthoekige roosters van cijfers kunnen voorgesteld worden, waarin zetten kunnen uitgevoerd worden om de groepen te laten samensmelten. Bij het aanmaken van een nieuw rooster (Rooster) moeten drie argumenten doorgegeven worden: i) een string (String) met de cijfers in het rooster uitgelezen van links naar rechts en van boven naar onder, ii) het aantal rijen (Number) van het rooster en iii) het aantal kolommen (Number) van het rooster. Het derde argument mag weggelaten worden bij vierkante roosters (waarbij het aantal rijen en kolommen gelijk zijn).
We nummeren de rijen van het rooster van boven naar onder vanaf nul. Analoog nummeren we ook de kolommen van links naar rechts vanaf nul. Op die manier kan de positie van een cel in het rooster aangeduid worden door het paar $$(r, k)$$ waarbij $$r$$ het rijnummer en $$k$$ het kolomnummer is waarop de cel terug te vinden is in het rooster.
Op een rooster $$R$$ (Rooster) moeten minstens de volgende methoden kunnen aangeroepen worden:
Een methode toArray waaraan geen argumenten moeten doorgegeven worden. De methode moet een reeks (Array) teruggeven met de rijen van rooster $$R$$ (opgelijst van boven naar beneden), waarbij elk rij zelf ook voorgesteld wordt als een reeks (Array) met de getallen (Number) op de rij (opgelijst van links naar rechts).
Een methode toString waaraan geen argumenten moeten doorgegeven worden. De methode moet een stringvoorstelling (String) van rooster $$R$$ teruggeven, waarbij elke rij op een afzonderlijke regel staat en bestaat uit een aaneenschakeling van de cijfers op de rij (van links naar rechts).
Een methode groep waaraan twee argumenten $$r$$ en $$k$$ (Number) moeten doorgegeven worden. De methode moet een reeks (Array) teruggeven met de posities van alle cellen in de groep die de cel $$(r, k)$$ bevat (in lexicografische volgorde).
Een methode isOpgelost waaraan geen argumenten moeten doorgegeven worden. De methode moet een Booleaanse waarde (Boolean) teruggeven, die aangeeft of alle cellen in rooster $$R$$ dezelfde waarde bevatten.
Een methode zet waarmee één zet kan uitgevoerd worden op een groep die cel $$(r, k)$$ bevat. Aan de methode moeten drie argumenten doorgegeven worden: i) het nummer $$r$$ (Number), ii) het nummer $$k$$ (Number) en iii) een Booleaanse waarde (Boolean) die aangeeft of de groep moet verhoogd (true) of verlaagd (false) worden. De methode moet de gegeven zet doorvoeren op rooster $$R$$ en een verwijzing naar rooster $$R$$ teruggeven.
De methoden toArray, toString, groep en isOpgelost mogen rooster $$R$$ niet wijzigen. De methode zet moet daarentegen rooster $$R$$ wel aanpassen.
Alle gevraagde methoden mogen ervan uitgaan dat de waarden die eraan doorgegeven worden en alle acties die ze moeten uitvoeren geldig zijn, zonder dat ze dit expliciet moeten controleren.
> const rooster = new Rooster("1221133113322222", 4)
> rooster.toArray()
[[ 1, 2, 2, 1 ], [ 1, 3, 3, 1 ], [ 1, 3, 3, 2 ], [ 2, 2, 2, 2 ]]
> rooster.toString()
1221
1331
1332
2222
> rooster.groep(2, 1)
[[ 1, 1 ], [ 1, 2 ], [ 2, 1 ], [ 2, 2 ]]
> rooster.groep(0, 3)
[[ 0, 3 ], [ 1, 3 ]]
> rooster.groep(1, 0)
[[ 0, 0 ], [ 1, 0 ], [ 2, 0 ]]
> rooster.isOpgelost()
false
> rooster.zet(1, 1, false).toString()
1221
1221
1222
2222
> rooster.isOpgelost()
false
> rooster.zet(3, 2, false).toString()
1111
1111
1111
1111
> rooster.isOpgelost()
true