2017-08-11 1 views
0

Ich versuche herauszufinden, warum meine Ruby-Entschlüsselungsmethode scheint nur für bestimmte Buchstaben des Alphabets zu brechen.Problem mit Ruby-Entschlüsselungsmethode

Das Ziel der Methode ist, eine Eingabezeichenfolge ("new_str") zu nehmen und sie zu entschlüsseln, indem JEDER Buchstabe in der Zeichenfolge mit seinem Vorgänger im Alphabet neu geschrieben wird. dh "bcd" sollte "abc" zurückgeben ...

Ich könnte mich irren, aber es scheint für die Buchstaben aj zu funktionieren, aber dann bricht für die Buchstaben kz ... für den letzten Satz scheint es entweder ein zurückzukehren "a" "b" oder "z" unabhängig vom Buchstaben: z entschlüsseln („klmnopqrstuvwxyz“) kehrt: „azazazazazbzbzbz“

Eine Beobachtung ist, dass in dem definierten Alphabet variable Zeichenfolge, die Indexzahlen zweistellig werden bei dem k-Buchstaben beginnen (Index 10) ... so vielleicht etwas, das zu werfen aus in der Formel? Wie auch immer, jede Hilfe/Vorschläge geschätzt!

def decrypt(new_str) 
    alphabet = "abcdefghijklmnopqrstuvwxyz" 
    index = 0 
    while index < new_str.length 
    new_str[index] = alphabet.index(new_str[index]) 
    new_str[index] = alphabet[new_str[index] - 1] 
    index +=1 
    end 
    puts new_str 
end   

Antwort

0

Der Code sollte wie:

def decrypt(new_str) 
    alphabet = 'abcdefghijklmnopqrstuvwxyz' 
    index = 0 
    while index < new_str.length 
    letter_index = alphabet.index(new_str[index]) 
    new_str[index] = alphabet[letter_index - 1] 
    index += 1 
    end 
    puts new_str 
end 

decrypt('klmnopqrstuvwxyz') #=> jklmnopqrstuvwxy 
decrypt('abcdefghij')  #=> zabcdefghi 
decrypt('noah')    #=> mnzg 

in Ihrem Code Sie, indem Sie new_str[index] = alphabet.index(new_str[index]) in der fünften Zeile einen Brief durch eine ganze Zahl Schalt wurden.

PS .: Dies ist ein Caesar Cypher-Code, den Sie implementieren. Wenn Sie daran interessiert sind, einen Ruby-Weg zu implementieren, überprüfen Sie diese link here.

0

Substitutionsziffern sind leicht mit tr zu erreichen.

def decrypt(str) 
    alphabet = 'abcdefghijklmnopqrstuvwxyz' 
    replacement = alphabet.split('').rotate(-1).join 
    str.tr(alphabet,replacement) 
end 

decrypt('klmnopqrstuvwxyz') #=> jklmnopqrstuvwxy 
decrypt('abcdefghij')  #=> zabcdefghi 
decrypt('noah')    #=> mnzg