删除每一个元素,直到一个留下红宝石

时间:2014-10-25 22:02:49

标签: ruby

我试图删除每个第二个元素,直到只剩下一个。 所以它从1跳过,删除,跳过,删除等开始。

到目前为止,我有类似的东西

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

这有几个问题。 而且每个实际上只是选择每个第二个而不是删除每个第二个元素。 最终结果应为5.

我看起来不一定是最漂亮的解决方案,而是最容易和最简单的解决方案。

感谢您的帮助

2 个答案:

答案 0 :(得分:3)

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

旋转,我想因为我不确定它是如何实现的,所以会减慢速度。虽然,我宁愿为这个问题创建一个双循环链表,因为这是着名的Flavius Josephus problem的一个特例。

HTH

编辑:@MarkThomas建议的单行

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

答案 1 :(得分:0)

我可能会选择:

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