From 3bcd33a2913159e1e8bc7eb39228f79242e4e4ed Mon Sep 17 00:00:00 2001 From: Anibel America Date: Mon, 13 Aug 2018 16:28:54 -0700 Subject: [PATCH 01/10] Implement wave 1 --- lib/adagrams.rb | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/lib/adagrams.rb b/lib/adagrams.rb index e69de29..f34bff2 100644 --- a/lib/adagrams.rb +++ b/lib/adagrams.rb @@ -0,0 +1,41 @@ +def draw_letters + letter_frequencies = + { + "A" => 9, + "B" => 2, + "C" => 2, + "D" => 4, + "E" => 12, + "F" => 2, + "G" => 3, + "H" => 2, + "I" => 9, + "J" => 1, + "K" => 1, + "L" => 4, + "M" => 2, + "N" => 6, + "O" => 8, + "P" => 2, + "Q" => 1, + "R" => 6, + "S" => 4, + "T" => 6, + "U" => 4, + "V" => 2, + "W" => 2, + "X" => 1, + "Y" => 2, + "Z" => 1, + } + + pool_of_letters = [] + letter_frequencies.each do |letter, freq| + freq.times do + pool_of_letters << letter + end + end + + return pool_of_letters.sample(10) + +end From 7516e359df7963322019f9c45576183594dcc3bc Mon Sep 17 00:00:00 2001 From: Anibel America Date: Mon, 13 Aug 2018 17:04:22 -0700 Subject: [PATCH 02/10] Implements wave 2 --- lib/adagrams.rb | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lib/adagrams.rb b/lib/adagrams.rb index f34bff2..d43419f 100644 --- a/lib/adagrams.rb +++ b/lib/adagrams.rb @@ -39,3 +39,15 @@ def draw_letters return pool_of_letters.sample(10) end + +def uses_available_letters?(input, letters_in_hand) + input_array = input.upcase.chars + input_array.each do |letter| + if letters_in_hand.include? letter + letters_in_hand.delete_at(letters_in_hand.index(letter)) + else + return false + end + end + return true +end From 20af9561a83e82be0ae7b6fd1132ddb5eb9cf9b5 Mon Sep 17 00:00:00 2001 From: Anibel America Date: Tue, 14 Aug 2018 15:03:57 -0700 Subject: [PATCH 03/10] Implements wave 3 --- lib/adagrams.rb | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/lib/adagrams.rb b/lib/adagrams.rb index d43419f..dd5a694 100644 --- a/lib/adagrams.rb +++ b/lib/adagrams.rb @@ -51,3 +51,36 @@ def uses_available_letters?(input, letters_in_hand) end return true end + +def score_word(word) + + score = 0 + + word.downcase.each_char do |letter| + + case letter + when "a", "e", "i", "o", "u", "l", "n", "r", "s", "t" + score += 1 + when "d", "g" + score += 2 + when "b", "c", "m", "p" + score += 3 + when "f", "h", "v", "w", "y" + score += 4 + when "k" + score += 5 + when "j", "x" + score += 8 + when "q", "z" + score += 10 + end + + end + + if word.length >= 7 + score += 8 + end + + return score + +end From 4faa8b4a3a80a17a8c3466167e6e8746af93f7d9 Mon Sep 17 00:00:00 2001 From: Anibel America Date: Tue, 14 Aug 2018 16:10:37 -0700 Subject: [PATCH 04/10] Implements wave 4 --- lib/adagrams.rb | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/lib/adagrams.rb b/lib/adagrams.rb index dd5a694..8b4409d 100644 --- a/lib/adagrams.rb +++ b/lib/adagrams.rb @@ -84,3 +84,47 @@ def score_word(word) return score end + +def highest_score_from(words) + + # best_score = 0 + # best_words = [] + + best_word = { + word: [], + score: 0 + } + + words.each do |word| + + score = score_word(word) + if score > best_word[:score] + best_word[:word].clear + best_word[:word] << word + best_word[:score] = score + end + + if score == best_word[:score] + best_word[:word] << word + end + + end + + # insert some tie-breaker code here + best_by_length = best_word[:word].min_by do |word| + word.length + end + + best_by_10 = best_word[:word].select do |word| + word.length == 10 + end + + if best_by_10.empty? + best_word[:word] = best_by_length + else + best_word[:word] = best_by_10[0] + end + + return best_word + +end From 846db04d9881f5a174e0794d454cd1c441f0ce9f Mon Sep 17 00:00:00 2001 From: Anibel America Date: Wed, 15 Aug 2018 15:30:28 -0700 Subject: [PATCH 05/10] refactors wave 1 through wave 4 code --- lib/adagrams.rb | 50 +++++++++++++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/lib/adagrams.rb b/lib/adagrams.rb index 8b4409d..e880356 100644 --- a/lib/adagrams.rb +++ b/lib/adagrams.rb @@ -1,3 +1,4 @@ +# returns an array of 10 letters def draw_letters letter_frequencies = { @@ -30,48 +31,59 @@ def draw_letters } pool_of_letters = [] + letter_frequencies.each do |letter, freq| + freq.times do pool_of_letters << letter end + end return pool_of_letters.sample(10) end +# boolean method that verifies if input is valid def uses_available_letters?(input, letters_in_hand) + input_array = input.upcase.chars + input_array.each do |letter| + if letters_in_hand.include? letter - letters_in_hand.delete_at(letters_in_hand.index(letter)) + index = letters_in_hand.index(letter) + letters_in_hand.delete_at(index) else return false end + end + return true end +# returns word score based on letter value and word length def score_word(word) score = 0 - word.downcase.each_char do |letter| + word.upcase.each_char do |letter| case letter - when "a", "e", "i", "o", "u", "l", "n", "r", "s", "t" + when "A", "E", "I", "O", "U", "L", "N", "R", "S", "T" score += 1 - when "d", "g" + when "D", "G" score += 2 - when "b", "c", "m", "p" + when "B", "C", "M", "P" score += 3 - when "f", "h", "v", "w", "y" + when "F", "H", "V", "W", "Y" score += 4 - when "k" + when "K" score += 5 - when "j", "x" + when "J", "X" score += 8 - when "q", "z" + when "Q", "Z" score += 10 end @@ -85,11 +97,10 @@ def score_word(word) end +# returns hash of highest scoring word and its score +# applies rules for breaking ties def highest_score_from(words) - # best_score = 0 - # best_words = [] - best_word = { word: [], score: 0 @@ -98,6 +109,7 @@ def highest_score_from(words) words.each do |word| score = score_word(word) + if score > best_word[:score] best_word[:word].clear best_word[:word] << word @@ -110,19 +122,21 @@ def highest_score_from(words) end - # insert some tie-breaker code here - best_by_length = best_word[:word].min_by do |word| + # applies rules for ties: + # - shortest word wins unless there is a 10 letter word + # - if multiple 10 letter words, the first word wins + shortest_word = best_word[:word].min_by do |word| word.length end - best_by_10 = best_word[:word].select do |word| + all_tiles_words = best_word[:word].select do |word| word.length == 10 end - if best_by_10.empty? - best_word[:word] = best_by_length + if all_tiles_words.empty? + best_word[:word] = shortest_word else - best_word[:word] = best_by_10[0] + best_word[:word] = all_tiles_words[0] end return best_word From 784c798b0527a662f3b58cf25f0c69b6b40041fe Mon Sep 17 00:00:00 2001 From: Valerie Gidzinski Date: Thu, 16 Aug 2018 14:20:20 -0700 Subject: [PATCH 06/10] Adds wave 5 tests --- specs/adagrams_spec.rb | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/specs/adagrams_spec.rb b/specs/adagrams_spec.rb index ae2ccd0..c993db3 100644 --- a/specs/adagrams_spec.rb +++ b/specs/adagrams_spec.rb @@ -168,4 +168,35 @@ expect(best_word[:score]).must_equal 18 end end + + describe 'is_in_english_dict? method' do + it 'returns true if submitted word is in game dictionary' do + word = 'aardvark' + + is_valid = is_in_english_dict?(word) + + expect(is_valid).must_equal true + end + + it 'returns true if submitted word is in game dictionary - case insensitive' do + word = 'AARDVARK' + + is_valid = is_in_english_dict?(word) + + expect(is_valid).must_equal true + end + + it 'returns false if submitted word is not in game dictionary' do + + expect(is_in_english_dict?('niugfdfl')).must_equal false + expect(is_in_english_dict?('hippopotamus')).must_equal false + expect(is_in_english_dict?('#&*123')).must_equal false + + end + + it 'returns false if given empty input' do + expect(is_in_english_dict?('')).must_equal false + end + + end end From 6e8a110d82f3c2fca574c2328e1f12d23387b4c0 Mon Sep 17 00:00:00 2001 From: Anibel America Date: Thu, 16 Aug 2018 15:04:17 -0700 Subject: [PATCH 07/10] Implements draft of wave 5 --- lib/adagrams.rb | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/lib/adagrams.rb b/lib/adagrams.rb index e880356..e8e3052 100644 --- a/lib/adagrams.rb +++ b/lib/adagrams.rb @@ -1,3 +1,6 @@ +require 'csv' +# require_relative '../assets/dictionary-english.csv' + # returns an array of 10 letters def draw_letters letter_frequencies = @@ -142,3 +145,17 @@ def highest_score_from(words) return best_word end + +def is_in_english_dict?(input) + + CSV.read('/Users/anibelamerica/ada/unit-1/02-week/dev/adagrams/adagrams/assets/dictionary-english.csv', headers: true).each do |word| + + if input.downcase == word[0] + return true + end + + end + + return false + +end From 167648433d5fe4f796c25f72237f78d0a962fc46 Mon Sep 17 00:00:00 2001 From: Anibel America Date: Thu, 16 Aug 2018 15:08:53 -0700 Subject: [PATCH 08/10] Implements working version of wave 5 --- lib/adagrams.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/adagrams.rb b/lib/adagrams.rb index e8e3052..e53a14d 100644 --- a/lib/adagrams.rb +++ b/lib/adagrams.rb @@ -1,5 +1,4 @@ require 'csv' -# require_relative '../assets/dictionary-english.csv' # returns an array of 10 letters def draw_letters @@ -148,7 +147,7 @@ def highest_score_from(words) def is_in_english_dict?(input) - CSV.read('/Users/anibelamerica/ada/unit-1/02-week/dev/adagrams/adagrams/assets/dictionary-english.csv', headers: true).each do |word| + CSV.read('assets/dictionary-english.csv', headers: true).each do |word| if input.downcase == word[0] return true From c217d390780d85db26197f10fa8d3c1a6f038dd9 Mon Sep 17 00:00:00 2001 From: Anibel America Date: Thu, 16 Aug 2018 16:50:14 -0700 Subject: [PATCH 09/10] Fixes pointer issues in uses_available_letters? method --- lib/adagrams.rb | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/lib/adagrams.rb b/lib/adagrams.rb index e53a14d..fab52b9 100644 --- a/lib/adagrams.rb +++ b/lib/adagrams.rb @@ -51,18 +51,16 @@ def uses_available_letters?(input, letters_in_hand) input_array = input.upcase.chars - input_array.each do |letter| + letters_in_hand.each do |letter| - if letters_in_hand.include? letter - index = letters_in_hand.index(letter) - letters_in_hand.delete_at(index) - else - return false + if input_array.include? letter + index = input_array.index(letter) + input_array.delete_at(index) end - end - return true + return input_array.length == 0 + end # returns word score based on letter value and word length From ea215c9bc8328e9cdf382de81f90384e4be0a206 Mon Sep 17 00:00:00 2001 From: Valerie Gidzinski Date: Fri, 17 Aug 2018 14:22:46 -0700 Subject: [PATCH 10/10] Improves code readability for final version --- lib/adagrams.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/adagrams.rb b/lib/adagrams.rb index fab52b9..28ffaf0 100644 --- a/lib/adagrams.rb +++ b/lib/adagrams.rb @@ -46,7 +46,8 @@ def draw_letters end -# boolean method that verifies if input is valid + +# Boolean method that verifies input is valid def uses_available_letters?(input, letters_in_hand) input_array = input.upcase.chars @@ -63,6 +64,7 @@ def uses_available_letters?(input, letters_in_hand) end + # returns word score based on letter value and word length def score_word(word) @@ -97,6 +99,7 @@ def score_word(word) end + # returns hash of highest scoring word and its score # applies rules for breaking ties def highest_score_from(words) @@ -143,6 +146,8 @@ def highest_score_from(words) end + +# Boolean method that verifies word is in game dictionary def is_in_english_dict?(input) CSV.read('assets/dictionary-english.csv', headers: true).each do |word|