พูดว่าคุณมีสตริงเช่นนี้:
abaabbbbbaabba
นับจำนวนครั้งที่อักขระที่ระบุปรากฏในสายป้อน แต่ถ้าตัวอักษรที่ปรากฏขึ้นเพียงครั้งเดียวในแถว ตัวอย่างเช่นถ้าตัวอักษรเป็นa
,
abaabbbbbaabba
^ x x ^
ผลรวมจะเท่ากับ 2 ( aa
จะไม่นับเพราะa
จะปรากฏสองครั้งติดต่อกัน)
สิ่งนี้เกี่ยวข้องกับ FizzBuzz อย่างไร
หากอักขระปรากฏขึ้น 3 ครั้งหรือหลายครั้งในแถวหรือ 5 (หรือหลายครั้ง) ในแถวตัวนับจะลดลงแทน ถ้ามันเป็นผลคูณของทั้ง 3 และ 5 ครั้งตัวนับจะยังคงเพิ่มขึ้น โปรดจำไว้ว่าตัวนับจะเพิ่มขึ้นเช่นกันหากอักขระปรากฏขึ้นเพียงครั้งเดียวในแถวเดียวและจะถูกละเว้นหากอักขระนั้นปรากฏเป็นจำนวนครั้งอื่น ๆ ในแถว (นอกเหนือจากสถานการณ์ที่อธิบายข้างต้น)
สรุปถ้าสตริงเพื่อการแข่งขันคือ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)
การอ้างอิง (ungolfed) การใช้งานใน 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);
}
}
- สตริงที่จะค้นหาสามารถมีความยาวได้ แต่รูปแบบจะเป็นอักขระเดียวเท่านั้น
- สตริงจะไม่มีอักขระพิเศษ regex
- นี่คือรหัสกอล์ฟ ; โปรแกรมที่สั้นที่สุดเป็นไบต์ชนะ
- ไม่มีช่องโหว่มาตรฐาน