Bu görevde, normal bir ifadeyi okuyan ve bir giriş dizesinin bu normal ifade tarafından kabul edilip edilmediğini çıkaran başka bir program oluşturan bir program yazmanız gerekir. Çıktı, başvurunuzla aynı dilde yazılmış bir program olmalıdır.
Giriş
Girdi, aşağıdaki ABNF ile eşleşen normal bir ifade r'dir (ilk üretim kuralı şöyledir REGEX
):
REGEX = *( STAR / GROUP / LITERAL / ALTERNATIVE )
STAR = REGEX '*'
GROUP = '(' REGEX ')'
LITERAL = ALPHA / DIGIT
ALTERNATIVE = REGEX '|' REGEX
Giriş bu dilbilgisi ile eşleşmiyorsa, programınızın davranışı tanımlanmamıştır.
yorumlama
Girişi düzenli bir ifade olarak yorumlayın, burada *
Kleene-yıldızı (yani sol argümanı sıfır veya daha fazla kez tekrarlayın ), |
bir alternatiftir (
ve )
gruptur ve hiçbir operatör birleştirilmez. Gruplama yıldızdan önce, yıldız birleştirme yerine, birleştirme ise alternatiften önceliklidir.
Normal ifadenin tüm dizeyle eşleşmesi durumunda bir dizenin kabul edildiği söylenir .
Çıktı
Programın çıkış bir dize okur Gönderiminizde aynı dilde yazılmış bir başka programdır ın zamanında bir uygulama tanımlı bir şekilde, ister çıkışlar r kabul s sonra ve sona erer. Çıktı, kullanıcı tanımlı bir şekilde yapılabilir, ancak kabul edilen ve reddedilen programlar için yalnızca iki ayrı çıktı olmalıdır.
Çıktı programınızın girişinin asla 2 16 -1 Bayttan uzun olmadığını varsayabilirsiniz .
Kısıtlamalar
Ne gönderiminiz ne de gönderiminiz tarafından oluşturulan herhangi bir program yerleşik işlevleri veya kütüphaneleri kullanamaz.
- normal ifadelerle eşleş
- düzenli ifadeleri dönüştürmek
- düzenli ifadeleri derler
- dilbilgisinden ayrıştırıcılar oluşturmak
- problemi gönderiminiz önemsiz olacak şekilde basitleştirin
puanlama
Gönderdiğiniz puan, karakter sayısıdır. En düşük puana sahip sunum kazanır.
testcases
Tüm test senaryoları, düzenli bir ifade, bir dizi kabul edilen dizeler, bir dizi reddedilen diziler ve C99'da (hiptothetik) C99 gönderiminin geçerli bir çıktısı olan bir örnek program içerir.
(boş normal ifade)
Kabul edilen dizeler
- (boş giriş)
Reddedilen dizeler
- foo
- bar
- baz
- quux
Örnek program
#include <stdio.h>
int main() {
char input[65536];
gets(input);
return input[0] != 0;
}
(b|)(ab)*(a|)
( a
ve b
dönüşümlü olarak)
kabul edilen dizeler
a
ba
abababababa
abab
reddedilen dizeler
afba
foo
babba
örnek program
#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)
(ikili kayan nokta sayıları)
kabul edilen dizeler
- 10110100
- 0
- 1A00001
reddedilen dizeler
- 011
- 10 A
- 1A00
- 100A010
return (regex.match(stdin) is not null)
yasak olduğunu düşünüyorum.