#!/usr/bin/perl $|++; use strict; use constant NUMBER_BEGIN => 196; use constant NUMBER_END => 196; use constant LOOP_COUNT_LIMIT => 10000; use constant VERBOSE => 1; my %result = (); ### Main Loop sub main { LOOP_MAIN: foreach my $num (NUMBER_BEGIN..NUMBER_END) { my $num_original = $num; printf "* Checking %s ", $num if VERBOSE; foreach my $loop_cnt (0..LOOP_COUNT_LIMIT) { if (isMirrorNumber ($num)) { $result{$num_original} = { converged => $num, loop => $loop_cnt }; printf "!\n\t%s converges in %s in %d operation(s).\n", $num_original, $num, $loop_cnt if VERBOSE; next LOOP_MAIN; } $num = ArithmeticalAdd ($num, MakeReversedNum ($num)); printf "." if VERBOSE; } # $result{$num_original} = { converged => "-", loop => LOOP_COUNT_LIMIT. "<" }; printf "x\n" if VERBOSE; } OUTPUT_RESULT: foreach my $num (sort { $a <=> $b } keys %result) { printf "%s\t%s\t%s\n", $num, $result{$num}->{converged}, $result{$num}->{loop}; } } main (); ### Make a number with reversing the figure's order. ### example. 12340 -> 4321 sub MakeReversedNum { my $ret = join '', reverse split '', shift; $ret =~ s/^0+//; $ret; } ### Arithmetical additional operation sub ArithmeticalAdd { my @figs_a = reverse split '', shift; my @figs_b = reverse split '', shift; my @figs_ret = (); do { my $a = shift @figs_a || 0; my $b = shift @figs_b || 0; my $c = $a + $b; if (10 <= $c) { $c -= 10; $figs_a[0]++; } unshift @figs_ret, $c; } while (0 <= $#figs_a || 0 <= $#figs_b); join '', @figs_ret; } ### Check if the number is mirrored number. sub isMirrorNumber { my @figs = split '', shift; while (0 < $#figs) { return 0 unless shift @figs eq pop @figs; } 1; } __END__