Disons que vous avez une chaîne comme celle-ci:
abaabbbbbaabba
Comptez le nombre de fois qu'un caractère spécifié apparaît dans la chaîne d'entrée, mais uniquement si le caractère n'apparaît qu'une seule fois de suite . Par exemple, si le caractère est a
,
abaabbbbbaabba
^ x x ^
Le total serait de 2 (le aa
ne compterait pas car le a
apparaît deux fois de suite).
Quel est le lien avec FizzBuzz?
Si le caractère apparaît 3 (ou un multiple de 3) fois de suite, ou 5 (ou un multiple de 5) fois de suite, le compteur est décrémenté à la place. S'il s'agit d'un multiple de 3 et 5 fois, le compteur est toujours incrémenté. N'oubliez pas que le compteur est également incrémenté si le caractère n'apparaît qu'une seule fois de suite et il est ignoré si le caractère apparaît un autre nombre de fois de suite (en plus des situations décrites ci-dessus).
Pour récapituler, si la chaîne à faire correspondre est 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)
Implémentation de référence (non golfée) en 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);
}
}
- La chaîne qui sera recherchée peut être de n'importe quelle longueur, mais le motif ne sera qu'un seul caractère.
- Aucune des deux chaînes n'aura de caractères spéciaux regex.
- C'est du golf de code ; le programme le plus court en octets gagne.
- Pas de failles standard.