は、私はそれについて移動したい方法は次のとおりです。
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"
gsub
それは本当に簡単に使用する正規表現に応じて、単語、ストリング、個々の文字をマッピングすることができます。私はRegexp.union
パターンを構築できますが、それはまた、されている可能性が:
CHAR_RE = /[#{CHAR_MAP.keys.join}]/
# => /[aeioubcdfghjklmnpqrstvwxyz]/
か:
CHAR_RE = /[#{(VOWELS + CONSONANTS).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"
この問題tr
のためにも、それを行うだろうが、個々の文字を変換する/変更するときにのみ適用できます。それは正規表現を使用する能力が欠けているので、高速ですが柔軟性に欠けます。
[Array#cycle](http://ruby-doc.org/core-2.2.0/Array.html#method-i-cycle)を利用することができます。たとえば、a = ['a'、 'e'、 'i'、 'o'、 'u']の場合サイクル#=>#<列挙子:["a"、 "e"、 "i" 、 "o"、 "u"]:cycle> '、' a.next#=> "a"; a.next#=> "e"; a.next#=> "i"; a.next#=> "o"; a.next#=> "u"; a.next#=> "a"; a.next#=> "e" ' –