2017-02-08 25 views
-1

私はデコード機能を構築しようとしています。この関数は 'フレーズ'の文字と 'キー'の文字との間の距離を見つけ、距離には 'キー'の対応する文字が続くはずです。 'h'は 's'から11文字離れているため、関数を通る1回の反復で 's11'が返されるため、 'phrase' = 'hello'と 'key' = 'sam'ネストされたForループPython

なぜ私の 'decode_phrase'機能が機能していないのかという手がかりはありません。

def get_distance(letter1, letter2): 

    if letter1 < letter2: 
     x = (ord(letter2) - ord(letter1)) 
    elif letter1 == letter2: 
     x = 0 
    elif letter1 > letter2: 
     x = (ord(letter2) - ord(letter1)) + 26 
    return x 



def decode_phrase(phrase, key): 


    new_word = '' 
    i = 0 
    k = 0 

    for p in range(len(phrase)): 
     for q in range(len(key)): 
      y = get_distance(phrase[i], key[k]) 
      new_word = new_word + key[k] + str(y) 
      k = k +1 
      i = i +1 
    return new_word 

私は入力decode_phrase(「マイク」、「サム」)私は現在、範囲外の文字列インデックスを取得しています。しかし、コードに深刻な問題があると私は確信しています

+1

は、内のコードを配置し、コードの画像を投稿しないでくださいあなたの質問 – donkopotamus

+2

また、decode_phraseがうまくいかないかについて、さらに詳しい情報を提供してください。特定の入力が与えられたときに返される内容と、返される内容を示す例を提供します。 – Colin

+0

BTW 'get_distance'はかなり簡単にできます:' x = ord(letter2) - ord(letter1);のようなものです。 x <0:x + = 26ならば十分である。 – 9000

答えて

0

あなたが終わりになったらキーストリングを繰り返すことになっている場合は、フレーズにインデックスを生成するループが1つだけ必要です。あなたは、必要に応じて折り返し、キーに2番目のインデックスを取得するために%剰余演算子を使用することができます。phrasekeyが文字列である場合には、おそらく最も簡単な解決策である

def decode_phrase(phrase, key): 
    for i in range(len(phrase)): # use just one loop for the phrase index 
     j = i % len(key)   # take a mod to get a key index 
     y = get_distance(phrase[i], key[j]) 
     new_word += key[j] + str(y) 
    return new_word 

を。しかし、あなたは少し空想になりたいと思った場合、あなたが反復可能な任意の種類(インデックス可能なシーケンスだけではない)のために働くだろう版を作るためにitertools.cycleを使用することができます。

import itertools 

def decode_phrase(phrase, key): 
    for p, k in zip(phrase, itertools.cycle(key)): 
     new_word += k + str(get_distance(p, k)) 
    return new_word 
関連する問題