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 (dit is de scheidingslijn van 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).

maanfase

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.

Gevraagd wordt om een bash shell script maanfase te schrijven. Aan het shell script moeten twee gehele getallen als argument meegegeven worden, die respectievelijk het volgnummer van een maand en een jaartal voorstellen. Het shell script moet één enkele regel teruggeven 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 (.

Onderstaande sessie illustreert de werking van het shell script maanfase.

$ 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.

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

Alle delingen stellen hierbij gehele delingen voor. Het nummer voor de datum 21/06/2010 is bijvoorbeeld 2455369.

Tip: Als je gebruik maakt van het commando bc om te rekenen met reële getallen, dan zal je merken dat het commando echo "4/3"|bc als resultaat de waarde 1 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 echo "scale=2;4/3"|bc zal dus de waarde 1.33 teruggeven.

Tip: De GNU versie van het commando bc kan ook booleaanse expressies evalueren. Het commando echo "7>3|bc" geeft de waarde 1 terug, en het commando echo "7<3|bc" geeft de waarde 0 terug.