¿Es un grupo de consonantes válido en Lojban?

13

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


Dada una entrada de una cadena que consta de dos caracteres, muestra si es un grupo de consonantes válido en Lojban.

Aquí hay una cita de CLL 3.6 que detalla las reglas para un par de grupos de consonantes válidos (o más bien, uno inválido ):

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 cita hace referencia a consonantes "sonoras" y "no sonoras". Aquí hay una tabla de las consonantes sordas y sus contrapartes sonoras (también de CLL 3.6):

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

Tenga en cuenta que {x} no tiene una contraparte sonora. Para completar, las consonantes restantes que no están en esta lista (que pueden ser sonoras o sordas para los fines de la cita) son lmnr. ( yes una vocal, y las letras hqw no se usan).

La entrada debe ser una sola cadena, pero puede suponer que siempre constará de exactamente dos consonantes, con una nueva línea final opcional si lo desea. La salida puede ser cualquier valor verdadero o falso .

Esto es , por lo que gana el código más corto en bytes.

Casos de prueba (estas son todas las posibles cadenas de entrada ubicadas en las categorías adecuadas):

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
Pomo de la puerta
fuente
Pomo de la puerta , esto está muy cerca de codegolf.stackexchange.com/q/66053/15599 Creo que la mitad de mi código podría ser reutilizable.
Level River St el
@steveverrill Correcto, encontré esa pregunta, y pensé que sería lo suficientemente diferente dado que solo obtienes dos caracteres como entrada y no tienes que manejar las vocales y demás.
Pomo de la puerta
2
@steveverrill ... pero ahora estoy reconsiderando, después de mirar más de cerca las respuestas. ¿Crees que sería mejor si solo omitiera la parte inicial del par de consonantes y realizara el desafío simplemente "es un par de consonantes válido"?
Pomo de la puerta
Creo que eso aumentaría la diferencia entre los desafíos y simplificaría este, lo cual sería algo bueno.
Level River St el
@steveverrill Sí, estoy de acuerdo ahora. ¡Gracias!
Pomo de la puerta

Respuestas:

5

Pyth, 53 48 47 bytes

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

Esto genera una lista de todos los pares no válidos según las reglas anteriores, luego verifica si la entrada es uno de ellos.

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

Pruébalo aquí .

lirtosiast
fuente
5

Retina , 59 57 54 53 52 bytes

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

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

El avance de línea final es significativo. Para clústeres válidos, esto genera una cadena no vacía; para los inválidos, la salida está vacía.

Pruébalo en línea! Esto prueba todos los clústeres a la vez (elimina todos los no válidos y deja intactos todos los válidos). Para hacer eso posible, tuve que reemplazar el ^ancla por un\b límite de palabra.

Otra solución para el mismo número de bytes:

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

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

Explicación

El objetivo es eliminar todos los pares no válidos por completo. Podemos hacer con los pares válidos lo que queramos siempre que quede al menos un carácter.

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

Esto se encarga de tres reglas: (.)\1coincide con cualquier par que infringe la regla 1. [cjsz]{2}coincide con cualquier par que infringe 3.mz coincide con el par específicamente no permitido de la regla 4.

Eso deja sólo se descartan dos y los otros pares específicos xk, kx, xcy cx. Podemos ahorrar un montón de bytes haciendo un preprocesamiento, por lo que tenemos que manejar menos casos:

T`fb-jz`svkv

La idea es colapsar todas las consonantes sonoras en una, también ky c. También me estoy convirtiendo fen sla necesidad. Esta es una etapa de transliteración que sustituirá los caracteres individuales por otros caracteres. Para ver el mapeo real, necesitamos expandir el rango y recordar que el último carácter de la lista de objetivos se repite indefinidamente:

fbcdefghijz
svkvvvvvvvv

La inicial f => ses necesaria, porque anula la posterior f => vque se convertiría fen una consonante sonora. También vemos que cse convierte en k. Y todas las consonantes sonoras bdgjzse convierten en v. Eso deja ehi... afortunadamente, estas son vocales o no se usan en Lojban. Lo mismo también podría haberse logrado con

T`fcb-jz`skv

Alternativamente, revise la otra solución que publiqué anteriormente que usa una transliteración muy diferente (con un rango inverso, y también se convierte kenc lugar).

Ahora las combinaciones inválidas restantes se pueden verificar con mucha más facilidad:

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

cxy cxse han convertido kxy xkpor lo que sólo necesitará comprobar dos casos ahora. Para la regla 2, tratamos de hacer coincidir todo el par, comenzando desde el principio con una consonante sonora opcional (reducida a v), una consonante sorda obligatoria (donde no necesitamos verificar fy por cseparado) y otra consonante sonora opcional. Si el par es una mezcla de voz y voz, uno de los dos vs opcionales coincidirá y se eliminará todo el par. De lo contrario, esto solo puede coincidir si el par comienza con una consonante sonora (y tiene algo más que segundo); en ese caso, solo se eliminará el primer carácter y el otro permanecerá, dando un resultado verdadero.

Martin Ender
fuente