LINUX.ORG.RU

История изменений

Исправление Nervous, (текущая версия) :

Так вижу (тм).

(ns date-seq
  (:require
   [java-time.api :as jt]))


(defn yearly-within
  "Returns a sequence of yearly local dates starting at `date` that
  fit within the period delimited by the `start` and `end` dates."
  [date start end]
  (let [dates (jt/iterate jt/plus date (jt/years 1))]
    (when (jt/not-after? date end)
      (->> dates
           (drop-while (fn [b-day] (jt/before? b-day start)))
           (take-while (fn [b-day] (jt/not-after? b-day end)))))))
(def five-birthdays (let [birthday (jt/local-date 1984 2 29)
                          start (jt/local-date 2000 1 1)
                          end (jt/local-date 2004 12 1)]
                      (yearly-within birthday start end)))

(count five-birthdays) ;; => 5
(map jt/format five-birthdays)
;; => ("2000-02-28" "2001-02-28" "2002-02-28" "2003-02-28" "2004-02-28")

(def no-birthdays (let [birthday (jt/local-date 2005 2 28)
                        start (jt/local-date 2000 1 1)
                        end (jt/local-date 2004 12 1)]
                    (yearly-within birthday start end)))

(count no-birthdays) ;; => 0
(map jt/format no-birthdays) ;; => ()

А что 29 февраля? А в жопу это 29 февраля, вот что я вам скажу. 28-е в условиях задачи ничем не хуже, а жызнь слишком коротка, чтобы заморачиваться на всякую незначительную фигню.

Исходная версия Nervous, :

Так вижу (тм).

(ns date-seq
  (:require
   [java-time.api :as jt]))


(defn yearly-within
  "Returns a lazy sequence of yearly local dates starting at `date` that
  fit within the period delimited by the `start` and `end` dates."
  [date start end]
  (let [dates (jt/iterate jt/plus date (jt/years 1))]
    (when (jt/not-after? date end)
      (->> dates
           (drop-while (fn [b-day] (jt/before? b-day start)))
           (take-while (fn [b-day] (jt/not-after? b-day end)))))))
(def five-birthdays (let [birthday (jt/local-date 1984 2 29)
                          start (jt/local-date 2000 1 1)
                          end (jt/local-date 2004 12 1)]
                      (yearly-within birthday start end)))

(count five-birthdays) ;; => 5
(map jt/format five-birthdays)
;; => ("2000-02-28" "2001-02-28" "2002-02-28" "2003-02-28" "2004-02-28")

(def no-birthdays (let [birthday (jt/local-date 2005 2 28)
                        start (jt/local-date 2000 1 1)
                        end (jt/local-date 2004 12 1)]
                    (yearly-within birthday start end)))

(count no-birthdays) ;; => 0
(map jt/format no-birthdays) ;; => ()

А что 29 февраля? А в жопу это 29 февраля, вот что я вам скажу. 28-е в условиях задачи ничем не хуже, а жызнь слишком коротка, чтобы заморачиваться на всякую незначительную фигню.