¿xu te te gismytermorna?(有効なギスムですか?)


25

(文字通り:「これはgismu -formに従う/実現するか?」)

前提

ロジバンという言語は、構築された言語です。つまり、その単語のすべてが自然に発達するのではなく作成されていることを意味します。ロジバンのセマンティックベースは、中国語、ヒンディー語、英語などの広く話されている自然言語の語根を組み合わせて合成されたギスム(ルート語)です。すべてのギスムは5文字の長さで、特定の厳密な形式に従います。

情報

私たちの目的のために、ロジバンのアルファベットは次のとおりです。

abcdefgijklmnoprstuvxz

つまり、のないローマ字hqwy

このアルファベットは、次の4つのカテゴリに分類できます。

  • 母音 aeiou

  • ソノラント子音 lmnr

  • 無声子音ptkfcsx。声を出したとき、これらはそれぞれになります...

  • 有声子音bdgvjz(に対応する有声子音はありませんx。)

有効なギスムになるには、5文字の長さの文字列が次の条件を満たしている必要があります。

  1. 子音母音パターンCVCCVまたはのいずれかCCVCVになります。Cは子音を表し、Vは母音を表します。

  2. 子音一致規則に従います。

CCVCV単語の子音一致ルール:

最初の2文字は、次の48ペア(source)のいずれかを構成する必要があります。

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単語の子音一致規則(source):

3番目と4番目の文字は、次の規則に従う必要があります。

  1. 両方の子音が同じであることは禁じられています[...]

  2. 1つの子音を発声し、もう1つの子音を発声することは禁じられています。子音「l」、「m」、「n」、および「r」は、この制限の対象外です。その結果、「bf」は禁止され、「sd」も禁止されますが、「fl」と「vl」の両方、および「ls」と「lz」の両方が許可されます。

  3. 両方の子音がセット「c」、「j」、「s」、「z」から引き出されることは禁止されています。

  4. 特定のペア「cx」、「kx」、「xc」、「xk」、および「mz」は禁止されています。

179の可能なペアがあることに注意してください。

チャレンジ

指定された文字列がギスム形成規則に従っているかどうかを判断します。これはであるため、バイト単位の最短ソリューションが優先されます。

入力:ロジバンアルファベットの長さ5の文字列。

出力truthy値文字列ができる場合ギスムそうでないとfalsey値。

テストケース

有効:

gismu
cfipu
ranxi
mupno
rimge
zosxa

無効:

ejram
xitot
dtpno
rcare
pxuja
cetvu

その他のテストケース:このテキストファイルには、有効なすべてのギスムが1行に1つずつ含まれています。

私はロジバンを本当に知らないので、タイトルの翻訳が間違っていると思う。ヘルプは大歓迎です。


8
ロジバンの発音は音声なので、ギスムはGIFのようにハードgで発音されることに注意してください。
リルトシアスト

12
GIFの正式な発音はJiffに似ているため、それが良い例かどうかはわかりません。:p
ジオカベル

サイド質問:両方以来sk言語の一部であり、何の発音をc持っていますか?
15

2
@Fatalize:それは「sh」です。
デウソビ

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]。フランス語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を使用してfalseに初期化しますz=!c='[cjsztdpbfvkgxmnlr]'。これは機能しますが、警告が表示されwarning: found = in conditional, should be ==ます。

プログラムから関数に変更します(質問によると、バイト単位の最短の「プログラム」が勝つため、プログラムのままにしました。)

最初の投稿からの変更の要約

正規表現/マッチング部分の大幅な見直し。

定数72が69に変更されたため、マジックストリングの最低ASCIIコードは13ではなく10になります。これにより、エスケープシーケンスの代わりにリテラルバージョンをゴルフバージョンで使用できます。

マジックストリング'mzxcxkx'は、CVCCVタイプテーブルの5つの禁止文字の算術ルールを置き換えます。

無償版

空白を追加し、マジックストリングの改行を \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

マッチングの説明

入力文字列内の2つの文字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が減算されます。最後の2つを除くすべての列では、6ビットのみが必要です。最後の2つの場合、上位ビットは1である必要があるため、先頭のゼロではなく先頭の1を使用するために、負の数(文字\n:)が生成されます。ただし、テーブルの最後の3行を含めたくないので、右シフトと1によるANDの代わりに、1-j/14通常1と評価される右シフトとANDを使用しますが、最後の3行については0と評価されます。

次のプログラム(送信と同じ式)を使用して、以下のテーブルを生成しました(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])

説明

有効なギズムであるか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`)

これが今の私の仕事だと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.