Lexiconiaというオンラインマルチプレイヤーゲームを作っている会社で働いています。
このゲームをプレイするには、各プレイヤーに13文字の文字が渡され、それらを並べ替えて単語を作ります。文字によってポイントが異なります。というのも、単語を作りやすい文字とそうでない文字があるからです。
ゲームはもともと英語版としてリリースされましたが、とても人気が出たため、今では会社は他の言語にも展開したいと考えています。
言語が違えば、文字に設定するポイントも変える必要があります。ポイントは、その言語の中でそれぞれの文字がどれくらいよく使われるかを基準に決められます。
たとえば、'C'という文字は英語ではよく使われる方で、ポイントはわずか3です。しかしノルウェー語ではとても珍しい文字で、ポイントは10になります。
新しい言語を追加しやすくするために、チームはゲーム内で文字とそのポイントを保存する方法を変える必要があります。
ゲームにおける文字とその得点のデータ形式を変更するのが、この課題です。
現在、文字は得点に基づいてグループ分けされて格納されており、1対多のマッピングになっています。
これを、各文字とその得点を1対1のマッピングで格納する形式に変更する必要があります。
この変更の一環として、チームは文字を大文字ではなく小文字にすることも決めました。
データが以前どのように構成されていたか、そしてどのように変更する必要があるかを確認したい場合は、テストスイートの例を見てみてください。
この演習ではテキストデータを扱います。歴史的な理由から、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のドキュメントを調べてみましょう。
この部分は完全に任意です。