Selectively replace multiple instances of a character within a string: Difference between revisions

→‎{{header|Haskell}}: Added a version in Haskell
(→‎{{header|Haskell}}: Added a version in Haskell)
Line 146:
AErBcadCbFD
</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}}==
9,655

edits