diff --git a/2025/day02/README.md b/2025/day02/README.md
index 5c438d6..831fb84 100644
--- a/2025/day02/README.md
+++ b/2025/day02/README.md
@@ -1,4 +1,4 @@
-## Day 02: Terraform
+# Day 02: Terraform
The code assumes an input file at `../inputs/02.txt`. Other than that, simply try to run as follows:
diff --git a/2025/day03/README.md b/2025/day03/README.md
new file mode 100644
index 0000000..8ec7d41
--- /dev/null
+++ b/2025/day03/README.md
@@ -0,0 +1,4 @@
+# Day 03: Bash
+
+Simple as can be, simply run `./solve.sh ` and get both answers. While I allowed myself
+to use `coreutils` with bash, they turned out to be entirely unnecessary. Pure bash just works.
diff --git a/2025/day03/sample.txt b/2025/day03/sample.txt
new file mode 100644
index 0000000..7255fca
--- /dev/null
+++ b/2025/day03/sample.txt
@@ -0,0 +1,4 @@
+987654321111111
+811111111111119
+234234234234278
+818181911112111
diff --git a/2025/day03/solve.sh b/2025/day03/solve.sh
new file mode 100755
index 0000000..36e42ba
--- /dev/null
+++ b/2025/day03/solve.sh
@@ -0,0 +1,64 @@
+#!/bin/bash
+
+if [[ $# -lt 1 ]]; then
+ echo "Usage: $0 " >&2
+ exit 1
+fi
+
+joltage() {
+ local first second c i
+
+ first=0
+ second=0
+
+ for ((i = 0; i < ${#1}; i++)); do
+ c="${1:$i:1}"
+
+ if [[ $second -gt $first ]]; then
+ first="$second"
+ second="$c"
+ elif [[ $c -gt $second ]]; then
+ second="$c"
+ fi
+ done
+
+ echo "$first$second"
+}
+
+joltage2() {
+ local c i d e n digits
+
+ digits=(0 0 0 0 0 0 0 0 0 0 0 0)
+
+ for ((i = 0; i < ${#1}; i++)); do
+ c="${1:$i:1}"
+
+ for ((d = 0; d < 11; d++)); do
+ if [[ ${digits[((d + 1))]} -gt ${digits[$d]} ]]; then
+ for ((e = d; e < 11; e++)); do
+ n=$((e + 1))
+ digits[e]=${digits[n]}
+ done
+ digits[11]="0"
+ break
+ fi
+ done
+
+ if [[ $c -gt ${digits[11]} ]]; then
+ digits[11]="$c"
+ fi
+ done
+
+ printf "%s" "${digits[@]}"
+}
+
+total=0
+total2=0
+
+while IFS="" read -r line || [[ -n "$p" ]]; do
+ ((total += $(joltage "$line")))
+ ((total2 += $(joltage2 "$line")))
+done <"$1"
+
+echo "$total"
+echo "$total2"