From cd2a883bfb689a744231e59be33c7fa7b7a1cc7b Mon Sep 17 00:00:00 2001 From: Marcus Ikdal Date: Wed, 8 Jan 2025 15:08:41 +0100 Subject: [PATCH 1/3] one error for nested loops --- src/main/java/com/booleanuk/Scrabble.java | 107 +++++++++++++++++++++- 1 file changed, 105 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/booleanuk/Scrabble.java b/src/main/java/com/booleanuk/Scrabble.java index 88108a8..9562a51 100644 --- a/src/main/java/com/booleanuk/Scrabble.java +++ b/src/main/java/com/booleanuk/Scrabble.java @@ -1,12 +1,115 @@ package com.booleanuk; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Stack; + public class Scrabble { - public Scrabble(String word) { + private HashMap 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() { - return -1; + int score = 0; + Stack 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 openBrackets) { + int multiplier = 1; + for (Character c : openBrackets) { + if (c == '{') + multiplier *= 2; + else if (c == '[') + multiplier *= 3; + } + + return multiplier; + } + + private boolean isValid() { + Stack 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 (if not the whole word) + if (lettersInBrackets > 1 && lettersInBrackets < totalLetters) + return false; + + 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); + } } } From f48c94e8e44cff304ac63f19275494d97c931edd Mon Sep 17 00:00:00 2001 From: Marcus Ikdal Date: Wed, 8 Jan 2025 15:14:05 +0100 Subject: [PATCH 2/3] completed --- src/main/java/com/booleanuk/Scrabble.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/booleanuk/Scrabble.java b/src/main/java/com/booleanuk/Scrabble.java index 9562a51..c5b3cdf 100644 --- a/src/main/java/com/booleanuk/Scrabble.java +++ b/src/main/java/com/booleanuk/Scrabble.java @@ -85,6 +85,7 @@ else if (c == '}' || c == ']') { if (lettersInBrackets > 1 && lettersInBrackets < totalLetters) return false; + totalLetters -= lettersInBrackets; lettersInBrackets = 0; } else { return false; From 47f2cdd8da69439bfc6b187b34a917abc66fd336 Mon Sep 17 00:00:00 2001 From: Marcus Ikdal Date: Wed, 8 Jan 2025 15:41:23 +0100 Subject: [PATCH 3/3] small refactor --- src/main/java/com/booleanuk/Scrabble.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/booleanuk/Scrabble.java b/src/main/java/com/booleanuk/Scrabble.java index c5b3cdf..2ea38ec 100644 --- a/src/main/java/com/booleanuk/Scrabble.java +++ b/src/main/java/com/booleanuk/Scrabble.java @@ -1,6 +1,5 @@ package com.booleanuk; -import java.util.ArrayList; import java.util.HashMap; import java.util.Stack; @@ -81,7 +80,7 @@ else if (c == '}' || c == ']') { if ((c == '}' && brackets.peek() == '{') || (c == ']' && brackets.peek() == '[')) { brackets.pop(); - // return false if brackets contain more than one letter (if not the whole word) + // return false if brackets contain more than one letter and is not a word multiplier if (lettersInBrackets > 1 && lettersInBrackets < totalLetters) return false;