Matricea de Triplete – Versiunea 3 – GREȘITĂ


[UPDATE 13.03.2025]

În urma sesizării unui profesionist în Excel am identificat că articolul acesta și metoda propusă sunt eronate pentru că nu generează toate combinațiile posibile.

Ca să respectăm matematica numărul de combinații maxime rămâne limitat la 189 (momentan) având în vedere că valoarea lui COMPIN(190;3) este mai mare decât 2^20.

[/UPDATE]

Astăzi nu am mai reușit să programez o sesiune O oră de Excel. Program foarte încărcat, între care o întâlnire cu boardul RCW (Romanian Creative Week) pentru organizarea în facultatea noastră a celei de a doua ediții a evenimentului: UniCredit Fintech Hackathon

Dar am reușit în timp ce rezolvam alte probleme să găsesc o formă optimizată a matricei de triplete în Excel.

La ce este bună această matrice?

Explicam în articolul din PIN Magazine – Programarea funcțională în Excel Modern că în Excel nu avem o funcție FOR() baza iterațiilor în, cred, toate limbajele de programare actuale. Dar avem soluții detaliate în acel articol. Marea problemă a versiunii prezentate acolo dar și în articolele despre algoritmi din acest blog, este limitarea numărului de elemente dintr-un vector pe care le poți prelucra. În acea primă versiune funcția putea genera matrice de triplete pentru maximum 101 elemente ale unui vector.

În articolul Modele de algoritmi în #Excel – Greedy algorithms (16) am introdus o nouă versiune a funcției _fTripleMatrix(elem) cu suport până la 189 de elemente ale unui vector.

Scopul acestor matrici este intermediar pentru prelucrarea unor seturi de numere luate câtre 3, fără repetiții. Ai un șir de numere și vrei să le adune pe toate cu alte câte două fără să repeți secvența. Cum faci? Ca să iei toate combinațiile unice de câte 3 trebuie să indexezi vectorul, iar pentru asta trebuie să știi ce poziții să apelezi. Acesta este scopul acestui algoritm: determinarea tuturor combinațiilor de poziții ale unui vector, luate câte 3.

Noua variantă elimină funcția SCAN() și introduce o matrice generată. Matricea este foarte mare consumatoare de resuse dar depășește limitele impuse până la versiunile curente.

Exemplificare în Excel

Rezultat execuție funcție de generare Matricea de Triplete versiunea 3

În acestă imagine am prezentat rezultatul pe două coloane ca să ocupe mai puțin spațiu.

Funcția care generează această matrice este:

=LET(
    matrix; SORT(
        UNIQUE(
            TOCOL(
                LET(
                    _n; B3;
                    MAKEARRAY(
                        _n;
                        _n;
                        LAMBDA(r; c;
                            LET(
                                _n1; r;
                                _n2; MOD(r + c - 1; _n) + 1;
                                _n3; MOD(r + c + 1 - 1; _n) + 1;
                                IF(OR(_n1 = _n2; _n2 = _n3; _n1 = _n3); ""; TEXTJOIN(";"; ; _n1; _n2; _n3))
                            )
                        )
                    )
                );
                1
            )
        )
    );
    arr; matrix;
    arrf; FILTER(arr; arr <> "");
    freq; LAMBDA(x; TEXTJOIN(";"; TRUE; SORT(TRANSPOSE(--TEXTSPLIT(x; ";")))));
    _sort; MAP(arrf; LAMBDA(v; freq(v)));
    TripleG; SORT(UNIQUE(_sort));
    TripleG
)

în care cheia este variabila matrix care conține funcția MAKEARRAY() care generează dinamic toate combinațiile de numere și asta având doar 2 variabile r și c din care generez cele 3 numere _n1, _n2, _n3. Este o aplatizarea de fapt a unei dimensiuni 3D într-un plan RxC.

Ca să pot sorta elementele am utilizat funcția recursivă freq în care splitez orice valoare rezultată în matrice ca să o pot sorta, după care în variabila finală TripleG păstrez doar valorile unice.

Vizual codul dacă nu apare corect în scriptul de mai sus:

Funcția _fTripleMatrix() în cod vizual.

Exemplificare rulare la 999 elemente. Aici se observă că există o mică problemă de sortare a numerelor pentru că ele sunt tratate ca valori text în urma concatenărilor.

Rezutlat execuție funcția TripleG cu 999 elemente.

Cam asta ar fi. Makearray() rămâne una din funcțiile cele mai surprinzătoare până acum din ceea ce am descoperit recent.

Sper să fie util cuiva!

Comentariile nu închise.

Blog la WordPress.com.

SUS ↑