The middle-square method
Pure bash, 162 131 116 113 107
Saved 3 bytes by using $c
...
Thanks @Dennis for help me to save 6 more bytes.
---- begin middleSquare ----
for((b=$1;i[c=10#$b]<2;)){ a=${#b}
printf -v b %0$[a*2]d $[c*c]
b=${b:a/2:a};((i[10#$b]++))
};echo ${#i[@]}
---- end middleSquare ----
for testCase in 24 82 123456 8989 789987 111111;do
printf "%12s: " $testCase
bash middleSquare $testCase
done
24: 2
82: 5
123456: 146
8989: 68
789987: 226
111111: 374
Square formated, 131
---- begin middleSquare ----
for((b=$1;i[
10#$b]<2;1))
do a="${#b}"
printf -v b\
%0$[a*2]d \
$[10#$b**2];
b=${b:a/2:a}
((i[10#$b]++
));done;ech\
o ${#i[@]:0}
---- end middleSquare ----
for testCase in 24 82 123456 8989 789987 111111;do
printf "%12s: %9d\n" $testCase $(
bash middleSquare $testCase)
done
24: 2
82: 5
123456: 146
8989: 68
789987: 226
111111: 374
Old but with fancy output, 162
---- begin middleSquare ----
for((b=$1;i[10#$b
]<2;1))do a=${#b}
printf -v b %0$[a
*2]d $[10#$b**2]
b=${b:a/2:a};((i[
10#$b]++));print\
f "%9d %s\n" ${#\
i[@]} $b;done;ec\
ho -- ${#i[@]} --
---- end middleSquare ----
bash middleSquare 24
1 57
2 24
2 57
-- 2 --
for testCase in 24 82 123456 8989 789987 111111
do while read f v f
do r=$v;done < <(
bash middleSquare $testCase)
printf "%12s: %11d\n" $testCase $r
done
24: 2
82: 5
123456: 146
8989: 68
789987: 226
111111: 374
Python 3 2, 139 114 97 bytes
Thanks to Seeq for golfing off 25 bytes and thanks to Dennis for golfing off 17 bytes! Code:
s=`input()`;u=[];l=len(s)/2
while not s in u:u+=[s];s=`int(s)**2`.zfill(l*4)[l:3*l]
print~-len(u)
Can definitely be golfed further. This was also the code used to make the test cases :P.
JavaScript (ES7), 82 bytes
f=(n,p={},m=-1,l=n.length)=>p[n]?m:f(`${n*n+100**l}`.substr(l/2+1,l,p[n]=1),p,++m)
Accepts input in the form of a string, e.g. "82", and returns an integer. Simple tail recursive technique to check each seed in turn against a hash of seeds that have already been seen. I add 100**l to the square to ensure a consistent length.