From f2204e554bf8b1fa7fdfa2a19ccc867d8f3756a8 Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Thu, 4 Dec 2025 09:29:39 +0100 Subject: [PATCH] Moderately cursed 2025 day 4 part 1 --- 2025/day04/README.md | 11 ++++++++++ 2025/day04/sample.txt | 10 +++++++++ 2025/day04/solve.sql | 47 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 68 insertions(+) create mode 100644 2025/day04/README.md create mode 100644 2025/day04/sample.txt create mode 100644 2025/day04/solve.sql diff --git a/2025/day04/README.md b/2025/day04/README.md new file mode 100644 index 0000000..a3979df --- /dev/null +++ b/2025/day04/README.md @@ -0,0 +1,11 @@ +# Day 04: SQLite sql + +Did you know SQLite does not have procedural extensions? I did not when I started this. Regardless, +to run: + +```console +$ sqlite3 < solve.sql +part1 +----- +13 +``` diff --git a/2025/day04/sample.txt b/2025/day04/sample.txt new file mode 100644 index 0000000..8209399 --- /dev/null +++ b/2025/day04/sample.txt @@ -0,0 +1,10 @@ +..@@.@@@@. +@@@.@.@.@@ +@@@@@.@.@@ +@.@@@@..@. +@@.@@@@.@@ +.@@@@@@@.@ +.@.@.@.@@@ +@.@@@.@@@@ +.@@@@@@@@. +@.@.@@@.@. diff --git a/2025/day04/solve.sql b/2025/day04/solve.sql new file mode 100644 index 0000000..b4bf4cc --- /dev/null +++ b/2025/day04/solve.sql @@ -0,0 +1,47 @@ +-- First import raw data into a table so we can work +CREATE TABLE raw_data(line_data VARCHAR NOT NULL); +.import --csv './sample.txt' raw_data +-- Then use the auto-incrementing ID to add a y coordinate +CREATE TABLE grid_lines( + y INTEGER PRIMARY KEY, + line_data VARCHAR NOT NULL +); +INSERT INTO grid_lines(line_data) +SELECT line_data +FROM raw_data; +-- Now create a table to hold the paper rolls +CREATE TABLE rolls( + x INTEGER NOT NULL, + y INTEGER NOT NULL, + PRIMARY KEY (x, y) +); +WITH RECURSIVE cte AS ( + SELECT y, + 1 x, + line_data, + substr(line_data, 1, 1) c + FROM grid_lines + UNION ALL + SELECT y, + x + 1, + line_data, + substr(line_data, x + 1, 1) + FROM cte + WHERE x <= length(line_data) +) +INSERT INTO rolls +SELECT x, + y +FROM cte +WHERE c = '@'; +-- Now compute part 1 +SELECT COUNT(*) as part1 +FROM rolls r +WHERE ( + SELECT COUNT(*) - 1 + FROM rolls o + WHERE o.x >= r.x - 1 + AND o.x <= r.x + 1 + AND o.y >= r.y - 1 + AND o.y <= r.y + 1 + ) < 4;