#!/usr/bin/env bash FILE=input LEN=$( head -1 "$FILE" | sed -E 's/(.)/\1\ /g' | awk '{printf NF}' ) read -r -a MAP_ARRAY <<< "$( < "$FILE" sed -E 's/(.)/\1\ /g' | paste -s -d ' ' )" read -r -a SHADOW_ARRAY <<< "$( < "$FILE" sed -E 's/(.)/\1\ /g' | paste -s -d ' ' )" #printf "MAP_LEN: %s, NF: %s\n" "${#MAP_ARRAY[@]}" "$LEN" >&2 for CHAR in $( < "$FILE" grep -Eo '[^\.]' | sort -u | paste -s -d' ' ) do # Get indices for antennae LINE="$( for (( i=0; i<${#MAP_ARRAY[@]}; i++ )) do if [[ ${MAP_ARRAY[i]} == "$CHAR" ]] then printf "%s " "$i" fi done )" #printf "%s\n" "$LINE" >&2 read -r -a IDX_ARRAY <<< "$LINE" #printf "idx: %s " "${IDX_ARRAY[@]}" >&2 #printf "\n" >&2 # Get all combinations for (( i=0; i<${#IDX_ARRAY[@]}-1; i++ )) do A=${IDX_ARRAY[i]} SHADOW_ARRAY[A]=X for (( j=i+1; j<${#IDX_ARRAY[@]}; j++ )) do B=${IDX_ARRAY[j]} SHADOW_ARRAY[B]=X DIFF=$(( B - A )) VDIFF=$(( (B / LEN) - (A / LEN) )) # Assign heads HEADC=1 while true do HEAD=$(( A - DIFF * HEADC )) if [[ ${SHADOW_ARRAY[HEAD]} == "X" ]]; then (( HEADC++ )); continue ; fi HEADVDIFF=$(( (A / LEN) - (HEAD / LEN) )) # Check if out of bounds if [[ $HEAD -lt ${#MAP_ARRAY[@]} ]] && \ [[ $HEAD -ge 0 ]] && \ [[ $HEADVDIFF -eq $(( VDIFF * HEADC )) ]] then SHADOW_ARRAY[HEAD]=X # Mark on shadow map (( HEADC++ )) else break fi done # Assign tails TAILC=1 while true do TAIL=$(( B + DIFF * TAILC )) if [[ ${SHADOW_ARRAY[TAIL]} == "X" ]]; then (( TAILC++ )); continue ; fi TAILVDIFF=$(( (TAIL / LEN) - (B / LEN) )) # Check if out of bounds if [[ $TAIL -lt ${#MAP_ARRAY[@]} ]] && \ [[ $TAIL -ge 0 ]] && \ [[ $TAILVDIFF -eq $(( VDIFF * TAILC )) ]] then SHADOW_ARRAY[TAIL]=X # Mark on shadow map (( TAILC++ )) else break fi done #printf "char: %s, A: %s, B: %s, DIFF: %s, VDIFF: %s, HEAD: %s, HEADVDIFF: %s, TAIL: %s, TAILVDIFF: %s\n" "$CHAR" "$A" "$B" "$DIFF" "$VDIFF" "$HEAD" "$HEADVDIFF" "$TAIL" "$TAILVDIFF" >&2 done done unset IDX_ARRAY done #printf "%s" "${SHADOW_ARRAY[@]}" | fold -w "$LEN" | sed -E 's/(.)/\1\ /g' #printf "\n" printf "%s" "${SHADOW_ARRAY[@]}" | grep -o 'X' | wc -l