2017-10-28 64 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"] 
>