Encontrar si dos números tienen el mismo dígito y luego eliminarlos del número original en Haskell

StackOverflow https://stackoverflow.com/questions/1620521

  •  06-07-2019
  •  | 
  •  

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.

¿Fue útil?

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 xsData.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 como y <- [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.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top