From 76471db03b81c6990c5d4d4ff301b7ae9a0b085f Mon Sep 17 00:00:00 2001 From: Periklis Date: Tue, 27 Feb 2024 15:03:14 +0200 Subject: [PATCH 1/4] Core done --- pseudocode.md | 8 ++++--- src/scrabble.js | 64 +++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 67 insertions(+), 5 deletions(-) diff --git a/pseudocode.md b/pseudocode.md index e279f59..b681ee6 100644 --- a/pseudocode.md +++ b/pseudocode.md @@ -3,11 +3,13 @@ #### Add the steps you need to take to implement the requirements for Scrabble Challenge ``` -1. +1. Get the given word -2. +2. Check if it's a valid word -3. +3. Itterate through the word and summ the value of each letter + +4. ...etc ``` diff --git a/src/scrabble.js b/src/scrabble.js index 0d18249..d1b3f03 100644 --- a/src/scrabble.js +++ b/src/scrabble.js @@ -1,5 +1,65 @@ -function scrabble() { - // write code here +function scrabble(word) { + const onePoint = [ + 'A', + 'a', + 'E', + 'e', + 'I', + 'i', + 'O', + 'o', + 'U', + 'u', + 'L', + 'l', + 'N', + 'n', + 'R', + 'r', + 'S', + 's', + 'T', + 't' + ] + const twoPoints = ['D', 'd', 'G', 'g'] + const threePoints = ['B', 'C', 'M', 'P', 'b', 'c', 'm', 'p'] + const fourPoints = ['F', 'H', 'V', 'W', 'Y', 'f', 'h', 'v', 'w', 'y'] + const fivePoints = ['K', 'k'] + const eightPoints = ['J', 'X', 'j', 'x'] + const tenPoints = ['Q', 'Z', 'q', 'z'] + let points = 0 + + // check if a valid word is given + if ( + word === '' || + word === null || + word === ' \t\n' || + typeof word !== 'string' || + word === undefined + ) { + points = 0 + return `${word} is not a valid word. You get ${points} points` + } + for (const i of word) { + if (onePoint.includes(i)) { + points += 1 + } else if (twoPoints.includes(i)) { + points += 2 + } else if (threePoints.includes(i)) { + points += 3 + } else if (fourPoints.includes(i)) { + points += 4 + } else if (fivePoints.includes(i)) { + points += 5 + } else if (eightPoints.includes(i)) { + points += 8 + } else if (tenPoints.includes(i)) { + points += 10 + } + } + return `The word '${word}' gives you ${points} points!` } +console.log(scrabble('OXYPHENBUTAZONE')) + module.exports = scrabble From da4b1440ae357ede6fff3c46cbb459255c83e257 Mon Sep 17 00:00:00 2001 From: Periklis Date: Tue, 27 Feb 2024 15:07:26 +0200 Subject: [PATCH 2/4] Core done and correct output --- src/scrabble.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/scrabble.js b/src/scrabble.js index d1b3f03..d9faf71 100644 --- a/src/scrabble.js +++ b/src/scrabble.js @@ -38,7 +38,7 @@ function scrabble(word) { word === undefined ) { points = 0 - return `${word} is not a valid word. You get ${points} points` + return 0 // `${word} is not a valid word. You get ${points} points` } for (const i of word) { if (onePoint.includes(i)) { @@ -57,7 +57,7 @@ function scrabble(word) { points += 10 } } - return `The word '${word}' gives you ${points} points!` + return points // `The word '${word}' gives you ${points} points!` } console.log(scrabble('OXYPHENBUTAZONE')) From 38f6971c69ba2b12a3ac82d92b329efd074dec20 Mon Sep 17 00:00:00 2001 From: Periklis Date: Tue, 27 Feb 2024 15:15:39 +0200 Subject: [PATCH 3/4] Updated pseudocode file --- pseudocode.md | 16 +++++++++++++--- src/scrabble.js | 2 +- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/pseudocode.md b/pseudocode.md index b681ee6..1807717 100644 --- a/pseudocode.md +++ b/pseudocode.md @@ -3,13 +3,23 @@ #### Add the steps you need to take to implement the requirements for Scrabble Challenge ``` +- Steps for the core scrabble functionality + 1. Get the given word 2. Check if it's a valid word -3. Itterate through the word and summ the value of each letter +3. Create arrays of letters groupped according to the points they give + +4. Create a variable to sum the points of each character according to the letter + +5. Itterate through the word and check each character against the 'points' arrays. Add the value of each letter to the sum of points + +6. Return the sum of the points + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + +- Steps for the double/triple-value letters functionality -4. -...etc ``` diff --git a/src/scrabble.js b/src/scrabble.js index d9faf71..7e6ea30 100644 --- a/src/scrabble.js +++ b/src/scrabble.js @@ -60,6 +60,6 @@ function scrabble(word) { return points // `The word '${word}' gives you ${points} points!` } -console.log(scrabble('OXYPHENBUTAZONE')) +// console.log(scrabble('OXYPHENBUTAZONE')) module.exports = scrabble From 4e71aa599c3894b866cea24c13d0af8ecae6b1eb Mon Sep 17 00:00:00 2001 From: Periklis Date: Fri, 1 Mar 2024 01:52:41 +0200 Subject: [PATCH 4/4] Done Missing pseudocode --- pseudocode.md | 10 +- spec/extensions/scrabble.spec.js | 8 +- spec/scrabble.spec.js | 2 +- src/scrabble.js | 389 +++++++++++++++++++++++++++---- 4 files changed, 362 insertions(+), 47 deletions(-) diff --git a/pseudocode.md b/pseudocode.md index 1807717..830ee98 100644 --- a/pseudocode.md +++ b/pseudocode.md @@ -19,7 +19,15 @@ =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -- Steps for the double/triple-value letters functionality +- Steps for the double/triple-points letters functionality + +1. Decide how to implement this functionality. + +1. Check if the given word contains characters enclosed in {} or [] + +2. Apply points * 2 for letters in {} and points * 3 for letters in [] + + ``` diff --git a/spec/extensions/scrabble.spec.js b/spec/extensions/scrabble.spec.js index e414d39..0c35f62 100644 --- a/spec/extensions/scrabble.spec.js +++ b/spec/extensions/scrabble.spec.js @@ -2,8 +2,8 @@ const scrabble = require('../../src/scrabble') -describe("Scrabble", () => { - describe("letter multipliers", () => { +describe('Scrabble', () => { + describe('letter multipliers', () => { it('returns 6 for double letter o', () => { expect(scrabble('d{o}g')).toEqual(6) }) @@ -21,7 +21,7 @@ describe("Scrabble", () => { }) }) - describe("word multipliers", () => { + describe('word multipliers', () => { it('returns 10 for double letter o', () => { expect(scrabble('{dog}')).toEqual(10) }) @@ -38,7 +38,7 @@ describe("Scrabble", () => { }) }) - describe("edge cases", () => { + describe('edge cases', () => { it('returns 18 for letter and word multiplier', () => { expect(scrabble('{[d]og}')).toEqual(18) }) diff --git a/spec/scrabble.spec.js b/spec/scrabble.spec.js index e3eb3ed..67e0fe2 100644 --- a/spec/scrabble.spec.js +++ b/spec/scrabble.spec.js @@ -2,7 +2,7 @@ const scrabble = require('../src/scrabble') -describe("Scrabble", () => { +describe('Scrabble', () => { it('returns 0 for empty words', () => { expect(scrabble('')).toEqual(0) }) diff --git a/src/scrabble.js b/src/scrabble.js index 7e6ea30..f7e2aaf 100644 --- a/src/scrabble.js +++ b/src/scrabble.js @@ -1,46 +1,253 @@ -function scrabble(word) { - const onePoint = [ - 'A', - 'a', - 'E', - 'e', - 'I', - 'i', - 'O', - 'o', - 'U', - 'u', - 'L', - 'l', - 'N', - 'n', - 'R', - 'r', - 'S', - 's', - 'T', - 't' - ] - const twoPoints = ['D', 'd', 'G', 'g'] - const threePoints = ['B', 'C', 'M', 'P', 'b', 'c', 'm', 'p'] - const fourPoints = ['F', 'H', 'V', 'W', 'Y', 'f', 'h', 'v', 'w', 'y'] - const fivePoints = ['K', 'k'] - const eightPoints = ['J', 'X', 'j', 'x'] - const tenPoints = ['Q', 'Z', 'q', 'z'] - let points = 0 +const onePoint = [ + 'A', + 'a', + 'E', + 'e', + 'I', + 'i', + 'O', + 'o', + 'U', + 'u', + 'L', + 'l', + 'N', + 'n', + 'R', + 'r', + 'S', + 's', + 'T', + 't' +] +const twoPoints = ['D', 'd', 'G', 'g'] +const threePoints = ['B', 'C', 'M', 'P', 'b', 'c', 'm', 'p'] +const fourPoints = ['F', 'H', 'V', 'W', 'Y', 'f', 'h', 'v', 'w', 'y'] +const fivePoints = ['K', 'k'] +const eightPoints = ['J', 'X', 'j', 'x'] +const tenPoints = ['Q', 'Z', 'q', 'z'] +const invalidChars = [ + '!', + '@', + '#', + '$', + '%', + '^', + '&', + '*', + '(', + ')', + '_', + '+', + '-', + '=', + '1', + '2', + '3', + '4', + '5', + '6', + '7', + '8', + '9', + '0', + '`', + '~', + ';', + '/', + ',', + '.', + '?', + '<', + '|', + '>' +] + +const doubleWordChk = (str) => { + const doubleWordObj = { word_modifier: 1, valid: false } + + let tmpStr = '' + + for (let i = 0; i <= str.length - 1; i++) { + if (!['[', ']'].includes(str[i])) { + tmpStr += str[i] + } + } + const lastChar = tmpStr.charAt(tmpStr.length - 1) + const charBeforeLast = tmpStr.charAt(tmpStr.length - 2) + + if ( + tmpStr[0] === '{' && + tmpStr[2] !== '}' && + lastChar === '}' && + charBeforeLast !== '{' + ) { + doubleWordObj.word_modifier = 2 + doubleWordObj.valid = true + } + return doubleWordObj +} + +const tripleWordChk = (str) => { + const tripleWordObj = { word_modifier: 1, valid: false } + + let tmpStr = '' + + for (let i = 0; i <= str.length - 1; i++) { + if (!['{', '}'].includes(str[i])) { + tmpStr += str[i] + } + } + const lastChar = tmpStr.charAt(tmpStr.length - 1) + const charBeforeLast = tmpStr.charAt(tmpStr.length - 2) + if ( + tmpStr[0] === '[' && + tmpStr[2] !== ']' && + lastChar === ']' && + charBeforeLast !== '[' + ) { + tripleWordObj.word_modifier = 3 + tripleWordObj.valid = true + } + return tripleWordObj +} + +const doubleLettersChk = (str) => { + const doubleLettersObj = { charsToDouble: '', valid: false } + const doubleWord = doubleWordChk(str) + const tripleWord = tripleWordChk(str) + let count1 = 0 + let count2 = 0 + let strToCheck = str + let newStr = '' + + if (doubleWord.valid === true) { + strToCheck = str.slice(1, -1) + } + + if (doubleWord.valid === true && tripleWord.valid === true) { + strToCheck = str.slice(2, -2) + } + + for (let i = 0; i < strToCheck.length; i++) { + if (strToCheck[i] === '{') { + count1 += 1 + } + if (strToCheck[i + 2] === '}') { + count2 += 1 + // i -= 1 + newStr += strToCheck[i + 1] + } + } + + if (count1 === count2) { + doubleLettersObj.charsToDouble = newStr + doubleLettersObj.valid = true + } else { + doubleLettersObj.valid = false + } + + return doubleLettersObj +} + +const tripleLettersChk = (str) => { + const tripleLettersObj = { charsToTriple: '', valid: false } + const tripleWord = tripleWordChk(str) + const doubleWord = doubleWordChk(str) + let count1 = 0 + let count2 = 0 + let strToCheck = str + let newStr = '' + + if (tripleWord.valid) { + strToCheck = str.slice(1, -1) + } + + if (doubleWord.valid === true && tripleWord.valid === true) { + strToCheck = str.slice(2, -2) + } + + for (let i = 0; i < strToCheck.length; i++) { + if (strToCheck[i] === '[') { + count1 += 1 + } + if (strToCheck[i + 2] === ']') { + count2 += 1 + newStr += strToCheck[i + 1] + } + } + if (count1 === count2) { + tripleLettersObj.charsToTriple = newStr + tripleLettersObj.valid = true + } else { + tripleLettersObj.valid = false + } + return tripleLettersObj +} + +const checkForInvalidChars = (str) => { + for (let i = 0; i < str.length; i++) { + if (invalidChars.includes(str[i])) { + return true + } + } +} + +const validityChecks = (str) => { + const doubleLetters = doubleLettersChk(str) + const tripleLetters = tripleLettersChk(str) + const invalidChars = checkForInvalidChars(str) - // check if a valid word is given if ( - word === '' || - word === null || - word === ' \t\n' || - typeof word !== 'string' || - word === undefined + str === '' || + str === null || + str === ' \t\n' || + typeof str !== 'string' || + str === undefined || + invalidChars || + !doubleLetters.valid || + !tripleLetters.valid ) { - points = 0 - return 0 // `${word} is not a valid word. You get ${points} points` + return false + } else { + return true + } +} + +const calculateDoubleValueLetters = (str) => { + const calcDoubledLetters = { doubleLettersPoints: 0 } + const lettersToDouble = doubleLettersChk(str) + const timesTwo = lettersToDouble.charsToDouble + let points = 0 + + for (const i of timesTwo) { + if (onePoint.includes(i)) { + points += 1 + } else if (twoPoints.includes(i)) { + points += 2 + } else if (threePoints.includes(i)) { + points += 3 + } else if (fourPoints.includes(i)) { + points += 4 + } else if (fivePoints.includes(i)) { + points += 5 + } else if (eightPoints.includes(i)) { + points += 8 + } else if (tenPoints.includes(i)) { + points += 10 + } + calcDoubledLetters.doubleLettersPoints = points * 2 } - for (const i of word) { + return calcDoubledLetters +} + +const calculateTripleValueLetters = (str) => { + const tripledLettersResult = { tripleLettersPoints: 0 } + const lettersToTriple = tripleLettersChk(str) + const timesThree = lettersToTriple.charsToTriple + let points = 0 + + for (const i of timesThree) { if (onePoint.includes(i)) { points += 1 } else if (twoPoints.includes(i)) { @@ -56,10 +263,110 @@ function scrabble(word) { } else if (tenPoints.includes(i)) { points += 10 } + tripledLettersResult.tripleLettersPoints = points * 3 + } + return tripledLettersResult +} + +function removeDoubleLetterValues(str) { + const newWord = { newStr: '' } + const isDoubleWord = doubleWordChk(str) + const isTripleWord = tripleWordChk(str) + let newStr = str + + if (isDoubleWord.valid === true && isTripleWord.valid === true) { + newStr = str.slice(2, -2) + } + for (let i = 0; i < newStr.length; i++) { + if (newStr[i] === '{') { + newStr = newStr.slice(0, i) + newStr.slice(i + 3) + i -= 1 + } } - return points // `The word '${word}' gives you ${points} points!` + + newWord.newStr = newStr + + return newWord } +function removeTripleLetterValues(str) { + const newWord = { newStr: '' } + const isDoubleWord = doubleWordChk(str) + const isTripleWord = tripleWordChk(str) + let strToChk = str + + if (isDoubleWord.valid === true && isTripleWord.valid === true) { + strToChk = str.slice(2, -2) + } + + for (let i = 0; i < strToChk.length; i++) { + if (strToChk[i] === '[') { + strToChk = strToChk.slice(0, i) + strToChk.slice(i + 3) + i -= 1 + } + } + + newWord.newStr = strToChk + return newWord +} + +const scrabble = (str) => { + if (str === null) { + return 0 + } + const checkValidity = validityChecks(str) -// console.log(scrabble('OXYPHENBUTAZONE')) + const dlChk = doubleLettersChk(str) + const tlChk = tripleLettersChk(str) + const removeDoubles = removeDoubleLetterValues(str) + const removeTriples = removeTripleLetterValues(str) + const dwChk = doubleWordChk(str) + const twChk = tripleWordChk(str) + const cdl = calculateDoubleValueLetters(str) + const ctl = calculateTripleValueLetters(str) + + let points = 0 + if (!checkValidity) { + return 0 + } + + if (dlChk.charsToDouble.length > 0) { + points += cdl.doubleLettersPoints + str = removeDoubles.newStr + } + + if (tlChk.charsToTriple.length > 0) { + points += ctl.tripleLettersPoints + str = removeTriples.newStr + } + + for (const i of str) { + if (onePoint.includes(i)) { + points += 1 + } else if (twoPoints.includes(i)) { + points += 2 + } else if (threePoints.includes(i)) { + points += 3 + } else if (fourPoints.includes(i)) { + points += 4 + } else if (fivePoints.includes(i)) { + points += 5 + } else if (eightPoints.includes(i)) { + points += 8 + } else if (tenPoints.includes(i)) { + points += 10 + } + } + + if (dwChk.valid) { + points *= 2 + } + + if (twChk.valid) { + points *= 3 + } + + return points +} +// console.log(scrabble()) module.exports = scrabble