Пусть 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
. При этом используется xs
Data.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
, который предоставляет простой способ проверить равенство рациональных чисел и автоматически вычисляет числитель и знаменатель дроби в ее уменьшенной форме.