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 +7 -0
- data/.gitignore +17 -0
- data/README.md +55 -0
- data/Rakefile +6 -0
- data/bin/coinstar +3 -0
- data/coinstar.gemspec +24 -0
- data/lib/coinstar/change_machine.rb +43 -0
- data/lib/coinstar.rb +17 -0
- data/spec/change_machine_spec.rb +69 -0
- data/spec/spec_helper.rb +1 -0
- metadata +112 -0
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
data/README.md
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+

|
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
data/bin/coinstar
ADDED
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
|
data/spec/spec_helper.rb
ADDED
@@ -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
|