Descomponer un número!

16

Su tarea es descomponer un número usando el formato a continuación.

Esto es similar a la conversión de base, excepto que en lugar de enumerarla digitsen la base, enumera la values, de modo que la lista se suma a la entrada.

Si la base dada es n, entonces cada número en la lista debe estar en forma de k*(n**m), donde 0<=k<ny mes único en toda la lista.

Especificaciones

  • Cualquier formato de entrada / salida razonable. Su programa / función toma 2 entradas y genera una lista.
  • La lista de salida puede estar en cualquier orden.
  • 0 Puede ser excluido o incluido.
  • Liderar 0están permitidos.
  • Se permiten empotrados .

Casos de prueba

number base   converted list
input1 input2 output
123456 10     [100000,20000,3000,400,50,6] or [6,50,400,3000,20000,100000]
11     2      [8,2,1] or [0,0,0,0,8,0,2,1]
727    20     [400,320,7]
101    10     [100,1] or [100,0,1]

Puntuación

Este es el . La solución más corta en bytes gana.

Monja permeable
fuente

Respuestas:

5

Jalea , 7 bytes

lr0⁹*×b

Pruébalo en línea! o verificar todos los casos de prueba .

Cómo funciona

lr0⁹*×b  Main link. Arguments: x (integer), n (base)

l        Compute the logarithm of x to base n.
 r0      Range; yield all non-negative integers less than the logarithm, in
         decreasing order.
   ⁹*    Elevate n to all integers in that range.
      b  Yield the list of base-n digits of x.
     ×   Multiply each digit by the corresponding power of n.
Dennis
fuente
Ah, rango invertido ...
Leaky Nun
Es tan impresionante lo que se puede lograr con tan pocos personajes
t-clausen.dk
4

JavaScript (ES6), 47 bytes

f=(n,b,p=1,q=b*p)=>[...n<q?[]:f(n,b,q),n%q-n%p]
document.write("<pre>"+
[ [ 123456, 10 ], [ 11, 2 ], [ 727, 20 ], [ 101, 10 ] ]
.map(c=>c+" => "+f(...c)).join`\n`)

Neil
fuente
¿Quieres incluir un fragmento? :)
Leaky Nun
3

Jalea, 12 bytes

bLR’*@€U
b×ç

Puede ser muuuucho más corto ...

Pruébalo en línea!

Pomo de la puerta
fuente
3
lḞr0⁴*×bDeberia trabajar.
Dennis
Técnicamente, 0r⁴*³%Ifunciona también.
Dennis
Rasca eso. lr0⁴*×btiene el mismo número de bytes, sin todos los ceros adicionales.
Dennis
@Dennis Eso es definitivamente lo suficientemente diferente como para publicar como una respuesta separada.
Pomo de la puerta
3

Pyth - 12 11 bytes

Solo un FGITW, puede ser más corto.

.e*b^Qk_jEQ

Test Suite .

Maltysen
fuente
Eliminar el _por un byte :)
Leaky Nun
@KennyLau significaba FGITW, significa "La pistola más rápida en Occidente", un fenómeno en el que las personas que responden primero obtienen más votos positivos que las mejores respuestas.
Maltysen
@KennyLau oh, eso está permitido, derp.
Maltysen
3

J, 20 19 bytes

[(]*(^<:@#\.))#.inv

Uso

   f =: [(]*(^<:@#\.))#.inv
   10 f 123456
100000 20000 3000 400 50 6
   2 f 11
8 0 2 1
   20 f 727
400 320 7
   10 f 101
100 0 1

Explicación

[(]*(^<:@#\.))#.inv
              #.      Given a base and list of digits in that base,
                      converts it to an integer in base 10
                inv   Power conjunction by -1, creates an inverse
                      Now, this becomes a verb that given a base and an integer in base 10,
                      creates a list of digits in that base representing it
[                     Select the base and pass it along
         #\.          Tally each suffix of the list of base digits,
                      Counts down from n to 1
      <:              Decrements each value
        @             More specifically, decrement is composed with the tally and applied
                      together on each suffix
     ^                Raises each value x using base^x
  ]                   Selects the list of base digits
   *                  Multiply elementwise between each base power and base digit
millas
fuente
2

CJam, 16 bytes

{1$b\1$,,f#W%.*}

Un bloque sin nombre que espera la base y el número en la parte superior de la pila (en ese orden) y los reemplaza con la lista de dígitos (incluidos los ceros internos, sin ceros a la izquierda).

Pruébalo aquí.

Explicación

1$  e# Copy base b.
b   e# Compute base-b digits of input number.
\   e# Swap digit list with other copy of b.
1$  e# Copy digit list.
,   e# Get number of digits M.
,   e# Turn into range [0 1 ... M-1].
f#  e# Map b^() over this range, computing all necessary powers of b.
W%  e# Reverse the list of powers.
.*  e# Multiply each digit by the corresponding power.
Martin Ender
fuente
2

TSQL, 68 bytes

DECLARE @ INT=123456,@z INT=10
DECLARE @l INT=1WHILE
@>0BEGIN PRINT @%@z*@l SELECT @/=@z,@l*=@z END
t-clausen.dk
fuente
1

Python 2, 44 bytes

lambda n,b:[n/b**i%b*b**i for i in range(n)]

Salidas de menos significativas a la mayoría, con muchos ceros adicionales.

Para generar el más significativo al menos:

f=lambda n,b,c=1:n*[1]and f(n/b,b,c*b)+[n%b*c]

Recurse, quitando repetidamente los dígitos ncon divmod mientras escala el multiplicador de valor posicional c.

xnor
fuente
Para la segunda versión, ¿no puedes hacer en range(-n,1)lugar de range(n,-1,-1)?
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Gracias, no vi que ir en reversa fuera una opción. Incluso es suficiente con hacerlo range(n).
xnor
1

Ruby, 35 34 bytes

Se trata de un puerto de respuesta del pitón de XNOR , pero imprime nveces para el caso de prueba 727 20grabados 7, 320, 400, y 724 0s. Sugerencias de golf bienvenidas.

Editar: 1 byte gracias a Jordan.

->n,b{n.times{|i|p n/b**i%b*b**i}}
Sherlock9
fuente
Puede guardar un byte con n.times{|i|p ...}.
Jordania
1

Mathematica, 12 bytes (no competitivos)

¡Me pregunto si Wolfram Research creó esta función después de ver el desafío del OP!

NumberExpand

Esto se introdujo en la versión 11.0 (agosto de 2016).

DavidC
fuente
1
Edité para hacer que esto no compita porque Mathematica 11.0 se lanzó el 8 de agosto.
Leaky Nun
1

Mathematica, 46 bytes

DiagonalMatrix@IntegerDigits@##~FromDigits~#2&

Explicación:

En [1]: = IntegerDigits [123456,10]                                                

Fuera [1] = {1, 2, 3, 4, 5, 6}

En [2]: = DiagonalMatrix @ IntegerDigits [123456,10] // MatrixForm                   

Fuera [2] // MatrixForm = 1 0 0 0 0 0

                    0 2 0 0 0 0

                    0 0 3 0 0 0

                    0 0 0 4 0 0

                    0 0 0 0 5 0

                    0 0 0 0 0 6

En [3]: = DiagonalMatrix @ IntegerDigits [123456,10] ~ FromDigits ~ 10                   

Fuera [3] = {100000, 20000, 3000, 400, 50, 6}
alephalpha
fuente
Uso muy inesperado de DiagonalMatrix. Por favor explique cómo funciona en este caso.
DavidC
0

Raqueta, 82 bytes

(define(d n b[a'()])(if(< n 1)a(d(/ n b)b(cons(*(modulo(floor n)b)(length a))a))))

Soy un ganador (!)

Winny
fuente
1
Tantos espacios ... <n 1no funciona? (No conozco a Racket en absoluto)
Leaky Nun
1
No, eso no funcionaría: los identificadores están delimitados solo por espacios en blanco, paréntesis / llaves / llaves y algunos otros símbolos, como '. Sin embargo, es una buena pregunta.
Winny
(Y <es solo una variable con una función vinculada a ella)
Winny
0

JavaScript (ES7), 68 bytes

n=>b=>(c=[...n.toString(b)]).map(d=>b**--p*parseInt(d,b),p=c.length)

Prueba

Prueba de usos Math.powpara la compatibilidad del navegador.

f=n=>b=>(c=[...n.toString(b)]).map(d=>Math.pow(b,--p)*parseInt(d,b),p=c.length)
document.write("<pre>"+
[ [ 123456, 10 ], [ 11, 2 ], [ 727, 20 ], [ 101, 10 ] ]
.map(c=>c+" => "+f(c[0])(c[1])).join`\n`)

usuario81655
fuente
**¿no es un operador de JavaScript válido aunque correcto?
ericw31415
@ ericw31415 Es el operador de exponenciación ES7 .
user81655
Oh, es experimental. Es por eso que mi navegador no lo admite.
ericw31415
0

JavaScript, 75 bytes

(a,b)=>[...a.toString(b)].reverse().map(($,_)=>Math.pow(b,_)*parseInt($,b))

Solo por diversión :) Se podría jugar más al golf, pero no estoy muy seguro de cómo.

ES7, 66 bytes

Si ES7 está permitido, entonces:

(a,b)=>[...a.toString(b)].reverse().map(($,_)=>b**_*parseInt($,b))
ericw31415
fuente
0

O , 17 bytes

jQb`S/l{#Qn^*p}d

Dos notas:

  1. El tercer caso de prueba no funciona debido a un error con la conversión de base. Ver fase / o # 68 .

  2. Esto no funciona en el intérprete en línea. bNo se había implementado todavía.

kirbyfan64sos
fuente
0

> <>, 28 bytes

:&\
&*>:{:}$%:n$}-:0=?;ao$&:

Espera que los valores de entrada estén presentes en la pila al inicio del programa.

Como> <> no tiene objetos de lista, la salida se presenta como una lista de valores separados por una nueva línea, con las 'unidades' en la primera línea. Un ejemplo de ejecución:

Input: 
11 2

Ouput:
1
2
0
8

@OP, si este no es un formato de salida aceptable, avíseme y editaré la respuesta en consecuencia.

Sok
fuente
0

PHP, 55 bytes

Utiliza la codificación de Windows-1252.

for($n=$argv[1];$d+$n-=$d=$n%$argv[2]**++$i;)echo$d,~Ó;

Ejecutar así ( -dagregado solo por estética):

php -d error_reporting=30709 -r 'for($n=$argv[1];$d+$n-=$d=$n%$argv[2]**++$i;)echo$d,~Ó; echo"\n";' 123056 10
aross
fuente
0

C #, 77 bytes

IEnumerable _(int n,int b){int m=1;while(n>0){yield return n%b*m;n/=b;m*=b;}}
Nick Mertin
fuente
0

En realidad, 17 bytes (no competitivos)

;a¡;lrR(♀ⁿ@♂≈♀*;░

Pruébalo en línea!

Este envío no es competitivo porque el comando se agregó después de este desafío.

Explicación:

;a¡;lrR(♀ⁿ@♂≈♀*;░
                   initial stack: [b n] (b = base, n = number)
;                  dupe b
 a                 invert stack
  ¡                n as a base-b integer
   ;lrR            dupe, length, range, reverse
       (♀ⁿ         raise b to each power in range
          @♂≈      create list of integers from base-b string
             ♀*    pairwise multiplication
               ;░  filter out zeroes
Mego
fuente
Seguramente hay una manera de evitar ? (Golfed fuera de cuatro bytes)
Leaky Nun
0

Pip , 13 bytes

Wa-:Pa%oo*:b

Hacerlo a la antigua usanza resultó ser más corto que usar el TBoperador de conversión de base. El código ejecuta un ciclo while hasta que a(el número) sea 0. En cada iteración, lo imprime a%oy lo resta a. ose preinicializa 1y se multiplica por b(la base) cada iteración. (Este enfoque mantiene todos los correos 0electrónicos y también agrega un liderazgo 0).

Pruébalo en línea!

DLosc
fuente