Een sterrendatum (Engels: stardate) is een fictieve tijdseenheid die ontwikkeld werd voor de Star Trek televisieseries en films. Bij aanvang van bijna elke aflevering hoort men een commentaarstem het logboek inspreken, waarbij de sterrendatum van de aflevering vermeldt wordt.

sterrendatum

Alhoewel het algemene idee achter de sterrendatum sterk lijkt op de juliaanse dag1 zoals die door sterrenkundigen gebruikt wordt, hebben schrijvers en producenten van de Star Trek televisieseries en films doorheen de jaren verschillende methoden gebruikt om sterrendatums aan afleveringen of gebeurtenissen toe te kennen, sommige al meer willekeurig dan andere. Dit maakt het onmogelijk om alle sterrendatums om te zetten naar onze tijdrekening, vooral omdat de sterrendatum oorspronkelijk ingevoerd werd om het precieze tijdperk waarin Star Trek zich afspeelt vaag te houden. Het volgende uittreksel uit de Star Trek Guide (17 april 1967, p. 25) geef instructies aan de schrijvers van de oorspronkelijke Star Trek televisieserie2 over hoe ze sterrendatums moeten kiezen voor hun scripts.

We invented “Stardate” to avoid continually mentioning Star Trek’s century (actually, about two hundred years from now), and getting into arguments about whether this or that would have developed by then. Pick any combination of four numbers plus a percentage point, use it as your story’s stardate. For example, 1313.5 is twelve o’clock noon of one day and 1314.5 would be noon of the next day. Each percentage point is roughly equivalent to one-tenth of one day. The progression of stardates in your script should remain constant but don’t worry about whether or not there is a progression from other scripts. Stardates are a mathematical formula which varies depending on location in the galaxy, velocity of travel, and other factors, can vary widely from episode to episode.

Volgens bedenker Gene Roddenberry3 werd de sterrendatum bedacht om te voorkomen dat de gebeurtenissen in de televisieserie naar een specifiek jaar konden herleid worden. Later gaf hij de volgende uitleg:

“This time system adjusts for shifts in relative time which occur due to the vessel’s speed and space warp capability. It has little relationship to Earth’s time as we know it. One hour aboard the USS Enterprise at different times may equal as little as three Earth hours. The stardates specified in the log entry must be computed against the speed of the vessel, the space warp, and its position within our galaxy, in order to give a meaningful reading.”

Later verklaarde Roddenberry dat hij die uitleg zelf niet helemaal begreep, maar dat anderen het een logische verklaring vonden:

“I’m not quite sure what I meant by that explanation, but a lot of people have indicated it makes sense. If so, I’ve been lucky again, and I’d just as soon forget the whole thing before I’m asked any further questions about it.”

Omdat er niet echt een duidelijke redenering achter de sterrendatum zit, is het in de loop van de series en films wel vaker voorgekomen dat gebeurtenissen die later in de tijd gebeurden toch een lagere sterrendatum hadden dan iets wat eerder gebeurde.

Opgave

In deze opgave maken we gebruik van twee methoden om een dag uit onze tijdsrekening uit te drukken als een sterrendatum. De oude methode correspondeert ongeveer met de sterrendatums die gebruikt werden in de eerste zes Star Trek films. Hierbij wordt een datum uit onze tijdsrekening voorgesteld in het formaat YYMM.DD, waarbij YY staat voor het jaar min 1900, MM voor de maand (01-12) en DD voor de dag van de maand (01-31). De waarden worden altijd uitgedrukt met twee cijfers door eventueel gebruik te maken van een voorloopnul. Zo wordt bijvoorbeeld 8 september 1966 volgens de oude methode voorgesteld door de sterrendatum 6609.08. Voor datums later dan het jaar 1999 moet er een extra cijfers voor de jaren gebruikt worden, waardoor bijvoorbeeld 11 september 2015 volgens de oude methode voorgesteld wordt door de sterrendatum 11509.11.

Vanaf de film Star Trek XI4 werd een nieuwe methode in gebruik genomen om datums uit onze jaarrekening voor te stellen als een sterrendatum. Hierbij worden datums uitgedrukt in het formaat YYYY.xx, waarbij YYYY staat voor het jaartal uitgedrukt met vier cijfers en .xx voor gepasseerde deel van het jaar uitgedrukt als twee decimale cijfers (aantal honderdsten van een jaar). De laatste twee cijfers kunnen dus bepaald worden door het aantal verstreken dagen te bepalen sinds 1 januari van het jaar (op 1 januari zijn er geen dagen verstreken, op 2 januari is er één dag verstreken, enzoverder), en dit aantal te vermenigvuldigen met honderd en te delen door het totaal aantal dagen van het jaar (rekening houdend met schrikkeljaren). Als men de decimale cijfers buiten beschouwing laat, dan levert dit een waarde op tussen 0 en 99 (grenzen inbegrepen). Zo komt 1 januari 2015 overeen met sterrendatum 2015.00 en 4 juli 2015 met sterrendatum 2015.50 (halverwege het jaar 2015).

Gevraagd wordt om een bash shell script sterrendatum te schrijven waarmee een datum uit onze tijdsrekening kan uitgedrukt worden als een sterrendatum. Aan deze functie kunnen maximaal drie natuurlijke getallen doorgegeven worden die de gegeven datum aanduiden. Het eerste argument (indien gegeven) staat voor het jaartal. Het tweede argument (indien gegeven) staat voor het maandnummer (januari=1, februari=2, …). Het derde argument (indien gegeven) staat voor de dag van de maand. Indien één of meer van deze argumenten niet worden doorgegeven aan het shell script, dan moeten de ontbrekende argumenten respectievelijk ingevuld worden door het huidige jaar, de huidige maand en de huidige dag van de maand. Deze standaardwaarden moeten door het shell script zelf bepaald worden (met andere woorden, vandaag zijn de standaardwaarden anders dan morgen).

Standaard moet het shell script de corresponderende sterrendatum uitschrijven volgens de oude methode. Indien de optie -n ingesteld wordt, dan moet het shell script de corresponderende sterrendatum uitschrijven volgens de nieuwe methode.

Standaard moet het shell script bij het uitschrijven van de corresponderende sterrendatum gebruik maken van een punt (.) als scheidingsteken. Door gebruik te maken van de optie -s met een bijhorend verplicht argument kan eventueel een alternatief scheidingsteken ingesteld worden.

Indien het shell script niet de correcte opties of argumenten meekrijgt (maximaal drie argumenten, enkel ondersteuning voor de opties -n en -s waarbij de laatste met een verplicht argument), dan moet het de gepaste foutboodschap (zie onderstaande voorbeeldsessie) uitschrijven naar standaard error, en moet het shell script eindigen met exit status 1. Anders moet het shell script eindigen met exit status 0. Het shell script moet voor de verwerking van de opties de flexibiliteit aan de dag leggen die gebruikelijk is bij Unix commando’s: volgorde van opties speel geen rol, opties kunnen eventueel samengenomen worden, …

Onderstaande voorbeeldsessie geeft aan hoe het shell script sterrendatum moet kunnen gebruikt worden. Hierbij moet je ervan uitgaan dat deze voorbeeldsessie werd uitgevoerd op 15 december 2015.

$ sterrendatum 1959 9 13
5909.13
$ sterrendatum 1959 9      # dag=15
5909.15
$ sterrendatum 1959        # maand=12, dag=15
5912.15
$ sterrendatum             # jaar=2015, maand=12, dag=15
11512.15

$ sterrendatum -n 1959 9 13
1959.69
$ sterrendatum -n 1959 9   # dag=15
1959.70
$ sterrendatum -n 1959     # maand=12, dag=15
1959.95
$ sterrendatum -n          # jaar=2015, maand=12, dag=15
2015.95

$ sterrendatum -ns"-" 1959 9 13
1959-69
$ sterrendatum -s"/" -n 1959 9 13
1959/69

$ sterrendatum 1 2 3 4
Syntaxis: sterrendatum [-n] [-s teken] [jaar [maand [dag]]]
$ echo $?
1
$ sterrendatum -p 1959 9 13
Syntaxis: sterrendatum [-n] [-s teken] [jaar [maand [dag]]]
$ echo $?
1

Tips: let goed op het aantal dagen in een jaar.

$ date -d '2016-12-31' +'%j'
366
$ date -d '2017-12-31' +'%j'
365

Getallen die beginnen met een 0 worden gezien als octale5 getallen.

$ dagen=$(date -d '2013-05-03' +'%j'); echo $dagen
123
$ echo $((dagen-1))
122

$ dagen=$(date -d '2013-04-03' +'%j'); echo $dagen
093
$ echo $((dagen-1))
bash: 093: value too great for base (error token is "093")