Bunun gibi bir dize olduğunu söyleyin:
abaabbbbbaabba
Girilen dizgede belirtilen bir karakterin görünme sayısını, ancak karakter bir satırda yalnızca bir kez göründüğünde sayın . Örneğin, karakter a
,
abaabbbbbaabba
^ x x ^
Toplam 2 olur ( aa
çünkü a
bir satırda iki kez belirir).
Bunun FizzBuzz ile ilişkisi nedir?
Karakter, üst üste 3 (veya 3 katı) veya üst üste 5 (veya 5 katı) gösterirse, sayaç yerine düşürülür . Hem 3'ün katları ise ve 5 kez, sayaç hala artırılır. Karakterin bir satırda yalnızca bir kez görünmesi durumunda sayacın da arttırıldığını ve karakterin bir satırda başka bir sayıda görünmesi durumunda göz ardı edildiğini unutmayın (yukarıda açıklanan durumlar dışında).
Özetlemek gerekirse, maça dize ise 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)
Java'da referans (topraksız) uygulama:
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);
}
}
- Aranacak dize herhangi bir uzunlukta olabilir, ancak desen yalnızca tek bir karakter olacaktır.
- Her iki dizede de regex özel karakterleri olmaz.
- Bu kod golf ; bayt cinsinden en kısa program kazanır.
- Standart boşluklar yok.