مسیرها
/
Scala
Scala
/
تمرین‌ها
/
شمارش نوکلئوتید
شمارش نوکلئوتید

شمارش نوکلئوتید

متوسط

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

هر یک از ما از والدین زیستی خود مجموعه‌ای از دستورالعمل‌های شیمیایی را به ارث می‌بریم که با نام DNA شناخته می‌شوند و بر نحوه‌ی ساخت بدن ما تأثیر می‌گذارند. همه‌ی حیات شناخته‌شده به DNA وابسته است!

نکته: برای انجام این تمرین نیازی نیست چیزی درباره‌ی نوکلئوتیدها یا DNA بدانید.

DNA زنجیره‌ای بلند از مواد شیمیایی دیگر است و مهم‌ترین آن‌ها چهار نوکلئوتید هستند: آدنین، سیتوزین، گوانین و تیمین. یک زنجیره‌ی DNA می‌تواند میلیاردها عدد از این چهار نوکلئوتید را در خود داشته باشد و ترتیبی که این نوکلئوتیدها در آن ظاهر می‌شوند مهم است! ما به ترتیب این نوکلئوتیدها در بخشی از DNA، «توالی DNA» می‌گوییم.

یک توالی DNA را به صورت مجموعه‌ای مرتب از این چهار نوکلئوتید نمایش می‌دهیم و روشی رایج برای این کار، استفاده از رشته‌ای از کاراکترها است؛ مثلاً «ATTACG» برای یک توالی DNA با ۶ نوکلئوتید. «A» برای آدنین، «C» برای سیتوزین، «G» برای گوانین و «T» برای تیمین.

با داشتن رشته‌ای که یک توالی DNA را نمایش می‌دهد، بشمارید که از هر نوکلئوتید چند تا موجود است. اگر رشته شامل کاراکترهایی باشد که A، C، G یا T نیستند، آنگاه نامعتبر است و باید خطایی را اعلام کنید.

برای مثال:

"GATTACA" -> 'A': 3, 'C': 1, 'G': 1, 'T': 2
"INVALID" -> error

یکی از کاربردهای رایج Either نشان دادن محاسباتی است که ممکن است به خطا منجر شود (اگر خود خطا اهمیتی برایتان ندارد، شاید نوع ساده‌تر Option انتخاب بهتری باشد). در نبود خطا، نتیجه معمولاً یک Right است (یادیار: مقدار «درست»)، در حالی که خطا یک Left است؛ برای مثال یک Left[String] که پیام خطا را در خود دارد. توجه کنید که در Scala ۲.۱۲، Either به‌طور پیش‌فرض به سمت Right گرایش دارد، بنابراین برای عملیاتی مثل filter، map، flatMap یا داخل یک for-comprehension همان‌طور که انتظار دارید عمل می‌کند. اگر با Either آشنا نیستید، می‌توانید این آموزش را بخوانید. اما توجه داشته باشید که این آموزش مربوط به نسخه‌های Scala پیش از ۲.۱۲ است. برای Scala ۲.۱۲ می‌توانید RightProjection را با خیال راحت نادیده بگیرید و .right را حذف کنید. Either چیزی است که به آن موناد می‌گویند و یک «جنبه‌ی محاسباتی» را در بر می‌گیرد؛ در اینجا منظور مدیریت خطاست. استفاده‌ی درست از مونادها می‌تواند به کدی بسیار مختصر و در عین حال زیبا و خوانا منجر شود. استفاده‌ی نادرست به‌راحتی نتیجه‌ی برعکس می‌دهد. برای یادگیری بیشتر این ویدیو را تماشا کنید.

دام‌های رایجی که باید از آن‌ها دوری کنید

چند قاعده‌ی سرانگشتی برای Either وجود دارد:

  1. اگر به آن نیازی ندارید، از آن استفاده نکنید. به‌جای این
def add1(x: Int): Either[String, Int] = Right(x + 1)

بهتر است این را بنویسید

def add1(x: Int): Int = x + 1

(برای اعمال چنین توابع ساده‌ای Either.map وجود دارد، پس لازم نیست آن‌ها را با Either شلوغ کنید).

  1. اگر واقعاً نیازی نیست، مقدار را «بازگشایی» نکنید. اغلب توابع آماده‌ای برای هدف شما وجود دارد. نشانه‌های بازگشایی زودهنگام isLeft/isRight یا تطبیق الگو هستند. برای مثال، به‌جای این
val x: Either[String, Int] = ...

if (x.isRight) x.right.get + 1 else x.left.get
// or
x match {
  case Right(n) => n + 1
  case Left(s) => s
}

بهتر است این را بنویسید

x fold (identity, _ + 1)
  1. می‌توان مونادها را داخل یک for-comprehension هم به کار برد؛ نتیجه‌اش هم عالی است. این کار وقتی توصیه می‌شود که بخواهید چند نمونه‌ی Either را با هم «ترکیب» کنید. به‌جای این
val xo: Either[String, Int] = ...
val yo: Either[String, Int] = ...
val zo: Either[String, Int] = ...

xo.flatMap(x =>
  yo.flatMap(y =>
    zo.map(z =>
	    x + y + z)))

بهتر است این را بنویسید

for {
  x <- xo
  y <- yo
  z <- zo
} yield x + y + z
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Scala Exercism

آماده‌اید شمارش نوکلئوتید را شروع کنید؟

در Exercism ثبت‌نام کنید تا Scala را همراه با 95 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.