Desafío
Escriba una función o programa que tome un número decimal positivo, llámelo A y genere dos números positivos, B y C , de modo que:
- A == B bitxor C
- B y C no deben contener ninguno de los dígitos 0, 3 o 7 en su representación decimal.
Ejemplos
>>> decompose(3)
1, 2
>>> decompose(7)
1, 6
>>> decompose(718)
121, 695
>>> decompose(99997)
2, 99999
>>> decompose(4294967296)
4294968218, 922
>>> decompose(5296080632396965608312971217160142474083606142654386510789497504098664630388377556711796340247136376)
6291484486961499292662848846261496489294168969458648464915998254691295448225881546425551225669515922,
1191982455588299219648819556299554251659915414942295896926425126251962564256469862862114191986258666
Como la descomposición no es única, su función / programa no necesita generar exactamente los mismos resultados que estos ejemplos proporcionados.
Reglas muy detalladas
Las presentaciones deben ser en forma de una función o programa completo .
import
declaraciones no cuentan para el marcador final.Puede suponer que la entrada A siempre contiene al menos un dígito de 0, 3 o 7.
Puede suponer que siempre existe una descomposición.
Puede usar BigInt si forman parte de las bibliotecas estándar del idioma o si se pueden instalar a través del administrador de paquetes de jure del idioma .
La función debe ser rápida. No debería llevar más de 20 segundos ejecutarlo en una computadora razonablemente moderna cuando se ingresa un número de 100 dígitos, y no más de 2 segundos cuando se ingresa un número de 10 dígitos.
La función / programa debe admitir la entrada de al menos 100 dígitos .
- Si la función / programa solo admite números enteros de hasta N <100 dígitos, habrá una penalización de + 10 × (100 / N - 1) bytes a la puntuación final. Esto es para alentar a los golfistas a admitir una gama más amplia de números, incluso si la importación puede ser detallada.
No hay restricción en la presentación de entradas / salidas siempre que estén claramente en representación decimal.
- La función puede introducir y generar cadenas / BigInts si los tipos de enteros integrados no son suficientes.
- La entrada puede provenir del parámetro de función, argumento de línea de comando o STDIN.
- La función puede devolver el resultado o simplemente imprimir el resultado directamente en STDOUT.
- Sin embargo, el desbordamiento firmado en las entradas / salidas no está permitido.
- No se toleran respuestas aproximadas, las entradas / salidas deben ser exactas.
Puntuación
Este es un código de golf . La solución más corta en bytes gana.
Hay una penalización si el programa solo puede admitir números de menos de 100 dígitos:
- Enteros de 64 bits (19 dígitos) = +42 bytes
- Enteros de 63 bits (18 dígitos) = +45 bytes
- Enteros de 53 bits (15 dígitos) = +56 bytes
- Enteros de 31/32 bits (9 dígitos) = +101 bytes
Respuestas:
CJam, 70 bytes
Pruébalo en línea.
Selecciona aleatoriamente enteros hasta que encuentre una coincidencia. Esto apenas cumple con el límite de 20 segundos para enteros de 64 bits (utilizando el intérprete de Java), por lo que he agregado 42 al recuento de bytes real.
Ejecución de ejemplo
fuente
Common Lisp,
240224183173169 bytesCommon Lisp es un poco detallado para jugar al golf. Sin embargo, esto descompone números de 100 dígitos en menos de un segundo, y enteros de 200 dígitos en menos de diez segundos, por lo que no hay necesidad de penalizaciones. El algoritmo es determinista.
El avance de línea entre las funciones es solo para fines tipográficos. Prueba de funcionamiento con la entrada de referencia de 100 dígitos:
Como beneficio adicional, incluyo una versión del código que construye de manera incremental la solución de arriba hacia abajo. Puede administrar un número de 1000 dígitos en menos de diez segundos, pero no puede competir en golf debido al código adicional.
fuente
Python 2, 103 + 42 = 145 bytes
Python admite de forma nativa bigints, pero este programa supera con creces los 20 segundos para un número de 100 dígitos. Sin embargo, descompone enteros de 64 bits en alrededor de 2 segundos.
fuente
while
bucle para seguir probando valores aleatorios; simplemente puede llamar a la función nuevamente. Sin necesidad de una estructura de control, a continuación, puede colapsar la función a unalambda
y una ternaria:from random import* d=lambda a,b=0:set(`b`+`a^b`)&set(\'037\')and d(a,randint(1,a))or(b,a^b)
. Aunque es mejor que no uses una función.Python 3 (132 bytes)
(Esto es solo para estimular mejores soluciones. Esta es mi solución al resolver el problema original en la película ASCII).
Aunque el comportamiento de xor bit a bit en el sistema decimal es bastante complicado, hay una observación importante: modificar los dígitos bajos no afectará a los dígitos altos . Por lo tanto, podemos trabajar de arriba hacia abajo: intente liberar los dígitos superiores de 0, 3, 7 y luego trabaje en el siguiente dígito, hasta que se resuelva el número entero. Esto nos permite ejecutar en tiempo lineal, luego el procesamiento de un número de mil dígitos puede completarse en menos de 1 segundo. (La solución Common Lisp también está utilizando la misma técnica, creo).
fuente
997^8 == 1005
. Creo que hay un núcleo de una idea aquí, pero no es obvio.{1,2,4,5,6,8,9}
, habría algunos de ellos que no afectarán a los dígitos altos. (por ejemplo997^2 == 999
) Elwhile
bucle interno hace el agotamiento para encontrar la opción que mantenga válidos los dígitos altos.