配列を与えて、次の未使用の番号を見つける方法は?
["10", "2", "3", "5", "6", "7"]
、返されるはずです"4"
["1", "2", "3"]
、返されるはず"4"
です。
高階関数を使用すると、一般に、明示的なループやアキュムレータ変数よりも簡潔で洗練されたソリューションになります。
require 'set'
used = ["1","2","3"].map(&:to_i).to_set
1.upto(Float::INFINITY).detect { |n| not used.include?(n) }
を使用するSet
と、「使用済み」の番号が非常に多い場合でも、このソリューションをすばやく実行できます。「使用済み」の数値が多くなることがないことがわかっている場合は、使用済みの数値の配列をセットに変換することをスキップできます。#include?
配列でも機能します。
どうぞ:
def next_unused(ary)
sary = ary.collect(&:to_i).sort
i = 0
s = sary[0]
# puts "ary: #{sary.inspect}, s: #{s}"
while (i<sary.size && (s == sary[i])) do
# puts "s:#{s}, sary:#{sary[i]}"
s += 1
i += 1
end
s.to_s
end
もしかしてこう?
a = ["10", "2", "3", "5", "6", "7"]
actual = a.map(&:to_i)
full = ((actual.min)..(actual.max)).to_a
p (full - actual).first
#=> 4
a = ["1", "2", "3"]
p a.map(&:to_i).max + 1
#=> 4