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


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]

счет

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

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 

Ответы:


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


3

Желе, 12 байт

bLR’*@€U
b×ç

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

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



3
lḞr0⁴*×bдолжно сработать.
Деннис

Технически, 0r⁴*³%Iработает также.
Деннис

Сотрите это. lr0⁴*×bимеет одинаковое количество байтов, без всех дополнительных нулей.
Деннис

@Dennis Это определенно отличается, чтобы опубликовать в качестве отдельного ответа.
Дверная ручка

3

Pyth - 12 11 байт

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

.e*b^Qk_jEQ

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


Удалить _за байт :)
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

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.


Для второй версии, вы не можете сделать 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}}

Вы можете сохранить байт с помощью n.times{|i|p ...}.
Джордан

1

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

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

NumberExpand

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


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}

Очень неожиданное использование 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))))

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


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


**хотя правильный оператор 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))

0

О , 17 байт

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

Две заметки:

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

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


0

> <>, 28 байт

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

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

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

Input: 
11 2

Ouput:
1
2
0
8

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


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


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


0

Пип , 13 байт

Wa-:Pa%oo*:b

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.