Home » Pattern Length!

Pattern Length!

Solving Pattern Length challenge by Power Query, Power BI, Excel, Python and R

_x000D_

Excel solution 16 for Pattern Length!, proposed by Md. Zohurul Islam:
=LET(    u,
    B3:B7,    v,
    C3:C7,    hdr,
    {"Date",
    "Length"},    w,
    MAP(
        v,
        LAMBDA(
            p,
            LET(
                
                 a,
                DROP(
                    TEXTSPLIT(
                        p,
                        ,
                        " "
                    ),
                    -1
                ),
                
                 b,
                VSTACK(
                    0,
                    ABS(
                        DROP(
                            a,
                            1
                        )=DROP(
                            a,
                            -1
                        )

For each date, samples are evaluated based on quality and marked with a “+” sign if they are within range and a “-” sign if they are out of range. Extract the longest sequence of consecutive “+” or “-” signs for each date.

📌 Challenge Details and Links
Challenge Number: 194
Challenge Difficulty: ⭐⭐
📥Download Sample File
📥Link to the solutions on LinkedIn

Solving the challenge of Pattern Length! with Power Query


_x000D_

Power Query solution 1 for Pattern Length!, proposed by Brian Julius:

let
  Source = Table.TransformColumnTypes(
    Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
    {"Date", Date.Type}
  ), 
  AddSymbols = Table.SelectRows(
    Table.ExpandListColumn(
      Table.AddColumn(Source, "Symbols", each Text.ToList([Pattern])), 
      "Symbols"
    ), 
    each [Symbols] <> " "
  ), 
  Group = Table.Group(
    AddSymbols, 
    {"Date", "Symbols"}, 
    {{"Len", each Table.RowCount(_)}}, 
    GroupKind.Local
  ), 
  Group2 = Table.Group(
    Group, 
    {"Date"}, 
    {{"MaxCount", each List.Max([Len]), type number}, {"All", each _}}
  ), 
  ExpFilt = Table.RemoveColumns(
    Table.SelectRows(
      Table.ExpandTableColumn(Group2, "All", {"Symbols", "Len"}, {"Symbols", "Len"}), 
      each [MaxCount] = [Len]
    ), 
    "MaxCount"
  ), 
  Clean = Table.RemoveColumns(
    Table.AddColumn(ExpFilt, "Length", each [Symbols] & Text.From([Len])), 
    {"Symbols", "Len"}
  )
in
  Clean


_x000D_

_x000D_

Power Query solution 2 for Pattern Length!, proposed by Eric Laforce:

letter
2) Add new col [Length] using it only for characters "+-' in [Pattern]
+ find the one with Max Text.Length
3) Project to keep only cols [Date], [Length] as final result

let
 fxTextSplitByConsecutiveLetters = (t as text) =>List.Accumulate( Text.ToList(t), {}, (s,c)=>let
 PrevChar = try Text.Start(List.Last(s),1) otherwise "" 
 in if (c=PrevChar) then List.RemoveLastN(s) & {List.Last(s) & c} else s & {c} ),

 Source = Excel.CurrentWorkbook(){[Name="tData"]}[Content],
 AddLength = Table.AddColumn(Source, "Length", each let 
 _l = fxTextSplitByConsecutiveLetters(Text.Select([Pattern], {"+","-"})),
 _Max = List.Max(_l, "", (x,y)=>Byte.From(Text.Length(x)>Text.Length(y)))
 in Text.Start(_Max,1) & Text.From(Text.Length(_Max))
 )
in
 AddLength[[Date],[Length]]


_x000D_

_x000D_

Power Query solution 3 for Pattern Length!, proposed by Ramiro Ayala Chávez:

let
S = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
LT = List.Transform,
a = Table.ToRows(S),
b = LT(a, each _{0}),
c = LT(a, each Text.ToList(Text.Remove(_{1}," "))),
Fx = (x)=> let
d = Table.Group(Table.FromColumns({x}),"Column1",{"G", each [Column1]},0)[G],
e = LT(d, each Table.FromRows({{List.Last(_)}&{List.Count(_)}})),
f = Table.ToRows(Table.MaxN(Table.Combine(e),"Column2",1)),
g = LT(f, each Text.Combine(LT(_, each Text.From(_))))
in g,
h = List.Combine(LT(c, each Fx(_))),
i = Table.FromRows(List.Zip({b,h}),{"Date","Length"}),
Sol = Table.ReplaceValue(i,"+","",Replacer.ReplaceText,{"Length"})
in
Sol


_x000D_

_x000D_

Power Query solution 4 for Pattern Length!, proposed by Alejandro Simón 🇵🇦 🇪🇸:

let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
Sol = Table.AddColumn(Source, "Length", (x)=> 
 Text.Combine(List.Transform(List.Last(List.Sort(List.Transform({"+", "-"}, (k)=> 
 let
 a = x[Pattern],
 b = List.Select(Text.Split(a, k), (z)=> z <> " "),
 c = List.Transform(b, (y)=> Text.Length(Text.Select(y, Text.Remove("+-", k)))),
 d = {Text.Remove("+-", k),List.Max(c)}
 in d), each _{1})), Text.From)))[[Date],[Length]]
in
Sol


_x000D_

_x000D_

Power Query solution 5 for Pattern Length!, proposed by Krzysztof Kominiak:

let
  Source = Table.FromRows(
    Json.Document(
      Binary.Decompress(
        Binary.FromText(
          "i45WMjDU90rM0zcyMDJR0lHSVtBW0FVAkMgspVgdoHIjZOW6CgiojcTSRhGFaDRGtQdZMbJNEMUm6I5CV4bMg2gxxeUPZCfBNMQCAA==", 
          BinaryEncoding.Base64
        ), 
        Compression.Deflate
      )
    ), 
    let
      _t = ((type nullable text) meta [Serialized.Text = true])
    in
      type table [Date = _t, Pattern = _t]
  ), 
  Result = Table.AddColumn(
    Source, 
    "Length", 
    each [
      a = Text.ToList(Text.Remove([Pattern], " ")), 
      b = Table.FromColumns({a}, {"Data"}), 
      c = Table.Group(b, "Data", {{"tmp", each Table.RowCount(_)}}, 0), 
      d = Table.Max(c, "tmp"), 
      e = d[Data] & Text.From(d[tmp])
    ][e]
  )
in
  Result


_x000D_

_x000D_

Power Query solution 6 for Pattern Length!, proposed by Abdallah Ally:

let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  AddCol = Table.AddColumn(
    Source, 
    "Length", 
    (x) =>
      [
        a = List.Select(Text.ToList(x[Pattern]), each Text.Contains("+-", _)), 
        b = Table.Group(
          Table.FromColumns({a}), 
          "Column1", 
          {"Data", each List.Count([Column1])}, 
          0, 
          (u, v) => Byte.From(v <> u)
        ), 
        c = Table.SelectRows(b, each [Data] = List.Max(b[Data])), 
        d = Text.Combine(List.Transform(Table.ToRows(c), each _{0} & Text.From(_{1})), ", ")
      ][d]
  )[[Date], [Length]], 
  Result = Table.TransformColumnTypes(AddCol, {"Date", type date})
in
  Result


_x000D_

_x000D_

Power Query solution 7 for Pattern Length!, proposed by Kris Jaganah:

let
  A = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  B = Table.AddColumn(
    A, 
    "Length", 
    each [
      a = (x) =>
        Text.From(
          List.Max(
            List.Transform(Text.Split(Text.Replace([Pattern], " ", ""), x), each Text.Length(_))
          )
        ), 
      b = if a("-") > a("+") then "+" & a("-") else "-" & a("+")
    ][b]
  )
in
  B


_x000D_

_x000D_

Power Query solution 8 for Pattern Length!, proposed by CA Raghunath Gundi:

let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Logic = Table.AddColumn(
    Source, 
    "Length", 
    each [
      a = Text.ToList([Pattern]), 
      b = List.RemoveItems(a, {" "}), 
      c = Table.FromList(b, Splitter.SplitByNothing()), 
      d = Table.Group(c, {"Column1"}, {{"Count", each Table.RowCount(_), Int64.Type}}, 0), 
      e = Table.Sort(d, {"Count", Order.Descending}), 
      f = Table.FirstN(e, 1), 
      g = Table.AddColumn(f, "Length", each [Column1] & Text.From([Count]))[Length]{0}
    ][g]
  )[[Date], [Length]]
in
  Logic


_x000D_

_x000D_

Power Query solution 9 for Pattern Length!, proposed by Seokho MOON:

let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Res = Table.AddColumn(Source, "Length", Fun)[[Date], [Length]], 
  Fun = each [
    A = Text.Remove([Pattern], " "), 
    B = Text.Split(A, "+") & Text.Split(A, "-"), 
    C = List.Sort(B, {each Text.Length(_), - 1}){0}, 
    D = Text.Start(C, 1) & Text.From(Text.Length(C))
  ][D]
in
  Res


_x000D_

_x000D_

Power Query solution 10 for Pattern Length!, proposed by Alexandre Garcia:

let
H = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
P = {"+","-"},
L = List.Transform,
C = Table.AddColumn(H, "Length", (x)=> 
[ 
 a = L(P, each Text.Split(x[Pattern],_)),
 b = L(a, each Text.From(List.Max(L(_, each Text.Length(Text.Remove(_, " ")))))),
 c = Text.Combine(List.Sort(List.Zip({List.Reverse(P), b}), {each _{1},1}){0})
 ] [c])[[Date],[Length]]
in C


_x000D_

_x000D_

Power Query solution 11 for Pattern Length!, proposed by Sahan Jayasuriya:

let
  Source = Excel.CurrentWorkbook(){[Name = "Data"]}[Content], 
  TransFormCol = Table.TransformColumns(
    Source, 
    {
      "Pattern", 
      each [
        a = Text.ToList(_), 
        b = List.RemoveItems(a, {" "}), 
        c = List.Positions(b), 
        d = List.Transform(
          c, 
          (x) => if x = 0 then b{0} else if b{x} = b{x - 1} then b{x} else "|" & b{x}
        ), 
        e = List.Transform(d, (x) => if Text.Length(x) = 1 then {x} else Text.ToList(x)), 
        f = List.Combine(e), 
        g = Text.Combine(f), 
        h = Text.Split(g, "|"), 
        i = List.Transform(h, (x) => Text.Length(x)), 
        j = List.Max(i), 
        k = List.PositionOf(i, j, Occurrence.First), 
        l = List.Distinct(Text.ToList(h{k})){0} & Text.From(j)
      ][l]
    }
  )
in
  TransFormCol


_x000D_

_x000D_

Power Query solution 12 for Pattern Length!, proposed by Tyler N.:

let
  a = Table.AddColumn(
    YourTable, 
    "Length", 
    each 
      let
        c = Text.ToList(Text.Remove([Pattern], " ")), 
        f = List.Count(c), 
        g = (h, i, j, k, l) =>
          if h = f - 2 then
            l{List.PositionOf(j, i) - 1}{0} & Text.From(i)
          else
            let
              m = (n) => c{n}, 
              o = m(h) = m(h + 1), 
              p = Int8.From(o)
            in
              @g(
                h + 1, 
                List.Max(j), 
                {j & {List.Count(k)}, j}{p}, 
                {{c{h + 1}}, k & {c{h + 1}}}{p}, 
                {l & {k}, l}{p}
              ), 
        q = g(0, 0, {0}, {c{0}}, {})
      in
        q
  )
in
  a[[Date], [Length]]


_x000D_

_x000D_

Power Query solution 13 for Pattern Length!, proposed by Vida Vaitkunaite:

let
 Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
 Custom = Table.AddColumn(Source, "Length", each let
a = Table.FromList(List.Select(Text.ToList([Pattern]), each _<>" ")),
b = Table.Group(a, {"Column1"}, {{"Count", each Table.RowCount(_)}}, 0),
c = Table.SelectRows(b, each [Count]= List.Max(b[Count])),
d = Table.AddColumn(c, "Length", each [Column1]&Text.From([Count]))[Length]{0}
in d),
 Final = Table.RemoveColumns(Custom,{"Pattern"})
in
 Final


_x000D_


Solving the challenge of Pattern Length! with Excel


_x000D_

Excel solution 1 for Pattern Length!, proposed by 🇰🇷 Taeyong Shin:

=GROUPBY(
    B2:B7,
    VSTACK(
        H2,
        C3:C7
    ),
    LAMBDA(
        x,
        LET(
            r,
            REGEXEXTRACT(
                @x,
                "[+ ]+|[- ]+",
                1
            ),
            l,
            LEN(
                r
            )/2,
            @SORTBY(
                LEFT(
                r
            )&l,
                -l
            )
        )
    ),
    3,
    0
)


_x000D_

_x000D_

Excel solution 2 for Pattern Length!, proposed by Oscar Mendez Roca Farell:

=MAP(
    C3:C7,
    LAMBDA(
        a,
        LET(
            r,
            REGEXEXTRACT(
                SUBSTITUTE(
                    a,
                    " ",
                    ""
                ),
                "[+]+|[-]+",
                1
            ),
            e,
            LEN(
                r
            ),
            @SORTBY(
                LEFT(
                r
            )&e,
                -e
            )
        )
    )
)


_x000D_

_x000D_

Excel solution 3 for Pattern Length!, proposed by Julian Poeltl:

=MAP(
    C3:C7,
    LAMBDA(
        P,
        LET(
            L,
            LEN(
                P
            ),
            S,
            SEQUENCE(
                L
            ),
            A,
            LAMBDA(
                A,
                XMATCH(
                    L,
                    IF(
                        L-LEN(
                            SUBSTITUTE(
                                P,
                                REPT(
                                    A,
                                    S
                                ),
                                ""
                            )
                        ),
                        S,
                        
                    ),
                    -1,
                    -1
                )
            ),
            Pl,
            A(
                "+ "
            ),
            M,
            A(
                "- "
            ),
            IF(
                Pl>M,
                "+"&Pl,
                "-"&M
            )
        )
    )
)


_x000D_

_x000D_

Excel solution 4 for Pattern Length!, proposed by Kris Jaganah:

=MAP(
    C3:C7,
    LAMBDA(
        y,
        LET(
            a,
            LAMBDA(
                x,
                MAX(
                    BYROW(
                        N(
                            TEXTSPLIT(
                                y,
                                " ",
                                x,
                                1,
                                ,
                                ""
                            )<>""
                        ),
                        SUM
                    )
                )
            ),
            b,
            a(
                "-"
            ),
            c,
            a(
                "+"
            ),
            IF(
                b>c,
                "+"&b,
                "-"&c
            )
        )
    )
)


_x000D_

_x000D_

Excel solution 5 for Pattern Length!, proposed by Kris Jaganah:

=HSTACK(
    B3:B7,
    MAP(
        C3:C7,
        LAMBDA(
            v,
            LET(
                a,
                LAMBDA(
                    x,
                    MAX(
                        LEN(
                            TEXTSPLIT(
                                SUBSTITUTE(
                                    v,
                                    " ",
                                    ""
                                ),
                                ,
                                x,
                                1
                            )
                        )
                    )
                ),
                b,
                a(
                    "-"
                ),
                c,
                a(
                    "+"
                ),
                IF(
                    b>c,
                    "+"&b,
                    "-"&c
                )
            )
        )
    )
)


_x000D_

_x000D_

Excel solution 6 for Pattern Length!, proposed by JvdV –:

=HSTACK(
    B3:B7,
    REDUCE(
        "",
        ROW(
            1:99
        ),
        LAMBDA(
            x,
            y,
            IFNA(
                REGEXEXTRACT(
                    C3:C7,
                    "([+-])( 1){"&y-1&"}",
                    2
                )&y,
                x
            )
        )
    )
)


_x000D_

_x000D_

Excel solution 7 for Pattern Length!, proposed by Ivan William:

=MAP(
    C3:C7,
    LAMBDA(
        x,
        LET(
            a,
            TEXTSPLIT(
                x,
                ,
                " "
            ),
            b,
            SCAN(
                0,
                a<>VSTACK(
                    0,
                    DROP(
                        a,
                        -1
                    )
                ),
                SUM
            ),
            c,
            DROP(
                FREQUENCY(
                    b,
                    b
                ),
                -1
            ),
            FILTER(
                a,
                c=MAX(
                    c
                )
            )&MAX(
                    c
                )
        )
    )
)


_x000D_

_x000D_

Excel solution 8 for Pattern Length!, proposed by Sunny Baggu:

=MAP(     C3:C7,     LAMBDA(
         p,          LET(
              
               _a,
               MAX(
                   
                    LEN(
                        SUBSTITUTE(
                            TEXTSPLIT(
                                p,
                                 ,
                                 {" +",
                                 "+ ",
                                 "+",
                                 " + "},
                                 TRUE
                            ),
                             " ",
                             ""
                        )
                    )
                    
               ),
              
               _b,
               MAX(
                   
                    LEN(
                        SUBSTITUTE(
                            TEXTSPLIT(
                                p,
                                 ,
                                 {" -",
                                 "- ",
                                 "-",
                                 " - "},
                                 TRUE
                            ),
                             " ",
                             ""
                        )
                    )
                    
               ),
              
               IF(
                   _a > _b,
                    "-" & _a,
                    "+" & _b
               )
               
          )     ))


_x000D_

_x000D_

Excel solution 9 for Pattern Length!, proposed by Asheesh Pahwa:

=MAP(
    C3:C7,
    LAMBDA(
        x,
        LET(
            p,
            MAX(
                LEN(
                    SUBSTITUTE(
                        TEXTSPLIT(
                            x,
                            "-"
                        ),
                        " ",
                        ""
                    )
                )
            ),
            m,
            MAX(
                LEN(
                    SUBSTITUTE(
                        TEXTSPLIT(
                            x,
                            "+"
                        ),
                        " ",
                        ""
                    )
                )
            ),
            IF(
                p>m,
                "+"&p,
                "-"&m
            )
        )
    )
)


_x000D_

_x000D_

Excel solution 10 for Pattern Length!, proposed by CA Mohit Saxena:

=VSTACK(B2:C2,
    HSTACK(B3:B7,
    MAP(C3:C7,
    LAMBDA(a,
    LET(p,
    MAX(
        LEN(
            TEXTSPLIT(
                a,
                "-"
            )
        )
    ),
    s,
    MAX(LEN(TEXTSPLIT(a,
    ""+"))),IF(p›s,"+"&p,"-"&s))))))


_x000D_

_x000D_

Excel solution 11 for Pattern Length!, proposed by Fausto Bier:

=MAP(
    C3:C7,
    LAMBDA(
        i,
        LET(
            k,
            BYCOL(
                DROP(
                    REDUCE(
                        0,
                        SEQUENCE(
                            LEN(
                                i
                            )
                        ),
                        LAMBDA(
                            a,
                            v,
                            VSTACK(
                                a,
                                FIND(
                                    REPT(
                                        {"+ ",
                                        "- "},
                                        v
                                    ),
                                    i
                                )
                            )
                        )
                    ),
                    1
                ),
                COUNT
            ),
            b,
            MAX(
                k
            ),
            @IF(
                b=k,
                "+"&b,
                "-"&b
            )
        )
    )
)


_x000D_

_x000D_

Excel solution 12 for Pattern Length!, proposed by ferhat CK:

=HSTACK(
    B3:B7,
    MAP(
        C3:C7,
        LAMBDA(
            i,
            LET(
                q,
                TOCOL(
                    REGEXEXTRACT(
                        SUBSTITUTE(
                            i,
                            " ",
                            ""
                        ),
                        ".",
                        1
                    )
                ),
                t,
                TAKE,
                a,
                SCAN(
                    TRIM(
                        t(
                            q,
                            1
                        )
                    )&"-"&0,
                    TRIM(
                        q
                    ),
                    LAMBDA(
                        x,
                        v,
                        IF(
                            v=LEFT(
                                x
                            ),
                            x,
                            v&RIGHT(
                                x
                            )*1+1
                        )
                    )
                ),
                b,
                GROUPBY(
                    a,
                    a,
                    ROWS,
                    ,
                    0
                ),
                r,
                FILTER(
                    b,
                    t(
                        b,
                        ,
                        -1
                    )=MAX(
                        t(
                        b,
                        ,
                        -1
                    )
                    )
                ),
                CONCAT(
                    LEFT(
                        r
                    )
                )
            )
        )
    )
)


_x000D_

_x000D_

Excel solution 13 for Pattern Length!, proposed by ferhat CK:

=HSTACK(
    B3:B7,
    MAP(
        C3:C7,
        LAMBDA(
            i,
            LET(
                a,
                TOCOL(
                    VSTACK(
                        REGEXEXTRACT(
                            SUBSTITUTE(
                                i,
                                " ",
                                ""
                            ),
                            "[+]+",
                            1
                        ),
                        REGEXEXTRACT(
                            SUBSTITUTE(
                                i,
                                " ",
                                ""
                            ),
                            "[-]+",
                            1
                        )
                    ),
                    2
                ),
                b,
                LEN(
                    a
                ),
                LEFT(
                    FILTER(
                        a,
                        MAX(
                            b
                        )=b
                    )
                )&MAX(
                            b
                        )
            )
        )
    )
)


_x000D_

_x000D_

Excel solution 14 for Pattern Length!, proposed by Hamidi Hamid:

=LET(
    sb,
    SUBSTITUTE,
    x,
    sb(
        TRANSPOSE(
            sb(
                sb(
                    C3:C7,
                    "+",
                    1
                ),
                "-",
                2
            )
        ),
        " ",    ),
    y,
    SUBSTITUTE(
        TRANSPOSE(
            sb(
                SUBSTITUTE(
                    C3:C7,
                    "+",
                    2
                ),
                "-",
                1
            )
        ),
        " ",    ),
    sv,
    TOCOL(
        REPT(
            2,
            SEQUENCE(
                ,
                20,
                1
            )
        )
    ),
    v,
    IFERROR(
        SEARCH(
            sv,
            x,
            1
        ),
        ""
    ),
    vv,
    IFERROR(
        -IF(
            v<>"",
            LEN(
                sv
            ),
            ""
        ),
        0
    ),
    w,
    IFERROR(
        SEARCH(
            sv,
            y,
            1
        ),
        0
    ),
    ww,
    IFERROR(
        -IF(
            w<>0,
            LEN(
                sv
            ),
            ""
        ),
        0
    ),
    q,
    -ABS(
        vv
    )+ABS(
        ww
    ),
    t,
    IF(
        q=0,
        "",
        q
    ),
    HSTACK(
        B3:B7,
        TRANSPOSE(
            BYCOL(
                t,
                LAMBDA(
                    a,
                    LOOKUP(
                        9^9,
                        a
                    )
                )
            )
        )
    )
)


_x000D_

_x000D_

Excel solution 15 for Pattern Length!, proposed by Hussein SATOUR:

=MAP(
    C3:C7,
    LAMBDA(
        x,
        LET(
            a,
            REGEXEXTRACT(
                SUBSTITUTE(
                    x,
                    " ",
                    ""
                ),
                "[+]+|[-]+",
                1
            ),
            b,
            LEN(
                a
            ),
            FILTER(
                LEFT(
                a
            )&b,
                b=MAX(
                    b
                )
            )
        )
    )
)


_x000D_

_x000D_

Excel solution 16 for Pattern Length!, proposed by Md. Zohurul Islam:

=LET(    u,
B3:B7, v,
C3:C7, hdr,
{"Date",
"Length"}, w,
MAP(
v,
LAMBDA(
p,
LET(

a,
DROP(
TEXTSPLIT(
p,
,
" "
),
-1
),

b,
VSTACK(
0,
ABS(
DROP(
a,
1
)=DROP(
a,
-1
)

Leave a Reply