Найти, имеют ли два числа одну и ту же цифру, а затем удалить их из исходного числа в Haskell
Вопрос
Я делаю проект Эйлера, вопрос 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.Но я не могу придумать, как удалить общие цифры из каждого номера.
Решение
Пусть 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
равно ба, для некоторых цифр 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
, который обеспечивает простой способ проверки равенства рациональных чисел и автоматически вычисляет числитель и знаменатель дроби в ее уменьшенном виде.