ในภารกิจนี้คุณต้องเขียนโปรแกรมที่อ่านนิพจน์ปกติและสร้างโปรแกรมอื่นที่แสดงว่านิพจน์ปกตินั้นยอมรับอินพุตหรือไม่ ผลลัพธ์จะต้องเป็นโปรแกรมที่เขียนด้วยภาษาเดียวกันกับที่คุณส่ง
อินพุต
อินพุตคือการแสดงออกปกติRจับคู่ ABNF ดังต่อไปนี้ (กฎการผลิตเริ่มต้นREGEX
):
REGEX = *( STAR / GROUP / LITERAL / ALTERNATIVE )
STAR = REGEX '*'
GROUP = '(' REGEX ')'
LITERAL = ALPHA / DIGIT
ALTERNATIVE = REGEX '|' REGEX
หากอินพุตไม่ตรงกับไวยากรณ์นี้พฤติกรรมของโปรแกรมของคุณจะไม่ได้กำหนด
การตีความ
ป้อนข้อมูลเป็นนิพจน์ปกติโดยที่*
Kleene-star (หมายถึงอาร์กิวเมนต์ซ้ายซ้ำแล้วซ้ำอีกเป็นศูนย์หรือมากกว่านั้น ) |
เป็นอีกทางเลือกหนึ่ง(
และ)
จัดกลุ่มและไม่มีตัวดำเนินการใด ๆ ที่ต่อกัน การจัดกลุ่มจะมีความสำคัญเหนือกว่าดาวฤกษ์จะมีความสำคัญเหนือกว่าการต่อเรียงและการเรียงต่อกันจะมีความสำคัญมากกว่าทางเลือก
สตริงมีการกล่าวถึงว่าเป็นที่ยอมรับถ้า regex ตรงกับสตริงทั้งหมด
เอาท์พุต
เอาท์พุทของโปรแกรมคือโปรแกรมอื่นที่เขียนในภาษาเดียวกับการส่งของคุณที่อ่านสตริงsในวิธีการดำเนินงานที่กำหนดไว้ที่รันไทม์ผลไม่ว่าจะเป็นอาร์ยอมรับsและยุติแล้ว เอาต์พุตอาจทำได้ในลักษณะที่ผู้ใช้กำหนดแม้ว่าจะต้องมีเอาต์พุตที่แตกต่างกันเพียงสองตัวสำหรับโปรแกรมที่ยอมรับและถูกปฏิเสธ
คุณอาจสมมติว่าอินพุตของโปรแกรมเอาต์พุตของคุณไม่เกิน 2 16 -1 Bytes
ข้อ จำกัด
ทั้งการส่งของคุณหรือโปรแกรมใด ๆ ที่สร้างขึ้นโดยการส่งของคุณอาจใช้ฟังก์ชันการทำงานในตัวหรือไลบรารีที่
- จับคู่ regexes
- แปลงการแสดงออกปกติ
- รวบรวมการแสดงออกปกติ
- สร้างตัวแยกวิเคราะห์จากไวยากรณ์
- ลดความซับซ้อนของปัญหาในวิธีที่การส่งของคุณกลายเป็นเรื่องไม่สำคัญ
เกณฑ์การให้คะแนน
คะแนนการส่งของคุณคือจำนวนตัวอักษร การส่งที่มีคะแนนต่ำสุดชนะ
Testcases
ชุดทดสอบทั้งหมดประกอบด้วยนิพจน์ทั่วไปชุดของสตริงที่ยอมรับชุดของสตริงที่ถูกปฏิเสธและโปรแกรมตัวอย่างใน C99 ซึ่งเป็นเอาต์พุตที่ถูกต้องของการส่ง C99 (แบบ Hyptothetical)
(ว่างเปล่านิพจน์ปกติ)
สตริงที่ยอมรับ
- (อินพุตว่าง)
สตริงที่ถูกปฏิเสธ
- foo
- บาร์
- baz
- quux
โปรแกรมตัวอย่าง
#include <stdio.h>
int main() {
char input[65536];
gets(input);
return input[0] != 0;
}
(b|)(ab)*(a|)
( a
และb
สลับ)
สตริงที่ยอมรับ
a
ba
abababababa
abab
ปฏิเสธสตริง
afba
foo
babba
โปรแกรมตัวอย่าง
#include <stdio.h>
int main() {
char input[65536];
int state = 0;
for (;;) switch (state) {
case 0: switch (getchar()) {
case 'a': state = 1; break;
case 'b': state = 2; break;
case EOF: return 0;
default: return 1;
} break;
case 1: switch (getchar()) {
case 'b': state = 2; break;
case EOF: return 0;
default: return 1;
} break;
case 2: switch (getchar()) {
case 'a': state = 1; break;
case EOF: return 0;
default: return 1;
} break;
}
(0|1(0|1)*)(|A(0|1)*1)
(ตัวเลขทศนิยมเลขฐานสอง)
สตริงที่ยอมรับ
- 10110100
- 0
- 1A00001
ปฏิเสธสตริง
- 011
- 10A
- 1A00
- 100A010
return (regex.match(stdin) is not null)
นี้ไม่ได้รับอนุญาต