Ir al contenido principal

Coste del recorrido ordenado

El coste de visitar los elementos de la lista [4,3,2,5,1] de manera creciente empezando en el primer elemento y siendo el coste de dada paso el valor absoluto de la diferencia de las posiciones se calcula de la siguiente manera

  • Coste de 4 a 1 = |0-4| = 4
  • Coste de 1 a 2 = |4-2| = 2
  • Coste de 2 a 3 = |2-1| = 1
  • Coste de 3 a 4 = |1-0| = 1
  • Coste de 4 a 5 = |0-3| = 3

Por tanto, el coste del recorrido es 4+2+1+1+3 = 11.

Definir la función coste :: Ord a => [a] -> Int tal que (coste xs) es el coste de visitar los elementos de xs de manera creciente empezando en el primer elemento y siendo el coste de dada paso el valor absoluto de la diferencia de las posiciones (se supone que los elementos de xs son distintos). Por ejemplo,

   coste [4,3,2,5,1] ==  11
   coste "betis"     ==  6

Soluciones

import Data.List (sort)

coste :: Ord  a => [a] -> Int
coste xs =
  sum [abs (i-j) | (i,j) <- zip aux (tail aux)]
  where aux = recorrido xs

-- (recorrido xs) esla lista de las posiciones al visitar los elementos
-- de xs de manera creciente empezando en el primer elemento. Por
-- ejemplo,
--    recorrido [4,3,2,5,1] == [0,4,2,1,0,3]
recorrido :: Ord  a => [a] -> [Int]
recorrido xs =
  0 : map snd (sort (zip xs [0..]))