Bu sayı Two Bit Number ™ ️ mı?

Sep 30 2020

Two Bit Number ™ ️ tanımlayarak başlayalım:

  • Pozitif bir tam sayıdır
  • İkili dizge olarak ifade edildiğinde tam olarak 2 gerçek biti vardır VEYA
  • Ondalık sayı olarak ifade edildiğinde, tam olarak bir sayıdan 2'sine sahiptir ve diğer tüm sayılar sıfırdır.

Veya bir cümle olarak

Bir İki Bitli Sayı ™ ️, 1 sayısının tam olarak 2'sini içeren ve ondalık dize veya ikili sayı olarak ifade edildiğinde 0'dan başka hiçbir rakamı içermeyen bir sayıdır.

Yani burada 0 ile 256 arasındaki tüm Two Bit Numbers ™ 'ı alan

Dec  Bin       Type
3    00000011  Binary
5    00000101  Binary
6    00000110  Binary
9    00001001  Binary
10   00001010  Binary
11   00001011  Decimal
12   00001100  Binary
17   00010001  Binary
18   00010010  Binary
20   00010100  Binary
24   00011000  Binary
33   00100001  Binary
34   00100010  Binary
36   00100100  Binary
40   00101000  Binary
48   00110000  Binary
65   01000001  Binary
66   01000010  Binary
68   01000100  Binary
72   01001000  Binary
80   01010000  Binary
96   01100000  Binary
101  01100101  Decimal
110  01101110  Decimal
129  10000001  Binary
130  10000010  Binary
132  10000100  Binary
136  10001000  Binary
144  10010000  Binary
160  10100000  Binary
192  11000000  Binary

Meydan okuma:

  • Bir sayıyı kabul eden ve bir Two Bit Number ™ ️ ise doğru veya yanlış (veya doğru veya yanlışın bir göstergesini) veren bir kod yazın.
  • Girdi her zaman bir tamsayı olacaktır, ancak her zaman pozitif olmayabilir.
  • İstediğiniz herhangi bir dilde olabilir.
  • Bu kod golf, yani en az bayt kazanır.
  • Lütfen kodunuz için çevrimiçi bir tercümanın bağlantılarını ekleyin (tio.run gibi).

Test Durumları

Binary Two Bit Numbers ™ ️:

  • 3
  • 9
  • 18
  • 192
  • 288
  • 520
  • 524304

Ondalık İki Bitli Sayılar ™ ️:

  • 11
  • 101
  • 1001
  • 1010
  • 1100
  • 1000001
  • 1100000000
  • 1000000010

Non Two Bit Numbers ™ ️:

  • 0
  • 1
  • 112 (1'in üzerindeki herhangi bir sayı bunun ikili olmasını engeller
  • 200
  • 649
  • -1
  • -3

Eğlenceli gerçek: Yaklaşık 14 milyara kadar kontrol eden herhangi bir DecimalBinary Two Bit Numbers ™ bulamadım ve böyle bir sayının var olmadığına dair bir hipotezim var, ancak matematiksel kanıtım yok. Aklınıza bir tane gelirse, duymak isterim.

Yanıtlar

17 ovs Sep 30 2020 at 20:20

Python 3 , 68 62 48 bayt

-6 bayt xnor sayesinde !
-14 bayt Jitse sayesinde !

lambda n:' 11 'in f' {n:b} {n} '.replace('0','')

Çevrimiçi deneyin!

10 Arnauld Sep 30 2020 at 20:23

JavaScript (ES6), 38 bayt

İade 0 için gerçek için veya sıfır olmayan tamsayı YANLıŞ .

n=>(g=n=>!(n&=n-1)|n&n-1)(n)*g('0b'+n)

Çevrimiçi deneyin!

Nasıl?

Yardımcı fonksiyon g , en az anlamlı iki bit kümesini iki kez nhesaplayarak kaldırır n & (n - 1). İlk seferde 0 alırsak , bu nen fazla bir bit kümesine sahip olduğu anlamına gelir ki bu yeterli değildir. Biz ise yok olsun 0 ikinci kez, bu demektir nçok fazla 2'den fazla bit kümesi bulunuyor.

Ondalık testi için, çağırmak gr ile '0b' + nbir ikili değer olarak ayrıştırmak. Eğer nnegatif ise, bu gibi şeyler verir '0b-10100'NaN'ish ve beklendiği gibi başarısız.


JavaScript (ES6),  40  39 bayt

İade girişi olup olmadığını bir Boole değeri anlatma değil bir iki Bit sayısı.

n=>[n,'0b'+n].every(n=>!(n&=n-1)|n&n-1)

Çevrimiçi deneyin!

10 Lynn Sep 30 2020 at 22:13

Haskell , 50 bayt

f n=or[b^x+b^y==n|b<-[2,10],x<-[0..n],y<-[x+1..n]]

Çevrimiçi deneyin!

Kaba kuvvet arama.

Alternatif 50 bayt

b!0=0
b!x=rem x b^3+b!quot x b
f n=2!n==2||10!n==2

b!xtaban b"küp basamaklı toplamını" hesaplar x. Örneğin, 10!123= \$1^3+2^3+3^3\$ = 36.

2'den birinin mi 2!nyoksa 10!neşit mi olduğunu kontrol ederiz .

quotnegatif girişi desteklemek için gereklidir. Sıfıra divyuvarlanır, aşağı yuvarlar, yani div (-1) 10 == (-1)sonsuz bir döngüye neden olur.

8 Razetime Sep 30 2020 at 20:08

APL (Dyalog Genişletilmiş) , 18 bayt

2∊+/↑(*3)2 10⊤¨0⌈⎕

Çevrimiçi deneyin!

Jo King'in 18 bayt çözümü.

APL (Dyalog Genişletilmiş) , 20 21 20 26 25 bayt

{<⍵:2∊+/↑(⊂×⍨⍎¨⍕⍵)⍪⊂⊤⍵⋄0}

Çevrimiçi deneyin!

Cevabı düzelttikten sonra +1 bayt (ovs).

Ovs'un önerisinden sonra -1 bayt. (Yaşasın!)

Negatif test durumlarını doğru şekilde kabul ettikten sonra +7 bayt.

Adám'dan -1 bayt.

J çözümünden esinlenilmiştir.

Açıklama

{⍵>0:2∊+/↑(⊂2*⍨⍎¨⍕⍵)⍪⊂⊤⍵⋄0}
 ⍵>0:                       If number is positive
                      ⊤⍵    Decode number to binary
            ×⍨⍎¨⍕⍵          square each digit
         ↑ ⊂        ⍪⊂      join into two rows
       +/                   sum each row
     2∊                     is two present in it?
                         ⋄0 otherwise return 0
6 KevinCruijssen Sep 30 2020 at 20:07

05AB1E , 8 7 bayt

b‚€{11å

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

Açıklama:

b        # Convert the (implicit) input-integer to a binary string
 ‚       # Pair it together with the (implicit) input-integer
  €{     # Sort the digits in each string
    11å  # And check if this pair contains an 11 (which is truthy for "011","0011",etc.)
         # (after which the result is output implicitly)
6 DominicvanEssen Oct 01 2020 at 12:38

R , 50 49 48 46 bayt

Düzenleme: -1 bayt ve ardından -1 bayt ve ardından -2 bayt, Robin Ryder sayesinde

gsub(0,'',n<-scan())!=11&sum(n%/%2^(0:n)%%2)-2

Çevrimiçi deneyin!

'Kaldırmak için metin manipülasyon kullanarak ondalık 2bit numaraları için testler 0' rakam ve sonuç olup olmadığını kontrol değil ' 11ikili basamak hesaplanması ve onlar eğer kontrol ederek ikili 2bit numaraları için' ve sonra testler yok toplamı 2. 2 bitlik sayılar için YANLIŞ, 2 bit olmayan sayılar için DOĞRU döndürür.
Esasen aynı özellik için iki farklı türde test yapmak biraz zor görünüyor, ancak bir şekilde oldukça kısa çıkıyor ...

5 xash Sep 30 2020 at 19:53

J , 25 bayt

0&<*10&#.inv+&(2=1#.*~)#:

Çevrimiçi deneyin!

Nasıl çalışır

0&<*10&#.inv+&(2=1#.*.~)#:
0&<*                       input is a positive number
    10&#.inv               list of digits base 10
                        #: list of digits base 2
            +&(        )   OR the result of both …
                    *.~    square each digit (x>=2 will be larger than 2)
                 1#.       sum
               2=          is equal to two

OndalıkBinary bir sayı varsa, +as OR 2 ile sonuçlanabilir, bu nedenle için bir bayta daha fazla ihtiyaç duyulur +..

5 UnrelatedString Sep 30 2020 at 20:15

Brachylog , 9 bayt

ℕ{ḃc|}o11

Çevrimiçi deneyin!

Biraz utandım, daha önce diğer çözümlerin sıralama temelli yaklaşımlarını tercüme etmeyi düşünmemiştim ...

Daha eğlenceli bir çözüm:

Brachylog , 10 bayt

ℕ{|ẹ~ḃ}ḃ+2

Çevrimiçi deneyin!

ℕ             The input is a whole number (necessary to exclude -3 etc.),
 {|   }       which either unchanged or
   ẹ          with its decimal digits
    ~ḃ        interpreted as binary (impossible if any ≥ 2),
       ḃ      has binary digits
        +2    that sum to 2.

Brachylog , 12 11 bayt

ℕ{ḃ|ẹ}<ᵛ²+2

Çevrimiçi deneyin!

Xash sayesinde -1 bayt

ℕ              The input is a whole number,
 { | }         and either
  ḃ            its binary digits
    ẹ          or its decimal digits
      <ᵛ²      are all less than 2
         +2    and sum to 2.
5 Shaggy Sep 30 2020 at 20:48

Japt , 9 bayt

Bundan en az bir bayt daha kesmenin bir yolu olmalı.

ìͶBªB¥¢ñ

Deneyin veya tüm test durumlarını çalıştırın

ìͶBªB¥¢ñ     :Implicit input of integer U
ì             :Convert to digit array
 Í            :Sort (and implicitly convert back to integer)
  ¶           :Test for strict equality with
   B          :11
    ª         :Logical OR with
     B¥       :Test 11 for equality with
       ¢      :Convert U to binary string
        ñ     :Sort
5 JoKing Oct 01 2020 at 12:52

Raku , 25 bayt

{$_|.base(2)~~/^10*10*$/}

Çevrimiçi deneyin!

Girişin veya girişin 2 tabanının normal ifadeyle eşleşip eşleşmediğini kontrol eder ^10*10*$

4 Neil Sep 30 2020 at 21:54

Kömür , 21 13 bayt

№⟦⁻θ0⁻⍘N²0⟧11

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı sürümüne yöneliktir. Bir Charcoal boole çıkışı verir, yani -iki bitlik bir sayı için, değilse hiçbir şey. Port of @ Kaddath'ın PHP cevabı. Açıklama:

   θ            Input as a string
  ⁻ 0           Remove zeros
       N        Input as a number
      ⍘ ²       Convert to base 2
     ⁻   0      Remove zeros
 ⟦        ⟧     Make into a list
№          11   Count occurances of literal string `11`
4 Lynn Sep 30 2020 at 22:19

Python 3 , 67 bayt

lambda n:n>2in{g(n,2),g(n,10)}
g=lambda x,b:x and(x%b)**2+g(x//b,b)

Çevrimiçi deneyin!

Haskell'in limanı cevabım. (Test demetini ovs'un Python cevabından aldım. Teşekkürler!)

4 RobinRyder Sep 30 2020 at 21:11

R , 71 64 bayt

Dominic van Essen sayesinde -7 bayt

`+`=function(n,k)sum((n%/%k^(0:n)%%k)^2)-2
n=scan();n<0|n+2&n+10

Çevrimiçi deneyin!

Çıktı tersine çevrildi: FALSEgirişin İki Bitli bir Sayı olup TRUEolmadığını ve değilse verir.

Yardımcı fonksiyon +, bir tamsayıyı tabandaki bir rakam vektörüne dönüştürür k(ihtiyacımız olan k=2ve k=10). Sonra bu rakamların karesini toplayın. Bu toplam, İki Bitlik Sayı için tam olarak 2'ye eşittir.

Büyük giriş için bellek sınırlarından dolayı başarısız olur, bu durumda aşağıdakiler 0:log2(n)yerine 0:nve ||yerine kullanabilirsiniz |: Çevrimiçi deneyin! .

4 GalenIvanov Sep 30 2020 at 20:08

Faktör , 79 74 bayt

: n ( n -- ? ) [ 10 >base ] [ >bin ] bi [ 48 swap remove "11" = ] bi@ or ;

Çevrimiçi deneyin!

3 HyperNeutrino Sep 30 2020 at 20:34

Jöle , 8 bayt

,BṢ€Ḍ11e

Çevrimiçi deneyin!

Açıklama

,BṢ€Ḍ11e  Main Link
,         Pair the integer with
 B        Convert the integer to binary
  Ṣ€      Sort Each (sorts the digits of the integer implicitly)
    Ḍ     Convert from decimal to integer
     11e  Is 11 in this list?
3 NahuelFouilleul Sep 30 2020 at 23:34

Perl 5 -lp , 35 bayt

$_=grep/^10*10*$/,$_,sprintf"%b",$_

Çevrimiçi deneyin!

true için 1 veya 2 (bir sayı ondalık ve ikili İki Bitli sayı olabilir), yanlış için 0 döndürür.

3 J42161217 Sep 30 2020 at 22:22

Wolfram Dili (Mathematica) , 46 bayt

!FreeQ[Tr/@(#~IntegerDigits~{10,2}^2),2]&&#>0&

Çevrimiçi deneyin!

@Att'tan -1 bayt

3 n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ Oct 01 2020 at 14:42

PCRE Regex, 100 95 bayt

^(((?(2)\2\2|.))*.)(?!\1)((?(3)\3\3|.))*.$|^(((?(5)\5{10}|.{9}))*.)(?!\4)((?(6)\6{10}|.{9}))*.$

Tekli girdi varsayalım (negatif sayılar desteklenmez).

Koşullu normal ifade ve ileri beyan edilen geri referans desteği ile tatlar içinde çalışmalıdır.

Normal ifade, biri ikili, diğeri ondalık olmak üzere 2 benzer kısımdan oluşur.

  • Kod, 2 n ve 10 n'yi eşleştirmek için geometrik serilerin toplamını kullanır .
    1 + (1 + 2 + 2 2 + ... + 2 n ) = 2 n + 1
    1 + 9 * (1 + 10 + 10 2 + ... + 10 n ) = 10 n + 1

  • Ardından sayıyı 2 n + 2 k (veya ondalık için 10 n + 10 k ) toplamına ayırmaya çalışın ve 2 n ! = 2 k olduğunu kontrol edin

Güncelleme:

  • Kullanılmayan yakalama grubunu düşürür
  • Damla $içinde (?!\1$)biz 2 reddetmek eğer 's cezası beri n <2 k

regex101

3 MarcMush Oct 02 2020 at 22:12

Julia , 61 bayt

sayının ikili ve ondalık gösteriminde bir normal ifade kullanarak

x->any(match.([r"^0*10*10*$"],["$x",bitstring(x)]).!=nothing)

Çevrimiçi deneyin!

Julia, 69 bayt

karakterleri sıralayarak

x->any(endswith.(join.(sort.(collect.(["0$x",bitstring(x)]))),"011"))

Çevrimiçi deneyin!

3 SiimLiiser Oct 02 2020 at 20:46

Ruby 2.7, 44 bayt

->n{[2,10].any?{n.to_s(_1).tr(?0,'')=='11'}}

Açıklama:

->n{                      # a lambda with one argument
    [2,10].any?{          # Return true if for either of 2 or 10...
      n.to_s(_1)          # input in that base
      .tr(?0,'')          # after removing all 0-s
      =='11'              # is exactly '11'
    }
}

Yakut <2.7, 46 baytta eşdeğer

->n{[2,10].any?{|b|n.to_s(b).tr(?0,'')=='11'}}

Denemek

3 Neil Oct 03 2020 at 07:42

Retina 0.8.2 , 36 bayt

^\d+
$*1¶$&
+`^(1+)\1
$+0 m`^10*10*$

Çevrimiçi deneyin! Bağlantı çoğu test senaryosunu içerir (daha büyük olanlar Retina'nın belleğinin tükenmesine neden olur). Açıklama:

^\d+
$*1¶$&

Girdi negatif değilse, önüne tekli kopya koyun.

+`^(1+)\1
$+0

Tekli kopyayı ikiliye dönüştürmeye başlayın. Bu noktada sonuçta çok fazla sıfır var, ama neyse ki bunlar alakasız.

m`^10*10*$

Her iki sayıyı iki bitlik bir sayı olarak eşleştirin.

3 GalenIvanov Sep 30 2020 at 20:18

K (ngn / k) , 25 24 bayt

Ngn sayesinde -1 bayt

{("11"~($x)^$0)+2=+/2\x}

Çevrimiçi deneyin!

2 Kaddath Sep 30 2020 at 20:39

PHP , 69 67 bayt

echo($f=fn($s)=>str_replace(0,'',$s)==11)($argn)|$f(decbin($argn));

Çevrimiçi deneyin!

Oldukça basit: her girdiyi bir dizge olarak ele alır, tüm sıfırları ile değiştirir ''ve eşit olup olmadığını (gevşek bir şekilde) 11veya ikili olup olmadığını test eder

DÜZENLEME: 0yerine kullanarak 2 bayt kaydedildi'0'

2 ovs Sep 30 2020 at 21:48

APL (Dyalog Genişletilmiş) , 19 bayt

2∊2 10(+.×⍨⊤)¨⊢×0<⊢

Çevrimiçi deneyin!

Yorum yaptı:

                0<⊢  ⍝ Is the (right) argument greater than 0
              ⊢×     ⍝ Multiply this with the argument
                     ⍝   results in 0 for negative inputs
  2 10(     )¨       ⍝ Call the next function with each of the bases 2 and 10
                     ⍝   and the non-negative number as a right argument
           ⊤         ⍝ Convert number to base digits
       +.×⍨          ⍝ The sum of squares of the digits
2∊                   ⍝ Does this contain 2?
2 Noodle9 Sep 30 2020 at 21:31

C (gcc) , 75 \$\cdots\$ 76 80 bayt

Bir hatayı düzeltmek için 6 bayt eklendi.

d;r;c;f(n){for(c=2,r=__builtin_popcount(n)!=2|n<0;n>0;n/=10)d=n%10,c-=d*d;r*=c;}

Çevrimiçi deneyin!

Eğer bir falsy değeri döndürür \$n\$ Two Bit Number ™ ️ veya aksi takdirde doğru olanıdır.

2 PkmnQ Sep 30 2020 at 20:32

Pyth , 22 16 bayt

@FryAmTheEggman sayesinde -6 bayt

}11,v-Q\0v-.BQ\0

Çevrimiçi deneyin!

2 Phoenix Oct 02 2020 at 11:34

Python, 79 Bayt

lambda n:any(sum((ord(c)-48)**4 for c in f.format(n))==2for f in["{}","{0:b}"])

Açıklama

İnt'i hem ikili hem de ondalık olarak biçimlendiriyorum. Her karakter için, karakteri çıkarıyorum '0', sonra 4'ün üssüne yükseltiyorum. Bu '0', 0'a, '1'1'e, '2'16'ya ve diğer rakamlara ve '-'karakter 16'dan büyük sayılara eşleniyor. Sonra, toplamın 2'ye eşit olup olmadığını kontrol ediyorum. .

2 TomCarpenter Oct 03 2020 at 20:06

Oktav , 67 64 bayt

@(x,p=@(b,z=dec2base(x*(x>0),b)-48)all(z<2)&sum(z)==2)p(2)|p(10)

Çevrimiçi deneyin!

Şüpheniz varsa, kodu daha karmaşık hale getirin. Her nasılsa bayt kaydetme eğiliminde ...

@(x,                               % Main anonymous function with 'x' as input
    p=                             % Second input 'p' with default value (no second input is given when calling function) which
      @(b,                         % consists of another anonymous function which takes base as input
          z=                       % From which it creates a second input 'z' with default value
            dec2base(       ,b)    % Which runs dec2base (convert from integer to string) using provided base
                     x             % On the input to the main anonymous function
                      *(x>0)       % Multiplied by (x>0) to return false for any negative integer passed in.
                               -48 % And converts from a string to an array of integers (one per digit)
      )
      all(z<2)&                    % Two-bit numbers must only contain 0 or 1, so need all elements in array of digits <2.
               sum(z)==2           % Sum all digits. Two-digit number if sum is 2 (two 1's)
)
p(2))||                            % Run two-bit number check in base 2
       p(10)                       % Run two-bit number check in base 10
       

İlk girişim,

@(x,p=@(z)all(z<50)&&sum(z-48)==2)x>0&&p(dec2bin(x))||p(num2str(x))

Çevrimiçi deneyin!

@(x,                               % Main anonymous function with 'x' as input
    p=                             % Second input 'p' with default value (no second input is given when calling function)
      @(z)                         % Default value consists of another anonymous function to check if string is two-bit
          all(z<50)&&              % Two-bit numbers must only contain '0' or '1', so need all elements in string <'2'(50).
                     sum(z-48)==2  % Convert all characters from '0'/'1' to 0/1 and sum. Two-digit if sum is 2 (two 1's)
)
x>0&&                              % Short-circuit to return false for any negative integer passed in.
     p(dec2bin(x))||               % Convert to binary string and check if two-digit, or...
                    p(num2str(x))  % Convert to decimal string and check if two-digit
2 t-clausen.dk Oct 02 2020 at 19:37

T-SQL, 93 bayt

Doğru için 1, yanlış için 0 döndürür

DECLARE @y INT=@,@x INT=9WHILE @>0SELECT
@x+=@%2,@/=2PRINT
IIF(11in(@x,replace(@y,0,'')),1,0)

Çevrimiçi deneyin

2 Neil Oct 06 2020 at 16:42

Genel normal ifade, 58 bayt

^((((1+)(?=\4$))+|^)1){2}$|^((((1+)\8{8}(?=\8$))+|^)1){2}$

Çevrimiçi deneyin! Bağlantı, Retina 0.8.2 ile yazılmış test koşumunu içerir, ancak normal ifadenin kendisi çoğu motorda çalışmalıdır. Tekli işaretli giriş alır ^-?1*$. Açıklama: Verilir kve sonunda sıfıra ulaşmadan önce, yol boyunca farklı zamanları tekrar tekrar bölerek ve çıkararak farklı güçlerin mtoplamı olan bir sayı için belirli bir test yazabiliriz :kmm1 k

^((((1+)\4{<m-2>}(?=\4$))+|^)1){<k>}$

test edilmekte olan belirli değerler için ikameleri nerede <m-2>ve <k>temsil eder (işlemsiz \4{0}olma gibi önemsiz azaltmalara tabi ). Bu şu şekilde çalışır:

    (1+)                                Find `i` such that
        \4{<m-2>}                       `i+(m-2)i=(m-1)i` is equal to
                 (?=\4$)                `n-i`, therefore `i=n/m`.
   (                    )+              Divide `n` by `m` at least once
  (                       |^)           Except on the first loop
 (                           1){<k>}    Decrement `k` distinct times
^                                   $   Consume entire input

Sorun daha sonra bu tür iki testin dönüşümüne indirgenir.