De zeebodem wordt steeds steiler. Misschien zijn de sleutels van de slee daardoor verder naar beneden gevallen?
Er zwemt een gigantische school gloeiende lantaarnvissen1 voorbij. Ze moeten zich wel erg snel vermenigvuldigen om zulke grote aantallen te bereiken - misschien wel exponentieel snel? Je moet hun groeisnelheid modelleren om zeker te zijn.
Hoewel je niets weet of deze specifieke soort van lantaarnvissen, doe je toch een gok over hun eigenschappen. Het staat vast dat elke lantaarnvis eens om de 7 dagen een nieuwe lantaarnvis baart.
Dit proces is echter niet noodzakelijk gesynchroniseerd tussen alle lantaarnvissen in de school - de ene lantaarnvis heeft misschien nog 2 dagen voordat hij een nieuwe lantaarnvis baart, terwijl een andere er misschien nog 4 heeft. Je kunt elke vis dus modelleren als één enkel getal dat staat voor het aantal dagen tot die een nieuwe lantaarnvis baart.
Bovendien beredeneer je dat een nieuwgeboren lantaarnvis er toch iets langer over doet voor die in staat is om nog meer lantaarnvissen te baren: twee extra dagen voor de eerste cyclus.
Stel dus dat je een lantaarnvis hebt met een interne klok die op 3
staat:
2
worden.1
worden.0
worden.6
, en zou er ook een nieuwe lantaarnvis gebaard worden met interne klok 8
.5
staan, en zou de interne klok van de tweede lantaarnvis op 7
staan.Een lantaarnvis die een nieuwe vis baart, stelt zijn klok terug in op 6
, niet 7
(omdat 0
ook een geldige waarde is voor de klok). De nieuwe lantaarnvis begint met een interne klok die op 8
staat, en die begint pas de volgende dag af te tellen.
De onderzeeër heeft onmiddellijk door wat je aan het doen bent, en produceert automatisch een lijst met de leeftijden van alle lantaarnvissen in de school (de invoer voor deze opgave). Stel bijvoorbeeld dat je de volgende lijst krijgt:
3,4,3,1,2
Deze lijst betekent dat de interne klok van de eerste vis op 3
staat, de interne klok van de tweede vis 4
, enzovoort tot de vijfde vis, wiens interne klok op 2
staat. Het simuleren van deze school vissen over meerdere dagen gaat als volgt:
Begintoestand: 3,4,3,1,2
Na 1 dag: 2,3,2,0,1
Na 2 dagen: 1,2,1,6,0,8
Na 3 dagen: 0,1,0,5,6,7,8
Na 4 dagen: 6,0,6,4,5,6,7,8,8
Na 5 dagen: 5,6,5,3,4,5,6,7,7,8
Na 6 dagen: 4,5,4,2,3,4,5,6,6,7
Na 7 dagen: 3,4,3,1,2,3,4,5,5,6
Na 8 dagen: 2,3,2,0,1,2,3,4,4,5
Na 9 dagen: 1,2,1,6,0,1,2,3,3,4,8
Na 10 dagen: 0,1,0,5,6,0,1,2,2,3,7,8
Na 11 dagen: 6,0,6,4,5,6,0,1,1,2,6,7,8,8,8
Na 12 dagen: 5,6,5,3,4,5,6,0,0,1,5,6,7,7,7,8,8
Na 13 dagen: 4,5,4,2,3,4,5,6,6,0,4,5,6,6,6,7,7,8,8
Na 14 dagen: 3,4,3,1,2,3,4,5,5,6,3,4,5,5,5,6,6,7,7,8
Na 15 dagen: 2,3,2,0,1,2,3,4,4,5,2,3,4,4,4,5,5,6,6,7
Na 16 dagen: 1,2,1,6,0,1,2,3,3,4,1,2,3,3,3,4,4,5,5,6,8
Na 17 dagen: 0,1,0,5,6,0,1,2,2,3,0,1,2,2,2,3,3,4,4,5,7,8
Na 18 dagen: 6,0,6,4,5,6,0,1,1,2,6,0,1,1,1,2,2,3,3,4,6,7,8,8,8,8
Elke dag wordt een 0
een 6
en voegt een nieuwe 8
toe aan het einde van de lijst, terwijl elk ander getal dat bestond aan het begin van de dag met 1 afneemt.
In dit voorbeeld zijn er na 18 dagen in totaal 26
vissen. Na 80 dagen zouden er in totaal 5934
vissen zijn.
Zoek een manier om lantaarnvissen te simuleren. Hoeveel vissen zouden er na 80 dagen zijn? Doe dit op de volgende manier:
lanternfish
waaraan de padnaam (String
) moet doorgegeven worden van een tekstbestand met de leeftijden van alle lantaarnvissen uit een school. De functie moet teruggeven hoeveel lantaarnvissen (Int
) er na 80 dagen in de school zouden zijn.In deze interactieve sessie gaan we ervan uit dat de tekstbestanden ages01.txt
2 en ages02.txt
3 zich in de huidige directory bevinden.
> lanternfish ("ages01.txt")
5934 :: Int
> lanternfish ("ages02.txt")
365131 :: Int