Сумма Полномочий 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.

счет

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


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]:[]

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


9
Вы единственный человек в мире, который может заставить меня ответить на JavaScript!
sergiol

4
@sergiol, почему бы вам не одобрить решение JS? Хорошее решение - это хорошее решение, независимо от используемого языка или того, кто его опубликовал.
лохматый

@ Shaggy Потому что Арно, кажется, единственный человек, который делает такие решения Javascript. Его ответы - чистый гений!
sergiol

3
@sergiol Спасибо за комплимент, но это не совсем так. Меня регулярно опережают более умные ответы - и это то, чем занимается этот сайт. ^^
Арно

@ Оливер, я не уверен. Кажется, что ведущие нули (до 128) запрещены. В противном случае, другой возможный вариант f=n=>n&&f(n&~-n)+[,n&-n].
Арнаулд



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 до этих сил.


1
"ASCII-only" подлый там ...
Эрик Outgolfer

1
@EriktheOutgolfer Я думаю, BUT2*Hбудет работать, хотя.
г-н Xcoder

1
Довольно впечатляет, что это работает с входом 302231454903657293676544.
Майкл Карас



8

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

⡔⡸⢣

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

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


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 не так много. :)
Кевин Круйссен



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.

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


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

С (лязг) , 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
Питер Кордес


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

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

4

TSQL, 43 39 байт

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

DECLARE @y int=255

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

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


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

@ MickyT, который работал как шарм. Большое спасибо
t-clausen.dk


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