我正在尝试解决 Haskell 中 Euler 项目(此处)的“方形字谜词对”问题,但我被困住了......
问题如下(我缩短了它):
- 取一个词,说“CARE”和它的字谜之一,例如“RACE”。
- 用唯一的数字替换“CARE”的每个字母,例如 C = 1、A = 2、R = 9 和 E = 6。它恰好是 1296,是一个平方数。
- 按照相同的替换策略替换字谜的字母(“RACE”),它会生成 9216,它也是一个平方数!
给定一个单词列表,由这样一对单词组成的最大平方数是多少?
我设法从文件中提取了所有字谜对,并将它们放在 [(String,String)] 形式中,即 [("CARE","RACE")..]。
在下一步(映射 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