Flower Field هي إعادة تخيّل عطوفة للعبة الشهيرة Minesweeper. هدف اللعبة هو العثور على كل الأزهار في الحديقة باستخدام تلميحات رقمية تشير إلى عدد الأزهار المجاورة مباشرة (أفقيًا، وعموديًا، وقطريًا) لمربع. صدرت لعبة "Flower Field" ضمن إصدارات إقليمية من Microsoft Windows في إيطاليا وألمانيا وكوريا الجنوبية واليابان وتايوان.
مهمتك هي إضافة أعداد الأزهار إلى المربعات الفارغة في حديقة "حقل الأزهار" المكتملة.
الحديقة نفسها لوحة مستطيلة تتكوّن من مربعات، إما فارغة (' ') وإما زهرة ('*').
لكل مربع فارغ، احسب عدد الأزهار المجاورة له (أفقيًا، رأسيًا، وقطريًا). إذا لم يكن للمربع الفارغ أي أزهار مجاورة، فاتركه فارغًا. وإلا فاستبدله بعدد الأزهار المجاورة.
على سبيل المثال، قد تستلم لوحة بأبعاد 5 x 4 مثل هذه (المسافات الفارغة ممثَّلة هنا بالمحرف '·' لعرضها على الشاشة):
·*·*·
··*··
··*··
·····
والتي ينبغي أن يحوّلها الكود إلى هذا:
1*3*1
13*31
·2*2·
·111·
جميع المدخلات والمخرجات بترميز ASCII.
النوع String والنوع &str في Rust بترميز utf8، لذلك قد تتوقع أن تكون "Hello".chars() بسيطة، لكنها في الواقع تفحص كل محرف لتعرف ما إذا كان طوله 1 أو 2 أو 3 أو 4 u8.
إذا عرفنا أن &str بترميز ASCII، فيمكننا استدعاء .as_bytes() والتعامل مع البيانات الأساسية على أنها &[u8] (شريحة بايتات).
التكرار على شريحة من بايتات ASCII أسرع بكثير، لأنه لا توجد نقاط ترميز، فكل بايت ASCII طوله u8 واحد.
هل يمكنك إكمال التحدي دون استنساخ المدخل؟
سجّل في Exercism لتتعلّم وتتقن Rust عبر 99 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.
نستكشف حلقات `for` المتداخلة، والاستخدام الذكي لـ `min`/`max` لتبسيط التحقق من الحدود، وخطوط الأنابيب الوظيفية، واستخدام المصفوفات ثنائية الأبعاد.