¿Xu ti te gismytermorna? (Це дійсна гісму?)


25

(Буквально: "Чи відповідає це / реалізує форму " гісму "?)

Приміщення

Мова Лойбана - це побудована мова , що означає, що всі її слова були створені, а не дозволяли розвиватися природним шляхом. Семантичною основою Лойбана є його гісму , або кореневі слова, які були синтезовані поєднанням коренів із широко розмовних природних мов, таких як китайська, хінді та англійська. Всі гісму мають 5 літер і мають певну сувору форму.

Інформація

Для наших цілей алфавітом Лойбана є:

abcdefgijklmnoprstuvxz

Тобто римський алфавіт без hqwy.

Цей алфавіт можна розділити на чотири категорії:

  • Голосні aeiou

  • Сонорантні приголосні lmnr

  • Незвучні приголосні ptkfcsx. Коли вони озвучуються, вони стають відповідно ...

  • Звукові приголосні bdgvjz(Не відповідає жодному зголосному x).

Щоб бути дійсним gismu, 5-char-довгий рядок повинен:

  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 з алфавіту Лойбана.

Вихідні дані : величина truthy, якщо рядок може бути значенням gismu та falsey.

Тестові справи

Дійсний:

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: Це "ш".
Deusovi

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 (для тих, хто їх розуміє) знаходяться на сторінці вікіпедії.
Рівень Св. Св.

Відповіді:


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. Це дає можливість використовувати буквальний новий рядок у гольф-версії замість послідовності втечі.

Чарівний рядок 'mzxcxkx'замінює арифметичні правила для 5 заборонених символів у таблиці типу CVCCV.

безгольова версія

додано пробіл та змінено новий рядок у чарівному рядку на a \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 замість ведучих нулів. Ми не хочемо включати останні три рядки таблиці, тому замість зміни прав та ANDing на 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

Я змінив формулювання, щоб дозволити функції; вибачте, що пройшло так багато часу.
ліртосіаст

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])

Пояснення

Повертає масив, що містить останню букву (truthy), якщо це дійсна 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.