Sayı 2'nin gücüne bölünebilir mi?


33

Dün çocuğumla oynarken oyuncak trenindeki sayıyı fark ettim:

4281

Elimizdeki Yani olduğunu içine bölünmüş olabilir veya

4281
4281
22212320

Bu yüzden basit zorluk: Girdi olarak negatif olmayan bir sayı verilirse, sayının dize gösteriminin (temel 10'da ve baştaki sıfırlar olmadan) bir şekilde 2'nin güçleri olan sayılara bölünüp bölünmeyeceğini temsil eden tutarlı bir gerçeği ve falsey değerleri döndürün .

Örnekler:

4281      truthy (4-2-8-1)
164       truthy (16-4 or 1-64)
8192      truthy (the number itself is a power of 2)
81024     truthy (8-1024 or 8-1-02-4)
101       truthy (1-01)
0         falsey (0 cannot be represented as 2^x for any x)
1         truthy
3         falsey
234789    falsey
256323    falsey (we have 256 and 32 but then 3)
8132      truthy (8-1-32)

Tests for very large numbers (not really necessary to be handled by your code):
81024256641116  truthy (8-1024-256-64-1-1-16)
64512819237913  falsey

Bu , yani her dilin kazanması için en kısa kod olabilir!


2
@StewieGriffin başlangıçta giriş numarasını standart inttipte bir aralıkla (4 byte) sınırlamayı düşünmüştüm , ancak kodunuz çok büyük rakamları desteklemiyorsa aslında umursamıyorum. Cevaplarınızda sadece kodunuzun sınırlarını belirtin.
Charlie

3
Önerilen test durumu: 101(0 nedeniyle yanlış)) ... yoksa bu hala doğru 1 - 01mu olmalı ( )?
Shieru Asakoto

1
@ShieruAsakoto Davayı 101şu anki cevaplarla test ettim ve hepsi geri döndü true, çünkü 1-01her ikisine de ayrılabileceği için ikisinin de ikisinin de gücü olduğu için bu davayı gerçeğe uygun göreceğim.
Charlie

6
Sadece buradaki herkes için bahşiş bırakarak. Bir sayının 2 olup olmadığını kontrol etmenin üç olası yolu: 1) log2(n)Virgülten sonra ondalık basamak içerip içermediğini kontrol edin . 2) kontrol edin n AND (n-1) == 0. 3) Birim kare listesi oluşturun ve nbu listede olup olmadığını kontrol edin .
Kevin Cruijssen

1
" Kare nrs " "olmalıdır 2'nin katlarında . ..>> Elbette yukarıda benim yorumunda"
Kevin Cruijssen

Yanıtlar:


11

05AB1E , 9 8 bayt

Ýos.œåPZ

@Emigna sayesinde -1 bayt , (truthy) komutunu Ztaklit etmek için 0s ve 1s listesi için (max) kullanarak .any1

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın . (NOT: тBaşlıkta, 1002 sayının ilk giriş miktarı yerine, yalnızca 2 sayının ilk 100 gücünü elde etmek gerekir. Aynı zamanda 2'nin giriş gücü ile de çalışır, ancak oldukça verimsiz ve giriş yeterince büyükse TIO'da zaman aşımı süresi.)

Açıklama:

Ý            # Create a list in the range [0,n], where n is the (implicit) input
             # (or 100 in the TIO)
             #  i.e. 81024 → [0,1,2,3,...,81024]
 o           # Raise 2 to the `i`'th power for each `i` in the list
             #  → [1,2,4,8,...,451..216 (nr with 24391 digits)]
  s          # Swap to take the input
           # Create each possible partition of this input
             #  i.e. 81024 → [["8","1","0","2","4"],["8","1","0","24"],...,["8102","4"],["81024"]]
     å       # Check for each if it's in the list of powers of 2
             #  → [[1,1,0,1,1],[1,1,0,0],...,[0,1],[0]]
      P      # Check for each inner list whether all are truthy
             #  → [0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0]
       Z     # Take the maximum (and output implicitly)
             #  → 1 (truthy)

2
Güzel, benim çözümüm .œ.²1%O0å(9 byte). 0Ancak mayın başarısız oldu .
Bay Xcoder

@ Mr. Xcoder Ah, .²1%O0aynı zamanda oldukça akıllı. Bunun log2gibi kullanmayı düşündüm .²DïQ, ancak her sayı için bunu yapmak için etrafındaki bir haritayı gerektiriyordu ve gerçekten de son durum için işe yaramadı 0.
Kevin Cruijssen


6

JavaScript (Node.js) , 69 64 58 bayt

f=(x,m=10,q=!(x%m&x%m-1|!x))=>x<m?q:q&&f(x/m|0)||f(x,10*m)

Çevrimiçi deneyin!

Sayı olarak giriniz. Mantık kısmı oldukça kıvrımlıdır, bu yüzden onu nasıl çözeceğinizi ve nasıl kurtulacağınızı bilemeyiz q.

-11-by-2 kontrol golf yaparak.



5

Jöle , 9 bayt

ŒṖḌl2ĊƑ€Ẹ

Test odasına göz atın!


Alternatif

Hassas sorunlar nedeniyle büyük test durumlarında çalışmaz.

ŒṖḌæḟƑ€2Ẹ

Test odasına göz atın!

Nasıl?

Program I

ŒṖḌl2ĊƑ€Ẹ     Full program. N = integer input.
ŒṖ            All possible partitions of the digits of N.
  Ḍ           Undecimal (i.e. join to numbers).
   l2         Log2. Note: returns (-inf+nanj) for 0, so it doesn't fail.
     ĊƑ€      For each, check if the logarithm equals its ceil.
        Ẹ     Any. Return 0 if there are no truthy elements, 1 otherwise.

Program II

ŒṖḌæḟƑ€2Ẹ     Full program. N = integer input.
ŒṖ            All possible partitions of the digits of N.
  Ḍ           Undecimal (i.e. join to numbers).
     Ƒ€       For each partition, check whether its elements are invariant under...
   æḟ  2      Flooring to the nearest power of 2.
        Ẹ     Any. Return 0 if there are no truthy elements, 1 otherwise.


5

JavaScript, 59 bayt

s=>eval(`/^(${(g=x=>x>s?1:x+'|0*'+g(x+x))(1)})+$/`).test(s)

Çevrimiçi deneyin!

/^(1|0*2|0*4|0*8|0*16|0*32|…|0*1)+$/2 gücüne benzer bir regex oluşturur ve üzerinde test eder s.

Elbette, yalnızca JavaScript numaralarının kesinliğine kadar çalışır: sonunda regex'teki terimler benzeyecektir 1.2345678e30(veya Inf). Fakat 2 nin güçlerinin kayan noktalarda doğru şekilde temsil edilmesi kolay olduğu için, asla yanlış tamsayılar olmayacaklar, bu daha diskalifiye edici olur, sanırım.

@tsh, 14 bayt kaydetti. Neato!





3

APL (NARS), 154 karakter, 308 bayt

∇r←f w;g;b;z;k
   g←{⍵≤0:1⋄t=⌊t←2⍟⍵}⋄→A×⍳∼w≤9⋄r←g w⋄→0
A: z←w⋄b←0⋄k←1
B: b+←k×10∣z⋄z←⌊z÷10
   →C×⍳∼g b⋄r←∇z⋄→0×⍳r
C: k×←10⋄→B×⍳z≠0
   r←0
∇
h←{⍵=0:0⋄f ⍵}

Egzersizin işlevi h'dir. Algoritma üstel ya da faktörlü görünmüyor ... test:

  h¨ 4281 164 8192 81024 101 
1 1 1 1 1 
  h¨ 0 1 3 234789 256323 8132
0 1 0 0 0 1 
  h 81024256641116
1
  h 64512819237913
0




2

Ruby , 49 bayt

->n{n.to_s=~/^(0*(#{(0..n).map{|x|2**x}*?|}))*$/}

Çevrimiçi deneyin!

Sadece teoride çalışır. Sonsuza dek büyük değerler için sürern


2

PHP, 101 bayt

Bunu 100'ün altında tutamıyor gibiyim; ama bunu alabilir için eğer 100 101bir falsy böyleydi.

function f($s){for($x=.5;$s>=$x*=2;)if(preg_match("/^$x(.*)$/",$s,$m)?!~$m[1]||f(+$m[1]):0)return 1;}

N-ULL1

varyasyonları:

for($x=.5;$s>=$x*=2;)
while($s>=$x=1<<$i++)   # yields notices "undefined variable $i"

?!~$m[1]||f(+$m[1]):0
?~$m[1]?f(+$m[1]):1:0

PHP 5 veya üstü, 95 bayt

function f($s){while($s>=$x=1<<$i++)if(ereg("^$x(.*)$",$s,$m)?$m[1]>""?f(+$m[1]):1:0)return 1;}

2

Kırmızı , 212 211 bayt

func[n][g: func[x][(log-2 do x)% 1 = 0]repeat i 2 **((length? s: form n)- 1)[b: a:
copy[] k: i foreach c s[append b c if k % 2 = 0[alter a g rejoin b
b: copy[]]k: k / 2]append a g form c if all a[return on]]off]

Çevrimiçi deneyin!

Başka bir uzun gönderme, ancak tamamen tatmin edici değilim, çünkü tüm alt dizeleri Kırmızı ile bulmak için yerleşik bir yer yok.

Daha okunabilir:

f: func [ n ] [
    g: func [ x ] [ (log-2 do x) % 1 = 0 ]
    repeat i 2 ** ((length? s: form n) - 1) [
        b: a: copy []
        k: i
        foreach c s [
            append b c
            if k % 2 = 0 [ 
                append a g rejoin b
                b: copy []
            ]
            k: k / 2 
        ]
        append a g form c
        if all a[ return on ]
    ]
    off
]

2

Aksiyom, 198 bayt

G(a)==(a<=1=>2>1;x:=log_2 a;x=floor x)
F(n)==(n<=9=>G n;z:=n;b:=0;k:=1;repeat(b:=b+k*(z rem 10);z:=z quo 10;if G b and F z then return 2>1;k:=k*10;z<=0=>break);1>1)
H(n:NNI):Boolean==(n=0=>1>1;F n)

ungolf ve test

g(a)==(a<=1=>2>1;x:=log_2 a;x=floor x)
f(n)==
   n<=9=>g n
   z:=n;b:=0;k:=1
   repeat
      b:=b+k*(z rem 10);z:=z quo 10;
      if g b and f z then return 2>1
      k:=k*10
      z<=0=>break
   1>1
h(n:NNI):Boolean==(n=0=>1>1;f n)

(15) -> [[i,h i] for i in [4281,164,8192,81024,101]]
   (15)  [[4281,true],[164,true],[8192,true],[81024,true],[101,true]]
                                                      Type: List List Any
(16) -> [[i,h i] for i in [0,1,3,234789,256323,8132]]
   (16)  [[0,false],[1,true],[3,false],[234789,false],[256323,false],[8132,true]]
                                                      Type: List List Any
(17) -> [[i,h i] for i in [81024256641116, 64512819237913]]
   (17)  [[81024256641116,true],[64512819237913,false]]
                                                      Type: List List Any
(18) -> h 44444444444444444444444444
   (18)  true
                                                            Type: Boolean
(19) -> h 44444444444444444128444444444
   (19)  true
                                                            Type: Boolean
(20) -> h 4444444444444444412825444444444
   (20)  false
                                                            Type: Boolean
(21) -> h 2222222222222244444444444444444412822222222222210248888888888882048888888888888888
   (21)  true
                                                            Type: Boolean
(22) -> h 222222222222224444444444444444441282222222222225128888888888882048888888888888888
   (22)  true
                                                            Type: Boolean

1

Japt -!, 12 bayt

Bir dize olarak girdi alır.

ÊÆòXÄÃex_&ZÉ

Dene


0Durum çıkışları truegibi ve dolayısıyla durumlar 1010da çıkış true.
Charlie

1

C # 157 bayt

bool P(string s,int i=1)=>i>=s.Length?((Func<ulong,bool>)((x)=>(x!=0)&&((x&(x-1))==0)))(ulong.Parse(s)):(P(s,i+1)||(P(s.Substring(0,i))&&P(s.Substring(i))));

Şunları yapabilirsiniz çevrimiçi Deneyin


1

APL (NARS), 70 karakter, 140 bayt

P←{k←↑⍴⍵⋄x←11 1‼k k⋄y←⍵⋄∪{x[⍵;]⊂y}¨⍳↑⍴x}
f←{⍵=0:0⋄∨/∧/¨y=⌊y←2⍟⍎¨¨P⍕⍵}

Ölçek:

  f¨ 4281 164 8192 81024 101
1 1 1 1 1 
  f¨ 0 1 3 234789 256323 8132
0 1 0 0 0 1 
  f 126
0

daha büyük sayılar yapmaya çalışmıyorum ... P'nin normal bölüm olmadığını not etmeliyim, ama tüm öğelerin ardışık olan üyelerin alt küme olduğu bir bölüm.

  ⎕fmt P 'abc'
┌4──────────────────────────────────────────────────┐
│┌1─────┐ ┌2─────────┐ ┌2─────────┐ ┌3─────────────┐│
││┌3───┐│ │┌2──┐ ┌1─┐│ │┌1─┐ ┌2──┐│ │┌1─┐ ┌1─┐ ┌1─┐││
│││ abc││ ││ ab│ │ c││ ││ a│ │ bc││ ││ a│ │ b│ │ c│││
││└────┘2 │└───┘ └──┘2 │└──┘ └───┘2 │└──┘ └──┘ └──┘2│
│└∊─────┘ └∊─────────┘ └∊─────────┘ └∊─────────────┘3
└∊──────────────────────────────────────────────────┘

notun ((ac) (b)) veya daha iyisi olmadığına dikkat edin, ¨ ('ac') 'b'

  ⎕fmt ,,¨('ac')'b'
┌2─────────┐
│┌2──┐ ┌1─┐│
││ ac│ │ b││
│└───┘ └──┘2
└∊─────────┘

1

POSIX ERE, 91 bayt

(0*([1248]|16|32|64|128|256|512|1024|2048|4096|8192|16384|32768|65536|131072|262144|524288))+

Bu tamamen hile, metne dayalı büyük sayılara (kodunuz tarafından ele alınması gerçekten gerekli değil) ; örneklerin boyut aralığındaki tüm değerleri ele alır. Açıkça, boyut pahasına 32 veya 64-bit tam sayı türlerine kadar genişletilebilir. Ben esas olarak sorunun araca doğal olarak nasıl uyduğunu gösteren bir gösteri olarak yazdım. Eğlenceli bir alıştırma, keyfi bir aralık için ERE'yi üreten ve daha sonra eşleştiren bir program olarak yeniden yazmak olacaktır.


1

C (gcc) ,-DA=asprintf(&c, + 108 = 124 bayt

p,c;f(a,i){c="^(0*(1";for(i=0;i<31;)A"%s|%d",c,1<<++i);A"%s))+$",c);regcomp(&p,c,1);a=!regexec(&p,a,0,0,0);}

Çevrimiçi deneyin!

Bu, 2 ila 2 ** 32 arasındaki güçlerin bir regex'ini oluşturur ve daha sonra giriş dizgisine karşı eşleşir.


1

Powershell, 56 bayt

$x=(0..63|%{1-shl$_})-join'|0*'
"$args"-match"^(0*$x)+$"

Test komut dosyası:

$f = {

    $x=(0..63|%{1-shl$_})-join'|0*'
    "$args"-match"^(0*$x)+$"

}

@(
    ,(4281            ,$true)
    ,(164             ,$true)
    ,(8192            ,$true)
    ,(81024           ,$true)
    ,(101             ,$true)
    ,(0               ,$false)
    ,(1               ,$true)
    ,(3               ,$false)
    ,(234789          ,$false)
    ,(256323          ,$false)
    ,(8132            ,$true)
    ,("81024256641116"  ,$true)
    ,("64512819237913"  ,$false)
) | % {
    $n, $expected = $_
    $result = &$f $n
    "$($result-eq$expected): $result <- $n"
}

Çıktı:

True: True <- 4281
True: True <- 164
True: True <- 8192
True: True <- 81024
True: True <- 101
True: False <- 0
True: True <- 1
True: False <- 3
True: False <- 234789
True: False <- 256323
True: True <- 8132
True: True <- 81024256641116
True: False <- 64512819237913

Açıklama:

^(0*1|0*2|0*4|0*8|0*16|0*32|…)+$2 gücünden oluşan bir regex oluşturur ve argümanları test eder.


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.