From 49fc234b6bad0bf43c02a1d22e3749ce19303a7e Mon Sep 17 00:00:00 2001 From: brilatimer Date: Sun, 17 Nov 2019 15:45:51 -0800 Subject: [PATCH 1/4] wave 1 working and tests passing: pool of letters is present and hand is randomly generated --- src/adagrams.js | 117 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 116 insertions(+), 1 deletion(-) diff --git a/src/adagrams.js b/src/adagrams.js index 54043451..7d0899bc 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -1,8 +1,123 @@ +const poolOfLetters = ( + "A".repeat(9) + + "B".repeat(2) + + "C".repeat(2) + + "D".repeat(4) + + "E".repeat(12) + + "F".repeat(2) + + "G".repeat(3) + + "H".repeat(2) + + "I".repeat(9) + + "J".repeat(1) + + "K".repeat(1) + + "L".repeat(4) + + "M".repeat(2) + + "N".repeat(6) + + "O".repeat(8) + + "P".repeat(2) + + "Q".repeat(1) + + "R".repeat(6) + + "S".repeat(4) + + "T".repeat(6) + + "U".repeat(4) + + "V".repeat(2) + + "W".repeat(2) + + "X".repeat(1) + + "Y".repeat(2) + + "Z".repeat(1) + ).split(''); + const Adagrams = { + // thank you stackoverflow: https://stackoverflow.com/questions/3718282/javascript-shuffling-objects-inside-an-object-randomize + shuffle(letterbank) { + for (let i = 0; i < letterbank.length - 1; i++) { + let j = i + Math.floor(Math.random() * (letterbank.length - i)); + + let temp = letterbank[j]; + letterbank[j] = letterbank[i]; + letterbank[i] = temp; + } + }, + drawLetters() { - // Implement this method for wave 1 + let poolOfLettersCopy = [...poolOfLetters] + this.shuffle(poolOfLettersCopy) + return poolOfLettersCopy.slice(0,10); }, }; +// WAVE 2 +// forin loop +// undefined not null +// if not in hand, pop off (don't use an object, keep as array) +// console.log(Adagrams.drawLetters()); + +// // logic for wave 2 here +// // if input .includes(lettersInHand); +// return true +// // elseif return false: quantity or lettersInHand + +// usesAvailableLetters(input, lettersInHand) +// // if pool.includes?(lettersInHand) +// // return true + +uses_available_letters(){ + let uses_available_letters(word, letters_in_hand) + hand_hash = letters_in_hand.uniq.map { |x| [x, letters_in_hand.count(x)] }.to_h + word_array = word.upcase.split("") + letter_check = [] + + word_array.map do |letter| + if hand_hash[letter].class == Integer + if hand_hash[letter] >= 1 + hand_hash[letter] -= 1 + letter_check << "True" + elsif hand_hash[letter] == 0 + letter_check << "False" + end + else + letter_check << "False" + end + end + return letter_check.include?("False") ? false : true + end + + + +// // wave 3 +// // return false +// // function to score words: scoreWord (put this in Adagrams object) +// // word (string) +// // returns integer representing points +// // each letter in word has points value +// // if length is 7,8,9,10, +8 points to score + +// const scoreWord = +// split('') +// // map letters +// // if X const, add 1 etc +// catagoryOne = ['A','E','I','O','U','L','N','R','S','T'] = 1 +// catagoryTwo = ['D','G'] = 2 +// catagoryThree = ['B','C','M','P'] = 3 +// catagoryFour = ['F','H','V','W','Y'] = 4 +// catagoryFive = ['K'] = 5 +// catagorySix = ['J','X'] = 8 +// catagorySeven = ['Q','Z'] = 10 + + +// if scoreWord == catagoryOne += 1 +// elsif scoreWord == catagoryTwo += 2 +// elsif scoreWord == catagoryThree += 3 +// elsif scoreWord == catagoryFour += 4 +// elsif scoreWord == catagoryFive += 5 +// elsif scoreWord == catagorySix += 8 +// elsif scoreWord == catagorySeven += 10 + +// if scoreWord.length == 7 || 8 || 9 || 10 +// += 8 score + + // Do not remove this line or your tests will break! export default Adagrams; + + From a7a38d5bcd22534f8509b49453fd7b0bc2451ac1 Mon Sep 17 00:00:00 2001 From: brilatimer Date: Sun, 17 Nov 2019 16:27:27 -0800 Subject: [PATCH 2/4] use available letters --- src/adagrams.js | 121 +++++++++++++++++++++++++++--------------------- 1 file changed, 67 insertions(+), 54 deletions(-) diff --git a/src/adagrams.js b/src/adagrams.js index 7d0899bc..76c938d8 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -44,6 +44,19 @@ const Adagrams = { this.shuffle(poolOfLettersCopy) return poolOfLettersCopy.slice(0,10); }, + + usesAvailableLetters(input, lettersInHand) { + let handHash = new Object(); + for (l in lettersInHand) { + if (handHash.hasOwnProperty(l)) { + handHash[l] += 1; + } + else { + handHash[l] = 1; + } + } + console.log(handHash); + } }; // WAVE 2 @@ -61,60 +74,60 @@ const Adagrams = { // // if pool.includes?(lettersInHand) // // return true -uses_available_letters(){ - let uses_available_letters(word, letters_in_hand) - hand_hash = letters_in_hand.uniq.map { |x| [x, letters_in_hand.count(x)] }.to_h - word_array = word.upcase.split("") - letter_check = [] - - word_array.map do |letter| - if hand_hash[letter].class == Integer - if hand_hash[letter] >= 1 - hand_hash[letter] -= 1 - letter_check << "True" - elsif hand_hash[letter] == 0 - letter_check << "False" - end - else - letter_check << "False" - end - end - return letter_check.include?("False") ? false : true - end - - - -// // wave 3 -// // return false -// // function to score words: scoreWord (put this in Adagrams object) -// // word (string) -// // returns integer representing points -// // each letter in word has points value -// // if length is 7,8,9,10, +8 points to score - -// const scoreWord = -// split('') -// // map letters -// // if X const, add 1 etc -// catagoryOne = ['A','E','I','O','U','L','N','R','S','T'] = 1 -// catagoryTwo = ['D','G'] = 2 -// catagoryThree = ['B','C','M','P'] = 3 -// catagoryFour = ['F','H','V','W','Y'] = 4 -// catagoryFive = ['K'] = 5 -// catagorySix = ['J','X'] = 8 -// catagorySeven = ['Q','Z'] = 10 - - -// if scoreWord == catagoryOne += 1 -// elsif scoreWord == catagoryTwo += 2 -// elsif scoreWord == catagoryThree += 3 -// elsif scoreWord == catagoryFour += 4 -// elsif scoreWord == catagoryFive += 5 -// elsif scoreWord == catagorySix += 8 -// elsif scoreWord == catagorySeven += 10 - -// if scoreWord.length == 7 || 8 || 9 || 10 -// += 8 score +// uses_available_letters(){ +// let uses_available_letters(word, letters_in_hand) +// hand_hash = letters_in_hand.uniq.map { |x| [x, letters_in_hand.count(x)] }.to_h +// word_array = word.upcase.split("") +// letter_check = [] + +// word_array.map do |letter| +// if hand_hash[letter].class == Integer +// if hand_hash[letter] >= 1 +// hand_hash[letter] -= 1 +// letter_check << "True" +// elsif hand_hash[letter] == 0 +// letter_check << "False" +// end +// else +// letter_check << "False" +// end +// end +// return letter_check.include?("False") ? false : true +// end + + + +// // // wave 3 +// // // return false +// // // function to score words: scoreWord (put this in Adagrams object) +// // // word (string) +// // // returns integer representing points +// // // each letter in word has points value +// // // if length is 7,8,9,10, +8 points to score + +// // const scoreWord = +// // split('') +// // // map letters +// // // if X const, add 1 etc +// // catagoryOne = ['A','E','I','O','U','L','N','R','S','T'] = 1 +// // catagoryTwo = ['D','G'] = 2 +// // catagoryThree = ['B','C','M','P'] = 3 +// // catagoryFour = ['F','H','V','W','Y'] = 4 +// // catagoryFive = ['K'] = 5 +// // catagorySix = ['J','X'] = 8 +// // catagorySeven = ['Q','Z'] = 10 + + +// // if scoreWord == catagoryOne += 1 +// // elsif scoreWord == catagoryTwo += 2 +// // elsif scoreWord == catagoryThree += 3 +// // elsif scoreWord == catagoryFour += 4 +// // elsif scoreWord == catagoryFive += 5 +// // elsif scoreWord == catagorySix += 8 +// // elsif scoreWord == catagorySeven += 10 + +// // if scoreWord.length == 7 || 8 || 9 || 10 +// // += 8 score // Do not remove this line or your tests will break! From 8465965ba29cbe655b7788ba5033c1c4fb43ed7b Mon Sep 17 00:00:00 2001 From: brilatimer Date: Sun, 17 Nov 2019 16:41:23 -0800 Subject: [PATCH 3/4] wave 2 complete - Check if characters from input are in handHash --- src/adagrams.js | 59 +++++++++++++++++-------------------------------- 1 file changed, 20 insertions(+), 39 deletions(-) diff --git a/src/adagrams.js b/src/adagrams.js index 76c938d8..870471b8 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -46,8 +46,10 @@ const Adagrams = { }, usesAvailableLetters(input, lettersInHand) { + + // Create frequency hash of lettersInHand let handHash = new Object(); - for (l in lettersInHand) { + for (let l of lettersInHand) { if (handHash.hasOwnProperty(l)) { handHash[l] += 1; } @@ -55,45 +57,24 @@ const Adagrams = { handHash[l] = 1; } } - console.log(handHash); - } -}; -// WAVE 2 -// forin loop -// undefined not null -// if not in hand, pop off (don't use an object, keep as array) -// console.log(Adagrams.drawLetters()); - -// // logic for wave 2 here -// // if input .includes(lettersInHand); -// return true -// // elseif return false: quantity or lettersInHand - -// usesAvailableLetters(input, lettersInHand) -// // if pool.includes?(lettersInHand) -// // return true - -// uses_available_letters(){ -// let uses_available_letters(word, letters_in_hand) -// hand_hash = letters_in_hand.uniq.map { |x| [x, letters_in_hand.count(x)] }.to_h -// word_array = word.upcase.split("") -// letter_check = [] - -// word_array.map do |letter| -// if hand_hash[letter].class == Integer -// if hand_hash[letter] >= 1 -// hand_hash[letter] -= 1 -// letter_check << "True" -// elsif hand_hash[letter] == 0 -// letter_check << "False" -// end -// else -// letter_check << "False" -// end -// end -// return letter_check.include?("False") ? false : true -// end + // Check if characters from input are in handHash + for (let l of input) { + if (l in handHash) { + if (handHash[l] == 0) { + return false + } + else { + handHash[l] -= 1 + } + } + else { + return false + } + } + return true + }, +}; From 2ce35d1e36ee1e1ed15c8572d9f094ef7dc5337d Mon Sep 17 00:00:00 2001 From: brilatimer Date: Sun, 17 Nov 2019 17:17:46 -0800 Subject: [PATCH 4/4] wave 3 complete - appropriately scores words, adds bonus points if special case letters are used --- src/adagrams.js | 50 +++++++++++++++---------------------------------- 1 file changed, 15 insertions(+), 35 deletions(-) diff --git a/src/adagrams.js b/src/adagrams.js index 870471b8..80d5a629 100644 --- a/src/adagrams.js +++ b/src/adagrams.js @@ -27,6 +27,8 @@ const poolOfLetters = ( "Z".repeat(1) ).split(''); +const valueHash = {"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}; + const Adagrams = { // thank you stackoverflow: https://stackoverflow.com/questions/3718282/javascript-shuffling-objects-inside-an-object-randomize shuffle(letterbank) { @@ -74,44 +76,22 @@ const Adagrams = { } return true }, -}; - - - -// // // wave 3 -// // // return false -// // // function to score words: scoreWord (put this in Adagrams object) -// // // word (string) -// // // returns integer representing points -// // // each letter in word has points value -// // // if length is 7,8,9,10, +8 points to score -// // const scoreWord = -// // split('') -// // // map letters -// // // if X const, add 1 etc -// // catagoryOne = ['A','E','I','O','U','L','N','R','S','T'] = 1 -// // catagoryTwo = ['D','G'] = 2 -// // catagoryThree = ['B','C','M','P'] = 3 -// // catagoryFour = ['F','H','V','W','Y'] = 4 -// // catagoryFive = ['K'] = 5 -// // catagorySix = ['J','X'] = 8 -// // catagorySeven = ['Q','Z'] = 10 - - -// // if scoreWord == catagoryOne += 1 -// // elsif scoreWord == catagoryTwo += 2 -// // elsif scoreWord == catagoryThree += 3 -// // elsif scoreWord == catagoryFour += 4 -// // elsif scoreWord == catagoryFive += 5 -// // elsif scoreWord == catagorySix += 8 -// // elsif scoreWord == catagorySeven += 10 - -// // if scoreWord.length == 7 || 8 || 9 || 10 -// // += 8 score + // Wave 3 + scoreWord(word){ + let score = 0; + let bonus = 8; + for (let l of word) { + score += valueHash[l.toUpperCase()]; + } + if (word.length == 7 || word.length == 8 || word.length == 9 || word.length == 10){ + score += bonus; + } + return score; + } +}; -// Do not remove this line or your tests will break! export default Adagrams;