見出し画像

我流Haskell書法

関数型宣言はコンパイラに任せる(自分では可能な限り宣言しない)
関数は小さな部品関数の組み合わせで書く
手続き型形式を極力排す(do… はなるべく使わない)
中間変数はなるべく使わない(理想はpointfree style)
最短 (Code Golf) かつ実用上(競プロなどで)最速を目指す

例 AtCoder 競プロ典型 90 問 70 日目 - Plant Planning(★4)

import Control.Monad
import qualified Data.ByteString.Char8 as C
import Data.List

main = readLn @Int >>= \n -> replicateM n ints >>= print . sol n

ints = unfoldr (C.readInt . C.dropWhile (==' ')) <$> C.getLine

sol n as = g x xs+g y ys
  where
  [xs,ys] = transpose as
  (x,y) = (f xs,f ys)
  f = (!! (n `div` 2)) . sort

d x x' = abs (x-x')
g x = foldl' ((. d x) . (+)) 0

いいなと思ったら応援しよう!

karoyakani
ありがとう