2 Yetki Toplamı


31

Meydan okuma

Bir tamsayı girişi xverildiğinde 1 <= x <= 255, toplandığında verenin ikisinin sonuçlarını döndürün x.

Örnekler

Giriş verilen:

86

Programınızın çıktısı alınmalı:

64 16 4 2

Giriş:

240

Çıktı:

128 64 32 16

Giriş:

1

Çıktı:

1

Giriş:

64

Çıktı:

64

Toplamda ikisinin gücü belli değilse, sıfırlar içerebilir.

Örneğin, giriş 65çıkışı olabilir 0 64 0 0 0 0 0 1.

puanlama

Bu , yani her dilde en kısa cevap kazanır.


5
Liste en yüksekten en aza mı sıralanmalı?
Adám

2
Gereksiz bazı sıfırlar çıkarabilir miyiz?
Jonathan Allan,

4
RE: "en yüksekten en aza indirilmiş" neden bu zorluğun parçası olmayan bir kısıtlama ekliyor ve mevcut cevapların çoğunu geçersiz kılıyor? (Ayrıca küçük-endian hakkında ne ?!) + setlerin herhangi bir düzeni olmadığından Python cevabımı geçersiz kılar.
Jonathan Allan,

5
@ JonathanAllan Kısıtlamayı kaldırdım. Bir dahaki sefere başka bir soru gönderdiğimde bunu aklımda tutacağım - Bu konuda hala yeniyim. :)
SpookyGengar

6
Sanırım ikisinin gücünün yalnızca bir kez kullanılabileceğini belirtmek isteyebilirsiniz. Aksi halde, birisi 3 girişi için "1 1 1" çıktısı alabilir.
Black Owl Kai

Yanıtlar:


38

JavaScript (ES6), 28 bayt

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

Çevrimiçi deneyin!


9
Tüm dünyada, JavaScript cevaplarını düzeltmeme neden olan tek kişi sensin!
sergiol,

4
@sergiol, neden normal olarak bir JS çözümünü tercih etmiyorsunuz? İyi bir çözüm, kullanılan dilden veya yayınlayan kişiden bağımsız olarak iyi bir çözümdür.
Shaggy

@Shaggy Çünkü Arnauld bu tür Javascript çözümlerini yapan tek kişi gibi görünüyor. Cevapları saf dahi!
sergiol,

3
@sergiol İltifatınız için teşekkürler, ama bu tam olarak doğru değil. Düzenli olarak daha akıllıca cevaplar aştım - bu sitenin konusu bu. ^^
Arnauld,

@Oliver Emin değilim. Önde gelen sıfırlar (128'den önce) yasaklanmış gibi görünüyor. Aksi takdirde, başka bir olası değişkendir f=n=>n&&f(n&~-n)+[,n&-n].
Arnauld

12

Saf Bash , 20

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

Çevrimiçi deneyin!

açıklama

          {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

Jöle , 4 bayt

-2, kullanılmayan güçlerin yerine sıfırlar verebiliriz :)

Ḷ2*&

Çevrimiçi deneyin!

Nasıl?

Ḷ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

Jöle , 6 bayt

BUT’2*

Çevrimiçi deneyin!

açıklama

ANCAK burada bir açıklama (not: Sadece 2’nin güçlerini ve başka hiçbir şeyin gücünü verebileceğimizi varsaymıştım):

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]

Doğru çalıştığını "Kanıt". Temel 2'deki X tamsayısının standart gösterimi listesidir{x1,x2,x3,,xn} , burada xi{0,1},i1,n¯ , öyle ki:

X=i=1nxi2ni
Endekslerii öyle kixi=0 açıkça bir katkısı olmaz, bu yüzden sadecexi=1 olanları bulmakla ilgileniriz = 1 . Çıkarılarak yanai denn (iki güçler her formun Çin'li uygun değilni , neredei a herhangi endeksidir1 ), bu listede yer alan truthy endekslerini bulmak yerine, onu tersine çeviririz ve sonra onları "geriye" ile buluruzUT. Şimdi doğru endeksleri bulduktan sonra tek yapmamız gerekeno güçlere2 yükseltmek.


1
"ASCII-only" Orada sinsi ...
Outgolfer Erik

1
@EriktheOutgolfer sanırım BUT2*Hişe yarayacaktı.
Bay Xcoder,

1
Bu 302231454903657293676544 bir girdiyle çalışıyor oldukça etkileyici.
Michael Karas



8

Balyoz 0.2, 3 bayt

⡔⡸⢣

İçine sıkıştırır {intLiteral[2],call[NumberExpand,2]}.

Balyoz, kod sayfası olarak Braille kullanan Wolfram Dil kodu için bir kompresördür. Yukarıdakilerin gerçek boyutu 2.75 bayttır, ancak metadaki mevcut kurallar nedeniyle, en yakın bayta kadar doldurma kod boyutunda sayılır.


2
Huh! Düzgün küçük dil ve tüm karakterler aslında yazdırılabilir.
LegionMammal978

Ve şimdi Peter Gabriel şarkısını aklımdan
çıkaramıyorum

8

05AB1E , 3 bayt

Ýo&

Liman içinde @JonathanAllan 'ın Jelly cevap , çok emin onu upvote olun!

Sıfırlar (sondaki sıfırlar dahil).

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

Ý      # 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
... ne?! bitwise andOsabie'de dürüstçe hiç kullanılmamış. Güzel bir.
Magic Octopus Urn

@ MagicOctopusUrn Gerçekten de çok sık kullanmıyorum. Kullandığım başka bir cevabı bile bulamıyorum &. XD Bitwise-XOR 'u birkaç kez kullandım, burada ya da burada ve Bitwise-NOT burada bir kez (daha sonra golf oynadıktan sonra tekrar çıkardım ..). Java'da oldukça sık Bitwise-VE, XOR, VEYA, DEĞİL, ÜST KRKT vb. :)
Kevin Cruijssen



7

R , 27 23 bayt

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

Çevrimiçi deneyin!

Kontrolsüz kod ve açıklama:

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)
  • @Kirill L. sayesinde 4 bayt

1
23 bit ve bitsel bayt .
Kirill L.

@KirillL .: mükemmel!
digEmAll

7

C # (Visual C # Etkileşimli Derleyici) , 29 bayt

5 yazdırılamayan karakter içeriyor.

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

açıklama

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

Çevrimiçi deneyin!


Ancak, sıfırlardan kurtulmamız gerekiyor, n=>new int[8].Select((j,i)=>1<<i&n).Where(i=>i!=0)önceki bölüm WhereBeş byte daha kısa btw
polfosol ఠ_ఠ

@polfosolThe output may contain zeros
Jo King,

2
@JoKing Yine de, n=>new int[8].Select((j,i)=>1<<i&n)35 bayt uzunluğunda ve ek bayraklara ve metin kodlamalarına ihtiyacımız olmayacak.
polfosol ఠ_ఠ

1
0-7 ascii karakterlerini kullanmak daha kısa olmalıdır, mesela n=>"INSERT ASCII HERE".Select(a=>1<<a&n)Ama ben basılabilirleri görüntüleyemeyen veya yazamayan bir mobil cihazdayım, bu yüzden yanıtı güncellemek için eve gelinceye kadar beklemem gerekecek
Ignorance'ın

6

C # (Visual C # Etkileşimli Derleyici) , 38 bayt

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

Çevrimiçi deneyin!



1
Başarısız girişler için 1, 2, 4, 8, 16, vb ( x>yolmalıdır x>=yyerine).
Kevin Cruijssen

1
@ASCIIOnly - Size söylüyorum, mesafe operatörü tatlı olacak :)
dana

@ ASCII sadece ortalama süre, bayrağa kullanabilirsiniz /u:System.Linq.Enumerableve deneyin bu 31 byte için
Düzenleme Cahiliyye

@EmbodimentofIgnorance emin. fakat dili "C # /u:System.Linq.Enumerable" olarak listelemeyi tercih
ASCII-sadece


5

05AB1E, 7 bayt

2вRƶ<oò

açıklama:

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

Çevrimiçi deneyin!


Ayrıca 302231454903657293676544
Michael Karas



5

C (clang) , 133 110 63 58 bayt

@Ceilingcat sayesinde 58 baytlık çözüm .

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

Çevrimiçi deneyin!


C89'da, gibi main(){}ve dönüş tipi varsayılan olarak int olarak bildirebilirsiniz . Global kapsamdaki değişkenler için aynı. Ayrıca, en azından clang, printf ve scanf gibi normal uygulamalar üzerinde prototipsiz çalışır. Elbette uyarılar alıyorsunuz, ancak yine de C89 (belki) veya en azından K & R C'nin açık bir şekilde bildirilmesi geçerli. C tipleri öyleyse, onlar geçti konum nasıl args tanımlayıp olarak geçirmek nesneleri char*ve int*x86-64 ya da bir şey üzerinde 32-bit işaretçileri kesmeden olacak Sadece çalışmak. (Varsayılan argüman promosyonları, zaten oldukları değişkenlik işlevleriyle aynı olur.)
Peter Cordes,

Yoksa tanımlanmamış bir davranışı olmayan geçerli bir C11 mi hedefliyor? Eğer öyleyse, gururla ilan edin. :) Ve BTW, çıktı dizisini argüman olarak alan bir işlev yazmak büyük olasılıkla daha küçük olacaktır. Neyse, bkz . C’de golf oynamak için ipuçları
Peter Cordes,

&Bir bit ayarlanmış olup olmadığını kontrol etmek için bit yönünde kullanabilirsiniz . Gibi y&(1<<x)&&printf("%d ",1<<x);. Veya sadece sıfır atlamamak için printf("%d ", y&(1<<x)). Veya bunun yerine bit pozisyonları, kullanımın sayılması x=256ve x>>=1maske kaydırmaya. main(y){int x=256;for(scanf("%d",&y);x>>=1;)printf("%d ",y&x);}63 bytes Çevrimiçi deneyin! clang bile bunu derleyecek-std=c11
Peter Cordes,


4

MATL , 5 bayt

BPfqW

Çevrimiçi deneyin!

açıklama

86Bir örnek olarak girişi düşünün .

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 bayt

Jonathan Allan sayesinde -4 bayt

*+&2**all ^8

Çevrimiçi deneyin!

8 elementli bir All Junction döndürür. Bu oldukça standart olmayan bir geri dönüş yöntemidir, ancak genel olarak, Kavşaklar sıralı gibi davranabilir (en azından otomatik diş işleme uygulanıncaya kadar) listeler ve değerleri birinden çıkarmak mümkündür.

Açıklama:

*+&              # 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 bayt

Æ&2pX

Dene

Æ&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

Alternatif

Bayrağını kullanarak çıktıda s önlemek için Oliver tarafından önerildi .0-mf

N&2pU

Dene

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
Güzel bir. Sen yapabilirsin N&2pUile -mfönlemek için 0s
Oliver




4

K (OK) , 19 16 bayt

Ngn sayesinde -3 bayt!

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

Çevrimiçi deneyin!

OK poweroperatörüne sahip değil , bu yüzden yardımcı bir işleve ihtiyacım var {*/x#2}(2 xkez kopyalayın ve elde edilen listeyi çarpımla azaltın)



@ ngn Teşekkürler! Denedim ve çalıştı, ancak kabul edilebilir olduğundan emin değildim.
Galen Ivanov

4

Simyacı , 125 bayt

_->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

Çevrimiçi deneyin! veya Her girişi test edin!

açıklama

_->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 bayt

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

Çevrimiçi deneyin!

Veya 38 , eğlenceli >>=operatör ve PHP 5.6+ olmadan:

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

Veya 36 adet küçük harfli ("0 2 4 0 16 0 64 0") çıktı:

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

Gerçekten sadece >>=operatörü kullanmak istedim , bu yüzden 39'a bağlı kalıyorum .

Testler:

$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 bayt

Daha kısa bir fantezi çözümü bulamıyor, işte standart bir döngü. MickyT ve KirillL sayesinde -4 bayt

DECLARE @y int=255

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

Denemek


bitsel ve (&) tuşlarını kullanarak, aşağıdakilerden birkaçını kaydedebilirsiniz ,@ int=128s:print @y&@ set @/=2IF @>0GOTO s. Bu R cevap için @KillillL tarafından ima edildi
MickyT

@MickyT bir çekicilik gibi çalıştı. Çok teşekkürler
t-clausen.dk


3

C# (Visual C# Interactive Compiler), 33 bytes

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

Port of @Arnauld's JavaScript (ES6) answer, so make sure to upvote him!

Try it online.

Explanation:

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`
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.