C'est Hip d'être Square

44

Défi

Donc, euh, il semble que, bien que nous ayons beaucoup de défis qui fonctionnent avec des nombres carrés ou des nombres d'autres formes, nous n'en avons pas qui demande simplement:

Étant donné un entier n(où n>=0) en entrée, retourne une valeur de vérité si nest un carré parfait ou une valeur de Falsey sinon.


Règles

  • Vous pouvez prendre des entrées par tout moyen raisonnable et pratique, dans la mesure où cela est autorisé par les règles d'E / S standard .
  • Vous n'avez pas besoin de gérer des entrées supérieures à celles que votre langue choisie peut gérer de manière native, ni qui pourraient conduire à des inexactitudes en virgule flottante.
  • La sortie devrait être l’une des deux valeurs de vérité / falsey cohérentes (par exemple, trueou false, 1ou 0) - vérité si l’entrée est un carré parfait, falsey si ce n’est pas le cas.
  • C'est le donc le plus petit nombre d'octets gagne.

Cas de test

Input:  0
Output: true

Input:  1
Output: true

Input:  64
Output: true

Input:  88
Output: false

Input:  2147483647
Output: false
Hirsute
la source
@ Neil j'ai réalisé mon erreur. Je retire cette suggestion et propose plutôt 18014398509481982( 2**54-2), qui est représentable avec un double et provoque l' sqrtéchec des réponses que vous utilisez .
Mego
@ Mego, je me trompe probablement ou je comprends tout simplement mal ce que vous dites, mais je suis sûr qu'il 2**54-2est toujours plus gros qu'un double ne peut le gérer en toute sécurité, du moins en JavaScript18014398509481982 > 9007199254740991
Tom
@Mego Je pense que la valeur limite est 9007199515875288. Ce n'est pas le carré de 94906267, car ce n'est pas représentable dans un double, mais si vous prenez sa racine carrée, alors vous obtenez cet entier comme résultat.
Neil
@Tom Tapez 2**54-2dans une console JS et comparez ce que vous obtenez avec 18014398509481982(la valeur exacte). JS fournit la valeur exacte et peut donc 2**54-2être représenté avec un double. Si cela ne vous convainc toujours pas, prenez les données binaires 0100001101001111111111111111111111111111111111111111111111111111, interprétez-les comme un flottant double précision IEEE-754 et voyez quelle valeur vous obtenez.
Mego
3
Désolé, les gars, sont partis pour le déjeuner et ... eh bien, ça a dégénéré! Et là, j'ai pensé que ce serait un beau et simple défi! L'ajout d'une règle dont vous n'avez pas besoin pour gérer les entrées menant à des inexactitudes en virgule flottante dans la langue de votre choix couvre-t-il cette règle?
Shaggy

Réponses:

27

Neim , 2 octets

q𝕚

Explication:

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

Quand je dis «infini», je veux dire jusqu’à atteindre la valeur maximale de longs (2 ^ 63-1). Cependant, Neim est en train de (lentement) passer à BigIntegers théoriquement infiniment grand.

Essayez le!

Okx
la source
Les commentaires ne sont pas pour une discussion prolongée; cette conversation a été déplacée pour discuter .
Dennis
Intéressant. Alors, est-ce que ceci pré-tampon la liste ou est-ce un générateur / itérateur qui continue à vérifier l'existence d'entrées jusqu'à ce qu'il se termine?
Patrick Roberts
@ PatrickRoberts Peut-on parler en chat?
Okx
Bien sûr, envoyez-moi un ping sur le dix-neuvième octet . Je suis là-bas de temps en temps.
Patrick Roberts
Eh bien, c’est ... VRAIMENT FONCTIONNEL
Chrome
10

Gelée , 2 octets

Ʋ

Essayez-le en ligne!

Erik l'Outgolfeur
la source
1
Fonctionne également avec Ohm.
Nick Clifford
8

TI-Basic, 4 octets

not(fPart(√(Ans

Vérifie simplement si la racine carrée est un entier en recherchant une partie fractionnaire / décimale différente de zéro.

Timtech
la source
Pouvez-vous ajouter un TIO (ou équivalent)?
Shaggy
@Shaggy Je ne pense pas qu'il y en ait. TI-Basic est propriétaire et ne fonctionne que sur les calculatrices de TI et dans les émulateurs exécutant la ROM à partir d'une calculatrice. Vous ne pouvez donc pas utiliser légalement TI-Basic si vous ne possédez pas de calculatrice.
Adám
1
@Shaggy Si vous avez des ROM, vous pouvez utiliser un émulateur (ma préférence est déterminée) pour essayer ceci en ligne.
Timtech
8

C #, 27 octets

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

Une manière plus correcte / précise de faire ceci serait:

n=>System.Math.Sqrt(n)%1<=double.Epsilon*100
TheLethalCoder
la source
double.Epsilon est inutile pour ce type de vérification . tl; dr: lors de la comparaison de nombres> 2, Double.Epsilon est fondamentalement identique à zéro. Multiplier par 100 ne fera que retarder cela un peu.
Robert Fraser
@ RobertFraser Je suis seulement passé par le poste lié au SO et je n'ai pas trop lu. Quoi qu'il en soit, il ne sert à rien de ne pas être utile à des nombres plus élevés.
TheLethalCoder
...<int>==0est- ...!<int>ce que je pense
Stan Strum
@StanStrum Pas en C #
TheLethalCoder
7

JavaScript (ES6), 13 octets

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

Renvoie true si la racine carrée de n est un nombre entier.

Fragment:

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
la source
7

dc, 9

0?dvd*-^p

Sorties 1 pour la vérité et 0 pour falsey.

Essayez-le en ligne .

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.

dcLa ^commande exponentiation de la note donne 0 0 = 1 et 0 n = 0, où n> 0.

Trauma numérique
la source
Beau! +1 pour une utilisation dcaussi ingénieuse.
Wildcard
6

Retina , 18 octets

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

Essayez-le en ligne! Adapté sans vergogne de la réponse de @ MartinEnder à Ce nombre est-il triangulaire? mais avec la conversion de base incluse au coût de 6 octets.

Notez que ce nombre est-il triangulaire? Pour des raisons inexplicables, il n'était pas nécessaire de prendre en charge zéro comme nombre triangulaire. Une partie de l'adaptation consistait donc à ajouter un ?pour rendre le 1 supérieur facultatif, permettant ainsi au groupe de correspondre à la chaîne vide et, par conséquent, à une entrée nulle. Cependant, après avoir mis en correspondance la chaîne vide, l' +opérateur cesse de répéter, pour éviter la boucle infinie qui se produirait s'il restait en correspondance avide de la chaîne vide (après tout, ^1?continuerait certainement à correspondre). Cela signifie qu’il n’essaye même pas de faire correspondre l’autre alternative du groupe, évitant ainsi les correspondances de 2, 6, 12, etc. ancrer le match au début tout en rendant le groupe en option pour le compte même octet: ^(^1|11\1)*$.

Neil
la source
Dans l’attente de votre explication, pourquoi ceci ne correspond pas 2, 6ou d’autres numéros du formulaire n^2-n. ;) (Un moyen d'éviter cette explication qui pourrait être la même chose avec le même nombre d'octets ^(^1|11\1)*$.)
Martin Ender
@MartinEnder Même raison que vous ne pouviez pas utiliser (^|1\1)+$, je pense?
Neil
Oui c'est vrai. Je pensais qu'il serait probablement bon de le mentionner car la plupart des gens n'ont probablement pas lu mon commentaire sur la réponse triangulaire (et dans ce cas, il est pertinent de savoir pourquoi la solution est correcte, par opposition à la raison pour laquelle on ne peut plus jouer au golf )
Martin Ender
Pour mémoire, le +serait également arrêter de boucler s'il n'y avait plus d'alternative vide, par exemple dans le cas de ((?(1)11\1|1?))+. Une fois qu'il y a eu une itération vide, il n'essayera plus, peu importe si elles sont vides ou non.
Martin Ender
@MartinEnder En effet, je voulais dire "avoir apparié maintenant" au lieu de "avoir immédiatement apparié". Fixé.
Neil
6

MATL , 5 4 octets

Merci à Luis d'avoir réduit de deux octets mon code plus long, ce qui en fait le plus court.

t:Um

Essayez-le en ligne

Explication:

         % 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

Ancienne réponse:

X^1\~

Essayez-le en ligne!

        % 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
la source
@ Mego je ne suis pas d'accord. MATL ne peut même pas faire mod(2**127-, 1000). Sauf si les quatre derniers chiffres sont 0 ....
Stewie Griffin
Vous pouvez également utiliser t:Um. Cela fonctionne pour les entrées jusqu'à2^53 , en raison de la précision limitée en virgule flottante
Luis Mendo Le
Je vois maintenant que cela ressemble à votre montage, seulement un peu plus court :-)
Luis Mendo
Commande carré bien cachée! U: str2num / string to array / square. Je savais qu'il devait y avoir une fonction carrée, mais je ne pouvais pas la trouver ...
Stewie Griffin
1
@cairdcoinheringaahing qui était partiellement intentionnel. J'avais deux solutions, l'une était de 5 octets, l'autre de 6 octets. Luis golfed de deux octets de celui avec 6. Je sauvé deux octets grâce à lui, mais je sauvé un octet sur le score ...
Stewie Griffin
6

Python 3 , 40 38 octets

Merci à squid d'avoir économisé 2 octets!

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

Essayez-le en ligne!

Trop lent pour renvoyer une réponse 2147483647dans un délai raisonnable. (Mais écrit en utilisant un générateur pour économiser de la mémoire, car cela ne coûte aucun octet.)

Fonctionne également en Python 2, bien que cela OverflowErrorsoit une possibilité rangesi vous essayez avec d’énormes entrées. (A MemoryErrorserait également probable en Python 2, également à cause de range.)

Mathmandan
la source
5

Perl 5 , 14 octets

13 octets de code + -pdrapeau.

$_=sqrt!~/\./

Essayez-le en ligne!

Calcule la racine carrée et regarde s'il s'agit d'un entier (plus précisément s'il ne contient pas de point ( /\./).

Dada
la source
5

05AB1E , 4 octets

Ln¹å

Essayez-le en ligne!

Erik l'Outgolfeur
la source
Ne fonctionne pas pour les grands nombres, par exemple4111817668062926054213257208
Emigna
@ Emigna Oh parce que c'est considéré comme long? Je pensais que 05AB1E utilisait Python 3.
Erik the Outgolfer
Échec pour les entrées importantes (l’entrée donnée est 2**127-1un nombre premier de Mersenne).
Mego
Il utilise python 3. Le problème est que la racine carrée génère des erreurs d’arrondi pour les grands nombres.
Emigna
@ Emigna Oh ... Je suppose que je vais devoir trouver un autre moyen alors, ne devrait pas être difficile.
Erik l'Outgolfer
5

Python 3 , 19 octets

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

Essayez-le en ligne!

Sagiksp
la source
Échec pour les grandes entrées, par exemple 4111817668062926054213257208.
L3viathan
Corrigé dans 25 octets:lambda n:int(n**.5)**2==n
L3viathan le
4
@ L3viathan Cela (avec toute solution qui implique sqrt) échoue sur les valeurs qui sont en dehors de la plage d'un double, comme 2**4253-1.
Mego
@totallyhuman un flottant après %1est définitivement <1, votre proposition deviendrait vraie pour toutes les entrées. Notez que n**.5c'est un float.
Leaky Nun
5

SageMath , 9 octets

is_square

Essayez-le en ligne

La fonction intégrée fait exactement ce qu'elle dit sur l'étain. Étant donné que Sage utilise le calcul symbolique, il n’ya pas d’erreurs de précision de calcul qui affectent les flotteurs IEEE-754.

Mego
la source
5

Japt , 3 octets

¬v1

Essayez-le en ligne!

Semble fonctionner correctement2**54-2 dans l' interpréteur Japt mais échoue sous TIO pour une raison quelconque ...

À M
la source
Échec pour les entrées importantes (l’entrée est 2**127-1un nombre premier de Mersenne).
Mego
@ Mego, la norme selon laquelle les solutions ne doivent pas nécessairement traiter des nombres plus grands que le langage est capable de gérer?
Shaggy
@Shaggy Japt est basé sur JavaScript, qui utilise des flottants à double précision. 2**127-1est bien dans la gamme d'un double.
Mego
2
@Mego Le max safe int pour JavaScript n'est-il pas 2**53-1?
Tom
3
@Mego Mais les nombres de JavaScript ont seulement 53 bits de précision, ainsi JS ne peut pas représenter exactement la valeur 2**127-1sous forme de nombre. Le plus proche qu'il peut obtenir est 2**127.
ETHproductions
5

Haskell, 26 à 24 octets

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

Essayez-le en ligne!

Vérifie si n est dans la liste de tous les carrés de 0à n.

nimi
la source
1
Même nombre d'octets: f n=or[i*i==n|i<-[0..n]]:)
vroomfondel
5

Prolog (SWI) , 27 octets

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

Essayez-le en ligne!

Explication

Recherche dans tous les nombres supérieurs ou égaux 0et inférieurs ou égaux à Net teste si ce nombre au carré est égal à N.

0 '
la source
1
@DLosc fait !
0 '15
5

MathGolf , 1 octet

°

Essayez-le en ligne!

Je ne pense pas qu'une explication est nécessaire. J'ai vu le besoin d'un opérateur "is perfect square" avant de voir ce défi, car le langage est conçu pour gérer les défis de golf liés aux mathématiques. Renvoie 0 ou 1 car MathGolf utilise des entiers pour représenter les booléens.

maxb
la source
4

PHP, 21 octets

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

Si la racine carrée n'est pas un nombre entier, (-1)**$argn**.5is NAN.

utilisateur63956
la source
Comment je fais ça?
Tite
@Titus Avec le -Fdrapeau et le pipeline: echo 144 | php -F script.php.
user63956
Ah j'ai foublié cette lettre. Merci.
Tite
4

Ruby, 25 octets

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

Il y a probablement un moyen plus court mais c'est tout ce que j'ai trouvé.

Essayez-le en ligne!

Gregory
la source
Bienvenue chez PPCG :) Pourriez-vous ajouter un TIO (ou équivalent) à cela, s'il vous plaît?
Shaggy
Merci d’ajouter le TIO, cela ne semble toutefois pas renvoyer de sortie.
Shaggy
Mon mauvais, je l'ai mis à jour.
Gregory
Non, ne fonctionne toujours pas.
Shaggy
3

CJam , 8 octets

ri_mQ2#=

Essayez-le en ligne!

Explication

Entier racine carrée, carré, comparer avec le nombre d'origine.

Luis Mendo
la source
Je suppose que selon cela , vous n'avez pas besoin des 2 premiers octets
Chrome
Et, alternativement, en utilisant l'idée de cette réponse , vous pouvez le faire mq1%0=, ce qui est également 6 octets
Chrome
@Chromium Merci, mais dans ce cas, j'ai besoin de {... }pour que le code devienne une fonction, donc le même nombre d'octets
Luis Mendo
En fait, je suis un peu confus d’ajouter des accolades. Parce que si vous ne les ajoutez pas, c'est en fait un programme qui est autorisé.
Chromium
@Chromium Un programme doit prendre son entrée, il riest donc nécessaire dans ce cas
Luis Mendo
3

Mathematica, 13 octets

AtomQ@Sqrt@#&

Essayez-le en ligne!

J42161217
la source
Non intégré? Odd ....
TheLethalCoder
1
Vous pouvez utiliser AtomQau lieu de IntegerQ.
Martin Ender
1
bien sûr shaggy ...
J42161217
1
Vous pouvez toujours utiliser @*.
Martin Ender
4
AtomQ@*Sqrtest un synonyme de AtomQ@Sqrt@#&. Par exemple, les AtomQ@*Sqrt@4retours Trueet les AtomQ@*Sqrt@5retours False. (En raison de la priorité, AtomQ@*Sqrt[4]ne fonctionne pas bien, en revenant AtomQ@*2.)
Greg Martin Le
3

APL (Dyalog) , 8 octets

0=1|*∘.5

Essayez-le en ligne!

0= [est] zéro égal à

1| le module-1 (c'est-à-dire la partie fractionnaire) de

*∘.5 l'argument soulevé à la puissance d'un demi

Adam
la source
3

AWK , 27 + 2 octets

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

Essayez-le en ligne!

Ajoutez des +2octets pour utiliser l' -Mindicateur pour une précision arbitraire. À l'origine, j'avais utilisé la comparaison de chaînes car un grand nombre de comparés était égal, même s'ils ne l'étaient pas, mais cela sqrtrenvoyait également des valeurs imprécises. 2^127-2ne devrait pas être un carré parfait.

Robert Benson
la source
3

T-SQL, 38 octets

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

Recherche un point décimal à la racine carrée. IIFest spécifique à MS SQL, testé et fonctionne sous MS SQL Server 2012.

La saisie est dans la colonne a du tableau préexistant t , conformément à nos règles de saisie .

BradC
la source
3

Ohm , 2 octets

Ʋ

Utilise l' CP-437encodage.

Explication

Entrée implicite -> Carré parfait intégré -> Sortie implicite ...

Roman Gräf
la source
3

Java 8, 20 octets

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

L'entrée est un int.

Essayez ici.

Kevin Cruijssen
la source
Non discutable: la question dit explicitement "Soit un entier n (où n> = 0)". La réponse la plus courte est la meilleure. Edit: pas +1 jusqu'à ce que la réponse la plus courte ne soit pas la première: p
Olivier Grégoire Le
@ OlivierGrégoire Hmm, c'est une bonne façon de voir les choses. Mais vous ne sauriez toujours pas si c'est unint , long, short. Et avec des questions où ils demandent un entier mais le format de saisie est flexible, j’utilise parfois une entrée de chaîne pour sauvegarder des octets. Personnellement, je pense que l’utilisation n->est acceptable, et vous devriez simplement préciser le type, mais apparemment, tout le monde n’est pas d’accord avec cela. D'autre part, venant d'une histoire de réponse Java 7, allant int c(int n){return ...;}de (int n)->...plus de sens que n->...(même si je préfère la seconde depuis plus court bien sûr).
Kevin Cruijssen
2
@ OlivierGrégoire Ok, je l'ai changé. Après avoir lu la discussion dans cette réponse , je suis parvenu à la conclusion qu'affirmer que l'entrée était un entier en Java n'était pas différent de dire que l'entrée était une liste de deux chaînes dans CJam. ou un tableau de cellules de chaînes dans MATL .
Kevin Cruijssen
3

Ajouter ++ , 24 13 11 octets

+?
S
%1
N
O

Essayez-le en ligne!

J'ai supprimé la fonction maladroite en haut et l'ai réécrite dans le corps de la question pour supprimer 11 octets.

Comme la première section est déjà expliquée ci-dessous, découvrons seulement comment fonctionne la nouvelle pièce.

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

Ancienne version, 24 octets

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

Essayez-le en ligne!

La fonction en haut ( D,i,@,1@%!) est la partie principale du programme, allons donc plus en détail.

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
la source
3

Python 3 , 28 27 25 octets

  • Merci à @mdahmoune pour 1 octet: comparer int de racine carrée avec original
  • 2 octets enregistrés: lambda raccourci
lambda x:int(x**.5)**2==x

Essayez-le en ligne!

fonctionnaire
la source
1
Qu'en est-il de f = lambda x: int (x **. 5) ** 2 == x 27bytes
mdahmoune