calcAlphaPos :: Char -> Int
calcAlphaPos a 
    | (a `elem` ['a'..'z']) = ord(a) - ord('a')
    | (a `elem` ['A'..'Z']) = ord(a) - ord('A') 
    | otherwise = 0

calcOffset :: String -> Int -> Int
calcOffset word pos = calcAlphaPos (word !! (pos `mod` (length word)))
          
encodex :: Int -> Char -> Char
encodex offset ch
    | (ch `elem` ['a'..'z']) = chr ((((ord ch - ord ('a')) + offset + 26) `mod` 26) + ord('a'))
    | (ch `elem` ['A'..'Z']) = chr ((((ord ch - ord ('A')) + offset + 26) `mod` 26) + ord('A'))
    | otherwise = ch

encode :: String -> String -> Int -> String
encode _ [] _ = "...End of message"
encode [] _ _ = "Invalid decoder word!"
encode word (x:xs) y
    | (word !! wordpos) `elem` ['a'..'z'] = [encodex (calcOffset word y) x] ++ encode word xs (y+1)
    | (word !! wordpos) `elem` ['A'..'Z'] = [encodex (calcOffset word y) x] ++ encode word xs (y+1)
    | otherwise = [x] ++ encode word xs y
     where wordpos = y `mod` length word
   
  1. सांकेतिक शब्दों में बदलना "सहयोगी" "सुबह पर मिलो" 0

    should produce MPPR AE OYWY but produces MPPR LE DLHL
    
    note "ALLY" provides offset of 0, 11, 11, 24
    MEET =                 [12,  4,  4, 19]
    MPPR =                 [12, 15, 15, 17] <-- 43 - 26 = 17
    

मैं हैकेल सीख रहा हूं और यह पता लगाने की कोशिश कर रहा हूं कि वेजीनियर सिफर के संबंध में मैं क्या गलत कर रहा हूं। जब मैं संदेश में रिक्त स्थान का उपयोग नहीं करता हूं तो सिफर काम करता है लेकिन मुझे यह पता नहीं लग सकता है कि रिक्त स्थान शामिल होने पर इसे कैसे काम करना है।

1
Philip Stephens 27 जिंदा 2021, 02:21

2 जवाब

सबसे बढ़िया उत्तर

यह शर्मनाक है लेकिन मैंने जो गलत किया वह यह है कि मैंने संदेश में प्रत्येक वर्ण की जांच करने के बजाय यह देखने के लिए कुंजी में प्रत्येक अक्षर की जांच की है कि इसमें कोई विशेष वर्ण है या नहीं। मैंने इसके साथ एन्कोड को बदल दिया:

encode :: String -> String -> Int -> String
encode _ [] _ = "...End of message"
encode [] _ _ = "Invalid decoder word!"
encode word (x:xs) y
    | x `elem` ['a'..'z'] = [encodex (calcOffset word y) x] ++ encode word xs (y+1)
    | x `elem` ['A'..'Z'] = [encodex (calcOffset word y) x] ++ encode word xs (y+1)
    | otherwise = [x] ++ encode word xs y
    where wordpos = y `mod` length word
1
Philip Stephens 27 जिंदा 2021, 06:42

जैसा कि आपने देखा है, आपकी समस्या यह है कि आपका कोड रिक्त स्थान के लिए जिम्मेदार नहीं है। आप कुछ ऐसा चाहते हैं:

       [key] ALLY AL LYAL
 [plaintext] MEET AT DAWN
[ciphertext] MPPR AE OYWY

लेकिन इसके बजाय, आपका कोड यह कर रहा है:

       [key] ALLYALLYALLY
 [plaintext] MEET AT DAWN
[ciphertext] MPPR LE DLHL

इसे ठीक करने के लिए, सबसे आसान तरीका शायद एन्कोडिंग करते समय रिक्त स्थान छोड़ना है: यदि वर्तमान वर्ण एक स्थान है, तो इसे अनदेखा करें और अगले वर्ण पर जाएं, अन्यथा वर्तमान वर्ण को सामान्य रूप से एन्कोड करें।

-1
bradrn 27 जिंदा 2021, 03:18