Dia de la setmana P18777


Statement
 

pdf   zip   main.cc   main.c   main.java   main.py   main.hs

Feu una funció que, donada una data vàlida a través de tres enters que corresponen al seu dia @d@, al seu mes @m@ i al seu any @a@, retorni el dia de la setmana en què cau, és a dir, “dilluns”, o “dimarts”, o …

Per calcular-ho, useu la congruència de Zeller. Sigui dd el dia, mm el mes i aa l’any. Llavors:

  1. Se li resta dos al mes mm, i si dóna zero o menys se li suma 12 al mes i se li resta u a l’any. El nou mes obtingut l’anomenem mm' i el nou any aa'.

  2. Es calcula la centúria cc (els dos primers dígits de l’any) a partir de l’any aa'.

  3. Es calcula l’any yy dins de la centúria (els dos darrers dígits de l’any) a partir de l’any aa'.

  4. Es calcula f=2.6m0.2+d+y+y/4+c/42c.f = \lfloor 2.6m'-0.2 \rfloor + d + y + \lfloor y/4 \rfloor + \lfloor c/4 \rfloor - 2c.

  5. Finalment, ff mòdul 7 ens dóna el resultat desitjat: 0 representa diumenge, 1 representa dilluns, 2 representa dimarts, …i 6 representa dissabte.

Interfície

C++
string dia_de_la_setmana (int d, int m, int a);
C
char* dia_de_la_setmana (int d, int m, int a);
Java
public static String dia_de_la_setmana (int d, int m, int a);
Python
dia_de_la_setmana (d, m, a)  # returns str
dia_de_la_setmana (d: int, m: int, a: int) -> str
Haskell
diaDeLaSetmana :: Int -> Int -> Int -> String

Precondició

El paràmetre corresponent a l’any està entre 1800 i 9999, ambdós inclosos. La data és vàlida.

Pista

Compte amb els mòduls de nombres negatius!

Observació

Només cal enviar el procediment demanat; el programa principal serà ignorat.

Public test cases
  • Input/Output

    dia_de_la_setmana(28, 2, 2000) → dilluns
    dia_de_la_setmana(29, 2, 2000) → dimarts
    dia_de_la_setmana(1, 3, 2000) → dimecres
  • Information
    Author
    Jordi Petit
    Language
    Catalan
    Other languages
    English
    Official solutions
    C C++ Haskell Java Python
    User solutions
    C C++ Java Python