Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

AoC 2024/04

aoc-2024-04.livemd

AoC 2024/04

Mix.install([
  {:kino, "~> 0.14.2"}
])

Section

input = Kino.Input.textarea("input")
defmodule Day4 do
  def parse_input(input) do
    input 
    |> String.split("\n")
    |> Enum.map(fn line -> String.graphemes(line) end)
  end

  def solve1(input) do
    input
    |> parse_input()
    |> xmas_count()
  end
  
  defp xmas_count(grid) do
    horizontal_count = 
      grid
      |> Enum.map(&Enum.join/1)
      |> Enum.map(&row_count/1)
      |> Enum.sum()
      

    vertical_count =
      grid
      |> transpose()
      |> Enum.map(&Enum.join/1)
      |> Enum.map(&row_count/1)
      |> Enum.sum()

    row_count = Enum.count(grid)

    diagonal_left_right_count = 
      Enum.map(0..(row_count-3), fn col ->
        Enum.map(0..(row_count-1-col), fn row ->
          Enum.at(grid, row) |> Enum.at(col+row)
        end)
        |> Enum.join()
      end)
      |> Enum.map(&row_count/1)
      |> Enum.sum()
    
    diagonal_right_left_count =
      Enum.map((row_count-1)..2, fn col ->
        Enum.map(0..col, fn row ->
          Enum.at(grid, row) |> Enum.at(col - row)
        end)
        |> Enum.join()
      end)
    |> Enum.map(&row_count/1)
    |> Enum.sum()

    diagonal_right_left_bottom_count =
      Enum.map(1..(row_count-1), fn col ->
        Enum.map((row_count-1)..col, fn row ->
          Enum.at(grid, row) |> Enum.at((row_count-1)-row+col)
        end)
        |> Enum.join()
      end)
      |> Enum.map(&row_count/1)
      |> Enum.sum()

    diagonal_left_right_bottom_count =
      Enum.map((row_count-1-1)..2, fn col ->
        Enum.map((row_count-1)..(row_count-1-col), fn row ->
          Enum.at(grid, row) |> Enum.at(col-abs(row_count-1-row))
        end)
        |> Enum.join()
      end)
      |> Enum.map(&row_count/1)
      |> Enum.sum()          
    
    horizontal_count + vertical_count + diagonal_left_right_count + diagonal_right_left_count +
      diagonal_right_left_bottom_count + diagonal_left_right_bottom_count
  end

  defp row_count(row) do
    left_right_count = xmass_count(row)
    right_left_count = xmass_count(row |> String.reverse()) 

    left_right_count + right_left_count
  end

  defp xmass_count(string) do
    string
    |> :binary.matches("XMAS")
    |> Enum.count()
  end
  
  defp transpose(grid) do
    Enum.zip_with(grid, &Function.identity/1)
  end
  
  def solve2(input) do
    input
    |> parse_input()
    |> mas_count()
  end
  
  defp mas_count(grid) do
    row_count = Enum.count(grid)

    diagonal_left_right_count = 
      Enum.map(0..(row_count-3), fn col ->
        Enum.map(0..(row_count-1-col), fn row ->
          Enum.at(grid, row) |> Enum.at(col+row)
        end)
        |> Enum.join()
      end)
      |> Enum.map(&row_count2/1)
      |> Enum.sum()
    
    diagonal_right_left_count =
      Enum.map((row_count-1)..2, fn col ->
        Enum.map(0..col, fn row ->
          Enum.at(grid, row) |> Enum.at(col - row)
        end)
        |> Enum.join()
      end)
    |> Enum.map(&row_count/1)
    |> Enum.sum()

    diagonal_right_left_bottom_count =
      Enum.map(1..(row_count-1), fn col ->
        Enum.map((row_count-1)..col, fn row ->
          Enum.at(grid, row) |> Enum.at((row_count-1)-row+col)
        end)
        |> Enum.join()
      end)
      |> Enum.map(&row_count/1)
      |> Enum.sum()

    diagonal_left_right_bottom_count =
      Enum.map((row_count-1-1)..2, fn col ->
        Enum.map((row_count-1)..(row_count-1-col), fn row ->
          Enum.at(grid, row) |> Enum.at(col-abs(row_count-1-row))
        end)
        |> Enum.join()
      end)
      |> Enum.map(&row_count/1)
      |> Enum.sum()          
    
    diagonal_left_right_count + diagonal_right_left_count +
      diagonal_right_left_bottom_count + diagonal_left_right_bottom_count
  end

  defp row_count2(row) do
    left_right_count = xmass2_count(row)
    right_left_count = xmass2_count(row |> String.reverse()) 

    left_right_count + right_left_count
  end

  defp xmass2_count(string) do
    string
    |> :binary.matches("MAS") |> IO.inspect(label: "MAS")
    |> Enum.count()
  end
end
{:module, Day4, <<70, 79, 82, 49, 0, 0, 31, ...>>, {:xmass2_count, 1}}

solve1

Kino.Input.read(input)
|> Day4.solve1()
2613
grid = Kino.Input.read(input)
|> Day4.parse_input()
[
  ["A", "A", "M", "X", "M", "A", "S", "A", "S", "M", "X", "S", "A", "M", "X", "X", "S", "A", "M",
   "S", "A", "M", "X", "X", "S", "X", "M", "M", "S", "M", "M", "S", "X", "S", "A", "S", "X", "S",
   "X", "S", "S", "S", "X", "S", "A", "M", "X", "X", "X", ...],
  ["A", "X", "M", "A", "S", "X", "M", "A", "A", "S", "A", "M", "M", "M", "S", "M", "S", "A", "M",
   "S", "A", "M", "X", "M", "A", "X", "M", "A", "A", "A", "M", "X", "M", "A", "S", "A", "A", "M",
   "M", "M", "A", "A", "A", "M", "M", "X", "M", "A", ...],
  ["X", "M", "S", "M", "M", "A", "M", "X", "M", "M", "S", "M", "A", "A", "A", "A", "M", "A", "M",
   "S", "A", "M", "X", "A", "M", "A", "M", "S", "S", "S", "M", "X", "A", "M", "M", "M", "S", "M",
   "A", "M", "M", "M", "M", "M", "S", "A", "S", ...],
  ["S", "A", "M", "X", "S", "A", "M", "S", "X", "M", "A", "S", "M", "S", "S", "M", "S", "M", "M",
   "M", "M", "M", "M", "A", "M", "M", "M", "M", "A", "M", "A", "S", "M", "X", "S", "A", "A", "M",
   "S", "M", "M", "A", "M", "X", "S", "A", ...],
  ["A", "S", "A", "A", "S", "X", "M", "M", "A", "X", "A", "X", "M", "A", "X", "X", "A", "X", "A",
   "X", "A", "S", "A", "M", "X", "A", "A", "X", "M", "M", "M", "M", "M", "A", "M", "X", "S", "X",
   "M", "A", "S", "X", "S", "M", "M", ...],
  ["M", "M", "M", "M", "S", "A", "X", "S", "A", "M", "M", "X", "S", "A", "S", "M", "M", "S", "M",
   "S", "A", "X", "M", "A", "S", "M", "S", "M", "X", "A", "X", "A", "M", "X", "M", "X", "X", "A",
   "S", "A", "M", "X", "A", "M", ...],
  ["X", "M", "A", "M", "X", "M", "X", "M", "A", "S", "X", "A", "M", "M", "S", "A", "X", "A", "A",
   "M", "A", "M", "S", "A", "S", "M", "X", "X", "S", "X", "S", "X", "S", "A", "M", "X", "M", "A",
   "M", "S", "M", "S", "A", ...],
  ["S", "S", "M", "S", "A", "X", "S", "M", "A", "S", "M", "M", "M", "A", "S", "M", "M", "M", "M",
   "M", "X", "M", "M", "A", "S", "A", "M", "A", "S", "A", "A", "M", "S", "A", "S", "A", "M", "X",
   "M", "A", "M", "M", ...],
  ["A", "A", "A", "M", "X", "M", "X", "M", "A", "X", "A", "X", "M", "X", "X", "X", "X", "X", "X",
   "X", "X", "X", "M", "M", "M", "X", "M", "A", "M", "X", "M", "X", "M", "A", "S", "X", "M", "X",
   "S", "A", "S", ...],
  ["M", "M", "M", "M", "S", "S", "X", "M", "A", "S", "M", "X", "M", "A", "S", "M", "M", "M", "X",
   "S", "X", "M", "M", "M", "A", "X", "M", "S", "M", "S", "X", "A", "M", "M", "M", "X", "M", "A",
   "S", "A", ...],
  ["X", "M", "A", "A", "M", "A", "A", "M", "A", "M", "M", "A", "X", "A", "A", "A", "A", "X", "A",
   "M", "M", "A", "A", "M", "A", "M", "M", "M", "A", "X", "M", "X", "S", "A", "A", "A", "M", "A",
   "M", ...],
  ["M", "S", "M", "S", "S", "S", "S", "M", "M", "S", "X", "M", "M", "M", "S", "S", "X", "M", "M",
   "S", "A", "S", "X", "S", "S", "M", "S", "M", "M", "M", "M", "M", "M", "M", "S", "M", "M", "A",
   ...],
  ["X", "A", "A", "A", "A", "A", "X", "X", "A", "A", "M", "S", "X", "M", "A", "M", "X", "X", "M",
   "A", "M", "M", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "X", "A", "X", "A", "X", ...],
  ["S", "M", "S", "M", "M", "M", "M", "S", "M", "X", "M", "X", "A", "M", "A", "S", "M", "M", "S",
   "S", "M", "M", "M", "M", "M", "M", "M", "X", "M", "S", "S", "S", "M", "S", "S", "M", ...],
  ["S", "A", "M", "X", "M", "A", "M", "S", "M", "S", "M", "X", "A", "M", "A", "M", "A", "A", "X",
   "A", "S", "A", "A", "X", "X", "X", "S", "A", "A", "A", "A", "A", "A", "A", "X", ...],
  ["S", "A", "M", "X", "S", "A", "S", "X", "A", "S", "A", "A", "S", "M", "S", "M", "M", "M", "M",
   "M", "S", "X", "X", "S", "A", "A", "S", "M", "M", "M", "S", "M", "M", "M", ...],
  ["M", "A", "M", "X", "S", "S", "S", "M", "X", "M", "A", "M", "M", "A", "A", "X", "S", "X", "M",
   "X", "X", "X", "X", "M", "X", "M", "M", "A", "S", "A", "X", "X", "S", ...],
  ["S", "S", "M", "M", "M", "A", "X", "A", "M", "X", "M", "M", "M", "M", "M", "M", "M", "A", "X",
   "A", "X", "S", "S", "M", "M", "X", "S", "A", "M", "X", "M", "M", ...],
  ["M", "A", "S", "X", "M", "M", "M", "X", "A", "A", "M", "A", "X", "M", "A", "S", "M", "M", "M",
   "X", "S", "A", "A", "A", "A", "X", "M", "A", "M", "X", "M", ...],
  ["S", "A", "M", "X", "M", "X", "M", "X", "S", "X", "S", "A", "M", "A", "A", "A", "A", "A", "A",
   "X", "A", "M", "M", "M", "M", "X", "A", "X", "M", "A", ...],
  ["M", "A", "S", "A", "S", "A", "S", "M", "M", "A", "S", "M", "S", "M", "M", "X", "S", "M", "M",
   "X", "M", "X", "M", "M", "M", "M", "M", "M", "M", ...],
  ["M", "X", "S", "A", "S", "A", "M", "A", "X", "A", "X", "X", "A", "X", "M", "X", "M", "A", "M",
   "X", "M", "A", "X", "S", "A", "A", "X", "A", ...],
  ["X", "X", "M", "M", "M", "M", "S", "S", "M", "M", "S", "S", "M", "X", "X", "A", "X", "M", "A",
   "X", "X", "A", "X", "X", "X", "M", "X", ...],
  ["X", "M", "A", "S", "A", "M", "X", "M", "A", "X", "A", "A", "A", "A", "M", "S", "M", "S", "M",
   "S", "M", "S", "X", "S", "A", "S", ...],
  ["X", "S", "A", "M", "X", "S", "A", "S", "M", "M", "M", "S", "M", "M", "M", "X", "A", "A", "A",
   "X", "A", "A", "A", "X", "A", ...],
  ["M", "M", "A", "S", "X", "M", "A", "S", "X", "A", "X", "A", "X", "X", "A", "M", "S", "M", "S",
   "M", "S", "M", "A", "M", ...],
  ["A", "X", "A", "M", "A", "M", "A", "M", "M", "S", "X", "M", "S", "M", "S", "M", "A", "X", "X",
   "A", "X", "X", "M", ...],
  ["S", "M", "S", "S", "M", "M", "A", "S", "X", "M", "A", "X", "X", "A", "A", "X", "M", "S", "M",
   "X", "M", "A", ...],
  ["X", "M", "A", "A", "A", "S", "X", "S", "A", "S", "A", "M", "M", "S", "M", "X", "S", "A", "X",
   "A", "X", ...],
  ["M", "M", "M", "S", "M", "M", "X", "M", "M", "M", "M", "M", "X", "X", "A", "X", "S", "A", "M",
   "M", ...],
  ["S", "A", "A", "X", "A", "M", "A", "M", "X", "A", "M", "X", "X", "M", "S", "M", "M", "A", "M",
   ...],
  ["M", "M", "X", "S", "A", "M", "A", "X", "S", "A", "S", "A", "M", "X", "X", "A", "S", "A", ...],
  ["X", "X", "A", "S", "A", "M", "A", "M", "X", "X", "M", "A", "S", "A", "S", "M", "S", ...],
  ["S", "M", "M", "S", "X", "M", "M", "M", "S", "M", "S", "X", "M", "A", "S", "A", ...],
  ["S", "A", "X", "X", "M", "A", "M", "A", "A", "A", "S", "M", "M", "A", "M", ...],
  ["S", "X", "M", "A", "S", "A", "M", "S", "S", "M", "M", "S", "M", "X", ...],
  ["M", "A", "M", "X", "M", "A", "M", "A", "A", "A", "A", "S", "X", ...],
  ["S", "A", "M", "X", "S", "S", "M", "S", "S", "M", "M", "S", ...],
  ["S", "A", "S", "A", "A", "A", "A", "A", "A", "M", "X", ...],
  ["S", "A", "M", "X", "S", "M", "M", "S", "S", "M", ...],
  ["M", "X", "M", "X", "X", "X", "M", "X", "M", ...],
  ["S", "M", "M", "M", "X", "M", "M", "A", ...],
  ["A", "A", "A", "A", "A", "X", "S", ...],
  ["S", "S", "M", "X", "M", "X", ...],
  ["M", "A", "A", "A", "S", ...],
  ["M", "M", "M", "M", ...],
  ["S", "A", "S", ...],
  ["S", "A", ...],
  ["M", ...],
  [...],
  ...
]
Enum.map(0..9, fn col ->
  Enum.map(9..col, fn row ->
    {row, 9-row+col}
  end)
end)
[
  [{9, 0}, {8, 1}, {7, 2}, {6, 3}, {5, 4}, {4, 5}, {3, 6}, {2, 7}, {1, 8}, {0, 9}],
  [{9, 1}, {8, 2}, {7, 3}, {6, 4}, {5, 5}, {4, 6}, {3, 7}, {2, 8}, {1, 9}],
  [{9, 2}, {8, 3}, {7, 4}, {6, 5}, {5, 6}, {4, 7}, {3, 8}, {2, 9}],
  [{9, 3}, {8, 4}, {7, 5}, {6, 6}, {5, 7}, {4, 8}, {3, 9}],
  [{9, 4}, {8, 5}, {7, 6}, {6, 7}, {5, 8}, {4, 9}],
  [{9, 5}, {8, 6}, {7, 7}, {6, 8}, {5, 9}],
  [{9, 6}, {8, 7}, {7, 8}, {6, 9}],
  [{9, 7}, {8, 8}, {7, 9}],
  [{9, 8}, {8, 9}],
  [{9, 9}]
]
Enum.map(0..9, fn col ->
  Enum.map(9..col//-1, fn row ->
    {row-col, 9-row}
    end)
  end)
[
  [{9, 0}, {8, 1}, {7, 2}, {6, 3}, {5, 4}, {4, 5}, {3, 6}, {2, 7}, {1, 8}, {0, 9}],
  [{8, 0}, {7, 1}, {6, 2}, {5, 3}, {4, 4}, {3, 5}, {2, 6}, {1, 7}, {0, 8}],
  [{7, 0}, {6, 1}, {5, 2}, {4, 3}, {3, 4}, {2, 5}, {1, 6}, {0, 7}],
  [{6, 0}, {5, 1}, {4, 2}, {3, 3}, {2, 4}, {1, 5}, {0, 6}],
  [{5, 0}, {4, 1}, {3, 2}, {2, 3}, {1, 4}, {0, 5}],
  [{4, 0}, {3, 1}, {2, 2}, {1, 3}, {0, 4}],
  [{3, 0}, {2, 1}, {1, 2}, {0, 3}],
  [{2, 0}, {1, 1}, {0, 2}],
  [{1, 0}, {0, 1}],
  [{0, 0}]
]

solve2

Kino.Input.read(input)
|> Day4.solve2()
MAS: [{7, 3}, {53, 3}, {84, 3}, {92, 3}, {114, 3}, {125, 3}, {137, 3}]
MAS: [
  {6, 3},
  {10, 3},
  {43, 3},
  {48, 3},
  {56, 3},
  {65, 3},
  {69, 3},
  {80, 3},
  {114, 3},
  {121, 3}
]
MAS: [{35, 3}, {63, 3}, {66, 3}, {74, 3}, {91, 3}]
MAS: [
  {10, 3},
  {14, 3},
  {20, 3},
  {25, 3},
  {43, 3},
  {75, 3},
  {78, 3},
  {82, 3},
  {99, 3},
  {109, 3}
]
MAS: [
  {11, 3},
  {16, 3},
  {29, 3},
  {36, 3},
  {61, 3},
  {66, 3},
  {72, 3},
  {86, 3},
  {98, 3},
  {125, 3}
]
MAS: [{19, 3}, {35, 3}, {94, 3}, {122, 3}]
MAS: [{4, 3}, {9, 3}, {49, 3}, {69, 3}, {78, 3}, {91, 3}]
MAS: [
  {15, 3},
  {32, 3},
  {38, 3},
  {54, 3},
  {58, 3},
  {63, 3},
  {71, 3},
  {99, 3},
  {133, 3}
]
MAS: [
  {27, 3},
  {38, 3},
  {43, 3},
  {47, 3},
  {66, 3},
  {84, 3},
  {88, 3},
  {95, 3},
  {106, 3},
  {125, 3}
]
MAS: [
  {1, 3},
  {10, 3},
  {21, 3},
  {57, 3},
  {74, 3},
  {84, 3},
  {99, 3},
  {116, 3},
  {130, 3}
]
MAS: [{31, 3}, {37, 3}, {47, 3}, {53, 3}, {67, 3}, {76, 3}, {81, 3}, {109, 3}]
MAS: [
  {2, 3},
  {10, 3},
  {21, 3},
  {38, 3},
  {54, 3},
  {83, 3},
  {91, 3},
  {103, 3},
  {115, 3}
]
MAS: [
  {20, 3},
  {25, 3},
  {41, 3},
  {54, 3},
  {58, 3},
  {91, 3},
  {106, 3},
  {121, 3},
  {130, 3}
]
MAS: [
  {5, 3},
  {21, 3},
  {38, 3},
  {47, 3},
  {59, 3},
  {75, 3},
  {104, 3},
  {109, 3},
  {131, 3}
]
MAS: [{23, 3}, {27, 3}, {32, 3}, {39, 3}, {45, 3}, {61, 3}, {72, 3}, {97, 3}]
MAS: [{3, 3}, {21, 3}, {54, 3}, {67, 3}, {76, 3}, {83, 3}]
MAS: [
  {4, 3},
  {9, 3},
  {13, 3},
  {27, 3},
  {43, 3},
  {101, 3},
  {108, 3},
  {111, 3},
  {115, 3}
]
MAS: [{10, 3}, {64, 3}, {71, 3}, {78, 3}, {92, 3}, {104, 3}]
MAS: [{3, 3}, {27, 3}, {30, 3}, {33, 3}, {51, 3}, {85, 3}]
MAS: [
  {13, 3},
  {26, 3},
  {39, 3},
  {54, 3},
  {67, 3},
  {70, 3},
  {73, 3},
  {83, 3},
  {111, 3},
  {123, 3}
]
MAS: [{1, 3}, {18, 3}, {25, 3}, {49, 3}, {108, 3}, {117, 3}]
MAS: [{4, 3}, {21, 3}, {26, 3}, {50, 3}, {84, 3}, {97, 3}, {104, 3}, {116, 3}]
MAS: [{1, 3}, {28, 3}, {41, 3}, {66, 3}, {81, 3}, {100, 3}, {123, 3}]
MAS: [
  {31, 3},
  {43, 3},
  {49, 3},
  {54, 3},
  {73, 3},
  {77, 3},
  {83, 3},
  {101, 3},
  {111, 3}
]
MAS: [{3, 3}, {9, 3}, {63, 3}, {68, 3}, {80, 3}, {113, 3}, {119, 3}]
MAS: [
  {10, 3},
  {14, 3},
  {19, 3},
  {27, 3},
  {36, 3},
  {60, 3},
  {66, 3},
  {69, 3},
  {73, 3},
  {81, 3},
  {100, 3},
  {106, 3},
  {114, 3},
  {120, 3}
]
MAS: [{17, 3}, {35, 3}, {68, 3}, {106, 3}, {114, 3}, {119, 3}, {123, 3}]
MAS: [
  {3, 3},
  {8, 3},
  {27, 3},
  {36, 3},
  {46, 3},
  {50, 3},
  {54, 3},
  {60, 3},
  {64, 3},
  {75, 3},
  {85, 3},
  {105, 3},
  {113, 3}
]
MAS: [{3, 3}, {29, 3}, {35, 3}, {42, 3}, {54, 3}, {106, 3}]
MAS: [{6, 3}, {29, 3}, {39, 3}, {46, 3}, {79, 3}, {83, 3}, {97, 3}, {118, 3}]
MAS: [{13, 3}, {33, 3}, {43, 3}, {66, 3}, {76, 3}, {91, 3}]
MAS: [
  {1, 3},
  {29, 3},
  {34, 3},
  {44, 3},
  {58, 3},
  {62, 3},
  {71, 3},
  {81, 3},
  {91, 3},
  {94, 3},
  {111, 3},
  {121, 3}
]
MAS: [{11, 3}, {51, 3}, {55, 3}, {58, 3}, {75, 3}, {85, 3}, {89, 3}, {121, 3}]
MAS: [
  {2, 3},
  {6, 3},
  {9, 3},
  {39, 3},
  {42, 3},
  {48, 3},
  {59, 3},
  {77, 3},
  {81, 3},
  {108, 3},
  {115, 3},
  {121, 3}
]
MAS: [
  {5, 3},
  {11, 3},
  {21, 3},
  {37, 3},
  {76, 3},
  {79, 3},
  {86, 3},
  {102, 3},
  {109, 3}
]
MAS: [
  {3, 3},
  {9, 3},
  {13, 3},
  {16, 3},
  {26, 3},
  {37, 3},
  {56, 3},
  {65, 3},
  {71, 3},
  {87, 3},
  {94, 3},
  {107, 3}
]
MAS: [{11, 3}, {29, 3}, {36, 3}, {98, 3}]
MAS: [
  {7, 3},
  {13, 3},
  {30, 3},
  {39, 3},
  {46, 3},
  {59, 3},
  {66, 3},
  {81, 3},
  {88, 3},
  {92, 3},
  {106, 3},
  {110, 3},
  {113, 3},
  {118, 3}
]
MAS: [{13, 3}, {19, 3}, {52, 3}, {55, 3}, {70, 3}, {76, 3}, {105, 3}, {115, 3}]
MAS: [
  {1, 3},
  {9, 3},
  {26, 3},
  {46, 3},
  {50, 3},
  {71, 3},
  {84, 3},
  {87, 3},
  {103, 3},
  {118, 3}
]
MAS: [{18, 3}, {31, 3}, {46, 3}, {51, 3}, {67, 3}, {71, 3}, {102, 3}, {108, 3}]
MAS: [{0, 3}, {5, 3}, {11, 3}, {48, 3}, {52, 3}, {64, 3}, {92, 3}]
MAS: [{3, 3}, {11, 3}, {32, 3}, {48, 3}, {53, 3}, {97, 3}, {105, 3}, {109, 3}]
MAS: [{35, 3}, {61, 3}, {72, 3}, {80, 3}, {87, 3}, {94, 3}]
MAS: [{8, 3}, {18, 3}, {35, 3}, {43, 3}, {59, 3}, {71, 3}, {81, 3}]
MAS: [
  {21, 3},
  {40, 3},
  {50, 3},
  {54, 3},
  {58, 3},
  {61, 3},
  {84, 3},
  {89, 3},
  {92, 3},
  {95, 3},
  {109, 3}
]
MAS: [{9, 3}, {19, 3}, {26, 3}, {55, 3}, {58, 3}, {64, 3}, {67, 3}, {86, 3}]
MAS: [{2, 3}, {26, 3}, {30, 3}, {42, 3}, {61, 3}, {84, 3}, {103, 3}]
MAS: [{4, 3}, {18, 3}, {61, 3}, {69, 3}, {75, 3}, {87, 3}, {92, 3}, {108, 3}]
MAS: [
  {15, 3},
  {19, 3},
  {28, 3},
  {42, 3},
  {46, 3},
  {56, 3},
  {63, 3},
  {81, 3},
  {84, 3},
  {87, 3},
  {93, 3},
  {100, 3}
]
MAS: [{30, 3}, {40, 3}, {70, 3}, {74, 3}, {88, 3}, {97, 3}, {112, 3}]
MAS: [
  {13, 3},
  {30, 3},
  {50, 3},
  {54, 3},
  {66, 3},
  {74, 3},
  {99, 3},
  {105, 3},
  {110, 3}
]
MAS: [{0, 3}, {4, 3}, {18, 3}, {48, 3}, {73, 3}, {101, 3}]
MAS: [
  {0, 3},
  {3, 3},
  {8, 3},
  {34, 3},
  {42, 3},
  {50, 3},
  {72, 3},
  {78, 3},
  {81, 3},
  {84, 3}
]
MAS: [
  {0, 3},
  {5, 3},
  {9, 3},
  {28, 3},
  {41, 3},
  {44, 3},
  {50, 3},
  {68, 3},
  {72, 3},
  {95, 3}
]
MAS: [
  {1, 3},
  {20, 3},
  {26, 3},
  {40, 3},
  {45, 3},
  {58, 3},
  {74, 3},
  {86, 3},
  {93, 3},
  {108, 3}
]
MAS: [{15, 3}, {65, 3}, {99, 3}, {109, 3}]
MAS: [{8, 3}, {24, 3}, {42, 3}, {54, 3}, {59, 3}, {109, 3}]
MAS: [{30, 3}, {46, 3}, {58, 3}, {61, 3}, {70, 3}, {86, 3}, {105, 3}]
MAS: [{7, 3}, {28, 3}, {36, 3}, {70, 3}, {80, 3}, {97, 3}]
MAS: [
  {33, 3},
  {39, 3},
  {42, 3},
  {50, 3},
  {65, 3},
  {76, 3},
  {83, 3},
  {90, 3},
  {94, 3}
]
MAS: [{27, 3}, {76, 3}, {88, 3}, {99, 3}]
MAS: [{7, 3}, {13, 3}, {41, 3}, {52, 3}, {56, 3}, {101, 3}, {105, 3}]
MAS: [{3, 3}, {19, 3}, {33, 3}, {40, 3}, {45, 3}, {56, 3}, {73, 3}, {89, 3}, {97, 3}]
MAS: [{2, 3}, {6, 3}, {9, 3}, {16, 3}, {78, 3}, {81, 3}]
MAS: [{10, 3}, {22, 3}, {29, 3}, {48, 3}, {69, 3}, {72, 3}, {94, 3}, {101, 3}]
MAS: [{14, 3}, {17, 3}, {36, 3}, {42, 3}, {61, 3}, {69, 3}, {79, 3}, {90, 3}]
MAS: [{1, 3}, {9, 3}, {21, 3}, {30, 3}, {60, 3}, {93, 3}]
MAS: [{11, 3}, {26, 3}, {29, 3}, {38, 3}, {43, 3}, {46, 3}, {59, 3}, {84, 3}]
MAS: [{30, 3}, {46, 3}, {49, 3}, {53, 3}, {72, 3}]
MAS: [{27, 3}, {57, 3}, {64, 3}, {75, 3}, {85, 3}]
MAS: [{36, 3}, {60, 3}, {68, 3}, {73, 3}, {77, 3}, {96, 3}, {99, 3}, {102, 3}]
MAS: [{16, 3}, {59, 3}, {71, 3}, {91, 3}]
MAS: [{4, 3}, {8, 3}, {12, 3}, {28, 3}, {90, 3}]
MAS: [{13, 3}, {18, 3}, {29, 3}, {62, 3}]
MAS: [{2, 3}, {15, 3}, {21, 3}, {36, 3}, {41, 3}, {69, 3}, {75, 3}]
MAS: [{2, 3}, {9, 3}, {20, 3}, {24, 3}, {75, 3}, {87, 3}]
MAS: [
  {5, 3},
  {10, 3},
  {14, 3},
  {26, 3},
  {37, 3},
  {40, 3},
  {52, 3},
  {55, 3},
  {60, 3},
  {66, 3},
  {69, 3},
  {77, 3},
  {88, 3}
]
MAS: [{38, 3}, {44, 3}, {53, 3}, {81, 3}, {89, 3}, {98, 3}]
MAS: [{2, 3}, {41, 3}, {58, 3}, {92, 3}, {98, 3}]
MAS: [{6, 3}, {12, 3}, {20, 3}, {28, 3}, {54, 3}, {79, 3}, {87, 3}, {92, 3}]
MAS: [{24, 3}, {61, 3}, {75, 3}, {79, 3}, {97, 3}]
MAS: [{21, 3}, {34, 3}, {46, 3}, {51, 3}, {57, 3}, {62, 3}, {65, 3}, {89, 3}]
MAS: [{11, 3}, {19, 3}, {48, 3}, {73, 3}, {77, 3}, {85, 3}, {90, 3}, {96, 3}]
MAS: [{10, 3}, {28, 3}, {50, 3}, {66, 3}, {71, 3}, {92, 3}]
MAS: [{20, 3}, {37, 3}, {40, 3}, {69, 3}, {80, 3}, {83, 3}, {93, 3}]
MAS: [
  {1, 3},
  {14, 3},
  {17, 3},
  {36, 3},
  {46, 3},
  {58, 3},
  {62, 3},
  {70, 3},
  {83, 3},
  {94, 3}
]
MAS: [{5, 3}, {22, 3}, {34, 3}, {52, 3}, {56, 3}, {88, 3}]
MAS: [{18, 3}, {48, 3}, {56, 3}, {77, 3}]
MAS: [
  {5, 3},
  {18, 3},
  {43, 3},
  {49, 3},
  {56, 3},
  {60, 3},
  {63, 3},
  {70, 3},
  {80, 3},
  {83, 3},
  {86, 3}
]
MAS: [{4, 3}, {28, 3}, {49, 3}, {81, 3}, {85, 3}]
MAS: [{15, 3}, {22, 3}, {32, 3}, {36, 3}, {48, 3}, {67, 3}, {78, 3}]
MAS: [{5, 3}, {16, 3}, {51, 3}, {65, 3}, {78, 3}]
MAS: [{4, 3}, {11, 3}, {63, 3}, {70, 3}, {84, 3}]
MAS: [{6, 3}, {17, 3}, {28, 3}, {66, 3}]
MAS: [{1, 3}, {15, 3}, {19, 3}, {27, 3}, {33, 3}, {43, 3}, {54, 3}, {60, 3}, {71, 3}]
MAS: [{1, 3}, {21, 3}, {60, 3}, {63, 3}, {71, 3}, {83, 3}]
MAS: [{11, 3}, {14, 3}, {22, 3}, {59, 3}, {63, 3}, {66, 3}, {82, 3}]
MAS: [{2, 3}, {22, 3}, {26, 3}, {33, 3}, {59, 3}, {67, 3}, {80, 3}]
MAS: [{1, 3}, {4, 3}, {57, 3}, {60, 3}, {64, 3}, {76, 3}, {88, 3}]
MAS: [{1, 3}, {8, 3}, {11, 3}, {35, 3}, {43, 3}, {69, 3}, {76, 3}]
MAS: [{0, 3}, {16, 3}, {24, 3}, {30, 3}, {66, 3}, {84, 3}]
MAS: [{0, 3}, {24, 3}, {46, 3}, {50, 3}, {62, 3}, {67, 3}, {71, 3}, {75, 3}]
MAS: [{1, 3}, {13, 3}, {17, 3}, {32, 3}, {44, 3}, {52, 3}, {60, 3}, {74, 3}]
MAS: [{17, 3}, {32, 3}, {76, 3}, {85, 3}]
MAS: [{7, 3}, {49, 3}, {70, 3}, {79, 3}]
MAS: [{5, 3}, {24, 3}, {40, 3}, {58, 3}, {64, 3}, {67, 3}]
MAS: [{8, 3}, {13, 3}, {30, 3}, {50, 3}, {55, 3}, {58, 3}, {84, 3}]
MAS: [
  {10, 3},
  {13, 3},
  {23, 3},
  {27, 3},
  {41, 3},
  {45, 3},
  {49, 3},
  {53, 3},
  {62, 3},
  {65, 3}
]
MAS: [{2, 3}, {14, 3}, {25, 3}, {40, 3}, {51, 3}, {58, 3}, {64, 3}, {82, 3}]
MAS: [{3, 3}, {21, 3}, {38, 3}, {50, 3}, {67, 3}, {78, 3}, {81, 3}]
MAS: [{24, 3}, {42, 3}, {46, 3}, {68, 3}]
MAS: [{28, 3}, {34, 3}]
MAS: [{10, 3}, {16, 3}, {28, 3}, {38, 3}, {51, 3}, {62, 3}, {73, 3}]
MAS: [{6, 3}, {36, 3}, {42, 3}, {67, 3}]
MAS: [{1, 3}, {11, 3}, {24, 3}, {28, 3}, {36, 3}, {42, 3}, {53, 3}, {69, 3}]
MAS: [{6, 3}, {13, 3}, {19, 3}, {23, 3}, {26, 3}]
MAS: [{13, 3}, {16, 3}, {30, 3}, {39, 3}, {64, 3}, {68, 3}, {71, 3}]
MAS: [{13, 3}, {18, 3}, {25, 3}, {34, 3}, {57, 3}]
MAS: [{5, 3}, {24, 3}, {34, 3}, {40, 3}, {58, 3}, {63, 3}, {67, 3}, {72, 3}]
MAS: [{6, 3}, {38, 3}]
MAS: [{2, 3}, {6, 3}, {19, 3}, {31, 3}, {37, 3}, {54, 3}, {62, 3}, {75, 3}]
MAS: [{2, 3}, {9, 3}, {60, 3}, {67, 3}]
MAS: [{2, 3}, {14, 3}, {60, 3}, {72, 3}]
MAS: [{6, 3}, {30, 3}, {34, 3}, {44, 3}, {48, 3}, {54, 3}, {71, 3}, {75, 3}]
MAS: [{11, 3}, {25, 3}, {29, 3}, {39, 3}, {43, 3}, {71, 3}]
MAS: []
MAS: [{16, 3}, {19, 3}, {22, 3}, {27, 3}, {39, 3}, {50, 3}, {57, 3}, {72, 3}]
MAS: [{19, 3}, {26, 3}, {54, 3}, {68, 3}]
MAS: [{1, 3}, {7, 3}, {17, 3}, {27, 3}, {31, 3}, {43, 3}]
MAS: [{8, 3}, {24, 3}, {40, 3}, {47, 3}, {50, 3}, {60, 3}]
MAS: [{10, 3}, {39, 3}, {44, 3}, {55, 3}]
MAS: [{4, 3}, {10, 3}, {21, 3}, {26, 3}, {34, 3}, {45, 3}, {50, 3}]
MAS: [{11, 3}, {19, 3}, {43, 3}, {54, 3}, {63, 3}]
MAS: [{4, 3}, {15, 3}, {45, 3}, {52, 3}, {62, 3}]
MAS: [{1, 3}, {16, 3}, {23, 3}, {41, 3}, {44, 3}, {53, 3}, {58, 3}, {61, 3}, {68, 3}]
MAS: [{2, 3}, {8, 3}, {12, 3}, {19, 3}, {28, 3}, {34, 3}, {48, 3}, {66, 3}]
MAS: [{9, 3}, {24, 3}, {45, 3}, {48, 3}, {52, 3}]
MAS: [{6, 3}, {10, 3}, {23, 3}, {54, 3}, {60, 3}, {65, 3}]
MAS: [{12, 3}, {18, 3}, {33, 3}]
MAS: [{4, 3}, {26, 3}, {40, 3}, {50, 3}, {64, 3}]
MAS: [{15, 3}, {25, 3}, {39, 3}, {50, 3}, {54, 3}, {57, 3}, {65, 3}]
MAS: [{45, 3}, {48, 3}, {65, 3}]
MAS: [{34, 3}, {46, 3}]
MAS: [{8, 3}, {13, 3}]
MAS: [{1, 3}, {6, 3}, {20, 3}, {30, 3}, {41, 3}, {65, 3}]
MAS: [{0, 3}, {6, 3}, {18, 3}, {22, 3}, {38, 3}, {60, 3}]
MAS: [{6, 3}, {19, 3}, {35, 3}, {62, 3}]
MAS: [{8, 3}, {33, 3}, {51, 3}]
MAS: [{6, 3}, {10, 3}, {20, 3}, {36, 3}, {44, 3}, {53, 3}]
MAS: [{18, 3}, {34, 3}, {46, 3}, {58, 3}]
MAS: [{14, 3}, {24, 3}, {46, 3}, {53, 3}, {56, 3}]
MAS: [{15, 3}, {25, 3}, {31, 3}, {41, 3}]
MAS: [{12, 3}, {44, 3}, {48, 3}, {60, 3}]
MAS: [{7, 3}, {11, 3}, {30, 3}, {44, 3}, {51, 3}, {56, 3}]
MAS: [{2, 3}, {20, 3}, {24, 3}, {38, 3}, {44, 3}, {47, 3}, {51, 3}, {56, 3}, {60, 3}]
MAS: [{1, 3}, {5, 3}, {25, 3}]
MAS: [{3, 3}, {14, 3}, {32, 3}, {37, 3}, {41, 3}]
MAS: [{20, 3}, {47, 3}, {54, 3}]
MAS: [{2, 3}, {21, 3}, {36, 3}, {44, 3}, {56, 3}]
MAS: [{1, 3}, {6, 3}, {16, 3}, {38, 3}]
MAS: [{1, 3}, {4, 3}, {7, 3}, {17, 3}, {29, 3}, {54, 3}]
MAS: [{29, 3}, {43, 3}, {52, 3}]
MAS: [{2, 3}, {11, 3}, {16, 3}, {47, 3}, {51, 3}, {56, 3}]
MAS: [{8, 3}, {12, 3}, {32, 3}, {51, 3}]
MAS: [{7, 3}, {12, 3}, {17, 3}, {29, 3}, {32, 3}, {41, 3}]
MAS: [{14, 3}, {35, 3}, {43, 3}, {50, 3}]
MAS: [{2, 3}, {17, 3}, {38, 3}, {48, 3}]
MAS: [{1, 3}, {6, 3}, {12, 3}, {51, 3}]
MAS: [{4, 3}, {8, 3}, {12, 3}, {21, 3}, {43, 3}, {50, 3}]
MAS: [{7, 3}, {20, 3}, {25, 3}, {31, 3}, {39, 3}, {52, 3}]
MAS: [{17, 3}, {25, 3}]
MAS: [{4, 3}, {8, 3}, {17, 3}]
MAS: [{32, 3}, {37, 3}, {41, 3}]
MAS: [{15, 3}]
MAS: [{2, 3}, {6, 3}, {17, 3}, {22, 3}, {28, 3}]
MAS: [{12, 3}, {27, 3}, {31, 3}]
MAS: [{11, 3}, {32, 3}, {35, 3}, {39, 3}, {45, 3}]
MAS: [{0, 3}, {8, 3}, {20, 3}, {46, 3}]
MAS: [{0, 3}, {12, 3}, {23, 3}, {38, 3}, {44, 3}]
MAS: [{12, 3}, {19, 3}, {25, 3}, {33, 3}, {39, 3}]
MAS: [{1, 3}, {12, 3}, {37, 3}, {40, 3}, {46, 3}]
MAS: [{2, 3}, {13, 3}, {18, 3}, {31, 3}, {46, 3}]
MAS: [{10, 3}, {40, 3}, {46, 3}]
MAS: [{5, 3}, {14, 3}, {20, 3}]
MAS: [{16, 3}, {38, 3}]
MAS: [{4, 3}, {9, 3}, {32, 3}]
MAS: [{8, 3}, {24, 3}, {30, 3}, {38, 3}]
MAS: [{12, 3}, {20, 3}, {35, 3}]
MAS: [{6, 3}, {17, 3}, {21, 3}, {29, 3}, {36, 3}, {40, 3}]
MAS: [{14, 3}, {38, 3}]
MAS: [{8, 3}, {22, 3}, {41, 3}]
MAS: [{1, 3}, {5, 3}]
MAS: [{18, 3}, {25, 3}, {38, 3}]
MAS: [{1, 3}, {5, 3}, {12, 3}, {16, 3}, {26, 3}, {34, 3}, {40, 3}]
MAS: [{4, 3}, {8, 3}, {12, 3}, {26, 3}, {33, 3}, {37, 3}]
MAS: [{5, 3}, {27, 3}, {36, 3}]
MAS: [{27, 3}, {36, 3}]
MAS: [{36, 3}]
MAS: [{0, 3}, {12, 3}, {18, 3}, {31, 3}, {35, 3}]
MAS: [{21, 3}, {29, 3}]
MAS: [{3, 3}, {14, 3}, {36, 3}]
MAS: [{10, 3}, {14, 3}]
MAS: [{12, 3}, {16, 3}, {24, 3}]
MAS: [{32, 3}, {35, 3}]
MAS: [{14, 3}, {19, 3}, {23, 3}]
MAS: [{10, 3}, {28, 3}]
MAS: [{4, 3}, {30, 3}]
MAS: []
MAS: [{3, 3}, {6, 3}, {14, 3}, {23, 3}, {31, 3}]
MAS: []
MAS: [{2, 3}, {17, 3}, {20, 3}]
MAS: [{28, 3}]
MAS: [{28, 3}]
MAS: [{19, 3}]
MAS: [{3, 3}, {6, 3}]
MAS: [{6, 3}, {9, 3}, {16, 3}, {23, 3}]
MAS: [{4, 3}, {11, 3}, {18, 3}]
MAS: [{19, 3}]
MAS: [{1, 3}, {4, 3}, {11, 3}, {18, 3}]
MAS: [{9, 3}, {26, 3}]
MAS: [{16, 3}]
MAS: [{4, 3}, {15, 3}, {20, 3}]
MAS: [{2, 3}, {9, 3}]
MAS: [{2, 3}, {15, 3}, {21, 3}]
MAS: [{2, 3}, {18, 3}, {21, 3}]
MAS: []
MAS: [{0, 3}, {19, 3}]
MAS: []
MAS: [{19, 3}]
MAS: [{1, 3}, {18, 3}]
MAS: []
MAS: [{2, 3}, {6, 3}, {10, 3}]
MAS: [{0, 3}, {6, 3}, {9, 3}]
MAS: [{1, 3}, {4, 3}]
MAS: [{2, 3}, {7, 3}, {14, 3}]
MAS: [{2, 3}, {13, 3}]
MAS: [{4, 3}, {15, 3}, {19, 3}]
MAS: []
MAS: [{16, 3}]
MAS: [{9, 3}]
MAS: [{6, 3}]
MAS: []
MAS: [{4, 3}, {14, 3}]
MAS: [{14, 3}]
MAS: [{8, 3}, {13, 3}]
MAS: [{6, 3}]
MAS: [{6, 3}]
MAS: [{0, 3}, {10, 3}]
MAS: [{9, 3}]
MAS: [{8, 3}]
MAS: [{2, 3}, {6, 3}, {10, 3}]
MAS: []
MAS: [{9, 3}]
MAS: [{10, 3}]
MAS: [{7, 3}, {10, 3}]
MAS: []
MAS: [{0, 3}, {3, 3}]
MAS: [{3, 3}]
MAS: []
MAS: [{0, 3}]
MAS: [{5, 3}]
MAS: [{6, 3}]
MAS: [{3, 3}]
MAS: []
MAS: []
MAS: []
MAS: [{0, 3}]
MAS: []
MAS: []
MAS: [{2, 3}]
MAS: []
MAS: []
MAS: []
MAS: []
MAS: [{0, 3}]
2595
Regex.scan(~r/X.*MAS|SAMX/, "HALXAMASo")
[["XAMAS"]]
grid = [
  ["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"]
]
[
  ["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"]
]