ট্র্যাক
/
Crystal
Crystal
/
অনুশীলনী
/
ফটো ফিউশনিস্ট
ফটো ফিউশনিস্ট

ফটো ফিউশনিস্ট

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

ভূমিকা

বাইনারি, অক্টাল ও হেক্সাডেসিমেল (যাকে হেক্স নামেও ডাকা হয়) ভিন্ন ভিন্ন বেসের সংখ্যা পদ্ধতি। বাইনারি বেস 2, অক্টাল বেস 8 আর হেক্সাডেসিমেল বেস 16। Crystal-এ সাধারণ ইন্টিজার বেস 10। বাইনারি, অক্টাল ও হেক্সাডেসিমেল সবই ইন্টিজারের রিপ্রেজেন্টেশন। এর মানে হলো, এগুলো ভগ্নাংশ বা দশমিক ছাড়াই ধনাত্মক ও ঋণাত্মক সংখ্যা (শূন্যসহ) প্রকাশ করে এবং ইন্টিজার দিয়ে আমরা যেসব অপারেশন করতে পারি, সেগুলোর সবই সমর্থন করে।

বাইনারি

বাইনারি একটি বেস 2 সংখ্যা পদ্ধতি, যেখানে কেবল 0 ও 1 অঙ্ক ব্যবহার করা হয়। এটি সাধারণত কম্পিউটারের ট্রানজিস্টর ও সুইচের মধ্য দিয়ে বিদ্যুৎ প্রবাহের 0 ("বন্ধ") ও 1 ("চালু") অবস্থা, আর সঙ্গে চৌম্বকীয় স্টোরেজ মাধ্যমের ধনাত্মক ও ঋণাত্মক চার্জ প্রকাশ করে। বাইনারি দিয়ে বেস 10-এ ব্যবহৃত সব ইন্টিজার প্রকাশ করা যায়।

বেস 2 পদ্ধতির একটি ছোট অংশ দেখতে এমন, যদিও এটি অসীম পর্যন্ত চলতে থাকে এবং 128-এ থেমে যায় না:

128 64 32 16 8 4 2 1
2 ** 7 2 ** 6 2 ** 5 2 ** 4 2 ** 3 2 ** 2 2 ** 1 2 ** 0

তাহলে আমরা যদি 6 সংখ্যাটি প্রকাশ করতে চাই, বাইনারিতে সেটি হবে: 110

স্থানীয় মান 4 2 1
বাইনারি সংখ্যা 1 1 0

আর অপারেশনটি হবে: 4 + 2 + 0 = 6

আরেকটি উদাহরণ: 19

স্থানীয় মান 16 8 4 2 1
বাইনারি সংখ্যা 1 0 0 1 1

বাইনারি সংখ্যাটি হবে: 10011 আর অপারেশনটি হবে: 16 + 0 + 0 + 2 + 1 = 19

Crystal-এ বাইনারি

Crystal-এ আমরা 0b প্রিফিক্স ব্যবহার করে বাইনারি লিটারেল প্রকাশ করতে পারি। আমরা যদি 0b10011 লিখি, Crystal এটিকে একটি বাইনারি সংখ্যা হিসেবে ইন্টারপ্রেট করবে এবং বেস 10-এ রূপান্তর করবে।

0b10011
# => 19

typeof(0b10011)
# => Int32

আপনি যদি 0b প্রিফিক্স দিয়ে এমন একটি সংখ্যা লেখেন যা বাইনারি পদ্ধতিতে নেই, তাহলে এটি একটি কম্পাইলেশন এরর দেবে।

0b10211
# => Error: unexpected token: "211"

বাইনারি সংখ্যার অপারেশন

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

0b10011 + 0b10011
# => 38

0b10011 * 0b10011
# => 361

0b10011 / 3
# => 6.333333333333333

বাইনারি রিপ্রেজেন্টেশনে ও সেখান থেকে রূপান্তর

Crystal স্বয়ংক্রিয়ভাবে একটি বাইনারি লিটারেলকে Int32-এ রূপান্তর করে। একটি Int32-কে বাইনারি রিপ্রেজেন্টেশনে রূপান্তর করতে, base আর্গুমেন্টটি 2 সেট করে <int>.to_s(base) মেথডটি ব্যবহার করুন। মেথডটি বাইনারি সংখ্যাটির একটি স্ট্রিং রিপ্রেজেন্টেশন রিটার্ন করবে:

19.to_s(2)
# => "10011"

বাইনারির একটি স্ট্রিং রিপ্রেজেন্টেশনকে ইন্টিজারে রূপান্তর করতে, আমরা <int>.to_i(base) মেথডটি ব্যবহার করতে পারি এবং আর্গুমেন্ট হিসেবে base (2) পাস করতে পারি:

"10011".to_i(2)
# => 19

ভুল base (বা একটি অবৈধ বাইনারি রিপ্রেজেন্টেশন) দিলে একটি ArgumentError দেবে:

"011021".to_i(2)
# => Invalid Int32: "011021" (ArgumentError)

বাইনারি মেথড

এমন কিছু মেথড আছে যেগুলো ইন্টিজারে ব্যবহার করে সংখ্যাটির বাইনারি রিপ্রেজেন্টেশন সম্পর্কে তথ্য পাওয়া যায়।

<int>.bit_length সংখ্যাটি প্রকাশ করতে যে কতগুলো বিট লাগে, সেটি রিটার্ন করবে:

19.bit_length
# => 5

<int>.bit(index) ডান দিক থেকে শুরু করে (লিস্ট সিগনিফিক্যান্ট বিট) প্রদত্ত ইনডেক্সে থাকা বিটটি রিটার্ন করবে:

19.bit(0)
# => 1

0b10011.bit(1)
# => 1

অক্টাল

অক্টাল একটি বেস 8 সংখ্যা পদ্ধতি। এটি 0, 1, 2, 3, 4, 5, 6 ও 7 অঙ্ক ব্যবহার করে।

Crystal-এ আমরা 0o প্রিফিক্স ব্যবহার করে অক্টাল সংখ্যা প্রকাশ করতে পারি। বাইনারির মতোই, Crystal স্বয়ংক্রিয়ভাবে একটি অক্টাল রিপ্রেজেন্টেশনকে Int32-এ রূপান্তর করে।

0o123
# => 83

অক্টাল পদ্ধতিতে নেই এমন একটি সংখ্যার আগে 0o বসালে কম্পাইলেশন এরর দেবে।

অক্টাল রিপ্রেজেন্টেশনে ও সেখান থেকে রূপান্তর

বাইনারির মতোই, আমরা <int>.to_s(base) মেথড ব্যবহার করে একটি Int32-কে অক্টাল রিপ্রেজেন্টেশনে রূপান্তর করতে পারি। আর আমরা <int>.to_i(base) মেথড ব্যবহার করে একটি অক্টাল রিপ্রেজেন্টেশনকে Int32-এ রূপান্তর করতে পারি।

83.to_s(8)
# => "123"

"123".to_i(8)
# => 83

বাইনারির মতোই, ভুল base দিলে একটি ArgumentError দেবে।

হেক্সাডেসিমেল

হেক্সাডেসিমেল একটি বেস 16 সংখ্যা পদ্ধতি। এটি 0 - 9 অঙ্ক এবং A, B, C, D, E ও F অক্ষর ব্যবহার করে। A হলো 10, B হলো 11, C হলো 12, D হলো 13, E হলো 14 আর F হলো 15।

আমরা Crystal-এ 0x প্রিফিক্স ব্যবহার করে হেক্সাডেসিমেল সংখ্যা প্রকাশ করতে পারি। বাইনারি ও অক্টালের মতোই, Crystal স্বয়ংক্রিয়ভাবে হেক্সাডেসিমেল লিটারেলকে Int32-এ রূপান্তর করবে।

#=> 0x123
291

হেক্সাডেসিমেল নয় এমন একটি সংখ্যার আগে 0x বসালে কম্পাইলেশন এরর দেবে।

হেক্সাডেসিমেল রিপ্রেজেন্টেশনে ও সেখান থেকে রূপান্তর

বাইনারির মতোই, আমরা <int>.to_s(base) মেথড ব্যবহার করে একটি Int32-কে হেক্সাডেসিমেল রিপ্রেজেন্টেশনে রূপান্তর করতে পারি। আর আমরা <int>.to_i(base) মেথড ব্যবহার করে একটি হেক্সাডেসিমেল রিপ্রেজেন্টেশনকে Int32-এ রূপান্তর করতে পারি।

291.to_s(16)
# => "123"

"123".to_i(16)
# => 291

বাইনারি ও অক্টালের মতোই, ভুল base দিলে একটি ArgumentError দেবে।

প্রিসিশন

কোনো সংখ্যাকে স্ট্রিং রিপ্রেজেন্টেশনে রূপান্তর করার সময় আমরা সংখ্যাটির প্রিসিশন নির্দিষ্ট করতে পারি। এর মানে হলো সংখ্যাটি প্রকাশ করতে সর্বনিম্ন কতগুলো সংখ্যা ব্যবহার করা হবে তা। সংখ্যাটির অঙ্ক যদি প্রিসিশনের চেয়ে কম হয়, তবে স্ট্রিং রিপ্রেজেন্টেশনে লিডিং জিরো যোগ করা হবে। এটি করা হয় <int>.to_s(<base>, precision: <value>) মেথডে precision আর্গুমেন্ট পাস করে।

291.to_s(16, precision: 5)
# => "00123"

543.to_s(precision: 2)
# => "543"

নির্দেশনা

আপনার বন্ধু ফটো এডিটিং সফটওয়্যারের জন্য টাকা দিতে দিতে ক্লান্ত হয়ে পড়েছেন এবং নিজেই একটি লেখার সিদ্ধান্ত নিয়েছেন। আপনার বন্ধু নতুন সফটওয়্যারটির নাম দিয়েছেন Foto Fusionist।

Foto Fusionist একটি ফটো এডিটিং সফটওয়্যার, যা অনেক কাজ করতে পারে। তবে আপনি এখন পর্যন্ত এর মাত্র কয়েকটি ফিচার ইমপ্লিমেন্ট করেছেন। তবুও আপনার বন্ধু এই অগ্রগতিতে খুব খুশি এবং আপনাকে আরও কয়েকটি ফিচার ইমপ্লিমেন্ট করতে বলেছেন।

1. বাইনারি রিপ্রেজেন্টেশনকে ইন্টিজারে রূপান্তর করুন

প্রথম ফিচার হিসেবে আপনার বন্ধু চান একটি সংখ্যার বাইনারি রিপ্রেজেন্টেশনকে ইন্টিজারে রূপান্তর করা যাবে। এটি দরকার, কারণ তাহলে সফটওয়্যারটি একটি কালার চ্যানেলের বাইনারি রিপ্রেজেন্টেশন পড়ে সেটিকে ইন্টিজারে রূপান্তর করতে পারবে।

FotoFusionist.binary_to_int মেথডটি ইমপ্লিমেন্ট করুন, যা String টাইপের একটি আর্গুমেন্ট binary নেয়। মেথডটি বাইনারি সংখ্যাটির ইন্টিজার রিপ্রেজেন্টেশন রিটার্ন করবে।

FotoFusionist.binary_to_int("10011")
# => 19

2. ইন্টিজার থেকে লিস্ট সিগনিফিক্যান্ট বিট বের করুন

আপনার বন্ধুর চাওয়া দ্বিতীয় ফিচারটি হলো একটি ইন্টিজার থেকে লিস্ট সিগনিফিক্যান্ট বিট বের করা। লিস্ট সিগনিফিক্যান্ট বিট হলো একেবারে ডানদিকে থাকা বিট। এর মান সবচেয়ে কম হওয়ার কারণেই একে লিস্ট সিগনিফিক্যান্ট বিট বলা হয়।

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

FotoFusionist.least_significant_bit মেথডটি ইমপ্লিমেন্ট করুন, যা Int32 টাইপের একটি আর্গুমেন্ট number নেয়। মেথডটি সংখ্যাটির লিস্ট সিগনিফিক্যান্ট বিট রিটার্ন করবে।

FotoFusionist.least_significant_bit(0b10011)
# => 1

FotoFusionist.least_significant_bit(0b10010)
# => 0

3. কালার চ্যানেল থেকে হেক্স ভ্যালু বের করুন

আপনার বন্ধুর চাওয়া তৃতীয় ফিচারটি হলো একটি কালার চ্যানেল থেকে হেক্স ভ্যালু বের করা। কালার চ্যানেলটিকে একটি হেক্স রিপ্রেজেন্টেশনে রূপান্তর করতে হেক্স ভ্যালু দরকার, আর ওই হেক্স রিপ্রেজেন্টেশনটি দুই ডিজিটের হতে হবে।

FotoFusionist.hex_value মেথডটি ইমপ্লিমেন্ট করুন, যা Int32 টাইপের একটি আর্গুমেন্ট number নেয়। মেথডটি সংখ্যাটির হেক্স ভ্যালু একটি String হিসেবে রিটার্ন করবে।

FotoFusionist.hex_value(19)
# => "13"

4. RGB থেকে হেক্স ভ্যালু বের করুন

আপনার বন্ধুর চাওয়া চতুর্থ ফিচারটি হলো একটি RGB রং থেকে হেক্স ভ্যালু বের করা। এটি দরকার, যাতে একজন ইউজার একটি রঙের একক স্ট্রিং রিপ্রেজেন্টেশন পেতে পারেন। একটি RGB রং হলো এমন একটি রং, যা তিনটি কালার চ্যানেল দিয়ে প্রকাশ করা হয়: লাল, সবুজ আর নীল। প্রতিটি কালার চ্যানেল ০ থেকে ২৫৫-এর মধ্যে একটি সংখ্যা দিয়ে প্রকাশ করা হয়।

একটি RGB রঙের হেক্স ভ্যালু হলো হেক্সাডেসিমালে ওই রঙের স্ট্রিং রিপ্রেজেন্টেশন, যেখানে প্রথমে লাল কালার চ্যানেল, তারপর সবুজ কালার চ্যানেল এবং সবশেষে নীল কালার চ্যানেল থাকে।

FotoFusionist.hex_value_from_rgb মেথডটি ইমপ্লিমেন্ট করুন, যা Int32 টাইপের তিনটি আর্গুমেন্ট নেয়: red, green এবং blue। মেথডটি RGB রঙের হেক্স ভ্যালু একটি String হিসেবে রিটার্ন করবে।

FotoFusionist.hex_value_from_rgb(255, 0, 0)
# => "ff0000"
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Crystal Exercism

ফটো ফিউশনিস্ট শুরু করতে প্রস্তুত?

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