coinstar 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c923abca4a6c6ebbeda994207e7d434ef4d6aa88
4
+ data.tar.gz: 278cb9b36c1754c9920ee814f138293f871c8a31
5
+ SHA512:
6
+ metadata.gz: 62aeffd92460d5de744bb425ead3ec05d11f1e4b2a11c1a629b9449435898cdfe77544cc8feca735d9518512c21ec58f31ad2678060823909482a086f5f3d1d6
7
+ data.tar.gz: b697efe6eb2c0ca82858ab921db86243715c893e6030950324ba88addf1b5234af23b320cfae8939b50378771ca4bcb025f0ca7a217a436f3291d9ac4d93fdae
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/README.md ADDED
@@ -0,0 +1,55 @@
1
+ ![GA_Logo](https://raw.github.com/generalassembly/ga-ruby-on-rails-for-devs/master/images/ga.png)
2
+
3
+
4
+ ### Apprentice Code Challenge - "Change Machine"
5
+
6
+
7
+ ##### Objective
8
+
9
+ Create a program that makes change using U.S. currency denominations with as few coins as possible and can calculate a total given a set of currency denominations.
10
+
11
+
12
+ ##### Constraints
13
+
14
+ - Use Ruby as a language
15
+ - Adhere to object-oriented design principles
16
+ - Use a currency set of pennies, nickels, dimes, quarters
17
+ - The solution should exist as a public GitHub repository
18
+ - Make a github commit for each requirement
19
+
20
+ ##### Currency set
21
+
22
+ ```
23
+ pennie = 1 cents
24
+ nickel = 5 cents
25
+ dime = 10 cents
26
+ quarter = 25 cents
27
+ ```
28
+
29
+ ##### Requirements
30
+
31
+ Your program should provide for the following functionality:
32
+
33
+ - Make change from a given amount of cents and returns a currency set
34
+ - Make change for quantities up to 100 cents
35
+ - Make cents from a given amount of currency and returns as a total number of cents
36
+ - Take input from the command line
37
+
38
+
39
+ ##### Examples
40
+
41
+ ```
42
+ 3 cents = 3 pennies
43
+ 6 cents = 1 nickel, 1 penny
44
+ 14 cents = 1 dime, 4 pennies
45
+
46
+ 2 dimes, 3 pennies = 23 cents
47
+ 3 pennies = 3 cents
48
+ ```
49
+
50
+
51
+ ##### Areas we evaluate
52
+
53
+ - Simplicity/elegance of design (be prepared to discuss)
54
+ - Maintainability (clean, code that is easy to understand and change)
55
+ - Testing (We encourage RSpec)
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task default: :spec
data/bin/coinstar ADDED
@@ -0,0 +1,3 @@
1
+ require 'coinstar'
2
+
3
+ pass_arguments
data/coinstar.gemspec ADDED
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'coinstar'
7
+ spec.version = '0.0.1'
8
+ spec.authors = ['Brooks Swinnerton']
9
+ spec.email = ['bswinnerton@gmail.com']
10
+ spec.description = %q{GA Apprentice Code Challenge}
11
+ spec.summary = %q{A gem to generate the correct value of currency in coins and vice versa}
12
+ spec.homepage = 'https://github.com/bswinnerton/coinstar'
13
+ spec.license = 'MIT'
14
+
15
+ spec.files = `git ls-files`.split($/)
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_development_dependency 'bundler', '~> 1.3'
21
+ spec.add_development_dependency 'rake'
22
+ spec.add_development_dependency 'pry'
23
+ spec.add_development_dependency 'rspec'
24
+ end
@@ -0,0 +1,43 @@
1
+ require 'active_support/inflector'
2
+
3
+ class ChangeMachine
4
+ CURRENCY = {penny: 1, nickel: 5, dime: 10, quarter: 25}
5
+
6
+ def self.make_change(cents)
7
+ raise 'You\'re going to need a bigger change machine' if cents > 100
8
+ calculated_change = sorted_currency.inject({}) do |change, (k,v)|
9
+ unless cents < v
10
+ divisible = cents / v
11
+ change[k] = divisible
12
+ cents = cents - (CURRENCY[k] * divisible)
13
+ end
14
+ change
15
+ end
16
+ pluralize(calculated_change)
17
+ end
18
+
19
+ def self.make_cents(currency)
20
+ currency.inject(0) do |cents, (k,v)|
21
+ cents += (CURRENCY[singularize(k)] * v)
22
+ cents
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def self.sorted_currency
29
+ Hash[CURRENCY.sort_by{|k, v| v}.reverse]
30
+ end
31
+
32
+ def self.pluralize(hash)
33
+ hash.inject({}) do |plural_hash, (k,v)|
34
+ plural_key = k.to_s.pluralize
35
+ plural_hash[plural_key.to_sym] = v
36
+ plural_hash
37
+ end
38
+ end
39
+
40
+ def self.singularize(symbol)
41
+ symbol.to_s.singularize.to_sym
42
+ end
43
+ end
data/lib/coinstar.rb ADDED
@@ -0,0 +1,17 @@
1
+ require 'coinstar/change_machine'
2
+
3
+ def pass_arguments
4
+ ARGV.each_slice(2) do |method, parameter|
5
+ sanitized_arg = method.gsub('--', '')
6
+ if sanitized_arg == 'make_change'
7
+ puts ChangeMachine.make_change(parameter.to_i)
8
+ elsif sanitized_arg == 'make_cents'
9
+ cents = ARGV.drop(1).inject({}) do |cents, arg|
10
+ cent = arg.split('=')
11
+ cents[cent[0].to_sym] = cent[1].to_i
12
+ cents
13
+ end
14
+ puts ChangeMachine.make_cents(cents)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,69 @@
1
+ require 'spec_helper'
2
+
3
+ describe ChangeMachine do
4
+ context 'Makes change from a given amount of cents and returns a currency set' do
5
+ it 'given 1' do
6
+ change = ChangeMachine.make_change(1)
7
+ expect(change).to eq( {pennies: 1} )
8
+ end
9
+
10
+ it 'given 16' do
11
+ change = ChangeMachine.make_change(16)
12
+ expect(change).to eq( {dimes: 1, nickels: 1, pennies: 1} )
13
+ end
14
+
15
+ it 'given 23' do
16
+ change = ChangeMachine.make_change(23)
17
+ expect(change).to eq( {dimes: 2, pennies: 3} )
18
+ end
19
+
20
+ it 'given 98' do
21
+ change = ChangeMachine.make_change(98)
22
+ expect(change).to eq( {quarters: 3, dimes: 2, pennies: 3} )
23
+ end
24
+ end
25
+
26
+ context 'Makes change for quantities up to 100 cents' do
27
+ it 'gracefully handles quanities larger than 100' do
28
+ expect { ChangeMachine.make_change(102) }.to raise_error
29
+ end
30
+ end
31
+
32
+ context 'Makes cents from a given amount of currency and returns as a total number of cents' do
33
+ it 'given 1 penny' do
34
+ currency = {pennies: 1}
35
+ cents = ChangeMachine.make_cents(currency)
36
+ expect(cents).to eq( 1 )
37
+ end
38
+
39
+ it 'given 2 dimes, 1 nickle, and 3 pennies' do
40
+ currency = {dimes: 2, nickels: 1, pennies: 3}
41
+ cents = ChangeMachine.make_cents(currency)
42
+ expect(cents).to eq( 28 )
43
+ end
44
+
45
+ it 'given 1 quarter, and 1 dime' do
46
+ currency = {quarters: 1, dimes: 1}
47
+ cents = ChangeMachine.make_cents(currency)
48
+ expect(cents).to eq( 35 )
49
+ end
50
+
51
+ it 'given 1 quarter, 2 dimes and 2 pennies' do
52
+ currency = {quarters: 1, dimes: 2, pennies: 2}
53
+ cents = ChangeMachine.make_cents(currency)
54
+ expect(cents).to eq( 47 )
55
+ end
56
+ end
57
+
58
+ context 'Takes input from the command line' do
59
+ it 'makes change' do
60
+ command_line = `ruby bin/coinstar --make_change 98`
61
+ expect(command_line).to include '{:quarters=>3, :dimes=>2, :pennies=>3}'
62
+ end
63
+
64
+ it 'makes cents' do
65
+ command_line = `ruby bin/coinstar --make_cents quarters=3 dimes=2 pennies=3`
66
+ expect(command_line).to include '98'
67
+ end
68
+ end
69
+ end
@@ -0,0 +1 @@
1
+ require 'change_machine'
metadata ADDED
@@ -0,0 +1,112 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: coinstar
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Brooks Swinnerton
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-01-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: GA Apprentice Code Challenge
70
+ email:
71
+ - bswinnerton@gmail.com
72
+ executables:
73
+ - coinstar
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - ".gitignore"
78
+ - README.md
79
+ - Rakefile
80
+ - bin/coinstar
81
+ - coinstar.gemspec
82
+ - lib/coinstar.rb
83
+ - lib/coinstar/change_machine.rb
84
+ - spec/change_machine_spec.rb
85
+ - spec/spec_helper.rb
86
+ homepage: https://github.com/bswinnerton/coinstar
87
+ licenses:
88
+ - MIT
89
+ metadata: {}
90
+ post_install_message:
91
+ rdoc_options: []
92
+ require_paths:
93
+ - lib
94
+ required_ruby_version: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ required_rubygems_version: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ requirements: []
105
+ rubyforge_project:
106
+ rubygems_version: 2.2.0
107
+ signing_key:
108
+ specification_version: 4
109
+ summary: A gem to generate the correct value of currency in coins and vice versa
110
+ test_files:
111
+ - spec/change_machine_spec.rb
112
+ - spec/spec_helper.rb