Давайте сначала определим функцию, которая возвращает день недели своего аргумента (типа date
).
Основополагающим значением даты является количество дней с 01.01.2000, и мы знаем, что 01.01.2000 была суббота. Следующий день был, очевидно, воскресеньем, а затем понедельником и т. Д. c. и каждый 7-й, 14-й, 21-й и т. д. c. день после и до 1 января 2000 года тоже была суббота. Поэтому, если мы возьмем дату по модулю 7, мы получим номер дня недели, где 0 - суббота, 1 - воскресенье и т. Д. c. что приводит нас к следующему определению.
weekday:{ `sat`sun`mon`tue`wed`thu`fri x mod 7 }
Теперь мы можем создать функцию, которая отвечает на исходный вопрос:
sundaysThe1st:{[start;end]sum `sun=weekday dates where 1=`dd$dates:start+til 1+end-start }
start+til 1+end-start
генерирует список дат между start
и end
, dates where 1=`dd$dates
возвращает только первые дни месяцев, а `sun=weekday dates
возвращает 1b
, если 1-й день месяца - воскресенье, и 0b
в противном случае. sum
- это фактически число единиц, и это именно то, что нам нужно.
Надеюсь, это поможет.