Home » Generate Number Outline Sequence

Generate Number Outline Sequence

Generate the number outlining. If single X – 1, 2, 3… If double X – 1.1, 1.2… If triple x – 1.1.1. 1.1.2…

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

Solving the challenge of Generate Number Outline Sequence with Power Query

Power Query solution 1 for Generate Number Outline Sequence, proposed by Aditya Kumar Darak 🇮🇳:
let
  Source = Excel.CurrentWorkbook(){[Name = "data"]}[Content], 
  List = Source[Strings], 
  Output = List.Generate(
    () => [a = 0, b = List{a}, d = {1}, f = "1"], 
    each [a] < List.Count(List), 
    each [
      a = [a] + 1, 
      b = List{a}, 
      c = Text.Length(b), 
      d = if c > Text.Length([b]) then [d] & {1} else List.FirstN([d], c - 1) & {[d]{c - 1} + 1}, 
      e = List.Transform(d, Text.From), 
      f = Text.Combine(e, ".")
    ], 
    each [Strings = [b], Answer = [f]]
  ), 
  Return = Table.FromRecords(Output)
in
  Return
Power Query solution 2 for Generate Number Outline Sequence, proposed by Glyn Willis:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  #"Changed Type" = Table.TransformColumnTypes(Source, {{"Strings", type text}}), 
  #"Grouped Rows" = 
    let
      t = Table.Group(
        #"Changed Type", 
        {"Strings"}, 
        {{"a", each _, type table}}, 
        GroupKind.Local, 
        (x, y) => Int64.From(y[Strings] = x[Strings])
      )[a], 
      tc = List.Count(t)
    in
      List.Transform(
        {0 .. tc - 1}, 
        (r) =>
          let
            tbl = Table.Buffer(t{r}), 
            rc  = Table.RowCount(tbl), 
            s   = List.Buffer(tbl[Strings]), 
            m   = List.Max(List.Transform(s, (a) => Text.Length(a)))
          in
            Table.FromColumns(
              {
                s, 
                List.Generate(
                  () => [
                    t  = tbl{i}[Strings], 
                    i  = 0, 
                    tl = Text.Length(t), 
                    id = List.Buffer(List.Zip({{r + 1} & List.Repeat({0}, m - 1), {1 .. m}}))
                  ], 
                  each [i] < rc, 
                  each [
                    t = tbl{i}[Strings], 
                    i = [i] + 1, 
                    tl = Text.Length(t), 
                    id = List.Buffer(
                      List.Transform(
                        [id], 
                        (a) =>
                          if a{1} = tl then
                            {a{0} + 1, a{1}}
                          else if a{1} > tl then
                            {a{0} * 0, a{1}}
                          else
                            a
                      )
                    )
                  ], 
                  each Text.Combine(List.Transform([id], (c) => Text.From(c{0})), ".")
                )
              }, 
              {"String", "String ID"}
            )
      ), 
  Custom1 = Table.Combine(#"Grouped Rows")
in
  Custom1

Solving the challenge of Generate Number Outline Sequence with Excel

Excel solution 1 for Generate Number Outline Sequence, proposed by Bo Rydobon 🇹🇭:
=MID(
    DROP(
        REDUCE(
            0,
            A2:A20,
            LAMBDA(
                a,
                v,
                LET(
                    r,
                    A2:v,
                    p,
                    XLOOKUP(
                        v,
                        DROP(
                            r,
                            -1
                        ),
                        DROP(
                            a,
                            1
                        ),
                        ,
                        ,
                        -1
                    ),
                    
                    VSTACK(
                        a,
                        IF(
                            v>@TAKE(
                                VSTACK(
                                    0,
                                    r
                                ),
                                -2
                            ),
                            TAKE(
                                a,
                                -1
                            )&".1",
                            TEXTBEFORE(
                                p,
                                ".",
                                -1
                            )&"."&TEXTAFTER(
                                p,
                                ".",
                                -1
                            )+1
                        )
                    )
                )
            )
        ),
        1
    ),
    3,
    9
)
Excel solution 2 for Generate Number Outline Sequence, proposed by John V.:
=SCAN(
    0,
    A2:A20,
    LAMBDA(
        a,
        v,
        LET(
            b,
            LEN(
                v
            ),
            IF(
                b>LEN(
                    OFFSET(
                        v,
                        -1,
                        
                    )
                ),
                a&".1",
                LEFT(
                    a,
                    2*b-2
                )&1+MID(
                    a,
                    2*b-1,
                    1
                )
            )
        )
    )
)
Excel solution 3 for Generate Number Outline Sequence, proposed by محمد حلمي:
=SCAN(
    0,
    A2:A20,
    LAMBDA(
        a,
        v,
        LET(
            i,
            LEN(
                v
            ),
            
            x,
            LEN(
                @+TAKE(
                    A1:v,
                    -2
                )
            ),
            
            Y,
            LAMBDA(
                W,
                TEXTBEFORE(
                    W,
                    ".",
                    -1
                ) &"."&RIGHT(
                    W
                )+1
            ),
            
            IFS(
                i=1,
                LEFT(
                    a
                )+1,
                i>x,
                a&".1",
                i=x,
                Y(
                    a
                ),
                1,
                Y(
                    LEFT(
                        a,
                        i*2-1
                    )
                )
            )
        )
    )
)
Excel solution 4 for Generate Number Outline Sequence, proposed by Kris Jaganah:
=BYROW(TRANSPOSE(
    SUBSTITUTE(
        TEXTSPLIT(
            ARRAYTOTEXT(
                BYCOL(
                    SEQUENCE(
                        ,
                        9
                    ),
                    LAMBDA(
                        v,
                        TEXTJOIN(
                            "#",
                            ,
                            SCAN(
                                0,
                                LEN(
                                    A2:A20
                                ),
                                LAMBDA(
                                    x,
                                    y,
                                    IFS(
                                        y=v,
                                        x+1,
                                        y>v,
                                        x,
                                        1,
                                        0
                                    )
                                )
                            )
                        )
                    )
                )
            ),
            "#",
            ", "
        ),
        "0",
        ""
    )
),
    LAMBDA(
        w,
        TEXTJOIN(
            ".",
            ,
            w
        )
    )
Excel solution 5 for Generate Number Outline Sequence, proposed by Timothée BLIOT:
=LET(A,
    MAP(SEQUENCE(
        19
    ),
    LAMBDA(x,
    SUM(--(TAKE(
        A2:A20,
        x
    )="X")))),
    B,
    VSTACK(
        0,
        SCAN(
            0,
            SEQUENCE(
                18
            ),
            LAMBDA(
                w,
                v,
                IF(
                    INDEX(
                        A,
                        v
                    )=INDEX(
                        A,
                        v+1
                    ),
                    IF(
                        INDEX(
                            A2:A20,
                            v+1
                        )="XX",
                        w+1,
                        w
                    ),
                    0
                )
            )
        )
    ),
    C,
    SCAN(
        0,
        A2:A20,
        LAMBDA(
            w,
            v,
            IF(
                v="XXX",
                w+1,
                0
            )
        )
    ),
    D,
    HSTACK(
        B,
        C
    ),
    BYROW(
        HSTACK(
            A,
            IF(
                D=0,
                "",
                "."&D
            )
        ),
        LAMBDA(
            x,
            CONCAT(
                x
            )
        )
    ))
Excel solution 6 for Generate Number Outline Sequence, proposed by JvdV –:
=TEXT(
    SCAN(
        0,
        A2:A20,
        LAMBDA(
            a,
            b,
            LEFT(
                a&0,
                LEN(
                    b
                )
            )+1
        )
    ),
    0&REPT(
        ".0",
        LEN(
            A2:A20
        )-1
    )
)
Excel solution 7 for Generate Number Outline Sequence, proposed by Pieter de Bruijn:
=MAP(
    A2:A20,
    LAMBDA(
        x,
        SUM(
            N(
                A2:x="X"
            )
        )&IF(
            LEN(
                x
            )-1,
            CONCAT(
                "."&MAP(
                    REPT(
                        "X",
                        SEQUENCE(
                            LEN(
                x
            )-1
                        )
                    ),
                    LAMBDA(
                        y,
                        SUM(
                            N(
                                XLOOKUP(
                                    y,
                                    x:A2,
                                    x:A2,
                                    ,
                                    ,
                                    -1
                                ):x=y&"X"
                            )
                        )
                    )
                )
            ),
            ""
        )
    )
)
Excel solution 8 for Generate Number Outline Sequence, proposed by LUIS FLORENTINO COUTO CORTEGOSO:
=LET(k,
    REDUCE({0,
    0,
    0},
    LEN(
        A2:A20
    ),
    LAMBDA(a,
    p,
    LET(f,
    MAKEARRAY(
        2,
        3,
        LAMBDA(
            i,
            j,
            IF(
                AND(
                    i=1
                ),
                IF(
                    j=p,
                    1,
                    0
                ),
                IF(
                    j<=p,
                    1,
                    0
                )
            )
        )
    ),
    VSTACK(a,
    TAKE(
        f,
        -1
    )*(TAKE(
        f,
        1
    )+TAKE(
        a,
        -1
    )))))),
    BYROW(
        DROP(
            k,
            1
        ),
        LAMBDA(
            l,
            TEXTJOIN(
                ".",
                1,
                IF(
                    l=0,
                    "",
                    l
                )
            )
        )
    ))
Excel solution 9 for Generate Number Outline Sequence, proposed by Tyler Cameron:
=LET(
    a,
    SCAN(
        0,
        A2:A20,
        LAMBDA(
            x,
            y,
            IF(
                y="X",
                x+1,
                x
            )
        )
    ),
    b,
    SCAN(
        0,
        A2:A20,
        LAMBDA(
            x,
            y,
            IF(
                y="XX",
                x+1,
                IF(
                    y="X",
                    x-x,
                    x
                )
            )
        )
    ),
    c,
    SCAN(
        0,
        A2:A20,
        LAMBDA(
            x,
            y,
            IF(
                y="XXX",
                x+1,
                0
            )
        )
    ),
    d,
    IF(
        b=0,
        "",
        b
    ),
    e,
    IF(
        c=0,
        "",
        c
    ),
    MAKEARRAY(
        COUNTA(
            A2:A20
        ),
        1,
        LAMBDA(
            r,
            c,
            TEXTJOIN(
                ".",
                TRUE,
                INDEX(
                    a,
                    r
                ),
                INDEX(
                    d,
                    r
                ),
                INDEX(
                    e,
                    r
                )
            )
        )
    )
)
Excel solution 10 for Generate Number Outline Sequence, proposed by Alexandra Popoff:
=> XXX). I added some commentaries in the jpg.
Fx_Seq_Dyna = Lambda(
    z_Input,
    
    LET(
        
         z_len,
         LEN(
             z_Input
         ),
        
         z_Max_Y,
         ROWS(
             z_Input
         ),
        z_Max_X,
         MAX(
             z_len
         ),
        
         z_seq_Y,
         SEQUENCE(
             z_Max_Y,
              1,
              1,
              1
         ),
        
         z_Input_Arr,
         MAKEARRAY(
             z_Max_Y,
              z_Max_X,
              LAMBDA(
                  z_Y,
                   z_X,
                   IF(
                       z_X <= INDEX(
                           z_len,
                            z_Y,
                            1
                       ),
                        1,
                        0
                   )
              )
         ),
        
         z_Delta,
         MAKEARRAY(
             ROWS(
             z_Input
         ),
              MAX(
             z_len
         ),
              LAMBDA(
                  z_y,
                   z_x,
                   N(
                       INDEX(
                           z_len,
                            z_y
                       ) = z_x
                   )
              )
         ),
        
         z_Adj,
         z_Input_Arr - VSTACK(
             SEQUENCE(
                 1,
                  z_Max_X,
                  0,
                  0
             ),
              DROP(
                  z_Input_Arr,
                   -1
              )
         ),
        
         z_Delta_Adj,
         MAKEARRAY(
             z_Max_Y,
              z_Max_X,
              LAMBDA(
                  z_Y,
                   z_X,
                   MIN(
                       1,
                        INDEX(
                            z_Delta,
                             z_Y,
                             z_X
                        ) + MAX(
                            0,
                             INDEX(
                                 z_Adj,
                                  z_Y,
                                  z_X
                             )
                        )
                   )
              )
         ),
        
         z_Arr,
         MAKEARRAY(
             z_Max_Y,
             z_Max_X,
             LAMBDA(
                 z_Y,
                  z_X,
                 
                  IF(
                      z_X = 1,
                      SUM(
                          TAKE(
                              z_Delta_Adj,
                               z_Y,
                               1
                          ),
                           0
                      ),
                      
                       LET(
                           Test_Arr,
                            BYROW(
                                TAKE(
                                    z_Delta_Adj,
                                     z_Y,
                                     z_X - 1
                                ),
                                 LAMBDA(
                                     z_i,
                                      SUM(
                                  &        z_i
                                      )
                                 )
                            ),
                           
                            IFERROR(
                                SUM(
                                    DROP(
                                        TAKE(
                                            INDEX(
                                                z_Delta_Adj,
                                                 ,
                                                 z_X
                                            ),
                                             z_Y
                                        ),
                                        MAX(
                                            0,
                                             XLOOKUP(
                                                 1,
                                                  Test_Arr,
                                                  TAKE(
                                                      z_seq_Y,
                                                       z_Y
                                                  ),
                                                  0,
                                                  0,
                                                  -1
                                             ) - 1
                                        )
                                    )
                                ),
                                
                                 0
                            )
                       )
                  )
                  
             )
         ),
        
         BYROW(
             SUBSTITUTE(
                 z_Arr,
                  0,
                  ""
             ),
              LAMBDA(
                  z_i,
                   TEXTJOIN(
                       ".",
                        TRUE,
                        z_i
                   )
              )
         )
        
    )
)

Solving the challenge of Generate Number Outline Sequence with Python

Python solution 1 for Generate Number Outline Sequence, proposed by Cristobal Salcedo Beltran:
Code
=================
import pandas as pd
excel_file_path = "/lakehouse/default/Files/Challenge/Excel_Challenge_416 - Outline Numbering.xlsx"
pandas_df = pd.read_excel(excel_file_path, usecols=[0], header=0)
max_depth = pandas_df['Strings'].apply(len).max()
counters = [0] * max_depth
def get_number(s):
 global counters
 level = len(s)
 counters[level-1] += 1
 counters[level:] = [0] * (max_depth - level)
 return '.'.join(str(counters[i]) for i in range(level) if counters[i] > 0)
pandas_df['HierarchicalNumber'] = pandas_df['Strings'].apply(get_number)
print(pandas_df)
                    
                  

Solving the challenge of Generate Number Outline Sequence with R

R solution 1 for Generate Number Outline Sequence, proposed by Konrad Gryczan, PhD:
Easier that it looks. Done in R.
library(tidyverse)
library(readxl)
input = read_excel("Excel/416 Outline Numbering.xlsx", range = "A1:A20")
test = read_excel("Excel/416 Outline Numbering.xlsx", range = "B1:B20")
result = input %>%
 mutate(level = str_count(Strings, "X")) %>%
 mutate(first_lev = cumsum(level == 1)) %>%
 mutate(second_level = cumsum(level == 2), .by = first_lev) %>%
 mutate(third_level = cumsum(level == 3), .by = c(first_lev, second_level)) %>%
 mutate(`Answer Expected` = case_when(
 level == 1 ~ paste0(first_lev),
 level == 2 ~ paste0(first_lev, ".", second_level),
 level == 3 ~ paste0(first_lev, ".", second_level, ".", third_level)
 )) %>%
 select(`Answer Expected`)
                    
                  

&&

Leave a Reply