Lojban'da geçerli bir ünsüz küme mi?


13

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


İki karakterden oluşan bir dize girdisi verildiğinde, Lojban'da geçerli bir ünsüz küme olup olmadığına bakın.

Geçerli bir ünsüz küme çifti (veya daha doğrusu geçersiz ) için kuralları ayrıntılı olarak açıklayan CLL 3.6'dan bir alıntı :

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.

Alıntıda "seslendirilmiş" ve "seslendirilmemiş" ünsüzlere atıfta bulunulmaktadır. İşte sessiz seslerin ve seslendirilen meslektaşlarının tablosu (ayrıca CLL 3.6'dan):

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

{X} içinde sesli karşılık bulunmadığını unutmayın. Tamlık için, bu listede bulunmayan kalan ünsüzler (alıntı yapmak için seslendirilebilir veya faturalandırılabilir) lmnr. ( ybir sesli harftir ve harfler hqwkullanılmaz.)

Giriş tek bir dize olmalıdır, ancak isterseniz her zaman tam olarak iki ünsüzden oluşacağını varsayabilirsiniz, isterseniz isteğe bağlı sondaki yeni satır. Çıktı herhangi bir doğruluk veya tahrif değeri olabilir .

Bu , bu nedenle bayttaki en kısa kod kazanır.

Test senaryoları (bunların tümü uygun kategorilere yerleştirilmiş olası giriş dizeleridir):

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

Kapı tokmağı, bu çok codegolf.stackexchange.com/q/66053/15599 yakındır Kodumun yarısının yeniden kullanılabilir olabileceğini düşünüyorum.
Level River St

@steveverrill Doğru, bu soruyu buldum ve sadece girdi olarak iki karakter elde etmeniz ve sesli harfleri ve benzeri şeyleri ele almanız gerekmediği sürece bunun yeterince farklı olacağını düşündüm.
Kapı tokmağı

2
@steveverrill ... ama şimdi cevaplara daha yakından baktıktan sonra tekrar gözden geçiriyorum. İlk ünsüz çift parçasını dışarıda bırakıp daha basit bir şekilde "bu geçerli bir ünsüz çifti mi?"
Kapı tokmağı

Bence bu hem zorluklar arasındaki farkı artıracak hem de basitleştirecek, her ikisi de iyi bir şey olacak.
Level River St

@steveverrill Evet, şimdi katılıyorum. Teşekkürler!
Kapı tokmağı

Yanıtlar:


5

Pyth, 53 48 47 bayt

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

Bu, yukarıdaki kurallara göre tüm geçersiz çiftlerin bir listesini oluşturur, ardından girişin bunlardan biri olup olmadığını kontrol eder.

! }                        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

Burada deneyin .


5

Retina , 59 57 54 53 52 bayt

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

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

Sondaki satır besleme önemlidir. Geçerli kümeler için bu, boş olmayan bir dize çıktısı verir; geçersiz olanlar için çıktı boştur.

Çevrimiçi deneyin! Bu, tüm kümeleri bir kerede test eder (geçersiz olanları kaldırmak ve geçerli olanları olduğu gibi bırakmak). Bunu mümkün kılmak için ^çapayı bir \bkelime sınırıyla değiştirmek zorunda kaldım .

Aynı bayt sayısı için başka bir çözüm:

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

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

açıklama

Amaç tüm geçersiz çiftleri tamamen kaldırmaktır. En az bir karakter kaldığı sürece geçerli çiftlerle istediğimiz her şeyi yapabiliriz.

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

Bu üç kurala bakar: (.)\1ihlal eden [cjsz]{2}herhangi bir çiftle eşleşir 1. ihlal eden herhangi bir çiftle mzeşleşir 3. özel olarak izin verilmeyen çifti kural 4'ten eşleştirir.

Yaprakları sadece iki kural ve o diğer spesifik çiftleri xk, kx, xcve cx. Bazı önişlemler yaparak bir demet bayt kaydedebiliriz, böylece daha az vakayı ele almalıyız:

T`fb-jz`svkv

Fikir sıra, tek bir bütün sesli sessizler çökmeye olduğunu kve c. Ben de çeviriyorum fiçine sgerekliliği out. Bu, diğer karakterlerin yerine tek tek karakterlerin yerini alacak bir harf çevirisi aşamasıdır. Gerçek eşlemeyi görmek için aralığı genişletmemiz ve hedef listesinin son karakterinin süresiz olarak tekrarlandığını hatırlamamız gerekir:

fbcdefghijz
svkvvvvvvvv

Birincisi f => sgereklidir, çünkü daha sonra sesli bir ünsüz haline f => vdönüşecek olanı geçersiz kılar f. Bunun cda dönüştüğünü görüyoruz k. Ve seslenen tüm ünsüzler bdgjzdönüşür v. Bırakıyor ehi... neyse ki bunlar ya sesli ya da Lojban'da kullanılmamış. Aynı şey,

T`fcb-jz`skv

Seçenek olarak ise, bu çok farklı çevirisini kullanır şeyden önce yayınlanan diğer çözüm kontrol (ters aralığı ve aynı zamanda döner kiçine cyerine).

Artık geri kalan geçersiz kombinasyonlar çok daha kolay kontrol edilebilir:

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

cxve cxhaline gelmiştir kxve xkbu yüzden ancak şimdi iki vaka kontrol etmeniz gerekir. Kural 2 için, baştan başlayarak isteğe bağlı bir sesli ünsüz (azaltılmış v), zorunlu bir sessiz ünsüz ( ayrı ayrı fve kontrol etmemiz gerekmediği c) ve başka bir isteğe bağlı sesli ünsüz ile eşleştirmeye çalışıyoruz. Çift, sesli ve sesli olmayan bir karışımsa, isteğe bağlı iki vs'den biri eşleşir ve tüm çift kaldırılır. Aksi takdirde, bu sadece çift sesli bir ünsüz ile başlarsa (ve ikinci bir şey varsa) eşleşebilir - bu durumda sadece ilk karakter kaldırılır ve diğeri kalır, yine de doğru bir sonuç verir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.