مسیرها
/
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 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.