ট্র্যাক
/
Crystal
Crystal
/
অনুশীলনী
/
পার্টি রোবট
পার্টি রোবট

পার্টি রোবট

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

ভূমিকা

Crystal-এ String নামে একটি টাইপ আছে, যা দিয়ে টেক্সট প্রকাশ করা হয়। Crystal-এর স্ট্রিং হলো ইউনিকোড ক্যারেক্টারের একটি ক্রম। স্ট্রিং ইমিউটেবল, অর্থাৎ একবার তৈরি হয়ে গেলে সেগুলো আর পরিবর্তন করা যায় না। এর মানে হলো, আপনি যখনই কোনো স্ট্রিং পরিবর্তন করেন, তখনই একটি নতুন স্ট্রিং তৈরি হয়; তাই মূল স্ট্রিংটি পরিবর্তিত হয় না।

একটি স্ট্রিং ডিফাইন করতে আপনি ডাবল কোট " ব্যবহার করেন।

"Hello World"

কনক্যাটেনেশন

দুটি স্ট্রিং কনক্যাটিনেট করতে + অপারেটর ব্যবহার করুন। + অপারেটর দুটি স্ট্রিং মিলিয়ে একটি নতুন স্ট্রিং রিটার্ন করে।

hello = "Hello"
hello + " World"
# => "Hello World"

স্ট্রিং ও সংখ্যার মধ্যে রূপান্তর

to_i মেথড একটি স্ট্রিংকে ইন্টিজারে রূপান্তর করে। বিকল্পভাবে, to_f মেথড দিয়ে একটি ফ্লোট রিটার্ন করা যায়। স্ট্রিংটি যদি সংখ্যায় রূপান্তর করা না যায়, তাহলে একটি ArgumentError রেইজ হবে।

"1".to_i
# => 1

"1.0".to_f
# => 1.0

"Hello".to_i
# => ArgumentError: Invalid integer: Hello

to_s মেথড ব্যবহার করে একটি ইন্টিজার বা ফ্লোটকে স্ট্রিংয়ে রূপান্তর করা যায়।

1.to_s
# => "1"

1.0.to_s
# => "1.0"

ইন্টারপোলেশন

ইন্টারপোলেশন হলো স্ট্রিং জোড়া লাগানো এবং স্ট্রিংয়ের ভেতরে এক্সপ্রেশন বসানোর একটি সুবিধাজনক উপায়। একটি স্ট্রিং ইন্টারপোলেট করতে আপনি # ক্যারেক্টারের পরে দ্বিতীয় বন্ধনী {} ব্যবহার করতে পারেন, যার ভেতরে এক্সপ্রেশনটি থাকে।

name = "World"
"Hello #{name}!"
# => "Hello World!"

Crystal স্বয়ংক্রিয়ভাবে এক্সপ্রেশনের ফলাফলকে একটি স্ট্রিংয়ে রূপান্তর করে।

"Hello #{1 + 1}!"
# => "Hello 2!"

সাইজ

কোনো স্ট্রিংয়ে কতগুলো ক্যারেক্টার আছে তা জানতে হলে আপনি size মেথড ব্যবহার করতে পারেন, যা স্ট্রিংয়ের দৈর্ঘ্য একটি ইন্টিজার হিসেবে রিটার্ন করে। স্ট্রিংয়ের সাইজ হলো স্ট্রিংটির একটি সংরক্ষিত প্রপার্টি, তাই মেথডটি কল করার প্রতিবার সাইজ গণনা করতে হয় না, ফলে এটি খুব দ্রুত কাজ করে।

"Hello World".size
# => 11

ইনডেক্সিং

ইনডেক্সিং হলো যখন আপনি কোনো স্ট্রিং থেকে একটি নির্দিষ্ট ক্যারেক্টার পেতে চান। String থেকে একটি ক্যারেক্টার পেতে আপনি পরিচিত বন্ধনী নোটেশন ব্যবহার করতে পারেন।

Note

[] আসলে একটি String ইনস্ট্যান্স মেথড হিসেবে ইমপ্লিমেন্ট করা, যেখানে ইনডেক্সটি মেথডের আর্গুমেন্ট।

Crystal-এ স্ট্রিংয়ের প্রথম ক্যারেক্টারটি থাকে 0 নম্বর ইনডেক্সে।

"Hello World"[0]
# => 'H'

"Hello World"[6]
# => 'W'

স্ট্রিংয়ের শেষ থেকে একটি ক্যারেক্টার পেতে হলে আপনি স্ট্রিংয়ের দৈর্ঘ্য থেকে এক বিয়োগ করে শেষ ক্যারেক্টারের ইনডেক্সটি বের করতে পারেন, আর দ্বিতীয় শেষ ক্যারেক্টারটি পেতে হলে দৈর্ঘ্য থেকে দুই বিয়োগ করতে পারেন, এভাবে চলতে থাকে। এর জন্য একটি শর্টকাট আছে, আর সেটি হলো সহজভাবে একটি ঋণাত্মক ইনডেক্স ব্যবহার করা, যেখানে শেষ ক্যারেক্টারটি থাকে -1 ইনডেক্সে, দ্বিতীয় শেষ ক্যারেক্টারটি থাকে -2 ইনডেক্সে, এভাবে চলতে থাকে।

name = "Hello World"
name[name.size - 1]
# => 'd'

name[-1]
# => 'd'

এস্কেপিং

কিছু ক্যারেক্টার সরাসরি স্ট্রিংয়ে লেখা যায় না, বরং এর জন্য আপনাকে একটি এস্কেপ সিকোয়েন্স ব্যবহার করতে হবে। উদাহরণস্বরূপ, আপনি যদি কোনো স্ট্রিংয়ে ডাবল কোট ব্যবহার করতে চান, তাহলে ডাবল কোটগুলো এস্কেপ করতে হবে। আপনি \ ক্যারেক্টার ব্যবহার করে একটি এস্কেপ সিকোয়েন্স লিখতে পারেন, যার পরে থাকে যে ক্যারেক্টারটি আপনি এস্কেপ করতে চান।

Crystal-এর বিশেষ ক্যারেক্টারগুলো হলো:

মান বর্ণনা
\a অ্যালার্ট
\b ব্যাকস্পেস
\e এস্কেপ
\f ফর্ম ফিড
\n লাইন ফিড বা নিউলাইন
\r ক্যারেজ রিটার্ন
\t হরাইজন্টাল ট্যাব
\v ভার্টিকাল ট্যাব
\\ ব্যাকস্ল্যাশ
\' সিঙ্গেল কোট
\" ডাবল কোট
\377 অক্টাল ASCII ক্যারেক্টার
\xFF হেক্সাডেসিমাল ASCII ক্যারেক্টার
\uFFFF হেক্সাডেসিমাল ইউনিকোড ক্যারেক্টার
puts "Hello \"World\""
# => Hello "World"

puts "Hello \nWorld"
# => Hello
# => World

মাল্টি-লাইন স্ট্রিং

একটি মাল্টি-লাইন স্ট্রিং লিখতে আপনি সিঙ্গেল-লাইন স্ট্রিংয়ের মতোই সিনট্যাক্স ব্যবহার করেন, তবে স্ট্রিংয়ে আপনি যে প্রতিটি লাইন চান তার জন্য একটি নতুন লাইন তৈরি করেন।

"Hello
World"
# => "Hello\nWorld"

নির্দেশনা

এক ছিল এক খামখেয়ালি প্রোগ্রামার, যিনি গ্রিল দেওয়া জানালাওয়ালা এক অদ্ভুত বাড়িতে থাকতেন। একদিন তিনি একটি অনলাইন জব বোর্ড থেকে একটি পার্টি রোবট বানানোর কাজ নিলেন। রোবটটির কথা হলো মানুষের অভিবাদন জানানো এবং তাদের নিজ নিজ আসনে পৌঁছে দিতে সাহায্য করা। প্রথম সংস্করণটি ছিল খুবই টেকনিক্যাল, যা প্রোগ্রামারটির মানুষের সাথে মেলামেশার অভাব ফুটিয়ে তুলেছিল। এর কিছু অংশ পরের সংস্করণেও ঢুকে পড়েছিল।

1. পার্টিতে নতুন একজন অতিথিকে স্বাগত জানানো

প্রদত্ত নামটি ব্যবহার করে একটি স্বাগত বার্তা রিটার্ন করার জন্য welcome মেথডটি ইমপ্লিমেন্ট করুন:

PartyRobot.welcome("Christiane")
# => Welcome to my party, Christiane!

2. পার্টিতে এমন এক নতুন অতিথিকে স্বাগত জানানো, যার আজ জন্মদিন

ব্যক্তির প্রদত্ত নাম ও বয়স ব্যবহার করে একটি জন্মদিনের বার্তা রিটার্ন করার জন্য happy_birthday মেথডটি ইমপ্লিমেন্ট করুন। দুর্ভাগ্যবশত প্রোগ্রামারটি একটু বড়াই করতে ভালোবাসেন, তাই রোবটকে প্রত্যেক অতিথির জন্মদিন সম্পর্কে নিজের জ্ঞান দেখাতে হয়।

PartyRobot.happy_birthday("Frank", 58)
# => Happy birthday Frank! You are now 58 years old!

3. পথনির্দেশ দেওয়া

পথনির্দেশ দেওয়ার জন্য assign_table ফাংশনটি ইমপ্লিমেন্ট করুন। এটির ৫টি প্যারামিটার নেওয়া উচিত।

  • অভিবাদন জানানোর জন্য নতুন অতিথির নাম (String)
  • টেবিল নম্বর (Int)
  • পাশে বসার সঙ্গীর নাম (String)
  • টেবিলটি কোথায় পাওয়া যাবে সেই দিক (String)
  • টেবিলটির দূরত্ব (Float64)

সঠিক ফলাফলের ফরম্যাট নিচের উদাহরণে দেখা যাবে।

সঙ্গীর নামটি নামের প্রথম ও শেষ অক্ষরে সংক্ষিপ্ত করতে হবে। Frank হবে Fk, Christian হবে Cn, ইত্যাদি।

রোবট টেবিল নম্বরটি দেয়। রোবট টেবিলটির দূরত্বও জানায়। সৌভাগ্যবশত কেবল ১ ডিজিটের মধ্যে সীমিত নির্ভুলতায়।

PartyRobot.assign_table("Christiane", "on the left", 27, 23.7834298, "Frank")
# =>
# Welcome to my party, Christiane!
# You have been assigned to table 27. Your table is on the left, exactly 23.8 meters from here.
# You will be sitting next to Fk.
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Crystal Exercism

পার্টি রোবট শুরু করতে প্রস্তুত?

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