Latar Belakang
MQTT (pesan antrian Telemetry Transportasi) adalah standar ISO mempublikasikan-berlangganan berbasis protokol pesan ( Wikipedia ).
Setiap pesan memiliki topik, seperti contoh berikut:
myhome/groundfloor/livingroom/temperature
USA/California/San Francisco/Silicon Valley
5ff4a2ce-e485-40f4-826c-b1a5d81be9b6/status
Germany/Bavaria/car/2382340923453/latitude
Klien MQTT dapat berlangganan topik pesan menggunakan wildcard:
- Tingkat tunggal:
+
- Semua tingkat ke depan:
#
Misalnya, langganan myhome/groundfloor/+/temperature
akan menghasilkan hasil ini (ketidaksesuaian dalam huruf tebal ):
✅ myhome / groundfloor / ruang tamu / suhu
✅ myhome / groundfloor / dapur / suhu
❌ myhome / groundfloor / ruang tamu / kecerahan
❌ myhome / firstfloor / ruang tamu / suhu
❌ garasi / groundfloor / kulkas / suhu
Sedangkan langganan +/groundfloor/#
akan menghasilkan hasil ini:
✅ myhome / groundfloor / ruang tamu / suhu
✅ myhome / groundfloor / dapur / kecerahan
✅ garasi / groundfloor / kulkas / suhu / lebih / spesifik / bidang
❌ myhome / firstfloor / ruang tamu / suhu
❌ myhome / basement / sudut / suhu
Info lebih lanjut di sini .
Tugas
Menerapkan fungsi / program menerima dua string dan mengembalikan boolean. String pertama adalah topik pembicaraan, yang kedua adalah topik kriteria. Topik kriteria menggunakan sintaks berlangganan yang dijelaskan di atas. Fungsi ini benar ketika subjek cocok dengan kriteria.
Aturan untuk tugas ini:
- Topiknya adalah ASCII
- Tidak ada bidang kriteria di luar
#
wildcard - Wildcard tidak muncul dalam topik subjek
- Jumlah bidang subjek> = jumlah bidang kriteria
- Tidak ada bidang 0 karakter atau garis miring depan atau belakang
Uji kasus
criteria1 = "myhome / groundfloor / + / temperature"
criteria2 = "+ / groundfloor / #"
("abc", "ab") => false
("abc", "abc") => true
("abc / de", "abc") => false
("myhome / groundfloor / livingroom / temperature", criteria1 ) => true
("myhome / groundfloor / kitchen / temperature", criteria1) => true
("myhome / groundfloor / livingroom / brightness", criteria1) => false
("myhome / firstfloor / livingroom / temperature", criteria1) = > false
("garasi / groundfloor / lemari es / suhu", criteria1) => false
("myhome / groundfloor / livingroom / temperature", criteria2) => true
("myhome / groundfloor / kitchen / brightness", criteria2) => true
("garasi / groundfloor / lemari es / suhu / lebih / spesifik / bidang ", criteria2) => true
(" myhome / firstfloor / livingroom / temperature ", criteria2) => false
("myhome / basement / sudut / suhu", criteria2) => false
("musik / kei $ ha / terbaru", "+ / kei $ ha / +") => true
sumber
a/b/c
tidak akan cocok dengan kriteriaa/b
, jadi saya cenderung mengatakan Tidak .Jawaban:
Jelly , 20 byte
Tautan monadik yang menerima daftar daftar karakter
[topic, pattern]
, yang masing-masing mengembalikan1
atau0
untuk pertandingan atau yang tidak cocok.Cobalah online! Atau lihat test-suite .
Bagaimana?
sumber
Ruby , 65 byte
Solusi Regex. Saya menambahkan
Regex.escape
kalau-kalau nama kriteria kebetulan sesuatu seperticom.java/string[]/\n
atau sesuatu yang konyol yang akan memiliki potongan regex.Cobalah online!
Solusi non-regex, 77 byte
Menggunakan teknik split, zip, dan match sederhana yang bagus. Saya mengembangkan ini terlebih dahulu sebelum menyadarinya
Regex.escape
solusi regex akan lebih pendek.Cobalah online!
sumber
.*?
harus bekerja di tempat[^/]*
.a/+/d
dengan topika/b/c/d
Perl 5
-pl
, 50 byteCobalah online!
sumber
<>=~/^$_$/
pada akhirnyaPython 3 , 72 byte
Cobalah online!
Masalah ini dapat disederhanakan sepele menjadi pertandingan regex, meskipun metode lain yang lebih menarik dapat menghasilkan hasil yang lebih baik.
EDIT Saya datang dengan solusi 107-byte tidak menggunakan regex. Saya tidak tahu apakah bisa lebih pendek dari 72 atau mungkin saya hanya tidak melihat untuk memperbaiki pendekatan ini. Hanya struktur split-zip tampaknya terlalu besar. Cobalah secara Online!
sumber
f('myhome/ground$floor/livingroom/temperature', 'myhome/ground$floor/+/temperature')
yang gagal+/kei$ha/+
tidak cocokmusic/kei$ha/latest
.Python 2 ,
8584809289 byteCobalah online!
Terima kasih kepada Jonathan Allan dan Value Ink untuk menunjukkan bug.
sumber
f('ab', 'abc')
.Haskell,
76737167 byteCobalah online!
Edit: -4 bytes berkat @cole.
sumber
a#b=a==b
tampaknya bekerja untuk beberapa byte lebih sedikit, kecuali saya kehilangan sesuatuClojure ,
107917665102 byteFungsi anonim, mengembalikan topik topik sebagai kebenaran dan
nil
sebagai kesalahan (berlaku di Clojure).107 102 bekerja
91 76 65 semuanya dikalahkan dengan regex chars
sumber
music/kei$ha/latest
dan kriteria+/kei$ha/+
(yang harus cocok dan valid ASCII).Kotlin , 106 byte
Cobalah online!
sumber
Python 3,
9988 byteTanpa menggunakan regex. Dengan bantuan dari Jonathan Allan dan Chas Brown.
sumber
f=lambda s,p:s==p or'#'==p[0]or p[0]in(s[0]+'+')and f(s[1:],p['+'!=p[0]or(s[0]=='/')*2:])
menghemat 12. Namun ini gagal untuk memproses beberapa kasus tepi sepertif('abc/ijk/x', 'abc/+/xyz')
atauf('abc/ijk/xyz', 'abc/+/x')
, yang dapat diperbaiki denganf=lambda s,p:s==p or'#'==p[:1]or p[:1]in(s[:1]+'+')and f(s[1:],p['+'!=p[:1]or(s[:1]=='/')*2:])
f('abc','ab')
danf('abc/de','abc')
(keduanya harus kembaliFalse
, tetapi sebaliknya adaIndexError
)....or p[:1]in(s[:1],'+')and...
memperbaiki kasus tepi @ChasBrown dan saya tunjukkan untuk biaya 2 byte.f('a/b', 'a/+')
) tetapi dapat diperbaiki dalam 0 byte dengan...or(s[:1]in'/')*2:])
.Arang , 36 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Output
-
(output implisit Charcoal untuktrue
) untuk pertandingan, tidak ada yang cocok. Penjelasan:Bagi subjek menjadi
/
s.Bagi kriteria pada
/
s.Jika kriteria berisi (yaitu diakhiri dengan),
#
maka lepaskan dan potong subjek sesuai dengan panjang kriteria yang baru.Di mana kriteria berisi
+
kemudian ganti elemen itu dalam subjek dengan+
.Bandingkan subjek dengan kriteria dan cetak hasilnya secara implisit.
sumber
Retina 0.8.2 , 42 byte
Cobalah online! Penjelasan:
Akhiran a
/
untuk kedua baris.Secara berulang-ulang hapus elemen pertama dari subjek dan kriteria sementara mereka sama atau elemen kriteria adalah (bahagia)
+
.Kriteria cocok jika hanya a
#
(dengan/
yang ditambahkan sebelumnya) jika tidak, subjek dan kriteria harus kosong pada titik ini.sumber
Pyth , 22 byte
Cobalah online!
sumber
Jelly ,
2219 byteCobalah online!
Tautan monadik yang mengambil sebagai argumennya
[topic], [criterion]
dan kembali1
untuk pertandingan dan0
tanpa pertandingan.sumber
JavaScript,
6966 byteCobalah online!
sumber
music/kei$ha/latest
dan kriteria+/kei$ha/+
(yang harus cocok dan valid ASCII).Python 3 ,
149148 byteCobalah online!
sumber
05AB1E , 21 byte
Masukkan sebagai daftar dalam urutan
[criteria, topic]
.Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
sumber