Найти, имеют ли два числа одну и ту же цифру, а затем удалить их из исходного числа в Haskell

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

  •  06-07-2019
  •  | 
  •  

Вопрос

Я делаю проект Эйлера, вопрос 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.Это использует xsData.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, который обеспечивает простой способ проверки равенства рациональных чисел и автоматически вычисляет числитель и знаменатель дроби в ее уменьшенном виде.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top