2016-09-13 7 views
0

ある関数を使ってすべての偶数文字を変換し、別の関数を使ってすべての奇数を変換したい。したがって、各文字はa〜zに対応する0〜25を表すので、a、c、e、g、i、k、m、o、q、s、u、w、yは偶数文字です。偶数と奇数の文字を追加する方法python

しかし、私の偶数文字だけが正しく変換されています。各chが「偶数」として扱われることを意味しているので、それは0から始まり、0のまま -

def encrypt(plain): 
    charCount = 0 
    answer=[] 
    for ch in plain: 
     if charCount%2==0: 
      answer.append(pycipher.Affine(7,6).encipher(ch)) 
     else: 
      answer.append(pycipher.Affine(3,0).encipher(ch)) 
    return ''.join(answer) 
+0

_even letters_とはどういう意味ですか?単語がPython文字列として見なされるときに偶数インデックスに対応する単語の文字? –

+0

各文字はazに対応する0〜25を表しますので、a、c、e、g、i、k、m、o、q、s、u、w、yは偶数文字です – user6754289

+0

質問を編集し、その中のコメントに記載されています。 –

答えて

0

これは私の2セントです。 @mgilsonが提案していることは、もちろん、あなたが(コメントの中で)指定した方法ではなく動作します。それを書いた後、あなたの頭の中であなたのコードをデバッグしようとしています。forループを通り、1-2の反復を実行して、変数があなたが意図した値を取るかどうかを確認してください。 charCountは値に決して再割り当てされません。あなたがord('a') = 97なく0ので、奇数の代わりに、ので、それは...

def encrypt(plain): 
    alphabet = 'abcdefghijklmnopqrwstuvwxyz' 
    answer = '' 
    for letter in plain: 
     try: 
      if alphabet.index(letter.lower()) % 2 == 0: 
       answer += pycipher.Affine(7, 6).encipher(letter) 
      else: 
       answer += pycipher.Affine(3, 0).encipher(letter) 
     except: 
      answer += letter 
    return answer 

my_text = 'Your question was not very clear OP' 
encripted_text = encrypt(my_text) 

また、私もord(ch)を使用していないだろうしたい方法で、それは常に0です。そして、はいcharCount += 1は、それが変更になるだろうが、ない

4

あなたのループ内でcharCountを変更することはありません。

あなたのアップデートに基づいて、実際には文字が奇数かそれとも英語のアルファベットの「インデックス」に基づいているかどうかを確認する必要があります。文字を数値にマッピングすることは、ここで役立ちます。あなたはそれを自分で構築することができ:

alphabet = 'abcde...' # string.ascii_lowercase? 
mapping = {k: i for i, k in enumerate(alphabet)} 

ORは、我々は組み込みordord('a')が奇数結果を生成することを気付いて使用することができ、ord('b')が偶数である、など

def encrypt(plain): 
    answer=[] 
    for ch in plain: 
     if ord(ch) % 2 == 1: # 'a', 'c', 'e', ... 
      answer.append(pycipher.Affine(7,6).encipher(ch)) 
     else: # 'b', 'd', 'f', ... 
      answer.append(pycipher.Affine(3,0).encipher(ch)) 
    return ''.join(answer) 
+0

charCount = charCount + 1を実行してみましたが、それでも私に間違った結果が出ました。 – user6754289

+0

これは、OPが望むようにアルファベットではなく、変換されている文字列の文字列に基づいて文字列を変換します。 –

+0

@ Ev.Kounis - 私が答えた時点でOPはそれを指定していませんでした。 – mgilson

0

でも手紙のあなたの概念ので、は、アルファベットの文字の位置に基づいています。このようにord()を使用できます。

if ord(ch)%2==0: 

ord('a')ord('A')は両方とも奇数であるため、aelseになります。反対の場合は、条件を否定してください:

if ord(ch)%2!=0: 
+0

ですが、 'abc ...'の 'a'には偶数インデックス番号(0)があります。 –

+0

真実、私はちょうど両方の方法を入れます.... – trincot

1

あなたの基本的なアプローチは、あなたがそれを見るたびに文字を再暗号化することです。暗号化する可能性のある文字は26文字しかないため、それらを事前暗号化しておき、プレーンテキストの各文字をルックアップするだけの価値があります。それをしながら、あなたはあなたが偶数と奇数の間で交替していることを知っているので、各文字の位置を計算する必要はありません。

import string 

def encrypt(plain): 
    # True == 1, False == 0 
    fs = [pycipher.Affine(3,0).encipher, 
      pycipher.Affine(7,6).encipher] 
    is_even = True # assuming "a" is even; otherwise, just set this to False 
    d = dict() 
    for ch in string.ascii_lowercase: 
     f = fs[is_even] 
     d[ch] = f(ch) 
     is_even = not is_even 

    return ''.join([d[ch] for ch in plain]) 

また、あなたのために交代を簡素化するためにitertools.cycleを使用することができます。

def encrypt(plain): 
    # again, assuming a is even. If not, reverse this list 
    fs = itertools.cycle([pycipher.Affine(3,0).encipher, 
          pycipher.Affine(7,6).encipher]) 
    d = dict((ch, f(ch)) for f, ch in zip(fs, string.ascii_lowercase)) 
    return ''.join([d[ch] for ch in plain]) 
+0

偶数または奇数は、アルファベットの文字の位置を指し、暗号化される文字列ではありません..したがって、 'aaaaaaaaaaaa'のすべての文字は_ "even" _ –

+0

ええ、私は現在、全回答を取り直しています。 – chepner

+0

暗号アルゴリズムが計算上重くなることによって、この回答の質は非常に良好で鮮明です。 forループ内の 'd [p]'は 'd [ch]'でなければなりません。 –

関連する問題