Conjuguer un verbe turc

11

Contribution

  • verbe , une chaîne qui correspond à l'expression régulière([a-pr-vyzıöüçğş]*[aeıioöuü][bcçdfgğhj-nprsştvyz]+|([a-pr-vyzıöüçğş]*[aeıioöuü]){2})(mak|mek)
  • pluriel , valeur vraie ou fausse
  • personne , un entier ayant la valeur 1, 2 ou 3
  • tendu , un entier ayant la valeur 1, 2 ou 3

Production

La forme conjuguée du verbe turc verbe , en personne st / e / e personne, pluriel si pluriel est TRUEsingulier et si ce n'est pas, en

  • Si le temps est 1, le simple présent;
  • Si le temps est 2, le présent continu;
  • Si le temps est 3, l'avenir.

Règles

Les verbes turcs sont conjugués en trois éléments, qui sont en ordre:

  • La tige , formée en enlevant makou mekà la fin de l'infinitif;
  • Le signe du temps , qui est:

    • Pour le simple cadeau:

      • -r si la tige se termine par une voyelle;
      • -ir selon les règles d'harmonie des voyelles (voir ci-dessous) si la tige contient plus d'une syllabe (c'est-à-dire une voyelle), ou provient d'un des verbes irréguliers suivants: almak, bilmek, bulmak, durmak, gelmek, görmek, kalmak, olmak, ölmek, sanmak, vermek, varmak, vurmak ;
      • -er selon les règles d'harmonie des voyelles si la tige contient une syllabe et n'est pas répertoriée dans les verbes irréguliers ci-dessus.
    • Pour le présent continu, -iyor , où le i change selon les règles d'harmonie des voyelles . Les tiges qui se terminent par une voyelle suppriment cette voyelle avant d'ajouter ce suffixe, après quoi le suffixe s'harmonise avec l'avant-dernière voyelle du mot (garantie d'exister par l'expression régulière).

    • Pour le futur:
      • -écouter selon les règles d'harmonie des voyelles si la tige se termine par une consonne;
      • -yecek selon les règles d'harmonie des voyelles si la tige se termine par une voyelle.
  • Le suffixe personnel pour indiquer l'interprète de l'action, dans tous les cas selon les règles d'harmonie des voyelles :

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

    Le k final du futur devient ğ avant -im et -iz , donc par exemple (almak, TRUE, 1, 3)céderait alacağız.

Règles d'harmonie des voyelles

Les voyelles turques sont divisées en deux groupes: arrière ( a ı o u) et avant ( e i ö ü) par où dans la bouche elles sont prononcées. Les suffixes d'un mot changent de voyelles en fonction des voyelles de la racine.

Tous les suffixes énumérés ci-dessus qui ont i comme voyelle utilisent à la place:

  • si la dernière voyelle avant le suffixe est ıou a(ces deux voyelles sont de retour et non arrondies);
  • -i si la dernière voyelle avant le suffixe est iou e(ces deux voyelles sont avant et non arrondies; notez ici la distinction du turc entre I pointillé et sans point I );
  • -u si la dernière voyelle avant le suffixe est uou o(ces deux voyelles sont de retour et arrondies); ou
  • si la dernière voyelle avant le suffixe est üou ö(ces deux voyelles sont avant et arrondies).

Prenez bien note du suffixe continu actuel -iyor . L' iharmonise, mais one change pas. Les suffixes personnels s'harmoniseront ainsi avec le o.

Tous les suffixes répertoriés ci-dessus qui ont e comme voyelle utilisent à la place:

  • -e si la dernière voyelle avant le suffixe est une voyelle avant; ou
  • -a si la dernière voyelle avant le suffixe est une voyelle arrière.

Verbes irréguliers

Les verbes gitmek , tatmak , ditmek , gütmek et etmek changent la finale ten a davant toute fin qui commence par une voyelle (qui inclut toutes les terminaisons de ce défi). Tout verbe qui se termine par -etmek change également le ten a det ajoute -er pour le présent simple (bien que ce ne soit pas le cas pour les autres verbes).

Cas de test

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
EMBLÈME
la source
Pourriez-vous fournir un cas de test pour la -etmekrègle?
Arnauld
@Arnauld Done. Ce faisant, j'ai découvert que j'avais fait une erreur dans la spécification, que j'ai ajoutée à la section "verbes irréguliers".
EMBLEM
Cela pourrait faire avec beaucoup plus de cas de test, car la spécification est assez complexe.
Dave
@Dave J'en ai ajouté 3 de plus, ce qui m'a pris assez de temps sur mobile. J'en ajouterai encore plus plus tard.
EMBLEM

Réponses:

4

Javascript (ES6), 466 456 451 446 octets

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

Déchargé et commenté

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

Cas de test

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
la source
Cela explique-t-il la dmutation de tous les verbes se terminant par -etmek ? Je ne connais pas JavaScript mais d'après ce que je peux en déduire, il semble qu'il soit simplement intégré aux autres.
EMBLEM
@EMBLEM - Cela devrait être corrigé.
Arnauld
4

sed, 583 octets

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'

Comme ma réponse à la question étroitement liée de l'hexamètre dactylique , il s'agit vraiment de traduire les règles telles qu'elles sont données en expressions régulières.

Usage:

Prend la saisie sous la forme:

word [01] [123] [123]

Les cas de test sont donc:

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

Panne:

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
"

Résultats pour les cas de test:

güdüyorum
alacaklar
boğarsınız
ölür
boyuyoruz
affedersin
söylerler
söylüyor
söyleyeceğim
Dave
la source
Vous avez raison sur l'affedersin. J'ai changé de pronom plusieurs fois en écrivant cela
EMBLEM
Prenez note du cas 2; il devrait être alacak lar , pas ler.
EMBLEM
@EMBLEM fixed; m'a coûté 2 octets de plus (mais qu'est-ce que 2 octets sur 600?)
Dave
Vous pouvez supprimer sed -E '', puisque vous avez spécifié sed comme étant la langue et non bash, alors considérez le script comme du code source sed. Vous pouvez ensuite l'exécuter comme printf ...|sed -Ef filename:, en ajoutant 1 octet de plus pour l'indicateur E, en économisant 8 octets à la fin. Btw, je n'ai jamais su jusqu'à aujourd'hui que -E est équivalent à -r!
seshoumara