Home » Count Consecutive 1s Only

Count Consecutive 1s Only

Count the number of 1s if they are consecutive. For 0, 1, 0, 1, 1, 1, 0, 1, 1, 0 – Answer is 3, 2

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

Solving the challenge of Count Consecutive 1s Only with Power Query

Power Query solution 1 for Count Consecutive 1s Only, proposed by Bo Rydobon 🇹🇭:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Res = Table.TransformRows(
    Source, 
    each Text.Combine(
      List.Transform(
        List.Select(
          List.Transform(Text.Split([String], "0"), each Text.Length(Text.Replace(_, ", ", ""))), 
          each _ > 1
        ), 
        Text.From
      ), 
      ", "
    )
  )
in
  Res
Power Query solution 2 for Count Consecutive 1s Only, proposed by Zoran Milokanović:
let
  Source = Excel.CurrentWorkbook(){[Name = "Input"]}[Content], 
  S = Table.TransformRows(
    Source, 
    each Text.Combine(
      List.Transform(
        List.Select(Text.Split(Text.Select([String], {"0", "1"}), "0"), each Text.Length(_) > 1), 
        each Text.From(Text.Length(_))
      ), 
      ", "
    )
  )
in
  S
Power Query solution 3 for Count Consecutive 1s Only, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Sol = Table.AddColumn(
    Source, 
    "Answer", 
    each 
      let
        a = Text.Split([String], ", "), 
        b = Table.FromColumns({a}), 
        c = Table.Group(b, {"Column1"}, {{"Count", each Table.RowCount(_)}}, GroupKind.Local), 
        d = Text.Combine(
          List.Transform(
            Table.SelectRows(c, each [Column1] = "1" and [Count] > 1)[Count], 
            Text.From
          ), 
          ", "
        ), 
        e = if Text.Length(d) = 1 then Number.From(d) else d
      in
        e
  )[[Answer]]
in
  Sol
Power Query solution 4 for Count Consecutive 1s Only, proposed by Luan Rodrigues:
let
  Fonte = Tabela1, 
  res = Table.AddColumn(
    Fonte, 
    "Personalizar", 
    each Text.Combine(
      List.Transform(
        List.Select(
          List.Transform(
            List.ReplaceValue(
              Splitter.SplitTextByAnyDelimiter({"0"}, QuoteStyle.Csv)([String]), 
              ",", 
              "", 
              Replacer.ReplaceText
            ), 
            each Text.Remove(_, " ")
          ), 
          each _ <> "" and _ <> "1"
        ), 
        each Text.From(Text.Length(_))
      ), 
      ", "
    )
  )
in
  res
Power Query solution 5 for Count Consecutive 1s Only, proposed by Alexis Olson:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Result = Table.AddColumn(
    Source, 
    "Length", 
    each Text.Combine(
      List.Select(
        List.Transform(
          Text.Split(Text.Remove([String], {",", " "}), "0"), 
          each Text.From(Text.Length(_))
        ), 
        each _ > "1"
      ), 
      ", "
    )
  )
in
  Result
Power Query solution 6 for Count Consecutive 1s Only, proposed by Brian Julius:
let
  Source = Table.DuplicateColumn(
    Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
    "String", 
    "Number"
  ), 
  SplitToRows = Table.TransformColumnTypes(
    Table.ExpandListColumn(
      Table.TransformColumns(
        Source, 
        {
          {
            "Number", 
            Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv), 
            let
              itemType = (type nullable text) meta [Serialized.Text = true]
            in
              type {itemType}
          }
        }
      ), 
      "Number"
    ), 
    {"Number", Int64.Type}
  ), 
  GroupConsecutive = Table.Group(
    SplitToRows, 
    {"String", "Number"}, 
    {
      {"All", each _, type table [String = text, Number = nullable number]}, 
      {"Consecutive", each Table.RowCount(_), Int64.Type}
    }, 
    GroupKind.Local
  ), 
  Filter = Table.RemoveColumns(
    Table.SelectRows(GroupConsecutive, each ([Number] = 1) and ([Consecutive] <> 1)), 
    {"Number", "All"}
  ), 
  ReGroup = Table.Group(Filter, {"String"}, {"AnswerExpected", each [Consecutive], type list}), 
  Extract = Table.RenameColumns(
    Table.TransformColumns(
      ReGroup, 
      {"AnswerExpected", each Text.Combine(List.Transform(_, Text.From), ", "), type text}
    ), 
    {"String", "StringKey"}
  ), 
  Join = Table.SelectColumns(
    Table.Join(Source, "String", Extract, "StringKey", JoinKind.LeftOuter), 
    {"String", "AnswerExpected"}
  )
in
  Join

Solving the challenge of Count Consecutive 1s Only with Excel

Excel solution 1 for Count Consecutive 1s Only, proposed by Bo Rydobon 🇹🇭:
=MAP(A2:A9,LAMBDA(a,LET(b,LEN(SUBSTITUTE(TEXTSPLIT(a,0),", ",)),TEXTJOIN(", ",,REPT(b,b>1)))))
Excel solution 2 for Count Consecutive 1s Only, proposed by Bo Rydobon 🇹🇭:
=MAP(A2:A9,LAMBDA(a,LET(b,INT(LEN(TEXTSPLIT(a&11,0))/3),TEXTJOIN(", ",,REPT(b,b>1)))))
Excel solution 3 for Count Consecutive 1s Only, proposed by Bo Rydobon 🇹🇭:
=MAP(A2:A9,LAMBDA(a,LET(b,IFERROR(BYROW(TEXTSPLIT(a,", ",0,1),LAMBDA(a,COUNT(-a))),""),ARRAYTOTEXT(FILTER(b,b>1,"")))))
Excel solution 4 for Count Consecutive 1s Only, proposed by Rick Rothstein:
=MAP(A2:A9,LAMBDA(x,LET(a,LEN(TEXTSPLIT(SUBSTITUTE(x,", ",),0)),TEXTJOIN(", ",,FILTER(a,a>1,"")))))
Excel solution 5 for Count Consecutive 1s Only, proposed by Rick Rothstein:
=MAP(A2:A9,LAMBDA(x,LET(a,TEXTSPLIT(SUBSTITUTE(x,", ",""),0),l,IF(a="1","",LEN(a)),TEXTJOIN(", ",,IF(l=0,"",l)))))
Excel solution 6 for Count Consecutive 1s Only, proposed by John V.:
=MAP(A2:A9,LAMBDA(x,LET(c,LEN(TEXTSPLIT(SUBSTITUTE(x,", ",),0)),TEXTJOIN(", ",,REPT(c,c>1)))))
Excel solution 7 for Count Consecutive 1s Only, proposed by محمد حلمي:
=MAP(A2:A9,LAMBDA(a,LET(r,INT(LEN(TEXTSPLIT(a&",1",0))/3),TEXTJOIN(", ",,REPT(r,r>1)))))
Excel solution 8 for Count Consecutive 1s Only, proposed by محمد حلمي:
=MAP(A2:A9,LAMBDA(a,LET(r,SCAN(0,TEXTSPLIT(a&",0",,","),LAMBDA(a,d,a*d+d)),TEXTJOIN(", ",,REPT(r,IFNA((r>1)*(DROP(r,1)=0),))))))
Excel solution 9 for Count Consecutive 1s Only, proposed by Kris Jaganah:
=MAP(A2:A9,LAMBDA(x,LET(a,--TEXTSPLIT(x,,", "),b,SCAN(0,a,LAMBDA(x,y,IF(y=0,0,y+x))),d,EXPAND(b,ROWS(b)+1,,0),e,VSTACK(TAKE(d,-1),DROP(d,-1)),f,ARRAYTOTEXT(FILTER(e,(d=0)*(e>1),"")),IFERROR(--f,f))))
Excel solution 10 for Count Consecutive 1s Only, proposed by Kris Jaganah:
=MAP(A2:A9,LAMBDA(y,LET(a,--TEXTSPLIT(y,", ",0,1,,0),b,BYROW(a,LAMBDA(x,SUM(x))),IFERROR(ARRAYTOTEXT(FILTER(b,b>1)),""))))
Excel solution 11 for Count Consecutive 1s Only, proposed by Julian Poeltl:
=IFERROR(MAP(A2:A9,LAMBDA(A,LET(L,LEN(TEXTSPLIT(CONCAT(TEXTSPLIT(A,,", ")),"0")),J,TEXTJOIN(", ",,FILTER(L,L>1)),IFERROR(J*1,J)))),"")
Excel solution 12 for Count Consecutive 1s Only, proposed by Timothée BLIOT:
=MAP(A2:A9,LAMBDA(z,LET(A,SCAN(0,TEXTSPLIT(z,,", ")*1,LAMBDA(a,v, IF(v,a+1,v))),B,ROWS(A),TEXTJOIN(", ",,MAP(SEQUENCE(B),LAMBDA(x, LET(Q,INDEX(A,x),R,IF(x>1,IF(Q>INDEX(A,x-1),IF(xINDEX(A,x+1), Q,""),Q),""),""),IF(R<2,"",R))))))))
Excel solution 13 for Count Consecutive 1s Only, proposed by Hussein SATOUR:
=IFERROR(MAP(A2:A9, LAMBDA(x, LET(a, TEXTSPLIT(x, "0"), b, LEN(a)-LEN(SUBSTITUTE(a,"1","")), TEXTJOIN(", ",,FILTER(b, b>1))))), "")
Excel solution 14 for Count Consecutive 1s Only, proposed by Oscar Mendez Roca Farell:
=MAP(A2:A9, LAMBDA(a, LET(_n, --TEXTSPLIT(a, ,", "),_s, SEQUENCE(COUNT(_n)),_f, FREQUENCY(IF(_n,_s), IF(_n, ,_s)), IFERROR(ARRAYTOTEXT(TOROW(FILTER(_f, _f>1))),""))))
Excel solution 15 for Count Consecutive 1s Only, proposed by Sunny Baggu:
=MAP(
 A2:A9,
 LAMBDA(a,
 LET(
 _sub, SUBSTITUTE(a, ", ", ""),
 _split, TEXTSPLIT(_sub, , 0) + 0,
 IFERROR(
 ARRAYTOTEXT(
 TOCOL(
 IFS(_split > 10, LEN(_split)),
 3
 )
 ),
 ""
 )
 )
 )
)
Excel solution 16 for Count Consecutive 1s Only, proposed by Sunny Baggu:
=MAP(
 A2:A9,
 LAMBDA(x,
 LET(
 _list, VSTACK(TEXTSPLIT(x, , ",") + 0, 0),
 _seq, SEQUENCE(ROWS(_list)),
 _loc, TOCOL(IFS(_list = 0, _seq), 3),
 _val, _loc - VSTACK(0, DROP(_loc, -1)) - 1,
 IFERROR(ARRAYTOTEXT(FILTER(_val, _val > 1, "")), ROWS(_list) - 1)
 )
 )
)
Excel solution 17 for Count Consecutive 1s Only, proposed by Abdallah Ally:
=MAP(A2:A9,LAMBDA(a,TEXTJOIN(",",TRUE,IFERROR(FILTER(MAP(TRIM(REDUCE(a,{", 0, ",", 0"},LAMBDA(x,y,TEXTSPLIT(x,y)))),LAMBDA(z, SUM(VALUE(TEXTSPLIT(z,","))))),MAP(TRIM(REDUCE(a,{", 0, ",", 0"},LAMBDA(x,y,TEXTSPLIT(x,y)))),LAMBDA(z, SUM(VALUE(TEXTSPLIT(z,",")))))>1),""))))
Excel solution 18 for Count Consecutive 1s Only, proposed by Pieter de B.:
=MAP(A2:A9,LAMBDA(x,LET(y,LEN(TEXTSPLIT(SUBSTITUTE(x,", ",),0)),IFERROR(ARRAYTOTEXT(TOCOL(y/(y>1),3)),""))))
Excel solution 19 for Count Consecutive 1s Only, proposed by Charles Roldan:
=LET(
_f, LAMBDA(x,y, LEN(x) - LEN(SUBSTITUTE(x, y, ""))), 
_g, LAMBDA(x, FILTER(x, x > 1, "")), 
_h, LAMBDA(x, TEXTJOIN(", ", , _g(_f(TEXTSPLIT(x, 0), 1)))), 
MAP(A2:A9, _h))
Excel solution 20 for Count Consecutive 1s Only, proposed by Julien Lacaze:
=BYROW(A2:A9,LAMBDA(a,LET(b,LEN(TEXTSPLIT(SUBSTITUTE(a,", ",""),0)),TEXTJOIN(",",1,IF(b>1,b,"")))))
Excel solution 21 for Count Consecutive 1s Only, proposed by Nicolas Micot:
=LET(longueur;NBCAR(FRACTIONNER.TEXTE(SUBSTITUE(A2;", ";"");"0"));JOINDRE.TEXTE(", ";VRAI;SI(longueur>1;longueur;"")))
Excel solution 22 for Count Consecutive 1s Only, proposed by Ziad A.:
=INDEX(BYROW(IFERROR(1/(1/LEN(TRIM(SPLIT(REGEXREPLACE(REGEXREPLACE(A2:A9,", ",),"(11+)|.","$1 ")," "))))),LAMBDA(r,TEXTJOIN(", ",1,r))))
Excel solution 23 for Count Consecutive 1s Only, proposed by Giorgi Goderdzishvili:
=LET(
string,A2,
split, --TEXTSPLIT(string,","),
scanning, SCAN(0,split,LAMBDA(x,y,IF(y,x+1,0))),
array, --MAKEARRAY(1,COUNT(scanning),LAMBDA(r,c,IF(c=COUNT(scanning),INDEX(scanning,r,c),IF(AND(INDEX(scanning,r,c)=0,c<>1),INDEX(scanning,r,c-1),0)))),
final,FILTER(array,(array<>0)*(array<>1)),
IFERROR(TEXTJOIN(", ",TRUE,final),""))
Excel solution 24 for Count Consecutive 1s Only, proposed by Daniel Garzia:
=MAP(A2:A9,LAMBDA(l,LET(s,LEN(TEXTSPLIT(SUBSTITUTE(CONCAT(SUBSTITUTE(l,", ","")),1,"a"),0)),TEXTJOIN(", ",,IF(s<2,"",s)))))
Excel solution 25 for Count Consecutive 1s Only, proposed by Daniel Garzia:
=MAP(A2:A9,LAMBDA(l,LET(s,SUBSTITUTE(CONCAT(TEXTSPLIT(l,", ")),1,"a"),t,LEN(TEXTSPLIT(s,0)),IF(ISERR(FIND("aa",s)),"",TEXTJOIN(", ",,IF(t<2,"",t))))))
Excel solution 26 for Count Consecutive 1s Only, proposed by Quadri Olayinka Atharu:
=MAP(A2:A9,LAMBDA(x,
LET(_nc,SUBSTITUTE(x,", ",""),
y,TEXTSPLIT(_nc,0),
r,TEXTJOIN(", ",1,IF(LEN(y)<2,"",LEN(y))),
IFERROR(--r,r))))
Excel solution 27 for Count Consecutive 1s Only, proposed by Anup Kumar:
=BYROW(A2:A9,LAMBDA(a,LET(str,SUBSTITUTE(a,", ",""),
strArr,TEXTSPLIT(str,{0,"010"},,1),
strFlr,FILTER(strArr,strArr<>"1"),
IFERROR(ARRAYTOTEXT(LEN(strFlr)),"")
)))
Excel solution 28 for Count Consecutive 1s Only, proposed by Diarmuid Early:
=MAP(A2:A9,LAMBDA(x,
 LET(t,TEXTSPLIT(x,", "),
 s,SCAN(0,t,LAMBDA(a,v,v*(a+1))),
 o,FILTER(s,(s>1)*(HSTACK(DROP(s,,1),0)=0),""),
 TEXTJOIN(", ",,o))))

Here:
t splits the string by ", " into digits
s returns a running count of 1s (resets to 0 at each non-1)
o filters s where s>1 and the next term in s is 0 (or we're at the end of the string)
Excel solution 29 for Count Consecutive 1s Only, proposed by Rayan S.:
=MAP(A2:A9,LAMBDA(a,LET(x,LEN(SUBSTITUTE(SUBSTITUTE(TEXTSPLIT(a,", 0"),", ",""),0,"")),TEXTJOIN(", ",,IFERROR(FILTER(x,x>1),"")))))
Excel solution 30 for Count Consecutive 1s Only, proposed by Caroline Blake:
=MAP(A2:A9,LAMBDA(_array,
LET(b,TEXTSPLIT(_array,,"0,"),
c,LEN(SUBSTITUTE(SUBSTITUTE(b," ",""),",","")),
IFERROR(ARRAYTOTEXT(TRANSPOSE(FILTER(c,c>1))),""))))

&&

Leave a Reply