#!/bin/bash declare -A dots folds=() min_x=-1 min_y=-1 while read line; do if [[ $line == *','* ]]; then dots[$line]=1 else folds+=( ${line#fold along } ) fi done for fold in ${folds[@]}; do fold_axis=${fold%=*} fold_coord=${fold#*=} new_dots=() todel_dots=() if [[ $fold_axis == 'x' ]] && { [ $fold_coord -lt $min_x ] || [ $min_x -eq -1 ] ;}; then min_x=$fold_coord elif [[ $fold_axis == 'y' ]] && { [ $fold_coord -lt $min_y ] || [ $min_y -eq -1 ] ;}; then min_y=$fold_coord fi for dot in ${!dots[@]}; do dot_x=${dot%,*} dot_y=${dot#*,} if [[ $fold_axis == 'x' ]]; then if [ $dot_x -gt $fold_coord ]; then new_dots+=( "$((fold_coord*2-dot_x)),$dot_y" ) todel_dots+=( $dot ) fi else if [ $dot_y -gt $fold_coord ]; then new_dots+=( "$dot_x,$((fold_coord*2-dot_y))" ) todel_dots+=( $dot ) fi fi done for todel_dot in ${todel_dots[@]}; do unset dots[$todel_dot] done for new_dot in ${new_dots[@]}; do dots[$new_dot]=1 done done for j in $(seq 0 $min_y); do for i in $(seq 0 $min_x); do if [ ${dots["$i,$j"]} ]; then echo -n '█' else echo -n ' ' fi done echo done