Clojure-এ, অ্যারেগুলো কালেকশন, ঠিক যেমন অন্য ভাষার অ্যারেগুলো। Lisp পরিবারের অন্যান্য ভাষার মতো, Clojure অ্যারে প্রকাশ করতে বন্ধনী ব্যবহার করে।
Clojure অ্যারে দুইভাবে তৈরি করা যায়। list ফাংশন একটি অ্যারে তৈরি করতে পারে, অথবা আপনি একটি লিটারাল অ্যারে quote করতে পারেন।
অ্যারেগুলো বিশেষ কারণ Clojure এগুলোকে কল হিসেবে গণ্য করে। এটি আশা করে যে কলটি একটি অপারেটর দিয়ে শুরু হবে, যা সাধারণত একটি ফাংশন। অ্যারের বাকি আইটেমগুলোকে অপারেন্ড হিসেবে বিবেচনা করা হয়, যার মানে তারা ফাংশনের আর্গুমেন্ট হয়ে যায়।
Clojure-এর অ্যারেগুলোর প্রতি এই বিশেষ আচরণের কারণেই আমরা সরাসরি একটি অ্যারে লিটারাল তৈরি করতে পারি না। quote বা তার সংক্ষিপ্ত রূপ ' ব্যবহার করে একটি অ্যারে কোট করা বোঝায় যে অ্যারেটি মূল্যায়ন করা উচিত নয়।
কিছু আধুনিক ভাষার বিপরীতে, Clojure অ্যারেগুলো হেটেরোজেনিয়াস, যার মানে তারা অভ্যন্তরীণভাবে বিভিন্ন ধরনের আইটেম ধারণ করতে পারে, যেমন '(2 "a" "b" 3).
অন্যান্য Lisp-এর বিপরীতে, Clojure-এ একটি খালি অ্যারে ট্রুথি এবং এটি nil বা false-এর সমতুল্য নয়।
এলিস তাঁর আসন্ন ভেগাস ভ্রমণে কিছু পোকার (আর অন্য কার্ড গেম) খেলার জন্য খুবই অপেক্ষা করছেন। নিজের হিসাব নিজে রাখতে ভালোবাসেন বলে তিনি এমন কিছু ছোট ফাংশন বানাতে চান যা ট্র্যাকিংয়ের কাজে তাঁকে সাহায্য করবে, আর সেগুলো নিয়ে ভাবতে গিয়ে তিনি আপনার সাহায্য চেয়েছেন।
এলিস বিশেষভাবে পোকার ভালোবাসেন, আর তিনি জানতে চান তিনি কতগুলো রাউন্ড খেলেছেন, এবং কোন কোন রাউন্ড সেগুলো। প্রতিটি রাউন্ডের নিজস্ব নম্বর থাকে, আর প্রতিটি টেবিলে বর্তমানে যে রাউন্ড খেলা হচ্ছে তার নম্বর দেখানো হয়। এলিস একটি টেবিল বেছে নিয়ে নিজের প্রথম রাউন্ড খেলতে বসেন। তিনি তিনটি রাউন্ড খেলার পরিকল্পনা করেছেন।
এমন একটি ফাংশন rounds লিখুন যা বর্তমান রাউন্ডের নম্বর নেয় এবং সেই রাউন্ড আর সামনে আসছে এমন পরের দুটি নিয়ে একটি list রিটার্ন করে:
(rounds 27)
;;=> (27 28 29)
এলিস প্রথম টেবিলে কয়েকটি রাউন্ড খেললেন, তারপর বিরতি নিয়ে দ্বিতীয় টেবিলে আরও কিছু রাউন্ড খেললেন ... কিন্তু প্রতিটি টেবিলের জন্য আলাদা আলাদা অ্যারে হয়ে গেল! তিনি দুটি অ্যারে একসাথে জোড়া দিতে চান, যাতে সব পোকার রাউন্ড একই জায়গায় ট্র্যাক করতে পারেন।
এমন একটি ফাংশন concat-rounds লিখুন যা দুটি অ্যারে নেয় এবং প্রথম list-এর সব রাউন্ডের পর দ্বিতীয় list-এর সব রাউন্ড নিয়ে গঠিত একটি list রিটার্ন করে:
(concat-rounds '(27 28 29) '(35 36))
;;=> (27 28 29 35 36)
আগের কিছু পোকার রাউন্ড নিয়ে কথা বলতে গিয়ে আরেকজন খেলোয়াড় মন্তব্য করেন যে তাঁদের মধ্যে দুটি রাউন্ড কতটা একইভাবে হলো। এলিস নিশ্চিত নন তিনি ওই রাউন্ডগুলো খেলেছিলেন কি না।
এমন একটি ফাংশন contains-round? লিখুন যা দুটি আর্গুমেন্ট নেয়, খেলা রাউন্ডগুলোর একটি অ্যারে আর একটি রাউন্ড নম্বর। রাউন্ডটি খেলা রাউন্ডের অ্যারেতে থাকলে ফাংশনটি true রিটার্ন করবে, না থাকলে false:
(contains-round? '(27 28 29 35 36) 29)
;;=> true
(contains-round? '(27 28 29 35 36) 30)
;;=> false
এলিস Black Joe নামের একটি নতুন গেম খেলে দেখতে চান। এটি Black Jack-এর মতোই, যেখানে আপনার লক্ষ্য হলো হাতের কার্ডগুলো যোগ করে একটি নির্দিষ্ট মানে পৌঁছানো, কিন্তু Black Joe-তে লক্ষ্য হলো কার্ডের মানগুলোর গড় ৭ হওয়া। সব কার্ডের মান যোগ করে সেই যোগফলকে হাতের কার্ডের সংখ্যা দিয়ে ভাগ করলে গড় পাওয়া যায়।
এমন একটি ফাংশন card-average লিখুন যা Black Joe-এর একটি হাতের গড় মান রিটার্ন করবে।
(card-average '(5 6 7))
;;=> 6.0
Black Joe-তে গতি গুরুত্বপূর্ণ। এলিস গড় বের করার একটি দ্রুততর উপায় খুঁজে দেখতে চান।
তিনি গড়ের মতো একটি সংখ্যা পাওয়ার দুটি উপায় ভেবেছেন:
এমন একটি ফাংশন approx-average? লিখুন, যাকে hand দেওয়া হয়, অর্থাৎ আপনার হাতের কার্ডগুলোর মান ধারণ করা একটি অ্যারে।
উপরের কৌশলগুলোর একটি or দুটিই যদি এমন একটি সংখ্যা দেয় যা আসল গড়ের সমান, তাহলে true রিটার্ন করুন।
নোট: মিডিয়ান খুঁজে বের করা সহজ করতে সব হাতের দৈর্ঘ্য বিজোড়।
(approx-average? '(1 2 3))
;;=> true
(approx-average? '(2 3 4 8 8))
;;=> true
(approx-average? '(1 2 3 5 9))
;;=> false
গড় করার পরীক্ষার ফলাফলে আগ্রহী হয়ে এলিস ভাবছেন, জোড় অবস্থানের কার্ডগুলোর গড় আর বিজোড় অবস্থানের কার্ডগুলোর গড় একই ফলাফল দেবে কি না। আরেকটি পরীক্ষামূলক ফাংশনের সময় এসেছে!
এমন একটি ফাংশন average-even-odd? লিখুন যা একটি বুলিয়ান রিটার্ন করে, যা জানায় জোড় ইনডেক্সের কার্ডগুলোর গড় আর বিজোড় ইনডেক্সের কার্ডগুলোর গড় একই কি না।
(average-even-odd? '(1 2 3))
;;=> true
(average-even-odd? '(1 2 3 4))
;;=> false
Black Joe-তে প্রতি ১১তম হাত একটি বোনাস হাত, যার একটি বোনাস নিয়ম আছে: আপনি শেষ যে কার্ডটি তোলেন সেটি যদি জ্যাক হয়, তবে তার মান দ্বিগুণ হয়ে যায়।
এমন একটি ফাংশন maybe-double-last লিখুন যা একটি হাত নেয় এবং দেখে শেষ কার্ডটি জ্যাক (11) কি না। শেষ কার্ডটি যদি জ্যাক (11) হয়, তবে হাত রিটার্ন করার আগে তার মান দ্বিগুণ করুন।
(maybe-double-last '(5 9 11))
;;=> '(5 9 22)
(maybe-double-last '(5 9 10))
;;=> '(5 9 10)
Exercism-এ সাইন আপ করুন, Clojure ট্র্যাকের 12টি কনসেপ্ট105টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।