几周前我刚开始学习Ruby,所以我为成为一个完整的菜鸟而道歉。我正在写一个简单的程序,它会根据数字的总和找到最大的电话号码输入。以下是我到目前为止的情况:
print 'Enter phone numbers'
phone_numbers = (gets.chomp)
phone_array = phone_numbers.split(",")
values = Hash.new(0)
phone_array.each { |x| values[x] += x.delete('-').to_s.split('').map(&:to_i).inject(:+)}
values.each { |k, v| puts k if v == values.values.max }
我的问题是:如果最大值相等,我如何让红宝石给我一个与特定最大值相对应的电话号码?我希望打破平局策略是遇到的最后一个最大值。例如,如果我输入111-111-1112,111-111-1121,我希望输出为111-111-1121。
答案 0 :(得分:1)
由于您只需要一个电话号码(最大值),break
找到一个电话号码:
max_value = values.values.max #store the max value to prevent computing it multiple times
values.each { |k, v| puts k; break if v == max_value }
# ^^^^^
答案 1 :(得分:0)
phone_array.max_by { |phone_number| phone_number.scan(/\d/).map(&:to_i).reduce(:+) }
将返回最大数字总和的电话号码。
如果有领带,则应退回第一项。
答案 2 :(得分:0)
此解决方案返回一个数组,其中包含最大数字总和以及所有电话号码的数组,其数字总和等于最大值(按照它们在字符串中出现的顺序):
str = " 111-111-1112, 111-111-1111,111-111-1121"
str.gsub(/\s/,'').
split(/\s*,\s*/).
each_with_object(Hash.new { |h,k| h[k]=[] }) do |s,h|
h[s.each_char.reduce(0) { |t,c| t+c.to_i }] << s
end.
max_by(&:last)
#=> [11, ["111-111-1112", "111-111-1121"]]
请注意'-'.to_i #=> 0
。