From 05f1b86447d10ca96dd2b016648828e9541f183a Mon Sep 17 00:00:00 2001 From: Erik Thiem Date: Tue, 23 May 2017 12:42:22 -0400 Subject: [PATCH] Added my solution --- Gemfile | 4 +++ Gemfile.lock | 28 ++++++++++++++++ lib/frequency_map.rb | 51 ++++++++++++++++++++++++++++ run.rb | 5 +++ spec/frequency_map_spec.rb | 69 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 157 insertions(+) create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 lib/frequency_map.rb create mode 100644 run.rb create mode 100644 spec/frequency_map_spec.rb diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..093d8de --- /dev/null +++ b/Gemfile @@ -0,0 +1,4 @@ +source 'https://rubygems.org' +ruby '2.0.0' + +gem 'rspec', '~> 3.0.0.beta2' diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..cae4c66 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,28 @@ +GEM + remote: https://rubygems.org/ + specs: + diff-lcs (1.3) + rspec (3.0.0) + rspec-core (~> 3.0.0) + rspec-expectations (~> 3.0.0) + rspec-mocks (~> 3.0.0) + rspec-core (3.0.4) + rspec-support (~> 3.0.0) + rspec-expectations (3.0.4) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.0.0) + rspec-mocks (3.0.4) + rspec-support (~> 3.0.0) + rspec-support (3.0.4) + +PLATFORMS + ruby + +DEPENDENCIES + rspec (~> 3.0.0.beta2) + +RUBY VERSION + ruby 2.0.0p648 + +BUNDLED WITH + 1.14.6 diff --git a/lib/frequency_map.rb b/lib/frequency_map.rb new file mode 100644 index 0000000..03788a0 --- /dev/null +++ b/lib/frequency_map.rb @@ -0,0 +1,51 @@ +class FrequencyMap + + attr_reader :text + attr_reader :sorted + + def initialize(text) + @text = text + @frequencies = Hash.new(0) + end + + def getFrequencies() + @frequencies = Hash.new(0) + words = @text.split(" ") + + words.each do |word| + + # Remove special chars and convert to lowercase + word = word.downcase.gsub(/[^0-9a-z ]/i, '') + + if @frequencies.keys.include? word + @frequencies[word] += 1 + else + @frequencies[word] = 1 + end + + end + + @frequencies + end + + def sortFrequencies + self.getFrequencies + + @sorted = @frequencies.sort_by { |key, value| value}.reverse + end + + def printFrequencies + self.getFrequencies + self.sortFrequencies + + @sorted.each do |pair| + word = pair[0] + freq = pair[1] + + p "#{freq} - #{word}" + + end + + + end +end diff --git a/run.rb b/run.rb new file mode 100644 index 0000000..93be519 --- /dev/null +++ b/run.rb @@ -0,0 +1,5 @@ +require_relative 'lib/frequency_map' + +text = File.open("speech.txt").read +frequencyMap = FrequencyMap.new(text) +frequencyMap.printFrequencies diff --git a/spec/frequency_map_spec.rb b/spec/frequency_map_spec.rb new file mode 100644 index 0000000..0087a36 --- /dev/null +++ b/spec/frequency_map_spec.rb @@ -0,0 +1,69 @@ +require 'rspec' +require 'frequency_map' + +describe FrequencyMap do + + it 'should be a Class' do + expect(described_class.is_a? Class).to be true + end + + it 'should return its set text' do + set_text = "test" + frequencyMap = FrequencyMap.new(set_text) + expect(frequencyMap.text).to eq set_text + end + + it 'should return a hash of type string->int when computing frequencies' do + set_text = "dog dog cat mouse mouse mouse" + frequencyMap = FrequencyMap.new(set_text) + frequencies = frequencyMap.getFrequencies() + + expect(frequencies.is_a? Hash).to be true + expect(frequencies.keys).to all( be_a(String)) + expect(frequencies.values).to all( be_a(Integer)) + end + + it 'should return correct frequencies for a normal case' do + set_text = "dog dog cat mouse mouse mouse" + frequencyMap = FrequencyMap.new(set_text) + frequencies = frequencyMap.getFrequencies() + + expect(frequencies["dog"]).to eq 2 + expect(frequencies["cat"]).to eq 1 + expect(frequencies["mouse"]).to eq 3 + expect(frequencies["lion"]).to eq 0 + end + + it 'should return no frequencies for an empty case' do + set_text = "" + frequencyMap = FrequencyMap.new(set_text) + frequencies = frequencyMap.getFrequencies() + + expect(frequencies.size).to eq 0 + end + + it 'should sort frequencies for a normal case' do + set_text = "dog dog cat mouse mouse mouse" + frequencyMap = FrequencyMap.new(set_text) + frequencyMap.sortFrequencies + + expect(frequencyMap.sorted[0]).to eq ["mouse", 3] + expect(frequencyMap.sorted[1]).to eq ["dog", 2] + expect(frequencyMap.sorted[2]).to eq ["cat", 1] + end + + it 'should return an empty array for an empty case' do + set_text = "" + frequencyMap = FrequencyMap.new(set_text) + frequencyMap.sortFrequencies + + expect(frequencyMap.sorted).to be_empty + end + + it 'should print sorted frequencies for a normal case' do + set_text = "dog dog cat mouse mouse mouse" + frequencyMap = FrequencyMap.new(set_text) + expect(frequencyMap.printFrequencies()).to output("Hello!").to_stdout + end + +end