My xu ti te gismytermorna? (Geçerli bir gismu mu?)


25

(Kelimenin tam anlamıyla: "Bu, gismu biçimini takip ediyor mu / gerçekleştiriyor mu?")

Öncül

Dil Lojban bir olduğunu inşa dil onun kelimelerin hepsi yaratılmış ziyade doğal olarak geliştirmek için izin verilmiş olması bu bölümünde, yani. Lojban'ın semantik tabanı gismu ya da Çince, Hintçe ve İngilizce gibi yaygın olarak konuşulan doğal dillerden kökleri birleştirerek sentezlenen kök kelimeleridir . Tüm gismu 5 harf uzunluğundadır ve belirli bir kesin formu izler.

Bilgi

Amaçlarımız için, Lojban alfabesi:

abcdefgijklmnoprstuvxz

Yani, olmadan Roma alfabesi hqwy.

Bu alfabe dört kategoriye ayrılabilir:

  • Sesli harfler aeiou

  • Sonorant ünsüzler lmnr

  • Bilinmeyen ünsüzler ptkfcsx. Seslendirildiğinde, bunlar sırasıyla ...

  • Sesli ünsüzler bdgvjz( Sesli hiçbir ünsüz karşılık gelir x.)

Geçerli bir gismu olması için 5 karakter uzunluğunda bir dize:

  1. Ünsüz sesli harflerden birinde CVCCVveya CCVCVC'nin bir ünsüz harfini temsil ettiği yerde, V bir ünlü harfini temsil eder.

  2. Ünsüz eşleştirme kurallarına uyun.

CCVCV kelimeleri için ünsüz eşleştirme kuralları:

İlk iki karakter aşağıdaki 48 çiftten birini ( kaynak ) oluşturmalıdır:

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

Bunun, sesli ve sesli olmayan çiftlere ayrıldığında daha iyi göründüğünü unutmayın. Özellikle, seslendirilen her bir seslendirilmiş çift, karşılık gelen seslendirilmemiş - bildirilmemiş bir çift geçerli olduğunda geçerlidir. Bu bir sonerant ünsüz ile çiftlere uzanmaz; clgeçerli ama jldeğil.

CVCCV kelimeleri için ünsüz eşleştirme kuralları ( kaynak ):

Üçüncü ve dördüncü karakterler aşağıdaki kurallara uymalıdır:

  1. Her iki ünsüz için aynı olması yasaktır [...]

  2. Bir ünsüz sesinin ve diğer seslendirilmemesi yasaktır. Ünsüzler “l”, “m”, “n” ve “r” bu kısıtlamadan muaftır. Sonuç olarak, “bf” yasaktır ve “sd” de yasaktır, ancak hem “fl” hem de “vl” ve hem “ls” hem de “lz” izin verilir.

  3. Her iki ünsüzün de “c”, “j”, “s”, “z” kümesinden çekilmesi yasaktır.

  4. Özel “cx”, “kx”, “xc”, “xk” ve “mz” çiftleri yasaktır.

179 olası çift olduğunu unutmayın.

Meydan okuma

Verilen dizginin gismu oluşum kurallarına uyup uymadığını belirleyin. Bu , yani bayttaki en kısa çözüm kazanır.

Giriş : Lojban alfabesinden bir uzunluk 5 dizesi.

Çıktı : Dizge bir gismu ve bir falsey değeri olabilirse, bir truthy değeri.

Test durumları

Geçerli:

gismu
cfipu
ranxi
mupno
rimge
zosxa

Geçersiz:

ejram
xitot
dtpno
rcare
pxuja
cetvu

Daha fazla test durumu: Bu metin dosyası , her satırda bir tane olmak üzere tüm geçerli gismu'ları içerir.

Lojban'ı gerçekten tanımıyorum, bu yüzden başlık çevirisinin yanlış olduğundan şüpheleniyorum. Yardım takdir edilir.


8
Lojban telaffuzunun fonetik olduğuna dikkat edin, bu nedenle gismu , GIF'deki gibi sert bir g ile telaffuz edilir.
lirtosiast

12
Bunun iyi bir örnek olup olmadığını bilmiyorum, çünkü GIF'in resmi telaffuzu Jiff'e benziyor. : p
geokavel

Yan soru: Her ikisi de sve kdilin bir parçası olduğu için telaffuzu cnedir?
Aralık’ta

2
@Fatalize: Bu "sh".
Deusovi

1
@Deusovi doğru görünüyor. Yanlış anlamamın nedeni j, İngilizce J olarak değil, Fransız J olarak telaffuz edilmesidir (başlangıçta patlayıcı olmadan). Bağlantılı sayfalardan birinden 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]bu yüzden patlayıcı D'nin eklenmesi gerektiğini görürüz. Fransızca J versiyonu gerçekten SH. IPA sembolleri (onları anlayanlar için) wikipedia sayfasındadır.
Seviye River St

Yanıtlar:


7

Ruby, 302 252 bayt

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

Birkaç bayt aşağıdaki gibi kaydedilebilir:

Başlatma zYANLıŞ olarak kullanarak z=!c='[cjsztdpbfvkgxmnlr]'. Bu çalışır ancak uyarı verir warning: found = in conditional, should be ==.

Bir programdan bir işleve geçiş (Program olarak bıraktım çünkü soruna göre, bayt cinsinden en kısa "program" kazanıyor.)

İlk gönderideki değişikliklerin özeti

Regex / eşleştirme bölümünün büyük revizyonu.

Sabit 72, 69 olarak değiştirildi, böylece sihirli dizgideki en düşük ASCII kodu 13 yerine 10'du. Bu, kaçış dizisi yerine golf versiyonunda kullanılmaya hazır bir yeni hattın kullanılmasını sağlar.

Magic string 'mzxcxkx', CVCCV type tablosundaki 5 yasak karakter için aritmetik kuralları değiştirir.

asılsız versiyon

boşluk ekledi ve sihirli dizede yeni satır \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

Eşleşmenin açıklaması

Giriş dizesindeki iki karakter s[n,2], yineleme döngüsünün karakter çifti ile karşılaştırılır. Eşleşirlerse ve ünsüz harfli regex deseni doğruysa, satır ve sütun değerleri i,jgeçerliliği denetlenir. Ünsüzlerin dikkatlice sıralanması burada yardımcı olur.

CVCCV için:

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 için

Aşağıdaki tablonun her bir sütunu için bir bitmap, 69'un çıkarıldığı sihirli dizeye kodlanır. Son ikisi hariç tüm sütunlar için yalnızca 6 bit gereklidir. Son iki için, daha yüksek sıra bitlerinin 1 olması gerekir, bu nedenle baştaki sıfırlar yerine baştaki 1'lere sahip olmak için negatif bir sayı oluşturulur (karakter \nve :). Ancak, tablonun son üç satırını dahil etmek istemiyoruz, bu yüzden hak değiştirme ve ANDing yerine 1 ile hak değiştirme ve AND1-j/14 normal olarak 1 olarak değerlendirilir, ancak son 3 satır için 0 olarak değerlendirilir.

Aşağıdaki program (başvuru ile aynı ifadelerle) aşağıdaki tabloları oluşturmak için kullanıldı ( ifistediğiniz satır için hangi satırın kullanılması gerektiğine dikkat edin).

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

İşlevlere izin vermek için ifadeleri değiştirdim; üzgünüm çok uzun sürdü.
lirtosiast

6

JavaScript (ES6), 366 352 bayt

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

açıklama

Geçerli bir gismu ise ya da nulldeğilse , son harfi (truthy) içeren bir dizi döndürür .

Boyutların çoğu, kodlanmış CCVCVçiftlerden gelir (yoğunlaştıktan sonra bile). Onları oluşturmak için bir model bulmak mümkün olabilir ama ben zaten bunun için çok zaman harcadım! 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])

Ölçek


0

Javascript ES6, 240 bayt

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

Sanırım bu benim işim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.