De hogesnelheidstrein verlaat het bos en brengt je snel naar het zuiden. In de verte zie je zelfs een woestijn opdoemen! Omdat je wat vrije tijd hebt, kun je net zo goed nog eens kijken of er iets interessants te zien is op de afbeelding die de satelliet van het Mythical Information Bureau geregistreerd heeft.
Nadat je de satellietberichten gedecodeerd hebt, ontdek je dat de gegevens eigenlijk bestaan uit veel kleine afbeeldingen die door de camera-array van de satelliet gemaakt zijn. Die camera-array bestaat uit een reeks afzonderlijke camera’s. In plaats van één grote vierkante afbeelding te produceren, produceren ze veel kleinere vierkante afbeeldingstegels die opnieuw moeten samengevoegd worden tot één enkele afbeelding.
Elke camera van de camera-array produceert één monochrome afbeeldingstegel met een willekeurig uniek ID-nummer. Je hebt de tegels (de invoer van deze opgave) in een willekeurige volgorde ontvangen.
Om het nog wat erger te maken, blijkt de camera-array ook niet goed te werken: elke afbeeldingstegel is op een willekeurige manier geroteerd en omgedraaid. Je eerste opdracht is om de originele afbeelding terug in elkaar te zetten door de tegels zo te oriënteren dat ze aan elkaar passen.
Om te tonen hoe de tegels moeten samengevoegd worden, bevatten de afbeeldingsgegevens van elke tegel een rand die precies moet passen met de rand van aangrenzende tegels. Alle tegels hebben zo’n rand en de randen moeten passen als beide tegels correct georiënteerd zijn. Tegels aan de rand van de afbeelding hebben ook zo’n rand, maar de randen aan de buitenkant van de originele afbeelding passen niet met andere tegels.
Stel bijvoorbeeld dat je de volgende negen tegels ontvangen hebt:
Tile 2311:
..##.#..#.
##..#.....
#...##..#.
####.#...#
##.##.###.
##...#.###
.#.#.#..##
..#....#..
###...#.#.
..###..###
Tile 1951:
#.##...##.
#.####...#
.....#..##
#...######
.##.#....#
.###.#####
###.##.##.
.###....#.
..#.#..#.#
#...##.#..
Tile 1171:
####...##.
#..##.#..#
##.#..#.#.
.###.####.
..###.####
.##....##.
.#...####.
#.##.####.
####..#...
.....##...
Tile 1427:
###.##.#..
.#..#.##..
.#.##.#..#
#.#.#.##.#
....#...##
...##..##.
...#.#####
.#.####.#.
..#..###.#
..##.#..#.
Tile 1489:
##.#.#....
..##...#..
.##..##...
..#...#...
#####...#.
#..#.#.#.#
...#.#.#..
##.#...##.
..##.##.##
###.##.#..
Tile 2473:
#....####.
#..#.##...
#.##..#...
######.#.#
.#...#.#.#
.#########
.###.#..#.
########.#
##...##.#.
..###.#.#.
Tile 2971:
..#.#....#
#...###...
#.#.###...
##.##..#..
.#####..##
.#..####.#
#..#.#..#.
..####.###
..#.#.###.
...#.#.#.#
Tile 2729:
...#.#.#.#
####.#....
..#.#.....
....#..#.#
.##..##.#.
.#.####...
####.#.#..
##.####...
##..#.##..
#.##...##.
Tile 3079:
#.#.#####.
.#..######
..#.......
######....
####.#..#.
.#...#.##.
#.#####.##
..#.###...
..#.......
..#.###...
Door de tegels te roteren, om te draaien en te herschikken, kun je er een vierkant mee vormen zodat alle aangrenzende randen met elkaar passen:
#...##.#.. ..###..### #.#.#####.
..#.#..#.# ###...#.#. .#..######
.###....#. ..#....#.. ..#.......
###.##.##. .#.#.#..## ######....
.###.##### ##...#.### ####.#..#.
.##.#....# ##.##.###. .#...#.##.
#...###### ####.#...# #.#####.##
.....#..## #...##..#. ..#.###...
#.####...# ##..#..... ..#.......
#.##...##. ..##.#..#. ..#.###...
#.##...##. ..##.#..#. ..#.###...
##..#.##.. ..#..###.# ##.##....#
##.####... .#.####.#. ..#.###..#
####.#.#.. ...#.##### ###.#..###
.#.####... ...##..##. .######.##
.##..##.#. ....#...## #.#.#.#...
....#..#.# #.#.#.##.# #.###.###.
..#.#..... .#.##.#..# #.###.##..
####.#.... .#..#.##.. .######...
...#.#.#.# ###.##.#.. .##...####
...#.#.#.# ###.##.#.. .##...####
..#.#.###. ..##.##.## #..#.##..#
..####.### ##.#...##. .#.#..#.##
#..#.#..#. ...#.#.#.. .####.###.
.#..####.# #..#.#.#.# ####.###..
.#####..## #####...#. .##....##.
##.##..#.. ..#...#... .####...#.
#.#.###... .##..##... .####.##.#
#...###... ..##...#.. ...#..####
..#.#....# ##.#.#.... ...##.....
Ter informatie: de ID-nummers van bovenstaande tegels zijn:
1951 2311 3079
2729 1427 2473
2971 1489 1171
Om te controleren of je de afbeelding correct hebt samengevoegd, vermenigvuldig je de ID-nummers van de vier hoektegels met elkaar. Als je dit doet met de samengevoegde tegels uit bovenstaand voorbeeld, dan krijg je 1951 * 3079 * 2971 * 1171
= 20899048083289
.
Voeg de tegels samen tot één grote afbeelding. Wat krijg je als je de ID-nummers van de vier hoektegels met elkaar vermenigvuldigt? Hiervoor ga je als volgt te werk:
corners
waaraan de padnaam (String
) van een tekstbestand met \(n\) tegels moet doorgegeven worden, waarbij \(n\) een volkomen kwadraat is. De functie moet het product (Int
) teruggeven van de ID-nummers van de vier hoektegels.In deze interactieve sessie gaan we ervan uit dat het tekstbestand tiles.txt
1 zich in de huidige directory bevindt.
> corners("tiles.txt")
20899048083289