#!/usr/bin/perl # Copyright (C) Thomas Schumm sub bestsol { my ($n, $level) = @_; my ($ch, $x, $y, $z, $yp, $zp, $ym, $zm, $bests, $bestl, $sol, $lg, $ll); $level = 1 unless defined($level); return "" if ($n == 0); return $found[$n+256][$level] if (defined($found[$n+256][$level])); if ($n < 0) { $ch = '-' } else { $ch = '+'; } $bests = ($ch x abs($n)); $bestl = length($bests); return($found[256+$n][$level] = $bests) if (abs($n) < 5); for ($x=2; $x<=sqrt(abs($n))+1; $x++) { $y = int($n/$x); $z = $n-$x*$y; $yp= $y+1; $zp= $n-$x*$yp; $ym= $y-1; $zm= $n-$x*$ym; if (abs($zp) < abs($z)) { $y = $yp; $z = $zp; } if (abs($zm) < abs($z)) { $y = $ym; $z = $zm; } $lg = ('>' x $level); $ll = ('<' x $level); $sol = $lg . bestsol($x, 1) . '[' . $ll . bestsol($y, $level+1) . $lg . '-]' . $ll . bestsol($z, 1); $oldsol = $sol; $sol =~ s/<>//g; $sol =~ s/>//g; $sol =~ s/>//g; $sol =~ s/>//g; $sol =~ s/>) { foreach $char (split '', $_) { print "\n" if ($last != 0 && $last != ord($char)); $best1 = bestsol(ord($char)-$last) . "."; $best2 = "[-]" . bestsol(ord($char)) . "."; if (length($best1) < length($best2)) { $best = $best1; } else { $best = $best2; } print $best; $last=ord($char); } } print "\n";