List the Interprime Numbers. An Interprime number is the average of two consecutive odd prime numbers. Ex. 60 which is average of 59 and 61. Note – Picture carries some answers which are wrong as pointed by few. Excel file carries right values.
📌 Challenge Details and Links
ExcelBI Excel Challenge Number: 352
Challenge Difficulty: ⭐️⭐️⭐️⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn
Solving the challenge of List Interprime Numbers with Power Query
Power Query solution 1 for List Interprime Numbers, proposed by John V.:
let
S = Excel.CurrentWorkbook(){0}[Content],
P = (x) => List.AllTrue(List.Transform( {1..Int64.From(Number.Sqrt(x))}, each Number.Mod(x, 1 + _) > 0)),
D = (n) => if P(n) then n else @D(n - 2),
C = Table.AddColumn(S, "C", each
[n = [Number],
d = P(2 * n - D(n - 1 - Number.From(Number.IsOdd(n))))][d]),
R = Table.SelectRows(C, each [C])[[Number]]
in
R
Blessings!
Power Query solution 2 for List Interprime Numbers, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
Source = Excel.CurrentWorkbook(){[Name = "Tabla1"]}[Content],
Sol = Table.SelectRows(
Source,
each
let
a = [Number],
b = List.Transform(
{1, - 1},
(k) =>
List.Last(
List.Generate(
() => [x = 0, y = 0, z = 0],
each [z] < 1,
each [
x = [x] + 1,
y = List.AllTrue(
List.Transform(
{2 .. Int64.From(Number.Sqrt(a + [x] * k))},
(r) => Number.Mod(a + [x] * k, r) <> 0
)
),
z = if y then [z] + 1 else [z],
w = a + x * k
],
each [w]
)
)
),
c = a = List.Average(b)
in
c
)
in
Sol
Power Query solution 3 for List Interprime Numbers, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Sol = Table.SelectRows(
Source,
each
let
a = [Number],
b = List.RemoveNulls(
List.Skip(
List.Generate(
() => [x = 0, y = 0, z = 0],
each [z] <= 1,
each [
x = [x] + 1,
y = List.AllTrue(
List.Transform(
{2 .. Int64.From(Number.Sqrt(a + x))},
(y) => Number.Mod(a + x, y) <> 0
)
),
z = if y then [z] + 1 else [z],
w = if y then a + x else null
],
each [w]
)
)
){0},
c = List.RemoveNulls(
List.Skip(
List.Generate(
() => [x = 0, y = 0, z = 0],
each [z] <= 1,
each [
x = [x] + 1,
y = List.AllTrue(
List.Transform(
{2 .. Int64.From(Number.Sqrt(a - x))},
(y) => Number.Mod(a - x, y) <> 0
)
),
z = if y then [z] + 1 else [z],
w = if y then a - x else null
],
each [w]
)
)
){0},
d = a = (b + c) / 2
in
d
)
in
Sol
Power Query solution 4 for List Interprime Numbers, proposed by Rafael González B.:
let
Source = Excel.CurrentWorkbook{0}[Content],
Fn_Interprime = (Nu as number) =>
let
Fn_IsOddPrime = (n as number) =>
let
N = n,
Ch = Number.IsOdd(N),
Pr = if Ch then
let
A = {2.. Number.RoundDown(Number.Sqrt(N))},
B = List.Transform(A, each Number.Mod(N,_)),
C = not List.Contains(B, 0)
in
C else false,
Select = Ch and Pr
in
Select,
Num1 = List.Last(List.Generate(
() => [N = Nu, C = false],
each [C] = false,
each [
N = [N] + 1,
C = Fn_IsOddPrime([N])
],
each [N] + 2
)),
Num2 = List.Last(List.Generate(
() => [N = Nu, C = false],
each [C] = false,
each [
N = [N] - 1,
C = Fn_IsOddPrime([N])
],
each [N] - 2
))
in
List.Average({Num1, Num2}),
Anw = Table.SelectRows(Source, each [Number] = Fn_Interprime([Number]))
in
Anw
🧙♂️🧙♂️🧙♂️
Solving the challenge of List Interprime Numbers with Excel
Excel solution 1 for List Interprime Numbers, proposed by Bo Rydobon 🇹🇭:
=TOCOL(MAP(A2:A10,
LAMBDA(x,
LET(P,
LAMBDA(
n,
LET(
c,
{2,
3,
5,
7},
d,
n/TOCOL(
VSTACK(
c,
SEQUENCE(
n^0.5/6,
,
2
)*6+{-1,
1}
),
3
),
IF(
OR(
n=c
),
1,
AND(
d>INT(
d
)
)
)
)
),
nP,
LAMBDA(
R,
n,
d,
LET(
m,
n+d,
ip,
IF(
ISODD(
m
),
P(
m
)
),
IF(
ip,
m,
R(
R,
m,
d
)
)
)
),
x/(nP(
nP,
x,
1
)+nP(
nP,
x,
-1
)=2*x)))),
3)
Excel solution 2 for List Interprime Numbers, proposed by John V.:
=TOCOL(
MAP(
A2:A10,
LAMBDA(
x,
LET(
p,
LAMBDA(
n,
AND(
MOD(
n,
1+SEQUENCE(
n^0.5
)
)
)
),
r,
LAMBDA(
r,
n,
IF(
p(
n
),
n,
r(
r,
n-2
)
)
),
x/p(
2*x-r(
r,
x-ISODD(
x
)-1
)
)
)
)
),
2
)
Excel solution 3 for List Interprime Numbers, proposed by John V.:
=TOCOL(MAP(A2:A10,
LAMBDA(n,
LET(p,
TOCOL(
MAP(
n-150+2*ROW(
1:150
)-ISEVEN(
n
),
LAMBDA(
x,
x/AND(
MOD(
x,
1+SEQUENCE(
x^0.5
)
)
)
)
),
2
),
n/(n=AVERAGE(
XLOOKUP(
n,
p,
p,
,
{-1;1}
)
))))),
2)
Excel solution 4 for List Interprime Numbers, proposed by محمد حلمي:
=TOCOL(MAP(A2:A10,
LAMBDA(w,
LET(v,
SEQUENCE(
15
),
r,
LAMBDA(
s,
XMATCH(
0,
-MAP(
w+s,
LAMBDA(
a,
LET(
e,
a/SEQUENCE(
a^0.5,
,
2
),
OR(
INT(
e
)=e
)
)
)
)
)
),
w*IF((w>3)*(w<>5),
r(
v
)=r(
-v
))^0))),
2)
Excel solution 5 for List Interprime Numbers, proposed by Julian Poeltl:
=LET(
F,
IFERROR(
MAP(
A2:A10,
LAMBDA(
N,
LET(
NN,
N-SEQUENCE(
1,
250
),
IPO,
IFERROR(
MAP(
NN,
LAMBDA(
A,
L_ISPrimeNumber(
A
)
)
),
""
),
F,
FILTER(
TRANSPOSE(
NN
),
TRANSPOSE(
IPO
)=TRUE
),
D,
N-TAKE(
F,
1
),
IPT,
MAP(
N+D,
LAMBDA(
A,
L_ISPrimeNumber(
A
)
)
),
IPC,
IFERROR(
IPT,
FALSE
),
FILTER(
N,
IPC=TRUE
)
)
)
),
""
),
FILTER(
F,
F<>""
)
)
L_ISPrimeNumber:
=LAMBDA(
Number,
IF(
SUM(
IF(
MOD(
Number,
SEQUENCE(
1,
Number
)
)=0,
1,
0
)
)=2,
TRUE,
FALSE
)
)
Excel solution 6 for List Interprime Numbers, proposed by Timothée BLIOT:
=FILTER(A2:A10,
MAP(A2:A10,
LAMBDA(z,
LET(D,
LAMBDA(n,
IF(n<5,
2,
VSTACK(2,
SEQUENCE(ROUNDDOWN(((n^0.5)-3),
0)/2+1,
,
3,
2)))),
P,
LAMBDA(x,
LET(A,
D(
x
),
SWITCH(x,
1,
0,
2,
1,
--(SUM(MAP(A,
LAMBDA(a,
--(MOD(
x,
a
)=0))))=0)))),
A,
TOCOL(
MAP(
SEQUENCE(
MIN(
z,
2*10^4
),
,
MAX(
INT(
z/2
),
z-10^4
)
),
LAMBDA(
x,
IF(
P(
x
),
x,
1/0
)
)
),
3
),
((MAX(
FILTER(
A,
A-z<0
)
)+MIN(
FILTER(
A,
A-z>0
)
))/2)=z))))
Excel solution 7 for List Interprime Numbers, proposed by LEONARD OCHEA 🇷🇴:
=LET(
G,
LAMBDA(
x,
y,
z,
AND(
MOD(
x+y*z,
SEQUENCE(
x^0.5-1,
,
2
)
)
)
),
TOCOL(
MAP(
A2:A10,
LAMBDA(
a,
LET(
F,
LAMBDA(
F,
u,
LET(
s,
G(
a,
u,
-1
)+G(
a,
u,
1
),
IF(
s=0,
F(
F,
u+1
),
IF(
s=2,
a,
q
)
)
)
),
F(
F,
1
)
)
)
),
3
)
)
Excel solution 8 for List Interprime Numbers, proposed by Abdelrahman Omer, MBA, PMP:
=TOCOL(MAP(A2:A10,
LAMBDA(a,
LET(k,
a+HSTACK(
SEQUENCE(
30
),
-SEQUENCE(
30
)
),
f,
LAMBDA(b,
--IF(b=2,
TRUE,
PRODUCT(--(MOD(
b,
SEQUENCE(
ROUNDDOWN(
SQRT(
b
),
),
,
ROUNDUP(
SQRT(
b
),
),
-1
)
)<>0))=1)),
n,
MAP(
k,
LAMBDA(
x,
f(
x
)
)
),
a/(SUM(
TAKE(
FILTER(
n,
INDEX(
n,
,
1
)+INDEX(
n,
,
2
)>0
),
1
)
)=2)))),
2)
Excel solution 9 for List Interprime Numbers, proposed by Diarmuid Early:
=FILTER(
A2:A10,
MAP(
A2:A10,
LAMBDA(
input,
LET(
sq,
SEQUENCE(
250,
,
input-249,
2
),
possP,
SEQUENCE(
SQRT(
input+250
)/2,
,
3,
2
),
stack,
VSTACK(
possP,
sq
),
primes,
REDUCE(
stack,
possP,
LAMBDA(
a,
v,
IF(
ISNUMBER(
XMATCH(
v,
a
)
),
FILTER(
a,
MOD(
a,
v
)<>0
),
a
)
)
),
nearest,
XLOOKUP(
input,
primes,
primes,
,
{-1,
1}
),
&
AVERAGE(
nearest
)
)=input
)
)
)
Solving the challenge of List Interprime Numbers with Python in Excel
Python in Excel solution 1 for List Interprime Numbers, proposed by John V.:
Hi everyone!
One [Python] option could be:
[i for i in xl("A2:A10")[0] if i == (p(i) + n(i)) / 2]
Blessings!
Solving the challenge of List Interprime Numbers with R
R solution 1 for List Interprime Numbers, proposed by Konrad Gryczan, PhD:
library(tidyverse)
library(readxl)
library(numbers)
input = read_excel("Excel/352 Interprime Numbers.xlsx", range = "A1:A10") %>% janitor::clean_names()
test = read_excel("Excel/352 Interprime Numbers.xlsx", range = "B1:B6") %>% janitor::clean_names()
is_interprime <- function(n) {
if (!is.integer(n)) {
return(FALSE)
}
prev_prime <- previousPrime(n)
next_prime <- nextPrime(n)
return(n == (prev_prime + next_prime) / 2)
}
# version with own functions (we are gonna use only isPrime from numbers package)
next_prime = function(n) {
repeat {
n = n + 1
if (isPrime(n)) {
return(n)
}
}
}
previous_prime = function(n) {
while (n > 2) {
n = n - 1
if (isPrime(n)) {
return(n)
}
}
}
is_interprime_2 <- function(n) {
if (!is.integer(n)) {
return(FALSE)
}
prev_prime <- previous_prime(n)
next_prime <- next_prime(n)
return(n == (prev_prime + next_prime) / 2)
}
result = input %>%
mutate(number = as.integer(number)) %>%
mutate(is_interprime = map_lgl(number, is_interprime),
is_interprime_2 = map_lgl(number, is_interprime_2)) %>%
filter(is_interprime) %>%
bind_cols(test)
&&
