¿ xu ti te gismytermorna? (이것은 유효한 gismu입니까?)


25

(문자 그대로 : "이것은 gismu 형식을 따르거나 실현 합니까?")

전제

Lojban 언어 는 생성 된 언어로 , 일부 단어가 자연스럽게 개발되지 않고 만들어졌습니다. Lojban의 의미 적 기반은 중국어, 힌디어 및 영어와 같이 널리 사용되는 자연 언어의 뿌리를 결합하여 합성 된 gismu 또는 근사 입니다. 모든 gismu의 길이 는 5 글자이며 엄격한 형식을 따릅니다.

정보

우리의 목적을 위해 Lojban 알파벳은 다음과 같습니다.

abcdefgijklmnoprstuvxz

즉,이없는 로마자입니다 hqwy.

이 알파벳은 네 가지 범주로 나눌 수 있습니다.

  • 모음 aeiou

  • 소 노트 자음 lmnr

  • 무성 자음 ptkfcsx. 목소리가 들리면 이것들은 각각 ...

  • 음성 자음 bdgvjz(음성 자음이 없습니다 x.)

유효한 gismu가 되려면 5 자 길이의 문자열이 있어야합니다.

  1. 자음 모음 패턴 중 하나에 CVCCV있거나 또는 CCVCV여기서 C는 자음을 나타내고 V는 모음을 나타냅니다.

  2. 자음 일치 규칙을 따르십시오.

CCVCV 단어에 대한 자음 일치 규칙 :

처음 두 문자는 다음 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 ) :

세 번째와 네 번째 문자는 다음 규칙을 따라야합니다.

  1. 두 자음이 동일하게 금지되어 있습니다 ...]

  2. 한 자음은 소리를 내고 다른 자음은 소리를 내지 않습니다. 자음 "l", "m", "n"및 "r"은이 제한에서 제외됩니다. 결과적으로 "bf"는 금지되며 "sd"도 "fl"및 "vl"과 "ls"및 "lz"는 모두 허용됩니다.

  3. 세트 "c", "j", "s", "z"에서 두 자음이 모두 추출되는 것은 금지되어 있습니다.

  4. 특정 쌍 "cx", "kx", "xc", "xk"및 "mz"는 금지되어 있습니다.

가능한 쌍은 179 개입니다.

도전

주어진 문자열이 gismu 형성 규칙을 따르는 지 확인하십시오 . 이것은 이므로 바이트 단위의 최단 솔루션이 이깁니다.

입력 : Lojban 알파벳에서 길이가 5 인 문자열.

출력 : 문자열이 gismu 일 수 있으면 참 값 이고, 그렇지 않으면 거짓 값입니다.

테스트 사례

유효한:

gismu
cfipu
ranxi
mupno
rimge
zosxa

유효하지 않습니다 :

ejram
xitot
dtpno
rcare
pxuja
cetvu

추가 테스트 사례 :이 텍스트 파일 에는 유효한 모든 gismu가 한 줄에 하나씩 포함되어 있습니다.

Lojban을 잘 모르므로 제목 번역이 잘못되었다고 생각합니다. 도움을 부탁드립니다.


8
Lojban 발음은 음성이므로 GIF에서와 같이 gismu 는 딱딱한 g로 발음됩니다.
lirtosiast

12
GIF의 공식 발음이 Jiff와 같기 때문에 이것이 좋은 예인지는 모르겠습니다. : p
geokavel

사이드 질문 : 모두 이후 sk언어의 일부, 무엇 발음 c이?
Fatalize

2
@ 운명 : 그것은 "sh"입니다.
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 심볼 (이를 이해하는 사람들을위한)은 wikipedia 페이지에 있습니다.
Level River 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을 사용하여 false로 초기화하십시오 z=!c='[cjsztdpbfvkgxmnlr]'. 이것은 작동하지만 경고를 제공합니다 warning: found = in conditional, should be ==.

프로그램에서 함수로 변경하십시오 (질문에 따르면 바이트 단위의 가장 짧은 "프로그램"이 승리하기 때문에 프로그램으로 남겨 두었습니다.)

첫 번째 게시물의 변경 사항 요약

정규 표현식 / 매칭 부분의 주요 점검.

상수 72는 69로 변경되어 매직 문자열에서 가장 낮은 ASCII 코드는 13이 아닌 10입니다. 이렇게하면 이스케이프 시퀀스 대신 골프 버전에서 리터럴 개행 문자를 사용할 수 있습니다.

매직 스트링 'mzxcxkx'은 CVCCV 유형 테이블에서 5 개의 금지 된 문자에 대한 산술 규칙을 대체합니다.

ungolfed 버전

공백을 추가하고 매직 문자열의 줄 바꿈을 \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 비트 만 필요합니다. 마지막 2 개의 경우, 상위 비트는 1이어야하므로 선행 0 대신 선행 1을 갖기 위해 음수 (문자 \n:) 가 생성 됩니다. 우리는 테이블의 마지막 세 행을 포함하고 싶지 않으므로 rightshift 및 ANDing을 1로 사용하는 대신 rightshift 및 AND를 사용 1-j/14하여 일반적으로 1로 평가하지만 마지막 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

기능을 허용하도록 표현을 변경했습니다. 너무 오래 걸려서 죄송합니다.
lirtosiast

6

자바 스크립트 (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그렇지 않은 경우 마지막 문자 (truthy)를 포함하는 배열을 리턴합니다 .

많은 크기는 하드 코딩 된 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

자바 스크립트 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.