Angenommen, Sie haben eine Zeichenfolge wie die folgende:
abaabbbbbaabba
Zählen Sie, wie oft ein bestimmtes Zeichen in der Eingabezeichenfolge angezeigt wird, jedoch nur, wenn das Zeichen nur einmal hintereinander angezeigt wird . Zum Beispiel, wenn das Zeichen ist a,
abaabbbbbaabba
^ x x ^
Die Summe wäre 2 (die aawürde nicht zählen, weil die azweimal hintereinander erscheint).
Wie hängt das mit FizzBuzz zusammen?
Wenn das Zeichen 3-mal (oder ein Vielfaches von 3-mal) in einer Reihe oder 5-mal (oder ein Vielfaches von 5-mal) in einer Reihe vorkommt, wird der Zähler dekrementiert . Wenn es ein Vielfaches von 3 und 5 ist, wird der Zähler immer noch inkrementiert. Denken Sie daran, dass der Zähler ebenfalls erhöht wird, wenn das Zeichen nur einmal in einer Reihe vorkommt, und ignoriert wird, wenn das Zeichen mehrmals in einer Reihe vorkommt (außer in den oben beschriebenen Situationen).
Um es noch einmal zusammenzufassen a:
input counter (explanation)
a 1 (single occurence)
aaa -1(multiple of 3)
aaaaa -1(multiple of 5)
aaaaaaaaaaaaaaa 1 (multiple of 15)
aa 0 (none of the above)
aba 2 (two single instances)
aaba 1 (one single occurence(+1) and one double occurence(ignored))
aaaba 0 (one single occurence(+1) and one triple (-1)
aaaaaa -1 (six is a multiple of three)
Referenz (ungolfed) Implementierung in Java:
import java.util.Scanner;
import java.util.regex.*;
public class StrMatcher {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); //Scanner to get user input
int total = 0;//Running total of matches
System.out.println("Enter a string: ");
String strBeingSearched = sc.nextLine(); //String that will be searched
System.out.println("Enter string to match with: ");
String strBeingMatched = sc.nextLine(); //Substring used for searching
//Simple regex matcher
Pattern pattern = Pattern.compile("(" + strBeingMatched + ")+");
Matcher matcher = pattern.matcher(strBeingSearched);
while(matcher.find()){ //While there are still matches
int length = matcher.end() - matcher.start();
int numberOfTimes = length/strBeingMatched.length();//Calculate how many times in a row the string is matched
if((numberOfTimes == 1)||((numberOfTimes % 3 == 0) && (numberOfTimes % 5 == 0))){
total++; //Increment counter if single match or divisible by 15
} else if((numberOfTimes % 3 == 0)||(numberOfTimes % 5 == 0)) {
total--; //Decrement counter if divisible by 3 or 5 (but not 15)
}
strBeingSearched = strBeingSearched.substring(matcher.end());
matcher = pattern.matcher(strBeingSearched); //Replace string/matcher and repeat
}
System.out.println(total);
}
}
- Die zu durchsuchende Zeichenfolge kann beliebig lang sein, das Muster besteht jedoch nur aus einem einzelnen Zeichen.
- Keine der Zeichenfolgen enthält reguläre Sonderzeichen.
- Das ist Code-Golf ; kürzestes Programm in Bytes gewinnt.
- Keine Standardlücken.