#!/bin/bash
# Bash implementation of http://fr.wikipedia.org/wiki/Conjecture_de_Syracuse
# Playing with Math integers in bash, without forks...
# (c) 2013 - F-Hauri.ch - distributable under terms of LGPL-V3+
#

stepSyracuse() {
    [ $(($1&1)) -eq 0 ] &&
	printf ${2+-v} $2 "%u" $(($1/2)) ||
	printf ${2+-v} $2 "%u" $(($1*3+1))
}

syracuse() {
    local verb=false var=$1 len=0 fly=0 alt=true max=0
    [ "$1" = "-v" ] &&
	shift &&
	verb=true &&
	var=$1 &&
	printf "%4d %5d\n" 0 $var
    [ "$2" ] && printf -v $2[0] %d $var
    while [ $var -ne 1 ] ;do
	((len++))
	stepSyracuse $var var
	$verb && printf "%4d %5d\n" $len $var
	[ "$2" ] && printf -v $2[$len] %d $var
	[ $max -lt $var ] && max=$var
	[ $var -lt $1 ] && alt=false
	$alt && ((fly++))
      done
    echo $len $fly $max
}

time for ((i=4;i++<=${1:-100};)) ;do
    syracuse $i
  done

unset syrvals

syracuse ${1:-15} syrvals
form="|"
line="+"
for i in ${!syrvals[@]} ;do
    [ ${#i} -gt ${#syrvals[i]} ] &&
        l=${#i} ||
	l=${#syrvals[i]}
    ((l++)) # Add a space
    printf -v form "%s%%${l}d|" "$form"
    printf -v line "%s%${l}s+" "$line" ""
  done
echo ${line// /-}
printf "$form\n" ${!syrvals[@]} ${syrvals[@]}
echo ${line// /-}
