Διαδρομές
/
Common Lisp
Common Lisp
/
Ασκήσεις
/
Επέτειος ενός γιγαδευτερολέπτου
Επέτειος ενός γιγαδευτερολέπτου

Επέτειος ενός γιγαδευτερολέπτου

Άσκηση εκμάθησης

Εισαγωγή

Ημερομηνία και ώρα

Στη Common Lisp ο χρόνος αναπαρίσταται με τέσσερις τρόπους, από τους οποίους δύο θα μας απασχολήσουν εδώ.

  • Ο καθολικός χρόνος είναι απόλυτος χρόνος, ένας ακέραιος που δηλώνει τον αριθμό των δευτερολέπτων από το 1900-01-01T00:00:00Z (δηλαδή τα μεσάνυχτα της 1ης Ιανουαρίου 1900 σε UTC).
  • Ο αποκωδικοποιημένος χρόνος είναι μια πλειάδα 9 τιμών, που μαζί αναπαριστούν μια συγκεκριμένη ημερολογιακή στιγμή: δευτερόλεπτα, λεπτά, ώρα, ημέρα του μήνα, μήνας, έτος, ημέρα της εβδομάδας, ένδειξη θερινής ώρας, ζώνη ώρας. (Αναλύεται λεπτομερώς παρακάτω.)

Καθολικός χρόνος

Για να πάρεις την τρέχουσα καθολική ώρα χρησιμοποιείς τη get-universal-time ή τη get-decoded-time. Η πρώτη επιστρέφει τα τρέχοντα δευτερόλεπτα από το 1900-01-01T00:00Z και η δεύτερη επιστρέφει τα ίδια δεδομένα σε αποκωδικοποιημένη μορφή.

Αποκωδικοποιημένος χρόνος

Οι decode-universal-time και encode-universal-time είναι οι βασικές συναρτήσεις για την εργασία με τον χρόνο. Η πρώτη παίρνει μια καθολική ώρα και επιστρέφει μια αποκωδικοποιημένη τιμή χρόνου ως multiple-values και η δεύτερη παίρνει τις αποκωδικοποιημένες τιμές χρόνου ως ορίσματα και επιστρέφει μια καθολική ώρα.

Και οι δύο δέχονται ένα προαιρετικό όρισμα ζώνης ώρας. Δες παρακάτω τη μορφή της ζώνης ώρας.

Ένας αποκωδικοποιημένος χρόνος είναι ένα σύνολο τιμών:

  • δευτερόλεπτα: ένας ακέραιος μεταξύ 0 και 59
  • λεπτά: ένας ακέραιος μεταξύ 0 και 59
  • ώρα: ένας ακέραιος μεταξύ 0 και 23
  • ημέρα του μήνα: ένας ακέραιος μεταξύ 1 και 31 (το ανώτατο όριο εξαρτάται προφανώς από τον μήνα και το έτος)
  • μήνας: ένας ακέραιος μεταξύ 1 και 12
  • έτος: ένας ακέραιος που δηλώνει το έτος.
  • ημέρα της εβδομάδας: ένας ακέραιος μεταξύ 0 και 6. Το 0 σημαίνει Δευτέρα, το 1 σημαίνει Τρίτη κ.ο.κ. ... το 6 σημαίνει Κυριακή.
  • ένδειξη θερινής ώρας: μια αληθής τιμή δηλώνει ότι η θερινή ώρα είναι σε ισχύ.
  • ζώνη ώρας: ένας αριθμός ωρών μεταξύ -24 και 24 που δηλώνει τη διαφορά από την UTC. Ο αριθμός είναι ρητός και πρέπει να είναι πολλαπλάσιο του 1/3600
(encode-universal-time 1 2 3 4 5 2000 0) ; => 3166398121
(decode-universal-time 3166398121)       ; => 1
                                         ;    2
                                         ;    3
                                         ;    4
                                         ;    5
                                         ;    2000
                                         ;    3 (Thursday)
                                         ;    NIL
                                         ;    0
(decode-universal-time 2208988800) ; => 0
                                   ;    0
                                   ;    0
                                   ;    1
                                   ;    1
                                   ;    1970
                                   ;    3
                                   ;    NIL
                                   ;    0

Πολλαπλές τιμές

Στη Common Lisp μια συνάρτηση δεν μπορεί να επιστρέψει μόνο μία τιμή, αλλά μπορεί να επιστρέψει πολλαπλές τιμές. Για παράδειγμα η floor, που στρογγυλοποιεί προς τα κάτω, προς το μηδέν, επιστρέφει δύο τιμές: η πρώτη είναι η στρογγυλοποιημένη τιμή και η δεύτερη είναι το υπόλοιπο.

(floor 3.5) ; => 3
            ;    0.5

(Θα δείχνουμε τις πολλαπλές τιμές που επιστρέφονται σε ξεχωριστές γραμμές της εξόδου.)

Επιστροφή πολλαπλών τιμών

Αν θέλεις μια συνάρτηση να επιστρέφει πολλαπλές τιμές, χρησιμοποιείς τον προσπελαστή values:

(defun three-numbers () (values 1 2 3))
(three-numbers) ; => 1
                ;    2
                ;    3

Χειρισμός πολλαπλών τιμών

Αν σε ενδιαφέρει μόνο η πρώτη τιμή, τότε δεν χρειάζεται να κάνεις κάτι ιδιαίτερο, η γλώσσα το αναλαμβάνει:

(+ (values 1 2 3) (values 10 20 30)) ; => 11

Ωστόσο, αν θέλεις να έχεις πρόσβαση στις υπόλοιπες τιμές, υπάρχουν αρκετές συναρτήσεις που θα χρειαστεί να χρησιμοποιήσεις. Δύο βασικές μακροεντολές είναι οι multiple-value-list και multiple-value-bind. Χρησιμοποιούνται για να τυλίξουν κάτι που επιστρέφει πολλαπλές τιμές και να συλλάβουν όλες τις τιμές. Η πρώτη δημιουργεί μια λίστα με όλες τις τιμές. Η δεύτερη σου επιτρέπει να δεσμεύσεις μεταβλητές στις επιμέρους τιμές.

(multiple-value-list (values 1 2 3))                   ; => (1 2 3)
(multiple-value-bind (a b c) (values 1 2 3) 
   (+ a b c)) ; => 6

Μια άλλη χρήσιμη συνάρτηση είναι η nth-value

Οδηγίες

Στους Εξωγήινους της Lisp αρέσει να γιορτάζουν επετείους. Για αυτούς, μια σημαντική επέτειος είναι το γιγαδευτερόλεπτο. Δηλαδή: 1,000,000,000 δευτερόλεπτα από το γεγονός.

1. Υπολόγισε την ημερομηνία της επετείου του γιγαδευτερολέπτου

Γράψε μια συνάρτηση from που παίρνει 6 παραμέτρους: year, month, day, hour, min, sec και υπολογίζει την ημερομηνία και την ώρα της επετείου του γιγαδευτερολέπτου. Η συνάρτηση αυτή πρέπει να επιστρέφει την ημερομηνία ως λίστα με την ίδια σειρά και την ίδια σημασία όπως οι παράμετροι εισόδου.

(from 2000 1 1 0 0 0) ; => (2031 9 9 1 46 40)
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Common Lisp Exercism

Έτοιμος να ξεκινήσεις την άσκηση Επέτειος ενός γιγαδευτερολέπτου;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Common Lisp με 27 έννοιες92 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.