Dalam tugas ini Anda harus menulis sebuah program yang membaca ekspresi reguler dan menghasilkan program lain yang menampilkan apakah string input diterima oleh ekspresi reguler itu. Outputnya harus berupa program yang ditulis dalam bahasa yang sama dengan kiriman Anda.
Memasukkan
Input adalah ekspresi reguler r cocok dengan ABNF berikut (aturan produksi awal adalah REGEX
):
REGEX = *( STAR / GROUP / LITERAL / ALTERNATIVE )
STAR = REGEX '*'
GROUP = '(' REGEX ')'
LITERAL = ALPHA / DIGIT
ALTERNATIVE = REGEX '|' REGEX
Jika input tidak cocok dengan tata bahasa ini, perilaku program Anda tidak ditentukan.
Penafsiran
Menafsirkan input sebagai ekspresi reguler, di mana bintang *
-Kleene (artinya mengulangi argumen kiri nol kali atau lebih ), |
merupakan alternatif, (
dan )
grup dan tidak ada operator yang digabungkan. Pengelompokan lebih diutamakan daripada bintang, bintang lebih diutamakan daripada penggabungan, penggabungan lebih diutamakan daripada alternatif.
Suatu string dikatakan diterima jika regex cocok dengan keseluruhan string.
Keluaran
Output program ini adalah program lain yang ditulis dalam bahasa yang sama seperti kiriman Anda yang membaca string s dengan cara implementasi didefinisikan pada saat runtime, output apakah r menerima s dan kemudian berakhir. Output dapat dilakukan dengan cara yang ditentukan pengguna meskipun harus ada hanya dua output yang berbeda untuk program yang diterima dan ditolak.
Anda dapat mengasumsikan bahwa input dari program output Anda tidak pernah lebih dari 2 16 -1 Bytes.
Batasan
Baik kiriman Anda maupun program apa pun yang dihasilkan oleh kiriman Anda tidak dapat menggunakan fungsionalitas bawaan atau pustaka itu
- mencocokkan regex
- mengubah ekspresi reguler
- kompilasi ekspresi reguler
- menghasilkan parser dari tata bahasa
- sederhanakan masalahnya dengan cara agar pengiriman Anda menjadi sepele
Mencetak gol
Skor kiriman Anda adalah jumlah karakternya. Pengajuan dengan skor terendah akan menang.
Testcases
Semua testcases berisi ekspresi reguler, satu set string yang diterima, satu set string yang ditolak dan contoh program di C99 yang merupakan output yang valid dari pengiriman C99 (hyptothetical) C99.
(ekspresi reguler kosong)
String yang diterima
- (input kosong)
String yang ditolak
- foo
- batang
- baz
- quux
Contoh program
#include <stdio.h>
int main() {
char input[65536];
gets(input);
return input[0] != 0;
}
(b|)(ab)*(a|)
( a
dan b
berganti - ganti)
string yang diterima
a
ba
abababababa
abab
string yang ditolak
afba
foo
babba
contoh 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)
(angka titik mengambang biner)
string yang diterima
- 10110100
- 0
- 1A00001
string yang ditolak
- 011
- 10A
- 1A00
- 100A010
return (regex.match(stdin) is not null)
tidak diperbolehkan.