In het noordwesten van de Amerikaanse staat Texas ligt het stadje Dalhart. Austin, de hoofdstad Texas, is verder van dit stadje verwijderd dan de hoofdsteden van zes andere Amerikaanse staten. In vogelvlucht ligt Dalhart 306 kilometer van Santa Fe, 432 kilometer van Denver, 464 kilometer van Oklahoma City, 606 kilometer van Cheyenne, 684 kilometer van Topeka en 738 kilometer van Lincoln, terwijl het 786 kilometer verwijderd is van Austin.
De Verenigde Staten bestaan uit vijftig staten die elk een eigen hoofdstad hebben. Omdat verschillende Amerikaanse steden dezelfde naam hebben, worden plaatsnamen doorgaans aangeduid samen met de staat waarin ze liggen. In deze opgave zullen we steden steeds aanduiden met de naam van de stad, gevolgd door een komma en de twee-letter afkorting van de staat waarin de stad ligt (bijvoorbeeld Austin,TX).
Omdat er zelfs dubbele plaatsnamen voorkomen binnen dezelfde staat, is het nog eenduidiger om plaatsen aan te duiden met hun ligging. Daarom stellen we de coördinaten van een stad voor als een tuple $$(b, l)$$ ($$b, l \in \mathbb{R}, -90 < b \leq 90, -180 < l \leq 180$$), waarbij $$b$$ (int) de breedtegraad en $$l$$ (int) de lengtegraad aanduidt (beide uitgedrukt in decimale graden).
Voor een gegeven stad gaan we op zoek naar alle hoofdsteden van
Amerikaanse staten die dichter bij de stad liggen dan de hoofstad van zijn
eigen staat. Hiervoor gaan we als volgt te werk:
Schrijf een functie hoofdsteden waaraan de locatie (str) van een tekstbestand moet doorgegeven worden. Dit bestand moet een lijst van hoofdsteden bevatten, met voor elke hoofdstad op een afzonderlijke regel de naam van de hoofdstad, gevolgd door een komma en de twee-letter afkorting van de staat waarin de stad ligt. De functie moet een dictionary (dict) teruggeven die de twee-letter afkorting (str) van elke staat afbeeldt op de naam (str) van haar hoofdstad.
Schrijf een functie coordinaten waaraan de locatie (str) van een tekstbestand moet doorgegeven worden. Dit bestand moet een lijst van steden bevatten, met voor elke stad op een afzonderlijke regel de volgende informatievelden van elkaar gescheiden door een komma: i) naam, ii) twee-letter afkorting van de staat, iii) breedtegraad, en iv) lengtegraad. De functie moet een dictionary (dict) teruggeven die elke stad (str) afbeeldt op zijn coördinaat $$(b, l)$$.
Schrijf een functie grootcirkelafstand waaraan twee coördinaten $$(b_1, l_1)$$ en $$(b_2, l_2)$$ moeten doorgegeven worden. De functie moet de grootcirkelafstand (float) tussen de twee coördinaten teruggeven. Deze stelt de afstand tussen twee punten op een bol voor, en kan berekend worden aan de hand van de volgende formule \[d = r \cdot \arccos(\sin(b_1) \cdot \sin(b_2) + \cos(b_1)\cdot \cos(b_2) \cdot \cos(l_1 - l_2))\] Hierbij stelt $$r$$ de straal van de bol voor. De functie moet aannemen dat de Aarde bolvormig is met straal $$r = 6371\mbox{ km}$$, waardoor de afstand uitgedrukt wordt in kilometer.
Alle goniometrische functies in de math module werken met hoeken die uitgedrukt zijn in radialen. De lengte- en breedtegraden moeten dus omgezet worden naar radialen, maar daarvoor bestaat ook een functie in de math module.
Gebruik de functie grootcirkelafstand om een functie dichte_buren te schrijven waaraan drie argumenten moeten doorgegeven worden: i) een stad (str), ii) een dictionary (dict) die de twee-letter afkorting (str) van elke staat afbeeldt op de naam (str) van haar hoofdstad, en iii) een dictionary (dict) die elke stad (str) afbeeldt op zijn coördinaat $$(b, l)$$. De functie moet een verzameling (set) teruggeven met alle hoofdsteden (str) die dichter bij de gegeven stad liggen dan de hoofstad van zijn eigen staat. Voor de berekening van de afstand tussen steden moet gebruikgemaakt worden van de grootcirkelafstand.
Bij onderstaande voorbeeldsessie gaan we ervan uit dat de tekstbestanden hoofdsteden.txt1 en steden.txt2 zich in de huidige directory bevinden.
>>> hoofdstad = hoofdsteden('hoofdsteden.txt3')
>>> hoofdstad['TX']
'Austin'
>>> hoofdstad['NE']
'Lincoln'
>>> coordinaat = coordinaten('steden.txt4')
>>> coordinaat['Dalhart,TX']
(36.1173, -102.6024)
>>> coordinaat['Austin,TX']
(30.352, -97.7151)
>>> coordinaat['Lincoln,NE']
(40.908, -96.7103)
>>> grootcirkelafstand((36.1173, -102.6024), (30.352, -97.7151)) # Dalhart,TX <-> Austin,TX
785.5925593169209
>>> grootcirkelafstand((36.1173, -102.6024), (40.908, -96.7103)) # Dalhart,TX <-> Lincoln,NE
738.9516485722722
>>> dichte_buren('Dalhart,TX', hoofdstad, coordinaat)
{'Cheyenne,WY', 'Oklahoma City,OK', 'Topeka,KS', 'Santa Fe,NM', 'Lincoln,NE', 'Denver,CO'}
Het stadje Green River in de staat Wyoming is zeker een goede buur gebleken. Toen NASA in 1994 ontdekte dat Jupiter bedreigd werd door een mogelijk inslag van zes meteoren, besliste de gemeenteraad van Green River om de landingsbaan ten zuiden van de stad beschikbaar te stellen en doopte die meteen ook om tot Greater Green River Intergalactic Spaceport. Ze vroegen NASA om dit nieuws uit te sturen naar alle Jovianen op de vlucht en drongen er bij hun inwoners op aan om
… zich voor te bereiden om mogelijke vluchtelingen te verwelkomen die een beroep zouden willen doen op onze barmhartigheid
Burgemeester George Eckman vertelde aan de krant de Rock Springs Rocket-Miner
Ik zie het als een gebaar dat kon en moest gemaakt worden door iemand op planeet Aarde aan de medeburgers van ons zonnestelsel.
De twee gemeenteraadsleden die zich tegen de resolutie verzet hadden, argumenteerden dat de regio reeds voldoende problemen had met illegale vreemdelingen en wezen ook op de lokale woningnood. Tot op vandaag heeft geen enkel ruimteschip gebruikgemaakt van de luchthaven, maar het aanbod blijft wel gelden.