From aac9d22c982b2636bcd30e0bef2cb4342a0de9d7 Mon Sep 17 00:00:00 2001 From: Jocelyn Gonzalez Date: Wed, 15 Nov 2017 19:16:46 -0800 Subject: [PATCH 1/3] added functionality for score and highestScoreFrom. --- spec/scrabble_spec.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spec/scrabble_spec.js b/spec/scrabble_spec.js index c195a03..c441822 100644 --- a/spec/scrabble_spec.js +++ b/spec/scrabble_spec.js @@ -1,3 +1,5 @@ +/* eslint-disable */ + const Scrabble = require('../scrabble'); describe('score', function() { @@ -97,7 +99,7 @@ describe('highestScoreFrom', function() { }); }); -describe('Player', function() { +xdescribe('Player', function() { it ('is defined', function() { expect(Scrabble.Player).toBeDefined(); }); From 2eb8394cee410b2f021c5e5aa802074036379f13 Mon Sep 17 00:00:00 2001 From: Jocelyn Gonzalez Date: Wed, 15 Nov 2017 23:01:29 -0800 Subject: [PATCH 2/3] tests pass --- spec/scrabble_spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/scrabble_spec.js b/spec/scrabble_spec.js index c441822..4f0eb03 100644 --- a/spec/scrabble_spec.js +++ b/spec/scrabble_spec.js @@ -99,7 +99,7 @@ describe('highestScoreFrom', function() { }); }); -xdescribe('Player', function() { +describe('Player', function() { it ('is defined', function() { expect(Scrabble.Player).toBeDefined(); }); From f3208c5f0362c98e660f2eae2274bbda0dcad97f Mon Sep 17 00:00:00 2001 From: Jocelyn Gonzalez Date: Sun, 26 Nov 2017 18:12:18 -0800 Subject: [PATCH 3/3] ooooooops --- package-lock.json | 123 ++++++++++++++++++++++++++++++++++++ scrabble.js | 154 ++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 272 insertions(+), 5 deletions(-) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..80043d7 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,123 @@ +{ + "name": "js-scrabble", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "add-matchers": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/add-matchers/-/add-matchers-0.5.0.tgz", + "integrity": "sha1-UCGQ5HUM1XIWGDkyaLYaFXNm52U=" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "eslint-plugin-jasmine": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jasmine/-/eslint-plugin-jasmine-2.9.1.tgz", + "integrity": "sha1-IuGaWfFvOl9kOgSroEQ40OMEcDA=" + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "jasmine": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", + "requires": { + "exit": "0.1.2", + "glob": "7.1.2", + "jasmine-core": "2.8.0" + } + }, + "jasmine-core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=" + }, + "jasmine-expect": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/jasmine-expect/-/jasmine-expect-3.8.1.tgz", + "integrity": "sha512-klARdR5AVX9nZhHhYDlbDYgxgi6kl9DGS0vguhaioKoSwr8HL1uOQ7FFUBASq/sqBL/s2nkh/1efqZ2ugcknFA==", + "requires": { + "add-matchers": "0.5.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.8" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + } + } +} diff --git a/scrabble.js b/scrabble.js index 7a1f161..22c0828 100644 --- a/scrabble.js +++ b/scrabble.js @@ -1,14 +1,158 @@ + + const Scrabble = { score: function(word) { - // TODO: implement score - } + let validatedWord = validated(word); + let value = 0; + if (validatedWord.length === 7) { + value = 50; + } + const letterArray = validatedWord.split(''); + for (letter of letterArray){ + switch (letter) { + case 'a': + case 'e': + case 'i': + case 'o': + case 'u': + case 'l': + case 'n': + case 'r': + case 's': + case 't': + value += 1; + break; + case 'd': + case 'g': + value += 2; + break; + case 'b': + case 'c': + case 'm': + case 'p': + value += 3; + break; + case 'f': + case 'h': + case 'v': + case 'w': + case 'y': + value += 4; + break; + case 'k': + value += 5; + break; + case 'j': + case 'x': + value += 8; + break; + case 'q': + case 'z': + value += 10; + break; + default: + throw 'invalid characters in word string'; + } //end switch statement + }; //end loop over letter array + return value; + }, // ends score function - // TODO: add the highestScoreFrom method -}; + highestScoreFrom: function(arrayOfWords) { + if (Array.isArray(arrayOfWords) === false || arrayOfWords.length === 0) { + throw new Error("problem with array"); + } + if (arrayOfWords.length === 1){ + return arrayOfWords[0]; + } + const pairs = []; + arrayOfWords.forEach(word => { + pairs[word] = this.score(word); + }); + maxVal = Math.max(...(Object.values(pairs))) + let maxKeys = []; + Object.keys(pairs).find(key => { + if(pairs[key] === maxVal){ + maxKeys.push(key); + } + }); + for (let key of maxKeys) { + if (maxKeys.length == 1) { + return maxKeys[0]; + } else if (key.length == 7) { + return key; + } + } + return maxKeys.reduce((a, b) => a.length <= b.length ? a : b); + } +} Scrabble.Player = class { - // TODO: implement the Player class + constructor(name) { + if (name === undefined) { + throw new Error('no name'); + } + this.name = name; + this.plays = []; + } + + play(word) { + if (this.hasWon()) { + return false; + } else { + if (validated(word)) { + this.plays.push(word); + return true; + } + } + } + + totalScore() { + if (this.plays.length === 0){ + return 0; + } else { + let totalScore = 0; + for (let playedWord of this.plays) { + totalScore += Scrabble.score(playedWord); + } + return totalScore; + } + } + + hasWon() { + if (this.totalScore() > 99) { + return true; + } else { + return false + } + } + + highestWordScore() { + if (this.plays.length == 0) { + throw new Error("no played words"); + } else { + let numHash = {}; + this.plays.forEach(function(word){ + numHash[word] = Scrabble.score(word) + }); + return Math.max(...(Object.values(numHash))); + } + } + + highestScoringWord() { + return Scrabble.highestScoreFrom(this.plays); + } }; +const validated = function validated(word){ + const check = word.toLowerCase(); + if (check.match(/^[a-zA-Z]+$/) === null) { + throw new Error("invalid word"); + } + if (check.length > 7) { + throw new Error("more than 7 letters"); + } + return check; +} + module.exports = Scrabble;