트랙
/
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개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.