Nu de inlogproblemen van de rodelbaan opgelost zijn, kan je vertrekken richting luchthaven. Hoewel reizen met een rodelbaan misschien gemakkelijk is, is het allerminst veilig: je hebt zeer weinig manoeuvreerruimte en de helling is bedekt met bomen. Je moet bepalen onder welke hoek je het verst van de bomen vandaan blijft.

Door de lokale geologische omstandigheden groeien de bomen in dit gebied alleen op gehele coördinaten in een rooster. Je maakt een kaart op van de open gebieden (.) en de bomen (#) die je langs de helling kunt waarnemen. Bijvoorbeeld:

..##.......
#...#...#..
.#....#..#.
..#.#...#.#
.#...##..#.
..#.##.....
.#.#.#....#
.#........#
#.##...#...
#...##....#
.#..#...#.#

Dit zijn echter niet de enige bomen. Door een verschijnsel waarover je ooit hebt gelezen dat te maken heeft met boomgenetica en bioomstabiliteit, herhaalt hetzelfde patroon zich verschillende keren naar rechts:

..##.........##.........##.........##.........##.........##.......  --->
#...#...#..#...#...#..#...#...#..#...#...#..#...#...#..#...#...#..
.#....#..#..#....#..#..#....#..#..#....#..#..#....#..#..#....#..#.
..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#
.#...##..#..#...##..#..#...##..#..#...##..#..#...##..#..#...##..#.
..#.##.......#.##.......#.##.......#.##.......#.##.......#.##.....  --->
.#.#.#....#.#.#.#....#.#.#.#....#.#.#.#....#.#.#.#....#.#.#.#....#
.#........#.#........#.#........#.#........#.#........#.#........#
#.##...#...#.##...#...#.##...#...#.##...#...#.##...#...#.##...#...
#...##....##...##....##...##....##...##....##...##....##...##....#
.#..#...#.#.#..#...#.#.#..#...#.#.#..#...#.#.#..#...#.#.#..#...#.#  --->

Je start bij het open gebied (.) in de linkerbovenhoek en moet de onderkant bereiken (onder de onderste rij op de kaart).

De rodel kan maar een paar speficieke hoeken volgen (je koos voor een goedkoper model dat een voorkeur heeft voor rationale getallen). Begin met alle bomen te tellen die je zou tegenkomt langs hoek 3 naar rechts en 1 naar beneden.

Controleer de positie 3 naar rechts en 1 naar beneden ten opzichte de startpositie in de linkerbovenhoek. Controleer daarna de positie 3 naar rechts en 1 naar beneden ten opzichte van deze positie, enzoverder totdat je voorbij de onderkant van de kaart gaat.

De posities die je in het bovenstaande voorbeeld zou controleren zijn aangeduid met een O waar er een open gebied was en met een X waar er een boom stond:

..##.........##.........##.........##.........##.........##.......  --->
#..O#...#..#...#...#..#...#...#..#...#...#..#...#...#..#...#...#..
.#....X..#..#....#..#..#....#..#..#....#..#..#....#..#..#....#..#.
..#.#...#O#..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#..#.#...#.#
.#...##..#..X...##..#..#...##..#..#...##..#..#...##..#..#...##..#.
..#.##.......#.X#.......#.##.......#.##.......#.##.......#.##.....  --->
.#.#.#....#.#.#.#.O..#.#.#.#....#.#.#.#....#.#.#.#....#.#.#.#....#
.#........#.#........X.#........#.#........#.#........#.#........#
#.##...#...#.##...#...#.X#...#...#.##...#...#.##...#...#.##...#...
#...##....##...##....##...#X....##...##....##...##....##...##....#
.#..#...#.#.#..#...#.#.#..#...X.#.#..#...#.#.#..#...#.#.#..#...#.#  --->

In dit voorbeeld zou het doorkruisen van de kaart onder de gegeven hoek ervoor zorgen dat je 7 bomen op je pad vindt.

Opgave

Schrijf een functie countTrees waaraan de padnaam (String) van een tekstbestand moet doorgegeven worden, met een kaart van de open gebieden (.) en de bomen (#) op een helling. De functie moet het aantal bomen (Int) teruggeven dat je zou tegenkomen als je vertrekt vanaf de linkerbovenhoek van de kaart en telkens 3 posities naar rechts en 1 naar beneden gaat.

Voorbeeld

In deze interactieve sessie gaan we ervan uit dat het tekstbestand slope.txt1 zich in de huidige directory bevindt.

> countTrees("slope.txt")
7

Epiloog

Mike LeSauvage (@MikeLeSauvage2) animeerde zijn oplossing voor deze opgave.