Mínima suma borrando todas las ocurrencias de un dígito
Para la lista [23,12,77,82], las sumas obtenidas eliminando todas las ocurrencias de uno de sus dígitos son
+ Eliminando el 1: 23 + 2 + 77 + 82 = 184 + Eliminando el 2: 3 + 1 + 77 + 8 = 89 + Eliminando el 3: 2 + 12 + 77 + 82 = 173 + Eliminando el 7: 23 + 12 + 82 = 117 + Eliminando el 8: 23 + 12 + 77 + 2 = 114
El mínimo de las sumas es 89 (que se obtiene eliminando todas las ocurrencias del dígito 2).
Definir la función
minimaSumaEliminandoDigito :: [Integer] -> Integer
tal que (minimaSumaEliminandoDigito xs) es el mínimo de las sumas obtenidas eliminando todas las ocurrencias de uno de los dígitos de xs. Por ejemplo,
minimaSumaEliminandoDigito [23,12,77,82] == 89 minimaSumaEliminandoDigito [2312,7,4,82] == 50
Soluciones
import Data.List ((\\), nub) minimaSumaEliminandoDigito :: [Int] -> Int minimaSumaEliminandoDigito xs = minimum [sumaSinDigito k xs | k <- digitosLista xs] -- (digitosLista xs) es una lista, sin repeticiones, de los dígitos de -- xs. Por ejemplo, -- digitosLista [23,12,74,82] == [2,3,1,7,4,8] digitosLista :: [Int] -> [Int] digitosLista = nub . concatMap digitos -- (digitos x) es la lista de los dígitos de x. Por ejemplo, -- digitos 3252 == [3,2,5,2] digitos :: Int -> [Int] digitos x = [read [c] | c <- show x] -- (sumaSinDigito k xs) es la suma de los números de xs en los que se han -- borrado todas las ocurrencias del dígito k. Por ejemplo, -- sumaSinDigito 2 [23,12,22,82] == 12 sumaSinDigito :: Int -> [Int] -> Int sumaSinDigito k xs = sum (listaSinDigito k xs) -- (listaSinDigito k xs) es la lista de los números de xs en los que se han -- borrado todas las ocurrencias del dígito k. Por ejemplo, -- listaSinDigito 2 [23,12,22,82] == [3,1,8] listaSinDigito :: Int -> [Int] -> [Int] listaSinDigito k xs = [read cs | x <- xs , let cs = filter (/=c) (show x) , not (null cs)] where [c] = show k