Mbaj mend që kur isha në kopsht, mësova se si të përcaktoja rrokjet duke përplasur duart. Mbaj mend që bisedova me fëmijët përreth meje, duke gjetur se kush kishte të njëjtën sasi rrokjesh në emrin e tyre si unë. Unë isha një 2 (And-rew) kështu që isha i varur me Alex dhe Ryan.

Ndoshta disa vite më pas mësova se çfarë ishte Haiku. Një poezi e diktuar nga rrokjet në çdo rresht: 5–7–5. Jam shumë i sigurt që shumica prej nesh e mbajnë mend këtë dhe jam shumë i sigurt që shumica prej nesh kanë menduar për haikus budallenj duke tingëlluar rrokjet në kokën tonë. Por a mundet një aplikacion të numërojë programatikisht rrokjet me saktësi dhe nga ana tjetër të përcaktojë nëse një haiku është i vlefshëm?

Po. Po mundet.

Këtu është kodi që përdora për të numëruar rrokjet në një fjalë:

function syllables(word) {
  word = word.toLowerCase();
  if(word.length <= 3) { return 1; }
    return word.replace(/(?:[^laeiouy]es|ed|lle|[^laeiouy]e)$/, '')
               .replace(/^y/, '')
               .match(/[aeiouy]{1,2}/g).length;
}

Në thelb, nëse një fjalë ka 3 karaktere ose më pak, ka një rrokje. Për fjalët me më shumë karaktere, duhet të numëroni zanoret. Një rrokje për zanore. Megjithatë, ka përjashtime nga ky rregull. Më e rëndësishmja, kur fjalët kanë "ed" në fund të fjalës, në shumicën e rasteve nuk shtoni një rrokje shtesë.

E kam parë se kjo zgjidhje është mjaft e saktë, por ka më shumë përjashtime nga rregulli që mund të shtohen për ta bërë këtë më të mirë. Unë thjesht nuk i kam gjetur ende këto përjashtime.

Pra, duke përdorur funksionin e rrokjeve të mia, unë jam në gjendje të vërtetoj një haiku si kjo:

function checkLine(sentence){
  var count = 0;
  var words = sentence.split(" ");
  
  words.map(function(val, key){
    count += syllables(val)
  });
  
  return count;
  
}
function haiku(a, b, c){
  
  if(!a || !b || !c){
    return {result: false, error: "Invalid input. Call haiku(line1, line2, line3)"}
  }
  
  result = [checkLine(a), checkLine(b), checkLine(c)];
  expected = [5, 7, 5];
  
  if(arrayCompare(result, expected)){
    return true;
  }
  
  return {result: false, syllables:result};
}
function arrayCompare(a1, a2){
  return a1.length==a2.length && a1.every(function(v,i) { return v === a2[i]})
}

Ju kaloni funksionin haiku tre fjali si parametra dhe funksioni do të kthehet ose 'true' nëse është një haiku i vlefshëm ose do të kthejë një rezultat të 'false' dhe një varg rrokjesh për rresht.

Ky funksion mund të bëhet edhe më i mirë nëse mund të kaloni opsionalisht një grup të pritshëm rrokjesh, kështu që poezia juaj nuk duhej të ishte gjithmonë 5–7–5.

Por kjo është javascript që vërteton një haiku. Shumë emocionuese për mua, majori/programuesi anglez.

A keni punuar më parë me gjuhë natyrore në mënyrë programore? A mund të zgjidhet më mirë kjo? Lini një koment!