Un número extraño es un número en el que la suma de divisores propios es mayor que el número mismo y ningún subconjunto de divisores propios suma a ese número.
Ejemplos:
70 es un número extraño porque sus divisores propios (1, 2, 5, 7, 10, 14 y 35) suman 74, que es mayor que 70, y ninguna combinación de estos números suma 70.
18 no es un número extraño porque sus divisores propios (1, 2, 3, 4, 6, 9) suman 25, que es mayor que 18, pero 3, 6 y 9 suman 18.
Su tarea es escribir el programa más corto que ingresa a través de cualquier número n estándar y calcula e imprime en un archivo o elimina los primeros n números raros con separación de línea nueva. No se permite la codificación de las respuestas (perdón por no especificar esto al principio).
Para obtener más ejemplos, consulte esta página: http://mathworld.wolfram.com/WeirdNumber.html
Respuestas:
Mathematica
999487Espacios no necesarios. ¡Lento!:
A expensas de unos pocos caracteres, esta es una versión más rápida que verifica solo números pares y omite múltiplos
6
que nunca son raros:todavía es demasiado lento para cualquier propósito útil. Encuentra los dos primeros en unos segundos, pero se vuelve más y más lento a medida que aumenta el número de divisores.
fuente
Haskell - 129
Estoy seguro de que hay mucho para jugar golf aquí, pero como la competencia parece baja por ahora, voy a tirar esto.
Sin embargo, no intente ejecutar esto, logré esperar solo los dos primeros elementos, el tercero comenzará a tomar minutos.
fuente
Python 2.7 (255 bytes)
fuente
PHP, 267 bytes
Y aquí está el código fuente original:
Notarás que lleva un tiempo generar los números, ya que realiza una verificación de fuerza bruta (aunque deberías llegar a 70 bastante rápido).
fuente
R, 164
Versión sin golf:
Esto lleva algún tiempo debido a la fuerza bruta.
fuente
Rubí - 152
Ruby con ActiveSupport - 138
Muy lento y estoy casi seguro de que todavía hay espacio para jugar al golf ...
fuente
Smalltalk, 143
entrada:
salida:
fuente
SageMath:
143131 bytesEs más, ni siquiera golf, no hay demasiado golf de todos modos en el código. Lo más importante es que
2*x>=sum(l)
primero debe hacer la prueba , le ahorraría mucho tiempo de cálculo. Uno tiene que darse cuenta de quemax
en booleanos loor
segundo es quew(x)
esFalse
para números extraños yTrue
para números no extraños. Versión sin golf:fuente
C ++ - 458
Esta no es toda mi solución, ya que tuve que pedir ayuda a SO para calcular la suma de los subconjuntos, pero todo lo demás es mío:
Versión larga:
Actualmente solo ha calculado los dos primeros (70 y 836). Lo maté después de eso.
fuente
Perl, 173
Déjame agregar otra solución inútil. Esta solución es tan lenta que ni siquiera puede mostrar nada más allá del primer número extraño. Me atrevo a decir que es la solución más lenta de todas aquí.
Manifestación
El mismo código escrito en Java (con el que me siento más cómodo) ni siquiera puede reconocer el segundo número extraño (836), y ya he alimentado el número directamente al método de verificación (en lugar de recorrer y verificar cada número).
El núcleo de esta solución se encuentra en la expresión regular:
Y cómo se configura la cadena para que sea 3 veces el número que estamos comprobando.
La longitud de la cadena está configurada para que sea 3 veces el número que estamos verificando
i
: los primeros 2i
son para la suma de factores coincidentes y el último 1i
está reservado para verificar si un número es un factor dei
.(?=(.+)\1{2}$)
se utiliza para capturar el número que estamos verificando.((.+)(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))(?=.*(?=\1$)\3+$))+
coincide con los factores del número. La iteración posterior coincidirá con un factor más pequeño que una iteración anterior.(.+)
y(?=.*(?=\1$)\3+$)
juntas seleccionan un factor del número que se verifica.(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))
se asegura de que el factor seleccionado sea más pequeño que el número que se verifica en la primera iteración, y es más pequeño que el factor anterior en las iteraciones posteriores.La expresión regular intenta hacer coincidir tantos factores del número como sea posible dentro del límite de 2
i
. Pero no nos importa el valor real de la suma de divisores, solo nos importa si el número es abundante.Luego, la segunda expresión regular, que es la primera expresión regular con
\1{2}$
agregado. Como resultado, la expresión regular se asegura de que la suma de (algunos) factores del número que se verifica sea igual al número mismo:La restricción añadida hará que el motor de expresiones regulares realice una búsqueda de retroceso en todos los subconjuntos posibles de factores, por lo que será extremadamente lento.
fuente
Perl,
176174 bytesSe espera el número de números extraños en STDIN y los números encontrados se imprimen en STDOUT.
Versión sin golf
Limitaciones
fuente