Сума повноважень 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
Чи слід сортувати список від найвищого до найнижчого?
Adám

2
Чи можемо ми вивести кілька зайвих нулів?
Джонатан Аллан

4
RE: "відсортовано від найвищого до найнижчого", чому додати обмеження, яке не було частиною виклику, і визнає недійсними більшість існуючих відповідей? (А що з маленьким ендіаном ?!) + це скасовує мою відповідь Python, оскільки набори не мають жодного порядку.
Джонатан Аллан

5
@JonathanAllan Я видалив обмеження. Я маю це на увазі наступного разу, коли публікую ще одне питання - я все ще досить новий. :)
SpookyGengar

6
Я думаю, ви можете сказати, що будь-яка потужність двох може бути використана лише один раз. Інакше хтось може вивести "1 1 1" на вхід 3.
Чорна сова Кай

Відповіді:


38

JavaScript (ES6), 28 байт

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

Спробуйте в Інтернеті!


9
Ти єдина людина у всьому світі, яка може змусити мене відповісти на JavaScript!
серхіол

4
@sergiol, чому б ти зазвичай не схвалив рішення JS? Хороше рішення - це хороше рішення незалежно від мови, якою ви користувались, чи хто їх розмістив.
Кудлатий

@Shaggy Тому що Арнольд, здається, єдина людина, яка робить такі рішення Javascript. Його відповіді - чистий геній!
Серхіол

3
@sergiol Дякую за комплімент, але це не зовсім так. Мене регулярно перемагають більш розумні відповіді - і ось про що цей сайт. ^^
Арнольд

@Oliver Я не впевнений. Схоже, провідні нулі (до 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 - це список , де , так що: Індекси такі, що очевидно, не мають внеску, тому нас цікавить лише знаходження таких, що . Оскільки віднімання від не є зручним (у двох сил є показники форми , де - будь-який індекс aX{x1,x2,x3,,xn}xi{0,1},i1,n¯

X=i=1nxi2ni
ixi=0xi=1innii1), замість того, щоб в цьому списку знаходити правдиві індекси, ми повертаємо їх назад, а потім знаходимо їх "назад" . Тепер, коли ми знайшли правильні показники, все, що нам потрібно зробити, - це підняти до цих повноважень.2UT2



1
@EriktheOutgolfer, мабуть BUT2*H, працював би.
Містер Xcoder

1
Досить вражає, що це працює з вкладом 302231454903657293676544.
Майкл Карась



8

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

⡔⡸⢣

Декомпресується в {intLiteral[2],call[NumberExpand,2]}.

Кувалда - компресор для мовного коду Wolfram, що використовує шрифт Брайля як кодову сторінку. Фактичний розмір вищезазначеного - 2,75 байт, але завдяки діючим правилам щодо мета, додавання до найближчого байту рахується в розмірі коду.


2
Ага! Акуратно мало мови, і всі символи є насправді для друку.
LegionMammal978

І тепер я не можу випустити пісню Пітера Габріеля з розуму ...
Digital Trauma

8

05AB1E , 3 байти

Ýo&

Відповідь Желе на порту @JonathanAllan , тому обов'язково підтримайте його!

Містить нулі (включаючи -нагрузки- нулі нулів).

Спробуйте в Інтернеті або перевірте всі тестові справи .

Пояснення:

Ý      # 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використаного в osabie. Хороший.
Чарівний восьминіг Урна

@MagicOctopusUrn Я також теж не дуже часто його використовую. Я навіть не можу знайти жодної іншої відповіді, яку я використав &. XD Я кілька разів використовував Bitwise-XOR, як тут чи тут, і Bitwise-НЕ один раз тут (який пізніше я знову видаляв після подальшого гольфу ..). Я дуже часто використовую Bitwise-AND, 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 # Interactive Compiler) , 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на п’ять байтів коротша за
добу

@polfosolThe output may contain zeros
Jo King

2
@JoKing Проте n=>new int[8].Select((j,i)=>1<<i&n)триває 35 байт, і нам не знадобляться додаткові прапорці та текстові кодування.
polfosol ఠ_ఠ

1
Використання символів ascii 0-7 повинно бути коротшим, наприклад, n=>"INSERT ASCII HERE".Select(a=>1<<a&n)але я перебуваю на мобільному пристрої, який не може відображати або вводити недруковані версії, тому мені доведеться почекати, поки я повернусь додому, щоб оновити відповідь
Embodiment of Ignorance

6

C # (Visual C # Interactive Compiler) , 38 байт

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

Спробуйте в Інтернеті!



1
Збій для входів 1, 2, 4, 8, 16і т.д. ( x>yповинно бути x>=yзамість цього).
Kevin Cruijssen

1
@ASCIIТолько - я вам кажу, далекобійний оператор буде милий :)
дата

@ ASCII Тільки середній час, ви можете використовувати прапор /u:System.Linq.Enumerableі спробувати це на 31 байт
Втілення Незнання

@EmbodimentofIgnorance впевнений. але я вважаю за краще не перелічити мову як "C # /u:System.Linq.Enumerable": P
лише для ASCII





5

C (стук) , 133 110 63 58 байт

58-байтне рішення завдяки @ceilingcat .

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

Спробуйте в Інтернеті!


У C89 ви можете оголосити як main(){}і повернути типовим типом значення int. Те саме для змінних на глобальному рівні. Крім того, принаймні у звичайних реалізаціях, таких як clang, printf та scanf, працюють без прототипів. Звичайно, ви отримуєте попередження, але це все ще дійсне C89 (можливо) або принаймні K&R C, щоб вони були неявно оголошені. Типи об'єктів C, які ви передаєте у вигляді арг, визначає, як вони передаються, тому a char*і int*буде просто працювати без обрізання покажчиків на 32-розрядні на x86-64 або щось інше. (Промоція аргументів за замовчуванням трапляється так само, як і для різноманітних функцій, якими вони є в будь-якому випадку.)
Пітер Кордес,

Або це спрямоване на те, щоб бути дійсним C11 без визначеної поведінки? Якщо так, гордо заявляйте про це. :) І BTW, написання функції, яка приймає вихідний масив як аргумент, ймовірно, буде меншою. У будь-якому разі дивіться Поради щодо гольфу в 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 байти Спробуйте в Інтернеті! Кланг навіть складе це з-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

Спробуйте в Інтернеті!

Повертає все з'єднання з 8 елементами. Це досить нестандартний спосіб повернення, але, як правило, Junctions можуть діяти як упорядковані (принаймні, доки не буде впроваджено автоматичне читання) списків, і можна отримати значення з одного.

Пояснення:

*+&              # 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щоб уникнути 0S
Олівер

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

К (оК) , 19 16 байт

-3 байти завдяки ngn!

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

Спробуйте в Інтернеті!

oK не має 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 # Interactive Compiler), 33 байти

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

Порт @Arnauld JavaScript (ES6) відповідь «s , тому переконайтеся , що upvote його!

Спробуйте в Інтернеті.

Пояснення:

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.