.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
. ( y
es 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 código golf , 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
fuente
Respuestas:
Pyth,
534847 bytesEsto genera una lista de todos los pares no válidos según las reglas anteriores, luego verifica si la entrada es uno de ellos.
Pruébalo aquí .
fuente
Retina ,
5957545352 bytesEl 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:
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.
Esto se encarga de tres reglas:
(.)\1
coincide 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
,xc
ycx
. Podemos ahorrar un montón de bytes haciendo un preprocesamiento, por lo que tenemos que manejar menos casos:La idea es colapsar todas las consonantes sonoras en una, también
k
yc
. También me estoy convirtiendof
ens
la 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:La inicial
f => s
es necesaria, porque anula la posteriorf => v
que se convertiríaf
en una consonante sonora. También vemos quec
se convierte enk
. Y todas las consonantes sonorasbdgjz
se convierten env
. Eso dejaehi
... afortunadamente, estas son vocales o no se usan en Lojban. Lo mismo también podría haberse logrado conAlternativamente, revise la otra solución que publiqué anteriormente que usa una transliteración muy diferente (con un rango inverso, y también se convierte
k
enc
lugar).Ahora las combinaciones inválidas restantes se pueden verificar con mucha más facilidad:
cx
ycx
se han convertidokx
yxk
por 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 av
), una consonante sorda obligatoria (donde no necesitamos verificarf
y porc
separado) y otra consonante sonora opcional. Si el par es una mezcla de voz y voz, uno de los dosv
s 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.fuente