Home » Evaluate Tic Tac Toe Results

Evaluate Tic Tac Toe Results

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
                    
                  

&&

Leave a Reply