المسارات
/
Factor
Factor
/
التمارين
/
عربات القطار البلجيكية
عربات القطار البلجيكية

عربات القطار البلجيكية

تمرين تعلّمي

مقدمة

تحتاج أحيانًا إلى النظر إلى تسلسل باعتباره تتابعًا من القطع بدلًا من التعامل معه عنصرًا عنصرًا. تمنحك مفردات grouping وsplitting وsplitting.monotonic أربع طرق لفعل ذلك.

group: كتل منفصلة بحجم n

group ( seq n -- groups )
USING: grouping ;

{ 1 2 3 4 5 6 7 } 3 group .
! => { { 1 2 3 } { 4 5 6 } { 7 } }

إذا لم يكن طول التسلسل من مضاعفات n، تكون الكتلة الأخيرة أقصر من n.

clump: نافذة منزلقة متداخلة بحجم n

clump ( seq n -- clumps )
USING: grouping ;

{ 1 2 3 4 5 } 2 clump .
! => { { 1 2 } { 2 3 } { 3 4 } { 4 5 } }

إذا كان التسلسل أقصر من n، تكون النتيجة فارغة.

split-when: التقسيم حيثما يتحقق اختبار شرطي

split-when ( seq quot: ( elt -- ? ) -- pieces )
USING: splitting ;

{ 1 2 0 3 4 0 5 } [ zero? ] split-when .
! => { { 1 2 } { 3 4 } { 5 } }

يحصل كل عنصر على استدعاء الاختبار الشرطي الخاص به؛ العناصر التي يُرجع عنها قيمة صحيحة هي نقاط القطع ولا تُحتفظ بها في النتيجة.

monotonic-split: تقسيم المقاطع المتتالية عندما يفشل فحص الزوج المتجاور

monotonic-split ( seq quot: ( a b -- ? ) -- pieces )
USING: splitting.monotonic ;

{ 1 1 2 2 2 3 } [ = ] monotonic-split .
! => { { 1 1 } { 2 2 2 } { 3 } }

يعمل الاختبار الشرطي على الأزواج المتجاورة. ما دام يُرجع قيمة صحيحة، يستمر المقطع؛ وعندما يُرجع f، يبدأ مقطع جديد. مع [ = ] تحصل على مقاطع من عناصر متساوية؛ ومع [ <= ] تحصل على مقاطع غير متناقصة؛ وهكذا.

متى تستخدم أيًّا منها

  • group/clump: تعرف الحجم الذي تريده.
  • split-when: تعرف كيف يبدو عنصر القطع.
  • monotonic-split: تعرف ما الذي يجعل عنصرين متجاورين ينتميان معًا.

التعليمات

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

كل عربة هي سلسلة نصية تسمّي ما تحمله: "coal"، "timber"، "crates"، إلخ.

1. اقرن العربات في قطارات

عرّف couple لتأخذ مصفوفة من العربات وطولًا n، وتُرجع قطارات غير متداخلة من n عربة لكل قطار. قد يكون القطار الأخير أقصر إذا لم يقبل العدد القسمة بالتساوي.

{ "coal" "coal" "coke" "ore" "ore" "timber" "timber" } 3 couple .
! => { { "coal" "coal" "coke" } { "ore" "ore" "timber" } { "timber" } }

2. ألقِ نظرة على الوصلات

عرّف peek-couplings لتأخذ مصفوفة من العربات وتُرجع كل زوج متجاور، حتى يتمكن المفتش من فحص كل وصلة.

{ "coal" "ore" "timber" "crates" } peek-couplings .
! => { { "coal" "ore" } { "ore" "timber" } { "timber" "crates" } }

3. قسّم صفّ العربات عند المفاصل

عرّف split-at-junctions لتأخذ مصفوفة من العربات ومصفوفة junctions (عربات تحدّد نقطة قطع)، وتُرجع المقاطع الواقعة بين عربات المفاصل. لا تُحتفظ بعربات المفاصل نفسها.

{ "coal" "coal" "switch" "ore" "switch" "timber" }
{ "switch" } split-at-junctions .
! => { { "coal" "coal" } { "ore" } { "timber" } }

4. ادمج الحمولات المتطابقة

عرّف coalesce-cargo لتأخذ مصفوفة من العربات وتجمع العربات المتتالية الحاملة للحمولة نفسها في متتاليات.

{ "coal" "coal" "ore" "ore" "ore" "timber" "coal" } coalesce-cargo .
! => { { "coal" "coal" } { "ore" "ore" "ore" } { "timber" } { "coal" } }
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Factor Exercism

مستعد لبدء عربات القطار البلجيكية؟

سجّل في Exercism لتتعلّم وتتقن Factor عبر 47 مفهومًا163 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.