學習軌道
/
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,透過 47 個概念163 個練習 和真人引導來學習並精通 Factor,全部免費。