Determine whether a given chess board is valid or not. To determine validity, B (Black) & W (White) should be adjacent. Hence, two Bs and two Ws can’t be adjacent. Adjacent means that the boundary is shared (not diagonally but vertically and horizontally). Your answer should be able to take care of maximum 8×8 chessboard and minimum 2×2.
📌 Challenge Details and Links
ExcelBI Excel Challenge Number: 525
Challenge Difficulty: ⭐️⭐️⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn
Solving the challenge of Validate Chessboard Pattern with Power Query
Power Query solution 1 for Validate Chessboard Pattern, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Cal = List.Transform(
{Table.ToColumns(Source), Table.ToRows(Source)},
(x) =>
List.AllTrue(
List.Transform(
x,
each
let
a = List.Distinct(List.Alternate(_, 1, 1)),
b = List.Distinct(List.Alternate(_, 1, 1, 1)),
c = a <> b,
d = List.Count(a) = 1 and List.Count(b) = 1
in
c and d
)
)
),
Sol = if List.AllTrue(Cal) then "Valid" else "Invalid"
in
Sol
Solving the challenge of Validate Chessboard Pattern with Excel
Excel solution 1 for Validate Chessboard Pattern, proposed by Bo Rydobon 🇹🇭:
=LET(
z,
A37:H44,
r,
ROW(
z
),
IF(
OR(
MOD(
r+TOROW(
r
),
2
)=N(
z=@+z
)
),
"Invalid",
"Valid"
)
)
Excel solution 2 for Validate Chessboard Pattern, proposed by Rick Rothstein:
=LET(g,A2:B3,IF(COUNT(FIND({"BB","WW"},BYROW(g,LAMBDA(r,CONCAT(r)))&" "&TOCOL(BYCOL(g,LAMBDA(c,CONCAT(c)))))),"Invalid","Valid"))
Excel solution 3 for Validate Chessboard Pattern, proposed by John V.:
=LET(i,A2:B3,IF(OR(DROP(i,1)=DROP(i,-1)),"In",)&"valid")
Excel solution 4 for Validate Chessboard Pattern, proposed by Kris Jaganah:
=LET(a,
A1:H44,
b,
SCAN(
,
TAKE(
a,
,
1
),
LAMBDA(
x,
y,
IF(
y="",
0,
x+1
)
)
),
c,
SCAN(
0,
b,
LAMBDA(
v,
w,
IF(
w=0,
1+v,
v
)
)
),
e,
UNIQUE(
c
),
f,
MAP(e,
LAMBDA(z,
LET(g,
FILTER(a,
(b>0)*(c=z)),
h,
ROWS(
g
),
i,
TOCOL(
TAKE(
g,
,
h
)
),
j,
DROP(
i,
1
),
k,
DROP(
i,
-1
),
l,
--(j<>k),
m,
MOD(
SEQUENCE(
ROWS(
j
)
),
h
),
IF(MIN(IF(ISEVEN(
h
),
IFS((m=0)*(l=0),
1,
(m>0)*(l=1),
1,
1,
0),
l)),
"Valid",
"Invalid")))),
IF(
b=1,
XLOOKUP(
c,
e,
f
),
""
))
Excel solution 5 for Validate Chessboard Pattern, proposed by Timothée BLIOT:
=LET(A,A2:B3,B,--(TAKE(A,1,1)="B"),C,ROWS(A),IF(PRODUCT(--(MAKEARRAY(C ,C,LAMBDA(x,y,IF(--ISEVEN(B+x+y),"W","B")))=A)),"Valid","Invalid"))
Excel solution 6 for Validate Chessboard Pattern, proposed by Hussein SATOUR:
=LET(a,
A2:B3,
b,
TOCOL(
a
),
c,
ROWS(
a
),
IF(PRODUCT((b=TOCOL(
TRANSPOSE(
a
)
))*1)*COUNTA(
UNIQUE(
INDEX(
b,
SEQUENCE(
c,
,
,
c+1
)
)
)
)=1,
"Valid",
"Invalide"))
Excel solution 7 for Validate Chessboard Pattern, proposed by Oscar Mendez Roca Farell:
=LET(a, A2:B3, n, ROWS(a), u, UNIQUE(TOCOL(a)), IF(AND(a=MAKEARRAY(n, n, LAMBDA(r, c, IF(ABS(ISEVEN(c)-ISODD(r)), @u, DROP(u, 1))))), "V", "Inv")&"alid")
Excel solution 8 for Validate Chessboard Pattern, proposed by Sunny Baggu:
=LET(
t,
A37:H44,
_r,
ROWS(
t
),
_s,
SEQUENCE(
_r
),
_s1,
DROP(
_s,
-1
),
_s2,
DROP(
_s,
1
),
IF(
OR(
CHOOSEROWS(
t,
_s1
) = CHOOSEROWS(
t,
_s2
)
),
"Invalid",
"Valid"
)
)
Excel solution 9 for Validate Chessboard Pattern, proposed by LEONARD OCHEA 🇷🇴:
=LET(t,A37:H44,IF(OR(DROP(t,1)=DROP(t,-1)),"Invalid","Valid"))
Excel solution 10 for Validate Chessboard Pattern, proposed by ferhat CK:
=IF(OR(A28:G35=B28:H35,A28:H34=A29:H35),"Invalid","Valid")
Excel solution 11 for Validate Chessboard Pattern, proposed by Bilal Mahmoud kh.:
=LET(chk,LAMBDA(x,AND(MAKEARRAY(ROWS(x)-1,COLUMNS(x)-1,LAMBDA(r,c,LET(v,INDEX(x,r,c),nx,INDEX(x,r,c+1),dn,INDEX(x,r+1,c),(v<>nx)*(v<>dn)))))),a,MAP(SEQUENCE(8),LAMBDA(n,LET(a,MAP(A1:A45,LAMBDA(x,COUNTA(FILTER(A1:x,A1:x="")))),COUNT(FILTER(a,a=n))-1))),b,DROP(REDUCE(1,I2#,LAMBDA(x,y,VSTACK(x,MAX(x)+y+1))),-1),res,MAP(a,b,LAMBDA(i,o,IF(chk(OFFSET(INDIRECT(ADDRESS(o,1)),1,0,i,i)),"Valid"&REPT(",",i),"Invalid"&REPT(",",i)))),TEXTSPLIT(TEXTJOIN(",",,res),,","))
Excel solution 12 for Validate Chessboard Pattern, proposed by El Badlis Mohd Marzudin:
=LET(
a,
A2:B3,
b,
MOD(
SEQUENCE(
ROWS(
a
)
),
2
)+MOD(
SEQUENCE(
,
ROWS(
a
)
),
2
)<>1,
c,
UNIQUE(
TOCOL(
a
)
),
IF(
AND(
IF(
b,
TAKE(
c,
1
),
TAKE(
c,
-1
)
)=a
),
"Valid",
"Invalid"
)
)
Solving the challenge of Validate Chessboard Pattern with Python
Python solution 1 for Validate Chessboard Pattern, proposed by Konrad Gryczan, PhD:
Math approach. Only 1 check in comment, full check on github
import pandas as pd
import numpy as np
path = '525 Valid Chessboard.xlsx'
input8 = pd.read_excel(path, header=None, usecols="A:F", skiprows = 36, nrows = 8).values
test8 = pd.read_excel(path, header=None, usecols="J", skiprows = 36, nrows = 1).values.flatten()
def is_proper_chessboard(board):
board_numeric = np.where(board == 'B', -1, 1)
n = board.shape[0]
def sum_check(x):
if n % 2 == 0:
return np.all(np.sum(x, axis=1) == 0) and np.all(np.sum(x, axis=0) == 0)
return np.all(np.abs(np.sum(x, axis=1)) == 1) and np.all(np.abs(np.sum(x, axis=0)) == 1)
if sum_check(board_numeric):
return "Valid"
else:
return "Invalid"
print(is_proper_chessboard(input8) == test8) # True
Solving the challenge of Validate Chessboard Pattern with R
R solution 1 for Validate Chessboard Pattern, proposed by Konrad Gryczan, PhD:
library(tidyverse)
library(readxl)
path = "Excel/525 Valid Chessboard.xlsx"
input1 = read_excel(path, sheet = 1, col_names = FALSE, range = "A2:B3") %>% as.matrix()
test1 = read_excel(path, sheet = 1, col_names = FALSE, range = "J2") %>% pull()
input4 = read_excel(path, sheet = 1, col_names = FALSE, range = "A12:C14") %>% as.matrix()
test4 = read_excel(path, sheet = 1, col_names = FALSE, range = "J12") %>% pull()
input8 = read_excel(path, sheet = 1, col_names = FALSE, range = "A37:H44") %>% as.matrix()
test8 = read_excel(path, sheet = 1, col_names = FALSE, range = "J37") %>% pull()
is_proper_chessboard <- function(board) {
board_numeric <- ifelse(board == 'B', -1, 1)
n <- nrow(board)
sum_check <- function(x) {
if (n %% 2 == 0)
return(all(rowSums(x) == 0) && all(colSums(x) == 0))
else
return(all(abs(rowSums(x)) == 1) && all(abs(colSums(x)) == 1))
}
result = ifelse(sum_check(board_numeric), "Valid", "Invalid")
return(result)
}
is_proper_chessboard(input1) == test1 # TRUE
is_proper_chessboard(input4) == test4 # TRUE
is_proper_chessboard(input8) == test8 # TRUE
&&&
