fork download
  1. import Data.List (sortBy)
  2. import Data.Function (on)
  3.  
  4. permutationBetween' l1@(h1:t) l2 =
  5. case span (/= (False, h1)) l2 of
  6. (prefix, (False, h2):r) ->
  7. length prefix : permutationBetween' t (prefix ++ [(True, h2)] ++ r)
  8. (prefix, []) -> error "Uh oh"
  9. permutationBetween' _ _ = []
  10.  
  11. permutationBetween :: Eq a1 => [a1] -> [a1] -> [Int]
  12. permutationBetween l1 l2 = permutationBetween' l1 $ map ((,) False) l2
  13.  
  14. permute indices list = map (list !!) indices
  15.  
  16. data Color = Red | Blue | Green | Yellow
  17. deriving (Eq, Show)
  18.  
  19. main = do
  20. let source = [Red, Red, Green, Blue]
  21. let target = [Blue, Red, Green, Red]
  22. let perm = permutationBetween source target
  23. putStrLn $ "Source:\t" ++ show source
  24. putStrLn $ "Target:\t" ++ show target
  25. putStrLn $ "Permutation:\t" ++ show perm
  26. let restore = permute perm
  27. putStrLn $ "Restored source:\t" ++ show (restore target)
Success #stdin #stdout 0.02s 3544KB
stdin
Standard input is empty
stdout
Source:	[Red,Red,Green,Blue]
Target:	[Blue,Red,Green,Red]
Permutation:	[1,3,2,0]
Restored source:	[Red,Red,Green,Blue]