2017-01-28 10 views
0

私はまだHaskellで新しいです。そのような関数を書くつもりです。暗号の入力パラメータは整数のリストではなく、整数のリストです。最初の文字は、最初の整数をパラメータとして使用し、2番目の文字を2番目の整数などで使用して暗号化されます。整数を使い果たした場合は、最初から使用します。整数のリストを持つシーザーの暗号

これは私がこれまでに得たものである:あなたの助けのための

import Data.Char 

--encode is for encoding one character with one interger 
encode :: Int -> String -> String 
encode shift msg = 
    let ords = map ord msg 
     shifted = map (+ shift) ords 
    in map chr shifted 

-- this is the troubling part, I try to use head to send the first element of string and the first element of intgers' list 
cipher :: [Int] -> String -> String 
cipher x str = 
    let splitedstr= (head str) 
     splitedint= (head x) -- parse error on input splitedint 
    in encode splitedint splitedstr ++ cipher x str 

感謝。

+0

エンコードして、 'String'の代わりに' Char'を使うべきではありませんか? –

+1

質問はないので、私は投票に参加しませんでした。エラーは表示されません。 –

+1

最初の文の途中にある大文字の "The"は、代入の開始と同様に疑わしいように見えます。 – Jubobs

答えて

1

問題文に基づいて、私はencodeの機能自体がで、Stringでは機能していないと思います。あなたは、単に文字列を構築するためにzipWithcycleを使用することができます

encode :: Int -> Char -> Char 
encode shift = chr . (+ shift) . ord 

次:

cipher :: [Int] -> String -> String 
cipher shifts = zipWith encode $ cycle shifts 

これらを実装する場合、私が取得:ghci

*Main> cipher [1,2,4] "HelloWorld" 
"Igpmq[ptpe" 

をあなたはこのようにこれを適応させることができます。

あなたは再帰を自分で書きたい場合は次のように、あなたがこれを行うことができます:

cipher :: [Int] -> String -> String 
cipher shifts = cipher2 shifts shifts 

cipher2 :: [Int] -> [Int] -> String -> String 
cipher2 _ _  []  = [] 
cipher2 s []  ts  = cipher2 s s ts 
cipher2 s (x:xs) (t:ts) = (encode x t):cipher2 s xs ts 

あなたは、このようにcipher2cipherを渡し、cipher2がある最初の引数を持っていますシフトの全シーケンス(シフトを使い果たすときに再スタートできるように)さらに、文字列の終わりに達した場合、空のリスト(文字列)を返します。それ以外の場合は、文字列とシフトリストの両方のヘッダーにencodeとコールし、末尾にはを再帰的に呼び出します。

最後に、意味上の問題があります。たとえば、encode機能にzを指定することは可能です。それをシフトすると、英数字の範囲外になります。その場合は、おそらくモジュロを使うべきです。

+1

Thansk @willem。あなたは華麗です。私は初めからチャーを使用できるという事実を忘れてしまった。 –

+0

私は理解していないsthがあります。エンコードと暗号は2つのパラメータを取る必要がありますが、コードでは1つのパラメータのみを扱います! @ウィレム –

+0

これは、 'f x y = g x y'をhaskellで' f x = g x'と書き換えることができるからです。このように、パラメータを暗黙的に左と右の両方に追加することで、話すことができます。 –

関連する問題