Introducción (puede ser ignorado)
Poner todos los números positivos en su orden regular (1, 2, 3, ...) es un poco aburrido, ¿no? Así que aquí hay una serie de desafíos en torno a las permutaciones (reorganizaciones) de todos los números positivos. Este es el segundo desafío de esta serie. El primer desafío se puede encontrar aquí .
En este desafío, usamos códigos grises para reorganizar los números naturales. Un código gris, o "código binario reflejado" es una codificación binaria de tal manera que dos valores sucesivos difieren en un solo bit. Una aplicación práctica de esta codificación es usarla en codificadores rotativos , de ahí mi referencia a "Turn My Way" .
Tenga en cuenta que esta codificación deja cierto grado de libertad. Por ejemplo, después del 1100 binario, hay cuatro posibles códigos siguientes: 1101, 1110, 1000 y 0100. Es por eso que definiré como el valor más pequeño, no utilizado previamente, que difiere solo un carácter en la codificación binaria. Esta secuencia corresponde con A163252 .
Como se trata de un desafío de "secuencia pura", la tarea es generar para un dado como entrada, donde es A163252 .
Tarea
Dada una entrada entera , salida en formato entero ( no en formato binario).
se define como el número entero menos positivo que no aparece antes en la secuencia, de modo que y difieren en un solo bit cuando se escriben en binario.
Nota: aquí se supone una indexación basada en 1; puede usar indexación basada en 0, entonces , etc. Mencione esto en su respuesta si elige usar esto.
Casos de prueba
Input | Output
--------------
1 | 1
5 | 4
20 | 18
50 | 48
123 | 121
1234 | 1333
3000 | 3030
9999 | 9997
Reglas
- La entrada y la salida son enteros (su programa al menos debe admitir entradas y salidas en el rango de 1 hasta 32767)
- La entrada no válida (0, flotantes, cadenas, valores negativos, etc.) puede generar salidas imprevistas, errores o un comportamiento (no) definido. En A163252 , se define como 0. Para este desafío, lo ignoraremos.
- Se aplican las reglas de E / S predeterminadas .
- Las lagunas predeterminadas están prohibidas.
- Este es el código de golf , por lo que gana la respuesta más corta en bytes
Nota final
Consulte las siguientes preguntas relacionadas (pero no iguales) de PP&CG:
JavaScript (ES6), 65 bytes
1 indexado.
Pruébalo en línea!
Comentado
fuente
Gelatina ,
2620 bytesPruébalo en línea!
Un programa completo que toma n como argumento único. Funciona para todos los casos de prueba. También tenga en cuenta que, aunque no es obligatorio, maneja n = 0.
Explicación
Enlace auxiliar: encuentre el próximo término y anteponga
Enlace principal
fuente
Java (JDK) ,
14213812412313213098 bytesPruébalo en línea!
fuente
import java.util.*;
+Set s=new HashSet();
avar s=new java.util.HashSet();
. Además, el resto puede ser golfed a:Integer i=0,j,k=0;for(;i++<n;s.add(k=j))for(j=0;s.contains(++j)|i.bitCount(j^k)>1;);return k;
. Buena respuesta, así que +1 de mi parte. :)Stack
lugar deHashSet
. Mucho más lento pero funciona!Python 2 , 81 bytes
Indexación basada en 1
Pruébalo en línea!
Python 2 , 79 bytes
Esto lleva mucho tiempo (9999 no se terminó después de ejecutarse localmente durante 7 minutos)
Pruébalo en línea!
fuente
Wolfram Language (Mathematica) , 74 bytes
Pruébalo en línea!
fuente
APL (Dyalog Extended) , 46 bytes
Pruébalo en línea!
fuente
Carbón , 65 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Inicializa el resultado a 0.
n
Tiempos de bucle .Guarde el resultado anterior para que no lo usemos nuevamente.
Encuentra el bit más alto en el resultado anterior.
Si bien ese bit es mayor que 1, si el bit se establece en el resultado anterior, intente restar ese bit para ver si el resultado es un resultado invisible. Esto asegura que los resultados potenciales se prueben en orden ascendente de valor.
Ahora intente XORing ese bit con el resultado anterior, duplicando el bit hasta que se encuentre un resultado invisible. Esto maneja los casos en que se necesita establecer un bit, nuevamente en orden ascendente de valor, pero también el caso en que se necesita alternar el bit menos significativo, que el bucle anterior no se molesta en probar (porque es más golfista probar eso aquí). Si el ciclo anterior encontró un resultado invisible, este ciclo nunca se ejecuta; si no fuera así, este bucle volverá a probar esos resultados inútilmente.
Actualice el resultado realmente haciendo XOR al bit con él.
Salida del resultado final al final del ciclo.
fuente
05AB1E ,
212018 bytesBastante ineficiente, por lo que cuanto mayor es la entrada, más tiempo se tarda en obtener el resultado. Sin
0
embargo, también funciona para la entrada .Explicación:
fuente
Haskell , 101 bytes
Pruébalo en línea!
Parece una pena incurrir en una importación solo por
xor
, pero aún no he encontrado una buena solución. También me pregunto si hay una mejor manera de expresar el ciclo.fuente
R , 90 bytes
Pruébalo en línea!
fuente