Home » Find Missing AP Sequence

Find Missing AP Sequence

The first and last terms in an Arithmetic Progressions (AP) are given in each row. Find the in between numbers marked as x.

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

Solving the challenge of Find Missing AP Sequence with Power Query

solution 1 Kris Jaganah:
let
  A = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  B = List.Transform(
    Table.ToRows(A), 
    (z) =>
      [
        a = List.Select(z, each _ is number), 
        b = List.Count(List.Select(z, each _ = "x")) + 1, 
        c = (a{1} - a{0}) / b, 
        d = List.Accumulate(z, {}, (v, w) => v & {if w = "x" then List.Last(v) + c else w})
      ][d]
  ), 
  C = Table.FromRows(B, Table.ColumnNames(A))
in
  C
solution 2 Alejandro Simón 🇵🇦 🇪🇸:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Sol = Table.Combine(
    Table.AddColumn(
      Source, 
      "A", 
      (x) =>
        let
          a = List.RemoveNulls(Record.ToList(x)), 
          b = List.Count(a) - 1, 
          c = List.Select(a, each _ is number), 
          d = 
            let
              aa = (List.Last(c) - c{0}) / b, 
              bb = {c{0}} & List.Transform({1 .. b}, each c{0} + aa * _)
            in
              bb, 
          e = List.FirstN(Record.FieldNames(x), b + 1), 
          f = Table.FromRows({d}, e)
        in
          f
    )[A]
  )
in
  Sol
solution 3 Ramiro Ayala Chávez:
let
  S = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  a = List.Transform(Table.ToRows(S), List.RemoveNulls), 
  Fx = (x) =>
    let
      b = (List.Last(x) - List.First(x)) / (List.Count(x) - 1), 
      c = List.Generate(
        () => [i = x{0}, j = 0], 
        each [j] < List.Count(x), 
        each [i = [i] + b, j = [j] + 1], 
        each [i]
      )
    in
      c, 
  Sol = Table.FromColumns(List.Zip(List.Transform(a, each Fx(_))), Table.ColumnNames(S))
in
  Sol
solution 4 Seokho MOON:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Rows = List.Transform(
    Table.ToRows(Source), 
    each [
      N = List.RemoveNulls(_), 
      F = List.First(N), 
      C = List.Count(N), 
      L = List.Last(N), 
      S = (L - F) / (C - 1), 
      R = List.Numbers(F, C, S)
    ][R]
  ), 
  Res = Table.FromColumns(List.Zip(Rows), Table.ColumnNames(Source))
in
  Res
solution 5 Alexandre Garcia:
let
  A = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  B = (x) => List.Last(List.RemoveNulls(x)), 
  C = (x) =>
    List.Generate(() => x{0}, each _ <= B(x), each _ + (B(x) - x{0}) / (List.NonNullCount(x) - 1)), 
  D = Table.FromList(Table.ToList(A, C), each _, Value.Type(A))
in
  D
solution 6 Krzysztof Kominiak:
let
  Source = Table.FromRows(
    Json.Document(
      Binary.Decompress(
        Binary.FromText(
          "i45WMlPSUaoggA1NlWJ1opUMsUmB9CMQLmXI2MwUptKICLvNIHabQLkWKNah2GuOwwQTS1R1pnhsMzFHUogtaIww/QvyhSHI00YGIAJkm7EFzCxTM5iPzUFesDBWio0FAA==", 
          BinaryEncoding.Base64
        ), 
        Compression.Deflate
      )
    ), 
    let
      _t = ((type nullable text) meta [Serialized.Text = true])
    in
      type table [
        Term1 = _t, 
        Term2 = _t, 
        Term3 = _t, 
        Term4 = _t, 
        Term5 = _t, 
        Term6 = _t, 
        Term7 = _t, 
        Term8 = _t, 
        Term9 = _t, 
        Term10 = _t
      ]
  ), 
  Ls = List.Transform(
    Table.ToRows(Source), 
    each [
      a = _, 
      b = List.RemoveItems(a, {""}), 
      c = Number.From(List.First(b)), 
      d = Number.From(List.Last(b)), 
      e = List.Count(b) - 1, 
      f = (d - c) / (e), 
      z = List.Zip({{e}, {c}, {f}})
    ][z]{0}
  ), 
  NLs = Table.Combine(
    List.Transform(
      Ls, 
      (x) =>
        Table.FromRows({List.Accumulate({1 .. x{0}}, {x{1}}, (s, c) => s & {List.Last(s) + x{2}})})
    )
  ), 
  Result = Table.RenameColumns(NLs, List.Zip({Table.ColumnNames(NLs), Table.ColumnNames(Source)}))
in
  Result

Solving the challenge of Find Missing AP Sequence with Excel

solution 1 Bo Rydobon 🇹🇭:
=REDUCE(A1:J1,A2:A10,LAMBDA(a,v,LET(r,TAKE(v:J10,1),c,COLUMN(r),VSTACK(a,IF(r="","",FORECAST(c,r,c))))))
Excel solution 2 for Find Missing AP Sequence, proposed by John V.:
=LET(
    i,
    A2:J10,
    z,
    COLUMNS(
        i
    ),
    IF(
        i>0,
        MAKEARRAY(
            ROWS(
        i
    ),
            z,
            LAMBDA(
                r,
                c,
                FORECAST(
                    c,
                    INDEX(
                        i,
                        r,
                        
                    ),
                    SEQUENCE(
                        ,
                        z
                    )
                )
            )
        ),
        ""
    )
)
solution 3 🇰🇷 Taeyong Shin:
=LET(
    d,
    A2:J10,
    n,
    COLUMNS(
        d
    ),
    MAKEARRAY(
        ROWS(
        d
    ),
        n,
        LAMBDA(
            r,
            c,
            IF(
                INDEX(
                    d,
                    r,
                    c
                )>0,
                FORECAST(
                    c,
                    INDEX(
                        d,
                        r,
                        
                    ),
                    SEQUENCE(
                        ,
                        n
                    )
                ),
                ""
            )
        )
    )
)
solution 4 Kris Jaganah:
=REDUCE(A1:J1,
    SEQUENCE(
        ROWS(
            A2:J10
        )
    ),
    LAMBDA(v,
    w,
    VSTACK(v,
    LET(u,
    INDEX(
        A2:J10,
        w,
        
    ),
    a,
    SUM(
        N(
            u="x"
        )
    )+1,
    b,
    MIN(
        u
    ),
    c,
    (MAX(
        u
    )-b)/a,
    d,
    SCAN(
        ,
        u,
        LAMBDA(
            x,
            y,
            IF(
                y="x",
                x+c,
                y
            )
        )
    ),
    IF(
        d,
        d,
        ""
    )))))
solution 5 Julian Poeltl:
=LET(T,
    A2:J10,
    M,
    BYROW(
        T,
        MIN
    ),
    X,
    BYROW(
        T,
        MAX
    ),
    C,
    BYROW(
        T,
        COUNTA
    ),
    IFNA(REDUCE(A1:J1,
    SEQUENCE(
        ROWS(
            T
        )
    ),
    LAMBDA(A,
    B,
    VSTACK(A,
    SEQUENCE(,
    @INDEX(
        C,
        B
    ),
    @INDEX(
        M,
        B
    ),
    (@INDEX(
        X,
        B
    )-@INDEX(
        M,
        B
    ))/(@INDEX(
        C,
        B
    )-1))))),
    ""))
solution 6 Aditya Kumar Darak 🇮🇳:
=LET(
 _data,
     A2:J10,
    
 _frst,
     TAKE(
         _data,
          ,
          1
     ),
    
 _cols,
     COLUMNS(
         _data
     ),
    
 _lst,
     BYROW(
         _data,
          LAMBDA(
              a,
               TAKE(
                   TOROW(
                       a,
                        1
                   ),
                    ,
                    -1
               )
          )
     ),
    
 _cnt,
     BYROW(
         _data,
          LAMBDA(
              a,
               COUNTIFS(
                   a,
                    "x"
               )
          )
     ),
    
 _blnk,
     IF(
         _cnt,
          _cnt,
          _cols - 2
     ),
    
 _seq,
     SEQUENCE(
         1,
          _cols
     ),
    
 _dif,
     (_lst - _frst) / (_blnk + 1),
    
 _exp,
     IFS(_blnk + 3 > _seq,
     (_seq - 1) * _dif + _frst,
     1,
     ""),
    
 _exp
)
solution 7 Timothée BLIOT:
=IFNA(REDUCE("Term"&SEQUENCE(
    ,
    10
),
    ROW(
        1:9
    ),
    LAMBDA(w,
    v,
     LET(A,
    INDEX(
        A2:J10,
        v,
        
    ),
    B,
    COUNTA(
        A
    ),
    C,
    MAX(
        A
    )-MIN(
        A
    ),
    D,
    C/(B-1),
    VSTACK(
        w,
        SEQUENCE(
            ,
            C/D+1,
            MIN(
        A
    ),
            D
        )
    )))),
    "")
solution 8 Hussein SATOUR:
=TEXTSPLIT(CONCAT(BYROW(A2:J10,LAMBDA(x,LET(a,COUNTA(x),b,MIN(x),ARRAYTOTEXT(SEQUENCE(a,,0)*INT((MAX(x)-b)/(a-1))+b))))&"/"),", ","/",1,,"")
solution 9 Oscar Mendez Roca Farell:
=REDUCE(
    A1:J1,
    A2:A10,
    LAMBDA(
        i,
        x,
        LET(
            t,
            TAKE(
                x:J10,
                1
            ),
            s,
            SEQUENCE(
                ,
                COLUMNS(
                    t
                )
            ),
            VSTACK(
                i,
                IF(
                    t>0,
                    FORECAST(
                        s,
                        t,
                        s
                    ),
                    ""
                )
            )
        )
    )
)
solution 10 Duy Tùng:
=LET(a,
    A2:A10,
    b,
    A2:J10,
    VSTACK(A1:J1,
    IF(b=0,
    "",
    IF(b<"",
    b,
    (BYROW(
        b,
        MAX
    )-a)/(BYROW(
        N(
            b="x"
        ),
        SUM
    )+1)*(COLUMN(
        b
    )-1)+a))))
solution 11 Sunny Baggu:
=LET(
 _rng, A2:J10,
 _n, BYROW(N(_rng <> ""), LAMBDA(a, SUM(a))),
 _r, _n - 1,
 _d, BYROW(_rng, LAMBDA(a, MAX(a) - MIN(a))),
 _st, _d / _r,
 IFNA(
 DROP(
 REDUCE(
 "🌼",
 SEQUENCE(ROWS(_rng)),
 LAMBDA(a, v,
 VSTACK(
 a,
 SEQUENCE(, INDEX(_n, v, 1), INDEX(_rng, v, 1), INDEX(_st, v, 1))
 )
 )
 ),
 1
 ),
 ""
 )
)
solution 12 LEONARD OCHEA 🇷🇴:
=LET(m,A2:J10,c,COLUMNS(m),IF(m>0,MAKEARRAY(ROWS(m),c,LAMBDA(x,y,FORECAST(y,INDEX(m,x,),SEQUENCE(,c)))),""))
solution 13 LEONARD OCHEA 🇷🇴:
=LET(
    d,
    A2:J10,
    MAP(
        d,
        LAMBDA(
            x,
            IF(
                x>0,
                FORECAST(
                    COLUMNS(
                        A2:x
                    ),
                    INDEX(
                        d,
                        ROWS(
                        A2:x
                    ),
                        
                    ),
                    SEQUENCE(
                        ,
                        COLUMNS(
                            d
                        )
                    )
                ),
                ""
            )
        )
    )
)
solution 14 Md. Zohurul Islam:
=LET(
    hdr,
    A1:J1,
    
    data,
    A2:J10,
    
    First,
    TAKE(
        data,
        ,
        1
    ),
    
    Last,
     BYROW(
         data,
         MAX
     ),
    
    num,
     BYROW(
         data,
         COUNTA
     ),
    
    a,
    Last-First,
    b,
    num-1,
    d,
    a/b,
    
    e,
    MAP(
        num,
        First,
        d,
        LAMBDA(
            x,
            y,
            z,
            ARRAYTOTEXT(
                SEQUENCE(
                    1,
                    x,
                    y,
                    z
                )
            )
        )
    ),
    
    f,
    IFNA(
        REDUCE(
            hdr,
            e,
            LAMBDA(
                p,
                q,
                LET(
                    u,
                    --TEXTSPLIT(
                        q,
                        ", "
                    ),
                    v,
                    VSTACK(
                        p,
                        u
                    ),
                    v
                )
            )
        ),
        ""
    ),
    
    f
)
solution 15 ferhat CK:
=IFNA(REDUCE(A1:J1,SEQUENCE(ROWS(A2:J10)),LAMBDA(i,j,VSTACK(i,LET(a,CHOOSEROWS(A2:J10,j),b,FILTER(a,a>0),SEQUENCE(,COLUMNS(b),MIN(b),ROUNDUP((MAX(b)-MIN(b)+1)/COLUMNS(b),0)))))),"")
solution 16 Meganathan Elumalai:
=LET(z,A2:J10,s,SEQUENCE,r,s(ROWS(z)),IFNA(REDUCE(A1:J1,r,LAMBDA(a,v,VSTACK(a,LET(arr,INDEX(z,v,),mx,MAX(arr),mn,MIN(arr),s(,COUNTA(arr),mn,(mx-mn)/(COUNTA(arr)-1)))))),""))
solution 17 JvdV -:
=LET(s,A2:J10,i,A2:A10,f,BYROW,IFS(s="","",s="x",(f(s,MAX)-i)/(f(s,COUNTA)-1)*(COLUMN(s)-1)+i,1,s))
solution 18 Mihai Radu O:
LET(fct,
    LAMBDA(a,
    LET(b,
    TOCOL(
        a,
        1
    ),
    c,
    MIN(
        b
    ),
    d,
    MAX(
        b
    ),
    e,
    ROWS(
        b
    ),
    f,
    (d-c)/(e-1),
    SEQUENCE(
        ,
        e,
        c,
        f
    ))),
    
REDUCE(
    A1:J1,
    SEQUENCE(
        ROWS(
            A2:J10
        )
    ),
    LAMBDA(
        x,
        y,
        VSTACK(
            x,
            fct(
                INDEX(
                    &A2:J10,
                    y,
                    
                )
            )
        )
    )
)
)
solution 19 Jorge Alvarez:
=EXCLUIR(
    REDUCE(
        "";
        BYROW(
            A2:J10;
            LAMBDA(
                va;
                LET(
                    ca;
                    UNIRCADENAS(
                        ",";
                        ;
                        va
                    );
                    
                     x;
                    SECUENCIA(
                        SUMA(
                            ESNUMERO(
                                HALLAR(
                                    ",";
                                    EXTRAE(
                                        ca;
                                        SECUENCIA(
                                            LARGO(
                                                ca
                                            )
                                        );
                                        1
                                    )
                                )
                            )*1
                        )+1
                    );
                    
                     y;
                    SI.ERROR(
                        --DIVIDIRTEXTO(
                            ca;
                            ;
                            ","
                        );
                        ""
                    );
                    
                     UNIRCADENAS(
                         " ";
                         ;
                         PRONOSTICO.LINEAL(
                             x;
                             y;
                             x
                         )
                     )
                )
            )
        );
        LAMBDA(
            a;
            v;
            
             LET(
                 r;
                 DIVIDIRTEXTO(
                     v;
                     " "
                 );
                 
                  SI.ND(
                      APILARV(
                          a;
                          r
                      );
                      ""
                  )
             )
        )
    );
    1
)
solution 20 Luis Enrique Charca Ponce:
=MAKEARRAY(9,
    10,
    LAMBDA(r,
    c,
    
LET(raw,
    A2:J10,
    
val,
    INDEX(
        raw,
        r,
        c
    ),
    
step,
    BYROW(A2:J10,
    LAMBDA(iRow,
    
LET(n,
    COUNTIF(
        iRow,
        "x"
    ),
    
IF(n=0,
    0,
    (INDEX(
        iRow,
        n+2
    )-INDEX(
        iRow,
        1
    ))/(n+1))))),
    
IF(val="x",
    INDEX(
        raw,
        r,
        1
    )+INDEX(
        step,
        r
    )*(c-1),
    
IF(
    val="",
    "",
    val
)))))

Solving the challenge of Find Missing AP Sequence with Python

solution 1 Konrad Gryczan, PhD:
import pandas as pd
import numpy as np
path = "609 Missing Terms in AP_3.xlsx"
input = pd.read_excel(path, usecols="A:J", nrows=10).apply(pd.to_numeric, errors='coerce')
test = pd.read_excel(path, usecols="A:J", skiprows=12, nrows=10).astype(np.float64)
input['LastPopulatedColumn'] = input.apply(lambda row: row.last_valid_index(), axis=1)
input['LastPopulatedValue'] = input.apply(lambda row: row[row['LastPopulatedColumn']], axis=1)
input['FirstValue'] = input.apply(lambda row: row['Term1'], axis=1)
input['Length'] = input['LastPopulatedColumn'].apply(lambda x: int(''.join(filter(str.isdigit, x))))
def generate_sequence(row):
 step = (row['LastPopulatedValue'] - row['FirstValue']) / (row['Length'] - 1)
 return [row['FirstValue'] + i * step for i in range(row['Length'])]
input['Sequence'] = input.apply(generate_sequence, axis=1)
sequence_df = pd.DataFrame(input['Sequence'].tolist(), columns=[f'Term{i+1}' for i in range(input['Length'].max())]).astype(np.float64)
print(sequence_df.equals(test)) # True
                    
                  

Solving the challenge of Find Missing AP Sequence with Python in Excel

solution 1 Alejandro Campos:
data = xl("A1:J10", headers=True).fillna('')
columns_count = len(data.columns)
def parse_row(series):
 filtered = series[series != '']
 x_count = (filtered == 'x').sum()
 if x_count:
 first, last = int(filtered.iloc[0]), int(filtered.iloc[-1])
 return list(np.linspace(
 first, last, x_count + 1, endpoint=False, dtype=int)) + [last]
 return filtered.tolist()
final_data = [row + [''] * (columns_count - len(row)) for row in (
 parse_row(data.iloc[i, :]) for i in range(len(data)))]
new_headers = [f'Term{i}' for i in range(1, 11)]
df_final = pd.DataFrame(final_data, columns=new_headers)
df_final
                    
                  
solution 2 Aditya Kumar Darak 🇮🇳:
data = xl("A1:J10", headers=True)
toList = data.values.tolist()
gnrt = [[x for x in i if not pd.isna(x)] for i in toList]
gnrt = [
 [
 s := i[0],
 e := i[-1],
 l := len(i),
 d := (e - s) / (l - 1),
 r := list(range(s, int(e) + 1, int(d))),
 ][-1]
 for i in gnrt
]
result = pd.DataFrame(gnrt, columns=data.columns).fillna("")
result
                    
                  
solution 3 Anshu Bantra:
df = xl("A1:J10", headers=True).fillna('')
num_cols = len(df.columns)
def first_last_value(srs: pd.Series) -> int|list:
 srs = srs[srs != '']
 xs = (srs == 'x').sum()
 if xs:
 return int(srs[0]), int(srs[-1]), xs
 else:
 return srs
def complete_list(lst: list, cols: int) -> list:
 return lst.extend( [''] * (num_cols - len(lst)) )
new_list = []
for _ in range(len(df)):
 val = first_last_value(df.iloc[_,:])
 if type(val) == tuple:
 strt, end, xs = val
 lst = list(np.linspace(start=strt, stop=end, num=xs+1, endpoint=False, dtype=int))
 lst.append(end)
 else:
 lst = list(val)
 complete_list(lst, num_cols)
 new_list.append(lst)
 
new_list
                    
                  

Solving the challenge of Find Missing AP Sequence with R

solution 1 Konrad Gryczan, PhD:
library(tidyverse)
library(readxl)
path = "Excel/609 Missing Terms in AP_3.xlsx"
input = read_excel(path, range = "A1:J10", col_types = "numeric")
test = read_excel(path, range = "A13:J22")
result = input %>%
 rowwise() %>%
 mutate(last_col = max(which(!is.na(c_across(everything())))), 
 last_val = c_across(everything())[last_col],
 first_val = c_across(everything())[1]) %>%
 mutate(seq = list(seq(first_val, last_val, by = (last_val - first_val) / (last_col - 1)))) %>%
 unnest_wider(seq, names_sep = "_u") %>%
 select(starts_with("seq")) %>%
 set_names(names(input)) 
 
all.equal(result, test, check.attributes = FALSE)
#> [1] TRUE
                    
                  

&&

Leave a Reply