নতুন রুবি ট্রিকস, প্যাটার্ন এবং মেথড শিখার একটি উপায় হলো অন্যরা লিখে কোড পড়া।
কিন্তু আপনি পড়ার যোগ্য আকর্ষণীয় কোড কোথায় পাবেন?
অনেক ওপেন সোর্স প্রজেক্ট এবং কোডিং চ্যালেঞ্জ সাইট রয়েছে যা আপনাকে অন্য ডেভেলপারদের সমাধান দেখতে দেয় আপনার নিজস্ব সমাধান সাবমিট করার পর।
এই আর্টিকেলে:
আমি ৭টি উদাহরণ সংকলন করেছি যা আমি মনে করি আপনি উপভোগ করবেন।
আমি প্রতিটি উদাহরণে কিছু কমেন্টারি ও দেব যাতে আপনি সেরা ফলাফল পান।
দুই সংখ্যার যোগফল
এই উদাহরণে আমরা জানতে চাই একটি ইউনিক নম্বরের অ্যারে দেওয়া থাকলে, দুটি সংখ্যার কোনো কম্বিনেশন আছে কিনা যাদের যোগফল একটি টার্গেট নম্বরের সমান।
কোড:
def sum_eq_n?(arr, n) return true if arr.empty? && n == 0 arr.product(arr).reject { |a,b| a == b }.any? { |a,b| a + b == n } end
এটি আকর্ষণীয় কারণ এখানে আমি product মেথড ব্যবহার করেছি।
এই মেথড ব্যবহার করলে মেনে চলে অ্যারে A-এর সকল ভ্যালু অ্যারে B-এর সকল ভ্যালুর সাথে কম্বাইন হচ্ছে, যেন লুপের ভিতর লুপ।
কাউন্টিং, ম্যাপিং এবং ফাইন্ডিং
ধরুন আপনি একটি আরিথমেটিক সিকোয়েন্সে মিসিং নম্বর খুঁজতে চান, যেমন (2,4,6,10)।
আমরা একটি কৌশল ব্যবহার করতে পারি যেখানে আমরা সংখ্যাগুলোর পার্থক্য ক্যালকুলেট করব।
[2, 2, 4]
আমাদের লক্ষ্য এখানে সিকোয়েন্সটি বের করা।
এটি কি ইনক্রিজিং বা ডিক্রিজিং?
কতটুকু?
এই কোড সিকোয়েন্সটি প্রকাশ করে:
differences = [2, 2, 4] differences.max_by { |n| differences.count(n) } # 2 # সিকোয়েন্সে সংখ্যাগুলোর মাঝপথে বৃদ্ধি
সিকোয়েন্স জানার পর আমরা সব সংখ্যা তুলনা করে মিসিংটি খুঁজে পেতে পারি।
এখানে কোড:
def find_missing(sequence) consecutive = sequence.each_cons(2) differences = consecutive.map { |a,b| b - a } sequence = differences.max_by { |n| differences.count(n) } missing_between = consecutive.find { |a,b| (b - a) != sequence } missing_between.first + sequence end find_missing([2,4,6,10]) # 8
এখানে কতগুলো রুবি মেথড ব্যবহার করা হয়েছে কঠিন কাজের জন্য গুনুন 🙂
রেগুলার এক্সপ্রেশন উদাহরণ
আপনি যদি স্ট্রিংয়ের সাথে কাজ করেন এবং প্যাটার্ন খুঁজতে চান তবে রেগুলার এক্সপ্রেশন আপনার বন্ধু।
এগুলো একটু ট্রিকি হতে পারে, কিন্তু প্র্যাকটিস করলে মাস্টারি হয়ে যায়!
এখন:
ধরুন আমরা জানতে চাই একটি দেওয়া স্ট্রিং VOWEL থেকে NON-VOWEL ক্যারেক্টারের প্যাটার্ন ফলো করে কিনা।
এভাবে:
"ateciyu"
তখন আমরা একটি রেগুলার এক্সপ্রেশন, match? মেথডের সাথে কম্বাইন করে এটি বের করতে পারি।
এখানে কোড উদাহরণ:
def alternating_characters?(s) type = [/[aeiou]/, /[^aeiou]/].cycle if s.start_with?(/[^aeiou]/) type.next end s.chars.all? { |ch| ch.match?(type.next) } end alternating_characters?("ateciyu") # true
কয়েকটি জিনিস লক্ষ্য করুন:
- আমরা
cycleমেথড ব্যবহার করেছি যাতে VOWEL রেজেক্স এবং NON-VOWEL রেজেক্স এর মাঝপথে সুইচ করতে পারি। - স্ট্রিংকে ক্যারেক্টার অ্যারেতে কনভার্ট করেছি
charsদিয়ে যাতেall?মেথড ব্যবহার করা যায়।
রিকারশন এবং স্ট্যাক উদাহরণ
রিকারশন হলো একটি মেথড নিজেকে একাধিকবার কল করে সমাধান প্রাপ্তির দিকে অগ্রসর হওয়া।
অনেক আকর্ষণীয় সমস্যা রিকারশন দিয়ে সমাধান করা যায়।
কিন্তু রিকারশনের লিমিটেশন থাকায়, আপনি এর পরিবর্তে স্ট্যাক ডেটা স্ট্রাকচার ব্যবহার করতে পারেন।
এখন:
একটি উদাহরণ দেখি যেখানে আমরা একটি দেওয়া অ্যারেতে "Power Set" খুঁজতে চাই। Power Set হলো অ্যারে থেকে তৈরি করা যেতে পারে সকল সাবসেটের সেট।
রিকারশন দিয়ে উদাহরণ:
def get_numbers(list, index = 0, taken = []) return [taken] if index == list.size get_numbers(list, index+1, taken) + get_numbers(list, index+1, taken + [list[index]]) end get_numbers([1,2,3])
একই সমস্যা স্ট্যাক দিয়ে সমাধান:
def get_numbers_stack(list) stack = [[0, []]] output = [] until stack.empty? index, taken = stack.pop next output << taken if index == list.size stack.unshift [index + 1, taken] stack.unshift [index + 1, taken + [list[index]]] end output end
এখানে আইডিয়া হলো অ্যালগরিদমের প্রতিটি পাসে আমরা হয় একটি নম্বর নিচ্ছি বা নিচ্ছি না।
আমরা দুটি আউটকাম ট্রাই করি ব্রাঞ্চ আউট হয়ে যাতে সকল সম্ভাব্য কম্বিনেশন প্রোডিউস করতে পারি।
একটি গাছ কল্পনা করুন যেখানে প্রতিটি পাতা একটি সমাধান।
কয়েকটি জিনিস লক্ষ্য করুন:
- রিকারশন সমাধানটি ছোট
- আলগরিদমের "প্রগতি করা" অংশ (index + 1) প্রায় একই
- আমরা যে স্ট্যাক ব্যবহার করছি সেটি শুধু একটি অ্যারে কারণ রুবিতে
Stackক্লাস নেই
মেথড চেইনিং উদাহরণ
এটি আমার প্রিয় উদাহরণ কারণ এটি দেখায় রুবি কতটা পাওয়ারফুল।
মেথডগুলো কম্বাইন করলে আপনি একটি মেথডের আউটপুট অন্য মেথডে পাস করতে পারেন।
যেন একটি ফ্যাক্টরি প্রোডাকশন লাইন!
আপনি কিছু র মেটেরিয়াল (ইনপুট) দিয়ে শুরু করেন, তারপর এই মেথডগুলো কল করার প্রক্রিয়ায় ধীরে ধীরে র মেটেরিয়ালকে ডিজায়ারড রেজাল্টে রূপান্তর করান।
এখানে একটি উদাহরণ:
def longest_repetition(string) max = string .chars .chunk(&:itself) .map(&:last) .max_by(&:size) max ? [max[0], max.size] : ["", 0] end longest_repetition("aaabb") # ["a", 3]
একটি স্ট্রিং দেওয়া থাকলে, এই কোড সबচেয়ে লম্বা রিপিট হওয়া ক্যারেক্টার খুঁজে বের করবে।
নোট:
- কোডটি কীভাবে ফরম্যাট করা হয়েছে রিডেবিলিটি ম্যাক্সিমাইজ করার জন্য
Symbol#to_procপ্যাটার্ন (&:size) ব্যবহার
ব্রাম্ভে, এটাকে "Law of Demeter"-এর সাথে গুলিয়ে ফেলবেন না।
সেই "ল" হলো অন্য অবজেক্টের ইন্টারনালে হাত দিয়ে যাওয়ার কথা।
এখানে আমরা শুধু অবজেক্টগুলো ট্রান্সফর্ম করছি।
with_index উদাহরণ
আপনি কি আইটেমের একটি কালেকশন ওয়ার ইটারেট করার সময় কারেন্ট ইন্ডেক্স পেতে চান?
আপনি with_index মেথড ব্যবহার করতে পারেন।
এখানে একটি উদাহরণ:
def reverse_alternate(string) string.gsub(/[^\s]+/).with_index { |w, idx| idx.even? ? w : w.reverse } end reverse_alternate("Apples Are Good") # "Apples erA Good"
লক্ষ্য করুন:
- আমরা
with_indexএবংeven?কম্বাইন করেছি কারেন্ট ওয়ার্ড রিভার্স করতে হবে কিনা তা বের করতে - ব্লক ছাড়া
gsubএকটিEnumeratorঅবজেক্ট রিটার্ন করে, যা আপনাকে অন্যান্য মেথডের সাথে চেইন করতে দেয়
each_with_object উদাহরণ
আরেকটি আকর্ষণীয় মেথড হলো each_with_object, এবং এর বন্ধু with_object।
আপনি এই দুটি মেথড ব্যবহার করতে পারেন যখন আপনাকে রেজাল্ট ধরে রাখার জন্য একটি অবজেক্ট দরকার।
এখানে একটি উদাহরণ:
def clean_string(str) str .chars .each_with_object([]) { |ch, obj| ch == "#" ? obj.pop : obj << ch } .join end clean_string("aaa#b")
এই উদাহরণে, আমরা লাস্ট ক্যারেক্টার ডিলিট করতে চাই যখন # সিম্বল পাই।
লক্ষ্য করুন:
each_with_objectএকটি আর্গুমেন্ট নেয়, যা হলো আমরা যেটি দিয়ে শুরু করতে চাই। এই আর্গুমেন্টটি ২য় ব্লক প্যারামিটার হয়ে যায়।- আমরা স্ট্রিংকে ক্যারেক্টার অ্যারেতে কনভার্ট করছি (
chars) এবং শেষে আবার স্ট্রিংয়ে (join)। - আমরা টেরনারি অপারেটর ব্যবহার করছি সিদ্ধান্ত নেওয়ার জন্য, এটি কোড ছোট করে।
সারসংক্ষেপ
এই আর্টিকেলে, আপনি কিছু আকর্ষণীয় কোড উদাহরণ দেখেছেন আমার কমেন্টারি এবং এক্সপ্লানেশন সহ যাতে আপনি আরও ভালো রুবি কোড লিখতে পারেন।
এই আর্টিকেলটি শেয়ার করতে ভুলবেন না যাতে আরও মানুষ উপভোগ করতে পারে।
পড়ার জন্য ধন্যবাদ!