Welke persoon zit hierin verborgen?
Antwoord: MENDELEEV1 (Engelse spelling van de naam)
De cirkels uit de puzzel staan gerangschikt in een $$26 \times 26$$ rooster met 26 rijen en 26 kolommen. Als we de rijen van het rooster van boven naar onder aanduiden met opeenvolgende hoofdletters en de kolommen van links naar rechts met opeenvolgende kleine letters, dan kan de positie van elke cirkel in het rooster voorgesteld worden door twee letters: de hoofdletter waarmee de rij aangeduid wordt, gevolgd door de kleine letter waarmee de kolom aangeduid wordt. De positie van een cirkel op de hoofddiagonaal wordt echter slechts door één letter voorgesteld: de hoofdletter waarmee de rij aangeduid wordt (en die dus ook correspondeert met de letter van de kolom).
Als je nu goed kijkt dan zie je dat de rode cirkels corresponderen met posities die voorgesteld worden door één of twee letters van symbolen voor chemische elementen uit het periodiek systeem2: een tabel waarin alle bekende chemische elementen systematisch gerangschikt zijn. Deze rode cirkels moeten genegeerd worden: enkel de groene cirkels zijn belangrijk om het antwoord te vinden.
Als je nu in de puzzel kijkt welke cijfers er in de vijf groene cirkels staan (we hebben ze in kleine zwarte cirkels bij de groene cirkels geplaatst) dan zie je dat de groene cirkels oplopend genummerd worden vanaf 1. Dit bepaalt de volgorde waarin we de voorstellingen van de posities van de groene cirkels achter elkaar moeten zetten: de groene cirkel met cijfer 1 staat op positie M, die met cijfer 2 op positie En, die met cijfer 3 op positie De, die met cijfer 4 op positie Le, en die met cijfer 5 op positie Ev. Als we al deze posities achter elkaar zetten dan krijgen we dus MENDELEEV.
Een puzzelbestand is een tekstbestand met 26 regels waarop telkens 26 cijfers (0–9) staan. Dit is bijvoorbeeld het puzzelbestand dat correspondeert met de puzzel uit de inleiding (puzzel.txt3):
00300080000450000528300000 37001006505000000500000000 60238400000773300910400000 07003000000000000020000010 00000000000002000540550000 00006200000290000700000000 70033000000000000000000000 00006526000000100040000000 00000000200006000800000000 00000000000000000000000000 00000000002000000100000000 50004000500000000600290000 00990070000019600003000000 42079006700001760000000000 00000010000000100060000000 57070000000030350808100000 00000000000000000000000000 45008316000002000000800000 04408080900026000470000000 21803001400380000040000000 00000000000000000000600000 00000000000000000000070000 00000000000000000000001000 00003000000000000000000000 07000000000000000000000040 00000000000004000300000000
Daarin correspondeert elk cijfer 0 met een positie waarop geen cirkel staat in de puzzel en elk ander cijfer met een positie waarop een cirkel staat in de puzzel met daarin dat cijfer. Een puzzelbestand correspondeert dus met een weergave van de puzzel waarbij we ook cirkels met cijfer 0 zouden tekenen op posities waar nullen staan in het bestand.
In de weergave hierboven hebben we de rijen van boven naar onder oplopend genummerd vanaf 0. We hebben ook de kolommen van links naar rechts oplopend genummerd vanaf 0. Daardoor kunnen we elke positie in het $$26 \times 26$$ rooster van een puzzel voorstellen als een coördinaat: een tuple $$(r, k)$$ met twee getallen $$r, k \in \mathbb{N}$$ (int; $$0 \leq r, k < 26$$). Door rijen en kolommen zoals in de inleiding aan te duiden met letters, kunnen we elke positie in het rooster ook symbolisch voorstellen als één letter (str; voor posities op de hoofddiagonaal) of twee letters (str; voor posities buiten de hoofddiagonaal).
Gevraagd wordt:
Schrijf een functie symbool2coordinaat waaraan de symbolische voorstelling (str) van een positie $$p$$ in het $$26 \times 26$$ rooster van een puzzel moet doorgegeven worden. De functie moet de coordinaat (tuple) van positie $$p$$ teruggeven. Bij de interpretatie van de symbolische voorstelling van de positie mag geen onderscheid gemaakt worden tussen hoofdletters en kleine letters.
Schrijf een functie coordinaat2symbool waaraan de coordinaat (tuple) van een positie $$p$$ in het $$26 \times 26$$ rooster van een puzzel moet doorgegeven worden. De functie moet de symbolische voorstelling (str; in hoofdletters) van positie $$p$$ teruggeven.
Schrijf een functie symbolen waaraan twee argumenten moeten doorgegeven worden: i) de locatie (str) van een CSV-bestand4 met UTF-85 tekencodering en ii) het volgnummer $$i$$ (int) van een veld (kolom) in het CSV-bestand. De eerste regel van het CSV-bestand bevat een hoofding. De velden van een CSV-record worden oplopend genummerd vanaf 1 en worden van elkaar gescheiden door komma's (,). Een veld dat zelf komma's bevat, moet ingesloten worden tussen dubbele aanhalingstekens ("). Andere velden mogen optioneel ingesloten worden tussen dubbele aanhalingstekens. De functie moet een verzameling (set) teruggeven met de inhoud (str) van het $$i$$-de veld van alle CSV-records uit het bestand (zonder de hoofding) waarvan dit veld bestaat uit één of twee letters. Bovendien moet die inhoud omgezet worden naar hoofdletters, en moet de inhoud gereduceerd worden naar één letter als die bestaat uit twee dezelfde letters (xx moet bijvoorbeeld omgezet worden naar X).
Gebruik de csv-module6 om de records van CSV-bestanden te verwerken.
Schrijf een functie alle_coordinaten waaraan de locatie (str) van een puzzelbestand moet doorgegeven worden. De functie moet een dictionary (dict) teruggeven die elke coordinaat (tuple) van een cirkel uit de puzzel afbeeldt op het cijfer (int) in die cirkel.
Schrijf een functie geldige_coordinaten waaraan twee argumenten moeten doorgegeven worden: i) de locatie (str) van een puzzelbestand en ii) een collectie (list, tuple of set) met de symbolische voorstelling (str) van alle ongeldige posities in het rooster van de puzzel. De functie moet een dictionary (dict) teruggeven die elke coordinaat (tuple) van een cirkel uit de puzzel die niet op een ongeldige positie staat afbeeldt op het cijfer (int) in die cirkel.
Schrijf een functie verborgen_naam waaraan twee argumenten moeten doorgegeven worden: i) de locatie (str) van een puzzelbestand en ii) een collectie (list, tuple of set) met de symbolische voorstelling (str) van alle ongeldige posities in het rooster van de puzzel. De functie moet de naam (str; in hoofdletters) teruggeven die in de puzzel verborgen zit.
In onderstaande voorbeeldsessie gaan we ervan uit dat de tekstbestanden symbolen.csv7 en puzzel.txt8 zich in de huidige directory bevinden.
>>> symbool2coordinaat('Ac')
(0, 2)
>>> symbool2coordinaat('B')
(1, 1)
>>> symbool2coordinaat('MG')
(12, 6)
>>> coordinaat2symbool((0, 2))
'AC'
>>> coordinaat2symbool((1, 1))
'B'
>>> coordinaat2symbool((12, 6))
'MG'
>>> ongeldige_symbolen = symbolen('symbolen.csv9', 2)
>>> ongeldige_symbolen
{'AC', 'AG', 'AL', 'AM', 'AR', 'AS', 'AT', 'AU', 'B', 'BA', 'BE', 'BH', 'BI', 'BK', 'BR', 'C', 'CA', 'CD', 'CE', 'CF', 'CL', 'CM', 'CN', 'CO', 'CR', 'CS', 'CU', 'DB', 'DS', 'DY', 'ER', 'ES', 'EU', 'F', 'FE', 'FL', 'FM', 'FR', 'GA', 'GD', 'GE', 'H', 'HE', 'HF', 'HG', 'HO', 'HS', 'I', 'IN', 'IR', 'K', 'KR', 'LA', 'LI', 'LR', 'LU', 'LV', 'MC', 'MD', 'MG', 'MN', 'MO', 'MT', 'N', 'NA', 'NB', 'ND', 'NE', 'NH', 'NI', 'NO', 'NP', 'O', 'OG', 'OS', 'P', 'PA', 'PB', 'PD', 'PM', 'PO', 'PR', 'PT', 'PU', 'RA', 'RB', 'RE', 'RF', 'RG', 'RH', 'RN', 'RU', 'S', 'SB', 'SC', 'SE', 'SG', 'SI', 'SM', 'SN', 'SR', 'TA', 'TB', 'TC', 'TE', 'TH', 'TI', 'TL', 'TM', 'TS', 'U', 'V', 'W', 'XE', 'Y', 'YB', 'ZN', 'ZR'}
>>> alle_coordinaten('puzzel.txt10')
{(0, 2): 3, (0, 6): 8, (0, 11): 4, (0, 12): 5, (0, 17): 5, (0, 18): 2, (0, 19): 8, (0, 20): 3, (1, 0): 3, (1, 1): 7, (1, 4): 1, (1, 7): 6, (1, 8): 5, (1, 10): 5, (1, 17): 5, (2, 0): 6, (2, 2): 2, (2, 3): 3, (2, 4): 8, (2, 5): 4, (2, 11): 7, (2, 12): 7, (2, 13): 3, (2, 14): 3, (2, 17): 9, (2, 18): 1, (2, 20): 4, (3, 1): 7, (3, 4): 3, (3, 18): 2, (3, 24): 1, (4, 13): 2, (4, 17): 5, (4, 18): 4, (4, 20): 5, (4, 21): 5, (5, 4): 6, (5, 5): 2, (5, 11): 2, (5, 12): 9, (5, 17): 7, (6, 0): 7, (6, 3): 3, (6, 4): 3, (7, 4): 6, (7, 5): 5, (7, 6): 2, (7, 7): 6, (7, 14): 1, (7, 18): 4, (8, 8): 2, (8, 13): 6, (8, 17): 8, (10, 10): 2, (10, 17): 1, (11, 0): 5, (11, 4): 4, (11, 8): 5, (11, 17): 6, (11, 20): 2, (11, 21): 9, (12, 2): 9, (12, 3): 9, (12, 6): 7, (12, 12): 1, (12, 13): 9, (12, 14): 6, (12, 19): 3, (13, 0): 4, (13, 1): 2, (13, 3): 7, (13, 4): 9, (13, 7): 6, (13, 8): 7, (13, 13): 1, (13, 14): 7, (13, 15): 6, (14, 6): 1, (14, 14): 1, (14, 18): 6, (15, 0): 5, (15, 1): 7, (15, 3): 7, (15, 12): 3, (15, 14): 3, (15, 15): 5, (15, 17): 8, (15, 19): 8, (15, 20): 1, (17, 0): 4, (17, 1): 5, (17, 4): 8, (17, 5): 3, (17, 6): 1, (17, 7): 6, (17, 13): 2, (17, 20): 8, (18, 1): 4, (18, 2): 4, (18, 4): 8, (18, 6): 8, (18, 8): 9, (18, 12): 2, (18, 13): 6, (18, 17): 4, (18, 18): 7, (19, 0): 2, (19, 1): 1, (19, 2): 8, (19, 4): 3, (19, 7): 1, (19, 8): 4, (19, 11): 3, (19, 12): 8, (19, 18): 4, (20, 20): 6, (21, 21): 7, (22, 22): 1, (23, 4): 3, (24, 1): 7, (24, 24): 4, (25, 13): 4, (25, 17): 3}
>>> geldige_coordinaten('puzzel.txt11', ongeldige_symbolen)
{(3, 4): 3, (4, 13): 2, (4, 21): 5, (11, 4): 4, (12, 12): 1}
>>> verborgen_naam('puzzel.txt12', ongeldige_symbolen)
'MENDELEEV'