Skip to content

Instantly share code, notes, and snippets.

@JoshCheek
Last active August 29, 2015 14:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JoshCheek/cbe697e7801469fffdf3 to your computer and use it in GitHub Desktop.
Save JoshCheek/cbe697e7801469fffdf3 to your computer and use it in GitHub Desktop.
# https://github.com/turingschool/challenges/blob/d7f7d3e726ce95667ed3f1e1996de2895efadc7c/sorted_merging.markdown
# I accidentally closed the window I wrote the solution in,
# so I couldn't find it, but I rewrote it. I shortened the names,
# so that I could get some of the ideas downt o one line.
# Also, thought of a way cooler way to implement our `smallest` method :)
def smallest(one, two)
[one, two].min_by(&:first)
end
def merge(one, two)
sorted = []
sorted << smallest(one, two).shift while one.any? && two.any?
sorted << one.shift while one.any?
sorted << two.shift while two.any?
sorted
end
merge([], []) # => []
merge([], [1]) # => [1]
merge([1], []) # => [1]
merge([1,2], []) # => [1, 2]
merge([], [1,2]) # => [1, 2]
merge([1], [2]) # => [1, 2]
merge([2], [1]) # => [1, 2]
merge([1,3], [2]) # => [1, 2, 3]
merge([2], [1,3]) # => [1, 2, 3]
merge([1,2,3], [4]) # => [1, 2, 3, 4]
merge([4], [1,2,3]) # => [1, 2, 3, 4]
# Someone had asked about solving it with recursion,
# so here is a solution using recursion :)
def smallest(one, two)
[one, two].min_by(&:first)
end
def recursive_merge(one, two)
return two if one.empty?
return one if two.empty?
[smallest(one, two).shift, *recursive_merge(one, two)]
end
recursive_merge([], []) # => []
recursive_merge([], [1]) # => [1]
recursive_merge([1], []) # => [1]
recursive_merge([1,2], []) # => [1, 2]
recursive_merge([], [1,2]) # => [1, 2]
recursive_merge([1], [2]) # => [1, 2]
recursive_merge([2], [1]) # => [1, 2]
recursive_merge([1,3], [2]) # => [1, 2, 3]
recursive_merge([2], [1,3]) # => [1, 2, 3]
recursive_merge([1,2,3], [4]) # => [1, 2, 3, 4]
recursive_merge([4], [1,2,3]) # => [1, 2, 3, 4]
def recursive_merge2(*arrays)
arrays.reject! &:empty?
arrays.empty? ? [] : [arrays.min_by(&:first).shift, *recursive_merge2(*arrays)]
end
recursive_merge2([], []) # => []
recursive_merge2([], [1]) # => [1]
recursive_merge2([1], []) # => [1]
recursive_merge2([1,2], []) # => [1, 2]
recursive_merge2([], [1,2]) # => [1, 2]
recursive_merge2([1], [2]) # => [1, 2]
recursive_merge2([2], [1]) # => [1, 2]
recursive_merge2([1,3], [2]) # => [1, 2, 3]
recursive_merge2([2], [1,3]) # => [1, 2, 3]
recursive_merge2([1,2,3], [4]) # => [1, 2, 3, 4]
recursive_merge2([4], [1,2,3]) # => [1, 2, 3, 4]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment