إيجاد لو رقمين يكون نفس الرقم ومن ثم إزالتها من العدد الأصلي في هاسكل

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

  •  06-07-2019
  •  | 
  •  

سؤال

وأنا أفعل المشروع يولر السؤال 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.يستخدم هذا xsData.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, الذي يوفر طريقة سهلة لاختبار المساواة بين عقلانية الأرقام تلقائيا بحساب وقواسم جزء في انخفاض النموذج.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top