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); });