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


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

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.


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

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 .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.