#!/bin/bash scores=() while read line; do chars=( $(sed 's/\(.\)/\1 /g' <<< $line) ) opened_chars=() broken=0 for char in ${chars[@]}; do case $char in '('|'['|'{'|'<') opened_chars+=( $char );; ')') if [ ${opened_chars[-1]} = '(' ]; then unset 'opened_chars[-1]' else broken=1 break fi;; ']') if [ ${opened_chars[-1]} = '[' ]; then unset 'opened_chars[-1]' else broken=1 break fi;; '}') if [ ${opened_chars[-1]} = '{' ]; then unset 'opened_chars[-1]' else broken=1 break fi;; '>') if [ ${opened_chars[-1]} = '<' ]; then unset 'opened_chars[-1]' else broken=1 break fi;; esac done if [ $broken -eq 0 ]; then score=0 n_opened_chars=${#opened_chars[@]} for i in $(seq $((n_opened_chars-1)) -1 0); do case ${opened_chars[$i]} in '(') score=$((score*5+1));; '[') score=$((score*5+2));; '{') score=$((score*5+3));; '<') score=$((score*5+4));; esac done scores+=( $score ) fi done scores=( $(printf '%s\n' "${scores[@]}" | sort -nr) ) n_scores=${#scores[@]} echo ${scores[$((n_scores/2))]}