Xah Talk Show 2024-12-04 Ep600, Wolfram Language, Advent of Code 2024, Day 4

By Xah Lee. Date: .
china girl wolf 2024-12-04 WdZqc
china girl wolf 2024-12-04 WdZqc
(* 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 *)
xinput =
"MMMSXXMASM
MSAMXMSMSA
AMXSXMAAMM
MSAMASMSMX
XMASAMXAMM
XXAMMXXAMA
SMSMSASXSS
SAXAMASAAA
MAMMMXMMMM
MXMXAXMASX";

xinput = ReadString @ "c:/Users/xah/web/xahlee_info/comp/advent/advent_of_code_2024_4_input.txt";

xmatrix = Map[ Characters , StringSplit[ xinput ]];

countHorizontal = Function[{xlistOfStrings},
 Total @ Map[ Function[{x}, StringCount[x, "XMAS"]], xlistOfStrings] +
 Total @ Map[ Function[{x}, StringCount[x, "SAMX"]], xlistOfStrings]
];

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]]];

xhorTotal = countHorizontal @ Map[ StringJoin , xmatrix];
xvertTotal = countHorizontal @ Map[ StringJoin , Transpose @ xmatrix];
xdiagTotal = xcountDiag @ xmatrix;

xantidiagTotal = xcountDiag @ Map[ Reverse , xmatrix] ;

(* answer for toy input 18 *)
(* answer for personal input 2633 *)

Plus@@{xhorTotal , xvertTotal , xdiagTotal , xantidiagTotal}
matrix diagonal 2024-12-04 132624
matrix diagonal 2024-12-04 132624

part 2