Lojban의 유효한 자음 클러스터입니까?


13

.i xu .e'o lo zunsnagri cu drani loka jboge'a


두 개의 문자로 구성된 문자열이 입력되면 Lojban의 유효한 자음 클러스터인지 여부를 출력합니다.

여기에서 인용 한 것입니다 CLL 3.6 (오히려 또는, 유효한 자음 클러스터 쌍에 대한 규칙을 자세히 무효 한) :

1) It is forbidden for both consonants to be the same, as this would
   violate the rule against double consonants.

2) 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.

3) It is forbidden for both consonants to be drawn from the set “c”, “j”,
   “s”, “z”.

4) The specific pairs “cx”, “kx”, “xc”, “xk”, and “mz” are forbidden.

인용구는 "음성"및 "음성 없음"자음을 나타냅니다. 다음은 무성음과 자음 대응표 (CLL 3.6의 표)입니다.

UNVOICED    VOICED
   p          b
   t          d
   k          g
   f          v
   c          j
   s          z
   x          -

{x}에는 음성 대응자가 없습니다. 완전성을 위해이 목록에없는 나머지 자음 (인용 목적으로 음성 또는 무성음)은 lmnr입니다. ( y모음이며 글자 hqw는 사용되지 않습니다.)

입력은 단일 문자열이어야하지만 원하는 경우 항상 후행 줄 바꿈 옵션과 함께 정확히 두 개의 자음으로 구성되어 있다고 가정 할 수 있습니다. 결과는 진실하거나 허위 일 수 있습니다 .

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다.

테스트 사례 (이는 가능한 모든 입력 문자열이 올바른 범주에 배치됨)

Valid consonant clusters:
 bd bg bj bl bm bn br bv bz cf ck cl cm cn cp cr ct db dg dj dl dm dn dr dv
 dz fc fk fl fm fn fp fr fs ft fx gb gd gj gl gm gn gr gv gz jb jd jg jl jm
 jn jr jv kc kf kl km kn kp kr ks kt lb lc ld lf lg lj lk lm ln lp lr ls lt
 lv lx lz mb mc md mf mg mj mk ml mn mp mr ms mt mv mx nb nc nd nf ng nj nk
 nl nm np nr ns nt nv nx nz pc pf pk pl pm pn pr ps pt px rb rc rd rf rg rj
 rk rl rm rn rp rs rt rv rx rz sf sk sl sm sn sp sr st sx tc tf tk tl tm tn
 tp tr ts tx vb vd vg vj vl vm vn vr vz xf xl xm xn xp xr xs xt zb zd zg zl
 zm zn zr zv

Invalid consonant clusters:
 bb bc bf bk bp bs bt bx cb cc cd cg cj cs cv cx cz dc dd df dk dp ds dt dx
 fb fd ff fg fj fv fz gc gf gg gk gp gs gt gx jc jf jj jk jp js jt jx jz kb
 kd kg kj kk kv kx kz ll mm mz nn pb pd pg pj pp pv pz rr sb sc sd sg sj ss
 sv sz tb td tg tj tt tv tz vc vf vk vp vs vt vv vx xb xc xd xg xj xk xv xx
 xz zc zf zj zk zp zs zt zx zz

Doorknob , 이것은 codegolf.stackexchange.com/q/66053/15599에 매우 가깝습니다 . 코드의 절반 정도가 재사용 될 수 있다고 생각합니다.
Level River St

@ steveverrill 맞아, 나는 그 질문을 발견했고, 입력으로 두 문자 만 가져오고 모음을 처리 할 필요가 없다는 점에서 이것이 충분히 다르다고 생각했습니다.
Doorknob

2
@ steveverrill ...하지만 이제 답변을 자세히 살펴본 후 다시 생각하고 있습니다. 초기 자음 쌍 부분을 생략하고 "이것은 유효한 자음 쌍입니까?"
Doorknob

나는 그것이 도전들 사이의 차이를 증가시키고 이것을 단순화 할 것이라고 생각합니다. 두 가지 모두 좋은 일이 될 것입니다.
Level River St

@steveverrill 예, 동의합니다. 감사!
Doorknob

답변:


5

Pyth, 53 48 47 바이트

!}z+"mz"s.pMs[+VGGc"xcxkcsjz"2*"ptkfcsx""bdgvjz

위의 규칙에 따라 모든 유효하지 않은 쌍의 목록을 생성 한 다음 입력이 그 중 하나인지 확인합니다.

! }                        A not in B
    z                      input
    +
      "mz"                  "mz"
      s                    flattened
        .pM                permutations of each:
            s [               flatten the three-element array:
                +V              Alphabet vectorized concat with itself.
                   G            That is, duplicate letters
                   G
                c"xcxkcsjz"2     That string chopped every 2
                *               outer product of
                  "ptkfcsx"      voiced letters
                  "bdgvjz        and unvoiced letters

여기서 사용해보십시오 .


5

망막 , 59 57 54 53 52 바이트

(.)\1|[cjsz]{2}|mz

T`fb-jz`svkv
kx|xk|^v?[kpstx]v?

후행 줄 바꿈이 중요합니다. 유효한 클러스터의 경우 비어 있지 않은 문자열을 출력합니다. 유효하지 않은 경우 출력이 비어 있습니다.

온라인으로 사용해보십시오! 이렇게하면 모든 클러스터가 한 번에 테스트됩니다 (유효하지 않은 클러스터는 모두 제거하고 유효한 클러스터는 그대로 유지). 그렇게하려면 ^앵커를 \b단어 경계 로 바꿔야했습니다 .

동일한 바이트 수에 대한 또 다른 솔루션 :

(.)\1|[cjsz]{2}|mz

T`fk-dbz`scv
cx|xc|^v?[cpstx]v?

설명

목표는 모든 유효하지 않은 쌍을 완전히 제거하는 것입니다. 하나 이상의 문자가 남아있는 한 원하는대로 유효한 쌍으로 할 수 있습니다.

(.)\1|[cjsz]{2}|mz

이 규칙은 세 가지 규칙을 처리합니다. (.)\1모든 페어 위반 규칙 1 [cjsz]{2}과 일치합니다 . 모든 페어 위반 규칙 과 일치합니다 mz.

잎 두 지배하고있는 다른 특정 쌍 xk, kx, xccx. 사전 처리를 수행하여 많은 바이트를 절약 할 수 있으므로 더 적은 수의 사례를 처리해야합니다.

T`fb-jz`svkv

아이디어는 물론, 하나에 모든 소리 난 자음을 축소하는 것입니다 kc. 또한겠다 f으로 s필요에 의해. 이것은 개별 문자를 다른 문자로 대체하는 음역 단계입니다. 실제 매핑을 보려면 범위를 확장하고 대상 목록의 마지막 문자가 무한정 반복됨을 기억해야합니다.

fbcdefghijz
svkvvvvvvvv

초기 f => s는 음성 자음으로 바뀌는 후자 f => v를 무시하기 때문에 필요 f합니다. 또한 c로 바뀌는 것을 볼 수 k있습니다. 그리고 모든 음성 자음 bdgjz이로 바뀝니다 v. 잎 그건 ehi... 다행히 이들 중 하나 모음 또는 로지 반에서 사용되지 않습니다. 같은 것을 달성 할 수 있었다

T`fcb-jz`skv

또는 위에 게시 한 다른 솔루션을 사용하여 매우 다른 음역을 사용합니다 (역 범위가 k있으며 c대신 대신 사용됨).

이제 나머지 유효하지 않은 조합을 훨씬 쉽게 확인할 수 있습니다.

kx|xk|^v?[kpstx]v?

cx그리고 cx이되었다 kx하고 xk, 그래서 우리는 이제 두 개의 사례를 확인해야합니다. 규칙 2, 우리는 (감소 옵션 유성 자음으로 시작부터 전체 쌍을 일치하려고 v() 우리가 확인 할 필요가 없습니다 필수 무성 자음 fc별도로) 및 다른 옵션 유성 자음. 페어가 유성음과 무성음의 혼합 인 경우 두 옵션 중 하나 v가 일치하고 전체 페어가 제거됩니다. 그렇지 않으면 쌍이 유성 자음으로 시작하고 두 번째로 다른 것이있는 경우에만 일치 할 수 있습니다.이 경우 첫 번째 문자 만 제거되고 다른 문자는 그대로 유지되어 여전히 진실한 결과를 제공합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.