aoc24/day4/part 1.sh
2024-12-04 20:58:05 +00:00

59 lines
1.3 KiB
Bash
Executable file

#!/usr/bin/env bash
#set -x
# flips file clockwise
vert(){
linelen=$(wc -L <$1)
local i
for i in $(seq 1 $linelen); do
echo $(cut -b $i $1 | tr -d '\n')
done > $1.vert
sed -i '/^ *$/d' $1.vert
}
# "tilts" files
diag(){
linecount=$(wc -l <$1)
while read; do
local i
(( i++ ))
case $2 in
right)
for j in $(seq 1 $(bc<<<"$linecount-$i")); do
echo -n ' '
done
;;
left)
for j in $(seq 1 $i); do
echo -n ' '
done
;;
esac
echo "$REPLY"
done < <(cat "$1") >> $1.diag.$2
sed -i '/^ *$/d' $1.diag.$2
}
# tilt/turn the file, searching back and forth
search(){
# this is somewhat confusing
# turn 90 degrees
vert $1
# "tilt" counter-clockwise 45
diag $1 left
vert $1.diag.left
# "tilt" clockwise 45
diag $1 right
vert $1.diag.right
# we count seperately so searchs can overlap
grep -c "XMAS" $1 # right
grep -c "SAMX" $1 # left
grep -c "XMAS" $1.vert # up
grep -c "SAMX" $1.vert # down
grep -c "XMAS" $1.diag.right.vert # up right
grep -c "SAMX" $1.diag.right.vert # down left
grep -c "XMAS" $1.diag.left.vert # up left
grep -c "SAMX" $1.diag.left.vert # down right
# clean up temp files
rm $1.vert*
rm $1.diag*
}
search input.example | tr '\n' '+' | sed 's/+$/\n/' | bc