ট্র্যাক
/
Common Lisp
Common Lisp
/
অনুশীলনী
/
লুসির অসাধারণ ম্যাপার
লুসির অসাধারণ ম্যাপার

লুসির অসাধারণ ম্যাপার

লার্নিং অনুশীলনী

ভূমিকা

ম্যাপিং

ম্যাপিং বলতে বোঝায় একটি সিকোয়েন্সের প্রতিটি এলিমেন্টের উপর একটি ফাংশন প্রয়োগ করে নতুন একটি সিকোয়েন্স তৈরি করা।

mapcar ফাংশনটি দিয়ে একটি অ্যারের ক্ষেত্রে এটি সহজেই করা যায়। ধরা যাক আমাদের একটি double ফাংশন আছে, যা তার আর্গুমেন্টকে 2 দিয়ে গুণ করে:

(mapcar #'double '(1 2 3 4)) ; => (2 4 6 8)

লক্ষ্য করুন, প্রথম আর্গুমেন্টটি হলো এমন একটি ফাংশন, যেটি কল করতে হবে। #' হলো ফাংশন নির্দিষ্ট করার একটি বিশেষ কোটিং সিনট্যাক্স।

প্রথমে প্রথম এলিমেন্ট দিয়ে double কল করা হয়, তারপর দ্বিতীয়টি দিয়ে, এভাবে চলতে থাকে। ফলাফলগুলো একটি অ্যারেতে সংগ্রহ করা হয়, আর সেটিই হলো সেই মান যা এক্সপ্রেশনটি ইভ্যালুয়েট করে।

ফিল্টারিং

ফিল্টারিং হলো একটি সিকোয়েন্স থেকে আরেকটি সিকোয়েন্স তৈরির প্রক্রিয়া, যেখানে মূল সিকোয়েন্সের কিছু নির্দিষ্ট এলিমেন্ট বাদ দিয়ে বাকি সবগুলো কপি করা হয়। নতুন সিকোয়েন্সে কোন এলিমেন্টগুলো থাকবে তা ঠিক করা যায় একটি প্রেডিকেট ফাংশন দিয়ে (এমন ফাংশন যা বুলিয়ান মান ইভ্যালুয়েট করে), অথবা কোনো নির্দিষ্ট অবজেক্টের সাথে সমতা যাচাই করে।

প্রেডিকেট দিয়ে সরানো

remove-if হলো এমন একটি ফাংশন, যা আর্গুমেন্ট হিসেবে একটি প্রেডিকেট ফাংশন ও একটি সিকোয়েন্স নেয়, এবং শুধু সেই এলিমেন্টগুলো নিয়ে গঠিত একটি সিকোয়েন্স রিটার্ন করে, যেগুলোর জন্য প্রেডিকেট ফলস মান ইভ্যালুয়েট করেছে। অর্থাৎ, সিকোয়েন্সের যে সব এলিমেন্টের জন্য প্রেডিকেট ট্রু মান ইভ্যালুয়েট করে, সেগুলোকে এটি "সরিয়ে দেয়"। তবে খেয়াল করুন, এই ফাংশনটি মূল সিকোয়েন্স পরিবর্তন করে না! বরং সংশ্লিষ্ট এলিমেন্টগুলো ছাড়া নতুন একটি সিকোয়েন্স রিটার্ন করে। যদি সব মানের জন্যই প্রেডিকেট ট্রু হয়, তাহলে একটি খালি সিকোয়েন্স রিটার্ন করা হয়।

(remove-if #'evenp '(1 2 3 4 5)) ; => (1 3 5)
(remove-if #'oddp '(1 3 5))      ; => ()

নির্দিষ্ট একটি আইটেম সরানো

কোনো সিকোয়েন্স থেকে নির্দিষ্ট একটি আইটেম সরাতে চাইলে remove ব্যবহার করা যায়, যা সরানোর আইটেমটি ও একটি সিকোয়েন্স নেয়। সিকোয়েন্সের যে মানগুলো সরানোর আইটেমটির সমান নয়, সেগুলো রিটার্ন করা হয়। লক্ষ্য করুন: ডিফল্টভাবে সমতা যাচাই করা হয় eql জেনেরিক সমতা প্রেডিকেট দিয়ে।

(remove 1 '(1 2 1 3 1 4)) ; => (2 3 4)
(remove #\l "hello")      ; => "heo"

নির্দেশনা

Lisp এলিয়েন লুসি সংখ্যা ভালোবাসেন, তাঁদের মতে এর মধ্যে কিছু সংখ্যা "অসাধারণ"।

তাঁরা আপনাকে অনুরোধ করেন, সংখ্যাগুলোকে আরও অসাধারণ করে তুলতে সাহায্য করার জন্য কিছু ফাংশন লিখতে।

কোন জিনিস একটি সংখ্যাকে অসাধারণ করে তোলে, তা নিয়ে লুসির মত বদলে যেতে পারে, তাই ফাংশনগুলোকে নমনীয় হতে হবে।

1. অসাধারণ করে তোলা

সংখ্যার একটি অ্যারে থেকে আরও অসাধারণ সংখ্যার একটি অ্যারে বানাতে হলে আপনাকে make-magnificent-maybe নামের একটি ফাংশন লিখতে হবে, যা সংখ্যাগুলোর উপর প্রয়োগ করার জন্য একটি ফাংশন এবং একটি সংখ্যার অ্যারে নেয়। এর ফলাফল হবে আরও অসাধারণ (প্রদত্ত ফাংশন অনুসারে) সংখ্যার একটি অ্যারে।

(make-magnificent-maybe #'square '(1 2 3)) ; => (1 4 9)
(make-magnificent-maybe #'1+ '(1 2 3))     ; => (2 3 4)

2. কেবল সেরাটাই

(আশা করি) সংখ্যাগুলোকে আরও অসাধারণ করার পর, লুসি শুধু সত্যিই অসাধারণ সংখ্যাগুলোই দেখতে চান।

তাঁরা নিশ্চিতভাবে জানেন যে 1 কখনোই অসাধারণ নয়, তাই শুধু সেটি বাদ দিতে হবে।

কিন্তু সেটা ছাড়া লুসি মাঝেমধ্যে মত বদলান, তাই আবারও তাঁরা আপনাকে একটি ফাংশন দেবেন, যা বলে দেবে একটি সংখ্যা অসাধারণ কি না।

আপনাকে only-the-best নামের একটি ফাংশন লিখতে হবে, যা একটি ফাংশন ও একটি সংখ্যার অ্যারে নেয় এবং কেবল সেরা সংখ্যাগুলো রিটার্ন করে (1 নয় এবং যে সংখ্যাগুলোর জন্য ফাংশনটি ট্রু দেয়, সেগুলোও নয়)।

(only-the-best #'evenp '(1 2 3 4 5)) ; => (3 5)
(only-the-best #'oddp '(1 3 5))    ; => ()
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Common Lisp Exercism

লুসির অসাধারণ ম্যাপার শুরু করতে প্রস্তুত?

Exercism-এ সাইন আপ করুন, Common Lisp ট্র্যাকের 27টি কনসেপ্ট92টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।