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 xs
Data.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.
Merci pour les conseils supplémentaires et non je ne l'ai pas encore résolu. –
@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