Это действительный согласный кластер в ложбане?


13

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


С учетом ввода строки, состоящей из двух символов, выведите, является ли она допустимым кластером согласных в ложбане.

Вот цитата из CLL 3.6, подробно описывающая правила для действительной пары согласных кластеров (или, скорее, недействительной ):

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.

Цитата ссылается на «звонкие» и «невокализованные» согласные. Вот таблица невокализованных согласных и их озвученных аналогов (также из CLL 3.6):

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

Обратите внимание, что {x} не имеет голосового аналога. Для полноты, оставшиеся согласные, которых нет в этом списке (которые могут быть либо озвучены, либо не озвучены для целей цитаты) lmnr. ( yгласная, а буквы hqwне используются.)

Входные данные должны быть единственной строкой, но вы можете предположить, что она всегда будет состоять из ровно двух согласных, с необязательным завершающим переводом строки, если хотите. Вывод может быть любым истинным или ложным значением .

Это , поэтому выигрывает самый короткий код в байтах.

Тестовые случаи (это все возможные входные строки, помещенные в соответствующие категории):

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

Дверная ручка, это очень близко к codegolf.stackexchange.com/q/66053/15599 Я думаю, что около половины моего кода можно использовать повторно.
Уровень Река St

@steveverrill Правильно, я нашел этот вопрос, и я подумал, что он будет достаточно отличаться, учитывая, что вы получаете только два символа в качестве ввода, и вам не нужно обрабатывать гласные и тому подобное.
дверная ручка

2
@steveverrill ... но теперь я пересматриваю, после более внимательного изучения ответов. Как вы думаете, было бы лучше, если бы я просто пропустил начальную часть пары согласных и сделал задачу просто: «Это действительная пара согласных»?
Ручка двери

Я думаю, что это увеличит разницу между вызовами и упростит этот, и то, и другое было бы хорошо.
Уровень Река St

@steveverrill Да, я согласен сейчас. Благодарность!
Ручка двери

Ответы:


5

Pyth, 53 48 47 байтов

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

Это создает список всех недопустимых пар на основе приведенных выше правил, а затем проверяет, является ли ввод одной из них.

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

Попробуй это здесь .


5

Retina , 59 57 54 53 52 байта

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

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

Конечный перевод строки значителен. Для допустимых кластеров это выводит непустую строку; для недействительных вывод пуст.

Попробуйте онлайн! Это проверяет все кластеры одновременно (удаляя все недействительные и оставляя все действительные нетронутыми). Чтобы сделать это возможным, мне пришлось заменить^ якорь \bграницей слова.

Другое решение для того же количества байтов:

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

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

объяснение

Цель состоит в том, чтобы полностью удалить все недопустимые пары. Мы можем делать с действительными парами все, что захотим, пока остается хотя бы один символ.

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

Это касается трех правил: (.)\1соответствует любой паре, нарушающей правило 1. [cjsz]{2}соответствует любой паре, нарушающей 3.mz соответствует специально запрещенной паре из правила 4.

Это оставляет только правило два и другие пары конкретных xk, kx, xcи cx. Мы можем сохранить несколько байтов, выполнив некоторую предварительную обработку, поэтому нам нужно обрабатывать меньше случаев:

T`fb-jz`svkv

Идея состоит в том, чтобы объединить все озвученные согласные в одну, а также kи c. Я также поворот fв sиз - за необходимости. Это этап транслитерации, который заменяет отдельные символы на другие символы. Чтобы увидеть фактическое отображение, нам нужно расширить диапазон и запомнить, что последний символ целевого списка повторяется бесконечно:

fbcdefghijz
svkvvvvvvvv

Инициал f => sнеобходим, потому что он перекрывает последний, f => vкоторый превращается fв звонкую согласную. Мы также видим, что cпревращается в k. И все озвученные согласные bdgjzпревращаются в v. Это оставляет ehi... к счастью, это либо гласные, либо не используемые в ложбане. То же самое можно было бы достичь с

T`fcb-jz`skv

В качестве альтернативы, ознакомьтесь с другим решением, которое я опубликовал выше, в котором используется совсем другая транслитерация (с обратным диапазоном, и вместо этого он также превращается kв c).

Теперь оставшиеся недействительные комбинации можно проверить гораздо проще:

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

cxи cxстали, kxи xkпоэтому нам нужно проверить только два случая сейчас. Для правила 2 мы пытаемся сопоставить всю пару, начиная с начала, с необязательной голосовой согласной (сокращенной до v), обязательной невокализованной согласной (где мы не должны проверять fи cотдельно) и другой необязательной голосовой согласной. Если пара представляет собой смесь вокализованных и невокализованных, один из двух дополнительных vs будет совпадать, и вся пара будет удалена. В противном случае это может совпадать только в том случае, если пара начинается с звонкого согласного (и имеет еще что-нибудь второе) - в этом случае будет удален только первый символ, а другой останется, все еще давая правдивый результат.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.