Een van de boeiendste dingen aan het leren van vreemde talen is de vaststelling dat sommige woorden onmogelijk kunnen vertaald worden. Gewoonweg omdat ze geen directe tegenhanger hebben in onze taal. Want hoe vertaal je in hemelsnaam de veertien verschillende woorden die eskimo's gebruiken voor sneeuw? Of het Zweedse woord lagom, dat zoveel betekent als "niet te veel, en niet te weinig". Ook het Duitse woord überhaupt bleek zó moeilijk te vertalen dat we het uiteindelijk ongewijzigd hebben overgenomen.
Zo heeft het Zweeds ook geen woorden die equivalent zijn aan grootmoeder of grootvader. Bij het benoemen van hun voorouders zullen Zweden immers altijd aangeven of ze verwijzen naar de afstamming langs moeders- of vaderszijde. In het Zweeds vertaal je moeder door mor en vader door far. Je grootmoeder langs moederszijde wordt dan mormor (letterlijk: je moeder's moeder) en je grootmoeder langs vaderszijde farmor (letterlijk: je vader's moeder). Analoog vertaal je grootvader langs moederszijde door morfar en grootvader langs vaderszijde door farfar. Als je dat toch naar het Nederlands zou willen vertalen, dan kom je uit bij iets als mama, mapa, pama en papa. En dat lijkt toch echt wel nergens op?
Op dezelfde manier verwijzen Zweden naar hun overgrootouders, bedovergrootouders en nog verdere voorouders. Zo is morfarfar bijvoorbeeld je moeder's vader's vader, en is farmorfarmor je vader's moeder's vader's moeder.
De Zweedse manier om voorouders te omschrijven levert soms ingewikkelde situaties op. Voorouders worden immers op verschillende manieren aangesproken door hun nakomelingen, zelfs al zijn die van dezelfde generatie. Heeft een grootmoeder kleinkinderen van haar zonen én haar dochters, dan lopen die door elkaar farmor en mormor te schreeuwen. Ondertussen weet grootvader niet meer of hij nu eerst op morfar dan wel op farfar moet reageren.
In deze opgave werken we met familiestambomen die opgesteld werden volgens een vereenvoudigd model, waarbij steeds aan de volgende voorwaarden voldaan is:
elke persoon heeft een unieke naam, die geen spaties bevat
elke persoon heeft hoogstens met één partner (van het ander geslacht) kinderen
elk kind heeft altijd één moeder en één vader; ouders zijn niet noodzakelijk opgenomen in de stamboom, maar als één van de ouders van het kind is opgenomen, dan is de andere dat automatisch ook
elke persoon heeft in de stamboom een uniek pad naar elk van zijn voorouders
Onderstaande afbeelding toont een voorbeeld van zo een familiestamboom, waarbij vrouwen worden aangeduid in het roze en mannen in het blauw. Koppels met kinderen worden verbonden door een dikke horizontale streep, en de overige relaties moeten van boven naar onder gelezen worden, met bovenaan de moeder en de vader, en daaronder hun kinderen. De laatste voorwaarde die we opgelegd hebben aan familiestambomen betekent dat er geen incest is binnen een stamboom (er komen bijvoorbeeld dus nooit kinderen voort uit een relatie tussen een vader en zijn dochter, of uit relaties tussen neven en nichten).
De relaties uit een familiestamboom worden opgeslaan in een tekstbestand, waarvan elke regel bestaat uit drie of meer namen die van elkaar gescheiden worden door spaties. De eerste naam is die van de moeder, de tweede die van de vader, en de overige namen die van hun kinderen. Op die manier bevat onderstaand voorbeeldbestand alle relaties uit de familiestamboom in bovenstaande afbeelding.
Alana Ronan Beatrice August Beatrice Clarence Ramiro Regan Alexandra Ramiro Carlos Luciana Ciara Regan Damari Alberto Natalee Amira August Drake Eric Rosa Jadon Rosa Jovanni Kole Sincere Emmy Gabriella Xzavier Teresa Jadon Cadence Gavyn Aryana
Merk op dat er geen vaste volgorde is waarin de regels van het bestand opgelijst worden. Gevraagd wordt:
Schrijf een functie familieleden waaraan de locatie van een tekstbestand moet doorgegeven worden. Dit tekstbestand moet informatie bevatten over een familiestamboom, in het formaat zoals hierboven beschreven. De functie moet een object teruggeven dat de namen van alle leden uit de familiestamboom afbeeldt op een object dat de volgende sleutels kan bevatten:
moeder: wordt afgebeeld op de naam van de moeder van het familielid
vader: wordt afgebeeld op de naam van de vader van het familielid
kinderen: wordt afgebeeld op een lijst met de namen van alle kinderen van het familielid
Enkel sleutels die overeenkomen met relaties waarover informatie kan afgeleid worden uit het gegeven tekstbestand mogen opgenomen worden in het object.
Schrijf een functie voorouder waaraan drie argumenten moeten doorgegeven worden: i) de naam van een familielid, ii) de Zweedse omschrijving van een voorouder en iii) een object dat de relaties in een familiestamboom omschrijft (opgemaakt zoals de objecten die worden teruggegeven door de functie familieleden). De functie moet de naam teruggeven van de voorouder die door het gegeven familielid in het Zweeds wordt aangesproken met de gegeven omschrijving, rekening houdend met de relaties in de gegeven familiestamboom. Hierbij mag de functie ervan uitgaan dat de gegeven naam van het familielid als sleutel voorkomt in het gegeven object, en dat de Zweedse omschrijving van de voorouder een string is die is samengesteld uit de deelstrings mor en far, zonder dat dit expliciet moet gecontroleerd worden. Indien de gegeven familiestamboom geen voorouder van het gegeven familielid bevat die wordt aangesproken met de gegeven omschrijving, dan moet de functie een AssertionError opwerpen met de boodschap onbekende voorouder.
Schrijf een functie nakomelingen waaraan drie argumenten moeten doorgegeven worden: i) de naam van een familielid, ii) een getal $$n \in \mathbb{N}_0$$ en iii) een object dat de relaties in een familiestamboom omschrijft (opgemaakt zoals de objecten die worden teruggegeven door de functie familieleden). De functie moet een object teruggeven waarvan de sleutels bestaan uit alle Zweedse omschrijvingen waarmee het gegeven familielid wordt aangesproken door zijn/haar $$n$$-de generatie nakomelingen uit de gegeven familiestamboom. Elk van deze omschrijvingen moet door het object afgebeeld worden op een lijst met alle nakomelingen uit de gegeven familiestamboom die het gegeven familielid met die omschrijving aanspreken. Deze lijst moet alfabetisch gesorteerd worden. Hierbij mag de functie ervan uitgaan dat de gegeven naam van het familielid als sleutel voorkomt in het gegeven object, zonder dat dit expliciet moet gecontroleerd worden. De generaties nakomelingen worden bepaald relatief ten opzichte van het gegeven familielid: de eerste generatie bestaat uit de kinderen van het familielid, de tweede generatie uit de kleinkinderen, de derde generatie uit de achterkleinkinderen, enzoverder.
Bij onderstaande voorbeeldsessie gaan we ervan uit dat het bestand data.txt1 zich in de huidige directory bevindt. Dit is het tekstbestand dat overeenkomt met de familiestamboom die als voorbeeld gebruikt werd bij de omschrijving van de opgave.
>> const relaties = familieleden('data.txt');
>> relaties['Sincere'];
{'vader': 'Jovanni', 'moeder': 'Rosa'}
>> relaties['August'];
{'vader': 'Ronan', 'moeder': 'Alana', 'kinderen': ['Eric', 'Drake', 'Jadon', 'Rosa']}
>> relaties['Ronan'];
{'kinderen': ['Beatrice', 'August']}
>> voorouder('Drake', 'mor', relaties);
'Amira'
>> voorouder('Rosa', 'farmor', relaties);
'Alana'
>> voorouder('Sincere', 'morfarfar', relaties);
'Ronan'
>> voorouder('Luciana', 'morfarmor', relaties);
AssertionError: onbekende voorouder
>> nakomelingen('Ronan', 1, relaties);
{'far': [ 'August', 'Beatrice']}
>> nakomelingen('Ronan', 2, relaties);
{'morfar': ['Ramiro', 'Regan'], 'farfar': ['Drake', 'Eric', 'Jadon', 'Rosa']}
>> nakomelingen('Ronan', 3, relaties);
{'farmorfar': ['Carlos', 'Ciara', 'Luciana'], 'farfarfar': ['Aryana', 'Cadence', 'Gavyn'], 'mormorfar': ['Alberto', 'Natalee'], 'morfarfar': ['Emmy', 'Gabriella', 'Kole', 'Sincere', 'Xavier']}
Het woord mamihlapinatapais uit de taal van het Yaghanvolk2 dat in het ijzige Vuurland woont, wordt beschouwd als het meest beknopte woord ter wereld — ook het woord dat het moeilijkst te vertalen valt. Het betekent zoveel als "een blik die twee personen elkaar toewerpen, waarbij ze elk willen dat de ander iets op gang brengt waar ze alletwee vurig naar verlangen, maar waarvoor geen van beide zin heeft om het initiatief te nemen".
Een bevraging uit 2004 onder 1000 taalkundigen leverde nog een ander woord op dat het moeilijkst te vertalen woord ter wereld zou moeten zijn: ilunga. Het woord is afkomstig uit het Tshiluba3, een Bantoetaal die gesproken wordt in de Democratische Republiek Congo, die daar ook een officiële taal is die in het onderwijs gebruikt wordt. Het betekent "een persoon die bereid is om misbruik een eerste keer te vergeven, en het ook een tweede keer nog tolereert, maar nooit een derde keer".
Hier zijn nog enkele favoriete woorden van taalkundige Mikael Parkvall van de Universiteit van Stockholm, uit zijn Limits of language: almost everything you didn't know about language and languages4 (2006):
klunen (Fries): wandelen of lopen over land met schaatsen aan (doorgaans om zich van het ene bevroren wateroppervlak naar het andere te begeven)
aɣone (Kuot): op zo een manier uit een fles drinken dat de straaltjes kwijl uit de mond terug in de fles lopen
fringsen (Duits): het stelen van steenkool uit treinwagons of aardappelen van de velden om te kunnen overleven
knedlikový (Tsjechisch): over knoedels (dumplings) die vrij onvolledig zijn
qamigartuk (Yup'ik): hij die in het voorjaar op zeehondenjacht gaat met een kleine slee en een kajak
baleŋga (Chavacano): overmatig zwaaien met de armen tijdens het wandelen
kallsup (Zweeds): een slok water die door een zwemmer per ongeluk ingeslikt wordt
googly (Engels): (over een bal die geworpen wordt in cricket) vermomd door de werper met een actie die schijnbaar de benen doet breken
Gunwinggu — een taal gesproken in het noordwesten van Australië — kent afzonderlijke werkwoorden als beschrijving voor het rondhuppelen van verschillende soorten kangoeroes:
kamurlbardme: het rondhuppelen van een zwarte wallaroe (Macropus bernardus5)
kalurlhlurme: het rondhuppelen van een zandwallaby (Macropus agilis6)
kamawudme: het rondhuppelen van een mannelijke antilopekangoeroe (Macropus antilopinus7)
kadjalwahme: het rondhuppelen van een vrouwelijke antilopekangoeroe (Macropus antilopinus8)