Lexiconia라는 온라인 멀티플레이어 게임을 만드는 회사에서 일하고 있어요.
게임을 하려면 각 플레이어는 13개의 글자를 받고, 그 글자들을 재배열해서 단어를 만들어야 해요. 글자마다 점수가 다른데, 어떤 글자는 다른 글자보다 단어를 만들기가 더 쉽거든요.
게임은 처음에 영어로 출시했는데 인기가 아주 많아요. 그래서 이제 회사는 다른 언어로도 확장하려고 해요.
언어마다 글자의 점수를 다르게 지원해야 해요. 점수는 그 언어에서 각 글자가 다른 글자에 비해 얼마나 자주 쓰이는지로 정해져요.
예를 들어 'C'는 영어에서 꽤 흔한 글자라서 3점밖에 안 돼요. 그런데 노르웨이어에서는 아주 드문 글자라서 10점이에요.
새로운 언어를 더 쉽게 추가하려면, 팀에서 게임에 글자와 점수를 저장하는 방식을 바꿔야 해요.
게임에서 글자와 각 글자의 점수를 담은 데이터 형식을 바꾸는 것이 과제예요.
지금은 글자들이 점수를 기준으로 그룹으로 묶여 저장되어 있어요. 일대다 매핑이죠.
이제는 각 글자마다 그 점수를 짝지어 저장하는 일대일 매핑으로 바꿔야 해요.
이 변경의 일환으로, 팀은 글자를 대문자가 아니라 소문자로 바꾸기로도 했어요.
데이터가 이전에 어떻게 구성되어 있었고 어떻게 바뀌어야 하는지 살펴보고 싶다면, 테스트 스위트의 예시를 한번 봐요.
이 연습 문제는 텍스트 데이터를 다뤄요. 역사적인 이유로, Haskell의 String 타입은 문자 목록인 [Char]와 같은 뜻이에요. 텍스트 데이터를 더 효율적으로 다루려면 Text 타입을 사용할 수 있어요.
이 연습 문제를 선택적으로 확장하고 싶다면, 다음과 같이 해볼 수 있어요.
Haskell의 문자열 타입에 대해 읽어봐요.
package.yaml의 의존성 목록에 - text를 추가해요.
다음과 같은 방식으로 Data.Text를 임포트해요.
import qualified Data.Text as T
import Data.Text (Text)
이제 예를 들어 transform :: Map Int Text -> Map Char Int라고 쓰고, Data.Text의 콤비네이터를 T.toLower처럼 사용할 수 있어요.
Data.Text의 문서를 찾아봐요.
이 부분은 전부 선택 사항이에요.
Exercism에 가입하고 Haskell 트랙을 연습 문제 107개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.