Sebuah robot yang terbatas nondeterministic adalah mesin negara yang terbatas di mana tuple dipetakan ke beberapa negara. Yaitu. kita ganti biasa δ : Q × Σ → Q fungsi transisi dari DFA dengan fungsi lain Δ : Q × Σ → P ( Q ) .
Jika Anda tahu apa itu NFA, Anda mungkin ingin melewatkan bagian selanjutnya.
Definisi Resmi
NFA dijelaskan secara unik oleh
- satu set terbatas negara
- seperangkat simbol yang terbatas
- fungsi transisi
- keadaan awal
- seperangkat keadaan akhir
Mesin dimulai pada dan membaca string simbol hingga w ∈ Σ ∗ , untuk setiap simbol secara simultan akan menerapkan fungsi fungsi transisi dengan status saat ini dan menambahkan setiap set status baru ke set status saat ini.
Tantangan
Untuk tantangan ini kita akan mengabaikan untuk menyederhanakan itu, selanjutnya alfabet akan selalu menjadi (huruf kecil) huruf a untuk z dan set negara akan { 0 ... N } untuk beberapa non-negatif bilangan bulat N . Keadaan awal akan selalu 0 .
Diberi kata dan deskripsi NFA, tugas Anda adalah menentukan semua status akhir.
Contoh
Pertimbangkan string dan deskripsi berikut:
state, symbol, new-states
0, 'a', [1]
1, 'a', [0]
1, 'b', [1,2]
Mesin akan mulai pada :
- baca sebuah : status baru { 1 }
- membaca : negara-negara baru { 1 , 2 }
- baca : status baru { 0 }
- baca : status baru { 1 }
- membaca : negara-negara baru { 1 , 2 }
Jadi status akhir dan dengan demikian outputnya adalah .
Catatan: Pada langkah (2) transisi status peta ke ∅ karena deskripsi hanya menyertakan transisi ke set yang tidak kosong.
Aturan
Input akan terdiri dari string dan semacam deskripsi NFA (tanpa -transisi):
- string input akan selalu menjadi elemen
- input yang valid (tidak terbatas pada):
- daftar / array tupel / daftar
- input baris baru yang dipisahkan
- deskripsi NFA hanya akan berisi transisi dengan set yang tidak kosong sebagai hasilnya
- Anda dapat menyingkat aturan dengan karakter yang sama jika hasilnya sama (mis. aturan
0,'a',[1,2]
dan0,'b',[1,2]
dapat disingkat0,"ab",[1,2]
- Anda dapat mengambil setiap aturan secara terpisah (mis. aturan
0,'a',[1,2]
dapat0,'a',[1]
dan0,'a',[2]
)
- Anda dapat menyingkat aturan dengan karakter yang sama jika hasilnya sama (mis. aturan
- Anda dapat memilih huruf besar jika Anda mau
- Anda dapat mengambil jumlah status sebagai input
- Anda dapat mengasumsikan semacam pemesanan input (mis. dipesan oleh negara atau simbol)
Output akan berupa daftar / set / output baris baru dll. Dari status akhir
- pesanan tidak masalah
- tidak ada duplikat (karena set)
Uji kasus
Contoh-contoh ini akan berada dalam format di description word -> states
mana description
ada daftar tupel (state,symbol,new-states)
:
[] "x" -> []
[] "" -> [0]
[(0,'a',[1]),(1,'a',[0]),(1,'b',[1,2])] "abaab" -> [1,2]
[(0,'a',[1]),(1,'a',[0]),(1,'b',[1,2])] "abc" -> []
[(0,'p',[0,1]),(0,'g',[2]),(1,'c',[1]),(1,'g',[4]),(1,'p',[2]),(2,'c',[0])] "ppcg" -> [2,4]
[(0,'f',[1]),(1,'o',[1,2]),(2,'b',[3]),(3,'a',[4]),(4,'r',[0,4])] "foobar" -> [0,4]
[(0,'f',[1]),(1,'o',[1,2]),(2,'b',[3]),(3,'a',[4]),(4,'r',[0,4])] "fooooooobar" -> [0,4]
[(0,'f',[1]),(1,'o',[1,2]),(2,'b',[3]),(3,'a',[4]),(4,'r',[0,4])] "fobarfo" -> [1,2]
[(0,'f',[1]),(1,'o',[1,2]),(2,'b',[3]),(3,'a',[4]),(4,'r',[0,4])] "foobarrf" -> [1]
[(0,'d',[1,2]),(1,'u',[2]),(2,'u',[2,3]),(2,'p',[3]),(3,'p',[3])] "dup" -> [3]
[(0,'a',[0,2]),(0,'b',[3]),(1,'a',[1]),(1,'b',[1]),(2,'b',[1,4]),(4,'b',[2])] "aab" -> [3,1,4]
[(0,'a',[0,2]),(0,'b',[3]),(1,'a',[1]),(1,'b',[1]),(2,'b',[1,4]),(4,'b',[2])] "abb" -> [1,2]
Jawaban:
Haskell , 66 byte
Cobalah online!
sumber
nub
jika Anda menganggap negara bagian itu[Int]
, maka Anda dapat menggunakan masing-masing cek[0..]
yang terbatas: 60 byteInt
s dan lebih semua negara saat ini dan karena itu masih menghasilkan duplikat negara. Contoh (diubah[0..]
menjadi[0..3]
untuk tujuan pengujian, tetapi ini seharusnya tidak membuat perbedaan, bukan?)Brachylog , 42 byte
masukan sebagai [string, nfa] di mana nfa adalah daftar transisi status [keadaan awal, huruf, status baru sebagai daftar]
Penjelasan
Cobalah online!
sumber
Brachylog v2, 31 byte
Cobalah online! ( atau dengan contoh yang lebih kompleks )
Brachylog sangat bagus dalam masalah semacam ini, dan sangat buruk pada masalah yang membutuhkan dua input dan output terpisah. Hampir semua program ini hanya plumbing.
Format input adalah daftar yang berisi dua elemen: yang pertama adalah daftar transisi keadaan (
[oldState, symbol, newState]
), dan yang kedua adalah daftar simbol. Saya awalnya merencanakan program ini untuk bekerja dengan kode karakter untuk simbol (karena penanganan string Brachylog kadang-kadang bisa agak aneh), tetapi ternyata karakter berfungsi juga (walaupun Anda harus menulis string input sebagai daftar karakter, bukan sebagai Sebuah benang). Jika pasangan simbol-negara dapat bertransisi ke beberapa negara yang berbeda, Anda menulis beberapa transisi untuk menghadapinya.Penjelasan
Mungkin lebih mudah untuk mengikuti ini dengan melihat apa yang dihasilkan sebagian versi program. Menggunakan input berikut setiap kali:
kita dapat mengamati output dari beberapa awalan program ini:
Untuk contoh pertama di sini,
L
pada awalnya merupakan elemen yang tidak diketahui, tetapi ketika kami memindahkannya melalui\
, Brachylog menyadari bahwa satu-satunya kemungkinan adalah daftar dengan panjang yang sama dengan input. Contoh terakhir di sini adalah nondeterministic; kami memodelkan nondeterminisme di NFA menggunakan nondeterminisme di Brachylog itu sendiri.Kemungkinan peningkatan
Beberapa sintaks di sini, seperti
↔,0↔
dan terutama kekacauan denganH&hg;Hz{…ᵈ}ᵐ
, cukup kikuk. Itu tidak akan mengejutkan saya jika ada cara terserat untuk mengucapkan ini.{∋ᵈ}ᵐ
dalam dirinya sendiri struktur yang cukup mencurigakan - Anda hanya berharap bisa menulis∋ᵈᵐ
- tetapi tidak menguraikan karena alasan tertentu.sumber
∋ᵈᵐ
tidak parse karena diimplementasikan sedemikian rupa sehingga nama-nama meta-predikat multi-karakter secara teori dapat digunakan (jika kita kehabisan kemungkinan simbol tunggal). Dalam praktiknya saat ini tidak digunakan.Python 3,
10380 byteterima kasih kepada @BWO
TIO
Pemahaman daftar "elegan" (103 byte) sebelumnya:
sumber
reduce
.. Tetapi menggunakan rekursi dan set yang sebenarnya masih membawa Anda ke 80 byte .if''<f
denganif f
.JavaScript (ES6), 99 byte
Mengambil input sebagai
(nfa)(string)
. Mengembalikan Set.Cobalah online!
sumber
R , 81 byte
Cobalah online!
Jawaban langsung menggunakan
Reduce
. Mengambil aturan sebagai tiga vektor yangstate, symbol, new-states
dipanggila,b,e
.Aturan terpisah (mis. Aturan
0,'a',[1,2]
adalah0,'a',1
dan0,'a',2
).sumber
Kelapa , 64 byte
Cobalah online!
sumber
Bersih , 68 byte
Yang ini berdasarkan pada solusi Haskell ovs sedikit lebih pendek dari pendekatan awal saya.
sekarang termasuk test harness
Cobalah online!
sumber
Arang , 44 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Dorong{ 0 } .
0
ke daftar kosong yang telah ditentukan untuk mengatur status initalUlangi input.
Salin negara bagian.
Setel ulang status.
Ulangi salinan negara.
Ulangi entri NFA.
Jika entri cocok, maka ...
... lewati negara bagian baru ...
.... jika mereka belum ada dalam daftar ...
... tambahkan ke daftar.
Keluarkan daftar status ke string untuk output implisit pada baris terpisah.
sumber
Perl 6 ,
6154 byteCobalah online!
Mengambil daftar transisi keadaan dan string input sebagai daftar karakter.
sumber
Japt , 31 byte
Cobalah!
Disimpan 2 byte dengan lebih baik menggunakan kemampuan Japt untuk secara implisit membentuk fungsi dari beberapa input
Penjelasan:
Kode "inisialisasi negara" yang baru dapat menggunakan sedikit lebih banyak detail. Japt menginisialisasi
W
ke 0 jika ada kurang dari 3 input, jadi jalankan pertama[W]
adalah[0]
, danc
"meratakan" array.[0]
sudah serata mungkin, jadi tidak berubah. Pada menjalankan selanjutnyaW
memiliki nilai yang berbeda, misalnya[1,2]
. Dalam hal itu[W]
menjadi[[1,2]]
, array elemen tunggal di mana elemen itu adalah array. Kali inic
membuka bungkusnya dan kembali ke[1,2]
. Jadi, pada run pertama ituW=[0]
dan pada run berikutnya ituW=W
.sumber