Onze maan vertoont zogenaamde schijngestalten, wat wil zeggen dat ze zich gedurende haar omloop rond de aarde in verschillende gedaanten laat zien. Dit fenomeen wordt veroorzaakt door het feit dat de maan vanuit een andere richting door de zon wordt bestraald dan de richting waarin ze wordt waargenomen. Hierdoor lijkt het alsof de terminator (de scheidingslijn tussen licht en donker) zich over de oppervlakte van de maan verplaatst, waardoor de maan te zien is als een sikkelvormig of rond lichaam.

De periode waarin de maan rond de aarde draait wordt over het algemeen onderverdeeld in vier maanfasen: nieuwe maan, eerste kwartier, volle maan en laatste kwartier. Als je voor een gegeven datum kunt bepalen hoeveel dagen er zijn verstreken sinds de laatste nieuwe maan, dan kan je de corresponderende maanfase bepalen door te kijken in welke vierde deel van de periode van de maanrotatie dit aantal dagen valt (zie onderstaande figuur).

De schijngestalten van de maan.

De maan draait in een baan om de aarde met een periode van p = 29.530588853 dagen. Als we weten dat er een nieuwe maan voorkwam op 6 januari 2000, dan kunnen we op basis van onderstaande formule het aantal dagen sinds de laatste nieuwe maan bepalen. We noteren dit aantal dagen als \(d_n = d_r\!\!\!\mod{p}\).

Hierbij stelt \(d_r\) het aantal dagen voor sinds de referentiedatum van 6 januari 2000. Stel dat we bijvoorbeeld de maanfase willen bepalen voor de datum 21/06/2010. Er zijn op deze datum reeds 3819 dagen verstreken sinds 6 januari 2000, waardoor in dit geval \(d_n = 9.55\). Aangezien de waarde van \(d_n\) in het tweede deel van de vierdelige onderverdeling van de maanperiode valt, correspondeert deze datum dus met de maanfase eerste kwartier.

Opgave

Schrijf een bash shell script maanfase waaraan twee gehele getallen moeten doorgegeven worden. Deze argumenten stellen respectievelijk het volgnummer van een maand en een jaartal voor. Het script moet naar standaard uitvoer één enkele regel uitschrijven (stdout) waarop de maanfasen voor de verschillende dagen van de maand zijn weergegeven. Hierbij mag verondersteld worden dat elke maand 31 dagen telt. Voorts wordt de maanfase nieuwe maan voorgesteld door @, eerste kwartier door ), volle maan door O en laatste kwartier door (.

Algoritme

Om te berekenen hoeveel dagen zijn verstreken sinds 6 januari 2000, kan het Juliaanse dagnummer jdn gebruikt worden. Voor een gegeven datum dd/mm/jjjj kan dit als volgt berekend worden:

Alle delingen stellen hierbij gehele delingen (quotiënt) voor. Het dagnummer voor de datum 21/06/2010 is bijvoorbeeld 2455369.

Tip

Als je gebruikmaakt van het commando bc om te rekenen met reële getallen, dan zal je merken dat het commando

$ bc <<< "4 / 3"
1

de waarde 1 als resultaat teruggeeft. De waarde die je toekent aan de bc-variabele scale geeft aan hoeveel cijfers na de komma het resultaat moet bevatten. Deze waarde moet toegekend worden voor het uitvoeren van de berekening en is standaard ingesteld op nul. Het commando

$ bc <<< "scale=2;4 / 3"
1.33

zal dus de waarde 1.33 teruggeven.

Tip

De GNU-versie van het commando bc kan ook booleaanse expressies evalueren. Het commando

$ bc <<< "7 > 3"
1

geeft de waarde 1 terug. Het commando

$ bc <<< "7 < 3"
0

geeft de waarde 0 terug.

Voorbeeld

Dit is hoe je het bash shell script maanfase moet kunnen gebruiken.

$ maanfase 6 2010
1O2O3O4O5(6(7(8(9(10(11(12@13@14@15@16@17@18@19)20)21)22)23)24)25)26)27O28O29O30O31O
$ maanfase 6 2009
1)2)3)4)5)6)7)8O9O10O11O12O13O14O15(16(17(18(19(20(21(22(23@24@25@26@27@28@29@30)31)

Hierbij geeft de uitvoer 1O2O3O4O5(6(... bijvoorbeeld aan dat er een volle maan voorkomt op de eerste dag van de maand, en dat de maan zich in het laatste kwartier bevindt op de zesde dag van de maand.