مسیرها
/
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 پیاده‌سازی شده است که اندیس، آرگومان متد است.

اولین نویسه در یک رشته در اندیس ۰ قرار دارد.

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

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

برای گرفتن نویسه‌ای از انتهای یک رشته، می‌توانید طول رشته منهای یک را بگیرید تا اندیس آخرین نویسه به دست آید و برای نویسه‌ی یکی‌مانده به آخر، طول رشته منهای دو را و به همین ترتیب. برای این کار میان‌بری هم وجود دارد و آن استفاده از اندیس منفی است، به این صورت که آخرین نویسه در اندیس ۱-، نویسه‌ی یکی‌مانده به آخر در اندیس ۲- و به همین ترتیب قرار دارد.

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 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.