Telecommunicatie kreeg in Frankrijk een vroege start toen uitvinder Claude Chappe in 1792 een reeks torens bouwde tussen Rijsel en Parijs. Bovenaan elke toren werd een constructie van beweegbare houten armen aangebracht. Deze armen konden zo geschikt worden dat ze een bepaald symbool voorstelden. Als de operatoren door middel van een telescoop de opstelling van naburige torens in de gaten hielden, dan kon een symbool in 9 minuten over de 15 torens langs het 200 kilometer lange traject doorgestuurd worden. Tijdens de gevoelige periode van de revolutie gaf deze vorm van communicatie aan Frankrijk een enorm voordeel tegenover de omliggende machten.
Deze mechanische vorm van het Internet avant la lettre kreeg bijvoorbeeld een vermelding in De graaf van Monte-Cristo1 (Alexandre Dumas, 1844, originele Franse titel: Le Comte de Monte-Cristo):
Ze gingen naar de derde verdieping en bereikten zo de kamer van de telegraaf. Monte Cristo keek heen en weer naar de twee ijzeren handvatten waarmee de machine bediend werd. "Dit is uiterst interessant", zei hij, "maar het lijkt me een zeer tijdrovende bezigheid."
"Ja. In eerste instantie kreeg ik steeds een stijve nek door ernaar te kijken. Maar naar het einde van het jaar toe begon ik eraan gewend te raken. En toen kregen we eerst een paar uur ontspanning, en daarna zelfs een heuse vakantie."
"Vakantie?"
"Ja"
"Wanneer?"
"Toen de mist begon op te komen."
De Chappe semafoorlijn groeide op zijn hoogtepunt uit tot een netwerk van 534 torens. Het systeem werkte zeer goed, maar was ontzettend duur door de nood aan goed opgeleide operatoren die om de 10-30 kilometer een toren moesten bemannen. Bovendien kon de berichtgeving moeilijk geheim gehouden worden.
De opkomst van de elektrische telegraaf betekende uiteindelijk het doodvonnis van de Chappe-lijn. Zweden doekte de laatste commerciële semafoorlijn op in 1880. Tegen die tijd had Claude Chappe — depressief door ziekte en de overtuiging dat anderen zijn idee hadden gestolen — zichzelf al lang van kant gemaakt.
Definieer een klasse Chappe waarmee een netwerk van telegraaftorens kan voorgesteld worden in Python. De objecten van deze klassen moeten minstens de volgende methoden hebben.
Een initialisatiemethode waaraan de locatie van een tekstbestand moet doorgegeven worden. Je mag ervan uitgaan dat het tekstbestand de Unicode tekenset gebruikt met UTF-8 codering (zie hieronder). Dit bestand beschrijft een netwerk van torens die met elkaar kunnen communiceren. Elke regel van het bestand bevat de namen van twee naburige torens (aangegeven met de naam van de stad waar de torens zich bevinden), van elkaar gescheiden door een tab.
Een methode buren waaraan de naam van een toren (stad) moet doorgegeven worden. De methode moet een verzameling teruggeven met de namen van alle naburige torens (steden) van de gegeven toren.
Een methode tussenstations waaraan twee namen van torens (steden) moeten doorgegeven worden. De methode moet een natuurlijk getal teruggeven, dat aangeeft hoeveel keer een symbool minimaal moet doorgestuurd worden van een toren naar een naburige toren in het netwerk, om het bericht door te sturen tussen de twee gegeven torens. Indien het bericht niet kan doorgestuurd worden tussen de twee gegeven torens — omdat die behoren tot twee subnetwerken die niet met elkaar verbonden zijn — dan moet de functie de waarde -1 teruggeven.
Als aan de methoden buren of tussenstations de naam van een toren wordt doorgegeven die niet tot het netwerk behoort, dan moet de methode een AssertionError opwerpen met de boodschap stad behoort niet tot netwerk.
Om de kortste route te vinden tussen toren1 en toren2 in een netwerk, kan je als volgt te werk gaan:
Initialiseer $$U$$ = [toren1] als een lijst met torens waarvan de buren nog moeten verwerkt worden, en $$P$$ = {toren1:0} als een dictionary die elke verwerkte toren afbeeldt op de kortste afstand van die toren tot toren1.
Verwijder de eerste toren uit $$U$$ en verwerk zijn buren in het netwerk door elke onverwerkte buur achteraan toe te voegen aan $$U$$ en de kortste afstand van toren1 tot elke onverwerkte buur toe te voegen aan $$P$$.
Blijf stap 2 herhalen totdat er een buur bereikt wordt die gelijk is aan toren2 (bedenk zelf hoe je dan aan de afstand komt tot toren1) of totdat $$U$$ leeg is (wat aangeeft dat toren2 niet kon bereikt worden vanuit toren1).
Unicode is een internationale standaard voor de codering van binaire codes naar grafische tekens en symbolen, vergelijkbaar met de ASCII-standaard. De Unicode tekenset is echter veel uitgebreider dan de 256 symbolen van de ASCII-tekenset. Unicode ondersteunt een aantal mogelijke coderingen voor de tekenset, die aangeven hoe de symbolen binair voorgesteld worden. Als je in Python een Unicode bestand wilt openen, dan kan de gebruikte codering doorgegeven worden aan de parameter encoding van de ingebouwde functie open. Om bijvoorbeeld informatie te lezen uit het Unicode bestand chappe.txt2 dat gebruikt maakt van UTF-8 codering, kan het bestand als volgt geopend worden:
>>> open('chappe.txt', 'r', encoding='utf-8')
Bij onderstaande voorbeeldsessie gaan we ervan uit dat het bestand chappe.txt3 zich in de huidige directory bevindt. Dit bestand bevat een omschrijving van het netwerk van torens dat hieronder grafisch wordt weergegeven. Merk hierbij op dat er bijvoorbeeld geen verbinding is tussen Avignon en Marseille, waardoor er geen berichten kunnen verstuurd worden tussen Lille en Marseille (ze behoren tot twee verschillende subnetwerken).
>>> netwerk = Chappe('chappe.txt')
>>> netwerk.buren('Lille')
{'Paris', 'Bruxelles', 'Dunkerque', 'Boulogne'}
>>> netwerk.buren('Paris')
{'Tours', 'Dreux', 'Tonerre', 'Lille'}
>>> netwerk.buren('Brest')
{'St Brieux'}
>>> netwerk.buren('Londres')
Traceback (most recent call last):
AssertionError: stad behoort niet tot netwerk
>>> netwerk.tussenstations('Lille', 'Lille')
0
>>> netwerk.tussenstations('Lille', 'Tours')
2
>>> netwerk.tussenstations('Lille', 'Toulouse')
11
>>> netwerk.tussenstations('Lille', 'Montpellier')
9
>>> netwerk.tussenstations('Lille', 'Perpignan')
11
>>> netwerk.tussenstations('Lille', 'Marseille')
-1
>>> netwerk.tussenstations('Lille', 'Londres')
Traceback (most recent call last):
AssertionError: stad behoort niet tot netwerk