Flower Field هي إعادة تخيّل عطوفة للعبة الشهيرة Minesweeper. هدف اللعبة هو العثور على كل الأزهار في الحديقة باستخدام تلميحات رقمية تشير إلى عدد الأزهار المجاورة مباشرة (أفقيًا، وعموديًا، وقطريًا) لمربع. صدرت لعبة "Flower Field" ضمن إصدارات إقليمية من Microsoft Windows في إيطاليا وألمانيا وكوريا الجنوبية واليابان وتايوان.
مهمتك هي إضافة أعداد الأزهار إلى المربعات الفارغة في حديقة "حقل الأزهار" المكتملة.
الحديقة نفسها لوحة مستطيلة تتكوّن من مربعات، إما فارغة (' ') وإما زهرة ('*').
لكل مربع فارغ، احسب عدد الأزهار المجاورة له (أفقيًا، رأسيًا، وقطريًا). إذا لم يكن للمربع الفارغ أي أزهار مجاورة، فاتركه فارغًا. وإلا فاستبدله بعدد الأزهار المجاورة.
على سبيل المثال، قد تستلم لوحة بأبعاد 5 x 4 مثل هذه (المسافات الفارغة ممثَّلة هنا بالمحرف '·' لعرضها على الشاشة):
·*·*·
··*··
··*··
·····
والتي ينبغي أن يحوّلها الكود إلى هذا:
1*3*1
13*31
·2*2·
·111·
jq
ستلاحظ خيارات إضافية لـ jq في الاختبارات.
run jq -s -R -c -f flower-field.jq << 'END_INPUT'
ما هي؟
-s
هذا هو وضع «slurp». فبدلًا من التعامل مع المدخل كتدفق من كائنات JSON، ستُجمع كل المدخلات في مصفوفة واحدة.
$ seq 5 | jq -c '.'
1
2
3
4
5
$ seq 5 | jq -s -c '.'
[1,2,3,4,5]
-R
ربما رأيت الخيار -r من قبل، وهو يُخرج سلاسل نصية «خام» (بدون علامات اقتباس).
أما هذا الخيار فهو العكس تمامًا.
ويُعتبر كل سطر من المدخل سلسلة نصية.
مثالان:
$ seq 5 | jq -R -c .
"1"
"2"
"3"
"4"
"5"
$ echo 42 | jq '. * 2' # input is a JSON number
84
$ echo 42 | jq -R '. * 2' # input is a JSON string
"4242"
عندما تجمع بين هذين الخيارين، لن تحصل على مصفوفة من السلاسل النصية: بل ستحصل على المدخل كله كسلسلة نصية واحدة، بما في ذلك محارف السطر الجديد في نهاية كل سطر.
$ seq 5 | jq -s -R -c .
"1\n2\n3\n4\n5\n"
التعامل مع هذا جزء من تحدّي هذا التمرين.
سجّل في Exercism لتتعلّم وتتقن jq عبر 12 مفهومًا75 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.
نستكشف حلقات `for` المتداخلة، والاستخدام الذكي لـ `min`/`max` لتبسيط التحقق من الحدود، وخطوط الأنابيب الوظيفية، واستخدام المصفوفات ثنائية الأبعاد.