Zerlegen Sie eine Zahl in eine Summe von Repdigits

9

Repdigits sind Zahlen der Form a * (10^n - 1)/9mit a in [-9,9]\{0}(mit anderen Worten 111, -3333, 66, Zahlen, die durch Wiederholen nur einer Ziffer erstellt werden)

Ziel: Schreiben Sie ein Programm oder eine Funktion, die eine einzelne positive Ganzzahl verwendet Nund druckt N = s_1 + s_2 + ... + s_k. Es sollte eine Nummer pro Zeile geben und die Nummern müssen rechtsbündig sein. Keine zwei Summanden sollten die gleiche Anzahl von Ziffern haben und das Hinzufügen von Nullen ist nicht zulässig. Die Ausgabe sollte in aufsteigender oder absteigender Reihenfolge (nach Anzahl der Ziffern) angeordnet sein.

Beispiele:

in:
24192
out:
24192 =
22222 +
 2222 -
  222 -
   33 +
    3

in:
24192
out:
    -7
   -22
  +888
 +1111
+22222
=24192

in:
113
out:
113=    NOT  111+  no empty lines  111+
111+          00+                    
  2            2                     2

Wie Sie sehen, kann es mehrere Lösungen geben, und es ist eine gewisse künstlerische Freiheit zulässig. Führende und nachfolgende Leerzeichen in jeder Zeile sind zulässig

Die kürzeste Byteanzahl gewinnt

DenDenDo
quelle
Sollten Sie einige Regeln deklarieren, um zu verhindern, dass nur Nsolche gedruckt werden?
PurkkaKoodari
3
Dies wird bereits behandelt: "Keine zwei Summanden sollten die gleiche Anzahl von Ziffern haben"
nutki
Diese Nummern werden auch als Repdigits bezeichnet.
Ypnypn

Antworten:

6

Perl 5 - 97 92 93 86

$x=$_=pop;{printf"%15s
",$_;$_=$x,s!\d!//,$&!eg,$x-=$_,$i++?s/^\b/+/:s/^/=/;/0/||redo}

Eingabe als Parameter angegeben:

$perl a.pl 2224192
     2224192
    =2222222
       +1111
        +888
         -22
          -7
Nutki
quelle
Es wird nichts gedruckt, wenn die Zahl eine 0 enthält. Vielleicht ist es die /0/Schleifenbedingung.
Feersum
Danke, in der Tat ist das der Fall. Ich habe mich mit den Perl-Shortcut-Loops verwechselt. Sie haben am Ende einen Zustand, überprüfen ihn jedoch bei der ersten Iteration. Ich muss dann nach "+0" suchen.
Nutki
Eigentlich kann ich do ... while () mit nur einem zusätzlichen Zeichen simulieren redo.
Nutki
2

CJam, 55 50 Bytes

'=l:L+Li{_W>"-+"=1$zs(\,)*+:Ii-L,_S*I+\~>\}h;]W%N*

Testen Sie es hier.

Verwendet das Ausgabeformat

      -7
     -22
    +888
   +1111
+2222222
=2224192

Ich könnte noch mehr Golf spielen, wenn ich geschlagen bin.

Erläuterung:

'=l:L+Li{_W>"-+"=1$zs(\,)*+:Ii-L,_S*I+\~>\}h;]W%N*
'=                                                 "Push = character.";
  l:L                                              "Read STDIN and store in L.";
     +L                                            "Concatenate, push new copy of L.";
       i                                           "Convert to integer.";
        {                                 }h       "Do-while loop. Leaves the condition on the
                                                    stack. I will use the remainder for that.";
         _W>                                       "Duplicate remainder, compare with -1.";
            "-+"=                                  "Select appropriate sign character.";
                 1$                                "Copy remainder again.";
                   zs                              "Take abs() and convert to string.";
                     (                             "Shift off first digit.";
                      \                            "Swap with string.";
                       ,                           "Get length.";
                        )                          "Increment.";
                         *                         "Repeat digit that often.";
                          +                        "Concatenate with sign.";
                           :I                      "Store in I.";
                             i-                    "Convert to integer. Subtract from remainder.";
                                                   "Now we'll right-justify I.";
                               L,                  "Load input, get length.";
                                 _                 "Duplicate.";
                                  S*               "Repeat space that often.";
                                    I+             "Load string and concatenate.";
                                      \~           "Swap with length. Bitwise complement.";
                                        >          "Take that many characters from the right.";
                                         \         "Swap with remainder.";
                                            ;      "Discard final remainder (0).";
                                             ]     "Wrap in array.";
                                              W%   "Reverse.";
                                                N* "Join with line feeds.";

Das resultierende Array wird am Ende des Programms automatisch gedruckt.

Martin Ender
quelle
0

JavaScript ES6 - 145

i=0;f=n=>{return g=n<0,n=Math.abs(n)+'',l=n.length,r=l-1?n[0].repeat(l):n,(i>0?g?'-':'+':n+'=')+'\n'+' '.repeat(i++)+(l-1?r+f((+n-r)*(g?-1:1)):r)}

In die Firefox-Konsole einfügen. Ausführen als f(24192).

Ausgabe für f(24192):

24192=
22222+
 1111+
  888-
   22-
    7
Scimonster
quelle
Mit der Eingabe 55enthält es eine 0 in der Summe (was ein Fehler ist).
Feersum
0

GolfScript 77

~.[{..0>2*(.@*`.,\[0=]*''+~*.@\-.}do;]-1%{[.0>' +'=\`n].1=,2$`,\-' '*\+}%'='@

Online-Demo-Links:

Eine etwas besser lesbare Version (wenn GolfScript als lesbar bezeichnet werden kann) mit Unit-Test-Version ist hier verfügbar .

Cristian Lupascu
quelle