トラック
/
Haskell
Haskell
/
演習
/
アナグラム
アナグラム

アナグラム

中級

はじめに

ガレージセールで、格安の素敵なヴィンテージ・タイプライターを見つけました! わくわくしながら家に帰り、紙を1枚入れて、さっそく打ち始めます。 ところが、出てきた文字を見てわくわくはしぼんでしまいます。単語がすべて文字化けしているのです! たとえば、"post"の代わりに"stop"、"stale"の代わりに"least"と印字されます。 慎重にもう一度試してみますが、今度は"spot"と"slate"が印字されます。 いろいろ試しているうちに、文字が印字される前にランダムな遅延が入り、それで順番がめちゃくちゃになることがわかりました。 こんなに安かった理由が、今ならわかります!

この癖を利用すればアナグラムを作れることに気づきます。アナグラムとは、ある単語の文字を並べ替えてできる別の単語のことです。 この発見に満足したあなたは、その日一日じゅう、何百ものアナグラムを作って過ごします。

説明

目標の単語と候補の単語の集合が与えられたとき、候補の中から目標のアナグラムであるものだけを選び出すのが課題です。

アナグラムとは、文字を並べ替えて新しい単語を作ったものです。たとえば、"owns"は"snow"のアナグラムです。 ある単語がそれ自身のアナグラムになることはありません。たとえば、"stop"は"stop"のアナグラムではありません。

目標の単語と候補は、1文字以上のASCII英字(A-Zとa-z)からなる単語です。 小文字と大文字は同じものとして扱います。たとえば、"PoTS"は"sTOp"のアナグラムですが、StoPはsTOpのアナグラムではありません。 アナグラムの集合とは、候補の集合のうち目標の単語のアナグラムであるものだけを集めた部分集合です(順序は問いません)。 アナグラムの集合に含まれる単語は、候補の集合と同じ大文字・小文字のままでなければなりません。

目標が"stone"、候補が"stone"、"tones"、"banana"、"tons"、"notes"、"Seton"のとき、アナグラムの集合は"tones"、"notes"、"Seton"です。

ヒント

この演習を完了するには、関数anagramsForを実装する必要があります。この関数は単語と単語のグループを受け取り、与えられた単語のアナグラムを返します。

アナグラムは、候補の単語に並んでいる順序と同じ順序で返さなければなりません。

この演習を初めて解く場合は、用意されているシグネチャのまま進めることをおすすめします:

anagramsFor :: String -> [String] -> [String]

慣れてきたら、この問題に戻ってきて、ほかのデータ型やライブラリを試してみるのもよいでしょう:

  • パッケージtextのText。
  • パッケージcontainersのSequenceとSet。
  • パッケージmultisetのMultiSet

テストスイートは、意味の通るほぼどんな型シグネチャでも受け入れるように意図的に設計されています。自分がいちばんよいと思うものを見つけてみてください。

GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Haskell Exercism

アナグラムを始める準備はできましたか?

Exercismに登録すれば、107個の演習、そして本物の人間によるメンタリングとともに、Haskellを学んでマスターできます。すべて無料です。