Czy jest to poprawny klaster spółgłoskowy w Lojban?

13

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


Biorąc pod uwagę ciąg znaków składający się z dwóch znaków, wypisz, czy jest to poprawny klaster spółgłoskowy w Lojban.

Oto cytat z CLL 3.6 szczegółowo opisujący zasady dotyczące prawidłowej pary klastrów spółgłoskowych (a raczej niepoprawnej ):

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.

Cytat odwołuje się do spółgłosek „dźwięcznych” i „bezdźwięcznych”. Oto tabela bezdźwięcznych spółgłosek i ich dźwięcznych odpowiedników (również z CLL 3.6):

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

Zauważ, że {x} nie ma dźwięcznego odpowiednika. Dla kompletności, pozostałe spółgłoski, których nie ma na tej liście (które mogą być dźwięczne lub bezdźwięczne dla celów cytatu) to lmnr. ( yjest samogłoską, a litery hqwnie są używane).

Dane wejściowe muszą być pojedynczym ciągiem znaków, ale możesz założyć, że zawsze będzie się składać z dokładnie dwóch spółgłosek, z opcjonalnym końcowym znakiem nowej linii, jeśli chcesz. Wynik może być dowolną wartością prawdziwości lub fałszu .

To jest , więc wygrywa najkrótszy kod w bajtach.

Przypadki testowe (są to wszystkie możliwe ciągi wejściowe umieszczone w odpowiednich kategoriach):

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
Klamka
źródło
Klamka, to bardzo blisko codegolf.stackexchange.com/q/66053/15599 Myślę, że połowa mojego kodu może być ponownie użyta .
Level River St
@steveverrill Racja, znalazłem to pytanie i pomyślałem, że będzie wystarczająco inne, biorąc pod uwagę, że jako dane wejściowe otrzymujesz tylko dwa znaki i nie musisz obsługiwać samogłosek i tym podobnych.
Klamka
2
@steveverrill ... ale teraz ponownie się zastanawiam, po bliższym przyjrzeniu się odpowiedziom. Czy uważasz, że byłoby lepiej, gdybym po prostu pominął początkową część pary spółgłoskowej i podjąłem wyzwanie: „czy to jest ważna para spółgłoskowa”?
Klamka
Myślę, że to zwiększyłoby różnicę między wyzwaniami i uprościło to jedno, co byłoby dobre.
Level River St
@steveverrill Tak, zgadzam się teraz. Dzięki!
Klamka

Odpowiedzi:

5

Pyth, 53 48 47 bajtów

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

To generuje listę wszystkich nieprawidłowych par na podstawie powyższych reguł, a następnie sprawdza, czy dane wejściowe są jedną z nich.

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

Wypróbuj tutaj .

lirtosiast
źródło
5

Retina , 59 57 54 53 52 bajty

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

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

Końcowe podawanie linii jest znaczące. W przypadku prawidłowych klastrów generuje niepusty ciąg; dla nieprawidłowych dane wyjściowe są puste.

Wypróbuj online! Testuje to wszystkie klastry naraz (usuwając wszystkie nieprawidłowe i pozostawiając nietknięte wszystkie ważne). Aby było to możliwe, musiałem zastąpić ^kotwicę \bgranicą słowa.

Inne rozwiązanie dla tej samej liczby bajtów:

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

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

Wyjaśnienie

Celem jest całkowite usunięcie wszystkich nieprawidłowych par. Możemy zrobić z prawidłowymi parami, co tylko chcemy, dopóki pozostanie przynajmniej jedna postać.

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

Dotyczy to trzech zasad: (.)\1dopasowuje dowolną parę naruszającą regułę 1. [cjsz]{2}dopasowuje dowolną parę naruszającą 3. mzdopasowuje wyraźnie niedozwoloną parę z przepisu 4.

Że tylko dwa liście rządzić, a pozostałe pary specyficzne xk, kx, xci cx. Możemy zaoszczędzić kilka bajtów, wykonując wstępne przetwarzanie, więc musimy obsłużyć mniej przypadków:

T`fb-jz`svkv

Chodzi o to, aby wszystkie dźwięczne spółgłoski były również zwinięte w jedną ki c. Jestem również obracając fsię sz konieczności. Jest to etap transliteracji, który zastąpi poszczególne znaki innymi znakami. Aby zobaczyć rzeczywiste mapowanie, musimy rozszerzyć zakres i pamiętać, że ostatni znak listy docelowej jest powtarzany w nieskończoność:

fbcdefghijz
svkvvvvvvvv

Inicjał f => sjest konieczny, ponieważ zastępuje późniejszy, f => vktóry zamieniłby fsię w dźwięczną spółgłoskę. Widzimy również, że cjest zamieniony k. I wszyscy dźwięczni konsumenci bdgjzsą zamieniani w v. To pozostawia ehi... na szczęście są to samogłoski lub nieużywane w Lojban. To samo można również osiągnąć za pomocą

T`fcb-jz`skv

Alternatywnie, sprawdź inne rozwiązanie, które zamieściłem powyżej, które używa zupełnie innej transliteracji (z odwrotnym zakresem, a zamiast tego zamienia się kw c).

Teraz pozostałe nieprawidłowe kombinacje można sprawdzić o wiele łatwiej:

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

cxi cxstały kx, a xkwięc musimy tylko sprawdzić teraz dwa przypadki. Dla reguły 2, staramy się dopasować całą parę, począwszy od początku z opcjonalnym spółgłoski dźwięcznej (obniżony do v), obowiązkową bezdźwięczną spółgłoskę (gdzie nie potrzeba, aby sprawdzić fi cosobno) oraz kolejną opcjonalną dźwięczną. Jeśli para jest mieszanką dźwięcznych i bezdźwięcznych, jeden z dwóch opcjonalnych elementów vzostanie dopasowany, a cała para zostanie usunięta. W przeciwnym razie może się to zgadzać tylko wtedy, gdy para zaczyna się od dźwięcznej spółgłoski (i ma coś jeszcze drugiego) - w takim przypadku tylko pierwszy znak zostanie usunięty, a drugi pozostanie, nadal dając prawdziwy wynik.

Martin Ender
źródło