HaskellでLeetCodeのTwoSumを解いてみた

転職活動を終えて時間に余裕が出てきたので、最近Haskellで遊んでいます。
LeetCodeのTwoSumをHaskellで解いてみました。

TwoSum

今回トライした問題

leetcode.com

レポジトリ

Haskell勉強用に作ったレポジトリです。
docker-compose upで環境が立ち上がりテストコードを実行することができます。

github.com

回答

リスト内包表記を使ってみました。
遅延評価使ってるのと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年前に一回触ったきりだったのですが 久しぶりに触ると新鮮で楽しいです。

再帰の組み方とか勉強になります。