Cosas que saber:
Primero, números de la suerte.
Los números de la suerte se generan así:
Toma todos los números naturales:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20...
Luego, elimina cada segundo número.
1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39...
Ahora 3
está a salvo.
Eliminar cada 3er número:
1, 3, 7, 9, 13, 15, 19, 21, 25, 27, 31, 33, 37, 39, 43, 45, 49, 51, 55, 59...
Ahora 7
está a salvo.
Eliminar cada séptimo número.
Continúe y elimine cada n
número, donde n
es el primer número seguro después de una eliminación.
La lista final de números seguros son los números de la suerte.
Los números desafortunados se componen de listas separadas de números, que son [U1, U2, U3... Un]
.
U1
es el primer conjunto de números eliminado de los "candidatos" afortunados, por lo que son:
2, 4, 6, 8, 10, 12, 14, 16, 18, 20...
U2
es el segundo conjunto de números eliminado:
5, 11, 17, 23, 29, 35, 41, 47, 53, 59...
Y así sucesivamente ( U3
es la tercera lista, U4
es la cuarta, etc.)
Reto:
Su tarea es, cuando se le dan dos entradas m
y n
, generar el m
número th en la lista Un
.
Ejemplo de entradas y salidas:
(5, 2) -> 29
(10, 1) -> 20
Especificaciones:
- Su programa debe funcionar
m
hasta1e6
yn
hasta100
.- Estás garantizado que ambos
m
yn
son enteros positivos. - Si tienes curiosidad,
U(1e6, 100)
=5,333,213,163
. (¡Gracias @pacholik!)
- Estás garantizado que ambos
- Su programa debe calcularlo dentro de 1 día en una computadora moderna razonable.
Este es el código de golf , por lo que gana el código más corto en bytes.
PD: Sería bueno que a alguien se le ocurriera una fórmula general para generarlos. Si tienes una fórmula, ¡por favor, ponla en tu respuesta!
(1e6,1e6)
?n=1
caso? Como esto es especial, para todos los demás casos, el índice basado en 0 del siguiente número de la suerte esn-1
.Respuestas:
CJam , 74 bytes
Pruébalo en línea! Tiempo de espera para casos más grandes, más sobre las limitaciones de tiempo a continuación.
Explicación:
Nuestro programa pide préstamos descaradamente el código de aditsu para generar una lista de N números de la suerte, reemplazando 1 con un 2 da el incremento en cada fase del tamiz. El código restante disminuye en cada elemento hasta que se encuentra un cero (cortando y agregando una cola no decrementada) y efectivamente cuenta los pasos en cada una de las N fases del tamiz a la vez.
Sincronización:
Si absolutamente debe ejecutar el programa en el navegador para números más grandes, puede usar este intérprete y permitir que el script continúe si se le solicita, pero esto puede ser demasiado lento para calificar. Usar ( M , N ) = (100,100) toma ~ 247s. La iteración de los programas es relativamente lineal en términos de M , por lo que la computación (1e6,100) podría tomar ~ 29 días.
Usando el intérprete de shell en una PC, el programa calcula (100,100) en ~ 6s y calcula (1e4,100) en ~ 463s. El programa debería poder calcular (1e6,100) en ~ 13-17hrs. En este caso, supondré que el programa califica.
Tenga en cuenta que todos los tiempos se redondearon tanto en las mediciones como en los cálculos.
fuente
Perl,
87858281 bytesIncluye +4 para
-pX
Dé entrada en STDIN como una línea con n primero (observe que este es el reverso del orden sugerido en el desafío). Entonces para calcular
U(1000000, 100)
:Algoritmo basado en aditsu Es números de la suerte responder a la complejidad del tiempo es
O(n^2)
por lo que es más rápido para la escala requerida. El100, 1000000
caso cede5333213163
en 0.7 segundos. Debido a los problemas que tiene Perl con lado$0
recursión basada, utiliza mucha memoria. Reescribirlo como una función haría que la memoria se usara,O(n)
pero es un número de bytes más largounlucky.pl
:Esto funciona como se muestra, pero usa literal
^S
para obtener la puntuación reclamada.No conozco ningún uso anterior de
$^S
perlgolf.fuente
(1e6,100)
?do$0
él, es básicamente inalcanzable en cualquier computadora realista. Pero si esa memoria existiera alrededor de 2 años. Realmente no he escrito y probado una versión normal basada en subrutinas, pero esperaría que termine en unos meses y se ejecute incluso en computadoras con muy poca memoria. Por lo tanto, es bueno que estos valores no estén en el rango requerido para este desafío.(1e6,100)
dentro de un día? ¿Qué quieres decir con que estos valores no son obligatorios?n
ym
se dan en orden inverso. La100 1000000
entrada calculaU(1000000, 100)
y da5,333,213,163
en 0.7 segundos. Es, con mucho, el programa más rápido de estos actualmente publicado(100,1e6)
ser mucho más rápido que(1e6,100)
eso, ¡y pensé que esta era la explicación de los rápidos 0.7 segundos!Pitón 3, 170
La función L genera la fila de posibles números de la suerte (si k es verdadero) o Un (si es falso). Evaluado perezosamente (por lo que no tengo que generar n-1 listas infinitas si quiero Un ).
Función de ejecución T .
Velocidad
U (1,000,000; 100) tarda aproximadamente 1h 45min en ejecutarse en mi máquina con PyPy. Sospecho unas cuatro horas con CPython. (Sí, 4h 20min para ser precisos).
Si usara una lista en lugar de generadores, podría ganar algo de velocidad, pero necesitaría una lista de mayor tamaño que Python me permite. Y si lo hiciera, necesitaría docenas de gigabytes de RAM.
Sí, y U (1,000,000; 100) = 5,333,213,163 .
fuente
Haskell
No se puede calcular para n = 1:
175160bytesCuando se compiló, mi computadora tardó 2h 35m en calcular una entrada para
(1000000,100)
usar esto:Traté de deshacerme de los
where
módulos, pero parecen afectar la velocidad y no estoy seguro de por qué ... Pero creo que hay más poda que hacer aquí.El método a utilizar es
m?n
para consultar la respuesta dada unam
yn
.Sin golf
Creo que es posible combinar las funciones 'skipeverynth' y 'everynth' en una sola función que devuelve un par.
Utilicé el código de esta amable persona para omitir cada enésimo elemento. Lo hice algunas veces, pero siempre fue mucho más ineficiente y no podía entender por qué.
Capaz de calcular para todos los n: 170 bytes
Esto es básicamente lo mismo, pero se
max
tuvieron que incluir un par de funciones para manejar el caso especial den=1
.fuente
R 82 bytes
Uso
Esto debe tener un vector lo suficientemente grande para comenzar, por lo que quedan suficientes números para devolver el valor. El vector creado ya es de aproximadamente 800Mb y la función puede manejar hasta m = 1e4 yn = 100, por lo que todavía está muy por debajo del objetivo.
Para crear un vector lo suficientemente grande como para calcular f (1e6,100) se necesitaría un vector inicial de 1: 2e10. Debido a los procedimientos de asignación de datos de Rs, esto crea un vector> 70 Gb que no se puede ejecutar en ninguna computadora que conozca, aunque se ejecutaría el código.
Como referencia, f (1e4,100) se ejecuta en aproximadamente 30 segundos. Basado en esto y en un par de pruebas más pequeñas, f (1e6,100) tomaría aproximadamente una hora.
fuente
Raqueta 332 bytes
Versión sin golf:
Pruebas:
Salida:
fuente
Clojure, 221 bytes
Muy largo pero maneja el estuche
(f 1)
. Sin ese caso especial, era de 183 bytes. Esto fue demasiado esfuerzo para no publicarlo.Resultados de muestra:
1000000 100 caso se calculó en aproximadamente 4,7 horas, al menos no se bloqueó.
fuente