From 6f4b02af33de3652aa353fedb9d9c3fe56f23d0d Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Wed, 3 Dec 2025 09:54:40 +0100 Subject: [PATCH] Implement 2025 day 3 in bash --- 2025/day02/README.md | 2 +- 2025/day03/README.md | 4 +++ 2025/day03/sample.txt | 4 +++ 2025/day03/solve.sh | 64 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 2025/day03/README.md create mode 100644 2025/day03/sample.txt create mode 100755 2025/day03/solve.sh 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"