Haskell でプロジェクト Euler ( here )の「正方形のアナグラム単語ペア」の問題を解決しようとしていますが、行き詰まっています...
問題は次のとおりです(私はそれを短くしました):
- 「CARE」とそのアナグラムの 1 つ、たとえば「RACE」と言う 1 つの単語を取ります。
- 「CARE」の各文字を一意の数字に置き換えます。たとえば、C = 1、A = 2、R = 9、E = 6 です。たまたま 1296 であり、平方数です。
- 同じ置換ポリシーに従ってアナグラムの文字 (「RACE」) を置換すると、これも平方数である 9216 が生成されます。
単語のリストが与えられたとき、そのようなペアのメンバーによって形成される最大の平方数は何ですか?
ファイルからすべてのアナグラムのペアを抽出することができ、それらを [(String,String)] 形式、つまり [("CARE","RACE")..] にしました。
次のステップ (map anasquare) では、単語のペアごとに、[(9216,"CARE","RACE")..] のようになるように、生成できる最大の平方数をリンクします。
まあ、ブルート フォース アプローチを回避するためのトリック (あるに違いない!) がありますが、これまでのところ、私はそれを見つけられませんでした.すべての文字 -> 数字の変換。Haskellでそれを行う方法がわかりません。疲れているのかもしれませんが、これを前にしてはただの唖然としています。それを書くための簡潔でエレガントでありながらあまりにも曖昧ではない方法があるに違いありません.誰かがアイデアを持っていますか?
アナグラム検索とファイル解析機能は割愛します。
-- Read the file -> store the content into a list -> work on that list -> print the output
result98 = do contents <- readFile ".\\resources\\98.txt"
putStrLn $ (process.words.format) contents
-- Find anagram pairs -> Find corresponding square number -> get the biggest one
process::[String]->String
process = toString . maximum . map anasquare . anagrams
where toString (a,b,c) = "Yay ! the result is " ++ show a
-- Generate the maximum square number possible, 0 when none exist
anasquare::(String,String)->(Integer,String,String)
anasquare (x,y) = (anasquareValue,x,y)
where anasquareValue = 0 -- TODO