Décomposer un nombre en une somme de chiffres

9

Les chiffres sont des nombres du formulaire a * (10^n - 1)/9avec a in [-9,9]\{0}(en d'autres termes 111, -3333, 66, des nombres qui sont faits en répétant un seul chiffre)

Objectif: écrire un programme ou une fonction qui prend un seul entier positif Net s'imprime N = s_1 + s_2 + ... + s_k. Il doit y avoir un numéro par ligne et les numéros doivent être alignés à droite. Deux sommets ne doivent pas avoir le même nombre de chiffres et l'ajout de zéros n'est pas autorisé. La sortie doit être triée par ordre croissant ou décroissant (par nombre de chiffres)

Exemples:

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

Comme vous pouvez le voir, il peut y avoir plusieurs solutions et une certaine liberté artistique est autorisée. Les espaces de début et de fin dans chaque ligne sont autorisés

Le nombre d'octets le plus court gagne

DenDenDo
la source
Devriez-vous déclarer certaines règles pour empêcher par exemple d'en imprimer uniquement N?
PurkkaKoodari
3
Cela est déjà couvert: "Deux sommets ne devraient pas avoir le même nombre de chiffres"
nutki
Ces nombres sont également appelés repdigits.
Ypnypn

Réponses:

6

perl 5 - 97 92 93 86

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

Entrée donnée en paramètre:

$perl a.pl 2224192
     2224192
    =2222222
       +1111
        +888
         -22
          -7
nutki
la source
Il n'imprime rien si le nombre contient un 0. C'est peut-être la /0/condition de bouclage.
feersum
Merci, c'est bien le cas. Je me suis confondu avec les boucles de raccourcis perl. Ils ont l'état à la fin mais le vérifient toujours à la première itération. Je dois alors chercher "+0".
nutki
En fait, je peux simuler do ... while () avec un seul caractère supplémentaire en utilisant redo.
nutki
2

CJam, 55 50 octets

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

Testez-le ici.

Utilise le format de sortie

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

Je pourrais jouer au golf encore une fois que je serai battu.

Explication:

'=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.";

Le tableau résultant est imprimé automatiquement à la fin du programme.

Martin Ender
la source
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)}

Collez dans la console Firefox. Exécuter en tant que f(24192).

Sortie pour f(24192):

24192=
22222+
 1111+
  888-
   22-
    7
Scimonster
la source
Avec l'entrée, 55il inclut un 0 dans la somme (ce qui est un bug).
feersum
0

GolfScript 77

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

Liens de démonstration en ligne:

Une version légèrement plus lisible (si GolfScript peut être appelé lisible) avec une version de tests unitaires est disponible ici .

Cristian Lupascu
la source