LINUX.ORG.RU

Посчитать количество дней рождений за период. Как?

 


1

2

Посчитать количество дней рождений за период. PHP

Я с изумлением не вижу простого решения.

  1. Переберать весь период в цикле?

  2. Считать количество лет. Приводить к одному году и добовля или не добавлять единицу?

Спасибо.

Ответ на: комментарий от mky

Ну, если система однозначно запрещает кириллицу, то это ещё нормально, при поиске аналогично можно заменить на латиницу.

Терпимо, но не очень юзер-френдли. Это задумывалось как кириллица, воспринимается как кириллица, и ввести это сперва попробуют кириллицей.

По номеру паспорта мы никого не искали, потому что есть номер договора (для самых подготовленных), есть ФИО (если номер договора далеко), есть адрес (человек снимает квартиру и понятия не имеет, на кого там договор оформлен).

″III″ -> ″Ш″
″VII″ -> ″У11″ и т.д.

Больше всего похоже на OCR, не настроенный на латиницу. Добавили бы английский (или французский, немецкий… да хоть ирландский) – не было бы таких проблем. У вас, кстати, бывают паспорта, заполненные от руки? У нас могут и на матричном принтере напечатать, и руками заполнить, в зависимости от населенного пункта. А вот российские паспорта встречались только напечатанные.

стало интересно, как по такому что-то искать

Лучше всего привести в порядок автозаменой, а затем искать. Или искать по номеру без серии, а саму серию выбрать на глаз.

Vidrele ★★★
()
Ответ на: комментарий от Vidrele

Не, не должно там быть OCR, это из 1990-х, FoxPro под DOS и пр.

привести в порядок автозаменой

Я не в плане написание новой программы, а про существующее ПО, про работу ментовки. То есть БД явно была откуда-то утащена, значит где-то с ней работали. Сомневаюсь, что в те годы с убитыми ПК под DOS, проводкой, торчащей из стен в отделениях, кто-то в программу заложил поиск по всем возможным вариантам начертания номер/серия...

Я рукописных паспортов РФ не видел, но, говорят, что такие были. Теперь, может, опять будут, принтеры, на которых МВД заполняли бланки в 2022, все импортные. Даже если Китай или местные производители подсуетятся, всё равно какие-нибудь накладки с расходкой/драйверами возникнут. Без этого не бывает :)

mky ★★★★★
()
Последнее исправление: mky (всего исправлений: 1)
Ответ на: комментарий от mky

понятно. мы о разном. тут речь про то, что если дата сделки была 31 июля и срок - два месяца, то срок истекает 30.09. и вместо 29.02 будет 28.02. у меня полис был оформлен с 29го так что я знаю это доподлинно.;-)

а вот с КоАПом будет не так.;-)

mumpster ★★★★★
()

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

(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 ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 1)

Лучше перебирать в цикле. Останется запас на оптимизацию.

    var birthDate = LocalDate.of(2000, AUGUST, 24);
    var periodFrom = LocalDate.of(2010, JANUARY, 1);
    var periodTo = LocalDate.of(2020, JANUARY, 1);


    var result = 0;

    var age = 0;
    while (true) {
      var date = birthDate.plusYears(age);
      if (date.isAfter(periodTo)) {
        break;
      }
      if (!date.isBefore(periodFrom)) {
        result++;
      }
      age++;
    }

    out.println(result);
vbr ★★★★
()
Последнее исправление: vbr (всего исправлений: 1)