Definimos a função g como g (n) = n XOR (n * 2) para qualquer número inteiro n> 0 .
Dado x> 0 , encontre o menor número inteiro y> 0 tal que g k (y) = x para alguns k> 0 .
Exemplo
x = 549
549 = 483 XOR (483 * 2) (as binary: 1000100101 = 111100011 XOR 1111000110)
483 = 161 XOR (161 * 2) (as binary: 111100011 = 10100001 XOR 101000010)
O que significa que g 2 (161) = 549 . Não podemos ir mais longe, pois não existe n tal que g (n) = 161 . Portanto, a saída esperada para x = 549 é y = 161 .
Regras
- Você não deve oferecer suporte a entradas inválidas. É garantido que existe um par (y, k) para o valor de entrada x .
- Isso é código-golfe , então a resposta mais curta em bytes vence!
Casos de teste
3 --> 1
5 --> 1
6 --> 2
9 --> 7
10 --> 2
23 --> 13
85 --> 1
549 --> 161
960 --> 64
1023 --> 341
1155 --> 213
1542 --> 2
9999 --> 2819
57308 --> 19124
57311 --> 223
983055 --> 1
a(n) = g(n)
Respostas:
Java 8,
68575352 bytes-5 bytes graças a @ OlivierGrégoire .
Experimente online.
Explicação:
fonte
n->{for(int i=0;i<n;)i-=(i*2^i)==n?n=i:-1;return n;}
(52 bytes). Desculpe ^^ 'for(int i=0;n>i-=i+i^i^n?-1:n=i;);
?i+i^i^n?
não é um booleano, por isso nem será compilado. Além disso,n>i-=...
precisará de parênteses (n>(i-=...)
) en=i
não é permitido na cláusula else do ternary-if, apenas na cláusula if (esta última não sei por que, mas é isso que ocorre em Java infelizmente )n=i
não é permitido na cláusula else do ternary-if". Porque o Java analisaria como(i-=(i*2^i)!=n?-1:n)=i
ilegal.Python 2 ,
5453 bytesExperimente online!
fonte
JavaScript, 53 bytes
G
ég^-1
, definidoi
como0
se tiver êxito, definidoi
como1
se falhar.fonte
f=n=>(g=n=>n<2?0/!n:n%2+2*g(n/2^n%2))(n)?f(g(n)):n
. Infelizmente, a abordagem chata é 12 bytes mais curta.Pitão ,
13 1210 bytesGuardou 1 byte graças a @MrXcoder e mais 2 bytes seguindo a sugestão
Experimente online
Explicação:
fonte
T
de 12 bytes.R ,
7365 bytesExperimente online!
Muito obrigado Giuseppe (-8) devido aos seus ajustes, tão simples, mas muito eficaz
fonte
f=
desde as necessidades de função a ser obrigado af
trabalhar corretamente. Dito isto, bom trabalho, e tire um +1 de mim!JavaScript,
3836 bytesExperimente online - Começa a lançar erros de estouro algures entre
9999
&57308
.fonte
Geléia ,
87 bytesUse
⁺¿
para retornar o último elemento diferente de zero (obrigado Dennis por -1 byte)Experimente online!
A força bruta vence novamente :(
fonte
^Ḥ)i$⁺¿
salva um byte.C (gcc) ,
57565551 bytes!=
~-
.um byte decinco bytes graças a Rogem ; fazendo uso da expressão ternária e das peculiaridades do gcc.Experimente online!
fonte
X(O,R)
for(R=1;R;O=R?R:O)
salva um byte.R=O;
no final, parece desnecessário, poupando mais 4 bytes.Z80Golf , 22 bytes
Porto da resposta Java de @ KevinCruijssen
Exemplo com entrada de 9-Experimente online!
Exemplo com entrada de 85-Experimente online!
Montagem:
Exemplo de montagem para chamar a função e imprimir o resultado:
fonte
a
o contador de loop em vez ded
, poderá substituir asld d,0
instruções pelasxor a
duas vezes, o que salva dois bytes.Java (JDK 10) , 78 bytes
Experimente online!
fonte
JavaScript (Node.js),
484538 bytes-7 bytes graças a @Neil criando uma versão recursiva da minha versão iterativa abaixo. Não funciona para casos de teste grandes.
Experimente online.
Versão iterativa de 45 bytes que funciona para todos os casos de teste:
Porta da minha resposta Java.
-3 bytes graças a @Arnauld .
Experimente online.
fonte
i-=i*2^i^n?-1:n=i
(mas infelizmente não em Java).1
em JS. Obrigado!f=(n,i=0)=>i<n?i*2^i^n?f(n,i+1):f(i):n
Ruby , 39 bytes
Experimente online!
Como esperado para a versão recursiva, reclama sobre o "nível de pilha muito profundo" nos últimos casos de teste.
fonte
Geléia ,
119 bytesExperimente online!
Dicas: Use a função recursiva em vez de loops.
Muito rápido, infelizmente perde para a abordagem da força bruta.
Observe que:
Então, repetidamente:
B
)^\
ouÄḂ
, eles têm o mesmo efeito).?
) a cauda (último elemento) (Ṫ
) do XOR acumulado é diferente de zero (popcount ímpar)ṛ
).fonte
B^\⁸Ḅß$Ṫ?
Quarto (gforth) , 71 bytes
Experimente online!
Explicação
fonte
Perl 6 , 44 bytes
Tente
Expandido:
fonte
Prolog (SWI) , 44 bytes
Experimente online!
fonte
PHP, 49 bytes
Com base nas respostas de Kevin Cruijssen.
Execute como pipe
-nr
ou experimente online .fonte
F #, 92 bytes
Experimente online!
Verifica recursivamente os números de 1 a
i-1
. Se houver uma correspondência, verifique se há uma menor para esse número. Se não houver correspondência, retorne o número de entrada.fonte
JavaScript (Node.js) , 40 bytes
Experimente online!
Obrigado Shaggy por -1 bytes.
Porto da minha resposta Jelly .
Finalmente, há uma linguagem em que essa abordagem é
mais curta( oops ). (Eu tentei Python e Java , não funciona)Alguém pode explicar por que eu posso usar em
/2
vez de>>1
?fonte
x/2
funciona por causa do fluxo aritmético. Qualquer número IEEE 754 será avaliado como 0 quando dividido por 2 vezes suficientes. (E a parte decimal é simplesmente ignorada quando XOR, assim que esta não afeta o resultado.)false
retorno na última iteração é implicitamente convertido para0
o operador XOR bit a bit.false
está envolvido . O JS&&
se comporta quase de forma idêntica ao Python / Luaand
.K (ngn / k) ,
3226 bytesExperimente online!
{
}
é uma função com argumentox
/
aplica até convergência$[
;
;
]
if-then-else2\x
dígitos binários dex
(isto é específico para ngn / k)+\
somas parciais2!
mod 2a:
atribuir aa
*|
last - reverse (|
) e obtenha first (*
)se o acima for 1,
x
será retornadode outra forma:
-1_a
solte o último elemento dea
2/
decodificar bináriofonte
C, 62 bytes
Baseado no Java de Kevin Cruijssen:
int n(int j){for(int i=0;i<j;)i-=(i*2^i)==j?j=i:-1;return j;}
Testar:
Quando executado, o programa de teste gera:
C, 54 bytes
Funciona apenas com C89 ou K&R C:
n(j){for(i=0;i<j;)i-=(i*2^i)==j?j=i:-1;return j;}
fonte
int n(int j){for(int i=0;j>i-=i*2^i^j?-1:j=i;);return j;}
Esses 57 bytes funcionam?Wolfram Language (Mathematica) , 58 bytes
Experimente online!
Começa com uma lista contendo apenas a entrada. Substitui iterativamente a lista por todos os números inteiros que já estão nela ou mapeiam nela pela operação double-e-xor. Então
//.
diz para fazer isso até chegar a um ponto fixo. A resposta é o menor elemento do resultado.fonte