Учитывая массив только с нечетным числом
Если под этим вы подразумеваете, что в массиве всегда будет неравное количество истинных / ложных значений, то, во-первых, []
не является допустимым входным значением.
И вот решение:
def truthy?(array)
falsey, truthy = array.partition(&:!)
truthy.size > falsey.size
end
Вы можете пойти с oneliner, если вы предпочитаете:
def truthy?(array)
array.partition(&:!).max_by(&:size).any?
end
Spec:
truthy?([1,nil,nil]) #=> false
truthy?([1,nil,nil,nil,2]) #=> false
truthy?([1,4,nil]) #=> true
truthy?([1,nil,nil]) #=> false
truthy?([1,nil,Module,nil,2]) #=> true
truthy?([1,Class.new,nil]) #=> true
Используется
Если вы действительно намеревались рассчитывать только nil
с, а не ложные значения (как было указано в ОП):
def more_nils?(array)
array.partition(&:nil?).max_by(&:size).none?
end
Spec:
more_nils?([1,nil,nil]) #=> true
more_nils?([1,nil,nil,nil,2]) #=> true
more_nils?([1,4,nil]) #=> false
more_nils?([1,nil,nil]) #=> true
more_nils?([1,nil,Module,nil,2]) #=> false
more_nils?([1,Class.new,nil]) #=> false
Используется метод Object#nil?
.
Вдохновлен ответом @ pjs :
array.sum { |el| el.nil? ? -1 : 1 }.negative?
Еще проще (из комментария @ SagarPandya)
array.count(nil) > array.compact.count