¿Xu ti te gismytermorna? (Apakah itu gismu yang valid?)

25

(Secara harfiah: "Apakah ini mengikuti / mewujudkan bentuk gismu ?")

Premis

Bahasa Lojban adalah bahasa yang dikonstruksikan , yang berarti sebagian kata-katanya telah dibuat alih-alih dibiarkan berkembang secara alami. Basis semantik Lojban adalah gismu , atau kata-kata dasarnya , yang disintesis dengan menggabungkan akar - akar dari bahasa alami yang banyak digunakan seperti Cina, Hindi, dan Inggris. Semua gismu panjangnya 5 huruf dan mengikuti bentuk ketat tertentu.

Informasi

Untuk tujuan kami, alfabet Lojban adalah:

abcdefgijklmnoprstuvxz

Artinya, alfabet Romawi tanpa hqwy.

Alfabet ini dapat dibagi menjadi empat kategori:

  • Vokal aeiou

  • Konsonan sonorant lmnr

  • Konsonan yang tidak disuarakan ptkfcsx. Ketika disuarakan, ini menjadi masing-masing ...

  • Konsonan bersuara bdgvjz(Tidak ada konsonan bersuara yang sesuai dengan x.)

Untuk menjadi gismu yang valid, string 5-char-long harus:

  1. Berada dalam salah satu pola konsonan-vokal CVCCVatau CCVCV, di mana C mewakili konsonan, dan V mewakili vokal.

  2. Ikuti aturan pencocokan konsonan.

Aturan pencocokan konsonan untuk kata-kata CCVCV:

Dua karakter pertama harus merupakan salah satu dari 48 pasangan berikut ( sumber ):

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

Perhatikan bahwa ini terlihat lebih baik ketika dipisahkan menjadi pasangan bersuara dan tidak bersuara. Khususnya, setiap pasangan bersuara bersuara valid jika pasangan bersuara bersuara yang sah itu valid. Ini tidak mencakup pasangan dengan konsonan sonorant; clvalid tetapi jltidak.

Aturan pencocokan konsonan untuk kata-kata CVCCV ( sumber ):

Karakter ketiga dan keempat harus mengikuti aturan berikut:

  1. Dilarang untuk kedua konsonan sama [...]

  2. Dilarang untuk satu konsonan disuarakan dan yang lainnya tidak disuarakan. Konsonan "l", "m", "n", dan "r" dibebaskan dari pembatasan ini. Akibatnya, "bf" dilarang, dan begitu pula "sd", tetapi "fl" dan "vl", dan "ls" dan "lz", diizinkan.

  3. Dilarang untuk kedua konsonan diambil dari himpunan "c", "j", "s", "z".

  4. Pasangan spesifik "cx", "kx", "xc", "xk", dan "mz" dilarang.

Perhatikan bahwa ada 179 pasangan yang memungkinkan.

Tantangan

Tentukan apakah string yang diberikan mengikuti aturan pembentukan gismu . Ini adalah , jadi solusi terpendek dalam byte menang.

Input : String dengan panjang 5 dari abjad Lojban.

Output : Nilai sebenarnya jika string bisa menjadi nilai gismu dan falsey.

Uji kasus

Sah:

gismu
cfipu
ranxi
mupno
rimge
zosxa

Tidak valid:

ejram
xitot
dtpno
rcare
pxuja
cetvu

Lebih banyak kasus uji: file teks ini berisi semua gismu yang valid, satu per baris.

Saya tidak begitu tahu Lojban, jadi saya curiga terjemahan judulnya salah. Bantuan dihargai.

lirtosiast
sumber
8
Perhatikan bahwa pelafalan Lojban adalah fonetik, jadi gismu diucapkan dengan g yang keras, seperti dalam GIF.
lirtosiast
12
Saya tidak tahu apakah itu contoh yang baik, karena pengucapan resmi GIF seperti Jiff. : p
geokavel
Pertanyaan sampingan: Karena keduanya sdan kmerupakan bagian dari bahasa, pengucapan apa yang cdimilikinya?
Fatalkan
2
@Fatalize: Ini "sh".
Deusovi
1
@Deusovi sepertinya Anda benar. Alasan saya salah adalah karena jtidak diucapkan sebagai bahasa Inggris J, melainkan sebagai bahasa Prancis J (tanpa plosif di awal.) Dari salah satu halaman yang terhubung 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]sehingga kita melihat bahwa plosif D perlu ditambahkan. Unvoiced versi French J memang SH. Simbol IPA (bagi mereka yang memahaminya) ada di halaman wikipedia.
Level River St

Jawaban:

7

Ruby, 302 252 byte

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

Beberapa byte lagi dapat disimpan sebagai berikut:

Inisialisasi zke penggunaan salah z=!c='[cjsztdpbfvkgxmnlr]'. Ini berfungsi tetapi memberi peringatan warning: found = in conditional, should be ==.

Ubah dari satu program ke fungsi (saya meninggalkannya sebagai program karena menurut pertanyaan, "program" terpendek dalam byte menang.)

Ringkasan perubahan dari pos pertama

Perombakan besar-besaran regex / bagian yang cocok.

Constant 72 berubah menjadi 69 sehingga kode ASCII terendah dalam string ajaib adalah 10, bukan 13. Ini memungkinkan baris baru literal untuk digunakan dalam versi golf daripada urutan pelarian.

String ajaib 'mzxcxkx'menggantikan aturan aritmatika untuk 5 karakter yang dilarang dalam tabel jenis CVCCV.

versi tanpa ungolfed

menambahkan spasi putih dan mengubah baris baru dalam string ajaib menjadi 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

Penjelasan pencocokan

Dua karakter dalam string input s[n,2]dibandingkan dengan pasangan karakter dari loop iterating. Jika mereka cocok dan pola regex konsonan-vokal benar, nilai i,j- nilai baris dan kolom diperiksa untuk validitas. Pemesanan konsonan yang hati-hati membantu di sini.

Untuk 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.

Untuk CCVCV

Bitmap untuk setiap kolom dari tabel di bawah ini dikodekan ke dalam string ajaib, yang darinya 69 dikurangkan. Untuk semua kolom kecuali dua kolom terakhir, hanya 6 bit yang diperlukan. Untuk dua yang terakhir, bit urutan yang lebih tinggi harus 1, sehingga angka negatif dihasilkan (karakter \ndan :) agar memiliki 1 yang memimpin, bukan nol yang memimpin. Kami tidak ingin memasukkan tiga baris terakhir dari tabel, jadi alih-alih hakhift dan ANDing oleh 1, kami hakhift dan AND 1-j/14yang biasanya mengevaluasi menjadi 1, tetapi mengevaluasi ke 0 untuk 3 baris terakhir.

Program berikut (dengan ekspresi yang sama dengan pengiriman) digunakan untuk menghasilkan tabel di bawah ini (batalkan komentar pada ifbaris mana yang diperlukan untuk tabel yang Anda inginkan.

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
Level River St
sumber
Saya mengubah kata-kata untuk memungkinkan fungsi; maaf butuh waktu lama.
lirtosiast
6

JavaScript (ES6), 366 352 byte

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

Penjelasan

Mengembalikan array yang berisi huruf terakhir (kebenaran) jika itu adalah gismu yang valid atau nulljika tidak.

Banyak ukuran berasal dari pasangan hard-coded CCVCV(bahkan setelah kondensasi). Mungkin saja menemukan pola untuk membuatnya, tetapi saya sudah menghabiskan terlalu banyak waktu untuk ini! 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])

Uji

pengguna81655
sumber
0

Javascript ES6, 240 byte

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

Saya kira ini adalah pekerjaan saya sekarang.

Mama Fun Roll
sumber