مینیاب یک بازی محبوب است که در آن کاربر باید مینها را با کمک نشانههای عددی پیدا کند. این نشانهها نشان میدهند که چند مین بهطور مستقیم (بهصورت افقی، عمودی یا قطری) با یک خانه مجاور است.
وظیفهی شما این است که در یک صفحهی مینیاب که کامل شده است، تعداد مینهای مجاور را به خانههای خالی اضافه کنید.
خود صفحه یک مستطیل است که از خانههایی تشکیل شده است که یا خالیاند (' ') یا مین ('*').
برای هر خانهی خالی، تعداد مینهای مجاور آن را بشمارید (بهصورت افقی، عمودی و قطری). اگر خانهی خالی هیچ مین مجاوری نداشته باشد، آن را خالی بگذارید. در غیر این صورت، آن را با تعداد مینهای مجاور جایگزین کنید.
برای مثال، ممکن است صفحهای ۵ در ۴ مانند این دریافت کنید (جاهای خالی در اینجا برای نمایش روی صفحه با نویسهی «·» نشان داده شدهاند):
·*·*·
··*··
··*··
·····
که کد شما باید آن را به این تبدیل کند:
1*3*1
13*31
·2*2·
·111·
همهی ورودیها و خروجیها در ASCII هستند.
Stringها و &strها در Rust با utf8 ذخیره میشوند، پس هرچند ممکن است انتظار داشته باشید که "Hello".chars() ساده باشد، در واقع باید هر کاراکتر را بررسی کند تا ببیند ۱، ۲، ۳ یا ۴ تا u8 طول دارد.
اگر بدانیم یک &str در ASCII است، میتوانیم .as_bytes() را فراخوانی کنیم و به دادهی زیرین بهصورت یک &[u8] (برش بایت) ارجاع بدهیم.
پیمایش روی برشی از بایتهای ASCII بسیار سریعتر است، چون هیچ کدپوینتی در کار نیست؛ هر بایت ASCII دقیقاً یک u8 طول دارد.
آیا میتوانید این چالش را بدون کلون کردن ورودی کامل کنید؟
در Exercism ثبتنام کنید تا Rust را همراه با 99 تمرین و مربیگری انسانی واقعی یاد بگیرید و در آن استاد شوید، همهی اینها رایگان.
حلقههای For تودرتو، استفادهی هوشمندانه از `min` و `max` برای ساده کردن بررسی محدودهها، پایپلاینهای تابعی و استفاده از ماتریسهای دوبعدی را بررسی میکنیم.