Home » Generate Italian Fiscal Code

Generate Italian Fiscal Code

This is first part of 2 parts Italian Fiscal Code (Codice Fiscale) generation challenges. Given two parts of name, generate the alphabets in capital letters as per following rule. First part – From Surname (i.e. Last Name) 1. If name contains >=3 consonants, then first 3 consonants are used in the same order as they appear Ex. Roberto -> RBR 2. If name contains <3 consonants, use all consonants first and the vowels replace missing characters in the same order as they appear Ex. Rob ->RBO, Taou ->TAO, Uae -> UAE 3. If name itself has less than 3 alphabets, then X will appear after first consonant and then vowel. Ex. Ro -> ROX, U -> UXX Second part – From First Name 1. If name contains = 3 consonants, then these 3 consonants are used in the same order as they appear Ex. Vijay ->VJY 2. If name contains > 3 consonants, then first, third and fourth consonant are used in the same order as they appear Ex. Smith -> STH 3. Same as point 2 of Surname 4. Same as point 3 of Surname

📌 Challenge Details and Links
ExcelBI Excel Challenge Number: 102
Challenge Difficulty: ⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn

Solving the challenge of Generate Italian Fiscal Code with Power Query

Power Query solution 1 for Generate Italian Fiscal Code, proposed by Bo Rydobon 🇹🇭:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Y = (p, n) =>
    let
      u = Text.Upper(p), 
      a = Text.Combine(Text.SplitAny(u, "AEIOU"))
    in
      Text.Start(
        if Text.Length(a) > n then
          Text.RemoveRange(a, 1, 1)
        else
          a & Text.Combine(Text.SplitAny(u, a)) & "XX", 
        3
      ), 
  ACode = Table.AddColumn(
    Source, 
    "Code", 
    each Y(Text.AfterDelimiter([Names], " "), 20) & " " & Y(Text.BeforeDelimiter([Names], " "), 3)
  )
in
  ACode
Power Query solution 2 for Generate Italian Fiscal Code, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Uppercased = Table.TransformColumns(Source, {{"Names", Text.Upper, type text}}), 
  Vocales = {"A", "E", "I", "O", "U"}, 
  Consonantes = List.RemoveItems({"A" .. "Z"}, Vocales), 
  Nombres = Table.AddColumn(
    Uppercased, 
    "Code", 
    each 
      let
        a = [Names], 
        b = Text.Split(a, " "), 
        c = List.RemoveItems(Text.ToList(b{0}), Vocales), 
        y = List.RemoveItems(Text.ToList(b{0}), Consonantes), 
        d = 
          if List.Count(c) = 3 then
            Text.Combine(c, "")
          else if List.Count(c) > 3 then
            Text.Combine({c{0}, c{2}, c{3}}, "")
          else if Text.Length(b{0}) < 3 then
            Text.PadEnd(Text.Combine(c & y, ""), 3, "X")
          else
            Text.Combine(List.FirstN(c & y, 3)), 
        c1 = List.RemoveItems(Text.ToList(b{1}), Vocales), 
        y1 = List.RemoveItems(Text.ToList(b{1}), Consonantes), 
        d1 = 
          if List.Count(c1) >= 3 then
            Text.Combine(List.FirstN(c1, 3), "")
          else if Text.Length(b{1}) < 3 then
            Text.PadEnd(Text.Combine(c1 & y1, ""), 3, "X")
          else
            Text.Combine(List.FirstN(c1 & y1, 3))
      in
        d1 & " " & d
  )
in
  Nombres
Power Query solution 3 for Generate Italian Fiscal Code, proposed by Brian Julius:
BoCode = Table.AlternateRows(MyCode, 1, 3, 1)
Power Query solution 4 for Generate Italian Fiscal Code, proposed by Matthias Friedmann:
let
  Source = Excel.CurrentWorkbook(){[Name = "CodiceFiscale"]}[Content], 
  #"Added Custom" = Table.AddColumn(
    Source, 
    "Code", 
    each [
      A = Text.Upper([Names]), 
      a = Text.AfterDelimiter(A, " "), 
      b = Text.BeforeDelimiter(A, " "), 
      c = {"A", "E", "I", "O", "U"}, 
      // Surname 
      d = Text.Start(Text.Remove(a, c) & Text.Select(a, c) & "XX", 3) & " ", 
      e = Text.Remove(b, c), 
      // First Name 
      f = if Text.Length(e) > 3 then Text.Start(e, 1) & Text.Range(e, 2, 2) else e, 
      g = Text.Start(f & Text.Select(b, c) & "XX", 3), 
      h = d & g
    ][h]
  )
in
  #"Added Custom"
Power Query solution 5 for Generate Italian Fiscal Code, proposed by Victor Wang:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Result = Table.AddColumn(
    Source, 
    "Code", 
    each 
      let
        t  = Text.Split(Text.Upper([Names]), " "), 
        t0 = Text.ToList(t{0}), 
        t1 = Text.ToList(t{1}), 
        v  = {"A", "E", "I", "O", "U"}, 
        o  = List.RemoveItems({"A" .. "Z"}, v)
      in
        Text.Combine(
          List.Combine(
            {
              [
                a = List.RemoveItems(t1, v), 
                b = List.RemoveItems(t1, o), 
                c = List.Repeat({"X"}, Text.Length([Names])), 
                d = List.FirstN(a & b & c, 3)
              ][d], 
              {" "}, 
              [
                a = List.RemoveItems(t0, v), 
                b = List.RemoveItems(t0, o), 
                c = List.Repeat({"X"}, Text.Length([Names])), 
                d = if List.Count(a) > 3 then List.RemoveRange(a, 1, 1) else a, 
                e = List.FirstN(d & b & c, 3)
              ][e]
            }
          )
        )
  )
in
  Result
Power Query solution 7 for Generate Italian Fiscal Code, proposed by Krzysztof Kominiak:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Result = Table.AddColumn(
    Source, 
    "Code", 
    each [
      x = {"A", "E", "I", "O", "U"}, 
      a = Text.Split(Text.Upper([Names]), " "), 
      b = Text.Start(Text.PadEnd(Text.Remove(a{0}, x) & Text.Select(a{0}, x), 3, "X"), 3), 
      c = Text.Start(Text.PadEnd(Text.Remove(a{1}, x) & Text.Select(a{1}, x), 3, "X"), 3), 
      d = c & " " & b
    ][d]
  )
in
  Result

Solving the challenge of Generate Italian Fiscal Code with Excel

Excel solution 1 for Generate Italian Fiscal Code, proposed by Bo Rydobon 🇹🇭:
=LET(
    y,
    LAMBDA(
        a,
        n,
        LET(
            c,
            CHAR(
                SEQUENCE(
                    26,
                    ,
                    65
                )
            ),
            v,
            {"A",
            "E",
            "I",
            "O",
            "U"},
            b,
            CONCAT(
                TEXTSPLIT(
                    a,
                    v
                )
            ),
            LEFT(
                CONCAT(
                    REPLACE(
                        b,
                        2,
                        LEN(
                            b
                        )>n,
                        
                    ),
                    TEXTSPLIT(
                        a,
                        FILTER(
                            c,
                            ISNA(
                                XMATCH(
                                    c,
                                    v
                                )
                            )
                        )
                    ),
                    "XX"
                ),
                3
            )
        )
    ),
    
    MAP(
        UPPER(
            A2:A11
        ),
        LAMBDA(
            z,
            y(
                TEXTAFTER(
                    z,
                    " "
                ),
                9
            )&" "&y(
                TEXTBEFORE(
                    z,
                    " "
                ),
                3
            )
        )
    )
)
Excel solution 2 for Generate Italian Fiscal Code, proposed by Bo Rydobon 🇹🇭:
=LET(
    y,
    LAMBDA(
        a,
        n,
        LET(
            v,
            {"A",
            "E",
            "I",
            "O",
            "U"},
            b,
            CONCAT(
                TEXTSPLIT(
                    a,
                    v
                )
            ),
            LEFT(
                CONCAT(
                    REPLACE(
                        b,
                        2,
                        LEN(
                            b
                        )>n,
                        
                    ),
                    TEXTSPLIT(
                        a,
                        MID(
                            b&0,
                            SEQUENCE(
                                LEN(
                            b
                        )+1
                            ),
                            1
                        )
                    ),
                    "XX"
                ),
                3
            )
        )
    ),
    
    MAP(
        UPPER(
            A2:A11
        ),
        LAMBDA(
            z,
            y(
                TEXTAFTER(
                    z,
                    " "
                ),
                9
            )&" "&y(
                TEXTBEFORE(
                    z,
                    " "
                ),
                3
            )
        )
    )
)
Excel solution 3 for Generate Italian Fiscal Code, proposed by Bo Rydobon 🇹🇭:
=LET(
    Y,
    LAMBDA(
        a,
        x,
        LET(
            m,
            MID(
                UPPER(
                    a
                ),
                SEQUENCE(
                    LEN(
                    a
                )
                ),
                1
            ),
            n,
            -ISERR(
                FIND(
                    m,
                    "AEIOU"
                )
            ),
            s,
            SORTBY(
                m,
                n
            ),
            LEFT(
                REPLACE(
                    CONCAT(
                        s
                    ),
                    2,
                    SUM(
                        -n
                    )>x,
                    
                )&"XX",
                3
            )
        )
    ),
    MAP(
        A2:A11,
        LAMBDA(
            z,
            Y(
                TEXTAFTER(
                    z,
                    " "
                ),
                9
            )&" "&Y(
                TEXTBEFORE(
                    z,
                    " "
                ),
                3
            )
        )
    )
)
Excel solution 4 for Generate Italian Fiscal Code, proposed by Rick Rothstein:
=MAP(A2:A11,
    LAMBDA(z,
    LET(v,
    {"A",
    "E",
    "I",
    "O",
    "U"},
    
f,
    LAMBDA(t,
    fl,
    LET(gn,
    UPPER(
        IF(
            fl=1,
            TEXTBEFORE(
                t,
                " "
            ),
            TEXTAFTER(
                t,
                
                " "
            )
        )
    ),
    m,
    MID(
        gn,
        SEQUENCE(
            LEN(
                gn
            )
        ),
        1
    ),
    c,
    CONCAT(
        TEXTSPLIT(
            gn,
            v
        )
    ),
    
LEFT(LEFT(REPLACE(CONCAT(
    c
),
    2,
    0+(fl=1)*(LEN(
    c
)>3),
    ""),
    3)&
LEFT(
    LEFT(
        CONCAT(
            IF(
                ISNUMBER(
                    FIND(
                        m,
                        "AEIOU"
                    )
                ),
                m,
                ""
            )
        ),
        3
    )&
    "XXX",
    3
),
    3))),
    f(
        z,
        2
    )&" "&f(
        z,
        1
    ))))
Excel solution 5 for Generate Italian Fiscal Code, proposed by John V.:
=LET(f,
    LAMBDA(n,
    t,
    LET(v,
    {"A";"E";"I";"O";"U"},
    l,
    MID(
        n,
        SEQUENCE(
            LEN(
                n
            )
        ),
        1
    ),
    x,
    XLOOKUP(
        l,
        v,
        v
    ),
    e,
    ISNA(
        x
    ),
    CONCAT(INDEX(TOCOL(
        VSTACK(
            IF(
                e,
                l,
                z
            ),
            x,
            {"X";"X"}
        ),
        2
    ),
    {1;2;3}+(SUM(
        --e
    )>3)*t*{0;1;1})))),
    MAP(
        UPPER(
            A2:A11
        ),
        LAMBDA(
            x,
            f(
                TEXTAFTER(
                    x,
                    " "
                ),
                
            )&" "&f(
                TEXTBEFORE(
                    x,
                    " "
                ),
                1
            )
        )
    ))
Excel solution 6 for Generate Italian Fiscal Code, proposed by محمد حلمي:
=MAP(
    A2:A11,
    LAMBDA(
        l,
        LET(
            w,
            LAMBDA(
                a,
                LET(
                    
                    s,
                    TEXTSPLIT(
                        UPPER(
                            l
                        ),
                        ,
                        " "
                    ),
                    d,
                    IF(
                        a,
                        @DROP(
                            s,
                            1
                        ),
                        @TAKE(
                            s,
                            1
                        )
                    ),
                    v,
                    MID(
                        d,
                        SEQUENCE(
                            20
                        ),
                        1
                    ),
                    
                    g,
                    LAMBDA(
                        z,
                        [m],
                        CONCAT(
                            m,
                            IF(
                                z-ISERR(
                                    FIND(
                                        v,
                                        "AIEOU"
                                    )
                                ),
                                v,
                                ""
                            )
                        )
                    ),
                    e,
                    g(
                        0
                    ),
                    i,
                    LEN(
                        e
                    ),
                    k,
                    g(
                        1,
                        e
                    ),
                    
                    y,
                    d&"XX",
                    n,
                    LEN(
                        d
                    )<3,
                    
                    LEFT(
                        CONCAT(
                            IF(
                                a,
                                IFS(
                                    i>2,
                                    e,
                                    n,
                                    y,
                                    1,
                                    k
                                ),
                                IFS(
                                    i=3,
                                    e,
                                    i>3,
                                    MID(
                                        e,
                                        {1;3;4},
                                        1
                                    ),
                                    n,
                                    y,
                                    1,
                                    k
                                )
                            )
                        ),
                        3
                    )
                )
            ),
            w(
                1
            )&" "&w(
                        0
                    )
        )
    )
)
Excel solution 7 for Generate Italian Fiscal Code, proposed by محمد حلمي:
=MAP(
    A2:A11,
    LAMBDA(
        l,
        LET(
            w,
            LAMBDA(
                a,
                LET(
                    
                    s,
                    TEXTSPLIT(
                        UPPER(
                            l
                        ),
                        ,
                        " "
                    ),
                    d,
      &              IF(
                        a,
                        @DROP(
                            s,
                            1
                        ),
                        @TAKE(
                            s,
                            1
                        )
                    ),
                    
                    v,
                    MID(
                        d,
                        SEQUENCE(
                            20
                        ),
                        1
                    ),
                    g,
                    LAMBDA(
                        z,
                        [m],
                        CONCAT(
                            m,
                            
                            IF(
                                z-ISERR(
                                    FIND(
                                        v,
                                        "AIEOU"
                                    )
                                ),
                                v,
                                ""
                            )
                        )
                    ),
                    e,
                    g(
                        0
                    ),
                    i,
                    LEN(
                        e
                    ),
                    k,
                    g(
                        1,
                        e
                    ),
                    
                    y,
                    d&"XX",
                    n,
                    LEN(
                        d
                    )<3,
                    LEFT(
                        CONCAT(
                            IF(
                                a,
                                IFS(
                                    i>2,
                                    e,
                                    n,
                                    y,
                                    1,
                                    k
                                ),
                                
                                IFS(
                                    i=3,
                                    e,
                                    i>3,
                                    MID(
                                        e,
                                        {1;3;4},
                                        1
                                    ),
                                    n,
                                    y,
                                    1,
                                    k
                                )
                            )
                        ),
                        3
                    )
                )
            ),
            w(
                1
            )&" "&w(
                        0
                    )
        )
    )
)
Excel solution 8 for Generate Italian Fiscal Code, proposed by محمد حلمي:
=UPPER(
    
    MAP(
        A2:A11,
        LAMBDA(
            a,
            LET(
                
                d,
                TOCOL(
                    {65,
                    69,
                    73,
                    79,
                    85}+{0;32}
                ),
                
                e,
                TEXTAFTER(
                    a,
                    " "
                ),
                
                ee,
                TEXTBEFORE(
                    a,
                    " "
                ),
                
                c,
                CODE(
                    MID(
                        e,
                        SEQUENCE(
                            LEN(
                                e
                            )
                        ),
                        1
                    )
                ),
                
                cc,
                CODE(
                    MID(
                        ee,
                        SEQUENCE(
                            LEN(
                                ee
                            )
                        ),
                        1
                    )
                ),
                
                v,
                CONCAT(
                    CHAR(
                        TAKE(
                            SORTBY(
                                c,
                                ISNA(
                                    XMATCH(
                                        c,
                                        d
                                    )
                                ),
                                -1
                            ),
                            3
                        )
                    )
                ),
                
                vv,
                ISNA(
                    XMATCH(
                        cc,
                        d
                    )
                ),
                
                r,
                IF(
                    SUM(
                        --vv
                    )>3,
                    INDEX(
                        SORTBY(
                            cc,
                            vv,
                            -1
                        ),
                        {1,
                        3,
                        4}
                    ),
                    SORTBY(
                            cc,
                            vv,
                            -1
                        )
                ),
                
                i,
                CONCAT(
                    CHAR(
                        TAKE(
                            r,
                            3
                        )
                    )
                ),
                
                IF(
                    LEN(
                        v
                    )<3,
                    v&REPT(
                        "X",
                        3-LEN(
                        v
                    )
                    ),
                    v
                )&" "&
                IF(
                    LEN(
                        i
                    )<3,
                    i&REPT(
                        "X",
                        3-LEN(
                            "i"
                        )
                    ),
                    i
                )
            )
        )
    )
)
Excel solution 9 for Generate Italian Fiscal Code, proposed by محمد حلمي:
=UPPER(
    
    MAP(
        A2:A11,
        LAMBDA(
            a,
            LET(
                
                d,
                TOCOL(
                    {65,
                    69,
                    73,
                    79,
                    85}+{0;32}
                ),
                
                e,
                TEXTAFTER(
                    a,
                    " "
                ),
                
                ee,
                TEXTBEFORE(
                    a,
                    " "
                ),
                
                l,
                LAMBDA(
                    x,
                    CODE(
                        MID(
                            x,
                            SEQUENCE(
                                LEN(
                                    x
                                )
                            ),
                            1
                        )
                    )
                ),
                
                c,
                l(
                    e
                ),
                
                cc,
                l(
                    ee
                ),
                
                v,
                CONCAT(
                    CHAR(
                        TAKE(
                            
                            SORTBY(
                                c,
                                ISNA(
                                    XMATCH(
                                        c,
                                        d
                                    )
                                ),
                                -1
                            ),
                            3
                        )
                    )
                ),
                
                vv,
                ISNA(
                    XMATCH(
                        cc,
                        d
                    )
                ),
                
                r,
                IF(
                    SUM(
                        --vv
                    )>3,
                    INDEX(
                        SORTBY(
                            cc,
                            vv,
                            -1
                        ),
                        {1,
                        3,
                        4}
                    ),
                    
                    SORTBY(
                            cc,
                            vv,
                            -1
                        )
                ),
                
                i,
                CONCAT(
                    CHAR(
                        TAKE(
                            r,
                            3
                        )
                    )
                ),
                
                z,
                LEN(
                    v
                ),
                
                y,
                LEN(
                    i
                ),
                
                IF(
                    z<3,
                    v&REPT(
                        "X",
                        3-z
                    ),
                    v
                )&" "&
                IF(
                    y<3,
                    i&REPT(
                        "X",
                        3-y
                    ),
                    i
                )
            )
        )
    )
)
Excel solution 10 for Generate Italian Fiscal Code, proposed by Kris Jaganah:
=LET(a,
    A2:A11,
    b,
    UPPER(
        TEXTAFTER(
            a,
            " ",
            1
        )
    ),
    c,
    LEN(
        b
    ),
    d,
    BYROW(
        b,
        LAMBDA(
            p,
            REDUCE(
                p,
                MID(
                    "AEIOU",
                    SEQUENCE(
                        5
                    ),
                    1
                ),
                LAMBDA(
                    x,
                    y,
                    SUBSTITUTE(
                        x,
                        y,
                        ""
                    )
                )
            )
        )
    ),
    e,
    LEN(
        d
    ),
    f,
    BYROW(
        b,
        LAMBDA(
            p,
            REDUCE(
                p,
                MID(
                    "BCDFGHJKLMNPQRSTVWXYZ",
                    SEQUENCE(
                        21
                    ),
                    1
                ),
                LAMBDA(
                    x,
                    y,
                    SUBSTITUTE(
                        x,
                        y,
                        ""
                    )
                )
            )
        )
    ),
    g,
    MAP(b,
    c,
    d,
    e,
    f,
    LAMBDA(v,
    w,
    x,
    y,
    z,
    IF(AND(
        w>=3,
        y>=3
    ),
    LEFT(
        x,
        3
    ),
    IF(AND(
        w>=3,
        y<3
    ),
    x&LEFT(
        z,
        3-LEN(
            x
        )
    ),
    IF(w<3,
    x&z&REPT("X",
    (3-w))))))),
    h,
    UPPER(
        TEXTBEFORE(
            A2:A11,
            " ",
            1
        )
    ),
    i,
    LEN(
        h
    ),
    j,
    BYROW(
        h,
        LAMBDA(
            p,
            REDUCE(
                p,
                MID(
                    "AEIOU",
                    SEQUENCE(
                        5
                    ),
                    1
                ),
                LAMBDA(
                    x,
                    y,
                    SUBSTITUTE(
                        x,
                        y,
                        ""
                    )
                )
            )
        )
    ),
    k,
    LEN(
        j
    ),
    l,
    BYROW(
        h,
        LAMBDA(
            p,
            REDUCE(
                p,
                MID(
                    "BCDFGHJKLMNPQRSTVWXYZ",
                    SEQUENCE(
                        21
                    ),
                    1
                ),
                LAMBDA(
                    x,
                    y,
                    SUBSTITUTE(
                        x,
                        y,
                        ""
                    )
                )
            )
        )
    ),
    m,
    MAP(h,
    i,
    j,
    k,
    l,
    LAMBDA(v,
    w,
    x,
    y,
    z,
    IF(y=3,
    x,
    IF(y>3,
    LEFT(
        x,
        1
    )&MID(
        x,
        3,
        2
    ),
    IF(AND(
        w>=3,
        y<3
    ),
    x&LEFT(
        z,
        3-LEN(
            x
        )
    ),
    IF(w<3,
    x&z&REPT("X",
    (3-w)))))))),
    g&" "&m)
Excel solution 11 for Generate Italian Fiscal Code, proposed by Julian Poeltl:
=MAP(
    A2:A11,
    LAMBDA(
        N,
        LET(
            C,
            {"a",
            "e",
            "i",
            "o",
            "u"},
            F,
            TEXTAFTER(
                N,
                " "
            ),
            FS,
            MID(
                F,
                SEQUENCE(
                    LEN(
                        F
                    )
                ),
                1
            ),
            T,
            LEFT(
                CONCAT(
                    SORTBY(
                        FS,
                        --ISNUMBER(
                            XMATCH(
                                FS,
                                C
                            )
                        )
                    )
                ),
                3
            ),
            FP,
            T&REPT(
                "X",
                3-LEN(
                    T
                )
            ),
            S,
            TEXTBEFORE(
                N,
                " "
            ),
            SS,
            MID(
                S,
                SEQUENCE(
                    LEN(
                        S
                    )
                ),
                1
            ),
            IC,
            --NOT(
                ISNUMBER(
                    XMATCH(
                        SS,
                        C
                    )
                )
            ),
            NC,
            SUM(
                IC
            ),
            TT,
            IFS(
                NC=3,
                CONCAT(
                    FILTER(
                        SS,
                        IC
                    )
                ),
                NC>3,
                CONCAT(
                    CHOOSEROWS(
                        FILTER(
                        SS,
                        IC
                    ),
                        1,
                        3,
                        4
                    )
                ),
                1,
                LEFT(
                    CONCAT(
                        SORTBY(
                            SS,
                            --ISNUMBER(
                    XMATCH(
                        SS,
                        C
                    )
                )
                        )
                    ),
                    3
                )
            ),
            SP,
            TT&REPT(
                "X",
                3-LEN(
                    TT
                )
            ),
            UPPER(
                FP&" "&SP
            )
        )
    )
)
Excel solution 12 for Generate Italian Fiscal Code, proposed by Aditya Kumar Darak 🇮🇳:
=LET(
 _d,
     A2:A11,
    
 _v,
     {"A"; "E"; "I"; "O"; "U"},
    
 _ch,
     CHAR(
         SEQUENCE(
             26,
              ,
              65
         )
     ),
    
 _co,
     UNIQUE(
         VSTACK(
             _v,
              _ch
         ),
          ,
          1
     ),
    
 _fd,
     UPPER(
         _d
     ),
    
 _n1,
     TEXTBEFORE(
         _fd,
          " "
     ),
    
 _n2,
     TEXTAFTER(
         _fd,
          " "
     ),
    
 _e1,
     LAMBDA(
         a,
          b,
          SUBSTITUTE(
              a,
               b,
               ""
          )
     ),
    
 _e2,
     LAMBDA(
         x,
          REDUCE(
              x,
               _v,
               _e1
          )
     ),
    
 _e3,
     LAMBDA(
         x,
          REDUCE(
              x,
               _co,
               _e1
          )
     ),
    
 _f1,
     LEFT(_e2(_n2) & _e3(_n2) & "XX",
     3),
    
 _f2,
     LEFT(
 REPLACE(_e2(_n1),
     2,
     LEN(_e2(_n1)) > 3,
     "") & _e3(_n1) & "XX",
    
 3
 ),
    
 _r,
     _f1 & " " & _f2,
    
 _r
)
Excel solution 13 for Generate Italian Fiscal Code, proposed by Aditya Kumar Darak 🇮🇳:
=MAP(
 A2:A11,
    
 LAMBDA(a,
    
 LET(
 v,
     {"A"; "E"; "I"; "O"; "U"},
    
 t1,
     TEXTAFTER(
         a,
          " "
     ),
    
 e1,
     LAMBDA(
         x,
          MID(
              x,
               SEQUENCE(
                   LEN(
                       x
                   )
               ),
               1
          )
     ),
    
 e2,
     LAMBDA(
         x,
          ISNA(
              XMATCH(
                  x,
                   v
              )
          )
     ),
    
 e3,
     LAMBDA(
         x,
          FILTER(
              x,
               e2(
                       x
                   ),
               ""
          )
     ),
    
 e4,
     LAMBDA(
         x,
          FILTER(
              x,
               1 - e2(
                       x
                   ),
               ""
          )
     ),
    
 e5,
     LAMBDA(x,
     e1(TEXTJOIN(
         "",
          1,
          e3(
                       x
                   ),
          e4(
                       x
                   )
     ))),
    
 e6,
     LAMBDA(
         x,
          y,
          IFERROR(
              INDEX(
                  x,
                   y
              ),
               "X"
          )
    & ),
    
 s1,
     e1(t1),
    
 j1,
     e5(s1),
    
 t2,
     TEXTBEFORE(
         a,
          " "
     ),
    
 s2,
     e1(t2),
    
 j2,
     e5(s2),
    
 cnt,
     ROWS(e3(s2)),
    
 f1,
     e6(j1,
     {1; 2; 3}),
    
 f2,
     IF(cnt > 3,
     e6(j2,
     {1; 3; 4}),
     e6(j2,
     {1; 2; 3})),
    
 r,
     UPPER(
         CONCAT(
             f1,
              " ",
              f2
         )
     ),
    
 r
 )
 )
)
Excel solution 14 for Generate Italian Fiscal Code, proposed by Timothée BLIOT:
=MAP(
    A2:A11,
     LAMBDA(
         z,
          LET(
              A,
               UPPER(
                   TEXTSPLIT(
                       z,
                       " "
                   )
               ),
              
              B,
               {"A",
              "E",
              "I",
              "O",
              "U"},
              
              
              AF,
               MID(
                   INDEX(
                       A,
                       1
                   ),
                   SEQUENCE(
                       LEN(
                           INDEX(
                       A,
                       1
                   )
                       )
                   ),
                   1
               ),
              
              AL,
               MID(
                   INDEX(
                       A,
                       2
                   ),
                   SEQUENCE(
                       LEN(
                           INDEX(
                       A,
                       2
                   )
                       )
                   ),
                   1
               ),
              
              
              BF,
               MAP(
                   AF,
                    LAMBDA(
                        x,
                         --NOT(
                             ISNUMBER(
                                 XMATCH(
                                     x,
                                     B
                                 )
                             )
                         ) 
                    )
               ),
              
              BL,
               MAP(
                   AL,
                    LAMBDA(
                        x,
                         --NOT(
                             ISNUMBER(
                                 XMATCH(
                                     x,
                                     B
                                 )
                             )
                         ) 
                    )
               ),
              
              CF,
               SUM(
                   BF
               ),
               CL,
               SUM(
                   BL
               ),
              
              
              L,
               CONCAT(
                    IF(
                        CL>=3,
                        TAKE(
                            FILTER(
                                AL,
                                BL
                            ),
                            3
                        ),
                        
                        LET(
                            V,
                             VSTACK(
                                 IF(
                                     CL>0,
                                     FILTER(
                                AL,
                                BL
                            ),
                                     ""
                                 ),
                                 IF(
                                     ROWS(
                                         AL
                                     )-CL>0,
                                     FILTER(
                                         AL,
                                         NOT(
                   BL
               )
                                     ),
                                     ""
                                 )
                             ),
                            
                            W,
                             IFERROR(
                                 FILTER(
                                     V,
                                     V<>""
                                 ),
                                 ""
                             ),
                            
                            IF(
                                ROWS(
                                    W
                                )<3,
                                CONCAT(
                                    W,
                                    REPT(
                                        "X",
                                        3-ROWS(
                                    W
                                )
                                    )
                                ),
                                TAKE(
                                    W,
                                    3
                                )
                            ) 
                        ) 
                    )
               ),
              
              
              F,
               CONCAT(
                    IF(
                        CF=3,
                        FILTER(
                            AF,
                            BF
                        ),
                        
                        IF(
                            CF>3,
                             MID(
                                 CONCAT(
                                     FILTER(
                            AF,
                            BF
                        )
                                 ),
                                 {1,
                                 3,
                                 4},
                                 1
                             ),
                            
                            LET(
                                V,
                                 VSTACK(
                                     IF(
                                         CF>0,
                                         FILTER(
                            AF,
                            BF
                        ),
                                         ""
                                     ),
                                     IF(
                                         ROWS(
                                             AF
                                         )-CF>0,
                                         FILTER(
                                             AF,
                                             NOT(
                   BF
               )
                                         ),
                                         ""
                                     )
                                 ),
                                
                                W,
                                 IFERROR(
                                     FILTER(
                                         V,
                                         V<>""
                                     ),
                                     ""
                                 ),
                                
                                IF(
                                    ROWS(
                                    W
                                )<3,
                                    CONCAT(
                                        W,
                                        REPT(
                                            "X",
                                            3-ROWS(
                                    W
                                )
                                        )
                                    ),
                                    TAKE(
                                    W,
                                    3
                                )
                                ) 
                            )
                            
                        )
                    )
               ),
               TEXTJOIN(
                   " ",
                   ,
                   L,
                   F
               )
          )
     )
)
Excel solution 15 for Generate Italian Fiscal Code, proposed by Stefan Olsson:
=MAP(
    A2:A11,
    
     LAMBDA(
         n,
          
          UPPER(
              REGEXREPLACE(
                  
                   REGEXREPLACE(
                       
                        REGEXREPLACE(
                            n,
                             "(?i)[^ AEIOU]",
                             ""
                        ),
                        
                        "^(w*)s(w*)$",
                        
                        REGEXEXTRACT(
                            REGEXREPLACE(
                                n,
                                 "(?i)[AEIOU]",
                                 ""
                            ),
                             "s(.*)$"
                        )&"$2XX "&
                        REGEXREPLACE(
                            REGEXREPLACE(
                                n,
                                 "(?i)[AEIOU]",
                                 ""
                            ),
                             "^(|(w{1,3})|(w)w(ww)w*)s",
                             "$2$3$4$1XX"
                        )
                        
                   ),
                   
                   "^(...).*(s...).*$",
                   
                   "$1$2"
                   
              )
          )
          
     )
    
)
Excel solution 16 for Generate Italian Fiscal Code, proposed by Abhishek Kumar Jain:
=MAP(
    A2:A11,
    LAMBDA(
        x,
        LET(
            
            a,
            x,
            
            v,
            {"A",
            "E",
            "I",
            "O",
            "U"},
            
            fn,
            UPPER(
                TEXTBEFORE(
                    a,
                    " "
                )
            ),
            
            ln,
            UPPER(
                TEXTAFTER(
                    a,
                    " "
                )
            ),
            
            fnseq,
            MID(
                fn,
                SEQUENCE(
                    LEN(
                        fn
                    )
                ),
                1
            ),
            
            lnseq,
            MID(
                ln,
                SEQUENCE(
                    LEN(
                        ln
                    )
                ),
                1
            ),
            
            lncon,
            IFERROR(
                FILTER(
                    lnseq,
                    IFERROR(
                        XMATCH(
                            lnseq,
                            v
                        ),
                        "CON"
                    )="CON"
                ),
                ""
            ),
            
            lnvow,
            IFERROR(
                FILTER(
                    lnseq,
                    IFERROR(
                        XMATCH(
                            lnseq,
                            v
                        ),
                        "CON"
                    )<>"CON"
                ),
                ""
            ),
            
            fncon,
            IFERROR(
                FILTER(
                    fnseq,
                    IFERROR(
                        XMATCH(
                            fnseq,
                            v
                        ),
                        "CON"
                    )="CON"
                ),
                ""
            ),
            
            fnvow,
            IFERROR(
                FILTER(
                    fnseq,
                    IFERROR(
                        XMATCH(
                            fnseq,
                            v
                        ),
                        "CON"
                    )<>"CON"
                ),
                ""
            ),
            
            lncode,
            IFS(
                LEN(
                        ln
                    )=1,
                ln&"XX",
                LEN(
                        ln
                    )=2,
                TEXTJOIN(
                    "",
                    TRUE,
                    lncon
                )&TEXTJOIN(
                    "",
                    TRUE,
                    lnvow
                )&"X",
                TRUE,
                IF(
                    COUNTA(
                        lncon
                    )<3,
                    LEFT(
                        TEXTJOIN(
                            "",
                            TRUE,
                            lncon
                        )&TEXTJOIN(
                            "",
                            TRUE,
                            lnvow
                        ),
                        3
                    ),
                    LEFT(
                        TEXTJOIN(
                            "",
                            TRUE,
                            lncon
                        ),
                        3
                    )
                )
            ),
            
            fncode,
            IFS(
                LEN(
                        fn
                    )=1,
                fn&"XX",
                LEN(
                        fn
                    )=2,
                TEXTJOIN(
                    "",
                    TRUE,
                    fncon
                )&TEXTJOIN(
                    "",
                    TRUE,
                    fnvow
                )&"X",
                TRUE,
                IFS(
                    COUNTA(
                        fncon
                    )<3,
                    LEFT(
                        TEXTJOIN(
                            "",
                            TRUE,
                            fncon
                        )&TEXTJOIN(
                            "",
                            TRUE,
                            fnvow
                        ),
                        3
                    ),
                    COUNTA(
                        fncon
                    )=3,
                    LEFT(
                        TEXTJOIN(
                            "",
                            TRUE,
                            fncon
                        ),
                        3
                    ),
                    TRUE,
                    TEXTJOIN(
                        "",
                        TRUE,
                        INDEX(
                            fncon,
                            {1;3;4}
                        )
                    )
                )
            ),
            
            lncode &" "&fncode
        )
    )
)
Excel solution 17 for Generate Italian Fiscal Code, proposed by Daniel Garzia:
=MAP(
    A2:A11,
    LAMBDA(
        n,
        LET(
            a,
            UPPER(
                n
            ),
            c,
            LAMBDA(
                x,
                MID(
                    x,
                    SEQUENCE(
                        LEN(
                            x
                        )
                    ),
                    1
                )
            ),
            i,
            LAMBDA(
                l,
                n,
                IFERROR(
                    FILTER(
                        l,
                        ISERR(
                            FIND(
                                l,
                                "AEIOU"
                            )
                        )-n
                    ),
                    ""
                )
            ),
            m,
            c(
                TEXTAFTER(
                    a,
                    " "
                )
            ),
            f,
            c(
                TEXTBEFORE(
                    a,
                    " "
                )
            ),
            u,
            i(
                f,
                
            ),
            LEFT(
                CONCAT(
                    i(
                        m,
                        
                    ),
                    i(
                        m,
                        1
                    ),
                    "XX"
                ),
                3
            )&" "&LEFT(
                CONCAT(
                    IF(
                        ROWS(
                            u
                        )<4,
                        u,
                        INDEX(
                            u,
                            {1;3;4}
                        )
                    ),
                    i(
                        f,
                        1
                    ),
                    "XX"
                ),
                3
            )
        )
    )
)
Excel solution 18 for Generate Italian Fiscal Code, proposed by Diego M.:
=MAP(A2:A11,
     LAMBDA(rng,
    
LET(_N,
     TEXTBEFORE(
         rng,
          " "
     ),
    
_SN,
     TEXTAFTER(
         rng,
         " "
     ),
    
_Vowels,
     {"a",
    "e",
    "i",
    "o",
    "u"},
    
_Spelled_N,
    MID(
        _N,
        SEQUENCE(
            LEN(
                _N
            )
        ),
        1
    ),
    
_Spelled_SN,
    MID(
        _SN,
        SEQUENCE(
            LEN(
                _SN
            )
        ),
        1
    ),
    
_ix_N_Vowels,
     BYROW(--(_Spelled_N=_Vowels),
     LAMBDA(
         x,
          SUM(
              x
          )
     ))=1,
    
_ix_SN_Vowels,
     BYROW(--(_Spelled_SN=_Vowels),
     LAMBDA(
         x,
          SUM(
              x
          )
     ))=1,
    
_N_Vowels,
     FILTER(
         _Spelled_N,
          _ix_N_Vowels,
          ""
     ),
    
_N_Cons,
     FILTER(
         _Spelled_N,
          1-_ix_N_Vowels,
          ""
     ),
    
_SN_Vowels,
     FILTER(
         _Spelled_SN,
          _ix_SN_Vowels,
          ""
     ),
    
_SN_Cons,
     FILTER(
         _Spelled_SN,
          1-_ix_SN_Vowels,
          ""
     ),
    
_First,
     UPPER(
         LEFT(
             CONCAT(
                 VSTACK(
                     _SN_Cons,
                      _SN_Vowels,
                     {"x";"x";"x"}
                 )
             ),
             3
         )
     ),
    
_Sec,
     UPPER(
         LEFT(
             CONCAT(
                 VSTACK(
                     IF(
                &         ROWS(
                             _N_Cons
                         )>3,
                          INDEX(
                              _N_Cons,
                               {1;3;4}
                          ),
                          _N_Cons
                     ),
                      _N_Vowels,
                     {"x";"x";"x"}
                 )
             ),
             3
         )
     ),
    
_First&" "&_Sec)))
Excel solution 19 for Generate Italian Fiscal Code, proposed by Diego M.:
= "William Shakespeare"

These two formulas produce the same result (="Shakespeare"):
=TEXTAFTER(
    A2,
    " "
)
=INDEX(
    TEXTSPLIT(
        A2,
        " "
    ),
     ,
    2
)

So do the following two (=11) when you apply the LEN function:
=LEN(
    TEXTAFTER(
        A2,
        " "
    )
)
=LEN(
    INDEX(
        TEXTSPLIT(
            A2,
            " "
        ),
         ,
        2
    )
)

So far so good. Now take the SEQUENCE of the last pair:
=SEQUENCE(
    LEN(
        TEXTAFTER(
            A2,
            " "
        )
    )
)
=SEQUENCE(
    LEN(
        INDEX(
            TEXTSPLIT(
                A2,
                " "
            ),
             ,
            2
        )
    )
)

Solving the challenge of Generate Italian Fiscal Code with SQL

SQL solution 1 for Generate Italian Fiscal Code, proposed by Zoran Milokanović:
WITH
DATA_PREPARATION
AS
(
 SELECT
 F.ORDINAL_NUMBER
 ,F.NAMES
 ,CASE
 THEN SUBSTRING(F.FNAME_CONSONATS, 1, 1) || SUBSTRING(F.FNAME_CONSONATS, 3)
 ELSE F.FNAME_CONSONATS
 END AS FNAME_CONSONATS
 ,F.FNAME_VOWELS
 ,F.LNAME_CONSONATS
 ,F.LNAME_VOWELS
 FROM
 (
 SELECT
 T.ORDINAL_NUMBER
 ,T.NAMES
 ,TRANSLATE(T.FNAME, 'AEIOU', '') AS FNAME_CONSONATS
 ,TRANSLATE(T.FNAME, '' || TRANSLATE(T.FNAME, 'AEIOU', ''), '') AS FNAME_VOWELS
 ,TRANSLATE(T.LNAME, 'AEIOU', '') AS LNAME_CONSONATS
 ,TRANSLATE(T.LNAME, '' || TRANSLATE(T.LNAME, 'AEIOU', ''), '') AS LNAME_VOWELS
 FROM
 (
 SELECT
 ROW_NUMBER() OVER () AS ORDINAL_NUMBER
 ,N.NAMES
 ,UPPER(SUBSTR(N.NAMES, 1, /*BEFORE SPACE*/ INSTR(N.NAMES, ' ') - 1)) AS FNAME
 ,UPPER(SUBSTR(N.NAMES, /*AFTER SPACE*/ INSTR(N.NAMES, ' ') + 1)) AS LNAME
 FROM NAMES N
 ) T
 ) F
)
SELECT
 DP.NAMES
,SUBSTRING(SUBSTRING(DP.LNAME_CONSONATS, 1, 3) || SUBSTRING(DP.LNAME_VOWELS, 1, 3) || 'XX', 1, 3) || ' ' ||
 SUBSTRING(SUBSTRING(DP.FNAME_CONSONATS, 1, 3) || SUBSTRING(DP.FNAME_VOWELS, 1, 3) || 'XX', 1, 3) AS CODE
FROM DATA_PREPARATION DP
ORDER BY
 DP.ORDINAL_NUMBER
;
                    
                  

Leave a Reply