إيجاد لو رقمين يكون نفس الرقم ومن ثم إزالتها من العدد الأصلي في هاسكل
سؤال
وأنا أفعل المشروع يولر السؤال 33 و قد divised على ريفاكتور لحلها ولكن لا أستطيع التفكير في كيفية إزالة أرقام إذا كان هو نفسه في كل من 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 و ب?
الحل لهذه المشكلة يمكن أن يكتب قائمة واحدة الفهم.قد ترغب في استخدام 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
, الذي يوفر طريقة سهلة لاختبار المساواة بين عقلانية الأرقام تلقائيا بحساب وقواسم جزء في انخفاض النموذج.