2016-02-18 2 views
-1

Возможно ли избежать возиться с повторяющимися элементами массива, когда вы возитесь с первым?Как предотвратить повторение повторяющихся элементов массива?

Рассмотрим следующий пример:

def rot13(str) 
    alphabet = ("a".."z").to_a 
    letters = str.split("").each{|x| x.downcase! } 

    letters.map! do |let| 
     alphabet[(alphabet.index(let) + 13) % alphabet.length] 
    end 

    #werd = letters.join("") 
    letters.map.with_index do |char,index| 
     str.each_char.with_index do |c,idx| 
      if str[idx].upcase! == nil 
       letters.at(idx).upcase! 
      end 
     end 
    end 
    #werd 

    letters 
end 

rot13("ANdrea") 

Это просто Ceaser Cypher фиксируется на 13 букв старше. Прямо до тех пор, пока мы не ударим по дубликату "a" s, который после кода запускается в дубликат "n". Как и здесь, петли upcase! замыкают в letters все, что было на этих индексах в исходной строке, и мне нужны только те индексы, которые будут капитализированы. Как это изолировать?

ответ

0

Другим способом вы могли бы сделать это

def input(str) 
    alphabet = ("a".."z").to_a 

    str.chars.map do |let| 
    next let unless alphabet.include?(let.downcase) 
    ceaser_letter = alphabet[(alphabet.index(let.downcase) + 13) % alphabet.length] 
    let == let.upcase ? ceaser_letter.upcase : ceaser_letter.downcase 
    end 
end 

input('ANdrea') 
=> ["N", "A", "q", "e", "r", "n"] 
0

Ваш вопрос был немного неясным. Это мое решение из того, что я получил от него.

def rot13(str) 
    alphabet = ("a".."z").to_a 
    cap_alphabet = ("A".."Z").to_a 
    letters = str.split("") 

    letters.map! do |letter| 
    if alphabet.include?(letter) 
     # Change these for different scambling 
     alphabet[(alphabet.index(letter) + 13) % alphabet.length] 
    else 
     cap_alphabet[(cap_alphabet.index(letter) + 13) % alphabet.length] 
    end 
    end 
end 

p rot13("Andrea") 

Это вернет [ "N", "A", "д", "е", "г", "п"]

0

Для этого частности проблемы, то гораздо проще будет делать трюк:

def rot13(str) 
    str.chars.map do |c| 
    next c unless c =~ /[A-z]/ 
    ((c.ord % 32 + 13) % 26 + c.ord/32 * 32).chr 
    end.join 
end 

rot13("It's PJSCopeland!") 
#=> "Vg'f CWFPbcrynaq!" 
Смежные вопросы