Este es mi primer desafío!
Fondo
El número perfecto es un entero positivo, que es igual a la suma de todos sus divisores, excepto a sí mismo.
Entonces 6
es un número perfecto, ya que 1 + 2 + 3 = 6
.
Por otro lado 12
no lo es, porque 1 + 2 + 3 + 4 + 6 = 16 != 12
.
Tarea
Su tarea es simple, escriba un programa que, por supuesto n
, imprima uno de estos mensajes:
Soy un número perfecto, porque
d1 + d2 + ... + dm = s == n
no soy un número perfecto, porqued1 + d2 + ... + dm = s [<>] n
¿Dónde
d1, ... dm
están todos los divisores de n
excepto n
?
s
es la suma de todos los divisores d1, ..., dm
(de nuevo, sin n
).
[<>]
es <
(if s < n
) o >
(if s > n
).
Ejemplos
Por n
ser 6
: "Soy un número perfecto, porque 1 + 2 + 3 = 6 == 6"
Por n
ser 12
: "No soy un número perfecto, porque 1 + 2 + 3 + 4 + 6 = 16> 12"
Por n
ser 13
: "No soy un número perfecto, porque 1 = 1 <13"
Reglas
n
no es más grande que el estándar de tu idiomaint
.- Puede leer
n
desde la entrada estándar, desde argumentos de línea de comandos o desde un archivo. - El mensaje de salida debe imprimirse en la salida estándar y no pueden aparecer caracteres adicionales en la salida (puede tener espacios en blanco al final o nueva línea)
- No puede usar ninguna función incorporada o de biblioteca que resuelva la tarea (o su parte principal) por usted. No
GetDivisors()
o algo así. - Se aplican todas las demás lagunas estándar .
Ganador
Este es el código de golf, ¡el código más corto en bytes gana!
fuente
=
y==
en la misma ecuación? Eso no tiene sentido. Debería ser de lad1 + d2 + ... + dm = s = n
OMI.Respuestas:
Pyth, 81 bytes
Pruébelo en línea: Demostración o conjunto de pruebas
Explicación:
fuente
Java,
255270 bytes (Todavía FF en base 17)Y una versión más legible:
Anteriormente no funcionaba para números impares, así que tuve que modificar algunas cosas. Al menos tuve suerte con el recuento de bytes nuevamente. :)
fuente
R,
158163157153143141 bytesTodavía hay espacio para jugar al golf, creo.
Editar: reemplazado
if(b<n)'<'else if(b>n)'>'else'=='
porc('<'[b<n],'>'[b>n],'=='[b==n])
. Elpaste(...)
se reemplaza con unrbind(...)[-1]
. Gracias @plannapus por un par de bytes más.Sin golf
Prueba de funcionamiento
fuente
+
señal entre los divisores.rbind
truco brillante ! Puede guardar 2 bytes adicionales si asigna2:n-1
a una variable, por ejemploa
:which(!n%%1:(n-1))
se convierte asía[!n%%a]
. (El código completo es entoncesn=scan();a=2:n-1;b=sum(w<-a[!n%%a]);cat('I am','not'[b!=n],'a perfect number, because',rbind('+',w)[-1],'=',b,c('<'[b<n],'>'[b>n],'==')[1],n)
)Python 2,
183173170 bytesEjemplos:
¡Gracias a xnor por guardar 13 bytes!
fuente
'=<>'[cmp(b,d)]
- ¡Únete a la revolución!b%i<1
parab%i==0
. Para['not ',''][int(d==b)]
, no necesita elint
, porque Python se convertirá automáticamente. Además, puede usar la multiplicación de cadenas"not "*(d!=b)
."=<>="[cmp(b,d)%3::3]
.Julia,
161157 bytesSin golf:
fuente
CJam, 90 bytes
A modo de comparación, la impresión de un solo
=
se puede lograr en 83 bytes.Pruébelo en línea en el intérprete de CJam .
Cómo funciona
fuente
Perl, 148 bytes
Con saltos de línea:
fuente
'not '
y'==','>','<'
declaraciones y se cambia de.
a,
(ya que nada se añade cuandoprint
ing una lista). También mover sus tareas en parens la primera vez que se usan ahorra un par, y si cambia la lógica ligeramente haciagrep$a%_<1,1..($a=<>)-1
y$a!=($s=eval)&&'not '
hay que rallar un poco más! ¡Espero que todo tenga sentido!Lua,
244231 bytesGolfizado:
Sin golf:
fuente
JavaScript (ES6), 146
Usando cadenas de plantillas, funciona en Firefox y en la última versión de Chrome.
fuente
Ruby,
174160155136134128122 BytesGuardado otros 6 bytes :)
Gracias a los consejos para jugar al golf en Ruby
fuente
C #, 252 bytes
fuente
Hassium , 285 bytes
Descargo de responsabilidad: funciona solo con la última versión de Hassium debido a problemas con los argumentos de la línea de comandos.
Versión más legible:
}
fuente
mono src/Hassium/bin/Debug/Hassium.exe t.hs 6
, diceSystem.ArgumentException: The file 6 does not exist.
. 2. Esto no funciona con esta versión , que es la última confirmación antes de que se publicara este desafío. Agregue un descargo de responsabilidad a su respuesta que indique que su envío no es competitivo.@Dennis
a su comentario. De lo contrario, no recibiré una notificación de su respuesta.)MATLAB, 238
Nunca será el más corto de todos los idiomas, pero aquí está mi intento con MATLAB:
Y esto está en una forma ligeramente más legible:
Me las arreglé para guardar 2 bytes más al no usar una función. En su lugar, ejecuta la línea de código y solicita el número como entrada. Una vez ejecutado, muestra la salida al final.
fuente
Perl 6 , 138 bytes
(El recuento ignora las nuevas líneas y las sangrías, porque no son necesarias)
@d
es la matriz que contiene los divisores.$s
contiene la suma de los divisores.$c
es el valor de la comparación entre la entrada y la suma de los divisores.(De hecho,
$c
es uno de-1
,0
,1
, pero es realmente uno deOrder::Less
,Order::Same
oOrder::More
)En
'not 'x?$c
,?$c
en este caso es efectivamente el mismo queabs $c
, yx
es el operador de repetición de cadena.«> == <»
es la abreviatura de( '>', '==', '<' )
.Como
$c
tiene uno de ellos-1,0,1
, tenemos que subirlo uno para poder usarlo para indexarlo en una lista.Técnicamente, esto funcionará para números muy superiores a 2⁶⁴, pero requiere una cantidad de tiempo excesiva para los números superiores a 2¹⁶.
fuente
Pyth, 84 bytes
Respuesta no válida, porque me niego a implementar
=
y==
en la misma ecuación.fuente
Rubí, 164 bytes
Prueba
fuente
Emacs Lisp, 302 bytes
Versión sin golf:
fuente
Powershell, 164 bytes
Algunos de los trucos PoSh comunes y no tan comunes;
fuente
awk, 150
Se desperdiciaron algunos bytes para corregir esto como entrada
1
. No estoy seguro de si eso se espera.fuente
05AB1E , 58 bytes
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
Vea esta sugerencia mía 05AB1E (sección ¿Cómo usar el diccionario? ) Para comprender por qué
„I€Ü
es"I am"
,'€–
es"not"
y“€…íÀ‚³,ƒ«“
es"a perfect number, because"
.fuente