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 n
est 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,
true
oufalse
,1
ou0
) - vérité si l’entrée est un carré parfait, falsey si ce n’est pas le cas. - C'est le code-golf, 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
code-golf
math
number
decision-problem
Hirsute
la source
la source
18014398509481982
(2**54-2
), qui est représentable avec un double et provoque l'sqrt
échec des réponses que vous utilisez .2**54-2
est toujours plus gros qu'un double ne peut le gérer en toute sécurité, du moins en JavaScript18014398509481982 > 9007199254740991
2**54-2
dans une console JS et comparez ce que vous obtenez avec18014398509481982
(la valeur exacte). JS fournit la valeur exacte et peut donc2**54-2
être représenté avec un double. Si cela ne vous convainc toujours pas, prenez les données binaires0100001101001111111111111111111111111111111111111111111111111111
, interprétez-les comme un flottant double précision IEEE-754 et voyez quelle valeur vous obtenez.Réponses:
Neim , 2 octets
Explication:
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!
la source
Gelée , 2 octets
Essayez-le en ligne!
la source
TI-Basic, 4 octets
Vérifie simplement si la racine carrée est un entier en recherchant une partie fractionnaire / décimale différente de zéro.
la source
C #, 27 octets
Une manière plus correcte / précise de faire ceci serait:
la source
...<int>==0
est-...!<int>
ce que je penseJavaScript (ES6), 13 octets
Renvoie true si la racine carrée de n est un nombre entier.
Fragment:
la source
dc, 9
Sorties 1 pour la vérité et 0 pour falsey.
Essayez-le en ligne .
dc
La^
commande exponentiation de la note donne 0 0 = 1 et 0 n = 0, où n> 0.la source
dc
aussi ingénieuse.Retina , 18 octets
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)*$
.la source
2
,6
ou d’autres numéros du formulairen^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)*$
.)(^|1\1)+$
, je pense?+
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.C (gcc), 30 octets
Essayez-le en ligne!
C, 34 octets
Essayez-le en ligne!
C, 33 octets
Essayez-le en ligne!
la source
MATL ,
54 octetsMerci à Luis d'avoir réduit de deux octets mon code plus long, ce qui en fait le plus court.
Essayez-le en ligne
Explication:
Ancienne réponse:
Essayez-le en ligne!
la source
mod(2**127-, 1000)
. Sauf si les quatre derniers chiffres sont 0 ....t:Um
. Cela fonctionne pour les entrées jusqu'à2^53
, en raison de la précision limitée en virgule flottanteU: str2num / string to array / square
. Je savais qu'il devait y avoir une fonction carrée, mais je ne pouvais pas la trouver ...Python 3 ,
4038 octetsMerci à squid d'avoir économisé 2 octets!
Essayez-le en ligne!
Trop lent pour renvoyer une réponse
2147483647
dans 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
OverflowError
soit une possibilitérange
si vous essayez avec d’énormes entrées. (AMemoryError
serait également probable en Python 2, également à cause derange
.)la source
Perl 5 , 14 octets
13 octets de code +
-p
drapeau.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 (
/\./
).la source
05AB1E , 4 octets
Essayez-le en ligne!
la source
4111817668062926054213257208
2**127-1
un nombre premier de Mersenne).Python 3 , 19 octets
Essayez-le en ligne!
la source
4111817668062926054213257208
.lambda n:int(n**.5)**2==n
sqrt
) échoue sur les valeurs qui sont en dehors de la plage d'un double, comme2**4253-1
.%1
est définitivement<1
, votre proposition deviendrait vraie pour toutes les entrées. Notez quen**.5
c'est un float.SageMath , 9 octets
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.
la source
Japt , 3 octets
Essayez-le en ligne!
Semble fonctionner correctement
2**54-2
dans l' interpréteur Japt mais échoue sous TIO pour une raison quelconque ...la source
2**127-1
un nombre premier de Mersenne).2**127-1
est bien dans la gamme d'un double.2**53-1
?2**127-1
sous forme de nombre. Le plus proche qu'il peut obtenir est2**127
.Haskell,
26 à24 octetsEssayez-le en ligne!
Vérifie si n est dans la liste de tous les carrés de
0
àn
.la source
f n=or[i*i==n|i<-[0..n]]
:)Prolog (SWI) , 27 octets
Essayez-le en ligne!
Explication
Recherche dans tous les nombres supérieurs ou égaux
0
et inférieurs ou égaux àN
et teste si ce nombre au carré est égal àN
.la source
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.
la source
PHP, 21 octets
Si la racine carrée n'est pas un nombre entier,
(-1)**$argn**.5
isNAN
.la source
-F
drapeau et le pipeline:echo 144 | php -F script.php
.f
oublié cette lettre. Merci.Ruby, 25 octets
Il y a probablement un moyen plus court mais c'est tout ce que j'ai trouvé.
Essayez-le en ligne!
la source
CJam , 8 octets
Essayez-le en ligne!
Explication
Entier racine carrée, carré, comparer avec le nombre d'origine.
la source
mq1%0=
, ce qui est également 6 octets{
...}
pour que le code devienne une fonction, donc le même nombre d'octetsri
est donc nécessaire dans ce casMathematica, 13 octets
Essayez-le en ligne!
la source
AtomQ
au lieu deIntegerQ
.@*
.AtomQ@*Sqrt
est un synonyme deAtomQ@Sqrt@#&
. Par exemple, lesAtomQ@*Sqrt@4
retoursTrue
et lesAtomQ@*Sqrt@5
retoursFalse
. (En raison de la priorité,AtomQ@*Sqrt[4]
ne fonctionne pas bien, en revenantAtomQ@*2
.)APL (Dyalog) , 8 octets
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 demila source
AWK , 27 + 2 octets
Essayez-le en ligne!
Ajoutez des
+2
octets pour utiliser l'-M
indicateur 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 celasqrt
renvoyait également des valeurs imprécises.2^127-2
ne devrait pas être un carré parfait.la source
T-SQL, 38 octets
Recherche un point décimal à la racine carrée.
IIF
est 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 .
la source
Ohm , 2 octets
Utilise l'
CP-437
encodage.Explication
Entrée implicite -> Carré parfait intégré -> Sortie implicite ...
la source
Java 8, 20 octets
L'entrée est un
int
.Essayez ici.
la source
int
,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’utilisationn->
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, allantint c(int n){return ...;}
de(int n)->...
plus de sens quen->...
(même si je préfère la seconde depuis plus court bien sûr).R, 15
^ .5 correspond à moins d'octets que sqrt (). %% 1, le module, donnera 0 si la réponse est un entier. scan () prend les entrées de l'utilisateur.
http://www.tutorialspoint.com/execute_r_online.php?PID=0Bw_CjBb95KQMSm1qVktIOUdSSDg
la source
Ajouter ++ ,
241311 octetsEssayez-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.
Ancienne version, 24 octets
Essayez-le en ligne!
La fonction en haut (
D,i,@,1@%!
) est la partie principale du programme, allons donc plus en détail.la source
Python 3 ,
28 2725 octetsEssayez-le en ligne!
la source