2014-02-17 4 views
0

ЦЕЛЬ: Цель этой темы - создать математическую формулу для замены долговременного решения на @lawlist в функции lawlist-target-year-function (см. Ниже).Алгоритм для расчета целевого года целевого месяца - 12 месяцев * Календарь *

ПРИМЕЧАНИЕ: Решение этой теме несколько похожи, но все же будет отличаться, чем алгоритм написан @AShelly в соответствующей теме: https://stackoverflow.com/a/21709710/2112489

STORY ПРОБЛЕМА

Там в настоящее время существует 12-месячный календарь в Emacs, который прокручивает вперед и назад один месяц (или больше) за раз. Вспомогательная функция, называемая lawlist-target-year-function, используется в праздничных функциях севера для размещения наложения в каждый праздник.

Полный рабочий проект 12-месячного календаря прокруткой ( включая длинные руки раствор) можно найти здесь - [исходный код Github был пересмотрен, чтобы включить краткое решение алгоритма по @legoscia ]:

https://github.com/lawlist/calendar-yearly-scroll-by-month/blob/master/lawlist-cal.el

ЛЕГЕНДА:

displayed-month (номер с 1 по 12) является месяцем, что приложение ушей в верхнем левом углу буфера, и это изменяется, когда 12-месячный календарь прокручивается вперед или назад.

target-month (числа с 1 по 12) - это месяц, который содержит праздник, который будет отмечен наложением. Существует три (3) возможных координаты оси x (т. Е. Столбец 1, столбец 2 или столбец 3). Существует четыре (4) возможных координаты оси y (т. Е. Строка 1, строка 2, строка 3 или строка 4). [Цитирование к координатам x/y: http://www.mathsisfun.com/data/cartesian-coordinates.html]

displayed-year - это год, который появляется в верхнем левом углу буфера, и это изменяется по мере прокрутки 12-месячного календаря вперед или назад.

Целью year является год target-month.

ПРИМЕР:

  • Когда displayed-month январь (то есть 1), то год является одинаковым для всех целевых месяцев.

  • Когда displayed-month февраль (то есть, 2):

    (if (memq target-month `(2 3 4 5 6 7 8 9 10 11 12)) 
        displayed-year 
        (+ displayed-year 1)) 
    
  • Когда displayed-month март (то есть 3):

    (if (memq target-month `(3 4 5 6 7 8 9 10 11 12)) 
        displayed-year 
        (+ displayed-year 1)) 
    
  • Когда displayed-month апрель (т.е., 4):

    (if (memq target-month `(4 5 6 7 8 9 10 11 12)) 
        displayed-year 
        (+ displayed-year 1)) 
    
  • Когда displayed-month является май (т.е., 5)

    (if (memq target-month `(5 6 7 8 9 10 11 12)) 
        displayed-year 
        (+ displayed-year 1)) 
    
  • Когда displayed-month июнь (т.е. 6):

    (if (memq target-month `(6 7 8 9 10 11 12)) 
        displayed-year 
        (+ displayed-year 1)) 
    
  • Когда displayed-month является Июль (т. Е. 7):

    (if (memq target-month `(7 8 9 10 11 12)) 
        displayed-year 
        (+ displayed-year 1)) 
    
  • Когда displayed-month август (т.е. 8):

    (if (memq target-month `(8 9 10 11 12)) 
        displayed-year 
        (+ displayed-year 1)) 
    
  • Когда displayed-month сентябрь (т.е. 9):

    (if (memq target-month `(9 10 11 12)) 
        displayed-year 
        (+ displayed-year 1)) 
    
  • Когда displayed-month октябрь (т.е., 10):

    (if (memq target-month `(10 11 12)) 
        displayed-year 
        (+ displayed-year 1)) 
    
  • Когда displayed-month ноябрь (т.е., 11):

    (if (memq target-month `(11 12)) 
        displayed-year 
        (+ displayed-year 1)) 
    
  • Когда displayed-month декабрь (т.е. 12):

    (if (memq target-month `(12)) 
        displayed-year 
        (+ displayed-year 1)) 
    

календарь 12 месяцев выглядит следующим образом, как свитки компоновочных вперед один месяц за один раз:

;; 1 2 3 
;; 4 5 6 
;; 7 8 9 
;; 10 11 12 

;; 2 3 4 
;; 5 6 7 
;; 8 9 10 
;; 11 12 1 

;; 3 4 5 
;; 6 7 8 
;; 9 10 11 
;; 12 1 2 

;; 4 5 6 
;; 7 8 9 
;; 10 11 12 
;; 1 2 3 

;; 5 6 7 
;; 8 9 10 
;; 11 12 1 
;; 2 3 4 

;; 6 7 8 
;; 9 10 11 
;; 12 1 2 
;; 3 4 5 

;; 7 8 9 
;; 10 11 12 
;; 1 2 3 
;; 4 5 6 

;; 8 9 10 
;; 11 12 1 
;; 2 3 4 
;; 5 6 7 

;; 9 10 11 
;; 12 1 2 
;; 3 4 5 
;; 6 7 8 

;; 10 11 12 
;; 1 2 3 
;; 4 5 6 
;; 7 8 9 

;; 11 12 1 
;; 2 3 4 
;; 5 6 7 
;; 8 9 10 

;; 12 1 2 
;; 3 4 5 
;; 6 7 8 
;; 9 10 11 

Долгосрочное решение от @lawlist выглядит следующим образом:

(defun lawlist-target-year-function (target-month) 
    (cond 
    ;; 1 2 3 
    ;; 4 5 6 
    ;; 7 8 9 
    ;; 10 11 12 
    ((eq displayed-month 1) 
     displayed-year) 
    ;; 2 3 4 
    ;; 5 6 7 
    ;; 8 9 10 
    ;; 11 12 1 
    ((eq displayed-month 2) 
     (if (memq target-month `(2 3 4 5 6 7 8 9 10 11 12)) 
     displayed-year 
     (+ displayed-year 1))) 
    ;; 3 4 5 
    ;; 6 7 8 
    ;; 9 10 11 
    ;; 12 1 2 
    ((eq displayed-month 3) 
     (if (memq target-month `(3 4 5 6 7 8 9 10 11 12)) 
     displayed-year 
     (+ displayed-year 1))) 
    ;; 4 5 6 
    ;; 7 8 9 
    ;; 10 11 12 
    ;; 1 2 3 
    ((eq displayed-month 4) 
     (if (memq target-month `(4 5 6 7 8 9 10 11 12)) 
     displayed-year 
     (+ displayed-year 1))) 
    ;; 5 6 7 
    ;; 8 9 10 
    ;; 11 12 1 
    ;; 2 3 4 
    ((eq displayed-month 5) 
     (if (memq target-month `(5 6 7 8 9 10 11 12)) 
     displayed-year 
     (+ displayed-year 1))) 
    ;; 6 7 8 
    ;; 9 10 11 
    ;; 12 1 2 
    ;; 3 4 5 
    ((eq displayed-month 6) 
     (if (memq target-month `(6 7 8 9 10 11 12)) 
     displayed-year 
     (+ displayed-year 1))) 
    ;; 7 8 9 
    ;; 10 11 12 
    ;; 1 2 3 
    ;; 4 5 6 
    ((eq displayed-month 7) 
     (if (memq target-month `(7 8 9 10 11 12)) 
     displayed-year 
     (+ displayed-year 1))) 
    ;; 8 9 10 
    ;; 11 12 1 
    ;; 2 3 4 
    ;; 5 6 7 
    ((eq displayed-month 8) 
     (if (memq target-month `(8 9 10 11 12)) 
     displayed-year 
     (+ displayed-year 1))) 
    ;; 9 10 11 
    ;; 12 1 2 
    ;; 3 4 5 
    ;; 6 7 8 
    ((eq displayed-month 9) 
     (if (memq target-month `(9 10 11 12)) 
     displayed-year 
     (+ displayed-year 1))) 
    ;; 10 11 12 
    ;; 1 2 3 
    ;; 4 5 6 
    ;; 7 8 9 
    ((eq displayed-month 10) 
     (if (memq target-month `(10 11 12)) 
     displayed-year 
     (+ displayed-year 1))) 
    ;; 11 12 1 
    ;; 2 3 4 
    ;; 5 6 7 
    ;; 8 9 10 
    ((eq displayed-month 11) 
     (if (memq target-month `(11 12)) 
     displayed-year 
     (+ displayed-year 1))) 
    ;; 12 1 2 
    ;; 3 4 5 
    ;; 6 7 8 
    ;; 9 10 11 
    ((eq displayed-month 12) 
     (if (memq target-month `(12)) 
     displayed-year 
     (+ displayed-year 1))))) 

ответ

2

Будет ли это работать?

(defun lawlist-target-year-function (target-month) 
    (if (>= target-month displayed-month) 
     displayed-year 
    (1+ displayed-year))) 
+0

Да, это прекрасно работает - большое спасибо - очень благодарен! :) – lawlist

Смежные вопросы