110 lines
2.9 KiB
Bash
110 lines
2.9 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
# Horizontal search
|
|
TOTAL_XMAS=$( grep -o 'XMAS' input.txt | wc -l )
|
|
TOTAL_XMAS=$(( TOTAL_XMAS + $( grep -o 'SAMX' input.txt | wc -l ) ))
|
|
|
|
# Add spaces for cut use
|
|
sed -E 's/(.)/\1\ /g' input.txt > input-proc
|
|
FIELD_COUNT=$( head -1 input-proc | awk '{print NF}' )
|
|
LINE_COUNT=$( cat input-proc | wc -l )
|
|
INPUT_PROC=$( cat input-proc )
|
|
|
|
# Transpose for vertical search
|
|
TOTAL_XMAS=$((
|
|
TOTAL_XMAS + $(
|
|
RSTRING=$(
|
|
for i in $( seq 1 $FIELD_COUNT )
|
|
do
|
|
printf "$INPUT_PROC" | cut -f $i -d " " | paste -s -d ''
|
|
done
|
|
)
|
|
echo $( printf "$RSTRING" | grep -o 'XMAS' | wc -l ) + $( printf "$RSTRING" | grep -o 'SAMX' | wc -l ) | bc
|
|
)
|
|
))
|
|
|
|
# Diagonal forward search
|
|
for COL_START in $( seq 1 $FIELD_COUNT )
|
|
do
|
|
COL_COUNTER=$COL_START
|
|
TOTAL_XMAS=$((
|
|
TOTAL_XMAS + $(
|
|
RSTRING=$(
|
|
while read -r LINE
|
|
do
|
|
if [[ $COL_COUNTER -gt $FIELD_COUNT || $COL_COUNTER < 1 ]]
|
|
then
|
|
continue
|
|
fi
|
|
printf "$LINE" | cut -f $COL_COUNTER -d " "
|
|
(( COL_COUNTER++ ))
|
|
done <<< "$INPUT_PROC" | paste -s -d ""
|
|
)
|
|
echo $( printf "$RSTRING" | grep -o 'XMAS' | wc -l ) + $( printf "$RSTRING" | grep -o 'SAMX' | wc -l ) | bc
|
|
)
|
|
))
|
|
done
|
|
for ROW_START in $( seq 2 $LINE_COUNT )
|
|
do
|
|
COL_COUNTER=1
|
|
TOTAL_XMAS=$((
|
|
TOTAL_XMAS + $(
|
|
RSTRING=$(
|
|
while read -r LINE
|
|
do
|
|
if [[ $COL_COUNTER -gt $FIELD_COUNT || $COL_COUNTER < 1 ]]
|
|
then
|
|
continue
|
|
fi
|
|
printf "$LINE" | cut -f $COL_COUNTER -d " "
|
|
(( COL_COUNTER++ ))
|
|
done <<< "$( tail -n +$ROW_START input-proc )" | paste -s -d ""
|
|
)
|
|
echo $( printf "$RSTRING" | grep -o 'XMAS' | wc -l ) + $( printf "$RSTRING" | grep -o 'SAMX' | wc -l ) | bc
|
|
)
|
|
))
|
|
done
|
|
# Diagonal backwards search
|
|
for COL_START in $( seq $FIELD_COUNT -1 1 )
|
|
do
|
|
COL_COUNTER=$COL_START
|
|
TOTAL_XMAS=$((
|
|
TOTAL_XMAS + $(
|
|
RSTRING=$(
|
|
while read -r LINE
|
|
do
|
|
if [[ $COL_COUNTER -gt $FIELD_COUNT || $COL_COUNTER < 1 ]]
|
|
then
|
|
continue
|
|
fi
|
|
printf "$LINE" | cut -f $COL_COUNTER -d " "
|
|
(( COL_COUNTER-- ))
|
|
done <<< "$INPUT_PROC" | paste -s -d ""
|
|
)
|
|
echo $( printf "$RSTRING" | grep -o 'XMAS' | wc -l ) + $( printf "$RSTRING" | grep -o 'SAMX' | wc -l ) | bc
|
|
)
|
|
))
|
|
done
|
|
for ROW_START in $( seq 2 $LINE_COUNT )
|
|
do
|
|
COL_COUNTER=$FIELD_COUNT
|
|
TOTAL_XMAS=$((
|
|
TOTAL_XMAS + $(
|
|
RSTRING=$(
|
|
while read -r LINE
|
|
do
|
|
if [[ $COL_COUNTER -gt $FIELD_COUNT || $COL_COUNTER < 1 ]]
|
|
then
|
|
continue
|
|
fi
|
|
printf "$LINE" | cut -f $COL_COUNTER -d " "
|
|
(( COL_COUNTER-- ))
|
|
done <<< "$( tail -n +$ROW_START input-proc )" | paste -s -d ""
|
|
)
|
|
echo $( printf "$RSTRING" | grep -o 'XMAS' | wc -l ) + $( printf "$RSTRING" | grep -o 'SAMX' | wc -l ) | bc
|
|
)
|
|
))
|
|
done
|
|
|
|
printf "%s\n" "$TOTAL_XMAS"
|