Сумма Полномочий 2

31

Соревнование

При заданном целочисленном входе, xгде 1 <= x <= 255возвращаются результаты степеней двух, которые при суммировании дают x.

Примеры

Учитывая вход:

86

Ваша программа должна вывести:

64 16 4 2

Входные данные:

240

Выход:

128 64 32 16

Входные данные:

1

Выход:

1

Входные данные:

64

Выход:

64

Вывод может содержать нули, если в сумме нет определенной степени двух.

Например, ввод 65может выводить 0 64 0 0 0 0 0 1.

счет

Это , поэтому выигрывает самый короткий ответ на каждом языке.

SpookyGengar
источник
5
Должен ли список быть отсортирован по убыванию?
Адам
2
Можем ли мы вывести несколько избыточных нулей?
Джонатан Аллан
4
RE: «отсортировано от высшего к низшему», зачем добавлять ограничение, которое не было частью задачи и лишало законной силы большинство существующих ответов? (А как насчет little-endian ?!) + это делает недействительным мой ответ на Python, так как множества не имеют никакого порядка.
Джонатан Аллан
5
@JonathanAllan Я снял ограничение. Я буду помнить это в следующий раз, когда я отправлю другой вопрос - я все еще довольно новичок в этом. :)
SpookyGengar
6
Я думаю, что вы могли бы заявить, что любая степень двух может быть использована только один раз. В противном случае кто-то может вывести «1 1 1» для входа 3.
Черная сова Кай

Ответы:

38

JavaScript (ES6), 28 байт

f=n=>n?[...f(n&~-n),n&-n]:[]

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

Arnauld
источник
9
Вы единственный человек в мире, который может заставить меня ответить на JavaScript!
sergiol
4
@sergiol, почему бы вам не одобрить решение JS? Хорошее решение - это хорошее решение, независимо от используемого языка или того, кто его опубликовал.
лохматый
@ Shaggy Потому что Арно, кажется, единственный человек, который делает такие решения Javascript. Его ответы - чистый гений!
sergiol
3
@sergiol Спасибо за комплимент, но это не совсем так. Меня регулярно опережают более умные ответы - и это то, чем занимается этот сайт. ^^
Арно
@ Оливер, я не уверен. Кажется, что ведущие нули (до 128) запрещены. В противном случае, другой возможный вариант f=n=>n&&f(n&~-n)+[,n&-n].
Арнаулд
12

Чистый Баш , 20

echo $[2**{7..0}&$1]

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

объяснение

          {7..0}     # Brace expansion: 7 6 5 4 3 2 1 0
       2**{7..0}     # Brace expansion: 128 64 32 16 8 4 2 1
       2**{7..0}&$1  # Brace expansion: 128&n 64&n 32&n 16&n 8&n 4&n 2&n 1&n (Bitwise AND)
     $[2**{7..0}&$1] # Arithmetic expansion
echo $[2**{7..0}&$1] # and output
Цифровая травма
источник
12

Желе , 4 байта

-2, поскольку мы можем выводить нули вместо неиспользованных степеней 2 :)

Ḷ2*&

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

Как?

Ḷ2*& - Link: integer, n         e.g. 10
Ḷ    - lowered range of n            [  0,  1,  2,  3,  4,  5,  6,  7,  8,  9]
 2*  - two to the power of           [  1,  2,  4,  8, 16, 32, 64,128,256,512]
   & - bit-wise and                  [  0,  2,  0,  8,  0,  0,  0,  0,  0,  0]
Джонатан Аллан
источник
11

Желе , 6 байт

BUT’2*

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

объяснение

НО здесь есть объяснение (примечание: я предполагал, что мы можем выводить только полномочия 2 и ничего больше):

BUT’2* – Monadic link. Takes a number N as input. Example: 86
B      – Convert N to binary.                              [1, 0, 1, 0, 1, 1, 0]
 U     – Reverse.                                          [0, 1, 1, 0, 1, 0, 1]
  T    – Truthy indices.                                   [2, 3, 5, 7]
   ’   – Decrement.                                        [1, 2, 4, 6]
    2* – Raise 2 to that power.                            [2, 4, 16, 64]

«Доказательство», что оно работает правильно. Стандартным представлением целого числа Икс в базе 2 является список {Икс1,Икс2,Икс3,,ИксN} , где Икся{0,1},я1,N¯ , такоечто

Иксзнак равноΣязнак равно1NИкся2N-я
Индексыя такойчтоИксязнак равно0 , очевидноне имеют никакого вкладапоэтому мы заинтересованы только в поиске техтакиечтоИксязнак равно1 . Так как вычитатья изN не удобно (степени двух имеют показатели степени видаN-я , гдея - любой индекс1 ) вместо того, чтобы найти правдивые индексы в этом списке, мы обращаем его вспять, а затем находим их «назад» с помощьюUT. Теперь, когда мы нашли правильные индексы, все, что нам нужно сделать, это поднять2 до этих сил.

Мистер Xcoder
источник
1
"ASCII-only" подлый там ...
Эрик Outgolfer
1
@EriktheOutgolfer Я думаю, BUT2*Hбудет работать, хотя.
г-н Xcoder
1
Довольно впечатляет, что это работает с входом 302231454903657293676544.
Майкл Карас
8

APL (Dyalog Extended) , 7 байтов SBCS

Функция анонимного молчаливого префикса. Требуется индексирование на основе 0 ( ⎕IO←0).

2*⍸⍢⌽⍤⊤

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

2 два
* поднятые к власти
 в ɩ ndices , где правда ,
 а
 обращено
 из
 двоичного представления

Адам
источник
8

Кувалда 0,2, 3 байта

⡔⡸⢣

Распаковывает в {intLiteral[2],call[NumberExpand,2]} .

Sledgehammer - это компрессор для кода Wolfram Language, использующий шрифт Брайля в качестве кодовой страницы. Фактический размер вышеупомянутого составляет 2,75 байта, но в соответствии с текущими правилами мета, заполнение до ближайшего байта учитывается в размере кода.

lirtosiast
источник
2
Ха! Аккуратный язык, и все символы на самом деле для печати.
LegionMammal978
И теперь я не могу выбросить из головы песню Питера Габриэля ...
Цифровая травма
8

05AB1E , 3 байта

Ýo&

Порт @JonathanAllan 's Jelly ответа , так что обязательно проголосуйте за него!

Содержит нули (в том числе -нагрузки конечных нулей).

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

Объяснение:

Ý      # Create a list in the range [0, (implicit) input]
       #  i.e. 15 → [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
       #  i.e. 16 → [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
 o     # Take 2 to the power of each value
       #  → [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
       #  → [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536]
  &    # Bitwise-AND each value with the (implicit) input
       # 15 → [1,2,4,8,0,0,0,0,0,0,0,0,0,0,0,0]
       # 16 → [0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0]
       # (and output the result implicitly)
Кевин Круйссен
источник
1
... что?! Никогда честно не видел, bitwise andиспользовал в Осабье. Хороший.
Волшебная Осьминог Урна
@MagicOctopusUrn Я тоже не очень часто его использую. Я даже не могу найти никакого другого ответа, который я использовал &. XD Я использовал Bitwise-XOR пару раз, как здесь или здесь, так и Bitwise-NOT один раз здесь (который я позже удалил снова после игры в гольф дальше ...). Я действительно использую побитовые-и, XOR, OR, NOT, SHIFT и т. Д. Довольно часто в Java, но в 05AB1E не так много. :)
Кевин Круйссен
8

Католикон , 3 байта

ṫĊŻ

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

Объяснение:

ṫ       Decompose         into the largest values where:
 Ċ               the input
  Ż       the bit count is truthy (equal to one)
Okx
источник
Интересный! Получить TIO'd: D
Джонатан Аллан
Работает с 302231454903657293676544. Ницца.
Майкл Карас
7

R , 27 23 байта

bitwAnd(scan(),2^(7:0))

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

Развернутый код и объяснение:

A = scan()         # get input number A from stdin
                   # e.g. A = 65

bitwAnd( A , 2^(7:0))  # bitwise AND between all powers of 2 : 2^7 ... 2^0 and A
                       # and implicitly print the result
                       # e.g. B = bitwAnd(65, c(128,64,32,16,8,4,2,1)) = c(0,64,0,0,0,0,0,1)
  • 4 байта благодаря @Kirill L.
digEmAll
источник
1
23 байта с побитовым и.
Кирилл Л.
@KirillL .: великолепно!
digEmAll
7

C # (интерактивный компилятор Visual C #) , 29 байт

Содержит 5 непечатаемых символов.

n=>"€@ ".Select(a=>a&n)

объяснение

//Lambda taking one parameter 'n'
n=>
//String with ASCII characters 128, 64, 32, 16, 8, 4, 2, and 1
"€@ "
//Iterate through all the chars of the above string and transform them to
.Select(a=>
//A bitwise AND operation between the integer value of the current char and the input value
a&n)

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

Воплощение невежества
источник
Но нам нужно , чтобы избавиться от корней, как n=>new int[8].Select((j,i)=>1<<i&n).Where(i=>i!=0)часть адреса перед Whereпять байт короче кстати
polfosol ఠ_ఠ
@polfosolThe output may contain zeros
Джо Кинг
2
@JoKing Тем не менее, его длина n=>new int[8].Select((j,i)=>1<<i&n)составляет 35 байт, и нам не понадобятся дополнительные флаги и кодировки текста.
Полфосол ఠ_ఠ
1
Использование символов ascii 0-7 должно быть короче, например, n=>"INSERT ASCII HERE".Select(a=>1<<a&n)но я на мобильном устройстве, которое не может отображать или печатать непечатные, поэтому мне придется подождать, пока я вернусь домой, чтобы обновить ответ
Embodiment of Ignorance
6

C # (интерактивный компилятор Visual C #) , 38 байт

x=>{for(int y=8;y-->0;Print(x&1<<y));}

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

Dana
источник
ау, закрыто: P
только ASCII
1
Сбой для входов 1, 2, 4, 8, 16и т.д. ( x>yдолжно быть x>=yвместо этого).
Кевин Круйссен
1
@ASCIIOnly - я говорю вам, оператор диапазона будет очень мило :)
Дана
@ ASCII-only Между тем вы можете использовать флаг /u:System.Linq.Enumerableи попробовать его для 31 байта
Воплощение невежества
@EmbodimentofIgnorance уверен. но я бы предпочел не указывать язык как "C # /u:System.Linq.Enumerable": P
только для ASCII
5

05AB1E, 7 байтов

2вRƶ<oò

объяснение:

2в        convert input to binary array
R         reverse array
ƶ<        multiply each item by it's index and subtract 1
oò        2^item then round down

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

Джексон
источник
Также работает с вводом 302231454903657293676544
Майкл Карас
5

С (лязг) , 133 110 63 58 байт

58-байтовое решение благодаря @ceilingcat .

x=256;main(y){for(scanf("%d",&y);x/=2;)printf("%d ",y&x);}

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

каменная паукообразная
источник
В C89 вы можете объявить like main(){}и тип возвращаемого значения по умолчанию int. То же самое для переменных в глобальной области видимости. Также, по крайней мере, на обычных реализациях, таких как clang, printf и scanf, работают без прототипов. Вы, конечно, получаете предупреждения, но это все еще допустимый C89 (возможно) или, по крайней мере, K & R C для их неявного объявления. Типы объектов C, которые вы передаете в качестве аргументов, определяют, как они передаются, поэтому a char*и int*Just Work будет работать без усечения указателей до 32-разрядных на x86-64 или чем-либо еще. (Повышение аргументов по умолчанию происходит так же, как и для функций с переменным числом, которыми они в любом случае являются.)
Питер Кордес
Или это стремление быть действительным C11 без неопределенного поведения? Если это так, гордо объявить это. :) И кстати, написание функции, которая принимает выходной массив в качестве аргумента, вероятно, будет меньше. Во всяком случае, см. Советы по игре в гольф в C
Питер Кордес
Вы можете использовать побитовое, &чтобы проверить, установлен ли бит. Как y&(1<<x)&&printf("%d ",1<<x);. Или просто не пропускать нули printf("%d ", y&(1<<x)). Или вместо подсчета битовых позиций используйте x=256и x>>=1для смещения маски. main(y){int x=256;for(scanf("%d",&y);x>>=1;)printf("%d ",y&x);}63 байта Попробуйте онлайн! clang даже скомпилирует это с-std=c11
Питер Кордес
44 байта
потолочная кошка
4

MATL , 5 байтов

BPfqW

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

объяснение

Рассмотрим ввод 86в качестве примера.

B    % Implicit input. Convert to binary (highest to lowest digits)
     % STACK: [1 0 1 0 1 1 0]
P    % Flip
     % STACK: [0 1 1 0 1 0 1]
f    % Find: indices of nonzeros (1-based)
     % STACK: [2 3 5 7]
q    % Subtract 1, element-wise
     % STACK: [1 2 4 6]
W    % Exponential with base 2, element-wise. Implicit display
     % STACK: [2 4 16 64]
Луис Мендо
источник
4

Perl 6 , 16 12 байт

-4 байта благодаря Джонатану Аллану

*+&2**all ^8

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

Возвращает All Junction с 8 элементами. Это довольно нестандартный способ возврата, но, как правило, соединения могут действовать как упорядоченные (по крайней мере, до тех пор, пока не будет реализована автоматическая обработка) списки, и можно извлечь значения из одного.

Объяснение:

*+&              # Bitwise AND the input with
   2**           # 2 raised to the power of
      all ^8     # All of the range 0 to 7
Джо Кинг
источник
4

Japt, 8 5 байт

Æ&2pX

Попытайся

Æ&2pX     :Implicit input of integer U
Æ         :Map each X in the range [0,U)
 &        :  Bitwise AND of U with
  2pX     :  2 to the power of X

альтернатива

Предложено Оливером, чтобы избежать 0s в выводе, используя -mfфлаг.

N&2pU

Попытайся

N&2pU     :Implicitly map each U in the range [0,input)
N         :The (singleton) array of inputs
 &        :Bitwise AND with
  2pX     :2 to the power of U
          :Implicitly filter and output
мохнатый
источник
1
Хороший. Вы можете сделать N&2pUс, -mfчтобы избежать 0с
Оливер
4

05AB1E , 9 байтов

Ýoʒ›}æʒOQ

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


Это также верно для 6 байтов, но не завершается вовремя на TIO для 86:

05AB1E , 6 байтов

ÝoæʒOQ

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

Урна волшебного осьминога
источник
1
Оба ваших ответа выдают пустой набор 15вместо[1,2,4,8]
Кевин Круйссен
1
@KevinCruijssen нужно 2**0, хороший улов. Ýболее L.
Волшебная Осьминог Урна
1
Ах, я знаю это чувство. И имел Lвместо того, Ýчтобы сначала в моем ответе.
Кевин Круйссен
4

K (ок) , 19 16 байт

-3 байта благодаря ngn!

{*/x#2}'&|(8#2)\

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

ОК не имеет powerоператора, поэтому мне нужна вспомогательная функция {*/x#2}(скопировать в 2 xраза и уменьшить полученный список умножением)

Гален Иванов
источник
Вы можете опустить{ x}
нгн
@ngn Спасибо! Я попробовал это, и это сработало, но я не был уверен, что это приемлемо.
Гален Иванов
4

Алхимик , 125 байт

_->In_x+128a+m
m+x+a->m+b
m+0x+a->n+a
m+0a->o+Out_b+Out_" "
n+b->n+x+c
n+0b+a->n+c
n+0a->p
o+b->o+c
o+0b->p
p+2c->p+a
p+0c->m

Попробуйте онлайн! или проверить каждый вход!

объяснение

_->In_x+128a+m           # Initialize universe with input, 128a (value to compare to) and m (state)
m+x+a->m+b               # If c has been halved, subtract min(a, x) from a and x and put its value into b
m+0x+a->n+a              # If x < a, continue to state n
m+0a->o+Out_b+Out_" "    # Else print and continue to state o
n+b->n+x+c               # Add min(a, x) (i.e. x) back to x, and add it to c (we're collecting a back into c)
n+0b+a->n+c              # Then, add the rest of a to c
n+0a->p                  # Then, go to state p
o+b->o+c                 # Add min(a, x) (i.e. a) to c - x _is_ greater than a and so contains it in its binary representation, so we're not adding back to x
o+0b->p                  # Then, go to state p
p+2c->p+a                # Halve c into a
p+0c->m                  # Then go to state m
ASCII-только
источник
4

PHP ,41 39 байт

for($c=256;$c>>=1;)echo$argv[1]&$c,' ';

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

Или 38 без весёлого >>=оператора и PHP 5.6+:

for($x=8;$x--;)echo$argv[1]&2**$x,' ';

Или 36 с прямым порядком байтов ("0 2 4 0 16 0 64 0"):

while($x<8)echo$argv[1]&2**$x++,' ';

На самом деле я просто хотел использовать >>=оператора, поэтому я придерживаюсь 39 .

тесты:

$php pow2.php 86
0 64 0 16 0 4 2 0

$php pow2.php 240
128 64 32 16 0 0 0 0

$php pow2.php 1
0 0 0 0 0 0 0 1

$php pow2.php 64
0 64 0 0 0 0 0 0

$php pow2.php 65
0 64 0 0 0 0 0 1
640 КБ
источник
4

TSQL, 43 39 байт

Не могу найти более короткое причудливое решение, поэтому вот стандартный цикл. -4 байта благодаря MickyT и KirillL

DECLARE @y int=255

,@ int=128s:PRINT @y&@ SET @/=2IF @>0GOTO s

Попробуйте это

t-clausen.dk
источник
используя побитовые и (&) вы можете сохранить несколько с помощью следующего ,@ int=128s:print @y&@ set @/=2IF @>0GOTO s. На это намекнул @KirillL для ответа R
MickyT
@ MickyT, который работал как шарм. Большое спасибо
t-clausen.dk
3

Python 2 , 43 40 байт

f=lambda n,p=1:n/p*[1]and f(n,p*2)+[p&n]

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

овс
источник
1
@JonathanAllan это определенно помогло. Спасибо, что уведомили меня.
овс
1
... и ограничение было снято, поэтому -1 байт :)
Джонатан Аллан
3

C # (интерактивный компилятор Visual C #), 33 байта

n=>{for(;n>0;n&=n-1)Print(n&-n);}

Порт @Arnauld 's JavaScript (ES6) ответ , так что обязательно проголосуйте за него!

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

Объяснение:

n=>{            // Method with integer parameter and no return-type
  for(;n>0      //  Continue looping as long as `n` is larger than 0:
      ;         //    After every iteration:
       n&=n-1)  //     Bitwise-AND `n` by `n-1`
    Print(      //   Print with trailing newline:
      n&-n);}   //    `n` bitwise-AND `-n`
Кевин Круйссен
источник