変更は、Charascii値に3を追加するだけの場合もあります。私はいくつかの本を読みましたが、すぐに解決策を見つけることができません。(Charリストを返すことは、別のリスト変数に行うことができます。)
質問する
1928 次
1 に答える
6
import Data.Char
shiftAscii :: String -> String
shiftAscii xs = map (chr.(+3).ord) xs
あなたが求めることをするでしょう。
map
提供された関数を使用して文字列内の各文字を編集するため、これは機能します。
ord
Char
をそのInt
値に変換すると
(+3)
、(ASCII)が3シフトして、に
chr
変換されますChar
。
chr.(+3).ord
これらの3つは機能合成と一緒につながれています.
より柔軟にするために、あなたは書くことができます
shiftAsciiBy :: Int -> String -> String
shiftAsciiBy n = map (chr.(+ n).ord)
アスキーをシフトすることはアルファベットの境界を尊重しないことに注意してください。したがって、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 に答える