Problem 144
コンテンツ
http://projecteuler.net/index.php?section=problems&id=144
一次方程式と二次方程式を解くだけの簡単なお仕事。
だが、計算ミスしそうだったので、慎重にやった。
答えあわない…
とおもったら、終了条件を1つ見逃していた。
まったく、これだから英語は。
import Data.List reflection :: Double -> Double -> Double reflection n i = (i*(n^2-1)+2*n) / ((1-n^2)+2*n*i) crossPoint :: (Double,Double) -> Double -> (Double,Double) crossPoint (u,v) k = let x = ( (k^2-4)*u-2*k*v) / (k^2+4) y = (-8*k*u-(k^2-4)*v) / (k^2+4) in (x,y) nextPoint (s,t) (u,v) = crossPoint (u,v). reflection (v/(4*u))$ (t-v) / (s-u) p144 = findIndex out.tail.unfoldr next $ ((,101/10),(7/5,-48/5)) where next (s,t) = Just (s,(t,nextPoint s t)) out (x,y) = y > && abs x <= 0.01 main = print p144
reflectionの結果も代入して、手計算で式を簡約すればもっと短くなるが
今のままでも十分な時間なので、もういいや。
作成者 Toru Mano
最終更新時刻 2023-01-01 (c70d5a1)