>

Haskell에서 vigenére 암호를 성공적으로 구현했지만 공백도 이동하고 있습니다. 문자 만 소문자로 바꾸려면 어떻게해야합니까?

예를 들어, "abc"를 키로 사용하여 "hello rita"를 암호화하고 싶다고 가정하겠습니다. "hfnlp rjva"대신 "hfnlpprjva"를 인쇄하고 있습니다.

기본 방법은 다음과 같습니다.

vigenere_encrypt :: String -> String -> String
vigenere_encrypt key plaintext = ints2text n
  where n = map (`mod` 26) (zipWith (+)  keyCycle intPlainText)
        keyCycle = (cycle(text2ints key))
        intPlainText = text2ints plaintext

보조 기능은 다음과 같습니다.

--lowercase letter to int conversion
let2int :: Char -> Int
let2int c = ord c - ord 'a'
--int to lowercase letter conversion
int2let :: Int -> Char
int2let n = chr(ord 'a' + n)
text2ints :: String -> [Int]
text2ints xs = map (let2int) xs
ints2text :: [Int] -> String
ints2text xs = map (int2let) xs

어떤 제안?


  • 답변 # 1

    아래 스크립트는 예상 결과를 산출합니다 :

    import Data.Char (ord, chr)
    --lowercase letter to int conversion
    let2int :: Char -> Int
    let2int c = ord c - ord 'a'
    --int to lowercase letter conversion
    int2let :: Int -> Char
    int2let n = chr(ord 'a' + n)
    text2ints :: String -> [Int]
    text2ints xs = map (let2int) xs
    ints2text :: [Int] -> String
    ints2text xs = map (int2let) xs
    vigenere_encrypt :: String -> String -> String
    vigenere_encrypt key plaintext = zipWith merge plaintext (ints2text n)
      where n = map (`mod` 26) (zipWith (+)  keyCycle intPlainText)
            keyCycle = (cycle(text2ints key))
            intPlainText = text2ints plaintext
            merge a b = case a of
              ' ' -> ' '
              otherwise -> b
    main = do
      print $ vigenere_encrypt "abc" "hello rita"
    
    
    참고 : 코드는 공백을 건너 뛰지 않고 덮어 씁니다 ... 실제로 말하면 공백의 수가 암호화 된 문자열에 영향을 미칩니다. 그렇지 않으면 프로그램이 약간 더 복잡해집니다.

  • 이전 r - 변수 모드와 클래스를 변환하는 함수 작성
  • 다음 ios - swift 4에서 iTunes API를 구문 분석하는 방법은 무엇입니까?