¿Сюй ти те гисмытерморна? (Это действительный гисму?)


25

(Буквально: «Это следует / реализует форму gismu ?»)

посылка

Язык ложбан является составным языком , отчасти это означает, что все его слова были созданы, а не допущены к естественному развитию. Семантическая основа ложбана - его gismu , или коренные слова, которые были синтезированы путем объединения корней от широко распространенных естественных языков, таких как китайский, хинди и английский. Все гисму состоят из 5 букв и следуют определенной строгой форме.

Информация

Для наших целей ложбанский алфавит:

abcdefgijklmnoprstuvxz

То есть без латинского алфавита hqwy.

Этот алфавит можно разделить на четыре категории:

  • Гласные aeiou

  • Сонорантные согласные lmnr

  • Согласные без голоса ptkfcsx. Когда они озвучены, они становятся соответственно ...

  • Озвученные согласные bdgvjz(Никакой звонкой согласной не соответствует x.)

Чтобы быть действительным gismu, строка длиной 5 символов должна:

  1. Будьте в одном из образцов согласных гласных CVCCVили CCVCV, где C представляет согласный, а V представляет гласный.

  2. Следуйте правилам соответствия согласных.

Правила соответствия согласных для слов CCVCV:

Первые два символа должны составлять одну из следующих 48 пар ( источник ):

ml mr
pl pr
bl br
   tr                   tc ts
   dr                   dj dz
kl kr
gl gr
fl fr
vl vr
cl cr cm cn cp ct ck cf
      jm    jb jd jg jv
sl sr sm sn sp st sk sf
      zm    zb zd zg zv
xl xr

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

Правила соответствия согласных для слов CVCCV ( источник ):

Третий и четвертый символы должны следовать следующим правилам:

  1. Запрещено, чтобы обе согласные были одинаковыми [...]

  2. Запрещено произносить одну согласную, а другую - невокализованную. Согласные «l», «m», «n» и «r» освобождены от этого ограничения. В результате «bf» запрещен, как и «sd», но разрешены как «fl», так и «vl», а также «ls» и «lz».

  3. Запрещено извлекать обе согласные из набора «c», «j», «s», «z».

  4. Определенные пары «cx», «kx», «xc», «xk» и «mz» запрещены.

Обратите внимание, что есть 179 возможных пар.

Вызов

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

Входные данные : строка длиной 5 из ложбанского алфавита.

Вывод : истинное значение, если строка может быть gismu и значением false, в противном случае.

Контрольные примеры

Действительно:

gismu
cfipu
ranxi
mupno
rimge
zosxa

Недействителен:

ejram
xitot
dtpno
rcare
pxuja
cetvu

Больше тестов: этот текстовый файл содержит все допустимые gismu, по одному на строку.

Я действительно не знаю ложбана, поэтому подозреваю, что перевод названия неправильный. Помощь приветствуется.


8
Обратите внимание, что произношение ложбана является фонетическим, поэтому gismu произносится с жестким g, как в GIF.
lirtosiast

12
Я не знаю, хороший ли это пример, потому что официальное произношение GIF похоже на Jiff. : p
geokavel

Дополнительный вопрос: поскольку оба sи kявляются частью языка, какое произношение cимеет?
Роковой

2
@Fatalize: это "ш".
Деусов

1
@Deusovi кажется, ты прав. Причина, по которой я понял это неправильно, заключается в том, что jон не произносится как английский J, а скорее как французский J (без взрывного элемента в начале). На одной из связанных страниц The regular English pronunciation of “James”, which is [dʒɛjmz], would Lojbanize as “djeimz.”, which contains a forbidden consonant pair......[additional rule to avoid this]мы видим, что необходимо добавить добавочный D. Невозвученный Версия французского J действительно SH. Символы IPA (для тех, кто их понимает) находятся на странице википедии.
Уровень Река St

Ответы:


7

Рубин, 302 252 байта

c='[cjsztdpbfvkgxmnlr]'
v=c+'[aeiou]'
z=!1
n=/#{c+v+v}/=~(s=gets.chop)*2
(n==0||n==2)&&289.times{|k|q=[i=k%17,j=k/17].max
z||=(x=s[n,2])==c[j+1]+c[i+1]&&['UeUeJOJOJOJOETJ
:'[i].ord-69>>j&1-j/14>0,i!=j&&q>3&&(k%2<1||q>12)&&!'mzxcxkx'.index(x)][n/2]}
p z

Еще несколько байтов могут быть сохранены следующим образом:

Инициализировать zна ложное использование z=!c='[cjsztdpbfvkgxmnlr]'. Это работает, но выдает предупреждениеwarning: found = in conditional, should be == .

Переход от программы к функции (я оставил ее как программу, потому что, в зависимости от вопроса, выигрывает самая короткая «программа» в байтах).

Сводка изменений с первого поста

Капитальный ремонт регулярного выражения / соответствующей части.

Константа 72 была изменена на 69, так что наименьший код ASCII в магической строке равен 10 вместо 13. Это позволяет использовать буквальную новую строку в версии для гольфа вместо escape-последовательности.

Волшебная струна 'mzxcxkx' заменяет арифметические правила для 5 запрещенных символов в таблице типов CVCCV.

негольфированная версия

добавил пробел и изменил символ новой строки в магической строке на \n

c='[cjsztdpbfvkgxmnlr]'                                   #c=consonants
v=c+'[aeiou]'                                             #v=consonant+vowel
z=!1                                                      #Set z to false (everything is truthy in Ruby except nil and false.)
n=/#{c+v+v}/=~(s=gets.chop)*2                             #Get input and duplicate it. do regex match, n becomes the index of the double consonant. 
(n==0||n==2)&&                                            #If n==0 (ccvcv) or n==2 (cvccv) 
   289.times{|k|                                          #iterate 17*17 times
     q=[i=k%17,j=k/17].max                                #generate row and column, find their maximum.
     z||=                                                 #OR z with the following expression:
     (x=s[n,2])==c[j+1]+c[i+1]&&                          #double consonant == the pair corresponding to j,i AND either 
       ["UeUeJOJOJOJOETJ\n:"[i].ord-69>>j&1-j/14>0,       #this expression or
       i!=j&&q>3&&(k%2<1||q>12)&&!'mzxcxkx'.index(x)][n/2]#this expresson, depending on the value of n/2
   }
p z                                                       #print output

Объяснение соответствия

Два символа во входной строке s[n,2]сравниваются с парой символов цикла итерации. Если они совпадают и шаблон регулярных выражений согласных гласных верен, значения строки и столбцаi,j проверяются на достоверность. Тщательный порядок согласных помогает здесь.

Для CVCCV:

i!=j                        It is forbidden for both consonants to be the same
(k%2<1||q>12)               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.
q>3                         It is forbidden for both consonants to be drawn from the set “c”, “j”, “s”, “z”.
!'mzxcxkx'.index(x)         The specific pairs “cx”, “kx”, “xc”, “xk”, and “mz” are forbidden.

Для CCVCV

Растровое изображение для каждого столбца таблицы ниже кодируется в магическую строку, из которой вычитается 69. Для всех столбцов, кроме двух последних, требуется только 6 битов. Для последних двух биты старшего порядка должны быть равны 1, поэтому генерируется отрицательное число (символы \nи :), чтобы иметь первые 1 вместо ведущих нулей. Мы не хотим включать последние три строки таблицы, поэтому вместо правого смещения и AND на 1 мы получаем правое смещение и AND, 1-j/14которые обычно оцениваются в 1, но оцениваются в 0 для последних 3 строк.

Следующая программа (с теми же выражениями, что и в представлении) использовалась для генерации таблиц ниже (раскомментируйте, какая ifстрока требуется для нужной вам таблицы.

c='[cjsztdpbfvkgxmnlr]'
z=0
289.times{|k|
  q=[i=k%17,j=k/17].max
  r=c[j+1]+c[i+1]
  #if i!=j && q>3 && (k%2<1||q>12) && !'mzxcxkx'.index(r)
  #if "UeUeJOJOJOJOETJ\n:"[i].ord-69>>j&1-j/14>0
    print r,' '
    z+=1
  else
    print '   '
  end
  i==16&&puts 
}
puts z


            ct    cp    cf    ck       cm cn cl cr
               jd    jb    jv    jg    jm jn jl jr
            st    sp    sf    sk    sx sm sn sl sr
               zd    zb    zv    zg    zm zn zl zr
tc    ts          tp    tf    tk    tx tm tn tl tr
   dj    dz          db    dv    dg    dm dn dl dr
pc    ps    pt          pf    pk    px pm pn pl pr
   bj    bz    bd          bv    bg    bm bn bl br
fc    fs    ft    fp          fk    fx fm fn fl fr
   vj    vz    vd    vb          vg    vm vn vl vr
kc    ks    kt    kp    kf             km kn kl kr
   gj    gz    gd    gb    gv          gm gn gl gr
      xs    xt    xp    xf             xm xn xl xr
mc mj ms    mt md mp mb mf mv mk mg mx    mn ml mr
nc nj ns nz nt nd np nb nf nv nk ng nx nm    nl nr
lc lj ls lz lt ld lp lb lf lv lk lg lx lm ln    lr
rc rj rs rz rt rd rp rb rf rv rk rg rx rm rn rl 
179

            ct    cp    cf    ck       cm cn cl cr
               jd    jb    jv    jg    jm
            st    sp    sf    sk       sm sn sl sr
               zd    zb    zv    zg    zm
tc    ts                                        tr
   dj    dz                                     dr
                                             pl pr
                                             bl br
                                             fl fr
                                             vl vr
                                             kl kr
                                             gl gr
                                             xl xr
                                             ml mr


48

Я изменил формулировку, чтобы позволить функции; извини, что так долго.
lirtosiast

6

JavaScript (ES6), 366 352 байта

g=>((q=3,w=2,r=0,f="mzcscjzjxcxkx",c="bdgvjzptkfcsxlmnr",d=[...c],v="aeiou")[m="match"](g[1])?d.map((a,i)=>d.map((b,j)=>a==b|(i<6&j>5&j<13|j<6&i>5&i<13)||f[m](a+b)||(p+=","+a+b)),p="",q=0,r=w--)&&p:"jbl,zbr,tstcl,cmr,cn,cr,jdr,cfl,sfr,jgl,zgr,zdjml,ckl,skr,cpl,spr,sl,sm,sn,sr,ctr,jvl,zvr,xl,xr,dzm")[m](g[r]+g[r+1])&&c[m](g[q])&&v[m](g[w])&&v[m](g[4])

объяснение

Возвращает массив, содержащий последнюю букву (правдивую), если это действительный gismu или nullесли это не так.

Большая часть размера происходит от жестко закодированных CCVCVпар (даже после их сгущения). Может быть возможно найти шаблон для их генерации, но я уже потратил слишком много времени на это! XD

g=>
  (
    // Save the positions to check for the consonant, vowel and pair respectively
    (q=3,w=2,r=0,                       // default = CCVCV format
    f="mzcscjzjxcxkx",                  // f = all forbidden pairs for CVCCV pairs
    c="bdgvjzptkfcsxlmnr",              // c = consonants
    d=[...c],                           // d = array of consonants
    v="aeiou")                          // v = vowels
    [m="match"](g[1])?                  // if the second character is a vowel

      // Generate CC pairs of CVCCV
      d.map((a,i)=>                     // iterate over every possible pair of consonants
        d.map((b,j)=>
          a==b|                         // rule 1: consonants cannot be the same
          (i<6&j>5&j<13|j<6&i>5&i<13)|| // rule 2: pair cannot be voiced and unvoiced
          f[m](a+b)||                   // rule 3 & 4: certain pairs are forbidden
            (p+=","+a+b)                // if it follows all the rules add the pair
        ),
        p="",                           // p = comma-delimited valid CVCCV pairs
        q=0,r=w--                       // update the match positions to CVCCV format
      )&&p
    :
      // CC pairs of CCVCV (condensed so that valid pairs like "jb", "bl" and
      //     "zb" can be matched in this string but invalid pairs like "lz" cannot)
      "jbl,zbr,tstcl,cmr,cn,cr,jdr,cfl,sfr,jgl,zgr,zdjml,ckl,skr,cpl,spr,sl,sm,sn,sr,ctr,jvl,zvr,xl,xr,dzm"

  // Match the required format
  )[m](g[r]+g[r+1])&&c[m](g[q])&&v[m](g[w])&&v[m](g[4])

Тест


0

Javascript ES6, 240 байт

x=>eval(`/${(c='[bcdfgjklmnprstvxz]')+c+(v='[aeiou]')+c+v}/${t='.test(x)'}?/^[bfgkmpvx][lr]|[cs][fklmnprt]|d[jrz]|[jz][bdgmv]/${t}:/${c+v+c+c+v}/${t}?!/^..((.)\\2|${V='[bdgvjz]'}${U='[ptkfcsx]'}|${U+V}|[cjsz][cjsz]|cx|kx|xc|xk|mz)/${t}:!1`)

Я думаю, это моя работа сейчас.

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