練習(うるう年判定)
2007/05/11
2023/02/10
練習のため、また問題を取ってきた。
http://www.media.osaka-cu.ac.jp/~matsuura/2006-PP/index.html
課題2-2 (うるう年)
西暦を入力して,それがうるう年かどうか判定するプログラム LeapYear を作成せよ.うるう年は,以下の規則で判定できる. (1)4で割り切れる年はうるう年である.ただし,(2)100で割り切れる年はうるう年ではない.ただし,(3)400で割り切れる年はうるう年である.回答
まず、うるう年かどうかを判定する関数を書いた。最初書いたのはこれ。(defun is-leap-year (year)
(if (zerop (mod year 400))
t
(if (zerop (mod year 100))
nil
(if (zerop (mod year 4))
t
nil))))
zerop mod がたくさんあるのが気に入らない。labelsでカリー化してみる。(カリー化ってふつうのHaskellで読んだ気がしますが、Haskellは挫折してるので間違いかもしれません。)
完成形は下。結果としてis-leap-yearがそれほど短くはならなかった。
(defun prompt-read (prompt)
(format *query-io* "~a: " prompt)
(force-output *query-io*)
(read-from-string (read-line *query-io*)))
(defun is-leap-year (year)
(labels
((mod-0 (n)
(zerop (mod year n))))
(if (mod-0 400) t
(if (mod-0 100) nil
(if (mod-0 4) t
nil)))))
(let ((y (prompt-read "西暦を入力してください")))
(format t "~D年はうるう年~a~%" y
(if (is-leap-year y)
"です"
"ではありません")))