From 22f41068c0b77ac6b86b70c8a82d64b9ba2c7604 Mon Sep 17 00:00:00 2001 From: Jocelyn Wang Date: Tue, 11 Feb 2020 13:20:50 -0800 Subject: [PATCH 1/9] completed initial draft of wave 1 --- lib/adagrams.rb | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/lib/adagrams.rb b/lib/adagrams.rb index e69de29..dfbe9b7 100644 --- a/lib/adagrams.rb +++ b/lib/adagrams.rb @@ -0,0 +1,17 @@ +#Game for user to create words. + +# Wave 1 +#Create hash with number of each tile available. Randomly sample 10. +def draw_letters + all_tiles = { + 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 + } + tile_array = [] + all_tiles.each do |letter, number| + number.times do + tile_array.push(letter.to_s) + end + end + tile_array.sample(10) +end \ No newline at end of file From b9a07af566dfec452c199b8852e18890851fad6d Mon Sep 17 00:00:00 2001 From: Jocelyn Wang Date: Tue, 11 Feb 2020 14:20:59 -0800 Subject: [PATCH 2/9] completed initial draft of wave 2 - added method uses_available_letters? --- lib/adagrams.rb | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lib/adagrams.rb b/lib/adagrams.rb index dfbe9b7..905a925 100644 --- a/lib/adagrams.rb +++ b/lib/adagrams.rb @@ -14,4 +14,16 @@ def draw_letters end end tile_array.sample(10) +end + +#Wave 2 +#Confirms that the user input only uses ones that are available in their hand +def uses_available_letters? (input, letters_in_hand) #doesn't address duplicated letters + input.split(//).each do |letter| + if (letters_in_hand.include? letter.upcase) == false + return false + end + letters_in_hand -= [letter.upcase] + end + true end \ No newline at end of file From 1e3604742974c8f42f67c293ac67f848639d9aad Mon Sep 17 00:00:00 2001 From: Jocelyn Wang Date: Tue, 11 Feb 2020 14:42:50 -0800 Subject: [PATCH 3/9] completed initial draft of wave 3 - added in method score_word --- lib/adagrams.rb | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/lib/adagrams.rb b/lib/adagrams.rb index 905a925..9141d9b 100644 --- a/lib/adagrams.rb +++ b/lib/adagrams.rb @@ -26,4 +26,27 @@ def uses_available_letters? (input, letters_in_hand) #doesn't address duplicated letters_in_hand -= [letter.upcase] end true +end + +#Wave 3 +#Calculates score for word based on point system and additional rule regarding words with more than 7 letters +def score_word(word) + score_hash = { + 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_total = 0 + word.length.times do |i| + letter = word[i].upcase + score_total += score_hash[letter.to_sym] + end + if word.length >= 7 && word.length <= 10 + score_total += 8 + end + return score_total end \ No newline at end of file From 0f15aaaf16d798bbffa7cc369c3b6e6da9bede11 Mon Sep 17 00:00:00 2001 From: Jocelyn Wang Date: Tue, 11 Feb 2020 14:46:52 -0800 Subject: [PATCH 4/9] completed initial draft of wave 4 - added in method highest_score_from --- lib/adagrams.rb | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/lib/adagrams.rb b/lib/adagrams.rb index 9141d9b..b2a3ea6 100644 --- a/lib/adagrams.rb +++ b/lib/adagrams.rb @@ -49,4 +49,26 @@ def score_word(word) score_total += 8 end return score_total -end \ No newline at end of file +end + +#Wave 4 +#Calculates the highest score from the words that were entered throughout this round +def highest_score_from(words) + high_score = 0 + high_word = "" + + words.each do |word| + if score_word(word) > high_score + high_score, high_word = score_word(word), word + elsif score_word(word) == high_score + if word.length == 10 && high_word.length != 10 + high_score, high_word = score_word(word), word + elsif word.length < high_word.length && high_word.length != 10 + high_score, high_word = score_word(word), word + end + end + end + + temp_hash = {:word => high_word, :score => high_score} +end + From b6ae0b8af638abba6db942adcd0c101820b66277 Mon Sep 17 00:00:00 2001 From: Jocelyn Wang Date: Tue, 11 Feb 2020 14:59:00 -0800 Subject: [PATCH 5/9] completed initial draft of wave 5 - added method is_in_english.dict? --- lib/adagrams.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/adagrams.rb b/lib/adagrams.rb index b2a3ea6..61c910e 100644 --- a/lib/adagrams.rb +++ b/lib/adagrams.rb @@ -1,5 +1,8 @@ #Game for user to create words. +require "csv" +ENGLISH_DICT = CSV.read("assets/dictionary-english.csv") + # Wave 1 #Create hash with number of each tile available. Randomly sample 10. def draw_letters @@ -72,3 +75,8 @@ def highest_score_from(words) temp_hash = {:word => high_word, :score => high_score} end +# Wave 5 +#Checks to make sure user word is in the English dictionary +def is_in_english_dict?(input) + return ENGLISH_DICT.include?([input.downcase]) +end From 8ede0dc2afa1d9119606871c18f14ee10809282b Mon Sep 17 00:00:00 2001 From: Jocelyn Wang Date: Tue, 11 Feb 2020 15:40:09 -0800 Subject: [PATCH 6/9] updated and clarified all comments --- lib/adagrams.rb | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/lib/adagrams.rb b/lib/adagrams.rb index 61c910e..8cb00cd 100644 --- a/lib/adagrams.rb +++ b/lib/adagrams.rb @@ -1,14 +1,20 @@ -#Game for user to create words. +# Program that randomly displays 10 letters. +# Given those 10 letters, make words and recieve a score. +# Upon exiting, recieve file score and highest point word. +# Access english dictionary require "csv" ENGLISH_DICT = CSV.read("assets/dictionary-english.csv") # Wave 1 -#Create hash with number of each tile available. Randomly sample 10. +# Create hash with letters available and randomly sample 10 for user def draw_letters all_tiles = { - 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 + 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 } tile_array = [] all_tiles.each do |letter, number| @@ -19,9 +25,9 @@ def draw_letters tile_array.sample(10) end -#Wave 2 -#Confirms that the user input only uses ones that are available in their hand -def uses_available_letters? (input, letters_in_hand) #doesn't address duplicated letters +# Wave 2 +# Verifies that input is available for play +def uses_available_letters? (input, letters_in_hand) input.split(//).each do |letter| if (letters_in_hand.include? letter.upcase) == false return false @@ -31,8 +37,8 @@ def uses_available_letters? (input, letters_in_hand) #doesn't address duplicated true end -#Wave 3 -#Calculates score for word based on point system and additional rule regarding words with more than 7 letters +# Wave 3 +# Calculates score for word submitted handling special cases def score_word(word) score_hash = { A: 1, E: 1, I: 1, O: 1, U: 1, L: 1, N: 1, R: 1, S: 1, T: 1, @@ -54,8 +60,8 @@ def score_word(word) return score_total end -#Wave 4 -#Calculates the highest score from the words that were entered throughout this round +# Wave 4 +# Calculates the highest score from submitted words def highest_score_from(words) high_score = 0 high_word = "" @@ -76,7 +82,7 @@ def highest_score_from(words) end # Wave 5 -#Checks to make sure user word is in the English dictionary +# Checks for word to be in dictionary def is_in_english_dict?(input) return ENGLISH_DICT.include?([input.downcase]) end From 6156b5e38013e7bf444da019323e959a7062ff82 Mon Sep 17 00:00:00 2001 From: Jocelyn Wang Date: Tue, 11 Feb 2020 16:23:02 -0800 Subject: [PATCH 7/9] fixed issue where user input with repeat letters were not accepted --- lib/adagrams.rb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/adagrams.rb b/lib/adagrams.rb index 8cb00cd..77fd22b 100644 --- a/lib/adagrams.rb +++ b/lib/adagrams.rb @@ -27,12 +27,13 @@ def draw_letters # Wave 2 # Verifies that input is available for play -def uses_available_letters? (input, letters_in_hand) +def uses_available_letters? (input, letters_in_hand) + letters_to_check = letters_in_hand.dup input.split(//).each do |letter| - if (letters_in_hand.include? letter.upcase) == false + if (letters_to_check.include? letter.upcase) == false return false end - letters_in_hand -= [letter.upcase] + letters_to_check.delete_at(letters_to_check.index(letter.upcase)) end true end From 865e42f591c366efd5baefcbe6edd182682dd740 Mon Sep 17 00:00:00 2001 From: Jocelyn Wang Date: Tue, 11 Feb 2020 16:44:06 -0800 Subject: [PATCH 8/9] removed parens from method parameter, changed nested if to method for tiebreaker, removed temp_hash variable --- lib/adagrams.rb | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/lib/adagrams.rb b/lib/adagrams.rb index 77fd22b..19597f2 100644 --- a/lib/adagrams.rb +++ b/lib/adagrams.rb @@ -27,7 +27,7 @@ def draw_letters # Wave 2 # Verifies that input is available for play -def uses_available_letters? (input, letters_in_hand) +def uses_available_letters? input, letters_in_hand letters_to_check = letters_in_hand.dup input.split(//).each do |letter| if (letters_to_check.include? letter.upcase) == false @@ -35,14 +35,15 @@ def uses_available_letters? (input, letters_in_hand) end letters_to_check.delete_at(letters_to_check.index(letter.upcase)) end - true + return true end # Wave 3 # Calculates score for word submitted handling special cases -def score_word(word) +def score_word word score_hash = { - A: 1, E: 1, I: 1, O: 1, U: 1, L: 1, N: 1, R: 1, S: 1, T: 1, + 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, @@ -62,8 +63,19 @@ def score_word(word) end # Wave 4 + +def tiebreaker current_word, best_word + if current_word.length == 10 && best_word.length != 10 + current_word + elsif current_word.length < best_word.length && best_word.length != 10 + current_word + else + best_word + end +end + # Calculates the highest score from submitted words -def highest_score_from(words) +def highest_score_from words high_score = 0 high_word = "" @@ -71,19 +83,16 @@ def highest_score_from(words) if score_word(word) > high_score high_score, high_word = score_word(word), word elsif score_word(word) == high_score - if word.length == 10 && high_word.length != 10 - high_score, high_word = score_word(word), word - elsif word.length < high_word.length && high_word.length != 10 - high_score, high_word = score_word(word), word - end + high_score = score_word(tiebreaker(word, high_word)) + high_word = tiebreaker(word, high_word) end end - temp_hash = {:word => high_word, :score => high_score} + {:word => high_word, :score => high_score} end # Wave 5 # Checks for word to be in dictionary -def is_in_english_dict?(input) +def is_in_english_dict? input return ENGLISH_DICT.include?([input.downcase]) end From cc0cf7faa4d754c63a0659149acbc3df167c7073 Mon Sep 17 00:00:00 2001 From: Jocelyn Wang Date: Fri, 14 Feb 2020 08:48:08 -0800 Subject: [PATCH 9/9] refactored wave 1, 2, and tiebreaker method to use more enumerables --- lib/adagrams.rb | 39 +++++++++++++++------------------------ 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/lib/adagrams.rb b/lib/adagrams.rb index 19597f2..111261d 100644 --- a/lib/adagrams.rb +++ b/lib/adagrams.rb @@ -4,6 +4,7 @@ # Access english dictionary require "csv" +require "pry" ENGLISH_DICT = CSV.read("assets/dictionary-english.csv") # Wave 1 @@ -16,13 +17,11 @@ def draw_letters P: 2, Q: 1, R: 6, S: 4, T: 6, U: 4, V: 2, W: 2, X: 1, Y: 2, Z: 1 } - tile_array = [] - all_tiles.each do |letter, number| - number.times do - tile_array.push(letter.to_s) - end - end - tile_array.sample(10) + + all_tiles.each.with_object([]) {|(letter, number), tile_array| + tile_array.concat (letter.to_s * number).split(//) + }.sample(10) + end # Wave 2 @@ -51,27 +50,19 @@ def score_word word J: 8, X: 8, Q: 10, Z: 10 } - score_total = 0 - word.length.times do |i| - letter = word[i].upcase - score_total += score_hash[letter.to_sym] - end - if word.length >= 7 && word.length <= 10 - score_total += 8 - end - return score_total + + score_total = word.upcase.chars.map {|c| score_hash[c.to_sym]}.sum + + (7..10).include?(word.length) ? score_total += 8 : score_total end # Wave 4 - +# Tiebreaker to calculate method def tiebreaker current_word, best_word - if current_word.length == 10 && best_word.length != 10 - current_word - elsif current_word.length < best_word.length && best_word.length != 10 - current_word - else - best_word - end + return best_word if best_word.length == 10 + return current_word if current_word.length == 10 + + [current_word, best_word].min_by {|word| word.length} end # Calculates the highest score from submitted words