Konjugieren Sie ein türkisches Verb

11

Eingang

  • Verb , eine Zeichenfolge, die dem regulären Ausdruck entspricht([a-pr-vyzıöüçğş]*[aeıioöuü][bcçdfgğhj-nprsştvyz]+|([a-pr-vyzıöüçğş]*[aeıioöuü]){2})(mak|mek)
  • Plural , ein wahrer oder falscher Wert
  • Person , eine Ganzzahl mit dem Wert 1, 2 oder 3
  • angespannt , eine ganze Zahl mit dem Wert 1, 2 oder 3

Ausgabe

Die konjugierte Form des türkischen Verb Verbs , in Person st / nd / rd Person, Plural , wenn Plural ist TRUEund Singular , wenn dies nicht der Fall, in

  • Wenn angespannt 1 ist , das Präsens;
  • Wenn angespannt 2, die weiterhin vorhanden;
  • Wenn angespannt 3, die Zukunft.

Regeln

Türkische Verben werden in drei Elementen konjugiert, die in der Reihenfolge sind:

  • Der Stamm , gebildet durch Entfernen makoder Entfernen mekdes Infinitivs;
  • Das Zeichen der Zeitform , das ist:

    • Für das einfache Geschenk:

      • -r wenn der Stamm in einem Vokal endet;
      • -ir gemäß den Vokalharmonie-Regeln (siehe unten), wenn der Stamm mehr als eine Silbe (dh einen Vokal) enthält oder aus einem der folgenden unregelmäßigen Verben stammt: Almak, Bilmek, Bulmak, Durmak, Gelmek, Görmek, Kalmak, Olmak, ölmek, sanmak, vermek, varmak, vurmak ;
      • -er nach Vokalharmonie-Regeln, wenn der Stamm eine Silbe enthält und in den obigen unregelmäßigen Verben nicht aufgeführt ist.
    • Für die fortdauernde Gegenwart, -iyor , wo sich das i gemäß den Regeln der Vokalharmonie ändert . Stämme, die mit einem Vokal enden, lassen diesen Vokal fallen, bevor sie dieses Suffix hinzufügen, woraufhin das Suffix mit dem vorletzten Vokal im Wort harmoniert (der durch den regulären Ausdruck garantiert existiert).

    • Für die Zukunft:
      • -ecek nach Vokalharmonie-Regeln, wenn der Stamm in einem Konsonanten endet;
      • -yecek nach Vokalharmonie-Regeln, wenn der Stamm in einem Vokal endet.
  • Das persönliche Suffix , das den Ausführenden der Aktion angibt, in allen Fällen gemäß den Vokalharmonie-Regeln :

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

    Das letzte k der Zukunftsform wird ğ vor -im und -iz , würde also zum Beispiel (almak, TRUE, 1, 3)nachgeben alacağız.

Vokalharmonie Regeln

Türkische Vokale werden in zwei Gruppen unterteilt: hinten ( a ı o u) und vorne ( e i ö ü), wobei sie im Mund ausgesprochen werden. Die Suffixe eines Wortes ändern die Vokale entsprechend den Vokalen der Wurzel.

Alle oben aufgeführten Suffixe, die i als Vokal haben, verwenden stattdessen:

  • wenn der letzte Vokal vor dem Suffix ıoder ist a(beide Vokale sind zurück und ungerundet);
  • -i wenn der letzte Vokal vor dem Suffix ioder ist e(beide Vokale sind vorne und ungerundet; beachten Sie hier die türkische Unterscheidung zwischen gepunktetem und punktlosem I );
  • -u wenn der letzte Vokal vor dem Suffix uoder ist o(beide Vokale sind zurück und gerundet); oder
  • wenn der letzte Vokal vor dem Suffix üoder ist ö(beide Vokale sind vorne und gerundet).

Beachten Sie sorgfältig das vorliegende fortlaufende Suffix -iyor . Das iharmoniert, aber das oändert sich nicht. Die persönlichen Suffixe harmonieren somit mit dem o.

Alle oben aufgeführten Suffixe, die e als Vokal haben, verwenden stattdessen:

  • -e wenn der letzte Vokal vor dem Suffix ein Frontvokal ist; oder
  • -a wenn der letzte Vokal vor dem Suffix ein Rückvokal ist.

Unregelmäßige Verben

Die Verben gitmek , tatmak , ditmek , gütmek und etmek Änderung der letzte tzu einem dvor allen Endungen , die mit einem Vokal beginnen (die in dieser Herausforderung alle Endungen enthält). Jedes Verb, das mit -etmek endet, ändert ebenfalls das tin a dund hängt -er für die einfache Gegenwart an (obwohl dies für die anderen Verben nicht der Fall ist).

Testfälle

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
EMBLEM
quelle
Könnten Sie einen Testfall für die -etmekRegel bereitstellen ?
Arnauld
@Arnauld Fertig. Dabei habe ich festgestellt, dass ich einen Fehler in der Spezifikation gemacht habe, den ich an den Abschnitt "Unregelmäßige Verben" angehängt habe.
EMBLEM
Dies könnte mit viel mehr Testfällen zu tun haben, da die Spezifikation ziemlich komplex ist.
Dave
@ Dave Ich habe 3 weitere hinzugefügt, was auf dem Handy lange genug gedauert hat. Ich werde später noch mehr hinzufügen.
EMBLEM

Antworten:

4

Javascript (ES6), 466 456 451 446 Bytes

(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 und kommentiert

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

Testfälle

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
quelle
Berücksichtigt dies die d-mutation für alle Verben, die mit -etmek enden ? Ich kenne kein JavaScript, aber soweit ich das beurteilen kann, sieht es so aus, als wäre es nur mit den anderen zusammengewürfelt.
EMBLEM
@EMBLEM - Dies sollte behoben sein.
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'

Wie meine Antwort auf die eng verwandte Frage nach dem Dactylic Hexameter übersetzt dies wirklich nur die Regeln, wie sie in reguläre Ausdrücke gegeben sind.

Verwendungszweck:

Nimmt Eingaben in das Formular vor:

word [01] [123] [123]

Die Testfälle sind also:

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

Nervenzusammenbruch:

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
"

Ergebnisse für Testfälle:

güdüyorum
alacaklar
boğarsınız
ölür
boyuyoruz
affedersin
söylerler
söylüyor
söyleyeceğim
Dave
quelle
Sie haben Recht mit Affedersin. Ich habe mehrmals die Pronomen gewechselt, als ich das geschrieben habe
EMBLEM
Beachten Sie Fall 2; es sollte alacak lar sein , nicht ler.
EMBLEM
@EMBLEM behoben; kostete mich 2 weitere Bytes (aber was sind 2 Bytes in 600?)
Dave
Sie können entfernen sed -E '', da Sie sed als Sprache und nicht als Bash angegeben haben. Betrachten Sie das Skript daher als sed-Quellcode. Sie könnten es dann wie printf ...|sed -Ef filenamefolgt ausführen: Fügen Sie 1 Byte mehr für das E-Flag hinzu und sparen Sie am Ende 8 Byte. Übrigens wusste ich bis heute nie, dass -E gleich -r ist!
Seshoumara