Home » First Ten Tech Numbers

First Ten Tech Numbers

Tech Number – A number is a tech number if it has even number of digits and square of sum of first half and last half is equal to number itself. Ex. 2025 => It has 4 digits, first half = 20 and last half = 25, 20+25 = 45 and square of 45 is 2025 which is number itself. List the first 10 Tech Numbers.

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

Solving the challenge of First Ten Tech Numbers with Power Query

_x000D_
Power Query solution 1 for First Ten Tech Numbers, proposed by Kris Jaganah:
List.FirstN(
  List.RemoveNulls(
    List.Transform(
      {4 .. 10000}, 
      each [
        a = Number.Power(_, 2), 
        b = Text.From(a), 
        c = Text.Length(b), 
        d = Number.IntegerDivide(c / 2, 1), 
        e = (x) => Number.From(x(b, d)), 
        f = if Number.IsEven(c) and e(Text.Start) + e(Text.End) = _ then a else null
      ][f]
    )
  ), 
  10
)
_x000D_ _x000D_
Power Query solution 2 for First Ten Tech Numbers, proposed by Abdallah Ally:
let
  IsTechNumber = (num) =>
    [
      a = Text.From(num), 
      b = Text.Length(a), 
      c = Number.IntegerDivide(b, 2), 
      d = Number.From, 
      e = Number.IsEven(b) and Number.Power(d(Text.Start(a, c)) + d(Text.End(a, c)), 2) = num
    ][e], 
  Generate = List.RemoveNulls(
    List.Generate(
      () => [num = 10, cond = IsTechNumber(num), counter = Byte.From(cond)], 
      each [counter] <= 10, 
      each [num = [num] + 1, cond = IsTechNumber(num), counter = [counter] + Byte.From(cond)], 
      each if [cond] then [num] else null
    )
  ), 
  Result = Table.FromColumns({Generate}, {"Answer Expected"})
in
  Result
_x000D_ _x000D_
Power Query solution 3 for First Ten Tech Numbers, proposed by Antriksh Sharma:
let
  Source = List.Select(
    List.Transform({1 .. 8000}, each Number.Power(_, 2)), 
    each Number.IsEven(Text.Length(Text.From(_)))
  ), 
  Nums = List.Select(
    Source, 
    (n) =>
      let
        a = Text.From(n), 
        b = Number.RoundUp(Text.Length(a) / 2), 
        c = Text.Start(a, b), 
        d = Text.End(a, b), 
        e = Number.Power(Expression.Evaluate(c & "+" & d), 2)
      in
        n = e
  ), 
  Ans = Table.FromColumns({Nums}, type table [Answer = Int64.Type])
in
  Ans
_x000D_ _x000D_
Power Query solution 4 for First Ten Tech Numbers, proposed by Peter Krkos:
let
  F = each [
    val        = _, 
    digits     = Number.RoundDown(Number.Log10(val)) + 1, 
    firstHalf  = Number.IntegerDivide(val, Number.Power(10, digits / 2)), 
    secondHalf = Number.Mod(val, Number.Power(10, digits / 2)), 
    result     = Number.Power(firstHalf + secondHalf, 2) = val
  ][result], 
  GenNumbers = List.Last(
    List.Generate(
      () => [x = 3, y = {}], 
      each List.Count([y]) <= 10, 
      each [x = [x] + 1, z = Number.Power(x, 2), y = if F(z) then [y] & {z} else [y]], 
      each [y]
    )
  )
in
  GenNumbers
_x000D_

Solving the challenge of First Ten Tech Numbers with Excel

_x000D_
Excel solution 1 for First Ten Tech Numbers, proposed by Bo Rydobon 🇹🇭:
=LET(
    n,
    SEQUENCE(
        7777
    )+3,
    q,
    n^2,
    l,
    LEN(
        q
    )/2,
    FILTER(
        q,
        n+MOD(
            l,
            1
        )=LEFT(
            q,
            l
        )+RIGHT(
            q,
            l
        )
    )
)

=LET(
    n,
    SEQUENCE(
        7777
    ),
    q,
    n^2,
    l,
    LEN(
        q
    )/2,
    p,
    10^l,
    FILTER(
        q,
         n+MOD(
             l,
              1
         )=BYROW(
             INT(
                 MOD(
                     q/p^{0,
                     1},
                      p
                 )
             ),
              SUM
         )
    )
)
_x000D_ _x000D_
Excel solution 2 for First Ten Tech Numbers, proposed by Rick Rothstein:
=LET(s,SEQUENCE(7777)^2,n,FILTER(s,1-MOD(LEN(s),2)),h,len(n)/2,x,LEFT(n,h)+RIGHT(n,h),FILTER(n,n=x*x))
_x000D_ _x000D_
Excel solution 3 for First Ten Tech Numbers, proposed by John V.:
=LET(n,ROW(4:7777)^2,i,LEN(n)/2,FILTER(n,(i=INT(i))*((LEFT(n,i)+RIGHT(n,i))^2=n)))
_x000D_ _x000D_
Excel solution 4 for First Ten Tech Numbers, proposed by Kris Jaganah:
=LET(a,SEQUENCE(10000,,4),b,a^2,c,LEN(b),d,c/2,e,LEFT(b,d)+RIGHT(b,d),TAKE(FILTER(b,(a=e)*ISEVEN(c)),10))
_x000D_ _x000D_
Excel solution 5 for First Ten Tech Numbers, proposed by Timothée BLIOT:
=LET(A,SEQUENCE(8000,,4)^2,B,LEN(A),FILTER(A,IF(ISEVEN(B),(--LEFT(A,B/2)+--RIGHT(A,B/2))^2=A,0)))
_x000D_ _x000D_
Excel solution 6 for First Ten Tech Numbers, proposed by Hussein SATOUR:
=LET(a,
    SEQUENCE(
        10000
    ),
    b,
    a^2,
    c,
    LEN(
        b
    ),
    FILTER(b,
    (ISEVEN(
        c
    ))*(IFERROR(
        LEFT(
            b,
            c/2
        )+RIGHT(
            b,
            c/2
        )=a,
        0
    ))))
_x000D_ _x000D_
Excel solution 7 for First Ten Tech Numbers, proposed by Sunny Baggu:
=LET(
 _n, SEQUENCE(7777, , 4) ^ 2,
 _c, MAP(
 _n,
 LAMBDA(a,
 ISEVEN(LEN(a)) *
 POWER(
 LEFT(a, LEN(a) / 2) + RIGHT(a, LEN(a) / 2),
 2
 ) = a
 )
 ),
 FILTER(_n, _c)
)
_x000D_ _x000D_
Excel solution 8 for First Ten Tech Numbers, proposed by Anshu Bantra:
= 1, 0
 while count < rng:
 s_num = str(num)
 l_num = len(s_num)
 if l_num % 2 == 0:
 half = int(l_num/2)
 if (int(s_num[:half]) + int(s_num[half:]))**2 == num:
 count += 1
 yield num
 num += 1

lst = [*tech_number(10)
_x000D_ _x000D_
Excel solution 9 for First Ten Tech Numbers, proposed by Md. Zohurul Islam:
=LET(sq,SEQUENCE(9999),
a,POWER(sq,2),
b,MOD(LEN(a),2),
c,FILTER(a,b=0),
d,MAP(c,LAMBDA(x,LET(p,LEN(x)/2,q,LEFT(x,p),r,RIGHT(x,p),s,q+r,IF(s^2=x,1,0)))),
e,FILTER(c,d>0),
e)
_x000D_ _x000D_
Excel solution 10 for First Ten Tech Numbers, proposed by Hamidi Hamid:
=LET(x,SEQUENCE(10000)^2,s,IFERROR(MAP(x,LAMBDA(a,(LEFT(a,LEN(a)/2)
+RIGHT(a,LEN(a)/2))^2=a)),0)*1,t,FILTER(x,s=1),TAKE(FILTER(t,ISEVEN(LEN(t))),10))
_x000D_ _x000D_
Excel solution 11 for First Ten Tech Numbers, proposed by ferhat CK:
=TOCOL(
    MAP(
        SEQUENCE(
            10^4
        )^2,
        LAMBDA(
            x,
            LET(
                u,
                LEN(
                    x
                ),
                b,
                MID(
                    x,
                    SEQUENCE(
                        2,
                        ,
                        1,
                        u/2
                    ),
                    u/2
                ),
                IF(
                    SUM(
                        --b
                    )^2/x=1,
                    x,
                    1/0
                )
            )
        )
    ),
    3
)
_x000D_ _x000D_
Excel solution 12 for First Ten Tech Numbers, proposed by Erdit Qendro:
=LET(
    n,
    SEQUENCE(
        99990,
        ,
        1
    ),
    
    pw,
    POWER(
        n,
        2
    ),
    
    ft,
    FILTER(
        HSTACK(
            n,
            pw
        ),
        MOD(
            LEN(
                pw
            ),
            2
        )=0
    ),
    
    v,
    TAKE(
        ft,
        ,
        -1
    ),
    
    r,
    REGEXEXTRACT,
    
    rpat,
    "d{"&LEN(
        v
    )/2&"}",
    
    sm,
    r(
        v,
        "^"&rpat
    )+r(
        v,
        rpat&"$"
    ),
    
    TAKE(
        FILTER(
            TAKE(
        ft,
        ,
        -1
    ),
            sm=TAKE(
                ft,
                ,
                1
            )
        ),
        10
    )
)
_x000D_ _x000D_
Excel solution 13 for First Ten Tech Numbers, proposed by Ernesto Vega Castillo:
=LET(a,
    POWER(
        SEQUENCE(
            7777
        ),
        2
    ),
    b,
    IF(INT(
        LEN(
            a
        )/2
    )=LEN(
            a
        )/2,
    SWITCH((LEFT(
        a,
        LEN(
            a
        )/2
    )+RIGHT(
        a,
        LEN(
            a
        )/2
    ))^2,
    a,
    1,
    0),
    0),
    FILTER(
        a,
        b<>0
    ))
_x000D_ _x000D_
Excel solution 14 for First Ten Tech Numbers, proposed by Josh Brodrick:
=LET(
    a,
    FILTER(
        SEQUENCE(
            9000
        )^2,
        ISEVEN(
            LEN(
                SEQUENCE(
            9000
        )^2
            )
        )
    ),
    b,
    MID(
        a,
        1,
        LEN(
            a
        )/2
    )+MID(
        a,
        LEN(
            a
        )/2+1,
        LEN(
            a
        )/2
    ),
    FILTER(
        a,
        SQRT(
            a
        )=b
    )
)
_x000D_

Solving the challenge of First Ten Tech Numbers with Python

_x000D_
Python solution 1 for First Ten Tech Numbers, proposed by Alejandro Campos:
In D2
import time
s = time.time()
def is_tech_number(n): 
 h = len(str(n)) // 2
 return (int(str(n)[:h]) + int(str(n)[h:])) ** 2 == n if len(str(n)) % 2 == 0 else False
t, num = [], 1
while len(t) < 10:
 if is_tech_number(num): t.append(num)
 num += 1
t
In F2
total_time = time.time() - s
                    
                  
_x000D_ _x000D_
Python solution 2 for First Ten Tech Numbers, proposed by Abdallah Ally:
import pandas as pd
from itertools import count, islice
# Create a function to find if a number is tech number
def is_tech_number(number):
 str_num = str(number)
 str_len = len(str_num)
 half_len = str_len // 2
 if str_len % 2:
 return False
 
 num = int(str_num[ : half_len]) + int(str_num[half_len : ])
 return num ** 2 == number
# Perform data manipulation
values = islice(filter(is_tech_number, count(10)), 10)
df = pd.DataFrame({'Answer Expected': values})
df
                    
                  
_x000D_

Solving the challenge of First Ten Tech Numbers with R

_x000D_
R solution 1 for First Ten Tech Numbers, proposed by Konrad Gryczan, PhD:
library(tidyverse)
library(readxl)
path <- "Excel/669 Tech Numbers.xlsx"
test <- read_excel(path, range = "A1:A11") %>% pull()
is_tech_number <- function(n) {
 num_str <- as.character(n)
 len <- str_length(num_str)
 if (len %% 2 != 0) return(FALSE)
 half_len <- len / 2
 h1 <- as.integer(substr(num_str, 1, half_len))
 h2 <- as.integer(substr(num_str, half_len + 1, len))
 (h1 + h2)^2 == n
}
find_tech_numbers <- function(count = 10) {
 tech_numbers <- (1:10^4)^2 %>%
 keep(~ str_length(.) %% 2 == 0 && is_tech_number(.))
 head(tech_numbers, count)
}
result = find_tech_numbers(10)
all.equal(result, test, check.attributes = FALSE)
#> [1] TRUE
                    
                  
_x000D_ &&&

Leave a Reply