In het periodiek systeem krijgt elk scheikundig element een symbolische naam toegekend die bestaat uit één, twee of drie letters. Als een bepaald woord kan geschreven worden als opeenvolging van die symbolische namen voor scheikundige elementen, dan zeggen we dat dit woord een chemisch woord is. Zo is bijvoorbeeld katalyse een chemisch woord. Het kan immers geschreven worden als K-At-Al-Y-Se, de opeenvolging van symbolische namen voor de elementen kalium, astaat, aluminium, yttrium en seleen. Het woord katalysator is daarentegen geen chemisch woord. Hieronder staan alvast enkele voorbeelden van chemische woorden weergegeven.

scheikundige term chemisch woord
basisch Ba-Si-Sc-H
halogenen H-Al-O-Ge-Ne-N
katalyse K-At-Al-Y-Se
parenteraal Pa-Re-N-Te-Ra-Al
psychogene P-S-Y-C-Ho-Ge-Ne
sepsis Se-P-Si-S
sereus Se-Re-U-S

Opgave

Gegeven is een tekstbestand periodiek_systeem.txt1, dat een lijst met informatie over de elementen uit het periodiek systeem bevat. Elke regel — behalve de eerste die als hoofding geldt — bevat de volgende informatie over een element: i) atoomnummer, ii) symbolische voorstelling, iii) Engelstalige naam, iv) Nederlandstalige naam, en v) atoommassa. De informatievelden worden van elkaar gescheiden door een tab. Je opdracht voor deze opgave bestaat er in om voor een geven woord te bepalen of het een chemisch woord is of niet. Hiervoor ga je als volgt te werk:

  1. Schrijf een functie leesSymbolen waaraan de locatie van een tekstbestand moet doorgegegeven worden. De inhoud van dit tekstbestand moet opgemaakt zijn zoals het tekstbestand periodiek_systeem.txt2. De functie moet de lijst van symbolische namen teruggeven die voorkomen in de tweede kolom van het gegeven bestand3.

  2. Schrijf een functie langstePrefix waaraan twee parameters moeten doorgegeven worden. De eerste parameter woord is een string, en de tweede parameter symbolen is een lijst van strings. De functie moet de langste prefix van woord teruggeven die ook een symbolische naam is die voorkomt in de lijst symbolen. Zo zijn de symbolische namen B en Be beide prefixen van het woord berg. De functie moet echter de langste prefix teruggeven, dus gaat in dit geval de voorkeur naar de string Be. Indien geen enkele symbolische naam uit de lijst symbolen een prefix is van het gegeven woord, dan moet de functie een lege string als resultaat teruggeven. Bij het bepalen of een symbolische naam een prefix is van het gegeven woord, moet geen rekening gehouden worden met het verschil tussen hoofdletters en kleine letters. Behoud echter de schrijfwijze van de symbolische namen bij het teruggeven van de prefix: Be en niet BE of be.
    Terminologie: Een voorvoegsel bestaande uit één of meer letters vooraan een woord noemen we een prefix van dat woord. Zo is bijvoorbeeld chem een prefix van het woord chemie.

  3. Schrijf een functie chemischWoord waaraan twee parameters moeten doorgegeven worden. De eerste parameter woord is een string, en de tweede parameter symbolen is een lijst van strings. Indien het woord een chemisch woord is, dan moet de functie het woord als opeenvolging van symbolische namen voor scheikundige elementen teruggeven. Hierbij moeten de symbolische namen van elkaar gescheiden worden door een koppelteken (-). Indien het woord geen chemisch woord is, dan moet de functie een lege string teruggeven.
    De te volgen procedure om te bepalen of een woord een chemisch woord is of niet, en tegelijkertijd ook de schrijfwijze als opeenvolging van symbolische namen te genereren, wordt in onderstaande tabel geïllustreerd aan de hand van het woord katalyse. Zolang het woord niet gereduceerd is tot de lege string, bepaal je de langste prefix van het woord die ook een symbolische naam voor een element is (uiteraard door gebruik te maken van de functie langstePrefix). Indien er een prefix wordt gevonden die geen lege string is, dan verwijder je deze prefix vooraan het woord en voeg je die achteraan toe aan de opeenvolging van symbolische namen (rekening houdend met het plaatsen van koppeltekens). Van zodra de langste prefix een lege string oplevert, kan je besluiten dat het woord geen chemisch woord is en dus een lege string laten teruggeven door de functie. Indien je bovenstaande procedure echter kunt blijven herhalen tot het originele woord gereduceerd is tot de lege string, dan mag je besluiten dat het woord een chemisch woord is en heb je meteen ook de schrijfwijze als opeenvolging van symbolische namen gevonden.

    woord langste prefix chemisch woord
    katalyse K
    atalyse At K
    alyse Al K-At
    yse Y K-At-Al
    se Se K-At-Al-Y
        K-At-Al-Y-Se

Voorbeeld

Bij de onderstaande interactieve Python sessie gaan we ervan uit dat het tekstbestand periodiek_systeem.txt4 zich in de huidige directory bevindt.

>>> symbolen = leesSymbolen('periodiek_systeem.txt')

>>> langstePrefix('agentia', symbolen)
'Ag'
>>> langstePrefix('somatisch', symbolen)
'S'
>>> langstePrefix('dichtheid', symbolen)
''

>>> chemischWoord('katalyse', symbolen)
'K-At-Al-Y-Se'
>>> chemischWoord('basisch', symbolen)
'Ba-Si-Sc-H'
>>> chemischWoord('lesie', symbolen)
''