#!/usr/bin/env bash main() { printf 'Simple Incrementer\n' printf '1 1 1' | run_utm q0 qf B q0,1,1,R,q0 q0,B,1,S,qf printf '\nThree-state busy beaver\n' run_utm a halt 0 \ a,0,1,R,b a,1,1,L,c b,0,1,L,a b,1,1,R,b c,0,1,L,b c,1,1,S,halt \ &2 "Configuration error: no match for state=$state input=$sym\n" return 1 fi tape[head]=$output state=$to case "$move" in L) if (( ! head-- )); then head=0 tape=("$blank" "${tape[@]}") fi ;; R) if (( ++head >= ${#tape[@]} )); then tape+=("$blank") fi ;; esac done print_state "$state" "$head" "${tape[@]}" } print_state() { local state=$1 head=$2 shift 2 local tape=("$@") printf '%s' "$state" printf ' %s' "${tape[@]}" printf '\r' (( t = ${#state} + 1 + 3 * head )) printf '\e['"$t"'C<\e[C>\n' } main "$@"