修改很可能只是对 Char ascii 值加 3。我浏览了几本书,找不到现成的解决方案。(返回 Char 列表可以是不同的列表变量。)
问问题
1928 次
1 回答
6
import Data.Char
shiftAscii :: String -> String
shiftAscii xs = map (chr.(+3).ord) xs
会做你问的。
它之所以有效,是因为map
使用提供的函数编辑字符串中的每个字符。
ord
将 theChar
转换为其Int
值
(+3)
将 (ascii) 移动 3
chr
转换回 a Char
,
这chr.(+3).ord
三个也是用函数组合串起来的.
为了更灵活,你可以写
shiftAsciiBy :: Int -> String -> String
shiftAsciiBy n = map (chr.(+ n).ord)
请注意,移位 ascii 不尊重字母边界,因此如果您需要它来进行rot13
编码或类似的简单移位,您最好使用仅编辑字母的手动移位功能
addAscii :: Int -> Char -> Char
addAscii n c | isUpper c = chr $ ((ord c - ord 'A' + n) `mod` 26) + ord 'A'
| isLower c = chr $ ((ord c - ord 'a' + n) `mod` 26) + ord 'a'
| otherwise = c
例如
['A'..'z']
"ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz"
我们只移动字母 ascii:
map (addAscii 5) ['A'..'z']
"FGHIJKLMNOPQRSTUVWXYZABCDE[\\]^_`fghijklmnopqrstuvwxyzabcde"
于 2012-11-04T22:33:08.910 回答