Je vliegtuig landt ruim op tijd. Het laatste deel van de reis verloopt met een veerboot die rechtstreeks naar het tropisch eiland gaat. Daar kan je vakantie eindelijk beginnen. Als je de wachtruimte bereikt om aan boord van de veerboot te stappen, besef je dat je zo vroeg bent dat er nog niemand is aangekomen!
Door het proces te simuleren dat mensen gebruiken om hun stoel in de wachtruimte te kiezen (of te verlaten), weet je vrij zeker dat je de beste zitplaats kunt voorspellen. Je maakt snel een plattegrond met de opstelling van de stoelen (de invoer van deze opgave).
De opstelling van de stoelen past netjes op een rooster. Daarin is elke positie ofwel grond (.
), een lege stoel (L
) of een bezette stoel (#
). De beginopstelling van de stoelen kan er bijvoorbeeld als volgt uitzien:
L.LL.LL.LL
LLLLLLL.LL
L.L.L..L..
LLLL.LL.LL
L.LL.LL.LL
L.LLLLL.LL
..L.L.....
LLLLLLLLLL
L.LLLLLL.L
L.LLLLL.LL
Nu hoef je alleen nog maar te simuleren hoe de mensen binnenkort zullen binnenkomen. Gelukkig zijn mensen zeer voorspelbaar en volgen ze altijd eenvoudige regels. Al hun beslissingen zijn gebaseerd op het aantal bezette stoelen naast een bepaalde stoel (één van de acht posities direct omhoog, omlaag, links, rechts of diagnaal vanaf de stoel). De volgende regels worden tegelijkertijd op elke stoel toegepast:
L
) is en er zijn geen bezette stoelen ernaast, dan wordt de stoel bezet.#
) is en vier of meer aangrenzende stoelen zijn ook bezet, dan wordt de stoel leeg.Grond (.
) verandert nooit. Stoelen bewegen niet en er zit nooit iemand op de grond.
Na één ronde van deze regels, wordt elke stoel in de voorbeeldopstelling bezet:
#.##.##.##
#######.##
#.#.#..#..
####.##.##
#.##.##.##
#.#####.##
..#.#.....
##########
#.######.#
#.#####.##
Na een tweede ronde, worden de stoelen met vier of meer bezette aangrenzende stoelen weer leeg:
#.LL.L#.##
#LLLLLL.L#
L.L.L..L..
#LLL.LL.L#
#.LL.LL.LL
#.LLLL#.##
..L.L.....
#LLLLLLLL#
#.LLLLLL.L
#.#LLLL.##
Dit proces gaat nog drie rondes door:
#.##.L#.##
#L###LL.L#
L.#.#..#..
#L##.##.L#
#.##.LL.LL
#.###L#.##
..#.#.....
#L######L#
#.LL###L.L
#.#L###.##
#.#L.L#.##
#LLL#LL.L#
L.L.L..#..
#LLL.##.L#
#.LL.LL.LL
#.LL#L#.##
..L.L.....
#L#LLLL#L#
#.LLLLLL.L
#.#L#L#.##
#.#L.L#.##
#LLL#LL.L#
L.#.L..#..
#L##.##.L#
#.#L.LL.LL
#.#L#L#.##
..L.L.....
#L#L##L#L#
#.LLLLLL.L
#.#L#L#.##
Op dit punt gebeurt er iets interessants: de chaos stabiliseert en verdere toepassing van de regels zorgt ervoor dat er geen enkele stoel meer van toestand verandert! Zodra mensen stoppen met bewegen, tel je 37
bezette stoelen.
Simuleer de wachtruimte door de regels om op de stoelen te gaan zitten herhaaldelijk toe te passen, totdat geen enkele stoel nog van toestand verandert. Hoeveel stoelen zijn er dan bezet? Hiervoor ga je als volgt te werk:
occupiedSeats
waaraan de padnaam (String
) van een tekstbestand met een plattegrond van de beginopstelling van de stoelen moet doorgegeven worden. De functie moet teruggeven hoeveel (Int
) stoelen er bezet zijn op het moment dat geen enkele stoel nog van toestand verandert.In deze interactieve sessie gaan we ervan uit dat het tekstbestand layout.txt
1 zich in de huidige directory bevindt.
> occupiedSeats("layout.txt")
37