گاهی لازم است به یک دنباله نه بهصورت عنصر به عنصر، بلکه بهصورت مجموعهای از تکهها نگاه کنید. واژگان 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" و غیره.
couple را طوری تعریف کنید که یک آرایه از واگنها و یک طول n بگیرد و قطارهایی بدون همپوشانی برگرداند که هر کدام n واگن دارند. اگر تعداد بهطور مساوی تقسیم نشود، قطار آخر میتواند کوتاهتر باشد.
{ "coal" "coal" "coke" "ore" "ore" "timber" "timber" } 3 couple .
! => { { "coal" "coal" "coke" } { "ore" "ore" "timber" } { "timber" } }
peek-couplings را طوری تعریف کنید که یک آرایه از واگنها بگیرد و هر جفت مجاور را برگرداند، تا بازرس بتواند هر جفتکننده را بررسی کند.
{ "coal" "ore" "timber" "crates" } peek-couplings .
! => { { "coal" "ore" } { "ore" "timber" } { "timber" "crates" } }
split-at-junctions را طوری تعریف کنید که یک آرایه از واگنها و یک آرایه از junctions (واگنهایی که نقطهی شکست را نشان میدهند) بگیرد و بخشهای میان واگنهای تقاطع را برگرداند. خود واگنهای تقاطع نگه داشته نمیشوند.
{ "coal" "coal" "switch" "ore" "switch" "timber" }
{ "switch" } split-at-junctions .
! => { { "coal" "coal" } { "ore" } { "timber" } }
coalesce-cargo را طوری تعریف کنید که یک آرایه از واگنها بگیرد و واگنهای پشتسرهم با بار یکسان را بهصورت رشتههای پیوسته گروهبندی کند.
{ "coal" "coal" "ore" "ore" "ore" "timber" "coal" } coalesce-cargo .
! => { { "coal" "coal" } { "ore" "ore" "ore" } { "timber" } { "coal" } }