Home » Create Snake Number Grid

Create Snake Number Grid

This challenge is contributed by Mehmet Çiçek. Create the Snake grid given as per number of columns in B1 and count in B2

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

Solving the challenge of Create Snake Number Grid with Power Query

Power Query solution 1 for Create Snake Number Grid, proposed by Bo Rydobon 🇹🇭:
let
  Cols = 6, 
  Count = 56, 
  Ans = Table.FromRows(
    List.Transform(
      {0 .. Number.RoundDown(Count / Cols)}, 
      each 
        let
          r = List.Transform(List.Numbers(_ * Cols + 1, Cols), each if _ > Count then null else _)
        in
          if Number.IsEven(_) then r else List.Reverse(r)
    )
  )
in
  Ans
Power Query solution 2 for Create Snake Number Grid, proposed by Zoran Milokanović:
let
  Source = {1 .. Count}, 
  Cols = 6, 
  Count = 56, 
  S = 
    let
      s = List.Transform(
        List.Split(Source, Cols), 
        each _ & List.Repeat({null}, Cols - List.Count(_))
      ), 
      r = List.Transform(
        List.Positions(s), 
        each if Number.IsOdd(_) then List.Reverse(s{_}) else s{_}
      )
    in
      Table.FromRows(r)
in
  S
Power Query solution 3 for Create Snake Number Grid, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
 Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content][Column1],
 Calc = List.Transform(List.Split({1..Source{1}}, Source{0}), each 
 let
 a = List.Count(_),
 b = if a = Source{0} then _ else _&List.Repeat({null}, Source{0}-List.Count(_))
 in b),
 Sol = Table.FromRows(List.Accumulate({0..List.Count(Calc)-1}, {} , (s,c)=> if Number.IsOdd(c+1) then s & {Calc{c}} else s & {List.Reverse(Calc{c})}))
in
 Sol

query 2

let
 Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content][Column1],
 Calc = Table.FromRows(List.Transform(List.Split({1..Source{1}}, Source{0}), each 
 let
 a = List.Count(_),
 b = if a = Source{0} then _ else _&List.Repeat({null}, Source{0}-List.Count(_))
 in b)),
 Idx = Table.AddIndexColumn(Calc, "Idx", 1),
 Sol = Table.FromRows(Table.AddColumn(Idx, "New", each 
 let 
 a = List.RemoveLastN(Record.ToList(_),1),
 b = if Number.IsEven(List.Last(Record.ToList(_))) then List.Reverse(a) else a
 in b)[New])
in
 Sol

Sin embargo, ninguno como los de Bo Rydobon o Matthias Friedmann 😬


                    
                  
          
Power Query solution 4 for Create Snake Number Grid, proposed by Luan Rodrigues:
let
  Cols = 6, 
  Count = 56, 
  tab = [
    a = List.Split({1 .. Count}, Cols), 
    b = List.Transform(a, each List.Count(_) < Cols), 
    b1 = List.Transform(a, each List.Count(_)), 
    c = List.Zip({a, b}), 
    d = Table.FromRows(
      List.Transform(
        c, 
        (x) => if x{1} = true then x{0} & List.Repeat({null}, Cols - List.Last(b1)) else x{0}
      )
    )
  ][d], 
  ind = Table.AddIndexColumn(tab, "Índice", 1, 1, Int64.Type), 
  res = Table.FromRows(
    Table.AddColumn(
      ind, 
      "Personalizar", 
      each 
        if Number.IsOdd([Índice]) = true then
          List.RemoveLastN(Record.FieldValues(_), 1)
        else
          List.Reverse(List.RemoveLastN(Record.FieldValues(_), 1))
    )[Personalizar]
  )
in
  res
Power Query solution 5 for Create Snake Number Grid, proposed by Matthias Friedmann:
let
  Cols = 6, 
  Count = 56, 
  List = List.Split(
    List.Transform({1 .. Cols * Number.RoundUp(Count / Cols)}, each if _ > Count then null else _), 
    Cols
  ), 
  Rows = List.Transform(
    List, 
    each if Number.IsOdd(List.PositionOf(List, _)) then List.Reverse(_) else _
  ), 
  Table = Table.FromRows(Rows)
in
  Table
Power Query solution 6 for Create Snake Number Grid, proposed by Venkata Rajesh:
let
  columns = 6, 
  number = 56, 
  list = List.Split({1 .. number}, columns), 
  rows = List.Transform(
    list, 
    each 
      if Number.IsEven(List.PositionOf(list, _)) then
        _ & List.Repeat({""}, columns - List.Count(_))
      else
        List.Repeat({""}, columns - List.Count(_)) & List.Reverse(_)
  )
in
  Table.FromRows(rows)

Solving the challenge of Create Snake Number Grid with Excel

Excel solution 1 for Create Snake Number Grid, proposed by Omid Motamedisedeh:
=LET(x,SEQUENCE(ROUNDUP(B2/B1,0),B1),y,INT((x-1)/B1),z,IF(ISEVEN(y),x,(y+1)*B1-MOD(x-1,B1)),IF(z>B2,"",z))
Excel solution 2 for Create Snake Number Grid, proposed by Bo Rydobon 🇹🇭:
=LET(c,B1,n,B2,r,SEQUENCE(ROUNDUP(n/c,))-1,m,MOD(r,2),s,r*c+m*c+(1-2*m)*SEQUENCE(,c)+m,IF(s>n,"",s))
Excel solution 3 for Create Snake Number Grid, proposed by John V.:
=MAKEARRAY(ROUNDUP(B2/B1,),B1,LAMBDA(r,c,LET(n,B1*r+IF(MOD(r,2),c-B1,1-c),IF(n>B2,"",n))))
Excel solution 4 for Create Snake Number Grid, proposed by محمد حلمي:
=LET(V,B2/B1+1,E,SEQUENCE(V,B1)+IF(ISODD(SEQUENCE(V)),,SEQUENCE(,B1,B1-1,-2)),IF(E>B2,"",E))
Excel solution 5 for Create Snake Number Grid, proposed by محمد حلمي:
=LET(S,B1,V,B2,R,SEQUENCE(,S),N,REDUCE(R,SEQUENCE(V/S),LAMBDA(A,D,VSTACK(A,TAKE(A,-1)+IF(ISODD(D),S*2-R*2+1,R*2-1)))),IF(N>V,"",N))
Excel solution 6 for Create Snake Number Grid, proposed by Kris Jaganah:
=LET(a,B1,b,B2,c,SEQUENCE(b/a+1),d,DROP(REDUCE("",c,LAMBDA(x,y,VSTACK(x,IF(ISODD(y),SEQUENCE(,a,a*(y-1)+1),SEQUENCE(,a,y*a,-1))))),1),IF(d>b,"",d))
Excel solution 7 for Create Snake Number Grid, proposed by Julian Poeltl:
=LET(N,TEXTSPLIT(TEXTJOIN("|",,BYROW(IFNA(WRAPROWS(SEQUENCE(B2),B1),""),LAMBDA(A,TEXTJOIN(",",0,IF(ISEVEN(ROUNDUP(TAKE(A,,1)/B1,0)),SORT(A,,-1,1),A))))),",","|"),IFERROR(--N,N))
Excel solution 8 for Create Snake Number Grid, proposed by Timothée BLIOT:
=LET(A,REDUCE(SEQUENCE(,B1),SEQUENCE(ROUNDUP(B2/B1,0)-1),LAMBDA(a,v,VSTACK(a,SORT(SEQUENCE(,B1,1+MAX(TAKE(a,-1))),,IF(ISODD(v),-1,1),1)))),IF(A>B2,"",A))
Excel solution 9 for Create Snake Number Grid, proposed by Hussein SATOUR:
=TEXTSPLIT(CONCAT(LET(a, WRAPROWS(SEQUENCE(B2),B1," "), BYROW(a, LAMBDA(x, IF(ISEVEN((MIN(x) - 1)/B1), TEXTJOIN(",",,x), TEXTJOIN(",",, INDEX(x,,SEQUENCE(B1,,B1,-1))))&"/")))), ",", "/",1)
Excel solution 10 for Create Snake Number Grid, proposed by Sunny Baggu:
=LET(
 _tbl, WRAPROWS(SEQUENCE(B2), B1),
 _rows, SEQUENCE(ROWS(_tbl)),
 IFNA(
 MAKEARRAY(
 ROWS(_tbl),
 B1,
 LAMBDA(r, c, INDEX(IF(ISODD(r), INDEX(_tbl, r, ), SORT(INDEX(_tbl, r, ), , -1, 1)), c))
 ),
 ""
 )
)
Excel solution 11 for Create Snake Number Grid, proposed by Charles Roldan:
=LET(a, WRAPROWS(SEQUENCE(B2), B1, ""), r, ROWS(a), 
CHOOSEROWS(
 VSTACK(a, SORT(a, , -1, 1)), 
 MOD(SEQUENCE(r, , 0, 1 + r), 2 * r) + 1)
)
Excel solution 12 for Create Snake Number Grid, proposed by JvdV –:
=LET(x,B1,y,MAKEARRAY(CEILING(B2/x,1),x,LAMBDA(r,c,r*x-IF(MOD(r,2),x-c,c-1))),IF(y>B2,"",y))

Or, if you don't mind some empty cells:

=LET(x,B1,y,MAKEARRAY(B2,x,LAMBDA(r,c,r*x-IF(MOD(r,2),x-c,c-1))),IF(y>B2,"",y))
Excel solution 13 for Create Snake Number Grid, proposed by Julien Lacaze:
=MAKEARRAY(ROUNDUP(B2/B1,0),B1,LAMBDA(r,c,LET(count,B2,cols,B1,a,IF(ISODD(r),c+cols*(r-1),cols*(r)-(c-1)),IF(a>count,"",a))))

I create an array where Odd and Even rows are treated as is : 
 - Odd rows are counting up, offset by cols*(current_row-1)
Excel solution 14 for Create Snake Number Grid, proposed by Pieter de Bruijn:
=MAKEARRAY(ROUNDUP(B2/B1,0),B1,LAMBDA(x,y,LET(z,IF(ISODD(x),x*B1-B1+y,x*B1+1-y),IF(z>B2,"",z))))

or using REDUCE:
=LET(a,WRAPROWS(SEQUENCE(B2),B1),REDUCE(SEQUENCE(,B1),SEQUENCE(ROWS(a)-1,,2),LAMBDA(x,y,IFERROR(VSTACK(x,SORT(INDEX(a,y,),,-1+(2*ISODD(y)),1)),""))))
Excel solution 15 for Create Snake Number Grid, proposed by Ziad A.:
=MAKEARRAY(B2/B1+1,B1,LAMBDA(r,c,LET(_,(r-1)*B1+IF(MOD(r,2),c,B1+1-c),IF(_>B2,,_))))

Using MAKEARRAY and denoting with "r "and "c" the current row and the current column respectively, we can generate a regular sequence using (r-1)
Excel solution 16 for Create Snake Number Grid, proposed by Diarmuid Early:
=LET(cnt,B2,rws,ROUNDUP(cnt/B1,0),cls,B1,seq,SEQUENCE(rws,cls),
 delt,SEQUENCE(rws,,cls+1,2*cls),
 sortSeq,IF(MOD(seq-1,2*cls)+1>cls,delt-seq,seq),
 IF(sortSeq>cnt,"",sortSeq))
Excel solution 17 for Create Snake Number Grid, proposed by Harry Seiders:
=LET(Cols,B1,Val,B2,most,MAKEARRAY(ROUNDUP(Val/Cols,0),Cols,LAMBDA(R,C,IF(ISODD(R),(R-1)*Cols+C,R*Cols-C+1))),IF(most<=Val,most,""))
Excel solution 18 for Create Snake Number Grid, proposed by Narayanan J 🇮🇳:
=LET(mx,B2,cl,B1,seq,SEQUENCE(ROUNDUP(mx/cl,0),cl,0),col,MOD(seq,cl),rw,INT(seq/cl),vl,IF(MOD(rw,2)=0,seq+1,(rw+1)*cl-col),IF(vl>mx,"",vl))
Excel solution 19 for Create Snake Number Grid, proposed by Henk-Jan van Well:
Recursive Lambda solution...
                    
                  

Solving the challenge of Create Snake Number Grid with Excel VBA

Excel VBA solution 1 for Create Snake Number Grid, proposed by Nicolas Micot:
VBA solution:
Function f_snakeGrid(cols As Integer, count As Integer)
Dim tableau As Variant
Dim ligs As Integer, cpt As Integer, col As Integer
ligs = WorksheetFunction.RoundUp(count / cols, 0)
ReDim tableau(1 To ligs, 1 To cols)
For i = 1 To ligs
 For j = 1 To cols
 cpt = cpt + 1
 col = IIf(i Mod 2 = 0, cols - j + 1, j)
 If Not cpt > count Then
 tableau(i, col) = cpt
 Else
 tableau(i, col) = ""
 End If
 Next j
Next i
f_snakeGrid = tableau
End Function
                    
                  

&&&

Leave a Reply