Votre tâche consiste à calculer la racine carrée d'un entier positif sans utiliser d'opérateurs mathématiques pour modifier le nombre, tels que:
- Définition d'une variable (ex. SquareRoot = 5)
- Addition (A + B)
- Soustraction (AB)
- Multiplication (A * B)
- Division (A / B)
- Racines carrées, cubiques, quatrièmes, etc.
- Exposants
Les opérateurs de comparaison (tels que <,>, ==, etc.) ne sont pas considérés comme des "opérateurs mathématiques" aux fins de cette question et sont autorisés tant qu'ils ne modifient pas la valeur d'une variable.
Le seul opérateur que vous pouvez utiliser est ++. Les exceptions suivantes sont en place:
- Si vous le souhaitez, vous pouvez initialiser une variable en la mettant à 0.
- Si votre langue n'inclut pas la syntaxe ++, vous pouvez utiliser une syntaxe équivalente, telle que foo + = 1 ou foo = foo + 1
- La racine carrée doit être calculée à au moins 6 chiffres au-delà de la décimale (la centaine de milliers) et sortie comme un nombre entier de décimales (par exemple, si j'entre 2, elle pourrait apparaître comme 14142135624 ou 1414213 selon l'arrondi) . Arrondir vers le haut ou vers le bas n'est pas important.
Les fonctions définies par l'utilisateur ne sont pas autorisées. De plus, la simulation de fonctions avec goto n'est pas autorisée non plus.
Je suis intéressé de voir ce que tout le monde soumet! Bon codage!
CLARIFICATION
Précisez que ce nombre est un entier positif. Vous êtes invités à créer un code qui ferait n'importe quel nombre mais ce n'est pas nécessaire.
CLARIFICATION # 2
Précisez que les opérateurs de comparaison sont autorisés.
CLARIFICATION # 3
L'addition, la soustraction, la multiplication, la division et les fonctions de modification des nombres ne sont pas autorisées du tout , qu'elles soient enregistrées ou non dans une variable. Je suis désolé que cela invalide quelques réponses existantes, mais je voulais définir ce groupe d'opérateurs avec "changer le nombre" afin d'empêcher les réponses de troll (par exemple, je viens d'utiliser la fonction sqrt (), vous avez seulement interdit l'ajout, multiplication, division et soustraction). Désolé pour la confusion.
CLARIFICATION # 4
Précisez que nous avons besoin d'au moins 5 chiffres. 10 chiffres ont fait fonctionner le code pendant une longue période.
la source
while r*r<n*10e20:r+=1
- assez trivial. Vous pouvez également envisager de réduire la sortie requise à 10 ^ 8 environ. Premièrement, parce que 10 ^ 10 est plus grand que 2 ^ 31, et deuxièmement, parce qu'il faudra un certain temps pour augmenter ce niveau.Réponses:
Python 66
Production
la source
int(...*1e10)
, sinon très agréable. Cependant, la priseabs
d'une valeur complexe est plus ou moinssqrt
déguisée.*1e10
...Python, 184 caractères
La solution Python suivante utilise uniquement l'opérateur d'incrémentation et aucun autre opérateur arithmétique. Cependant, avec la précision requise (10 chiffres), l'exécution prend un temps incroyablement long. Vous pouvez le tester avec une précision inférieure (3 chiffres) en réduisant
1e20
à1e6
.Non golfé:
la source
Fortran 73
Cela pourrait prendre beaucoup de temps pour déterminer une réponse pour certaines valeurs, mais cela fonctionnera à coup sûr. Bien que j'utilise
*
et-
, cela ne change aucune valeur , seul les=s+1
change réellement quoi que ce soit.la source
*
opérateur, ce qui n'est clairement pas autorisé. Ou est-ce que je comprends mal les restrictions données?*
opérateur pour changer un nombre, vous n'enregistrez simplement le résultat nulle part. Si l'OP voulait simplement interdire les affectations (autres ques=s+1
), alors pourquoi mentionner tous les opérateurs arithmétiques interdits?CJam, 26 octets
Essayez-le en ligne. Collez le code , saisissez l'entier souhaité dans Entrée et cliquez sur Exécuter . Avant de le faire, je suggère de passer
1e10
à1e4
bien.L' interpréteur Java gère l'
1e6
entrée «2» en 15 secondes environ.1e20
nécessitera une énorme quantité de RAM.Exemples
Contexte
Comme nous ne sommes pas autorisés à changer d'opérateur mathématique, nous allons utiliser des opérateurs setwise pour changer les tableaux.
Le code commence par "multiplier" l'entrée ("i") par 1e20, mais sans multiplication réelle. Au lieu de cela, nous poussons un tableau contenant des entiers «i», un tableau contenant 1e20 entiers, prenons leur produit cartésien et calculons sa longueur.
Ensuite, nous poussons zéro et incrémentons jusqu'à ce que le produit de l'entier lui-même (calculé comme ci-dessus) ne soit plus inférieur à
i * 1e20
. Cela provoque l'arrondi de la racine carrée.Comment ça fonctionne
la source
Cobra - 62
Publié avant la troisième édition, n'est plus valide.
Non seulement il est court, mais il doit être sans débordement si
n < Decimal.maxValue
la source
r/e*r/e
, qui est clairement un++
opérateur non mathématique ...Scala, 117
Ne se termine pas dans un délai raisonnable, même pour 2 en entrée, mais cela fonctionne. Vous remarquerez peut-être que je fais
_+_
, mais cela n'ajoute que 1, et Scala n'a pas d'++
opérateur de toute façon. Je pouvais enregistrer deux caractères en remplaçant le flux interne par List, mais cela manquerait de mémoire. Tel qu'il est écrit, je pense que cela ne prend en compte que le temps de traitement et non l'utilisation de la mémoire.la source
Haskell, 70 octets
f
donne la racine carrée entière en trouvant le plus grand nombre dont le carré est inférieur ou égal à l'entrée. La fonction de quadratures i
augmente de un pour chaque élément d'une(i,i)
matrice. (Tapé sur le téléphone, il pourrait donc y avoir des fautes de frappe).la source
PHP, 124 octets
C'est un algorithme exhaustif. Il essaie simplement les nombres jusqu'à ce que le carré de ce nombre soit plus grand que le nombre "objectif" (qui est le temps d'entrée 1E au
number of decimals
carré (10 000 pour un résultat 2 décimal). Ensuite, il imprime ce dernier nombre.Exécutez comme ceci (
-d
ajouté pour des raisons esthétiques uniquement):Je ne recommande pas d'essayer cela avec plus de 3 décimales ou un nombre supérieur à 10.
la source