Apakah cluster konsonan yang valid di Lojban?

13

.i xu .e'o lo zunsnagri cu drani loka jboge'a


Diberikan input dari string yang terdiri dari dua karakter, output apakah itu cluster konsonan yang valid di Lojban.

Berikut adalah kutipan dari CLL 3.6 yang merinci aturan untuk pasangan gugus konsonan yang valid (atau lebih tepatnya, yang tidak valid ):

1) It is forbidden for both consonants to be the same, as this would
   violate the rule against double consonants.

2) It is forbidden for one consonant to be voiced and the other unvoiced.
   The consonants “l”, “m”, “n”, and “r” are exempt from this restriction.
   As a result, “bf” is forbidden, and so is “sd”, but both “fl” and “vl”,
   and both “ls” and “lz”, are permitted.

3) It is forbidden for both consonants to be drawn from the set “c”, “j”,
   “s”, “z”.

4) The specific pairs “cx”, “kx”, “xc”, “xk”, and “mz” are forbidden.

Kutipan referensi konsonan "bersuara" dan "tidak bersuara". Berikut adalah tabel dari konsonan yang tidak disuarakan dan rekan-rekannya yang disuarakan (juga dari CLL 3.6):

UNVOICED    VOICED
   p          b
   t          d
   k          g
   f          v
   c          j
   s          z
   x          -

Perhatikan bahwa {x} tidak memiliki lawan bicara. Untuk kelengkapan, konsonan yang tersisa yang tidak ada dalam daftar ini (yang dapat disuarakan atau tidak disuarakan untuk keperluan kutipan) adalah lmnr. ( yadalah vokal, dan huruf-hurufnya hqw - tidak digunakan.)

Input harus berupa string tunggal, tetapi Anda dapat mengasumsikan bahwa itu akan selalu terdiri dari tepat dua konsonan, dengan opsional membuntuti baris baru jika diinginkan. Outputnya bisa berupa nilai true atau falsy .

Ini adalah , jadi kode terpendek dalam byte menang.

Kasus uji (semua ini adalah string masukan yang mungkin ditempatkan dalam kategori yang tepat):

Valid consonant clusters:
 bd bg bj bl bm bn br bv bz cf ck cl cm cn cp cr ct db dg dj dl dm dn dr dv
 dz fc fk fl fm fn fp fr fs ft fx gb gd gj gl gm gn gr gv gz jb jd jg jl jm
 jn jr jv kc kf kl km kn kp kr ks kt lb lc ld lf lg lj lk lm ln lp lr ls lt
 lv lx lz mb mc md mf mg mj mk ml mn mp mr ms mt mv mx nb nc nd nf ng nj nk
 nl nm np nr ns nt nv nx nz pc pf pk pl pm pn pr ps pt px rb rc rd rf rg rj
 rk rl rm rn rp rs rt rv rx rz sf sk sl sm sn sp sr st sx tc tf tk tl tm tn
 tp tr ts tx vb vd vg vj vl vm vn vr vz xf xl xm xn xp xr xs xt zb zd zg zl
 zm zn zr zv

Invalid consonant clusters:
 bb bc bf bk bp bs bt bx cb cc cd cg cj cs cv cx cz dc dd df dk dp ds dt dx
 fb fd ff fg fj fv fz gc gf gg gk gp gs gt gx jc jf jj jk jp js jt jx jz kb
 kd kg kj kk kv kx kz ll mm mz nn pb pd pg pj pp pv pz rr sb sc sd sg sj ss
 sv sz tb td tg tj tt tv tz vc vf vk vp vs vt vv vx xb xc xd xg xj xk xv xx
 xz zc zf zj zk zp zs zt zx zz
Gagang pintu
sumber
Doorknob, ini sangat dekat dengan codegolf.stackexchange.com/q/66053/15599 Saya pikir sekitar setengah kode saya mungkin dapat digunakan kembali.
Level River St
@steveverrill Benar, saya menemukan pertanyaan itu, dan saya pikir ini akan cukup berbeda mengingat bahwa Anda hanya mendapatkan dua karakter sebagai input dan Anda tidak harus menangani vokal dan semacamnya.
Gagang Pintu
2
@steveverrill ... tapi sekarang saya mempertimbangkan kembali, setelah melihat lebih dekat jawaban. Apakah Anda pikir akan lebih baik jika saya hanya meninggalkan bagian pasangan konsonan awal, dan membuat tantangan hanya "apakah ini pasangan konsonan yang valid"?
Gagang Pintu
Saya pikir itu akan meningkatkan perbedaan antara tantangan dan menyederhanakan yang ini, yang keduanya akan menjadi hal yang baik.
Level River St
@steveverrill Ya, saya setuju sekarang. Terima kasih!
Gagang Pintu

Jawaban:

5

Pyth, 53 48 47 byte

!}z+"mz"s.pMs[+VGGc"xcxkcsjz"2*"ptkfcsx""bdgvjz

Ini menghasilkan daftar semua pasangan yang tidak valid berdasarkan aturan di atas, kemudian memeriksa apakah input adalah salah satunya.

! }                        A not in B
    z                      input
    +
      "mz"                  "mz"
      s                    flattened
        .pM                permutations of each:
            s [               flatten the three-element array:
                +V              Alphabet vectorized concat with itself.
                   G            That is, duplicate letters
                   G
                c"xcxkcsjz"2     That string chopped every 2
                *               outer product of
                  "ptkfcsx"      voiced letters
                  "bdgvjz        and unvoiced letters

Coba di sini .

lirtosiast
sumber
5

Retina , 59 57 54 53 52 byte

(.)\1|[cjsz]{2}|mz

T`fb-jz`svkv
kx|xk|^v?[kpstx]v?

Linefeed tambahan sangat penting. Untuk kluster yang valid, ini menghasilkan string yang tidak kosong; untuk yang tidak valid outputnya kosong.

Cobalah online!Ini menguji semua cluster sekaligus (menghapus semua yang tidak valid dan membiarkan semua yang valid tetap utuh). Untuk memungkinkan itu, saya harus mengganti ^jangkar dengan \bbatas kata.

Solusi lain untuk jumlah byte yang sama:

(.)\1|[cjsz]{2}|mz

T`fk-dbz`scv
cx|xc|^v?[cpstx]v?

Penjelasan

Tujuannya adalah untuk menghapus semua pasangan yang tidak valid sepenuhnya. Kita dapat melakukan dengan pasangan yang valid apa pun yang kita inginkan selama setidaknya satu karakter tersisa.

(.)\1|[cjsz]{2}|mz

Ini menangani tiga aturan: (.)\1cocok dengan pasangan mana pun yang melanggar aturan 1.[cjsz]{2} cocok dengan pasangan mana pun yang melanggar 3.mz cocok dengan pasangan yang secara khusus tidak diizinkan dari aturan 4.

Itu daun hanya memerintah dua dan pasangan tertentu lainnya xk, kx, xcdan cx. Kami dapat menyimpan banyak byte dengan melakukan beberapa preprocessing sehingga kami harus menangani lebih sedikit kasus:

T`fb-jz`svkv

Idenya adalah untuk menghancurkan semua konsonan yang disuarakan menjadi satu, juga kdan c. Saya juga berubah fmenjadi skarena kebutuhan. Ini adalah tahap transliterasi yang akan menggantikan karakter individu dengan karakter lain. Untuk melihat pemetaan aktual, kita perlu memperluas jangkauan dan ingat bahwa karakter terakhir dari daftar target diulang tanpa batas waktu:

fbcdefghijz
svkvvvvvvvv

Inisial f => sdiperlukan, karena mengesampingkan nanti f => vyang akan berubah fmenjadi konsonan bersuara. Kita juga melihat itu cberubah menjadi k. Dan semua konsonan yang disuarakan bdgjzdiubah menjadi v. Yang meninggalkan ehi... untungnya ini adalah vokal atau tidak digunakan di Lojban. Hal yang sama juga bisa dicapai dengan

T`fcb-jz`skv

Atau, periksa solusi lain yang saya posting di atas yang menggunakan transliterasi yang sangat berbeda (dengan rentang terbalik, dan itu juga berubah kmenjadic ).

Sekarang kombinasi yang tidak valid yang tersisa dapat diperiksa lebih mudah:

kx|xk|^v?[kpstx]v?

cxdan cxtelah menjadi kxdan xkjadi kita hanya perlu memeriksa dua kasus sekarang. Untuk aturan 2, kami mencoba untuk mencocokkan seluruh pasangan, mulai dari awal dengan konsonan bersuara opsional (dikurangi menjadi v), konsonan tanpa suara wajib (di mana kita tidak perlu memeriksa fdan csecara terpisah) dan konsonan bersuara opsional lainnya. Jika pasangan adalah campuran suara dan tidak disuarakan salah satu dari dua opsional vakan cocok dan seluruh pasangan dihapus. Kalau tidak, ini hanya bisa cocok jika pasangan mulai dengan konsonan bersuara (dan memiliki yang lain kedua) - dalam hal ini hanya karakter pertama yang akan dihapus, dan yang lainnya akan tetap, masih memberikan hasil yang benar.

Martin Ender
sumber