Split a character string based on change of character: Difference between revisions
Content added Content deleted
({{header|Haskell}}) |
|||
Line 30: | Line 30: | ||
main :: IO () |
main :: IO () |
||
main = putStrLn $ intercalate ", " (group "gHHH5YY++///\\")</lang> |
main = putStrLn $ intercalate ", " (group "gHHH5YY++///\\")</lang> |
||
{{Out}} |
|||
<pre>g, HHH, 5, YY, ++, ///, \</pre> |
|||
=={{header|JavaScript}}== |
|||
{{Trans|Haskell}} |
|||
===ES6=== |
|||
<lang JavaScript>(() => { |
|||
'use strict'; |
|||
// GENERIC FUNCTIONS |
|||
// group :: Eq a => [a] -> [[a]] |
|||
const group = xs => groupBy((a, b) => a === b, xs); |
|||
// groupBy :: (a -> a -> Bool) -> [a] -> [[a]] |
|||
const groupBy = (f, xs) => { |
|||
const lng = xs.length; |
|||
if (lng > 0) { |
|||
const x = xs[0], |
|||
lstSpanRest = span(y => f(x, y), xs.slice(1)), |
|||
ys = lstSpanRest[0], |
|||
zs = lstSpanRest[1], |
|||
group = [(ys.length ? [x].concat(ys) : [x])]; |
|||
return zs.length ? group.concat(groupBy(f, zs)) : group; |
|||
} else return []; |
|||
}; |
|||
// Span of unbroken predicate matches at left, returned with remainder |
|||
// span :: (a -> Bool) -> [a] -> ([a],[a]) |
|||
const span = (f, xs) => { |
|||
for (var i = 0, lng = xs.length; |
|||
(i < lng) && f(xs[i]); i++) {} |
|||
return [xs.slice(0, i), xs.slice(i)]; |
|||
} |
|||
// intercalate :: String -> [a] -> String |
|||
const intercalate = (s, xs) => xs.join(s); |
|||
// TEST |
|||
return intercalate(", ", group("gHHH5YY++///\\".split('')) |
|||
.map(x => x.join(''))); |
|||
// -> "g, HHH, 5, YY, ++, ///, \\" |
|||
})();</lang> |
|||
{{Out}} |
{{Out}} |