# frozen_string_literal: true # https://leetcode.com/problems/asteroid-collision/ # @param {Integer[]} asteroids # @return {Integer[]} def asteroid_collision(asteroids) stack = [] asteroids.each do |asteroid| stack << asteroid stack.drop_asteroid! while stack.has_collision? end stack end # Array extension class Array # @return {Integer} def drop_asteroid! return 2.times { pop } if self[-1].abs == self[-2].abs self[-1].abs > self[-2].abs ? self[-1] = pop : pop end # @return {Boolean} def has_collision? return false unless length >= 2 self[-2] > self[-1] && self[-1].positive? != self[-2].positive? end end