Obliczanie dnia tygodnia dowolnej daty w pamięci (wersja skrócona) cze19

Tags

Related Posts

Share This

Obliczanie dnia tygodnia dowolnej daty w pamięci (wersja skrócona)

WSTĘP

Jakiś czas temu opublikowałem na łamach Starych Lam opracowaną przeze mnie metodę przeliczania dnia tygodnia dowolnej daty w pamięci (przy odpowiednim treningu w całkiem sensownym czasie). Artykuł ten był bardzo obszerny, zawierał dygresje i szczegółowe wyjaśnienia, co z kolei mogło zniechęcać potencjalnych użytkowników tej metody. Stąd pomysł maksymalnego skrócenia opisu metody, w którym niczego nie będę wyjaśniał, bardziej zainteresowanych zapraszam do pierwotnego artykułu.

OPIS METODY

Poniższa procedura działa w zakresie 5 r.ne. – 31.12.2099r.

Każda data składa się z trzech liczb: dnia, miesiąca i roku. Każdą z tych liczb w metodzie zajmujemy się osobno, dzięki czemu otrzymujemy 3 modyfikatory (modyfikator dnia, miesiąca i roku). Modyfikatory sumujemy i otrzymujemy dzień tygodnia w postaci liczbowej wg. następującej notacji:

-3 środa
-2 czwartek
-1 piątek
0 sobota
1 niedziela
2 poniedziałek
3 wtorek

MODYFIKATOR DNIA

Stosujemy tu następującą zasadę: od określonego dnia miesiąca odejmujemy 1, a następnie redukujemy uzyskaną w ten sposób liczbę przy pomocy najbliżej jej wartości wielokrotności liczby 7 (podobna w matematyce operacja nazywana jest „modulo 7″). Najlepiej prześledźmy to na przykładach:

17 maja: 17-1 =16 , najbliższa wielokrotność 7 to 14, odejmujemy więc od 16 -14 =2, modyfikator 17-tego wynosi więc 2,
6 maja: 6 – 1 = 5, najbliższa wielokrotność siódemki to po prostu 7, a więc 5 – 7 = -2, modyfikator 6-tego wynosi więc -2.

MODYFIKATOR MIESIĄCA

Modyfikatory miesięcy dla roku nieprzestępnego są stałe i wynoszą (tych 12 liczb trzeba się nauczyć):

Styczeń: 0,
luty: 3,
marzec: 3,
kwiecień: -1,
maj: 1,
czerwiec: -3,
lipiec: -1,
sierpień 2,
wrzesień -2,
październik: 0,
listopad: 3,
grudzień: -2

W przypadku roku przestępnego modyfikatory począwszy od marca powiększamy w pamięci o 1.

Znając modyfikator miesiąca, modyfikator dnia oraz dzień od którego rozpoczął się dany rok możemy już swobodnie wyznaczyć odpowiadający danej dacie dzień tygodnia. Modyfikatory po prostu sumujemy, następnie redukujemy uzyskany wynik modulo 7 jeśli wykracza poza przedział -3 do 3 i określamy dzień tygodnia.

Przykład: wyznaczamy dzień tygodnia dla 19 sierpnia 2006 roku.
rok 2006 rozpoczął się od niedzieli, modyfikatorem roku jest więc + 1
sierpień ma modyfikator 2, więc modyfikatorem miesiąca jest +2
jeszcze tylko wyliczamy modyfikator dnia miesiąca: 19-1 =18, 18-21=-3, modyfikator dnia to -3
Teraz sumujemy wszystkie trzy wyniki: 1 + 2 – 3 = 0.
19 sierpnia 2006 roku był więc sobotą.

MODYFIKATOR ROKU – poniżej roku 2000

Najtrudniejszym, trzecim krokiem jest natomiast uzyskanie modyfikatora roku (czyli liczby określającej od jakiego dnia tygodnia rozpoczął się dany rok).

Metoda dla dat 01.03.1900 – 31.12.1999:

1. Odejmujemy od 2000 rok dla którego wyznaczamy dzień tygodnia,
2. Sprawdzamy czy otrzymana liczba jest podzielna przez 4 (jeśli tak to mamy do czynienia z rokiem przestępnym),
3. a) jeśli jest rokiem przestępnym to dodatkowo uzyskany w pkt. 1 wynik dzielimy przez 2,
b) jeśli wynik z pkt. 1 nie dzieli się przez 4 to znajdujemy najbliższą mu mniejszą liczbę podzielną przez 4 (jednocześnie zapamiętujemy różnicę jaka dzieli te dwie liczby – i proszę zauważyć to może być tylko 1, 2 lub 3), dzielimy ją przez 2 i od uzyskanego wyniku odejmujemy wcześniej zapamiętaną różnicę,
4. Wynik operacji z 3a) lub 3b) poddajemy znanej już operacji quasi-modulo 7. Tak otrzymana liczba jest już poszukiwanym przez nas modyfikatorem roku (czyli określa jakim dniem tygodnia był 1 stycznia przedmiotowego roku).

Przykład 1 (dla roku przestępnego):
1 stycznia 1992 – różnica od roku 2000 to : 2000 – 1992 = 8
8 dzieli się przez 4 więc wykonujemy przekształcenie 3a) tzn. 8/2 = 4
I przekształcenie z pkt. 4 : (4 quasi-modulo 7) = (4 – 7) = -3 (środa)
W takim razie 1 sty 1992 to była środa.

Przykład 2 (dla roku nieprzestępnego):
1 stycznia 1977 roku : 2000 – 1977 = 23
23 nie dzieli się przez 4, najbliższa mniejsza liczba podzielna przez 4 to 20, różnica 23 – 20 = 3,
Wg pkt. 3b) 20/2 = 10 ; 10 – 3 = 7
Wg. pkt 4 : (7 quasi-modulo 7) = 0 czyli 1 sty 1977 to sobota.

Poniżej 01.03.1900 liczymy wszystko tak samo, ale na końcu dodajemy do sumy modyfikatorów jeszcze +1.
Poniżej 01.03.1800 dodajemy +2.
Poniżej 01.03.1700 dodajemy +3.
Poniżej 05.10.1582 dodajemy -1.

MODYFIKATOR ROKU – powyżej roku 2000

Modyfikator roku dla lat powyżej 2000 liczymy podobnie, ale trochę inaczej (modyfikator dla roku 2000 to 0, zaczynał się od soboty):

Metoda dla lat 2001 -2100:
1. Odejmujemy 2000 od roku dla którego wyznaczamy dzień tygodnia,
2. Sprawdzamy czy otrzymana liczba jest podzielna przez 4 (jeśli tak to mamy do czynienia z rokiem przestępnym),
3. a) jeśli jest rokiem przestępnym to dodatkowo uzyskany w pkt. 1 wynik dzielimy przez 2 i mnożymy razy -1 (czyli zamieniamy na liczbę ujemną),
b) jeśli wynik z pkt. 1 nie dzieli się przez 4 to znajdujemy najbliższą mu mniejszą liczbę podzielną przez 4 (jednocześnie zapamiętujemy różnicę jaka dzieli te dwie liczby – i proszę zauważyć to może być tylko 1, 2 lub 3), dzielimy ją przez 2, mnożymy razy -1 i do uzyskanego wyniku dodajemy wcześniej zapamiętaną różnicę ORAZ +1 (takie udziwnienie),
4. Wynik operacji z 3a) lub 3b) poddajemy znanej już operacji quasi-modulo 7. Tak otrzymana liczba jest już poszukiwanym przez nas modyfikatorem roku (czyli określa jakim dniem tygodnia był 1 stycznia przedmiotowego roku).

Przykład: 15 grudnia 2008 roku
Modyfikator dnia : 0
Modyfikator miesiąca : -2 + 1 = -1 (grudzień roku przestępnego)
Modyfikator roku: 8 dzieli się przez 4, 8/2 = 4, 4 * (-1) = -4, -4 to +3
Suma modyfikatorów : 0 – 1 + 3 = 2 a, więc PONIEDZIAŁEK.

Przykład: 1 maja 2018 roku
Modyfikator dnia : 0
Modyfikator miesiąca : +1 (rok nie przestępny)
Modyfikator roku: 18 nie dzieli się przez 4, 16/2 = 8, 8 * (-1) + 2 + 1 = -5, -5 to +2
Suma modyfikatorów : 0 + 1 + 2 = 3 a, więc WTOREK.

PODSUMOWANIE

Obliczamy modyfikator roku, miesiąca i dnia, dodajemy je do siebie. Jeśli wynik jest z przedziału od -3 do 3 to od razu zamieniamy go na pożądany wynik w postaci dnia tygodnia. Jeśli wykracza poza ten zakres to możemy dodać lub odjąć do tego wyniku dowolną wielokrotność liczby 7 (tak aby trafić w przedział od -3 do 3).

Ja, jako autor metody, po małym treningu obliczam w pamięci dowolną datę z XX i XXI wieku w czasie średnio 15-25 sek. Obliczenia na dalszych datach są bardziej czasochłonne, ale na pewno do ogarnięcia.

Pełna treść opisu metody wraz z wyjaśnieniami znajduje się TUTAJ.

Autor: Palmer