Dado un número entero , debe encontrar el número mínimo de bits que deben invertirse en para convertirlo en un número cuadrado . Solo puede invertir bits por debajo del más significativo .
Ejemplos
- ya es un número cuadrado ( ), por lo que la salida esperada es .
- se puede convertir en un número cuadrado invirtiendo 1 bit: ( ), por lo que la salida esperada es .
- no se puede convertir en un número cuadrado invirtiendo un solo bit (los posibles resultados son , , y ) pero se puede hacer invirtiendo 2 bits: ( ), por lo que la salida esperada es .
Reglas
- Está bien si su código es demasiado lento o arroja un error para los casos de prueba más grandes, pero al menos debería admitir en menos de 1 minuto.
- Este es el código de golf !
Casos de prueba
Input | Output
----------+--------
4 | 0
22 | 2
24 | 1
30 | 3
94 | 4
831 | 5
832 | 1
1055 | 4
6495 | 6
9999 | 4
40063 | 6
247614 | 7 (smallest N for which the answer is 7)
1049310 | 7 (clear them all!)
7361278 | 8 (smallest N for which the answer is 8)
100048606 | 8 (a bigger "8")
O en formato amigable copiar / pegar:
[4,22,24,30,94,831,832,1055,6495,9999,40063,247614,1049310,7361278,100048606]

100048606en TIO, ¿es eso un problema?Respuestas:
Ruby, 74 bytes
Pruébalo en línea!
Esto simplemente genera la secuencia (que es mucho más que suficiente), lo XOR con n , y luego toma el número de 1s en su representación binaria si el número de bits es menor que o igual a log 2 n , o n de lo contrario. Luego toma la cantidad mínima de bits invertidos. Devolver n en lugar del número de bits volteados cuando el bit más alto volteado es mayor que log 2 n evita que estos casos se elijan como mínimo, ya que n[ 12, 22, ... , n2] norte Iniciar sesión2norte norte norte Iniciar sesión2norte norte siempre será mayor que la cantidad de bits que tiene.
Gracias a Piccolo por guardar un byte.
fuente
(n^x*x).to_s 2;...lugar de(n^x*x).to_s(2);...Jalea , 12 bytes
Pruébalo en línea!
¡Mira un paquete de prueba!
Enlace monádico. Debería ser golfable.
Pero soy demasiado tonto para pensar en una forma de deshacerme delEs mi primera respuesta en la que utilizo con éxito el filtrado / mapeo / bucle en general junto con una cadena diádica \ o /³s.Explicación
², BẈEðƇ² ^ B§Ṃ - Programa completo / Enlace monádico. Llame al argumento N. ðƇ - Mantener filtro [1 ... N] con la siguiente cadena diádica: ², BẈE: el cuadrado del elemento actual tiene la misma longitud de bits que N. ² - Cuadrado. , - Emparejar con N. B - Convierte ambos a binario. Ẉ - Recuperar sus longitudes. E - Y verifique si equivalen. ² ^ - Después de filtrar, cuadra los resultados y XOR con N. B - Representación binaria de cada uno. § - Suma de cada uno. Cuenta el número de 1s en binario. Ṃ - Mínimofuente
Casco , 20 bytes
Pruébalo en línea!
Explicación
fuente
▼mΣfo¬←ṠMz≠ȯfo£İ□ḋπŀ2Lḋahorra 2 bytes. RIP tu puntaje cuadrado perfecto.Perl 6 , 65 bytes
Pruébalo en línea!
Me siento un poco sucio por probar un cuadrado perfecto al buscar un punto en la representación de cadena de la raíz cuadrada del número, pero ... cualquier cosa para eliminar bytes.
fuente
05AB1E ,
2015 bytes-5 bytes gracias a @ Mr.Xcoder usando un puerto de su respuesta Jelly .
Pruébelo en línea o verifique todos los casos de prueba (los tres casos de prueba más grandes se eliminan porque caducan después de 60 segundos; todavía toma alrededor de 35-45 segundos con los otros casos de prueba).
Explicación:
fuente
Lnʒ‚b€gË}^b€SOß. Desafortunadamente, rompe su suite de pruebasJava (JDK 10) , 110 bytes
Pruébalo en línea!
fuente
&lugar de lógico y&&Gaia , 18 bytes
Cerca del puerto de mi respuesta Jelly .
Pruébalo en línea!
Descompostura
s¦⟪, b¦l¦y⟫⁇ ⟪^ bΣ⟫¦⌋ - Programa completo. Llamemos a la entrada N. s¦ - Cuadra cada número entero en el rango [1 ... N]. ⟪⟫⁇ - Seleccione aquellos que cumplan una determinada condición, cuando se ejecuta Un bloque diádico. El uso de un bloque diádico ahorra un byte porque el input, N, se usa implícitamente como otro argumento. , - Empareja el elemento actual y N en una lista. b¦ - Convertirlos a binario. l¦ - Obtenga sus longitudes. y - Luego verifique si son iguales. ⟪⟫¦ - Ejecuta todos los enteros válidos a través de un bloque diádico. ^ - XOR cada uno con N. bΣ - Convierte a binario y suma (cuenta los 1s en binario) ⌋ - Mínimofuente
Brachylog ,
5641 bytesNo va a romper ningún récord de longitud, pero pensé que lo publicaría de todos modos
Pruébalo en línea!
fuente
Ensamblado x86-64, 37 bytes
Bytecode:
Muy bien, esto calcula incluso el ejemplo más alto en menos de un segundo.
El corazón del algoritmo es xor / popcount como de costumbre.
fuente
movxchgmov %ecx,%eax) y no puedo dejar que% ecx muera allí.Wolfram Language (Mathematica) , 67 bytes
Pruébalo en línea!
BitLengthPickBitXorMinDigitCount1fuente
Carbón , 31 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
fuente
Jalea , 20 bytes
Pruébalo en línea!
fuente
Python 2 , 82 bytes
Pruébalo en línea!
fuente
Japt
-g, 20 bytesEsto se puede jugar al golf.
Pruébalo en línea!
fuente
C (gcc) ,
9391 bytesPruébalo en línea!
Editar: creo que mi solución original (¡ Pruébelo en línea! ) No es válida, porque una de las variables
m, global para guardar algunos bytes al no especificar el tipo, se inicializó fuera def(n)y, por lo tanto, tuvo que reinicializarse entre llamadasCódigo sin comentarios y comentado:
Ediciones:
fuente