1

変更は、Charascii値に3を追加するだけの場合もあります。私はいくつかの本を読みましたが、すぐに解決策を見つけることができません。(Charリストを返すことは、別のリスト変数に行うことができます。)

4

1 に答える 1

6
import Data.Char
shiftAscii :: String -> String
shiftAscii xs = map (chr.(+3).ord) xs

あなたが求めることをするでしょう。

map提供された関数を使用して文字列内の各文字を編集するため、これは機能します。

ordCharをその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 に答える