Czy naprawdę piątek przypada trzynastego dnia miesiąca częściej, niż inne dni tygodnia, jak wynika z tego wpisu? Postanowiłem to sprawdzić, metodą najdoskonalszą, czyli brute force. Co prawda tylko dla lat 1970-2037 czyli w Unix Epoch (pełne lata).
Kod był praktycznie gotowy z czasów obliczeń, czy pracownicy zyskają, czy stracą na wolnym 6. stycznia. Ostatecznie wygląda on tak:
a wynik działania wygląda tak:
DOW - ilosc
1 - 116
2 - 118
3 - 115
4 - 117
5 - 117
6 - 116
7 - 117
Suma: 816
1 - Monday, ... , 7 - Sunday
Piątek oznaczony jest cyfrą 5, jak widać występuje on jako trzynasty dzień miesiąca 117 razy, podobnie jak czwartek i niedziela , więcej w badanym okresie jest wtorków trzynastego (118), a najmniej śród (113).
Pozostaje pytanie, dla jakich dokładnie lat prowadzona była analiza w oryginalnym wpisie. Na oko wygląda na jakieś 335 lat, pytanie które dokładnie. W każdym razie w badanym okresie nic nie wskazuje na większą częstotliwość występowania piątku w trzynasty dzień miesiąca.
Z niedzielnym pozdrowieniem i wyjaśnieniem: jednak ograniczenie się do 68 lat nie było dobrym pomysłem 🙂 Jak wyjaśniam w komentarzu u mnie, dając linkę do tego wyjaśnienia, właściwym, bo pełnym okresem (biorącym pod uwagę wszystkie zawichrowania kalendarza i lat przestępnych, oraz oznaczonych przez liczbę podzielną przez 4 ale pozbawionych przestępności) jest cykl z 400 lat mający jak raz wielokrotność 7 dni.
I oczywiście gdyby jeden jedyny raz uszczknąć tam jakiś dzień, to cały rozkład częstotliwości by się cyklicznie przesunął…
68 było najprostsze w implementacji – gotowiec pod ręką – i dotyczy czasów w których żyjemy (no, mniej więcej). Faktycznie nie zaważyłem, że okres 400 lat, z uwzględnieniem lat przestępnych dzieli się przez 7 bez reszty.
No i nieszczęśliwie się złożyło, że 15 października 1582 wypadł w piątek. Pociesza to, że za około 3000 lat pewnie znowu będzie trzeba zrobić korektę o 1 dzień. 😉
Bardzo nieładny kod. Do wszelkich kalkulacji związanych z kalendarzem polecam moduł Date::Calc. Z jego pomocą można wykonać te obliczenia tak:
#!/usr/bin/perl
use warnings;
use strict;
use Date::Calc qw(Day_of_Week Day_of_Week_to_Text);
my %dow_frequency;for my $year (1701..2100) {
for my $month (1..12) {
$dow_frequency{Day_of_Week($year,$month,13)}++;
}
}
for my $dow (1..7) {
printf „%10s %d\n”, Day_of_Week_to_Text($dow), $dow_frequency{$dow};
}
otrzymując wynik:
Monday 685
Tuesday 685
Wednesday 687
Thursday 684
Friday 688
Saturday 684
Sunday 687
potwierdzający hipotezę (arbitralnie przyjąłem okres 1701-2100, ale okres 1801-2200 daje identyczne rezultaty).
Uuu, zjadło mi formatowanie kodu. Głupi blox, nie wiedziałem, że zżera wiodące spacje.
@szymonsokol: Ciesz się, że ostrych nawiasów nie używałeś (też wycina)… Ogólnie Blox się zupełnie do wklejania kodu nie nadaje, także we wpisach, także w tekście oznaczonym jako preformatowany. Obejście do wpisów (całkiem fajnie działające IMHO) w postaci zewnętrznego serwisu powyżej, do komentarzy niestety się nie nadaje.
Za namiar na moduł dzięki, poczytam co to umie. Najgorzej jest klepnąć coś na kolanie (bash popychany perlem) i mieć potem pod ręką…