HaskellでLeetCodeのTwoSumを解いてみた
転職活動を終えて時間に余裕が出てきたので、最近Haskellで遊んでいます。
LeetCodeのTwoSumをHaskellで解いてみました。
TwoSum
今回トライした問題
レポジトリ
Haskell勉強用に作ったレポジトリです。
docker-compose upで環境が立ち上がりテストコードを実行することができます。
回答
リスト内包表記を使ってみました。
遅延評価使ってるのとzipでindex値を出すところがミソです。
module TwoSum where pickIndex' :: [(Int, Int)] -> [Int] pickIndex' [] = [] pickIndex' (x:xs) = [fst x, snd x] twoSum :: [Int] -> Int -> [Int] twoSum xs num = pickIndex' [ (i, j) | (x, i) <- zip xs [0..], (y, j) <- zip xs [0..], x + y == num, i /= j]
テストコード
TwoSumのテストコードです。
import Test.HUnit import TwoSum testTwoSum :: Test testTwoSum = "twoSumを検証する" ~: test [ "3の合計値を算出するindexは [0, 1]" ~: twoSum [2,7,11,15] 9 ~?= [0, 1], "6の合計値を算出するindexは [1, 2]" ~: twoSum [3,2,4] 6 ~?= [1, 2], "6の合計値を算出するindexは [0, 1]" ~: twoSum [3,3] 6 ~?= [0, 1] ] main :: IO () main = do runTestTT (TestList [testTwoSum]) return ()
Haskellは3~4年前に一回触ったきりだったのですが 久しぶりに触ると新鮮で楽しいです。
再帰の組み方とか勉強になります。