مسیرها
/
Elixir
Elixir
/
تمرین‌ها
/
دفترچه‌ی ناخدا
دفترچه‌ی ناخدا

دفترچه‌ی ناخدا

تمرین یادگیری

مقدمه

تصادفی بودن

در Elixir، برای انتخاب یک عنصر تصادفی از یک ساختار داده‌ی شمارش‌پذیر (مثلاً فهرست یا بازه)، از Enum.random استفاده می‌کنیم. این تابع یک عنصر را انتخاب می‌کند و احتمال انتخاب همه‌ی عناصر با هم برابر است.

Elixir برای انتخاب یک عدد اعشاری تصادفی تابع اختصاصی خودش را ندارد. برای این کار باید مستقیماً از Erlang استفاده کنیم.

کتابخانه‌های Erlang

کد Elixir در ماشین مجازی BEAM اجرا می‌شود. BEAM بخشی از سیستم زمان اجرای Erlang است. Elixir با الهام گرفتن از Erlang و به اشتراک گذاشتن محیط اجرای آن، همکاری بسیار خوبی با کتابخانه‌های Erlang فراهم می‌کند. یعنی توسعه‌دهندگان Elixir می‌توانند کتابخانه‌های Erlang را از داخل کد Elixir خود به کار ببرند. در واقع، در جامعه‌ی Elixir نوشتن کتابخانه‌های Elixir برای قابلیت‌هایی که کتابخانه‌های Erlang از قبل فراهم می‌کنند، توصیه نمی‌شود.

در نتیجه، برخی قابلیت‌ها، مانند عملیات ریاضی یا توابع زمان‌سنج، در Elixir فقط از طریق Erlang در دسترس‌اند.

کتابخانه‌ی استاندارد Erlang بدون نیاز به هیچ مرحله‌ی اضافه‌ای در کد Elixir ما قابل استفاده است.

توابع Erlang را می‌توان به همان روشی که توابع Elixir را فراخوانی می‌کنیم فراخوانی کرد؛ فقط با یک تفاوت کوچک. اسم ماژول‌های Erlang از جنس اتم است و به سبک snake_case نوشته می‌شود. برای مثال، برای فراخوانی تابع pi/0 از ماژول math، می‌نویسیم:

:math.pi()
# => 3.141592653589793

پرکاربردترین توابع Erlang که معادل Elixir ندارند عبارت‌اند از:

  • :timer.sleep/1 که یک فرایند را برای مدت میلی‌ثانیه‌ی داده‌شده معلق می‌کند.
  • :rand.uniform/0 که یک عدد اعشاری تصادفی x تولید می‌کند، به طوری که 0.0 <= x < 1.0.
  • :io_lib.format/2 که قالب‌بندی رشته به سبک C را فراهم می‌کند (با استفاده از دنباله‌های کنترلی). با این تابع می‌توانیم برای مثال یک عدد صحیح را در هر مبنایی بین ۲ و ۳۶ چاپ کنیم، یا یک عدد اعشاری را با دقت دلخواه قالب‌بندی کنیم. توجه کنید که این تابع، مانند بسیاری از توابع Erlang، یک charlist برمی‌گرداند.
  • ماژول math که توابع ریاضی مانند sin/1، cos/1، log2/1، log10/1، pow/2 و موارد دیگر را فراهم می‌کند.

برای آشنایی با کتابخانه‌ی استاندارد Erlang، مرجع STDLIB را ببینید.

دستورالعمل‌ها

مری طرفدار پروپاقرص سریال تلویزیونی Star Trek: The Next Generation است. او اغلب بازی‌های نقش‌آفرینی قلم و کاغذی بازی می‌کند، بازی‌هایی که در آن‌ها خودش و دوستانش خود را خدمه‌ی Starship Enterprise جا می‌زنند. شخصیت مری، کاپیتان پیکارد است و این یعنی باید دفتر وقایع کاپیتان را نگه دارد. او بخش خلاقانه‌ی بازی را دوست دارد، اما دوست ندارد داده‌های تصادفی را همان‌جا و در لحظه تولید کند.

به مری کمک کنید و برای داده‌هایی که معمولاً در دفتر وقایع کاپیتان ظاهر می‌شوند، تولیدکننده‌های تصادفی بسازید.

1. تولید یک سیاره‌ی تصادفی

Starship Enterprise در سفرهایش با سیاره‌های بسیاری روبه‌رو می‌شود. سیاره‌های جهان Star Trek بر اساس ویژگی‌هایشان به دسته‌هایی تقسیم می‌شوند. برای مثال، زمین یک سیاره‌ی کلاس M است. همه‌ی کلاس‌های ممکن سیاره عبارت‌اند از: D، H، J، K، L، M، N، R، T و Y.

تابع random_planet_class/0 را پیاده‌سازی کنید. این تابع باید یکی از کلاس‌های سیاره را به‌صورت تصادفی برگرداند.

CaptainsLog.random_planet_class()
# => "K"

2. تولید یک شماره‌ی ثبت سفینه‌ی تصادفی

Enterprise (شماره‌ی ثبت NCC-1701) تنها سفینه‌ای نیست که در فضا پرواز می‌کند! وقتی با سفینه‌ی دیگری ملاقات می‌کند، مری باید شماره‌ی ثبت آن سفینه را یادداشت کند.

شماره‌های ثبت با پیشوند «NCC-» شروع می‌شوند و بعد از آن عددی از ۱۰۰۰ تا ۹۹۹۹ (شامل هر دو سر) می‌آید.

تابع random_ship_registry_number/0 را پیاده‌سازی کنید که یک شماره‌ی ثبت سفینه‌ی تصادفی برمی‌گرداند.

CaptainsLog.random_ship_registry_number()
# => "NCC-1947"

3. تولید یک تاریخ ستاره‌ای تصادفی

دفتر وقایعی که تاریخ نداشته باشد، به چه کار می‌آید؟

«تاریخ ستاره‌ای» یک عدد اعشاری است. ماجراهای Starship Enterprise در فصل اول The Next Generation بین تاریخ‌های ستاره‌ای ۴۱۰۰۰٫۰ و ۴۲۰۰۰٫۰ رخ می‌دهد. «۴» به معنای قرن بیست‌وچهارم است و «۱» به معنای فصل اول.

تابع random_stardate/0 را پیاده‌سازی کنید که یک عدد اعشاری بین ۴۱۰۰۰٫۰ (شامل خودش) و ۴۲۰۰۰٫۰ (بدون خودش) برمی‌گرداند.

پیاده‌سازی باید از یک تابع Erlang استفاده کند.

CaptainsLog.random_stardate()
# => 41458.15721310934

4. قالب‌بندی تاریخ ستاره‌ای

در دفتر وقایع کاپیتان، تاریخ‌های ستاره‌ای معمولاً تا یک رقم اعشار گرد می‌شوند.

تابع format_stardate/1 را پیاده‌سازی کنید که یک عدد اعشاری می‌گیرد و رشته‌ای برمی‌گرداند که در آن عدد تا یک رقم اعشار گرد شده است.

پیاده‌سازی باید از یک تابع Erlang استفاده کند.

CaptainsLog.format_stardate(41458.15721310934)
# => "41458.2"
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Elixir Exercism

آماده‌اید دفترچه‌ی ناخدا را شروع کنید؟

در Exercism ثبت‌نام کنید تا Elixir را همراه با 58 مفهوم168 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.