> 
> ## Symbolify (#169)
> 

Fairly straightforward; handles negative and positive. I tried for the 
shortest resulting encoding but fell a little short compared to some of 
the other results . Thats likely due to my use of addition instead of 
multiplication.

def symbolify(j)
    i = j.abs
    add = "--"
    unless $nums
        code = {?? => "??", ?- => "?-", ?) => "?)", ?( => "?(", ?* => 
"?*"}
        $nums = {}
        code.keys.each do |x|
            code.keys.each do |y|
                $nums[x-y] = "%s-%s" % [code[x], code[y]]
                $nums[x*y] = "%s*%s" % [code[x], code[y]]
                $nums[x**y] = "%s**%s" % [code[x], code[y]]
            end
        end
    end

    if $nums[i]
        eq = "%s%s%s" % [j < 0 ? "-(" : "", $nums[i], j < 0 ? ")" : ""]
        return eq
    end

    values = {}
    remove = 0
    $nums.keys.sort.reverse.each do |num|
        next unless num > 1
        if num < i and i % num == 0
            return "%s(%s)*(%s)" % [j<0 ? "-" : 
"",$nums[num],symbolify(i/num)]
        end
        pow = 0
        pow += 1 while num**pow <= i
        values[num**(pow-1)] = [num,pow-1]
        remove = num**(pow-1) if remove < num**(pow-1)
    end

    base,pow = values[remove]
    equation = "(%s)**(%s)" % [$nums[base], symbolify(pow)]
    equation << add + symbolify(i-remove) if i - remove > 0
    j < 0 ? "-(" + equation + ")" : equation

end
-- 
Posted via http://www.ruby-forum.com/.