مین‌یاب

مین‌یاب

متوسط

مقدمه

مین‌یاب یک بازی محبوب است که در آن کاربر باید مین‌ها را با کمک نشانه‌های عددی پیدا کند. این نشانه‌ها نشان می‌دهند که چند مین به‌طور مستقیم (به‌صورت افقی، عمودی یا قطری) با یک خانه مجاور است.

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

وظیفه‌ی شما این است که در یک صفحه‌ی مینیاب که کامل شده است، تعداد مین‌های مجاور را به خانه‌های خالی اضافه کنید. خود صفحه یک مستطیل است که از خانه‌هایی تشکیل شده است که یا خالی‌اند (' ') یا مین ('*').

برای هر خانه‌ی خالی، تعداد مین‌های مجاور آن را بشمارید (به‌صورت افقی، عمودی و قطری). اگر خانه‌ی خالی هیچ مین مجاوری نداشته باشد، آن را خالی بگذارید. در غیر این صورت، آن را با تعداد مین‌های مجاور جایگزین کنید.

برای مثال، ممکن است صفحه‌ای ۵ در ۴ مانند این دریافت کنید (جاهای خالی در اینجا برای نمایش روی صفحه با نویسه‌ی «·» نشان داده شده‌اند):

·*·*·
··*··
··*··
·····

که کد شما باید آن را به این تبدیل کند:

1*3*1
13*31
·2*2·
·111·

نکته‌ی کارایی

همه‌ی ورودی‌ها و خروجی‌ها در ASCII هستند. Stringها و &strها در Rust با utf8 ذخیره می‌شوند، پس هرچند ممکن است انتظار داشته باشید که "Hello".chars() ساده باشد، در واقع باید هر کاراکتر را بررسی کند تا ببیند ۱، ۲، ۳ یا ۴ تا u8 طول دارد. اگر بدانیم یک &str در ASCII است، می‌توانیم .as_bytes() را فراخوانی کنیم و به داده‌ی زیرین به‌صورت یک &[u8] (برش بایت) ارجاع بدهیم. پیمایش روی برشی از بایت‌های ASCII بسیار سریع‌تر است، چون هیچ کدپوینتی در کار نیست؛ هر بایت ASCII دقیقاً یک u8 طول دارد.

آیا می‌توانید این چالش را بدون کلون کردن ورودی کامل کنید؟

ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Rust Exercism

آماده‌اید مین‌یاب را شروع کنید؟

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

بررسی عمیق مین‌یاب!

حلقه‌های For تودرتو، استفاده‌ی هوشمندانه از `min` و `max` برای ساده کردن بررسی محدوده‌ها، پایپ‌لاین‌های تابعی و استفاده از ماتریس‌های دوبعدی را بررسی می‌کنیم.