#!/bin/bash declare -A transitions while read line; do first=$(sed 's/-.*$//' <<< $line) last=$(sed 's/^.*-//' <<< $line) transitions[$first]=${transitions[$first]}','$last',' transitions[$last]=${transitions[$last]}','$first',' done paths=() find_paths() { local current_path=( ${1//,/ } ) local marked_caves=$2 local visited_twice=$3 local current_transitions=${transitions[${current_path[-1]}]} current_transitions=( ${current_transitions//,/ } ) local current_transition for current_transition in ${current_transitions[@]}; do if [[ $current_transition == 'end' ]]; then paths+=( $1','$current_transition',' ) elif [[ ${current_transition:0:1} == [A-Z] ]]; then find_paths $1','$current_transition',' $marked_caves $visited_twice elif ! [[ $marked_caves == *','$current_transition','* ]]; then find_paths $1','$current_transition',' $marked_caves','$current_transition',' $visited_twice elif [ $visited_twice -eq 0 ] && ! [[ $current_transition == 'start' ]]; then find_paths $1','$current_transition',' $marked_caves 1 fi done } find_paths ',start,' ',start,' 0 echo ${#paths[@]}