Kurzusok
/
Common Lisp
Common Lisp
/
Feladatok
/
Gigaszakundumos évforduló
Gigaszakundumos évforduló

Gigaszakundumos évforduló

Tanulófeladat

Bevezetés

Dátum és idő

A Common Lispben az időt négyféleképpen ábrázolhatjuk, ezek közül itt kettőről lesz szó.

  • Az univerzális idő abszolút idő: egy egész szám, amely az 1900-01-01T00:00:00Z óta eltelt másodpercek számát adja meg (vagyis 1900. január 1-jének éjfélét UTC-ben).
  • A dekódolt idő egy 9 értékből álló n-es, amelyek együtt egy adott naptári időpontot írnak le: másodperc, perc, óra, a hónap napja, hónap, év, a hét napja, a nyári időszámítás jelzője, időzóna. (Az alábbiakban részletesen tárgyaljuk.)

Univerzális idő

Az aktuális univerzális idő lekéréséhez a get-universal-time vagy a get-decoded-time függvényt használjuk. Az előbbi az 1900-01-01T00:00Z óta eltelt másodperceket adja vissza, az utóbbi pedig ugyanezeket az adatokat dekódolt formában.

Dekódolt idő

A decode-universal-time és az encode-universal-time a legfontosabb függvények, ha az idővel dolgozunk. Az előbbi egy univerzális időt vesz át, és dekódolt időértéket ad vissza több értékként, az utóbbi pedig argumentumként a dekódolt időértékeket veszi át, és univerzális időt ad vissza.

Mindkettő fogadhat egy opcionális időzóna argumentumot. Az időzóna formátumát lásd alább.

A dekódolt idő a következő értékekből áll:

  • másodperc: egy 0 és 59 közötti egész szám
  • perc: egy 0 és 59 közötti egész szám
  • óra: egy 0 és 23 közötti egész szám
  • a hónap napja: egy 1 és 31 közötti egész szám (a felső határ persze nyilvánvalóan a hónaptól és az évtől függ)
  • hónap: egy 1 és 12 közötti egész szám
  • év: az évet megadó egész szám.
  • a hét napja: egy 0 és 6 közötti egész szám. A 0 a hétfőt jelenti, az 1 a keddet, és így tovább ... a 6 a vasárnapot.
  • a nyári időszámítás jelzője: igaz érték esetén a nyári időszámítás van érvényben.
  • időzóna: egy -24 és 24 közötti óraszám, amely az UTC-től való eltérést jelöli. A szám racionális szám, és 1/3600 többszörösének kell lennie
(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

Több érték

A Common Lispben egy függvény nemcsak egy értéket adhat vissza, hanem többet is. Vegyük például a floor függvényt, amely lefelé, a nulla felé kerekít: két értéket ad vissza, az első a kerekített érték, a második pedig a maradék.

(floor 3.5) ; => 3
            ;    0.5

(A több visszaadott értéket a kimenet külön soraiban mutatjuk majd.)

Több érték visszaadása

Ha azt szeretnéd, hogy egy függvény több értéket adjon vissza, a values accessort használod:

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

A több érték kezelése

Ha csak az első érték érdekel, nem kell semmi különöset tenned, a nyelv elintézi helyetted:

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

Ha viszont a többi értékhez is hozzá szeretnél férni, több függvényt kell használnod. Két fő makró a multiple-value-list és a multiple-value-bind. Mindkettő arra szolgál, hogy körbevegyen valamit, ami több értéket ad vissza, és elkapja az összeset. Az első listát készít az összes értékből. A második lehetővé teszi, hogy változókat köss az egyes értékekhez.

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

Egy másik hasznos függvény az nth-value.

Utasítások

A Lisp Aliens szereti megünnepelni az évfordulókat. Számukra egy fontos évfordulós dátum a gigaszekundum. Azaz 1 000 000 000 másodperc az esemény óta.

1. Számítsd ki a gigaszekundumos évforduló dátumát

Írj egy from függvényt, amely 6 paramétert kap: year, month, day, hour, min, sec, és kiszámítja a gigaszekundumos évforduló dátumát és időpontját. A függvény a dátumot ugyanolyan sorrendben és jelentéssel adja vissza listaként, mint a bemenet paraméterei.

(from 2000 1 1 0 0 0) ; => (2031 9 9 1 46 40)
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Common Lisp Exercism

Készen állsz elkezdeni a(z) Gigaszakundumos évforduló feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Common Lisp nyelvet 27 fogalom92 feladat segítségével, valódi emberi mentorálással, mindez ingyen.