64x64
Riad Asllani
blogger @ papirusi dhe lead software engineer @gjirafa
10 Nëntor 2020 · 7 min lexim

Gjirafa# - Zgjidhjet e detyrave - 2. Integer to Albanian Words

Kjo detyrë është vendosur me entuziazëm të madh nga ne si organizues. Ajo është zgjedhur me qëllim të ofrimit të një shërbimi i cili nuk ekziston në gjuhën shqipe. Për momentin nuk ekziston asnjë shërbim, API apo ndonjë kod i gatshëm i cili do të mundësonte shkrimin e numrave saktë në gjuhën shqipe.


Edhe për përgatitje të detyrës, është dashur të konsultohemi me njerëz që kanë njohuri në gjuhë dhe letërsi shqipe, pasi që nuk kemi gjetur ndonjë dokument zyrtar që t'i bazojmë kërkesat dhe faktet e detyrës.


Faktet që ne dimë:

  • Të gjithë numrat 1 (një) deri në 19 (nëntëmbëdhjetë) shkruhen si një fjalë (një, dy, tre, katër, pesë, gjashtë, shtatë, tetë, nëntë, dhjetë, njëmbëdhjetë, dymbëdhjetë, trembëdhjetë, katërmbëdhjetë, pesëmbëdhjetë, gjashtëmbëdhjetë, shtatëmbëdhjetë, tetëmbëdhjetë, nëntëmbëdhjetë)
  • Të gjithë shumfishat e numrit 10 (dhjetë) dy-shifrorë shkruhen si një fjalë (njëzet, tridhjetë, dyzet, pesëdhjetë, gjashtëdhjetë, shtatëdhjetë, tetëdhjetë, nentëdhjetë)
  • Të gjithë numrat tre-shifror shumfisha të numrit 100 (njëqind) shkruhen si një fjalë (njëqind, dyqind, treqind, katërqind, pesëqind, gjashtëqind, shtatëqind, tetëqind, nëntëqind)
  • Të gjithë numrat tjerë shkruhen si bashkim i këtyre fjalëve me lidhëzën ‘e’, pra 1234 është “një mijë e dyqind e tridhjetë e katër”


Ky problem në garën Gjirafa# është provuar të zgjidhet plot 282 herë, e prej tyre 108 tentime kanë rezultuar të sakta.


Nëse dëshironi të provoni zgjidhjen e detyrës, para se të shikoni zgjidhjen që ne kemi vendosur ta publikojmë, atëherë detyrën e gjeni në këtë link: https://www.hackerrank.com/contests/gjirafa/challenges/integer-to-albanian-words/problem


Inputet testuese që kanë qenë publike janë këto:

1234 - një mijë e dyqind e tridhjetë e katër

572 - pesëqind e shtatëdhjetë e dy

76134993 - shtatëdhjetë e gjashtë milion e njëqind e tridhjetë e katër mijë e nëntëqind e nëntëdhjetë e tre


Inputet testuese që shumica e garuesve nuk kanë hasur problem janë këto:

9 - nëntë

99 - nëntëdhjetë e nëntë

999 - nëntëqind e nëntëdhjetë e nëntë

9999 - nëntë mijë e nëntëqind e nentedhjete e nëntë

999999 - nëntëqind e nëntëdhjetë e nëntë mijë e nëntëqind e nëntëdhjetë e nëntë

9999999 - nëntë milion e nëntëqind e nëntëdhjetë e nëntë mijë e nëntëqind e nëntëdhjetë e nëntë

99999999 - nëntëdhjetë e nëntë milion e nëntëqind e nëntëdhjetë e nëntë mijë e nëntëqind e nëntëdhjetë e nëntë

999999999 - nëntëqind e nëntëdhjetë e nëntë milion e nëntëqind e nëntëdhjetë e nëntë mijë e nëntëqind e nëntëdhjetë e nëntë


Gjatë testimit dhe zgjidhjes së detyrës nga ana jonë, kemi vërejtur disa raste testimi të cilat kanë paraqitur më shumë probleme se të tjerat.


Rastet të cilat kanë paraqitur probleme janë ato raste të cilat kanë përmbajtur zero në numër:

10 - dhjetë

100 - njëqind

1000 - një mijë

10000 - dhjetë mijë

100000 - njëqind mijë

1000000 - një milion

10000000 - dhjetë milion

100000000 - njëqind milion

300300300  - treqind milion e treqind mijë e treqind

219220221 - dyqind e nëntëmbëdhjetë milion e dyqind e njëzet mijë e dyqind e njëzet e një


Gjithashtu edhe rasti tjetër, që neve na mundëson që të sugjerojmë se kurdo që luani në një garë të tillë të lexoni tesktin sa më ngadal dhe t'i ndjekni udhëzimet që dalin nga ai, është rasti:

2147483647 - dy miliard e njëqind e dyzet e shtatë milion e katërqind e tetëdhjetë e tre mijë e gjashtëqind e dyzet e shtatë


Arsyeja pse dy prej garuesve në top dhjetëshe, kishin dy-katër prova për zgjidhjen e detyrës, është se numrin “dyzet” e kanë shkruar si “katërdhjetë” (nuk do argumentojmë fare se cila është e saktë për arsye se udhëzimet e kanë caktuar të përdoret metoda e parë)


Siç edhe tregon teksti i detyrës, ne kemi vendosur t'i publikojmë zgjidhjet më të mira, dhe më interesante në disa gjuhë programuese:


Ne gjuhën programuese C++, kemi marr zgjidhjen e detyrës nga garuesi jeton_r123:

#include <iostream>
#include <string>
#include <vector>

using namespace std;

    vector<string> njeshe {"zero","nje", "dy", "tre", "kater", "pese", "gjashte", "shtate", "tete", "nente"};
    vector<string> dhjeteshe {"dhjete", "njembedhjete", "dymbedhjete", "trembedhjte", "katermbedhjete", "pesembedhjete", "gjashtembedhjete", "shtatembedhjete", "tetembedhjete", "nentembedhjete"};
    vector<string> dhjete {"", "", "njezet", "tridhjete", "dyzet", "pesedhjete", "gjashtedhjete", "shtatedhjete", "tetedhjete", "nentedhjete"};


    string neFjale (long int n) {
        if (n < 10) {
            return njeshe[n];
        } else if (n < 20) {
            return dhjeteshe [n - 10];
        } else if (n < 100) {
            return dhjete[n / 10] + ((n % 10 != 0) ? " e " + neFjale(n % 10) : "");
        } else if (n < 1000) {
            return neFjale(n / 100) + "qind" + ((n % 100 != 0) ? " e " + neFjale(n % 100) : "");
        } else if (n < 1000000) {
            return neFjale(n / 1000) + " mije" + ((n % 1000 != 0) ? " e " + neFjale(n % 1000) : "");
        } else if (n < 1000000000) {
            return neFjale(n / 1000000) + " milion" + ((n % 1000000 != 0) ? " e " + neFjale(n % 1000000) : "");
        } else if (n < 1000000000000) {
            return neFjale(n / 1000000000) + " miliard" + ((n % 1000000000 != 0) ? " e " + neFjale(n % 1000000000) : "");
        }
        return "error"; 
    }


    int main()
    {
        long int n;    
        cin >> n;
        cout << neFjale(n) << endl;
        return 0;
    }

Kjo zgjidhje është e bazuar në përgjigjjen e pyetjes 'C++ converting numbers to words' në stackoverflow.


Ne gjuhën programuese python, kemi marrë zgjidhjen e detyrës nga garuesja AriDa:

# Enter your code here. Read input from STDIN. Print output to STDOUT
import sys;


mapper = {
    1: 'nje', 
    2: 'dy', 
    3: 'tre', 
    4: 'kater', 
    5: 'pese', 
    6: 'gjashte', 
    7: 'shtate', 
    8: 'tete', 
    9: 'nente', 
    10: 'dhjete', 
    11: 'njembedhjete', 
    12: 'dymbedhjete', 
    13: 'trembedhjete', 
    14: 'katermbedhjete', 
    15: 'pesembedhjete', 
    16: 'gjashtembedhjete', 
    17: 'shtatembedhjete', 
    18: 'tetembedhjete', 
    19: 'nentembedhjete',
    20: 'njezet', 
    30: 'tridhjete', 
    40: 'dyzet', 
    50: 'pesedhjete', 
    60: 'gjashtedhjete', 
    70: 'shtatedhjete', 
    80: 'tetedhjete', 
    90: 'nentedhjete', 
    100: 'njeqind', 
    200: 'dyqind', 
    300: 'treqind', 
    400: 'katerqind', 
    500: 'peseqind', 
    600: 'gjashteqind', 
    700: 'shtateqind', 
    800: 'teteqind', 
    900: 'nenteqind'
}


units = {1: '', 1000: 'mije', 1000000: 'milion', 1000000000: 'miliard'}


def toAlbanian(num): #122354
    words = []
    count = 1 
    while(num != 0):
        reminder = num % 1000
        num = num // 1000
        if(reminder != 0):
            words.append(parse3Numbers(reminder) + ' ' + units[count])
        count *= 1000
    
    words.reverse()
    return ' e '.join(words)
    
            
def parse3Numbers(num): 
    words = [] 
    mul = 1
    while(num != 0):
        reminder = num % 100
        if(mul == 1 and 10 < reminder < 20):
            num = num // 100
            words.append(mapper[reminder])
            mul *= 100
        else :
            reminder = num % 10
            num = num // 10
            if(reminder != 0):
                words.append(mapper[reminder * mul])
            mul *= 10
    
    words.reverse()
    return ' e '.join(words)
            
for line in sys.stdin:
    sys.stdout.write(toAlbanian(int(line)))


Ndërsa në JavaScript kemi përzgjedhur zgjidhjen e ofruar nga garuesi pllum_h:

function processData(input) {
    let small_numbers = "nje,dy,tre,kater,pese,gjashte,shtate,tete,nente,dhjete,njembedhjete,dymbedhjete,trembedhjete,katermbedhjete,pesembedhjete,gjashtembedhjete,shtatembedhjete,tetembedhjete,nentembedhjete".split(',');
    let mid_numbers = "njezet,tridhjete,dyzet,pesedhjete,gjashtedhjete,shtatedhjete,tetedhjete,nentedhjete".split(',');
    let high_numbers = "njeqind,dyqind,treqind,katerqind,peseqind,gjashteqind,shtateqind,teteqind,nenteqind".split(',');
    let high_high_numbers = ",mije,milion,miliard".split(',');


    let first = input.toString().slice(-3)*1;
    let mije = input.toString().slice(-6,-3)*1;
    let milion = input.toString().slice(-9,-6)*1;
    let miliard = input.toString().slice(-12,-9)*1;
    let result = [
        three_digit_numbers(miliard, 'miliard'), 
        three_digit_numbers(milion, 'milion'),
        three_digit_numbers(mije, 'mije'),
        three_digit_numbers(first)
    ].filter(Boolean);


    console.log(result.join(' e '));
    
    function three_digit_numbers(number, suffix='') {
        if(number == 0) return;
        if( number < 100 ) {
            return two_digit_numbers(number) + ' ' + suffix;
        } else if(number < 1000 ) {
            let hundreds = Math.floor(number/100);
            let tens_num = two_digit_numbers(number%100);
            return high_numbers[hundreds-1] + (tens_num ?' e ' + tens_num: '') + ' ' + suffix;
        }
    }
    
    function two_digit_numbers(number) {
        if( number == 0 ) return '';
        if( number < 20 ) {
            return small_numbers[number-1];
        } else if( number < 100 ) {
            let tens = Math.floor(number/10);
            let ones = number%10;
            if(!small_numbers[ones-1]) return mid_numbers[tens-2];
            return mid_numbers[tens-2] + ' e ' + small_numbers[ones-1];
        } 
    }
} 


process.stdin.resume();
process.stdin.setEncoding("ascii");
_input = "";
process.stdin.on("data", function (input) {
    _input += input;
});


process.stdin.on("end", function () {
   processData(_input);
});




Riad Asllani
blogger @ papirusi dhe lead software engineer @gjirafa
64x64
Gjirafa Engineering
Artikujt e ndryshëm nga ekipi i inxhinierisë softuerike në Gjirafa.

Gjithashtu lexoni


0 komente