ログ日記

作業ログと日記とメモ

頭の体操

CodeIQ ホリエモンからの挑戦状
https://codeiq.jp/magazine/2015/07/26213/



何故か体調を崩して頭ふらふらのときに解説編の記事を見てHaskellでコードを書いていたので記念メモ。

module Main where

import Control.Applicative
import Data.Set (fromList, member)

main::IO ()
main = prog <$> getInputs >>= print
-- main = print $ prog (10000, [1..5000])

prog :: (Int, [Int]) -> Int
prog (ln, xs) = length $
     [(a, b, ln - a - b) | a <- [x | x <- xs],
                           b <- [x | x <- xs,
                                     a < x,
                                     x < ln - a - x,
                                     member (ln - a - x) $ fromList xs]
     ]

getInputs :: IO (Int, [Int])
getInputs = (,) <$> readLn <*> (readLn >>= readContents)

readContents :: Int -> IO [Int]
readContents n = take n <$> map read <$> lines <$> getContents

ghcの環境が壊れててそれを戻すだけで1時間以上かかった記憶がある。あとリスト操作部分よりもIO操作とApplicativeの使い方調べるのに時間がかかって、問題にある「想定時間10分」は余裕で超えた。1時間以上はかかった気がする。
そして https://gist.github.com/yancya/3c5fa7c0f09ad85f5230 こちらのRubyより遅い。リストのindexを使ったりListじゃないものを使えば速くなりそうだけども放置で。


http://www.sampou.org/cgi-bin/haskell.cgi?%A5%B0%A5%ED%A1%BC%A5%D0%A5%EB%CA%D1%BF%F4%A4%AC%CD%DF%A4%B7%A4%A4%CD%FD%CD%B3%A1%A9
こちらを読み返しつつの練習。