Historia:
Lucy le preguntó a George cuál era su número de la suerte. Después de cierta contemplación, George respondió que tenía varios números de la suerte. Después de una breve confusión, Lucy le preguntó a George cuáles son sus primeros n
números de la suerte. Luego, George le pidió a su amigo que le escribiera un programa para hacer el trabajo por él.
El reto:
Escribirás un programa / función que recibirá del argumento de entrada / función estándar una cadena o un entero n
. El programa / función devolverá / generará los primeros n
Lucky Numbers . Los números de la suerte se definen a través de un tamiz de la siguiente manera.
Comience con los enteros positivos:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, ...
Ahora elimine cada segundo número:
1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, ...
El segundo número restante es 3 , así que elimine cada tercer número:
1, 3, 7, 9, 13, 15, 19, 21, 25, ...
Ahora el siguiente número restante es 7 , así que elimine cada séptimo número:
1, 3, 7, 9, 13, 15, 21, 25, ...
Luego, elimine cada noveno número y así sucesivamente. La secuencia resultante son los números de la suerte.
Victorioso:
Como es habitual para codegolf, gana menos bytes.
Como de costumbre, las presentaciones que utilizan lagunas estándar están descalificadas.
fuente
Respuestas:
Pitón 2, 79
¡La magia de iterar sobre una lista mientras el ciclo lo modifica!
La lista
L
comienza con todos los enteros1
a un valor suficientemente alto. El código itera sobre cada elementor
deL
, tomando la sublista de cadar
elemento y quitando cada uno de esos valores. Como resultado, los valores eliminados no se repiten. Al final, imprime los primerosn
elementos.La expresión
map(A.remove,B)
es un truco que he estado esperando mucho tiempo para usar. LlamaA.remove
a cada elemento deB
, lo que haceB
que se eliminen todos los elementos deA
. Efectivamente, toma la diferencia de la lista, aunque requiereB
ser una sublista deA
. Requiere Python 2, ya que Python 3 en realidad no evaluaría el mapa.El primer bucle necesita una carcasa especial para convertir
r
de1
a2
, comor+=r<2
.El límite superior suficientemente alto de
2**n
hace que el programa sea muy lento para valores grandes den
. Usar esn*n+1
suficiente, pero cuesta un personaje. Tenga en cuenta quen*n
no funciona paran=1
.fuente
n**2
números, no2**n
map
que tienes allí. Me preguntaba si había una mejor manera ...n**2+1
menos que el cason=1
pueda ser perdonado.map(A.index,B)
para encontrar los índices de los elementos de B en A,map(A.count,B)
para encontrar el número de elementos de B en A,map(A.extend,B)
para agregar una lista B aplanada a A. La mente se aturde.Haskell,
7169 bytesDefine una función
f
. La expresión se1:s[3,5..]3
evalúa como la lista infinita de números de la suerte, yf
simplemente toma el primeron
de ellos portake n
.Podría eliminar 5 bytes del tamiz utilizando una comprensión de lista paralela
pero eso requeriría pasar la enorme bandera del compilador
-XParallelListComp
a GHC para habilitar la extensión.Explicación del tamiz.
La idea básica es que
s(n:k)p
produce el(p-1)
número número de la suerten
, elimina cadan
número de la cola infinitak
(compensadop
para tener en cuenta los números producidos anteriormente) y vuelve a esa lista con el acumulador(p+1)
. Enf
, iniciamos el proceso con los números impares a partir de3
, y clavamos1
al frente, obteniendo exactamente los números de la suerte.fuente
Pitón 2,
71 6967Al principio, pensé que este sería un gran desafío para el corte de matriz de Python. Sin embargo, me encontré con un escollo cuando descubrí que a los sectores con un paso distinto de 1 solo se les puede asignar otro segmento de longitud idéntica. Pero después de buscar en Google "python remove slice", mi fe fue restaurada: encontré una
del
afirmación original que funciona perfectamente.Versión antigua
-2 bytes gracias a Sp3000.
fuente
> <> ,
121114111 bytesSolo tengo unas pocas palabras para decir ...
... "Argh me duele el cerebro".
Explicación
> <> es un lenguaje de programación esotérico 2D y definitivamente no es adecuado para esta tarea, debido a su falta de matrices. De hecho, el único tipo de datos en> <> es una extraña mezcla de int / float / char, y todo sucede en una pila de pilas.
Aquí está el resumen:
Aquí hay un ejemplo simulado que demuestra aproximadamente cómo funciona el tamizado (aquí
k
está el número de la suerte con el que tamizamos):fuente
nao
aparentemente puede interpretarse como "imprime esto ahora".CJam - 25
Pruébalo en línea
Explicación:
Esta implementación no elimina números sucesivamente de una matriz, sino que calcula cada número en función de cuántos se habrían eliminado antes.
Para cada índice i (de 0 a n-1) y cada número de suerte anterior l, en orden inverso, incrementamos i en i / (l-1), excepto para l = 1 usamos 1 en lugar de 0, y también sumamos 1 al final.
Por ejemplo, para i = 4 tenemos los primeros 4 números, [1 3 7 9], y calculamos:
4 + 4 / (9-1) = 4
4 + 4 / (7-1) = 4
4 + 4 / (3 -1) = 6
6 + 6/1 = 12
12 + 1 = 13
fuente
Pyth:
2322 bytesPruébelo en línea: Pyth Compiler / Executor
Explicación:
La reducción en realidad calcula más que
Q
números de la suerte (el comando eliminar se llama Q + 1 veces, Q-1 debería ser suficiente).fuente
R, 58 bytes
Con saltos de línea:
Versión anterior, 62 bytes
Versión anterior, 78 bytes
fuente
n=as.numeric(readline())
afunction(n){...}
. Esto crea un objeto de función que se puede asignar y llamar. Suelta las llaves en elfor
bucle.n=scan(n=1)
?CJam,
3230 bytesToma información de STDIN.
Explicación del código :
Pruébalo en línea aquí
fuente
Python 2,
105101bytesSolo una implementación sencilla.
Pyth,
39363532 bytesSimilar al enfoque anterior, pero las cosas están indexadas en 0 en lugar de 1. Pruébalo en línea .
Gracias a @Jakube por señalar un ahorro de bytes.
fuente
Mathematica, 80 bytes
Implementación directa de la definición. Como algunas otras respuestas, comienza con un rango desde
1
hasta y luego sigue filtrando.n2
fuente
Perl,
86817886:
ACTUALIZACIÓN: obviamente,
grep{...}
es mejor quemap{...?$_:()}
81:ACTUALIZACIÓN: OK, en realidad una línea ahora. No puedo parar. (?) 78:
fuente
Octava,
1398372Sin golf:
fuente
J,
6052 bytesExplicación (de derecha a izquierda):
2,1+2*i.@*:@>:
parece demasiado largo, pero solo puedo acortarlo en un intercambio de 1 byte*:
para!
hacer que la lista crezca exponencialmente.fuente
JavaScript (ES6) 96
99Editar cuenta atrás en el primer bucle - gracias @DocMax
Sin golf
Prueba en la consola Firefox / FireBug
Salida
fuente
F=n=>{for(o=[1],i=n*n;--i;)o[i]=2*i+1;for(;++i<n;o=o.filter((x,j)=>++j%o[i]));return o.slice(0,n)}
Matlab, 104 bytes
Gracias a @flawr por sus comentarios y sugerencias muy apropiados.
Ejemplo del símbolo del sistema de Matlab:
fuente
Bash + coreutils, 136
Esperaba jugar más golf, pero bueno. No todos los días se conecta a una función recursiva en un script de shell:
Salida:
Bash + coreutils, 104
Más corto usando una implementación más sencilla:
fuente
Ve, 326
Implementación directa usando gorutina y tuberías para hacer tamices.
fuente
MATLAB, 62 caracteres
Al principio malinterpreté el desafío: mi versión revisada ahora es en realidad más corta.
fuente
Raqueta 196 bytes
Produce números de la suerte hasta n:
Versión sin golf:
Pruebas:
Salida:
fuente