Разложи число!

16

Ваша задача - разложить число в следующем формате.

Это похоже на базовое преобразование, за исключением того, что вместо перечисления digitsв базе, вы перечисляете values, так что этот список складывается со входом.

Если заданная база есть n, то каждое число в списке должно быть в форме k*(n**m), где 0<=k<nи mуникально по всему списку.

Спекуляции

  • Любой разумный формат ввода / вывода. Ваша программа / функция принимает 2 входа и выводит список.
  • Выходной список может быть в любом порядке.
  • 0 могут быть исключены или включены.
  • Ведущие 0разрешены.
  • Встроенные модули разрешены .

Testcases

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]

счет

Это . Самое короткое решение в байтах побеждает.

Пропитанная монахиня
источник

Ответы:

5

Желе , 7 байт

lr0⁹*×b

Попробуйте онлайн! или проверьте все контрольные примеры .

Как это устроено

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.
Деннис
источник
Ах, обратный диапазон ...
Leaky Nun
Это так впечатляет, чего можно достичь с помощью стольких персонажей
t-clausen.dk
4

JavaScript (ES6), 47 байт

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

Нил
источник
Хотите включить фрагмент? :)
Утренняя монахиня
3

Желе, 12 байт

bLR’*@€U
b×ç

Может быть вааааа короче ...

Попробуйте онлайн!

Дверная ручка
источник
1
jelly.tryitonline.net/…
монахиня
3
lḞr0⁴*×bдолжно сработать.
Деннис
Технически, 0r⁴*³%Iработает также.
Деннис
Сотрите это. lr0⁴*×bимеет одинаковое количество байтов, без всех дополнительных нулей.
Деннис
@Dennis Это определенно отличается, чтобы опубликовать в качестве отдельного ответа.
Дверная ручка
3

Pyth - 12 11 байт

Просто FGITW, может быть короче.

.e*b^Qk_jEQ

Тестовый пакет .

Maltysen
источник
Удалить _за байт :)
Leaky Nun
@KennyLau означало FGITW, это означает «самое быстрое оружие на Западе», феномен, когда люди, отвечающие первыми, получают больше голосов, чем лучших ответов.
Maltysen
@KennyLau о, это разрешено, сумасшедший.
Maltysen
3

J, 20 19 байт

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

использование

   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

объяснение

[(]*(^<:@#\.))#.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 байтов

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

Безымянный блок, который ожидает основание и число на вершине стека (в этом порядке) и заменяет их списком цифр (включая внутренние нули, без начальных нулей).

Проверьте это здесь.

объяснение

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 байт

DECLARE @ INT=123456,@z INT=10
DECLARE @l INT=1WHILE
@>0BEGIN PRINT @%@z*@l SELECT @/=@z,@l*=@z END
t-clausen.dk
источник
1

Python 2, 44 байта

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

Выходы от наименее значимых к большинству, со многими дополнительными нулями.

Для вывода наиболее значимого до минимума:

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

Повторяйте, многократно снимая цифры nс divmod, одновременно увеличивая множитель стоимости места c.

XNOR
источник
Для второй версии, вы не можете сделать range(-n,1)вместо range(n,-1,-1)?
Эрик Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Спасибо, я не видел, чтобы это было наоборот. Достаточно просто сделать range(n).
xnor
1

Рубин, 35 34 байта

Это порт ответа Python XNOR в , но он печатает nраз так тестовых примеров 727 20отпечатков 7, 320, 400и 7240 с. Предложения по игре в гольф приветствуются.

Изменить: 1 байт благодаря Джордан.

->n,b{n.times{|i|p n/b**i%b*b**i}}
Sherlock9
источник
Вы можете сохранить байт с помощью n.times{|i|p ...}.
Джордан
1

Mathematica, 12 байт (не конкурирует)

Интересно, создал ли Wolfram Research эту функцию, увидев вызов ОП!

NumberExpand

Это было введено в версии 11.0 (август 2016 г.).

DavidC
источник
1
Я отредактировал, чтобы сделать это неконкурентным, потому что Mathematica 11.0 была выпущена 8 августа.
Leaky Nun
1

Mathematica, 46 байт

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

Объяснение:

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

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

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

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

Out [3] = {100000, 20000, 3000, 400, 50, 6}
alephalpha
источник
Очень неожиданное использование DiagonalMatrix. Пожалуйста, объясните, как это работает в этом случае.
DavidC
0

Ракетка, 82 байта

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

Я победитель (!)

Winny
источник
1
Так много пробелов ... <n 1не работает? (Я вообще не знаю Ракетки)
Утренняя монахиня
1
Нет, это не сработает - идентификаторы ограничиваются только пробелами, круглыми скобками / фигурными скобками и некоторыми другими символами, например '. Это хороший вопрос.
Винни
<это просто переменная с привязанной к ней функцией)
Winny
0

JavaScript (ES7), 68 байт

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

Тестовое задание

Тест использует Math.powдля совместимости браузера.

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
источник
**хотя правильный оператор JavaScript не так ли?
ericw31415
О, это экспериментально. Вот почему мой браузер не поддерживает его.
ericw31415
0

JavaScript, 75 байт

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

Просто для удовольствия :) Это может быть больше в гольф, но я не слишком уверен, как.

ES7, 66 байт

Если ES7 разрешен, то:

(a,b)=>[...a.toString(b)].reverse().map(($,_)=>b**_*parseInt($,b))
ericw31415
источник
0

О , 17 байт

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

Две заметки:

  1. Третий контрольный пример не работает из-за ошибки с базовым преобразованием. Смотрите фазу / о # 68 .

  2. Это не работает в онлайн-переводчике. bеще не было реализовано.

kirbyfan64sos
источник
0

> <>, 28 байт

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

Ожидает, что входные значения будут присутствовать в стеке при запуске программы.

Поскольку> <> не имеет объектов списка, выходные данные представляются в виде списка значений, разделенных новой строкой, с 'единицами' в первой строке. Пример выполнения:

Input: 
11 2

Ouput:
1
2
0
8

@OP, если это не приемлемый формат вывода, дайте мне знать, и я соответствующим образом отредактирую ответ.

Sok
источник
0

PHP, 55 байт

Использует кодировку Windows-1252.

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

Запустите так ( -dдобавлено только для эстетики):

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

C #, 77 байт

IEnumerable _(int n,int b){int m=1;while(n>0){yield return n%b*m;n/=b;m*=b;}}
Ник Мертин
источник
0

На самом деле, 17 байтов (не конкурирующих)

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

Попробуйте онлайн!

Это представление не является конкурирующим, потому что команда была добавлена ​​после этого вызова.

Объяснение:

;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
источник
Конечно, есть способ избежать ? (Забил четыре байта)
Утренняя монахиня
0

Пип , 13 байт

Wa-:Pa%oo*:b

Делать это по старинке оказалось короче, чем с помощью TBоператора преобразования базы. Код запускает цикл while, пока a(число) не станет 0. На каждой итерации он печатает a%oи вычитает его из a. oпреинициализируется 1и умножается на b(основание) каждой итерации. (Этот подход сохраняет все 0s, а также добавляет ведущий 0.)

Попробуйте онлайн!

DLosc
источник