Witajcie.
Mam za zadanie napisać kawałek kodu, który po spełnieniu pewnych warunków połączy mi daty w zakresy.
ogólnie tak to mniej więcej powinno wyglądać:
dates = ["28-10-2010", "29-10-2010", "1-11-2010", "3-11-2010"]
@output = {:bar => [], :not_bar => []}
dates.each do |date|
if Foo.bar?(date)
# (...)
end
end
@output.inspect # => { :bar => ["28-10-2010 - 1-11-2010", "3-11-2010"], :not_bar => [] }
szczerze mówiąc, nie mam pomysłu na kod, który byłby ruby-way i rozwiązywał ten problem…
Żeby nie było, że jestem leniem, liczę na gotowca, to wstawiam taki pseudokod, nad którym myślałem:
if date.wday+1 == next_date.wday || (date.wday == 5 && next_date.wday == 1 )
@output[:bar] << "#{date} - #{next_date}"
else
@output[:bar] << date
end
z tym, że rozwiązuje on problem tylko dwóch dni.
Nie wiem, czy o to dokładnie chodzi, ale rozwiązanie wydaje się proste - posortuj daty, a potem zastosuj swoje rozwiązanie dla kolejnych par (choć nie wiem, skąd się tam bierze wday, bo nic o tym nie piszesz w warunkach zadania).
nie mogę tego stosować dla par, gdyż zakres może być tak naprawdę od 1 dnia (wtedy dzień jest osobno, tak jak w podanym przypadku) do tak naprawde nieskończenie długiego zakresu (z tym, że ważne, żeby wszystkie daty pośrednie istniały). Może pokażę na przykładzie większej liczby danych
dates = ["28-10-2010", "29-10-2010", "1-11-2010","2-11-2010", "3-11-2010", "5-11-2010", "7-11-2010","8-11-2010"]
@output = {:bar => [], :not_bar => []}
dates.each do |date|
if Foo.bar?(date)
# (...)
end
end
@output.inspect # => { :bar => ["28-10-2010 - 3-11-2010", "5-11-2010", "7-11-2010 - 8-11-2010"], :not_bar => [] }
oczywiście zakładając, że wszystkie daty zwrócą bar? jako true. (jak nie - to dzieje się to samo, tylko że trafia do :not_bar)
wday bierze się stąd, że sprawdzam, czy następny dzień w tablicy jest nastepnym dniem roboczym (dla piątku następnym pracującym jest poniedziałek) ) aczkolwiek nie jestem pewien czy zabrałem sie za to poprawnie…
działa zgodnie z oczekiwaniami. postaram się poprawić kod, i przedstawić tutaj moją wersję… a potem zakład patologii kodu (mam nadzieję) że poprawi ten kod