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

package de.edu.hsfulda.ccip.tdd.purefunction;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class BowlingCalculator {
@FunctionalInterface
interface FrameScorer {
int score(Matcher frameMatcher);
}
private static final int INITIAL_SCORE = 0;
private static final Pattern SINGLE_ROLL_PATTERN = Pattern.compile("\\d");
private static final Pattern SPARE_PATTERN = Pattern.compile("(\\d)/ ([-\\d])");
public int score(String rolls) {
int score = INITIAL_SCORE;
Matcher singleRollMatcher = SINGLE_ROLL_PATTERN.matcher(rolls);
score = scoreFrameType(score, singleRollMatcher, matcher -> Integer.parseInt(singleRollMatcher.group()));
Matcher spareMatcher = SPARE_PATTERN.matcher(rolls);
score = scoreFrameType(score, spareMatcher, matcher -> scoreSpareFrame(spareMatcher));
return score;
}
private int scoreSpareFrame(Matcher spareMatcher) {
int frameScore = 10 - Integer.parseInt(spareMatcher.group(1));
String nextRoll = spareMatcher.group(2);
if(!"-".equalsIgnoreCase(nextRoll)) {
frameScore += Integer.parseInt(spareMatcher.group(1));
}
return frameScore;
}
private int scoreFrameType(int score, Matcher scoreMatcher, FrameScorer frameScorer) {
while (scoreMatcher.find()) {
score += frameScorer.score(scoreMatcher);
}
return score;
}
}