Déterminer si deux nombres ont le même chiffre, puis les supprimer du numéro d'origine dans Haskell

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

  •  06-07-2019
  •  | 
  •  

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.

Était-ce utile?

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.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top