Find the results of given Tic Tac Toe (Noughts and Crosses) boards. Results can be either Won or Draw. Won – If there are three same marks i.e. Os or Xs in a row or column or diagonal. Draw – If won condition is not met
📌 Challenge Details and Links
ExcelBI Excel Challenge Number: 426
Challenge Difficulty: ⭐️⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn
Solving the challenge of Evaluate Tic Tac Toe Results with Power Query
Power Query solution 1 for Evaluate Tic Tac Toe Results, proposed by Aditya Kumar Darak 🇮🇳:
let
Source = Excel.CurrentWorkbook(){[Name = "data"]}[Content],
MatchFun = (List) => List.Count(List.Distinct(List)) = 1,
MyFun1 = (Table, Function) => List.AnyTrue(List.Transform(Function(Table), MatchFun)),
MyFun2 = (Table) =>
MatchFun(List.Transform({0, 4, 8}, each List.Combine(Table.ToColumns(Table)){_})),
Col = MyFun1(Source, Table.ToColumns),
Row = MyFun1(Source, Table.ToRows),
D1 = MyFun2(Source),
D2 = MyFun2(Table.ReverseRows(Source)),
Return = if Col or Row or D1 or D2 then "Won" else "Draw"
in
Return
Power Query solution 2 for Evaluate Tic Tac Toe Results, proposed by Glyn Willis:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
#"Removed Blank Rows" = Table.SelectRows(
Source,
each not List.IsEmpty(List.RemoveMatchingItems(Record.FieldValues(_), {"", null}))
),
#"Changed Type" = Table.TransformColumnTypes(
#"Removed Blank Rows",
{{"Column3", type text}, {"Column2", type text}, {"Column1", type text}}
),
Custom1 = List.Transform(
Table.Split(#"Changed Type", 3),
each [
tc = Table.ToColumns(_),
tr = Table.ToRows(_),
c = List.Count(tc),
p = {0 .. c - 1},
f = (tbl, list1 as list, list2 as nullable list) =>
Table.FromRecords(
List.Transform(
if list2 = null then list1 else List.Zip({list1, list2}),
(x) =>
let
a = (if list2 = null then tbl{x} else tbl{x{0}}{x{1}})
in
[
X =
if list2 = null then
List.Count(List.Select(a, (y) => y = "X")) = 3
else
a = "X",
O =
if list2 = null then
List.Count(List.Select(a, (y) => y = "O")) = 3
else
a = "O"
]
)
),
v = f(tc, p, null),
h = f(tr, p, null),
d1 = f(tc, p, p),
d2 = f(tc, p, List.Reverse(p)),
xw = List.AnyTrue(
{List.AnyTrue(v[X]), List.AnyTrue(h[X]), List.AllTrue(d1[X]), List.AllTrue(d2[X])}
),
ow = List.AnyTrue(
{List.AnyTrue(v[O]), List.AnyTrue(h[O]), List.AllTrue(d1[O]), List.AllTrue(d2[O])}
),
w = if xw then "X Win" else if ow then "O Win" else "Draw"
][w]
)
in
Custom1
Power Query solution 3 for Evaluate Tic Tac Toe Results, proposed by Arnaud Duvernois:
let
Fn = (MyTable as table) =>
let
TestRows = List.Min(
List.Transform(Table.ToRows(MyTable), (s) => List.Count(List.Distinct(s)))
),
TestColumns = List.Min(
List.Transform(Table.ToColumns(MyTable), (s) => List.Count(List.Distinct(s)))
),
TestDiagonal = List.Min(
List.Transform(
List.Split(
List.Accumulate(
{1 .. 3},
{},
(s, c) =>
s
& {Table.Column(MyTable, "Colonne" & Text.From(c)){c - 1}}
& {Table.Column(MyTable, "Colonne" & Text.From(c)){3 - c}}
),
3
),
each List.Count(List.Distinct(_))
)
),
Result = if TestRows = 1 or TestColumns = 1 or TestDiagonal = 1 then "Won" else "Draw"
in
Result,
Source = Excel.CurrentWorkbook(){[Name = "Tableau1"]}[Content],
ListeTable = List.Transform(Table.Split(Source, 4), each Table.FirstN(_, 3)),
WD = List.Combine(List.Transform(ListeTable, (s) => {Fn(s)} & {null, null, null})),
Combine = Table.FromColumns(Table.ToColumns(Source) & {WD})
in
Combine
Solving the challenge of Evaluate Tic Tac Toe Results with Excel
Excel solution 1 for Evaluate Tic Tac Toe Results, proposed by Rick Rothstein:
=LET(g,
A2:C4,
f,
LAMBDA(t,
OR(BYROW(INDEX(
TOROW(
g
),
VSTACK(
{1,
2,
3}+{0;3;6},
{1,
4,
7}+{0;1;2},
{1,
5,
9},
{3,
5,
7}
)
),
LAMBDA(r,
SUM(0+(r=t))))=3)),
IF(
f(
"X"
)+f(
"O"
),
"Won",
"Draw"
))
Excel solution 2 for Evaluate Tic Tac Toe Results, proposed by John V.:
=LET(
r,
A2:C4,
s,
{"XXX",
"OOO"},
i,
{1;2;3},
c,
CONCAT,
IF(
OR(
c(
INDEX(
r,
i,
i
)
)=s,
BYROW(
r,
c
)=s,
BYCOL(
r,
c
)=TOCOL(
s
),
CONCAT(
INDEX(
r,
i,
4-i
)
)=s
),
"Won",
"Draw"
)
)
✅=LET(
r,
A2:C4,
i,
{1,
2,
3},
IF(
OR(
BYROW(
VSTACK(
r,
TRANSPOSE(
r
),
INDEX(
r,
i,
i
),
INDEX(
r,
i,
4-i
)
),
CONCAT
)={"XXX",
"OOO"}
),
"Won",
"Draw"
)
)
Excel solution 3 for Evaluate Tic Tac Toe Results, proposed by محمد حلمي:
=LET(
a,
A2:C4,
s,
SEQUENCE(
3
),
IF(
OR(
BYROW(
a,
LAMBDA(
a,
COUNTA(
UNIQUE(
a,
1
)
)
)
)=1,
BYCOL(
a,
LAMBDA(
a,
ROWS(
UNIQUE(
a
)
)
)
)=1,
ROWS(
UNIQUE(
INDEX(
a,
s,
s
)
)
)=1
),
"Won",
"Draw"
)
)
Excel solution 4 for Evaluate Tic Tac Toe Results, proposed by Julian Poeltl:
=LET(F,
A2:C4;
,
H,
LAMBDA(
A,
IF(
AND(
INDEX(
A,
,
1
)=INDEX(
A,
,
2
),
INDEX(
A,
,
2
)=INDEX(
A,
,
3
)
),
"Won",
""
)
),
HR,
CONCAT(
BYROW(
F,
LAMBDA(
A,
H(
A
)
)
)
),
VR,
CONCAT(
BYCOL(
F,
LAMBDA(
A,
H(
TRANSPOSE(
A
)
)
)
)
),
D,
IF(
AND(
INDEX(
F,
1,
1
)=INDEX(
F,
2,
2
),
INDEX(
F,
2,
2
)=INDEX(
F,
3,
3
)
),
"Won",
""
),
DD,
IF(
AND(
INDEX(
F,
3,
1
)=INDEX(
F,
2,
2
),
INDEX(
F,
2,
2
)=INDEX(
F,
1,
3
)
),
"Won",
""
),
IF(LEN((HR&VR&DD&D))>1,
"Won",
"Draw"))
Excel solution 5 for Evaluate Tic Tac Toe Results, proposed by Hussein SATOUR:
=LET(
a,
IF(
A2:C4="o",
1,
-1
),
b,
TOCOL(
a
),
c,
VSTACK(
BYROW(
a,
AVERAGE
),
TOCOL(
BYCOL(
a,
AVERAGE
)
),
AVERAGE(
INDEX(
b,
{1;5;9}
)
),
AVERAGE(
INDEX(
b,
{3;5;7}
)
)
),
IF(
ISNA(
XMATCH(
1,
ABS(
c
)
)
),
"Draw",
"Won"
)
)
Excel solution 6 for Evaluate Tic Tac Toe Results, proposed by Oscar Mendez Roca Farell:
=LET(
m,
A2:C4,
s,
ROW(
1:3
),
f,
LAMBDA(
i,
j,
d,
LET(
v,
INDEX(
m,
i,
j
),
BYROW(
IF(
d ,
v,
TOROW(
v
)
),
LAMBDA(
r,
SUM(
N(
r=@r
)
)
)
)
)
),
IF(
OR(
IFNA(
HSTACK(
f(
s,
TOROW(
s
),
1
),
f(
TOROW(
s
),
s,
1
),
f(
s,
s,
),
f(
4-s,
s,
)
),
)=3
),
"Won",
"Draw"
)
)
Excel solution 7 for Evaluate Tic Tac Toe Results, proposed by Sunny Baggu:
=LET(
rng,
A22:C24,
_a,
SEQUENCE(
3
),
_b,
TOROW(
_a
),
_c,
VSTACK(
INDEX(
rng,
_a,
_b
),
INDEX(
rng,
_b,
_a
),
TOROW(
INDEX(
rng,
_a,
_a
)
),
INDEX(
rng,
_b,
{3,
2,
1}
)
),
IF(
LET(
_e1,
LAMBDA(
x,
OR(
MMULT(
N(
_c = x
),
{1; 1; 1}
) = 3
)
),
OR(_e1("o"),
_e1("x"))
),
"Won",
"Draw"
)
)
Excel solution 8 for Evaluate Tic Tac Toe Results, proposed by LEONARD OCHEA 🇷🇴:
=LET(
s,
{1;2;3},
t,
{0,
1,
2},
m,
INDEX(
TOCOL(
A2:C4
),
HSTACK(
s+t,
3*s+t-2,
4*s-3,
2*s+1
)
),
IF(
OR(
BYCOL(
N(
HSTACK(
m="X",
m="O"
)
),
SUM
)=3
),
"Won",
"Draw"
)
)
Short versión
=LET(
s,
{1;2;3},
t,
{0,
1,
2},
m,
INDEX(
TOCOL(
A2:C4
),
HSTACK(
s+t,
3*s+t-2,
4*s-3,
2*s+1
)
),
IF(
OR(
BYCOL(
HSTACK(
m="X",
m="O"
),
AND
)
),
"Won",
"Draw"
)
)
Excel solution 9 for Evaluate Tic Tac Toe Results, proposed by 🇵🇪 Ned Navarrete C.:
=LET(
m,
A18:C20,
IF(
OR(
BYROW(
VSTACK(
m,
TRANSPOSE(
m
),
INDEX(
m,
{1,
2,
3;3,
2,
1},
{1,
2,
3}
)
),
LAMBDA(
r,
CONCAT(
r
)
)
)={"XXX",
"OOO"}
),
"Won",
"Draw"
)
)
Excel solution 10 for Evaluate Tic Tac Toe Results, proposed by Andy Heybruch:
=LET(_r,
A22:C24,
_p,
VSTACK(
BYROW(
_r,
LAMBDA(
a,
CONCAT(
a
)
)
),
TOCOL(
BYCOL(
_r,
LAMBDA(
a,
CONCAT(
a
)
)
)
),
CONCAT(
INDEX(
_r,
SEQUENCE(
3
),
SEQUENCE(
3
)
)
),
CONCAT(
INDEX(
_r,
SEQUENCE(
3,
,
3,
-1
),
SEQUENCE(
3
)
)
)
),
IF(OR((_p="xxx"),
(_p="OOO")),
"Won",
"Draw"))
Excel solution 11 for Evaluate Tic Tac Toe Results, proposed by Sandeep Marwal:
=LET(
rgr,
TOCOL(
A1:C3
),
cgr,
TOCOL(
TRANSPOSE(
A1:C3
)
),
seqoff,
SEQUENCE(
3,
,
0
),
diao,
MAP(
seqoff,
LAMBDA(
a,
OFFSET(
$A$1,
a,
a
)
)
),
diat,
MAP(
seqoff,
LAMBDA(
a,
OFFSET(
$&C$1,
a,
-a
)
)
),
combine,
VSTACK(
rgr,
cgr,
diao,
diat
),
seq,
SEQUENCE(
8,
,
0
),
output,
MAP(
seq,
LAMBDA(
a,
TEXTJOIN(
"",
,
TAKE(
DROP(
combine,
3*a
),
3
)
)
)
),
outputstr,
CONCATENATE(
" ",
TEXTJOIN(
" ",
,
output
),
" "
),
IFS(
ISNUMBER(
FIND(
"xxx",
outputstr
)
),
"Won",
ISNUMBER(
FIND(
"ooo",
outputstr
)
),
"Won",
TRUE,
"Draw"
)
)
Excel solution 12 for Evaluate Tic Tac Toe Results, proposed by Tyler Cameron:
=LET(
a,
SEQUENCE(
3
),
u,
{1,
2,
3},
b,
A2:C4,
c,
MAP(
a,
LAMBDA(
x,
COUNTA(
UNIQUE(
INDEX(
b,
u,
x
),
TRUE
)
)
)
),
d,
MAP(
a,
LAMBDA(
x,
COUNTA(
UNIQUE(
INDEX(
b,
x,
u
),
TRUE
)
)
)
),
e,
COUNTA(
UNIQUE(
INDEX(
b,
u,
u
),
TRUE
)
),
f,
COUNTA(
UNIQUE(
INDEX(
b,
{3,
2,
1},
{3,
2,
1}
),
TRUE
)
),
REDUCE(
"Draw",
VSTACK(
c,
d,
e,
f
),
LAMBDA(
v,
t,
IF(
t=1,
"Won",
v
)
)
)
)
Excel solution 13 for Evaluate Tic Tac Toe Results, proposed by Erik Oehm:
=LET(
_board,
A6:C8,
_cases,
HSTACK(
_board,
TRANSPOSE(
_board
),
WRAPCOLS(
INDEX(
TOCOL(
_board
),
{1;5;9;3;5;7}
),
3
)
),
_wins,
BYCOL(
_cases,
LAMBDA(
x,
COUNTA(
UNIQUE(
x
)
)=1
)
),
IF(
OR(
_wins
),
"Won",
"Draw"
)
)
Excel solution 14 for Evaluate Tic Tac Toe Results, proposed by Neil Foot JP MBA MBCS:
=IF(OR(AND(A2=B2,B2=C2),AND(A3=B3,B3=C3),AND(A4=B4,B4=C4),AND(A2=A3,A3=A4),AND(B2=B3,B3=B4),AND(C2=C3,C3=C4),AND(A2=B3,B3=C4),AND(C2=B3,B3=A4)),"WON","DRAW")
Excel solution 15 for Evaluate Tic Tac Toe Results, proposed by Alexandra Popoff:
= LAMBDA(
Board,
Let(
z_Input,
SUBSTITUTE(
Board,
0,
""
),
z_seq,
SEQUENCE(
3,
1,
1,
1
),
z_seq_inv,
SEQUENCE(
3,
1,
3,
-1
),
z_Arr,
VSTACK(
z_Input,
TRANSPOSE(
z_Input
),
TRANSPOSE(
INDEX(
z_Input,
z_seq,
z_seq
)
),
TRANSPOSE(
INDEX(
z_Input,
z_seq,
z_seq_inv
)
)
),
z_Test,
BYROW(
z_Arr,
LAMBDA(
z_i,
ROWS(
UNIQUE(
TRANSPOSE(
z_i
)
)
)
)
),
IF(
SUM(
N(
z_Test = 1
)
) > 0,
"Won",
"Draw"
)
)
)
Solving the challenge of Evaluate Tic Tac Toe Results with Python
Python solution 1 for Evaluate Tic Tac Toe Results, proposed by Konrad Gryczan, PhD:
Similarly like in R, one case in comment, rest in screenshot and Github
import pandas as pd
board1 = pd.read_excel("426 Tic Tac Toe Result.xlsx", sheet_name="Sheet1", header=None, usecols="A:C", skiprows=1, nrows=3).values
verdict1 = pd.read_excel("426 Tic Tac Toe Result.xlsx", sheet_name="Sheet1", header=None, usecols="E:E", skiprows=1, nrows = 1).values.flatten()
def check_board(board):
row_check = any([len(set(row)) == 1 for row in board])
col_check = any([len(set(col)) == 1 for col in zip(*board)])
diag_check = len(set([board[i][i] for i in range(len(board))])) == 1
anti_diag_check = len(set([board[i][len(board)-1-i] for i in range(len(board))])) == 1
return "Won" if row_check or col_check or diag_check or anti_diag_check else "Draw"
print(check_board(board1) == verdict1) # True
Solving the challenge of Evaluate Tic Tac Toe Results with R
R solution 1 for Evaluate Tic Tac Toe Results, proposed by Konrad Gryczan, PhD:
library(tidyverse)
library(readxl)
board1 = read_excel("Excel/426 Tic Tac Toe Result.xlsx", range = "A2:C4", col_names = F) %>%
as.matrix()
verdict1 = read_excel("Excel/426 Tic Tac Toe Result.xlsx", range = "E2:E2", col_names = F) %>%
pull()
check_board <- function(board) {
row_check = any(apply(board, 1, function(x) length(unique(x)) == 1))
col_check = any(apply(board, 2, function(x) length(unique(x)) == 1))
diag_check = length(unique(diag(board))) == 1
anti_diag_check = length(unique(diag(board[,ncol(board):1]))) == 1
ifelse(row_check | col_check | diag_check | anti_diag_check, "Won", "Draw")
}
check_board(board1) == verdict1 # TRUE
&&
