2017-10-28 58 views
2

我是新来的哈斯克尔,我目前正在网格游戏中写字搜索,可以找到对角线,行和列中的单词。我使用Data.List.transpose来创建列,但输出始终会创建新的空字符串。我试过过滤器功能,但它不会改变输出:filter (not.null) (L.transpose y)。输出看起来像这样:["IYYPPOLFHTNMTDI"," ","UTVCGNVAEEZXEIR"," ","PDCPLTRUGSWTSQC"," ","GZEGUDGHSZTGSDT"," ","RMCEDJABPEUERTL"," ","ATTRVRXGKBRAMRA"," ","DZISDRASHAODEOP"," ","EVWWUWIXWBHGMMT"," ","ENAGCDYTYIOAOTO"," ","PRLCFFFEPDIVRKP"," ","EXZRNOKLOKPLYSO"," ","QSRESYZICYKUOLX"]转置空字符串返回列表

初始网格:

grid :: [String] 
grid 
    = ["I U P G R A D E E P E Q", 
     "Y T D Z M T Z V N R X S", 
     "Y V C E C T I W A L Z R", 
     "P C P G E R S W G C R E", 
     "P G L U D V D U C F N S", 
     "O N T D J R R W D F O Y", 
     "L V R G A X A I Y F K Z", 
     "F A U H B G S X T E L I", 
     "H E G S P K H W Y P O C", 
     "T E S Z E B A B I D K Y", 
     "N Z W T U R O H O I P K", 
     "M X T G E A D G A V L U", 
     "T E S S R M E M O R Y O", 
     "D I Q D T R O M T K S L", 
     "I R C T L A P T O P O X" ] 

我该如何解决这个问题,或者是有没有更好的办法来调换字符串列表?

+2

字符串不为空。这些字符串中充满了空间''。这是因为你的网格在每个偶数位置都有一个空格,例如, '我U P G'。如果你删除这些空间,一切都会变成你想要的。 – Zeta

+0

这只是一个“如何让它以这种特定方式打印”的问题? – Carbon

回答

3

问题是transpose将字符串视为包含空格的字符列表。如果你尝试:

transpose ["ABC", 
      "DE ", 
      "FGH"] 

你会得到:

["ADF", 
"BEG", 
"C H"] 

,你可以看到所有的字符,包含空格,对调。

对于您的特殊情况,有一个简单的解决方法。您可以使用wordsunwords之前"A B C"转换为["A","B","C"]和背部和后置:

> import Data.List 
> (map unwords . transpose . map words) ["A B C","D E F","G H I"] 
["A D G","B E H","C F I"] 
> 

filter没有工作的原因是,只有空字符串是null - 一个空格字符串是不可-空值。你可能已经可以用于:

> import Data.Char 
> filter (not . all isSpace) ["abc"," ","def"] 
["abc","def"] 
> 

作为一个侧面说明,你可能要重新考虑是否要代表在你的程序在内部空间的网格。现在看来似乎会更容易有两种工作:

[["a","b","c"],["d","e","f"],["g","h","i"]] :: [[String]] 

或:

["abc","def","ghi"] :: [[Char]] 

内部和只添加或输入或输出网格时减的空间。

对于前面的表示形式,您可以使用map wordsmap unwords来回转换。对于后者,您可以使用:

> map (intersperse ' ') ["abc","def","ghi"] 
["a b c","d e f","g h i"] 
> map (concat . words) ["a b c","d e f","g h i"] 
["abc","def","ghi"] 
>