job_interview 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,11 @@
1
+ module JobInterview
2
+ module HelloWorld
3
+
4
+
5
+ def hello_world
6
+ "Hello, World!"
7
+ end
8
+
9
+ end
10
+
11
+ end
@@ -1,7 +1,67 @@
1
1
  module JobInterview
2
2
  module Knapsack
3
- def knapsack(coll)
4
-
3
+
4
+ # Given a set of items, each with a weight and a value, determines
5
+ # the maximum profit you can have while keeping the overall weight
6
+ # smaller than the capacity of the knapsack.
7
+ #
8
+ # @param items [Array<Array>] An array of pairs (weight, profit) representing the items
9
+ # @param capacity [Integer] The capacity of the knapsack
10
+ # @param algorithm [:memoize, :dynamic] The algorithm used to solve this, defaults to :dynamic
11
+ #
12
+ def knapsack(items, capacity, algorithm = :dynamic)
13
+ if algorithm == :memoize
14
+ knapsack_memoize(items, capacity)
15
+ elsif algorithm == :dynamic
16
+ knapsack_dynamic_programming(items, capacity)
17
+ end
5
18
  end
19
+
20
+ private
21
+
22
+ def knapsack_memoize(items, capacity)
23
+ cache = Array.new(items.length + 1) { [0] }
24
+ cache[0] = Array.new(capacity + 1, 0)
25
+ knapsack_memoize_recursive(items, capacity, items.length, cache)
26
+ end
27
+
28
+ def knapsack_dynamic_programming(items, capacity)
29
+ cache = Array.new(items.length + 1) { [0] }
30
+ cache[0] = Array.new(capacity + 1, 0)
31
+
32
+ (0..capacity).each do |remaining_weight|
33
+ items.each_with_index do |item, index|
34
+ weight, profit = item
35
+ cache[index + 1][remaining_weight] = if weight <= remaining_weight then
36
+ [
37
+ profit + cache[index][remaining_weight - weight], # Take item
38
+ cache[index][remaining_weight] # Don't take item
39
+ ].max
40
+ else
41
+ cache[index][remaining_weight] # Don't take item
42
+ end
43
+ end
44
+ end
45
+
46
+ cache[items.length][capacity]
47
+ end
48
+
49
+ def knapsack_memoize_recursive(items, capacity, position, cache)
50
+ return cache[position][capacity] if cache[position][capacity]
51
+
52
+ weight, profit = items[position - 1]
53
+
54
+ cache[position][capacity] = if weight <= capacity then
55
+ [
56
+ profit + kmr(items, capacity - weight, position - 1, cache), # Take item
57
+ kmr(items, capacity, position - 1, cache) # Don't take item
58
+ ].max
59
+ else
60
+ kmr(items, capacity, position - 1, cache) # Don't take item
61
+ end
62
+
63
+ cache[position][capacity]
64
+ end
65
+ alias_method :kmr, :knapsack_memoize_recursive
6
66
  end
7
- end
67
+ end
@@ -18,7 +18,7 @@ module JobInterview
18
18
  "seeking to",
19
19
  "leaving because I can't" ,
20
20
  "leaving because I have to",
21
- "not happy with the oppertunities I have to"
21
+ "not happy with the opportunities I have to"
22
22
  ].sample + " " +
23
23
  Faker::Company.bs + "."
24
24
  end
@@ -73,7 +73,8 @@ module JobInterview
73
73
  [
74
74
  "If it does, we can kiss encryption goodbye.",
75
75
  "With our current models of computation, answering that question remains infeasible.",
76
- "I doubt it, but it would make life easier for traveling salesmen."
76
+ "I doubt it, but it would make life easier for traveling salesmen.",
77
+ "Sure! P = 0 or N = 1!"
77
78
  ].sample
78
79
  end
79
80
 
@@ -1,7 +1,8 @@
1
1
  module JobInterview
2
2
  module Quine
3
3
 
4
- def quine(file)
4
+ def quine(file = nil)
5
+ file ||= caller.first.split(':').first
5
6
  return File.read(file)
6
7
  end
7
8
 
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ module KnapsackSpec
4
+
5
+ describe "When called" do
6
+ before(:each) do
7
+ @answer = JobInterview::Answer.new
8
+ @items = [
9
+ [4, 3],
10
+ [1, 2],
11
+ [12, 20],
12
+ [6, 4]
13
+ ]
14
+ end
15
+
16
+ cases = [
17
+ [0, 0],
18
+ [1, 2],
19
+ [2, 2],
20
+ [3, 2],
21
+ [4, 3],
22
+ [5, 5],
23
+ [6, 5],
24
+ [7, 6],
25
+ [8, 6],
26
+ [9, 6],
27
+ [10, 7],
28
+ [11, 9],
29
+ [12, 20],
30
+ [100, 29]
31
+ ]
32
+
33
+ cases.each do |capacity, profit|
34
+ it "should return #{profit} in memoize mode with capacity #{capacity}" do
35
+ @answer.knapsack(@items, capacity, :memoize).should == profit
36
+ end
37
+
38
+ it "should return #{profit} in dynamic programming mode with capacity #{capacity}" do
39
+ @answer.knapsack(@items, capacity, :dynamic).should == profit
40
+ end
41
+ end
42
+ end
43
+ end
data/spec/quine_spec.rb CHANGED
@@ -9,6 +9,10 @@ module QuineSpec
9
9
  it "should return the source of the calling file" do
10
10
  @answer.quine(__FILE__).should == File.read(__FILE__)
11
11
  end
12
+
13
+ it "should find the calling file if not given" do
14
+ @answer.quine.should == File.read(__FILE__)
15
+ end
12
16
  end
13
17
 
14
18
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: job_interview
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-05-01 00:00:00.000000000 Z
13
+ date: 2013-03-18 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: faker
17
- requirement: &2160569960 !ruby/object:Gem::Requirement
17
+ requirement: !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ~>
@@ -22,10 +22,15 @@ dependencies:
22
22
  version: 0.9.5
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *2160569960
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ~>
29
+ - !ruby/object:Gem::Version
30
+ version: 0.9.5
26
31
  - !ruby/object:Gem::Dependency
27
32
  name: rspec
28
- requirement: &2160569320 !ruby/object:Gem::Requirement
33
+ requirement: !ruby/object:Gem::Requirement
29
34
  none: false
30
35
  requirements:
31
36
  - - ~>
@@ -33,23 +38,33 @@ dependencies:
33
38
  version: 2.9.0
34
39
  type: :development
35
40
  prerelease: false
36
- version_requirements: *2160569320
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ~>
45
+ - !ruby/object:Gem::Version
46
+ version: 2.9.0
37
47
  - !ruby/object:Gem::Dependency
38
48
  name: rake
39
- requirement: &2160568840 !ruby/object:Gem::Requirement
49
+ requirement: !ruby/object:Gem::Requirement
40
50
  none: false
41
51
  requirements:
42
52
  - - ~>
43
53
  - !ruby/object:Gem::Version
44
- version: 0.9.2
54
+ version: 10.0.3
45
55
  type: :development
46
56
  prerelease: false
47
- version_requirements: *2160568840
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ~>
61
+ - !ruby/object:Gem::Version
62
+ version: 10.0.3
48
63
  description: Programmer job interview answers, packaged for your convenience. Fibonacci,
49
64
  FizzBuzz, and more! A project from BohConf 2012.
50
65
  email:
51
66
  - github@mgates.com
52
- - canweriotnow@gmail.com
67
+ - jason@decomplecting.org
53
68
  executables: []
54
69
  extensions: []
55
70
  extra_rdoc_files: []
@@ -59,16 +74,18 @@ files:
59
74
  - lib/job_interview/fizz_buzz.rb
60
75
  - lib/job_interview/knapsack.rb
61
76
  - lib/job_interview/answer.rb
77
+ - lib/job_interview/hello_world.rb
62
78
  - lib/job_interview/questions.rb
63
79
  - lib/job_interview/primes.rb
64
80
  - lib/job_interview/quine.rb
65
81
  - spec/fibonacci_spec.rb
66
82
  - spec/fizz_buzz_spec.rb
67
83
  - spec/hello_world_spec.rb
84
+ - spec/knapsack_spec.rb
68
85
  - spec/primes_spec.rb
69
86
  - spec/questions_spec.rb
70
87
  - spec/quine_spec.rb
71
- homepage: https://github.com/ruby-jokes/job_interview
88
+ homepage: https://ruby-jokes.github.com/job_interview
72
89
  licenses:
73
90
  - GPLv3
74
91
  post_install_message:
@@ -89,7 +106,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
89
106
  version: '0'
90
107
  requirements: []
91
108
  rubyforge_project:
92
- rubygems_version: 1.8.10
109
+ rubygems_version: 1.8.24
93
110
  signing_key:
94
111
  specification_version: 3
95
112
  summary: Programmer job interview answers, packaged for your convenience
@@ -97,6 +114,7 @@ test_files:
97
114
  - spec/fibonacci_spec.rb
98
115
  - spec/fizz_buzz_spec.rb
99
116
  - spec/hello_world_spec.rb
117
+ - spec/knapsack_spec.rb
100
118
  - spec/primes_spec.rb
101
119
  - spec/questions_spec.rb
102
120
  - spec/quine_spec.rb