Rozłóż liczbę!

16

Twoim zadaniem jest dekompozycja liczby przy użyciu poniższego formatu.

Jest to podobne do konwersji podstawowej, z tą różnicą, że zamiast wyszczególnienia digitsw bazie, podajesz listę w valuestaki sposób, że lista sumuje się z danymi wejściowymi.

Jeśli podana jest podstawa n, to każda liczba na liście musi mieć postać k*(n**m), gdzie 0<=k<ni mjest unikalna na całej liście.

Okular

  • Dowolny rozsądny format wejścia / wyjścia. Twój program / funkcja pobiera 2 wejścia i wyświetla listę.
  • Lista wyników może być w dowolnej kolejności.
  • 0 można wykluczyć lub włączyć.
  • Prowadzenie 0jest dozwolone.
  • Wbudowane są dozwolone .

Przypadki testowe

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]

Punktacja

To jest . Najkrótsze rozwiązanie w bajtach wygrywa.

Leaky Nun
źródło

Odpowiedzi:

5

Galaretka , 7 bajtów

lr0⁹*×b

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .

Jak to działa

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
źródło
Ach, odwrócony zasięg ...
Leaky Nun
To imponujące, co można osiągnąć przy tak małej
liczbie
4

JavaScript (ES6), 47 bajtów

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
źródło
Chcesz dołączyć fragment kodu? :)
Leaky Nun
3

Galaretka, 12 bajtów

bLR’*@€U
b×ç

Może być krótszy ...

Wypróbuj online!

Klamka
źródło
3
lḞr0⁴*×bpowinno działać.
Dennis
Technicznie też 0r⁴*³%Idziała.
Dennis
Zdrap to. lr0⁴*×bma taką samą liczbę bajtów, bez wszystkich dodatkowych zer.
Dennis
@Dennis To zdecydowanie wystarczająco inne, aby opublikować jako osobną odpowiedź.
Klamka
3

Pyth - 12 11 bajtów

Po prostu FGITW, może być krótszy.

.e*b^Qk_jEQ

Pakiet testowy .

Maltysen
źródło
Usuń _bajt :)
Leaky Nun
@KennyLau oznaczało FGITW, co oznacza „najszybszą broń na zachodzie”, zjawisko, w którym ludzie odpowiadający jako pierwsi otrzymują więcej głosów pozytywnych niż lepszych odpowiedzi.
Maltysen
@KennyLau oh dozwolone, derp.
Maltysen
3

J, 20 19 bajtów

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

Stosowanie

   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

Wyjaśnienie

[(]*(^<:@#\.))#.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
mile
źródło
2

CJam, 16 bajtów

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

Nienazwany blok, który oczekuje podstawy i liczby na górze stosu (w tej kolejności) i zastępuje je listą cyfr (łącznie z zerami wewnętrznymi, bez zer wiodących).

Sprawdź to tutaj.

Wyjaśnienie

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
źródło
2

TSQL, 68 bajtów

DECLARE @ INT=123456,@z INT=10
DECLARE @l INT=1WHILE
@>0BEGIN PRINT @%@z*@l SELECT @/=@z,@l*=@z END
t-clausen.dk
źródło
1

Python 2, 44 bajty

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

Wyprowadza wartości od najmniej znaczącej do większości, z wieloma dodatkowymi zerami.

Aby uzyskać wyniki od najbardziej znaczących do najmniej:

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

Powtarzaj, wielokrotnie nusuwając cyfry z divmod, jednocześnie zwiększając mnożnik wartości miejsca c.

xnor
źródło
W przypadku drugiej wersji nie możesz range(-n,1)tego zrobić range(n,-1,-1)?
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Dzięki, nie widziałem, żeby odwrócenie było opcją. Wystarczy nawet zrobić range(n).
xnor
1

Ruby, 35 lat 34 bajtów

Jest to port XNOR za Pythona odpowiedź , ale drukuje nrazy więc przypadek testowy 727 20drukuje 7, 320, 400, i 7240 s. Sugestie dotyczące gry w golfa mile widziane.

Edycja: 1 bajt dzięki Jordanowi.

->n,b{n.times{|i|p n/b**i%b*b**i}}
Sherlock9
źródło
Możesz zapisać bajt za pomocą n.times{|i|p ...}.
Jordania,
1

Mathematica, 12 bajtów (niekonkurujące)

Zastanawiam się, czy Wolfram Research stworzyło tę funkcję po zobaczeniu wyzwania PO!

NumberExpand

Zostało to wprowadzone w wersji 11.0 (sierpień 2016).

DavidC
źródło
1
Zrobiłem edycję, aby nie konkurować, ponieważ Mathematica 11.0 została wydana 8 sierpnia.
Leaky Nun
1

Mathematica, 46 bajtów

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

Wyjaśnienie:

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

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

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

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

Out [3] = {100000, 20000, 3000, 400, 50, 6}
alephalpha
źródło
Bardzo nieoczekiwane użycie DiagonalMatrix. Prosimy wyjaśnić, jak to działa w tym przypadku.
DavidC,
0

Rakieta, 82 bajty

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

Jestem zwycięzcą (!)

Winny
źródło
1
Tak wiele przestrzeni ... <n 1nie działa? (W ogóle nie znam rakiety)
Leaky Nun
1
Nie, to by nie działało - identyfikatory są ograniczone tylko białymi spacjami, nawiasami / nawiasami klamrowymi / nawiasami klamrowymi i innymi symbolami, takimi jak '. Ale to dobre pytanie.
Winny
(I <to tylko zmienna z związaną z nią funkcją)
Winny
0

JavaScript (ES7), 68 bajtów

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

Test

Testowe zastosowania Math.powdla zgodności przeglądarki.

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

użytkownik 81655
źródło
**nie jest prawidłowym operatorem JavaScript, prawda?
ericw31415
@ ericw31415 To operator potęgowania ES7 .
user81655
Och, to eksperymentalne. Dlatego moja przeglądarka go nie obsługuje.
ericw31415
0

JavaScript, 75 bajtów

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

Po prostu dla zabawy :) Można by bardziej zagrać w golfa, ale nie jestem pewien, jak to zrobić.

ES7, 66 bajtów

Jeśli ES7 jest dozwolone, to:

(a,b)=>[...a.toString(b)].reverse().map(($,_)=>b**_*parseInt($,b))
ericw31415
źródło
0

O , 17 bajtów

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

Dwie notatki:

  1. Trzeci przypadek testowy nie działa z powodu błędu konwersji bazy. Patrz faza / o # 68 .

  2. To nie działa w tłumaczu online. bnie został jeszcze wdrożony.

kirbyfan64sos
źródło
0

> <>, 28 bajtów

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

Oczekuje, że wartości wejściowe będą obecne na stosie podczas uruchamiania programu.

Ponieważ> <> nie ma obiektów listy, dane wyjściowe są przedstawiane jako lista wartości oddzielonych znakiem nowej linii, z „jednostkami” w pierwszym wierszu. Przykładowy przebieg:

Input: 
11 2

Ouput:
1
2
0
8

@OP, jeśli nie jest to akceptowalny format wyjściowy, daj mi znać, a odpowiednio zmienię odpowiedź.

Sok
źródło
0

PHP, 55 bajtów

Używa kodowania Windows-1252.

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

Działaj w ten sposób ( -ddodano tylko dla estetyki):

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

C #, 77 bajtów

IEnumerable _(int n,int b){int m=1;while(n>0){yield return n%b*m;n/=b;m*=b;}}
Nick Mertin
źródło
0

Właściwie 17 bajtów (niekonkurujących)

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

Wypróbuj online!

To zgłoszenie nie jest konkurencyjne, ponieważ polecenie zostało dodane po tym wyzwaniu.

Wyjaśnienie:

;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
źródło
Z pewnością istnieje sposób, aby tego uniknąć ? (Grał poza czterema bajtami)
Leaky Nun
0

Pip , 13 bajtów

Wa-:Pa%oo*:b

Wykonanie tego w staromodny sposób okazało się krótsze niż użycie TB podstawowego operatora konwersji. Kod uruchamia pętlę while, dopóki a(liczba) nie będzie 0. Przy każdej iteracji drukuje a%oi odejmuje go a. ojest wstępnie zainicjowany 1i zostaje pomnożony przez b(podstawową) każdą iterację. (Takie podejście zachowuje wszystko0 s, a także dodaje wiodące 0.)

Wypróbuj online!

DLosc
źródło