Considere la secuencia natural hasta 6 (ignore 1) :
2,3,4,5,6
Comenzamos a escanear desde la izquierda (en este caso desde 2), buscamos un número divisible por 2 (aquí 4) y luego eliminamos ambos números de la lista (aquí 2 y 4), de modo que la lista se reduce a:
3,5,6
Continuamos el mismo proceso, aquí el más a la izquierda es 3, por lo que buscamos un número divisible por 3. 6 es seguramente ese número y, por lo tanto, se eliminan 3 y 6,
5
Ahora, no se pueden realizar más búsquedas de este tipo. Por lo tanto, se convierte en la lista de números ALONED para n = 6.
OBJETIVO
- Dado un número n mayor que 1, imprima todos los números alonados correspondientes.
ENTRADA
2
6
15
20
22
SALIDA
2
5
8,9,11,12,13,15
11,12,13,15,17,19,20
12,13,15,17,19,20,21
AÚN OTRO EJEMPLO RESUELTO
Para n = 22
=>2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22
=>3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 (remove 2 & 4)
=>5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 (remove 3 & 6)
=>7,8,9,11,12,13,14,15,16,17,18,19,20,21,22 (remove 5 & 10)
=>8,9,11,12,13,15,16,17,18,19,20,21,22 (remove 7 & 14)
=>9,11,12,13,15,17,18,19,20,21,22 (remove 8 & 16)
=>11,12,13,15,17,19,20,21,22 (remove 9 & 18)
=>12,13,15,17,19,20,21 (remove 11 & 22) (OUTPUT)
Este es el código de golf , por lo que gana el código más corto en bytes.
Respuestas:
05AB1E ,
22171514 bytesPruébalo en línea!
Explicación
fuente
Python 2,
907973 bytes-6 bytes gracias a xnor
Toma el número de entrada en stdin. Ideone it!
Explicación
Construimos la lista inicial a partir del número de entrada y la almacenamos
L
. Luego, repita mientras el último número es mayor o igual a 2 veces el primer número y elimine 2 veces el primer número de la lista. Este siempre será el próximo número divisible porL[0]
.L=L[1:]
saca el primer número también. Cuando la condición ya no es verdadera, no se pueden realizar más eliminaciones y se imprime la lista.fuente
range
ya da una lista.Python, 61 bytes
Es un poco más fácil entender este código menos golfizado:
Esto utiliza una caracterización directa de números alonados:
¿Por qué se sostiene esto? Al hacer el proceso para
n
, digamos que eliminamos un número impara
en la mitad inferior (1
an/2
). Luego,2*a
se elimina sin importar en qué parte de la lista se encuentre. Entonces,4*a
permanece (si existió). Pero si está en la mitad inferior, el proceso de eliminación llegará y eliminará ambos4*a
y8*a
. Por lo tanto, vemos que un número medio superior se retira si es de la forma2*a
,8*a
... con extrañac
, pero estancias si tiene formaa
,4*a
,8*a
, ...La excepción es for
a=1
, que no comienza en la lista y, por lo tanto, no se elimina. Como resultado, la cadena de eliminación comienzaa=2
y la regla para potencias de 2 se cambia.En el código anterior,
(i&-i)**.5%1>0
verifica sii
carece de la formai = a * 2^b
conb
impar, por el truco de bits para extraer el mayor factor de potencia de dos,2^b = i&-i
y luego verifica si el resultado no es un cuadrado perfecto. Entonces,i&~-i>0
es otro truco para comprobar sii
no es una potencia perfecta de 2. Estas condiciones se corrigen.Hay algunas mejoras más aquí
Primero, cambiamos el índice del rango 1 hacia abajo para acortar a
range(n/2,n)
desderange(n/2+1,n+1)
, compensando reemplazando todoi
coni+1
(o~-i
).Ya sea una potencia de 2 es el número es una potencia de
4
(2 ^b
con elb
par) se puede comprobar y-ción con2**c/3
algún grandec
. Esto se debe a que2**c/3
tiene una representación binaria10101...101
con unos en los bits de posición par. Usandoc=2*n
suficientes. Para negar el resultado cuandoi
es una potencia de 2, reducimos a la mitad este número en ese caso, colocando1
las posiciones impares en su lugar.fuente
Groovy,
6558 BytesIdea de algoritmo de DSLoc , que notó que solo necesita eliminar los dobles.
Aquí hay un desglose:
fuente
Perl,
53494544 bytesIncluye +1 para
-n
Dé el número de entrada en STDIN:
aloned.pl
:Verificar directamente los números posibles es más largo:
Esto verifica todos los números en el rango medio superior. Mantenga los números que tienen un número par de 2 como factores primos, excepto si el número es una potencia de 2 y luego impar (porque 1 queda fuera de la serie original). Sin embargo, este método debería funcionar bien para otros idiomas.
fuente
MATL , 18 bytes
Tomó prestada la idea de "multiplicar por 2" de la respuesta 05AB1E de @ Emigna .
Pruébalo en línea!
Explicación
fuente
Haskell,
71696256 bytesEjemplo de uso:
q 22
->[12,13,15,17,19,20,21]
.Si hay un múltiplo del primer número
a
, entonces es2*a
. Mantenera
si2*a
no está en la lista y agregar una llamada recursiva cona
y2*a
eliminado de la lista.fuente
Pyth - 19 bytes
Será sin duda ser refactorización.
Test Suite .
fuente
Rubí, 124
Comparando puntajes con otras respuestas, este es obviamente el enfoque equivocado:
El bit algo inteligente aquí es el
a[g[0]]=a[g[1]]=!g[1]
que establece los valores de hash en verdadero / falso según sea necesario.fuente
PHP, 98 bytes
8 Bytes guardados por @Titus Gracias
Si se permite una coma final, se puede acortar 9 bytes en
(!$a?:print"$a,");
lugar de(!$a?:print$x?",$a":$x=$a);
fuente
$a
y no$b
necesitan paréntesis? ¡Malvado!(!$a?:print"$a,")
->print$a?"$a,":""
. -2 bytes para ambas versiones si usa el guión bajo como separador.foreach(... as$v)
,$v-2
en lugar de$k
y$v*2-2
en lugar de$k*2+2
.$a=&$r[$k]&&$b=&$r[$k*2+2]
funcione como$a=$r[$k]and$b=$r[$k*2+2]
. Lamento no haber encontrado ninguna página que explique las combinaciones con las referencias y el&&
operador. Pero necesito referencias, no asignaciones. No estoy seguro de si se permite una coma final u otro separador.&
bitwise y las referencias tienen una precedencia más alta que el&&
operadorJavascript, 149 bytes
Aquí hay un ejemplo de trabajo. Todo el HTML y la función wrapper () son solo interactivos.
Mostrar fragmento de código
Este fragmento de código no protegido tiene algunos comentarios y le permite ver interactivamente los pasos para cualquier entrada dada.
Mostrar fragmento de código
fuente
JavaScript (ES6), 92 bytes
Pensé que había publicado esto ayer, pero obviamente no ...
Aquí hay otra versión:
fuente
Java 7, 210 bytes
Definitivamente se puede jugar un poco más usando un enfoque diferente, probablemente usando una matriz con algunos trucos. Debido al reparto, la interrupción, la lista de tipos y las comprobaciones de if es un poco más larga de lo esperado, pero funciona.
Ungolfed y código de prueba:
Pruébalo aquí
Salida:
fuente
Raqueta 191 bytes
Ungolfed (comentarios después de ';'):
Pruebas:
Salida:
fuente