2016-04-21 29 views
1

我試圖寫一個凱撒密碼,但只有大寫字母數字。使用ordchr使用整個ASCII表。如何做到這一點?如何使用ORD和CHR只有A到Z和0到9?

這是我到目前爲止有:

alphabet = ['A'..'Z'] ++ ['0'..'9'] 

c2I = ord c - ord 'A' 

i2C = chr (n + ord 'A') 

回答

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" 

現在你可能會想使用ordchr找到一種方法 - 如果你讓A-Z0-9之間的情況下區分兩者的工作原理,因爲範圍是:

  • 65-90爲AZ
  • 48-57 0-9

,所以你不能拿一個公式沒有到花樣繁多

你應該嘗試,但它是從更多的數學在這裏(你可能會想要像ord c - ord 'A'的字母和26 + ord c - ord '0'的數字,使其在0-35範圍內首先。

相關問題