ผันคำกริยาภาษาตุรกี


11

อินพุต

  • กริยาสตริงที่ตรงกับการแสดงออกปกติ([a-pr-vyzıöüçğş]*[aeıioöuü][bcçdfgğhj-nprsştvyz]+|([a-pr-vyzıöüçğş]*[aeıioöuü]){2})(mak|mek)
  • พหูพจน์ค่าความจริงหรือเท็จ
  • person , จำนวนเต็มมีค่าเป็น 1, 2 หรือ 3
  • tenseคือเลขจำนวนเต็มที่มีค่า 1, 2 หรือ 3

เอาท์พุต

รูปแบบคอนจูเกตของคำกริยาตุรกีคำกริยาในคนST / ครั้ง / ถนนคนพหูพจน์ถ้าเป็นพหูพจน์เป็นTRUEเอกเทศและถ้ามันไม่ได้ใน

  • ถ้ากาลเป็น 1 สิ่งที่ง่าย
  • ถ้ากาลเป็น 2, ปัจจุบันอย่างต่อเนื่อง;
  • ถ้ากาลเป็น 3 อนาคต

กฎระเบียบ

คำกริยาภาษาตุรกีประกอบกันในสามองค์ประกอบซึ่งเรียงตามลำดับ:

  • ต้นกำเนิดที่เกิดขึ้นโดยการลบmakหรือmekจากจุดสิ้นสุดของ infinitive นั้น
  • สัญลักษณ์ของความตึงเครียดซึ่งเป็น:

    • สำหรับของขวัญที่เรียบง่าย:

      • -rถ้าก้านจบลงด้วยเสียงสระ;
      • -irตามกฎความกลมกลืนของสระ (ดูด้านล่าง) ถ้าก้านมีพยางค์มากกว่าหนึ่งพยางค์ (เช่นสระ) หรือมาจากหนึ่งในคำกริยาที่ผิดปกติดังต่อไปนี้: almak, bilmek, bulmak, durmak, gmemek, olmak, olmak ölmek, sanmak, vermek, varmak, vurmak ;
      • -ตามกฎความสามัคคีของสระถ้าต้นกำเนิดมีหนึ่งพยางค์และไม่ได้อยู่ในคำกริยาที่ผิดปกติข้างต้น
    • สำหรับการอย่างต่อเนื่องปัจจุบัน-iyorที่ฉันเปลี่ยนไปตามกฎความสามัคคีสระ ลำต้นที่ลงท้ายด้วยเสียงสระจะลดเสียงสระนี้ก่อนที่จะเพิ่มคำต่อท้ายนี้จากนั้นคำต่อท้ายจะประสานกับเสียงสระถัดไปสุดท้ายในคำ (รับประกันว่าจะมีอยู่โดยการแสดงออกปกติ)

    • สำหรับอนาคต:
      • - ขนตามกฎความสามัคคีของเสียงสระถ้าก้านจบลงในพยัญชนะ;
      • -yecekตามกฎของความกลมกลืนของสระถ้าต้นกำเนิดลงท้ายด้วยสระ
  • ต่อท้ายส่วนบุคคลเพื่อบ่งชี้ถึงนักแสดงของการดำเนินการในทุกกรณีตามกฎความสามัคคีสระ :

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

    สุดท้ายkของอนาคตกาลจะกลายเป็นGก่อนที่จะอิ่มและ-izดังนั้นสำหรับตัวอย่างเช่นจะให้ผลผลิต(almak, TRUE, 1, 3)alacağız

กฎความสามัคคีของสระ

สระตุรกีแบ่งออกเป็นสองกลุ่ม: back ( a ı o u) และ front ( e i ö ü) โดยที่พวกเขาอยู่ในปาก คำต่อท้ายของคำจะเปลี่ยนเสียงสระตามเสียงสระของราก

คำต่อท้ายทั้งหมดที่กล่าวมาข้างต้นมีiเป็นสระแทนใช้:

  • หากเสียงสระตัวสุดท้ายก่อนหน้าคำต่อท้ายคือıหรือa(เสียงสระทั้งสองนี้กลับมาและไม่มีการวนรอบ)
  • -iถ้าสระสุดท้ายก่อนที่คำต่อท้ายจะเป็นiหรือe((ทั้งสองสระหน้าและ unrounded; หมายเหตุที่นี่ความแตกต่างของตุรกีระหว่างประและ dotless ฉัน );
  • -uถ้าสระสุดท้ายก่อนที่คำต่อท้ายจะเป็นuหรือo((ทั้งสองสระเหล่านี้จะกลับและปัดเศษ); หรือ
  • หากเสียงสระตัวสุดท้ายก่อนหน้าคำต่อท้ายคือüหรือö(เสียงสระทั้งสองเป็นหน้าและโค้งมน)

จดระมัดระวังของคำต่อท้ายอย่างต่อเนื่องปัจจุบัน-iyor ความiกลมกลืน แต่oไม่เปลี่ยนแปลง oส่วนต่อท้ายส่วนบุคคลจึงจะสอดคล้องกับ

คำต่อท้ายทั้งหมดที่กล่าวมาข้างต้นมีeเป็นสระแทนใช้:

  • -หากเสียงสระตัวสุดท้ายก่อนต่อท้ายเป็นเสียงสระหน้า; หรือ
  • -ถ้าเสียงสระตัวสุดท้ายก่อนหน้าคำต่อท้ายจะเป็นเสียงสระด้านหลัง

คำกริยาไม่ปกติ

คำกริยาgitmek , tatmak , ditmek , gütmekและetmekเปลี่ยนแปลงสุดท้ายtไปdก่อนที่จะจบที่ขึ้นต้นด้วยสระ (ซึ่งรวมถึงตอนจบทั้งหมดที่อยู่ในความท้าทายนี้) คำกริยาใด ๆ ที่ลงท้ายด้วย-etmekก็จะเปลี่ยนtเป็น a dและต่อท้าย- เอ่อสำหรับของขวัญที่เรียบง่าย (แม้ว่านี่จะไม่ใช่คำกริยาอื่น ๆ )

กรณีทดสอบ

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

คุณสามารถให้กรณีทดสอบสำหรับ-etmekกฎได้หรือไม่
Arnauld

@Arnauld เรียบร้อยแล้ว ในการทำเช่นนั้นฉันค้นพบว่าฉันทำผิดพลาดในสเปคซึ่งฉันได้ผนวกเข้ากับส่วน "คำกริยาที่ผิดปกติ"
EMBLEM

สิ่งนี้สามารถทำได้กับกรณีทดสอบที่มากขึ้นเนื่องจากข้อมูลจำเพาะค่อนข้างซับซ้อน
เดฟ

@Dave ฉันเพิ่มอีก 3 ซึ่งใช้เวลานานพอสมควรบนมือถือ ฉันจะเพิ่มมากขึ้นในภายหลัง
EMBLEM

คำตอบ:


4

Javascript (ES6), 466 456 451 446 ไบต์

(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 และแสดงความคิดเห็น

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

กรณีทดสอบ

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


บัญชีนี้สำหรับd-mutation ของกริยาทั้งหมดที่ลงท้ายด้วย-etmekหรือไม่? ฉันไม่รู้จัก JavaScript แต่จากสิ่งที่ฉันสามารถรวบรวมได้ดูเหมือนว่าเป็นเพียงแค่ก้อนที่มีกับคนอื่น ๆ
EMBLEM

@EMBLEM - สิ่งนี้ควรได้รับการแก้ไข
Arnauld

4

sed, 583 ไบต์

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'

เช่นเดียวกับคำตอบของฉันสำหรับคำถาม Dactylic Hexameter ที่เกี่ยวข้องอย่างใกล้ชิดนี่เป็นเพียงการแปลกฎที่กำหนดเป็นนิพจน์ทั่วไป

การใช้งาน:

รับอินพุตในแบบฟอร์ม:

word [01] [123] [123]

ดังนั้นกรณีทดสอบคือ:

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

ทำให้พังถล่ม:

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
"

ผลลัพธ์สำหรับกรณีทดสอบ:

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

คุณถูกต้องเกี่ยวกับ affedersin ผมเปลี่ยนสรรพนามหลายต่อหลายครั้งในขณะที่เขียนว่า
EMBLEM

จดกรณี 2 มันควรจะเป็น alacak larไม่ใช่ ler
EMBLEM

@EMBLEM แก้ไขแล้ว; เสียค่าใช้จ่ายให้ฉันเพิ่มอีก 2 ไบต์ (แต่ 2 ไบต์ใน 600 คืออะไร)
เดฟ

คุณสามารถลบsed -E ''ได้เนื่องจากคุณระบุว่า sed เป็นภาษาและไม่ใช้ bash ดังนั้นให้พิจารณาสคริปต์เป็นซอร์สโค้ด sed จากนั้นคุณสามารถเรียกใช้ดังนี้: printf ...|sed -Ef filenameเพิ่มอีก 1 ไบต์สำหรับแฟล็ก E และบันทึก 8 ไบต์ในท้ายที่สุด Btw ไม่เคยรู้จนกระทั่งวันนี้ว่า -E เทียบเท่ากับ -r!
seshoumara
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.