Konjugasi kata kerja Turki

11

Memasukkan

  • kata kerja , string yang cocok dengan ekspresi reguler([a-pr-vyzıöüçğş]*[aeıioöuü][bcçdfgğhj-nprsştvyz]+|([a-pr-vyzıöüçğş]*[aeıioöuü]){2})(mak|mek)
  • jamak , nilai yang benar atau salah
  • orang , bilangan bulat memiliki nilai 1, 2, atau 3
  • tense , bilangan bulat yang memiliki nilai 1, 2, atau 3

Keluaran

Bentuk terkonjugasi dari kata kerja Turki kerja , di orang st / nd / rd orang, jamak jika jamak adalah TRUEdan tunggal jika tidak, di

  • Jika tegang adalah 1, hadiah sederhana;
  • Jika tegang adalah 2, hadiah yang berkelanjutan;
  • Jika tegang adalah 3, masa depan.

Aturan

Kata kerja Turki dikonjugasikan dalam tiga elemen, yang berurutan:

  • The batang , dibentuk dengan menghapus makatau mekdari akhir infinitive;
  • The tanda tegang , yaitu:

    • Untuk hadiah sederhana:

      • -r jika batang berakhir dengan vokal;
      • -ir sesuai dengan aturan harmoni vokal (lihat di bawah) jika batang mengandung lebih dari satu suku kata (yaitu vokal), atau berasal dari salah satu kata kerja tidak beraturan berikut: almak, bilmek, bulmak, durmak, gelmek, görmek, kalmak, olmak, ölmek, sanmak, vermek, varmak, vurmak ;
      • -er menurut aturan harmoni vokal jika batang mengandung satu suku kata dan tidak tercantum dalam kata kerja tidak beraturan di atas.
    • Untuk hadiah yang berkelanjutan, -iyor , di mana saya berubah sesuai dengan aturan harmoni vokal . Batang yang diakhiri dengan vokal menjatuhkan vokal ini sebelum menambahkan sufiks ini, di mana sufiks diselaraskan dengan vokal bersebelahan dengan kata terakhir (dijamin ada dengan ekspresi reguler).

    • Demi masa depan:
      • -ecek menurut aturan harmoni vokal jika batang berakhiran konsonan;
      • -Yecek menurut aturan harmoni vokal jika batang berakhir dengan vokal.
  • The akhiran pribadi untuk menunjukkan pemain aksi, dalam semua kasus sesuai dengan aturan harmoni vokal :

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

    Final k masa depan tegang menjadi ğ sebelum -im dan -iz , jadi misalnya (almak, TRUE, 1, 3)akan menghasilkan alacağız.

Aturan harmoni vokal

Vokal bahasa Turki dibagi menjadi dua kelompok: belakang ( a ı o u) dan depan ( e i ö ü) di mana di dalam mulut mereka diucapkan. Sufiks kata ganti vokal sesuai dengan vokal root.

Semua sufiks yang tercantum di atas yang menjadikan saya sebagai vokal, gunakan:

  • jika vokal terakhir sebelum sufiks adalah ıatau a(kedua vokal ini kembali dan tidak dikelilingi);
  • -i jika vokal terakhir sebelum sufiks adalah iatau e(kedua vokal ini di depan dan di luar; perhatikan di sini perbedaan bahasa Turki antara bertitik dan tanpa titik I );
  • -u jika vokal terakhir sebelum sufiks uatau o(kedua vokal ini kembali dan bulat); atau
  • jika vokal terakhir sebelum sufiks üatau ö(kedua vokal ini di depan dan bulat).

Perhatikan baik-baik sufiks kontinu saat ini -iyor . The iselaras, tetapi otidak berubah. Sufiks pribadi akan diselaraskan dengan o.

Semua sufiks yang tercantum di atas yang memiliki e sebagai vokal, gunakan:

  • -e jika vokal terakhir sebelum sufiks adalah vokal depan; atau
  • -a jika vokal terakhir sebelum sufiks adalah vokal belakang.

Kata kerja tak beraturan

Kata kerja gitmek , tatmak , ditmek , gütmek , dan etmek perubahan final tke dsebelum ujung yang dimulai dengan vokal (yang mencakup semua ujung dalam tantangan ini). Kata kerja apa pun yang berakhiran -etmek juga mengubah tke d, dan menambahkan -er untuk hadiah sederhana (meskipun ini tidak demikian untuk kata kerja lainnya).

Uji kasus

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
LAMBANG
sumber
Bisakah Anda memberikan test case untuk -etmekaturan tersebut?
Arnauld
@Arnauld Selesai. Dalam melakukannya saya menemukan saya membuat kesalahan dalam spesifikasi, yang telah saya tambahkan ke bagian "kata kerja tidak beraturan".
EMBLEM
Ini bisa dilakukan dengan lebih banyak kasus uji, karena speknya cukup kompleks.
Dave
@ Pernah saya menambahkan 3 lagi, yang cukup lama di ponsel. Saya akan menambahkan lebih banyak lagi nanti.
EMBLEM

Jawaban:

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

Ungofled dan berkomentar

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

Uji kasus

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

Arnauld
sumber
Apakah akun ini untuk d-mutasi pada semua kata kerja yang berakhiran -etmek ? Saya tidak tahu JavaScript, tetapi dari apa yang bisa saya kumpulkan sepertinya hanya disatukan dengan yang lain.
EMBLEM
@EMBLEM - Ini harus diperbaiki.
Arnauld
4

sed, 583 bytes

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'

Seperti jawaban saya untuk pertanyaan Hexameter Dactylic yang terkait erat , ini benar-benar hanya menerjemahkan aturan yang diberikan ke dalam ekspresi reguler.

Pemakaian:

Mengambil input dalam bentuk:

word [01] [123] [123]

Jadi kasus uji adalah:

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

Kerusakan:

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
"

Hasil untuk kasus uji:

güdüyorum
alacaklar
boğarsınız
ölür
boyuyoruz
affedersin
söylerler
söylüyor
söyleyeceğim
Dave
sumber
Anda benar tentang affedersin. Saya mengganti kata ganti beberapa kali saat menulis itu
EMBLEM
Perhatikan kasus 2; itu harus alacak lar , bukan ler.
EMBLEM
@EMBLEM sudah diperbaiki; saya dikenakan biaya 2 byte lebih (tapi apa 2 byte dalam 600?)
Dave
Anda dapat menghapus sed -E '', karena Anda menetapkan sed sebagai bahasa dan bukan bash, jadi anggap skrip sebagai kode sumber sed. Anda kemudian dapat menjalankannya seperti printf ...|sed -Ef filename:, menambahkan 1 byte lebih untuk bendera E, menghemat 8 byte pada akhirnya. Btw, tidak pernah tahu sampai hari ini bahwa -E setara dengan -r!
seshoumara