È un cluster consonante valido in Lojban?


13

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


Dato un input di una stringa composta da due caratteri, indica se si tratta di un cluster consonante valido in Lojban.

Ecco una citazione da CLL 3.6 che specifica in dettaglio le regole per una coppia consonante di cluster valida (o meglio, una coppia non valida ):

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.

La citazione fa riferimento a consonanti "sonore" e "non sonore". Ecco una tabella delle consonanti non fatturate e delle loro controparti sonore (anche da CLL 3.6):

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

Si noti che {x} non ha controparti espresse. Per completezza, le restanti consonanti che non sono in questo elenco (che possono essere espresse o non emesse ai fini del preventivo) lo sono lmnr. ( yè una vocale e le lettere hqwnon sono usate.)

L'input deve essere una singola stringa, ma si può presumere che sarà sempre costituito da esattamente due consonanti, con una nuova riga finale opzionale se lo si desidera. L'output può essere qualsiasi valore di verità o falsità .

Questo è , quindi vince il codice più breve in byte.

Casi di test (sono tutte possibili stringhe di input inserite nelle categorie appropriate):

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

Doorknob, questo è molto vicino a codegolf.stackexchange.com/q/66053/15599 Penso che circa la metà del mio codice potrebbe essere riutilizzabile.
Level River St,

@steveverrill Bene, ho trovato quella domanda, e ho pensato che sarebbe stato sufficientemente diverso dato che hai solo due caratteri come input e non devi gestire vocali e cose del genere.
Maniglia della porta

2
@steveverrill ... ma ora sto riconsiderando, dopo aver dato un'occhiata più da vicino alle risposte. Pensi che sarebbe meglio se avessi lasciato fuori la parte iniziale della coppia di consonanti e avessi fatto semplicemente la sfida "è questa una coppia di consonanti valida"?
Maniglia della porta

Penso che aumenterebbe sia la differenza tra le sfide sia semplificherebbe questa, che sarebbe una buona cosa.
Level River St,

@steveverrill Sì, sono d'accordo ora. Grazie!
Maniglia della porta

Risposte:


5

Pyth, 53 48 47 byte

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

Questo genera un elenco di tutte le coppie non valide in base alle regole precedenti, quindi controlla se l'input è una di queste.

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

Provalo qui .


5

Retina , 59 57 54 53 52 byte

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

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

L'avanzamento finale è significativo. Per cluster validi, questo genera una stringa non vuota; per quelli non validi l'output è vuoto.

Provalo online! Ciò verifica tutti i cluster contemporaneamente (rimuovendo tutti quelli non validi e lasciando intatti tutti quelli validi). Per renderlo possibile, ho dovuto sostituire l' ^ancora con un \blimite di parole.

Un'altra soluzione per lo stesso conteggio byte:

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

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

Spiegazione

L'obiettivo è rimuovere completamente tutte le coppie non valide. Possiamo fare con le coppie valide tutto ciò che vogliamo finché rimane almeno un personaggio.

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

Questo si occupa di tre regole: (.)\1corrisponde a qualsiasi coppia che viola la regola 1. [cjsz]{2}corrisponde a qualsiasi coppia che viola 3. mzcorrisponde alla coppia specificamente vietata dalla regola 4.

Questo lascia regola solo due e le altre coppie specifici xk, kx, xce cx. Possiamo salvare un sacco di byte eseguendo un po 'di preelaborazione, quindi dobbiamo gestire un numero inferiore di casi:

T`fb-jz`svkv

L'idea è quella di comprimere tutte le consonanti sonore in una sola, pure ke c. Sto anche trasformando fin snecessità. Questa è una fase di traslitterazione che sostituirà i singoli caratteri con altri personaggi. Per visualizzare la mappatura effettiva è necessario espandere l'intervallo e ricordare che l'ultimo carattere dell'elenco di destinazione viene ripetuto indefinitamente:

fbcdefghijz
svkvvvvvvvv

L'iniziale f => sè necessario, perché sostituisce il successivo f => vche si trasformerebbe fin una consonante sonora. Vediamo anche che csi trasforma in k. E tutte le consontanti espresse bdgjzsi trasformano in v. Ciò lascia ehi... per fortuna queste sono vocali o non utilizzate in Lojban. Lo stesso avrebbe potuto essere raggiunto anche con

T`fcb-jz`skv

In alternativa, controlla l'altra soluzione che ho pubblicato sopra che utilizza una traslitterazione molto diversa (con un intervallo inverso e si trasforma anche kin c).

Ora le restanti combinazioni non valide possono essere verificate molto più facilmente:

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

cxe cxsono diventati kxe xkquindi ora dobbiamo solo controllare due casi. Per la regola 2, cerchiamo di abbinare l'intera coppia, a partire dall'inizio con una consonante sonora opzionale (ridotta a v), una consonante non fatturata obbligatoria (dove non è necessario verificare fe cseparatamente) e un'altra consonante sonora opzionale. Se la coppia è un mix di doppiato e non sonoro, una delle due vs opzionali corrisponderà e l'intera coppia verrà rimossa. Altrimenti, questo può corrispondere solo se la coppia inizia con una consonante sonora (e ha qualcos'altro secondo) - in quel caso verrà rimosso solo il primo personaggio e l'altro rimarrà, dando comunque un risultato veritiero.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.