2009-10-25 14 views
0

Je fais project euler question 33 et ai divisé un refactor pour le résoudre mais je ne peux pas penser à comment enlever le chiffre si c'est le même à travers les deux x et y. Je suis loin:Recherche si deux nombres ont le même chiffre et puis les retirer du numéro d'origine dans Haskell

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? ] 

L'annulation de 0 ce n'est pas autorisé. Qu'est-ce qu'il doit faire est:

49/98 {cancel the 9's} 

pour obtenir:

4/8 comme résultat. Mais je ne peux pas penser à la façon de supprimer les chiffres communs de chaque nombre.

Répondre

4

Soit x et y les deux nombres. Ensuite, on peut retirer les chiffres x dont il a en commun avec y comme ceci:

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 

Retourner x et y pour supprimer des chiffres de y. Ceci utilise xsData.List.(\\)ys, ce qui supprime la première occurrence de chaque élément dans ys de xs.


Edit: vous pouvez avoir résolu problem 33 maintenant. Si non, laissez-moi vous donner quelques conseils supplémentaires:

Le code que j'ai donné ci-dessus, c'est-à-dire read (show x \\ show y) n'est pas vraiment adapté à ce problème. Qu'est-ce qui se passe si x égal ab et y égal ba, quelques chiffres un et b?

La solution à ce problème peut être écrit comme une compréhension de liste unique. Vous pouvez utiliser Data.List.intersect et Data.List.nub pour créer le terme suivant dans votre compréhension de la liste:

s <- nub $ intersect (show x) (show y) 

maintenant s gammes sur les chiffres qui x et y ont en commun. Vous pouvez les supprimer de x et y utilisant

map (read . delete s . show) [x, y] 

Je ne peux pas être plus explicite sans résoudre l'exercice pour vous, mais je vais vous laisser avec deux autres conseils:

  • Dans votre code que vous écrivez y <- [10..99], x <- [10..y], x /= y. Observez que ceci peut être écrit plus succinctement comme y <- [10..99], x <- [10..y-1].
  • Jetez un oeil à Data.Ratio, qui fournit un moyen facile de tester l'égalité des nombres rationnels et calcule automatiquement le numérateur et le dénominateur d'une fraction dans sa forme réduite.
+0

Merci pour les conseils supplémentaires et non je ne l'ai pas encore résolu. –

+0

@Jonno: quel est votre statut actuel? Si vous mettez à jour votre question avec le code que vous avez actuellement, je pourrais peut-être vous donner d'autres indications. – Stephan202