From 7aa8eb9ae8d7f09ff7828f477a209898a473b8c7 Mon Sep 17 00:00:00 2001 From: Emily Cowan Date: Mon, 10 Feb 2020 17:05:12 -0800 Subject: [PATCH 1/6] Added method for wave 1 --- adagrams.rb | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 adagrams.rb diff --git a/adagrams.rb b/adagrams.rb new file mode 100644 index 0000000..1e78f21 --- /dev/null +++ b/adagrams.rb @@ -0,0 +1,63 @@ +def draw_letters + pool = { + "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 + } + user_letters = [] + 10.times do + letter = pool.keys.sample(1) + letter = letter[0].to_s + user_letters << letter + pool[letter] -= 1 + if pool[letter] == 0 + pool.delete(letter) + end + end + return user_letters +end + +# player_letters = draw_letters +# puts player_letters +# player_input = gets.chomp + +# def uses_available_letters?(input, letters_in_hand) +# input_letters = input.split(//) +# print input_letters +# input_letters.each do |letter| +# if letters_in_hand.include?(letter) +# letters_in_hand.delete(letter) +# else +# puts "You do not have the letters to create that word. Please enter a new word using the letters: #{letters_in_hand}" +# return false +# exit +# end +# end +# return true +# end + +# true_or_false = uses_available_letters?(player_input, player_letters) +# puts true_or_false \ No newline at end of file From de48b9263b9880765575b06bcac06e1ebcb5d285 Mon Sep 17 00:00:00 2001 From: Emily Cowan Date: Mon, 10 Feb 2020 17:40:54 -0800 Subject: [PATCH 2/6] Added the solution to the second wave --- adagrams.rb | 63 ----------------------------------------------------- 1 file changed, 63 deletions(-) delete mode 100644 adagrams.rb diff --git a/adagrams.rb b/adagrams.rb deleted file mode 100644 index 1e78f21..0000000 --- a/adagrams.rb +++ /dev/null @@ -1,63 +0,0 @@ -def draw_letters - pool = { - "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 - } - user_letters = [] - 10.times do - letter = pool.keys.sample(1) - letter = letter[0].to_s - user_letters << letter - pool[letter] -= 1 - if pool[letter] == 0 - pool.delete(letter) - end - end - return user_letters -end - -# player_letters = draw_letters -# puts player_letters -# player_input = gets.chomp - -# def uses_available_letters?(input, letters_in_hand) -# input_letters = input.split(//) -# print input_letters -# input_letters.each do |letter| -# if letters_in_hand.include?(letter) -# letters_in_hand.delete(letter) -# else -# puts "You do not have the letters to create that word. Please enter a new word using the letters: #{letters_in_hand}" -# return false -# exit -# end -# end -# return true -# end - -# true_or_false = uses_available_letters?(player_input, player_letters) -# puts true_or_false \ No newline at end of file From e171866bfc4f21bf48cbe634395f888f0a86f238 Mon Sep 17 00:00:00 2001 From: Emily Cowan Date: Tue, 11 Feb 2020 16:50:55 -0800 Subject: [PATCH 3/6] Completed waves 3 and 4 --- lib/adagrams.rb | 145 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) diff --git a/lib/adagrams.rb b/lib/adagrams.rb index e69de29..8fe1730 100644 --- a/lib/adagrams.rb +++ b/lib/adagrams.rb @@ -0,0 +1,145 @@ +def draw_letters + pool = { + "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 + } + user_letters = [] + 10.times do + letter = pool.keys.sample(1) + letter = letter[0].to_s + user_letters << letter + pool[letter] -= 1 + if pool[letter] == 0 + pool.delete(letter) + end + end + return user_letters +end + +# player_letters = draw_letters +# puts player_letters +# player_input = gets.chomp + +def uses_available_letters?(input, letters_in_hand) + input_letters = input.split(//).sort + user_letters = letters_in_hand.clone + input_letters.each do |letter| + if user_letters.include?(letter) + user_letters.delete(letter) + else + return false + end + end + return true +end + + +def score_word(word) + letter_points = { + "A" => 1, + "E" => 1, + "I" => 1, + "O" => 1, + "U" => 1, + "L" => 1, + "N" => 1, + "R" => 1, + "S" => 1, + "T" => 1, + "D" => 2, + "G" => 2, + "B" => 3, + "C" => 3, + "M" => 3, + "P" => 3, + "F" => 4, + "H" => 4, + "V" => 4, + "W" => 4, + "Y" => 4, + "K" => 5, + "J" => 8, + "X" => 8, + "Q" => 10, + "Z" => 10 + } + score = [] + letters = word.upcase.split(//) + letters.each do |letter| + score << letter_points[letter] + end + if letters.length > 6 + score << 8 + end + return score.sum +end + +def highest_score_from(words) + results = {} + scores = [] + winner = {} + words.each do |word| + score = score_word(word) + results[word] = score + end + highest_score = results.max_by{|word, score| score} + winning_words = [] + words.each do |word| + if results["#{word}"] == highest_score[1] + winning_words << word + end + end + shortest_word = winning_words.min_by{|word| word.length} + if winning_words.length > 1 + winning_words.each do |word| + if word.length > 9 + winner[:word] = word + winner[:score] = results[winning_words[0]] + return winner + + end + end + winning_words.each do |word| + if word.length == shortest_word.length + winner[:word] = word + winner[:score] = results[winning_words[0]] + return winner + end + end + else + winner[:word] = winning_words[0] + winner[:score] = results[winning_words[0]] + return winner + end +end + +highest_score_from(["this", "is", "a", "xx", "wwj"]) + +# score = score_word("discombobulated") +# puts score +# true_or_false = uses_available_letters?(player_input, player_letters) +# puts true_or_false \ No newline at end of file From e27ca8e5c15a213dd350b56cfc55f30a520c3382 Mon Sep 17 00:00:00 2001 From: Emily Cowan Date: Wed, 12 Feb 2020 15:18:50 -0800 Subject: [PATCH 4/6] Added method for tiebreaker and reading csv file in adagrams.rb, also added test for csv method. --- lib/adagrams.rb | 58 ++++++++++++++++++++++++------------------- test/adagrams_test.rb | 12 ++++++++- 2 files changed, 43 insertions(+), 27 deletions(-) diff --git a/lib/adagrams.rb b/lib/adagrams.rb index 8fe1730..aa1ebab 100644 --- a/lib/adagrams.rb +++ b/lib/adagrams.rb @@ -1,3 +1,5 @@ +require 'csv' + def draw_letters pool = { "a" => 9, @@ -40,10 +42,6 @@ def draw_letters return user_letters end -# player_letters = draw_letters -# puts player_letters -# player_input = gets.chomp - def uses_available_letters?(input, letters_in_hand) input_letters = input.split(//).sort user_letters = letters_in_hand.clone @@ -98,6 +96,25 @@ def score_word(word) return score.sum end +def tiebreaker(winning_words, results) + winner = {} + shortest_word = winning_words.min_by{|word| word.length} + winning_words.each do |word| + if word.length > 9 + winner[:word] = word + winner[:score] = results[winning_words[0]] + return winner + end + end + winning_words.each do |word| + if word.length == shortest_word.length + winner[:word] = word + winner[:score] = results[winning_words[0]] + return winner + end + end +end + def highest_score_from(words) results = {} scores = [] @@ -113,23 +130,9 @@ def highest_score_from(words) winning_words << word end end - shortest_word = winning_words.min_by{|word| word.length} if winning_words.length > 1 - winning_words.each do |word| - if word.length > 9 - winner[:word] = word - winner[:score] = results[winning_words[0]] - return winner - - end - end - winning_words.each do |word| - if word.length == shortest_word.length - winner[:word] = word - winner[:score] = results[winning_words[0]] - return winner - end - end + winner = tiebreaker(winning_words, results) + return winner else winner[:word] = winning_words[0] winner[:score] = results[winning_words[0]] @@ -137,9 +140,12 @@ def highest_score_from(words) end end -highest_score_from(["this", "is", "a", "xx", "wwj"]) - -# score = score_word("discombobulated") -# puts score -# true_or_false = uses_available_letters?(player_input, player_letters) -# puts true_or_false \ No newline at end of file +def is_in_english_dict?(input) + file = File.open("assets/dictionary-english.csv") + dictionary = file.readlines.map(&:chomp) + if dictionary.include?(input.downcase) + return true + else + return false + end +end \ No newline at end of file diff --git a/test/adagrams_test.rb b/test/adagrams_test.rb index 90ec44d..2361d71 100644 --- a/test/adagrams_test.rb +++ b/test/adagrams_test.rb @@ -1,6 +1,7 @@ require 'minitest/autorun' require 'minitest/reporters' require 'minitest/skip_dsl' +require 'csv' require_relative '../lib/adagrams' @@ -178,4 +179,13 @@ expect(best_word[:score]).must_equal 18 end end -end + it 'Will verify that the given word is present in the english dictionary' do + word = "Word" + + expect(is_in_english_dict?(word)).must_equal true + + word = "aaaaaaaa" + + expect(is_in_english_dict?(word)).must_equal false + end +end \ No newline at end of file From e97628c948da80db108b1d52c24763066cc3e2e5 Mon Sep 17 00:00:00 2001 From: Emily Cowan Date: Thu, 13 Feb 2020 14:55:48 -0800 Subject: [PATCH 5/6] Added comments for the methods highest_score_from and tiebreaker. --- lib/adagrams.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/adagrams.rb b/lib/adagrams.rb index aa1ebab..eefdad6 100644 --- a/lib/adagrams.rb +++ b/lib/adagrams.rb @@ -96,16 +96,20 @@ def score_word(word) return score.sum end +# The required parameters of the method 'tiebreaker' is the array 'winning_words' and the hash 'results'. def tiebreaker(winning_words, results) winner = {} +# Finding the shortest word in the array 'winning_words' and assigning it to the variable 'shortest_word'. shortest_word = winning_words.min_by{|word| word.length} winning_words.each do |word| +# Checking whether or not there is a word that is 10 letters by iterating through 'winning_words'. If so, that word is immediately returned as the winner. if word.length > 9 winner[:word] = word winner[:score] = results[winning_words[0]] return winner end end +# If no word is 10 letters, the array 'winning_words' is iterated through a second time and the word matching the shortest length is return as the winner. winning_words.each do |word| if word.length == shortest_word.length winner[:word] = word @@ -123,17 +127,21 @@ def highest_score_from(words) score = score_word(word) results[word] = score end +# Finding the highest scored word from the hash 'results' and assigning it to the value 'highest score'. highest_score = results.max_by{|word, score| score} winning_words = [] words.each do |word| +# Iterating through the array 'words' and shoveling all words with a score matching the highest score to the array 'winning_words'. if results["#{word}"] == highest_score[1] winning_words << word end end +# If the length of the array 'winning_words' is greater than 2, the method 'tiebreaker' is invoked. if winning_words.length > 1 winner = tiebreaker(winning_words, results) return winner else +# If there is only 1 winning word, the word and it's score is created as a key-value pair in the hash 'winner' and returned to the user. winner[:word] = winning_words[0] winner[:score] = results[winning_words[0]] return winner From eb9a232d5687430de0780d9e92f73c771e58baa9 Mon Sep 17 00:00:00 2001 From: Emily Cowan Date: Fri, 14 Feb 2020 14:13:15 -0800 Subject: [PATCH 6/6] Fixed the method "uses_available_letters?" to account for duplicates properly. --- lib/adagrams.rb | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/lib/adagrams.rb b/lib/adagrams.rb index eefdad6..30638b6 100644 --- a/lib/adagrams.rb +++ b/lib/adagrams.rb @@ -44,10 +44,23 @@ def draw_letters def uses_available_letters?(input, letters_in_hand) input_letters = input.split(//).sort - user_letters = letters_in_hand.clone + # number_of_letters is a hash that will hold the words in the hand as the key and how many instances of them there are as the value. + number_of_letters = {} + # populating the number_of_letters hash by looping through the hand. + letters_in_hand.each do |letter| + if number_of_letters.has_key?(letter) + number_of_letters[letter] += 1 + else + number_of_letters[letter] = 1 + end + end input_letters.each do |letter| - if user_letters.include?(letter) - user_letters.delete(letter) + if number_of_letters.has_key?(letter) + if number_of_letters[letter] == 0 + return false + else + number_of_letters[letter] -= 1 + end else return false end @@ -55,7 +68,6 @@ def uses_available_letters?(input, letters_in_hand) return true end - def score_word(word) letter_points = { "A" => 1,