1

我有一个生成随机输出(字符串)的函数。

我需要调用该函数,直到获得 3 个不同的输出(字符串)。

通过调用函数生成具有 3 个唯一字符串的数组的最优雅方法是什么,如果在指定的尝试次数内未生成输出,则该函数可以调用多少次?

这是我目前拥有的:

output = []
limit_calls = 5
limit_calls.times do |i|
  str = generate_output_function
  output.push str
  break if output.uniq.size > 2
end

这可以美化/缩短到 1 行吗?我很确定红宝石.. :)

谢谢

4

2 回答 2

3

使用集合使它(有点)更容易:

require 'set'
output = Set.new
limit_calls = 5
call_count = 0
while output.size < 3 and call_count < limit_calls
  output << generate_output_function 
  call_count += 1
end
output

或使用数组

output = []
limit_calls = 5
while output.size < limit_calls and output.uniq.size < 3
  output << generate_output_function 
end
output.uniq

更新通话限制。似乎阵列版本获胜!谢谢伊恩!

还将考虑使用注入的版本。

更新 2 - 注入:

5.times.inject([]) { |a, el| a.uniq.size < 3 ? a << generate_output_function : a }

有你的oneliner。我不确定我是否喜欢它,因为它有点难以理解......

于 2012-07-24T08:43:46.293 回答
1

弗罗德里克的回答错过了 call_limit 要求。像这样的功能呢...

def unique_string_array(call_limit)
  output = []
  calls = 0
  until (output.size == 3 || calls == call_limit) do
    (output << generate_output_function).uniq! && calls+=1
  end
  output
end

它不是单行的,但它是可读的……使用此实现,您最终可能会得到小于 3 大小的数组。最重要的是,您有一个断言您想要的行为的测试!(为了彻底测试这一点,您必须取消对 generate_output_function 的调用)

于 2012-07-24T09:00:17.990 回答