From cbbd95f7ab5756279cd547e0a5d31f141f786b42 Mon Sep 17 00:00:00 2001
From: WanCW <contact@wancw.idv.tw>
Date: Wed, 4 Dec 2024 13:48:31 +0800
Subject: [PATCH] complete day 4 in straightforward way

---
 04-a.kts | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 04-b.kts | 47 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 106 insertions(+)
 create mode 100644 04-a.kts
 create mode 100644 04-b.kts

diff --git a/04-a.kts b/04-a.kts
new file mode 100644
index 0000000..672ec67
--- /dev/null
+++ b/04-a.kts
@@ -0,0 +1,59 @@
+import java.util.Scanner
+
+val scanner = Scanner(System.`in`)
+
+val matrix = ArrayList<CharArray>()
+
+while (scanner.hasNextLine()) {
+    val line = scanner.nextLine()
+    matrix.add(line.toCharArray())
+}
+
+var count = 0
+
+matrix.forEachIndexed { row, line ->
+    line.forEachIndexed { col, char ->
+        count += searchFrom(matrix, row, col)
+    }
+}
+println(count)
+
+fun searchFrom(matrix: ArrayList<CharArray>, row: Int, col: Int): Int {
+    return (if (safeCheckMatrix(matrix, row, col, 'X')
+        && safeCheckMatrix(matrix, row, col + 1, 'M')
+        && safeCheckMatrix(matrix, row, col + 2, 'A')
+        && safeCheckMatrix(matrix, row, col + 3, 'S')
+    ) 1 else 0) + (if (safeCheckMatrix(matrix, row, col, 'X')
+        && safeCheckMatrix(matrix, row, col - 1, 'M')
+        && safeCheckMatrix(matrix, row, col - 2, 'A')
+        && safeCheckMatrix(matrix, row, col - 3, 'S')
+    ) 1 else 0) + (if (safeCheckMatrix(matrix, row, col, 'X')
+        && safeCheckMatrix(matrix, row + 1, col + 1, 'M')
+        && safeCheckMatrix(matrix, row + 2, col + 2, 'A')
+        && safeCheckMatrix(matrix, row + 3, col + 3, 'S')
+    ) 1 else 0) + (if (safeCheckMatrix(matrix, row, col, 'X')
+        && safeCheckMatrix(matrix, row + 1, col, 'M')
+        && safeCheckMatrix(matrix, row + 2, col, 'A')
+        && safeCheckMatrix(matrix, row + 3, col, 'S')
+    ) 1 else 0) + (if (safeCheckMatrix(matrix, row, col, 'X')
+        && safeCheckMatrix(matrix, row + 1, col - 1, 'M')
+        && safeCheckMatrix(matrix, row + 2, col - 2, 'A')
+        && safeCheckMatrix(matrix, row + 3, col - 3, 'S')
+    ) 1 else 0) + (if (safeCheckMatrix(matrix, row, col, 'X')
+        && safeCheckMatrix(matrix, row - 1, col + 1, 'M')
+        && safeCheckMatrix(matrix, row - 2, col + 2, 'A')
+        && safeCheckMatrix(matrix, row - 3, col + 3, 'S')
+    ) 1 else 0) + (if (safeCheckMatrix(matrix, row, col, 'X')
+        && safeCheckMatrix(matrix, row - 1, col, 'M')
+        && safeCheckMatrix(matrix, row - 2, col, 'A')
+        && safeCheckMatrix(matrix, row - 3, col, 'S')
+    ) 1 else 0) + (if (safeCheckMatrix(matrix, row, col, 'X')
+        && safeCheckMatrix(matrix, row - 1, col - 1, 'M')
+        && safeCheckMatrix(matrix, row - 2, col - 2, 'A')
+        && safeCheckMatrix(matrix, row - 3, col - 3, 'S')
+    ) 1 else 0)
+}
+
+fun safeCheckMatrix(matrix: ArrayList<CharArray>, row: Int, col: Int, target: Char): Boolean {
+    return row in matrix.indices && col in matrix[row].indices && matrix[row][col] == target
+}
\ No newline at end of file
diff --git a/04-b.kts b/04-b.kts
new file mode 100644
index 0000000..a8cfe20
--- /dev/null
+++ b/04-b.kts
@@ -0,0 +1,47 @@
+import java.util.*
+
+val scanner = Scanner(System.`in`)
+
+val matrix = ArrayList<CharArray>()
+
+while (scanner.hasNextLine()) {
+    val line = scanner.nextLine()
+    matrix.add(line.toCharArray())
+}
+
+var count = 0
+
+matrix.forEachIndexed { row, line ->
+    line.forEachIndexed { col, char ->
+        count += searchFrom(matrix, row, col)
+    }
+}
+println(count)
+
+fun searchFrom(matrix: ArrayList<CharArray>, row: Int, col: Int): Int {
+    return (if (safeCheckMatrix(matrix, row, col, 'A') &&
+        safeCheckMatrix(matrix, row - 1, col - 1, 'M') &&
+        safeCheckMatrix(matrix, row - 1, col + 1, 'M') &&
+        safeCheckMatrix(matrix, row + 1, col - 1, 'S') &&
+        safeCheckMatrix(matrix, row + 1, col + 1, 'S')
+    ) 1 else 0) + (if (safeCheckMatrix(matrix, row, col, 'A') &&
+        safeCheckMatrix(matrix, row + 1, col - 1, 'M') &&
+        safeCheckMatrix(matrix, row + 1, col + 1, 'M') &&
+        safeCheckMatrix(matrix, row - 1, col - 1, 'S') &&
+        safeCheckMatrix(matrix, row - 1, col + 1, 'S')
+    ) 1 else 0) + (if (safeCheckMatrix(matrix, row, col, 'A') &&
+        safeCheckMatrix(matrix, row - 1, col - 1, 'M') &&
+        safeCheckMatrix(matrix, row + 1, col - 1, 'M') &&
+        safeCheckMatrix(matrix, row - 1, col + 1, 'S') &&
+        safeCheckMatrix(matrix, row + 1, col + 1, 'S')
+    ) 1 else 0) + (if (safeCheckMatrix(matrix, row, col, 'A') &&
+        safeCheckMatrix(matrix, row - 1, col + 1, 'M') &&
+        safeCheckMatrix(matrix, row + 1, col + 1, 'M') &&
+        safeCheckMatrix(matrix, row - 1, col - 1, 'S') &&
+        safeCheckMatrix(matrix, row + 1, col - 1, 'S')
+    ) 1 else 0)
+}
+
+fun safeCheckMatrix(matrix: ArrayList<CharArray>, row: Int, col: Int, target: Char): Boolean {
+    return row in matrix.indices && col in matrix[row].indices && matrix[row][col] == target
+}
\ No newline at end of file