É um cluster consoante válido no Lojban?


13

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


Dada a entrada de uma sequência composta por dois caracteres, mostre se é um cluster consoante válido no Lojban.

Aqui está uma citação do CLL 3.6 detalhando as regras para um par de cluster consoante válido (ou melhor, um par 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.

A citação faz referência a consoantes "sonoras" e "não sonoras". Aqui está uma tabela das consoantes não sonoras e suas contrapartes sonoras (também da CLL 3.6):

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

Observe que {x} não possui contrapartida com voz. Para ser completo, as consoantes restantes que não estão nessa lista (que podem ser dubladas ou não dubladas para os fins da cotação) são lmnr. ( yé uma vogal e as letras hqwnão são usadas.)

A entrada deve ser uma única sequência, mas você pode assumir que sempre consistirá em exatamente duas consoantes, com nova linha à direita opcional, se desejar. A saída pode ser qualquer valor verdadeiro ou falso .

Isso é , então o código mais curto em bytes vence.

Casos de teste (todas essas cadeias de entrada possíveis são colocadas nas categorias apropriadas):

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

Maçaneta da porta , isso está muito próximo de codegolf.stackexchange.com/q/66053/15599 Acho que metade do meu código pode ser reutilizável.
Level River St

@steveverrill Certo, encontrei essa pergunta e achei que isso seria suficientemente diferente, pois você recebe apenas dois caracteres como entrada e não precisa lidar com vogais e coisas do tipo.
Maçaneta

2
@steveverrill ... mas agora estou reconsiderando, depois de olhar mais de perto as respostas. Você acha que seria melhor se eu deixasse de fora a parte inicial do par consoante e fizesse o desafio simplesmente "este é um par consoante válido"?
Maçaneta

Eu acho que isso aumentaria a diferença entre os desafios e simplificaria esse, os quais seriam uma coisa boa.
Level River St

@steveverrill Sim, eu concordo agora. Obrigado!
Maçaneta

Respostas:


5

Pitão, 53 48 47 bytes

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

Isso gera uma lista de todos os pares inválidos com base nas regras acima e verifica se a entrada é um deles.

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

Experimente aqui .


5

Retina , 59 57 54 53 52 bytes

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

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

O avanço de linha à direita é significativo. Para clusters válidos, isso gera uma string não vazia; para os inválidos, a saída está vazia.

Experimente online! Isso testa todos os clusters de uma só vez (removendo todos os inválidos e deixando todos os válidos intactos). Para tornar isso possível, tive que substituir a ^âncora por um \blimite de palavras.

Outra solução para a mesma contagem de bytes:

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

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

Explicação

O objetivo é remover todos os pares inválidos completamente. Podemos fazer com os pares válidos o que quisermos, pelo menos enquanto houver um caractere.

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

Isso cuida de três regras: (.)\1corresponde a qualquer par que viola a regra 1. [cjsz]{2}corresponde a qualquer par que viola 3. mzcorresponde ao par especificamente não permitido da regra 4.

Isso deixa apenas regra dos dois e os outros pares específicos xk, kx, xce cx. Podemos salvar um monte de bytes executando algum pré-processamento, para que tenhamos que lidar com menos casos:

T`fb-jz`svkv

A idéia é recolher todas as consoantes sonoras em uma ke também c. Eu também estou virando fem scaso de necessidade. Este é um estágio de transliteração que substituirá caracteres individuais por outros caracteres. Para ver o mapeamento real, precisamos expandir o intervalo e lembrar que o último caractere da lista de destino é repetido indefinidamente:

fbcdefghijz
svkvvvvvvvv

A inicial f => sé necessária, porque substitui a posterior, f => vque se tornaria fuma consoante sonora. Também vemos que isso cé transformado k. E todas as consoantes sonoras bdgjzsão transformadas v. Isso deixa ehi... felizmente, essas são vogais ou não são usadas em Lojban. O mesmo também poderia ter sido alcançado com

T`fcb-jz`skv

Como alternativa, confira a outra solução que eu postei acima que usa uma transliteração muito diferente (com um intervalo reverso e também se ktransforma c).

Agora as combinações inválidas restantes podem ser verificadas com muito mais facilidade:

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

cxe cxse tornaram kxe, xkportanto, precisamos verificar apenas dois casos agora. Por regra 2, tentamos corresponder toda a par, a partir do início com uma consoante expressa opcional (reduzido a v), uma consoante obrigatória unvoiced (em que não precisa verificar se há fe cseparadamente) e uma outra consoante expressa opcional. Se o par for uma mistura de sonoros e sonoros, um dos dois opcionais vcorresponderá e o par inteiro será removido. Caso contrário, isso só poderá corresponder se o par começar com uma consoante sonora (e tiver mais alguma coisa em segundo) - nesse caso, apenas o primeiro caractere será removido e o outro permanecerá, ainda dando um resultado verdadeiro.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.