Sea (entrada)
Entonces los divisores son: 1, 2, 3, 6, 7, 14, 21, 42
Cuadrando cada divisor: 1, 4, 9, 36, 49, 196, 441, 1764
Sumando (sumando): 2500
Como por lo tanto, devolvemos un valor verdadero. Si no es un cuadrado perfecto, devuelve un valor falso.
Ejemplos:
42 ---> true
1 ---> true
246 ---> true
10 ---> false
16 ---> false
Este es el código de golf, por lo que el código más corto en bytes para cada idioma gana
Gracias a @Arnauld por señalar la secuencia: A046655
code-golf
math
number
decision-problem
Usuario Any3nymous
fuente
fuente
Respuestas:
R ,
3937 bytesPruébalo en línea!
Utiliza el enfoque clásico de "prueba si cuadrado perfecto", que toma la parte no integral de la raíz cuadrada
S^.5%%1
y toma la negación lógica de la misma, ya que asigna cero (cuadrado perfecto)TRUE
y no cero aFALSE
.¡Gracias a Robert S por guardar un par de bytes!
fuente
scan()
para guardar algunos bytes?JavaScript (ES7),
46 4442 bytesGuardado 1 byte gracias a @Hedi
Pruébalo en línea!
Comentado
fuente
d
pasar den
que0
en lugar de2
an
la siguiente:n=>!((g=d=>d?d*d*!(n%d)+g(d-1):0)(n)**.5%1)
05AB1E , 5 bytes
Pruébalo en línea!
¿Cómo?
fuente
Lenguaje de programación Shakespeare ,
434428415 bytesPruébalo en línea!
-13 bytes gracias a Jo King!
Salidas
1
para resultado verdadero, salidas0
para resultado falso.fuente
Python 2 , 55 bytes
Pruébalo en línea!
fuente
Neim , 5 bytes
Explicación:
Pruébalo en línea!
fuente
C (gcc) ,
67636059 bytes-1 bytes gracias a @JonathanFrech
Pruébalo en línea!
fuente
++i<=n
seri++<n
?Brachylog ,
128 bytes-4 bytes gracias a Fatelize porque no me di cuenta de que brachylog tiene funciones de factores
explicación
Pruébalo en línea!
fuente
f^₂ᵐ
es 4 bytes más corto queḋ{⊇×^₂}ᵘ
MathGolf ,
54 bytesPruébalo en línea!
Explicación
Muy similar a otras respuestas, en comparación con 05AB1E, obtengo un byte para mi operador "es cuadrado perfecto".
fuente
MATL , 9 bytes
Pruébalo en línea!
Tan simple como se pone
fuente
PowerShell ,
6856 bytesPruébalo en línea!
Parece largo ...-12 bytes gracias a mazzy
Hace exactamente lo que dice en la lata. Toma el rango de
1
a input$n
y multiplica los cuadrados por$_*$_
si es un divisor o no!($n%$_)
. Esto hace que los divisores sean iguales a un número distinto de cero y los no divisores iguales a cero. Luego tomamos la suma de ellos con nuestro acumulador$a
. Luego, volvemos a recorrer de1
arriba a abajo$a
y sacamos esos números donde el|?{...}
cuadrado es-eq
ual$a
. Eso se deja en la tubería y la salida es implícita.Produce un número entero positivo para la verdad, y nada para Falsey.
fuente
$args[0]
es más corto :)1..$args[0]|%{$a+=$_*$_*!($n%$_)};1..$a|?{$_*$_-eq$a}
$n
dentro del bucle para!($n%$_)
. Pero, su reescritura de la suma ahorró 12 bytes, ¡así que gracias!$args[0]
sea más corto :)Japt ,
1197 bytes-2 bytes de @Giuseppe y otro -2 de @Shaggy
Pruébalo en línea!
fuente
APL (Dyalog Unicode) , 18 bytes
Pruébalo en línea!
Lambda anónima. Devuelve 1 para verdadero y 0 para falso (los casos de prueba en TIO están prettified).
¡Saludos a @ H.PWiz por 4 bytes!
Cómo:
fuente
not
lugar de0=
guardar un byte?not
operador de APL (~
), cuando se usa de manera monádica, solo funciona con booleanos (0 o 1). Como cualquier número de módulo 1 nunca es igual a 1, si lo usara en~
lugar de0=
, obtendría undomain error
número que no sea un cuadrado perfecto, ya que los valores decimales están fuera del~
dominio de. Además, no puedo omitir simplemente0=
, ya que el valor verdadero de APL es 1, no 0, y no tendría una salida consistente para valores falsos.K (oK) ,
262522 bytesSolución:
Pruébalo en línea!
Explicación:
Notas:
fuente
Pari / GP , 23 bytes
Pruébalo en línea!
fuente
Matlab,
3937 bytesDesafortunadamente, no funciona en Octave (en tio), por lo que no hay tio link.
Nota Como dijo @LuisMendo,
divisors()
pertenece a Symbolic Toolbox.fuente
divisors
pertenece a la Caja de herramientas simbólica. Deberías indicarlo en el título. Además, puede usar en~···
lugar de···==0
sum(...)^.5
lugar desqrt(sum(...))
Haskell ,
786453 bytes-14 bytes gracias a Ørjan Johansen . -11 bytes gracias a los ovs .
Pruébalo en línea!
Oye, ha pasado un tiempo desde que ... escribí cualquier código, así que mi Haskell y el golf podrían estar un poco oxidados. Olvidé los problemáticos tipos numéricos de Haskell. :PAG
fuente
Pyt , 7 bytes
Pruébalo en línea!
Explicación
Pruébalo en línea!
Explicación
Pruébalo en línea!
Explicación
fuente
Casco , 6 bytes
Pruébalo en línea!
Explicación
fuente
Jalea , 6 bytes
Pruébalo en línea! O vea el conjunto de pruebas .
¿Cómo?
fuente
Protón , 41 bytes
Pruébalo en línea!
Enfoque similar a la respuesta de Python.
fuente
Mathematica, 32 bytes
Pura función. Toma un número como entrada y devuelve
True
oFalse
como salida. No estoy del todo seguro si hay un método más corto para verificar cuadrados perfectos.fuente
Octava / MATLAB, 43 bytes
Pruébalo en línea!
fuente
Rojo , 67 bytes
Pruébalo en línea!
fuente
Scala ,
6867 bytesPruébalo en línea!
fuente
Perl 6 , 34 bytes
-1 byte gracias a nwellnhof
Pruébalo en línea!
fuente
**.5
es un byte más corto que.sqrt
.F #, 111 bytes
Pruébalo en línea!
Entonces
d
obtiene los divisores para todos los números entre 1 en
inclusive. En la función principalu
, la primera línea asigna la suma de todos los divisores al cuadradom
. La segunda línea obtiene los divisoresm
y determina si alguno de ellos al cuadrado es igualm
.fuente
Perl 5, 47 bytes
Devuelve 1 para verdadero y nada para falso.
Explicación:
fuente
Groovy , 47 bytes
Una lambda que acepta un argumento numérico.
Explicación
(1..n)
crea una matriz de los valores de 1 a nn%i
es falso (ya que 0 es falso) sii
dividen
sin reston%i ? 0 : i*i
es la suma del cuadrado del valori
si dividen
sin resto, de lo contrario es 0sum{ i-> n%i ? 0 : i*i }
suma el resultado anterior en todosi
de la matriz.s%Math.sqrt(s)
es falso (ya que 0 es falso) si el sqrt des
divides
sin resto!(s%Math.sqrt(s))
regresa de lambda (return
implícito en la última instrucción)!false
cuando el sqrt des
divides
sin restoPruébalo en línea!
fuente
Java 8,
7570 bytes-5 bytes gracias a @ archangel.mjj .
Pruébalo en línea.
Explicación:
fuente
n->{int s=0,i=0;for(;++i<=n;)s+=n%i<1?i*i:0;return Math.sqrt(s)%1==0;}