Bu sayı Two Bit Number ™ ️ mı?
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
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!
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!
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.
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
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)
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 ...
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 +..
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.
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
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*$
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`
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!)
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! .
Faktör , 79 74 bayt
: n ( n -- ? ) [ 10 >base ] [ >bin ] bi [ 48 swap remove "11" = ] bi@ or ;
Çevrimiçi deneyin!
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?
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.
Wolfram Dili (Mathematica) , 46 bayt
!FreeQ[Tr/@(#~IntegerDigits~{10,2}^2),2]&&#>0&
Çevrimiçi deneyin!
@Att'tan -1 bayt
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 + 1Ardı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
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!
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
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.
K (ngn / k) , 25 24 bayt
Ngn sayesinde -1 bayt
{("11"~($x)^$0)+2=+/2\x}
Çevrimiçi deneyin!
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'
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?
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.
Pyth , 22 16 bayt
@FryAmTheEggman sayesinde -6 bayt
}11,v-Q\0v-.BQ\0
Çevrimiçi deneyin!
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. .
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
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
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.