Arrays 如何循环到数组中的下一个值,但仅限于特定值

Arrays 如何循环到数组中的下一个值,但仅限于特定值,arrays,ruby,Arrays,Ruby,我想用一个词,例如“Mathew”,把它变成“Nevjix”(但它应该适用于任何单词)。元音循环到下一个元音,辅音循环到下一个辅音 我为元音和辅音创建了两个数组,代码通过显示单词“元音”或“辅音”来正确识别哪个是哪个 我想我需要添加一些东西,比如下一步到if语句,但我真的不确定 以下是我所拥有的: p "Input Agent Name" name = gets.chomp name = "#{name}".chars array1 = ['a', 'e', 'i', 'o', 'u'] a

我想用一个词,例如“Mathew”,把它变成“Nevjix”(但它应该适用于任何单词)。元音循环到下一个元音,辅音循环到下一个辅音

我为元音和辅音创建了两个数组,代码通过显示单词“元音”或“辅音”来正确识别哪个是哪个

我想我需要添加一些东西,比如
下一步
if
语句,但我真的不确定

以下是我所拥有的:

p "Input Agent Name"
name = gets.chomp

name = "#{name}".chars

array1 = ['a', 'e', 'i', 'o', 'u']
array2 = ['b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z']

p name


value = -1


until value == name.length
    value = value+1
    if array1.include? name[value]
        p "vowel"
    elsif array2.include? name[value]
        p "consonant"
    end
end


p name

您应该使用从原始字母到重新映射字母的单一映射。并使用
map
迭代输入字符串:

lookup = { 'a' => 'e', 'b' => 'c', 'c' => 'd', ..... }
name.chars.map! {|c| lookup[c]}

您应该使用从原始字母到重新映射字母的单一映射。并使用
map
迭代输入字符串:

lookup = { 'a' => 'e', 'b' => 'c', 'c' => 'd', ..... }
name.chars.map! {|c| lookup[c]}

你可以通过认识到“辅音”是。。。“不是一个元音。”(你实际上不需要维护两个不同的列表…)第二个
elsif
是不必要的,因为,“如果它不是“一”,那么它必须是“另一个”。

你可能可以通过认识到“一个辅音”是。。。“不是一个元音。”(实际上不需要维护两个不同的列表…)第二个
elsif
是不必要的,因为“如果它不是“一”,它必须是“另一个”。

可以用来实现这一点。我不确定是否要保留大小写(在这种情况下,您可以扩展两组字符串或添加一些逻辑)

或者,为了保留大小写,您可以这样写

puts 'Input Agent Name'
name = gets.chomp.chars

def transform_character(char)
  char.tr('bcdfghjklmnpqrstvwxyzaeiou', 'cdfghjklmnpqrstvwxyzbeioua')
end

name.map! do |char|
  if char == char.upcase
    transform_character(char.downcase).upcase
  else
    transform_character(char)
  end
end

puts name.join
为了清晰起见,我选择使用简单的if/else,而不是(下面的)选项

name.map! do |char|
  char == char.upcase ? transform_character(char.downcase).upcase : transform_character(char)
end
可以用来实现这一目标。我不确定是否要保留大小写(在这种情况下,您可以扩展两组字符串或添加一些逻辑)

或者,为了保留大小写,您可以这样写

puts 'Input Agent Name'
name = gets.chomp.chars

def transform_character(char)
  char.tr('bcdfghjklmnpqrstvwxyzaeiou', 'cdfghjklmnpqrstvwxyzbeioua')
end

name.map! do |char|
  if char == char.upcase
    transform_character(char.downcase).upcase
  else
    transform_character(char)
  end
end

puts name.join
为了清晰起见,我选择使用简单的if/else,而不是(下面的)选项

name.map! do |char|
  char == char.upcase ? transform_character(char.downcase).upcase : transform_character(char)
end

以下是我的做法:

VOWELS = %w[a e i o u]
CONSONANTS = ('a' .. 'z').to_a - VOWELS
# => ["b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z"]

CHAR_MAP = ((VOWELS + CONSONANTS).zip(VOWELS.rotate + CONSONANTS.rotate)).to_h
# => {"a"=>"e", "e"=>"i", "i"=>"o", "o"=>"u", "u"=>"a", "b"=>"c", "c"=>"d", "d"=>"f", "f"=>"g", "g"=>"h", "h"=>"j", "j"=>"k", "k"=>"l", "l"=>"m", "m"=>"n", "n"=>"p", "p"=>"q", "q"=>"r", "r"=>"s", "s"=>"t", "t"=>"v", "v"=>"w", "w"=>"x", "x"=>"y", "y"=>"z", "z"=>"b"}

CHAR_RE = Regexp.union(CHAR_MAP.keys)
# => /a|e|i|o|u|b|c|d|f|g|h|j|k|l|m|n|p|q|r|s|t|v|w|x|y|z/

'matthew'.gsub(CHAR_RE, CHAR_MAP) # => "nevvjix"
使映射单词、子字符串和单个字符变得非常容易,具体取决于所使用的正则表达式。我让他构建模式,但也可能是:

CHAR_RE = /[#{CHAR_MAP.keys.join}]/
# => /[aeioubcdfghjklmnpqrstvwxyz]/
或:

或者,在这种特殊情况下更好:

CHAR_RE = /./
这将返回相同的结果

创建数组、映射和正则表达式需要很短的构建时间,所以我会将它们创建为常量,然后在所有代码中重用它们

要处理大写字符,请稍微调整它:

LC_VOWELS = %w[a e i o u]
LC_CONSONANTS = ('a' .. 'z').to_a - LC_VOWELS

UC_VOWELS, UC_CONSONANTS = [LC_VOWELS, LC_CONSONANTS].map{ |a| a.map(&:upcase) }

CHAR_MAP = (
  (LC_VOWELS + UC_VOWELS + LC_CONSONANTS + UC_CONSONANTS).zip(
    [
      LC_VOWELS,
      UC_VOWELS,
      LC_CONSONANTS,
      UC_CONSONANTS
    ].map(&:rotate).inject(:+)
  )
).to_h
# => {"a"=>"e", "e"=>"i", "i"=>"o", "o"=>"u", "u"=>"a", "A"=>"E", "E"=>"I", "I"=>"O", "O"=>"U", "U"=>"A", "b"=>"c", "c"=>"d", "d"=>"f", "f"=>"g", "g"=>"h", "h"=>"j", "j"=>"k", "k"=>"l", "l"=>"m", "m"=>"n", "n"=>"p", "p"=>"q", "q"=>"r", "r"=>"s", "s"=>"t", "t"=>"v", "v"=>"w", "w"=>"x", "x"=>"y", "y"=>"z", "z"=>"b", "B"=>"C", "C"=>"D", "D"=>"F", "F"=>"G", "G"=>"H", "H"=>"J", "J"=>"K", "K"=>"L", "L"=>"M", "M"=>"N", "N"=>"P", "P"=>"Q", "Q"=>"R", "R"=>"S", "S"=>"T", "T"=>"V", "V"=>"W", "W"=>"X", "X"=>"Y", "Y"=>"Z", "Z"=>"B"}

CHAR_RE = /./

'Matthew'.gsub(CHAR_RE, CHAR_MAP) # => "Nevvjix"

对于这个问题,也可以这样做,但它仅适用于更改/翻译单个字符。它缺乏使用正则表达式的能力,因此,虽然它速度更快,但灵活性较差。

以下是我的做法:

VOWELS = %w[a e i o u]
CONSONANTS = ('a' .. 'z').to_a - VOWELS
# => ["b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z"]

CHAR_MAP = ((VOWELS + CONSONANTS).zip(VOWELS.rotate + CONSONANTS.rotate)).to_h
# => {"a"=>"e", "e"=>"i", "i"=>"o", "o"=>"u", "u"=>"a", "b"=>"c", "c"=>"d", "d"=>"f", "f"=>"g", "g"=>"h", "h"=>"j", "j"=>"k", "k"=>"l", "l"=>"m", "m"=>"n", "n"=>"p", "p"=>"q", "q"=>"r", "r"=>"s", "s"=>"t", "t"=>"v", "v"=>"w", "w"=>"x", "x"=>"y", "y"=>"z", "z"=>"b"}

CHAR_RE = Regexp.union(CHAR_MAP.keys)
# => /a|e|i|o|u|b|c|d|f|g|h|j|k|l|m|n|p|q|r|s|t|v|w|x|y|z/

'matthew'.gsub(CHAR_RE, CHAR_MAP) # => "nevvjix"
使映射单词、子字符串和单个字符变得非常容易,具体取决于所使用的正则表达式。我让他构建模式,但也可能是:

CHAR_RE = /[#{CHAR_MAP.keys.join}]/
# => /[aeioubcdfghjklmnpqrstvwxyz]/
或:

或者,在这种特殊情况下更好:

CHAR_RE = /./
这将返回相同的结果

创建数组、映射和正则表达式需要很短的构建时间,所以我会将它们创建为常量,然后在所有代码中重用它们

要处理大写字符,请稍微调整它:

LC_VOWELS = %w[a e i o u]
LC_CONSONANTS = ('a' .. 'z').to_a - LC_VOWELS

UC_VOWELS, UC_CONSONANTS = [LC_VOWELS, LC_CONSONANTS].map{ |a| a.map(&:upcase) }

CHAR_MAP = (
  (LC_VOWELS + UC_VOWELS + LC_CONSONANTS + UC_CONSONANTS).zip(
    [
      LC_VOWELS,
      UC_VOWELS,
      LC_CONSONANTS,
      UC_CONSONANTS
    ].map(&:rotate).inject(:+)
  )
).to_h
# => {"a"=>"e", "e"=>"i", "i"=>"o", "o"=>"u", "u"=>"a", "A"=>"E", "E"=>"I", "I"=>"O", "O"=>"U", "U"=>"A", "b"=>"c", "c"=>"d", "d"=>"f", "f"=>"g", "g"=>"h", "h"=>"j", "j"=>"k", "k"=>"l", "l"=>"m", "m"=>"n", "n"=>"p", "p"=>"q", "q"=>"r", "r"=>"s", "s"=>"t", "t"=>"v", "v"=>"w", "w"=>"x", "x"=>"y", "y"=>"z", "z"=>"b", "B"=>"C", "C"=>"D", "D"=>"F", "F"=>"G", "G"=>"H", "H"=>"J", "J"=>"K", "K"=>"L", "L"=>"M", "M"=>"N", "N"=>"P", "P"=>"Q", "Q"=>"R", "R"=>"S", "S"=>"T", "T"=>"V", "V"=>"W", "W"=>"X", "X"=>"Y", "Y"=>"Z", "Z"=>"B"}

CHAR_RE = /./

'Matthew'.gsub(CHAR_RE, CHAR_MAP) # => "Nevvjix"

对于这个问题,也可以这样做,但它仅适用于更改/翻译单个字符。它缺乏使用正则表达式的能力,因此,虽然它速度更快,但灵活性较差。

恐怕我不太明白。我知道“查找”是将一个字母重新分配给下一个字母,但我不知道它去了哪里,或者应该替换什么。另外,ruby如何知道用新值替换名称字符串中的值?它似乎对我不起作用……你可能想运行它并检查结果。恐怕我不太明白。我知道“查找”是将一个字母重新分配给下一个字母,但我不知道它去了哪里,或者应该替换什么。另外,ruby如何知道用新值替换名称字符串中的值?它似乎对我不起作用…你可能想运行它并检查结果。你可能可以利用它。例如,如果
a=['a'、'e'、'i'、'o'、'u']循环#=>#
,则
a.next#=>“a”;a、 下一个#=>“e”;a、 下一个#=>“我”;a、 下一个#=>“o”;a、 下一个#=>“u”;a、 下一个#=>“a”;a、 下一步#=>“e”
。您可能能够利用这一优势。例如,如果
a=['a'、'e'、'i'、'o'、'u']循环#=>#
,则
a.next#=>“a”;a、 下一个#=>“e”;a、 下一个#=>“我”;a、 下一个#=>“o”;a、 下一个#=>“u”;a、 下一个#=>“a”;a、 下一步#=>“e”