From 1f4adef5e65c9e793b03239b2c442cc680ba2d19 Mon Sep 17 00:00:00 2001 From: Matej Focko Date: Fri, 31 Dec 2021 17:12:42 +0100 Subject: [PATCH] 5kyu: add pick peaks Signed-off-by: Matej Focko --- 5kyu/pick_peaks/solution.hs | 30 ++++++++++++++++++++++++++++++ README.md | 1 + 2 files changed, 31 insertions(+) create mode 100644 5kyu/pick_peaks/solution.hs diff --git a/5kyu/pick_peaks/solution.hs b/5kyu/pick_peaks/solution.hs new file mode 100644 index 0000000..e6c5682 --- /dev/null +++ b/5kyu/pick_peaks/solution.hs @@ -0,0 +1,30 @@ +module PickPeak.JorgeVS.Kata where + +data PickedPeaks = PickedPeaks { pos :: [Int], peaks :: [Int] } deriving (Eq, Show) + +windowed :: Int -> [a] -> [[a]] +windowed n xs + | null xs || length window < n = [] + | otherwise = window : (windowed n $ tail xs) + where window = take n xs + +addIfPeak :: PickedPeaks -> [(Int, Int)] -> PickedPeaks +addIfPeak ps [l, mid, r] + | (snd mid > snd l) && (snd mid > snd r) = PickedPeaks { pos = fst mid : pos ps, peaks = snd mid : peaks ps } + | otherwise = ps +addIfPeak _ _ = error "Invalid state" + +removeConsecutiveDuplicates :: [(Int, Int)] -> [(Int, Int)] +removeConsecutiveDuplicates = foldr addIfNotDuplicate [] + where addIfNotDuplicate :: (Int, Int) -> [(Int, Int)] -> [(Int, Int)] + addIfNotDuplicate pair [] = [pair] + addIfNotDuplicate pair@(i, x) pairs + | x == (snd . head) pairs = pair : tail pairs + | otherwise = pair : pairs + +pickPeaks :: [Int] -> PickedPeaks +pickPeaks = foldl addIfPeak PickedPeaks { pos = [], peaks = [] } + . windowed 3 + . reverse + . removeConsecutiveDuplicates + . zip [0..] diff --git a/README.md b/README.md index a301a46..88e53d1 100644 --- a/README.md +++ b/README.md @@ -97,6 +97,7 @@ ### Haskell - [Directions Reduction](https://www.codewars.com/kata/550f22f4d758534c1100025a) - [solution](5kyu/directions_reduction) +- [Pick peaks](https://www.codewars.com/kata/5279f6fe5ab7f447890006a7) - [solution](5kyu/pick_peaks) ### JS