Tarefa:
Dada uma entrada inteira, descubra se é ou não um número Cyclops.
O que é um número do Ciclope, você pode perguntar? Bem, é um número cuja representação binária tem apenas um 0
no centro!
Casos de teste:
Input | Output | Binary | Explanation
--------------------------------------
0 | truthy | 0 | only one zero at "center"
1 | falsy | 1 | contains no zeroes
5 | truthy | 101 | only one zero at center
9 | falsy | 1001 | contains two zeroes (even though both are at the center)
10 | falsy | 1010 | contains two zeroes
27 | truthy | 11011 | only one zero at center
85 | falsy | 1010101 | contains three zeroes
101 | falsy | 1100101 | contains three zeroes
111 | falsy | 1101111 | only one zero, not at center
119 | truthy | 1110111 | only one zero at center
Entrada:
Um número inteiro ou tipos equivalentes. (
int
,long
,decimal
, Etc.)Suponha que se a avaliação da entrada resultar em um estouro de número inteiro ou em outros problemas indesejáveis, essa entrada não precisará ser avaliada.
Resultado:
Verdade ou falsidade.
A saída verdade / falsidade deve atender às especificações do idioma usado para verdade / falsidade. (por exemplo, C tem
0
como falso, diferente de zero como verdadeiro)
Regras do Desafio:
A entrada menor que 0 é considerada falsa e, portanto, não precisa ser avaliada.
Se o comprimento da representação binária do número for par, o número não poderá ser um número do Ciclope.
Regras gerais:
Isso é código-golfe , então as respostas mais curtas em bytes vencem !.
As brechas padrão são proibidas.
Regras padrão se aplicam à sua resposta com regras de E / S padrão .
Este é o meu primeiro desafio de quebra-cabeças de programação e código de golfe , portanto qualquer feedback sobre como devo melhorar seria muito apreciado!
Respostas:
Japonês, 8 bytes
Execute on-line
Explicação:
A idéia é dividir a string binária em
0
, o que produziria dois itens se houver apenas um0
. Então, vemos se o primeiro item corresponde ao segundo para garantir que seja palindrômico. Se a cadeia binária contiver vários0
s, a redução retornará uma matriz de vários itens e isso falhará na==1
condição. Se a cadeia binária contiver uma0
, mas não for palindrômica,äè
retornará0
porqueb
contém0
correspondências dea
.fonte
r¶
também deve funcionar.¤
= converter para binário;q0
= dividido em 0s;äè
Não tenho muita certeza ..; e o sinalizador-N
converte listas emNaN
, mas sai0
e1
o mesmo. Para aäè
parte, posso ver que119
é[111,111]
após a divisão, queäè
muda para1
; e85
é[1,1,1,1]
após a divisão, queäè
muda para[1,1,1]
. Você poderia explicar como.ä("è")
funciona?NaN
Falsey está em Japt? (ou seja, se você executar um if-else com que como a condição faz a se obter executado? "Truthy / saída Falsas devem atender às especificações da linguagem usada para truthy / Falsas") Também2
rendimentos2
que eu duvido é Falsey (mas pode ser se Japt é como 05AB1E).0
seja considerado verdade ... no entanto, se2
estiver retornando2
como verdade, esse envio poderá precisar ser reformulado.Python 2 , 30 bytes
Experimente online!
Observe que
2*n^2*n+3
é o xor bit a bit de2*n
e2*n+3
, porque essa é a precedência do operador do Python.fonte
lambda n:(2*n^2*n+3)**2-8*n-9
, com um valor de retorno0
para números de ciclope?TRUE
paran = -1
>1
.Código da máquina x86, 17 bytes
Os bytes acima definem uma função que aceita um valor de entrada inteiro de 32 bits (no
EDI
registro para este exemplo, seguindo uma convenção de chamada comum do System V, mas você pode escolher praticamente qualquer registro de entrada que desejar, sem afetar o tamanho do resultado código) e retorna um resultado (noEAX
registro) indicando se o valor de entrada é um número do Ciclope.A entrada é assumida como um número inteiro não assinado, pois as regras de desafio determinam que podemos ignorar valores negativos.
Nota: O valor de retorno é verdadeiro / falso, mas a semântica é invertida, de modo que a função retornará falso para um número do Ciclope. Eu afirmo que isso é legal porque o código da máquina não tem "especificações de verdade / falsidade", que é o requisito da pergunta. (Veja abaixo uma versão alternativa, se você acha que isso é trapaça.)
Nos mnemônicos da linguagem assembly, é o seguinte:
Experimente online!
Como prometido, se você acha que é trapaça inverter a semântica da verdade / falsidade, mesmo em código de máquina onde não há padrões ou convenções reais, adicione mais três bytes, num total de 21 bytes :
A primeira metade deste código é igual ao original (abaixo através da
imul
instrução). Olea
é quase o mesmo, mas, em vez de adicionar uma constante 2, apenas adiciona uma constante 1. Isso ocorre porque ainc
instrução a seguir aumenta o valor noEAX
registro em 1 para definir os sinalizadores. Se o sinalizador "zero" estiver definido, asetz
instrução será definidaAL
para 1; caso contrário,AL
será definido como 0. Essa é a maneira padrão em que um compilador C irá gerar código de máquina para retornar abool
.Alterar a constante adicionada na
lea
instrução obviamente não altera o tamanho do código, e ainc
instrução é muito pequena (apenas 1 byte), mas asetz
instrução tem 3 bytes bastante impressionantes. Infelizmente, não consigo pensar em nenhuma maneira mais curta de escrevê-lo.fonte
Regex (ECMAScript),
6058576058 bytesx
AVISO DE SPOILER : Para a raiz quadrada, esse regex usa uma variante do algoritmo de multiplicação generalizada, o que não é óbvio e pode ser um quebra-cabeça gratificante para você resolver sozinho. Para obter mais informações, consulte uma explicação para esta forma do algoritmo em Localizar um número Rocco .
^(x*)(?!(x(xx)+)\2*$)(x(x*))(?=(?=(\4*)\5+$)\4*$\6)x\1$|^$
Experimente online!
fonte
^(1*)0\1$
suficiente?JavaScript (Node.js) , 20 bytes
Experimente online!
Talvez isso esteja correto, talvez.
Obrigado Grimy, 1 byte salvo.
JavaScript (Node.js) , 32 bytes
Experimente online!
JavaScript (Node.js) , 34 bytes
Experimente online!
fonte
.test
not.match
Perl 6 , 23 bytes
Experimente online!
Solução baseada em Regex
fonte
Japonês ,
2519109 bytesObrigado a @Shaggy por -1 byte
Experimente online!
fonte
Mathematica (língua Wolfram),
3231 bytes1 byte economizado graças a J42161217!
Experimente online!
Função pura, recebendo um número inteiro como entrada e retornando
True
ouFalse
. Com base no fato (divertido de provar!) Que um númeron
é Ciclope se, e somente se,n
mais a raiz quadrada den/2
mais2
arredondar para uma potência ímpar de 2. (Pode-se substituirFloor
por umCeiling
ouRound
contanto que também substitua+2
por+1
.) RetornaTrue
na entrada0
.fonte
Log2[#+Floor@Sqrt...
√()
vez deSqrt[]
Ruby , 24 bytes
Experimente online!
fonte
Japonês, 8 bytes
Agradeço a Luis felipe de Jesus Munoz por corrigir minha submissão!
Experimente Online!
Solução antiga baseada em regex, 15 bytes
Retorna 1 para verdadeiro, 0 para falso.
Experimente Online!
fonte
==
operador!Geléia ,
87 bytes-1 graças a Erik the Outgolfer (use o isPalindrome embutido, em
ŒḂ
vez de⁼Ṛ$
)Um link monádico que aceita um número inteiro que produz
1
(verdade) ou0
(falsey).Experimente online!
Quão?
fonte
Bċ0⁼1ȧŒḂ
também tem 8 bytes),⁼Ṛ$
é a mesma queŒḂ
para -1. Além disso, você não precisa lidar com números negativos.ṚƑ
-lo hoje em dia, para que possa se lembrar dessa maneira (as mais importantesƑ
).Haskell , 32 bytes
Experimente online!
fonte
Regex (ECMAScript),
5347 bytes-6 bytes graças a Deadcode e Grimy
Experimente online!
fonte
^((?=(x(x*?))(\3((x+)(?=\6$))+xx$))(?!\2{6})x\4)*$
Braquilog , 8 bytes
Este é um predicado que terá êxito se sua entrada for um número do Ciclope e falhará se sua entrada não for um número do Ciclope. Sucesso / fracasso é o conceito mais fundamental de verdade / falsey em Brachylog.
Experimente online! Ou encontre todas as saídas verdadeiras até 10000 .
Explicação
Isso é bem-sucedido somente quando recebe um número do Ciclope, porque:
D↔D
falhará; no que se segue, podemos assumir que é um palíndromo.×ᵐ≠
falharão.×ᵐ≠
falharão.×ᵐ≠
obtém sucesso e todo o predicado é bem-sucedido.fonte
Ruby ,
2724 bytesConverta em binário e verifique com uma regex. Retorna
0
se verdadeiro,nil
se falso.-3 bytes graças a GB .
Experimente online!
Por mais dois bytes, há uma porta direta da solução Python:
fonte
05AB1E , 8 (ou 9) bytes
Experimente online ou verifique todos os casos de teste .
Retorna
1
se realmente;0
ou qualquer número inteiro positivo que não1
seja falsey. Em 05AB1E, apenas1
é verdade e todo o resto é falsey, mas não tenho certeza se essa é uma saída permitida ou se a saída deve ser dois valores consistentes e únicos. Se o segundo, um finalΘ
pode ser adicionado para que todas as saídas que não1
sejam0
:Experimente online ou verifique todos os casos de teste .
Explicação:
Uma abordagem aritmética seria 10 bytes:
Experimente online ou verifique todos os casos de teste .
Explicação:
fonte
1
como verdade e todos os outros números como falsidade é aceitável para esse desafio, uma vez que outros idiomas (por exemplo, C e TI-BASIC) têm definições de verdade / falsidade semelhantes (0 / diferente de zero para ambos). Contanto que o que é considerado verdade ou falsidade corresponda às especificações do idioma, é um jogo justo.Excel,
9763 BytesCalcula 2 números:
Subtraia o segundo número do primeiro:
E compare este resultado com o número original
Método antigo
Comece com o Log-base-2 de A1 e arredonde-o para o número par mais próximo e adicione 1.
Em seguida, crie uma sequência de muitos
"1"
s e substitua o caractere do meio por a"0"
para criar um número do Ciclope com um comprimento binário sempre ímpar e igual ou 1 a menos que o comprimento binário de A1Em seguida, compare-o com a representação binária de A1
fonte
R ,
3733 bytesExperimente online!
R não tem um built-in para converter em binário, então eu simplesmente usei uma das fórmulas do OEIS para calcular uma lista de termos da sequência.
n<-0:x
gera uma lista generosa de valores iniciais.2*4^(n<-0:x^2)-2^n-1)
é a fórmula do OEIS e, em seguida, verifica se a entrada aparece nessa sequência usando%in%
.-2 bytes por não precisar lidar com entradas negativas. -2 bytes lembrando que posso mudar
<-
para=
.fonte
C (gcc), 26 bytes
Experimente online!
Resposta do porto de Neil . Baseia-se na ordem de operações definida pela implementação.
C ++ (clang), 38 bytes
Experimente online!
Não é possível omitir os tipos em C ++, não pode omitir o retorno em clang, caso contrário, idêntico.
fonte
return
vez da exploração do valor de retorno do acumulador implícito frágil e dependente da plataforma.C (gcc) ,
29 2827 bytesGuardado 1 byte graças a @ceilingcat
Uma porta do JS de 21 bytes responde por @tsh .
Experimente online!
fonte
J ,
2219171514 bytes-3 bytes graças ao BolceBussiere!
-4 bytes graças a ngn!
-1 byte graças ao Traws!
J , 14 bytes
Experimente online!
fonte
#=1++/
(#=1++/)@(*|.)@#:
1=1#.1-(*|.)@#:
1=1#.(*:|.)@#:
Geléia , 9 bytes
Experimente online!
fonte
Anexo , 22 bytes
Experimente online!
Alternativas
27 bytes:
{BitXor[2*_,2*_+3]^2=8*_+9}
27 bytes:
{BitXor@@(2*_+0'3)^2=8*_+9}
27 bytes:
{Palindromic@_∧1=0~_}@Bin
28 bytes:
{BitXor[...2*_+0'3]^2=8*_+9}
28 bytes:
{BitXor[…2*_+0'3]^2=8*_+9}
28 bytes:
{Same@@Bisect@_∧1=0~_}@Bin
29 bytes:
{_[#_/2|Floor]=0∧1=0~_}@Bin
30 bytes:
Same@Bin@{_+2^Floor[Log2@_/2]}
30 bytes:
{_[#_/2|Floor]=0and 1=0~_}@Bin
fonte
Retina 0.8.2 ,
3837 bytesExperimente online! O link inclui casos de teste. Edit: Após esclarecimentos, a solução anterior não tratava zero corretamente. Explicação:
Converta de decimal para unário.
Converter de unário em binário, usando o método do wiki Retina.
Verifique o mesmo número de
1
s antes e depois da0
ou uma sequência vazia (que é como a conversão acima lida com zero).fonte
Lote,
3937 bytesfonte
Excel, 101
107bytes-6 bytes graças a @Chronocidal.
Executa 3 verificações:
0
0
fonte
ISODD(LEN(DEC2BIN(A1)))
paraISEVEN(LOG(A1,2))
Regex (ECMAScript),
65595758 bytes+1 byte para manipular 0 corretamente
Experimente online!
fonte
VBA,
4136 bytesExecute na janela Imediata, com a Declaração Explícita desativada. A entrada é a célula
A1
da planilha ativa. Emite Verdadeiro / Falso na janela imediata.Usa a mesma lógica da minha Resposta do Excel para encontrar o número do Ciclope com o mesmo número de bits (ou 1 bit menor se houver um número par!) E depois compara isso com a entrada.
Economiza alguns bytes ao calcular os números do Ciclope, reduzindo-os para o formato
y = 2x^2 - x - 1
(onde éx = n-1
o enésimo número do Ciclope oux = 2^Int(Log([A1])/Log(4))
para encontrar o maior número de Ciclopes com um número menor ou igual de bits) e armazenando x em uma variável(-5 bytes graças a Taylor Scott !)
fonte
[...]
notação como[(Log(A1,4)]
PHP , 74 bytes
Experimente online!
Abordagem não matemática totalmente ingênua, apenas seqüências de caracteres.
Ou 60 bytes com base no algoritmo de @ Chronocidal acima .
Experimente online!
fonte
Haskell, 82 bytes
E uma porta da solução Python da xnor:
Haskell, 47 bytes
fonte