Skip to content

Instantly share code, notes, and snippets.

@cat-in-136
Created May 12, 2015 14:57
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 cat-in-136/f4fa4cb88603bfc79571 to your computer and use it in GitHub Desktop.
Save cat-in-136/f4fa4cb88603bfc79571 to your computer and use it in GitHub Desktop.
My answer to "Five programming problems every Software Engineer should be able to solve in less than 1 hour"
require 'minitest/autorun'
def sum_for_loop(list)
sum = 0
for item in list
sum = sum + item
end
sum
end
def sum_while_loop(list)
sum = 0
i = 0
while (i < list.length)
sum = sum + list[i]
i = i + 1
end
sum
end
def sum_recursion(list)
if list.length == 1
list[0]
else
list[0] + sum_recursion(list.slice(1, list.length - 1))
end
end
class TC_Problem1 < MiniTest::Test
def test_sum_for_loop()
assert_equal([1, 3, 5, 9].inject(:+), sum_for_loop([1, 3, 5, 9]))
end
def test_sum_while_loop()
assert_equal([1, 3, 5, 9].inject(:+), sum_while_loop([1, 3, 5, 9]))
end
def test_sum_recursion()
assert_equal([1, 3, 5, 9].inject(:+), sum_recursion([1, 3, 5, 9]))
end
end
require 'minitest/autorun'
def combine_alternatingly(list1, list2)
a = list1.dup
b = list2.dup
out = []
while (a.length > 0) || (b.length > 0)
out << a.shift if a.length > 0
out << b.shift if b.length > 0
end
out
end
class TC_Problem2 < MiniTest::Test
def test_combine_alternatingly()
assert_equal([:a, 1, :b, 2, :c, 3], combine_alternatingly([:a, :b, :c], [1, 2, 3]))
end
end
require 'minitest/autorun'
def fibo(length=100)
array = [0, 1]
i = 2
while i < length
array[i] = array[i - 1] + array[i - 2]
i = i + 1
end
array
end
class TC_Problem3 < MiniTest::Test
def test_fibo()
assert_equal([0, 1, 1, 2, 3, 5, 8, 13, 21, 34], fibo(10))
fibo100 = fibo()
assert_equal(100, fibo100.length)
assert_equal(fibo100[98] + fibo100[97], fibo100[99])
end
end
require 'minitest/autorun'
def arrange_largest_num(list)
nums = list.dup
max_nums_array = [nums.shift]
while nums.length > 0
n = nums.shift
max_nums_array = (0..(max_nums_array.length)).map { |i|
[max_nums_array.slice(0, i), n, max_nums_array.slice(i, max_nums_array.length - i)].flatten
}.max { |a,b|
a.join('').to_i <=> b.join('').to_i
}
end
max_nums_array.join('').to_i
end
class TC_Problem4 < MiniTest::Test
def test_arrange_largest_num()
assert_equal(95021, arrange_largest_num([50, 2, 1, 9]))
# pointed by Kevin Tran
assert_equal(42423420, arrange_largest_num([420, 42, 423]))
end
end
def all_poss_100()
(0..(3**8-1)).map { |v|
s = v.to_s(3)
s = '0' * (8 - s.length) + s
}.map { |v|
s = ''
(0..(8-1)).each do |i|
s << (i + 1).to_s
s << '+' if v[i] == '0'
s << '-' if v[i] == '1'
s << '' if v[i] == '2'
end
s << '9'
s
}.select { |v|
eval(v) == 100
}
end
def print_all_poss_100()
$stdout << all_poss_100.join("\n") << "\n"
end
print_all_poss_100
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment