On Jan 25, 5:50 pm, Ruby Quiz <ja... / grayproductions.net> wrote:
>
> This week's Ruby Quiz is to complete a change making function with this
> skeleton:
>
>         def make_change(amount, coins = [25, 10, 5, 1])
>
>         end

Hi,

I've had some connectivity issues, so here is my a bit too late
solution to this:

#!/usr/bin/env ruby

def make_change(amount, coins = [25, 10, 5, 1])
  coins = coins.sort.reverse

#  p amount
#  p coins

  best_change = Array.new(amount + 1)
  0.upto(amount) do |n|
    best_change[n] = coins.map do |c|
      n - c < 0 \
      ? [] \
      : (best_change[n - c].empty? && n != c \
         ? [] \
         : [c] + best_change[n - c])
    end.delete_if{ |a| a.empty? } \
    .sort{ |a, b| a.size <=> b.size }[0] || []
  end

#  p best_change

  best_change[amount]
end

if __FILE__ == $0

  require 'test/unit'

  class TestMakeChange < Test::Unit::TestCase
    def setup
      @_1071_coins = [10, 7, 1]
      @ua_coins = [50, 25, 10, 5, 2, 1]
      @au_coins = [200, 100, 50, 20, 10, 5]
    end

    def test_zero
      assert_equal([], make_change(0))
    end

    def test_change_equal_to_one_coin
      assert_equal([10], make_change(10, @_1071_coins))
      assert_equal([7], make_change(7, @_1071_coins))
    end

    def test_two_middles
      assert_equal([7, 7], make_change(14, @_1071_coins))
    end

    def test_us
      assert_equal([25, 10, 1, 1, 1, 1], make_change(39))
      assert_equal([25, 25, 25, 25], make_change(100))
      assert_equal([25, 25, 25, 10, 10, 1, 1, 1, 1], make_change(99))
    end

    def test_ua
      assert_equal([2, 2], make_change(4, @ua_coins))
      assert_equal([25, 10, 2], make_change(37, @ua_coins))
      assert_equal([50, 25, 10, 10, 2, 2], make_change(99, @ua_coins))
    end

    def test_24_1082
      assert_equal([8, 8, 8], make_change(24, [10,8,2]))
    end

    def test_au
      assert_equal([], make_change(1, @au_coins))
      assert_equal([20, 10, 5], make_change(35, @au_coins))
    end

    def test_15_1053
      assert_equal([5, 3, 3, 3], make_change(14, [10, 5, 3]))
    end

    def test_x97
      assert_equal([99, 99, 99], make_change(297, [100, 99, 1]))
      assert_equal([100, 99, 99, 99], make_change(397, [100, 99, 1]))
      assert_equal([100, 100, 99, 99, 99], make_change(497, [100, 99,
1]))
    end

    def test_4563
      assert_equal([97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,
                    97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,
                    97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,
                    97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 89, 7, 5],
                   make_change(4563, [97, 89, 83, 79, 73, 71, 67, 61,
                                      59, 53, 47, 43, 41, 37, 31, 29,
                                      23, 19, 17, 13, 11, 7, 5, 3]))
    end

    def test_huge
#      assert_equal([], make_change(1_000_001))
    end
  end

end

Yep, I know it's ugly, but I hadn't much time to eliminate that
`best_change[0]' corner case...

Great Quiz anyway! :)

--
Cheers,
Alex