-
Notifications
You must be signed in to change notification settings - Fork 131
Expand file tree
/
Copy pathScrabble.java
More file actions
115 lines (93 loc) · 3.28 KB
/
Scrabble.java
File metadata and controls
115 lines (93 loc) · 3.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package com.booleanuk;
import java.util.HashMap;
import java.util.Stack;
public class Scrabble {
private HashMap<Character, Integer> letterValues = new HashMap<>();
private String word;
public Scrabble(String word) {
this.word = word.toLowerCase().strip();
// add letter values
addLetters("aeioulnrst", 1);
addLetters("dg", 2);
addLetters("bcmp", 3);
addLetters("fhvwy", 4);
addLetters("k", 5);
addLetters("jx", 8);
addLetters("qz", 10);
}
public int score() {
int score = 0;
Stack<Character> openBrackets = new Stack<>();
if (!isValid())
return 0;
for (char letter : word.toCharArray()) {
// add open brackets to stack
if (letter == '{' || letter == '[') {
openBrackets.add(letter);
} else if (letter == '}' || letter == ']') {
openBrackets.pop();
}
// add letter score with multiplier
if (letterValues.containsKey(letter)) {
score += letterValues.get(letter) * calculateMultiplier(openBrackets);
}
}
return score;
}
private int calculateMultiplier(Stack<Character> openBrackets) {
int multiplier = 1;
for (Character c : openBrackets) {
if (c == '{')
multiplier *= 2;
else if (c == '[')
multiplier *= 3;
}
return multiplier;
}
private boolean isValid() {
Stack<Character> brackets = new Stack<>();
int totalLetters = 0;
int lettersInBrackets = 0;
for (Character c : word.toCharArray()) {
// check if invalid character
if (!letterValues.containsKey(c) && c != '{' && c != '}' && c != '[' && c != ']') {
return false;
}
// add open brackets to stack
if (c == '{' || c == '[') {
brackets.add(c);
}
// check for matching open bracket if this is a closing bracket
else if (c == '}' || c == ']') {
if (brackets.isEmpty())
return false;
// if found match, pop from stack
if ((c == '}' && brackets.peek() == '{') || (c == ']' && brackets.peek() == '[')) {
brackets.pop();
// return false if brackets contain more than one letter and is not a word multiplier
if (lettersInBrackets > 1 && lettersInBrackets < totalLetters)
return false;
totalLetters -= lettersInBrackets;
lettersInBrackets = 0;
} else {
return false;
}
} else {
// c is a letter
totalLetters += 1;
if (!brackets.isEmpty()) {
lettersInBrackets += 1;
}
}
}
// if open brackets were not closed
if (!brackets.isEmpty())
return false;
return true;
}
private void addLetters(String letters, int value) {
for (char letter : letters.toCharArray()) {
letterValues.put(letter, value);
}
}
}