مثير للإعجاب

إنشاء صفيفات الأبعاد في روبي

إنشاء صفيفات الأبعاد في روبي


We are searching data for your request:

Forums and discussions:
Manuals and reference books:
Data from registers:
Wait the end of the search in all databases.
Upon completion, a link will appear to access the found materials.

المقالة التالية جزء من سلسلة. لمزيد من المقالات في هذه السلسلة ، راجع Cloning the Game 2048 في Ruby. للحصول على الكود الكامل والنهائي ، انظر gist.

الآن بعد أن عرفنا كيف ستعمل الخوارزمية ، حان الوقت للتفكير في البيانات التي ستعمل عليها الخوارزمية. هناك خياران رئيسيان هنا: مجموعة مسطحة من نوع ما ، أو مجموعة ثنائية الأبعاد. لكل منها مزاياه ، ولكن قبل اتخاذ قرار ، نحتاج إلى أخذ شيء ما في الاعتبار.

الألغاز الجافة

أسلوب شائع في العمل مع الألغاز المستندة إلى الشبكة حيث عليك البحث عن أنماط مثل هذا هو كتابة إصدار واحد من الخوارزمية التي تعمل على اللغز من اليسار إلى اليمين ثم تدوير اللغز بأكمله حوالي أربع مرات. بهذه الطريقة ، يجب فقط كتابة الخوارزمية مرة واحدة ويجب أن تعمل فقط من اليسار إلى اليمين. هذا يقلل بشكل كبير من تعقيد وحجم الجزء الأصعب من هذا المشروع.

نظرًا لأننا سنعمل على حل اللغز من اليسار إلى اليمين ، فمن المنطقي أن تكون الصفوف ممثلة بالصفائف. عند إنشاء صفيف ثنائي الأبعاد في Ruby (أو ، على نحو أدق ، كيف تريد معالجته وماذا تعني البيانات فعليًا) ، عليك أن تقرر ما إذا كنت تريد مجموعة من الصفوف (حيث يتم تمثيل كل صف من الشبكة بـ صفيف) أو كومة من الأعمدة (حيث يكون كل عمود صفيفًا). بما أننا نعمل مع الصفوف ، فسنختار الصفوف.

كيف يتم تدوير هذه المجموعة ثنائية الأبعاد ، سوف نصل إليها بعد أن نقوم بالفعل بإنشاء مثل هذه المجموعة.

بناء اثنين من صفائف الأبعاد

يمكن أن يأخذ أسلوب Array.new وسيطة تحدد حجم الصفيف الذي تريده. فمثلا، Array.new (5) سيخلق مجموعة من 5 كائنات لا شيء. الوسيطة الثانية تمنحك قيمة افتراضية ، لذلك Array.new (5 ، 0) سوف أعطيك مجموعة 0,0,0,0,0. إذا كيف يمكنك إنشاء مجموعة ثنائية الأبعاد؟

الطريقة الخاطئة ، والطريقة التي أراها الناس يحاولون في كثير من الأحيان هي القول Array.new (4 ، Array.new (4 ، 0)). بمعنى آخر ، مجموعة من 4 صفوف ، كل صف عبارة عن صفيف من 4 أصفار. وهذا يبدو للعمل في البداية. ومع ذلك ، قم بتشغيل الكود التالي:

يبدو بسيطا. اصنع مجموعة من الأصفار 4x4 ، اضبط العنصر العلوي الأيسر على 1. لكن قم بطباعته ونحصل على ...

تعيين العمود الأول بأكمله إلى 1 ، ماذا يعطي؟ عندما صنعنا المصفوفات ، يتم استدعاء المكالمة الداخلية إلى Array.new أولاً ، مما يجعل صفًا واحدًا. ثم يتم تكرار إشارة واحدة إلى هذا الصف 4 مرات لملء الصفيف الخارجي. كل صف ثم الرجوع إلى نفس الصفيف. تغيير واحد ، تغيير كل منهم.

بدلا من ذلك ، نحن بحاجة إلى استخدام الثالث طريقة إنشاء مجموعة في روبي. بدلاً من تمرير قيمة إلى طريقة Array.new ، نمر كتلة. يتم تنفيذ الكتلة في كل مرة يحتاج الأسلوب Array.new إلى قيمة جديدة. لذلك إذا كنت ستقول Array.new (5) {get.chomp}سيتوقف روبي ويطلب المدخلات 5 مرات. لذلك كل ما نحتاج إلى القيام به هو مجرد إنشاء مجموعة جديدة داخل هذه الكتلة. لذلك نحن في نهاية المطاف مع Array.new (4) {Array.new (4،0)}. الآن دعونا نجرب هذه الحالة مرة أخرى.

وهو يفعل كما تتوقع.

لذلك على الرغم من أن روبي لا يتمتع بدعم من المصفوفات ثنائية الأبعاد ، إلا أنه لا يزال بإمكاننا القيام بما نحتاج إليه. فقط تذكر أن الصفيف المستوى الأعلى يحمل المراجع إلى المصفوفات الفرعية ، ويجب أن يشير كل صفيف فرعي إلى مجموعة مختلفة من القيم.

ما تمثله هذه المجموعة أمر متروك لك. في حالتنا ، تم وضع هذه المجموعة كصفوف. الفهرس الأول هو الصف الذي نقوم بفهرسته ، من أعلى إلى أسفل. لفهرسة الصف العلوي من اللغز ، نستخدم A0، لفهرسة الصف التالي أسفل نستخدمها A1. لفهرسة بلاطة محددة في الصف الثاني ، نستخدمها a1n. ومع ذلك ، إذا قررنا الأعمدة ... فسيكون الأمر نفسه. ليس لدى روبي أي فكرة عما نفعله بهذه البيانات ، ولأنه لا يدعم من الناحية الفنية المصفوفات ثنائية الأبعاد ، فإن ما نقوم به هنا هو اختراق. الوصول إليها فقط عن طريق الاتفاقية وكل شيء سوف تعقد معا. ننسى ما يفترض أن تفعله البيانات الموجودة أدناه ، وكل شيء يمكن أن ينهار بسرعة حقيقية.


شاهد الفيديو: How we can start to heal the pain of racial division. Ruby Sales (قد 2022).

Video, Sitemap-Video, Sitemap-Videos