основная идея заключается в том, чтобы использовать mod
, чтобы обернуть вокруг начала.
Теперь это не эффективно (но эй вы используете самый незащищенный шифр, чтобы вы не могли бы заботиться, чтобы много), но я покажу вам, используя только алфавит и индексацию функцию:
import Data.List (elemIndex)
alphabet :: [Char]
alphabet = ['A'..'Z'] ++ ['0'..'9']
ith :: Int -> Char
ith i = alphabet !! j
where j = i `mod` length alphabet
index :: Char -> Int
index c = case c `elemIndex` alphabet of
Just i -> i
Nothing -> error "not inalphabet"
encode :: Int -> String -> String
encode n xs = [ ith $ index x + n | x <- xs ]
это даст вы
λ> encode 3 "ABCXYZ012789"
"DEFABC"
теперь вы, вероятно, хотите, чтобы найти способ, с помощью ord
и chr
- как работает, если вы сделаете случай различия между A-Z
и 0-9
, поскольку диапазоны:
- 65-90 для AZ
- 48-57 для 0-9
так что вы не можете взять одну формулу без многих трюков
Вы должны попробовать, но это больше по математике от здесь (вы, вероятно, захотите что-то вроде ord c - ord 'A'
для писем и 26 + ord c - ord '0'
для цифр, чтобы получить его в диапазоне 0-35
.