Algorytm uproszczenia dla odwrotnej notacji polskiej

Kilka dni temu bawiłem sięBefunge który jest ezoterycznym językiem programowania. Befunge używa stosu LIFO do przechowywania danych. Podczas pisania programów cyfry od 0 do 9 są w rzeczywistości instrukcjami Befunge, które przesuwają odpowiednie wartości na stos. Tak więc, na przykład, spowoduje to przesunięcie 7 na stos:

34+

Aby wypchnąć liczbę większą niż 9, obliczenia należy wykonać przy liczbach mniejszych lub równych 9. Dałoby to 123.

99*76*+

Podczas rozwiązywaniaProblem Eulera 1 z Befunge musiałem przesunąć dość dużą liczbę 999 na stos. Tutaj zacząłem się zastanawiać, jak mogę wykonać to zadanie z jak najmniejszą liczbą instrukcji. Pisząc termin w notacji infix i usuwając wspólne czynniki, które wymyśliłem

9993+*3+*

Można również po prostu pomnożyć dwie liczby dwucyfrowe, które dają 999, np.

39*66*1+*

Myślałem o tym przez jakiś czas, a następnie zdecydowałem się napisać program, który wypisuje najmniejsze wyrażenie zgodnie z tymi regułami w odwrotnej notacji polskiej dla dowolnej danej liczby całkowitej. To jest to, co mam do tej pory (napisane w NodeJS z underscorejs):

var makeExpr = function (value) {
    if (value < 10) return value + "";
    var output = "", counter = 0;
    (function fn (val) {
        counter++;
        if(val < 9) { output  += val; return; };
        var exp = Math.floor(Math.log(val) / Math.log(9));
        var div = Math.floor(val / Math.pow(9, exp));
        _( exp ).times(function () { output += "9"; });
        _(exp-1).times(function () { output += "*"; });
        if (div > 1) output += div + "*";
        fn(val - Math.pow(9, exp) * div);    
    })(value);
    _(counter-1).times(function () { output+= "+"; });
    return output.replace(/0\+/, "");
};

makeExpr(999);
// yields 999**99*3*93*++

Ten fragment kodu konstruuje wyrażenie naiwnie i jest niezwykle długi. Teraz moje pytania:

Czy istnieje algorytm upraszczający wyrażenia w odwrotnej notacji polskiej?Czy uproszczenie byłoby łatwiejsze w notacji infix?Czy takie wyrażenie może być9993+*3+* być sprawdzonym jako najmniejszy z możliwych?

Mam nadzieję, że możesz dać kilka spostrzeżeń. Z góry dziękuję.

questionAnswers(4)

yourAnswerToTheQuestion