Esse número é um Two Bit Number ™ ️?
Vamos começar definindo um Two Bit Number ™ ️:
- É um número inteiro positivo
- Quando expresso como uma string binária, tem exatamente 2 bits verdadeiros OU
- Quando expresso como um número decimal, ele tem exatamente 2 do numeral um e todos os outros numerais são zero.
Ou como uma frase
Um Two Bit Number ™ ️ é um número que contém exatamente 2 do numeral 1 e nenhum outro número além de 0, quando expresso como uma string decimal ou um número binário.
Portanto, aqui estão todos os Two Bit Numbers ™ ️ entre 0 e 256
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
O desafio:
- Escreva algum código que aceite um número e produza verdadeiro ou falso (ou algum indicador de verdadeiro ou falso) se for um Número de dois bits ™ ️.
- A entrada sempre será um número inteiro, mas nem sempre pode ser positivo.
- Pode ser em qualquer idioma que você quiser.
- É golfe de código, então o menor número de bytes vence.
- Inclua links para um intérprete online para seu código (como tio.run).
Casos de teste
Números binários de dois bits ™ ️:
- 3
- 9
- 18
- 192
- 288
- 520
- 524304
Decimal Two Bit Numbers ™ ️:
- 11
- 101
- 1001
- 1010
- 1100
- 1000001
- 1100000000
- 1000000010
Non Two Bit Numbers ™ ️:
- 0
- 1
- 112 (quaisquer números acima de 1 impedem que seja um binário
- 200
- 649
- -1
- -3
Curiosidade: não consegui encontrar nenhum DecimalBinary Two Bit Numbers ™ ️ verificando cerca de 14 bilhões, e tenho a hipótese de que esse número não existe, mas não tenho nenhuma prova matemática. Gostaria de saber se você pode pensar em um.
Respostas
Python 3 , 68 62 48 bytes
-6 bytes graças ao xnor !
-14 bytes graças ao Jitse !
lambda n:' 11 'in f' {n:b} {n} '.replace('0','')
Experimente online!
JavaScript (ES6), 38 bytes
Retorna 0 para verdadeiro ou um inteiro diferente de zero para falso .
n=>(g=n=>!(n&=n-1)|n&n-1)(n)*g('0b'+n)
Experimente online!
Quão?
A função auxiliar g remove os dois bits menos significativos configurados ncalculando n & (n - 1)duas vezes. Se obtivermos 0 na primeira vez, significa que nhá no máximo um bit definido, o que não é suficiente. Se não obtivermos 0 na segunda vez, significa que nhá mais de 2 bits definidos, o que é muito.
Para o teste decimal, invocamos g com '0b' + npara analisá-lo como um valor binário. Se nfor negativo, isso resulta em algo como '0b-10100', que é NaN'ish e falha conforme o esperado.
JavaScript (ES6), 40 39 bytes
Retorna um valor booleano informando se a entrada não é um número de dois bits.
n=>[n,'0b'+n].every(n=>!(n&=n-1)|n&n-1)
Experimente online!
Haskell , 50 bytes
f n=or[b^x+b^y==n|b<-[2,10],x<-[0..n],y<-[x+1..n]]
Experimente online!
Pesquisa de força bruta.
50 bytes alternativos
b!0=0
b!x=rem x b^3+b!quot x b
f n=2!n==2||10!n==2
b!xcalcula uma base - b“soma de dígitos ao cubo” de x. Por exemplo, 10!123= \$1^3+2^3+3^3\$ = 36.
Verificamos se 2!nou 10!né igual a 2.
quoté necessário para apoiar a entrada negativa. É arredondado para zero, enquanto que divpara baixo, ou seja div (-1) 10 == (-1), causando um loop infinito.
APL (Dyalog Extended) , 18 bytes
2∊+/↑(*3)2 10⊤¨0⌈⎕
Experimente online!
Solução de 18 bytes de Jo King.
APL (Dyalog Extended) , 20 21 20 26 25 bytes
{<⍵:2∊+/↑(⊂×⍨⍎¨⍕⍵)⍪⊂⊤⍵⋄0}
Experimente online!
+1 byte após corrigir a resposta (ovs).
-1 byte após a sugestão de ovs. (Yay!)
+7 bytes após aceitar adequadamente casos de teste negativos.
-1 byte de Adám.
Inspirado na solução J.
Explicação
{⍵>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 bytes
b‚€{11å
Experimente online ou verifique todos os casos de teste .
Explicação:
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 bytes
Editar: -1 byte, e depois -1 byte a mais e depois -2 bytes mais, graças a Robin Ryder
gsub(0,'',n<-scan())!=11&sum(n%/%2^(0:n)%%2)-2
Experimente online!
Testa os números decimais de 2 bits usando manipulação de texto para remover ' 0' dígitos e verifica se o resultado não é ' 11', e então testa os números binários de 2 bits calculando os dígitos binários e verificando se eles não somam 2. Retorna FALSE para números de 2 bits e TRUE para números que não sejam de 2 bits.
Parece um pouco desajeitado fazer dois tipos diferentes de testes para essencialmente o mesmo recurso, mas de alguma forma sai muito curto ...
J , 25 bytes
0&<*10&#.inv+&(2=1#.*~)#:
Experimente online!
Como funciona
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
Se houver um número DecimalBinary, o +como OR pode resultar em 2, sendo necessário um byte a mais para +..
Brachylog , 9 bytes
ℕ{ḃc|}o11
Experimente online!
Um pouco envergonhado, não pensei em traduzir as abordagens baseadas em classificação de outras soluções antes ...
Uma solução mais divertida:
Brachylog , 10 bytes
ℕ{|ẹ~ḃ}ḃ+2
Experimente online!
ℕ 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 bytes
ℕ{ḃ|ẹ}<ᵛ²+2
Experimente online!
-1 byte graças a xash
ℕ 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 bytes
Deve haver uma maneira de cortar pelo menos mais um byte disso.
ìͶBªB¥¢ñ
Experimente ou execute todos os casos de teste
ìͶ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 bytes
{$_|.base(2)~~/^10*10*$/}
Experimente online!
Verifica se a entrada ou a base 2 da entrada corresponde ao regex ^10*10*$
Carvão , 21 13 bytes
№⟦⁻θ0⁻⍘N²0⟧11
Experimente online! O link é para a versão detalhada do código. Produz um booleano Charcoal, ou seja, -para um número de dois bits, nada se não for. Port of @Kaddath's PHP answer. Explicação:
θ 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 bytes
lambda n:n>2in{g(n,2),g(n,10)}
g=lambda x,b:x and(x%b)**2+g(x//b,b)
Experimente online!
Porto da minha resposta Haskell. (Eu peguei o equipamento de teste da resposta de Python do ovs. Obrigado!)
R , 71 64 bytes
-7 bytes graças a Dominic van Essen
`+`=function(n,k)sum((n%/%k^(0:n)%%k)^2)-2
n=scan();n<0|n+2&n+10
Experimente online!
A saída é invertida: informa FALSEse a entrada é um número de dois bits e TRUEse não é.
A função auxiliar +converte um número inteiro em um vetor de dígitos na base k(precisamos k=2e k=10). Em seguida, some o quadrado desses dígitos. Essa soma é igual a 2 exatamente para um número de dois bits.
Irá falhar devido aos limites de memória para grandes entradas; neste caso, você pode usar em 0:log2(n)vez de 0:ne em ||vez de |: Experimente online! .
Fator , 79 74 bytes
: n ( n -- ? ) [ 10 >base ] [ >bin ] bi [ 48 swap remove "11" = ] bi@ or ;
Experimente online!
Gelatina , 8 bytes
,BṢ€Ḍ11e
Experimente online!
Explicação
,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 bytes
$_=grep/^10*10*$/,$_,sprintf"%b",$_
Experimente online!
retorna 1 ou 2 (se um número pode ser decimal e número binário de dois bits) para verdadeiro, 0 para falso.
Linguagem Wolfram (Mathematica) , 46 bytes
!FreeQ[Tr/@(#~IntegerDigits~{10,2}^2),2]&&#>0&
Experimente online!
-1 byte de @att
PCRE Regex, 100 95 bytes
^(((?(2)\2\2|.))*.)(?!\1)((?(3)\3\3|.))*.$|^(((?(5)\5{10}|.{9}))*.)(?!\4)((?(6)\6{10}|.{9}))*.$
Assuma entrada unária (sem suporte para números negativos).
Deve funcionar em sabores com suporte para regex condicional e referência anterior declarada para frente.
A regex consiste em 2 partes semelhantes, uma verifica para binário e outra para decimal.
O código faz uso da soma de séries geométricas para corresponder a 2 ne 10 n .
1 + (1 + 2 + 2 2 + ... + 2 n ) = 2 n + 1
1 + 9 * (1 + 10 + 10 2 + ... + 10 n ) = 10 n + 1Em seguida, ele tenta decompor o número na soma de 2 n + 2 k (ou 10 n + 10 k para decimal) e verifica se 2 n ! = 2 k
Atualizar:
- Descarta o grupo de captura não utilizado
- Gotas
$em(?!\1$)uma vez que é bom se nós rejeitamos 2 n <2 k
regex101
Julia , 61 bytes
usando um regex na representação binária e decimal do número
x->any(match.([r"^0*10*10*$"],["$x",bitstring(x)]).!=nothing)
Experimente online!
Julia, 69 bytes
classificando os caracteres
x->any(endswith.(join.(sort.(collect.(["0$x",bitstring(x)]))),"011"))
Experimente online!
Ruby 2.7, 44 bytes
->n{[2,10].any?{n.to_s(_1).tr(?0,'')=='11'}}
Explicação:
->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'
}
}
Equivalente em ruby <2,7, 46 bytes
->n{[2,10].any?{|b|n.to_s(b).tr(?0,'')=='11'}}
Experimente
Retina 0.8.2 , 36 bytes
^\d+
$*1¶$&
+`^(1+)\1
$+0 m`^10*10*$
Experimente online! O link inclui a maioria dos casos de teste (os maiores fazem o Retina ficar sem memória). Explicação:
^\d+
$*1¶$&
Se a entrada não for negativa, prefixe-a com uma cópia unária.
+`^(1+)\1
$+0
Comece a converter a cópia unária em binária. Neste ponto, há muitos zeros no resultado, mas felizmente eles são irrelevantes.
m`^10*10*$
Combine qualquer um dos números como sendo um número de dois bits.
K (ngn / k) , 25 24 bytes
-1 byte graças a ngn
{("11"~($x)^$0)+2=+/2\x}
Experimente online!
PHP , 69 67 bytes
echo($f=fn($s)=>str_replace(0,'',$s)==11)($argn)|$f(decbin($argn));
Experimente online!
Muito simples: trata cada entrada como uma string, substitui todos os zeros por ''e testa se (vagamente) é igual 11ou se o binário é
EDIT: salvou 2 bytes usando em 0vez de'0'
APL (Dyalog Extended) , 19 bytes
2∊2 10(+.×⍨⊤)¨⊢×0<⊢
Experimente online!
Comentado:
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 bytes
Adicionados 6 bytes para corrigir um bug.
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;}
Experimente online!
Retorna um valor falso se \$n\$ é um Two Bit Number ™ ️ ou verdadeiro caso contrário.
Pyth , 22 16 bytes
-6 bytes graças a @FryAmTheEggman
}11,v-Q\0v-.BQ\0
Experimente online!
Python, 79 bytes
lambda n:any(sum((ord(c)-48)**4 for c in f.format(n))==2for f in["{}","{0:b}"])
Explicação
Eu formato o int como binário e decimal. Para cada caractere, eu subtraio o '0'caractere, em seguida, aumento-o à potência de 4. Isso mapeia '0'para 0, '1'a 1, '2'a 16 e outros dígitos e o '-'caractere a números maiores que 16. Então, eu verifico se a soma é igual a 2 .
Octave , 67 64 bytes
@(x,p=@(b,z=dec2base(x*(x>0),b)-48)all(z<2)&sum(z)==2)p(2)|p(10)
Experimente online!
Em caso de dúvida, torne o código mais complicado. De alguma forma, isso tende a economizar bytes ...
@(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
Primeira tentativa,
@(x,p=@(z)all(z<50)&&sum(z-48)==2)x>0&&p(dec2bin(x))||p(num2str(x))
Experimente online!
@(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 bytes
Retorna 1 para verdadeiro, 0 para falso
DECLARE @y INT=@,@x INT=9WHILE @>0SELECT
@x+=@%2,@/=2PRINT
IIF(11in(@x,replace(@y,0,'')),1,0)
Experimente online
Regex genérico, 58 bytes
^((((1+)(?=\4$))+|^)1){2}$|^((((1+)\8{8}(?=\8$))+|^)1){2}$
Experimente online! O link inclui equipamento de teste escrito em Retina 0.8.2, embora a própria regex deva funcionar na maioria dos motores. Aceita entrada em ie unário assinado ^-?1*$. Explicação: Dado ke mpodemos escrever um teste específico para um número sendo a soma de kpoderes distintos de m, dividindo me subtraindo repetidamente por 1 ktempos distintos ao longo do caminho, antes de chegarmos a zero:
^((((1+)\4{<m-2>}(?=\4$))+|^)1){<k>}$
onde <m-2>e <k>representam substituições para os valores específicos sendo testados (sujeito a reduções triviais, como \4{0}ser um no-op). Isso funciona da seguinte maneira:
(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
O problema então se reduz a uma alternância de dois desses testes.