rlm@0: #!/usr/bin/perl rlm@0: rlm@0: use bigint; rlm@0: $a = "/home/r/coderloop-test/euler14-a.in"; rlm@0: $b = "/home/r/coderloop-test/euler14-b.in"; rlm@0: rlm@0: sub read_integer{ rlm@0: ##reads an integer from a file rlm@0: (my $file) = @_; rlm@0: my $int; rlm@0: open FILE, "<".$file or die $!; rlm@0: for (){ chomp; /^\W*(\d+)\W*$/; $int = $1;} rlm@0: close FILE; rlm@0: return $int;} rlm@0: rlm@0: rlm@0: @collatz = (1); rlm@0: rlm@0: rlm@0: sub collatz_next { rlm@0: my $n = @_[0]; rlm@0: if (1 == $n) {return 1;} rlm@0: if (0 == ($n % 2)){ return $n/2;} rlm@0: if (1 == ($n % 2)){ return (($n*3)+1);} rlm@0: } rlm@0: rlm@0: sub different_collatz_length { rlm@0: my $n = $_[0]; rlm@0: my $d = 1; rlm@0: while ($n != 1){ rlm@0: $d++; rlm@0: $n = collatz_next($n);} rlm@0: return $d;} rlm@0: rlm@0: sub collatz_length { rlm@0: ## calculate the length of the collatz sequence rlm@0: ## http://en.wikipedia.org/wiki/Collatz_conjecture rlm@0: ## starting at n rlm@0: my $n = @_[0]; rlm@0: #print $n,"\n"; rlm@0: #memoization rlm@0: #print "***** ", $collatz[$n], " ********\n"; rlm@0: if (defined $collatz[$n]){return $collatz[$n];} rlm@0: if (1 == $n) {return 1;} rlm@0: if (0 == ($n % 2)){ return (1 + &collatz_length($n/2))} rlm@0: if (1 == ($n % 2)){ return (1 + &collatz_length(($n*3)+1));} rlm@0: } rlm@0: rlm@0: rlm@0: sub max_collatz { rlm@0: my $n = @_[0]; rlm@0: my $max_length = 1; rlm@0: my $max_val = 1; rlm@0: for (my $i = 1; $i < $n; $i++){ rlm@0: my $collatz = &different_collatz_length($i); rlm@0: #push(@collatz, $collatz); rlm@0: if ( $collatz >= $max_length){ rlm@0: $max_length = $collatz ; rlm@0: $max_val = $i}} rlm@0: print "\n number is : $max_length --- "; rlm@0: print &collatz_length($max_val) . "\n"; rlm@0: return $max_val; rlm@0: } rlm@0: rlm@0: rlm@0: rlm@0: rlm@0: if (defined @ARGV){ rlm@0: print &max_collatz(read_integer($ARGV[0])), "\n";}