Last active
August 8, 2018 13:24
-
-
Save zantetsuken88/2251ffe13bb0950601a32b5bccb05075 to your computer and use it in GitHub Desktop.
ScrabbleScore
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.HashMap; | |
import java.util.List; | |
class Scrabble { | |
private static final HashMap<Character, Integer> SCORE_MAP = new HashMap<Character, Integer>() {{ | |
put('a', 1); | |
put('b', 3); | |
put('c', 3); | |
put('d', 2); | |
put('e', 1); | |
put('f', 4); | |
put('g', 2); | |
put('h', 4); | |
put('i', 1); | |
put('j', 8); | |
put('k', 5); | |
put('l', 1); | |
put('m', 3); | |
put('n', 1); | |
put('o', 1); | |
put('p', 3); | |
put('q', 10); | |
put('r', 1); | |
put('s', 1); | |
put('t', 1); | |
put('u', 1); | |
put('v', 4); | |
put('w', 4); | |
put('x', 8); | |
put('y', 4); | |
put('z', 10); | |
}}; | |
public enum WordMultiplier { | |
SINGLE(1), | |
DOUBLE(2), | |
TRIPLE(3); | |
private final int multiplier; | |
WordMultiplier(int multiplier) { | |
this.multiplier = multiplier; | |
} | |
} | |
public enum LetterMultiplier { | |
SINGLE(1), | |
DOUBLE(2), | |
TRIPLE(3); | |
private final int letterMultiplier; | |
LetterMultiplier(int letterMultiplier) { | |
this.letterMultiplier = letterMultiplier; | |
} | |
} | |
private String word; | |
private WordMultiplier multiplier; | |
private List<LetterMultiplier> letterMultipliers; | |
Scrabble(String word) { | |
this(word, WordMultiplier.SINGLE); | |
} | |
Scrabble(String word, Scrabble.WordMultiplier multiplier) { | |
this.word = word; | |
this.multiplier = multiplier; | |
} | |
Scrabble(String word, Scrabble.WordMultiplier multiplier, List<LetterMultiplier> letterMultipliers) { | |
this.word = word; | |
this.multiplier = multiplier; | |
this.letterMultipliers = letterMultipliers; | |
} | |
int getScore() { | |
char[] wordChars = word.toLowerCase().toCharArray(); | |
int score = 0; | |
int i = 0; | |
for (char c : wordChars) { | |
if (letterMultipliers != null) { | |
score += SCORE_MAP.get(c) * letterMultipliers.get(i).letterMultiplier; | |
} else { | |
score += SCORE_MAP.get(c); | |
} | |
i++; | |
} | |
return score * multiplier.multiplier; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import org.junit.Test; | |
import java.util.Arrays; | |
import java.util.List; | |
import static org.junit.Assert.assertEquals; | |
public class ScrabbleScoreTest { | |
private Scrabble scrabble; | |
private Scrabble.LetterMultiplier one = Scrabble.LetterMultiplier.SINGLE; | |
private Scrabble.LetterMultiplier two = Scrabble.LetterMultiplier.DOUBLE; | |
private Scrabble.LetterMultiplier three = Scrabble.LetterMultiplier.TRIPLE; | |
@Test | |
public void testALowerCaseLetter() { | |
scrabble = new Scrabble("a"); | |
assertEquals(1, scrabble.getScore()); | |
} | |
@Test | |
public void testAUpperCaseLetter() { | |
scrabble = new Scrabble("A"); | |
assertEquals(1, scrabble.getScore()); | |
} | |
@Test | |
public void testAValuableLetter() { | |
scrabble = new Scrabble("f"); | |
assertEquals(4, scrabble.getScore()); | |
} | |
@Test | |
public void testAShortWord() { | |
scrabble = new Scrabble("at"); | |
assertEquals(2, scrabble.getScore()); | |
} | |
@Test | |
public void testAShortValuableWord() { | |
scrabble = new Scrabble("zoo"); | |
assertEquals(12, scrabble.getScore()); | |
} | |
@Test | |
public void testAMediumWord() { | |
scrabble = new Scrabble("street"); | |
assertEquals(6, scrabble.getScore()); | |
} | |
@Test | |
public void testAMediumValuableWord() { | |
scrabble = new Scrabble("quirky"); | |
assertEquals(22, scrabble.getScore()); | |
} | |
@Test | |
public void testALongMixCaseWord() { | |
scrabble = new Scrabble("OxyphenButazone"); | |
assertEquals(41, scrabble.getScore()); | |
} | |
@Test | |
public void testAEnglishLikeWord() { | |
scrabble = new Scrabble("pinata"); | |
assertEquals(8, scrabble.getScore()); | |
} | |
@Test | |
public void testAnEmptyInput() { | |
scrabble = new Scrabble(""); | |
assertEquals(0, scrabble.getScore()); | |
} | |
@Test | |
public void testEntireAlphabetAvailable() { | |
scrabble = new Scrabble("abcdefghijklmnopqrstuvwxyz"); | |
assertEquals(87, scrabble.getScore()); | |
} | |
@Test | |
public void testDoubleWord() { | |
scrabble = new Scrabble("abcdefghijklmnopqrstuvwxyz", Scrabble.WordMultiplier.DOUBLE); | |
assertEquals(174, scrabble.getScore()); | |
} | |
@Test | |
public void testTripleWord() { | |
scrabble = new Scrabble("abcdefghijklmnopqrstuvwxyz", Scrabble.WordMultiplier.TRIPLE); | |
assertEquals(261, scrabble.getScore()); | |
} | |
@Test | |
public void testDoubleLetters() { | |
List<Scrabble.LetterMultiplier> letterMultipliers = Arrays.asList(one, two, one, one, two, one); | |
scrabble = new Scrabble("double", Scrabble.WordMultiplier.DOUBLE, letterMultipliers); | |
assertEquals(22, scrabble.getScore()); | |
} | |
@Test | |
public void testTripleLetters() { | |
List<Scrabble.LetterMultiplier> letterMultipliers = Arrays.asList(one, two, one, one, three, one); | |
scrabble = new Scrabble("triple", Scrabble.WordMultiplier.SINGLE, letterMultipliers); | |
assertEquals(11, scrabble.getScore()); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment