Descomponer un número en una suma de repdigits

9

Repdigits son números de la forma a * (10^n - 1)/9con a in [-9,9]\{0}(en otras palabras, 111, -3333, 66, números que se hacen repitiendo solo un dígito)

Objetivo: escribir un programa o función que tome un solo entero positivo Ne imprima N = s_1 + s_2 + ... + s_k. Debe haber un número por línea y los números deben estar alineados a la derecha. No hay dos sumandos que tengan el mismo número de dígitos y no se permite agregar ceros. La salida se debe ordenar en orden ascendente o descendente (por número de dígitos)

Ejemplos:

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

Como puede ver, puede haber múltiples soluciones y se permite cierta libertad artística. Se permiten espacios en blanco iniciales y finales en cada línea

El conteo de bytes más corto gana

DenDenDo
fuente
¿Debería declarar algunas reglas para evitar, por ejemplo, solo imprimirlas N?
PurkkaKoodari
3
Esto ya está cubierto: "No hay dos sumandos que tengan el mismo número de dígitos"
nutki
Estos números también se llaman repdigits.
Ypnypn

Respuestas:

6

perl 5-97 92 93 86

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

Entrada dada como parámetro:

$perl a.pl 2224192
     2224192
    =2222222
       +1111
        +888
         -22
          -7
nutki
fuente
No imprime nada si el número tiene un 0. Tal vez es la /0/condición de bucle.
Feersum
Gracias, de hecho ese es el caso. Me confundí con los atajos de perl. Tienen una condición al final, pero aún así la verifican en la primera iteración. Tengo que buscar "+0" entonces.
nutki
En realidad, puedo simular do ... while () con solo un personaje adicional usando redo.
nutki
2

CJam, 55 50 bytes

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

Pruébalo aquí.

Utiliza el formato de salida

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

Podría jugar golf más una vez que me golpeen.

Explicación:

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

La matriz resultante se imprime automáticamente al final del programa.

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

Pegar en la consola de Firefox. Corre como f(24192).

Salida para f(24192):

24192=
22222+
 1111+
  888-
   22-
    7
Scimonster
fuente
Con la entrada 55incluye un 0 en la suma (que es un error).
Feersum
0

GolfScript 77

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

Enlaces de demostración en línea:

Aquí está disponible una versión ligeramente más legible (si se puede llamar a GolfScript legible) con la versión de pruebas unitarias .

Cristian Lupascu
fuente