Обнаружение, имеют ли два числа ту же самую цифру, и затем удаляет их из исходного числа в Haskell - PullRequest
0 голосов
/ 25 октября 2009

Я делаю вопрос проекта Эйлера 33 и разделил рефакторинг, чтобы решить его, но я не могу придумать, как удалить цифру, если она одинакова для обоих x и y , Я получил это далеко:

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

Отмена 0 не допускается. Что он должен сделать, это:

49/98 {cancel the 9's}

чтобы получить:

4/8 в результате. Но я не могу придумать, как удалить общие цифры из каждого номера.

1 Ответ

4 голосов
/ 25 октября 2009

Пусть x и y будут двумя числами. Затем можно удалить цифры в x, которые у него общие с y, например:

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

Отразить x и y, чтобы удалить цифры из y. При этом используется xsData.List.(\\)ys, который удаляет первое вхождение каждого элемента в ys из xs.


Редактировать: Вы, возможно, уже решили проблему 33 к настоящему времени. Если нет, позвольте мне дать вам еще несколько советов:

Код, который я дал выше, т. Е. read (show x \\ show y) не очень подходит для этой проблемы. Что произойдет, если x равно ab и y равно ba , для некоторых цифр a и b ?

Решение этой проблемы можно записать в виде единого списка. Вы можете использовать Data.List.intersect и Data.List.nub, чтобы создать следующий термин в вашем понимании списка:

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

Теперь s находится в диапазоне от цифр, общих для x и y. Вы можете удалить их из x и y, используя

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

Я не могу быть более ясным, не выполнив за вас упражнение, но оставлю вам еще две подсказки:

  • В вашем коде вы пишете y <- [10..99], x <- [10..y], x /= y. Заметьте, что это можно записать более кратко как y <- [10..99], x <- [10..y-1].
  • Посмотрите на Data.Ratio, который предоставляет простой способ проверить равенство рациональных чисел и автоматически вычисляет числитель и знаменатель дроби в ее уменьшенной форме.
...