1
我試圖寫一個凱撒密碼,但只有大寫字母數字。使用ord
或chr
使用整個ASCII表。如何做到這一點?如何使用ORD和CHR只有A到Z和0到9?
這是我到目前爲止有:
alphabet = ['A'..'Z'] ++ ['0'..'9']
c2I = ord c - ord 'A'
i2C = chr (n + ord 'A')
我試圖寫一個凱撒密碼,但只有大寫字母數字。使用ord
或chr
使用整個ASCII表。如何做到這一點?如何使用ORD和CHR只有A到Z和0到9?
這是我到目前爲止有:
alphabet = ['A'..'Z'] ++ ['0'..'9']
c2I = ord c - ord 'A'
i2C = chr (n + ord 'A')
的基本思想是利用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
之間的情況下區分兩者的工作原理,因爲範圍是:
,所以你不能拿一個公式沒有到花樣繁多
你應該嘗試,但它是從更多的數學在這裏(你可能會想要像ord c - ord 'A'
的字母和26 + ord c - ord '0'
的數字,使其在0-35
範圍內首先。