2014-10-25 1 views
1

Я пытаюсь удалить каждый второй элемент, пока не останется только один. Итак, это начинается с 1 пропустить, удалить, пропустить, удалить и так далее.удалять каждый второй элемент до тех пор, пока он не останется рубином

до сих пор у меня было что-то вроде этого

l =* (1..10) 
until l.length == 1 
l = l.each_slice(2).map(&:first) 
puts l 
end 

Есть несколько проблем с этим. , и every_slice фактически просто выбирает каждый второй, а не удаляет каждый второй элемент. окончательный результат должен быть 5.

Я ищу не обязательно для самого красивого решения, но для самого простого и простейшего.

Я ценю вашу помощь

+0

Вы должны использовать строчные 'L' потому что капитализированных слов считаются константами в Ruby. Тогда строка внутри вашего цикла должна быть просто 'l = l.each_slice (2) .map (& first)', и это сработает, правильно? Не могли бы вы уточнить, что не работает и почему? –

+0

проблема в том, что она всегда начинается с начала, в то время как я предпочитаю, чтобы она продолжалась непрерывно. – Rika

ответ

3
l =* (1..10) 
until l.length == 1 
    l.rotate!(2).pop 
end 
puts "#{l}" 

вращение, я думаю, так как я не знаю, как он будет реализован, будет замедлять его. Хотя, я бы предпочел создать двустрочный связанный список для этой проблемы, потому что это особый случай знаменитого Flavius Josephus problem.

НТН

Edit: один лайнер, как предложил @MarkThomas

l =* (1..10) 
l.rotate!(2).pop until l.length.one? 
puts "#{l}" 
+0

Это выглядит хорошо. Harsh Gupta, не могли бы вы объяснить, как здесь работает ротация? Поэтому я знаю, что rotate pus первый элемент до конца, но вы написали rotate (2), чтобы положить последние два элемента в конец? Как ты придумал это. Кроме того, pop всегда удаляет последний элемент, поэтому вы в основном даете всегда второй номер, который нужно удалить в конце, это правильно? – Rika

+1

'rotate (2)' толкает первые 2 элемента от массива до конца. И да, вы правы в общей идее. –

+1

Это сделало бы приятный лаконичный лайнер: 'l.rotate! (2) .pop до l.length.one?' –

0

я бы, вероятно, пойти с:

l = *(1..10) 
l.delete_if.with_index { |_, i| i.even? } until l.one? 
+2

Просто проходите мимо и не знаете рубина ... но вы, вероятно, должны добавить объяснение ваш код к вашему ответу. – fho

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