Decomponha um número!

16

Sua tarefa é decompor um número usando o formato abaixo.

Isso é semelhante à conversão de base, exceto que, em vez de listar o digitsna base, você lista values, de modo que a lista seja adicionada à entrada.

Se a base especificada for n, cada número da lista deve estar na forma de k*(n**m), onde 0<=k<ne mé único em toda a lista.

Especificações

  • Qualquer formato de entrada / saída razoável. Seu programa / função recebe 2 entradas e gera uma lista.
  • A lista de saída pode estar em qualquer ordem.
  • 0 pode ser excluído ou incluído.
  • Leading 0são permitidos.
  • Built-ins são permitidos .

Casos de teste

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]

Pontuação

Isso é . A solução mais curta em bytes vence.

Freira Furada
fonte

Respostas:

5

Geléia , 7 bytes

lr0⁹*×b

Experimente online! ou verifique todos os casos de teste .

Como 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
fonte
Ah, faixa revertida ...
Leaky Nun
É tão impressionante que pode ser alcançado com tão poucos personagens
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
fonte
Gostaria de incluir um trecho? :)
Leaky Nun
3

Gelatina, 12 bytes

bLR’*@€U
b×ç

Pode ser muito mais curto ...

Experimente online!

Maçaneta da porta
fonte
3
lḞr0⁴*×bDeveria trabalhar.
Dennis
Tecnicamente, 0r⁴*³%Ifunciona também.
Dennis
Risca isso. lr0⁴*×btem a mesma contagem de bytes, sem todos os zeros extras.
Dennis
@ Dennis Isso é definitivamente diferente o suficiente para postar como uma resposta separada.
Maçaneta
3

Pitão - 12 11 bytes

Apenas um FGITW, pode ser mais curto.

.e*b^Qk_jEQ

Conjunto de Teste .

Maltysen
fonte
Retire o _para um byte :)
Leaky Nun
@KennyLau significava FGITW, significa "Arma Mais Rápida do Oeste", um fenômeno em que as pessoas que respondem primeiro recebem mais votos do que as melhores respostas.
Maltysen
@KennyLau oh isso é 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

Explicação

[(]*(^<:@#\.))#.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
milhas
fonte
2

CJam, 16 bytes

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

Um bloco sem nome que espera a base e o número no topo da pilha (nessa ordem) e os substitui pela lista de dígitos (incluindo zeros internos, sem zeros à esquerda).

Teste aqui.

Explicação

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
fonte
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
fonte
1

Python 2, 44 bytes

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

Saídas do menos significativo para o mais, com muitos zeros extras.

Para gerar mais significativo para menos:

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

Recursa, retirando repetidamente dígitos ncom divmod enquanto aumenta o multiplicador do valor do local c.

xnor
fonte
Para a segunda versão, você não pode fazer em range(-n,1)vez de range(n,-1,-1)?
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Obrigado, eu não vi que ir ao contrário fosse uma opção. Basta apenas fazer range(n).
Xnor
1

Rubi, 35 34 bytes

Esta é uma porta da resposta Python do xnor , mas imprime nvezes, para que o caso de teste seja 727 20impresso 7,320 , 400, e 724 0s. Sugestões de golfe são bem-vindas.

Edit: 1 byte graças a Jordan.

->n,b{n.times{|i|p n/b**i%b*b**i}}
Sherlock9
fonte
Você pode salvar um byte com n.times{|i|p ...}.
Jordânia
1

Mathematica, 12 bytes (não concorrente)

Gostaria de saber se a Wolfram Research criou essa função depois de ver o desafio do OP!

NumberExpand

Isso foi introduzido na versão 11.0 (agosto de 2016).

DavidC
fonte
1
Eu editei para fazer este não concorrentes, porque Mathematica 11.0 foi lançado em agosto 8.
Leaky Nun
1

Mathematica, 46 bytes

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

Explicação:

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

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

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

Out [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

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

Out [3] = {100000, 20000, 3000, 400, 50, 6}
alefalpha
fonte
Uso muito inesperado de DiagonalMatrix. Por favor, explique como funciona neste caso.
DavidC
0

Raquete, 82 bytes

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

Eu sou um vencedor (!)

Winny
fonte
1
Tantos espaços ... <n 1não funciona? (Eu não sei Racket em tudo)
Leaky Nun
1
Não, isso não funcionaria - os identificadores são delimitados apenas por espaços em branco, parênteses / chaves / chaves e outros símbolos, como '. É uma boa pergunta, no entanto.
Winny
(E <é apenas uma variável com uma função ligado a ele)
Winny
0

JavaScript (ES7), 68 bytes

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

Teste

Usos de teste Math.powpara compatibilidade do 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`)

user81655
fonte
**não é um operador JavaScript válido, certo?
Ericw31415
@ ericw31415 É o operador de exponenciação do ES7 .
User81655
Oh, é experimental. É por isso que meu navegador não suporta.
Ericw31415
0

JavaScript, 75 bytes

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

Só por diversão :) Poderia jogar mais, mas não sei muito bem como.

ES7, 66 bytes

Se o ES7 for permitido, então:

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

O , 17 bytes

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

Duas notas:

  1. O terceiro caso de teste não funciona devido a um erro na conversão de base. Veja fase / o # 68 .

  2. Isso não funciona no intérprete online. bainda não havia sido implementado.

kirbyfan64sos
fonte
0

> <>, 28 bytes

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

Espera que os valores de entrada estejam presentes na pilha no início do programa.

Como> <> não possui objetos de lista, a saída é apresentada como uma lista de valores separados por nova linha, com as 'unidades' na primeira linha. Um exemplo de execução:

Input: 
11 2

Ouput:
1
2
0
8

@ OP, se este não for um formato de saída aceitável, informe-me e editarei a resposta de acordo.

Sok
fonte
0

PHP, 55 bytes

Usa a codificação Windows-1252.

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

Execute assim ( -dadicionado apenas para 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
fonte
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
fonte
0

Na verdade, 17 bytes (não concorrentes)

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

Experimente online!

Este envio não é concorrente porque o comando foi adicionado após este desafio.

Explicação:

;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
fonte
Certamente há uma maneira de evitar ? (Golfed fora quatro bytes)
gotejante Nun
0

Pip , 13 bytes

Wa-:Pa%oo*:b

Fazer isso da maneira antiga acabou sendo mais curto do que usar o TBoperador de conversão de base. O código executa um loop while até que a(o número) seja 0. A cada iteração, ele a imprime a%oe subtrai a. oé pré-inicializado 1e multiplicado por b(a base) a cada iteração. (Essa abordagem mantém todos os se 0adiciona uma liderança 0.)

Experimente online!

DLosc
fonte