Twitter でいただいたアドバイスを元に、maxLineProd をワンライナーで書き換えてみた。
-- 横一列の連続する4つの数字の積の最大値を取得
maxLineProd :: Integer
maxLineProd = maximum $ map (\line -> (maximum . map product . (!! 4) . transpose . map inits . tails) line) grid
こんな形。
map (\line -> f line) grid は line 変数を使用せずに map f grid と書けるので
maxLineProd = maximum $ map (maximum . map product . (!! 4) . transpose . map inits . tails) grid
さらに各行の maximum のリストを作ってからそのリストの maximum を取って最終的な値を求めているところを
bind(逆bind?)に書き換えて
maxLineProd = maximum $ map product . (!! 4) . transpose . map inits . tails =<< grid
こうなった。
うーむ…確かに正しく動くが処理内容を理解できなかったので細かく解読していこう。
うーむ、何か今回は力技でやっつけた感が…。
もっと効率良くエレガントに実現する方法があるように思うんだけどなぁ。
それから、以前の問題で使用した関数を流用するケースが出てきたからこちらのコメントを参考に
そろそろ共通的に使用できそうな関数を切り出してまとめたりするべきかな。

Copyright© 2011-2021 Shunsuke Otani All Right Reserved .