Dado um número, determine se é um número dobrável.
Um número dobrável é um número tal que, se você pegar a representação binária e "dobrar" ao meio, isso é o resultado da multiplicação XNOR da primeira metade do número e da segunda metade com os dígitos ao contrário, você obterá zero.
Se o número tiver um número ímpar de dígitos em binário, o dígito do meio deverá ser 1 e será ignorado ao dobrar.
Como isso pode ser um pouco confuso, darei alguns exemplos:
178
A representação binária de 178 é
10110010
Para dobrar isso, primeiro dividimos ao meio
1011 0010
Invertemos a segunda metade
1011
0100
E nós não temos as duas metades:
0000
Isso é zero, então esse é um número dobrável.
1644
A representação binária de 1644 é
11001101100
Para dobrar isso, primeiro dividimos ao meio
11001 1 01100
O bit do meio é 1, então jogamos fora.
11001 01100
Invertemos a segunda metade
11001
00110
E nós não temos as duas metades:
00000
Isso é zero, então esse é um número dobrável.
4254
A representação binária de 4254 é
1000010011110
Para dobrar isso, primeiro dividimos ao meio
100001 0 011110
O bit do meio é 0, então esse não é um número dobrável.
Tarefa
Sua tarefa é obter um número positivo e retornar uma verdade se o número estiver dobrando e falso se não estiver. Isso é código de golfe, então tente manter a contagem de bytes baixa.
Casos de teste
Aqui estão os primeiros 99 números dobráveis:
[1, 2, 6, 10, 12, 22, 28, 38, 42, 52, 56, 78, 90, 108, 120, 142, 150, 170, 178, 204, 212, 232, 240, 286, 310, 346, 370, 412, 436, 472, 496, 542, 558, 598, 614, 666, 682, 722, 738, 796, 812, 852, 868, 920, 936, 976, 992, 1086, 1134, 1206, 1254, 1338, 1386, 1458, 1506, 1596, 1644, 1716, 1764, 1848, 1896, 1968, 2016, 2110, 2142, 2222, 2254, 2358, 2390, 2470, 2502, 2618, 2650, 2730, 2762, 2866, 2898, 2978, 3010, 3132, 3164, 3244, 3276, 3380, 3412, 3492, 3524, 3640, 3672, 3752, 3784, 3888, 3920, 4000, 4032, 4222, 4318, 4462, 4558]
0
, então não. (Talvez valha a pena ter um terceiro exemplo funcionava assim embora.) O mesmo vale para 18.Respostas:
Geléia , 9 bytes
Experimente online! ou verifique todos os casos de teste .
Como funciona
fonte
05AB1E ,
1312 bytesCódigo:
Usa o CP-1252 codificação . Experimente online!
Explicação:
Primeiro, convertemos o número em binário usando
b
. 1644 torna-se 11001101100 . Dividimos isso em dois pedaços com2ä
. Por exemplo, 11001101100 se tornaria:Se houver um número desigual de bits, a primeira parte receberá o bit extra. Nós
R
invertemos a última string e adicionamos um zero usando0¸«
. A razão para isso é fornecer apenas resultados de verdade quando o bit do meio for 1 ( 1 XOR 0 = 1 e 0 XOR 0 = 0 ). Se não houver um bit do meio, o 05AB1E ignorará o último bit (o zero que foi anexado):A última coisa que precisamos fazer é fazer um XOR em elementos e pegar o produto do resultado. Se houver um elemento em excesso, o programa deixará o último elemento de fora (
[1, 0, 0] XOR [0, 1] = [1, 1]
). Por exemplo:Torna-se:
E o produto disso é 1 , que é verdade.
fonte
s
é necessário.bÐg;ô
foi o mais longe que cheguei antes de me refrescar e ver você acertar em cheio. Ótima resposta, me ajudando a aprender!Java 7,
152 145 142 138134 bytesLaços sobre a corda como faria em um palíndromo, procurando zeros. Mantém o controle multiplicando repetidamente, então tudo que você precisa fazer é verificar se não é zero no final.
Sem barras de rolagem:
fonte
byte[]b=(a+"").getBytes();
é mais curto que ochar[]b=a.toString(a,2).toCharArray();
e ainda parece funcionar (-12 bytes).getBytes
que ainda pode funcionar com o char []. Obrigado :)z
como um int (0
por falso, qualquer outro por verdade) - você economizará alguns bytes.JavaScript (ES6),
615752 bytesComputa recursivamente:
onde
N
é a classificação do bit mais alto definido na entrada.Se a entrada tiver um número ímpar de bits, o bit do meio será XOR com indefinido (o valor retornado por
pop()
uma matriz vazia), o que o deixará inalterado. Portanto, um0
bit do meio apaga a saída e um1
bit do meio não altera o resultado de outras operações - o que é consistente com a definição de desafio de um número dobrável.fonte
Python 2, 57 bytes
Saídas via código de saída : erro para Falsey e nenhum erro para Truthy.
Converte a entrada em binário. Verifica se o primeiro e o último caractere são desiguais, mantém e repete isso após remover esses caracteres.
A comparação
s[-1]==s[0]<_
gera um erro se o primeiro e o último caractere forem desiguais, tentando avaliar a variável não atribuída denominada_
. Se são iguais, a cadeia de desigualdades é em curto-circuito. Quando chegamos ao elemento do meio de1
, owhile
loop é encerrado para um caso especial como OK.Suspeito que uma abordagem puramente aritmética seja mais curta com uma recursão semelhante
f=lambda n,r=0:...f(n/2,2*r+~n%2)...
a digitar dígitos binários do final invertido e invertido, e detectar quandon
er
são iguais a um centro1
. Existem sutilezas, porém, com zeros à esquerda e o centro.fonte
Python 2,
94 79 7267 bytesGuardado 12 bytes graças a @xnor
Define uma função sem nome na segunda linha.
Explicação (com algum espaço em branco adicionado):
Experimente aqui!
fonte
s==''or s=='1'
pode sers in'1'
and
pode ser aritmético*
. Além disso,f
é permitido não ter nome.Haskell,
898886 bytesFunciona somando bit a representação de bits com seu reverso e obtendo o produto. Se for 1 ou 2, o número é um número dobrável (1 se houver bits pares que dobram, 2 se houver bits ímpares e um no meio).
fonte
Python 2,
100999594 bytesParece um pouco longo, mas continuarei trabalhando :) Imprime a
1
se o número puder ser dobrado,0
caso contrário.Teste aqui!
graças ao Assistente de trigo para salvar 1 byte :)
graças a Rod pela economia de 5 bytes! :)
fonte
b-1
com~b
[1,a[b]>'0'][len(a)%2]
por(a[b]>=`len(a)%2`)
e=len(a)
à alteraçãob=e/2
`e%2
`, economizando 1 byte. E, em seguida, ambas as respostas python serão amarradas c:> <> , 37 + 3 = 40 bytes
A entrada deve estar presente na pilha no início do programa, portanto, +3 bytes para o
-v
sinalizador.Experimente online!
fonte
Gelatina , 13 bytes
TryItOnline
Ou termos correspondentes até 4558
Quão?
fonte
Perl, 46 bytes
Inclui +1 para
-p
Corra com o número em STDIN
folding.pl
:Eu considero um bug perl que isso até funcione. Interno
$_
não deve estar recebendo atualizações de posição de correspondência depois de modificado. Neste programa, a posição da partida realmente ultrapassa o final de$_
fonte
perl -pe '$_=sprintf("%b",$_)=~/^(.*)1?(??{reverse$^N=~y%01%10%r})$/'
:: /Braquilog , 16 bytes
Não funciona muito bem online ...
Recebe a entrada pela variável de entrada e sai por sucesso ou falha. Ele depende muito
z₂
, que está no idioma desde 30 de abril, mas esquecemos de pedir para que o TIO seja usado. Por enquanto, isso só funciona em uma instalação local do idioma. De qualquer forma, é provavelmente uma abordagem excessivamente ingênua.Brachylog (no TIO), 19 bytes
Experimente online!
lᵛ↖Lz
é funcionalmente equivalente az₂
(se você não usar a variável L em nenhum outro lugar), mas também terá três bytes a mais.fonte
Python 2,
76 7169 bytes-5 bytes graças a @Dennis (
''
está presente em'1'
, então substituain('','1')
porin'1'
)-2 bytes graças a @xnor (use multiplicação,
(...)*
no lugar deand
)Ideone
A função recursiva, na primeira chamada,
n
é um número; portanto, ela é avaliada como menor que a sequência vazia, comif n<''
, e a função é chamada novamente, mas comn
conversão para uma sequência binária; a cauda é uma string vazia (mesmo comprimento de bit) ou a do meio, que retorna true para empty ou a'1'
; no caminho para baixo, ele testa desigualdade nos bits externos (equivalente a XOR) e retorna nos bits internosn[1:-1]
.fonte
n in'1'
funciona.''
estava presente no'blah'
, mas sim, é :)and
pode ser aritmético*
.Python 2, 63 bytes
Imprime
True
ouFalse
. Assume a representação binárias
e remove repetidamente o primeiro e o último caracteres, desde que sejam desiguais. Verifica se o que resta é a cadeia vazia ou uma central1
. Isto é feito através da conversão''
para'1'
e verificar se o resultado for igual'1'
, que também evitar um erro de índice na string vazia.fonte
PowerShell v2 +, 143 bytes
Duas abordagens possíveis, ambas com a mesma contagem de bytes.
Método 1:
Recebe entrada
$n
, se for-eq
necessário1
(um caso especial para esse algoritmo), aumente. Defina$o
utput como1
(ou seja, assuma a verdade) e, em seguida, faça um loop do0
ponto intermediário do número de entrada que foi[convert]
editado para binário. Note o-!($b%2)
conta para números binários de comprimento ímpar.A cada iteração, comparamos o dígito atual
$n[$_]
com o dígito do mesmo tamanho do final$n[$b-$_]
e multiplicamos o resultado booleano em$o
(essencialmente executando um-and
em todos eles). Depois que o loop é concluído, precisamos levar em consideração o dígito binário médio, que é o pseudo-ternário no final (array indexado via$b%2
). Isso1
ou0
é deixado no gasoduto, ea saída está implícita.Método 2:
Leva a entrada e faz o mesmo processo ao
[convert]
número para binário. Então estamos em umfor
loop desde que o.length
da cadeia binária seja-g
reatert
han2
. Quando estamos no circuito, se os primeiros$n[0]
e últimos$n[-1]
dígitos são-n
ote
qua, cortar esses dois dígitos fora$n
e re store-lo em$n
. Caso contrário, saída0
eexit
. Uma vez que estamos fora do circuito, ou temos (uma matriz de1
,1,0
,0,1
,1,1
, ou0,0
), ou a cadeia binária para dois10
, ou três11
. Então, precisamos testar essas duas possibilidades. Pela primeira vez,-join
$n
juntos,+
avaliamos o resultado e testamos que é1
(isto é verdade para matrizes1
,1,0
e0,1
, mas é e$false
para matrizes ou strings ou ). A outra metade está testando se é ual para (isto é, entrada de ). Esse booleano é deixado no pipeline e a saída é implícita.0,0
1,1
10
11
-or
$n
-eq
10
2
fonte
CJam , 13 bytes
Experimente online! ou gere uma lista de números dobráveis até um determinado número.
fonte
MATL , 16 bytes
Verdade é uma matriz com todos os. Verifique os critérios de verdade / falsidade aqui .
Experimente online! Ou Verifique os 20 primeiros casos de teste .
Explicação
Vamos usar a entrada
1644
como um exemplo.fonte
PHP, 101 bytes
ou com log
108 bytes com matriz
Valores verdadeiros <10000
fonte
Julia , 66 bytes
Meu primeiro golfe! funciona da mesma maneira que a solução Python do mesmo tamanho, pequenas diferenças devido à linguagem (embora eu tenha inventado por conta própria ...).
Explicação:
fonte
C,
223201189194178 BytesAlgoritmo de força bruta. Vamos ver até onde ele pode ser jogado.
Melhores correções de configuração de teste ...
fonte
MATL , 13 bytes
Verdade é uma matriz com todos os. Verifique os critérios de verdade / falsidade aqui .
Experimente online! Ou verifique os 20 primeiros casos de teste .
Explicação
Usando a entrada
1644
como um exemplo:fonte
JavaScript, 71 bytes
Define uma função anônima.
Este método pode não ser o mais curto, mas, tanto quanto eu sei, é único. Ele adiciona o número em binário a si mesmo invertido, tratando-o como decimal e, em seguida, verificando se o resultado é válido usando uma expressão regular.
fonte
Retina, 92 bytes
A contagem de bytes assume a codificação ISO 8859-1.
Experimente online
Converta para unário. Converta isso em binário. Corte o número ao meio e remova o meio,
1
se houver. Inverta a primeira metade. Troque seus uns e zeros. Combine se as duas metades forem iguais.fonte
Retina,
717060 bytesProvavelmente ainda tenho muito a aprender sobre Retina (por exemplo, regex recursivo?). Explicação: A etapa 1 converte de decimal em unário. A etapa 2 converte de unário para pseudo-binário. A etapa 3 remove os dígitos das duas extremidades, desde que sejam incompatíveis. A etapa quatro corresponde a uma central final opcional 1, se necessário. Editar: salvou 1 byte graças a @ mbomb007. Economizei 10 bytes melhorando minha conversão unária em binária.
fonte
.*
ou.+
.Python 2,
6159 bytesSalvando dois bytes para converter turnos em multiplicações
Retorna
0
para um número dobrável e qualquer outra coisa para não dobrar. Usa a abordagem de manipulação de bits.fonte
C,
6563 bytesDois bytes para converter turnos em multiplicações
O espaço em branco já está excluído do bytecount, retorna 0 para um número dobrável e qualquer outra coisa para não dobrar. Usa a abordagem de manipulação de bits.
fonte
k, 77 bytes
a título de explicação, uma tradução para
q
fonte