diff --git a/day04.sh b/day04.sh new file mode 100755 index 0000000..4fd7571 --- /dev/null +++ b/day04.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash +unset PATH; readonly PATH +source ./utils/main.sh + +count_patterns_occurences() { + local input="$1"; shift + local patterns=("$@") result=0 + + for pattern in "${patterns[@]}"; do + local text="$input" + while [[ -n "$text" ]]; do + if [[ "$text" =~ $pattern ]]; then + ((result++)) + text="${text#*"${BASH_REMATCH[0]}"}" + text="${BASH_REMATCH[0]:1}$text" + else + text='' + fi + done + done + + printf '%d' "$result" +} + +p1() { + local input="$1" line result=0 cols=0 + + read -ra line <<< "$input" + cols="$((${#line}+1))" + + local patterns=( + "XMAS" + "SAMX" + "X.{$((cols))}M.{$((cols))}A.{$((cols))}S" + "S.{$((cols))}A.{$((cols))}M.{$((cols))}X" + "X.{$((cols-1))}M.{$((cols-1))}A.{$((cols-1))}S" + "S.{$((cols-1))}A.{$((cols-1))}M.{$((cols-1))}X" + "X.{$((cols-2))}M.{$((cols-2))}A.{$((cols-2))}S" + "S.{$((cols-2))}A.{$((cols-2))}M.{$((cols-2))}X" + ) + + count_patterns_occurences "$input" "${patterns[@]}" +} + +p2() { + local input="$1" line result=0 cols=0 + + read -ra line <<< "$input" + cols="$((${#line}+1))" + + local patterns=( + "M.M.{$((cols-2))}A.{$((cols-2))}S.S" + "M.S.{$((cols-2))}A.{$((cols-2))}M.S" + "S.M.{$((cols-2))}A.{$((cols-2))}S.M" + "S.S.{$((cols-2))}A.{$((cols-2))}M.M" + ) + + count_patterns_occurences "$input" "${patterns[@]}" +} + +main "$@"