Liên hợp một động từ tiếng Thổ Nhĩ Kỳ


11

Đầu vào

  • động từ , một chuỗi phù hợp với biểu thức thông thường([a-pr-vyzıöüçğş]*[aeıioöuü][bcçdfgğhj-nprsştvyz]+|([a-pr-vyzıöüçğş]*[aeıioöuü]){2})(mak|mek)
  • số nhiều , một giá trị trung thực hoặc giả
  • người , một số nguyên có giá trị 1, 2 hoặc 3
  • thì , một số nguyên có giá trị 1, 2 hoặc 3

Đầu ra

Hình thức liên hợp của động từ Thổ Nhĩ Kỳ động từ , trong người st / nd / thứ người, số nhiều nếu số nhiềuTRUEvà đặc biệt nếu nó không phải là, trong

  • Nếu thì là 1, thì hiện tại đơn giản;
  • Nếu thì là 2, thì hiện tại tiếp tục;
  • Nếu căng thẳng là 3, tương lai.

Quy tắc

Động từ Thổ Nhĩ Kỳ được kết hợp trong ba yếu tố, theo thứ tự:

  • Các gốc , hình thành bằng cách loại bỏ makhoặc mektừ ngày kết thúc của infinitive;
  • Các dấu hiệu của căng thẳng , đó là:

    • Đối với hiện tại đơn giản:

      • -r nếu thân cây kết thúc bằng nguyên âm;
      • -ir theo quy tắc hòa âm nguyên âm (xem bên dưới) nếu thân cây chứa nhiều hơn một âm tiết (nghĩa là nguyên âm), hoặc là từ một trong những động từ bất quy tắc sau: almak, bilmek, bulmak, durmak, gelmek, görmek, kalmak, olm ölmek, sanmak, vermek, varmak, vurmak ;
      • -er theo quy tắc hòa âm nguyên âm nếu gốc chứa một âm tiết và không được liệt kê trong các động từ bất quy tắc ở trên.
    • Đối với hiện tại tiếp tục, -iyor , nơi i thay đổi theo quy tắc hòa âm nguyên âm . Các gốc kết thúc bằng một nguyên âm thả nguyên âm này trước khi thêm hậu tố này, trong đó hậu tố hài hòa với nguyên âm tiếp theo trong từ (được đảm bảo tồn tại bởi biểu thức chính quy).

    • Cho tương lai:
      • -ecek theo quy tắc hòa âm nguyên âm nếu thân cây kết thúc bằng một phụ âm;
      • -yecek theo quy tắc hòa âm nguyên âm nếu thân cây kết thúc bằng nguyên âm.
  • Các hậu tố cá nhân để chỉ biểu diễn của hành động, trong mọi trường hợp theo quy tắc hài hòa nguyên âm :

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

    K cuối cùng của thì tương lai trở thành ğ trước -im-iz , vì vậy, ví dụ (almak, TRUE, 1, 3)sẽ mang lại alacağız.

Nguyên tắc hòa âm

Nguyên âm Thổ Nhĩ Kỳ được chia thành hai nhóm: back ( a ı o u) và front ( e i ö ü) theo nơi phát âm trong miệng. Các hậu tố của một nguyên âm thay đổi nguyên âm theo nguyên âm gốc.

Tất cả các hậu tố được liệt kê ở trên có i là nguyên âm thay vì sử dụng:

  • -I nếu nguyên âm cuối cùng trước hậu tố là ıhoặc a(cả hai nguyên âm này đều trở lại và không có dấu);
  • -i nếu nguyên âm cuối cùng trước hậu tố là ihoặc e(cả hai nguyên âm này đều ở phía trước và không có dấu chấm ; lưu ý ở đây sự phân biệt của Thổ Nhĩ Kỳ giữa I chấm và không dấu chấm );
  • -u nếu nguyên âm cuối trước hậu tố là uhoặc o(cả hai nguyên âm này đều quay lại và làm tròn); hoặc là
  • nếu nguyên âm cuối trước hậu tố là ühoặc ö(cả hai nguyên âm này đều ở phía trước và được làm tròn).

Hãy lưu ý cẩn thận của hậu tố liên tục hiện tại -iyor . Sự ihài hòa, nhưng okhông thay đổi. Các hậu tố cá nhân do đó sẽ hài hòa với o.

Tất cả các hậu tố được liệt kê ở trên có e là nguyên âm thay vì sử dụng:

  • -e nếu nguyên âm cuối trước hậu tố là nguyên âm trước; hoặc là
  • -a nếu nguyên âm cuối trước hậu tố là nguyên âm ngược.

Động từ bất quy tắc

Các động từ gitmek , tatmak , ditmek , gütmeketmek thay đổi cuối cùng tthành một dtrước khi bất kỳ kết thúc bắt đầu bằng một nguyên âm (bao gồm tất cả các kết thúc trong thử thách này). Bất kỳ động từ nào kết thúc bằng -etmek cũng thay đổi tthành a dvà nối thêm -er cho hiện tại đơn giản (mặc dù điều này không đúng với các động từ khác).

Các trường hợp thử nghiệm

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

Bạn có thể cung cấp một trường hợp thử nghiệm cho -etmekquy tắc?
Arnauld

@Arnauld Xong. Khi làm như vậy tôi phát hiện ra tôi đã mắc một lỗi trong đặc tả, mà tôi đã thêm vào phần "động từ bất quy tắc".
EMBLEM

Điều này có thể làm với rất nhiều trường hợp thử nghiệm, vì thông số kỹ thuật khá phức tạp.
Dave

@Dave tôi đã thêm 3 cái nữa, nó đã đưa tôi đủ lâu trên di động. Tôi sẽ thêm nhiều hơn sau này.
EMBLEM

Câu trả lời:


4

Javascript (ES6), 466 456 451 446 byte

(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')))

Ủng hộ và bình luận

// 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')
  )
)

Các trường hợp thử nghiệm

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


Có tài khoản này cho d-muting trên tất cả các động từ kết thúc bằng -etmek ? Tôi không biết JavaScript nhưng từ những gì tôi có thể thu thập, có vẻ như nó chỉ được gộp chung với những người khác.
EMBLEM

@EMBLEM - Điều này nên được sửa.
Arnauld

4

sed, 583 byte

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'

Giống như câu trả lời của tôi cho câu hỏi Dactylic Hexameter liên quan chặt chẽ , đây thực sự chỉ là dịch các quy tắc như được đưa ra thành các biểu thức thông thường.

Sử dụng:

Có đầu vào ở dạng:

word [01] [123] [123]

Vì vậy, các trường hợp thử nghiệm là:

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 '<...>';

Phá vỡ:

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
"

Kết quả cho các trường hợp thử nghiệm:

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

Bạn đúng về affedersin. Tôi đã chuyển đại từ nhiều lần trong khi viết nó
EMBLEM

Lưu ý trường hợp 2; nó phải là lar alacak , không phải ler .
EMBLEM

@EMBLEM cố định; tốn thêm 2 byte nữa (nhưng 2 byte trong 600 là bao nhiêu?)
Dave

Bạn có thể xóa sed -E '', vì bạn đã chỉ định sed là ngôn ngữ và không phải là bash, vì vậy hãy xem tập lệnh là mã nguồn sed. Sau đó, bạn có thể chạy nó như : printf ...|sed -Ef filename, thêm 1 byte cho cờ E, cuối cùng tiết kiệm 8 byte. Btw, chưa bao giờ biết cho đến ngày hôm nay rằng -E tương đương với -r!
seshoumara
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.