(* scratch pad showing how it works *)
xinput =
"MMMSXXMASM
MSAMXMSMSA
AMXSXMAAMM
MSAMASMSMX
XMASAMXAMM
XXAMMXXAMA
SMSMSASXSS
SAXAMASAAA
MAMMMXMMMM
MXMXAXMASX";
(*
algo.
for horizontal, it's trivial.
reverse row, trivial.
for vertical, just transpose the matrix.
for dignonal, you need to turn the diagnols into rows.
can that be done?
yes, via the Wolfram language function Diagonal.
*)
xinput = StringSplit[ xinput ]
xmatrix = Map[ Characters , xinput]
(*
{
{M, M, M, S, X, X, M, A, S, M},
{M, S, A, M, X, M, S, M, S, A},
{A, M, X, S, X, M, A, A, M, M},
{M, S, A, M, A, S, M, S, M, X},
{X, M, A, S, A, M, X, A, M, M},
{X, X, A, M, M, X, X, A, M, A},
{S, M, S, M, S, A, S, X, S, S},
{S, A, X, A, M, A, S, A, A, A},
{M, A, M, M, M, X, M, M, M, M},
{M, X, M, X, A, X, M, A, S, X}
}
*)
xlistOfStrRows = Map[ StringJoin , xmatrix]
{
"MMMSXXMASM",
"MSAMXMSMSA",
"AMXSXMAAMM",
"MSAMASMSMX",
"XMASAMXAMM",
"XXAMMXXAMA",
"SMSMSASXSS",
"SAXAMASAAA",
"MAMMMXMMMM",
"MXMXAXMASX"
}
StringCases[ "XMASXMAS", "XMAS" ]
(* {XMAS, XMAS} *)StringCount[ "XMASXMAS", "XMAS" ]
(* 2 *)Total @
Map[ Function[{x}, StringCount[x, "XMAS"]], xlistOfStrRows]
(* 3 *)Total @
Map[ Function[{x}, StringCount[ StringReverse @ x, "XMAS"]], xlistOfStrRows]
(* 2 *)
countHorizontal = Function[{xlistOfStrRows},
Total @ Map[ Function[{x}, StringCount[x, "XMAS"]], xlistOfStrRows] +
Total @ Map[ Function[{x}, StringCount[x, "SAMX"]], xlistOfStrRows]
]
countHorizontal @ xlistOfStrRows
(* HHHH--------------------------------------------------- *)
xhorTotal = countHorizontal @ Map[ StringJoin , xmatrix]
xvertTotal = countHorizontal @ Map[ StringJoin , Transpose @ xmatrix]
(* HHHH--------------------------------------------------- *)
xsize = Dimensions[ xmatrix ]
xrowCount = xsize[[1]]
xcolCount = xsize[[2]]
Range[ -(xrowCount -1) , xcolCount -1]
(* {-9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9} *)(* all diagonals *)
xallDiagonals = Table[ Diagonal[ xmatrix, kk ] , {kk, Range[ -(xrowCount -1) , xcolCount -1]} ]
(*
{{M},
{M, X},
{S, A, M},
{S, A, M, X},
{X, M, X, M, A},
{X, X, S, A, M, X},
{M, M, A, M, M, X, M},
{A, S, A, M, S, A, M, A},
{M, M, A, S, M, A, S, M, S},
{M, S, X, M, A, X, S, A, M, X},
{M, A, S, A, M, X, X, A, M},
{M, M, X, S, X, A, S, A},
{S, X, M, M, A, M, S},
{X, M, A, S, M, A},
{X, S, A, M, M},
{M, M, M, X},
{A, S, M},
{S, A},
{M}}
*)
xdiagTotal = countHorizontal @ Map[ StringJoin , xallDiagonals]
(* 5 *)(* HHHH--------------------------------------------------- *)
xcountDiag =
Function[{xmatrix},
Module[{xsize, xrowCount, xcolCount, xrange, xallDiagonals},
xsize = Dimensions[xmatrix];
xrowCount = xsize[[1]];
xcolCount = xsize[[2]];
xrange = Range[-(xrowCount - 1), xcolCount - 1];
xallDiagonals =
Table[Diagonal[xmatrix, kk], {kk, xrange}];
countHorizontal@Map[StringJoin, xallDiagonals]]]
xdiagTotal = xcountDiag @ xmatrix
(* what's the word for the other diagnol of a matrix *)
xantidiagTotal = xcountDiag @ Transpose @ xmatrix
xhorTotal + xvertTotal + xdiagTotal + xantidiagTotal
(* 18 *)