Est-ce un cluster de consonnes valide en Lojban?

13

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


Étant donné l'entrée d'une chaîne composée de deux caractères, indiquez s'il s'agit d'un cluster de consonnes valide dans Lojban.

Voici une citation de CLL 3.6 détaillant les règles pour une paire de grappes de consonnes valides (ou plutôt une paire invalide ):

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 citation fait référence à des consonnes "voisées" et "non voisées". Voici un tableau des consonnes non voisées et de leurs homologues voisées (également de CLL 3.6):

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

Notez que {x} n'a pas d'homologue exprimé. Pour être complet, les consonnes restantes qui ne figurent pas sur cette liste (qui peuvent être exprimées ou non aux fins de la citation) le sont lmnr. ( yest une voyelle, et les lettres hqwne sont pas utilisées.)

L'entrée doit être une seule chaîne, mais vous pouvez supposer qu'elle sera toujours composée exactement de deux consonnes, avec un retour à la ligne facultatif si vous le souhaitez. La sortie peut être n'importe quelle valeur vraie ou fausse .

Il s'agit de , donc le code le plus court en octets l'emporte.

Cas de test (ce sont toutes les chaînes d'entrée possibles placées dans les catégories appropriées):

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
Poignée de porte
la source
Poignée de porte, ceci est très proche de codegolf.stackexchange.com/q/66053/15599 Je pense qu'environ la moitié de mon code pourrait être réutilisable.
Level River St
@steveverrill Oui, j'ai trouvé cette question, et j'ai pensé que ce serait suffisamment différent étant donné que vous n'obtenez que deux caractères en entrée et que vous n'avez pas à gérer les voyelles et autres.
Poignée de porte
2
@steveverrill ... mais maintenant je reconsidère, après avoir regardé de plus près les réponses. Pensez-vous qu'il serait préférable que je laisse de côté la partie initiale de la paire de consonnes et que je lance le défi simplement "est-ce une paire de consonnes valide"?
Poignée de porte
Je pense que cela augmenterait à la fois la différence entre les défis et simplifierait celui-ci, ce qui serait une bonne chose.
Level River St
@steveverrill Ouais, je suis d'accord maintenant. Merci!
Poignée de porte

Réponses:

5

Pyth, 53 48 47 octets

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

Cela génère une liste de toutes les paires non valides en fonction des règles ci-dessus, puis vérifie si l'entrée en fait partie.

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

Essayez-le ici .

lirtosiast
la source
5

Rétine , 59 57 54 53 52 octets

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

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

Le saut de ligne arrière est important. Pour les clusters valides, cela génère une chaîne non vide; pour les invalides, la sortie est vide.

Essayez-le en ligne! Cela teste tous les clusters à la fois (en supprimant tous les clusters invalides et en laissant intacts tous les clusters valides). Pour rendre cela possible, j'ai dû remplacer l' ^ancre par une \blimite de mot.

Une autre solution pour le même nombre d'octets:

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

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

Explication

Le but est de supprimer complètement toutes les paires invalides. Nous pouvons faire avec les paires valides tout ce que nous voulons tant qu'il reste au moins un caractère.

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

Cela prend en charge trois règles: (.)\1correspond à toute paire violant la règle 1. [cjsz]{2}correspond à toute paire violant 3. mzcorrespond à la paire spécifiquement interdite de la règle 4.

Cela laisse règle que deux et les autres paires spécifiques xk, kx, xcet cx. Nous pouvons économiser un tas d'octets en effectuant un prétraitement, nous devons donc gérer moins de cas:

T`fb-jz`svkv

L'idée est de regrouper toutes les consonnes vocales en une seule, ainsi kque c. Je tourne aussi fdans sla nécessité. Il s'agit d'une étape de translittération qui remplacera les caractères individuels par d'autres caractères. Pour voir le mappage réel, nous devons étendre la plage et nous rappeler que le dernier caractère de la liste cible est répété indéfiniment:

fbcdefghijz
svkvvvvvvvv

L'initiale f => sest nécessaire, car elle remplace la dernière f => vqui se transformerait fen une consonne vocale. Nous voyons aussi que cela cse transforme k. Et tous les correspondants exprimés bdgjzsont transformés en v. Cela laisse ehi... heureusement, ce sont des voyelles ou inutilisées en Lojban. La même chose aurait également pu être obtenue avec

T`fcb-jz`skv

Alternativement, consultez l'autre solution que j'ai postée ci-dessus qui utilise une translittération très différente (avec une plage inverse, et elle se transforme également ken à la cplace).

Maintenant, les combinaisons non valides restantes peuvent être vérifiées beaucoup plus facilement:

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

cx et cx sont devenus kxet xknous avons donc seulement besoin de vérifier deux cas maintenant. Pour la règle 2, nous essayons de faire correspondre la paire entière, en commençant par le début avec une consonne vocale facultative (réduite à v), une consonne non vocale obligatoire (où nous n'avons pas besoin de vérifier fet cséparément) et une autre consonne vocale facultative. Si la paire est un mélange de voix et de voix, l'un des deux vs optionnels correspondra et la paire entière sera supprimée. Sinon, cela ne peut correspondre que si la paire commence par une consonne voisée (et a autre chose que la seconde) - dans ce cas, seul le premier caractère sera supprimé et l'autre restera, donnant toujours un résultat véridique.

Martin Ender
la source