Home » Perfect Square Predecessor Checker

Perfect Square Predecessor Checker

Arrange the given numbers in such a fashion that sum of preceding + current number is a perfect square. This is not applicable for first number so this sum checking has to start from second number. Multiple solutions may be possible. One possible solution is given. Explanation is following – 8+1 = 9, 1+15 = 16, 15+10 = 25, 10+6 = 16, 6+30 = 36, 30+34 = 64, 34+47 = 81 and 47+2 = 49

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

Solving the challenge of Perfect Square Predecessor Checker with Power Query

Power Query solution 1 for Perfect Square Predecessor Checker, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Tbl = List.Accumulate(
    {1 .. List.Count(Source[Numbers]) - 1}, 
    Source, 
    (s, c) =>
      Table.ExpandListColumn(
        Table.AddColumn(
          s, 
          Text.From(c), 
          each 
            let
              a = Record.ToList(_), 
              b = List.Difference(Source[Numbers], a)
            in
              b
        ), 
        Text.From(c)
      )
  ), 
  Sol = Table.SelectRows(
    Tbl, 
    each 
      let
        a = Record.ToList(_), 
        b = List.Transform(
          {1 .. List.Count(a) - 1}, 
          each Number.Mod(Number.Sqrt(a{_} + a{_ - 1}), 1) = 0
        )
      in
        List.AllTrue(b)
  )
in
  Sol

Solving the challenge of Perfect Square Predecessor Checker with Excel

Excel solution 1 for Perfect Square Predecessor Checker, proposed by Bo Rydobon 🇹🇭:
=LET(n,
    TEXT(
        A2:A10,
        "-000"
    ),
    m,
    TOROW(
        n
    ),
    --TRANSPOSE(TEXTSPLIT(CONCAT(REDUCE(n,
    SEQUENCE(
        ROWS(
        n
    )-1
    ),
    LAMBDA(a,
    i,
    TOCOL(IFS(ISERR(
        FIND(
            m,
            a
        )
    )*(MOD(
        SQRT(
            RIGHT(
                a,
                3
            )-m
        ),
        1
    )=0),
    a&m),
    3)))&"_"),
    "-",
    "_",
    1)))
Excel solution 2 for Perfect Square Predecessor Checker, proposed by Bo Rydobon 🇹🇭:
=LET(n,
    A2:A10,
    m,
    TOROW(
        n
    ),
    p,
    IF(MOD(
        SQRT(
            n+m
        ),
        1
    )+(n=m),
    "",
    n&-m),
    x,
    XLOOKUP(
        1,
        BYROW(
            N(
                p>""
            ),
            SUM
        ),
        p,
        ,
        1
    ),
    
REDUCE(--TEXTSPLIT(
    @FILTER(
        x,
        x>""
    ),
    ,
    "-"
),
    SEQUENCE(
        ROWS(
        n
    )-2
    )+1,
    LAMBDA(a,
    i,
    LET(b,
    @INDEX(
        a,
        i
    ),
    c,
    XLOOKUP(
        b,
        n,
        p
    ),
    VSTACK(a,
    --TEXTAFTER(@FILTER(c,
    ISNA(
        XMATCH(
            m,
            a
        )
    )*(c>"")),
    "-"))))))
Excel solution 3 for Perfect Square Predecessor Checker, proposed by John V.:
=LET(
    n,
    A2:A10,
    q,
    SEQUENCE,
    s,
    q(
        ,
        ROWS(
            n
        )
    ),
    d,
    INDEX(
        n,
        MID(
            REDUCE(
                "",
                s,
                LAMBDA(
                    a,
                    v,
                    TOCOL(
                        REPLACE(
                            a,
                            q(
                                ,
                                v
                            ),
                            ,
                            v
                        )
                    )
                )
            ),
            s,
            1
        )
    ),
    TRANSPOSE(
        FILTER(
            d,
            BYROW(
                d,
                LAMBDA(
                    r,
                    AND(
                        MOD(
                            SQRT(
                                DROP(
                                    r,
                                    ,
                                    1
                                )+DROP(
                                    r,
                                    ,
                                    -1
                                )
                            ),
                            1
                        )=0
                    )
                )
            )
        )
    )
)
Excel solution 4 for Perfect Square Predecessor Checker, proposed by محمد حلمي:
=LET(d,A2:A10,s,SEQUENCE(,ROWS(d)),
j,INDEX(d,MID(REDUCE("",s,LAMBDA(a,v,TOCOL(
REPLACE(a,SEQUENCE(,v),,v)))),s,1)),TRANSPOSE(FILTER(j,
BYROW(MOD((DROP(j,,1)+DROP(j,,-1))^0.5,1)=0,AND))))
Excel solution 5 for Perfect Square Predecessor Checker, proposed by محمد حلمي:
=LET(d,
    A2:A10,
    s,
    SEQUENCE(
        ,
        ROWS(
            d
        )
    ),
    
j,
    INDEX(
        d,
        MID(
            REDUCE(
                "",
                s,
                LAMBDA(
                    a,
                    v,
                    
                    TOCOL(
                        REPLACE(
                            a,
                            SEQUENCE(
                                ,
                                v
                            ),
                            ,
                            v
                        )
                    )
                )
            ),
            s,
            1
        )
    ),
    
TRANSPOSE(FILTER(j,
    BYROW(j,
    LAMBDA(c,
    
AND(MOD((DROP(
    c,
    ,
    1
)+DROP(
    c,
    ,
    -1
))^0.5,
    1)=0))))))
Excel solution 6 for Perfect Square Predecessor Checker, proposed by محمد حلمي:
=LET(d,
    A2:A10,
    s,
    SEQUENCE(
        ,
        ROWS(
            d
        )
    ),
    j,
    INDEX(
        d,
        MID(
            
            REDUCE(
                "",
                s,
                LAMBDA(
                    a,
                    v,
                    TOCOL(
                        REPLACE(
                            a,
                            SEQUENCE(
                                ,
                                v
                            ),
                            ,
                            v
                        )
                    )
                )
            ),
            
            s,
            1
        )
    ),
    TOCOL(INDEX(j,
    XMATCH(1,
    --BYROW(j,
    LAMBDA(c,
    
AND(MOD((DROP(
    c,
    ,
    1
)+DROP(
    c,
    ,
    -1
))^0.5,
    1)=0))),
    ,
    -1),
    )))
Excel solution 7 for Perfect Square Predecessor Checker, proposed by Julian Poeltl:
=LET(N,
    A2:A10,
    M,
    TOROW(
        N
    ),
    P,
    IF(MOD(
        SQRT(
            N+M
        ),
        1
    )+(N=M),
    "",
    N&-M),
    X,
    XLOOKUP(
        1,
        BYROW(
            N(
                P>""
            ),
            LAMBDA(
                A,
                SUM(
                    A
                )
            )
        ),
        P,
        ,
        1
    ),
    DROP(
        REDUCE(
            1*TEXTBEFORE(
                FILTER(
                    X,
                    X>""
                ),
                "-"
            ),
            N,
            LAMBDA(
                A,
                B,
                VSTACK(
                    A,
                    LET(
                        F,
                        FILTER(
                            N,
                            ISNA(
                                XMATCH(
                                    N,
                                    A
                                )
                            )
                        ),
                        IFERROR(
                            INDEX(
                                F,
                                XMATCH(
                                    0,
                                    MOD(
                                        SQRT(
                                            F+TAKE(
                                                A,
                                                -1
                                            )
                                        ),
                                        1
                                    )
                                )
                            ),
                            1
                        )
                    )
                )
            )
        ),
        -1
    ))
Excel solution 8 for Perfect Square Predecessor Checker, proposed by Julian Poeltl:
=LET(
    N,
    A2:A10,
    P,
    N+TOROW(
        N
    ),
    C,
    N&"|"&TOROW(
        N
    )&"|",
    F,
    MOD(
        SQRT(
            P
        ),
        1
    )=0,
    PF,
    FILTER(
        TOROW(
            P
        ),
        TOROW(
            F
        )
    ),
    UPF,
    UNIQUE(
        PF,
        1
    ),
    CPF,
    MAP(
        UPF,
        LAMBDA(
            A,
            COLUMNS(
                FILTER(
                    PF,
                    PF=A
                )
            )
        )
    ),
    CF,
    FILTER(
        TOROW(
            C
        ),
        TOROW(
            F
        )
    ),
    UC,
    MAP(
        UPF,
        LAMBDA(
            A,
            TAKE(
                FILTER(
                    CF,
                    PF=A
                ),
                ,
                1
            )
        )
    ),
    SA,
    TAKE(
        FILTER(
            UC,
            CPF=2
        ),
        ,
        1
    ),
    SN,
    --SUBSTITUTE(
        IF(
            SUM(
                --ISNUMBER(
                    SEARCH(
                        TEXTBEFORE(
                            SA,
                            "|"
                        )&"|",
                        CF
                    )
                )
            )>SUM(
                --ISNUMBER(
                    SEARCH(
                        TEXTAFTER(
                            SA,
                            "|"
                        ),
                        CF
                    )
                )
            ),
            TEXTAFTER(
                SA,
                "|"
            ),
            TEXTBEFORE(
                SA,
                "|"
            )
        ),
        "|",
        ""
    ),
    DROP(
        REDUCE(
            SN,
            N,
            LAMBDA(
                A,
                B,
                VSTACK(
                    A,
                    LET(
                        F,
                        FILTER(
                            N,
                            ISNA(
                                XMATCH(
                                    N,
                                    A
                                )
                            )
                        ),
                        IFERROR(
                            INDEX(
                                F,
                                XMATCH(
                                    0,
                                    MOD(
                                        SQRT(
                                            F+TAKE(
                                                A,
                                                -1
                                            )
                                        ),
                                        1
                                    )
                                )
                            ),
                            1
                        )
                    )
                )
            )
        ),
        -1
    )
)
Excel solution 9 for Perfect Square Predecessor Checker, proposed by Timothée BLIOT:
=LET(
    A,
    TOROW(
        A2:A10
    ),
    B,
    CHAR(
        SEQUENCE(
            ,
            COUNTA(
                A
            )
        )+64
    ),
    C,
    A&B,
    D,
    REDUCE(
        "",
        ROW(
            1:9
        ),
        LAMBDA(
            w,
            v,
            LET(
                E,
                FILTER(
                    w,
                    LEN(
                        w
                    )-LEN(
                        SUBSTITUTE(
                            w,
                            ":",
                            ""
                        ) =v-1
                    )
                ),
                TOCOL(
                    IF(
                        ISERR(
                            FIND(
                                C,
                                E
                            )
                        ),
                        E&C&":",
                        1/0
                    ),
                    3
                )
            )
        )
    ),
    H,
    FILTER(
        D,
        MAP(
            D,
             LAMBDA(
                 x,
                 LET(
                     F,
                     TOCOL(
                         --REGEXEXTRACT(
                             x,
                             "d+",
                             1
                         )
                     ),
                     PRODUCT(
                         --MAP(
                             ROW(
                                 2:9
                             ),
                              LAMBDA(
                                  y,
                                  LET(
                                      G,
                                      SUM(
                                          DROP(
                                              TAKE(
                                                  F,
                                                  y
                                              ),
                                              MAX(
                                                  y-2,
                                                  0
                                              )
                                          )
                                      )^0.5,
                                       INT(
                                           G
                                       )=G
                                  )
                              )
                         )
                     )
                 )
             )
        )
    ),
     --REGEXEXTRACT(
         TRANSPOSE(
             TEXTSPLIT(
                 TEXTJOIN(
                     "|",
                     ,
                     H
                 ),
                 ":",
                 "|",
                 1
             )
         ),
         "d+",
         1
     )
)
Excel solution 10 for Perfect Square Predecessor Checker, proposed by Bilal Mahmoud kh.:
=INT(
    SQRT(
        n+p
    )
)),
    n,
    ""))),
    h,
    INDEX(
        FILTER(
            r,
            r<>"",
            0
        ),
        1,
        1
    ),
    i,
    REDUCE(
        a,
        VSTACK(
            IF(
                COUNTA(
                    x
                )>1,
                DROP(
                    x,
                    -1
                ),
                x
            ),
            h
        ),
        LAMBDA(
            s,
            u,
            TEXTJOIN(
                " ",
                TRUE,
                MAP(
                    TEXTSPLIT(
                        s,
                        ,
                        " "
                    ),
                    LAMBDA(
                        v,
                        IF(
                            --v=--u,
                            "",
                            v
                        )
                    )
                )
            )
        )
    ),
    VSTACK(
        IF(
                COUNTA(
                    x
                )>1,
                DROP(
                    x,
                    -1
                ),
                x
            ),
        h,
        i
    )))),
    b)

Solving the challenge of Perfect Square Predecessor Checker with Python

Python solution 1 for Perfect Square Predecessor Checker, proposed by Konrad Gryczan, Ph&D:
import pandas as pd
import math
import itertools
path = "517 Arrange Numbers to Form Square Chains.xlsx"
input = pd.read_excel(path, usecols="A").values.flatten()
test = pd.read_excel(path, usecols="B").values.flatten()
def is_perfect_square(x):
 return math.isqrt(x)**2 == x
def is_valid_sequence(nums):
 return all(is_perfect_square(nums[i] + nums[i+1]) for i in range(len(nums) - 1))
def find_valid_permutation(nums):
 for perm in itertools.permutations(nums):
 if is_valid_sequence(perm):
 return list(perm)
 return None
result = find_valid_permutation(input)
result = " ".join(map(str, result[::-1]))
test = " ".join(map(str, test))
print(result == test)   # True
                    
                  

Solving the challenge of Perfect Square Predecessor Checker with Python in Excel

Python in Excel solution 1 for Perfect Square Predecessor Checker, proposed by Alejandro Campos:
import itertools
import math
numbers = xl("A2:A10")[0]
def is_perfect_square(n):
 return math.isqrt(n) ** 2 == n
def is_valid_permutation(perm):
 for i in range(1, len(perm)):
 if not is_perfect_square(perm[i-1] + perm[i]):
 return False
 return True
permutations = list(itertools.permutations(numbers))
valid_permutations = [perm for perm in permutations if is_valid_permutation(perm)]
df = pd.DataFrame(valid_permutations).T
df
                    
                  
Python in Excel solution 2 for Perfect Square Predecessor Checker, proposed by Abdallah Ally:
from math import sqrt, isqrt
df = xl("A1:B10", headers=True)
# Perform data munging
items = []
values = df['Numbers'].tolist()
while len(items) != len(values):
 num1 = items[-1] if items else values[0]
 num2 = [
 x for x in values if x != num1 and x not in items
 and sqrt(x + num1) == isqrt(x + num1)
 ]
 if items and num2:
 items += [num2[0]]
 else:
 items += [num2[0], num1]
df['My Answer'] = items
df
                    
                  
Python in Excel solution 3 for Perfect Square Predecessor Checker, proposed by Anshu Bantra:
import random 
nums = list(xl("A1:A10", headers=True).values)
def all_perfect_sqs():
 while True:
 random.shuffle(nums)
 lst = [np.sqrt(int(nums[_-1]+nums[_])).is_integer() for _ in range(1, len(nums)-1)]
 if np.all(lst):
 return nums
all_perfect_sqs()
                    
                  

Solving the challenge of Perfect Square Predecessor Checker with R

R solution 1 for Perfect Square Predecessor Checker, proposed by Konrad Gryczan, PhD:
library(tidyverse)
library(readxl)
library(combinat)
path = "Excel/517 Arrange Numbers to Form Square Chains.xlsx"
input = read_excel(path, range = "A1:A10") %>% unlist()
test = read_excel(path, range = "B1:B10") %>% unlist()
is_perfect_square <- function(x) {
 sqrt_x <- sqrt(x)
 sqrt_x == floor(sqrt_x)
}
is_valid_sequence <- function(nums) {
 all(map2_lgl(nums[-length(nums)], nums[-1], ~ is_perfect_square(.x + .y)))
}
find_valid_permutation <- function(nums) {
 permutations <- permn(nums)
 valid_perm <- keep(permutations, is_valid_sequence)
 if (length(valid_perm) > 0) {
 return(valid_perm[[1]])
 } else {
 return(NULL)
 }
}
result = find_valid_permutation(input)
all.equal(unname(result), unname(test))
# [1] TRUE
                    
                  

&&

Leave a Reply