Kurzusok
/
Elixir
Elixir
/
Feladatok
/
Könyvtári díjak
Könyvtári díjak

Könyvtári díjak

Tanulófeladat

Bevezetés

Dátumok és idő

Az Elixir szabványos könyvtára 4 különböző modult kínál a dátumokkal és az idővel való munkához, és mindegyiknek saját structja van.

  • A Date modul. Egy Date struct a ~D sigil segítségével hozható létre.

    ~D[2021-01-01]
    
  • A Time modul. Egy Time struct a ~T sigil segítségével hozható létre.

    ~T[12:00:00]
    
  • A NaiveDateTime modul az időzóna nélküli dátum-időpontokhoz. Egy NaiveDateTime struct a ~N sigil segítségével hozható létre.

    ~N[2021-01-01 12:00:00]
    
  • A DateTime modul az időzónával rendelkező dátum-időpontokhoz. Ha ezt a modult UTC-től eltérő időzónához használod, külső függőségre, egy időzóna-adatbázisra lesz szükséged.

Összehasonlítások

Két dátum vagy idő összehasonlításához keresd a megfelelő modulban a compare vagy a diff függvényt. Az olyan összehasonlító operátorok, mint a ==, a > és a <, látszólag működnek, de ezeknél a structoknál nem végeznek helyes szemantikai összehasonlítást.

Utasítások

A könyvtáros barátnőd megkért, hogy bővítsd ki a könyvtári szoftverét, hogy automatikusan kiszámolja a késedelmi díjakat. A jelenlegi rendszere egy ISO8601 dátum-idő stringként tárolja a könyv kikölcsönzésének pontos dátumát és idejét. Egy kisvárosi könyvtárat vezet Ghánában, amely a GMT időzónát (UTC +0) használja, nem alkalmaz nyári időszámítást, és nem kell más időzónákkal törődnie.

1. A tárolt dátum-idők értelmezése

Valósítsd meg a LibraryFees.datetime_from_string/1 függvényt. Bemeneti argumentumként egy ISO8601 dátum-idő stringet várjon, és adjon vissza egy NaiveDateTime structot.

LibraryFees.datetime_from_string("2021-01-01T13:30:45Z")
# => ~N[2021-01-01 13:30:45]

2. Annak meghatározása, hogy a könyvet dél előtt kölcsönözték-e ki

Ha egy könyvet dél előtt kölcsönöztek ki, az olvasónak 28 napja van visszahozni. Ha délben vagy dél után kölcsönözték ki, akkor 29 napja.

Valósítsd meg a LibraryFees.before_noon?/1 függvényt. Egy NaiveDateTime structot várjon, és adjon vissza egy logikai értéket.

LibraryFees.before_noon?(~N[2021-01-12 08:23:03])
# => true

3. A visszahozatali dátum kiszámítása

A kikölcsönzés dátum-idője alapján számítsd ki a visszahozatali dátumot.

Valósítsd meg a LibraryFees.return_date/1 függvényt. Egy NaiveDateTime structot várjon, és adjon vissza egy Date structot, 28 vagy 29 nappal későbbre.

LibraryFees.return_date(~N[2020-11-28 15:55:33])
# => ~D[2020-12-27]

4. Annak meghatározása, hogy mennyire késett a könyv visszahozatala

A könyvtárban egységes díj vonatkozik a késedelmes visszahozatalokra. A díj kiszámításához tudnunk kell, hogy a könyvet a visszahozatali dátum után hány nappal hozták vissza valójában.

Valósítsd meg a LibraryFees.days_late/2 függvényt. Egy Date structot, a tervezett visszahozatali dátumot, és egy NaiveDateTime structot, a tényleges visszahozatal dátum-időjét várja.

Ha a tényleges visszahozatal dátuma korábbi vagy ugyanaz a nap, mint a tervezett visszahozatali dátum-idő, a függvény adjon vissza 0-t. Ellenkező esetben a függvény adja vissza a két dátum közötti különbséget napokban.

A könyvtár statisztikai célból a könyv tényleges visszahozatalának dátumát és idejét is nyilvántartja, de a késedelmi díj kiszámításakor nem használja az időt.

LibraryFees.days_late(~D[2020-12-27], ~N[2021-01-03 09:23:36])
# => 7

5. Annak meghatározása, hogy a könyvet hétfőn hozták-e vissza

A könyvtárnak különleges ajánlata van a hétfői visszahozatalokra.

Valósítsd meg a LibraryFees.monday?/1 függvényt. Egy NaiveDateTime structot várjon, és adjon vissza egy logikai értéket.

LibraryFees.monday?(~N[2021-01-03 13:30:45Z])
# => false

6. A késedelmi díj kiszámítása

Valósítsd meg a LibraryFees.calculate_late_fee/3 függvényt. Három argumentumot várjon: két ISO8601 dátum-idő stringet, a kikölcsönzés dátum-időjét és a tényleges visszahozatal dátum-időjét, valamint az egy napra vonatkozó késedelmi díjat. Adja vissza a teljes késedelmi díjat annak megfelelően, hogy mennyire későn hozták vissza a könyvet.

Vedd figyelembe a különleges hétfői ajánlatot is. Ha hétfőn hozod vissza a könyvet, a késedelmi díjból 50% kedvezményt kapsz, lefelé kerekítve.

# Sunday, 7 days late
LibraryFees.calculate_late_fee("2020-11-28T15:55:33Z", "2021-01-03T13:30:45Z", 100)
# => 700

# one day later, Monday, 8 days late
LibraryFees.calculate_late_fee("2020-11-28T15:55:33Z", "2021-01-04T09:02:11Z", 100)
# => 400
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Elixir Exercism

Készen állsz elkezdeni a(z) Könyvtári díjak feladatot?

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