Décomposer un nombre!


16

Votre tâche consiste à décomposer un nombre en utilisant le format ci-dessous.

Ceci est similaire à la conversion de base, sauf qu'au lieu de répertorier le digitsdans la base, vous répertoriez le values, de sorte que la liste s'additionne à l'entrée.

Si la base donnée est n, alors chaque numéro de la liste doit être sous la forme de k*(n**m), où 0<=k<net mest unique dans la liste.

Spécifications

  • Tout format d'entrée / sortie raisonnable. Votre programme / fonction prend 2 entrées et sort une liste.
  • La liste de sortie peut être dans n'importe quel ordre.
  • 0 peut être exclu ou inclus.
  • Les premiers 0sont autorisés.
  • Les fonctions intégrées sont autorisées .

Cas de test

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]

Notation

C'est du . La solution la plus courte en octets gagne.

code-golf  number  sequence  number-theory  base-conversion  code-golf  bitwise  hashing  code-golf  string  ascii-art  whitespace  code-golf  math  code-golf  code-golf  image-processing  counting  code-golf  math  arithmetic  checksum  code-golf  code-golf  math  arithmetic  number-theory  code-golf  array-manipulation  random  code-golf  string  code-golf  math  ascii-art  base-conversion  code-golf  graphical-output  geometry  3d  code-golf  math  linear-algebra  matrix  code-golf  math  number  sequence  code-golf  array-manipulation  code-golf  math  matrix  linear-algebra  code-golf  number  sequence  counting  code-golf  string  code-golf  string  restricted-source  quine  sorting  code-golf  string  geometry  code-golf  string  code-golf  networking  code-golf  base-conversion  code-golf  math  matrix  code-golf  arithmetic  linear-algebra  matrix  code-golf  number  arithmetic  grid  code-golf  number  source-layout  code-golf  string  bitwise  checksum  code-golf  array-manipulation  code-golf  string  probability-theory  code-golf  tips  code-golf  sequence  code-golf  string  math  sequence  calculus  code-golf  string  palindrome  bioinformatics  code-golf  math  combinatorics  counting  permutations  code-golf  parsing  logic-gates  code-golf  arithmetic  number-theory  combinatorics  code-golf  math  sequence  polynomials  integer  code-golf  string  ascii-art  chess  code-golf  string  code-golf  number  code-golf  string  ascii-art  parsing  code-golf  code-golf  number  natural-language  conversion  code-golf  arithmetic  code-golf  string  code-golf  ascii-art  decision-problem 

Réponses:


5

Gelée , 7 octets

lr0⁹*×b

Essayez-le en ligne! ou vérifiez tous les cas de test .

Comment ça fonctionne

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.

Ah, plage inversée ...
Leaky Nun

C'est tellement impressionnant ce qui peut être réalisé avec si peu de personnages
t-clausen.dk

4

JavaScript (ES6), 47 octets

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`)


Voulez-vous inclure un extrait? :)
Leaky Nun


3

Pyth - 12 11 octets

Juste un FGITW, peut être plus court.

.e*b^Qk_jEQ

Suite de tests .


Supprimez le _pour un octet :)
Leaky Nun

@KennyLau signifie FGITW, cela signifie "le pistolet le plus rapide de l'Ouest", un phénomène où les personnes qui répondent en premier obtiennent plus de votes positifs que les meilleures réponses.
Maltysen

@KennyLau oh c'est permis, derp.
Maltysen

3

J, 20 19 octets

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

Usage

   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

Explication

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

2

CJam, 16 octets

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

Un bloc sans nom qui attend la base et le numéro en haut de la pile (dans cet ordre) et les remplace par la liste des chiffres (y compris les zéros internes, sans zéros non significatifs).

Testez-le ici.

Explication

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.

2

TSQL, 68 octets

DECLARE @ INT=123456,@z INT=10
DECLARE @l INT=1WHILE
@>0BEGIN PRINT @%@z*@l SELECT @/=@z,@l*=@z END

1

Python 2, 44 octets

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

Sorties du moins significatif au plus, avec de nombreux zéros supplémentaires.

Pour produire du plus significatif au moins:

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

Recurse, en supprimant à plusieurs reprises des chiffres navec divmod tout en augmentant le multiplicateur de valeur de position c.


Pour la deuxième version, vous ne pouvez pas faire à la range(-n,1)place de range(n,-1,-1)?
Erik the Outgolfer

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Merci, je n'ai pas vu que faire marche arrière était une option. Il suffit même de le faire range(n).
xnor

1

Rubis, 35 34 octets

Ceci est un port de réponse Python xnor , mais il imprime nparfois si le cas de test 727 20imprime 7, 320, 400et 724 0s. Suggestions de golf bienvenues.

Edit: 1 octet grâce à Jordan.

->n,b{n.times{|i|p n/b**i%b*b**i}}

Vous pouvez enregistrer un octet avec n.times{|i|p ...}.
Jordan

1

Mathematica, 12 octets (non concurrent)

Je me demande si Wolfram Research a créé cette fonction après avoir vu le défi du PO!

NumberExpand

Cela a été introduit dans la version 11.0 (août 2016).


1
J'ai édité pour rendre cela non compétitif parce que Mathematica 11.0 est sorti le 8 août.
Leaky Nun

1

Mathematica, 46 octets

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

Explication:

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

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

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

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

Sortie [3] = {100000, 20000, 3000, 400, 50, 6}

Utilisation très inattendue de DiagonalMatrix. Veuillez expliquer comment cela fonctionne dans ce cas.
DavidC

0

Raquette, 82 octets

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

Je suis un gagnant (!)


1
Tant d'espaces ... ça <n 1ne marche pas? (Je ne connais pas du tout la raquette)
Leaky Nun

1
Non, cela ne fonctionnerait pas - les identificateurs sont délimités uniquement par des espaces, des parenthèses / accolades / accolades et quelques autres symboles, comme '. C'est une bonne question, cependant.
Winny

(Et <n'est qu'une variable avec une fonction qui lui est liée)
Winny

0

JavaScript (ES7), 68 octets

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

Tester

Tester les utilisations Math.powpour la compatibilité du navigateur.

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`)


**n'est-ce pas un opérateur JavaScript valide?
ericw31415

@ ericw31415 C'est l' opérateur d'exponentiation ES7 .
user81655

Oh, c'est expérimental. C'est pourquoi mon navigateur ne le prend pas en charge.
ericw31415

0

JavaScript, 75 octets

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

Juste pour le plaisir :) Il pourrait être plus joué au golf, mais je ne sais pas trop comment.

ES7, 66 octets

Si ES7 est autorisé, alors:

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

0

O , 17 octets

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

Deux notes:

  1. Le troisième cas de test ne fonctionne pas en raison d'un bogue avec la conversion de base. Voir phase / o # 68 .

  2. Cela ne fonctionne pas dans l'interpréteur en ligne. bn'avait pas encore été mis en œuvre.


0

> <>, 28 octets

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

Attend que les valeurs d'entrée soient présentes sur la pile au démarrage du programme.

Comme> <> n'a pas d'objets de liste, la sortie est présentée comme une liste de valeurs séparées par des sauts de ligne, avec les «unités» sur la première ligne. Un exemple de course:

Input: 
11 2

Ouput:
1
2
0
8

@OP, si ce n'est pas un format de sortie acceptable, faites-le moi savoir et je modifierai la réponse en conséquence.


0

PHP, 55 octets

Utilise l'encodage Windows-1252.

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

Courez comme ceci ( -dajouté pour l'esthétique uniquement):

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

0

C #, 77 octets

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

0

En fait, 17 octets (non concurrents)

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

Essayez-le en ligne!

Cette soumission n'est pas en concurrence car la commande a été ajoutée après ce défi.

Explication:

;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


0

Pip , 13 octets

Wa-:Pa%oo*:b

Le faire à l'ancienne s'est avéré être plus court que d'utiliser l' TBopérateur de conversion de base. Le code exécute une boucle while jusqu'à ce que a(le nombre) soit 0. À chaque itération, il l'imprime a%oet le soustrait a. oest préinitialisé 1et multiplié par b(la base) à chaque itération. (Cette approche conserve tous les 0s et ajoute également un leader 0.)

Essayez-le en ligne!

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.