レイトン教授と魔神の笛 #042

In: Project Euler

19 12月 2009

Project Euler 番外編(?)

妻から レイトン教授と魔神の笛 のナゾ#042 が解けないとヘルプ要請アリ。

う〜ん、候補は3つか・・・答えは22:29だろ。あれ?不正解??

ん?これは出題ミスだろ、とおもったら案の定。
レイトン教授と魔神の笛 : ナゾ042についてのお知らせ

さて、せっかくなのでProject Euler風にコードを書いて解いてみる。

角度が大きい順に5つリストアップ。Clojureで実装しました。

(ns euler.layton042)
 
(defn long-hand-angle
  "Return angle of long-hand from noon."
  [minute]
  (* 360 (/ minute 60)))
 
(defn short-hand-angle
  "Return angle of short-hand from noon."
  [hour minute]
  (+ (* 360 (/ (rem hour 12) 12))
     (* 30  (/ minute 60))))
 
(defn angle-clockwise
  "Returs angle fromm short-hand to long-hand clockwise."
  [hour minute]
  (let [diff (- (long-hand-angle minute)
		(short-hand-angle hour minute))]
    (if (neg? diff)
      (+ diff 360)
      diff)))
 
(defn three-digits-in-a-row?
  "Return true if hh:mm is like aB:BB or AA:Ab."
  [hour minute]
  (or (and (pos? hour)
	   (zero? (rem hour 11))
	   (= (quot hour 11) (quot minute 10)))
      (and (zero? (rem minute 11))
	   (= (quot minute 11) (rem hour 10)))))
 
(def sorted-hour-minute-angle
     (sort-by :angle >
	      (for [hour (range 24)
		    minute (range 60)
		    :when (three-digits-in-a-row? hour minute)]
		{:hour hour
		 :minute minute
		 :angle (angle-clockwise hour minute)})))
 
(println
 (apply str
	(take 5
	      (map #(format "Time = %d:%02d, Angle = %.1f\n"
			    (:hour %) (:minute %) (* 1.0 (:angle %)))
		   sorted-hour-minute-angle))))
Time = 22:29, Angle = 219.5
Time = 22:28, Angle = 214.0
Time = 15:55, Angle = 212.5
Time = 23:33, Angle = 211.5
Time = 22:27, Angle = 208.5

うん。スッキリした。

blog comments powered by Disqus
Get Adobe Flash playerPlugin by wpburn.com wordpress themes

About this blog

私 manjilab のポータル的サイトになっております。日々気付いたこと、考えたこと、発表したいものを載せていきます。

Photostream

    Lisp indent 考察Lisp indent 考察Lisp indent 考察Lisp indent 考察Lisp indent 考察Tips to use Clojure(Lisp) with TextMateTips to use Clojure(Lisp) with TextMateTips to use Clojure(Lisp) with TextMate