رضا، دانشجوی سال آخر کارشناسی است. او برای پایاننامهاش دوباره با ریاضی سروکار پیدا کرده و نیاز دارد تعدادی تابع را در هم ضرب کند. اما از آنجا که مدت زیادی از آخرین باری که ریاضی خوانده گذشته است، تنها عبارت زیر را از ضرب تابعها به یاد میآورد:
$$if f(x) = g(x) * h(x) then for x0 : f(x0) = g(x0)*h(x0)$$او تصمیم میگیرد برنامهای بنویسد که با گرفتن مقادیر ورودی و تابعها، مقدار خروجی را برای مقادیر دادهشده محاسبه کند.رضا که بهتازگی با کانالها (channels) و گوروتینها (goroutines) در زبان Go آشنا شده است، تصمیم دارد این برنامه را با استفاده از آنها پیادهسازی کند، اما تنها توانسته امضا (signature) تابعها را تعریف کند.پروژهی او را از این لینک دانلود کنید و بخشهایی را که با //TODO مشخص شده رو کامل کنید.
بخش هایی که باید پیاده سازی شوند
Item
type Item struct{
//TODO
}
از این ساختار (struct) برای ایجاد کانالها و تبادل اطلاعات بین آنها استفاده شده است.اطلاعات مورد نیاز خود را در آن قرار دهید.
MakeBroadcast
func MakeBroadcast(n int) ([]chan Item, func(Item)) {
// TODO
}
ورودی
عدد صحیح n که نشون میده چند تا کانال نیاز داریم.
خروجی
یک آرایه از کانالها به طول n.
یه تابع که با گرفتن یه مقدار از نوع Item، اون رو توی همهی کانالها بفرسته.
BroadcastArray
func BroadcastArray(arr []int, broadcast func(Item)) {
//TODO
}
ورودی
یه آرایه از اعداد صحیح.
تابع broadcast (خروجی تابع قبلی).
عملکرد
برای هر عدد داخل آرایه، تابع broadcast رو صدا بزن تا مقدار توی همهی کانالها پخش بشه.
ApplyFunctions
func ApplyFunctions(
inChannel []chan Item,
funcs []func(int) int,
outChannel []chan Item,
) []chan Item {
// TODO
}
ورودی
یه آرایه از کانالهای ورودی (inChannel)
یک آرایه از تابعها (funcs)
یک آرایه از کانالهای خروجی (outChannel)
توضیح
تعداد کانالها و تابعها با هم برابره.
عملکرد
برای هر تابع:
-
مقدار از کانال ورودی خونده بشه
-
تابع روی اون اعمال بشه
-
نتیجه توی کانال خروجی نوشته بشه
CollectAndMultiply
func CollectAndMultiply(chans []chan int, n int) []int {
// TODO
}
ورودی
یک آرایه از کانالها (خروجیهای مرحلهی قبل)
یک عدد صحیح $n$(تعداد ورودیهای اولیه)
خروجی
یک آرایه از اعداد
عملکرد
حاصل تابع اصلی (حاصل ضرب تابع های داده شده) به ازای مقادیر آرایه ورودی با همان ترتیب در آرایه خروجی نوشته بشه.
JoinChannels
func JoinChannels(chans []chan Item) chan Item {
//TODO
}
ورودی
یک آرایه از کانالها
خروجی
یک کانال
عملکرد
مقادیر تمام کانالهای موجود در آرایه ورودی را خوانده و در کانال خروجی میریزد و بعد از بسته شدن تمامی کانالهای ورودی این کانال نیز باید بسته شود.
نکات
- در تست کیس ها مواردی وجود دارد که به هر چنل چندین تابع مصرف کننده(از یک نوع) متصل است.
- تنها اجازه ایجاد تغییر در فایل functionmuliplexer.go را دارید.
- امضا(signature) تابع ها را تغییر ندهید.
- در فایل main_test.go یک نمونه از تست کیس ها آورده شده.
- برای این سوال امکان ارسال جواب هم به صورت تک فایل (تنها فایل fm.go) و هم به صورت .zip وجود دارد.
ارسال پاسخ برای این سؤال