Nous définissons la fonction g comme g (n) = n XOR (n * 2) pour tout entier n> 0 .
Étant donné x> 0 , trouvez le plus petit entier y> 0 tel que g k (y) = x pour certains k> 0 .
Exemple
x = 549
549 = 483 XOR (483 * 2) (as binary: 1000100101 = 111100011 XOR 1111000110)
483 = 161 XOR (161 * 2) (as binary: 111100011 = 10100001 XOR 101000010)
Ce qui signifie que g 2 (161) = 549 . On ne peut pas aller plus loin, car il n'y a pas de n tel que g (n) = 161 . Ainsi, la sortie attendue pour x = 549 est y = 161 .
Règles
- Vous n'êtes pas censé prendre en charge les entrées non valides. Il est garanti qu'une paire (y, k) existe pour la valeur d'entrée x .
- C'est le code-golf , donc la réponse la plus courte en octets l'emporte!
Cas de test
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)
Réponses:
Java 8,
68575352 octets-5 octets grâce à @ OlivierGrégoire .
Essayez-le en ligne.
Explication:
la source
n->{for(int i=0;i<n;)i-=(i*2^i)==n?n=i:-1;return n;}
(52 octets). Désolé ^^ 'for(int i=0;n>i-=i+i^i^n?-1:n=i;);
?i+i^i^n?
n'est pas un booléen, donc il ne compilera même pas. De plus,n>i-=...
aura besoin de parenthèses (n>(i-=...)
), etn=i
n'est pas autorisé dans la clause else du ternary-if, uniquement dans la clause if (cette dernière, je ne sais pas pourquoi, mais c'est ce que c'est malheureusement en Java ).n=i
n'est pas autorisé dans la clause else du ternary-if". Parce que Java l'analyserait comme(i-=(i*2^i)!=n?-1:n)=i
illégal.Python 2 ,
5453 octetsEssayez-le en ligne!
la source
JavaScript, 53 octets
G
estg^-1
, qui est définii
sur0
if success, définii
sur1
if failed.la source
f=n=>(g=n=>n<2?0/!n:n%2+2*g(n/2^n%2))(n)?f(g(n)):n
. Malheureusement, l'approche ennuyeuse est de 12 octets plus courte.Pyth ,
13 1210 octets1 octet enregistré grâce à @MrXcoder, et 2 octets supplémentaires suite à leur suggestion
Essayez-le en ligne
Explication:
la source
T
pour 12 octets.R ,
7365 octetsEssayez-le en ligne!
Merci beaucoup Giuseppe (-8) à cause de vos réglages, si simples mais très efficaces
la source
f=
étant donné que les besoins de la fonction d'être lié àf
travailler correctement. Cela étant dit, beau travail, et prenez-moi un +1!JavaScript,
3836 octetsEssayez-le en ligne - commence à lancer des erreurs de débordement quelque part entre
9999
&57308
.la source
Gelée ,
87 octetsUtilisez
⁺¿
pour retourner le dernier élément non nul (merci Dennis pour -1 octet)Essayez-le en ligne!
La force brute gagne à nouveau :(
la source
^Ḥ)i$⁺¿
enregistre un octet.C (gcc) ,
57565551 octets!=
~-
.Un octetenregistré cinq octets grâce à Rogem ; en utilisant l'expression ternaire et les caprices de gcc.Essayez-le en ligne!
la source
X(O,R)
for(R=1;R;O=R?R:O)
enregistre un octet.R=O;
à la fin, cela ne semble pas nécessaire, ce qui vous fait économiser encore 4 octets.Z80Golf , 22 octets
Port de la réponse Java de @ KevinCruijssen
Exemple avec entrée de 9-Essayez-le en ligne!
Exemple avec entrée de 85-Essayez-le en ligne!
Assemblée:
Exemple d'assemblage pour appeler la fonction et imprimer le résultat:
la source
a
le compteur de boucles au lieu ded
, vous pouvez remplacer lesld d,0
instructions par lesxor a
deux fois, ce qui économise deux octets.Java (JDK 10) , 78 octets
Essayez-le en ligne!
la source
JavaScript (Node.js),
484538 octets-7 octets grâce à @Neil créant une version récursive de ma version itérative ci-dessous. Ne fonctionne pas pour les grands cas de test.
Essayez-le en ligne.
Version itérative de 45 octets qui fonctionne pour tous les cas de test:
Port de ma réponse Java.
-3 octets grâce à @Arnauld .
Essayez-le en ligne.
la source
i-=i*2^i^n?-1:n=i
(mais malheureusement pas en Java).1
en JS. Merci!f=(n,i=0)=>i<n?i*2^i^n?f(n,i+1):f(i):n
Rubis , 39 octets
Essayez-le en ligne!
Comme prévu pour la version récursive, se plaint de "niveau de pile trop profond" sur ces derniers cas de test.
la source
Gelée ,
119 octetsEssayez-le en ligne!
Conseils: utilisez la fonction récursive au lieu des boucles.
Très rapide, perd malheureusement à l'approche de la force brute.
Notez que:
Donc, nous répétons:
B
)^\
ouÄḂ
, ils ont le même effet).?
) la queue (dernier élément) (Ṫ
) du XOR accumulé est différente de zéro (popcount impair)ṛ
).la source
B^\⁸Ḅß$Ṫ?
Forth (gforth) , 71 octets
Essayez-le en ligne!
Explication
la source
Perl 6 , 44 octets
Essayez-le
Étendu:
la source
Prolog (SWI) , 44 octets
Essayez-le en ligne!
la source
PHP, 49 octets
Basé sur les réponses de Kevin Cruijssen.
Exécuter en tant que pipe avec
-nr
ou l' essayer en ligne .la source
F #, 92 octets
Essayez-le en ligne!
Vérifie récursivement les nombres de 1 à
i-1
. S'il y a une correspondance, recherchez un plus petit pour ce nombre. S'il n'y a pas de correspondance, renvoyez le numéro saisi.la source
JavaScript (Node.js) , 40 octets
Essayez-le en ligne!
Merci Shaggy pour -1 octets.
Port de ma réponse Jelly .
Enfin, il existe un langage où cette approche est
plus courte( oups ). (J'ai essayé Python et Java , ça ne marche pas)Quelqu'un peut-il expliquer pourquoi je peux utiliser à la
/2
place>>1
?la source
x/2
fonctionne à cause du sous-dépassement arithmétique. Tout numéro IEEE 754 sera finalement évalué à 0 lorsqu'il sera divisé par 2 fois suffisamment. (Et la partie décimale est simplement ignorée lors de la XOR, donc cela n'affecte pas le résultat.)false
de la dernière itération est implicitement converti en0
par l'opérateur XOR au niveau du bit.false
n'est impliqué . JS&&
se comporte presque de manière identique à Python / Luaand
.K (ngn / k) ,
3226 octetsEssayez-le en ligne!
{
}
est une fonction avec argumentx
/
l'applique jusqu'à la convergence$[
;
;
]
si-alors-sinon2\x
chiffres binaires dex
(ceci est spécifique à ngn / k)+\
sommes partielles2!
mod 2a:
affecter àa
*|
last - reverse (|
) et get first (*
)si ce qui précède est 1,
x
sera retournéautrement:
-1_a
déposer le dernier élément dea
2/
décoder le binairela source
C, 62 octets
Basé sur Java de Kevin Cruijssen:
int n(int j){for(int i=0;i<j;)i-=(i*2^i)==j?j=i:-1;return j;}
Tester:
Lorsqu'il est exécuté, le programme de test génère:
C, 54 octets
Fonctionne uniquement avec C89 ou K&R C:
n(j){for(i=0;i<j;)i-=(i*2^i)==j?j=i:-1;return j;}
la source
int n(int j){for(int i=0;j>i-=i*2^i^j?-1:j=i;);return j;}
Ces 57 octets fonctionnent-ils?Wolfram Language (Mathematica) , 58 octets
Essayez-le en ligne!
Commence par une liste contenant uniquement l'entrée. Remplace de manière itérative la liste par tous les entiers qui s'y trouvent déjà ou qui y sont mappés par l'opération double et xor. Dit ensuite
//.
de le faire jusqu'à atteindre un point fixe. La réponse est le moindre élément du résultat.la source