如何防止迭代重复的数组元素?
How to prevent iterating over duplicate array elements?
是否可以在处理第一个数组元素时避免处理重复的数组元素?
考虑以下因素:
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")
这只是一个固定在 13 个字母以上的 Ceaser Cypher。直截了当,直到我们命中重复的 "a"
s,在代码运行后变成重复的 "n"
s。就像这里一样,upcase!
循环将 letters
中原始字符串中那些索引处的所有内容都大写,我只需要将那些 indexes 大写。我如何隔离它?
你的问题有点不清楚。这是我从中得到的解决方案。
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")
这将 return ["N", "A", "q", "e", "r", "n"]
另一种方法
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"]
对于这个特殊的问题,简单得多的方法就可以解决问题:
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!"
是否可以在处理第一个数组元素时避免处理重复的数组元素?
考虑以下因素:
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")
这只是一个固定在 13 个字母以上的 Ceaser Cypher。直截了当,直到我们命中重复的 "a"
s,在代码运行后变成重复的 "n"
s。就像这里一样,upcase!
循环将 letters
中原始字符串中那些索引处的所有内容都大写,我只需要将那些 indexes 大写。我如何隔离它?
你的问题有点不清楚。这是我从中得到的解决方案。
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")
这将 return ["N", "A", "q", "e", "r", "n"]
另一种方法
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"]
对于这个特殊的问题,简单得多的方法就可以解决问题:
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!"