2013-07-14 3 views
-2

Обновление: На рубине Я пытаюсь удалить следующий элемент, если он меньше предыдущего.Удалить, если следующий элемент меньше

вход будет

a = [2,1,3,4,7,6,8] 

поэтому выход будет

a = [2,3,4,7,8] 

, очевидно, если ни один, если все последовательны не будет ни один элемент удален.

+3

Ваш вопрос утверждение неверно. Вы удалили цифры 1 и 6. Элементы после них больше, а не меньше. –

+0

Может быть, вы хотите удалить элемент _next_, если он меньше предыдущего? –

+0

yuri это право, позвольте мне обновить его – zetacu

ответ

2

Я хотел бы сделать это следующим образом:

a.each_index.map { |i| a[i] if i < 1 || a[i-1] < a[i] }.compact 
=> [2, 3, 4, 7, 8] 
+0

этот делает работу, tnx Юрий – zetacu

1
a.each_cons(2).reject{|x, y| x > y}.map(&:first) + [a.last] 
# => [1, 3, 4, 6, 8] 
+0

, он дает '[1, 3, 4, 6, 8]' для меня. но он хотел '[2,3,4,7,8]' –

+0

@YuriyGolobokov. Это дает мне такой же результат, как и для вас. Посмотрите на результат, который я написал. ОП противоречива. – sawa

+0

oops. да, вопрос не соответствует этому примеру. –

0

Отслеживайте, что такое предыдущее значение, и используйте select, чтобы отфильтровать значения, которые вы не хотите.

prev = - 1.0/0.0 #negative infinity 
a.select {|num| delete = (prev < num); prev = num; delete} 

На входе [2, 1, 3, 4, 7, 6, 8] это дает выход [2, 3, 4, 7, 8].

+0

если у вас есть массив, похожий на [1,2,3], он удаляет первый – zetacu

+0

Да, он отлично работает для меня. Похоже, что это должно вести себя плохо [1, 2, 3], так как -Infinity должно быть меньше всего. Может быть, это разница в версии Ruby? Я на 2.0.0, как насчет вас? –

+0

I'm on ruby ​​1.9 почему-то удаляет первый – zetacu

0
a = [2,1,3,4,7,6,8] 

prev = a[0] 
p a.chunk { |e| 
    prev, prev2 = e, prev 
    prev<prev2 
}.flat_map{|i,j| j unless i }.compact 
# >> [2, 3, 4, 7, 8] 

Update

Как @zetacu сказал:

, если у вас есть массив, как [1,2, 3] он удаляет первый

Нет, он не будет остановлен.

a = [1,2,3] 
prev = a[0] 
p a.chunk { |e| 
    prev, prev2 = e, prev 
    prev<prev2 
}.flat_map{|i,j| j unless i }.compact 
# >> [1, 2, 3] 
+0

если у вас есть массив вроде [1,2,3], он удаляет первый – zetacu

+0

@zetacu no dear! Запустите код, он работает как ожидалось. –

+0

mm my bab, возможно, я набираю что-то лишнее в консоли – zetacu

2
b = a.take(1) + a.each_cons(2).flat_map { |x, y| y >= x ? [y] : [] } 
#=> [2, 3, 4, 7, 8] 
+0

этот тоже работает – zetacu

Смежные вопросы