Encontrar si dos números tienen el mismo dígito y luego eliminarlos del número original en Haskell
Pregunta
estoy haciendo proyecto euler pregunta 33 y he dividido una refactorización para resolverlo, pero no se me ocurre cómo eliminar el dígito si es el mismo en ambos x
y y
.Llegué hasta aquí:
import Ratio
import List
p33 = [ (x%y) | y <- [10..99] , x <- [10..y], (x `rem` 10) /= 0 , (y `rem` 10) /= 0 , x /= y , (length $ nub $ concat $ map decToList [x,y]) == 3 , [numerator(x%y),denominator(x%y)] == WHAT GOES HERE? ]
No se permite la cancelación de 0.Lo que debería hacer es:
49/98 {cancel the 9's}
Llegar:
4/8 como resultado.Pero no se me ocurre cómo eliminar los dígitos comunes de cada número.
Solución
Dejar x
y y
sean los dos numeros.Entonces se pueden eliminar los dígitos en x
que tiene en común con y
como esto:
Prelude> import Data.List
Prelude Data.List> let x = 68
Prelude Data.List> let y = 76
Prelude Data.List> read (show x \\ show y) :: Int
8
Voltear x
y y
para eliminar dígitos de y
.Esto usa xs
Data.List.(\\)
ys
, que elimina el primero aparición de cada elemento en ys
de xs
.
Editar: es posible que hayas resuelto problema 33 por ahora.Si no, déjame darte algunos consejos más:
El código que proporcioné arriba, es decir. read (show x \\ show y)
No es realmente adecuado para este problema.Qué pasa si x
es igual ab y y
es igual licenciado en Letras, para algunos dígitos a y b?
La solución a este problema. poder escribirse como una lista única de comprensión.Es posible que desee utilizar Data.List.intersect
y Data.List.nub
para crear el siguiente término en su lista de comprensión:
s <- nub $ intersect (show x) (show y)
Ahora s
oscila sobre los dígitos que x
y y
tener en común.Puedes eliminarlos de x
y y
usando
map (read . delete s . show) [x, y]
No puedo ser más explícito sin resolverte el ejercicio, pero te dejo dos pistas más:
- En tu código escribes
y <- [10..99], x <- [10..y], x /= y
.Observe que esto se puede escribir de manera más sucinta comoy <- [10..99], x <- [10..y-1]
. - Mira esto
Data.Ratio
, que proporciona una manera fácil de probar la igualdad de números racionales y calcula automáticamente el numerador y denominador de una fracción en su forma reducida.