Problème:
Dans votre choix de langue, écrivez la fonction la plus courte qui renvoie le plancher de la racine carrée d'un entier 64 bits non signé.
Cas de test:
Votre fonction doit fonctionner correctement pour toutes les entrées, mais voici quelques-unes qui aident à illustrer l'idée:
INPUT ⟶ OUTPUT
0 ⟶ 0
1 ⟶ 1
2 ⟶ 1
3 ⟶ 1
4 ⟶ 2
8 ⟶ 2
9 ⟶ 3
15 ⟶ 3
16 ⟶ 4
65535 ⟶ 255
65536 ⟶ 256
18446744073709551615 ⟶ 4294967295
Règles:
- Vous pouvez nommer votre fonction comme bon vous semble. (Les fonctions sans nom, anonymes ou lambda sont correctes, du moment qu'elles sont en quelque sorte appelables.)
- Le nombre de caractères est ce qui compte le plus dans ce défi, mais l'exécution est également importante. Je suis sûr que vous pourriez numériser vers le haut de manière itérative pour la réponse en temps O (√n) avec un très petit nombre de caractères, mais le temps O (log (n)) serait vraiment meilleur (c'est-à-dire, en supposant une valeur d'entrée de n, pas un bit de n).
- Vous voudrez probablement implémenter la fonction en utilisant une arithmétique purement entière et / ou booléenne. Cependant, si vous voulez vraiment utiliser des calculs à virgule flottante, c'est bien tant que vous n'appelez aucune fonction de bibliothèque. Donc, dire simplement
return (n>0)?(uint32_t)sqrtl(n):-1;
en C est hors limites même si cela produirait le résultat correct. Si vous utilisez l' arithmétique à virgule flottante, vous pouvez utiliser*
,/
,+
,-
et exponentiation (par exemple,**
ou^
si elle est un opérateur intégré dans votre langue de choix, mais seulement exponentiation des pouvoirs au moins 1 ). Cette restriction vise à empêcher la "tricherie" en appelantsqrt()
ou une variante ou en élevant une valeur à la ½ puissance. - Si vous utilisez des opérations à virgule flottante (voir # 3), vous n'êtes pas obligé que le type de retour soit entier; seulement que la valeur de retour est un entier, par exemple, floor (sqrt (n)), et pouvoir contenir n'importe quelle valeur 32 bits non signée.
- Si vous utilisez C / C ++, vous pouvez supposer l'existence de types entiers 64 bits et 32 bits non signés, par exemple,
uint64_t
etuint32_t
comme défini dansstdint.h
. Sinon, assurez-vous simplement que votre type entier est capable de contenir n'importe quel entier non signé 64 bits. - Si votre jauge ne prend pas en charge les entiers 64 bits (par exemple, Brainfuck n'a apparemment que la prise en charge des entiers 8 bits), faites de votre mieux avec cela et indiquez la limitation dans le titre de votre réponse. Cela dit, si vous pouvez comprendre comment coder un entier 64 bits et en obtenir correctement la racine carrée en utilisant l'arithmétique primitive 8 bits, alors plus de puissance pour vous!
- Amusez-vous et soyez créatif!
O(log_2 n) === O(log_4 n)
. log_4(n) = log_2(n) / log_2(2) = log_2(n) / 2