Coniugare un verbo turco


11

Ingresso

  • verbo , una stringa che corrisponde all'espressione regolare([a-pr-vyzıöüçğş]*[aeıioöuü][bcçdfgğhj-nprsştvyz]+|([a-pr-vyzıöüçğş]*[aeıioöuü]){2})(mak|mek)
  • plurale , un valore di verità o falsità
  • persona , un numero intero con valore 1, 2 o 3
  • tempo , un numero intero con valore 1, 2 o 3

Produzione

La forma coniugata del verbo turca verb , in persona st / ° / ° persona, plurale, se il plurale è TRUEe singolare se non lo è, in

  • Se il tempo è 1, il presente semplice;
  • Se il tempo è 2, il presente continuo;
  • Se il tempo è 3, il futuro.

Regole

I verbi turchi sono coniugati in tre elementi, che sono in ordine:

  • Lo stelo , formato rimuovendo mako mekdalla fine dell'infinito;
  • Il segno del tempo , che è:

    • Per il semplice presente:

      • -r se lo stelo termina in una vocale;
      • -ir secondo le regole di armonia vocale (vedi sotto) se lo stelo contiene più di una sillaba (cioè vocale), o proviene da uno dei seguenti verbi irregolari: almak, bilmek, bulmak, durmak, gelmek, görmek, kalmak, olmak, ölmek, sanmak, vermek, varmak, vurmak ;
      • -er secondo le regole di armonia vocale se lo stelo contiene una sillaba e non è elencato nei verbi irregolari sopra.
    • Per il presente continuo, -iyor , dove l' i cambia secondo le regole di armonia vocale . Le radici che terminano in una vocale rilasciano questa vocale prima di aggiungere questo suffisso, dopodiché il suffisso si armonizza con l'ultima vocale della parola (garantita dall'espressione regolare).

    • Per il futuro:
      • -cucire secondo le regole di armonia vocale se lo stelo termina in una consonante;
      • -yecek secondo le regole di armonia vocale se lo stelo termina in una vocale.
  • Il suffisso personale per indicare l'esecutore dell'azione, in tutti i casi secondo le regole di armonia vocale :

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

    La finale k del tempo futuro diventa ğ prima -im e -iz , così per esempio (almak, TRUE, 1, 3)produrrebbe alacağız.

Regole di armonia vocale

Le vocali turche sono divise in due gruppi: indietro ( a ı o u) e anteriore ( e i ö ü) per dove vengono pronunciate in bocca. I suffissi di una parola cambiano vocali in base alle vocali della radice.

Tutti i suffissi di cui sopra che hanno i come una vocale invece utilizzare:

  • se l'ultima vocale prima del suffisso è ıo a(entrambe queste vocali sono posteriori e non arrotondate);
  • -i se l'ultima vocale prima del suffisso è io e(entrambe queste vocali sono anteriori e non arrotondate; si noti qui la distinzione turca tra I punteggiato e senza punto );
  • -u se l'ultima vocale prima del suffisso è uo o(entrambe queste vocali sono arretrate e arrotondate); o
  • se l'ultima vocale prima del suffisso è üo ö(entrambe queste vocali sono anteriori e arrotondate).

Prendi nota del presente suffisso continuo -iyor . L' iarmonizza, ma il onon cambia. I suffissi personali si armonizzeranno così con il o.

Tutti i suffissi sopra elencati che hanno e come vocale usano invece:

  • -e se l'ultima vocale prima del suffisso è una vocale anteriore; o
  • -a se l'ultima vocale prima del suffisso è una vocale posteriore.

Verbi irregolari

I verbi gitmek , tatmak , ditmek , gütmek ed etmek cambiano la finale tin a dprima di qualsiasi finale che inizia con una vocale (che include tutti i finali in questa sfida). Anche qualsiasi verbo che termina in -etmek cambia tin a d, e aggiunge -er per il presente semplice (anche se non è così per gli altri verbi).

Casi 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

Potresti fornire un test case per la -etmekregola?
Arnauld,

@Arnauld Done. In tal modo ho scoperto di aver commesso un errore nelle specifiche, che ho aggiunto alla sezione "verbi irregolari".
EMBLEMA

Questo potrebbe fare con molti più casi di test, poiché le specifiche sono piuttosto complesse.
Dave,

@Dave ne ho aggiunti altri 3, che mi hanno impiegato abbastanza tempo sui dispositivi mobili. Aggiungerò ancora di più in seguito.
EMBLEMA

Risposte:


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 e commentato

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

Casi 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


Questo spiega la dmutazione su tutti i verbi che terminano in -etmek ? Non conosco JavaScript, ma da quello che riesco a raccogliere sembra che sia semplicemente confuso con gli altri.
EMBLEMA

@EMBLEM - Questo dovrebbe essere risolto.
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'

Come la mia risposta alla domanda di esattore dattilico strettamente correlata , questo in realtà sta solo traducendo le regole fornite in espressioni regolari.

Uso:

Accetta input nel modulo:

word [01] [123] [123]

Quindi i casi di test sono:

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

Abbattersi:

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
"

Risultati per casi di test:

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

Hai ragione su affedersin. Ho scambiato pronomi più volte mentre lo scrivevo
EMBLEMA

Prendi nota del caso 2; dovrebbe essere alacak lar , non ler.
EMBLEMA

@EMBLEM fixed; mi è costato altri 2 byte (ma che cosa sono 2 byte su 600?)
Dave,

Puoi rimuoverlo sed -E '', dato che hai specificato sed come lingua e non bash, quindi considera lo script come codice sorgente sed. Potresti quindi eseguirlo come printf ...|sed -Ef filename:, aggiungendo 1 byte in più per il flag E, salvando 8 byte alla fine. A proposito, non ho mai saputo fino ad oggi che -E equivale a -r!
seshoumara,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.