Fondo:
El desafío actual de Perfect Numbers es bastante defectuoso y complicado, ya que le pide que imprima en un formato complejo que involucra los factores del número. Este es un problema puramente decisivo del desafío.
Reto
Dado un entero positivo a través de cualquier formato de entrada estándar , distinga si es perfecto o no.
Un número perfecto es un número que es igual a la suma de todos sus divisores propios (sus divisores positivos son menores que él). Por ejemplo, es un número perfecto, ya que sus divisores son , que suman , mientras que no es un número perfecto ya que sus divisores ( ) suman , no .
Casos de prueba:
Imperfect:
1,12,13,18,20,1000,33550335
Perfect:
6,28,496,8128,33550336,8589869056
Reglas
- Su programa no tiene que completar los casos de prueba más grandes, si hay limitaciones de memoria o tiempo, pero debería ser teóricamente capaz si se le diera más memoria / tiempo.
- La salida puede ser dos valores distintos y consistentes a través de cualquier formato de salida permitido . Si no es inmediatamente obvio lo que representa Perfecto / Imperfecto, asegúrese de especificar en su respuesta.
1
sería perfecto, ya que cada número es divisible por1
sí mismo. La suma de los divisores propios de1
es0
Respuestas:
Brachylog , 4 bytes
Pruébalo en línea!
El predicado tiene éxito para entradas perfectas y falla para entradas imperfectas, impresión
true.
ofalse.
si se ejecuta como un programa completo (excepto en el último caso de prueba que lleva más de un minuto en TIO).fuente
fk
: xNeim , 3 bytes
Pruébalo en línea!
(En realidad, no sé cómo ejecutar todos los casos de prueba a la vez, ya que comencé a aprender Neim hace unos quince minutos, pero los comprobé individualmente).
Imprime 0 para imperfecto, 1 para perfecto.
fuente
𝔼
1 byte? ¿Neim usa solo 128 de esos caracteres no estándar?R ,
3329 bytesPruébalo en línea!
Devoluciones
TRUE
para números perfectos yFALSE
para números imperfectos.fuente
0
(perfecto) aFALSE
y distinto de cero,TRUE
pero eliminé uno de ellos para revertir el mapeo. Es un truco de golf útil para fundición a partirnumeric
delogical
, a menudo en combinación conwhich
o[
.Jalea , 3 bytes
Pruébalo en línea!
fuente
Japt
-!
, 4 bytesPor alguna razón
¦
no funciona en tio, así que necesito usar la-!
bandera y en su¥
lugarPruébalo en línea!
fuente
U
no se inserta automáticamente antes!
.Python 3 , 46 bytes
Pruébalo en línea!
Fuerza bruta, suma los factores y verifica la igualdad.
fuente
lambda x:sum(i for i in range(1,x)if x%i<1)^x
debería funcionar.Python , 45 bytes
True
para perfectoFalse
para otros (cambie esto con==
->!=
)Pruébalo en línea!
44 4241 bytes (-2 gracias a ovs) si podemos generar el uso de "truthy vs falsey":(falsey (
0
)) para perfecto; verdad (un número entero distinto de cero) de lo contrariofuente
Octava , 25 bytes
Pruébalo en línea!
Explicación
fuente
JavaScript, 38 bytes
Pruébalo en línea!
(Último tiempo de espera del caso de prueba en TIO).
fuente
f=
después de convertir de una función recursiva.C # (compilador interactivo de Visual C #) , 46 bytes
Devuelve 0 si es perfecto; de lo contrario, devuelve un número positivo. No sé si la salida de diferentes tipos de enteros está permitida en lugar de dos valores distintos de verdad y falsedad, y no pude encontrar ninguna discusión sobre meta al respecto. Si esto no es válido, lo eliminaré.
Pruébalo en línea!
C # (compilador interactivo de Visual C #) ,
4947 bytesPruébalo en línea!
fuente
Rubí , 33 bytes
Pruébalo en línea!
fuente
TI-BASIC (TI-84),
3023 bytesHorriblemente ineficiente, pero funciona.La reducción del bytecount aceleró mucho el programa.
La entrada está adentro
Ans
.La salida está adentro
Ans
y se imprime automáticamente cuando se completa el programa.Explicación:
(TI-BASIC no tiene comentarios, así que supongamos que
;
hace un comentario)Ejemplo:
Nota: El recuento de bytes de un programa se evalúa utilizando el valor en [MEM] > [2] > [7] (36 bytes) y luego resta la longitud del nombre del programa,
CDGF2
, (5 bytes) y 8 bytes adicionales utilizados para almacenar el programa:36 - 5 - 8 = 23 bytes
fuente
Java (JDK) , 54 bytes
Pruébalo en línea!
Aunque para una coincidencia estricta número por número, lo siguiente devolverá los mismos valores, pero solo tiene 40 bytes.
Pruébalo en línea!
fuente
Your program doesn't have to complete the larger test cases, if there's memory or time constraints, but it should be theoretically able to if it were given more memory/time.
int
en absoluto, sino más bien unBigInteger
? Porque Java tieneBigIntegers
, pero nunca tendrá unint
más de 31 bits como firmado, que no puede contener ningún otro valor que los representados aquí ...int
tipo no tiene límitesConjunto x86,
4543 bytes.Explicación (sintaxis Intel):
La entrada se debe proporcionar en
EAX
.Conjuntos de funciones
EAX
a1
para perfeccionar y0
para imperfecta.EDITAR : Redujo el conteo de bytes por dos reemplazando
MOV EAX, $1
conXOR EAX, EAX
yINC EAX
fuente
Laberinto , 80 bytes
Los caracteres latinos
perfect puts zero else neg I
son en realidad solo comentarios *.es decir, si la entrada es perfecta,
0
se imprime a, de lo contrario-1
es.Pruébalo en línea!
* así que esto o este trabajo también ...
¿Cómo?
Toma como entrada un número entero positivo
n
y coloca una variable de acumulador-n
en la pila auxiliar, luego realiza una prueba de divisibilidad para cada número entero desden-1
abajo hasta e incluyendo1
, agregando cualquiera que dividan
al acumulador. Una vez que esto se completa, si la variable del acumulador no es cero,-1
se emite, de lo contrario, se0
esEl
?::`}:(
solo se ejecuta una vez, al comienzo de la ejecución:La siguiente instrucción
"
es no operativa, pero tenemos tres instrucciones contiguas, por lo que nos ramificamos de acuerdo con el valor en la parte superior de Main, cero nos lleva hacia adelante, mientras que no cero nos lleva a la derecha.Si la entrada fue
1
, avanzamos porque la parte superior de Main es cero:Pero si la entrada fue mayor que
1
giramos a la derecha porque la parte superior de Main no es cero:En este punto tenemos una rama de tres vecinos, pero sabemos
n-1
que no es cero, así que giramos a la derecha ...Ahora estamos en otra sucursal de tres vecinos en
%
.Si el resultado de
%
no es cero, vamos a la izquierda para disminuir nuestro divisor potencialp=p-1
, y dejamos el acumuladora
, como está:... pero si el resultado de la
%
era de cero (para el primer pase sólo cuandon=2
) seguimos de frente a AMBOS añadir el divisor en nuestro acumulador,a=a+p
, y decremento nuestro potencial divisorp=p-1
:En este punto, si
p-1
todavía no es cero, giramos a la izquierda:... pero si
p-1
llega a cero, vamos directamente a la:
segunda línea del laberinto (has visto todas las instrucciones antes, así que dejo sus descripciones y solo doy su efecto):Ahora esto
{
tiene tres instrucciones vecinas, así que ...... si
a
es cero, lo que será perfecton
, entonces vamos directamente:... si
a
no es cero, lo que será para no perfecton
, entonces giramos a la izquierda:fuente
CJam , 17 bytes
Pruébalo en línea!
fuente
Javascript, 62
Explicación (aunque es bastante simple)
¡Gracias a Jo King por la mejora!
fuente
05AB1E , 4 bytes
Pruébalo en línea!
Explicación
fuente
Powershell,
46 bytes43 bytesPruébalo en línea!
Editar: -3 bytes gracias a @AdmBorkBork
fuente
2*$i
para eliminar los pares de restar uno.C (gcc) , 41 bytes
Pruébalo en línea!
Avíseme si esa falla para el caso final es un problema.
fuente
n=!s;
lugar dereturn!s;
guardar 5 bytes.s=s
lo que probablemente se optimizó.Smalltalk, 34 bytes
fuente
Adelante (gforth) , 45 bytes
Pruébalo en línea!
Explicación
Recorre cada número de 1 a n-1, sumando todos los valores que dividen n perfectamente. Devuelve verdadero si la suma es igual a n
Explicación del Código
fuente
Pyth , 9
13bytesPruébalo en línea!
Gracias a los comentaristas por la ayuda del golf.
Encuentra todos los factores de la entrada, los suma y los compara con la entrada original.
fuente
q0
se pueden reemplazar!
ySQ
producen el rango[1-Q]
, por lo que el rango[1-Q)
se puede generar usandoStQ
. Como losQ
s están ahora al final del programa, ambos pueden omitirse. Versión combinada, 9 bytes -qsf!%QTSt
Lote, 81 bytes
Se toma
n
como un parámetro de línea de comandos y1
se muestra si es un número perfecto. El método de fuerza bruta comienza la suma en-n
para que pueda incluirsen
en el bucle.fuente
Carbón , 13 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Salidas
-
para números perfectos. Utiliza fuerza bruta. Explicación:fuente
Wolfram Language (Mathematica) , 14 bytes
Pruébalo en línea!
fuente
Pyth, 8 bytes
Pruébelo en línea aquí .
fuente
Retina 0.8.2 , 44 bytes
Pruébalo en línea! Utiliza la fuerza bruta, por lo que el enlace solo incluye los casos de prueba más rápidos. Explicación:
Convierte a unario.
Haga coincidir todos los factores de la entrada. Utiliza el modo de superposición, que en Retina 0.8.2 requiere que todas las coincidencias comiencen en diferentes posiciones, por lo que las coincidencias se devuelven en orden descendente, comenzando con la entrada original.
Resta los factores apropiados de la entrada.
Prueba si el resultado es cero.
fuente
Java 8, 66 bytes
Alguien tiene que usar la API de transmisión en algún momento, incluso si hay una forma más corta de hacerlo
Pruébalo en línea!
fuente
cQuents , 8 bytes
Pruébalo en línea!
Explicación
fuente