Modele de algoritmi in #Excel – Vectori (2.1)

Pentru aceast articol am ales să rezolv problema vectorilor (arrays) în Excel. Sursa de inspirație este https://app.codility.com/programmers/lessons/2-arrays/cyclic_rotation/

Un pic de teorie

Termenul de vector este des întâlnit în matematică/geometrie, fizică și nu numai. În Excel sau informatică în general se folosește de cele mai multe ori termenul englezesc array. De multe ori problemele de vectori au legătură cu șirurile de numere sau caractere în general.

În Excel un vector poate fi un șir de caractere/numere parsabile sau o linie, sau o coloană cu valori multiple, sau chiar un bloc de căsuțe NxM care poate fi parcurs. Problemele de vectori se referă în general la manipularea acestora (parcurgere, extragere valori, numărare elemente, etc).

Dacă avem un șir de valori într-o celulă, acesta poate fi descompus după unul sau mai mulți delimitatori. Una din funcțiile de bază pentru descompunerea unui șir în celule este: TEXTSPLIT() dacă identificăm unul sau mai mulți delimitatori sau o combinație de MID() cu SEQUENCE() prezentată în articolul trecut în cazul în care nu avem un delimitator definit.

Exemple:

Funcțiile TEXTSPLIT() și MID() cu SEQUENCE()

În formula din C2 folosim TEXTSPLIT() cu delimitatorul , (virgulă). De menționat că se pot pune mai mulți delimitatori în cadrul aceleiași formule.

În C5 am folosit funcția MID() combinată cu SEQUENCE() de LEN() de valoare pentru a descompune literă cu literă textul. UPPER() este pentru a transforma toate literele în litere mari.

O funcție matematică foarte importantă în acest context este funcția MOD() care determină restul împărțirii a două numere între ele. Aceasta ne ajută în general în probleme cu ciclicitate pe același interval de valori. Restul împărțirii unui număr la el însuși este întotdeauna 0: MOD(n;n) = 0. Dacă dorim să forțăm o secvență de numere în care trebuie să obținem valoarea numărului, atunci va trebui să facem un artificiu matematic pentru acest lucru: MOD(n-1; n)+1 = n.

Funcția MOD() în Excel. Exemplu cu -1+1

în care: avem o secvență de 16 numere în care dacă rulăm MOD(n;8) obținem valori de la 1 la 7 după care 0. Dacă dorim să realizăm numere repetitive de la 1 la 8 atunci va trebui să utilizăm: MOD(n-1;8)+1 în care n-1 va determina pentru n=8 valoarea 7 care în MOD cu 8 devine 7 la care adăugăm 1 pentru a se transforma în 8.

CyclicRotation în Excel

Așa cum specificam la începutul seriei, provocarea este de a rezolva probleme clasice de algoritmică în Excel. În zona de vectori o problemă clasică este aceea de a roti repetitiv elementele sale după un anumit K dat, în care K este numărul de rotații. Numărul de valori ale vectorului care se rotesc este în această problemă valoarea 1, ceea ce înseamnă că la fiecare execuție nouă ultima valoare devine prima în vector.

CycleRotation in Excel, model de implementare pas cu pas.

în care:

B5: =TEXTSPLIT(A2;”,”) – descompun șirul într-un vector pe linie.

B6: =LET(arr; B5#; last; TAKE(arr;;-1); firsts; TAKE(arr;;COLUMNS(arr)-1); HSTACK(last;firsts))

În care preiau rezultatul split de pe rând anterior. Vectorii dinamici rezultați din execuția funcțiilor dynamic array se pot apela cu formatul celula_start# referind toate liniile sau coloanele rezultat. Funcția TAKE() cu parametrul -1 o folosesc pentru a prelua ultima valoare din dreapta vectorului. Următoarea funcție TAKE() care compune variabila firsts este folosită pentru a prelua numărul de elemente ale vectorului determinat de funcția COLUMNS() -1 care este cel preluat deja în variabila last . Pentru a da noua stare a șirului folosesc funcția HSTACK() în care combin cele două variabile rezultat.

Formula din B6 se copie în jos cu drag-and-drop pentru oricâte iterații sunt necesare. Eu am afișat numărul de iterații pe coloana A printr-o funcție SEQUENCE( de K).

C2: și E2: sunt doar formule care nu au implicații în acest model de rezolvare.

Unificarea într-o singură funcție

Pentru a rezolva problema de rotație pentru orice șir de numere la orice K dat, inclusiv K negativ, atunci când vectorul s-ar muta în sens descerscător am propus o rezolvare care ia în calcul restul împărțirii K la lungimea vectorului. În imagine:

C2: =COLUMNS(B5#) – determinarea lungimii vectorului descompus.

E2: =MOD(B4-1;C2)+1 – Funcția MOD de determinare a restului împărțirii.

Logica este că la fiecare pas se realizează incrementarea cu 1 a vectorului față de K. Asta înseamnă că șirul ajunge în poziția inițială în momentul în care lungimea vectorului este egală cu K sau multipli de K. Ceea ce rezultă că mișcările efective sunt doar în zona de rest a împărțirii lui K cu numărul de coloane ale blocului.

Funcția propusă:

=LET(arr; TRIM(TEXTSPLIT(A2;","));
vk; B4;
vMod; MOD(vk;COLUMNS(arr));
IF(vMod=0;arr;HSTACK(TAKE(arr;;-vMod);TAKE(arr;;COLUMNS(arr)-vMod))) )

În care:

  • arr – este variabila care stochează descompunea șirului într-un vector. Forma din imaginea de mai sus este reprezentarea în localizarea Romanian a blocului.

Hint: într-o funcție oarecum mai complexă dacă dorim să vedem rezultate intermediare ele apar ca tool-tip pe funcție în Excel sau se pot afișa direct în construcția formulei folosind tasta F9:

Afișare valori intermediare în timpul depanării unei funcții.
  • vk – preia valoarea lui K din celula B4
  • vMod – calculează restul împărțirii dintre K și numărul de coloane a șirului arr
  • IF-ul tratează excepțiile când vMod ia valoarea 0 ceea ce înseamnă că lungimea vectorului este egală cu K, deci afișez vectorul, iar dacă vMod nu este 0 se afișează cele două șiruri construite cu HSTACK() asemănător cu versiunea din B6 dar puțin mai concentrată funcția.

În formatul cu K negativ, șirul se descompune din stânga spre dreapta, prima valoare din stânga devenind ultima valoare din dreapta. Șirul: {1, 2, 3, 4, 5, 6, 7, 8} devine în -2 rotații: {3, 4, 5, 6, 7, 8, 1, 2}.

Rotația șirurilor de K ori în seturi specifice

Oare de ce nu am complica puțin problema?! Adică în loc de valoarea 1 să introducem un număr nou care să reprezinte un set de numere cu care să treacă la iterația următoare. Aici probocarea a fost puțin mai mare pentru că lucrurile merg destul de rău cu numere de rotații și seturi de numere care depășesc lungimea șirului.

Rotație șiruri după un K și set cunoscut.

Pentru rezolvare a trebuit să calculez și MOD-ul de set ca rest al împărțirii setului dat la lungimea șirului, în așa fel încât dacă setul este mai mare ca șirul să se rotească doar restul valorilor rămase. De exemplu dacă am avea un șir: {1, 2, 3, 4, 5, 6, 7, 8} într-un set de 9 ar însemna să ne întoarcem de la capătul șirului cu numărarea până la nouă, ceea ce înseamnă că avem un rest de 1. Șirul rezultat într-o rotație (K=1) ar fi:  {8, 1,  2,  3,  4,  5,  6,  7}

Ca să pot calcula totuși într-o singură funcție avem nevoie de MOD(ModK * ModSet; lungimea șirului). Funcția din G2 este în exemplul meu: =MOD(E2*F2;C2)

Rotațiile pe fiecare K în seturi specifice numere naturale pozitive sau negative, se pot rezolva cu funcția:

=LET(arr;TEXTSPLIT(A2;",");
vk;B4;
vSet;B5;
vLen;COLUMNS(arr);
vModk;MOD(vk;vLen);
vModSet;MOD(vSet;vLen);
vMod;MOD(vModk*vModSet;vLen);
final;IF(vMod=0;arr;HSTACK(TAKE(arr;;-vMod);TAKE(arr;;vLen-vMod)));final)

în care:

  • arr – preia șirul splitat;
  • vk – preia valoarea lui K;
  • vSet – preia valoarea setului;
  • vLen – calculează lungimea vectorului;
  • vModK – calculează restul înmpărțirii lui K la lungime vector;
  • vModSet – calculează restul înmpărțirii setului la lungime vector;
  • vMod – calculează restul împărțirii celor două resturi anterioare la lungime;
  • final – este calcului de final în care folosesc aceeași tehnică specificată anterior.

Cel mai dificil a fost să ajung la acel MOD de MOD-uri, în rest manipulare de valori simplă.

Dincolo de exercițiu matematic, la ce putem folosi? Eu mă gândesc la criptografie dar și la schimbul de ture pentru angajați sau alocarea de tickete și poate și altele.

În articolul viitor voi trata tot o problemă de vectori, poate puțin mai simplă: OddOccurrencesInArray

Sper să fie util cuiva!

Excel – Operațiuni în vectori

 

Acest articol este un răspuns pentru o problemă interesantă de Excel a unui coleg. Trebuie spus de la început că rezolvarea este în Excel cu localizare în limba română.

Se dă următorul vector: {„a”\”a”\”c”\”b”\”a”\”b”}. Câți de a sunt în acest vector?

În mod normal am putea încerca cu un COUNTIF, dar acesta nu funcționează pe vectori.

Un vector în Excel (array în engleză) este un șir de valori pe linie (orizontală) sau coloană (verticală). Majoritatea dintre noi folosim vectori în format blocuri de celule.

Pentru localizarea în limba română, avem următoarele formate de vectori:

  • Orizontală: {„a”\”a”\”c”\”b”\”a”\”b”} , în care simbolul \ este delimitatorul de coloană
  • Verticală: {„a”;”a”;”c”;”b”;”a”;”b”}, în care simbolul ; este delimitatorul de linie
  • Tabel: {„a”\”b”;”a”\”b”;”c”\”d”;”b”\”d”}

În momentul în care inserăm un vector într-o celulă cu = valori, în Excelul 365 vom obține rezultatul în formatul următor:

Ca să putem efectua un CountIf este destul de simplu să folosim funcția cu referire la celulă:

Obținând astfel valoarea 3.

Dar dacă încercăm să introducem vectorul în countIf atunci vom obține o eroare:

Explicația este dată de faptul că funcția CountIf nu funcționează în sistem array nici în format CSE (Ctrl+Shift+Enter).

Ca să putem utiliza valorile vectorilor direct în formulă atunci vom utiliza o combinație de funcții care să ne ajute să obținem rezultatul:

La L2: am calculat lungimea vectorului, obținând valoarea 1 pentru fiecare literă din vector.

La L3: am introdus un substitute în așa fel încât să înlocuiesc valoarea a cu nimic în vector.

La L4: calculez lungimea rezultatului din L3, rezultând valori 1 doar acolo unde nu era a.

La L5: calculez suma lungimilor din L2 – suma lungimilor din L4 obținând astfel noua valoare.

 

Vectori numerici

Un vector numeric orizontal arată în felul următor: {1\3\5\0\2\1}. Putem să-l scriem și în format {„1″\”3″\”5″\”0″\”2″\”1”} doar că trebuie să avem grijă la faptul că numerele în ghilimele sunt tratate ca text.

Un exemplu de utilizare:

 

Sper să fie util cuiva!

 

 

 

 

 

Studiu cu privire la digitalizarea instituțiilor publice din România

„Organizational change requires individual change.”

Context

În ultima perioadă circulă din ce în ce mai mult în media din România și nu numai, tema inteligenței artificiale. Pare un subiect de interes, mai ales că suportă multe combinații cu teoriile conspirației, fără a fi o conspirație în sine. Dar oare cât de pregătită este administrația publică din România, în fața (poate) unui următor val al digitalizării? Cât de pregătiți suntem acum cu tehnologiile pe care le avem să facem față unei comunicații cât mai apropiate de cetățean și ce servicii îi oferim? Folosim Social media pentru a comunica cu ei? Comunicarea on-line influențează oare deciziile pe care le ia administrația locală în folosul comunității?

Acestea sunt doar câteva din zecile de întrebări la care se încearcă să se răspundă în diferite cercuri de discuții mai mult sau mai puțin academice, sociale sau politice. În acest sens, o echipă de profesori din cadrul Universității „Alexandru Ioan Cuza” din Iași derulează o cercetare privind digitalizarea instituțiilor publice din România, pentru a propune soluții care să vină atât în sprijinul unei bune administrări, cât și a unor condiții mai performante în raport cu funcționarii din instituțiile publice. Urmărim să obținem o imagine detaliată a nivelului de digitalizare, a serviciilor publice online, a comunicării cu cetățenii și a provocărilor profesionale pentru funcționarii din cadrul sectorului public.

Cercetările academice pot fi relevante și pot conduce la soluții aplicabile și utile doar într-un proces participativ, prin cunoașterea în detaliu a percepțiilor, a opiniilor și a așteptărilor celor care, în diferite poziții executive sau de conducere în administrația publică, se confruntă cu limitări sau oportunități asociate digitalizării și comunicării online. Prin digitalizare în sensul acestui studiu, ne referim la calculatoare/laptopuri, aplicații și platforme de comunicare/altele similare.

Cercetări existente

Cercetarea noastră a pornit de la indicatorul DESI (https://digital-strategy.ec.europa.eu/ro/policies/desi) în care România, ocupa în anul 2022 ultima poziție.

Nu avem detalii despre modul în care sunt colectate datele care compun acest indicator, dar în cercetarea noastră ne propunem să schimbăm modul de abordare, și să depășim bariera cantitativă a majorității cercetărilor, prin utilizarea metodologiei de cercetare calitativă ADKAR (https://www.prosci.com/methodology/adkar). Idea de bază este de identifica modul în care se comunică în prezent cu cetățenii și să înțelegem implicarea umană în procesul de integrare a tehnologiilor digitale în cadrul administrației publice locale. Aparent fiecare din noi dorește o schimbare în bine între instituțiile statului și cetățeni prin îmbunătățirea comunicării și a transparenței procesului decizional. Dar de cele mai multe ori suntem limitați de resursele materiale și financiare disponibile. În opinia noastră atât timp cât resursa umana este informată și deschisă la nou, abordarea temei digitalizării se poate transforma mult mai ușor într-o poveste de succes.

Proiectarea cercetării

Pentru a avea o imagine extinsă a percepției angajaților din instituțiile publice am introdus mai multe întrebări de tip open text, a căror răspuns va fi analizat în detaliu cu instrumente specifice de text.

Publicul țintă al chestionarului sunt Primăriile din întreaga țară, Prefecturile și Consiliile județene. Pentru a le adresa direct și specific, chestionarul a fost împărțit pe județe, un prim nivel al gradului de implicare și interes în sprijinul cercetării fiind chiar numărul de răspunsuri oferite în fiecare județ. Înțelegerea noastră este ca fiecare UAT să ne ofere cel puțin un răspuns complet la chestionar.

Una din provocările majore a fost colectarea datelor de contact a Primăriilor din țară. Ne-am fi așteptat ca undeva pe site-urile Guvernului sau Prefecturilor să găsim colecții de date de contact actualizate. Colectarea datelor de intrare a început cu site-ul https://data.gov.ro/ de pe care am descărcat un set de date cu primării. Din păcate în primă etapă am identificat doar numele UAT-urilor și mai multe detalii dar doar 482 de adrese de email și 531 de site-uri web din totalul de 3278 la nivel național.

Records

Website

Email

3278

531

482

16,20%

14,70%

După mai multe încercări de colectare, folosind cu succes tehnici de web scraping și corecturi manuale în anumite cazuri, am reușit să colectăm 3186 adrese de primării, 42 prefecturi și tot atâtea adrese pentru consiliile județene.

Și metoda automată și cea manuală nu ne-a pus în situația de a identifica faptul că în multe cazuri site-urile oficiale ale primăriilor nu funcționează pentru preluare date de contact, iar în alte cazuri pe site-urile primăriilor există anumite adrese de email iar pe site-urile consiliilor județene există adrese vechi.

Din analiza adreselor de email am identificat că majoritatea primăriilor din țară folosesc ca adresă de contact o adresă de Yahoo Mail.

Top 15 Domenii după numărul de primării:

Rank
Domenii
Count
1
yahoo.com
1917
2
gmail.com
153
3
cjdolj.ro
110
4
cjmures.ro
102
5
cjbihor.ro
72
6
sejmh.ro
51
7
prefecturaprahova.ro
43
8
clicknet.ro
30
9
judetulolt.ro
22
10
artelecom.net
18
11
cjtimis.ro
17
12
yahoo.co.uk
13
13
freemail.hu
11
14
personal.ro
10
15
hotmail.com
10

Remarcăm la o simplă analiză că există o apetență ridicată față de sistemele de email publice, dar există și județe care au standardizat adresele UAT-urilor din subordine: Dolj și Mureș în mod complet și unitar, Bihor, Mehedinți, Prahova, Timiș în mod parțial.

În urma lansării campaniei de email, am identificat că adresele de email ale domeniilor prefecturaprahova.ro și judetulolt.ro nu sunt funcționale.

S-a întâmplat să identificăm și primării care nu au o adresă de email sau un site web propriu, ci sunt găzduite în portaluri de prezentare a acestora. Construirea și întreținerea unui site web propriu sau a unui server de email necesită cunoștințe specializate și relativ scumpe, ceea ce justifică oarecum lipsa lor. Legat de

O primă idee care se desprinde din această analiză incipientă este aceea că ar trebui să existe un cloud guvernamental de tip SaaS în care să fie puse la dispoziția UAT-urilor, cu resurse tehnice limitate, servicii de găzduire web și sau/email. Au fost identificate în analiza noastră mai multe platforme de eGuvernare (dezvoltate de companii private) care vin în sprijinul UAT-urilor pentru componenta de digitalizare. Amintim pe moment: Regista , Cityon, Citymanager , urmând ca la finalul studiului să identificăm toate celelalte soluții utilizate.

Derularea chestionarului

Emailurile au fost lansate, în mod individual sau grupat către UAT-uri folosind tehnici de mail merge, în perioada 23.11.2023 – 27.11.2023.

Chestionarele sunt realizate în platforma Microsoft Forms și conțin 23 de întrebări cu tot cu datele demografice. Timpul estimat de răspuns este de 15 minute.

Pentru o imagine cât mai exactă a modului în care este percepută digitalizarea în instituțiile publice din România avem nevoie de cât mai multe răspunsuri.

După 24 de ore de la lansare, au fost primite 160 de răspunsuri de la UAT-urile din țară, atât din mediul rural cât și din mediul urban. Raportat la numărul de emailuri corecte trimise și numărul de răspunsuri menținem permanent un grafic de monitorizare a procentului de răspunsuri din total.

[UPDATE 19.12.2023] Până în prezent am depășit 400 de răspunsuri:

Studiu19122023

La ora actuală, datorită ajutorului Consiliului județean Iași am reușit să avem un număr mare de răspunsuri, depășind 15% la nivel național.

Cele mai mari probleme cu răspunsurile (sub 8) sunt în județele Olt, Călărași, Mehedinți, Ilfov, Dâmbovița, Constanța, Bihor.

Mulțumim tuturor celor care ne ajută cu răspunsuri pentru a avea o imagine cât mai completă a stării de fapt legată de digitalizare și comunicare între UAT-urile din România și cetățeni.

Perioada de derulare a colectării datelor este între 27.11.2023 și 22.12.2023. În cazul în care sunteți un reprezentant al unei primării din țară și nu ați primit emailul nostru de solicitare răspuns la chestionar, vă rugăm să ne scrieți pe adresa: greavu@uaic.ro

Interpretarea rezultatelor va fi trimisă spre cei care au solicitat acest lucru și va face obiectul unor articole științifice și de informare și conștientizare a domeniului.

Campanie de cercetare derulată în cadrul proiectului: INDI-DeR project – https://cse.uaic.ro/indider

Blog la WordPress.com.

SUS ↑