Definimos la función g como g (n) = n XOR (n * 2) para cualquier número entero n> 0 .
Dado x> 0 , encuentre el entero más pequeño y> 0 tal que g k (y) = x para algunos k> 0 .
Ejemplo
x = 549
549 = 483 XOR (483 * 2) (as binary: 1000100101 = 111100011 XOR 1111000110)
483 = 161 XOR (161 * 2) (as binary: 111100011 = 10100001 XOR 101000010)
Lo que significa que g 2 (161) = 549 . No podemos ir más allá, ya que no hay n tal que g (n) = 161 . Entonces, la salida esperada para x = 549 es y = 161 .
Reglas
- Se supone que no debe admitir entradas no válidas. Se garantiza que existe un par (y, k) para el valor de entrada x .
- Este es el código de golf , por lo que gana la respuesta más corta en bytes.
Casos de prueba
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)
Respuestas:
Java 8,
68575352 bytes-5 bytes gracias a @ OlivierGrégoire .
Pruébalo en línea.
Explicación:
fuente
n->{for(int i=0;i<n;)i-=(i*2^i)==n?n=i:-1;return n;}
(52 bytes). Lo siento ^^ 'for(int i=0;n>i-=i+i^i^n?-1:n=i;);
?i+i^i^n?
no es un booleano, por lo que ni siquiera se compilará. Además,n>i-=...
necesitará paréntesis (n>(i-=...)
), yn=i
no está permitido en la cláusula else del ternario if, solo en la cláusula if (esta última no sé por qué, pero desafortunadamente eso es lo que es en Java )n=i
no está permitido en la cláusula else del ternario si". Porque Java lo analizaría como(i-=(i*2^i)!=n?-1:n)=i
ilegal.Python 2 ,
5453 bytesPruébalo en línea!
fuente
JavaScript, 53 bytes
G
es decirg^-1
, que se establecei
en0
caso de éxito, se establecei
en1
si fallafuente
f=n=>(g=n=>n<2?0/!n:n%2+2*g(n/2^n%2))(n)?f(g(n)):n
. Lamentablemente, el enfoque aburrido es 12 bytes más corto.Pyth ,
13 1210 bytesSe guardó 1 byte gracias a @MrXcoder y 2 bytes más siguiendo su sugerencia
Pruébalo en línea
Explicación:
fuente
T
de 12 bytes.R ,
7365 bytesPruébalo en línea!
Muchas gracias Giuseppe (-8) debido a tus ajustes, tan simple pero muy efectivo
fuente
f=
ya que las necesidades de función para ser obligados af
trabajar correctamente. Dicho esto, buen trabajo, ¡y toma un +1 de mí!JavaScript
3836 bytesPruébelo en línea : comienza a arrojar errores de desbordamiento en algún lugar entre
9999
&57308
.fuente
Jalea ,
87 bytesÚselo
⁺¿
para devolver el último elemento distinto de cero (gracias Dennis por -1 byte)Pruébalo en línea!
La fuerza bruta gana de nuevo :(
fuente
^Ḥ)i$⁺¿
Guarda un byte.C (gcc) ,
57565551 bytes!=
~-
.un byte decinco bytes gracias a Rogem ; haciendo uso de la expresión ternaria y las peculiaridades de gcc.Pruébalo en línea!
fuente
X(O,R)
for(R=1;R;O=R?R:O)
Guarda un byte.R=O;
al final parece ser innecesario, ahorrándote otros 4 bytes.Z80Golf , 22 bytes
Puerto de la respuesta Java de @ KevinCruijssen
Ejemplo con entrada de 9-¡Pruébelo en línea!
Ejemplo con entrada de 85-¡Pruébelo en línea!
Montaje:
Ejemplo de ensamblaje para llamar a la función e imprimir el resultado:
fuente
a
el contador de bucle en lugar ded
, puede reemplazar lasld d,0
instrucciones enxor a
ambas ocasiones, lo que ahorra dos bytes.Java (JDK 10) , 78 bytes
Pruébalo en línea!
fuente
JavaScript (Node.js),
484538 bytes-7 bytes gracias a que @Neil creó una versión recursiva de mi versión iterativa a continuación. No funciona para casos de prueba grandes.
Pruébalo en línea.
Versión iterativa de 45 bytes que funciona para todos los casos de prueba:
Puerto de mi respuesta Java.
-3 bytes gracias a @Arnauld .
Pruébalo en línea.
fuente
i-=i*2^i^n?-1:n=i
(pero desafortunadamente no en Java).1
en JS. ¡Gracias!f=(n,i=0)=>i<n?i*2^i^n?f(n,i+1):f(i):n
Ruby , 39 bytes
Pruébalo en línea!
Como se esperaba para la versión recursiva, se queja de "nivel de pila demasiado profundo" en los últimos casos de prueba.
fuente
Jalea ,
119 bytesPruébalo en línea!
Consejos: utilice la función recursiva en lugar de bucles.
Muy rápido, lamentablemente pierde con el enfoque de fuerza bruta.
Tenga en cuenta que:
Entonces, repetidamente:
B
)^\
oÄḂ
, tienen el mismo efecto).?
) la cola (último elemento) (Ṫ
) del XOR acumulado es distinto de cero (cuenta pop impar)ṛ
).fuente
B^\⁸Ḅß$Ṫ?
Adelante (gforth) , 71 bytes
Pruébalo en línea!
Explicación
fuente
Perl 6 , 44 bytes
Intentalo
Expandido:
fuente
Prólogo (SWI) , 44 bytes
Pruébalo en línea!
fuente
PHP, 49 bytes
Basado en las respuestas de Kevin Cruijssen.
Ejecutar como tubería
-nr
o probarlo en línea .fuente
F #, 92 bytes
Pruébalo en línea!
Verifica recursivamente los números del 1 al
i-1
. Si hay una coincidencia, busque una más pequeña para ese número. Si no hay coincidencia, devuelva el número de entrada.fuente
JavaScript (Node.js) , 40 bytes
Pruébalo en línea!
Gracias Shaggy por -1 bytes.
Respuesta de Port of my Jelly .
Finalmente, hay un lenguaje en el que este enfoque es
más corto( Uy ). (Probé Python y Java , no funciona)¿Alguien puede explicar por qué puedo usar en
/2
lugar de>>1
?fuente
x/2
funciona debido al flujo inferior aritmético. Cualquier número IEEE 754 eventualmente se evaluará como 0 cuando se divida entre 2 veces suficientes. (Y la parte decimal simplemente se ignora cuando se hace XOR, por lo que esto no afecta el resultado).false
devuelto en la última iteración se convierte implícitamente en0
operador XOR bit a bit convierte .false
está involucrado . JS se&&
comporta casi idénticamente a Python / Luaand
.K (ngn / k) ,
3226 bytesPruébalo en línea!
{
}
es una función con argumentox
/
lo aplica hasta la convergencia$[
;
;
]
si-entonces-otro2\x
dígitos binarios dex
(esto es específico de ngn / k)+\
sumas parciales2!
mod 2a:
asignar aa
*|
last - reverse (|
) y get first (*
)si lo anterior es 1,
x
será devueltode otra manera:
-1_a
soltar el último elemento dea
2/
decodificar binariofuente
C, 62 bytes
Basado en Java de Kevin Cruijssen:
int n(int j){for(int i=0;i<j;)i-=(i*2^i)==j?j=i:-1;return j;}
Probar:
Cuando se ejecuta, el programa de prueba genera:
C, 54 bytes
Solo funciona con C89 o K&R C:
n(j){for(i=0;i<j;)i-=(i*2^i)==j?j=i:-1;return j;}
fuente
int n(int j){for(int i=0;j>i-=i*2^i^j?-1:j=i;);return j;}
¿Funcionan estos 57 bytes?Wolfram Language (Mathematica) , 58 bytes
Pruébalo en línea!
Comienza con una lista que contiene solo la entrada. Iterativamente reemplaza la lista por todos los enteros que ya están en ella, o se asignan a ella mediante la operación doble y xor. Luego
//.
dice hacer esto hasta llegar a un punto fijo. La respuesta es el elemento mínimo del resultado.fuente