2016-04-21 3 views

ответ

3

основная идея заключается в том, чтобы использовать 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.

Смежные вопросы