터키어 동사 활용


11

입력

  • verb , 정규식과 일치하는 문자열([a-pr-vyzıöüçğş]*[aeıioöuü][bcçdfgğhj-nprsştvyz]+|([a-pr-vyzıöüçğş]*[aeıioöuü]){2})(mak|mek)
  • 복수 , 진실 또는 허위 가치
  • person , 1, 2 또는 3 값을 갖는 정수
  • tense , 1, 2 또는 3 값을 갖는 정수

산출

터키 동사의 복합 형태로 동사 의, 사람 일 / 차 / RD 사람은, 복수의 경우 복수는 이다 TRUE, 그렇지 않은 경우에, 단수

  • 경우 시제 1 단순한 존재;
  • 경우 시제 2 계속 존재한다;
  • 경우 긴장은 3, 미래입니다.

규칙

터키어 동사는 다음 세 가지 요소로 구성됩니다.

  • 줄기 제거하여 형성 mak또는 mek부정사의 끝에서;
  • 시제부호 는 다음과 같습니다.

    • 간단한 선물 :

      • 줄기가 모음으로 끝나는 경우 -r ;
      • -ir 에 따라 모음 조화 규칙 (아래 참조) 줄기가 하나 이상의 음절을 포함하는 경우 (즉 모음), 또는 다음과 같은 불규칙 동사 중 하나입니다 : olmak, almak, bilmek, bulmak, durmak, gelmek, görmek, kalmak, ölmek, sanmak, vermek, varmak, vurmak ;
      • -er 에 따라 모음 조화 규칙 줄기가 하나의 음절을 포함하고 위의 불규칙 동사에 나열되지 않은 경우.
    • 지속적인 조화 를 위해 -iyor , 여기서 모음 조화 규칙 에 따라 i가 바뀝니다 . 모음으로 끝나는 줄기는이 접미사를 추가하기 전에이 모음을 떨어 뜨립니다. 그러면 접미사는 단어의 다음 마지막 모음과 일치합니다 (정규 표현식으로 존재 함).

    • 미래를 위해 :
      • 줄기가 자음으로 끝나는 경우 모음 조화 규칙 에 따라 -ecek ;
      • 줄기가 모음으로 끝나면 모음 조화 규칙 에 따라 -yecek .
  • 개인 접미사 에 따라 모든 경우에, 액션의 공연을 나타냅니다 모음 조화 규칙 :

        |Singular|Plural|
    |---|--------|------|
    |1st|    -im |   -iz|
    |2nd|   -sin |-siniz|
    |3rd| (none) |  -ler|
    

    마지막 K 시제 미래가된다 G 전에 -im-iz 그래서, 예를 들면, (almak, TRUE, 1, 3)수득 것이다 alacağız.

모음 조화 규칙

터키어 모음은 입에서 발음되는 위치에 따라 뒤 ( a ı o u)와 앞 ( e i ö ü)의 두 그룹으로 나뉩니다 . 단어의 접미사는 루트의 모음에 따라 모음을 변경합니다.

대신 모음으로 i 가있는 위에 나열된 모든 접미사 를 사용하십시오.

  • - 접미사 앞의 마지막 모음이 ı또는 a(모두이 모음이 돌아가고 둥글 지 않은 경우);
  • -i 접미사 앞의 마지막 모음이 i또는 e(모두이 모음이 앞면과 둥글 지 않은 경우, 점선과 점이없는 I 사이의 터키어의 구분에 주목하십시오 );
  • -u 접미사 앞의 마지막 모음이 u또는 o(모두이 모음이 뒤로 둥글게 된 경우); 또는
  • - 접미사 앞의 마지막 모음이 ü또는 ö(모두 앞쪽과 둥근 쪽) 인 경우 .

현재 연속 접미사 -iyor를 주의해서 기록하십시오 . 는 i조화 만이 o변경되지 않습니다. 따라서 개인 접미사는와 일치합니다 o.

모음으로 e 가있는 위에 나열된 모든 접미사를 대신 사용하십시오.

  • -e 접미사 앞의 마지막 모음이 앞 모음 인 경우; 또는
  • -a 접미사 앞의 마지막 모음이 뒷 모음 인 경우

불규칙 동사

동사는 gitmek , tatmak , ditmek , gütmeketmek 변화 최종 t(A)에이 d(이 도전 모든 말단 포함) 모음로 시작 전에 엔딩. 만료 임의 동사 -etmek가 마찬가지로 변경 t(A)에 d, 그리고 추가 -er (이것은 다른 동사 위해 이렇게 아니지만) 단순 본 대한.

테스트 사례

gütmek, FALSE, 1, 2 -> güdüyorum
almak, TRUE, 3, 3 -> alacaklar
boğmak, TRUE, 2, 1 -> boğarsınız
ölmek, FALSE, 3, 1 -> ölür
boyamak, TRUE, 1, 2 -> boyuyoruz
affetmek, FALSE, 2, 1 -> affedersin
söylemek, TRUE, 3, 1 -> söylerler
söylemek, FALSE, 3, 2 -> söylüyor
söylemek, FALSE, 1, 3 -> söyleyeceğim

-etmek규칙에 대한 테스트 사례를 제공 할 수 있습니까?
Arnauld

@Arnauld 완료. 그렇게하면서 나는 "불규칙 동사"섹션에 추가 된 사양에 오류가 있음을 발견했습니다.
EMBLEM

사양이 매우 복잡하기 때문에 훨씬 더 많은 테스트 사례와 관련이 있습니다.
Dave

@Dave 3을 더 추가했는데, 모바일에서 충분히 오래 걸렸습니다. 나중에 더 추가하겠습니다.
EMBLEM

답변:


4

자바 스크립트 (ES6), 466 456 451 446 바이트

(v,p,w,t)=>(R=g=>g.exec(s),T=r=>s=s.slice(0,-1)+r,Z=s=>s.replace(/\d/g,c=>l=['ıuiü'[(n='aıoueiöü'.search(l))>>1],'ae'[n>>2]][c]),(s=v.slice(k=l=0,-3)).replace(/[aıoueiöü]/g,c=>(L=l,l=c,k++)),(R(/^(gi|ta|di|gü)t$/)||(R(/et$/)&&(k=1)))&&T`d`,((E=R(/[aıoueiöü]$/))&&t==2?(l=L,T``):s)+Z([(E?'':k<2&!R(/^((k?a|bi|bu|ge|o|ö)l)|dur|gör|san|v[aeu]r$/))+'r','0yor',(E?'y1c1':'1c1')+'ğkk'[--w]][t-1])+Z('0m|0z|s0n|s0n0z||l1r'.split`|`[w+w+p],t-2||(l='o')))

답을 얻지 않고 댓글을 달았습니다.

// Parameters:
//   - 'v' = verb
//   - 'p' = plural flag
//   - 'w' = person
//   - 't' = tense
(v, p, w, t) => (
  // R() - Helper function to execute a regular expression on the stem.
  R = g => g.exec(s),

  // T() - Helper function to replace the last character of the stem with 'r'.
  T = r => s = s.slice(0, -1) + r,

  // Z() - Function that applies vowel harmony to the string 's', assuming
  //       '0' = 'i' and '1' = 'e' and using the last encountered vowel 'l'.
  Z = s => s.replace(
    /\d/g,
    c => l = [
      'ıuiü' [(n = 'aıoueiöü'.search(l)) >> 1],
      'ae' [n >> 2]
    ][c]
  ),

  // Computes:
  //   - 's' = stem
  //   - 'k' = number of vowels in stem
  //   - 'l' = last vowel in stem
  //   - 'L' = penultimate vowel in stem
  (s = v.slice(k = l = 0, -3)).replace(/[aıoueiöü]/g, c => (L = l, l = c, k++)),

  // Applies ending 't' => 'd' for irregular verbs and those ending in -et(mek).
  (R(/^(gi|ta|di|gü)t$/) || (R(/et$/) && (k = 1))) && T `d`,

  // Computes 'E' = truthy value if the stem ends in a vowel.
  // If 'E' is truthy and the tense is the continuing present, drops this vowel.
  ((E = R(/[aıoueiöü]$/)) && t == 2 ? (l = L, T ``) : s) +

  // Appends sign of tense with vowel harmony.
  Z([
    // t = 1: simple present -> either '-er', '-ir' or '-r'
    (E ? '' : k < 2 & !R(/^((k?a|bi|bu|ge|o|ö)l)|dur|gör|san|v[aeu]r$/) + 'r',

    // t = 2: continuing present -> always '-iyor'
    '0yor',

    // t = 3: future -> either '-yecek', '-ecek', '-yeceğ' or '-eceğ'
    (E ? 'y1c1' : '1c1') + 'ğkk' [--w]
  ][t - 1]) +

  // Appends personal suffix with vowel harmony,
  // forcing last vowel to 'o' for continuing present.
  Z(
    '0m|0z|s0n|s0n0z||l1r'.split `|` [w + w + p],
    t - 2 || (l = 'o')
  )
)

테스트 사례

let f =
(v,p,w,t)=>(R=g=>g.exec(s),T=r=>s=s.slice(0,-1)+r,Z=s=>s.replace(/\d/g,c=>l=['ıuiü'[(n='aıoueiöü'.search(l))>>1],'ae'[n>>2]][c]),(s=v.slice(k=l=0,-3)).replace(/[aıoueiöü]/g,c=>(L=l,l=c,k++)),(R(/^(gi|ta|di|gü)t$/)||(R(/et$/)&&(k=1)))&&T`d`,((E=R(/[aıoueiöü]$/))&&t==2?(l=L,T``):s)+Z([(E?'':k<2&!R(/^((k?a|bi|bu|ge|o|ö)l)|dur|gör|san|v[aeu]r$/))+'r','0yor',(E?'y1c1':'1c1')+'ğkk'[--w]][t-1])+Z('0m|0z|s0n|s0n0z||l1r'.split`|`[w+w+p],t-2||(l='o')))

console.log(f("gütmek", false, 1, 2));    // -> güdüyorum
console.log(f("almak", true, 3, 3));      // -> alacaklar
console.log(f("boğmak", true, 2, 1));     // -> boğarsınız
console.log(f("ölmek", false, 3, 1));     // -> ölür
console.log(f("boyamak", true, 1, 2));    // -> boyuyoruz
console.log(f("affetmek", false, 2, 1));  // -> affedersin
console.log(f("söylemek", true, 3, 1));   // -> söylerler
console.log(f("söylemek", false, 3, 2));  // -> söylüyor
console.log(f("söylemek", false, 1, 3));  // -> söyleyeceğim


d-etmek로 끝나는 모든 동사 의 -mutation을 설명 합니까? JavaScript를 모르지만 수집 할 수있는 것만으로 다른 사람들과 함께 모여있는 것처럼 보입니다.
EMBLEM

@EMBLEM-수정해야합니다.
Arnauld

4

sed, 583 바이트

sed -E 's/^((bul|dur|k?al|ol|san|v[au]r)ma|(bil|gel|gör|öl|ver)me)k( . .) 1/\2\3Ir\4/;s/etmek( . .) 1/edEr\1/;s/etmek /ed /;s/^((ta)tma|([dg]i|gü)tme)k /\2\3d /;s/m[ae]k / /;s/([aıoueiöüEI])/V\1/g;s/(V.)( . .) 1/\1r\2/;s/(V.+V.+)( . .) 1/\1VIr\2/;s/( . .) 1/VEr\1/;s/(V.)?( . .) 2/VIyVor\2/;s/(V.)( . . 3)/\1y\2/;s/( . .) 3/VEcVEk\1/;s/k( . 1)/ğ\1/;s/ 0 1/VIm/;s/ 1 1/VIz/;s/ 0 2/sVIn/;s/ 1 2/sVInVIz/;s/ 0 3//;s/ 1 3/lVEr/;:l
s/([ıa][^V]*V)I/\1ı/;s/([ie][^V]*V)I/\1i/;s/([uo][^V]*V)I/\1u/;s/([üö][^V]*V)I/\1ü/;s/([aıou][^V]*V)E/\1a/;s/(V[^aEI][^V]*V)E/\1e/;t l
s/V//g'

밀접하게 관련된 Dactylic Hexameter 질문에 대한 나의 대답 과 마찬가지로 , 이것은 규칙을 정규 표현식으로 변환하는 것입니다.

용법:

다음과 같은 형식으로 입력을받습니다.

word [01] [123] [123]

테스트 사례는 다음과 같습니다.

printf 'gütmek 0 1 2
almak 1 3 3
boğmak 1 2 1
ölmek 0 3 1
boyamak 1 1 2
affetmek 0 2 1
söylemek 1 3 1
söylemek 0 3 2
söylemek 0 1 3' | sed -E '<...>';

고장:

sed -E "
# special cases for simple present tense
 s/^((bul|dur|k?al|ol|san|v[au]r)ma|(bil|gel|gör|öl|ver)me)k( . .) 1/\2\3Ir\4/;

# stemming
# always uses -er rule if simple present
 s/etmek( . .) 1/edEr\1/;
 s/etmek /ed /;
 s/^((ta)tma|([dg]i|gü)tme)k /\2\3d /;
 s/m[ae]k / /;

# mark vowels for easier expressions later
 s/([aıoueiöüEI])/V\1/g;

# simple present
 s/(V.)( . .) 1/\1r\2/;
 s/(V.+V.+)( . .) 1/\1VIr\2/;
 s/( . .) 1/VEr\1/;

# continuing present
 s/(V.)?( . .) 2/VIyVor\2/;

# future
 s/(V.)( . . 3)/\1y\2/;
 s/( . .) 3/VEcVEk\1/;

# personal suffix
 s/k( . 1)/ğ\1/;
 s/ 0 1/VIm/;
 s/ 1 1/VIz/;
 s/ 0 2/sVIn/;
 s/ 1 2/sVInVIz/;
 s/ 0 3//;
 s/ 1 3/lVEr/;

# vowel harmony
 :l
 s/([ıa][^V]*V)I/\1ı/;
 s/([ie][^V]*V)I/\1i/;
 s/([uo][^V]*V)I/\1u/;
 s/([üö][^V]*V)I/\1ü/;

 s/([aıou][^V]*V)E/\1a/;
 s/(V[^aEI][^V]*V)E/\1e/;
# keep looping until all vowels are known
 t l

# unmark vowels
 s/V//g
"

테스트 사례에 대한 결과 :

güdüyorum
alacaklar
boğarsınız
ölür
boyuyoruz
affedersin
söylerler
söylüyor
söyleyeceğim

당신은 페더 신에 대해 맞습니다. 나는 그것을 쓰는 동안 대명사를 여러 번 바꿨다
EMBLEM

사례 2에 유의하십시오. ler이 아닌 alacak lar 여야합니다 .
EMBLEM

@EMBLEM 고정; 그래도 2 바이트가 더 들었습니다. (600에서 2 바이트는 무엇입니까?)
Dave

sed -E ''sed를 bash가 아닌 언어로 지정 했으므로을 제거 할 수 있으므로 스크립트를 sed 소스 코드로 고려하십시오. 그런 다음 다음과 같이 실행할 수 있습니다. printf ...|sed -Ef filenameE 플래그에 1 바이트를 더하고 끝에 8 바이트를 저장합니다. Btw, 오늘까지 -E는 -r과 같습니다.
seshoumara
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.