練習(うるう年判定)

練習のため、また問題を取ってきた。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)
            "です"
            "ではありません")))
 

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください