Kiedy jeszcze będzie taki długi weekend?

Znalazłem w odmętach mojego komputera mały skrypcik. Napisałem go, dla znajomej, która była ciekawa, kiedy jeszcze powtórzy się z długim majowym weekendem. Prosta rzecz, ale nie chciałbym, żeby mi umknęła. A, że nie bardzo kumam gita, więc wkleję tutaj.
Kod (Python 3), jak widać, został przeze mnie sprowadzony do postaci obiektowej (w sumie nie wiem czemu). A sposób działania jest następujący: dla podanej daty wypisuje wszystkie lata (domyślnie na sto lat na przód) w jakich dla tej samej daty, będzie ten sam dzień tygodnia. Innymi słowy, dla 1 maja 2012, wyszukuje lata, dla jakich 1 maja właśnie przypadnie we wtorek.

Użycie dla dzisiejszego dnia:

PrintDateTested().testDate(date.today())

Lista lat (w ciągu najbliższych stu), dla których będzie taki sam długi weekend majowy jaki był w tym roku:

2018
2029
2035
2040
2046
2057
2063
2068
2074
2085
2091
2096
2103
2108

13 thoughts on “Kiedy jeszcze będzie taki długi weekend?

  1. Ten same efekt, mniej niż połowa linii kodu:

    def sameDOW(year, month, day, years_range=100):
        o = 0
        y = year if month <= 2 else year + 1
        for year in range(year + 1, year + years_range):
            o = (o + (2 if y % 4 == 0 and (y % 100 != 0 or y % 400 == 0) else 1)) % 7
            y += 1
            if o == 0:
                yield year
    
    for y in sameDOW(2012, 05, 01):
        print y
    

    Like

  2. Sigvatr zabawił się w Javę, a Mina86 w C, to ja się zabawię w coś innego 😉

    import datetime; print('\n'.join(map(str, (lambda y_min, y_max:(year for year in range(y_min, y_max+1) if datetime.datetime(year, 5, 1).weekday() == 1))(2013, 2100))))
    

    Like

  3. sprae, można i tak. W sumie może nawet lepsze od mojego, bo ten sam efekt, a ponownie jakaś połowa linii kodu (jeżeli nie liczyć import 😉 ):

    import datetime
    
    def sameDOW(year, month, day, years_range=100):
        dow = datetime.datetime(year, month, day).weekday()
        return (year for year in range(year + 1, year + years_range + 1)
                if datetime.datetime(year, month, day).weekday() == dow)
    
    for y in sameDOW(2012, 05, 01):
        print y
    

    Like

  4. Mała liczba linii to nie jedyny wyznacznik, czytelność też się liczy. Choć w twoim kodzie zbytnio zbytnio jej nie poświęciłeś.

    Like

  5. W Pythonie wyrażenia funkcyjne są mniej czytelne bo zapisuje je się od tyłu. Ale można zapisywać je jako zgrabne krótkie formy. W końcu to nie lisp :_).

    Like

  6. Oczywiście, że czytelność się również (a może i przede wszystkim) liczy, ale wrzucenie kawałka kodu do wnętrza klasy i „zobiektowienie” go, wcale czytelności nie zwiększa, a nawet powiedziałbym, że często (a na pewno w tym przypadku) czytelność zmniejsza.

    Like

  7. Ale sprawia, że wiadomo, jak tego użyć:) i to była moja główna bolączka. Bo czasem muszę dokładnie przeanalizować kod całego skryptu, by skumać jak właściwie się go używało.

    Like

  8. @mina86: jeśli potrzebujesz przeanalizować 15 linijek kodu, by zrozumieć, jak używać klasę z dwiema metodami + statyczną i oznaczoną jako “prywatna”, w dodatku, gdzie masz nawet napisaną instrukcję użycia, to masz problem nie z moim kodem, ale z sobą.

    @szatkus: wezmę to za komplement:P

    Like

Comments are closed.