Selectively replace multiple instances of a character within a string: Difference between revisions
Content added Content deleted
(→{{header|Haskell}}: Added a version in Haskell) |
|||
Line 146: | Line 146: | ||
AErBcadCbFD |
AErBcadCbFD |
||
</pre> |
</pre> |
||
=={{header|Haskell}}== |
|||
As a map-accumulation: |
|||
<lang haskell>import Data.List (mapAccumL) |
|||
import qualified Data.Map.Strict as M |
|||
import Data.Maybe (fromMaybe) |
|||
---------- POSITIONAL CHARACTER REPLACEMENT RULES -------- |
|||
nthCharsReplaced :: M.Map Char [Maybe Char] -> String -> String |
|||
nthCharsReplaced ruleMap = snd . mapAccumL go M.empty |
|||
where |
|||
go a c = |
|||
let i = fromMaybe 0 (M.lookup c a) |
|||
in ( M.insert c (succ i) a, |
|||
otherChar i c (fromMaybe [] (M.lookup c ruleMap)) |
|||
) |
|||
otherChar :: Int -> Char -> [Maybe Char] -> Char |
|||
otherChar i c deltas |
|||
| i < length deltas = fromMaybe c (deltas !! i) |
|||
| otherwise = c |
|||
--------------------------- TEST ------------------------- |
|||
main :: IO () |
|||
main = putStrLn $ nthCharsReplaced rules "abracadabra" |
|||
rules :: M.Map Char [Maybe Char] |
|||
rules = |
|||
M.fromList |
|||
[ ('a', (Just <$> "AB") <> [Nothing] <> (Just <$> "CD")), |
|||
('b', [Just 'E']), |
|||
('r', [Nothing, Just 'F']) |
|||
]</lang> |
|||
{{Out}} |
|||
<pre>AErBcadCbFD</pre> |
|||
=={{header|J}}== |
=={{header|J}}== |