Déterminer si deux nombres ont le même chiffre, puis les supprimer du numéro d'origine dans Haskell
Question
Je fais projet euler la question 33 et ai divisé un refactor pour le résoudre mais je ne peux pas penser à la façon de supprimer le chiffre s'il est identique à la fois x
et y
.
Je suis si loin:
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 n'est pas autorisée. Ce qu'il devrait faire, c'est:
49/98 {cancel the 9's}
pour obtenir:
4/8 comme résultat. Mais je ne vois pas comment supprimer les chiffres communs de chaque numéro.
La solution
Soit x
et y
les deux nombres. Ensuite, on peut supprimer les chiffres de xs
qu’elle a en commun avec Data.List.(\\)
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
Retournez ys
et read (show x \\ show y)
pour supprimer les chiffres de Data.List.intersect
. Ceci utilise Data.List.nub
s
y <- [10..99], x <- [10..y], x /= y
, qui supprime la première occurrence de chaque élément de y <- [10..99], x <- [10..y-1]
de Data.Ratio
.
Modifier: vous avez peut-être résolu problème 33 maintenant. Si non, laissez-moi vous donner quelques indices supplémentaires:
Le code que j'ai donné ci-dessus, c'est-à-dire <=> n'est pas vraiment adapté à ce problème. Que se passe-t-il si <=> est égal à ab et <=> est égal à ba , pour certains chiffres a et b ?
La solution à ce problème peut être écrite comme une compréhension de liste unique. Vous souhaiterez peut-être utiliser < => et <=> pour créer le terme suivant dans la compréhension de votre liste:
s <- nub $ intersect (show x) (show y)
Maintenant <=> se situe sur les chiffres que <=> et <=> ont en commun. Vous pouvez les supprimer de <=> et <=> à l'aide de
.map (read . delete s . show) [x, y]
Je ne peux pas être plus explicite sans résoudre l'exercice pour vous, mais je vous laisse deux astuces supplémentaires:
- Dans votre code, vous écrivez <=>. Observez que ceci peut être écrit plus succinctement comme <=>.
- Consultez <=> , qui permet de tester facilement l’égalité des nombres rationnels et calcule automatiquement le numérateur et le dénominateur d’une fraction sous sa forme réduite.