Как проверить, что только одно значение в массиве ненулевое? - PullRequest
3 голосов
/ 28 декабря 2010

Учитывая массив как: [0,1,1]

Как я могу элегантно проверить, что: Только один элемент имеет ненулевое значение, а остальные 0?

(Таким образом, вышеуказанный массив не пройдет проверку, пока этот массив пройдет: [1,0,0])

Ответы [ 3 ]

8 голосов
/ 28 декабря 2010
my_array.count(0) == my_array.length-1

Если важна скорость, для очень больших массивов, где вам может понадобиться возвратиться рано при обнаружении ненулевого второго, возможно:

def only_one_non_zero?( array )
  found_non_zero = false
  array.each do |val|
    if val!=0
      return false if found_non_zero
      found_non_zero = true
    end
  end
  found_non_zero
end
6 голосов
/ 28 декабря 2010

Выберите не более двух ненулевых элементов и проверьте, был ли доступен только один элемент.

>> [0,1,1].select {|x| !x.zero?}.take(2).size == 1
=> false
>> [0,1,0].select {|x| !x.zero?}.take(2).size == 1
=> true
>> [1,2,3].select {|x| !x.zero?}.take(2).size == 1
=> false

Прекрасно работает в Ruby 1.8.7, но обратите внимание, что select возвращает массив, поэтому он не "оптимально ленивый". Вот запись в блоге , показывающая, как создать некоторые ленивые перечислители в Ruby.

2 голосов
/ 28 декабря 2010

Спасибо за все ваши ответы!

Я тоже решил:

input_array = [0,0,0]
result = input_array - [0]
p result.size == 1 && result[0] == 1

Руби, я люблю тебя!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...