트랙
/
Common Lisp
Common Lisp
/
연습 문제
/
Lucy의 멋진 매퍼
Lucy의 멋진 매퍼

Lucy의 멋진 매퍼

학습 연습 문제

소개

매핑

매핑이란 시퀀스의 각 원소에 함수를 적용해서 새로운 시퀀스를 만들어 내는 것을 말해요.

mapcar 함수를 사용하면 배열에서도 이 작업을 쉽게 할 수 있어요. 인자를 2로 곱하는 double 함수가 있다고 해봐요.

(mapcar #'double '(1 2 3 4)) ; => (2 4 6 8)

첫 번째 인자가 호출할 함수라는 점을 눈여겨봐요. #'는 함수를 지정하기 위한 특별한 인용 구문이에요.

double은 처음에는 첫 번째 원소를 가지고 호출되고, 그다음에는 두 번째 원소를 가지고 호출되는 식이에요. 그 결과들은 하나의 배열로 모이고, 이 배열이 바로 그 표현식이 평가되는 값이에요.

필터링

필터링은 원래 시퀀스에서 특정 원소들을 제외한 나머지를 복사해서 새로운 시퀀스를 만드는 과정이에요. 새 시퀀스에 어떤 항목을 포함할지는 술어 함수(불리언 값을 평가하는 함수)로 정할 수도 있고, 특정 객체와의 동등 비교로 정할 수도 있어요.

술어로 제거하기

remove-if는 술어 함수와 시퀀스를 인자로 받아서, 술어가 거짓으로 평가된 원소들만으로 이루어진 시퀀스를 반환하는 함수예요. 다시 말해, 술어가 참으로 평가되는 시퀀스의 모든 원소를 "제거"해요. 그런데 이 함수는 원래 시퀀스를 수정하지 않는다는 점에 주의해요! 대신 해당 원소들이 빠진 새로운 시퀀스를 반환해요. 만약 모든 값에 대해 술어가 참이었다면 빈 시퀀스가 반환돼요.

(remove-if #'evenp '(1 2 3 4 5)) ; => (1 3 5)
(remove-if #'oddp '(1 3 5))      ; => ()

특정 항목 제거하기

시퀀스에서 특정 항목을 제거하고 싶다면 remove를 사용할 수 있어요. remove는 제거할 항목과 시퀀스를 인자로 받아요. 제거할 항목과 같지 않은 시퀀스의 모든 값이 반환돼요. 참고: 동등성은 기본적으로 eql 일반 동등성 술어로 검사해요.

(remove 1 '(1 2 1 3 1 4)) ; => (2 3 4)
(remove #\l "hello")      ; => "heo"

지침

Lisp 외계인 Lucy는 숫자를 좋아해요. 그중 몇몇은 "멋지다"고 생각하기도 하죠.

Lucy는 숫자를 더 멋지게 만드는 함수를 작성하는 걸 도와달라고 해요.

Lucy가 어떤 숫자를 멋지다고 생각하는지는 바뀔 수 있어서, 함수는 유연해야 해요.

1. 멋지게 만들기

숫자 배열을 더 멋진 숫자 배열로 만들려면, 숫자에 적용할 함수와 숫자 배열을 받는 make-magnificent-maybe 함수를 작성해야 해요. 이 함수는 (주어진 함수에 따라) 더 멋진 숫자들의 배열로 평가되어야 해요.

(make-magnificent-maybe #'square '(1 2 3)) ; => (1 4 9)
(make-magnificent-maybe #'1+ '(1 2 3))     ; => (2 3 4)

2. 최고만 남기기

숫자를 (바라건대) 더 멋지게 만들고 나면, Lucy는 정말 멋진 숫자만 보고 싶어 해요.

1은 절대 멋지지 않다는 걸 분명히 알고 있으니, 1은 그냥 제거해야 해요.

그런데 그 외에도 Lucy는 가끔 마음을 바꾸기 때문에, 어떤 숫자가 멋진지 아닌지 알려 주는 함수를 다시 줄 거예요.

함수와 숫자 배열을 받아, 가장 멋진 숫자만 (즉, 1이 아니고 주어진 함수가 참으로 평가하는 숫자도 아닌 숫자만) 반환하는 only-the-best 함수를 작성해야 해요.

(only-the-best #'evenp '(1 2 3 4 5)) ; => (3 5)
(only-the-best #'oddp '(1 3 5))    ; => ()
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Common Lisp Exercism

Lucy의 멋진 매퍼 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Common Lisp 트랙을 개념 27개연습 문제 92개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.