Es moderno ser cuadrado

44

Desafío

Entonces, um, parece que, si bien tenemos muchos desafíos que funcionan con números cuadrados o números de otras formas, no tenemos uno que simplemente pregunte:

Dado un entero n(donde n>=0) como entrada, devuelve un valor verdadero si nes un cuadrado perfecto o un valor falsey si no.


Reglas

  • Usted puede tomar la entrada por cualquier medio razonable, conveniente, siempre y cuando se permita la normativa de E / S estándar .
  • No necesita manejar entradas mayores de lo que su idioma elegido puede manejar de forma nativa ni lo que conduciría a imprecisiones de coma flotante.
  • La salida debe ser uno de los dos valores consistentes de verdad / falsey (por ejemplo, trueo false, 1o 0): verdad si la entrada es un cuadrado perfecto, falsey si no lo es.
  • Este es el por lo que gana el conteo de bytes más bajo.

Casos de prueba

Input:  0
Output: true

Input:  1
Output: true

Input:  64
Output: true

Input:  88
Output: false

Input:  2147483647
Output: false
Lanudo
fuente
@Neil me di cuenta de mi error. Retraigo esa sugerencia, y en su lugar oferta 18014398509481982( 2**54-2), que es representable con un doble, y hace que las respuestas que solían sqrtfallar.
Mego
@Mego probablemente estoy equivocado o simplemente no entiendo lo que estás diciendo, pero estoy seguro de 2**54-2que aún es más grande de lo que un doble puede manejar con seguridad, al menos en JavaScript18014398509481982 > 9007199254740991
Tom
@Mego Creo que el valor límite es 9007199515875288. No es el cuadrado de 94906267, porque eso no es representable en un doble, pero si tomas su raíz cuadrada, obtienes ese número entero como resultado.
Neil
@Tom Escriba 2**54-2en una consola JS y compare con lo que obtiene 18014398509481982(el valor exacto). JS genera el valor exacto, por 2**54-2lo tanto, es representable con un doble. Si eso aún no lo convence, tome los datos binarios 0100001101001111111111111111111111111111111111111111111111111111, inténtelos como un flotador de doble precisión IEEE-754 y vea qué valor obtiene.
Mego
3
Lo siento, muchachos, se alejaron para almorzar y ... bueno, ¡eso se intensificó! ¡Y allí pensé que sería un desafío agradable y simple! ¿Lo cubriría agregar una regla que no necesita manejar entradas que conducen a imprecisiones de coma flotante en el idioma elegido?
Shaggy

Respuestas:

27

Neim , 2 bytes

q𝕚

Explicación:

q      Push an infinite list of squares
 𝕚     Is the input in that list?

Cuando digo 'infinito' quiero decir hasta que alcanzamos el valor máximo de longs (2 ^ 63-1). Sin embargo, Neim está (lentamente) haciendo la transición a BigIntegers teóricamente infinitamente grandes.

¡Intentalo!

Okx
fuente
Los comentarios no son para discusión extendida; Esta conversación se ha movido al chat .
Dennis
Interesante. Entonces, ¿esto almacena previamente la lista o es un generador / iterador que continúa verificando la existencia de entrada hasta que termina?
Patrick Roberts
@PatrickRoberts ¿Podemos hablar en el chat?
Okx
Claro, solo hazme ping en The Nineteenth Byte . Estoy allí de vez en cuando.
Patrick Roberts
Bueno, esto es ... REALMENTE FUNCIONAL
Cromo
8

TI-Basic, 4 bytes

not(fPart(√(Ans

Simplemente verifica si la raíz cuadrada es un número entero buscando una parte fraccionaria / decimal distinta de cero.

Timtech
fuente
¿Se puede agregar un TIO (o equivalente)?
Shaggy
@ Shaggy No creo que haya ninguno. TI-Basic es propietario y solo se ejecutará en las calculadoras de TI y en los emuladores que ejecutan la ROM desde una calculadora, por lo que no puede usar TI-Basic legalmente si no posee una calculadora.
Adám
1
@Shaggy Si tiene alguna ROM, puede usar un emulador (mi preferencia es jstified) para probar esto en línea.
Timtech
8

C #, 27 bytes

n=>System.Math.Sqrt(n)%1==0

Una forma más correcta / precisa de hacer esto sería:

n=>System.Math.Sqrt(n)%1<=double.Epsilon*100
TheLethalCoder
fuente
double.Epsilon es inútil para este tipo de verificación . tl; dr: al comparar números> 2, Double.Epsilon es básicamente lo mismo que cero. Multiplicar por 100 solo lo retrasará un poco.
Robert Fraser
@RobertFraser Solo leí la publicación SO vinculada y no leí mucho. De cualquier manera, no es inútil, simplemente no es útil en números más altos.
TheLethalCoder
...<int>==0está ...!<int>Creo
Stan Strum
@StanStrum No en C #
TheLethalCoder
7

JavaScript (ES6), 13 bytes

n=>!(n**.5%1)

Devuelve verdadero si la raíz cuadrada de n es un número entero.

Retazo:

f=
n=>!(n**.5%1)

console.log(f(0));
console.log(f(1));
console.log(f(2));
console.log(f(4));
console.log(f(8));
console.log(f(16));
console.log(f(88));
console.log(f(2147483647));

Rick Hitchcock
fuente
7

dc, 9

0?dvd*-^p

Salidas 1 para la verdad y 0 para falsey.

Pruébalo en línea .

0            # Push zero.  Stack: [ 0 ]
 ?           # Push input.  Stack: [ n, 0 ]
  dv         # duplicate and take integer square root.  Stack: [ ⌊√n⌋, n, 0 ]
    d        # duplicate.  Stack: [ ⌊√n⌋, ⌊√n⌋, n, 0 ]
     *       # multiply.  Stack: [ ⌊√n⌋², n, 0 ]
      -      # take difference. Stack: [ n-⌊√n⌋², 0 ]
       ^     # 0 to power of the result.  Stack: [ 0^(n-⌊√n⌋²) ]
        p    # print.

dcEl ^comando de exponenciación de Note da 0 0 = 1 y 0 n = 0, donde n> 0.

Trauma digital
fuente
¡Hermosa! +1 por usar dcde una manera tan ingeniosa.
Comodín el
6

Retina , 18 bytes

.+
$*
(^1?|11\1)+$

Pruébalo en línea! Adaptado descaradamente de la respuesta de @ MartinEnder a ¿Es este número triangular? pero con la conversión base incluida a un costo de 6 bytes.

Tenga en cuenta que este número es triangular? no fue por alguna razón inexplicable requerida para admitir cero como un número triangular, por lo que parte de la adaptación fue agregar un ?para hacer que el 1 inicial sea opcional, permitiendo que el grupo coincida con la cadena vacía y, por lo tanto, una entrada cero. Sin embargo, después de haber emparejado la cadena vacía, el +operador deja de repetir, para evitar el bucle infinito que sucedería si se mantuviera codiciosamente coincidiendo con la cadena vacía (después de todo, ^1?ciertamente seguiría coincidiendo). Esto significa que ni siquiera intenta hacer coincidir la otra alternativa en el grupo, evitando así la coincidencia de 2, 6, 12, etc. anclar el partido en el inicio al tiempo que el grupo opcional para la misma cuenta de bytes: ^(^1|11\1)*$.

Neil
fuente
Mirando hacia adelante a su explicación de por qué esto no coincide 2, 6u otros números de la forma n^2-n. ;) (Una forma de evitar esa explicación para el mismo número de bytes sería ^(^1|11\1)*$.)
Martin Ender
@MartinEnder ¿La misma razón que no podrías usar (^|1\1)+$, creo?
Neil
Sí es cierto. Pensé que probablemente sería bueno mencionarlo porque la mayoría de las personas probablemente no hayan leído mi comentario sobre la respuesta triangular (y en este caso es realmente relevante por qué la solución es correcta, en lugar de por qué no se puede seguir jugando golf) )
Martin Ender
Para el registro, +también dejaría de repetirse si ya no hubiera una alternativa vacía, por ejemplo, en el caso de ((?(1)11\1|1?))+. Una vez que haya una iteración vacía, no intentará más, independientemente de si pueden estar vacías o no.
Martin Ender
@MartinEnder De hecho, quise decir "haber emparejado ahora" en lugar de "haber emparejado inmediatamente". Fijo.
Neil
6

MATL , 5 4 bytes

Gracias a Luis por reducir mi código de un byte más largo en dos bytes, por lo que es el más corto.

t:Um

Pruébalo en línea

Explicación:

         % Implicit input
t        % Duplicate it
 :       % Range from 1 to input value
  U      % Square the range, to get 1 4 9 ... 
   m     % ismember, Checks if the input is a member of the range of perfect squares

Vieja respuesta:

X^1\~

Pruébalo en línea!

        % Implicit input
X^      % Square root of input
  1\    % Modulus 1. All perfect squares will have 0, the rest will have decimal value
     ~  % Negate, so the 0 becomes 1, and the decimal values become 0
Stewie Griffin
fuente
@Mego no estoy de acuerdo. MATL ni siquiera puede hacer mod(2**127-, 1000). A menos que los cuatro últimos dígitos sean 0 ...
Stewie Griffin
También puedes usar t:Um. Eso funciona para entradas hasta2^53 , debido a la precisión limitada de coma flotante
Luis Mendo
Ahora veo que esto es similar a su edición, solo un poco más corto :-)
Luis Mendo
¡Comando cuadrado bien escondido! U: str2num / string to array / square. Sabía que tenía que haber una función cuadrada, pero no pude encontrarla ...
Stewie Griffin
1
@cairdcoinheringaahing que fue parcialmente a propósito. Tenía dos soluciones, una de 5 bytes, la otra de 6 bytes. Luis sacó dos bytes del uno con 6. Así que ahorré dos bytes gracias a él, pero solo guardé un byte en el puntaje ...
Stewie Griffin
6

Python 3 , 40 38 bytes

¡Gracias a squid por guardar 2 bytes!

lambda n:n in(i*i for i in range(n+1))

Pruébalo en línea!

Demasiado lento para devolver una respuesta 2147483647en un tiempo razonable. (Pero escrito usando un generador para ahorrar memoria, ya que no cuesta ningún byte).

También funciona en Python 2, aunque OverflowErrores una posibilidad debido a que rangesi lo prueba con grandes entradas. (A MemoryErrortambién sería probable en Python 2, también debido a range).

Mathmandan
fuente
5

Perl 5 , 14 bytes

13 bytes de código + -pbandera.

$_=sqrt!~/\./

Pruébalo en línea!

Calcula la raíz cuadrada y mira si es un número entero (más precisamente, si no contiene un punto ( /\./).

Dada
fuente
5

05AB1E , 4 bytes

Ln¹å

Pruébalo en línea!

Erik el Outgolfer
fuente
No funciona para grandes cantidades, por ejemplo4111817668062926054213257208
Emigna
@Emigna Oh, porque se considera un largo? Pensé que 05AB1E usa Python 3.
Erik the Outgolfer
Falla para entradas grandes (la entrada dada es 2**127-1, un primo de Mersenne).
Mego
Utiliza python 3. El problema es que la raíz cuadrada da errores de redondeo para números grandes.
Emigna
@Emigna Oh ... supongo que tendré que descubrir otra forma, no debería ser difícil.
Erik the Outgolfer
5

Python 3 , 19 bytes

lambda n:n**.5%1==0

Pruébalo en línea!

sagiksp
fuente
Falla para entradas grandes, p 4111817668062926054213257208. Ej .
L3viathan
Corregido en 25 bytes:lambda n:int(n**.5)**2==n
L3viathan
44
@ L3viathan Eso (junto con cualquier solución que implique sqrt) falla en valores que están fuera del rango de un doble, como 2**4253-1.
Mego
@totallyhuman un flotador después %1es definitivamente <1, por lo que su propuesta sería verdadera para todas las entradas. Tenga en cuenta que n**.5es un flotador.
Leaky Nun
5

SageMath , 9 bytes

is_square

Pruébalo en línea

La función incorporada hace exactamente lo que dice en la lata. Dado que Sage utiliza el cálculo simbólico, está libre de errores de precisión computacional que afectan a los flotadores IEEE-754.

Mego
fuente
5

Japt , 3 bytes

¬v1

Pruébalo en línea!

Parece funcionar bien 2**54-2en el intérprete de Japt pero falla en TIO por alguna razón ...

Tom
fuente
Falla para entradas grandes (la entrada es 2**127-1, un primer Mersenne).
Mego
@Mego, ¿no es la norma que las soluciones no necesitan manejar números más grandes de lo que el lenguaje es capaz de manejar?
Shaggy
@Shaggy Japt se basa en JavaScript, que utiliza flotadores de doble precisión. 2**127-1está dentro del rango de un doble.
Mego
2
@Mego ¿No es el máximo seguro int para JavaScript 2**53-1?
Tom
3
@Mego Pero los números de JavaScript solo tienen 53 bits de precisión, por lo que JS no puede representar exactamente el valor 2**127-1como un número. Lo más cerca que puede estar es 2**127.
ETHproductions
5

Haskell, 26 24 bytes

f n=elem n$map(^2)[0..n]

Pruébalo en línea!

Comprueba si n está en la lista de todos los cuadrados desde 0hasta n.

nimi
fuente
1
mismo recuento de bytes: f n=or[i*i==n|i<-[0..n]]:)
vroomfondel
5

Prólogo (SWI) , 27 bytes

+N:-between(0,N,I),N=:=I*I.

Pruébalo en línea!

Explicación

Busca a través de todos los números mayores o iguales 0y menores o iguales a Ny prueba si ese número al cuadrado es igual a N.

0 '
fuente
1
@DLosc hecho !
0
5

MathGolf , 1 byte

°

Pruébalo en línea!

No creo que se necesite una explicación. Vi la necesidad de un operador "es un cuadrado perfecto" antes de ver este desafío, ya que el lenguaje está diseñado para manejar los desafíos de golf relacionados con las matemáticas. Devuelve 0 o 1, ya que MathGolf usa números enteros para representar booleanos.

maxb
fuente
4

PHP, 21 bytes

<?=(-1)**$argn**.5<2;

Si la raíz cuadrada no es un número entero, (-1)**$argn**.5es NAN.

usuario63956
fuente
¿Cómo ejecuto esto?
Titus
@Titus Con la -Fbandera y tuberías: echo 144 | php -F script.php.
user63956
Ah, yo forganizo esa carta. Gracias.
Titus
4

Rubí, 25 bytes

Math.sqrt(gets.to_i)%1==0

Probablemente hay un camino más corto, pero eso es todo lo que encontré.

Pruébalo en línea!

Gregory
fuente
Bienvenido a PPCG :) ¿Podría agregar un TIO (o equivalente) a esto, por favor?
Shaggy
Gracias por agregar el TIO, sin embargo, esto no parece devolver ningún resultado.
Shaggy
Mi mal, lo actualicé.
Gregory
No, todavía no funciona.
Shaggy
3

CJam , 8 bytes

ri_mQ2#=

Pruébalo en línea!

Explicación

Raíz cuadrada entera, cuadrada, compárela con el número original.

Luis Mendo
fuente
Supongo que de acuerdo con esto , no necesitas los primeros 2 bytes
Chromium
Y, alternativamente, utilizando la idea de esta respuesta , puede hacerlo mq1%0=, que también es de 6 bytes
Chromium
@Chromium Gracias, pero en ese caso necesito {... }hacer que el código funcione, así que el mismo byte cuenta
Luis Mendo
En realidad, estoy un poco confundido si agregar llaves o no. Porque si no los agregas, en realidad es un programa, que está permitido.
Cromo
@Chromium Un programa necesita tomar su entrada, por lo que rise requiere en ese caso
Luis Mendo
3

Mathematica, 13 bytes

AtomQ@Sqrt@#&

Pruébalo en línea!

J42161217
fuente
No construido en? Odd ....
TheLethalCoder
1
Puedes usar en AtomQlugar de IntegerQ.
Martin Ender
1
por supuesto peludo ...
J42161217
1
Aún puedes usar @*.
Martin Ender
44
AtomQ@*Sqrtes sinónimo de AtomQ@Sqrt@#&. Por ejemplo, AtomQ@*Sqrt@4devoluciones Truey AtomQ@*Sqrt@5devoluciones False. (Debido a la precedencia, AtomQ@*Sqrt[4]no funciona bien, regresando AtomQ@*2).
Greg Martin
3

APL (Dyalog) , 8 bytes

0=1|*∘.5

Pruébalo en línea!

0= [es] cero igual a

1| el módulo-1 (es decir, la parte fraccionaria) de

*∘.5 el argumento elevado al poder de la mitad

Adán
fuente
3

AWK , 27 + 2 bytes

{x=int($0^0.5);$0=x*x==$1}1

Pruébalo en línea!

Agregue +2bytes para usar la -Mbandera para una precisión arbitraria. Originalmente utilicé la comparación de cadenas porque un gran número comparaba igual, aunque no lo fueran, pero sqrttambién estaba devolviendo valores imprecisos. 2^127-2No debería ser un cuadrado perfecto.

Robert Benson
fuente
3

T-SQL, 38 bytes

SELECT IIF(SQRT(a)LIKE'%.%',0,1)FROM t

Busca un punto decimal en la raíz cuadrada. IIFes específico de MS SQL, probado y funciona en MS SQL Server 2012.

La entrada está en la columna a de la tabla t preexistente , según nuestras reglas de entrada .

BradC
fuente
3

Ohm , 2 bytes

Ʋ

Utiliza CP-437codificación.

Explicación

Entrada implícita -> Cuadrado perfecto incorporado -> Salida implícita ...

Roman Gräf
fuente
3

Java 8, 20 bytes

n->Math.sqrt(n)%1==0

La entrada es un int .

Pruébalo aquí

Kevin Cruijssen
fuente
No es discutible: la pregunta dice explícitamente "Dado un número entero n (donde n> = 0)". La respuesta más corta es la mejor. Editar: no hará +1 hasta que la respuesta más corta no sea la primera: p
Olivier Grégoire
@ OlivierGrégoire Hmm, esa es una buena manera de verlo. Pero aún no sabrías si es un int,long , short. Y con las preguntas en las que piden un número entero pero el formato de entrada es flexible, a veces uso una entrada de cadena para guardar algunos bytes. Personalmente, creo que usar n->está bien, y solo debes indicar cuál es el tipo, pero aparentemente no todos están de acuerdo con esto. Por otro lado, viniendo de un historial de respuestas de Java 7, pasar de int c(int n){return ...;}a (int n)->...tiene más sentido que n->...(aunque personalmente prefiero el segundo ya que, por supuesto, más corto).
Kevin Cruijssen
2
@ OlivierGrégoire Ok, lo he cambiado. Después de leer la discusión en esta respuesta , llegué a la conclusión de que afirmar que la entrada es un número entero en Java, no hay diferencia que afirmar que la entrada es una lista de dos cadenas en CJam o un conjunto de celdas de cadenas en MATL .
Kevin Cruijssen
3

Añadir ++ , 24 13 11 bytes

+?
S
%1
N
O

Pruébalo en línea!

Eliminé la función torpe en la parte superior y la reescribí en el cuerpo de la pregunta para eliminar 11 bytes.

Como la primera sección ya se explica a continuación, solo veamos cómo funciona la nueva parte

S   Square root
%1  Modulo by 1. Produced 0 for integers and a decimal for floats
N   Logical NOT

Versión anterior, 24 bytes

D,i,@,1@%!
+?
^.5
$i,x
O

Pruébalo en línea!

La función en la parte superior ( D,i,@,1@%!) es la parte principal del programa, así que vamos a entrar en más detalles.

D,     Create a function...
  i,   ...called i...
  @,   ...that takes 1 argument (for this example, let's say 3.162 (root 10))
    1  push 1 to the stack; STACK = [1, 3.162]
    @  reverse the stack;   STACK = [3.162, 1]
    %  modulo the stack;    STACK = [0.162]
    !  logical NOT;         STACK = [False]

+?     Add the input to accumulator (x)
^.5    Square root (exponent by 0.5)
$i,x   Apply function i to x
O      Output the result
caird coinheringaahing
fuente
3

Python 3 , 28 27 25 bytes

  • Gracias a @mdahmoune por 1 byte: compare int de raíz cuadrada con original
  • 2 bytes guardados: lambda acortada
lambda x:int(x**.5)**2==x

Pruébalo en línea!

officialaimm
fuente
1
¿qué pasa con f = lambda x: int (x **. 5) ** 2 == x 27bytes
mdahmoune