3

对 Ruby 来说是全新的。这是一个简单的家庭作业。secret_code 函数需要接受输入字符串并执行以下操作:

  1. 在空格前的第一个字母块中,除第一个字符之外的所有字母都大写
  2. 反转字符串

因此,如果输入是“超级骗子”,则输出应该是“repud REPUs”。

我将函数编码如下:

def secret_code(input) 
  input.split(" ").first[1..-1].each_char do |i|
    input[i] = i.upcase
  end
  return input.reverse
end

它通过了单元测试,但我想知道是否有更好的编码方法。是否可以避免使用循环?我试过

return input.split(" ").first[1..-1].upcase.reverse

但这并不完全奏效。任何关于如何清理它的想法都值得赞赏!

4

5 回答 5

8
"super duper".sub(/(?<=.)\S+/, &:upcase).reverse
于 2013-04-07T17:58:37.760 回答
3

这个怎么样:

def secret_code(input)
  first_space = input.index(' ')
  (input[0] + input[1...first_space].upcase + input[first_space..-1]).reverse
end

请注意,在 Ruby 中,始终返回方法中的最后一个表达式评估,因此您可以省略 final return

于 2013-04-07T17:57:48.493 回答
1
s = "super duper"

words = s.split(' ')
words.first[1..-1] = words.first[1..-1].upcase
words.each { |word| word.reverse! }
s = words.reverse.join(' ')
puts s # => repud REPUs
于 2013-04-07T18:00:34.410 回答
1

不一定更好,但可以肯定的是,它可以在没有循环的情况下完成......

def f x
  (b = [(a = x.split)[0].upcase, *a.drop(1)].join(' ').reverse)[-1] = x[0, 1]
  return b
end
于 2013-04-07T18:16:53.563 回答
1

您可以尝试以下方法:

a = "super duper"
p a.gsub(a.split[0...1].join(' '),a.split[0...1].join(' ').capitalize.swapcase).reverse

输出:

"repud REPUs"
于 2013-04-08T07:34:01.893 回答