You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

43 lines
1.3 KiB

4 years ago
  1. package de.edu.hsfulda.ccip.tdd.purefunction;
  2. import java.util.regex.Matcher;
  3. import java.util.regex.Pattern;
  4. public class BowlingCalculator {
  5. @FunctionalInterface
  6. interface FrameScorer {
  7. int score(Matcher frameMatcher);
  8. }
  9. private static final int INITIAL_SCORE = 0;
  10. private static final Pattern SINGLE_ROLL_PATTERN = Pattern.compile("\\d");
  11. private static final Pattern SPARE_PATTERN = Pattern.compile("(\\d)/ ([-\\d])");
  12. public int score(String rolls) {
  13. int score = INITIAL_SCORE;
  14. Matcher singleRollMatcher = SINGLE_ROLL_PATTERN.matcher(rolls);
  15. score = scoreFrameType(score, singleRollMatcher, matcher -> Integer.parseInt(singleRollMatcher.group()));
  16. Matcher spareMatcher = SPARE_PATTERN.matcher(rolls);
  17. score = scoreFrameType(score, spareMatcher, matcher -> scoreSpareFrame(spareMatcher));
  18. return score;
  19. }
  20. private int scoreSpareFrame(Matcher spareMatcher) {
  21. int frameScore = 10 - Integer.parseInt(spareMatcher.group(1));
  22. String nextRoll = spareMatcher.group(2);
  23. if(!"-".equalsIgnoreCase(nextRoll)) {
  24. frameScore += Integer.parseInt(spareMatcher.group(1));
  25. }
  26. return frameScore;
  27. }
  28. private int scoreFrameType(int score, Matcher scoreMatcher, FrameScorer frameScorer) {
  29. while (scoreMatcher.find()) {
  30. score += frameScorer.score(scoreMatcher);
  31. }
  32. return score;
  33. }
  34. }