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

@ 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!


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


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.


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

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));


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.


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)*$.


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

@ 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.)


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 ( /\./).


5

05AB1E , 4 octets

Ln¹å

Essayez-le en ligne!


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!


É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.


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 ...


É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

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.


4

PHP, 21 octets

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

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


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!


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.


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!


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

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.


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 .


3

Ohm , 2 octets

Ʋ

Utilise l' CP-437encodage.

Explication

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


3

Java 8, 20 octets

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

L'entrée est un int.

Essayez ici.


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.