我要解決的任務:
撰寫一個接受字串的程式,將執行轉換并回傳它。對于引數字串的每個字母,按字母順序將其切換為下一個。“z”變成“a”,“Z”變成“A”。案件不受影響。
def rotone(param_1)
a = ""
param_1.each_char do |x|
if x.count("a-zA-Z") > 0
a << x.succ
else
a << x
end
end
a
end
我拿這個:
Input: "AkjhZ zLKIJz , 23y "
Expected Return Value: "BlkiA aMLJKa , 23z "
Return Value: "BlkiAA aaMLJKaa , 23z "
當迭代器找到 'z' 或 'Z' 時,它會增加兩倍 z -> aa 或 Z -> AA
uj5u.com熱心網友回復:
您的問題是String#succ(又名String#next'z' )的設計方式在接收者為或時無法滿足您的目的'Z':
'z'.succ #=> 'aa'
'Z'.succ #=> 'AA'
如果你替換a << x.succ成a << x.succ[0]你會得到想要的結果。
您可以考慮如下撰寫。
def rotone(param_1)
param_1.gsub(/./m) { |c| c.match?(/[a-z]/i) ? c.succ[0] : c }
end
String#gsub的引數是一個匹配每個字符的正則運算式(因此每個字符都被傳遞到gsub's 塊)1。
另請參見String#match? . 正則運算式匹配作為字符類/[a-z]/i中字符之一的每個字符。該選項使匹配大小寫無關,因此也匹配大寫字母。 [a-z]i
這是撰寫使用兩個定義為常量的哈希的方法的替代方法。
CODE = [*'a'..'z', *'A'..'Z'].each_with_object({}) do |c,h|
h[c] = c.succ[0]
end.tap { |h| h.default_proc = proc { |_h,k| k } }
#=> {"a"=>"b", "b"=>"c",..., "y"=>"z", "z"=>"a",
# "A"=>"B", "B"=>"C",..., "Y"=>"Z", "Z"=>"A"}
DECODE = CODE.invert.tap { |h| h.default_proc = proc { |_h,k| k } }
#=> {"b"=>"a", "c"=>"b", ..., "z"=>"y", "a"=>"z",
# "B"=>"A", "C"=>"B", ..., "Z"=>"Y", "A"=>"Z"}
例如,
CODE['e'] #=> "f"
CODE['Z'] #=> "A"
CODE['?'] #=> "?"
DECODE['f'] #=> "e"
DECODE['A'] #=> "Z"
DECODE['?'] #=> "?"
讓我們嘗試使用gsub,CODE和DECODE一個示例字串。
str = "The quick brown dog Zelda jumped over the lazy fox Arnie"
rts = str.gsub(/./m, CODE)
#=> "Uif rvjdl cspxo eph Afmeb kvnqfe pwfs uif mbaz gpy Bsojf"
rts.gsub(/./m, DECODE)
#=> "The quick brown dog Zelda jumped over the lazy fox Arnie"
請參閱Hash#merge、Object#tap、Hash#default_proc=、Hash#invert和將散列作為可選第二個引數的Sting#gsub形式。
將默認 proc添加到哈希h會導致h[k]回傳kifh沒有 key k。CODE已在沒有默認 proc 的情況下定義,
CODE = [*'a'..'z', *'A'..'Z'].each_with_object({}) { |c,h| h[c] = c.succ[0] }
#=> {"a"=>"b", "b"=>"c",..., "y"=>"z", "z"=>"a",
# "A"=>"B", "B"=>"C",..., "Y"=>"Z", "Z"=>"A"}
gsub會跳過不是字母的字符:
rts = str.gsub(/./m, CODE)
#=> "UifrvjdlcspxoephAfmebkvnqfepwfsuifmbazgpyBsojf"
如果沒有默認的程序,我們將不得不寫
rts = str.gsub(/./m) { |s| CODE.fetch(s, s) }
#=> "Uif rvjdl cspxo eph Afmeb kvnqfe pwfs uif mbaz gpy Bsojf"
請參閱Hash#fetch。
1. 正則運算式/./匹配除行終止符以外的所有字符。添加選項m( /./m).也會導致匹配行終止符。
uj5u.com熱心網友回復:
input = "AkjhZ zLKIJz , 23y"
代碼
p input.tr('a-yA-YzZ','b-zB-ZaA')
輸出
"BlkiA aMLJKa , 23z"
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/481962.html
標籤:红宝石 功能 ruby-on-rails-3 每个 字母
上一篇:請幫我找出我錯過了什么案例
